From d4c773e40fc93f0843ed4987cd8e3ec92e539269 Mon Sep 17 00:00:00 2001 From: liuxuewen <947752894@qq.com> Date: Fri, 17 Feb 2023 11:38:16 +0800 Subject: [PATCH] Initial commit --- .DS_Store | Bin 0 -> 8196 bytes .gitattributes | 2 + .github/ISSUE_TEMPLATE/bug.md | 30 + .github/ISSUE_TEMPLATE/feature.md | 18 + .github/workflows/build-beta.yml | 54 + .github/workflows/build-lite.yml | 54 + .github/workflows/build-windows.yml | 98 + .github/workflows/build.yml | 55 + .gitignore | 13 + .gitmodules | 18 + LICENSE.md | 661 +++ README.md | 52 + app/__init__.py | 0 app/brushtask.py | 861 ++++ app/conf/__init__.py | 3 + app/conf/moduleconf.py | 917 ++++ app/conf/siteconf.py | 480 ++ app/conf/systemconfig.py | 67 + app/db/__init__.py | 44 + app/db/main_db.py | 122 + app/db/media_db.py | 126 + app/db/models.py | 578 +++ app/doubansync.py | 286 ++ app/downloader/__init__.py | 1 + app/downloader/client/__init__.py | 2 + app/downloader/client/_base.py | 152 + app/downloader/client/_py115.py | 182 + app/downloader/client/client115.py | 141 + app/downloader/client/pikpak.py | 153 + app/downloader/client/qbittorrent.py | 530 ++ app/downloader/client/transmission.py | 526 ++ app/downloader/downloader.py | 1081 ++++ app/filetransfer.py | 1315 +++++ app/filter.py | 322 ++ app/helper/__init__.py | 16 + app/helper/chrome_helper.py | 240 + app/helper/cookiecloud_helper.py | 41 + app/helper/db_helper.py | 2492 +++++++++ app/helper/dict_helper.py | 79 + app/helper/display_helper.py | 43 + app/helper/ffmpeg_helper.py | 19 + app/helper/indexer_helper.py | 113 + app/helper/meta_helper.py | 229 + app/helper/ocr_helper.py | 31 + app/helper/opensubtitles.py | 103 + app/helper/progress_helper.py | 39 + app/helper/security_helper.py | 65 + app/helper/site_helper.py | 31 + app/helper/submodule_helper.py | 29 + app/helper/thread_helper.py | 18 + app/helper/words_helper.py | 202 + app/indexer/__init__.py | 1 + app/indexer/client/__init__.py | 1 + app/indexer/client/_base.py | 229 + app/indexer/client/_rarbg.py | 66 + app/indexer/client/_render_spider.py | 129 + app/indexer/client/_spider.py | 650 +++ app/indexer/client/_tnode.py | 104 + app/indexer/client/builtin.py | 220 + app/indexer/indexer.py | 174 + app/media/__init__.py | 5 + app/media/bangumi.py | 105 + app/media/category.py | 165 + app/media/douban.py | 442 ++ app/media/doubanapi/__init__.py | 2 + app/media/doubanapi/apiv2.py | 241 + app/media/doubanapi/webapi.py | 294 ++ app/media/fanart.py | 214 + app/media/media.py | 2131 ++++++++ app/media/meta/__init__.py | 5 + app/media/meta/_base.py | 710 +++ app/media/meta/metaanime.py | 220 + app/media/meta/metainfo.py | 65 + app/media/meta/metavideo.py | 547 ++ app/media/meta/release_groups.py | 103 + app/media/scraper.py | 542 ++ app/media/tmdbv3api/__init__.py | 11 + app/media/tmdbv3api/as_obj.py | 84 + app/media/tmdbv3api/exceptions.py | 2 + app/media/tmdbv3api/objs/__init__.py | 0 app/media/tmdbv3api/objs/discover.py | 52 + app/media/tmdbv3api/objs/episode.py | 24 + app/media/tmdbv3api/objs/find.py | 12 + app/media/tmdbv3api/objs/genre.py | 22 + app/media/tmdbv3api/objs/movie.py | 295 ++ app/media/tmdbv3api/objs/person.py | 150 + app/media/tmdbv3api/objs/search.py | 74 + app/media/tmdbv3api/objs/trending.py | 77 + app/media/tmdbv3api/objs/tv.py | 241 + app/media/tmdbv3api/tmdb.py | 205 + app/mediaserver/__init__.py | 2 + app/mediaserver/client/__init__.py | 0 app/mediaserver/client/_base.py | 108 + app/mediaserver/client/emby.py | 492 ++ app/mediaserver/client/jellyfin.py | 424 ++ app/mediaserver/client/plex.py | 216 + app/mediaserver/media_server.py | 246 + app/mediaserver/webhook_event.py | 198 + app/message/__init__.py | 2 + app/message/client/__init__.py | 0 app/message/client/_base.py | 35 + app/message/client/bark.py | 63 + app/message/client/chanify.py | 61 + app/message/client/gotify.py | 71 + app/message/client/iyuu.py | 56 + app/message/client/pushdeer.py | 53 + app/message/client/pushplus.py | 74 + app/message/client/serverchan.py | 56 + app/message/client/slack.py | 264 + app/message/client/synologychat.py | 169 + app/message/client/telegram.py | 317 ++ app/message/client/wechat.py | 220 + app/message/message.py | 540 ++ app/message/message_center.py | 59 + app/rss.py | 628 +++ app/rsschecker.py | 662 +++ app/scheduler.py | 265 + app/searcher.py | 181 + app/sites/__init__.py | 4 + app/sites/site_cookie.py | 302 ++ app/sites/site_signin.py | 166 + app/sites/site_userinfo.py | 366 ++ app/sites/sites.py | 422 ++ app/sites/sitesignin/_base.py | 31 + app/sites/siteuserinfo/__init__.py | 0 app/sites/siteuserinfo/_base.py | 319 ++ app/sites/siteuserinfo/discuz.py | 139 + app/sites/siteuserinfo/file_list.py | 118 + app/sites/siteuserinfo/gazelle.py | 163 + app/sites/siteuserinfo/ipt_project.py | 93 + app/sites/siteuserinfo/nexus_php.py | 343 ++ app/sites/siteuserinfo/nexus_project.py | 25 + app/sites/siteuserinfo/nexus_rabbit.py | 57 + app/sites/siteuserinfo/small_horse.py | 71 + app/sites/siteuserinfo/tnode.py | 103 + app/sites/siteuserinfo/torrent_leech.py | 109 + app/sites/siteuserinfo/unit3d.py | 130 + app/speedlimiter.py | 212 + app/subscribe.py | 852 +++ app/subtitle.py | 363 ++ app/sync.py | 394 ++ app/torrentremover.py | 305 ++ app/utils/__init__.py | 13 + app/utils/cache_manager.py | 14 + app/utils/commons.py | 26 + app/utils/dom_utils.py | 30 + app/utils/episode_format.py | 85 + app/utils/exception_utils.py | 8 + app/utils/http_utils.py | 164 + app/utils/json_utils.py | 24 + app/utils/number_utils.py | 12 + app/utils/path_utils.py | 155 + app/utils/rsstitle_utils.py | 30 + app/utils/string_utils.py | 440 ++ app/utils/system_utils.py | 324 ++ app/utils/tokens.py | 40 + app/utils/torrent.py | 259 + app/utils/types.py | 96 + build_sites.py | 17 + check_config.py | 753 +++ config.py | 193 + config/config.yaml | 320 ++ config/default-category.yaml | 219 + config/scripts/init_filter.sql | 100 + config/scripts/init_userrss_v3.sql | 100 + config/scripts/reset_db_version.sql | 1 + config/scripts/update_subscribe.sql | 2 + config/scripts/update_userpris.sql | 1 + config/scripts/update_userrss.sql | 1 + config/sites.dat | Bin 0 -> 562159 bytes db_scripts/README | 1 + db_scripts/env.py | 80 + db_scripts/script.py.mako | 24 + db_scripts/versions/720a6289a697_1_1_0.py | 150 + dbscript_gen.py | 12 + docker/Dockerfile | 41 + docker/Dockerfile.beta | 41 + docker/Dockerfile.lite | 48 + docker/compose.yml | 19 + docker/entrypoint.sh | 100 + docker/readme.md | 93 + docker/volume.png | Bin 0 -> 40521 bytes log.py | 113 + package_list.txt | 19 + requirements.txt | 104 + run.py | 199 + tests/__init__.py | 0 tests/cases/__init__.py | 0 tests/cases/meta_cases.py | 913 ++++ tests/run.py | 12 + tests/test_metainfo.py | 34 + third_party.txt | 6 + version.py | 1 + web/.DS_Store | Bin 0 -> 6148 bytes web/__init__.py | 0 web/action.py | 4565 +++++++++++++++++ web/apiv1.py | 2278 ++++++++ web/backend/WXBizMsgCrypt3.py | 300 ++ web/backend/__init__.py | 0 web/backend/search_torrents.py | 500 ++ web/backend/user.py | 69 + web/backend/wallpaper.py | 49 + web/backend/web_utils.py | 157 + web/main.py | 1760 +++++++ web/robots.txt | 2 + web/security.py | 118 + web/static/.DS_Store | Bin 0 -> 6148 bytes web/static/components/card/index.js | 2 + web/static/components/card/normal/index.js | 189 + .../components/card/normal/placeholder.js | 26 + web/static/components/card/normal/state.js | 11 + web/static/components/card/person/index.js | 47 + web/static/components/custom/chips/index.html | 147 + web/static/components/custom/img/index.js | 101 + web/static/components/custom/index.js | 2 + web/static/components/custom/slide/index.js | 178 + web/static/components/index.js | 11 + web/static/components/layout/index.js | 2 + web/static/components/layout/navbar/button.js | 16 + web/static/components/layout/navbar/index.js | 795 +++ .../components/layout/searchbar/index.js | 182 + web/static/components/lit-index.js | 4 + web/static/components/page/discovery/index.js | 161 + web/static/components/page/index.js | 3 + web/static/components/page/mediainfo/index.js | 305 ++ web/static/components/page/person/index.js | 67 + web/static/components/utility/lit-core.min.js | 29 + web/static/components/utility/lit-state.js | 258 + web/static/components/utility/utility.js | 122 + web/static/css/demo.min.css | 9 + web/static/css/dropzone.css | 1 + web/static/css/fullcalendar.min.css | 1 + web/static/css/jquery.filetree.css | 74 + web/static/css/nprogress.css | 72 + web/static/css/style.css | 160 + web/static/css/tabler.min.css | 14 + web/static/favicon.ico | Bin 0 -> 4286 bytes web/static/img/115.jpg | Bin 0 -> 34879 bytes web/static/img/aria2.png | Bin 0 -> 16151 bytes web/static/img/bark.webp | Bin 0 -> 1912 bytes web/static/img/bug_fixing.svg | 1 + web/static/img/chanify.png | Bin 0 -> 4395 bytes web/static/img/chinesesubfinder.png | Bin 0 -> 95441 bytes web/static/img/emby.png | Bin 0 -> 33980 bytes web/static/img/filetree/application.png | Bin 0 -> 464 bytes web/static/img/filetree/code.png | Bin 0 -> 603 bytes web/static/img/filetree/css.png | Bin 0 -> 618 bytes web/static/img/filetree/db.png | Bin 0 -> 579 bytes web/static/img/filetree/directory-lock.png | Bin 0 -> 670 bytes web/static/img/filetree/directory.png | Bin 0 -> 537 bytes web/static/img/filetree/doc.png | Bin 0 -> 651 bytes web/static/img/filetree/file-lock.png | Bin 0 -> 614 bytes web/static/img/filetree/file.png | Bin 0 -> 294 bytes web/static/img/filetree/film.png | Bin 0 -> 653 bytes web/static/img/filetree/flash.png | Bin 0 -> 582 bytes web/static/img/filetree/folder_open.png | Bin 0 -> 583 bytes web/static/img/filetree/html.png | Bin 0 -> 734 bytes web/static/img/filetree/java.png | Bin 0 -> 633 bytes web/static/img/filetree/linux.png | Bin 0 -> 668 bytes web/static/img/filetree/music.png | Bin 0 -> 385 bytes web/static/img/filetree/pdf.png | Bin 0 -> 591 bytes web/static/img/filetree/php.png | Bin 0 -> 538 bytes web/static/img/filetree/picture.png | Bin 0 -> 606 bytes web/static/img/filetree/ppt.png | Bin 0 -> 588 bytes web/static/img/filetree/psd.png | Bin 0 -> 856 bytes web/static/img/filetree/ruby.png | Bin 0 -> 626 bytes web/static/img/filetree/script.png | Bin 0 -> 859 bytes web/static/img/filetree/spinner.gif | Bin 0 -> 2530 bytes web/static/img/filetree/txt.png | Bin 0 -> 342 bytes web/static/img/filetree/xls.png | Bin 0 -> 663 bytes web/static/img/filetree/zip.png | Bin 0 -> 386 bytes web/static/img/gotify.png | Bin 0 -> 64843 bytes web/static/img/icon-imdb.png | Bin 0 -> 1325 bytes web/static/img/icons/1024.png | Bin 0 -> 72910 bytes web/static/img/icons/128.png | Bin 0 -> 5302 bytes web/static/img/icons/144.png | Bin 0 -> 6226 bytes web/static/img/icons/152.png | Bin 0 -> 6562 bytes web/static/img/icons/167.png | Bin 0 -> 7280 bytes web/static/img/icons/172.png | Bin 0 -> 7635 bytes web/static/img/icons/180.png | Bin 0 -> 8156 bytes web/static/img/icons/196.png | Bin 0 -> 9100 bytes web/static/img/icons/196_ALT.png | Bin 0 -> 5328 bytes web/static/img/icons/216.png | Bin 0 -> 10256 bytes web/static/img/icons/256.png | Bin 0 -> 12495 bytes web/static/img/icons/512.png | Bin 0 -> 30389 bytes web/static/img/icons/512_ALT.png | Bin 0 -> 18368 bytes web/static/img/indexer.jpg | Bin 0 -> 43399 bytes web/static/img/indexer.png | Bin 0 -> 106659 bytes web/static/img/iyuu.png | Bin 0 -> 10280 bytes web/static/img/jackett.png | Bin 0 -> 24159 bytes web/static/img/jellyfin.jpg | Bin 0 -> 8999 bytes web/static/img/jellyfin.png | Bin 0 -> 21925 bytes web/static/img/joyride.svg | 1 + web/static/img/logo-16x16.png | Bin 0 -> 6584 bytes web/static/img/logo-32x32.png | Bin 0 -> 9909 bytes web/static/img/logo-black.png | Bin 0 -> 72840 bytes web/static/img/logo-blue.png | Bin 0 -> 26453 bytes web/static/img/logo-white.png | Bin 0 -> 138019 bytes web/static/img/logo.png | Bin 0 -> 78179 bytes web/static/img/medicine.svg | 1 + web/static/img/mobile_application.svg | 1 + web/static/img/movie.jpg | Bin 0 -> 33140 bytes web/static/img/music.png | Bin 0 -> 133799 bytes web/static/img/no-image.png | Bin 0 -> 59699 bytes web/static/img/opensubtitles.png | Bin 0 -> 15435 bytes web/static/img/person.png | Bin 0 -> 18781 bytes web/static/img/pikpak.png | Bin 0 -> 65500 bytes web/static/img/plex.png | Bin 0 -> 1771 bytes web/static/img/posting_photo.svg | 1 + web/static/img/printing_invoices.svg | 1 + web/static/img/prowlarr.png | Bin 0 -> 26425 bytes web/static/img/pt.jpg | Bin 0 -> 5731 bytes web/static/img/pushdeer.png | Bin 0 -> 5615 bytes web/static/img/pushplus.jpg | Bin 0 -> 23289 bytes web/static/img/qbittorrent.png | Bin 0 -> 11562 bytes web/static/img/quitting_time.svg | 1 + web/static/img/serverchan.png | Bin 0 -> 56446 bytes web/static/img/sign_in.svg | 1 + web/static/img/slack.png | Bin 0 -> 87775 bytes .../img/splash/apple-splash-1125-2436.png | Bin 0 -> 39304 bytes .../img/splash/apple-splash-1136-640.png | Bin 0 -> 30330 bytes .../img/splash/apple-splash-1170-2532.png | Bin 0 -> 42687 bytes .../img/splash/apple-splash-1242-2208.png | Bin 0 -> 42487 bytes .../img/splash/apple-splash-1242-2688.png | Bin 0 -> 47199 bytes .../img/splash/apple-splash-1284-2778.png | Bin 0 -> 39051 bytes .../img/splash/apple-splash-1334-750.png | Bin 0 -> 34096 bytes .../img/splash/apple-splash-1536-2048.png | Bin 0 -> 40989 bytes .../img/splash/apple-splash-1620-2160.png | Bin 0 -> 54680 bytes .../img/splash/apple-splash-1668-2224.png | Bin 0 -> 55120 bytes .../img/splash/apple-splash-1668-2388.png | Bin 0 -> 47380 bytes .../img/splash/apple-splash-1792-828.png | Bin 0 -> 32833 bytes .../img/splash/apple-splash-2048-1536.png | Bin 0 -> 63113 bytes .../img/splash/apple-splash-2048-2732.png | Bin 0 -> 74726 bytes .../img/splash/apple-splash-2160-1620.png | Bin 0 -> 76273 bytes .../img/splash/apple-splash-2208-1242.png | Bin 0 -> 74259 bytes .../img/splash/apple-splash-2224-1668.png | Bin 0 -> 75754 bytes .../img/splash/apple-splash-2388-1668.png | Bin 0 -> 78505 bytes .../img/splash/apple-splash-2436-1125.png | Bin 0 -> 71524 bytes .../img/splash/apple-splash-2532-1170.png | Bin 0 -> 81028 bytes .../img/splash/apple-splash-2688-1242.png | Bin 0 -> 64517 bytes .../img/splash/apple-splash-2732-2048.png | Bin 0 -> 97166 bytes .../img/splash/apple-splash-2778-1284.png | Bin 0 -> 91328 bytes .../img/splash/apple-splash-640-1136.png | Bin 0 -> 25199 bytes .../img/splash/apple-splash-750-1334.png | Bin 0 -> 23190 bytes .../img/splash/apple-splash-828-1792.png | Bin 0 -> 27608 bytes web/static/img/startup.jpg | Bin 0 -> 91379 bytes web/static/img/synologychat.png | Bin 0 -> 12149 bytes web/static/img/telegram.png | Bin 0 -> 168534 bytes web/static/img/tmdb.png | Bin 0 -> 10190 bytes web/static/img/tmdb.webp | Bin 0 -> 10868 bytes web/static/img/transmission.png | Bin 0 -> 171952 bytes web/static/img/tv.png | Bin 0 -> 132096 bytes web/static/img/users.png | Bin 0 -> 133729 bytes web/static/img/wechat.png | Bin 0 -> 10823 bytes web/static/img/work_together.svg | 1 + web/static/js/FileSaver.min.js | 3 + web/static/js/ace.js | 17 + web/static/js/demo-theme.min.js | 9 + web/static/js/demo.min.js | 9 + web/static/js/dom-to-image.min.js | 2 + web/static/js/dropzone-min.js | 2 + web/static/js/echarts.min.js | 45 + web/static/js/fullcalendar.min.js | 6 + web/static/js/jquery-3.3.1.min.js | 2 + web/static/js/jquery.filetree.js | 2 + web/static/js/libs/list.min.js | 2 + web/static/js/locales/zh-cn.js | 30 + web/static/js/mode-css.js | 8 + web/static/js/mode-javascript.js | 8 + web/static/js/mode-json.js | 8 + web/static/js/nprogress.js | 476 ++ web/static/js/numeral.min.js | 8 + web/static/js/tabler.min.js | 15 + web/static/js/theme-one_dark.js | 8 + web/static/js/theme-xcode.js | 8 + web/static/js/util.js | 333 ++ web/static/js/worker-css.js | 1 + web/static/js/worker-javascript.js | 1 + web/static/js/worker-json.js | 1 + web/static/site.webmanifest | 34 + web/templates/404.html | 43 + web/templates/500.html | 43 + web/templates/discovery/mediainfo.html | 1 + web/templates/discovery/person.html | 1 + web/templates/discovery/ranking.html | 1 + web/templates/discovery/recommend.html | 184 + web/templates/download/downloading.html | 206 + web/templates/download/torrent_remove.html | 679 +++ web/templates/download/userdownloader.html | 267 + web/templates/index.html | 349 ++ web/templates/login.html | 58 + web/templates/macro/form.html | 112 + web/templates/macro/head.html | 64 + web/templates/macro/oops.html | 62 + web/templates/macro/svg.html | 1081 ++++ web/templates/navigation.html | 2468 +++++++++ web/templates/rename/history.html | 282 + web/templates/rename/mediafile.html | 430 ++ web/templates/rename/tmdbcache.html | 266 + web/templates/rename/unidentification.html | 162 + web/templates/rss/movie_rss.html | 126 + web/templates/rss/rss_calendar.html | 113 + web/templates/rss/rss_history.html | 127 + web/templates/rss/rss_parser.html | 221 + web/templates/rss/tv_rss.html | 137 + web/templates/rss/user_rss.html | 960 ++++ web/templates/search.html | 489 ++ web/templates/service.html | 403 ++ web/templates/setting/basic.html | 1132 ++++ web/templates/setting/customwords.html | 915 ++++ web/templates/setting/directorysync.html | 272 + web/templates/setting/douban.html | 218 + web/templates/setting/download_setting.html | 409 ++ web/templates/setting/downloader.html | 464 ++ web/templates/setting/filterrule.html | 560 ++ web/templates/setting/indexer.html | 192 + web/templates/setting/library.html | 238 + web/templates/setting/mediaserver.html | 100 + web/templates/setting/notification.html | 476 ++ web/templates/setting/subtitle.html | 163 + web/templates/setting/users.html | 193 + web/templates/site/brushtask.html | 1110 ++++ web/templates/site/resources.html | 290 ++ web/templates/site/site.html | 906 ++++ web/templates/site/sitelist.html | 47 + web/templates/site/statistics.html | 1067 ++++ web/templates/test.html | 60 + windows/nas-tools.ico | Bin 0 -> 67646 bytes windows/nas-tools.spec | 121 + windows/rely/hook-cn2an.py | 3 + windows/rely/hook-zhconv.py | 3 + windows/rely/template.jinja2 | 26 + windows/rely/upx.exe | Bin 0 -> 412672 bytes windows/trayicon.py | 69 + 434 files changed, 69537 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/feature.md create mode 100644 .github/workflows/build-beta.yml create mode 100644 .github/workflows/build-lite.yml create mode 100644 .github/workflows/build-windows.yml create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 app/__init__.py create mode 100644 app/brushtask.py create mode 100644 app/conf/__init__.py create mode 100644 app/conf/moduleconf.py create mode 100644 app/conf/siteconf.py create mode 100644 app/conf/systemconfig.py create mode 100644 app/db/__init__.py create mode 100644 app/db/main_db.py create mode 100644 app/db/media_db.py create mode 100644 app/db/models.py create mode 100644 app/doubansync.py create mode 100644 app/downloader/__init__.py create mode 100644 app/downloader/client/__init__.py create mode 100644 app/downloader/client/_base.py create mode 100644 app/downloader/client/_py115.py create mode 100644 app/downloader/client/client115.py create mode 100644 app/downloader/client/pikpak.py create mode 100644 app/downloader/client/qbittorrent.py create mode 100644 app/downloader/client/transmission.py create mode 100644 app/downloader/downloader.py create mode 100644 app/filetransfer.py create mode 100644 app/filter.py create mode 100644 app/helper/__init__.py create mode 100644 app/helper/chrome_helper.py create mode 100644 app/helper/cookiecloud_helper.py create mode 100644 app/helper/db_helper.py create mode 100644 app/helper/dict_helper.py create mode 100644 app/helper/display_helper.py create mode 100644 app/helper/ffmpeg_helper.py create mode 100644 app/helper/indexer_helper.py create mode 100644 app/helper/meta_helper.py create mode 100644 app/helper/ocr_helper.py create mode 100644 app/helper/opensubtitles.py create mode 100644 app/helper/progress_helper.py create mode 100644 app/helper/security_helper.py create mode 100644 app/helper/site_helper.py create mode 100644 app/helper/submodule_helper.py create mode 100644 app/helper/thread_helper.py create mode 100644 app/helper/words_helper.py create mode 100644 app/indexer/__init__.py create mode 100644 app/indexer/client/__init__.py create mode 100644 app/indexer/client/_base.py create mode 100644 app/indexer/client/_rarbg.py create mode 100644 app/indexer/client/_render_spider.py create mode 100644 app/indexer/client/_spider.py create mode 100644 app/indexer/client/_tnode.py create mode 100644 app/indexer/client/builtin.py create mode 100644 app/indexer/indexer.py create mode 100644 app/media/__init__.py create mode 100644 app/media/bangumi.py create mode 100644 app/media/category.py create mode 100644 app/media/douban.py create mode 100644 app/media/doubanapi/__init__.py create mode 100644 app/media/doubanapi/apiv2.py create mode 100644 app/media/doubanapi/webapi.py create mode 100644 app/media/fanart.py create mode 100644 app/media/media.py create mode 100644 app/media/meta/__init__.py create mode 100644 app/media/meta/_base.py create mode 100644 app/media/meta/metaanime.py create mode 100644 app/media/meta/metainfo.py create mode 100644 app/media/meta/metavideo.py create mode 100644 app/media/meta/release_groups.py create mode 100644 app/media/scraper.py create mode 100644 app/media/tmdbv3api/__init__.py create mode 100644 app/media/tmdbv3api/as_obj.py create mode 100644 app/media/tmdbv3api/exceptions.py create mode 100644 app/media/tmdbv3api/objs/__init__.py create mode 100644 app/media/tmdbv3api/objs/discover.py create mode 100644 app/media/tmdbv3api/objs/episode.py create mode 100644 app/media/tmdbv3api/objs/find.py create mode 100644 app/media/tmdbv3api/objs/genre.py create mode 100644 app/media/tmdbv3api/objs/movie.py create mode 100644 app/media/tmdbv3api/objs/person.py create mode 100644 app/media/tmdbv3api/objs/search.py create mode 100644 app/media/tmdbv3api/objs/trending.py create mode 100644 app/media/tmdbv3api/objs/tv.py create mode 100644 app/media/tmdbv3api/tmdb.py create mode 100644 app/mediaserver/__init__.py create mode 100644 app/mediaserver/client/__init__.py create mode 100644 app/mediaserver/client/_base.py create mode 100644 app/mediaserver/client/emby.py create mode 100644 app/mediaserver/client/jellyfin.py create mode 100644 app/mediaserver/client/plex.py create mode 100644 app/mediaserver/media_server.py create mode 100644 app/mediaserver/webhook_event.py create mode 100644 app/message/__init__.py create mode 100644 app/message/client/__init__.py create mode 100644 app/message/client/_base.py create mode 100644 app/message/client/bark.py create mode 100644 app/message/client/chanify.py create mode 100644 app/message/client/gotify.py create mode 100644 app/message/client/iyuu.py create mode 100644 app/message/client/pushdeer.py create mode 100644 app/message/client/pushplus.py create mode 100644 app/message/client/serverchan.py create mode 100644 app/message/client/slack.py create mode 100644 app/message/client/synologychat.py create mode 100644 app/message/client/telegram.py create mode 100644 app/message/client/wechat.py create mode 100644 app/message/message.py create mode 100644 app/message/message_center.py create mode 100644 app/rss.py create mode 100644 app/rsschecker.py create mode 100644 app/scheduler.py create mode 100644 app/searcher.py create mode 100644 app/sites/__init__.py create mode 100644 app/sites/site_cookie.py create mode 100644 app/sites/site_signin.py create mode 100644 app/sites/site_userinfo.py create mode 100644 app/sites/sites.py create mode 100644 app/sites/sitesignin/_base.py create mode 100644 app/sites/siteuserinfo/__init__.py create mode 100644 app/sites/siteuserinfo/_base.py create mode 100644 app/sites/siteuserinfo/discuz.py create mode 100644 app/sites/siteuserinfo/file_list.py create mode 100644 app/sites/siteuserinfo/gazelle.py create mode 100644 app/sites/siteuserinfo/ipt_project.py create mode 100644 app/sites/siteuserinfo/nexus_php.py create mode 100644 app/sites/siteuserinfo/nexus_project.py create mode 100644 app/sites/siteuserinfo/nexus_rabbit.py create mode 100644 app/sites/siteuserinfo/small_horse.py create mode 100644 app/sites/siteuserinfo/tnode.py create mode 100644 app/sites/siteuserinfo/torrent_leech.py create mode 100644 app/sites/siteuserinfo/unit3d.py create mode 100644 app/speedlimiter.py create mode 100644 app/subscribe.py create mode 100644 app/subtitle.py create mode 100644 app/sync.py create mode 100644 app/torrentremover.py create mode 100644 app/utils/__init__.py create mode 100644 app/utils/cache_manager.py create mode 100644 app/utils/commons.py create mode 100644 app/utils/dom_utils.py create mode 100644 app/utils/episode_format.py create mode 100644 app/utils/exception_utils.py create mode 100644 app/utils/http_utils.py create mode 100644 app/utils/json_utils.py create mode 100644 app/utils/number_utils.py create mode 100644 app/utils/path_utils.py create mode 100644 app/utils/rsstitle_utils.py create mode 100644 app/utils/string_utils.py create mode 100644 app/utils/system_utils.py create mode 100644 app/utils/tokens.py create mode 100644 app/utils/torrent.py create mode 100644 app/utils/types.py create mode 100644 build_sites.py create mode 100644 check_config.py create mode 100644 config.py create mode 100644 config/config.yaml create mode 100644 config/default-category.yaml create mode 100644 config/scripts/init_filter.sql create mode 100644 config/scripts/init_userrss_v3.sql create mode 100644 config/scripts/reset_db_version.sql create mode 100644 config/scripts/update_subscribe.sql create mode 100644 config/scripts/update_userpris.sql create mode 100644 config/scripts/update_userrss.sql create mode 100644 config/sites.dat create mode 100644 db_scripts/README create mode 100644 db_scripts/env.py create mode 100644 db_scripts/script.py.mako create mode 100644 db_scripts/versions/720a6289a697_1_1_0.py create mode 100644 dbscript_gen.py create mode 100644 docker/Dockerfile create mode 100644 docker/Dockerfile.beta create mode 100644 docker/Dockerfile.lite create mode 100644 docker/compose.yml create mode 100755 docker/entrypoint.sh create mode 100644 docker/readme.md create mode 100644 docker/volume.png create mode 100644 log.py create mode 100644 package_list.txt create mode 100644 requirements.txt create mode 100644 run.py create mode 100644 tests/__init__.py create mode 100644 tests/cases/__init__.py create mode 100644 tests/cases/meta_cases.py create mode 100644 tests/run.py create mode 100644 tests/test_metainfo.py create mode 100644 third_party.txt create mode 100644 version.py create mode 100644 web/.DS_Store create mode 100644 web/__init__.py create mode 100644 web/action.py create mode 100644 web/apiv1.py create mode 100644 web/backend/WXBizMsgCrypt3.py create mode 100644 web/backend/__init__.py create mode 100644 web/backend/search_torrents.py create mode 100644 web/backend/user.py create mode 100644 web/backend/wallpaper.py create mode 100644 web/backend/web_utils.py create mode 100644 web/main.py create mode 100644 web/robots.txt create mode 100644 web/security.py create mode 100644 web/static/.DS_Store create mode 100644 web/static/components/card/index.js create mode 100644 web/static/components/card/normal/index.js create mode 100644 web/static/components/card/normal/placeholder.js create mode 100644 web/static/components/card/normal/state.js create mode 100644 web/static/components/card/person/index.js create mode 100644 web/static/components/custom/chips/index.html create mode 100644 web/static/components/custom/img/index.js create mode 100644 web/static/components/custom/index.js create mode 100644 web/static/components/custom/slide/index.js create mode 100644 web/static/components/index.js create mode 100644 web/static/components/layout/index.js create mode 100644 web/static/components/layout/navbar/button.js create mode 100644 web/static/components/layout/navbar/index.js create mode 100644 web/static/components/layout/searchbar/index.js create mode 100644 web/static/components/lit-index.js create mode 100644 web/static/components/page/discovery/index.js create mode 100644 web/static/components/page/index.js create mode 100644 web/static/components/page/mediainfo/index.js create mode 100644 web/static/components/page/person/index.js create mode 100644 web/static/components/utility/lit-core.min.js create mode 100644 web/static/components/utility/lit-state.js create mode 100644 web/static/components/utility/utility.js create mode 100644 web/static/css/demo.min.css create mode 100644 web/static/css/dropzone.css create mode 100644 web/static/css/fullcalendar.min.css create mode 100644 web/static/css/jquery.filetree.css create mode 100644 web/static/css/nprogress.css create mode 100644 web/static/css/style.css create mode 100644 web/static/css/tabler.min.css create mode 100644 web/static/favicon.ico create mode 100644 web/static/img/115.jpg create mode 100644 web/static/img/aria2.png create mode 100644 web/static/img/bark.webp create mode 100644 web/static/img/bug_fixing.svg create mode 100644 web/static/img/chanify.png create mode 100644 web/static/img/chinesesubfinder.png create mode 100644 web/static/img/emby.png create mode 100644 web/static/img/filetree/application.png create mode 100644 web/static/img/filetree/code.png create mode 100644 web/static/img/filetree/css.png create mode 100644 web/static/img/filetree/db.png create mode 100644 web/static/img/filetree/directory-lock.png create mode 100644 web/static/img/filetree/directory.png create mode 100644 web/static/img/filetree/doc.png create mode 100644 web/static/img/filetree/file-lock.png create mode 100644 web/static/img/filetree/file.png create mode 100644 web/static/img/filetree/film.png create mode 100644 web/static/img/filetree/flash.png create mode 100644 web/static/img/filetree/folder_open.png create mode 100644 web/static/img/filetree/html.png create mode 100644 web/static/img/filetree/java.png create mode 100644 web/static/img/filetree/linux.png create mode 100644 web/static/img/filetree/music.png create mode 100644 web/static/img/filetree/pdf.png create mode 100644 web/static/img/filetree/php.png create mode 100644 web/static/img/filetree/picture.png create mode 100644 web/static/img/filetree/ppt.png create mode 100644 web/static/img/filetree/psd.png create mode 100644 web/static/img/filetree/ruby.png create mode 100644 web/static/img/filetree/script.png create mode 100644 web/static/img/filetree/spinner.gif create mode 100644 web/static/img/filetree/txt.png create mode 100644 web/static/img/filetree/xls.png create mode 100644 web/static/img/filetree/zip.png create mode 100644 web/static/img/gotify.png create mode 100644 web/static/img/icon-imdb.png create mode 100644 web/static/img/icons/1024.png create mode 100644 web/static/img/icons/128.png create mode 100644 web/static/img/icons/144.png create mode 100644 web/static/img/icons/152.png create mode 100644 web/static/img/icons/167.png create mode 100644 web/static/img/icons/172.png create mode 100644 web/static/img/icons/180.png create mode 100644 web/static/img/icons/196.png create mode 100644 web/static/img/icons/196_ALT.png create mode 100644 web/static/img/icons/216.png create mode 100644 web/static/img/icons/256.png create mode 100644 web/static/img/icons/512.png create mode 100644 web/static/img/icons/512_ALT.png create mode 100644 web/static/img/indexer.jpg create mode 100644 web/static/img/indexer.png create mode 100644 web/static/img/iyuu.png create mode 100644 web/static/img/jackett.png create mode 100644 web/static/img/jellyfin.jpg create mode 100644 web/static/img/jellyfin.png create mode 100644 web/static/img/joyride.svg create mode 100644 web/static/img/logo-16x16.png create mode 100644 web/static/img/logo-32x32.png create mode 100644 web/static/img/logo-black.png create mode 100644 web/static/img/logo-blue.png create mode 100644 web/static/img/logo-white.png create mode 100644 web/static/img/logo.png create mode 100644 web/static/img/medicine.svg create mode 100644 web/static/img/mobile_application.svg create mode 100644 web/static/img/movie.jpg create mode 100644 web/static/img/music.png create mode 100644 web/static/img/no-image.png create mode 100644 web/static/img/opensubtitles.png create mode 100644 web/static/img/person.png create mode 100644 web/static/img/pikpak.png create mode 100644 web/static/img/plex.png create mode 100644 web/static/img/posting_photo.svg create mode 100644 web/static/img/printing_invoices.svg create mode 100644 web/static/img/prowlarr.png create mode 100644 web/static/img/pt.jpg create mode 100644 web/static/img/pushdeer.png create mode 100644 web/static/img/pushplus.jpg create mode 100644 web/static/img/qbittorrent.png create mode 100644 web/static/img/quitting_time.svg create mode 100644 web/static/img/serverchan.png create mode 100644 web/static/img/sign_in.svg create mode 100644 web/static/img/slack.png create mode 100644 web/static/img/splash/apple-splash-1125-2436.png create mode 100644 web/static/img/splash/apple-splash-1136-640.png create mode 100644 web/static/img/splash/apple-splash-1170-2532.png create mode 100644 web/static/img/splash/apple-splash-1242-2208.png create mode 100644 web/static/img/splash/apple-splash-1242-2688.png create mode 100644 web/static/img/splash/apple-splash-1284-2778.png create mode 100644 web/static/img/splash/apple-splash-1334-750.png create mode 100644 web/static/img/splash/apple-splash-1536-2048.png create mode 100644 web/static/img/splash/apple-splash-1620-2160.png create mode 100644 web/static/img/splash/apple-splash-1668-2224.png create mode 100644 web/static/img/splash/apple-splash-1668-2388.png create mode 100644 web/static/img/splash/apple-splash-1792-828.png create mode 100644 web/static/img/splash/apple-splash-2048-1536.png create mode 100644 web/static/img/splash/apple-splash-2048-2732.png create mode 100644 web/static/img/splash/apple-splash-2160-1620.png create mode 100644 web/static/img/splash/apple-splash-2208-1242.png create mode 100644 web/static/img/splash/apple-splash-2224-1668.png create mode 100644 web/static/img/splash/apple-splash-2388-1668.png create mode 100644 web/static/img/splash/apple-splash-2436-1125.png create mode 100644 web/static/img/splash/apple-splash-2532-1170.png create mode 100644 web/static/img/splash/apple-splash-2688-1242.png create mode 100644 web/static/img/splash/apple-splash-2732-2048.png create mode 100644 web/static/img/splash/apple-splash-2778-1284.png create mode 100644 web/static/img/splash/apple-splash-640-1136.png create mode 100644 web/static/img/splash/apple-splash-750-1334.png create mode 100644 web/static/img/splash/apple-splash-828-1792.png create mode 100644 web/static/img/startup.jpg create mode 100644 web/static/img/synologychat.png create mode 100644 web/static/img/telegram.png create mode 100644 web/static/img/tmdb.png create mode 100644 web/static/img/tmdb.webp create mode 100644 web/static/img/transmission.png create mode 100644 web/static/img/tv.png create mode 100644 web/static/img/users.png create mode 100644 web/static/img/wechat.png create mode 100644 web/static/img/work_together.svg create mode 100644 web/static/js/FileSaver.min.js create mode 100644 web/static/js/ace.js create mode 100644 web/static/js/demo-theme.min.js create mode 100644 web/static/js/demo.min.js create mode 100644 web/static/js/dom-to-image.min.js create mode 100644 web/static/js/dropzone-min.js create mode 100644 web/static/js/echarts.min.js create mode 100644 web/static/js/fullcalendar.min.js create mode 100644 web/static/js/jquery-3.3.1.min.js create mode 100644 web/static/js/jquery.filetree.js create mode 100644 web/static/js/libs/list.min.js create mode 100644 web/static/js/locales/zh-cn.js create mode 100644 web/static/js/mode-css.js create mode 100644 web/static/js/mode-javascript.js create mode 100644 web/static/js/mode-json.js create mode 100644 web/static/js/nprogress.js create mode 100644 web/static/js/numeral.min.js create mode 100644 web/static/js/tabler.min.js create mode 100644 web/static/js/theme-one_dark.js create mode 100644 web/static/js/theme-xcode.js create mode 100644 web/static/js/util.js create mode 100644 web/static/js/worker-css.js create mode 100644 web/static/js/worker-javascript.js create mode 100644 web/static/js/worker-json.js create mode 100644 web/static/site.webmanifest create mode 100644 web/templates/404.html create mode 100644 web/templates/500.html create mode 100644 web/templates/discovery/mediainfo.html create mode 100644 web/templates/discovery/person.html create mode 100644 web/templates/discovery/ranking.html create mode 100644 web/templates/discovery/recommend.html create mode 100644 web/templates/download/downloading.html create mode 100644 web/templates/download/torrent_remove.html create mode 100644 web/templates/download/userdownloader.html create mode 100644 web/templates/index.html create mode 100644 web/templates/login.html create mode 100644 web/templates/macro/form.html create mode 100644 web/templates/macro/head.html create mode 100644 web/templates/macro/oops.html create mode 100644 web/templates/macro/svg.html create mode 100644 web/templates/navigation.html create mode 100644 web/templates/rename/history.html create mode 100644 web/templates/rename/mediafile.html create mode 100644 web/templates/rename/tmdbcache.html create mode 100644 web/templates/rename/unidentification.html create mode 100644 web/templates/rss/movie_rss.html create mode 100644 web/templates/rss/rss_calendar.html create mode 100644 web/templates/rss/rss_history.html create mode 100644 web/templates/rss/rss_parser.html create mode 100644 web/templates/rss/tv_rss.html create mode 100644 web/templates/rss/user_rss.html create mode 100644 web/templates/search.html create mode 100644 web/templates/service.html create mode 100644 web/templates/setting/basic.html create mode 100644 web/templates/setting/customwords.html create mode 100644 web/templates/setting/directorysync.html create mode 100644 web/templates/setting/douban.html create mode 100644 web/templates/setting/download_setting.html create mode 100644 web/templates/setting/downloader.html create mode 100644 web/templates/setting/filterrule.html create mode 100644 web/templates/setting/indexer.html create mode 100644 web/templates/setting/library.html create mode 100644 web/templates/setting/mediaserver.html create mode 100644 web/templates/setting/notification.html create mode 100644 web/templates/setting/subtitle.html create mode 100644 web/templates/setting/users.html create mode 100644 web/templates/site/brushtask.html create mode 100644 web/templates/site/resources.html create mode 100644 web/templates/site/site.html create mode 100644 web/templates/site/sitelist.html create mode 100644 web/templates/site/statistics.html create mode 100644 web/templates/test.html create mode 100644 windows/nas-tools.ico create mode 100644 windows/nas-tools.spec create mode 100644 windows/rely/hook-cn2an.py create mode 100644 windows/rely/hook-zhconv.py create mode 100644 windows/rely/template.jinja2 create mode 100644 windows/rely/upx.exe create mode 100644 windows/trayicon.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..03848441f02141a3ce9b955fde5d3dcb84fafe41 GIT binary patch literal 8196 zcmeHML2uJA6n<{EF5Se|1E6t0io|sqD{LAPm#*6mlYqmD-~gy3ZCRsbaY@n@G)?Lq zegl7jGd~3W3n%!V?M+FVUJ(LYvOmXuU!3C1@0R4Xb9^bor2pVNfEun9Zt&F;%>?J_-~ zBig4!dPW_zn{-C~Jcl?^Uow%ZAx5%XTjI!MZ5!~{Q_tcl54zw6h-!+JQu;t?ek~Q7 zEWb|2c&a@*pr_?ery`VPG@#jl-mAUDy)&g7G@r8~$1BUPfj^$3G{-4xyJ+_4OhlE= zS<4kz4&iyMb~kGhW2CsRp|n`dD7{wBD))r7&#{;3oOggaOMD_q_71C;<5Xz^j$eoh zG%B<5C&|csk^AP4!XQbvwtk38bz!l#b6-ZO7es?t5rX~zCa+%xQD08lavb#&#qH<`r|#6djXM_?51WrR+~)4q<%WCF zY;Hf;aCf(NE-&lOt$X($A9qi~vqRVJUY&X@YC}>nV4piwl@cJKy=({jwPRrm_BSui{hX5smZL9)+RDs{4b6wp4 literal 0 HcmV?d00001 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..d098423 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,30 @@ +--- +name: 问题模板 +about: 如发现Bug,请按此模板提交issues,不按模板提交的问题将直接关闭。 +提交问题务必描述清楚、附上日志,描述不清导致无法理解和分析的问题也可能会被直接关闭。 +--- + +## 你使用的 NAStool 是什么版本,什么环境? + +> NAStool 版本: vx.x.x +> +> 环境: docker or windows or Synology +> + +## 你遇到什么问题了? + +> 描述一下你遇到的问题 + +## 是否已经浏览过Issues、Wiki及TG公众号仍无法解决? + +> 请搜索Issues列表、查看wiki跟TG公众号的更新说明,已经解释过的问题不要重复提问 + + +## 你期望的结果 + +> 描述以下你期望的结果 + +## 给出程序界面截图、后台运行日志或配置文件 + +> 如UI BUG请提供截图及配置文件截图 +> 其它问题提供后台日志,如为Docker请提供docker的日志 diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..7c68cd7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,18 @@ +--- +name: 功能需求模板 +about: 如有新功能需要需要提交,请按此模板创建issues +--- + +## 你使用的 NAStool 是什么版本,什么环境? + +> NAStool 版本: vx.x.x +> +> 环境: docker or windows or synology + +## 你想要新增或者改进什么功能? + +> 你想要新增或者改进什么功能? + +## 这个功能有什么可以参考的资料吗? + +> 这个功能有什么可以参考的资料吗?是否可以列举一些,不要引用同类但商业化软件的任何内容. diff --git a/.github/workflows/build-beta.yml b/.github/workflows/build-beta.yml new file mode 100644 index 0000000..103bd5f --- /dev/null +++ b/.github/workflows/build-beta.yml @@ -0,0 +1,54 @@ +name: Build NAStool Beta Image +on: + workflow_dispatch: + push: + branches: + - dev + paths: + - version.py + - docker/Dockerfile.beta + - .github/workflows/build-beta.yml + - requirements.txt +jobs: + build: + runs-on: ubuntu-latest + name: Build Docker Image + steps: + - + name: Checkout + uses: actions/checkout@master + + - + name: Release version + id: release_version + run: | + app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp") + echo "app_version=$app_version" >> $GITHUB_ENV + + - + name: Set Up QEMU + uses: docker/setup-qemu-action@v1 + + - + name: Set Up Buildx + uses: docker/setup-buildx-action@v1 + + - + name: Login DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - + name: Buildx + uses: docker/build-push-action@v2 + with: + context: . + file: docker/Dockerfile.beta + platforms: | + linux/amd64 + linux/arm64 + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/nas-tools:${{ env.app_version }}-beta \ No newline at end of file diff --git a/.github/workflows/build-lite.yml b/.github/workflows/build-lite.yml new file mode 100644 index 0000000..5c8c0b7 --- /dev/null +++ b/.github/workflows/build-lite.yml @@ -0,0 +1,54 @@ +name: Build NAStool Lite Image +on: + workflow_dispatch: + push: + branches: + - master + paths: + - version.py + - docker/Dockerfile.lite + - .github/workflows/build-lite.yml + - requirements.txt +jobs: + build: + runs-on: ubuntu-latest + name: Build Docker Image + steps: + - + name: Checkout + uses: actions/checkout@master + + - + name: Release version + id: release_version + run: | + app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp") + echo "app_version=$app_version" >> $GITHUB_ENV + + - + name: Set Up QEMU + uses: docker/setup-qemu-action@v1 + + - + name: Set Up Buildx + uses: docker/setup-buildx-action@v1 + + - + name: Login DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - + name: Build Lite Image + uses: docker/build-push-action@v2 + with: + context: . + file: docker/Dockerfile.lite + platforms: | + linux/amd64 + linux/arm64 + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/nas-tools:${{ env.app_version }}-lite \ No newline at end of file diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml new file mode 100644 index 0000000..1bb737d --- /dev/null +++ b/.github/workflows/build-windows.yml @@ -0,0 +1,98 @@ +name: Build NAStool Windows +on: + workflow_dispatch: + push: + branches: + - master + paths: + - version.py + - .github/workflows/build-windows.yml + - windows/** + +jobs: + Windows-build: + runs-on: windows-latest + steps: + - name: init Python 3.10.6 + uses: actions/setup-python@v4 + with: + python-version: '3.10.6' + - name: install dependent packages + run: | + python -m pip install --upgrade pip + pip install wheel numpy==1.23.5 pyparsing==3.0.9 wxpython==4.2.0 pyinstaller==5.7.0 + git clone --depth=1 -b master https://github.com/NAStool/nas-tools --recurse-submodule + cd nas-tools + pip install -r requirements.txt + echo ("NASTOOL_CONFIG=D:/a/nas-tools/nas-tools/nas-tools/config/config.yaml") >> $env:GITHUB_ENV + echo $env:NASTOOL_CONFIG + shell: pwsh + - name: package through pyinstaller + run: | + cd nas-tools + copy .\windows\rely\upx.exe c:\hostedtoolcache\windows\python\3.10.6\x64\Scripts + copy .\windows\rely\hook-cn2an.py c:\hostedtoolcache\windows\python\3.10.6\x64\lib\site-packages\pyinstaller\hooks + copy .\windows\rely\hook-zhconv.py c:\hostedtoolcache\windows\python\3.10.6\x64\lib\site-packages\pyinstaller\hooks + copy .\third_party.txt .\windows + copy .\windows\rely\template.jinja2 c:\hostedtoolcache\windows\Python\3.10.6\x64\lib\site-packages\setuptools\_vendor\pyparsing\diagram + xcopy .\web c:\hostedtoolcache\windows\python\3.10.6\x64\lib\site-packages\web\ /e + xcopy .\config c:\hostedtoolcache\windows\python\3.10.6\x64\lib\site-packages\config\ /e + xcopy .\db_scripts c:\hostedtoolcache\windows\python\3.10.6\x64\lib\site-packages\db_scripts\ /e + cd windows + pyinstaller nas-tools.spec + shell: pwsh + - name: upload windows file + uses: actions/upload-artifact@v3 + with: + name: windows + path: D:/a/nas-tools/nas-tools/nas-tools/windows/dist/nas-tools.exe + + Create-release_Send-message: + runs-on: ubuntu-latest + needs: [Windows-build] + steps: + - uses: actions/checkout@v2 + - name: Release version + id: release_version + run: | + app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp") + echo "app_version=$app_version" >> $GITHUB_ENV + - name: download exe and rename + uses: actions/download-artifact@v3 + - name: get release_informations + shell: bash + run: | + pwd + mkdir releases + cd windows + mv nas-tools.exe /home/runner/work/nas-tools/nas-tools/releases/nastool_win_v${{ env.app_version }}.exe + pwd + - name: Create release + id: create_release + uses: actions/create-release@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ env.app_version }} + release_name: v${{ env.app_version }} + body: ${{ github.event.commits[0].message }} + draft: false + prerelease: false + - name: Upload release asset + uses: dwenegar/upload-release-assets@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + release_id: ${{ steps.create_release.outputs.id }} + assets_path: | + /home/runner/work/nas-tools/nas-tools/releases/ + - name: Send telegram message (release informations) + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_TO }} + token: ${{ secrets.TELEGRAM_TOKEN }} + format: markdown + message: | + *v${{ env.app_version }}* + + ${{ github.event.commits[0].message }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..5cc9a27 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,55 @@ +name: Build NAStool Image +on: + workflow_dispatch: + push: + branches: + - master + paths: + - version.py + - docker/Dockerfile + - docker/Dockerfile.lite + - .github/workflows/build.yml + - requirements.txt +jobs: + build: + runs-on: ubuntu-latest + name: Build Docker Image + steps: + - + name: Checkout + uses: actions/checkout@master + + - + name: Release version + id: release_version + run: | + app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp") + echo "app_version=$app_version" >> $GITHUB_ENV + + - + name: Set Up QEMU + uses: docker/setup-qemu-action@v1 + + - + name: Set Up Buildx + uses: docker/setup-buildx-action@v1 + + - + name: Login DockerHub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build Image + uses: docker/build-push-action@v2 + with: + context: . + file: docker/Dockerfile + platforms: | + linux/amd64 + linux/arm64 + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/nas-tools:latest + ${{ secrets.DOCKER_USERNAME }}/nas-tools:${{ env.app_version }} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..72644b9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +__pycache__ +*.sock +*.log +*.pid +test.py + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +gen/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..c4b7027 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,18 @@ +[submodule "third_party/qbittorrent-api"] + path = third_party/qbittorrent-api + url = https://github.com/rmartin16/qbittorrent-api +[submodule "third_party/transmission-rpc"] + path = third_party/transmission-rpc + url = https://github.com/Trim21/transmission-rpc +[submodule "third_party/anitopy"] + path = third_party/anitopy + url = https://github.com/igorcmoura/anitopy +[submodule "third_party/plexapi"] + path = third_party/plexapi + url = https://github.com/pkkid/python-plexapi +[submodule "third_party/slack_bolt"] + path = third_party/slack_bolt + url = https://github.com/slackapi/bolt-python +[submodule "third_party/feapder"] + path = third_party/feapder + url = https://github.com/jxxghp/feapder diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4e8f6fe --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +![logo-blue](https://user-images.githubusercontent.com/51039935/197520391-f35db354-6071-4c12-86ea-fc450f04bc85.png) +# NAS媒体库管理工具 + +[![GitHub stars](https://img.shields.io/github/stars/NAStool/nas-tools?style=plastic)](https://github.com/NAStool/nas-tools/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/NAStool/nas-tools?style=plastic)](https://github.com/NAStool/nas-tools/network/members) +[![GitHub issues](https://img.shields.io/github/issues/NAStool/nas-tools?style=plastic)](https://github.com/NAStool/nas-tools/issues) +[![GitHub license](https://img.shields.io/github/license/NAStool/nas-tools?style=plastic)](https://github.com/NAStool/nas-tools/blob/master/LICENSE.md) +[![Docker pulls](https://img.shields.io/docker/pulls/jxxghp/nas-tools?style=plastic)](https://hub.docker.com/r/jxxghp/nas-tools) +[![Platform](https://img.shields.io/badge/platform-amd64/arm64-pink?style=plastic)](https://hub.docker.com/r/jxxghp/nas-tools) + + +Docker:https://hub.docker.com/repository/docker/jxxghp/nas-tools + +TG频道:https://t.me/nastool + +API: http://localhost:3000/api/v1/ + + +## 功能: + +NAS媒体库管理工具。 + + +## 安装 +### 1、Docker +``` +docker pull jxxghp/nas-tools:latest +``` +教程见 [这里](docker/readme.md) 。 + +如无法连接Github,注意不要开启自动更新开关(NASTOOL_AUTO_UPDATE=false),将NASTOOL_CN_UPDATE设置为true可使用国内源加速安装依赖。 + +### 2、本地运行 +python3.10版本,需要预安装cython,如发现缺少依赖包需额外安装 +``` +git clone -b master https://github.com/NAStool/nas-tools --recurse-submodule +python3 -m pip install -r requirements.txt +export NASTOOL_CONFIG="/xxx/config/config.yaml" +nohup python3 run.py & +``` + +### 3、Windows +下载exe文件,双击运行即可,会自动生成配置文件目录 + +https://github.com/NAStool/nas-tools/releases + +### 4、群晖套件 +添加矿神群晖SPK套件源直接安装: + +https://spk.imnks.com/ + +https://spk7.imnks.com/ diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/brushtask.py b/app/brushtask.py new file mode 100644 index 0000000..68ef906 --- /dev/null +++ b/app/brushtask.py @@ -0,0 +1,861 @@ +import re +import sys +import time +from datetime import datetime + +import pytz +from apscheduler.schedulers.background import BackgroundScheduler + +import log +from app.downloader.client import Qbittorrent, Transmission +from app.filter import Filter +from app.helper import DbHelper +from app.message import Message +from app.rss import Rss +from app.sites import Sites +from app.utils import StringUtils, Torrent, ExceptionUtils +from app.utils.commons import singleton +from app.utils.types import BrushDeleteType +from config import BRUSH_REMOVE_TORRENTS_INTERVAL, Config + + +@singleton +class BrushTask(object): + message = None + sites = None + filter = None + dbhelper = None + _scheduler = None + _brush_tasks = [] + _torrents_cache = [] + _downloader_infos = [] + _qb_client = "qbittorrent" + _tr_client = "transmission" + + def __init__(self): + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.message = Message() + self.sites = Sites() + self.filter = Filter() + # 移除现有任务 + try: + if self._scheduler: + self._scheduler.remove_all_jobs() + if self._scheduler.running: + self._scheduler.shutdown() + self._scheduler = None + except Exception as e: + ExceptionUtils.exception_traceback(e) + # 读取下载器列表 + downloaders = self.dbhelper.get_user_downloaders() + self._downloader_infos = [] + for downloader_info in downloaders: + self._downloader_infos.append( + { + "id": downloader_info.ID, + "name": downloader_info.NAME, + "type": downloader_info.TYPE, + "host": downloader_info.HOST, + "port": downloader_info.PORT, + "username": downloader_info.USERNAME, + "password": downloader_info.PASSWORD, + "save_dir": downloader_info.SAVE_DIR + } + ) + # 读取刷流任务列表 + self._brush_tasks = self.get_brushtask_info() + if not self._brush_tasks: + return + # 启动RSS任务 + task_flag = False + self._scheduler = BackgroundScheduler(timezone=Config().get_timezone()) + for task in self._brush_tasks: + if task.get("state") == "Y" and task.get("interval") and str(task.get("interval")).isdigit(): + task_flag = True + self._scheduler.add_job(func=self.check_task_rss, + args=[task.get("id")], + trigger='interval', + seconds=int(task.get("interval")) * 60) + # 启动删种任务 + if task_flag: + self._scheduler.add_job(func=self.remove_tasks_torrents, + trigger='interval', + seconds=BRUSH_REMOVE_TORRENTS_INTERVAL) + # 启动 + self._scheduler.print_jobs() + self._scheduler.start() + log.info("刷流服务启动") + + def get_brushtask_info(self, taskid=None): + """ + 读取刷流任务列表 + """ + brushtasks = self.dbhelper.get_brushtasks() + _brush_tasks = [] + for task in brushtasks: + site_info = self.sites.get_sites(siteid=task.SITE) + if site_info: + site_url = StringUtils.get_base_url(site_info.get("signurl") or site_info.get("rssurl")) + else: + site_url = "" + downloader_info = self.get_downloader_info(task.DOWNLOADER) + _brush_tasks.append({ + "id": task.ID, + "name": task.NAME, + "site": site_info.get("name"), + "site_id": task.SITE, + "interval": task.INTEVAL, + "state": task.STATE, + "downloader": task.DOWNLOADER, + "downloader_name": downloader_info.get("name"), + "transfer": task.TRANSFER, + "free": task.FREELEECH, + "rss_rule": eval(task.RSS_RULE), + "remove_rule": eval(task.REMOVE_RULE), + "seed_size": task.SEED_SIZE, + "rss_url": site_info.get("rssurl"), + "cookie": site_info.get("cookie"), + "sendmessage": task.SENDMESSAGE, + "forceupload": task.FORCEUPLOAD, + "ua": site_info.get("ua"), + "download_count": task.DOWNLOAD_COUNT, + "remove_count": task.REMOVE_COUNT, + "download_size": StringUtils.str_filesize(task.DOWNLOAD_SIZE), + "upload_size": StringUtils.str_filesize(task.UPLOAD_SIZE), + "lst_mod_date": task.LST_MOD_DATE, + "site_url": site_url + }) + if taskid: + for task in _brush_tasks: + if task.get("id") == int(taskid): + return task + return {} + else: + return _brush_tasks + + def check_task_rss(self, taskid): + """ + 检查RSS并添加下载,由定时服务调用 + :param taskid: 刷流任务的ID + """ + if not taskid: + return + # 任务信息 + taskinfo = self.get_brushtask_info(taskid) + if not taskinfo: + return + # 任务属性 + seed_size = taskinfo.get("seed_size") + task_name = taskinfo.get("name") + site_id = taskinfo.get("site_id") + rss_url = taskinfo.get("rss_url") + rss_rule = taskinfo.get("rss_rule") + cookie = taskinfo.get("cookie") + rss_free = taskinfo.get("free") + ua = taskinfo.get("ua") + # 查询站点信息 + site_info = self.sites.get_sites(siteid=site_id) + if not site_info: + log.error("【Brush】刷流任务 %s 的站点已不存在,无法刷流!" % task_name) + return + site_name = site_info.get("name") + site_proxy = site_info.get("proxy") + + if not rss_url: + log.error("【Brush】站点 %s 未配置RSS订阅地址,无法刷流!" % site_name) + return + if rss_free and not cookie: + log.warn("【Brush】站点 %s 未配置Cookie,无法开启促销刷流" % site_name) + return + # 下载器参数 + downloader_cfg = self.get_downloader_info(taskinfo.get("downloader")) + if not downloader_cfg: + log.error("【Brush】任务 %s 下载器不存在,无法刷流!" % task_name) + return + + log.info("【Brush】开始站点 %s 的刷流任务:%s..." % (site_name, task_name)) + # 检查是否达到保种体积 + if not self.__is_allow_new_torrent(taskid=taskid, + taskname=task_name, + seedsize=seed_size, + downloadercfg=downloader_cfg, + dlcount=rss_rule.get("dlcount")): + return + + rss_result = Rss.parse_rssxml(rss_url) + if len(rss_result) == 0: + log.warn("【Brush】%s RSS未下载到数据" % site_name) + return + else: + log.info("【Brush】%s RSS获取数据:%s" % (site_name, len(rss_result))) + + # 同时下载数 + max_dlcount = rss_rule.get("dlcount") + success_count = 0 + new_torrent_count = 0 + if max_dlcount: + downloading_count = self.__get_downloading_count(downloader_cfg) or 0 + new_torrent_count = int(max_dlcount) - int(downloading_count) + + for res in rss_result: + try: + # 种子名 + torrent_name = res.get('title') + # 种子链接 + enclosure = res.get('enclosure') + # 种子页面 + page_url = res.get('link') + # 种子大小 + size = res.get('size') + # 发布时间 + pubdate = res.get('pubdate') + + if enclosure not in self._torrents_cache: + self._torrents_cache.append(enclosure) + else: + log.debug("【Brush】%s 已处理过" % torrent_name) + continue + + # 检查种子是否符合选种规则 + if not self.__check_rss_rule(rss_rule=rss_rule, + title=torrent_name, + torrent_url=page_url, + torrent_size=size, + pubdate=pubdate, + cookie=cookie, + ua=ua, + proxy=site_proxy): + continue + # 开始下载 + log.debug("【Brush】%s 符合条件,开始下载..." % torrent_name) + if self.__download_torrent(downloadercfg=downloader_cfg, + title=torrent_name, + enclosure=enclosure, + size=size, + taskid=taskid, + transfer=True if taskinfo.get("transfer") == 'Y' else False, + sendmessage=True if taskinfo.get("sendmessage") == 'Y' else False, + forceupload=True if taskinfo.get("forceupload") == 'Y' else False, + upspeed=rss_rule.get("upspeed"), + downspeed=rss_rule.get("downspeed"), + taskname=task_name, + site_info=site_info): + # 计数 + success_count += 1 + # 添加种子后不能超过最大下载数量 + if max_dlcount and success_count >= new_torrent_count: + break + + # 再判断一次 + if not self.__is_allow_new_torrent(taskid=taskid, + taskname=task_name, + seedsize=seed_size, + dlcount=rss_rule.get("dlcount"), + downloadercfg=downloader_cfg): + break + except Exception as err: + ExceptionUtils.exception_traceback(err) + continue + log.info("【Brush】任务 %s 本次添加了 %s 个下载" % (task_name, success_count)) + + def remove_tasks_torrents(self): + """ + 根据条件检查所有任务下载完成的种子,按条件进行删除,并更新任务数据 + 由定时服务调用 + """ + + def __send_message(_task_name, _delete_type, _torrent_name): + """ + 发送删种消息 + """ + _msg_title = "【刷流任务 {} 删除做种】".format(_task_name) + _msg_text = "删除原因:{}\n种子名称:{}".format(_delete_type.value, _torrent_name) + self.message.send_brushtask_remove_message(title=_msg_title, text=_msg_text) + + # 遍历所有任务 + for taskinfo in self._brush_tasks: + if taskinfo.get("state") != "Y": + continue + try: + # 总上传量 + total_uploaded = 0 + # 总下载量 + total_downloaded = 0 + # 可以删种的种子 + delete_ids = [] + # 需要更新状态的种子 + update_torrents = [] + # 任务信息 + taskid = taskinfo.get("id") + task_name = taskinfo.get("name") + download_id = taskinfo.get("downloader") + remove_rule = taskinfo.get("remove_rule") + sendmessage = True if taskinfo.get("sendmessage") == "Y" else False + + # 当前任务种子详情 + task_torrents = self.dbhelper.get_brushtask_torrents(taskid) + torrent_ids = [item.DOWNLOAD_ID for item in task_torrents if item.DOWNLOAD_ID] + if not torrent_ids: + continue + # 下载器参数 + downloader_cfg = self.get_downloader_info(download_id) + if not downloader_cfg: + log.warn("【Brush】任务 %s 下载器不存在" % task_name) + continue + # 下载器类型 + client_type = downloader_cfg.get("type") + # qbittorrent + if client_type == self._qb_client: + downloader = Qbittorrent(config=downloader_cfg) + # 检查完成状态的 + torrents, has_err = downloader.get_torrents(ids=torrent_ids, status=["completed"]) + # 看看是否有错误, 有错误的话就不处理了 + if has_err: + log.warn("【BRUSH】任务 %s 获取种子状态失败" % task_name) + continue + remove_torrent_ids = list( + set(torrent_ids).difference(set([torrent.get("hash") for torrent in torrents]))) + for torrent in torrents: + # ID + torrent_id = torrent.get("hash") + # 已开始时间 秒 + dltime = int(time.time() - torrent.get("added_on")) + # 已做种时间 秒 + date_done = torrent.completion_on if torrent.completion_on > 0 else torrent.added_on + date_now = int(time.mktime(datetime.now().timetuple())) + seeding_time = date_now - date_done if date_done else 0 + # 分享率 + ratio = torrent.get("ratio") or 0 + # 上传量 + uploaded = torrent.get("uploaded") or 0 + total_uploaded += uploaded + # 平均上传速度 Byte/s + avg_upspeed = int(uploaded / dltime) + # 已未活动 秒 + last_activity = int(torrent.get("last_activity", 0)) + iatime = date_now - last_activity if last_activity else 0 + # 下载量 + downloaded = torrent.get("downloaded") + total_downloaded += downloaded + need_delete, delete_type = self.__check_remove_rule(remove_rule=remove_rule, + seeding_time=seeding_time, + ratio=ratio, + uploaded=uploaded, + avg_upspeed=avg_upspeed, + iatime=iatime) + if need_delete: + log.info( + "【Brush】%s 做种达到删种条件:%s,删除任务..." % (torrent.get('name'), delete_type.value)) + if sendmessage: + __send_message(task_name, delete_type, torrent.get('name')) + + if torrent_id not in delete_ids: + delete_ids.append(torrent_id) + update_torrents.append(("%s,%s" % (uploaded, downloaded), taskid, torrent_id)) + # 检查下载中状态的 + torrents, has_err = downloader.get_torrents(ids=torrent_ids, status=["downloading"]) + # 看看是否有错误, 有错误的话就不处理了 + if has_err: + log.warn("【BRUSH】任务 %s 获取种子状态失败" % task_name) + continue + remove_torrent_ids = list( + set(remove_torrent_ids).difference(set([torrent.get("hash") for torrent in torrents]))) + for torrent in torrents: + # ID + torrent_id = torrent.get("hash") + # 下载耗时 秒 + dltime = int(time.time() - torrent.get("added_on")) + # 上传量 Byte + uploaded = torrent.get("uploaded") or 0 + total_uploaded += uploaded + # 平均上传速度 Byte/s + avg_upspeed = int(uploaded / dltime) + # 已未活动 秒 + date_now = int(time.mktime(datetime.now().timetuple())) + last_activity = int(torrent.get("last_activity", 0)) + iatime = date_now - last_activity if last_activity else 0 + # 下载量 + downloaded = torrent.get("downloaded") + total_downloaded += downloaded + need_delete, delete_type = self.__check_remove_rule(remove_rule=remove_rule, + dltime=dltime, + avg_upspeed=avg_upspeed, + iatime=iatime) + if need_delete: + log.info( + "【Brush】%s 达到删种条件:%s,删除下载任务..." % (torrent.get('name'), delete_type.value)) + if sendmessage: + __send_message(task_name, delete_type, torrent.get('name')) + + if torrent_id not in delete_ids: + delete_ids.append(torrent_id) + update_torrents.append(("%s,%s" % (uploaded, downloaded), taskid, torrent_id)) + # transmission + else: + # 将查询的torrent_ids转为数字型 + torrent_ids = [int(x) for x in torrent_ids if str(x).isdigit()] + # 检查完成状态 + downloader = Transmission(config=downloader_cfg) + torrents, has_err = downloader.get_torrents(ids=torrent_ids, status=["seeding", "seed_pending"]) + # 看看是否有错误, 有错误的话就不处理了 + if has_err: + log.warn("【BRUSH】任务 %s 获取种子状态失败" % task_name) + continue + remove_torrent_ids = list(set(torrent_ids).difference(set([torrent.id for torrent in torrents]))) + for torrent in torrents: + # ID + torrent_id = torrent.id + # 做种时间 + date_done = torrent.date_done or torrent.date_added + date_now = int(time.mktime(datetime.now().timetuple())) + dltime = date_now - int(time.mktime(torrent.date_added.timetuple())) + seeding_time = date_now - int(time.mktime(date_done.timetuple())) + # 下载量 + downloaded = int(torrent.total_size * torrent.progress / 100) + total_downloaded += downloaded + # 分享率 + ratio = torrent.ratio or 0 + # 上传量 + uploaded = int(downloaded * torrent.ratio) + total_uploaded += uploaded + # 平均上传速度 + avg_upspeed = int(uploaded / dltime) + need_delete, delete_type = self.__check_remove_rule(remove_rule=remove_rule, + seeding_time=seeding_time, + ratio=ratio, + uploaded=uploaded, + avg_upspeed=avg_upspeed) + if need_delete: + log.info("【Brush】%s 做种达到删种条件:%s,删除任务..." % (torrent.name, delete_type.value)) + if sendmessage: + __send_message(task_name, delete_type, torrent.name) + + if torrent_id not in delete_ids: + delete_ids.append(torrent_id) + update_torrents.append(("%s,%s" % (uploaded, downloaded), taskid, torrent_id)) + # 检查下载状态 + torrents, has_err = downloader.get_torrents(ids=torrent_ids, + status=["downloading", "download_pending", "stopped"]) + # 看看是否有错误, 有错误的话就不处理了 + if has_err: + log.warn("【BRUSH】任务 %s 获取种子状态失败" % task_name) + continue + remove_torrent_ids = list( + set(remove_torrent_ids).difference(set([torrent.id for torrent in torrents]))) + for torrent in torrents: + # ID + torrent_id = torrent.id + # 下载耗时 + dltime = (datetime.now().astimezone() - torrent.date_added).seconds + # 下载量 + downloaded = int(torrent.total_size * torrent.progress / 100) + total_downloaded += downloaded + # 上传量 + uploaded = int(downloaded * torrent.ratio) + total_uploaded += uploaded + # 平均上传速度 + avg_upspeed = int(uploaded / dltime) + need_delete, delete_type = self.__check_remove_rule(remove_rule=remove_rule, + dltime=dltime, + avg_upspeed=avg_upspeed) + if need_delete: + log.info("【Brush】%s 达到删种条件:%s,删除下载任务..." % (torrent.name, delete_type.value)) + if sendmessage: + __send_message(task_name, delete_type, torrent.name) + + if torrent_id not in delete_ids: + delete_ids.append(torrent_id) + update_torrents.append(("%s,%s" % (uploaded, downloaded), taskid, torrent_id)) + # 手工删除的种子,清除对应记录 + if remove_torrent_ids: + log.info("【Brush】任务 %s 的这些下载任务在下载器中不存在,将删除任务记录:%s" % ( + task_name, remove_torrent_ids)) + for remove_torrent_id in remove_torrent_ids: + self.dbhelper.delete_brushtask_torrent(taskid, remove_torrent_id) + # 更新种子状态为已删除 + self.dbhelper.update_brushtask_torrent_state(update_torrents) + # 删除下载器种子 + if delete_ids: + downloader.delete_torrents(delete_file=True, ids=delete_ids) + log.info("【Brush】任务 %s 共删除 %s 个刷流下载任务" % (task_name, len(delete_ids))) + else: + log.info("【Brush】任务 %s 本次检查未删除下载任务" % task_name) + # 更新上传下载量和删除种子数 + self.dbhelper.add_brushtask_upload_count(brush_id=taskid, + upload_size=total_uploaded, + download_size=total_downloaded, + remove_count=len(delete_ids) + len(remove_torrent_ids)) + except Exception as e: + ExceptionUtils.exception_traceback(e) + + def __is_allow_new_torrent(self, taskid, taskname, downloadercfg, seedsize, dlcount): + """ + 检查是否还能添加新的下载 + """ + if not taskid: + return False + # 判断大小 + total_size = self.dbhelper.get_brushtask_totalsize(taskid) + if seedsize: + if float(seedsize) * 1024 ** 3 <= int(total_size): + log.warn("【Brush】刷流任务 %s 当前保种体积 %sGB,不再新增下载" + % (taskname, round(int(total_size) / 1024 / 1024 / 1024, 1))) + return False + # 检查正在下载的任务数 + if dlcount: + downloading_count = self.__get_downloading_count(downloadercfg) + if downloading_count is None: + log.error("【Brush】任务 %s 下载器 %s 无法连接" % (taskname, downloadercfg.get("name"))) + return False + if int(downloading_count) >= int(dlcount): + log.warn("【Brush】下载器 %s 正在下载任务数:%s,超过设定上限,暂不添加下载" % ( + downloadercfg.get("name"), downloading_count)) + return False + return True + + def get_downloader_info(self, dlid=None): + """ + 获取下载器的参数 + """ + if dlid: + for downloader in self._downloader_infos: + if downloader.get('id') == int(dlid): + if downloader.get('type') == self._qb_client: + return { + "id": downloader.get("id"), + "name": downloader.get("name"), + "type": downloader.get("type"), + "save_dir": downloader.get("save_dir"), + "qbhost": downloader.get("host"), + "qbport": downloader.get("port"), + "qbusername": downloader.get("username"), + "qbpassword": downloader.get("password") + } + elif downloader.get('type') == self._tr_client: + return { + "id": downloader.get("id"), + "name": downloader.get("name"), + "type": downloader.get("type"), + "save_dir": downloader.get("save_dir"), + "trhost": downloader.get("host"), + "trport": downloader.get("port"), + "trusername": downloader.get("username"), + "trpassword": downloader.get("password") + } + return downloader + return {} + else: + return self._downloader_infos + + def __get_downloading_count(self, downloadercfg): + """ + 查询当前正在下载的任务数 + """ + if not downloadercfg: + return 0 + if downloadercfg.get("type") == self._qb_client: + downloader = Qbittorrent(config=downloadercfg) + if not downloader.qbc: + return None + dlitems = downloader.get_downloading_torrents() + if dlitems is not None: + return int(len(dlitems)) + else: + downloader = Transmission(config=downloadercfg) + if not downloader.trc: + return None + dlitems = downloader.get_downloading_torrents() + if dlitems is not None: + return int(len(dlitems)) + return None + + def __download_torrent(self, + downloadercfg, + title, + enclosure, + size, + taskid, + transfer, + sendmessage, + forceupload, + upspeed, + downspeed, + taskname, + site_info): + """ + 添加下载任务,更新任务数据 + :param downloadercfg: 下载器的所有参数 + :param title: 种子名称 + :param enclosure: 种子地址 + :param size: 种子大小 + :param taskid: 任务ID + :param transfer: 是否要转移,为False时直接添加已整理的标签 + :param sendmessage: 是否需要消息推送 + :param forceupload: 是否需要将添加的刷流任务设置为强制做种(仅针对qBittorrent) + :param upspeed: 上传限速 + :param downspeed: 下载限速 + :param taskname: 任务名称 + :param site_info: 站点信息 + """ + if not downloadercfg or not enclosure: + return False + # 标签 + tag = "已整理" if not transfer else None + # 下载任务ID + download_id = None + # 下载种子文件 + _, content, _, _, retmsg = Torrent().get_torrent_info( + url=enclosure, + cookie=site_info.get("cookie"), + ua=site_info.get("ua"), + proxy=site_info.get("proxy")) + if content: + # 添加下载 + if downloadercfg.get("type") == self._qb_client: + # 初始化下载器 + downloader = Qbittorrent(config=downloadercfg) + if not downloader.qbc: + log.error("【Brush】任务 %s 下载器 %s 无法连接" % (taskname, downloadercfg.get("name"))) + return False + torrent_tag = "NT" + StringUtils.generate_random_str(5) + if tag: + tags = [tag, torrent_tag] + else: + tags = torrent_tag + ret = downloader.add_torrent(content=content, + tag=tags, + download_dir=downloadercfg.get("save_dir"), + upload_limit=upspeed, + download_limit=downspeed) + if ret: + # QB添加下载后需要时间,重试5次每次等待5秒 + download_id = downloader.get_torrent_id_by_tag(torrent_tag) + if download_id: + # 开始下载 + downloader.start_torrents(download_id) + # 强制做种 + if forceupload: + downloader.torrents_set_force_start(download_id) + else: + # 初始化下载器 + downloader = Transmission(config=downloadercfg) + if not downloader.trc: + log.error("【Brush】任务 %s 下载器 %s 无法连接" % (taskname, downloadercfg.get("name"))) + return False + ret = downloader.add_torrent(content=content, + download_dir=downloadercfg.get("save_dir"), + upload_limit=upspeed, + download_limit=downspeed + ) + if ret: + download_id = ret.id + # 设置标签 + if download_id and tag: + downloader.set_torrent_tag(tid=download_id, tag=tag) + if not download_id: + # 下载失败 + log.warn(f"【Brush】{taskname} 添加下载任务出错:{title}," + f"错误原因:{retmsg or '下载器添加任务失败'}," + f"种子链接:{enclosure}") + return False + else: + # 下载成功 + log.info("【Brush】成功添加下载:%s" % title) + if sendmessage: + msg_title = "【刷流任务 {} 新增下载】".format(taskname) + msg_text = "种子名称:{}\n种子大小:{}".format(title, StringUtils.str_filesize(size)) + self.message.send_brushtask_added_message(title=msg_title, text=msg_text) + # 插入种子数据 + if self.dbhelper.insert_brushtask_torrent(brush_id=taskid, + title=title, + enclosure=enclosure, + downloader=downloadercfg.get("id"), + download_id=download_id, + size=size): + # 更新下载次数 + self.dbhelper.add_brushtask_download_count(brush_id=taskid) + else: + log.info("【Brush】%s 已下载过" % title) + + return True + + def __check_rss_rule(self, + rss_rule, + title, + torrent_url, + torrent_size, + pubdate, + cookie, + ua, + proxy): + """ + 检查种子是否符合刷流过滤条件 + :param rss_rule: 过滤条件字典 + :param title: 种子名称 + :param torrent_url: 种子页面地址 + :param torrent_size: 种子大小 + :param pubdate: 发布时间 + :param cookie: Cookie + :param ua: User-Agent + :return: 是否命中 + """ + if not rss_rule: + return True + # 检查种子大小 + try: + if rss_rule.get("size"): + rule_sizes = rss_rule.get("size").split("#") + if rule_sizes[0]: + if len(rule_sizes) > 1 and rule_sizes[1]: + min_max_size = rule_sizes[1].split(',') + min_size = min_max_size[0] + if len(min_max_size) > 1: + max_size = min_max_size[1] + else: + max_size = 0 + if rule_sizes[0] == "gt" and float(torrent_size) < float(min_size) * 1024 ** 3: + return False + if rule_sizes[0] == "lt" and float(torrent_size) > float(min_size) * 1024 ** 3: + return False + if rule_sizes[0] == "bw" and not float(min_size) * 1024 ** 3 < float(torrent_size) < float( + max_size) * 1024 ** 3: + return False + + # 检查包含规则 + if rss_rule.get("include"): + if not re.search(r"%s" % rss_rule.get("include"), title): + return False + + # 检查排除规则 + if rss_rule.get("exclude"): + if re.search(r"%s" % rss_rule.get("exclude"), title): + return False + + torrent_attr = self.sites.check_torrent_attr(torrent_url=torrent_url, + cookie=cookie, + ua=ua, + proxy=proxy) + torrent_peer_count = torrent_attr.get("peer_count") + log.debug("【Brush】%s 解析详情, %s" % (title, torrent_attr)) + + # 检查免费状态 + if rss_rule.get("free") == "FREE": + if not torrent_attr.get("free"): + log.debug("【Brush】不是一个FREE资源,跳过") + return False + elif rss_rule.get("free") == "2XFREE": + if not torrent_attr.get("2xfree"): + log.debug("【Brush】不是一个2XFREE资源,跳过") + return False + + # 检查HR状态 + if rss_rule.get("hr"): + if torrent_attr.get("hr"): + log.debug("【Brush】这是一个H&R资源,跳过") + return False + + # 检查做种人数 + if rss_rule.get("peercount"): + # 兼容旧版本 + peercount_str = rss_rule.get("peercount") + if not peercount_str: + peercount_str = "#" + elif "#" not in peercount_str: + peercount_str = "lt#" + peercount_str + else: + pass + peer_counts = peercount_str.split("#") + if len(peer_counts) >= 2 and peer_counts[1]: + min_max_count = peer_counts[1].split(',') + min_count = int(min_max_count[0]) + if len(min_max_count) > 1: + max_count = int(min_max_count[1]) + else: + max_count = sys.maxsize + if peer_counts[0] == "gt" and torrent_peer_count <= min_count: + log.debug("【Brush】%s `判断做种数, 判断条件: peer_count:%d %s threshold:%d" % ( + title, torrent_peer_count, peer_counts[0], min_count)) + return False + if peer_counts[0] == "lt" and torrent_peer_count >= min_count: + log.debug("【Brush】%s `判断做种数, 判断条件: peer_count:%d %s threshold:%d" % ( + title, torrent_peer_count, peer_counts[0], min_count)) + return False + if peer_counts[0] == "bw" and not (min_count <= torrent_peer_count <= max_count): + log.debug("【Brush】%s `判断做种数, 判断条件: left:%d %s peer_count:%d %s right:%d" % ( + title, min_count, peer_counts[0], torrent_peer_count, peer_counts[0], max_count)) + return False + + # 检查发布时间 + if rss_rule.get("pubdate") and pubdate: + rule_pubdates = rss_rule.get("pubdate").split("#") + if len(rule_pubdates) >= 2 and rule_pubdates[1]: + localtz = pytz.timezone(Config().get_timezone()) + localnowtime = datetime.now().astimezone(localtz) + localpubdate = pubdate.astimezone(localtz) + log.debug('【Brush】发布时间:%s,当前时间:%s' % (localpubdate.isoformat(), localnowtime.isoformat())) + if (localnowtime - localpubdate).seconds / 3600 > float(rule_pubdates[1]): + log.debug("【Brush】发布时间不符合条件。") + return False + + except Exception as err: + ExceptionUtils.exception_traceback(err) + + return True + + @staticmethod + def __check_remove_rule(remove_rule, seeding_time=None, ratio=None, uploaded=None, dltime=None, avg_upspeed=None, iatime=None): + """ + 检查是否符合删种规则 + :param remove_rule: 删种规则 + :param seeding_time: 做种时间 + :param ratio: 分享率 + :param uploaded: 上传量 + :param dltime: 下载耗时 + :param avg_upspeed: 上传平均速度 + :param iatime: 未活动时间 + """ + if not remove_rule: + return False + try: + if remove_rule.get("time") and seeding_time: + rule_times = remove_rule.get("time").split("#") + if rule_times[0]: + if len(rule_times) > 1 and rule_times[1]: + if float(seeding_time) > float(rule_times[1]) * 3600: + return True, BrushDeleteType.SEEDTIME + if remove_rule.get("ratio") and ratio: + rule_ratios = remove_rule.get("ratio").split("#") + if rule_ratios[0]: + if len(rule_ratios) > 1 and rule_ratios[1]: + if float(ratio) > float(rule_ratios[1]): + return True, BrushDeleteType.RATIO + if remove_rule.get("uploadsize") and uploaded: + rule_uploadsizes = remove_rule.get("uploadsize").split("#") + if rule_uploadsizes[0]: + if len(rule_uploadsizes) > 1 and rule_uploadsizes[1]: + if float(uploaded) > float(rule_uploadsizes[1]) * 1024 ** 3: + return True, BrushDeleteType.UPLOADSIZE + if remove_rule.get("dltime") and dltime: + rule_times = remove_rule.get("dltime").split("#") + if rule_times[0]: + if len(rule_times) > 1 and rule_times[1]: + if float(dltime) > float(rule_times[1]) * 3600: + return True, BrushDeleteType.DLTIME + if remove_rule.get("avg_upspeed") and avg_upspeed: + rule_avg_upspeeds = remove_rule.get("avg_upspeed").split("#") + if rule_avg_upspeeds[0]: + if len(rule_avg_upspeeds) > 1 and rule_avg_upspeeds[1]: + if float(avg_upspeed) < float(rule_avg_upspeeds[1]) * 1024: + return True, BrushDeleteType.AVGUPSPEED + if remove_rule.get("iatime") and iatime: + rule_times = remove_rule.get("iatime").split("#") + if rule_times[0]: + if len(rule_times) > 1 and rule_times[1]: + if float(iatime) > float(rule_times[1]) * 3600: + return True, BrushDeleteType.IATIME + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False, BrushDeleteType.NOTDELETE diff --git a/app/conf/__init__.py b/app/conf/__init__.py new file mode 100644 index 0000000..f99c6eb --- /dev/null +++ b/app/conf/__init__.py @@ -0,0 +1,3 @@ +from .systemconfig import SystemConfig +from .moduleconf import ModuleConf +from .siteconf import SiteConf diff --git a/app/conf/moduleconf.py b/app/conf/moduleconf.py new file mode 100644 index 0000000..c7c6af6 --- /dev/null +++ b/app/conf/moduleconf.py @@ -0,0 +1,917 @@ +# coding: utf-8 +from app.utils.types import * + + +class ModuleConf(object): + # 菜单对应关系,配置WeChat应用中配置的菜单ID与执行命令的对应关系,需要手工修改 + # 菜单序号在https://work.weixin.qq.com/wework_admin/frame#apps 应用自定义菜单中维护,然后看日志输出的菜单序号是啥(按顺利能猜到的).... + # 命令对应关系:/ptt 下载文件转移;/ptr 删种;/pts 站点签到;/rst 目录同步;/rst 豆瓣想看;/utf 重新识别; + # /ssa 订阅搜索;/tbl 清理转移缓存;/trh 清理RSS缓存;/rss RSS下载;/udt 系统更新 + WECHAT_MENU = { + '_0_0': '/ptt', + '_0_1': '/ptr', + '_0_2': '/rss', + '_0_3': '/ssa', + '_1_0': '/rst', + '_1_1': '/db', + '_1_2': '/utf', + '_2_0': '/pts', + '_2_1': '/udt', + '_2_2': '/tbl', + '_2_3': '/trh' + } + + # 全量转移模式 + RMT_MODES = { + "copy": RmtMode.COPY, + "link": RmtMode.LINK, + "softlink": RmtMode.SOFTLINK, + "move": RmtMode.MOVE, + "rclone": RmtMode.RCLONE, + "rclonecopy": RmtMode.RCLONECOPY, + "minio": RmtMode.MINIO, + "miniocopy": RmtMode.MINIOCOPY + } + + # 精简版转移模式 + RMT_MODES_LITE = { + "copy": RmtMode.COPY, + "link": RmtMode.LINK, + "softlink": RmtMode.SOFTLINK, + "move": RmtMode.MOVE + } + + # 下载器 + DOWNLOADER_DICT = { + "qbittorrent": DownloaderType.QB, + "transmission": DownloaderType.TR, + "client115": DownloaderType.Client115, + "pikpak": DownloaderType.PikPak + } + + # 索引器 + INDEXER_DICT = { + "builtin": IndexerType.BUILTIN + } + + # 媒体服务器 + MEDIASERVER_DICT = { + "emby": MediaServerType.EMBY, + "jellyfin": MediaServerType.JELLYFIN, + "plex": MediaServerType.PLEX + } + + # 消息通知类型 + MESSAGE_CONF = { + "client": { + "telegram": { + "name": "Telegram", + "img_url": "../static/img/telegram.png", + "search_type": SearchType.TG, + "config": { + "token": { + "id": "telegram_token", + "required": True, + "title": "Bot Token", + "tooltip": "telegram机器人的Token,关注BotFather创建机器人", + "type": "text" + }, + "chat_id": { + "id": "telegram_chat_id", + "required": True, + "title": "Chat ID", + "tooltip": "接受消息通知的用户、群组或频道Chat ID,关注@getidsbot获取", + "type": "text" + }, + "user_ids": { + "id": "telegram_user_ids", + "required": False, + "title": "User IDs", + "tooltip": "允许使用交互的用户Chat ID,留空则只允许管理用户使用,关注@getidsbot获取", + "type": "text", + "placeholder": "使用,分隔多个Id" + }, + "admin_ids": { + "id": "telegram_admin_ids", + "required": False, + "title": "Admin IDs", + "tooltip": "允许使用管理命令的用户Chat ID,关注@getidsbot获取", + "type": "text", + "placeholder": "使用,分隔多个Id" + }, + "webhook": { + "id": "telegram_webhook", + "required": False, + "title": "Webhook", + "tooltip": "Telegram机器人消息有两种模式:Webhook或消息轮循;开启后将使用Webhook方式,需要在基础设置中正确配置好外网访问地址,同时受Telegram官方限制,外网访问地址需要设置为以下端口之一:443, 80, 88, 8443,且需要有公网认证的可信SSL证书;关闭后将使用消息轮循方式,使用该方式需要在基础设置->安全处将Telegram ipv4源地址设置为127.0.0.1,如同时使用了内置的SSL证书功能,消息轮循方式可能无法正常使用", + "type": "switch" + } + } + }, + "wechat": { + "name": "微信", + "img_url": "../static/img/wechat.png", + "search_type": SearchType.WX, + "config": { + "corpid": { + "id": "wechat_corpid", + "required": True, + "title": "企业ID", + "tooltip": "每个企业都拥有唯一的corpid,获取此信息可在管理后台“我的企业”-“企业信息”下查看“企业ID”(需要有管理员权限)", + "type": "text" + }, + "corpsecret": { + "id": "wechat_corpsecret", + "required": True, + "title": "应用Secret", + "tooltip": "每个应用都拥有唯一的secret,获取此信息可在管理后台“应用与小程序”-“自建”下查看“Secret”(需要有管理员权限)", + "type": "text", + "placeholder": "Secret" + }, + "agentid": { + "id": "wechat_agentid", + "required": True, + "title": "应用ID", + "tooltip": "每个应用都拥有唯一的agentid,获取此信息可在管理后台“应用与小程序”-“自建”下查看“AgentId”(需要有管理员权限)", + "type": "text", + "placeholder": "AgentId", + }, + "default_proxy": { + "id": "wechat_default_proxy", + "required": False, + "title": "消息推送代理", + "tooltip": "由于微信官方限制,2022年6月20日后创建的企业微信应用需要有固定的公网IP地址并加入IP白名单后才能发送消息,使用有固定公网IP的代理服务器转发可解决该问题;代理服务器需自行搭建,搭建方法可参考项目主页说明", + "type": "text", + "placeholder": "https://wechat.nastool.cn" + }, + "token": { + "id": "wechat_token", + "required": False, + "title": "Token", + "tooltip": "需要交互功能时才需要填写,在微信企业应用管理后台-接收消息设置页面生成,填入完成后重启本应用,然后再在微信页面输入地址确定", + "type": "text", + "placeholder": "API接收消息Token" + }, + "encodingAESKey": { + "id": "wechat_encodingAESKey", + "required": False, + "title": "EncodingAESKey", + "tooltip": "需要交互功能时才需要填写,在微信企业应用管理后台-接收消息设置页面生成,填入完成后重启本应用,然后再在微信页面输入地址确定", + "type": "text", + "placeholder": "API接收消息EncodingAESKey" + } + } + }, + "serverchan": { + "name": "Server酱", + "img_url": "../static/img/serverchan.png", + "config": { + "sckey": { + "id": "serverchan_sckey", + "required": True, + "title": "SCKEY", + "tooltip": "填写ServerChan的API Key,SCT类型,在https://sct.ftqq.com/中申请", + "type": "text", + "placeholder": "SCT..." + } + } + }, + "bark": { + "name": "Bark", + "img_url": "../static/img/bark.webp", + "config": { + "server": { + "id": "bark_server", + "required": True, + "title": "Bark服务器地址", + "tooltip": "自己搭建Bark服务端请实际配置,否则可使用:https://api.day.app", + "type": "text", + "placeholder": "https://api.day.app", + "default": "https://api.day.app" + }, + "apikey": { + "id": "bark_apikey", + "required": True, + "title": "API Key", + "tooltip": "在Bark客户端中点击右上角的“...”按钮,选择“生成Bark Key”,然后将生成的KEY填入此处", + "type": "text" + }, + "params": { + "id": "bark_params", + "required": False, + "title": "附加参数", + "tooltip": "添加到Bark通知中的附加参数,可用于自定义通知特性", + "type": "text", + "placeholder": "group=xxx&sound=xxx&url=xxx" + } + } + }, + "pushdeer": { + "name": "PushDeer", + "img_url": "../static/img/pushdeer.png", + "config": { + "server": { + "id": "pushdeer_server", + "required": True, + "title": "PushDeer服务器地址", + "tooltip": "自己搭建pushdeer服务端请实际配置,否则可使用:https://api2.pushdeer.com", + "type": "text", + "placeholder": "https://api2.pushdeer.com", + "default": "https://api2.pushdeer.com" + }, + "apikey": { + "id": "pushdeer_apikey", + "required": True, + "title": "API Key", + "tooltip": "pushdeer客户端生成的KEY", + "type": "text" + } + } + }, + "pushplus": { + "name": "PushPlus", + "img_url": "../static/img/pushplus.jpg", + "config": { + "token": { + "id": "pushplus_token", + "required": True, + "title": "Token", + "tooltip": "在PushPlus官网中申请,申请地址:http://pushplus.plus/", + "type": "text" + }, + "channel": { + "id": "pushplus_channel", + "required": True, + "title": "推送渠道", + "tooltip": "使用PushPlus中配置的发送渠道,具体参考pushplus.plus官网文档说明,支持第三方webhook、钉钉、飞书、邮箱等", + "type": "select", + "options": { + "wechat": "微信", + "mail": "邮箱", + "webhook": "第三方Webhook" + }, + "default": "wechat" + }, + "topic": { + "id": "pushplus_topic", + "required": False, + "title": "群组编码", + "tooltip": "PushPlus中创建的群组,如未设置可为空", + "type": "text" + }, + "webhook": { + "id": "pushplus_webhook", + "required": False, + "title": "Webhook编码", + "tooltip": "PushPlus中创建的webhook编码,发送渠道为第三方webhook时需要填入", + } + } + }, + "iyuu": { + "name": "爱语飞飞", + "img_url": "../static/img/iyuu.png", + "config": { + "token": { + "id": "iyuumsg_token", + "required": True, + "title": "令牌Token", + "tooltip": "在爱语飞飞官网中申请,申请地址:https://iyuu.cn/", + "type": "text", + "placeholder": "登录https://iyuu.cn获取" + } + } + }, + "slack": { + "name": "Slack", + "img_url": "../static/img/slack.png", + "search_type": SearchType.SLACK, + "config": { + "bot_token": { + "id": "slack_bot_token", + "required": True, + "title": "Bot User OAuth Token", + "tooltip": "在Slack中创建应用,获取Bot User OAuth Token", + "type": "text", + "placeholder": "xoxb-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx" + }, + "app_token": { + "id": "slack_app_token", + "required": True, + "title": "App-Level Token", + "tooltip": "在Slack中创建应用,获取App-Level Token", + "type": "text", + "placeholder": "xapp-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx" + }, + "channel": { + "id": "slack_channel", + "required": False, + "title": "频道名称", + "tooltip": "Slack中的频道名称,默认为全体;需要将机器人添加到该频道,以接收非交互类的通知消息", + "type": "text", + "placeholder": "全体" + } + } + }, + "gotify": { + "name": "Gotify", + "img_url": "../static/img/gotify.png", + "config": { + "server": { + "id": "gotify_server", + "required": True, + "title": "Gotify服务器地址", + "tooltip": "自己搭建gotify服务端地址", + "type": "text", + "placeholder": "http://localhost:8800" + }, + "token": { + "id": "gotify_token", + "required": True, + "title": "令牌Token", + "tooltip": "Gotify服务端APPS下创建的token", + "type": "text" + }, + "priority": { + "id": "gotify_priority", + "required": False, + "title": "消息Priority", + "tooltip": "消息通知优先级, 请填写数字(1-8), 默认: 8", + "type": "text", + "placeholder": "8" + } + } + }, + "chanify": { + "name": "Chanify", + "img_url": "../static/img/chanify.png", + "config": { + "server": { + "id": "chanify_server", + "required": True, + "title": "Chanify服务器地址", + "tooltip": "自己搭建Chanify服务端地址或使用https://api.chanify.net", + "type": "text", + "placeholder": "https://api.chanify.net", + "default": "https://api.chanify.net" + }, + "token": { + "id": "chanify_token", + "required": True, + "title": "令牌", + "tooltip": "在Chanify客户端频道中获取", + "type": "text" + } + } + }, + "synologychat": { + "name": "Synology Chat", + "img_url": "../static/img/synologychat.png", + "search_type": SearchType.SYNOLOGY, + "config": { + "webhook_url": { + "id": "synologychat_webhook_url", + "required": True, + "title": "机器人传入URL", + "tooltip": "在Synology Chat中创建机器人,获取机器人传入URL", + "type": "text", + "placeholder": "https://xxx/webapi/entry.cgi?api=xxx" + }, + "token": { + "id": "synologychat_token", + "required": True, + "title": "令牌", + "tooltip": "在Synology Chat中创建机器人,获取机器人令牌", + "type": "text", + "placeholder": "" + } + } + }, + }, + "switch": { + "download_start": { + "name": "新增下载", + "fuc_name": "download_start" + }, + "download_fail": { + "name": "下载失败", + "fuc_name": "download_fail" + }, + "transfer_finished": { + "name": "入库完成", + "fuc_name": "transfer_finished" + }, + "transfer_fail": { + "name": "入库失败", + "fuc_name": "transfer_fail" + }, + "rss_added": { + "name": "新增订阅", + "fuc_name": "rss_added" + }, + "rss_finished": { + "name": "订阅完成", + "fuc_name": "rss_finished" + }, + "site_signin": { + "name": "站点签到", + "fuc_name": "site_signin" + }, + "site_message": { + "name": "站点消息", + "fuc_name": "site_message" + }, + "brushtask_added": { + "name": "刷流下种", + "fuc_name": "brushtask_added" + }, + "brushtask_remove": { + "name": "刷流删种", + "fuc_name": "brushtask_remove" + }, + "mediaserver_message": { + "name": "媒体服务", + "fuc_name": "mediaserver_message" + }, + "custom_message": { + "name": "自定义消息", + "fuc_name": "custom_message" + } + } + } + + # 自动删种配置 + TORRENTREMOVER_DICT = { + "Qb": { + "name": "Qbittorrent", + "img_url": "../static/img/qbittorrent.png", + "downloader_type": DownloaderType.QB, + "torrent_state": { + "downloading": "正在下载_传输数据", + "stalledDL": "正在下载_未建立连接", + "uploading": "正在上传_传输数据", + "stalledUP": "正在上传_未建立连接", + "error": "暂停_发生错误", + "pausedDL": "暂停_下载未完成", + "pausedUP": "暂停_下载完成", + "missingFiles": "暂停_文件丢失", + "checkingDL": "检查中_下载未完成", + "checkingUP": "检查中_下载完成", + "checkingResumeData": "检查中_启动时恢复数据", + "forcedDL": "强制下载_忽略队列", + "queuedDL": "等待下载_排队", + "forcedUP": "强制上传_忽略队列", + "queuedUP": "等待上传_排队", + "allocating": "分配磁盘空间", + "metaDL": "获取元数据", + "moving": "移动文件", + "unknown": "未知状态", + } + }, + "Tr": { + "name": "Transmission", + "img_url": "../static/img/transmission.png", + "downloader_type": DownloaderType.TR, + "torrent_state": { + "downloading": "正在下载", + "seeding": "正在上传", + "download_pending": "等待下载_排队", + "seed_pending": "等待上传_排队", + "checking": "正在检查", + "check_pending": "等待检查_排队", + "stopped": "暂停", + } + } + } + + # 搜索种子过滤属性 + TORRENT_SEARCH_PARAMS = { + "restype": { + "BLURAY": r"Blu-?Ray|BD|BDRIP", + "REMUX": r"REMUX", + "DOLBY": r"DOLBY|DOVI|\s+DV$|\s+DV\s+", + "WEB": r"WEB-?DL|WEBRIP", + "HDTV": r"U?HDTV", + "UHD": r"UHD", + "HDR": r"HDR", + "3D": r"3D" + }, + "pix": { + "8k": r"8K", + "4k": r"4K|2160P|X2160", + "1080p": r"1080[PIX]|X1080", + "720p": r"720P" + } + } + + # 网络测试对象 + NETTEST_TARGETS = [ + "www.themoviedb.org", + "api.themoviedb.org", + "api.tmdb.org", + "image.tmdb.org", + "webservice.fanart.tv", + "api.telegram.org", + "qyapi.weixin.qq.com", + "www.opensubtitles.org" + ] + + # 下载器 + DOWNLOADER_CONF = { + "qbittorrent": { + "name": "Qbittorrent", + "img_url": "../static/img/qbittorrent.png", + "background": "bg-blue", + "test_command": "app.downloader.client.qbittorrent|Qbittorrent", + "config": { + "qbhost": { + "id": "qbittorrent.qbhost", + "required": True, + "title": "IP地址", + "tooltip": "配置IP地址,如为https则需要增加https://前缀", + "type": "text", + "placeholder": "127.0.0.1" + }, + "qbport": { + "id": "qbittorrent.qbport", + "required": True, + "title": "端口", + "type": "text", + "placeholder": "8080" + }, + "qbusername": { + "id": "qbittorrent.qbusername", + "required": True, + "title": "用户名", + "type": "text", + "placeholder": "admin" + }, + "qbpassword": { + "id": "qbittorrent.qbpassword", + "required": False, + "title": "密码", + "type": "password", + "placeholder": "adminadmin" + }, + "force_upload": { + "id": "qbittorrent.force_upload", + "required": False, + "title": "自动强制作种", + "tooltip": "开启后下载文件转移完成时会自动将对应种子设置为强制做种状态,需在基础设置中开启下载软件监控功能", + "type": "switch" + }, + "auto_management": { + "id": "qbittorrent.auto_management", + "required": False, + "title": "自动管理模式", + "tooltip": "开启后下载目录将由Qbittorrent自动管理,不再使用NASTool传递的下载目录,需要同时在下载目录设置中配置好分类标签", + "type": "switch" + } + } + }, + "transmission": { + "name": "Transmission", + "img_url": "../static/img/transmission.png", + "background": "bg-danger", + "test_command": "app.downloader.client.transmission|Transmission", + "config": { + "trhost": { + "id": "transmission.trhost", + "required": True, + "title": "IP地址", + "tooltip": "配置IP地址,如为https则需要增加https://前缀", + "type": "text", + "placeholder": "127.0.0.1" + }, + "trport": { + "id": "transmission.trport", + "required": True, + "title": "端口", + "type": "text", + "placeholder": "9091" + }, + "trusername": { + "id": "transmission.trusername", + "required": True, + "title": "用户名", + "type": "text", + "placeholder": "admin" + }, + "trpassword": { + "id": "transmission.trpassword", + "required": False, + "title": "密码", + "type": "password", + "placeholder": "" + } + } + }, + "client115": { + "name": "115网盘", + "img_url": "../static/img/115.jpg", + "background": "bg-azure", + "test_command": "app.downloader.client.client115|Client115", + "config": { + "cookie": { + "id": "client115.cookie", + "required": True, + "title": "Cookie", + "tooltip": "115网盘Cookie,通过115网盘网页端抓取Cookie", + "type": "text", + "placeholder": "USERSESSIONID=xxx;115_lang=zh;UID=xxx;CID=xxx;SEID=xxx" + } + } + }, + "pikpak": { + "name": "PikPak", + "img_url": "../static/img/pikpak.png", + "background": "bg-indigo", + "test_command": "app.downloader.client.pikpak|PikPak", + "config": { + "username": { + "id": "pikpak.username", + "required": True, + "title": "用户名", + "tooltip": "用户名", + "type": "text", + "placeholder": "" + }, + "password": { + "id": "pikpak.password", + "required": True, + "title": "密码", + "tooltip": "密码", + "type": "password", + "placeholder": "" + }, + "proxy": { + "id": "pikpak.proxy", + "required": False, + "title": "代理", + "tooltip": "如果需要代理才能访问pikpak可以在此处填入代理地址", + "type": "text", + "placeholder": "127.0.0.1:7890" + } + } + }, + } + + # 媒体服务器 + MEDIASERVER_CONF = { + "emby": { + "name": "Emby", + "img_url": "../static/img/emby.png", + "background": "bg-green", + "test_command": "app.mediaserver.client.emby|Emby", + "config": { + "host": { + "id": "emby.host", + "required": True, + "title": "服务器地址", + "tooltip": "配置IP地址和端口,如为https则需要增加https://前缀", + "type": "text", + "placeholder": "http://127.0.0.1:8096" + }, + "api_key": { + "id": "emby.api_key", + "required": True, + "title": "Api Key", + "tooltip": "在Emby设置->高级->API密钥处生成,注意不要复制到了应用名称", + "type": "text", + "placeholder": "" + } + } + }, + "jellyfin": { + "name": "Jellyfin", + "img_url": "../static/img/jellyfin.jpg", + "background": "bg-purple", + "test_command": "app.mediaserver.client.jellyfin|Jellyfin", + "config": { + "host": { + "id": "jellyfin.host", + "required": True, + "title": "服务器地址", + "tooltip": "配置IP地址和端口,如为https则需要增加https://前缀", + "type": "text", + "placeholder": "http://127.0.0.1:8096" + }, + "api_key": { + "id": "jellyfin.api_key", + "required": True, + "title": "Api Key", + "tooltip": "在Jellyfin设置->高级->API密钥处生成", + "type": "text", + "placeholder": "" + } + } + }, + "plex": { + "name": "Plex", + "img_url": "../static/img/plex.png", + "background": "bg-yellow", + "test_command": "app.mediaserver.client.plex|Plex", + "config": { + "host": { + "id": "plex.host", + "required": True, + "title": "服务器地址", + "tooltip": "配置IP地址和端口,如为https则需要增加https://前缀", + "type": "text", + "placeholder": "http://127.0.0.1:32400" + }, + "token": { + "id": "plex.token", + "required": False, + "title": "X-Plex-Token", + "tooltip": "Plex网页Cookie中的X-Plex-Token,通过浏览器F12->网络中获取,如填写将优先使用;Token与服务器名称、用户名及密码 二选一,推荐使用Token,连接速度更快", + "type": "text", + "placeholder": "X-Plex-Token与其它认证信息二选一" + }, + "servername": { + "id": "plex.servername", + "required": False, + "title": "服务器名称", + "tooltip": "配置Plex设置->左侧下拉框中看到的服务器名称;如填写了Token则无需填写服务器名称、用户名及密码", + "type": "text", + "placeholder": "" + }, + "username": { + "id": "plex.username", + "required": False, + "title": "用户名", + "type": "text", + "placeholder": "" + }, + "password": { + "id": "plex.password", + "required": False, + "title": "密码", + "type": "password", + "placeholder": "" + } + } + }, + } + + # 索引器 + INDEXER_CONF = {} + + # 发现过滤器 + DISCOVER_FILTER_CONF = { + "tmdb_movie": { + "with_genres": { + "name": "类型", + "type": "dropdown", + "options": [{'value': '', 'name': '全部'}, + {'value': '12', 'name': '冒险'}, + {'value': '16', 'name': '动画'}, + {'value': '35', 'name': '喜剧'}, + {'value': '80', 'name': '犯罪'}, + {'value': '18', 'name': '剧情'}, + {'value': '14', 'name': '奇幻'}, + {'value': '27', 'name': '恐怖'}, + {'value': '9648', 'name': '悬疑'}, + {'value': '10749', 'name': '爱情'}, + {'value': '878', 'name': '科幻'}, + {'value': '53', 'name': '惊悚'}, + {'value': '10752', 'name': '战争'}] + }, + "with_original_language": { + "name": "语言", + "type": "dropdown", + "options": [{'value': '', 'name': '全部'}, + {'value': 'zh', 'name': '中文'}, + {'value': 'en', 'name': '英语'}, + {'value': 'ja', 'name': '日语'}, + {'value': 'ko', 'name': '韩语'}, + {'value': 'fr', 'name': '法语'}, + {'value': 'de', 'name': '德语'}, + {'value': 'ru', 'name': '俄语'}, + {'value': 'hi', 'name': '印地语'}] + } + }, + "tmdb_tv": { + "with_genres": { + "name": "类型", + "type": "dropdown", + "options": [{'value': '', 'name': '全部'}, + {'value': '10759', 'name': '动作冒险'}, + {'value': '16', 'name': '动画'}, + {'value': '35', 'name': '喜剧'}, + {'value': '80', 'name': '犯罪'}, + {'value': '99', 'name': '纪录'}, + {'value': '18', 'name': '剧情'}, + {'value': '10762', 'name': '儿童'}, + {'value': '9648', 'name': '悬疑'}, + {'value': '10764', 'name': '真人秀'}, + {'value': '10765', 'name': '科幻'}] + }, + "with_original_language": { + "name": "语言", + "type": "dropdown", + "options": [{'value': '', 'name': '全部'}, + {'value': 'zh', 'name': '中文'}, + {'value': 'en', 'name': '英语'}, + {'value': 'ja', 'name': '日语'}, + {'value': 'ko', 'name': '韩语'}, + {'value': 'fr', 'name': '法语'}, + {'value': 'de', 'name': '德语'}, + {'value': 'ru', 'name': '俄语'}, + {'value': 'hi', 'name': '印地语'}] + } + }, + "douban_movie": { + "sort": { + "name": "排序", + "type": "dropdown", + "options": [{'value': '', 'name': '默认'}, + {'value': 'U', 'name': '综合排序'}, + {'value': 'T', 'name': '首播时间'}, + {'value': 'S', 'name': '高分优先'}, + {'value': 'R', 'name': '近期热度'}] + }, + "tags": { + "name": "类型", + "type": "dropdown", + "options": [{"value": "", "name": "全部"}, + {"value": "喜剧", "name": "喜剧"}, + {"value": "爱情", "name": "爱情"}, + {"value": "动作", "name": "动作"}, + {"value": "科幻", "name": "科幻"}, + {"value": "动画", "name": "动画"}, + {"value": "悬疑", "name": "悬疑"}, + {"value": "犯罪", "name": "犯罪"}, + {"value": "惊悚", "name": "惊悚"}, + {"value": "冒险", "name": "冒险"}, + {"value": "奇幻", "name": "奇幻"}, + {"value": "恐怖", "name": "恐怖"}, + {"value": "战争", "name": "战争"}, + {"value": "武侠", "name": "武侠"}, + {"value": "灾难", "name": "灾难"}] + } + }, + "douban_tv": { + "sort": { + "name": "排序", + "type": "dropdown", + "options": [{'value': '', 'name': '默认'}, + {'value': 'U', 'name': '综合排序'}, + {'value': 'T', 'name': '首播时间'}, + {'value': 'S', 'name': '高分优先'}, + {'value': 'R', 'name': '近期热度'}] + }, + "tags": { + "name": "地区", + "type": "dropdown", + "options": [{"value": "", "name": "全部"}, + {"value": "华语", "name": "华语"}, + {"value": "中国大陆", "name": "中国大陆"}, + {"value": "中国香港", "name": "中国香港"}, + {"value": "中国台湾", "name": "中国台湾"}, + {"value": "欧美", "name": "欧美"}, + {"value": "韩国", "name": "韩国"}, + {"value": "日本", "name": "日本"}, + {"value": "印度", "name": "印度"}, + {"value": "泰国", "name": "泰国"}] + } + } + } + + @staticmethod + def get_enum_name(enum, value): + """ + 根据Enum的value查询name + :param enum: 枚举 + :param value: 枚举值 + :return: 枚举名或None + """ + for e in enum: + if e.value == value: + return e.name + return None + + @staticmethod + def get_enum_item(enum, value): + """ + 根据Enum的value查询name + :param enum: 枚举 + :param value: 枚举值 + :return: 枚举项 + """ + for e in enum: + if e.value == value: + return e + return None + + @staticmethod + def get_dictenum_key(dictenum, value): + """ + 根据Enum dict的value查询key + :param dictenum: 枚举字典 + :param value: 枚举类(字典值)的值 + :return: 字典键或None + """ + for k, v in dictenum.items(): + if v.value == value: + return k + return None diff --git a/app/conf/siteconf.py b/app/conf/siteconf.py new file mode 100644 index 0000000..a069b55 --- /dev/null +++ b/app/conf/siteconf.py @@ -0,0 +1,480 @@ +class SiteConf: + + # 站点签到支持的识别XPATH + SITE_CHECKIN_XPATH = [ + '//a[@id="signed"]', + '//a[contains(@href, "attendance")]', + '//a[contains(text(), "签到")]', + '//a/b[contains(text(), "签 到")]', + '//span[@id="sign_in"]/a', + '//a[contains(@href, "addbonus")]', + '//input[@class="dt_button"][contains(@value, "打卡")]', + '//a[contains(@href, "sign_in")]', + '//a[contains(@onclick, "do_signin")]', + '//a[@id="do-attendance"]' + ] + + # 站点详情页字幕下载链接识别XPATH + SITE_SUBTITLE_XPATH = [ + '//td[@class="rowhead"][text()="字幕"]/following-sibling::td//a/@href', + ] + + # 站点登录界面元素XPATH + SITE_LOGIN_XPATH = { + "username": [ + '//input[@name="username"]', + '//input[@id="form_item_username"]' + ], + "password": [ + '//input[@name="password"]', + '//input[@id="form_item_password"]' + ], + "captcha": [ + '//input[@name="imagestring"]', + '//input[@name="captcha"]', + '//input[@id="form_item_captcha"]' + ], + "captcha_img": [ + '//img[@alt="CAPTCHA"]/@src', + '//img[@alt="SECURITY CODE"]/@src', + '//img[@id="LAY-user-get-vercode"]/@src', + '//img[contains(@src,"/api/getCaptcha")]/@src' + ], + "submit": [ + '//input[@type="submit"]', + '//button[@type="submit"]', + '//button[@lay-filter="login"]', + '//button[@lay-filter="formLogin"]', + '//input[@type="button"][@value="登录"]' + ], + "error": [ + "//table[@class='main']//td[@class='text']/text()" + ], + "twostep": [ + '//input[@name="two_step_code"]', + '//input[@name="2fa_secret"]' + ] + } + + # 检测种子促销的站点XPATH,不在此清单的无法开启仅RSS免费种子功能 + RSS_SITE_GRAP_CONF = { + 'jptv.club': { + 'FREE': ["//span/i[@class='fas fa-star text-gold']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': ["//span[@class='badge-extra text-green']"], + }, + 'pthome.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'ptsbao.club': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'totheglory.im': { + 'FREE': ["//img[@class='topic'][contains(@src,'ico_free.gif')]"], + '2XFREE': [], + 'HR': ["//img[@src='/pic/hit_run.gif']"], + 'PEER_COUNT': ["//span[@id='dlstatus']"], + }, + 'www.beitai.pt': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdtime.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'www.haidan.video': { + 'FREE': ["//img[@class='pro_free'][@title='免费']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': ["//div[@class='torrent']/div[1]/div[1]/div[3]"], + }, + 'kp.m-team.cc': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'lemonhd.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"] + }, + 'discfan.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'pt.sjtu.edu.cn': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'nanyangpt.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'audiences.me': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"] + }, + 'pterclub.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["(//td[@align='left' and @class='rowfollow' and @valign='top']/b[1])[3]"] + }, + 'et8.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'pt.keepfrds.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'www.pttime.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']", "//h1[@id='top']/b/font[@class='zeroupzerodown']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + '1ptba.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'www.tjupt.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//font[@class='twoup'][text()='2X']"], + 'HR': ["//font[@color='red'][text()='Hit&Run']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdhome.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdsky.me': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'hdcity.city': { + 'FREE': ["//img[@class='pro_free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'hdcity.leniter.org': { + 'FREE': ["//img[@class='pro_free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'hdcity.work': { + 'FREE': ["//img[@class='pro_free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'hdcity4.leniter.org': { + 'FREE': ["//img[@class='pro_free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'open.cd': { + 'FREE': ["//img[@class='pro_free']"], + '2XFREE': ["//img[@class='pro_free2up']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'ourbits.club': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'pt.btschool.club': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'pt.eastgame.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'pt.soulvoice.club': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': ["//img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'springsunday.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'www.htpt.cc': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'chdbits.co': { + 'FREE': ["//h1[@id='top']/img[@class='pro_free']"], + '2XFREE': [], + 'HR': ["//b[contains(text(),'H&R:')]"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdchina.org': { + 'RENDER': True, + 'FREE': ["//h2[@id='top']/img[@class='pro_free']"], + '2XFREE': ["//h2[@id='top']/img[@class='pro_free2up']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + "ccfbits.org": { + 'FREE': ["//font[@color='red'][text()='本种子不计下载量,只计上传量!']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'u2.dmhy.org': { + 'FREE': ["//img[@class='pro_free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'www.hdarea.co': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdatmos.club': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'avgv.cc': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'hdfans.org': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdpt.xyz': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'azusa.ru': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdmayi.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdzone.me': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'gainbound.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'hdvideo.one': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + '52pt.site': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'pt.msg.vg': { + 'LOGIN': 'user/login/index', + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'kamept.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'carpt.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'club.hares.top': { + 'FREE': ["//b[@class='free'][text()='免费']"], + '2XFREE': ["//b[@class='twoupfree'][text()='2X免费']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'www.hddolby.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'piggo.me': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'pt.0ff.cc': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'wintersakura.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'pt.hdupt.com': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'pt.upxin.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'www.nicept.net': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'ptchina.org': { + 'FREE': ["//h1[@id='top']/b/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'www.hd.ai': { + 'FREE': ["//img[@class='pro_free']"], + '2XFREE': [], + 'HR': [], + 'PEER_COUNT': [], + }, + 'hhanclub.top': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': [], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'zmpt.cc': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + 'ihdbits.me': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': [], + }, + 'leaves.red': { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + "sharkpt.net": { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': ["//h1[@id='top']/img[@class='hitandrun']"], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + "pt.2xfree.org": { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + "uploads.ltd": { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + "www.icc2022.com": { + 'FREE': ["//h1[@id='top']/b/font[@class='free']"], + '2XFREE': ["//h1[@id='top']/b/font[@class='twoupfree']"], + 'HR': [], + 'PEER_COUNT': ["//div[@id='peercount']/b[1]"], + }, + "zhuque.in": { + 'RENDER': True, + 'FREE': ["//span[@class='text-download'][contains(text(),'0x')]"], + '2XFREE': [""], + 'HR': [], + 'PEER_COUNT': ["//div[@class='ant-form-item-control-input-content']/span[contains(text(),'正在做种: )]"], + } + } + # 公共BT站点 + PUBLIC_TORRENT_SITES = {} diff --git a/app/conf/systemconfig.py b/app/conf/systemconfig.py new file mode 100644 index 0000000..fc3c2fd --- /dev/null +++ b/app/conf/systemconfig.py @@ -0,0 +1,67 @@ +import json + +from app.helper import DictHelper +from app.utils.commons import singleton + + +@singleton +class SystemConfig: + + # 系统设置 + systemconfig = { + # 默认下载设置 + "DefaultDownloadSetting": None, + # CookieCloud的设置 + "CookieCloud": {}, + # 自动获取Cookie的用户信息 + "CookieUserInfo": {}, + # 用户自定义CSS/JavsScript + "CustomScript": {}, + # 播放限速设置 + "SpeedLimit": {} + } + + def __init__(self): + self.init_config() + + def init_config(self, key=None): + """ + 缓存系统设置 + """ + def __set_value(_key, _value): + if isinstance(_value, dict) \ + or isinstance(_value, list): + dict_value = DictHelper().get("SystemConfig", _key) + if dict_value: + self.systemconfig[_key] = json.loads(dict_value) + else: + self.systemconfig[_key] = {} + else: + self.systemconfig[_key] = DictHelper().get("SystemConfig", _key) + + if key: + __set_value(key, self.systemconfig.get(key)) + else: + for key, value in self.systemconfig.items(): + __set_value(key, value) + + def set_system_config(self, key, value): + """ + 设置系统设置 + """ + if isinstance(value, dict) \ + or isinstance(value, list): + if value: + value = json.dumps(value) + else: + value = None + DictHelper().set("SystemConfig", key, value) + self.init_config(key) + + def get_system_config(self, key=None): + """ + 获取系统设置 + """ + if not key: + return self.systemconfig + return self.systemconfig.get(key) diff --git a/app/db/__init__.py b/app/db/__init__.py new file mode 100644 index 0000000..cfe8c5d --- /dev/null +++ b/app/db/__init__.py @@ -0,0 +1,44 @@ +import os +import log +from config import Config +from .main_db import MainDb +from .main_db import DbPersist +from .media_db import MediaDb +from alembic.config import Config as AlembicConfig +from alembic.command import upgrade as alembic_upgrade + + +def init_db(): + """ + 初始化数据库 + """ + log.console('开始初始化数据库...') + MediaDb().init_db() + MainDb().init_db() + log.console('数据库初始化完成') + + +def init_data(): + """ + 初始化数据 + """ + log.console('开始初始化数据...') + MainDb().init_data() + log.console('数据初始化完成') + + +def update_db(): + """ + 更新数据库 + """ + db_location = os.path.join(Config().get_config_path(), 'user.db') + script_location = os.path.join(Config().get_root_path(), 'db_scripts') + log.console('开始更新数据库...') + try: + alembic_cfg = AlembicConfig() + alembic_cfg.set_main_option('script_location', script_location) + alembic_cfg.set_main_option('sqlalchemy.url', f"sqlite:///{db_location}") + alembic_upgrade(alembic_cfg, 'head') + except Exception as e: + print(str(e)) + log.console('数据库更新完成') diff --git a/app/db/main_db.py b/app/db/main_db.py new file mode 100644 index 0000000..3620818 --- /dev/null +++ b/app/db/main_db.py @@ -0,0 +1,122 @@ +import os +import threading +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, scoped_session +from sqlalchemy.pool import QueuePool + +from app.db.models import Base +from app.utils import ExceptionUtils, PathUtils +from config import Config + +lock = threading.Lock() +_Engine = create_engine( + f"sqlite:///{os.path.join(Config().get_config_path(), 'user.db')}?check_same_thread=False", + echo=False, + poolclass=QueuePool, + pool_pre_ping=True, + pool_size=50, + pool_recycle=60 * 10, + max_overflow=0 +) +_Session = scoped_session(sessionmaker(bind=_Engine, + autoflush=True, + autocommit=False, + expire_on_commit=False)) + + +class MainDb: + + @property + def session(self): + return _Session() + + @staticmethod + def init_db(): + with lock: + Base.metadata.create_all(_Engine) + + def init_data(self): + """ + 读取config目录下的sql文件,并初始化到数据库,只处理一次 + """ + config = Config().get_config() + init_files = Config().get_config("app").get("init_files") or [] + config_dir = Config().get_script_path() + sql_files = PathUtils.get_dir_level1_files(in_path=config_dir, exts=".sql") + config_flag = False + for sql_file in sql_files: + if os.path.basename(sql_file) not in init_files: + config_flag = True + with open(sql_file, "r", encoding="utf-8") as f: + sql_list = f.read().split(';\n') + for sql in sql_list: + try: + self.excute(sql) + self.commit() + except Exception as err: + print(str(err)) + init_files.append(os.path.basename(sql_file)) + if config_flag: + config['app']['init_files'] = init_files + Config().save_config(config) + + def insert(self, data): + """ + 插入数据 + """ + if isinstance(data, list): + self.session.add_all(data) + else: + self.session.add(data) + + def query(self, *obj): + """ + 查询对象 + """ + return self.session.query(*obj) + + def excute(self, sql): + """ + 执行SQL语句 + """ + self.session.execute(sql) + + def flush(self): + """ + 刷写 + """ + self.session.flush() + + def commit(self): + """ + 提交事务 + """ + self.session.commit() + + def rollback(self): + """ + 回滚事务 + """ + self.session.rollback() + + +class DbPersist(object): + """ + 数据库持久化装饰器 + """ + + def __init__(self, db): + self.db = db + + def __call__(self, f): + def persist(*args, **kwargs): + try: + ret = f(*args, **kwargs) + self.db.commit() + return True if ret is None else ret + except Exception as e: + ExceptionUtils.exception_traceback(e) + self.db.rollback() + return False + + return persist diff --git a/app/db/media_db.py b/app/db/media_db.py new file mode 100644 index 0000000..4e22eaf --- /dev/null +++ b/app/db/media_db.py @@ -0,0 +1,126 @@ +import os +import threading +import time +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, scoped_session +from sqlalchemy.pool import QueuePool +from app.db.models import BaseMedia, MEDIASYNCITEMS, MEDIASYNCSTATISTIC +from app.utils import ExceptionUtils +from config import Config + +lock = threading.Lock() +_Engine = create_engine( + f"sqlite:///{os.path.join(Config().get_config_path(), 'media.db')}?check_same_thread=False", + echo=False, + poolclass=QueuePool, + pool_pre_ping=True, + pool_size=50, + pool_recycle=60 * 10, + max_overflow=0 +) +_Session = scoped_session(sessionmaker(bind=_Engine, + autoflush=True, + autocommit=False)) + + +class MediaDb: + + @property + def session(self): + return _Session() + + @staticmethod + def init_db(): + with lock: + BaseMedia.metadata.create_all(_Engine) + + def insert(self, server_type, iteminfo): + if not server_type or not iteminfo: + return False + try: + self.session.query(MEDIASYNCITEMS).filter(MEDIASYNCITEMS.SERVER == server_type, + MEDIASYNCITEMS.ITEM_ID == iteminfo.get("id")).delete() + self.session.flush() + self.session.add(MEDIASYNCITEMS( + SERVER=server_type, + LIBRARY=iteminfo.get("library"), + ITEM_ID=iteminfo.get("id"), + ITEM_TYPE=iteminfo.get("type"), + TITLE=iteminfo.get("title"), + ORGIN_TITLE=iteminfo.get("originalTitle"), + YEAR=iteminfo.get("year"), + TMDBID=iteminfo.get("tmdbid"), + IMDBID=iteminfo.get("imdbid"), + PATH=iteminfo.get("path") + )) + self.session.commit() + return True + except Exception as e: + ExceptionUtils.exception_traceback(e) + self.session.rollback() + return False + + def empty(self, server_type=None, library=None): + try: + if server_type and library: + self.session.query(MEDIASYNCITEMS).filter(MEDIASYNCITEMS.SERVER == server_type, + MEDIASYNCITEMS.LIBRARY == library).delete() + else: + self.session.query(MEDIASYNCITEMS).delete() + self.session.commit() + return True + except Exception as e: + ExceptionUtils.exception_traceback(e) + self.session.rollback() + return False + + def statistics(self, server_type, total_count, movie_count, tv_count): + if not server_type: + return False + try: + self.session.query(MEDIASYNCSTATISTIC).filter(MEDIASYNCSTATISTIC.SERVER == server_type).delete() + self.session.flush() + self.session.add(MEDIASYNCSTATISTIC( + SERVER=server_type, + TOTAL_COUNT=total_count, + MOVIE_COUNT=movie_count, + TV_COUNT=tv_count, + UPDATE_TIME=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(time.time())) + )) + self.session.commit() + return True + except Exception as e: + ExceptionUtils.exception_traceback(e) + self.session.rollback() + return False + + def exists(self, server_type, title, year, tmdbid): + if not server_type or not title: + return False + if tmdbid: + count = self.session.query(MEDIASYNCITEMS).filter(MEDIASYNCITEMS.TMDBID == str(tmdbid)).count() + if count: + return True + if year: + items = self.session.query(MEDIASYNCITEMS).filter(MEDIASYNCITEMS.SERVER == server_type, + MEDIASYNCITEMS.TITLE == title, + MEDIASYNCITEMS.YEAR == str(year)).all() + else: + items = self.session.query(MEDIASYNCITEMS).filter(MEDIASYNCITEMS.SERVER == server_type, + MEDIASYNCITEMS.TITLE == title).all() + if items: + if tmdbid: + for item in items: + if not item.TMDBID or item.TMDBID == str(tmdbid): + return True + return False + else: + return True + else: + return False + + def get_statistics(self, server_type): + if not server_type: + return None + return self.session.query(MEDIASYNCSTATISTIC).filter(MEDIASYNCSTATISTIC.SERVER == server_type).first() diff --git a/app/db/models.py b/app/db/models.py new file mode 100644 index 0000000..aa0f0ef --- /dev/null +++ b/app/db/models.py @@ -0,0 +1,578 @@ +# coding: utf-8 +from sqlalchemy import Column, Float, Index, Integer, Text, text, Sequence +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() +BaseMedia = declarative_base() + + +class CONFIGFILTERGROUP(Base): + __tablename__ = 'CONFIG_FILTER_GROUP' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + GROUP_NAME = Column(Text) + IS_DEFAULT = Column(Text) + NOTE = Column(Text) + + +class CONFIGFILTERRULES(Base): + __tablename__ = 'CONFIG_FILTER_RULES' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + GROUP_ID = Column(Text, index=True) + ROLE_NAME = Column(Text) + PRIORITY = Column(Text) + INCLUDE = Column(Text) + EXCLUDE = Column(Text) + SIZE_LIMIT = Column(Text) + NOTE = Column(Text) + + +class CONFIGRSSPARSER(Base): + __tablename__ = 'CONFIG_RSS_PARSER' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text, index=True) + TYPE = Column(Text) + FORMAT = Column(Text) + PARAMS = Column(Text) + NOTE = Column(Text) + SYSDEF = Column(Text) + + +class CONFIGSITE(Base): + __tablename__ = 'CONFIG_SITE' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text) + PRI = Column(Text) + RSSURL = Column(Text) + SIGNURL = Column(Text) + COOKIE = Column(Text) + INCLUDE = Column(Text) + EXCLUDE = Column(Text) + SIZE = Column(Text) + NOTE = Column(Text) + + +class CONFIGSYNCPATHS(Base): + __tablename__ = 'CONFIG_SYNC_PATHS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + SOURCE = Column(Text) + DEST = Column(Text) + UNKNOWN = Column(Text) + MODE = Column(Text) + RENAME = Column(Integer) + ENABLED = Column(Integer) + NOTE = Column(Text) + + +class CONFIGUSERS(Base): + __tablename__ = 'CONFIG_USERS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text, index=True) + PASSWORD = Column(Text) + PRIS = Column(Text) + + +class CONFIGUSERRSS(Base): + __tablename__ = 'CONFIG_USER_RSS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text, index=True) + ADDRESS = Column(Text) + PARSER = Column(Text) + INTERVAL = Column(Text) + USES = Column(Text) + INCLUDE = Column(Text) + EXCLUDE = Column(Text) + FILTER = Column(Text) + UPDATE_TIME = Column(Text) + PROCESS_COUNT = Column(Text) + STATE = Column(Text) + SAVE_PATH = Column(Text) + DOWNLOAD_SETTING = Column(Integer) + RECOGNIZATION = Column(Text) + OVER_EDITION = Column(Integer) + SITES = Column(Text) + FILTER_ARGS = Column(Text) + MEDIAINFOS = Column(Text) + NOTE = Column(Text) + + +class CUSTOMWORDS(Base): + __tablename__ = 'CUSTOM_WORDS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + REPLACED = Column(Text) + REPLACE = Column(Text) + FRONT = Column(Text) + BACK = Column(Text) + OFFSET = Column(Text) + TYPE = Column(Integer) + GROUP_ID = Column(Integer) + SEASON = Column(Integer) + ENABLED = Column(Integer) + REGEX = Column(Integer) + HELP = Column(Text) + NOTE = Column(Text) + + +class CUSTOMWORDGROUPS(Base): + __tablename__ = 'CUSTOM_WORD_GROUPS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TITLE = Column(Text) + YEAR = Column(Text) + TYPE = Column(Integer) + TMDBID = Column(Integer) + SEASON_COUNT = Column(Integer) + NOTE = Column(Text) + + +class DOUBANMEDIAS(Base): + __tablename__ = 'DOUBAN_MEDIAS' + __table_args__ = ( + Index('INDX_DOUBAN_MEDIAS_NAME', 'NAME', 'YEAR'), + ) + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text) + YEAR = Column(Text) + TYPE = Column(Text) + RATING = Column(Text) + IMAGE = Column(Text) + STATE = Column(Text) + ADD_TIME = Column(Text) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class DOWNLOADHISTORY(Base): + __tablename__ = 'DOWNLOAD_HISTORY' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TITLE = Column(Text, index=True) + YEAR = Column(Text) + TYPE = Column(Text) + TMDBID = Column(Text) + VOTE = Column(Text) + POSTER = Column(Text) + OVERVIEW = Column(Text) + TORRENT = Column(Text) + ENCLOSURE = Column(Text) + SITE = Column(Text) + DESC = Column(Text) + DATE = Column(Text, index=True) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class DOWNLOADSETTING(Base): + __tablename__ = 'DOWNLOAD_SETTING' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text) + CATEGORY = Column(Text) + TAGS = Column(Text) + CONTENT_LAYOUT = Column(Integer) + IS_PAUSED = Column(Integer) + UPLOAD_LIMIT = Column(Integer) + DOWNLOAD_LIMIT = Column(Integer) + RATIO_LIMIT = Column(Integer) + SEEDING_TIME_LIMIT = Column(Integer) + DOWNLOADER = Column(Text) + NOTE = Column(Text) + + +class MESSAGECLIENT(Base): + __tablename__ = 'MESSAGE_CLIENT' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text) + TYPE = Column(Text) + CONFIG = Column(Text) + SWITCHS = Column(Text) + INTERACTIVE = Column(Integer) + ENABLED = Column(Integer) + NOTE = Column(Text) + + +class RSSHISTORY(Base): + __tablename__ = 'RSS_HISTORY' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TYPE = Column(Text) + RSSID = Column(Text, index=True) + NAME = Column(Text) + YEAR = Column(Text) + TMDBID = Column(Text) + SEASON = Column(Text) + IMAGE = Column(Text) + DESC = Column(Text) + TOTAL = Column(Integer) + START = Column(Integer) + FINISH_TIME = Column(Text) + NOTE = Column(Text) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class RSSMOVIES(Base): + __tablename__ = 'RSS_MOVIES' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text, index=True) + YEAR = Column(Text) + KEYWORD = Column(Text) + TMDBID = Column(Text) + IMAGE = Column(Text) + RSS_SITES = Column(Text) + SEARCH_SITES = Column(Text) + OVER_EDITION = Column(Integer) + FILTER_ORDER = Column(Integer) + FILTER_RESTYPE = Column(Text) + FILTER_PIX = Column(Text) + FILTER_RULE = Column(Integer) + FILTER_TEAM = Column(Text) + SAVE_PATH = Column(Text) + DOWNLOAD_SETTING = Column(Integer) + FUZZY_MATCH = Column(Integer) + STATE = Column(Text) + DESC = Column(Text) + NOTE = Column(Text) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class RSSTORRENTS(Base): + __tablename__ = 'RSS_TORRENTS' + __table_args__ = ( + Index('INDX_RSS_TORRENTS_NAME', 'TITLE', 'YEAR', 'SEASON', 'EPISODE'), + ) + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TORRENT_NAME = Column(Text) + ENCLOSURE = Column(Text, index=True) + TYPE = Column(Text) + TITLE = Column(Text) + YEAR = Column(Text) + SEASON = Column(Text) + EPISODE = Column(Text) + + +class RSSTVS(Base): + __tablename__ = 'RSS_TVS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text, index=True) + YEAR = Column(Text) + KEYWORD = Column(Text) + SEASON = Column(Text) + TMDBID = Column(Text) + IMAGE = Column(Text) + RSS_SITES = Column(Text) + SEARCH_SITES = Column(Text) + OVER_EDITION = Column(Integer) + FILTER_ORDER = Column(Integer) + FILTER_RESTYPE = Column(Text) + FILTER_PIX = Column(Text) + FILTER_RULE = Column(Integer) + FILTER_TEAM = Column(Text) + SAVE_PATH = Column(Text) + DOWNLOAD_SETTING = Column(Integer) + FUZZY_MATCH = Column(Integer) + TOTAL_EP = Column(Integer) + CURRENT_EP = Column(Integer) + TOTAL = Column(Integer) + LACK = Column(Integer) + STATE = Column(Text) + DESC = Column(Text) + NOTE = Column(Text) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class RSSTVEPISODES(Base): + __tablename__ = 'RSS_TV_EPISODES' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + RSSID = Column(Text, index=True) + EPISODES = Column(Text) + + +class TORRENTREMOVETASK(Base): + __tablename__ = 'TORRENT_REMOVE_TASK' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text) + ACTION = Column(Integer) + INTERVAL = Column(Integer) + ENABLED = Column(Integer) + SAMEDATA = Column(Integer) + ONLYNASTOOL = Column(Integer) + DOWNLOADER = Column(Text) + CONFIG = Column(Text) + NOTE = Column(Text) + + +class SEARCHRESULTINFO(Base): + __tablename__ = 'SEARCH_RESULT_INFO' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TORRENT_NAME = Column(Text) + ENCLOSURE = Column(Text) + DESCRIPTION = Column(Text) + TYPE = Column(Text) + TITLE = Column(Text) + YEAR = Column(Text) + SEASON = Column(Text) + EPISODE = Column(Text) + ES_STRING = Column(Text) + VOTE = Column(Text) + IMAGE = Column(Text) + POSTER = Column(Text) + TMDBID = Column(Text) + OVERVIEW = Column(Text) + RES_TYPE = Column(Text) + RES_ORDER = Column(Text) + SIZE = Column(Integer) + SEEDERS = Column(Integer) + PEERS = Column(Integer) + SITE = Column(Text) + SITE_ORDER = Column(Text) + PAGEURL = Column(Text) + OTHERINFO = Column(Text) + UPLOAD_VOLUME_FACTOR = Column(Float) + DOWNLOAD_VOLUME_FACTOR = Column(Float) + NOTE = Column(Text) + + +class SITEBRUSHDOWNLOADERS(Base): + __tablename__ = 'SITE_BRUSH_DOWNLOADERS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text) + TYPE = Column(Text) + HOST = Column(Text) + PORT = Column(Text) + USERNAME = Column(Text) + PASSWORD = Column(Text) + SAVE_DIR = Column(Text) + NOTE = Column(Text) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class SITEBRUSHTASK(Base): + __tablename__ = 'SITE_BRUSH_TASK' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + NAME = Column(Text, index=True) + SITE = Column(Text) + FREELEECH = Column(Text) + RSS_RULE = Column(Text) + REMOVE_RULE = Column(Text) + SEED_SIZE = Column(Text) + INTEVAL = Column(Text) + DOWNLOADER = Column(Text) + TRANSFER = Column(Text) + DOWNLOAD_COUNT = Column(Text) + REMOVE_COUNT = Column(Text) + DOWNLOAD_SIZE = Column(Text) + UPLOAD_SIZE = Column(Text) + SENDMESSAGE = Column(Text) + FORCEUPLOAD = Column(Text) + STATE = Column(Text) + LST_MOD_DATE = Column(Text) + + +class SITEBRUSHTORRENTS(Base): + __tablename__ = 'SITE_BRUSH_TORRENTS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TASK_ID = Column(Text, index=True) + TORRENT_NAME = Column(Text) + TORRENT_SIZE = Column(Text) + ENCLOSURE = Column(Text) + DOWNLOADER = Column(Text) + DOWNLOAD_ID = Column(Text) + LST_MOD_DATE = Column(Text) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class SITESTATISTICSHISTORY(Base): + __tablename__ = 'SITE_STATISTICS_HISTORY' + __table_args__ = ( + Index('INDX_SITE_STATISTICS_HISTORY_DS', 'DATE', 'URL'), + Index('UN_INDX_SITE_STATISTICS_HISTORY_DS', 'DATE', 'URL', unique=True) + ) + + ID = Column(Integer, Sequence('ID'), primary_key=True) + SITE = Column(Text) + DATE = Column(Text) + USER_LEVEL = Column(Text) + UPLOAD = Column(Text) + DOWNLOAD = Column(Text) + RATIO = Column(Text) + SEEDING = Column(Integer, server_default=text("0")) + LEECHING = Column(Integer, server_default=text("0")) + SEEDING_SIZE = Column(Integer, server_default=text("0")) + BONUS = Column(Float, server_default=text("0.0")) + URL = Column(Text) + + +class SITEUSERINFOSTATS(Base): + __tablename__ = 'SITE_USER_INFO_STATS' + __table_args__ = ( + Index('INDX_SITE_USER_INFO_STATS_URL', 'URL'), + ) + + ID = Column(Integer, Sequence('ID'), primary_key=True) + SITE = Column(Text, index=True) + USERNAME = Column(Text) + USER_LEVEL = Column(Text) + JOIN_AT = Column(Text) + UPDATE_AT = Column(Text) + UPLOAD = Column(Integer) + DOWNLOAD = Column(Integer) + RATIO = Column(Float) + SEEDING = Column(Integer) + LEECHING = Column(Integer) + SEEDING_SIZE = Column(Integer) + BONUS = Column(Float) + URL = Column(Text, unique=True) + MSG_UNREAD = Column(Integer) + EXT_INFO = Column(Text) + + +class SITEFAVICON(Base): + __tablename__ = 'SITE_FAVICON' + + SITE = Column(Text, primary_key=True) + URL = Column(Text) + FAVICON = Column(Text) + + +class SITEUSERSEEDINGINFO(Base): + __tablename__ = 'SITE_USER_SEEDING_INFO' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + SITE = Column(Text, index=True) + SEEDING_INFO = Column(Text, server_default=text("'[]'")) + UPDATE_AT = Column(Text) + URL = Column(Text, unique=True) + + +class SYNCHISTORY(Base): + __tablename__ = 'SYNC_HISTORY' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + PATH = Column(Text, index=True) + SRC = Column(Text) + DEST = Column(Text) + + +class SYSTEMDICT(Base): + __tablename__ = 'SYSTEM_DICT' + __table_args__ = ( + Index('INDX_SYSTEM_DICT', 'TYPE', 'KEY'), + ) + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TYPE = Column(Text) + KEY = Column(Text) + VALUE = Column(Text) + NOTE = Column(Text) + + +class TRANSFERBLACKLIST(Base): + __tablename__ = 'TRANSFER_BLACKLIST' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + PATH = Column(Text, index=True) + + +class TRANSFERHISTORY(Base): + __tablename__ = 'TRANSFER_HISTORY' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + MODE = Column(Text) + TYPE = Column(Text) + CATEGORY = Column(Text) + TMDBID = Column(Integer) + TITLE = Column(Text, index=True) + YEAR = Column(Text) + SEASON_EPISODE = Column(Text) + SOURCE = Column(Text) + SOURCE_PATH = Column(Text, index=True) + SOURCE_FILENAME = Column(Text, index=True) + DEST = Column(Text) + DEST_PATH = Column(Text) + DEST_FILENAME = Column(Text) + DATE = Column(Text) + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + + +class TRANSFERUNKNOWN(Base): + __tablename__ = 'TRANSFER_UNKNOWN' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + PATH = Column(Text, index=True) + DEST = Column(Text) + MODE = Column(Text) + STATE = Column(Text, index=True) + + +class USERRSSTASKHISTORY(Base): + __tablename__ = 'USERRSS_TASK_HISTORY' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + TASK_ID = Column(Text, index=True) + TITLE = Column(Text) + DOWNLOADER = Column(Text) + DATE = Column(Text) + + +class MEDIASYNCITEMS(BaseMedia): + __tablename__ = 'MEDIASYNC_ITEMS' + __table_args__ = ( + Index('INDX_MEDIASYNC_ITEMS_SL', 'SERVER', 'LIBRARY'), + ) + + ID = Column(Integer, Sequence('ID'), primary_key=True) + SERVER = Column(Text) + LIBRARY = Column(Text) + ITEM_ID = Column(Text, index=True) + ITEM_TYPE = Column(Text) + TITLE = Column(Text, index=True) + ORGIN_TITLE = Column(Text, index=True) + YEAR = Column(Text) + TMDBID = Column(Text, index=True) + IMDBID = Column(Text) + PATH = Column(Text) + NOTE = Column(Text) + JSON = Column(Text) + + +class MEDIASYNCSTATISTIC(BaseMedia): + __tablename__ = 'MEDIASYNC_STATISTICS' + + ID = Column(Integer, Sequence('ID'), primary_key=True) + SERVER = Column(Text, index=True) + TOTAL_COUNT = Column(Text) + MOVIE_COUNT = Column(Text) + TV_COUNT = Column(Text) + UPDATE_TIME = Column(Text) diff --git a/app/doubansync.py b/app/doubansync.py new file mode 100644 index 0000000..edf0857 --- /dev/null +++ b/app/doubansync.py @@ -0,0 +1,286 @@ +import datetime +import random +from threading import Lock +from time import sleep + +import log +from app.downloader import Downloader +from app.helper import DbHelper +from app.media import Media, DouBan +from app.media.meta import MetaInfo +from app.message import Message +from app.searcher import Searcher +from app.subscribe import Subscribe +from app.utils import ExceptionUtils +from app.utils.types import SearchType, MediaType +from config import Config + +lock = Lock() + + +class DoubanSync: + douban = None + searcher = None + media = None + downloader = None + dbhelper = None + subscribe = None + _interval = None + _auto_search = None + _auto_rss = None + _users = None + _days = None + _types = None + + def __init__(self): + self.douban = DouBan() + self.searcher = Searcher() + self.downloader = Downloader() + self.media = Media() + self.message = Message() + self.dbhelper = DbHelper() + self.subscribe = Subscribe() + self.init_config() + + def init_config(self): + douban = Config().get_config('douban') + if douban: + # 同步间隔 + self._interval = int(douban.get('interval')) if str(douban.get('interval')).isdigit() else None + self._auto_search = douban.get('auto_search') + self._auto_rss = douban.get('auto_rss') + # 用户列表 + users = douban.get('users') + if users: + if not isinstance(users, list): + users = [users] + self._users = users + # 时间范围 + self._days = int(douban.get('days')) if str(douban.get('days')).isdigit() else None + # 类型 + types = douban.get('types') + if types: + self._types = types.split(',') + + def sync(self): + """ + 同步豆瓣数据 + """ + if not self._interval: + log.info("【Douban】豆瓣配置:同步间隔未配置或配置不正确") + return + with lock: + log.info("【Douban】开始同步豆瓣数据...") + # 拉取豆瓣数据 + medias = self.__get_all_douban_movies() + # 开始检索 + for media in medias: + if not media or not media.get_name(): + continue + try: + # 查询数据库状态,已经加入RSS的不处理 + search_state = self.dbhelper.get_douban_search_state(media.get_name(), media.year) + if not search_state or search_state[0] == "NEW": + if self._auto_search: + # 需要检索 + if media.begin_season: + subtitle = "第%s季" % media.begin_season + else: + subtitle = None + media_info = self.media.get_media_info(title="%s %s" % (media.get_name(), media.year or ""), + subtitle=subtitle, + mtype=media.type) + # 不需要自动加订阅,则直接搜索 + if not media_info or not media_info.tmdb_info: + log.warn("【Douban】%s 未查询到媒体信息" % media.get_name()) + continue + # 检查是否存在,电视剧返回不存在的集清单 + exist_flag, no_exists, _ = self.downloader.check_exists_medias(meta_info=media_info) + # 已经存在 + if exist_flag: + # 更新为已下载状态 + log.info("【Douban】%s 已存在" % media.get_name()) + self.dbhelper.insert_douban_media_state(media, "DOWNLOADED") + continue + if not self._auto_rss: + # 合并季 + media_info.begin_season = media.begin_season + # 开始检索 + search_result, no_exists, search_count, download_count = self.searcher.search_one_media( + media_info=media_info, + in_from=SearchType.DB, + no_exists=no_exists, + user_name=media_info.user_name) + if search_result: + # 下载全了更新为已下载,没下载全的下次同步再次搜索 + self.dbhelper.insert_douban_media_state(media, "DOWNLOADED") + else: + # 需要加订阅,则由订阅去检索 + log.info( + "【Douban】%s %s 更新到%s订阅中..." % (media.get_name(), media.year, media.type.value)) + code, msg, _ = self.subscribe.add_rss_subscribe(mtype=media.type, + name=media.get_name(), + year=media.year, + season=media.begin_season, + mediaid=f"DB:{media.douban_id}") + if code != 0: + log.error("【Douban】%s 添加订阅失败:%s" % (media.get_name(), msg)) + # 订阅已存在 + if code == 9: + self.dbhelper.insert_douban_media_state(media, "RSS") + else: + # 发送订阅消息 + self.message.send_rss_success_message(in_from=SearchType.DB, + media_info=media) + # 插入为已RSS状态 + self.dbhelper.insert_douban_media_state(media, "RSS") + else: + # 不需要检索 + if self._auto_rss: + # 加入订阅,使状态为R + log.info("【Douban】%s %s 更新到%s订阅中..." % ( + media.get_name(), media.year, media.type.value)) + code, msg, _ = self.subscribe.add_rss_subscribe(mtype=media.type, + name=media.get_name(), + year=media.year, + season=media.begin_season, + mediaid=f"DB:{media.douban_id}", + state="R") + if code != 0: + log.error("【Douban】%s 添加订阅失败:%s" % (media.get_name(), msg)) + # 订阅已存在 + if code == 9: + self.dbhelper.insert_douban_media_state(media, "RSS") + else: + # 发送订阅消息 + self.message.send_rss_success_message(in_from=SearchType.DB, + media_info=media) + # 插入为已RSS状态 + self.dbhelper.insert_douban_media_state(media, "RSS") + elif not search_state: + log.info("【Douban】%s %s 更新到%s列表中..." % ( + media.get_name(), media.year, media.type.value)) + self.dbhelper.insert_douban_media_state(media, "NEW") + + else: + log.info("【Douban】%s %s 已处理过" % (media.get_name(), media.year)) + except Exception as err: + log.error("【Douban】%s %s 处理失败:%s" % (media.get_name(), media.year, str(err))) + continue + log.info("【Douban】豆瓣数据同步完成") + + def __get_all_douban_movies(self): + """ + 获取每一个用户的每一个类型的豆瓣标记 + :return: 检索到的媒体信息列表(不含TMDB信息) + """ + if not self._interval \ + or not self._days \ + or not self._users \ + or not self._types: + log.warn("【Douban】豆瓣未配置或配置不正确") + return [] + # 返回媒体列表 + media_list = [] + # 豆瓣ID列表 + douban_ids = {} + # 每页条数 + perpage_number = 15 + # 每一个用户 + for user in self._users: + if not user: + continue + # 查询用户名称 + user_name = "" + userinfo = self.douban.get_user_info(userid=user) + if userinfo: + user_name = userinfo.get("name") + # 每一个类型成功数量 + user_succnum = 0 + for mtype in self._types: + if not mtype: + continue + log.info(f"【Douban】开始获取 {user_name or user} 的 {mtype} 数据...") + # 开始序号 + start_number = 0 + # 类型成功数量 + user_type_succnum = 0 + # 每一页 + while True: + # 页数 + page_number = int(start_number / perpage_number + 1) + # 当前页成功数量 + sucess_urlnum = 0 + # 是否继续下一页 + continue_next_page = True + log.debug(f"【Douban】开始解析第 {page_number} 页数据...") + try: + items = self.douban.get_douban_wish(dtype=mtype, userid=user, start=start_number, wait=True) + if not items: + log.warn(f"【Douban】第 {page_number} 页未获取到数据") + break + # 解析豆瓣ID + for item in items: + # 时间范围 + date = item.get("date") + if not date: + continue_next_page = False + break + else: + mark_date = datetime.datetime.strptime(date, '%Y-%m-%d') + if not (datetime.datetime.now() - mark_date).days < int(self._days): + continue_next_page = False + break + doubanid = item.get("id") + if str(doubanid).isdigit(): + log.info("【Douban】解析到媒体:%s" % doubanid) + if doubanid not in douban_ids: + douban_ids[doubanid] = { + "user_name": user_name + } + sucess_urlnum += 1 + user_type_succnum += 1 + user_succnum += 1 + log.debug( + f"【Douban】{user_name or user} 第 {page_number} 页解析完成,共获取到 {sucess_urlnum} 个媒体") + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error(f"【Douban】{user_name or user} 第 {page_number} 页解析出错:%s" % str(err)) + break + # 继续下一页 + if continue_next_page: + start_number += perpage_number + else: + break + # 当前类型解析结束 + log.debug(f"【Douban】用户 {user_name or user} 的 {mtype} 解析完成,共获取到 {user_type_succnum} 个媒体") + log.info(f"【Douban】用户 {user_name or user} 解析完成,共获取到 {user_succnum} 个媒体") + log.info(f"【Douban】所有用户解析完成,共获取到 {len(douban_ids)} 个媒体") + # 查询豆瓣详情 + for doubanid, info in douban_ids.items(): + douban_info = self.douban.get_douban_detail(doubanid=doubanid, wait=True) + # 组装媒体信息 + if not douban_info: + log.warn("【Douban】%s 未正确获取豆瓣详细信息,尝试使用网页获取" % doubanid) + douban_info = self.douban.get_media_detail_from_web(doubanid) + if not douban_info: + log.warn("【Douban】%s 无权限访问,需要配置豆瓣Cookie" % doubanid) + # 随机休眠 + sleep(round(random.uniform(1, 5), 1)) + continue + media_type = MediaType.TV if douban_info.get("episodes_count") else MediaType.MOVIE + log.info("【Douban】%s:%s %s".strip() % (media_type.value, douban_info.get("title"), douban_info.get("year"))) + meta_info = MetaInfo(title="%s %s" % (douban_info.get("title"), douban_info.get("year") or "")) + meta_info.douban_id = doubanid + meta_info.type = media_type + meta_info.overview = douban_info.get("intro") + meta_info.poster_path = douban_info.get("cover_url") + rating = douban_info.get("rating", {}) or {} + meta_info.vote_average = rating.get("value") or "" + meta_info.imdb_id = douban_info.get("imdbid") + meta_info.user_name = info.get("user_name") + if meta_info not in media_list: + media_list.append(meta_info) + # 随机休眠 + sleep(round(random.uniform(1, 5), 1)) + return media_list diff --git a/app/downloader/__init__.py b/app/downloader/__init__.py new file mode 100644 index 0000000..c34c847 --- /dev/null +++ b/app/downloader/__init__.py @@ -0,0 +1 @@ +from .downloader import Downloader diff --git a/app/downloader/client/__init__.py b/app/downloader/client/__init__.py new file mode 100644 index 0000000..695d76c --- /dev/null +++ b/app/downloader/client/__init__.py @@ -0,0 +1,2 @@ +from .qbittorrent import Qbittorrent +from .transmission import Transmission diff --git a/app/downloader/client/_base.py b/app/downloader/client/_base.py new file mode 100644 index 0000000..9084f9d --- /dev/null +++ b/app/downloader/client/_base.py @@ -0,0 +1,152 @@ +import os.path +from abc import ABCMeta, abstractmethod + +from config import Config + + +class _IDownloadClient(metaclass=ABCMeta): + + @abstractmethod + def match(self, ctype): + """ + 匹配实例 + """ + pass + + @abstractmethod + def connect(self): + """ + 连接 + """ + pass + + @abstractmethod + def get_status(self): + """ + 检查连通性 + """ + pass + + @abstractmethod + def get_torrents(self, ids, status, tag): + """ + 按条件读取种子信息 + :param ids: 种子ID,单个ID或者ID列表 + :param status: 种子状态过滤 + :param tag: 种子标签过滤 + :return: 种子信息列表 + """ + pass + + @abstractmethod + def get_downloading_torrents(self, tag): + """ + 读取下载中的种子信息 + """ + pass + + @abstractmethod + def get_completed_torrents(self, tag): + """ + 读取下载完成的种子信息 + """ + pass + + @abstractmethod + def set_torrents_status(self, ids, tags=None): + """ + 迁移完成后设置种子标签为 已整理 + :param ids: 种子ID列表 + :param tags: 种子标签列表 + """ + pass + + @abstractmethod + def get_transfer_task(self, tag): + """ + 获取需要转移的种子列表 + """ + pass + + @abstractmethod + def get_remove_torrents(self, config): + """ + 获取需要清理的种子清单 + :param config: 删种策略 + :return: 种子ID列表 + """ + pass + + @abstractmethod + def add_torrent(self, **kwargs): + """ + 添加下载任务 + """ + pass + + @abstractmethod + def start_torrents(self, ids): + """ + 下载控制:开始 + """ + pass + + @abstractmethod + def stop_torrents(self, ids): + """ + 下载控制:停止 + """ + pass + + @abstractmethod + def delete_torrents(self, delete_file, ids): + """ + 删除种子 + """ + pass + + @abstractmethod + def get_download_dirs(self): + """ + 获取下载目录清单 + """ + pass + + @staticmethod + def get_replace_path(path): + """ + 对目录路径进行转换 + """ + if not path: + return "" + downloaddir = Config().get_config('downloaddir') or [] + path = os.path.normpath(path) + for attr in downloaddir: + if not attr.get("save_path") or not attr.get("container_path"): + continue + save_path = os.path.normpath(attr.get("save_path")) + container_path = os.path.normpath(attr.get("container_path")) + if path.startswith(save_path): + return path.replace(save_path, container_path) + return path + + @abstractmethod + def change_torrent(self, **kwargs): + """ + 修改种子状态 + """ + pass + + @abstractmethod + def get_downloading_progress(self): + """ + 获取下载进度 + """ + pass + + @abstractmethod + def set_speed_limit(self, **kwargs): + """ + 设置速度限制 + """ + pass diff --git a/app/downloader/client/_py115.py b/app/downloader/client/_py115.py new file mode 100644 index 0000000..f7920fc --- /dev/null +++ b/app/downloader/client/_py115.py @@ -0,0 +1,182 @@ +import re +import time +from urllib import parse + +import requests + +from app.utils import RequestUtils, ExceptionUtils + + +class Py115: + cookie = None + user_agent = None + req = None + uid = None + sign = None + err = None + + def __init__(self, cookie): + self.cookie = cookie + self.req = RequestUtils(cookies=self.cookie, session=requests.Session()) + + # 登录 + def login(self): + if not self.getuid(): + return False + if not self.getsign(): + return False + return True + + # 获取目录ID + def getdirid(self, tdir): + try: + url = "https://webapi.115.com/files/getid?path=" + parse.quote(tdir or '/') + p = self.req.get_res(url=url) + if p: + rootobject = p.json() + if not rootobject.get("state"): + self.err = "获取目录 [{}]ID 错误:{}".format(tdir, rootobject["error"]) + return False, '' + return True, rootobject.get("id") + except Exception as result: + ExceptionUtils.exception_traceback(result) + self.err = "异常错误:{}".format(result) + return False, '' + + # 获取sign + def getsign(self): + try: + self.sign = '' + url = "https://115.com/?ct=offline&ac=space&_=" + str(round(time.time() * 1000)) + p = self.req.get_res(url=url) + if p: + rootobject = p.json() + if not rootobject.get("state"): + self.err = "获取 SIGN 错误:{}".format(rootobject.get("error_msg")) + return False + self.sign = rootobject.get("sign") + return True + except Exception as result: + ExceptionUtils.exception_traceback(result) + self.err = "异常错误:{}".format(result) + return False + + # 获取UID + def getuid(self): + try: + self.uid = '' + url = "https://webapi.115.com/files?aid=1&cid=0&o=user_ptime&asc=0&offset=0&show_dir=1&limit=30&code=&scid=&snap=0&natsort=1&star=1&source=&format=json" + p = self.req.get_res(url=url) + if p: + rootobject = p.json() + if not rootobject.get("state"): + self.err = "获取 UID 错误:{}".format(rootobject.get("error_msg")) + return False + self.uid = rootobject.get("uid") + return True + except Exception as result: + ExceptionUtils.exception_traceback(result) + self.err = "异常错误:{}".format(result) + return False + + # 获取任务列表 + def gettasklist(self, page=1): + try: + tasks = [] + url = "https://115.com/web/lixian/?ct=lixian&ac=task_lists" + while True: + postdata = "page={}&uid={}&sign={}&time={}".format(page, self.uid, self.sign, + str(round(time.time() * 1000))) + p = self.req.post_res(url=url, params=postdata.encode('utf-8')) + if p: + rootobject = p.json() + if not rootobject.get("state"): + self.err = "获取任务列表错误:{}".format(rootobject["error"]) + return False, tasks + if rootobject.get("count") == 0: + break + tasks += rootobject.get("tasks") or [] + if page >= rootobject.get("page_count"): + break + return True, tasks + except Exception as result: + ExceptionUtils.exception_traceback(result) + self.err = "异常错误:{}".format(result) + return False, [] + + # 添加任务 + def addtask(self, tdir, content): + try: + ret, dirid = self.getdirid(tdir) + if not ret: + return False, '' + + # 转换为磁力 + if re.match("^https*://", content): + try: + p = self.req.get_res(url=content) + if p and p.headers.get("Location"): + content = p.headers.get("Location") + except Exception as result: + ExceptionUtils.exception_traceback(result) + content = str(result).replace("No connection adapters were found for '", "").replace("'", "") + + url = "https://115.com/web/lixian/?ct=lixian&ac=add_task_url" + postdata = "url={}&savepath=&wp_path_id={}&uid={}&sign={}&time={}".format(parse.quote(content), dirid, + self.uid, self.sign, + str(round(time.time() * 1000))) + p = self.req.post_res(url=url, params=postdata.encode('utf-8')) + if p: + rootobject = p.json() + if not rootobject.get("state"): + self.err = rootobject.get("error_msg") + return False, '' + return True, rootobject.get("info_hash") + except Exception as result: + ExceptionUtils.exception_traceback(result) + self.err = "异常错误:{}".format(result) + return False, '' + + # 删除任务 + def deltask(self, thash): + try: + url = "https://115.com/web/lixian/?ct=lixian&ac=task_del" + postdata = "hash[0]={}&uid={}&sign={}&time={}".format(thash, self.uid, self.sign, + str(round(time.time() * 1000))) + p = self.req.post_res(url=url, params=postdata.encode('utf-8')) + if p: + rootobject = p.json() + if not rootobject.get("state"): + self.err = rootobject.get("error_msg") + return False + return True + except Exception as result: + ExceptionUtils.exception_traceback(result) + self.err = "异常错误:{}".format(result) + return False + + # 根据ID获取文件夹路径 + def getiddir(self, tid): + try: + path = '/' + url = "https://aps.115.com/natsort/files.php?aid=1&cid={}&o=file_name&asc=1&offset=0&show_dir=1&limit=40&code=&scid=&snap=0&natsort=1&record_open_time=1&source=&format=json&fc_mix=0&type=&star=&is_share=&suffix=&custom_order=0".format( + tid) + p = self.req.get_res(url=url) + if p: + rootobject = p.json() + if not rootobject.get("state"): + self.err = "获取 ID[{}]路径 错误:{}".format(id, rootobject["error"]) + return False, path + patharray = rootobject["path"] + for pathobject in patharray: + if pathobject.get("cid") == 0: + continue + path += pathobject.get("name") + '/' + if path == "/": + self.err = "文件路径不存在" + return False, path + return True, path + except Exception as result: + ExceptionUtils.exception_traceback(result) + self.err = "异常错误:{}".format(result) + return False, '/' diff --git a/app/downloader/client/client115.py b/app/downloader/client/client115.py new file mode 100644 index 0000000..8e7d625 --- /dev/null +++ b/app/downloader/client/client115.py @@ -0,0 +1,141 @@ +import log +from app.utils import StringUtils +from app.utils.types import DownloaderType +from config import Config +from app.downloader.client._base import _IDownloadClient +from app.downloader.client._py115 import Py115 + + +class Client115(_IDownloadClient): + schema = "client115" + client_type = DownloaderType.Client115.value + _client_config = {} + + downclient = None + lasthash = None + + def __init__(self, config=None): + if config: + self._client_config = config + else: + self._client_config = Config().get_config('client115') + self.init_config() + self.connect() + + def init_config(self): + if self._client_config: + self.downclient = Py115(self._client_config.get("cookie")) + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.client_type] else False + + def connect(self): + self.downclient.login() + + def get_status(self): + if not self.downclient: + return False + ret = self.downclient.login() + if not ret: + log.info(self.downclient.err) + return False + return True + + def get_torrents(self, ids=None, status=None, **kwargs): + tlist = [] + if not self.downclient: + return tlist + ret, tasks = self.downclient.gettasklist(page=1) + if not ret: + log.info(f"【{self.client_type}】获取任务列表错误:{self.downclient.err}") + return tlist + if tasks: + for task in tasks: + if ids: + if task.get("info_hash") not in ids: + continue + if status: + if task.get("status") not in status: + continue + ret, tdir = self.downclient.getiddir(task.get("file_id")) + task["path"] = tdir + tlist.append(task) + + return tlist or [] + + def get_completed_torrents(self, **kwargs): + return self.get_torrents(status=[2]) + + def get_downloading_torrents(self, **kwargs): + return self.get_torrents(status=[0, 1]) + + def remove_torrents_tag(self, **kwargs): + pass + + def get_transfer_task(self, **kwargs): + pass + + def get_remove_torrents(self, **kwargs): + return [] + + def add_torrent(self, content, download_dir=None, **kwargs): + if not self.downclient: + return False + if isinstance(content, str): + ret, self.lasthash = self.downclient.addtask(tdir=download_dir, content=content) + if not ret: + log.error(f"【{self.client_type}】添加下载任务失败:{self.downclient.err}") + return None + return self.lasthash + else: + log.info(f"【{self.client_type}】暂时不支持非链接下载") + return None + + def delete_torrents(self, delete_file, ids): + if not self.downclient: + return False + return self.downclient.deltask(thash=ids) + + def start_torrents(self, ids): + pass + + def stop_torrents(self, ids): + pass + + def set_torrents_status(self, ids, **kwargs): + return self.delete_torrents(ids=ids, delete_file=False) + + def get_download_dirs(self): + return [] + + def change_torrent(self, **kwargs): + pass + + def get_downloading_progress(self, **kwargs): + """ + 获取正在下载的种子进度 + """ + Torrents = self.get_downloading_torrents() + DispTorrents = [] + for torrent in Torrents: + # 进度 + progress = round(torrent.get('percentDone'), 1) + state = "Downloading" + _dlspeed = StringUtils.str_filesize(torrent.get('peers')) + _upspeed = StringUtils.str_filesize(torrent.get('rateDownload')) + speed = "%s%sB/s %s%sB/s" % (chr(8595), _dlspeed, chr(8593), _upspeed) + DispTorrents.append({ + 'id': torrent.get('info_hash'), + 'name': torrent.get('name'), + 'speed': speed, + 'state': state, + 'progress': progress + }) + return DispTorrents + + def set_speed_limit(self, **kwargs): + """ + 设置速度限制 + """ + pass diff --git a/app/downloader/client/pikpak.py b/app/downloader/client/pikpak.py new file mode 100644 index 0000000..501fe31 --- /dev/null +++ b/app/downloader/client/pikpak.py @@ -0,0 +1,153 @@ +import asyncio + +from pikpakapi import PikPakApi, DownloadStatus + +import log +from app.downloader.client._base import _IDownloadClient +from app.utils.types import DownloaderType +from config import Config + + +class PikPak(_IDownloadClient): + schema = "pikpak" + client_type = DownloaderType.PikPak.value + _client_config = {} + + downclient = None + lasthash = None + + def __init__(self, config=None): + if config: + self._client_config = config + else: + self._client_config = Config().get_config('pikpak') + self.init_config() + self.connect() + + def init_config(self): + if self._client_config: + self.downclient = PikPakApi( + username=self._client_config.get("username"), + password=self._client_config.get("password"), + proxy=self._client_config.get("proxy"), + ) + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.client_type] else False + + def connect(self): + try: + asyncio.run(self.downclient.login()) + except Exception as err: + print(str(err)) + return + + def get_status(self): + if not self.downclient: + return False + try: + asyncio.run(self.downclient.login()) + if self.downclient.user_id is None: + log.info("PikPak 登录失败") + return False + except Exception as err: + log.error("PikPak 登录出错:%s" % str(err)) + return False + + return True + + def get_torrents(self, ids=None, status=None, **kwargs): + rv = [] + if self.downclient.user_id is None: + if self.get_status(): + return [], False + + if ids is not None: + for id in ids: + status = asyncio.run(self.downclient.get_task_status(id, '')) + if status == DownloadStatus.downloading: + rv.append({"id": id, "finish": False}) + if status == DownloadStatus.done: + rv.append({"id": id, "finish": True}) + return rv, True + + def get_completed_torrents(self, **kwargs): + return [] + + def get_downloading_torrents(self, **kwargs): + if self.downclient.user_id is None: + if self.get_status(): + return [] + try: + offline_list = asyncio.run(self.downclient.offline_list()) + return offline_list['tasks'] + except Exception as err: + print(str(err)) + return [] + + def get_transfer_task(self, **kwargs): + pass + + def get_remove_torrents(self, **kwargs): + return [] + + def add_torrent(self, content, download_dir=None, **kwargs): + try: + folder = asyncio.run( + self.downclient.path_to_id(download_dir, True)) + count = len(folder) + if count == 0: + print("create parent folder failed") + return None + else: + task = asyncio.run(self.downclient.offline_download( + content, folder[count - 1]["id"] + )) + return task["task"]["id"] + except Exception as e: + log.error("PikPak 添加离线下载任务失败: %s" % str(e)) + return None + + # 需要完成 + def delete_torrents(self, delete_file, ids): + pass + + def start_torrents(self, ids): + pass + + def stop_torrents(self, ids): + pass + + # 需要完成 + def set_torrents_status(self, ids, **kwargs): + pass + + def get_download_dirs(self): + return [] + + def change_torrent(self, **kwargs): + pass + + # 需要完成 + def get_downloading_progress(self, **kwargs): + """ + 获取正在下载的种子进度 + """ + Torrents = self.get_downloading_torrents() + DispTorrents = [] + for torrent in Torrents: + DispTorrents.append({ + 'id': torrent.get('id'), + 'file_id': torrent.get('file_id'), + 'name': torrent.get('file_name'), + 'nomenu': True, + 'noprogress': True + }) + return DispTorrents + + def set_speed_limit(self, **kwargs): + """ + 设置速度限制 + """ + pass diff --git a/app/downloader/client/qbittorrent.py b/app/downloader/client/qbittorrent.py new file mode 100644 index 0000000..da9adc0 --- /dev/null +++ b/app/downloader/client/qbittorrent.py @@ -0,0 +1,530 @@ +import os +import re +import time +from datetime import datetime +from urllib import parse + +from pkg_resources import parse_version as v + +import log +import qbittorrentapi +from app.downloader.client._base import _IDownloadClient +from app.utils import ExceptionUtils, StringUtils +from app.utils.types import DownloaderType +from config import Config + + +class Qbittorrent(_IDownloadClient): + schema = "qbittorrent" + client_type = DownloaderType.QB.value + _client_config = {} + + _force_upload = False + _auto_management = False + qbc = None + ver = None + host = None + port = None + username = None + password = None + + def __init__(self, config=None): + if config: + self._client_config = config + else: + self._client_config = Config().get_config('qbittorrent') + self.init_config() + self.connect() + + def init_config(self): + if self._client_config: + self.host = self._client_config.get('qbhost') + self.port = int(self._client_config.get('qbport')) if str(self._client_config.get('qbport')).isdigit() else 0 + self.username = self._client_config.get('qbusername') + self.password = self._client_config.get('qbpassword') + # 强制做种开关 + self._force_upload = self._client_config.get('force_upload') + # 自动管理模式开关 + self._auto_management = self._client_config.get('auto_management') + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.client_type] else False + + def connect(self): + if self.host and self.port: + self.qbc = self.__login_qbittorrent() + + def __login_qbittorrent(self): + """ + 连接qbittorrent + :return: qbittorrent对象 + """ + try: + # 登录 + qbt = qbittorrentapi.Client(host=self.host, + port=self.port, + username=self.username, + password=self.password, + VERIFY_WEBUI_CERTIFICATE=False, + REQUESTS_ARGS={'timeout': (10, 30)}) + try: + qbt.auth_log_in() + self.ver = qbt.app_version() + except qbittorrentapi.LoginFailed as e: + print(str(e)) + return qbt + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error(f"【{self.client_type}】qBittorrent连接出错:{str(err)}") + return None + + def get_status(self): + if not self.qbc: + return False + try: + return True if self.qbc.transfer_info() else False + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def get_torrents(self, ids=None, status=None, tag=None): + """ + 获取种子列表 + return: 种子列表, 是否发生异常 + """ + if not self.qbc: + return [], True + try: + torrents = self.qbc.torrents_info(torrent_hashes=ids, status_filter=status, tag=tag) + if self.is_ver_less_4_4(): + torrents = self.filter_torrent_by_tag(torrents, tag=tag) + return torrents or [], False + except Exception as err: + ExceptionUtils.exception_traceback(err) + return [], True + + def get_completed_torrents(self, tag=None): + """ + 获取已完成的种子 + return: 种子列表, 是否发生异常 + """ + if not self.qbc: + return [] + torrents, _ = self.get_torrents(status=["completed"], tag=tag) + return torrents + + def get_downloading_torrents(self, tag=None): + """ + 获取正在下载的种子 + return: 种子列表, 是否发生异常 + """ + if not self.qbc: + return [] + torrents, _ = self.get_torrents(status=["downloading"], tag=tag) + return torrents + + def remove_torrents_tag(self, ids, tag): + """ + 移除种子Tag + :param ids: 种子Hash列表 + :param tag: 标签内容 + """ + try: + return self.qbc.torrents_delete_tags(torrent_hashes=ids, tags=tag) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def set_torrents_status(self, ids, tags=None): + if not self.qbc: + return + try: + # 打标签 + self.qbc.torrents_add_tags(tags="已整理", torrent_hashes=ids) + # 超级做种 + if self._force_upload: + self.qbc.torrents_set_force_start(enable=True, torrent_hashes=ids) + log.info(f"【{self.client_type}】设置qBittorrent种子状态成功") + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def torrents_set_force_start(self, ids): + """ + 设置强制作种 + """ + try: + self.qbc.torrents_set_force_start(enable=True, torrent_hashes=ids) + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def get_transfer_task(self, tag): + # 处理下载完成的任务 + torrents = self.get_completed_torrents(tag=tag) + trans_tasks = [] + for torrent in torrents: + # 判断标签是否包含"已整理" + if torrent.get("tags") and "已整理" in torrent.get("tags"): + continue + path = torrent.get("save_path") + if not path: + continue + content_path = torrent.get("content_path") + if content_path: + trans_name = content_path.replace(path, "") + if trans_name.startswith('/') or trans_name.startswith('\\'): + trans_name = trans_name[1:] + else: + trans_name = torrent.get('name') + true_path = self.get_replace_path(path) + trans_tasks.append( + {'path': os.path.join(true_path, trans_name).replace("\\", "/"), 'id': torrent.get('hash')}) + return trans_tasks + + def get_remove_torrents(self, config=None): + if not config: + return [] + remove_torrents = [] + remove_torrents_ids = [] + torrents, error_flag = self.get_torrents(tag=config.get("filter_tags")) + if error_flag: + return [] + ratio = config.get("ratio") + # 做种时间 单位:小时 + seeding_time = config.get("seeding_time") + # 大小 单位:GB + size = config.get("size") + minsize = size[0] * 1024 * 1024 * 1024 if size else 0 + maxsize = size[-1] * 1024 * 1024 * 1024 if size else 0 + # 平均上传速度 单位 KB/s + upload_avs = config.get("upload_avs") + savepath_key = config.get("savepath_key") + tracker_key = config.get("tracker_key") + qb_state = config.get("qb_state") + qb_category = config.get("qb_category") + for torrent in torrents: + date_done = torrent.completion_on if torrent.completion_on > 0 else torrent.added_on + date_now = int(time.mktime(datetime.now().timetuple())) + torrent_seeding_time = date_now - date_done if date_done else 0 + torrent_upload_avs = torrent.uploaded / torrent_seeding_time if torrent_seeding_time else 0 + if ratio and torrent.ratio <= ratio: + continue + if seeding_time and torrent_seeding_time <= seeding_time * 3600: + continue + if size and (torrent.size >= maxsize or torrent.size <= minsize): + continue + if upload_avs and torrent_upload_avs >= upload_avs * 1024: + continue + if savepath_key and not re.findall(savepath_key, torrent.save_path, re.I): + continue + if tracker_key and not re.findall(tracker_key, torrent.tracker, re.I): + continue + if qb_state and torrent.state not in qb_state: + continue + if qb_category and torrent.category not in qb_category: + continue + remove_torrents.append({ + "id": torrent.hash, + "name": torrent.name, + "site": parse.urlparse(torrent.tracker).netloc.split(".")[-2] if torrent.tracker else "", + "size": torrent.size + }) + remove_torrents_ids.append(torrent.hash) + if config.get("samedata") and remove_torrents: + remove_torrents_plus = [] + for remove_torrent in remove_torrents: + name = remove_torrent.get("name") + size = remove_torrent.get("size") + for torrent in torrents: + if torrent.name == name and torrent.size == size and torrent.hash not in remove_torrents_ids: + remove_torrents_plus.append({ + "id": torrent.hash, + "name": torrent.name, + "site": parse.urlparse(torrent.tracker).netloc.split(".")[-2], + "size": torrent.size + }) + remove_torrents_plus += remove_torrents + return remove_torrents_plus + return remove_torrents + + def __get_last_add_torrentid_by_tag(self, tag, status=None): + """ + 根据种子的下载链接获取下载中或暂停的钟子的ID + :return: 种子ID + """ + try: + torrents, _ = self.get_torrents(status=status, tag=tag) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return None + if torrents: + return torrents[0].get("hash") + else: + return None + + def get_torrent_id_by_tag(self, tag, status=None): + """ + 通过标签多次尝试获取刚添加的种子ID,并移除标签 + """ + torrent_id = None + # QB添加下载后需要时间,重试5次每次等待5秒 + for i in range(1, 6): + time.sleep(5) + torrent_id = self.__get_last_add_torrentid_by_tag(tag=tag, + status=status) + if torrent_id is None: + continue + else: + self.remove_torrents_tag(torrent_id, tag) + break + return torrent_id + + def add_torrent(self, + content, + is_paused=False, + download_dir=None, + tag=None, + category=None, + content_layout=None, + upload_limit=None, + download_limit=None, + ratio_limit=None, + seeding_time_limit=None, + cookie=None + ): + """ + 添加种子 + :param content: 种子urls或文件 + :param is_paused: 添加后暂停 + :param tag: 标签 + :param download_dir: 下载路径 + :param category: 分类 + :param content_layout: 布局 + :param upload_limit: 上传限速 Kb/s + :param download_limit: 下载限速 Kb/s + :param ratio_limit: 分享率限制 + :param seeding_time_limit: 做种时间限制 + :param cookie: 站点Cookie用于辅助下载种子 + :return: bool + """ + if not self.qbc or not content: + return False + if isinstance(content, str): + urls = content + torrent_files = None + else: + urls = None + torrent_files = content + if download_dir: + save_path = download_dir + else: + save_path = None + if not category: + category = None + if tag: + tags = tag + else: + tags = None + if not content_layout: + content_layout = None + if upload_limit: + upload_limit = int(upload_limit) * 1024 + else: + upload_limit = None + if download_limit: + download_limit = int(download_limit) * 1024 + else: + download_limit = None + if ratio_limit: + ratio_limit = round(float(ratio_limit), 2) + else: + ratio_limit = None + if seeding_time_limit: + seeding_time_limit = int(seeding_time_limit) + else: + seeding_time_limit = None + try: + if self._auto_management: + use_auto_torrent_management = True + else: + use_auto_torrent_management = False + qbc_ret = self.qbc.torrents_add(urls=urls, + torrent_files=torrent_files, + save_path=save_path, + category=category, + is_paused=is_paused, + tags=tags, + content_layout=content_layout, + upload_limit=upload_limit, + download_limit=download_limit, + ratio_limit=ratio_limit, + seeding_time_limit=seeding_time_limit, + use_auto_torrent_management=use_auto_torrent_management, + cookie=cookie) + return True if qbc_ret and str(qbc_ret).find("Ok") != -1 else False + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def start_torrents(self, ids): + if not self.qbc: + return False + try: + return self.qbc.torrents_resume(torrent_hashes=ids) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def stop_torrents(self, ids): + if not self.qbc: + return False + try: + return self.qbc.torrents_pause(torrent_hashes=ids) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def delete_torrents(self, delete_file, ids): + if not self.qbc: + return False + if not ids: + return False + try: + ret = self.qbc.torrents_delete(delete_files=delete_file, torrent_hashes=ids) + return ret + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def get_files(self, tid): + try: + return self.qbc.torrents_files(torrent_hash=tid) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return None + + def set_files(self, **kwargs): + """ + 设置下载文件的状态,priority为0为不下载,priority为1为下载 + """ + if not kwargs.get("torrent_hash") or not kwargs.get("file_ids"): + return False + try: + self.qbc.torrents_file_priority(torrent_hash=kwargs.get("torrent_hash"), + file_ids=kwargs.get("file_ids"), + priority=kwargs.get("priority")) + return True + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def set_torrent_tag(self, **kwargs): + pass + + def get_download_dirs(self): + if not self.qbc: + return [] + ret_dirs = [] + try: + categories = self.qbc.torrents_categories(requests_args={'timeout': (5, 10)}) or {} + except Exception as err: + ExceptionUtils.exception_traceback(err) + return [] + for category in categories.values(): + if category and category.get("savePath") and category.get("savePath") not in ret_dirs: + ret_dirs.append(category.get("savePath")) + return ret_dirs + + def set_uploadspeed_limit(self, ids, limit): + """ + 设置上传限速,单位bytes/sec + """ + if not self.qbc: + return + if not ids or not limit: + return + self.qbc.torrents_set_upload_limit(limit=int(limit), + torrent_hashes=ids) + + def set_downloadspeed_limit(self, ids, limit): + """ + 设置下载限速,单位bytes/sec + """ + if not self.qbc: + return + if not ids or not limit: + return + self.qbc.torrents_set_download_limit(limit=int(limit), + torrent_hashes=ids) + + def is_ver_less_4_4(self): + return v(self.ver) < v("v4.4.0") + + @staticmethod + def filter_torrent_by_tag(torrents, tag): + if not tag: + return torrents + if not isinstance(tag, list): + tag = [tag] + results = [] + for torrent in torrents: + include_flag = True + for t in tag: + if t and t not in torrent.get("tags"): + include_flag = False + break + if include_flag: + results.append(torrent) + return results + + def change_torrent(self, **kwargs): + """ + 修改种子状态 + """ + pass + + def get_downloading_progress(self, tag=None): + """ + 获取正在下载的种子进度 + """ + Torrents = self.get_downloading_torrents(tag=tag) + DispTorrents = [] + for torrent in Torrents: + # 进度 + progress = round(torrent.get('progress') * 100, 1) + if torrent.get('state') in ['pausedDL']: + state = "Stoped" + speed = "已暂停" + else: + state = "Downloading" + _dlspeed = StringUtils.str_filesize(torrent.get('dlspeed')) + _upspeed = StringUtils.str_filesize(torrent.get('upspeed')) + if progress >= 100: + speed = "%s%sB/s %s%sB/s" % (chr(8595), _dlspeed, chr(8593), _upspeed) + else: + eta = StringUtils.str_timelong(torrent.get('eta')) + speed = "%s%sB/s %s%sB/s %s" % (chr(8595), _dlspeed, chr(8593), _upspeed, eta) + # 主键 + DispTorrents.append({ + 'id': torrent.get('hash'), + 'name': torrent.get('name'), + 'speed': speed, + 'state': state, + 'progress': progress + }) + return DispTorrents + + def set_speed_limit(self, download_limit=None, upload_limit=None): + """ + 设置速度限制 + """ + if not self.qbc: + return + try: + if self.qbc.transfer.upload_limit != upload_limit: + self.qbc.transfer.upload_limit = upload_limit + if self.qbc.transfer.download_limit != download_limit: + self.qbc.transfer.download_limit = download_limit + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False diff --git a/app/downloader/client/transmission.py b/app/downloader/client/transmission.py new file mode 100644 index 0000000..d705047 --- /dev/null +++ b/app/downloader/client/transmission.py @@ -0,0 +1,526 @@ +import os.path +import re +import time +from datetime import datetime + +import transmission_rpc + +import log +from app.utils import ExceptionUtils, StringUtils +from app.utils.types import DownloaderType +from config import Config +from app.downloader.client._base import _IDownloadClient + + +class Transmission(_IDownloadClient): + schema = "transmission" + client_type = DownloaderType.TR.value + _client_config = {} + + # 参考transmission web,仅查询需要的参数,加速种子检索 + _trarg = ["id", "name", "status", "labels", "hashString", "totalSize", "percentDone", "addedDate", "trackerStats", + "leftUntilDone", "rateDownload", "rateUpload", "recheckProgress", "rateDownload", "rateUpload", + "peersGettingFromUs", "peersSendingToUs", "uploadRatio", "uploadedEver", "downloadedEver", "downloadDir", + "error", "errorString", "doneDate", "queuePosition", "activityDate", "trackers"] + trc = None + host = None + port = None + username = None + password = None + + def __init__(self, config=None): + if config: + self._client_config = config + else: + self._client_config = Config().get_config('transmission') + self.init_config() + self.connect() + + def init_config(self): + if self._client_config: + self.host = self._client_config.get('trhost') + self.port = int(self._client_config.get('trport')) if str(self._client_config.get('trport')).isdigit() else 0 + self.username = self._client_config.get('trusername') + self.password = self._client_config.get('trpassword') + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.client_type] else False + + def connect(self): + if self.host and self.port: + self.trc = self.__login_transmission() + + def __login_transmission(self): + """ + 连接transmission + :return: transmission对象 + """ + try: + # 登录 + trt = transmission_rpc.Client(host=self.host, + port=self.port, + username=self.username, + password=self.password, + timeout=30) + return trt + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error(f"【{self.client_type}】transmission连接出错:{str(err)}") + return None + + def get_status(self): + return True if self.trc else False + + def get_torrents(self, ids=None, status=None, tag=None): + """ + 获取种子列表 + 返回结果 种子列表, 是否有错误 + """ + if not self.trc: + return [], True + if isinstance(ids, list): + ids = [int(x) for x in ids if str(x).isdigit()] + elif str(ids).isdigit(): + ids = int(ids) + try: + torrents = self.trc.get_torrents(ids=ids, arguments=self._trarg) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return [], True + if status and not isinstance(status, list): + status = [status] + if tag and not isinstance(tag, list): + tag = [tag] + ret_torrents = [] + for torrent in torrents: + if status and torrent.status not in status: + continue + labels = torrent.labels if hasattr(torrent, "labels") else [] + include_flag = True + if tag: + for t in tag: + if t and t not in labels: + include_flag = False + break + if include_flag: + ret_torrents.append(torrent) + return ret_torrents, False + + def get_completed_torrents(self, tag=None): + """ + 获取已完成的种子列表 + return 种子列表, 是否有错误 + """ + if not self.trc: + return [] + try: + torrents, _ = self.get_torrents(status=["seeding", "seed_pending"], tag=tag) + return torrents + except Exception as err: + ExceptionUtils.exception_traceback(err) + return [] + + def get_downloading_torrents(self, tag=None): + """ + 获取正在下载的种子列表 + return 种子列表, 是否有错误 + """ + if not self.trc: + return [] + try: + torrents, _ = self.get_torrents(status=["downloading", "download_pending"], tag=tag) + return torrents + except Exception as err: + ExceptionUtils.exception_traceback(err) + return [] + + def set_torrents_status(self, ids, tags=None): + if not self.trc: + return + if isinstance(ids, list): + ids = [int(x) for x in ids if str(x).isdigit()] + elif str(ids).isdigit(): + ids = int(ids) + # 合成标签 + if tags: + if not isinstance(tags, list): + tags = [tags, "已整理"] + else: + tags.append("已整理") + else: + tags = ["已整理"] + # 打标签 + try: + self.trc.change_torrent(labels=tags, ids=ids) + log.info(f"【{self.client_type}】设置transmission种子标签成功") + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def set_torrent_tag(self, tid, tag): + if not tid or not tag: + return + try: + self.trc.change_torrent(labels=tag, ids=int(tid)) + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def change_torrent(self, + tid, + tag=None, + upload_limit=None, + download_limit=None, + ratio_limit=None, + seeding_time_limit=None): + """ + 设置种子 + :param tid: ID + :param tag: 标签 + :param upload_limit: 上传限速 Kb/s + :param download_limit: 下载限速 Kb/s + :param ratio_limit: 分享率限制 + :param seeding_time_limit: 做种时间限制 + :return: bool + """ + if not tid: + return + else: + ids = int(tid) + if tag: + if isinstance(tag, list): + labels = tag + else: + labels = [tag] + else: + labels = [] + if upload_limit: + uploadLimited = True + uploadLimit = int(upload_limit) + else: + uploadLimited = False + uploadLimit = 0 + if download_limit: + downloadLimited = True + downloadLimit = int(download_limit) + else: + downloadLimited = False + downloadLimit = 0 + if ratio_limit: + seedRatioMode = 1 + seedRatioLimit = round(float(ratio_limit), 2) + else: + seedRatioMode = 2 + seedRatioLimit = 0 + if seeding_time_limit: + seedIdleMode = 1 + seedIdleLimit = int(seeding_time_limit) + else: + seedIdleMode = 2 + seedIdleLimit = 0 + try: + self.trc.change_torrent(ids=ids, + labels=labels, + uploadLimited=uploadLimited, + uploadLimit=uploadLimit, + downloadLimited=downloadLimited, + downloadLimit=downloadLimit, + seedRatioMode=seedRatioMode, + seedRatioLimit=seedRatioLimit, + seedIdleMode=seedIdleMode, + seedIdleLimit=seedIdleLimit) + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def get_transfer_task(self, tag): + # 处理所有任务 + torrents = self.get_completed_torrents(tag=tag) + trans_tasks = [] + for torrent in torrents: + # 3.0版本以下的Transmission没有labels + if not hasattr(torrent, "labels"): + log.error(f"【{self.client_type}】当前transmission版本可能过低,无labels属性,请安装3.0以上版本!") + break + if torrent.labels and "已整理" in torrent.labels: + continue + path = torrent.download_dir + if not path: + continue + true_path = self.get_replace_path(path) + trans_tasks.append({ + 'path': os.path.join(true_path, torrent.name).replace("\\", "/"), + 'id': torrent.id, + 'tags': torrent.labels + }) + return trans_tasks + + def get_remove_torrents(self, config=None): + if not config: + return [] + remove_torrents = [] + remove_torrents_ids = [] + torrents, error_flag = self.get_torrents() + if error_flag: + return [] + tags = config.get("filter_tags") + ratio = config.get("ratio") + # 做种时间 单位:小时 + seeding_time = config.get("seeding_time") + # 大小 单位:GB + size = config.get("size") + minsize = size[0]*1024*1024*1024 if size else 0 + maxsize = size[-1]*1024*1024*1024 if size else 0 + # 平均上传速度 单位 KB/s + upload_avs = config.get("upload_avs") + savepath_key = config.get("savepath_key") + tracker_key = config.get("tracker_key") + tr_state = config.get("tr_state") + tr_error_key = config.get("tr_error_key") + for torrent in torrents: + date_done = torrent.date_done or torrent.date_added + date_now = int(time.mktime(datetime.now().timetuple())) + torrent_seeding_time = date_now - int(time.mktime(date_done.timetuple())) if date_done else 0 + torrent_uploaded = torrent.ratio * torrent.total_size + torrent_upload_avs = torrent_uploaded / torrent_seeding_time if torrent_seeding_time else 0 + if ratio and torrent.ratio <= ratio: + continue + if seeding_time and torrent_seeding_time <= seeding_time*3600: + continue + if size and (torrent.total_size >= maxsize or torrent.total_size <= minsize): + continue + if upload_avs and torrent_upload_avs >= upload_avs*1024: + continue + if savepath_key and not re.findall(savepath_key, torrent.download_dir, re.I): + continue + if tracker_key: + if not torrent.trackers: + continue + else: + tacker_key_flag = False + for tracker in torrent.trackers: + if re.findall(tracker_key, tracker.get("announce", ""), re.I): + tacker_key_flag = True + break + if not tacker_key_flag: + continue + if tr_state and torrent.status not in tr_state: + continue + if tr_error_key and not re.findall(tr_error_key, torrent.error_string, re.I): + continue + labels = set(torrent.labels) + if tags and (not labels or not set(tags).issubset(labels)): + continue + remove_torrents.append({ + "id": torrent.id, + "name": torrent.name, + "site": torrent.trackers[0].get("sitename"), + "size": torrent.total_size + }) + remove_torrents_ids.append(torrent.id) + if config.get("samedata") and remove_torrents: + remove_torrents_plus = [] + for remove_torrent in remove_torrents: + name = remove_torrent.get("name") + size = remove_torrent.get("size") + for torrent in torrents: + if torrent.name == name and torrent.total_size == size and torrent.id not in remove_torrents_ids: + remove_torrents_plus.append({ + "id": torrent.id, + "name": torrent.name, + "site": torrent.trackers[0].get("sitename") if torrent.trackers else "", + "size": torrent.total_size + }) + remove_torrents_plus += remove_torrents + return remove_torrents_plus + return remove_torrents + + def add_torrent(self, content, + is_paused=False, + download_dir=None, + upload_limit=None, + download_limit=None, + cookie=None, + **kwargs): + try: + ret = self.trc.add_torrent(torrent=content, + download_dir=download_dir, + paused=is_paused, + cookies=cookie) + if ret and ret.id: + if upload_limit: + self.set_uploadspeed_limit(ret.id, int(upload_limit)) + if download_limit: + self.set_downloadspeed_limit(ret.id, int(download_limit)) + return ret + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def start_torrents(self, ids): + if not self.trc: + return False + if isinstance(ids, list): + ids = [int(x) for x in ids if str(x).isdigit()] + elif str(ids).isdigit(): + ids = int(ids) + try: + return self.trc.start_torrent(ids=ids) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def stop_torrents(self, ids): + if not self.trc: + return False + if isinstance(ids, list): + ids = [int(x) for x in ids if str(x).isdigit()] + elif str(ids).isdigit(): + ids = int(ids) + try: + return self.trc.stop_torrent(ids=ids) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def delete_torrents(self, delete_file, ids): + if not self.trc: + return False + if not ids: + return False + if isinstance(ids, list): + ids = [int(x) for x in ids if str(x).isdigit()] + elif str(ids).isdigit(): + ids = int(ids) + try: + return self.trc.remove_torrent(delete_data=delete_file, ids=ids) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def get_files(self, tid): + """ + 获取种子文件列表 + """ + if not tid: + return None + try: + torrent = self.trc.get_torrent(tid) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return None + if torrent: + return torrent.files() + else: + return None + + def set_files(self, **kwargs): + """ + 设置下载文件的状态 + { + : { + : { + 'priority': , + 'selected': + }, + ... + }, + ... + } + """ + if not kwargs.get("file_info"): + return False + try: + self.trc.set_files(kwargs.get("file_info")) + return True + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False + + def get_download_dirs(self): + if not self.trc: + return [] + try: + return [self.trc.get_session(timeout=10).download_dir] + except Exception as err: + ExceptionUtils.exception_traceback(err) + return [] + + def set_uploadspeed_limit(self, ids, limit): + """ + 设置上传限速,单位 KB/sec + """ + if not self.trc: + return + if not ids or not limit: + return + if not isinstance(ids, list): + ids = int(ids) + else: + ids = [int(x) for x in ids if str(x).isdigit()] + self.trc.change_torrent(ids, uploadLimit=int(limit)) + + def set_downloadspeed_limit(self, ids, limit): + """ + 设置下载限速,单位 KB/sec + """ + if not self.trc: + return + if not ids or not limit: + return + if not isinstance(ids, list): + ids = int(ids) + else: + ids = [int(x) for x in ids if str(x).isdigit()] + self.trc.change_torrent(ids, downloadLimit=int(limit)) + + def get_downloading_progress(self, tag=None): + """ + 获取正在下载的种子进度 + """ + Torrents = self.get_downloading_torrents(tag=tag) + DispTorrents = [] + for torrent in Torrents: + if torrent.status in ['stopped']: + state = "Stoped" + speed = "已暂停" + else: + state = "Downloading" + _dlspeed = StringUtils.str_filesize(torrent.rateDownload) + _upspeed = StringUtils.str_filesize(torrent.rateUpload) + speed = "%s%sB/s %s%sB/s" % (chr(8595), _dlspeed, chr(8593), _upspeed) + # 进度 + progress = round(torrent.progress) + DispTorrents.append({ + 'id': torrent.id, + 'name': torrent.name, + 'speed': speed, + 'state': state, + 'progress': progress + }) + return DispTorrents + + def set_speed_limit(self, download_limit=None, upload_limit=None): + """ + 设置速度限制 + """ + if not self.trc: + return + try: + session = self.trc.get_session() + download_limit_enabled = True if download_limit else False + upload_limit_enabled = True if upload_limit else False + if download_limit_enabled == session.speed_limit_down_enabled and \ + upload_limit_enabled == session.speed_limit_up_enabled and \ + download_limit == session.speed_limit_down and \ + upload_limit == session.speed_limit_up: + return + self.trc.set_session( + speed_limit_down=download_limit if download_limit != session.speed_limit_down + else session.speed_limit_down, + speed_limit_up=upload_limit if upload_limit != session.speed_limit_up + else session.speed_limit_up, + speed_limit_down_enabled=download_limit_enabled, + speed_limit_up_enabled=upload_limit_enabled + ) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False diff --git a/app/downloader/downloader.py b/app/downloader/downloader.py new file mode 100644 index 0000000..1343564 --- /dev/null +++ b/app/downloader/downloader.py @@ -0,0 +1,1081 @@ +import os +from threading import Lock + +import log +from app.conf import ModuleConf +from app.filetransfer import FileTransfer +from app.helper import DbHelper, ThreadHelper, SubmoduleHelper +from app.media import Media +from app.media.meta import MetaInfo +from app.mediaserver import MediaServer +from app.message import Message +from app.sites import Sites +from app.subtitle import Subtitle +from app.conf import SystemConfig +from app.utils import Torrent, StringUtils, SystemUtils, ExceptionUtils +from app.utils.commons import singleton +from app.utils.types import MediaType, DownloaderType, SearchType, RmtMode +from config import Config, PT_TAG, RMT_MEDIAEXT + +lock = Lock() +client_lock = Lock() + + +@singleton +class Downloader: + clients = {} + _downloader_schema = [] + _default_client_type = None + _pt_monitor_only = None + _download_order = None + _pt_rmt_mode = None + _downloaddir = [] + _download_setting = {} + + message = None + mediaserver = None + filetransfer = None + media = None + sites = None + dbhelper = None + systemconfig = None + + def __init__(self): + self._downloader_schema = SubmoduleHelper.import_submodules( + 'app.downloader.client', + filter_func=lambda _, obj: hasattr(obj, 'schema') + ) + log.debug(f"【Downloader】加载下载器:{self._downloader_schema}") + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.message = Message() + self.mediaserver = MediaServer() + self.filetransfer = FileTransfer() + self.media = Media() + self.sites = Sites() + self.systemconfig = SystemConfig() + # 下载器配置 + pt = Config().get_config('pt') + if pt: + self._default_client_type = ModuleConf.DOWNLOADER_DICT.get(pt.get('pt_client')) or DownloaderType.QB + self._pt_monitor_only = pt.get("pt_monitor_only") + self._download_order = pt.get("download_order") + self._pt_rmt_mode = ModuleConf.RMT_MODES.get(pt.get("rmt_mode", "copy"), RmtMode.COPY) + # 下载目录配置 + self._downloaddir = Config().get_config('downloaddir') or [] + # 下载设置 + self._download_setting = { + "-1": { + "id": -1, + "name": "预设", + "category": '', + "tags": PT_TAG, + "content_layout": 0, + "is_paused": 0, + "upload_limit": 0, + "download_limit": 0, + "ratio_limit": 0, + "seeding_time_limit": 0, + "downloader": ""} + } + download_settings = self.dbhelper.get_download_setting() + for download_setting in download_settings: + self._download_setting[str(download_setting.ID)] = { + "id": download_setting.ID, + "name": download_setting.NAME, + "category": download_setting.CATEGORY, + "tags": download_setting.TAGS, + "content_layout": download_setting.CONTENT_LAYOUT, + "is_paused": download_setting.IS_PAUSED, + "upload_limit": download_setting.UPLOAD_LIMIT, + "download_limit": download_setting.DOWNLOAD_LIMIT, + "ratio_limit": download_setting.RATIO_LIMIT / 100, + "seeding_time_limit": download_setting.SEEDING_TIME_LIMIT, + "downloader": download_setting.DOWNLOADER} + + def __build_class(self, ctype, conf=None): + for downloader_schema in self._downloader_schema: + try: + if downloader_schema.match(ctype): + return downloader_schema(conf) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None + + @property + def default_client(self): + return self.__get_client(self._default_client_type) + + def __get_client(self, ctype: DownloaderType, conf: dict = None): + if not ctype: + return None + with client_lock: + if not self.clients.get(ctype.value): + self.clients[ctype.value] = self.__build_class(ctype.value, conf) + return self.clients.get(ctype.value) + + def download(self, + media_info, + is_paused=None, + tag=None, + download_dir=None, + download_setting=None, + torrent_file=None): + """ + 添加下载任务,根据当前使用的下载器分别调用不同的客户端处理 + :param media_info: 需下载的媒体信息,含URL地址 + :param is_paused: 是否暂停下载 + :param tag: 种子标签 + :param download_dir: 指定下载目录 + :param download_setting: 下载设置id + :param torrent_file: 种子文件路径 + :return: 种子或状态,错误信息 + """ + # 标题 + title = media_info.org_string + # 详情页面 + page_url = media_info.page_url + # 默认值 + _xpath, _hash, site_info, dl_files_folder, dl_files, retmsg = None, False, {}, "", [], "" + # 有种子文件时解析种子信息 + if torrent_file: + url = os.path.basename(torrent_file) + content, dl_files_folder, dl_files, retmsg = Torrent().read_torrent_content(torrent_file) + # 没有种子文件解析链接 + else: + url = media_info.enclosure + if not url: + return None, "下载链接为空" + # 获取种子内容,磁力链不解析 + if url.startswith("magnet:"): + content = url + else: + # [XPATH]为需从详情页面解析磁力链 + if url.startswith("["): + _xpath = url[1:-1] + url = page_url + # #XPATH#为需从详情页面解析磁力Hash + elif url.startswith("#"): + _xpath = url[1:-1] + _hash = True + url = page_url + # 从详情页面XPATH解析下载链接 + if _xpath: + content = self.sites.parse_site_download_url(page_url=url, + xpath=_xpath) + if not content: + return None, "无法从详情页面:%s 解析出下载链接" % url + # 解析出磁力链,补充Trackers + if content.startswith("magnet:"): + content = Torrent.add_trackers_to_magnet(url=content, title=title) + # 解析出来的是HASH值,转换为磁力链 + elif _hash: + content = Torrent.convert_hash_to_magnet(hash_text=content, title=title) + if not content: + return None, "%s 转换磁力链失败" % content + # 从HTTP链接下载种子 + else: + # 获取Cookie和ua等 + site_info = self.sites.get_site_attr(url) + # 下载种子文件,并读取信息 + _, content, dl_files_folder, dl_files, retmsg = Torrent().get_torrent_info( + url=url, + cookie=site_info.get("cookie"), + ua=site_info.get("ua"), + referer=page_url if site_info.get("referer") else None, + proxy=site_info.get("proxy") + ) + # 解析完成 + if retmsg: + log.warn("【Downloader】%s" % retmsg) + if not content: + return None, retmsg + + # 下载设置 + if not download_setting and media_info.site: + download_setting = self.sites.get_site_download_setting(media_info.site) + if download_setting: + download_attr = self.get_download_setting(download_setting) \ + or self.get_download_setting(self.get_default_download_setting()) + else: + download_attr = self.get_download_setting(self.get_default_download_setting()) + # 下载器类型 + dl_type = self.__get_client_type(download_attr.get("downloader")) or self._default_client_type + # 下载器客户端 + downloader = self.__get_client(dl_type) + + # 开始添加下载 + try: + # 分类 + category = download_attr.get("category") + # 合并TAG + tags = download_attr.get("tags") + if tags: + tags = tags.split(";") + if tag: + tags.append(tag) + else: + if tag: + tags = [tag] + # 布局 + content_layout = download_attr.get("content_layout") + if content_layout == 1: + content_layout = "Original" + elif content_layout == 2: + content_layout = "Subfolder" + elif content_layout == 3: + content_layout = "NoSubfolder" + else: + content_layout = "" + # 暂停 + if is_paused is None: + is_paused = StringUtils.to_bool(download_attr.get("is_paused")) + else: + is_paused = True if is_paused else False + # 上传限速 + upload_limit = download_attr.get("upload_limit") + # 下载限速 + download_limit = download_attr.get("download_limit") + # 分享率 + ratio_limit = download_attr.get("ratio_limit") + # 做种时间 + seeding_time_limit = download_attr.get("seeding_time_limit") + # 下载目录 + if not download_dir: + download_info = self.__get_download_dir_info(media_info) + download_dir = download_info.get('path') + download_label = download_info.get('label') + if not category: + category = download_label + # 添加下载 + print_url = content if isinstance(content, str) else url + if is_paused: + log.info("【Downloader】添加下载任务并暂停:%s,目录:%s,Url:%s" % (title, download_dir, print_url)) + else: + log.info("【Downloader】添加下载任务:%s,目录:%s,Url:%s" % (title, download_dir, print_url)) + if dl_type == DownloaderType.TR: + ret = downloader.add_torrent(content, + is_paused=is_paused, + download_dir=download_dir, + cookie=site_info.get("cookie")) + if ret: + downloader.change_torrent(tid=ret.id, + tag=tags, + upload_limit=upload_limit, + download_limit=download_limit, + ratio_limit=ratio_limit, + seeding_time_limit=seeding_time_limit) + elif dl_type == DownloaderType.QB: + ret = downloader.add_torrent(content, + is_paused=is_paused, + download_dir=download_dir, + tag=tags, + category=category, + content_layout=content_layout, + upload_limit=upload_limit, + download_limit=download_limit, + ratio_limit=ratio_limit, + seeding_time_limit=seeding_time_limit, + cookie=site_info.get("cookie")) + else: + ret = downloader.add_torrent(content, + is_paused=is_paused, + tag=tags, + download_dir=download_dir, + category=category) + # 添加下载成功 + if ret: + # 登记下载历史 + self.dbhelper.insert_download_history(media_info) + # 下载站点字幕文件 + if page_url \ + and download_dir \ + and dl_files \ + and site_info \ + and site_info.get("subtitle"): + # 下载访问目录 + visit_dir = self.get_download_visit_dir(download_dir) + if visit_dir: + if dl_files_folder: + subtitle_dir = os.path.join(visit_dir, dl_files_folder) + else: + subtitle_dir = visit_dir + ThreadHelper().start_thread( + Subtitle().download_subtitle_from_site, + (media_info, site_info.get("cookie"), site_info.get("ua"), subtitle_dir) + ) + return ret, "" + else: + return ret, "请检查下载任务是否已存在" + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【Downloader】添加下载任务出错:%s" % str(e)) + return None, str(e) + + def transfer(self): + """ + 转移下载完成的文件,进行文件识别重命名到媒体库目录 + """ + if self.default_client: + try: + lock.acquire() + if self._pt_monitor_only: + tag = [PT_TAG] + else: + tag = None + trans_tasks = self.default_client.get_transfer_task(tag=tag) + if trans_tasks: + log.info("【Downloader】开始转移下载文件...") + else: + return + for task in trans_tasks: + done_flag, done_msg = self.filetransfer.transfer_media(in_from=self._default_client_type, + in_path=task.get("path"), + rmt_mode=self._pt_rmt_mode) + if not done_flag: + log.warn("【Downloader】%s 转移失败:%s" % (task.get("path"), done_msg)) + self.default_client.set_torrents_status(ids=task.get("id"), + tags=task.get("tags")) + else: + if self._pt_rmt_mode in [RmtMode.MOVE, RmtMode.RCLONE, RmtMode.MINIO]: + log.warn("【Downloader】移动模式下删除种子文件:%s" % task.get("id")) + self.default_client.delete_torrents(delete_file=True, ids=task.get("id")) + else: + self.default_client.set_torrents_status(ids=task.get("id"), + tags=task.get("tags")) + log.info("【Downloader】下载文件转移结束") + finally: + lock.release() + + def get_remove_torrents(self, downloader=None, config=None): + """ + 查询符合删种策略的种子信息 + :return: 符合删种策略的种子信息列表 + """ + if not downloader or not config: + return [] + _client = self.__get_client(downloader) + if self._pt_monitor_only: + config["filter_tags"] = config["tags"] + [PT_TAG] + else: + config["filter_tags"] = config["tags"] + torrents = _client.get_remove_torrents(config=config) + torrents.sort(key=lambda x: x.get("name")) + return torrents + + def get_downloading_torrents(self): + """ + 查询正在下载中的种子信息 + :return: 客户端类型,下载中的种子信息列表 + """ + if not self.default_client: + return self._default_client_type, [] + if self._pt_monitor_only: + tag = [PT_TAG] + else: + tag = None + try: + return self._default_client_type, self.default_client.get_downloading_torrents(tag=tag) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return self._default_client_type, [] + + def get_downloading_progress(self): + """ + 查询正在下载中的进度信息 + """ + if not self.default_client: + return [] + if self._pt_monitor_only: + tag = [PT_TAG] + else: + tag = None + return self.default_client.get_downloading_progress(tag=tag) + + def get_torrents(self, torrent_ids): + """ + 根据ID或状态查询下载器中的种子信息 + :param torrent_ids: 种子ID列表 + :return: 客户端类型,种子信息列表, 是否发生异常 + """ + if not self.default_client: + return None, [], True + torrent_list, _ = self.default_client.get_torrents(ids=torrent_ids) + return self._default_client_type, torrent_list + + def start_torrents(self, downloader=None, ids=None): + """ + 下载控制:开始 + :param downloader: 下载器类型 + :param ids: 种子ID列表 + :return: 处理状态 + """ + if not ids: + return False + if not downloader: + if not self.default_client: + return False + return self.default_client.start_torrents(ids) + else: + _client = self.__get_client(downloader) + return _client.start_torrents(ids) + + def stop_torrents(self, downloader=None, ids=None): + """ + 下载控制:停止 + :param downloader: 下载器类型 + :param ids: 种子ID列表 + :return: 处理状态 + """ + if not ids: + return False + if not downloader: + if not self.default_client: + return False + return self.default_client.stop_torrents(ids) + else: + _client = self.__get_client(downloader) + return _client.stop_torrents(ids) + + def delete_torrents(self, downloader=None, ids=None, delete_file=False): + """ + 删除种子 + :param downloader: 下载器类型 + :param ids: 种子ID列表 + :param delete_file: 是否删除文件 + :return: 处理状态 + """ + if not ids: + return False + if not downloader: + if not self.default_client: + return False + return self.default_client.delete_torrents(delete_file=delete_file, ids=ids) + else: + _client = self.__get_client(downloader) + return _client.delete_torrents(delete_file=delete_file, ids=ids) + + def batch_download(self, + in_from: SearchType, + media_list: list, + need_tvs: dict = None, + user_name=None): + """ + 根据命中的种子媒体信息,添加下载,由RSS或Searcher调用 + :param in_from: 来源 + :param media_list: 命中并已经识别好的媒体信息列表,包括名称、年份、季、集等信息 + :param need_tvs: 缺失的剧集清单,对于剧集只有在该清单中的季和集才会下载,对于电影无需输入该参数 + :param user_name: 用户名称 + :return: 已经添加了下载的媒体信息表表、剩余未下载到的媒体信息 + """ + + # 已下载的项目 + return_items = [] + # 返回按季、集数倒序排序的列表 + download_list = self.get_download_list(media_list) + + def __download(download_item, torrent_file=None, tag=None, is_paused=None): + """ + 下载及发送通知 + """ + download_item.user_name = user_name + state, msg = self.download( + media_info=download_item, + download_dir=download_item.save_path, + download_setting=download_item.download_setting, + torrent_file=torrent_file, + tag=tag, + is_paused=is_paused) + if state: + if download_item not in return_items: + return_items.append(download_item) + self.message.send_download_message(in_from, download_item) + else: + self.message.send_download_fail_message(download_item, msg) + return state + + def __update_seasons(tmdbid, need, current): + """ + 更新need_tvs季数 + """ + need = list(set(need).difference(set(current))) + for cur in current: + for nt in need_tvs.get(tmdbid): + if cur == nt.get("season") or (cur == 1 and not nt.get("season")): + need_tvs[tmdbid].remove(nt) + if not need_tvs.get(tmdbid): + need_tvs.pop(tmdbid) + return need + + def __update_episodes(tmdbid, seq, need, current): + """ + 更新need_tvs集数 + """ + need = list(set(need).difference(set(current))) + if need: + need_tvs[tmdbid][seq]["episodes"] = need + else: + need_tvs[tmdbid].pop(seq) + if not need_tvs.get(tmdbid): + need_tvs.pop(tmdbid) + return need + + def __get_season_episodes(tmdbid, season): + """ + 获取需要的季的集数 + """ + if not need_tvs.get(tmdbid): + return 0 + for nt in need_tvs.get(tmdbid): + if season == nt.get("season"): + return nt.get("total_episodes") + return 0 + + # 下载掉所有的电影 + for item in download_list: + if item.type == MediaType.MOVIE: + __download(item) + + # 电视剧整季匹配 + if need_tvs: + # 先把整季缺失的拿出来,看是否刚好有所有季都满足的种子 + need_seasons = {} + for need_tmdbid, need_tv in need_tvs.items(): + for tv in need_tv: + if not tv: + continue + if not tv.get("episodes"): + if not need_seasons.get(need_tmdbid): + need_seasons[need_tmdbid] = [] + need_seasons[need_tmdbid].append(tv.get("season") or 1) + # 查找整季包含的种子,只处理整季没集的种子或者是集数超过季的种子 + for need_tmdbid, need_season in need_seasons.items(): + for item in download_list: + if item.type == MediaType.MOVIE: + continue + item_season = item.get_season_list() + if item.get_episode_list(): + continue + if need_tmdbid == item.tmdb_id: + if set(item_season).issubset(set(need_season)): + if len(item_season) == 1: + # 只有一季的可能是命名错误,需要打开种子鉴别,只有实际集数大于等于总集数才下载 + torrent_episodes, torrent_path = self.get_torrent_episodes( + url=item.enclosure, + page_url=item.page_url) + if not torrent_episodes \ + or len(torrent_episodes) >= __get_season_episodes(need_tmdbid, item_season[0]): + download_state = __download(download_item=item, torrent_file=torrent_path) + else: + log.info( + f"【Downloader】种子 {item.org_string} 未含集数信息,解析文件数为 {len(torrent_episodes)}") + continue + else: + download_state = __download(item) + if download_state: + # 更新仍需季集 + need_season = __update_seasons(tmdbid=need_tmdbid, + need=need_season, + current=item_season) + # 电视剧季内的集匹配 + if need_tvs: + need_tv_list = list(need_tvs) + for need_tmdbid in need_tv_list: + need_tv = need_tvs.get(need_tmdbid) + if not need_tv: + continue + index = 0 + for tv in need_tv: + need_season = tv.get("season") or 1 + need_episodes = tv.get("episodes") + total_episodes = tv.get("total_episodes") + # 缺失整季的转化为缺失集进行比较 + if not need_episodes: + need_episodes = list(range(1, total_episodes + 1)) + for item in download_list: + if item.type == MediaType.MOVIE: + continue + if item.tmdb_id == need_tmdbid: + if item in return_items: + continue + item_season = item.get_season_list() + if len(item_season) != 1 or item_season[0] != need_season: + continue + item_episodes = item.get_episode_list() + if not item_episodes: + continue + # 只处理单季含集的种子,从集最多的开始下 + if set(item_episodes).issubset(set(need_episodes)): + if __download(item): + # 更新仍需集数 + need_episodes = __update_episodes(tmdbid=need_tmdbid, + need=need_episodes, + seq=index, + current=item_episodes) + index += 1 + + # 仍然缺失的剧集,从整季中选择需要的集数文件下载,仅支持QB和TR + if need_tvs: + need_tv_list = list(need_tvs) + for need_tmdbid in need_tv_list: + need_tv = need_tvs.get(need_tmdbid) + if not need_tv: + continue + index = 0 + for tv in need_tv: + need_season = tv.get("season") or 1 + need_episodes = tv.get("episodes") + if not need_episodes: + continue + for item in download_list: + if item.type == MediaType.MOVIE: + continue + if item in return_items: + continue + if not need_episodes: + break + # 选中一个单季整季的或单季包括需要的所有集的 + if item.tmdb_id == need_tmdbid \ + and (not item.get_episode_list() + or set(item.get_episode_list()).intersection(set(need_episodes))) \ + and len(item.get_season_list()) == 1 \ + and item.get_season_list()[0] == need_season: + # 检查种子看是否有需要的集 + torrent_episodes, torrent_path = self.get_torrent_episodes( + url=item.enclosure, + page_url=item.page_url) + selected_episodes = set(torrent_episodes).intersection(set(need_episodes)) + if not selected_episodes: + log.info("【Downloader】%s 没有需要的集,跳过..." % item.org_string) + continue + # 添加下载并暂停 + torrent_tag = "NT" + StringUtils.generate_random_str(5) + ret = __download(download_item=item, + torrent_file=torrent_path, + tag=torrent_tag, + is_paused=True) + if not ret: + continue + # 更新仍需集数 + need_episodes = __update_episodes(tmdbid=need_tmdbid, + need=need_episodes, + seq=index, + current=selected_episodes) + # 获取下载器 + downloader = self._default_client_type + if item.download_setting: + download_attr = self.get_download_setting(item.download_setting) + if download_attr.get("downloader"): + downloader = self.__get_client_type(download_attr.get("downloader")) + _client = self.__get_client(downloader) + # 获取刚添加的任务ID + if downloader == DownloaderType.TR: + torrent_id = ret.id + elif downloader == DownloaderType.QB: + torrent_id = _client.get_torrent_id_by_tag(tag=torrent_tag, status=["paused"]) + else: + continue + if not torrent_id: + log.error("【Downloader】获取下载器添加的任务信息出错:%s,tag=%s" % ( + item.org_string, torrent_tag)) + continue + # 设置任务只下载想要的文件 + log.info("【Downloader】从 %s 中选取集:%s" % (item.org_string, selected_episodes)) + self.set_files_status(torrent_id, selected_episodes, downloader) + # 重新开始任务 + log.info("【Downloader】%s 开始下载 " % item.org_string) + _client.start_torrents(torrent_id) + # 记录下载项 + return_items.append(item) + index += 1 + + # 返回下载的资源,剩下没下完的 + return return_items, need_tvs + + def check_exists_medias(self, meta_info, no_exists=None, total_ep=None): + """ + 检查媒体库,查询是否存在,对于剧集同时返回不存在的季集信息 + :param meta_info: 已识别的媒体信息,包括标题、年份、季、集信息 + :param no_exists: 在调用该方法前已经存储的不存在的季集信息,有传入时该函数检索的内容将会叠加后输出 + :param total_ep: 各季的总集数 + :return: 当前媒体是否缺失,各标题总的季集和缺失的季集,需要发送的消息 + """ + if not no_exists: + no_exists = {} + if not total_ep: + total_ep = {} + # 查找的季 + if not meta_info.begin_season: + search_season = None + else: + search_season = meta_info.get_season_list() + # 查找的集 + search_episode = meta_info.get_episode_list() + if search_episode and not search_season: + search_season = [1] + + # 返回的消息列表 + message_list = [] + if meta_info.type != MediaType.MOVIE: + # 是否存在的标志 + return_flag = False + # 检索电视剧的信息 + tv_info = self.media.get_tmdb_info(mtype=MediaType.TV, tmdbid=meta_info.tmdb_id) + if tv_info: + # 传入检查季 + total_seasons = [] + if search_season: + for season in search_season: + if total_ep.get(season): + episode_num = total_ep.get(season) + else: + episode_num = self.media.get_tmdb_season_episodes_num(tv_info=tv_info, season=season) + if not episode_num: + log.info("【Downloader】%s 第%s季 不存在" % (meta_info.get_title_string(), season)) + message_list.append("%s 第%s季 不存在" % (meta_info.get_title_string(), season)) + continue + total_seasons.append({"season_number": season, "episode_count": episode_num}) + log.info( + "【Downloader】%s 第%s季 共有 %s 集" % (meta_info.get_title_string(), season, episode_num)) + else: + # 共有多少季,每季有多少季 + total_seasons = self.media.get_tmdb_tv_seasons(tv_info=tv_info) + log.info( + "【Downloader】%s %s 共有 %s 季" % ( + meta_info.type.value, meta_info.get_title_string(), len(total_seasons))) + message_list.append( + "%s %s 共有 %s 季" % (meta_info.type.value, meta_info.get_title_string(), len(total_seasons))) + # 没有得到总季数时,返回None + if not total_seasons: + return_flag = None + else: + # 查询缺少多少集 + for season in total_seasons: + season_number = season.get("season_number") + episode_count = season.get("episode_count") + if not season_number or not episode_count: + continue + # 检查Emby + no_exists_episodes = self.mediaserver.get_no_exists_episodes(meta_info, + season_number, + episode_count) + # 没有配置Emby + if no_exists_episodes is None: + no_exists_episodes = self.filetransfer.get_no_exists_medias(meta_info, + season_number, + episode_count) + if no_exists_episodes: + # 排序 + no_exists_episodes.sort() + # 缺失集初始化 + if not no_exists.get(meta_info.tmdb_id): + no_exists[meta_info.tmdb_id] = [] + # 缺失集提示文本 + exists_tvs_str = "、".join(["%s" % tv for tv in no_exists_episodes]) + # 存入总缺失集 + if len(no_exists_episodes) >= episode_count: + no_item = {"season": season_number, "episodes": [], "total_episodes": episode_count} + log.info( + "【Downloader】%s 第%s季 缺失 %s 集" % ( + meta_info.get_title_string(), season_number, episode_count)) + if search_season: + message_list.append( + "%s 第%s季 缺失 %s 集" % (meta_info.title, season_number, episode_count)) + else: + message_list.append("第%s季 缺失 %s 集" % (season_number, episode_count)) + else: + no_item = {"season": season_number, "episodes": no_exists_episodes, + "total_episodes": episode_count} + log.info( + "【Downloader】%s 第%s季 缺失集:%s" % ( + meta_info.get_title_string(), season_number, exists_tvs_str)) + if search_season: + message_list.append( + "%s 第%s季 缺失集:%s" % (meta_info.title, season_number, exists_tvs_str)) + else: + message_list.append("第%s季 缺失集:%s" % (season_number, exists_tvs_str)) + if no_item not in no_exists.get(meta_info.tmdb_id): + no_exists[meta_info.tmdb_id].append(no_item) + # 输入检查集 + if search_episode: + # 有集数,肯定只有一季 + if not set(search_episode).intersection(set(no_exists_episodes)): + # 搜索的跟不存在的没有交集,说明都存在了 + msg = f"媒体库中已存在剧集:\n" \ + f" • {meta_info.get_title_string()} {meta_info.get_season_episode_string()}" + log.info(f"【Downloader】{msg}") + message_list.append(msg) + return_flag = True + break + else: + log.info("【Downloader】%s 第%s季 共%s集 已全部存在" % ( + meta_info.get_title_string(), season_number, episode_count)) + if search_season: + message_list.append( + "%s 第%s季 共%s集 已全部存在" % (meta_info.title, season_number, episode_count)) + else: + message_list.append( + "第%s季 共%s集 已全部存在" % (season_number, episode_count)) + else: + log.info("【Downloader】%s 无法查询到媒体详细信息" % meta_info.get_title_string()) + message_list.append("%s 无法查询到媒体详细信息" % meta_info.get_title_string()) + return_flag = None + # 全部存在 + if return_flag is False and not no_exists.get(meta_info.tmdb_id): + return_flag = True + # 返回 + return return_flag, no_exists, message_list + # 检查电影 + else: + exists_movies = self.mediaserver.get_movies(meta_info.title, meta_info.year) + if exists_movies is None: + exists_movies = self.filetransfer.get_no_exists_medias(meta_info) + if exists_movies: + movies_str = "\n • ".join(["%s (%s)" % (m.get('title'), m.get('year')) for m in exists_movies]) + msg = f"媒体库中已存在电影:\n • {movies_str}" + log.info(f"【Downloader】{msg}") + message_list.append(msg) + return True, {}, message_list + return False, {}, message_list + + def set_files_status(self, tid, need_episodes, downloader): + """ + 设置文件下载状态,选中需要下载的季集对应的文件下载,其余不下载 + :param tid: 种子的hash或id + :param need_episodes: 需要下载的文件的集信息 + :param downloader: 下载器 + :return: 返回选中的集的列表 + """ + sucess_epidised = [] + _client = self.__get_client(downloader) + if downloader == DownloaderType.TR: + files_info = {} + torrent_files = _client.get_files(tid) + if not torrent_files: + return [] + for file_id, torrent_file in enumerate(torrent_files): + meta_info = MetaInfo(torrent_file.name) + if not meta_info.get_episode_list(): + selected = False + else: + selected = set(meta_info.get_episode_list()).issubset(set(need_episodes)) + if selected: + sucess_epidised = list(set(sucess_epidised).union(set(meta_info.get_episode_list()))) + if not files_info.get(tid): + files_info[tid] = {file_id: {'priority': 'normal', 'selected': selected}} + else: + files_info[tid][file_id] = {'priority': 'normal', 'selected': selected} + if sucess_epidised and files_info: + _client.set_files(file_info=files_info) + elif downloader == DownloaderType.QB: + file_ids = [] + torrent_files = _client.get_files(tid) + if not torrent_files: + return [] + for torrent_file in torrent_files: + meta_info = MetaInfo(torrent_file.get("name")) + if not meta_info.get_episode_list() or not set(meta_info.get_episode_list()).issubset( + set(need_episodes)): + file_ids.append(torrent_file.get("index")) + else: + sucess_epidised = list(set(sucess_epidised).union(set(meta_info.get_episode_list()))) + if sucess_epidised and file_ids: + _client.set_files(torrent_hash=tid, file_ids=file_ids, priority=0) + return sucess_epidised + + def get_download_list(self, media_list): + """ + 对媒体信息进行排序、去重 + """ + if not media_list: + return [] + + # 排序函数,标题、站点、资源类型、做种数量 + def get_sort_str(x): + season_len = str(len(x.get_season_list())).rjust(2, '0') + episode_len = str(len(x.get_episode_list())).rjust(4, '0') + # 排序:标题、资源类型、站点、做种、季集 + if self._download_order == "seeder": + return "%s%s%s%s%s" % (str(x.title).ljust(100, ' '), + str(x.res_order).rjust(3, '0'), + str(x.seeders).rjust(10, '0'), + str(x.site_order).rjust(3, '0'), + "%s%s" % (season_len, episode_len)) + else: + return "%s%s%s%s%s" % (str(x.title).ljust(100, ' '), + str(x.res_order).rjust(3, '0'), + str(x.site_order).rjust(3, '0'), + str(x.seeders).rjust(10, '0'), + "%s%s" % (season_len, episode_len)) + + # 匹配的资源中排序分组选最好的一个下载 + # 按站点顺序、资源匹配顺序、做种人数下载数逆序排序 + media_list = sorted(media_list, key=lambda x: get_sort_str(x), reverse=True) + # 控重 + can_download_list_item = [] + can_download_list = [] + # 排序后重新加入数组,按真实名称控重,即只取每个名称的第一个 + for t_item in media_list: + # 控重的主链是名称、年份、季、集 + if t_item.type != MediaType.MOVIE: + media_name = "%s%s" % (t_item.get_title_string(), + t_item.get_season_episode_string()) + else: + media_name = t_item.get_title_string() + if media_name not in can_download_list: + can_download_list.append(media_name) + can_download_list_item.append(t_item) + return can_download_list_item + + def get_download_dirs(self, setting=None): + """ + 返回下载器中设置的保存目录 + """ + if not self._downloaddir: + return [] + if not setting: + setting = self.get_default_download_setting() + # 查询下载设置 + download_setting = self.get_download_setting(sid=setting) + # 下载设置为QB + if download_setting \ + and download_setting.get('downloader') == "Qbittorrent" \ + and Config().get_config("qbittorrent").get("auto_management"): + return [] + # 默认下载器为QB + if download_setting \ + and not download_setting.get('downloader') \ + and Config().get_config("pt").get("pt_client") == "qbittorrent" \ + and Config().get_config("qbittorrent").get("auto_management"): + return [] + # 查询目录 + save_path_list = [attr.get("save_path") for attr in self._downloaddir if attr.get("save_path")] + save_path_list.sort() + return list(set(save_path_list)) + + def get_download_visit_dirs(self): + """ + 返回下载器中设置的访问目录 + """ + if not self._downloaddir: + return [] + visit_path_list = [attr.get("container_path") or attr.get("save_path") for attr in self._downloaddir if + attr.get("save_path")] + visit_path_list.sort() + return list(set(visit_path_list)) + + def get_download_visit_dir(self, download_dir): + """ + 返回下载器中设置的访问目录 + """ + if not self.default_client: + return "" + return self.default_client.get_replace_path(download_dir) + + def __get_download_dir_info(self, media): + """ + 根据媒体信息读取一个下载目录的信息 + """ + if media and media.tmdb_info: + for attr in self._downloaddir or []: + if not attr: + continue + if attr.get("type") and attr.get("type") != media.type.value: + continue + if attr.get("category") and attr.get("category") != media.category: + continue + if not attr.get("save_path") and not attr.get("label"): + continue + if (attr.get("container_path") or attr.get("save_path")) \ + and os.path.exists(attr.get("container_path") or attr.get("save_path")) \ + and media.size \ + and float(SystemUtils.get_free_space_gb(attr.get("container_path") or attr.get("save_path"))) \ + < float(int(StringUtils.num_filesize(media.size)) / 1024 / 1024 / 1024): + continue + return {"path": attr.get("save_path"), "label": attr.get("label")} + return {"path": None, "label": None} + + def get_default_client_type(self): + """ + 返回下载器类型 + """ + return self._default_client_type + + @staticmethod + def __get_client_type(type_name): + """ + 根据名称返回下载器类型 + """ + if not type_name: + return None + for dict_type in DownloaderType: + if dict_type.name == type_name or dict_type.value == type_name: + return dict_type + + def get_torrent_episodes(self, url, page_url=None): + """ + 解析种子文件,获取集数 + :return: 集数列表、种子路径 + """ + site_info = self.sites.get_site_attr(url) + # 保存种子文件 + file_path, _, _, files, retmsg = Torrent().get_torrent_info( + url=url, + cookie=site_info.get("cookie"), + ua=site_info.get("ua"), + referer=page_url if site_info.get("referer") else None, + proxy=site_info.get("proxy") + ) + if not files: + log.error("【Downloader】读取种子文件集数出错:%s" % retmsg) + return [], None + episodes = [] + for file in files: + if os.path.splitext(file)[-1] not in RMT_MEDIAEXT: + continue + meta = MetaInfo(file) + if not meta.begin_episode: + continue + episodes = list(set(episodes).union(set(meta.get_episode_list()))) + return episodes, file_path + + def get_download_setting(self, sid=None): + """ + 获取下载设置 + :return: 下载设置 + """ + if sid: + return self._download_setting.get(str(sid)) + else: + return self._download_setting + + def get_default_download_setting(self): + """ + 获取默认下载设置 + :return: 默认下载设置id + """ + default_download_setting = SystemConfig().get_system_config("DefaultDownloadSetting") or "-1" + if not self._download_setting.get(default_download_setting): + default_download_setting = "-1" + return default_download_setting + + def set_speed_limit(self, downloader, download_limit=None, upload_limit=None): + """ + 设置速度限制 + """ + if not downloader: + return [] + _client = self.__get_client(downloader) + try: + download_limit = int(download_limit) if download_limit else 0 + except Exception as err: + ExceptionUtils.exception_traceback(err) + download_limit = 0 + try: + upload_limit = int(upload_limit) if upload_limit else 0 + except Exception as err: + ExceptionUtils.exception_traceback(err) + upload_limit = 0 + _client.set_speed_limit(download_limit=download_limit, upload_limit=upload_limit) diff --git a/app/filetransfer.py b/app/filetransfer.py new file mode 100644 index 0000000..b8815fc --- /dev/null +++ b/app/filetransfer.py @@ -0,0 +1,1315 @@ +import argparse +import os +import random +import re +import shutil +import traceback +from enum import Enum +from threading import Lock +from time import sleep + +import log +from app.conf import ModuleConf +from app.helper import DbHelper, ProgressHelper +from app.helper import ThreadHelper +from app.media import Media, Category, Scraper +from app.media.meta import MetaInfo +from app.mediaserver import MediaServer +from app.message import Message +from app.subtitle import Subtitle +from app.utils import EpisodeFormat, PathUtils, StringUtils, SystemUtils, ExceptionUtils +from app.utils.types import MediaType, SyncType, RmtMode +from config import RMT_SUBEXT, RMT_MEDIAEXT, RMT_FAVTYPE, RMT_MIN_FILESIZE, DEFAULT_MOVIE_FORMAT, \ + DEFAULT_TV_FORMAT, Config + +lock = Lock() + + +class FileTransfer: + media = None + message = None + category = None + mediaserver = None + scraper = None + threadhelper = None + dbhelper = None + progress = None + + _default_rmt_mode = None + _movie_path = None + _tv_path = None + _anime_path = None + _movie_category_flag = None + _tv_category_flag = None + _anime_category_flag = None + _unknown_path = None + _min_filesize = RMT_MIN_FILESIZE + _filesize_cover = False + _movie_dir_rmt_format = "" + _movie_file_rmt_format = "" + _tv_dir_rmt_format = "" + _tv_season_rmt_format = "" + _tv_file_rmt_format = "" + _scraper_flag = False + _scraper_nfo = {} + _scraper_pic = {} + _refresh_mediaserver = False + _ignored_paths = [] + _ignored_files = '' + + def __init__(self): + self.media = Media() + self.message = Message() + self.category = Category() + self.mediaserver = MediaServer() + self.scraper = Scraper() + self.threadhelper = ThreadHelper() + self.dbhelper = DbHelper() + self.progress = ProgressHelper() + self.init_config() + + def init_config(self): + media = Config().get_config('media') + self._scraper_flag = media.get("nfo_poster") + self._scraper_nfo = Config().get_config('scraper_nfo') + self._scraper_pic = Config().get_config('scraper_pic') + if media: + # 刷新媒体库开关 + self._refresh_mediaserver = media.get("refresh_mediaserver") + # 电影目录 + self._movie_path = media.get('movie_path') + if not isinstance(self._movie_path, list): + if self._movie_path: + self._movie_path = [self._movie_path] + else: + self._movie_path = [] + # 电影分类 + self._movie_category_flag = self.category.get_movie_category_flag() + # 电视剧目录 + self._tv_path = media.get('tv_path') + if not isinstance(self._tv_path, list): + if self._tv_path: + self._tv_path = [self._tv_path] + else: + self._tv_path = [] + # 电视剧分类 + self._tv_category_flag = self.category.get_tv_category_flag() + # 动漫目录 + self._anime_path = media.get('anime_path') + if not isinstance(self._anime_path, list): + if self._anime_path: + self._anime_path = [self._anime_path] + else: + self._anime_path = [] + # 动漫分类 + self._anime_category_flag = self.category.get_anime_category_flag() + # 没有动漫目漫切换为电视剧目录和分类 + if not self._anime_path: + self._anime_path = self._tv_path + self._anime_category_flag = self._tv_category_flag + # 未识别目录 + self._unknown_path = media.get('unknown_path') + if not isinstance(self._unknown_path, list): + if self._unknown_path: + self._unknown_path = [self._unknown_path] + else: + self._unknown_path = [] + # 最小文件大小 + min_filesize = media.get('min_filesize') + if isinstance(min_filesize, int): + self._min_filesize = min_filesize * 1024 * 1024 + elif isinstance(min_filesize, str) and min_filesize.isdigit(): + self._min_filesize = int(min_filesize) * 1024 * 1024 + # 文件路径转移忽略词 + ignored_paths = media.get('ignored_paths') + if ignored_paths: + if ignored_paths.endswith(";"): + ignored_paths = ignored_paths[:-1] + self._ignored_paths = re.compile(r'%s' % re.sub(r';', r'|', ignored_paths)) + # 文件名转移忽略词 + ignored_files = media.get('ignored_files') + if ignored_files: + if ignored_files.endswith(";"): + ignored_files = ignored_files[:-1] + self._ignored_files = re.compile(r'%s' % re.sub(r';', r'|', ignored_files)) + # 高质量文件覆盖 + self._filesize_cover = media.get('filesize_cover') + # 电影重命名格式 + movie_name_format = media.get('movie_name_format') or DEFAULT_MOVIE_FORMAT + movie_formats = movie_name_format.rsplit('/', 1) + if movie_formats: + self._movie_dir_rmt_format = movie_formats[0] + if len(movie_formats) > 1: + self._movie_file_rmt_format = movie_formats[-1] + # 电视剧重命名格式 + tv_name_format = media.get('tv_name_format') or DEFAULT_TV_FORMAT + tv_formats = tv_name_format.rsplit('/', 2) + if tv_formats: + self._tv_dir_rmt_format = tv_formats[0] + if len(tv_formats) > 2: + self._tv_season_rmt_format = tv_formats[-2] + self._tv_file_rmt_format = tv_formats[-1] + self._default_rmt_mode = ModuleConf.RMT_MODES.get(Config().get_config('pt').get('rmt_mode', 'copy'), + RmtMode.COPY) + + @staticmethod + def __transfer_command(file_item, target_file, rmt_mode): + """ + 使用系统命令处理单个文件 + :param file_item: 文件路径 + :param target_file: 目标文件路径 + :param rmt_mode: RmtMode转移方式 + """ + with lock: + if rmt_mode == RmtMode.LINK: + # 更链接 + retcode, retmsg = SystemUtils.link(file_item, target_file) + elif rmt_mode == RmtMode.SOFTLINK: + # 软链接 + retcode, retmsg = SystemUtils.softlink(file_item, target_file) + elif rmt_mode == RmtMode.MOVE: + # 移动 + retcode, retmsg = SystemUtils.move(file_item, target_file) + elif rmt_mode == RmtMode.RCLONE: + # Rclone移动 + retcode, retmsg = SystemUtils.rclone_move(file_item, target_file) + elif rmt_mode == RmtMode.RCLONECOPY: + # Rclone复制 + retcode, retmsg = SystemUtils.rclone_copy(file_item, target_file) + elif rmt_mode == RmtMode.MINIO: + # Minio移动 + retcode, retmsg = SystemUtils.minio_move(file_item, target_file) + elif rmt_mode == RmtMode.MINIOCOPY: + # Minio复制 + retcode, retmsg = SystemUtils.minio_copy(file_item, target_file) + else: + # 复制 + retcode, retmsg = SystemUtils.copy(file_item, target_file) + if retcode != 0: + log.error("【Rmt】%s" % retmsg) + return retcode + + def __transfer_subtitles(self, org_name, new_name, rmt_mode): + """ + 根据文件名转移对应字幕文件 + :param org_name: 原文件名 + :param new_name: 新文件名 + :param rmt_mode: RmtMode转移方式 + """ + # 字幕正则式 + _zhcn_sub_re = r"([.\[(](((zh[-_])?(cn|ch[si]|sg|sc))|zho?" \ + r"|chinese|(cn|ch[si]|sg|zho?|eng)[-_&](cn|ch[si]|sg|zho?|eng)" \ + r"|简[体中]?)[.\])])" \ + r"|([\u4e00-\u9fa5]{0,3}[中双][\u4e00-\u9fa5]{0,2}[字文语][\u4e00-\u9fa5]{0,3})" \ + r"|简体|简中" + _zhtw_sub_re = r"([.\[(](((zh[-_])?(hk|tw|cht|tc))" \ + r"|繁[体中]?)[.\])])" \ + r"|繁体中[文字]|中[文字]繁体|繁体" + _eng_sub_re = r"[.\[(]eng[.\])]" + + # 比对文件名并转移字幕 + dir_name = os.path.dirname(org_name) + file_name = os.path.basename(org_name) + file_list = PathUtils.get_dir_level1_files(dir_name, RMT_SUBEXT) + if len(file_list) == 0: + log.debug("【Rmt】%s 目录下没有找到字幕文件..." % dir_name) + else: + log.debug("【Rmt】字幕文件清单:" + str(file_list)) + metainfo = MetaInfo(title=file_name) + for file_item in file_list: + sub_file_name = re.sub(_zhtw_sub_re, + ".", + re.sub(_zhcn_sub_re, + ".", + os.path.basename(file_item), + flags=re.I), + flags=re.I) + sub_file_name = re.sub(_eng_sub_re, ".", sub_file_name, flags=re.I) + sub_metainfo = MetaInfo(title=os.path.basename(file_item)) + if (os.path.splitext(file_name)[0] == os.path.splitext(sub_file_name)[0]) or \ + (sub_metainfo.cn_name and sub_metainfo.cn_name == metainfo.cn_name) \ + or (sub_metainfo.en_name and sub_metainfo.en_name == metainfo.en_name): + if metainfo.get_season_string() \ + and metainfo.get_season_string() != sub_metainfo.get_season_string(): + continue + if metainfo.get_episode_string() \ + and metainfo.get_episode_string() != sub_metainfo.get_episode_string(): + continue + new_file_type = "" + # 兼容jellyfin字幕识别(多重识别), emby则会识别最后一个后缀 + if re.search(_zhcn_sub_re, file_item, re.I): + new_file_type = ".chi.zh-cn" + elif re.search(_zhtw_sub_re, file_item, + re.I): + new_file_type = ".zh-tw" + elif re.search(_eng_sub_re, file_item, re.I): + new_file_type = ".eng" + # 通过对比字幕文件大小 尽量转移所有存在的字幕 + file_ext = os.path.splitext(file_item)[-1] + new_sub_tag_dict = { + ".eng": ".英文", + ".chi.zh-cn": ".简体中文", + ".zh-tw": ".繁体中文" + } + new_sub_tag_list = [ + new_file_type if t == 0 else "%s%s(%s)" % (new_file_type, + new_sub_tag_dict.get( + new_file_type, "" + ), + t) for t in range(6) + ] + for new_sub_tag in new_sub_tag_list: + new_file = os.path.splitext(new_name)[0] + new_sub_tag + file_ext + # 如果字幕文件不存在, 直接转移字幕, 并跳出循环 + try: + if not os.path.exists(new_file): + log.debug("【Rmt】正在处理字幕:%s" % os.path.basename(file_item)) + retcode = self.__transfer_command(file_item=file_item, + target_file=new_file, + rmt_mode=rmt_mode) + if retcode == 0: + log.info("【Rmt】字幕 %s %s完成" % (os.path.basename(file_item), rmt_mode.value)) + break + else: + log.error( + "【Rmt】字幕 %s %s失败,错误码 %s" % (file_name, rmt_mode.value, str(retcode))) + return retcode + # 如果字幕文件的大小与已存在文件相同, 说明已经转移过了, 则跳出循环 + elif os.path.getsize(new_file) == os.path.getsize(file_item): + log.info("【Rmt】字幕 %s 已存在" % new_file) + break + # 否则 循环继续 > 通过new_sub_tag_list 获取新的tag附加到字幕文件名, 继续检查是否能转移 + except OSError as reason: + log.info("【Rmt】字幕 %s 出错了,原因: %s" % (new_file, str(reason))) + return 0 + + def __transfer_bluray_dir(self, file_path, new_path, rmt_mode): + """ + 转移蓝光文件夹 + :param file_path: 原路径 + :param new_path: 新路径 + :param rmt_mode: RmtMode转移方式 + """ + log.info("【Rmt】正在%s目录:%s 到 %s" % (rmt_mode.value, file_path, new_path)) + # 复制 + retcode = self.__transfer_dir_files(src_dir=file_path, + target_dir=new_path, + rmt_mode=rmt_mode, + bludir=True) + if retcode == 0: + log.info("【Rmt】文件 %s %s完成" % (file_path, rmt_mode.value)) + else: + log.error("【Rmt】文件%s %s失败,错误码 %s" % (file_path, rmt_mode.value, str(retcode))) + return retcode + + def is_target_dir_path(self, path): + """ + 判断是否为目的路径下的路径 + :param path: 路径 + :return: True/False + """ + if not path: + return False + for tv_path in self._tv_path: + if PathUtils.is_path_in_path(tv_path, path): + return True + for movie_path in self._movie_path: + if PathUtils.is_path_in_path(movie_path, path): + return True + for anime_path in self._anime_path: + if PathUtils.is_path_in_path(anime_path, path): + return True + for unknown_path in self._unknown_path: + if PathUtils.is_path_in_path(unknown_path, path): + return True + return False + + def __transfer_dir_files(self, src_dir, target_dir, rmt_mode, bludir=False): + """ + 按目录结构转移所有文件 + :param src_dir: 原路径 + :param target_dir: 新路径 + :param rmt_mode: RmtMode转移方式 + :param bludir: 是否蓝光目录 + """ + file_list = PathUtils.get_dir_files(src_dir) + retcode = 0 + for file in file_list: + new_file = file.replace(src_dir, target_dir) + if os.path.exists(new_file): + log.warn("【Rmt】%s 文件已存在" % new_file) + continue + new_dir = os.path.dirname(new_file) + if not os.path.exists(new_dir): + os.makedirs(new_dir) + retcode = self.__transfer_command(file_item=file, + target_file=new_file, + rmt_mode=rmt_mode) + if retcode != 0: + break + else: + if not bludir: + self.dbhelper.insert_transfer_blacklist(file) + if retcode == 0 and bludir: + self.dbhelper.insert_transfer_blacklist(src_dir) + return retcode + + def __transfer_origin_file(self, file_item, target_dir, rmt_mode): + """ + 按原文件名link文件到目的目录 + :param file_item: 原文件路径 + :param target_dir: 目的目录 + :param rmt_mode: RmtMode转移方式 + """ + if not file_item or not target_dir: + return -1 + if not os.path.exists(file_item): + log.warn("【Rmt】%s 不存在" % file_item) + return -1 + # 计算目录目录 + parent_name = os.path.basename(os.path.dirname(file_item)) + target_dir = os.path.join(target_dir, parent_name) + if not os.path.exists(target_dir): + log.debug("【Rmt】正在创建目录:%s" % target_dir) + os.makedirs(target_dir) + # 目录 + if os.path.isdir(file_item): + log.info("【Rmt】正在%s目录:%s 到 %s" % (rmt_mode.value, file_item, target_dir)) + retcode = self.__transfer_dir_files(src_dir=file_item, + target_dir=target_dir, + rmt_mode=rmt_mode) + # 文件 + else: + target_file = os.path.join(target_dir, os.path.basename(file_item)) + if os.path.exists(target_file): + log.warn("【Rmt】%s 文件已存在" % target_file) + return 0 + retcode = self.__transfer_command(file_item=file_item, + target_file=target_file, + rmt_mode=rmt_mode) + if retcode == 0: + self.dbhelper.insert_transfer_blacklist(file_item) + if retcode == 0: + log.info("【Rmt】%s %s到unknown完成" % (file_item, rmt_mode.value)) + else: + log.error("【Rmt】%s %s到unknown失败,错误码 %s" % (file_item, rmt_mode.value, retcode)) + return retcode + + def __transfer_file(self, file_item, new_file, rmt_mode, over_flag=False, old_file=None): + """ + 转移一个文件,同时处理字幕 + :param file_item: 原文件路径 + :param new_file: 新文件路径 + :param rmt_mode: RmtMode转移方式 + :param over_flag: 是否覆盖,为True时会先删除再转移 + """ + file_name = os.path.basename(file_item) + if not over_flag and os.path.exists(new_file): + log.warn("【Rmt】文件已存在:%s" % new_file) + return 0 + if over_flag and old_file and os.path.isfile(old_file): + log.info("【Rmt】正在删除已存在的文件:%s" % old_file) + os.remove(old_file) + log.info("【Rmt】正在转移文件:%s 到 %s" % (file_name, new_file)) + retcode = self.__transfer_command(file_item=file_item, + target_file=new_file, + rmt_mode=rmt_mode) + if retcode == 0: + log.info("【Rmt】文件 %s %s完成" % (file_name, rmt_mode.value)) + self.dbhelper.insert_transfer_blacklist(file_item) + else: + log.error("【Rmt】文件 %s %s失败,错误码 %s" % (file_name, rmt_mode.value, str(retcode))) + return retcode + # 处理字幕 + return self.__transfer_subtitles(org_name=file_item, + new_name=new_file, + rmt_mode=rmt_mode) + + def transfer_media(self, + in_from: Enum, + in_path, + rmt_mode: RmtMode = None, + files: list = None, + target_dir=None, + unknown_dir=None, + tmdb_info=None, + media_type: MediaType = None, + season=None, + episode: (EpisodeFormat, bool) = None, + min_filesize=None, + udf_flag=False, + root_path=False): + """ + 识别并转移一个文件、多个文件或者目录 + :param in_from: 来源,即调用该功能的渠道 + :param in_path: 转移的路径,可能是一个文件也可以是一个目录 + :param files: 文件清单,非空时以该文件清单为准,为空时从in_path中按后缀和大小限制检索需要处理的文件清单 + :param target_dir: 目的文件夹,非空的转移到该文件夹,为空时则按类型转移到配置文件中的媒体库文件夹 + :param unknown_dir: 未识别文件夹,非空时未识别的媒体文件转移到该文件夹,为空时则使用配置文件中的未识别文件夹 + :param rmt_mode: 文件转移方式 + :param tmdb_info: 手动识别转移时传入的TMDB信息对象,如未输入,则按名称笔TMDB实时查询 + :param media_type: 手动识别转移时传入的文件类型,如未输入,则自动识别 + :param season: 手动识别目录或文件时传入的的字号,如未输入,则自动识别 + :param episode: (EpisodeFormat,是否批处理匹配) + :param min_filesize: 过滤小文件大小的上限值 + :param udf_flag: 自定义转移标志,为True时代表是自定义转移,此时很多处理不一样 + :param root_path: 是否根目录下的文件 + :return: 处理状态,错误信息 + """ + + def __finish_transfer(status, message): + if status: + self.progress.update(ptype="filetransfer", + value=100, + text=f"{in_path} 转移成功!") + else: + self.progress.update(ptype="filetransfer", + value=100, + text=f"{in_path} 转移失败:{message}!") + self.progress.end('filetransfer') + return status, message + + # 开始进度 + self.progress.start('filetransfer') + + episode = (None, False) if not episode else episode + if not in_path: + log.error("【Rmt】输入路径错误!") + return __finish_transfer(False, "输入路径错误") + + if not rmt_mode: + rmt_mode = self._default_rmt_mode + + log.info("【Rmt】开始处理:%s,转移方式:%s" % (in_path, rmt_mode.value)) + + success_flag = True + error_message = "" + bluray_disk_dir = None + if not files: + # 如果传入的是个目录 + if os.path.isdir(in_path): + if not os.path.exists(in_path): + log.error("【Rmt】文件转移失败,目录不存在 %s" % in_path) + return __finish_transfer(False, "目录不存在") + # 回收站及隐藏的文件不处理 + if PathUtils.is_invalid_path(in_path): + return __finish_transfer(False, "回收站或者隐藏文件夹") + # 判断是不是原盘文件夹 + bluray_disk_dir = PathUtils.get_bluray_dir(in_path) + if bluray_disk_dir: + file_list = [bluray_disk_dir] + log.info("【Rmt】当前为蓝光原盘文件夹:%s" % str(in_path)) + else: + if str(min_filesize) == "0": + # 不限制大小 + now_filesize = 0 + else: + # 未输入大小限制默认为配置大小限制 + now_filesize = self._min_filesize if not str(min_filesize).isdigit() else int( + min_filesize) * 1024 * 1024 + # 查找目录下的文件 + file_list = PathUtils.get_dir_files(in_path=in_path, + episode_format=episode[0], + exts=RMT_MEDIAEXT, + filesize=now_filesize) + log.debug("【Rmt】文件清单:" + str(file_list)) + if len(file_list) == 0: + log.warn("【Rmt】%s 目录下未找到媒体文件,当前最小文件大小限制为 %s" + % (in_path, StringUtils.str_filesize(now_filesize))) + return __finish_transfer(False, + "目录下未找到媒体文件,当前最小文件大小限制为 %s" + % StringUtils.str_filesize(now_filesize)) + # 传入的是个文件 + else: + if not os.path.exists(in_path): + log.error("【Rmt】文件转移失败,文件不存在:%s" % in_path) + return __finish_transfer(False, "文件不存在") + if os.path.splitext(in_path)[-1].lower() not in RMT_MEDIAEXT: + log.warn("【Rmt】不支持的媒体文件格式,不处理:%s" % in_path) + return __finish_transfer(False, "不支持的媒体文件格式") + # 判断是不是原盘文件夹 + bluray_disk_dir = PathUtils.get_bluray_dir(in_path) + if bluray_disk_dir: + file_list = [bluray_disk_dir] + log.info("【Rmt】当前为蓝光原盘文件夹:%s" % bluray_disk_dir) + else: + file_list = [in_path] + else: + # 传入的是个文件列表,这些文失件是in_path下面的文件 + file_list = files + + # 过滤掉文件列表 + file_list, msg = self.check_ignore(file_list=file_list) + if not file_list: + return __finish_transfer(True, msg) + + # 目录同步模式下,过滤掉文件列表中已处理过的 + if in_from == SyncType.MON: + file_list = list(filter(self.dbhelper.is_transfer_notin_blacklist, file_list)) + if not file_list: + log.info("【Rmt】所有文件均已成功转移过,没有需要处理的文件!如需重新处理,请清理缓存(服务->清理转移缓存)") + return __finish_transfer(True, "没有新文件需要处理") + # API检索出媒体信息,传入一个文件列表,得出每一个文件的名称,这里是当前目录下所有的文件了 + Medias = self.media.get_media_info_on_files(file_list, tmdb_info, media_type, season, episode[0]) + if not Medias: + log.error("【Rmt】检索媒体信息出错!") + return __finish_transfer(False, "检索媒体信息出错") + + # 更新进度 + self.progress.update(ptype="filetransfer", text=f"共 {len(Medias)} 个文件需要处理...") + + # 统计总的文件数、失败文件数、需要提醒的失败数 + failed_count = 0 + alert_count = 0 + alert_messages = [] + total_count = 0 + # 电视剧可能有多集,如果在循环里发消息就太多了,要在外面发消息 + message_medias = {} + # 需要刷新媒体库的清单 + refresh_library_items = [] + # 需要下载字段的清单 + download_subtitle_items = [] + # 处理识别后的每一个文件或单个文件夹 + for file_item, media in Medias.items(): + try: + # 总数量 + total_count = total_count + 1 + + if not udf_flag: + if re.search(r'[./\s\[]+Sample[/.\s\]]+', file_item, re.IGNORECASE): + log.warn("【Rmt】%s 可能是预告片,跳过..." % file_item) + continue + + # 文件名 + file_name = os.path.basename(file_item) + # 更新进度 + self.progress.update(ptype="filetransfer", + value=round(total_count/len(Medias) * 100) - (0.5/len(Medias) * 100), + text="正在处理:%s ..." % file_name) + + # 数据库记录的路径 + if bluray_disk_dir: + reg_path = bluray_disk_dir + else: + reg_path = file_item + # 未识别 + if not media or not media.tmdb_info or not media.get_title_string(): + log.warn("【Rmt】%s 无法识别媒体信息!" % file_name) + success_flag = False + error_message = "无法识别媒体信息" + self.progress.update(ptype="filetransfer", text=error_message) + if udf_flag: + return __finish_transfer(success_flag, error_message) + # 记录未识别 + is_need_insert_unknown = self.dbhelper.is_need_insert_transfer_unknown(reg_path) + if is_need_insert_unknown: + self.dbhelper.insert_transfer_unknown(reg_path, target_dir, rmt_mode) + alert_count += 1 + failed_count += 1 + if error_message not in alert_messages and is_need_insert_unknown: + alert_messages.append(error_message) + # 原样转移过去 + if unknown_dir: + log.warn("【Rmt】%s 按原文件名转移到未识别目录:%s" % (file_name, unknown_dir)) + self.__transfer_origin_file(file_item=file_item, target_dir=unknown_dir, rmt_mode=rmt_mode) + elif self._unknown_path: + unknown_path = self.__get_best_unknown_path(in_path) + if not unknown_path: + continue + log.warn("【Rmt】%s 按原文件名转移到未识别目录:%s" % (file_name, unknown_path)) + self.__transfer_origin_file(file_item=file_item, target_dir=unknown_path, rmt_mode=rmt_mode) + else: + log.error("【Rmt】%s 无法识别媒体信息!" % file_name) + continue + # 当前文件大小 + media.size = os.path.getsize(file_item) + # 目的目录,有输入target_dir时,往这个目录放 + if target_dir: + dist_path = target_dir + else: + dist_path = self.__get_best_target_path(mtype=media.type, in_path=in_path, size=media.size) + if not dist_path: + log.error("【Rmt】文件转移失败,目的路径不存在!") + success_flag = False + error_message = "目的路径不存在" + failed_count += 1 + alert_count += 1 + if error_message not in alert_messages: + alert_messages.append(error_message) + continue + if dist_path and not os.path.exists(dist_path): + return __finish_transfer(False, "目录不存在:%s" % dist_path) + + # 判断文件是否已存在,返回:目录存在标志、目录名、文件存在标志、文件名 + dir_exist_flag, ret_dir_path, file_exist_flag, ret_file_path = self.__is_media_exists(dist_path, media) + # 新文件后缀 + file_ext = os.path.splitext(file_item)[-1] + new_file = ret_file_path + # 已存在的文件数量 + exist_filenum = 0 + handler_flag = False + # 路径存在 + if dir_exist_flag: + # 蓝光原盘 + if bluray_disk_dir: + log.warn("【Rmt】蓝光原盘目录已存在:%s" % ret_dir_path) + if udf_flag: + return __finish_transfer(False, "蓝光原盘目录已存在:%s" % ret_dir_path) + failed_count += 1 + continue + # 文件存在 + if file_exist_flag: + exist_filenum = exist_filenum + 1 + if rmt_mode != RmtMode.SOFTLINK: + if media.size > os.path.getsize(ret_file_path) and self._filesize_cover or udf_flag: + ret_file_path, ret_file_ext = os.path.splitext(ret_file_path) + new_file = "%s%s" % (ret_file_path, file_ext) + old_file = "%s%s" % (ret_file_path, ret_file_ext) + log.info("【Rmt】文件 %s 已存在,覆盖为 %s" % (old_file, new_file)) + ret = self.__transfer_file(file_item=file_item, + new_file=new_file, + rmt_mode=rmt_mode, + over_flag=True, old_file=old_file) + if ret != 0: + success_flag = False + error_message = "文件转移失败,错误码 %s" % ret + self.progress.update(ptype="filetransfer", text=error_message) + if udf_flag: + return __finish_transfer(success_flag, error_message) + failed_count += 1 + alert_count += 1 + if error_message not in alert_messages: + alert_messages.append(error_message) + continue + handler_flag = True + else: + log.warn("【Rmt】文件 %s 已存在" % ret_file_path) + failed_count += 1 + continue + else: + log.warn("【Rmt】文件 %s 已存在" % ret_file_path) + failed_count += 1 + continue + # 路径不存在 + else: + if not ret_dir_path: + log.error("【Rmt】拼装目录路径错误,无法从文件名中识别出季集信息:%s" % file_item) + success_flag = False + error_message = "识别失败,无法从文件名中识别出季集信息" + self.progress.update(ptype="filetransfer", text=error_message) + if udf_flag: + return __finish_transfer(success_flag, error_message) + # 记录未识别 + is_need_insert_unknown = self.dbhelper.is_need_insert_transfer_unknown(reg_path) + if is_need_insert_unknown: + self.dbhelper.insert_transfer_unknown(reg_path, target_dir, rmt_mode) + alert_count += 1 + failed_count += 1 + if error_message not in alert_messages and is_need_insert_unknown: + alert_messages.append(error_message) + continue + else: + # 创建电录 + log.debug("【Rmt】正在创建目录:%s" % ret_dir_path) + os.makedirs(ret_dir_path) + # 转移蓝光原盘 + if bluray_disk_dir: + ret = self.__transfer_bluray_dir(file_item, ret_dir_path, rmt_mode) + if ret != 0: + success_flag = False + error_message = "蓝光目录转移失败,错误码:%s" % ret + self.progress.update(ptype="filetransfer", text=error_message) + if udf_flag: + return __finish_transfer(success_flag, error_message) + failed_count += 1 + alert_count += 1 + if error_message not in alert_messages: + alert_messages.append(error_message) + continue + else: + # 开始转移文件 + if not handler_flag: + if not ret_file_path: + log.error("【Rmt】拼装文件路径错误,无法从文件名中识别出集数:%s" % file_item) + success_flag = False + error_message = "识别失败,无法从文件名中识别出集数" + self.progress.update(ptype="filetransfer", text=error_message) + if udf_flag: + return __finish_transfer(success_flag, error_message) + # 记录未识别 + is_need_insert_unknown = self.dbhelper.is_need_insert_transfer_unknown(reg_path) + if is_need_insert_unknown: + self.dbhelper.insert_transfer_unknown(reg_path, target_dir, rmt_mode) + alert_count += 1 + failed_count += 1 + if error_message not in alert_messages and is_need_insert_unknown: + alert_messages.append(error_message) + continue + new_file = "%s%s" % (ret_file_path, file_ext) + ret = self.__transfer_file(file_item=file_item, + new_file=new_file, + rmt_mode=rmt_mode, + over_flag=False) + if ret != 0: + success_flag = False + error_message = "文件转移失败,错误码 %s" % ret + self.progress.update(ptype="filetransfer", text=error_message) + if udf_flag: + return __finish_transfer(success_flag, error_message) + failed_count += 1 + alert_count += 1 + if error_message not in alert_messages: + alert_messages.append(error_message) + continue + # 媒体库刷新条目:类型-类别-标题-年份 + refresh_item = {"type": media.type, "category": media.category, "title": media.title, + "year": media.year, "target_path": dist_path} + # 登记媒体库刷新 + if refresh_item not in refresh_library_items: + refresh_library_items.append(refresh_item) + # 查询TMDB详情,需要全部数据 + media.set_tmdb_info(self.media.get_tmdb_info(mtype=media.type, + tmdbid=media.tmdb_id, + append_to_response="all")) + # 下载字幕条目 + subtitle_item = {"type": media.type, + "file": ret_file_path, + "file_ext": os.path.splitext(file_item)[-1], + "name": media.en_name if media.en_name else media.cn_name, + "title": media.title, + "year": media.year, + "season": media.begin_season, + "episode": media.begin_episode, + "bluray": True if bluray_disk_dir else False, + "imdbid": media.imdb_id} + # 登记字幕下载 + if subtitle_item not in download_subtitle_items: + download_subtitle_items.append(subtitle_item) + # 转移历史记录 + self.dbhelper.insert_transfer_history( + in_from=in_from, + rmt_mode=rmt_mode, + in_path=reg_path, + out_path=new_file if not bluray_disk_dir else None, + dest=dist_path, + media_info=media) + # 未识别手动识别或历史记录重新识别的批处理模式 + if isinstance(episode[1], bool) and episode[1]: + # 未识别手动识别,更改未识别记录为已处理 + self.dbhelper.update_transfer_unknown_state(file_item) + # 电影立即发送消息 + if media.type == MediaType.MOVIE: + self.message.send_transfer_movie_message(in_from, + media, + exist_filenum, + self._movie_category_flag) + # 否则登记汇总发消息 + else: + # 按季汇总 + message_key = "%s-%s" % (media.get_title_string(), media.get_season_string()) + if not message_medias.get(message_key): + message_medias[message_key] = media + # 汇总集数、大小 + if not message_medias[message_key].is_in_episode(media.get_episode_list()): + message_medias[message_key].total_episodes += media.total_episodes + message_medias[message_key].size += media.size + # 生成nfo及poster + if self._scraper_flag: + # 生成刮削文件 + self.scraper.gen_scraper_files(media=media, + scraper_nfo=self._scraper_nfo, + scraper_pic=self._scraper_pic, + dir_path=ret_dir_path, + file_name=os.path.basename(ret_file_path), + file_ext=file_ext) + # 更新进度 + self.progress.update(ptype="filetransfer", + value=round(total_count / len(Medias) * 100), + text="%s 转移完成" % file_name) + # 移动模式随机休眠(兼容一些网盘挂载目录) + if rmt_mode == RmtMode.MOVE: + sleep(round(random.uniform(0, 1), 1)) + + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("【Rmt】文件转移时发生错误:%s - %s" % (str(err), traceback.format_exc())) + # 循环结束 + # 统计完成情况,发送通知 + if message_medias: + self.message.send_transfer_tv_message(message_medias, in_from) + # 刷新媒体库 + if refresh_library_items and self._refresh_mediaserver: + self.mediaserver.refresh_library_by_items(refresh_library_items) + # 启新进程下载字幕 + if download_subtitle_items: + self.threadhelper.start_thread(Subtitle().download_subtitle, (download_subtitle_items,)) + # 总结 + log.info("【Rmt】%s 处理完成,总数:%s,失败:%s" % (in_path, total_count, failed_count)) + if alert_count > 0: + self.message.send_transfer_fail_message(in_path, alert_count, "、".join(alert_messages)) + elif failed_count == 0: + # 删除空目录 + if rmt_mode == RmtMode.MOVE \ + and os.path.exists(in_path) \ + and os.path.isdir(in_path) \ + and not root_path \ + and not PathUtils.get_dir_files(in_path=in_path, exts=RMT_MEDIAEXT) \ + and not PathUtils.get_dir_files(in_path=in_path, exts=['.!qb', '.part']): + log.info("【Rmt】目录下已无媒体文件及正在下载的文件,移动模式下删除目录:%s" % in_path) + shutil.rmtree(in_path) + return __finish_transfer(success_flag, error_message) + + def transfer_manually(self, s_path, t_path, mode): + """ + 全量转移,用于使用命令调用 + :param s_path: 源目录 + :param t_path: 目的目录 + :param mode: 转移方式 + """ + if not s_path: + return + if not os.path.exists(s_path): + print("【Rmt】源目录不存在:%s" % s_path) + return + if t_path: + if not os.path.exists(t_path): + print("【Rmt】目的目录不存在:%s" % t_path) + return + rmt_mode = ModuleConf.RMT_MODES.get(mode) + if not rmt_mode: + print("【Rmt】转移模式错误!") + return + print("【Rmt】转移模式为:%s" % rmt_mode.value) + print("【Rmt】正在转移以下目录中的全量文件:%s" % s_path) + for path in PathUtils.get_dir_level1_medias(s_path, RMT_MEDIAEXT): + if PathUtils.is_invalid_path(path): + continue + ret, ret_msg = self.transfer_media(in_from=SyncType.MAN, + in_path=path, + target_dir=t_path, + rmt_mode=rmt_mode) + if not ret: + print("【Rmt】%s 处理失败:%s" % (path, ret_msg)) + + def __is_media_exists(self, + media_dest, + media): + """ + 判断媒体文件是否忆存在 + :param media_dest: 媒体文件所在目录 + :param media: 已识别的媒体信息 + :return: 目录是否存在,目录路径,文件是否存在,文件路径 + """ + # 返回变量 + dir_exist_flag = False + file_exist_flag = False + ret_dir_path = None + ret_file_path = None + # 电影 + if media.type == MediaType.MOVIE: + # 目录名称 + dir_name, file_name = self.get_moive_dest_path(media) + # 默认目录路径 + file_path = os.path.join(media_dest, dir_name) + # 开启分类时目录路径 + if self._movie_category_flag: + file_path = os.path.join(media_dest, media.category, dir_name) + for m_type in [RMT_FAVTYPE, media.category]: + type_path = os.path.join(media_dest, m_type, dir_name) + # 目录是否存在 + if os.path.exists(type_path): + file_path = type_path + break + # 返回路径 + ret_dir_path = file_path + # 路径存在标志 + if os.path.exists(file_path): + dir_exist_flag = True + # 文件路径 + file_dest = os.path.join(file_path, file_name) + # 返回文件路径 + ret_file_path = file_dest + # 文件是否存在 + for ext in RMT_MEDIAEXT: + ext_dest = "%s%s" % (file_dest, ext) + if os.path.exists(ext_dest): + file_exist_flag = True + ret_file_path = ext_dest + break + # 电视剧或者动漫 + else: + # 目录名称 + dir_name, season_name, file_name = self.get_tv_dest_path(media) + # 剧集目录 + if (media.type == MediaType.TV and self._tv_category_flag) or ( + media.type == MediaType.ANIME and self._anime_category_flag): + media_path = os.path.join(media_dest, media.category, dir_name) + else: + media_path = os.path.join(media_dest, dir_name) + # 季 + if media.get_season_list(): + # 季路径 + season_dir = os.path.join(media_path, season_name) + # 返回目录路径 + ret_dir_path = season_dir + # 目录是否存在 + if os.path.exists(season_dir): + dir_exist_flag = True + # 处理集 + episodes = media.get_episode_list() + if episodes: + # 集文件路径 + file_path = os.path.join(season_dir, file_name) + # 返回文件路径 + ret_file_path = file_path + # 文件存在标志 + for ext in RMT_MEDIAEXT: + ext_dest = "%s%s" % (file_path, ext) + if os.path.exists(ext_dest): + file_exist_flag = True + ret_file_path = ext_dest + break + return dir_exist_flag, ret_dir_path, file_exist_flag, ret_file_path + + def transfer_embyfav(self, item_path): + """ + Emby/Jellyfin点红星后转移电影文件到精选分类 + :param item_path: 文件路径 + """ + if not item_path: + return False + if not self._movie_category_flag or not self._movie_path: + return False + if os.path.isdir(item_path): + movie_dir = item_path + else: + movie_dir = os.path.dirname(item_path) + # 已经是精选下的不处理 + movie_type = os.path.basename(os.path.dirname(movie_dir)) + if movie_type == RMT_FAVTYPE \ + or movie_type not in self.category.get_movie_categorys(): + return False + movie_name = os.path.basename(movie_dir) + movie_path = self.__get_best_target_path(mtype=MediaType.MOVIE, in_path=movie_dir) + # 开始转移文件,转移到同目录下的精选目录 + org_path = os.path.join(movie_path, movie_type, movie_name) + new_path = os.path.join(movie_path, RMT_FAVTYPE, movie_name) + if os.path.exists(org_path): + log.info("【Rmt】开始转移文件 %s 到 %s ..." % (org_path, new_path)) + if os.path.exists(new_path): + log.info("【Rmt】目录 %s 已存在" % new_path) + return False + ret, retmsg = SystemUtils.move(org_path, new_path) + if ret == 0: + return True + else: + log.error("【Rmt】%s" % retmsg) + else: + log.error("【Rmt】%s 目录不存在" % org_path) + return False + + def get_dest_path_by_info(self, dest, meta_info): + """ + 拼装转移重命名后的新文件地址 + :param dest: 目的目录 + :param meta_info: 媒体信息 + """ + if not dest or not meta_info: + return None + if meta_info.type == MediaType.MOVIE: + dir_name, _ = self.get_moive_dest_path(meta_info) + if self._movie_category_flag: + return os.path.join(dest, meta_info.category, dir_name) + else: + return os.path.join(dest, dir_name) + else: + dir_name, season_name, _ = self.get_tv_dest_path(meta_info) + if self._tv_category_flag: + return os.path.join(dest, meta_info.category, dir_name, season_name) + else: + return os.path.join(dest, dir_name, season_name) + + def get_no_exists_medias(self, meta_info, season=None, total_num=None): + """ + 根据媒体库目录结构,判断媒体是否存在 + :param meta_info: 已识别的媒体信息 + :param season: 季号,数字,剧集时需要 + :param total_num: 该季总集数,剧集时需要 + :return: 如果是电影返回已存在的电影清单:title、year,如果是剧集,则返回不存在的集的清单 + """ + # 电影 + if meta_info.type == MediaType.MOVIE: + dir_name, _ = self.get_moive_dest_path(meta_info) + for dest_path in self._movie_path: + # 判断精选 + fav_path = os.path.join(dest_path, RMT_FAVTYPE, dir_name) + fav_files = PathUtils.get_dir_files(fav_path, RMT_MEDIAEXT) + # 其它分类 + if self._movie_category_flag: + dest_path = os.path.join(dest_path, meta_info.category, dir_name) + else: + dest_path = os.path.join(dest_path, dir_name) + files = PathUtils.get_dir_files(dest_path, RMT_MEDIAEXT) + if len(files) > 0 or len(fav_files) > 0: + return [{'title': meta_info.title, 'year': meta_info.year}] + return [] + # 电视剧 + else: + dir_name, season_name, _ = self.get_tv_dest_path(meta_info) + if not season or not total_num: + return [] + if meta_info.type == MediaType.ANIME: + dest_paths = self._anime_path + category_flag = self._anime_category_flag + else: + dest_paths = self._tv_path + category_flag = self._tv_category_flag + # 总需要的集 + total_episodes = [episode for episode in range(1, total_num + 1)] + # 已存在的集 + exists_episodes = [] + for dest_path in dest_paths: + if category_flag: + dest_path = os.path.join(dest_path, meta_info.category, dir_name, season_name) + else: + dest_path = os.path.join(dest_path, dir_name, season_name) + # 目录不存在 + if not os.path.exists(dest_path): + continue + files = PathUtils.get_dir_files(dest_path, RMT_MEDIAEXT) + for file in files: + file_meta_info = MetaInfo(os.path.basename(file)) + if not file_meta_info.get_season_list() or not file_meta_info.get_episode_list(): + continue + if file_meta_info.get_name() != meta_info.title: + continue + if not file_meta_info.is_in_season(season): + continue + exists_episodes = list(set(exists_episodes).union(set(file_meta_info.get_episode_list()))) + return list(set(total_episodes).difference(set(exists_episodes))) + + def __get_best_target_path(self, mtype, in_path=None, size=0): + """ + 查询一个最好的目录返回,有in_path时找与in_path同路径的,没有in_path时,顺序查找1个符合大小要求的,没有in_path和size时,返回第1个 + :param mtype: 媒体类型:电影、电视剧、动漫 + :param in_path: 源目录 + :param size: 文件大小 + """ + if not mtype: + return None + if mtype == MediaType.MOVIE: + dest_paths = self._movie_path + elif mtype == MediaType.TV: + dest_paths = self._tv_path + else: + dest_paths = self._anime_path + if not dest_paths: + return None + if not isinstance(dest_paths, list): + return dest_paths + if isinstance(dest_paths, list) and len(dest_paths) == 1: + return dest_paths[0] + # 有输入路径的,匹配有共同上级路径的 + if in_path: + # 先用自定义规则匹配 找同级目录最多的路径 + max_return_path = None + max_path_len = 0 + for dest_path in dest_paths: + try: + path_len = len(os.path.commonpath([in_path, dest_path])) + if path_len > max_path_len: + max_path_len = path_len + max_return_path = dest_path + except Exception as err: + ExceptionUtils.exception_traceback(err) + continue + if max_return_path: + return max_return_path + # 有输入大小的,匹配第1个满足空间存储要求的 + if size: + for path in dest_paths: + disk_free_size = SystemUtils.get_free_space_gb(path) + if float(disk_free_size) > float(size / 1024 / 1024 / 1024): + return path + # 默认返回第1个 + return dest_paths[0] + + def __get_best_unknown_path(self, in_path): + """ + 查找最合适的unknown目录 + :param in_path: 源目录 + """ + if not self._unknown_path: + return None + for unknown_path in self._unknown_path: + if os.path.commonpath([in_path, unknown_path]) not in ["/", "\\"]: + return unknown_path + return self._unknown_path[0] + + def link_sync_file(self, src_path, in_file, target_dir, sync_transfer_mode): + """ + 对文件做纯链接处理,不做识别重命名,则监控模块调用 + :param : 来源渠道 + :param src_path: 源目录 + :param in_file: 源文件 + :param target_dir: 目的目录 + :param sync_transfer_mode: 明确的转移方式 + """ + new_file = in_file.replace(src_path, target_dir) + new_file_list, msg = self.check_ignore(file_list=[new_file]) + if not new_file_list: + return 0, msg + else: + new_file = new_file_list[0] + new_dir = os.path.dirname(new_file) + if not os.path.exists(new_dir): + os.makedirs(new_dir) + return self.__transfer_command(file_item=in_file, + target_file=new_file, + rmt_mode=sync_transfer_mode), "" + + def get_format_dict(self, media): + """ + 根据媒体信息,返回Format字典 + """ + if not media: + return {} + episode_title = self.media.get_episode_title(media) + # 此处使用独立对象,避免影响语言 + en_title = Media().get_tmdb_en_title(media) + return { + "title": StringUtils.clear_file_name(media.title), + "en_title": StringUtils.clear_file_name(en_title), + "original_name": StringUtils.clear_file_name(os.path.splitext(media.org_string or "")[0]), + "original_title": StringUtils.clear_file_name(media.original_title), + "name": StringUtils.clear_file_name(media.get_name()), + "year": media.year, + "edition": media.get_edtion_string() or None, + "videoFormat": media.resource_pix, + "releaseGroup": media.resource_team, + "effect": media.resource_effect, + "videoCodec": media.video_encode, + "audioCodec": media.audio_encode, + "tmdbid": media.tmdb_id, + "season": media.get_season_seq(), + "episode": media.get_episode_seqs(), + "episode_title": StringUtils.clear_file_name(episode_title), + "season_episode": "%s%s" % (media.get_season_item(), media.get_episode_items()), + "part": media.part + } + + def get_moive_dest_path(self, media_info): + """ + 计算电影文件路径 + :return: 电影目录、电影名称 + """ + format_dict = self.get_format_dict(media_info) + dir_name = re.sub(r"[-_\s.]*None", "", self._movie_dir_rmt_format.format(**format_dict)) + file_name = re.sub(r"[-_\s.]*None", "", self._movie_file_rmt_format.format(**format_dict)) + return dir_name, file_name + + def get_tv_dest_path(self, media_info): + """ + 计算电视剧文件路径 + :return: 电视剧目录、季目录、集名称 + """ + format_dict = self.get_format_dict(media_info) + dir_name = re.sub(r"[-_\s.]*None", "", self._tv_dir_rmt_format.format(**format_dict)) + season_name = re.sub(r"[-_\s.]*None", "", self._tv_season_rmt_format.format(**format_dict)) + file_name = re.sub(r"[-_\s.]*None", "", self._tv_file_rmt_format.format(**format_dict)) + return dir_name, season_name, file_name + + def check_ignore(self, file_list): + """ + 检查过滤文件列表中忽略项目 + :param file_list: 文件路径列表 + """ + if not file_list: + return [], "" + # 过滤掉文件列表中文件路径包含文件路径转移忽略词的 + if self._ignored_paths: + try: + for file in file_list[:]: + if re.findall(self._ignored_paths, os.path.dirname(file)): + log.info(f"【Rmt】{file} 文件路径含转移忽略词,已忽略转移") + file_list.remove(file) + if not file_list: + return [], "排除文件路径转移忽略词后,没有新文件需要处理" + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("【Rmt】文件路径转移忽略词设置有误:%s" % str(err)) + + # 过滤掉文件列表中文件名包含文件名转移忽略词的 + if self._ignored_files: + try: + for file in file_list[:]: + if re.findall(self._ignored_files, os.path.basename(file)): + log.info(f"【Rmt】{file} 文件名包含转移忽略词,已忽略转移") + file_list.remove(file) + if not file_list: + return [], "排除文件名转移忽略词后,没有新文件需要处理" + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("【Rmt】文件名转移忽略词设置有误:%s" % str(err)) + + return file_list, "" + + def get_media_exists_flag(self, mtype, title, year, mediaid): + """ + 获取媒体存在标记:是否存在、是否订阅 + :param: mtype 媒体类型 + :param: title 媒体标题 + :param: year 媒体年份 + :param: mediaid TMDBID/DB:豆瓣ID/BG:Bangumi的ID + :return: 1-已订阅/2-已下载/0-不存在未订阅, RSSID + """ + if str(mediaid).isdigit(): + tmdbid = mediaid + else: + tmdbid = None + if mtype in ["MOV", "电影", MediaType.MOVIE]: + rssid = self.dbhelper.get_rss_movie_id(title=title, year=year, tmdbid=tmdbid) + else: + if not tmdbid: + meta_info = MetaInfo(title=title) + title = meta_info.get_name() + season = meta_info.get_season_string() + if season: + year = None + else: + season = None + rssid = self.dbhelper.get_rss_tv_id(title=title, year=year, season=season, tmdbid=tmdbid) + if rssid: + # 已订阅 + fav = "1" + elif MediaServer().check_item_exists(title=title, year=year, tmdbid=tmdbid): + # 已下载 + fav = "2" + else: + # 未订阅、未下载 + fav = "0" + return fav, rssid + + +if __name__ == "__main__": + """ + 手工转移时,使用命名行调用 + """ + Config().init_syspath() + + parser = argparse.ArgumentParser(description='文件转移工具') + parser.add_argument('-m', '--mode', dest='mode', required=True, + help='转移模式:link copy softlink move rclone rclonecopy minio miniocopy') + parser.add_argument('-s', '--source', dest='s_path', required=True, help='硬链接源目录路径') + parser.add_argument('-d', '--target', dest='t_path', required=False, help='硬链接目的目录路径') + args = parser.parse_args() + if os.environ.get('NASTOOL_CONFIG'): + print("【Rmt】配置文件地址:%s" % os.environ.get('NASTOOL_CONFIG')) + print("【Rmt】源目录路径:%s" % args.s_path) + if args.t_path: + print("【Rmt】目的目录路径:%s" % args.t_path) + else: + print("【Rmt】目的目录为配置文件中的电影、电视剧媒体库目录") + FileTransfer().transfer_manually(args.s_path, args.t_path, args.mode) + else: + print("【Rmt】未设置环境变量,请先设置 NASTOOL_CONFIG 环境变量为配置文件地址") diff --git a/app/filter.py b/app/filter.py new file mode 100644 index 0000000..9d6c9d8 --- /dev/null +++ b/app/filter.py @@ -0,0 +1,322 @@ +import re + +from app.conf import ModuleConf +from app.helper import DbHelper +from app.media.meta import ReleaseGroupsMatcher +from app.utils import StringUtils +from app.utils.commons import singleton +from app.utils.types import MediaType + + +@singleton +class Filter: + rg_matcher = None + dbhelper = None + _groups = [] + _rules = [] + + def __init__(self): + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.rg_matcher = ReleaseGroupsMatcher() + self._groups = self.dbhelper.get_config_filter_group() + self._rules = self.dbhelper.get_config_filter_rule() + + def get_rule_groups(self, groupid=None, default=False): + """ + 获取所有规则组 + """ + ret_groups = [] + for group in self._groups: + group_info = { + "id": group.ID, + "name": group.GROUP_NAME, + "default": group.IS_DEFAULT, + "note": group.NOTE + } + if (groupid and str(groupid) == str(group.ID)) \ + or (default and group.IS_DEFAULT == "Y"): + return group_info + ret_groups.append(group_info) + if groupid or default: + return {} + return ret_groups + + def get_rule_infos(self): + """ + 获取所有的规则组及组内的规则 + """ + groups = self.get_rule_groups() + for group in groups: + group['rules'] = self.get_rules(group.get("id")) + return groups + + def get_rules(self, groupid, ruleid=None): + """ + 获取过滤规则 + """ + if not groupid: + return [] + ret_rules = [] + for rule in self._rules: + rule_info = { + "id": rule.ID, + "group": rule.GROUP_ID, + "name": rule.ROLE_NAME, + "pri": rule.PRIORITY or 0, + "include": rule.INCLUDE.split("\n") if rule.INCLUDE else [], + "exclude": rule.EXCLUDE.split("\n") if rule.EXCLUDE else [], + "size": rule.SIZE_LIMIT, + "free": rule.NOTE, + "free_text": { + "1.0 1.0": "普通", + "1.0 0.0": "免费", + "2.0 0.0": "2X免费" + }.get(rule.NOTE, "全部") if rule.NOTE else "" + } + if str(rule.GROUP_ID) == str(groupid) \ + and (not ruleid or int(ruleid) == rule.ID): + ret_rules.append(rule_info) + if ruleid: + return ret_rules[0] if ret_rules else {} + return ret_rules + + def get_rule_first_order(self, rulegroup): + """ + 获取规则的最高优先级 + """ + if not rulegroup: + rulegroup = self.get_rule_groups(default=True) + first_order = min([int(rule_info.get("pri")) for rule_info in self.get_rules(groupid=rulegroup)] or [0]) + return 100 - first_order + + def check_rules(self, meta_info, rulegroup=None): + """ + 检查种子是否匹配站点过滤规则:排除规则、包含规则,优先规则 + :param meta_info: 识别的信息 + :param rulegroup: 规则组ID + :return: 是否匹配,匹配的优先值,规则名称,值越大越优先 + """ + if not meta_info: + return False, 0, "" + # 为-1时不使用过滤规则 + if rulegroup and int(rulegroup) == -1: + return True, 0, "不过滤" + if meta_info.subtitle: + title = "%s %s" % (meta_info.org_string, meta_info.subtitle) + else: + title = meta_info.org_string + if not rulegroup: + rulegroup = self.get_rule_groups(default=True) + if not rulegroup: + return True, 0, "未配置过滤规则" + else: + rulegroup = self.get_rule_groups(groupid=rulegroup) + filters = self.get_rules(groupid=rulegroup.get("id")) + # 命中优先级 + order_seq = 0 + # 当前规则组是否命中 + group_match = True + for filter_info in filters: + # 当前规则是否命中 + rule_match = True + # 命中规则的序号 + order_seq = 100 - int(filter_info.get('pri')) + # 必须包括的项 + includes = filter_info.get('include') + if includes and rule_match: + include_flag = True + for include in includes: + if not include: + continue + if not re.search(r'%s' % include.strip(), title, re.IGNORECASE): + include_flag = False + break + if not include_flag: + rule_match = False + + # 不能包含的项 + excludes = filter_info.get('exclude') + if excludes and rule_match: + exclude_flag = False + exclude_count = 0 + for exclude in excludes: + if not exclude: + continue + exclude_count += 1 + if not re.search(r'%s' % exclude.strip(), title, re.IGNORECASE): + exclude_flag = True + if exclude_count > 0 and not exclude_flag: + rule_match = False + # 大小 + sizes = filter_info.get('size') + if sizes and rule_match and meta_info.size: + meta_info.size = StringUtils.num_filesize(meta_info.size) + if sizes.find(',') != -1: + sizes = sizes.split(',') + if sizes[0].isdigit(): + begin_size = int(sizes[0].strip()) + else: + begin_size = 0 + if sizes[1].isdigit(): + end_size = int(sizes[1].strip()) + else: + end_size = 0 + else: + begin_size = 0 + if sizes.isdigit(): + end_size = int(sizes.strip()) + else: + end_size = 0 + if meta_info.type == MediaType.MOVIE: + if not begin_size * 1024 ** 3 <= int(meta_info.size) <= end_size * 1024 ** 3: + rule_match = False + else: + if meta_info.total_episodes \ + and not begin_size * 1024 ** 3 <= int(meta_info.size) / int(meta_info.total_episodes) <= end_size * 1024 ** 3: + rule_match = False + + # 促销 + free = filter_info.get("free") + if free and meta_info.upload_volume_factor is not None and meta_info.download_volume_factor is not None: + ul_factor, dl_factor = free.split() + if float(ul_factor) > meta_info.upload_volume_factor \ + or float(dl_factor) < meta_info.download_volume_factor: + rule_match = False + + if rule_match: + return True, order_seq, rulegroup.get("name") + else: + group_match = False + if not group_match: + return False, 0, rulegroup.get("name") + return True, order_seq, rulegroup.get("name") + + def is_rule_free(self, rulegroup=None): + """ + 判断规则中是否需要Free检测 + """ + if not rulegroup: + rulegroup = self.get_rule_groups(default=True) + if not rulegroup: + return True, 0, "" + else: + rulegroup = self.get_rule_groups(groupid=rulegroup) + filters = self.get_rules(groupid=rulegroup.get("id")) + for filter_info in filters: + if filter_info.get("free"): + return True + return False + + @staticmethod + def is_torrent_match_sey(media_info, s_num, e_num, year_str): + """ + 种子名称关键字匹配 + :param media_info: 已识别的种子信息 + :param s_num: 要匹配的季号,为空则不匹配 + :param e_num: 要匹配的集号,为空则不匹配 + :param year_str: 要匹配的年份,为空则不匹配 + :return: 是否命中 + """ + if s_num: + if not media_info.get_season_list(): + return False + if not isinstance(s_num, list): + s_num = [s_num] + if not set(s_num).issuperset(set(media_info.get_season_list())): + return False + if e_num: + if not isinstance(e_num, list): + e_num = [e_num] + if not set(e_num).issuperset(set(media_info.get_episode_list())): + return False + if year_str: + if str(media_info.year) != str(year_str): + return False + return True + + def check_torrent_filter(self, + meta_info, + filter_args, + uploadvolumefactor=None, + downloadvolumefactor=None): + """ + 对种子进行过滤 + :param meta_info: 名称识别后的MetaBase对象 + :param filter_args: 过滤条件的字典 + :param uploadvolumefactor: 种子的上传因子 传空不过滤 + :param downloadvolumefactor: 种子的下载因子 传空不过滤 + :return: 是否匹配,匹配的优先值,匹配信息,值越大越优先 + """ + # 过滤质量 + if filter_args.get("restype"): + restype_re = ModuleConf.TORRENT_SEARCH_PARAMS["restype"].get(filter_args.get("restype")) + if not meta_info.get_edtion_string(): + return False, 0, f"{meta_info.org_string} 不符合质量 {filter_args.get('restype')} 要求" + if restype_re and not re.search(r"%s" % restype_re, meta_info.get_edtion_string(), re.I): + return False, 0, f"{meta_info.org_string} 不符合质量 {filter_args.get('restype')} 要求" + # 过滤分辨率 + if filter_args.get("pix"): + pix_re = ModuleConf.TORRENT_SEARCH_PARAMS["pix"].get(filter_args.get("pix")) + if not meta_info.resource_pix: + return False, 0, f"{meta_info.org_string} 不符合分辨率 {filter_args.get('pix')} 要求" + if pix_re and not re.search(r"%s" % pix_re, meta_info.resource_pix, re.I): + return False, 0, f"{meta_info.org_string} 不符合分辨率 {filter_args.get('pix')} 要求" + # 过滤制作组/字幕组 + if filter_args.get("team"): + team = filter_args.get("team") + if not meta_info.resource_team: + resource_team = self.rg_matcher.match( + title=meta_info.org_string, + groups=team) + if not resource_team: + return False, 0, f"{meta_info.org_string} 不符合制作组/字幕组 {team} 要求" + else: + meta_info.resource_team = resource_team + elif not re.search(r"%s" % team, meta_info.resource_team, re.I): + return False, 0, f"{meta_info.org_string} 不符合制作组/字幕组 {team} 要求" + # 过滤促销 + if filter_args.get("sp_state"): + ul_factor, dl_factor = filter_args.get("sp_state").split() + if uploadvolumefactor and ul_factor not in ("*", str(uploadvolumefactor)): + return False, 0, f"{meta_info.org_string} 不符合促销要求" + if downloadvolumefactor and dl_factor not in ("*", str(downloadvolumefactor)): + return False, 0, f"{meta_info.org_string} 不符合促销要求" + # 过滤包含 + if filter_args.get("include"): + include = filter_args.get("include") + if not re.search(r"%s" % include, meta_info.org_string, re.I): + return False, 0, f"{meta_info.org_string} 不符合包含 {include} 要求" + # 过滤排除 + if filter_args.get("exclude"): + exclude = filter_args.get("exclude") + if re.search(r"%s" % exclude, meta_info.org_string, re.I): + return False, 0, f"{meta_info.org_string} 不符合排除 {exclude} 要求" + # 过滤关键字 + if filter_args.get("key"): + key = filter_args.get("key") + if not re.search(r"%s" % key, meta_info.org_string, re.I): + return False, 0, f"{meta_info.org_string} 不符合 {key} 要求" + # 过滤过滤规则,-1表示不使用过滤规则,空则使用默认过滤规则 + if filter_args.get("rule"): + # 已设置默认规则 + match_flag, order_seq, rule_name = self.check_rules(meta_info, filter_args.get("rule")) + match_msg = "%s 大小:%s 促销:%s 不符合订阅/站点过滤规则 %s 要求" % ( + meta_info.org_string, + StringUtils.str_filesize(meta_info.size), + meta_info.get_volume_factor_string(), + rule_name + ) + return match_flag, order_seq, match_msg + else: + # 默认过滤规则 + match_flag, order_seq, rule_name = self.check_rules(meta_info) + match_msg = "%s 大小:%s 促销:%s 不符合默认过滤规则 %s 要求" % ( + meta_info.org_string, + StringUtils.str_filesize(meta_info.size), + meta_info.get_volume_factor_string(), + rule_name + ) + return match_flag, order_seq, match_msg diff --git a/app/helper/__init__.py b/app/helper/__init__.py new file mode 100644 index 0000000..f323800 --- /dev/null +++ b/app/helper/__init__.py @@ -0,0 +1,16 @@ +from .chrome_helper import ChromeHelper +from .indexer_helper import IndexerHelper, IndexerConf +from .meta_helper import MetaHelper +from .progress_helper import ProgressHelper +from .security_helper import SecurityHelper +from .thread_helper import ThreadHelper +from .db_helper import DbHelper +from .dict_helper import DictHelper +from .display_helper import DisplayHelper +from .site_helper import SiteHelper +from .ocr_helper import OcrHelper +from .opensubtitles import OpenSubtitles +from .words_helper import WordsHelper +from .submodule_helper import SubmoduleHelper +from .cookiecloud_helper import CookieCloudHelper +from .ffmpeg_helper import FfmpegHelper diff --git a/app/helper/chrome_helper.py b/app/helper/chrome_helper.py new file mode 100644 index 0000000..8c9817a --- /dev/null +++ b/app/helper/chrome_helper.py @@ -0,0 +1,240 @@ +import json +import os.path +import tempfile +import time +from functools import reduce +from threading import Lock + +import undetected_chromedriver as uc +from webdriver_manager.chrome import ChromeDriverManager + +from app.utils import SystemUtils, RequestUtils + +lock = Lock() + +driver_executable_path = None + + +class ChromeHelper(object): + _executable_path = None + + _chrome = None + _headless = False + + def __init__(self, headless=False): + + self._executable_path = SystemUtils.get_webdriver_path() or driver_executable_path + + if SystemUtils.is_windows(): + self._headless = False + elif not os.environ.get("NASTOOL_DISPLAY"): + self._headless = True + else: + self._headless = headless + + def init_driver(self): + if self._executable_path: + return + if not uc.find_chrome_executable(): + return + global driver_executable_path + driver_executable_path = ChromeDriverManager().install() + + @property + def browser(self): + with lock: + if not self._chrome: + self._chrome = self.__get_browser() + return self._chrome + + def get_status(self): + if not self._executable_path: + return False + if self._executable_path \ + and not os.path.exists(self._executable_path): + return False + if not uc.find_chrome_executable(): + return False + return True + + def __get_browser(self): + if not self.get_status(): + return None + options = uc.ChromeOptions() + options.add_argument('--disable-gpu') + options.add_argument('--no-sandbox') + options.add_argument('--ignore-certificate-errors') + options.add_argument('--disable-dev-shm-usage') + options.add_argument("--start-maximized") + options.add_argument("--disable-blink-features=AutomationControlled") + options.add_argument("--disable-extensions") + options.add_argument("--disable-plugins-discovery") + options.add_argument('--no-first-run') + options.add_argument('--no-service-autorun') + options.add_argument('--no-default-browser-check') + options.add_argument('--password-store=basic') + if self._headless: + options.add_argument('--headless') + prefs = { + "useAutomationExtension": False, + "profile.managed_default_content_settings.images": 2 if self._headless else 1, + "excludeSwitches": ["enable-automation"] + } + options.add_experimental_option("prefs", prefs) + chrome = ChromeWithPrefs(options=options, driver_executable_path=self._executable_path) + chrome.set_page_load_timeout(30) + return chrome + + def visit(self, url, ua=None, cookie=None, timeout=30): + if not self.browser: + return False + try: + if ua: + self._chrome.execute_cdp_cmd("Emulation.setUserAgentOverride", { + "userAgent": ua + }) + if timeout: + self._chrome.implicitly_wait(timeout) + self._chrome.get(url) + if cookie: + self._chrome.delete_all_cookies() + for cookie in RequestUtils.cookie_parse(cookie, array=True): + self._chrome.add_cookie(cookie) + self._chrome.get(url) + return True + except Exception as err: + print(str(err)) + return False + + def new_tab(self, url, ua=None, cookie=None): + if not self._chrome: + return False + # 新开一个标签页 + try: + self._chrome.switch_to.new_window('tab') + except Exception as err: + print(str(err)) + return False + # 访问URL + return self.visit(url=url, ua=ua, cookie=cookie) + + def close_tab(self): + try: + self._chrome.close() + self._chrome.switch_to.window(self._chrome.window_handles[0]) + except Exception as err: + print(str(err)) + return False + + def pass_cloudflare(self, waittime=10): + cloudflare = False + for i in range(0, waittime): + if self.get_title() != "Just a moment...": + cloudflare = True + break + time.sleep(1) + return cloudflare + + def execute_script(self, script): + if not self._chrome: + return False + try: + return self._chrome.execute_script(script) + except Exception as err: + print(str(err)) + + def get_title(self): + if not self._chrome: + return "" + return self._chrome.title + + def get_html(self): + if not self._chrome: + return "" + return self._chrome.page_source + + def get_cookies(self): + if not self._chrome: + return "" + cookie_str = "" + try: + for _cookie in self._chrome.get_cookies(): + if not _cookie: + continue + cookie_str += "%s=%s;" % (_cookie.get("name"), _cookie.get("value")) + except Exception as err: + print(str(err)) + return cookie_str + + def get_ua(self): + try: + return self._chrome.execute_script("return navigator.userAgent") + except Exception as err: + print(str(err)) + return None + + def quit(self): + if self._chrome: + self._chrome.close() + self._chrome.quit() + self._fixup_uc_pid_leak() + self._chrome = None + + def _fixup_uc_pid_leak(self): + """ + uc 在处理退出时为强制kill进程,没有调用wait,会导致出现僵尸进程,此处增加wait,确保系统正常回收 + :return: + """ + try: + # chromedriver 进程 + if hasattr(self._chrome, "service") and getattr(self._chrome.service, "process", None): + self._chrome.service.process.wait(3) + # chrome 进程 + os.waitpid(self._chrome.browser_pid, 0) + except Exception as e: + print(str(e)) + pass + + def __del__(self): + self.quit() + + +class ChromeWithPrefs(uc.Chrome): + def __init__(self, *args, options=None, **kwargs): + if options: + self._handle_prefs(options) + super().__init__(*args, options=options, **kwargs) + # remove the user_data_dir when quitting + self.keep_user_data_dir = False + + @staticmethod + def _handle_prefs(options): + if prefs := options.experimental_options.get("prefs"): + # turn a (dotted key, value) into a proper nested dict + def undot_key(key, value): + if "." in key: + key, rest = key.split(".", 1) + value = undot_key(rest, value) + return {key: value} + + # undot prefs dict keys + undot_prefs = reduce( + lambda d1, d2: {**d1, **d2}, # merge dicts + (undot_key(key, value) for key, value in prefs.items()), + ) + + # create a user_data_dir and add its path to the options + user_data_dir = os.path.normpath(tempfile.mkdtemp()) + options.add_argument(f"--user-data-dir={user_data_dir}") + + # create the preferences json file in its default directory + default_dir = os.path.join(user_data_dir, "Default") + os.mkdir(default_dir) + + prefs_file = os.path.join(default_dir, "Preferences") + with open(prefs_file, encoding="latin1", mode="w") as f: + json.dump(undot_prefs, f) + + # pylint: disable=protected-access + # remove the experimental_options to avoid an error + del options._experimental_options["prefs"] diff --git a/app/helper/cookiecloud_helper.py b/app/helper/cookiecloud_helper.py new file mode 100644 index 0000000..7c9b5ae --- /dev/null +++ b/app/helper/cookiecloud_helper.py @@ -0,0 +1,41 @@ +import json + +from app.utils import RequestUtils, StringUtils + + +class CookieCloudHelper(object): + _req = None + _server = None + _key = None + _password = None + + def __init__(self, server, key, password): + self._server = server + if self._server: + if not self._server.startswith("http"): + self._server = "http://%s" % self._server + if self._server.endswith("/"): + self._server = self._server[:-1] + self._key = key + self._password = password + self._req = RequestUtils(content_type="application/json") + + def download_data(self): + """ + 从CookieCloud下载数据 + """ + if not self._server or not self._key or not self._password: + return {}, "CookieCloud参数不正确" + req_url = "%s/get/%s" % (self._server, self._key) + ret = self._req.post_res(url=req_url, json={"password": self._password}) + if ret and ret.status_code == 200: + result = ret.json() + if not result: + return {}, "" + if result.get("cookie_data"): + return result.get("cookie_data"), "" + return result, "" + elif ret: + return {}, "同步CookieCloud失败,错误码:%s" % ret.status_code + else: + return {}, "CookieCloud请求失败,请检查服务器地址、用户KEY及加密密码是否正确" diff --git a/app/helper/db_helper.py b/app/helper/db_helper.py new file mode 100644 index 0000000..7ce2bc1 --- /dev/null +++ b/app/helper/db_helper.py @@ -0,0 +1,2492 @@ +import datetime +import os.path +import time +import json +from enum import Enum +from sqlalchemy import cast, func + +from app.db import MainDb, DbPersist +from app.db.models import * +from app.utils import StringUtils +from app.utils.types import MediaType, RmtMode + + +class DbHelper: + _db = MainDb() + + @DbPersist(_db) + def insert_search_results(self, media_items: list, title=None, ident_flag=True): + """ + 将返回信息插入数据库 + """ + if not media_items: + return + data_list = [] + for media_item in media_items: + if media_item.type == MediaType.TV: + mtype = "TV" + elif media_item.type == MediaType.MOVIE: + mtype = "MOV" + else: + mtype = "ANI" + data_list.append( + SEARCHRESULTINFO( + TORRENT_NAME=media_item.org_string, + ENCLOSURE=media_item.enclosure, + DESCRIPTION=media_item.description, + TYPE=mtype if ident_flag else '', + TITLE=media_item.title if ident_flag else title, + YEAR=media_item.year if ident_flag else '', + SEASON=media_item.get_season_string() if ident_flag else '', + EPISODE=media_item.get_episode_string() if ident_flag else '', + ES_STRING=media_item.get_season_episode_string() if ident_flag else '', + VOTE=media_item.vote_average or "0", + IMAGE=media_item.get_backdrop_image(default=False, original=True), + POSTER=media_item.get_poster_image(), + TMDBID=media_item.tmdb_id, + OVERVIEW=media_item.overview, + RES_TYPE=json.dumps({ + "respix": media_item.resource_pix, + "restype": media_item.resource_type, + "reseffect": media_item.resource_effect, + "video_encode": media_item.video_encode + }), + RES_ORDER=media_item.res_order, + SIZE=StringUtils.str_filesize(int(media_item.size)), + SEEDERS=media_item.seeders, + PEERS=media_item.peers, + SITE=media_item.site, + SITE_ORDER=media_item.site_order, + PAGEURL=media_item.page_url, + OTHERINFO=media_item.resource_team, + UPLOAD_VOLUME_FACTOR=media_item.upload_volume_factor, + DOWNLOAD_VOLUME_FACTOR=media_item.download_volume_factor + )) + self._db.insert(data_list) + + def get_search_result_by_id(self, dl_id): + """ + 根据ID从数据库中查询检索结果的一条记录 + """ + return self._db.query(SEARCHRESULTINFO).filter(SEARCHRESULTINFO.ID == dl_id).all() + + def get_search_results(self, ): + """ + 查询检索结果的所有记录 + """ + return self._db.query(SEARCHRESULTINFO).all() + + def is_torrent_rssd(self, enclosure): + """ + 查询RSS是否处理过,根据下载链接 + """ + if not enclosure: + return True + if self._db.query(RSSTORRENTS).filter(RSSTORRENTS.ENCLOSURE == enclosure).count() > 0: + return True + else: + return False + + def is_userrss_finished(self, torrent_name, enclosure): + """ + 查询RSS是否处理过,根据名称 + """ + if not torrent_name and not enclosure: + return True + if enclosure: + ret = self._db.query(RSSTORRENTS).filter(RSSTORRENTS.ENCLOSURE == enclosure).count() + else: + ret = self._db.query(RSSTORRENTS).filter(RSSTORRENTS.TORRENT_NAME == torrent_name).count() + return True if ret > 0 else False + + @DbPersist(_db) + def delete_all_search_torrents(self, ): + """ + 删除所有搜索的记录 + """ + self._db.query(SEARCHRESULTINFO).delete() + + @DbPersist(_db) + def insert_rss_torrents(self, media_info): + """ + 将RSS的记录插入数据库 + """ + self._db.insert( + RSSTORRENTS( + TORRENT_NAME=media_info.org_string, + ENCLOSURE=media_info.enclosure, + TYPE=media_info.type.value, + TITLE=media_info.title, + YEAR=media_info.year, + SEASON=media_info.get_season_string(), + EPISODE=media_info.get_episode_string() + )) + + @DbPersist(_db) + def simple_insert_rss_torrents(self, title, enclosure): + """ + 将RSS的记录插入数据库 + """ + self._db.insert( + RSSTORRENTS( + TORRENT_NAME=title, + ENCLOSURE=enclosure + )) + + @DbPersist(_db) + def simple_delete_rss_torrents(self, title, enclosure): + """ + 删除RSS的记录 + """ + if enclosure: + self._db.query(RSSTORRENTS).filter(RSSTORRENTS.TORRENT_NAME == title, + RSSTORRENTS.ENCLOSURE == enclosure).delete() + else: + self._db.query(RSSTORRENTS).filter(RSSTORRENTS.TORRENT_NAME == title).delete() + + def is_douban_media_exists(self, media): + """ + 查询豆瓣是否存在 + """ + if not media: + return True + if self._db.query(DOUBANMEDIAS).filter(DOUBANMEDIAS.NAME == media.get_name()).count() > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_douban_media_state(self, media, state): + """ + 将豆瓣的数据插入数据库 + """ + if not media or not state: + return + if self.is_douban_media_exists(media): + return + else: + # 插入 + self._db.insert( + DOUBANMEDIAS( + NAME=media.get_name(), + YEAR=media.year, + TYPE=media.type.value, + RATING=media.vote_average, + IMAGE=media.get_poster_image(), + STATE=state, + ADD_TIME=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + ) + ) + + @DbPersist(_db) + def update_douban_media_state(self, media, state): + """ + 标记豆瓣数据的状态 + """ + self._db.query(DOUBANMEDIAS).filter(DOUBANMEDIAS.NAME == media.title, + DOUBANMEDIAS.YEAR == media.year).update( + { + "STATE": state + } + ) + + def get_douban_search_state(self, title, year=None): + """ + 查询未检索的豆瓣数据 + """ + if not year: + return self._db.query(DOUBANMEDIAS.STATE).filter(DOUBANMEDIAS.NAME == title).first() + else: + return self._db.query(DOUBANMEDIAS.STATE).filter(DOUBANMEDIAS.NAME == title, + DOUBANMEDIAS.YEAR == str(year)).first() + + def is_transfer_history_exists(self, source_path, source_filename, dest_path, dest_filename): + """ + 查询识别转移记录 + """ + if not source_path or not source_filename or not dest_path or not dest_filename: + return False + ret = self._db.query(TRANSFERHISTORY).filter(TRANSFERHISTORY.SOURCE_PATH == source_path, + TRANSFERHISTORY.SOURCE_FILENAME == source_filename, + TRANSFERHISTORY.DEST_PATH == dest_path, + TRANSFERHISTORY.DEST_FILENAME == dest_filename).count() + return True if ret > 0 else False + + @DbPersist(_db) + def insert_transfer_history(self, in_from: Enum, rmt_mode: RmtMode, in_path, out_path, dest, media_info): + """ + 插入识别转移记录 + """ + if not media_info or not media_info.tmdb_info: + return + if in_path: + in_path = os.path.normpath(in_path) + source_path = os.path.dirname(in_path) + source_filename = os.path.basename(in_path) + else: + return + if out_path: + outpath = os.path.normpath(out_path) + dest_path = os.path.dirname(outpath) + dest_filename = os.path.basename(outpath) + season_episode = media_info.get_season_episode_string() + else: + dest_path = "" + dest_filename = "" + season_episode = media_info.get_season_string() + title = media_info.title + if self.is_transfer_history_exists(source_path, source_filename, dest_path, dest_filename): + return + dest = dest or "" + timestr = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + self._db.insert( + TRANSFERHISTORY( + MODE=str(rmt_mode.value), + TYPE=media_info.type.value, + CATEGORY=media_info.category, + TMDBID=int(media_info.tmdb_id), + TITLE=title, + YEAR=media_info.year, + SEASON_EPISODE=season_episode, + SOURCE=str(in_from.value), + SOURCE_PATH=source_path, + SOURCE_FILENAME=source_filename, + DEST=dest, + DEST_PATH=dest_path, + DEST_FILENAME=dest_filename, + DATE=timestr + ) + ) + + def get_transfer_history(self, search, page, rownum): + """ + 查询识别转移记录 + """ + if int(page) == 1: + begin_pos = 0 + else: + begin_pos = (int(page) - 1) * int(rownum) + + if search: + search = f"%{search}%" + count = self._db.query(TRANSFERHISTORY).filter((TRANSFERHISTORY.SOURCE_FILENAME.like(search)) + | (TRANSFERHISTORY.TITLE.like(search))).count() + data = self._db.query(TRANSFERHISTORY).filter((TRANSFERHISTORY.SOURCE_FILENAME.like(search)) + | (TRANSFERHISTORY.TITLE.like(search))).order_by( + TRANSFERHISTORY.DATE.desc()).limit(int(rownum)).offset(begin_pos).all() + return count, data + else: + return self._db.query(TRANSFERHISTORY).count(), self._db.query(TRANSFERHISTORY).order_by( + TRANSFERHISTORY.DATE.desc()).limit(int(rownum)).offset(begin_pos).all() + + def get_transfer_path_by_id(self, logid): + """ + 据logid查询PATH + """ + return self._db.query(TRANSFERHISTORY).filter(TRANSFERHISTORY.ID == int(logid)).all() + + def is_transfer_history_exists_by_source_full_path(self, source_full_path): + """ + 据源文件的全路径查询识别转移记录 + """ + + path = os.path.dirname(source_full_path) + filename = os.path.basename(source_full_path) + ret = self._db.query(TRANSFERHISTORY).filter(TRANSFERHISTORY.SOURCE_PATH == path, + TRANSFERHISTORY.SOURCE_FILENAME == filename).count() + if ret > 0: + return True + else: + return False + + @DbPersist(_db) + def delete_transfer_log_by_id(self, logid): + """ + 根据logid删除记录 + """ + self._db.query(TRANSFERHISTORY).filter(TRANSFERHISTORY.ID == int(logid)).delete() + + def get_transfer_unknown_paths(self, ): + """ + 查询未识别的记录列表 + """ + return self._db.query(TRANSFERUNKNOWN).filter(TRANSFERUNKNOWN.STATE == 'N').all() + + @DbPersist(_db) + def update_transfer_unknown_state(self, path): + """ + 更新未识别记录为识别 + """ + if not path: + return + self._db.query(TRANSFERUNKNOWN).filter(TRANSFERUNKNOWN.PATH == os.path.normpath(path)).update( + { + "STATE": "Y" + } + ) + + @DbPersist(_db) + def delete_transfer_unknown(self, tid): + """ + 删除未识别记录 + """ + if not tid: + return [] + self._db.query(TRANSFERUNKNOWN).filter(TRANSFERUNKNOWN.ID == int(tid)).delete() + + def get_unknown_path_by_id(self, tid): + """ + 查询未识别记录 + """ + if not tid: + return [] + return self._db.query(TRANSFERUNKNOWN).filter(TRANSFERUNKNOWN.ID == int(tid)).all() + + def get_transfer_unknown_by_path(self, path): + """ + 根据路径查询未识别记录 + """ + if not path: + return [] + return self._db.query(TRANSFERUNKNOWN).filter(TRANSFERUNKNOWN.PATH == path).all() + + def is_transfer_unknown_exists(self, path): + """ + 查询未识别记录是否存在 + """ + if not path: + return False + ret = self._db.query(TRANSFERUNKNOWN).filter(TRANSFERUNKNOWN.PATH == os.path.normpath(path)).count() + if ret > 0: + return True + else: + return False + + def is_need_insert_transfer_unknown(self, path): + """ + 检查是否需要插入未识别记录 + """ + if not path: + return False + + """ + 1) 如果不存在未识别,则插入 + 2) 如果存在未处理的未识别,则插入(并不会真正的插入,insert_transfer_unknown里会挡住,主要是标记进行消息推送) + 3) 如果未识别已经全部处理完并且存在转移记录,则不插入 + 4) 如果未识别已经全部处理完并且不存在转移记录,则删除并重新插入 + """ + unknowns = self.get_transfer_unknown_by_path(path) + if unknowns: + is_all_proceed = True + for unknown in unknowns: + if unknown.STATE == 'N': + is_all_proceed = False + break + + if is_all_proceed: + is_transfer_history_exists = self.is_transfer_history_exists_by_source_full_path(path) + if is_transfer_history_exists: + # 对应 3) + return False + else: + # 对应 4) + for unknown in unknowns: + self.delete_transfer_unknown(unknown.ID) + return True + else: + # 对应 2) + return True + else: + # 对应 1) + return True + + @DbPersist(_db) + def insert_transfer_unknown(self, path, dest, rmt_mode): + """ + 插入未识别记录 + """ + if not path: + return + if self.is_transfer_unknown_exists(path): + return + else: + path = os.path.normpath(path) + if dest: + dest = os.path.normpath(dest) + else: + dest = "" + self._db.insert(TRANSFERUNKNOWN( + PATH=path, + DEST=dest, + STATE='N', + MODE=str(rmt_mode.value) + )) + + def is_transfer_in_blacklist(self, path): + """ + 查询是否为黑名单 + """ + if not path: + return False + ret = self._db.query(TRANSFERBLACKLIST).filter(TRANSFERBLACKLIST.PATH == os.path.normpath(path)).count() + if ret > 0: + return True + else: + return False + + def is_transfer_notin_blacklist(self, path): + """ + 查询是否为黑名单 + """ + return not self.is_transfer_in_blacklist(path) + + @DbPersist(_db) + def insert_transfer_blacklist(self, path): + """ + 插入黑名单记录 + """ + if not path: + return + if self.is_transfer_in_blacklist(path): + return + else: + self._db.insert(TRANSFERBLACKLIST( + PATH=os.path.normpath(path) + )) + + @DbPersist(_db) + def truncate_transfer_blacklist(self, ): + """ + 清空黑名单记录 + """ + self._db.query(TRANSFERBLACKLIST).delete() + self._db.query(SYNCHISTORY).delete() + + @DbPersist(_db) + def truncate_rss_history(self, ): + """ + 清空RSS历史记录 + """ + self._db.query(RSSTORRENTS).delete() + + @DbPersist(_db) + def truncate_rss_episodes(self, ): + """ + 清空RSS历史记录 + """ + self._db.query(RSSTVEPISODES).delete() + + def get_config_site(self, ): + """ + 查询所有站点信息 + """ + return self._db.query(CONFIGSITE).order_by(cast(CONFIGSITE.PRI, Integer).asc()) + + def get_site_by_id(self, tid): + """ + 查询1个站点信息 + """ + return self._db.query(CONFIGSITE).filter(CONFIGSITE.ID == int(tid)).all() + + def get_site_by_name(self, name): + """ + 基于站点名称查询站点信息 + :return: + """ + return self._db.query(CONFIGSITE).filter(CONFIGSITE.NAME == name).all() + + @DbPersist(_db) + def insert_config_site(self, name, site_pri, rssurl, signurl, cookie, note, rss_uses): + """ + 插入站点信息 + """ + if not name: + return + self._db.insert(CONFIGSITE( + NAME=name, + PRI=site_pri, + RSSURL=rssurl, + SIGNURL=signurl, + COOKIE=cookie, + NOTE=note, + INCLUDE=rss_uses + )) + + @DbPersist(_db) + def delete_config_site(self, tid): + """ + 删除站点信息 + """ + if not tid: + return + self._db.query(CONFIGSITE).filter(CONFIGSITE.ID == int(tid)).delete() + + @DbPersist(_db) + def update_config_site(self, tid, name, site_pri, rssurl, signurl, cookie, note, rss_uses): + """ + 更新站点信息 + """ + if not tid: + return + self._db.query(CONFIGSITE).filter(CONFIGSITE.ID == int(tid)).update( + { + "NAME": name, + "PRI": site_pri, + "RSSURL": rssurl, + "SIGNURL": signurl, + "COOKIE": cookie, + "NOTE": note, + "INCLUDE": rss_uses + } + ) + + @DbPersist(_db) + def update_config_site_note(self, tid, note): + """ + 更新站点属性 + """ + if not tid: + return + self._db.query(CONFIGSITE).filter(CONFIGSITE.ID == int(tid)).update( + { + "NOTE": note + } + ) + + @DbPersist(_db) + def update_site_cookie_ua(self, tid, cookie, ua=None): + """ + 更新站点Cookie和ua + """ + if not tid: + return + rec = self._db.query(CONFIGSITE).filter(CONFIGSITE.ID == int(tid)).first() + if rec.NOTE: + note = json.loads(rec.NOTE) + if ua: + note['ua'] = ua + else: + note = {} + self._db.query(CONFIGSITE).filter(CONFIGSITE.ID == int(tid)).update( + { + "COOKIE": cookie, + "NOTE": json.dumps(note) + } + ) + + def get_config_filter_group(self, gid=None): + """ + 查询过滤规则组 + """ + if gid: + return self._db.query(CONFIGFILTERGROUP).filter(CONFIGFILTERGROUP.ID == int(gid)).all() + return self._db.query(CONFIGFILTERGROUP).all() + + def get_config_filter_rule(self, groupid=None): + """ + 查询过滤规则 + """ + if not groupid: + return self._db.query(CONFIGFILTERRULES).order_by(CONFIGFILTERRULES.GROUP_ID, + cast(CONFIGFILTERRULES.PRIORITY, + Integer)).all() + else: + return self._db.query(CONFIGFILTERRULES).filter( + CONFIGFILTERRULES.GROUP_ID == int(groupid)).order_by(CONFIGFILTERRULES.GROUP_ID, + cast(CONFIGFILTERRULES.PRIORITY, + Integer)).all() + + def get_rss_movies(self, state=None, rssid=None): + """ + 查询订阅电影信息 + """ + if rssid: + return self._db.query(RSSMOVIES).filter(RSSMOVIES.ID == int(rssid)).all() + else: + if not state: + return self._db.query(RSSMOVIES).all() + else: + return self._db.query(RSSMOVIES).filter(RSSMOVIES.STATE == state).all() + + def get_rss_movie_id(self, title, year=None, tmdbid=None): + """ + 获取订阅电影ID + """ + if not title: + return "" + if tmdbid: + ret = self._db.query(RSSMOVIES.ID).filter(RSSMOVIES.TMDBID == str(tmdbid)).first() + if ret: + return ret[0] + if not year: + items = self._db.query(RSSMOVIES).filter(RSSMOVIES.NAME == title).all() + else: + items = self._db.query(RSSMOVIES).filter(RSSMOVIES.NAME == title, + RSSMOVIES.YEAR == str(year)).all() + if items: + if tmdbid: + for item in items: + if not item.TMDBID or item.TMDBID == str(tmdbid): + return item.ID + else: + return items[0].ID + else: + return "" + + def get_rss_movie_sites(self, rssid): + """ + 获取订阅电影站点 + """ + if not rssid: + return "" + ret = self._db.query(RSSMOVIES.DESC).filter(RSSMOVIES.ID == int(rssid)).first() + if ret: + return ret[0] + return "" + + @DbPersist(_db) + def update_rss_movie_tmdb(self, rid, tmdbid, title, year, image, desc, note): + """ + 更新订阅电影的部分信息 + """ + if not tmdbid: + return + self._db.query(RSSMOVIES).filter(RSSMOVIES.ID == int(rid)).update({ + "TMDBID": tmdbid, + "NAME": title, + "YEAR": year, + "IMAGE": image, + "NOTE": note, + "DESC": desc + }) + + @DbPersist(_db) + def update_rss_movie_desc(self, rid, desc): + """ + 更新订阅电影的DESC + """ + self._db.query(RSSMOVIES).filter(RSSMOVIES.ID == int(rid)).update({ + "DESC": desc + }) + + @DbPersist(_db) + def update_rss_filter_order(self, rtype, rssid, res_order): + """ + 更新订阅命中的过滤规则优先级 + """ + if rtype == MediaType.MOVIE: + self._db.query(RSSMOVIES).filter(RSSMOVIES.ID == int(rssid)).update({ + "FILTER_ORDER": res_order + }) + else: + self._db.query(RSSTVS).filter(RSSTVS.ID == int(rssid)).update({ + "FILTER_ORDER": res_order + }) + + def get_rss_overedition_order(self, rtype, rssid): + """ + 查询当前订阅的过滤优先级 + """ + if rtype == MediaType.MOVIE: + res = self._db.query(RSSMOVIES.FILTER_ORDER).filter(RSSMOVIES.ID == int(rssid)).first() + else: + res = self._db.query(RSSTVS.FILTER_ORDER).filter(RSSTVS.ID == int(rssid)).first() + if res and res[0]: + return int(res[0]) + else: + return 0 + + def is_exists_rss_movie(self, title, year): + """ + 判断RSS电影是否存在 + """ + if not title: + return False + count = self._db.query(RSSMOVIES).filter(RSSMOVIES.NAME == title, + RSSMOVIES.YEAR == str(year)).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_rss_movie(self, media_info, + state='D', + rss_sites=None, + search_sites=None, + over_edition=0, + filter_restype=None, + filter_pix=None, + filter_team=None, + filter_rule=None, + save_path=None, + download_setting=-1, + fuzzy_match=0, + desc=None, + note=None, + keyword=None): + """ + 新增RSS电影 + """ + if search_sites is None: + search_sites = [] + if rss_sites is None: + rss_sites = [] + if not media_info: + return -1 + if not media_info.title: + return -1 + if self.is_exists_rss_movie(media_info.title, media_info.year): + return 9 + self._db.insert(RSSMOVIES( + NAME=media_info.title, + YEAR=media_info.year, + TMDBID=media_info.tmdb_id, + IMAGE=media_info.get_message_image(), + RSS_SITES=json.dumps(rss_sites), + SEARCH_SITES=json.dumps(search_sites), + OVER_EDITION=over_edition, + FILTER_RESTYPE=filter_restype, + FILTER_PIX=filter_pix, + FILTER_RULE=filter_rule, + FILTER_TEAM=filter_team, + SAVE_PATH=save_path, + DOWNLOAD_SETTING=download_setting, + FUZZY_MATCH=fuzzy_match, + STATE=state, + DESC=desc, + NOTE=note, + KEYWORD=keyword + )) + return 0 + + @DbPersist(_db) + def delete_rss_movie(self, title=None, year=None, rssid=None, tmdbid=None): + """ + 删除RSS电影 + """ + if not title and not rssid: + return + if rssid: + self._db.query(RSSMOVIES).filter(RSSMOVIES.ID == int(rssid)).delete() + else: + if tmdbid: + self._db.query(RSSMOVIES).filter(RSSMOVIES.TMDBID == tmdbid).delete() + self._db.query(RSSMOVIES).filter(RSSMOVIES.NAME == title, + RSSMOVIES.YEAR == str(year)).delete() + + @DbPersist(_db) + def update_rss_movie_state(self, title=None, year=None, rssid=None, state='R'): + """ + 更新电影订阅状态 + """ + if not title and not rssid: + return + if rssid: + self._db.query(RSSMOVIES).filter(RSSMOVIES.ID == int(rssid)).update( + { + "STATE": state + }) + else: + self._db.query(RSSMOVIES).filter(RSSMOVIES.NAME == title, + RSSMOVIES.YEAR == str(year)).update( + { + "STATE": state + }) + + def get_rss_tvs(self, state=None, rssid=None): + """ + 查询订阅电视剧信息 + """ + if rssid: + return self._db.query(RSSTVS).filter(RSSTVS.ID == int(rssid)).all() + else: + if not state: + return self._db.query(RSSTVS).all() + else: + return self._db.query(RSSTVS).filter(RSSTVS.STATE == state).all() + + def get_rss_tv_id(self, title, year=None, season=None, tmdbid=None): + """ + 获取订阅电视剧ID + """ + if not title: + return "" + if tmdbid: + if season: + ret = self._db.query(RSSTVS.ID).filter(RSSTVS.TMDBID == tmdbid, + RSSTVS.SEASON == season).first() + else: + ret = self._db.query(RSSTVS.ID).filter(RSSTVS.TMDBID == tmdbid).first() + if ret: + return ret[0] + if season and year: + items = self._db.query(RSSTVS).filter(RSSTVS.NAME == title, + RSSTVS.SEASON == str(season), + RSSTVS.YEAR == str(year)).all() + elif season and not year: + items = self._db.query(RSSTVS).filter(RSSTVS.NAME == title, + RSSTVS.SEASON == str(season)).all() + elif not season and year: + items = self._db.query(RSSTVS).filter(RSSTVS.NAME == title, + RSSTVS.YEAR == str(year)).all() + else: + items = self._db.query(RSSTVS).filter(RSSTVS.NAME == title).all() + if items: + if tmdbid: + for item in items: + if not item.TMDBID or item.TMDBID == str(tmdbid): + return item.ID + else: + return items[0].ID + else: + return "" + + def get_rss_tv_sites(self, rssid): + """ + 获取订阅电视剧站点 + """ + if not rssid: + return "" + ret = self._db.query(RSSTVS).filter(RSSTVS.ID == int(rssid)).first() + if ret: + return ret + return "" + + @DbPersist(_db) + def update_rss_tv_tmdb(self, rid, tmdbid, title, year, total, lack, image, desc, note): + """ + 更新订阅电影的TMDBID + """ + if not tmdbid: + return + self._db.query(RSSTVS).filter(RSSTVS.ID == int(rid)).update( + { + "TMDBID": tmdbid, + "NAME": title, + "YEAR": year, + "TOTAL": total, + "LACK": lack, + "IMAGE": image, + "DESC": desc, + "NOTE": note + } + ) + + @DbPersist(_db) + def update_rss_tv_desc(self, rid, desc): + """ + 更新订阅电视剧的DESC + """ + self._db.query(RSSTVS).filter(RSSTVS.ID == int(rid)).update( + { + "DESC": desc + } + ) + + def is_exists_rss_tv(self, title, year, season=None): + """ + 判断RSS电视剧是否存在 + """ + if not title: + return False + if season: + count = self._db.query(RSSTVS).filter(RSSTVS.NAME == title, + RSSTVS.YEAR == str(year), + RSSTVS.SEASON == season).count() + else: + count = self._db.query(RSSTVS).filter(RSSTVS.NAME == title, + RSSTVS.YEAR == str(year)).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_rss_tv(self, + media_info, + total, + lack=0, + state="D", + rss_sites=None, + search_sites=None, + over_edition=0, + filter_restype=None, + filter_pix=None, + filter_team=None, + filter_rule=None, + save_path=None, + download_setting=-1, + total_ep=None, + current_ep=None, + fuzzy_match=0, + desc=None, + note=None, + keyword=None): + """ + 新增RSS电视剧 + """ + if search_sites is None: + search_sites = [] + if rss_sites is None: + rss_sites = [] + if not media_info: + return -1 + if not media_info.title: + return -1 + if fuzzy_match and media_info.begin_season is None: + season_str = "" + else: + season_str = media_info.get_season_string() + if self.is_exists_rss_tv(media_info.title, media_info.year, season_str): + return 9 + self._db.insert(RSSTVS( + NAME=media_info.title, + YEAR=media_info.year, + SEASON=season_str, + TMDBID=media_info.tmdb_id, + IMAGE=media_info.get_message_image(), + RSS_SITES=json.dumps(rss_sites), + SEARCH_SITES=json.dumps(search_sites), + OVER_EDITION=over_edition, + FILTER_RESTYPE=filter_restype, + FILTER_PIX=filter_pix, + FILTER_RULE=filter_rule, + FILTER_TEAM=filter_team, + SAVE_PATH=save_path, + DOWNLOAD_SETTING=download_setting, + FUZZY_MATCH=fuzzy_match, + TOTAL_EP=total_ep, + CURRENT_EP=current_ep, + TOTAL=total, + LACK=lack, + STATE=state, + DESC=desc, + NOTE=note, + KEYWORD=keyword + )) + return 0 + + @DbPersist(_db) + def update_rss_tv_lack(self, title=None, year=None, season=None, rssid=None, lack_episodes: list = None): + """ + 更新电视剧缺失的集数 + """ + if not title and not rssid: + return + if not lack_episodes: + lack = 0 + else: + lack = len(lack_episodes) + if rssid: + self.update_rss_tv_episodes(rssid, lack_episodes) + self._db.query(RSSTVS).filter(RSSTVS.ID == int(rssid)).update( + { + "LACK": lack + } + ) + else: + self._db.query(RSSTVS).filter(RSSTVS.NAME == title, + RSSTVS.YEAR == str(year), + RSSTVS.SEASON == season).update( + { + "LACK": lack + } + ) + + @DbPersist(_db) + def delete_rss_tv(self, title=None, season=None, rssid=None, tmdbid=None): + """ + 删除RSS电视剧 + """ + if not title and not rssid: + return + if not rssid: + rssid = self.get_rss_tv_id(title=title, tmdbid=tmdbid, season=season) + if rssid: + self.delete_rss_tv_episodes(rssid) + self._db.query(RSSTVS).filter(RSSTVS.ID == int(rssid)).delete() + + def is_exists_rss_tv_episodes(self, rid): + """ + 判断RSS电视剧是否存在 + """ + if not rid: + return False + count = self._db.query(RSSTVEPISODES).filter(RSSTVEPISODES.RSSID == int(rid)).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def update_rss_tv_episodes(self, rid, episodes): + """ + 插入或更新电视剧订阅缺失剧集 + """ + if not rid: + return + if not episodes: + episodes = [] + else: + episodes = [str(epi) for epi in episodes] + if self.is_exists_rss_tv_episodes(rid): + self._db.query(RSSTVEPISODES).filter(RSSTVEPISODES.RSSID == int(rid)).update( + { + "EPISODES": ",".join(episodes) + } + ) + else: + self._db.insert(RSSTVEPISODES( + RSSID=rid, + EPISODES=",".join(episodes) + )) + + def get_rss_tv_episodes(self, rid): + """ + 查询电视剧订阅缺失剧集 + """ + if not rid: + return [] + ret = self._db.query(RSSTVEPISODES.EPISODES).filter(RSSTVEPISODES.RSSID == rid).first() + if ret: + return [int(epi) for epi in str(ret[0]).split(',')] + else: + return None + + @DbPersist(_db) + def delete_rss_tv_episodes(self, rid): + """ + 删除电视剧订阅缺失剧集 + """ + if not rid: + return + self._db.query(RSSTVEPISODES).filter(RSSTVEPISODES.RSSID == int(rid)).delete() + + @DbPersist(_db) + def update_rss_tv_state(self, title=None, year=None, season=None, rssid=None, state='R'): + """ + 更新电视剧订阅状态 + """ + if not title and not rssid: + return + if rssid: + self._db.query(RSSTVS).filter(RSSTVS.ID == int(rssid)).update( + { + "STATE": state + }) + else: + self._db.query(RSSTVS).filter(RSSTVS.NAME == title, + RSSTVS.YEAR == str(year), + RSSTVS.SEASON == season).update( + { + "STATE": state + }) + + def is_sync_in_history(self, path, dest): + """ + 查询是否存在同步历史记录 + """ + if not path: + return False + count = self._db.query(SYNCHISTORY).filter(SYNCHISTORY.PATH == os.path.normpath(path), + SYNCHISTORY.DEST == os.path.normpath(dest)).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_sync_history(self, path, src, dest): + """ + 插入黑名单记录 + """ + if not path or not dest: + return + if self.is_sync_in_history(path, dest): + return + else: + self._db.insert(SYNCHISTORY( + PATH=os.path.normpath(path), + SRC=os.path.normpath(src), + DEST=os.path.normpath(dest) + )) + + def get_users(self, ): + """ + 查询用户列表 + """ + return self._db.query(CONFIGUSERS).all() + + def is_user_exists(self, name): + """ + 判断用户是否存在 + """ + if not name: + return False + count = self._db.query(CONFIGUSERS).filter(CONFIGUSERS.NAME == name).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_user(self, name, password, pris): + """ + 新增用户 + """ + if not name or not password: + return + if self.is_user_exists(name): + return + else: + self._db.insert(CONFIGUSERS( + NAME=name, + PASSWORD=password, + PRIS=pris + )) + + @DbPersist(_db) + def delete_user(self, name): + """ + 删除用户 + """ + self._db.query(CONFIGUSERS).filter(CONFIGUSERS.NAME == name).delete() + + def get_transfer_statistics(self, days=30): + """ + 查询历史记录统计 + """ + begin_date = (datetime.datetime.now() - datetime.timedelta(days=days)).strftime("%Y-%m-%d %H:%M:%S") + return self._db.query(TRANSFERHISTORY.TYPE, + func.substr(TRANSFERHISTORY.DATE, 1, 10), + func.count('*') + ).filter(TRANSFERHISTORY.DATE > begin_date).group_by( + func.substr(TRANSFERHISTORY.DATE, 1, 10) + ).order_by(TRANSFERHISTORY.DATE).all() + + @DbPersist(_db) + def update_site_user_statistics_site_name(self, new_name, old_name): + """ + 更新站点用户数据中站点名称 + """ + self._db.query(SITEUSERINFOSTATS).filter(SITEUSERINFOSTATS.SITE == old_name).update( + { + "SITE": new_name + } + ) + + @DbPersist(_db) + def update_site_user_statistics(self, site_user_infos: list): + """ + 更新站点用户粒度数据 + """ + if not site_user_infos: + return + update_at = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + for site_user_info in site_user_infos: + site = site_user_info.site_name + username = site_user_info.username + user_level = site_user_info.user_level + join_at = site_user_info.join_at + upload = site_user_info.upload + download = site_user_info.download + ratio = site_user_info.ratio + seeding = site_user_info.seeding + seeding_size = site_user_info.seeding_size + leeching = site_user_info.leeching + bonus = site_user_info.bonus + url = site_user_info.site_url + msg_unread = site_user_info.message_unread + if not self.is_exists_site_user_statistics(url): + self._db.insert(SITEUSERINFOSTATS( + SITE=site, + USERNAME=username, + USER_LEVEL=user_level, + JOIN_AT=join_at, + UPDATE_AT=update_at, + UPLOAD=upload, + DOWNLOAD=download, + RATIO=ratio, + SEEDING=seeding, + LEECHING=leeching, + SEEDING_SIZE=seeding_size, + BONUS=bonus, + URL=url, + MSG_UNREAD=msg_unread + )) + else: + self._db.query(SITEUSERINFOSTATS).filter(SITEUSERINFOSTATS.URL == url).update( + { + "SITE": site, + "USERNAME": username, + "USER_LEVEL": user_level, + "JOIN_AT": join_at, + "UPDATE_AT": update_at, + "UPLOAD": upload, + "DOWNLOAD": download, + "RATIO": ratio, + "SEEDING": seeding, + "LEECHING": leeching, + "SEEDING_SIZE": seeding_size, + "BONUS": bonus, + "MSG_UNREAD": msg_unread + } + ) + + def is_exists_site_user_statistics(self, url): + """ + 判断站点数据是滞存在 + """ + count = self._db.query(SITEUSERINFOSTATS).filter(SITEUSERINFOSTATS.URL == url).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def update_site_favicon(self, site_user_infos: list): + """ + 更新站点图标数据 + """ + if not site_user_infos: + return + for site_user_info in site_user_infos: + site_icon = "data:image/ico;base64," + \ + site_user_info.site_favicon if site_user_info.site_favicon else site_user_info.site_url \ + + "/favicon.ico" + if not self.is_exists_site_favicon(site_user_info.site_name): + self._db.insert(SITEFAVICON( + SITE=site_user_info.site_name, + URL=site_user_info.site_url, + FAVICON=site_icon + )) + elif site_user_info.site_favicon: + self._db.query(SITEFAVICON).filter(SITEFAVICON.SITE == site_user_info.site_name).update( + { + "URL": site_user_info.site_url, + "FAVICON": site_icon + } + ) + + def is_exists_site_favicon(self, site): + """ + 判断站点图标是否存在 + """ + count = self._db.query(SITEFAVICON).filter(SITEFAVICON.SITE == site).count() + if count > 0: + return True + else: + return False + + def get_site_favicons(self, site=None): + """ + 查询站点数据历史 + """ + if site: + return self._db.query(SITEFAVICON).filter(SITEFAVICON.SITE == site).all() + else: + return self._db.query(SITEFAVICON).all() + + @DbPersist(_db) + def update_site_seed_info_site_name(self, new_name, old_name): + """ + 更新站点做种数据中站点名称 + :param new_name: 新的站点名称 + :param old_name: 原始站点名称 + :return: + """ + self._db.query(SITEUSERSEEDINGINFO).filter(SITEUSERSEEDINGINFO.SITE == old_name).update( + { + "SITE": new_name + } + ) + + @DbPersist(_db) + def update_site_seed_info(self, site_user_infos: list): + """ + 更新站点做种数据 + """ + if not site_user_infos: + return + update_at = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + for site_user_info in site_user_infos: + if not self.is_site_seeding_info_exist(url=site_user_info.site_url): + self._db.insert(SITEUSERSEEDINGINFO( + SITE=site_user_info.site_name, + UPDATE_AT=update_at, + SEEDING_INFO=site_user_info.seeding_info, + URL=site_user_info.site_url + )) + else: + self._db.query(SITEUSERSEEDINGINFO).filter(SITEUSERSEEDINGINFO.URL == site_user_info.site_url).update( + { + "SITE": site_user_info.site_name, + "UPDATE_AT": update_at, + "SEEDING_INFO": site_user_info.seeding_info + } + ) + + def is_site_user_statistics_exists(self, url): + """ + 判断站点用户数据是否存在 + """ + if not url: + return False + count = self._db.query(SITEUSERINFOSTATS).filter(SITEUSERINFOSTATS.URL == url).count() + if count > 0: + return True + else: + return False + + def get_site_user_statistics(self, num=100, strict_urls=None): + """ + 查询站点数据历史 + """ + if strict_urls: + # 根据站点优先级排序 + return self._db.query(SITEUSERINFOSTATS) \ + .join(CONFIGSITE, SITEUSERINFOSTATS.SITE == CONFIGSITE.NAME) \ + .filter(SITEUSERINFOSTATS.URL.in_(tuple(strict_urls + ["__DUMMY__"]))) \ + .order_by(cast(CONFIGSITE.PRI, Integer).asc()).limit(num).all() + else: + return self._db.query(SITEUSERINFOSTATS).limit(num).all() + + def is_site_statistics_history_exists(self, url, date): + """ + 判断站点历史数据是否存在 + """ + if not url or not date: + return False + count = self._db.query(SITESTATISTICSHISTORY).filter(SITESTATISTICSHISTORY.URL == url, + SITESTATISTICSHISTORY.DATE == date).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def update_site_statistics_site_name(self, new_name, old_name): + """ + 更新站点做种数据中站点名称 + :param new_name: 新站点名称 + :param old_name: 原始站点名称 + :return: + """ + self._db.query(SITESTATISTICSHISTORY).filter(SITESTATISTICSHISTORY.SITE == old_name).update( + { + "SITE": new_name + } + ) + + @DbPersist(_db) + def insert_site_statistics_history(self, site_user_infos: list): + """ + 插入站点数据 + """ + if not site_user_infos: + return + date_now = time.strftime('%Y-%m-%d', time.localtime(time.time())) + for site_user_info in site_user_infos: + site = site_user_info.site_name + upload = site_user_info.upload + user_level = site_user_info.user_level + download = site_user_info.download + ratio = site_user_info.ratio + seeding = site_user_info.seeding + seeding_size = site_user_info.seeding_size + leeching = site_user_info.leeching + bonus = site_user_info.bonus + url = site_user_info.site_url + if not self.is_site_statistics_history_exists(date=date_now, url=url): + self._db.insert(SITESTATISTICSHISTORY( + SITE=site, + USER_LEVEL=user_level, + DATE=date_now, + UPLOAD=upload, + DOWNLOAD=download, + RATIO=ratio, + SEEDING=seeding, + LEECHING=leeching, + SEEDING_SIZE=seeding_size, + BONUS=bonus, + URL=url + )) + else: + self._db.query(SITESTATISTICSHISTORY).filter(SITESTATISTICSHISTORY.DATE == date_now, + SITESTATISTICSHISTORY.URL == url).update( + { + "SITE": site, + "USER_LEVEL": user_level, + "UPLOAD": upload, + "DOWNLOAD": download, + "RATIO": ratio, + "SEEDING": seeding, + "LEECHING": leeching, + "SEEDING_SIZE": seeding_size, + "BONUS": bonus + } + ) + + def get_site_statistics_history(self, site, days=30): + """ + 查询站点数据历史 + """ + return self._db.query(SITESTATISTICSHISTORY).filter( + SITESTATISTICSHISTORY.SITE == site).order_by( + SITESTATISTICSHISTORY.DATE.asc() + ).limit(days) + + def get_site_seeding_info(self, site): + """ + 查询站点做种信息 + """ + return self._db.query(SITEUSERSEEDINGINFO.SEEDING_INFO).filter( + SITEUSERSEEDINGINFO.SITE == site).first() + + def is_site_seeding_info_exist(self, url): + """ + 判断做种数据是否已存在 + """ + count = self._db.query(SITEUSERSEEDINGINFO).filter( + SITEUSERSEEDINGINFO.URL == url).count() + if count > 0: + return True + else: + return False + + def get_site_statistics_recent_sites(self, days=7, strict_urls=None): + """ + 查询近期上传下载量 + """ + # 查询最大最小日期 + if strict_urls is None: + strict_urls = [] + + b_date = (datetime.datetime.now() - datetime.timedelta(days=days)).strftime("%Y-%m-%d") + date_ret = self._db.query(func.max(SITESTATISTICSHISTORY.DATE), + func.MIN(SITESTATISTICSHISTORY.DATE)).filter( + SITESTATISTICSHISTORY.DATE > b_date).all() + if date_ret and date_ret[0][0]: + total_upload = 0 + total_download = 0 + ret_site_uploads = [] + ret_site_downloads = [] + min_date = date_ret[0][1] + # 查询开始值 + if strict_urls: + subquery = self._db.query(SITESTATISTICSHISTORY.SITE.label("SITE"), + SITESTATISTICSHISTORY.DATE.label("DATE"), + func.sum(SITESTATISTICSHISTORY.UPLOAD).label("UPLOAD"), + func.sum(SITESTATISTICSHISTORY.DOWNLOAD).label("DOWNLOAD")).filter( + SITESTATISTICSHISTORY.DATE >= min_date, + SITESTATISTICSHISTORY.URL.in_(tuple(strict_urls + ["__DUMMY__"]))).group_by( + SITESTATISTICSHISTORY.SITE, SITESTATISTICSHISTORY.DATE).subquery() + else: + subquery = self._db.query(SITESTATISTICSHISTORY.SITE.label("SITE"), + SITESTATISTICSHISTORY.DATE.label("DATE"), + func.sum(SITESTATISTICSHISTORY.UPLOAD).label("UPLOAD"), + func.sum(SITESTATISTICSHISTORY.DOWNLOAD).label("DOWNLOAD")).filter( + SITESTATISTICSHISTORY.DATE >= min_date).group_by( + SITESTATISTICSHISTORY.SITE, SITESTATISTICSHISTORY.DATE).subquery() + rets = self._db.query(subquery.c.SITE, + func.min(subquery.c.UPLOAD), + func.min(subquery.c.DOWNLOAD), + func.max(subquery.c.UPLOAD), + func.max(subquery.c.DOWNLOAD)).group_by(subquery.c.SITE).all() + ret_sites = [] + for ret_b in rets: + # 如果最小值都是0,可能时由于近几日没有更新数据,或者cookie过期,正常有数据的话,第二天能正常 + ret_b = list(ret_b) + if ret_b[1] == 0 and ret_b[2] == 0: + ret_b[1] = ret_b[3] + ret_b[2] = ret_b[4] + ret_sites.append(ret_b[0]) + if int(ret_b[1]) < int(ret_b[3]): + total_upload += int(ret_b[3]) - int(ret_b[1]) + ret_site_uploads.append(int(ret_b[3]) - int(ret_b[1])) + else: + ret_site_uploads.append(0) + if int(ret_b[2]) < int(ret_b[4]): + total_download += int(ret_b[4]) - int(ret_b[2]) + ret_site_downloads.append(int(ret_b[4]) - int(ret_b[2])) + else: + ret_site_downloads.append(0) + return total_upload, total_download, ret_sites, ret_site_uploads, ret_site_downloads + else: + return 0, 0, [], [], [] + + def is_exists_download_history(self, title, tmdbid, mtype=None): + """ + 查询下载历史是否存在 + """ + if not title or not tmdbid: + return False + if mtype: + count = self._db.query(DOWNLOADHISTORY).filter( + (DOWNLOADHISTORY.TITLE == title) | (DOWNLOADHISTORY.TMDBID == tmdbid), + DOWNLOADHISTORY.TYPE == mtype).count() + else: + count = self._db.query(DOWNLOADHISTORY).filter( + (DOWNLOADHISTORY.TITLE == title) | (DOWNLOADHISTORY.TMDBID == tmdbid)).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_download_history(self, media_info): + """ + 新增下载历史 + """ + if not media_info: + return + if not media_info.title or not media_info.tmdb_id: + return + if self.is_exists_download_history(media_info.title, media_info.tmdb_id, media_info.type.value): + self._db.query(DOWNLOADHISTORY).filter(DOWNLOADHISTORY.TITLE == media_info.title, + DOWNLOADHISTORY.TMDBID == media_info.tmdb_id, + DOWNLOADHISTORY.TYPE == media_info.type.value).update( + { + "TORRENT": media_info.org_string, + "ENCLOSURE": media_info.enclosure, + "DESC": media_info.description, + "DATE": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), + "SITE": media_info.site + } + ) + else: + self._db.insert(DOWNLOADHISTORY( + TITLE=media_info.title, + YEAR=media_info.year, + TYPE=media_info.type.value, + TMDBID=media_info.tmdb_id, + VOTE=media_info.vote_average, + POSTER=media_info.get_poster_image(), + OVERVIEW=media_info.overview, + TORRENT=media_info.org_string, + ENCLOSURE=media_info.enclosure, + DESC=media_info.description, + DATE=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), + SITE=media_info.site + )) + + def get_download_history(self, date=None, hid=None, num=30, page=1): + """ + 查询下载历史 + """ + if hid: + return self._db.query(DOWNLOADHISTORY).filter(DOWNLOADHISTORY.ID == int(hid)).all() + elif date: + return self._db.query(DOWNLOADHISTORY).filter( + DOWNLOADHISTORY.DATE > date).order_by(DOWNLOADHISTORY.DATE.desc()).all() + else: + offset = (int(page) - 1) * int(num) + return self._db.query(DOWNLOADHISTORY).order_by( + DOWNLOADHISTORY.DATE.desc()).limit(num).offset(offset).all() + + def is_media_downloaded(self, title, tmdbid): + """ + 根据标题和年份检查是否下载过 + """ + if self.is_exists_download_history(title, tmdbid): + return True + count = self._db.query(TRANSFERHISTORY).filter(TRANSFERHISTORY.TITLE == title).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_brushtask(self, brush_id, item): + """ + 新增刷流任务 + """ + if not brush_id: + self._db.insert(SITEBRUSHTASK( + NAME=item.get('name'), + SITE=item.get('site'), + FREELEECH=item.get('free'), + RSS_RULE=str(item.get('rss_rule')), + REMOVE_RULE=str(item.get('remove_rule')), + SEED_SIZE=item.get('seed_size'), + INTEVAL=item.get('interval'), + DOWNLOADER=item.get('downloader'), + TRANSFER=item.get('transfer'), + DOWNLOAD_COUNT='0', + REMOVE_COUNT='0', + DOWNLOAD_SIZE='0', + UPLOAD_SIZE='0', + STATE=item.get('state'), + LST_MOD_DATE=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), + SENDMESSAGE=item.get('sendmessage'), + FORCEUPLOAD=item.get('forceupload') + )) + else: + self._db.query(SITEBRUSHTASK).filter(SITEBRUSHTASK.ID == int(brush_id)).update( + { + "NAME": item.get('name'), + "SITE": item.get('site'), + "FREELEECH": item.get('free'), + "RSS_RULE": str(item.get('rss_rule')), + "REMOVE_RULE": str(item.get('remove_rule')), + "SEED_SIZE": item.get('seed_size'), + "INTEVAL": item.get('interval'), + "DOWNLOADER": item.get('downloader'), + "TRANSFER": item.get('transfer'), + "STATE": item.get('state'), + "LST_MOD_DATE": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), + "SENDMESSAGE": item.get('sendmessage'), + "FORCEUPLOAD": item.get('forceupload') + } + ) + + @DbPersist(_db) + def delete_brushtask(self, brush_id): + """ + 删除刷流任务 + """ + self._db.query(SITEBRUSHTASK).filter(SITEBRUSHTASK.ID == int(brush_id)).delete() + self._db.query(SITEBRUSHTORRENTS).filter(SITEBRUSHTORRENTS.TASK_ID == brush_id).delete() + + def get_brushtasks(self, brush_id=None): + """ + 查询刷流任务 + """ + if brush_id: + return self._db.query(SITEBRUSHTASK).filter(SITEBRUSHTASK.ID == int(brush_id)).first() + else: + # 根据站点优先级排序 + return self._db.query(SITEBRUSHTASK) \ + .join(CONFIGSITE, SITEBRUSHTASK.SITE == CONFIGSITE.ID) \ + .order_by(cast(CONFIGSITE.PRI, Integer).asc()).all() + + def get_brushtask_totalsize(self, brush_id): + """ + 查询刷流任务总体积 + """ + if not brush_id: + return 0 + ret = self._db.query(func.sum(cast(SITEBRUSHTORRENTS.TORRENT_SIZE, + Integer))).filter(SITEBRUSHTORRENTS.TASK_ID == brush_id, + SITEBRUSHTORRENTS.DOWNLOAD_ID != '0').first() + if ret: + return ret[0] or 0 + else: + return 0 + + @DbPersist(_db) + def add_brushtask_download_count(self, brush_id): + """ + 增加刷流下载数 + """ + if not brush_id: + return + self._db.query(SITEBRUSHTASK).filter(SITEBRUSHTASK.ID == int(brush_id)).update( + { + "DOWNLOAD_COUNT": SITEBRUSHTASK.DOWNLOAD_COUNT + 1, + "LST_MOD_DATE": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + } + ) + + def get_brushtask_remove_size(self, brush_id): + """ + 获取已删除种子的上传量 + """ + if not brush_id: + return 0 + return self._db.query(SITEBRUSHTORRENTS.TORRENT_SIZE).filter(SITEBRUSHTORRENTS.TASK_ID == brush_id, + SITEBRUSHTORRENTS.DOWNLOAD_ID == '0').all() + + @DbPersist(_db) + def add_brushtask_upload_count(self, brush_id, upload_size, download_size, remove_count): + """ + 更新上传下载量和删除种子数 + """ + if not brush_id: + return + delete_upsize = 0 + delete_dlsize = 0 + remove_sizes = self.get_brushtask_remove_size(brush_id) + for remove_size in remove_sizes: + if not remove_size[0]: + continue + if str(remove_size[0]).find(",") != -1: + sizes = str(remove_size[0]).split(",") + delete_upsize += int(sizes[0] or 0) + if len(sizes) > 1: + delete_dlsize += int(sizes[1] or 0) + else: + delete_upsize += int(remove_size[0]) + self._db.query(SITEBRUSHTASK).filter(SITEBRUSHTASK.ID == int(brush_id)).update({ + "REMOVE_COUNT": SITEBRUSHTASK.REMOVE_COUNT + remove_count, + "UPLOAD_SIZE": int(upload_size) + delete_upsize, + "DOWNLOAD_SIZE": int(download_size) + delete_dlsize, + }) + + @DbPersist(_db) + def insert_brushtask_torrent(self, brush_id, title, enclosure, downloader, download_id, size): + """ + 增加刷流下载的种子信息 + """ + if not brush_id: + return + if self.is_brushtask_torrent_exists(brush_id, title, enclosure): + return + self._db.insert(SITEBRUSHTORRENTS( + TASK_ID=brush_id, + TORRENT_NAME=title, + TORRENT_SIZE=size, + ENCLOSURE=enclosure, + DOWNLOADER=downloader, + DOWNLOAD_ID=download_id, + LST_MOD_DATE=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + )) + + def get_brushtask_torrents(self, brush_id, active=True): + """ + 查询刷流任务所有种子 + """ + if not brush_id: + return [] + if active: + return self._db.query(SITEBRUSHTORRENTS).filter( + SITEBRUSHTORRENTS.TASK_ID == int(brush_id), + SITEBRUSHTORRENTS.DOWNLOAD_ID != '0').all() + else: + return self._db.query(SITEBRUSHTORRENTS).filter( + SITEBRUSHTORRENTS.TASK_ID == int(brush_id) + ).order_by(SITEBRUSHTORRENTS.LST_MOD_DATE.desc()).all() + + def is_brushtask_torrent_exists(self, brush_id, title, enclosure): + """ + 查询刷流任务种子是否已存在 + """ + if not brush_id: + return False + count = self._db.query(SITEBRUSHTORRENTS).filter(SITEBRUSHTORRENTS.TASK_ID == brush_id, + SITEBRUSHTORRENTS.TORRENT_NAME == title, + SITEBRUSHTORRENTS.ENCLOSURE == enclosure).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def update_brushtask_torrent_state(self, ids: list): + """ + 更新刷流种子的状态 + """ + if not ids: + return + for _id in ids: + self._db.query(SITEBRUSHTORRENTS).filter(SITEBRUSHTORRENTS.TASK_ID == _id[1], + SITEBRUSHTORRENTS.DOWNLOAD_ID == _id[2]).update( + { + "TORRENT_SIZE": _id[0], + "DOWNLOAD_ID": '0' + } + ) + + @DbPersist(_db) + def delete_brushtask_torrent(self, brush_id, download_id): + """ + 删除刷流种子记录 + """ + if not download_id or not brush_id: + return + self._db.query(SITEBRUSHTORRENTS).filter(SITEBRUSHTORRENTS.TASK_ID == brush_id, + SITEBRUSHTORRENTS.DOWNLOAD_ID == download_id).delete() + + def get_user_downloaders(self, did=None): + """ + 查询自定义下载器 + """ + if did: + return self._db.query(SITEBRUSHDOWNLOADERS).filter(SITEBRUSHDOWNLOADERS.ID == int(did)).first() + else: + return self._db.query(SITEBRUSHDOWNLOADERS).all() + + @DbPersist(_db) + def update_user_downloader(self, did, name, dtype, user_config, note): + """ + 新增自定义下载器 + """ + if did: + self._db.query(SITEBRUSHDOWNLOADERS).filter(SITEBRUSHDOWNLOADERS.ID == int(did)).update( + { + "NAME": name, + "TYPE": dtype, + "HOST": user_config.get("host"), + "PORT": user_config.get("port"), + "USERNAME": user_config.get("username"), + "PASSWORD": user_config.get("password"), + "SAVE_DIR": user_config.get("save_dir"), + "NOTE": note + } + ) + else: + self._db.insert(SITEBRUSHDOWNLOADERS( + NAME=name, + TYPE=dtype, + HOST=user_config.get("host"), + PORT=user_config.get("port"), + USERNAME=user_config.get("username"), + PASSWORD=user_config.get("password"), + SAVE_DIR=user_config.get("save_dir"), + NOTE=note + )) + + @DbPersist(_db) + def delete_user_downloader(self, did): + """ + 删除自定义下载器 + """ + self._db.query(SITEBRUSHDOWNLOADERS).filter(SITEBRUSHDOWNLOADERS.ID == int(did)).delete() + + @DbPersist(_db) + def add_filter_group(self, name, default='N'): + """ + 新增规则组 + """ + if default == 'Y': + self.set_default_filtergroup(0) + group_id = self.get_filter_groupid_by_name(name) + if group_id: + self._db.query(CONFIGFILTERGROUP).filter(CONFIGFILTERGROUP.ID == int(group_id)).update({ + "IS_DEFAULT": default + }) + else: + self._db.insert(CONFIGFILTERGROUP( + GROUP_NAME=name, + IS_DEFAULT=default + )) + + def get_filter_groupid_by_name(self, name): + ret = self._db.query(CONFIGFILTERGROUP.ID).filter(CONFIGFILTERGROUP.GROUP_NAME == name).first() + if ret: + return ret[0] + else: + return "" + + @DbPersist(_db) + def set_default_filtergroup(self, groupid): + """ + 设置默认的规则组 + """ + self._db.query(CONFIGFILTERGROUP).filter(CONFIGFILTERGROUP.ID == int(groupid)).update({ + "IS_DEFAULT": 'Y' + }) + self._db.query(CONFIGFILTERGROUP).filter(CONFIGFILTERGROUP.ID != int(groupid)).update({ + "IS_DEFAULT": 'N' + }) + + @DbPersist(_db) + def delete_filtergroup(self, groupid): + """ + 删除规则组 + """ + self._db.query(CONFIGFILTERRULES).filter(CONFIGFILTERRULES.GROUP_ID == groupid).delete() + self._db.query(CONFIGFILTERGROUP).filter(CONFIGFILTERGROUP.ID == int(groupid)).delete() + + @DbPersist(_db) + def delete_filterrule(self, ruleid): + """ + 删除规则 + """ + self._db.query(CONFIGFILTERRULES).filter(CONFIGFILTERRULES.ID == int(ruleid)).delete() + + @DbPersist(_db) + def insert_filter_rule(self, item, ruleid=None): + """ + 新增规则 + """ + if ruleid: + self._db.query(CONFIGFILTERRULES).filter(CONFIGFILTERRULES.ID == int(ruleid)).update( + { + "ROLE_NAME": item.get("name"), + "PRIORITY": item.get("pri"), + "INCLUDE": item.get("include"), + "EXCLUDE": item.get("exclude"), + "SIZE_LIMIT": item.get("size"), + "NOTE": item.get("free") + } + ) + else: + self._db.insert(CONFIGFILTERRULES( + GROUP_ID=item.get("group"), + ROLE_NAME=item.get("name"), + PRIORITY=item.get("pri"), + INCLUDE=item.get("include"), + EXCLUDE=item.get("exclude"), + SIZE_LIMIT=item.get("size"), + NOTE=item.get("free") + )) + + def get_userrss_tasks(self, tid=None): + if tid: + return self._db.query(CONFIGUSERRSS).filter(CONFIGUSERRSS.ID == int(tid)).all() + else: + return self._db.query(CONFIGUSERRSS).order_by(CONFIGUSERRSS.STATE.desc()).all() + + @DbPersist(_db) + def delete_userrss_task(self, tid): + if not tid: + return + self._db.query(CONFIGUSERRSS).filter(CONFIGUSERRSS.ID == int(tid)).delete() + + @DbPersist(_db) + def update_userrss_task_info(self, tid, count): + if not tid: + return + self._db.query(CONFIGUSERRSS).filter(CONFIGUSERRSS.ID == int(tid)).update( + { + "PROCESS_COUNT": CONFIGUSERRSS.PROCESS_COUNT + count, + "UPDATE_TIME": time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(time.time())) + } + ) + + @DbPersist(_db) + def update_userrss_task(self, item): + if item.get("id") and self.get_userrss_tasks(item.get("id")): + self._db.query(CONFIGUSERRSS).filter(CONFIGUSERRSS.ID == int(item.get("id"))).update( + { + "NAME": item.get("name"), + "ADDRESS": item.get("address"), + "PARSER": item.get("parser"), + "INTERVAL": item.get("interval"), + "USES": item.get("uses"), + "INCLUDE": item.get("include"), + "EXCLUDE": item.get("exclude"), + "FILTER": item.get("filter_rule"), + "UPDATE_TIME": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), + "STATE": item.get("state"), + "SAVE_PATH": item.get("save_path"), + "DOWNLOAD_SETTING": item.get("download_setting"), + "RECOGNIZATION": item.get("recognization"), + "OVER_EDITION": int(item.get("over_edition")) if str(item.get("over_edition")).isdigit() else 0, + "SITES": json.dumps(item.get("sites")), + "FILTER_ARGS": json.dumps(item.get("filter_args")), + "NOTE": "" + } + ) + else: + self._db.insert(CONFIGUSERRSS( + NAME=item.get("name"), + ADDRESS=item.get("address"), + PARSER=item.get("parser"), + INTERVAL=item.get("interval"), + USES=item.get("uses"), + INCLUDE=item.get("include"), + EXCLUDE=item.get("exclude"), + FILTER=item.get("filter_rule"), + UPDATE_TIME=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), + STATE=item.get("state"), + SAVE_PATH=item.get("save_path"), + DOWNLOAD_SETTING=item.get("download_setting"), + RECOGNIZATION=item.get("recognization"), + OVER_EDITION=item.get("over_edition"), + SITES=json.dumps(item.get("sites")), + FILTER_ARGS=json.dumps(item.get("filter_args")), + PROCESS_COUNT='0' + )) + + @DbPersist(_db) + def insert_userrss_mediainfos(self, tid=None, mediainfo=None): + if not tid or not mediainfo: + return + taskinfo = self._db.query(CONFIGUSERRSS).filter(CONFIGUSERRSS.ID == int(tid)).all() + if not taskinfo: + return + mediainfos = json.loads(taskinfo[0].MEDIAINFOS) if taskinfo[0].MEDIAINFOS else [] + tmdbid = str(mediainfo.tmdb_id) + season = int(mediainfo.get_season_seq()) + for media in mediainfos: + if media.get("id") == tmdbid and media.get("season") == season: + return + mediainfos.append({ + "id": tmdbid, + "rssid": "", + "season": season, + "name": mediainfo.title + }) + self._db.query(CONFIGUSERRSS).filter(CONFIGUSERRSS.ID == int(tid)).update( + { + "MEDIAINFOS": json.dumps(mediainfos) + }) + + def get_userrss_parser(self, pid=None): + if pid: + return self._db.query(CONFIGRSSPARSER).filter(CONFIGRSSPARSER.ID == int(pid)).first() + else: + return self._db.query(CONFIGRSSPARSER).all() + + @DbPersist(_db) + def delete_userrss_parser(self, pid): + if not pid: + return + self._db.query(CONFIGRSSPARSER).filter(CONFIGRSSPARSER.ID == int(pid)).delete() + + @DbPersist(_db) + def update_userrss_parser(self, item): + if not item: + return + if item.get("id") and self.get_userrss_parser(item.get("id")): + self._db.query(CONFIGRSSPARSER).filter(CONFIGRSSPARSER.ID == int(item.get("id"))).update( + { + "NAME": item.get("name"), + "TYPE": item.get("type"), + "FORMAT": item.get("format"), + "PARAMS": item.get("params") + } + ) + else: + self._db.insert(CONFIGRSSPARSER( + NAME=item.get("name"), + TYPE=item.get("type"), + FORMAT=item.get("format"), + PARAMS=item.get("params") + )) + + @DbPersist(_db) + def excute(self, sql): + return self._db.excute(sql) + + @DbPersist(_db) + def drop_table(self, table_name): + return self._db.excute(f"""DROP TABLE IF EXISTS {table_name}""") + + @DbPersist(_db) + def insert_userrss_task_history(self, task_id, title, downloader): + """ + 增加自定义RSS订阅任务的下载记录 + """ + self._db.insert(USERRSSTASKHISTORY( + TASK_ID=task_id, + TITLE=title, + DOWNLOADER=downloader, + DATE=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + )) + + def get_userrss_task_history(self, task_id): + """ + 查询自定义RSS订阅任务的下载记录 + """ + if not task_id: + return [] + return self._db.query(USERRSSTASKHISTORY).filter(USERRSSTASKHISTORY.TASK_ID == task_id) \ + .order_by(USERRSSTASKHISTORY.DATE.desc()).all() + + def get_rss_history(self, rtype=None, rid=None): + """ + 查询RSS历史 + """ + if rid: + return self._db.query(RSSHISTORY).filter(RSSHISTORY.ID == int(rid)).all() + elif rtype: + return self._db.query(RSSHISTORY).filter(RSSHISTORY.TYPE == rtype) \ + .order_by(RSSHISTORY.FINISH_TIME.desc()).all() + return self._db.query(RSSHISTORY).order_by(RSSHISTORY.FINISH_TIME.desc()).all() + + def is_exists_rss_history(self, rssid): + """ + 判断RSS历史是否存在 + """ + if not rssid: + return False + count = self._db.query(RSSHISTORY).filter(RSSHISTORY.RSSID == rssid).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_rss_history(self, rssid, rtype, name, year, tmdbid, image, desc, season=None, total=None, start=None): + """ + 登记RSS历史 + """ + if not self.is_exists_rss_history(rssid): + self._db.insert(RSSHISTORY( + TYPE=rtype, + RSSID=rssid, + NAME=name, + YEAR=year, + TMDBID=tmdbid, + SEASON=season, + IMAGE=image, + DESC=desc, + TOTAL=total, + START=start, + FINISH_TIME=time.strftime('%Y-%m-%d %H:%M:%S', + time.localtime(time.time())) + )) + + @DbPersist(_db) + def delete_rss_history(self, rssid): + """ + 删除RSS历史 + """ + if not rssid: + return + self._db.query(RSSHISTORY).filter(RSSHISTORY.ID == int(rssid)).delete() + + @DbPersist(_db) + def insert_custom_word(self, replaced, replace, front, back, offset, wtype, gid, season, enabled, regex, whelp, + note=None): + """ + 增加自定义识别词 + """ + self._db.insert(CUSTOMWORDS( + REPLACED=replaced, + REPLACE=replace, + FRONT=front, + BACK=back, + OFFSET=offset, + TYPE=int(wtype), + GROUP_ID=int(gid), + SEASON=int(season), + ENABLED=int(enabled), + REGEX=int(regex), + HELP=whelp, + NOTE=note + )) + + @DbPersist(_db) + def delete_custom_word(self, wid): + """ + 删除自定义识别词 + """ + self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.ID == int(wid)).delete() + + @DbPersist(_db) + def check_custom_word(self, wid, enabled): + """ + 设置自定义识别词状态 + """ + self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.ID == int(wid)).update( + { + "ENABLED": int(enabled) + } + ) + + def get_custom_words(self, wid=None, gid=None, enabled=None, wtype=None, regex=None): + """ + 查询自定义识别词 + """ + if wid: + return self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.ID == int(wid)) \ + .order_by(CUSTOMWORDS.GROUP_ID).all() + elif gid: + return self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.GROUP_ID == int(gid)) \ + .order_by(CUSTOMWORDS.GROUP_ID).all() + elif wtype and enabled is not None and regex is not None: + return self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.ENABLED == int(enabled), + CUSTOMWORDS.TYPE == int(wtype), + CUSTOMWORDS.REGEX == int(regex)) \ + .order_by(CUSTOMWORDS.GROUP_ID).all() + return self._db.query(CUSTOMWORDS).all().order_by(CUSTOMWORDS.GROUP_ID) + + def is_custom_words_existed(self, replaced=None, front=None, back=None): + """ + 查询自定义识别词 + """ + if replaced: + count = self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.REPLACED == replaced).count() + elif front and back: + count = self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.FRONT == front, + CUSTOMWORDS.BACK == back).count() + else: + return False + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_custom_word_groups(self, title, year, gtype, tmdbid, season_count, note=None): + """ + 增加自定义识别词组 + """ + self._db.insert(CUSTOMWORDGROUPS( + TITLE=title, + YEAR=year, + TYPE=int(gtype), + TMDBID=int(tmdbid), + SEASON_COUNT=int(season_count), + NOTE=note + )) + + @DbPersist(_db) + def delete_custom_word_group(self, gid): + """ + 删除自定义识别词组 + """ + if not gid: + return + self._db.query(CUSTOMWORDS).filter(CUSTOMWORDS.GROUP_ID == int(gid)).delete() + self._db.query(CUSTOMWORDGROUPS).filter(CUSTOMWORDGROUPS.ID == int(gid)).delete() + + def get_custom_word_groups(self, gid=None, tmdbid=None, gtype=None): + """ + 查询自定义识别词组 + """ + if gid: + return self._db.query(CUSTOMWORDGROUPS).filter(CUSTOMWORDGROUPS.ID == int(gid)).all() + if tmdbid and gtype: + return self._db.query(CUSTOMWORDGROUPS).filter(CUSTOMWORDGROUPS.TMDBID == int(tmdbid), + CUSTOMWORDGROUPS.TYPE == int(gtype)).all() + return self._db.query(CUSTOMWORDGROUPS).all() + + def is_custom_word_group_existed(self, tmdbid=None, gtype=None): + """ + 查询自定义识别词组 + """ + if not gtype or not tmdbid: + return False + count = self._db.query(CUSTOMWORDGROUPS).filter(CUSTOMWORDGROUPS.TMDBID == int(tmdbid), + CUSTOMWORDGROUPS.TYPE == int(gtype)).count() + if count > 0: + return True + else: + return False + + @DbPersist(_db) + def insert_config_sync_path(self, source, dest, unknown, mode, rename, enabled, note=None): + """ + 增加目录同步 + """ + return self._db.insert(CONFIGSYNCPATHS( + SOURCE=source, + DEST=dest, + UNKNOWN=unknown, + MODE=mode, + RENAME=int(rename), + ENABLED=int(enabled), + NOTE=note + )) + + @DbPersist(_db) + def delete_config_sync_path(self, sid): + """ + 删除目录同步 + """ + if not sid: + return + self._db.query(CONFIGSYNCPATHS).filter(CONFIGSYNCPATHS.ID == int(sid)).delete() + + def get_config_sync_paths(self, sid=None): + """ + 查询目录同步 + """ + if sid: + return self._db.query(CONFIGSYNCPATHS).filter(CONFIGSYNCPATHS.ID == int(sid)).all() + return self._db.query(CONFIGSYNCPATHS).all() + + @DbPersist(_db) + def check_config_sync_paths(self, sid=None, source=None, rename=None, enabled=None): + """ + 设置目录同步状态 + """ + if sid and rename is not None: + self._db.query(CONFIGSYNCPATHS).filter(CONFIGSYNCPATHS.ID == int(sid)).update( + { + "RENAME": int(rename) + } + ) + elif sid and enabled is not None: + self._db.query(CONFIGSYNCPATHS).filter(CONFIGSYNCPATHS.ID == int(sid)).update( + { + "ENABLED": int(enabled) + } + ) + elif source and enabled is not None: + self._db.query(CONFIGSYNCPATHS).filter(CONFIGSYNCPATHS.SOURCE == source).update( + { + "ENABLED": int(enabled) + } + ) + + @DbPersist(_db) + def delete_download_setting(self, sid): + """ + 删除下载设置 + """ + if not sid: + return + self._db.query(DOWNLOADSETTING).filter(DOWNLOADSETTING.ID == int(sid)).delete() + + def get_download_setting(self, sid=None): + """ + 查询下载设置 + """ + if sid: + return self._db.query(DOWNLOADSETTING).filter(DOWNLOADSETTING.ID == int(sid)).all() + return self._db.query(DOWNLOADSETTING).all() + + @DbPersist(_db) + def update_download_setting(self, + sid, + name, + category, + tags, + content_layout, + is_paused, + upload_limit, + download_limit, + ratio_limit, + seeding_time_limit, + downloader): + """ + 设置下载设置 + """ + if sid: + self._db.query(DOWNLOADSETTING).filter(DOWNLOADSETTING.ID == int(sid)).update( + { + "NAME": name, + "CATEGORY": category, + "TAGS": tags, + "CONTENT_LAYOUT": int(content_layout), + "IS_PAUSED": int(is_paused), + "UPLOAD_LIMIT": int(float(upload_limit)), + "DOWNLOAD_LIMIT": int(float(download_limit)), + "RATIO_LIMIT": int(round(float(ratio_limit), 2) * 100), + "SEEDING_TIME_LIMIT": int(float(seeding_time_limit)), + "DOWNLOADER": downloader + } + ) + else: + self._db.insert(DOWNLOADSETTING( + NAME=name, + CATEGORY=category, + TAGS=tags, + CONTENT_LAYOUT=int(content_layout), + IS_PAUSED=int(is_paused), + UPLOAD_LIMIT=int(float(upload_limit)), + DOWNLOAD_LIMIT=int(float(download_limit)), + RATIO_LIMIT=int(round(float(ratio_limit), 2) * 100), + SEEDING_TIME_LIMIT=int(float(seeding_time_limit)), + DOWNLOADER=downloader + )) + + @DbPersist(_db) + def delete_message_client(self, cid): + """ + 删除消息服务器 + """ + if not cid: + return + self._db.query(MESSAGECLIENT).filter(MESSAGECLIENT.ID == int(cid)).delete() + + def get_message_client(self, cid=None): + """ + 查询消息服务器 + """ + if cid: + return self._db.query(MESSAGECLIENT).filter(MESSAGECLIENT.ID == int(cid)).all() + return self._db.query(MESSAGECLIENT).order_by(MESSAGECLIENT.TYPE).all() + + @DbPersist(_db) + def insert_message_client(self, + name, + ctype, + config, + switchs: list, + interactive, + enabled, + note=''): + """ + 设置消息服务器 + """ + self._db.insert(MESSAGECLIENT( + NAME=name, + TYPE=ctype, + CONFIG=config, + SWITCHS=json.dumps(switchs), + INTERACTIVE=int(interactive), + ENABLED=int(enabled), + NOTE=note + )) + + @DbPersist(_db) + def check_message_client(self, cid=None, interactive=None, enabled=None, ctype=None): + """ + 设置目录同步状态 + """ + if cid and interactive is not None: + self._db.query(MESSAGECLIENT).filter(MESSAGECLIENT.ID == int(cid)).update( + { + "INTERACTIVE": int(interactive) + } + ) + elif cid and enabled is not None: + self._db.query(MESSAGECLIENT).filter(MESSAGECLIENT.ID == int(cid)).update( + { + "ENABLED": int(enabled) + } + ) + elif not cid and int(interactive) == 0 and ctype: + self._db.query(MESSAGECLIENT).filter(MESSAGECLIENT.INTERACTIVE == 1, + MESSAGECLIENT.TYPE == ctype).update( + { + "INTERACTIVE": 0 + } + ) + + @DbPersist(_db) + def delete_torrent_remove_task(self, tid): + """ + 删除自动删种策略 + """ + if not tid: + return + self._db.query(TORRENTREMOVETASK).filter(TORRENTREMOVETASK.ID == int(tid)).delete() + + def get_torrent_remove_tasks(self, tid=None): + """ + 查询自动删种策略 + """ + if tid: + return self._db.query(TORRENTREMOVETASK).filter(TORRENTREMOVETASK.ID == int(tid)).all() + return self._db.query(TORRENTREMOVETASK).order_by(TORRENTREMOVETASK.NAME).all() + + @DbPersist(_db) + def insert_torrent_remove_task(self, + name, + action, + interval, + enabled, + samedata, + onlynastool, + downloader, + config: dict, + note=None): + """ + 设置自动删种策略 + """ + self._db.insert(TORRENTREMOVETASK( + NAME=name, + ACTION=int(action), + INTERVAL=int(interval), + ENABLED=int(enabled), + SAMEDATA=int(samedata), + ONLYNASTOOL=int(onlynastool), + DOWNLOADER=downloader, + CONFIG=json.dumps(config), + NOTE=note + )) + + @DbPersist(_db) + def delete_douban_history(self, hid): + """ + 删除豆瓣同步记录 + """ + if not hid: + return + self._db.query(DOUBANMEDIAS).filter(DOUBANMEDIAS.ID == int(hid)).delete() + + def get_douban_history(self): + """ + 查询豆瓣同步记录 + """ + return self._db.query(DOUBANMEDIAS).order_by(DOUBANMEDIAS.ADD_TIME.desc()).all() diff --git a/app/helper/dict_helper.py b/app/helper/dict_helper.py new file mode 100644 index 0000000..768d3c5 --- /dev/null +++ b/app/helper/dict_helper.py @@ -0,0 +1,79 @@ +from app.db import MainDb, DbPersist +from app.db.models import SYSTEMDICT + + +class DictHelper: + + _db = MainDb() + + @DbPersist(_db) + def set(self, dtype, key, value, note=""): + """ + 设置字典值 + :param dtype: 字典类型 + :param key: 字典Key + :param value: 字典值 + :param note: 备注 + :return: True False + """ + if not dtype or not key or not value: + return False + if self.exists(dtype, key): + return self._db.query(SYSTEMDICT).filter(SYSTEMDICT.TYPE == dtype, + SYSTEMDICT.KEY == key).update( + { + "VALUE": value + } + ) + else: + return self._db.insert(SYSTEMDICT( + TYPE=dtype, + KEY=key, + VALUE=value, + NOTE=note + )) + + def get(self, dtype, key): + """ + 查询字典值 + :param dtype: 字典类型 + :param key: 字典Key + :return: 返回字典值 + """ + if not dtype or not key: + return "" + ret = self._db.query(SYSTEMDICT.VALUE).filter(SYSTEMDICT.TYPE == dtype, + SYSTEMDICT.KEY == key).first() + if ret: + return ret[0] + else: + return "" + + @DbPersist(_db) + def delete(self, dtype, key): + """ + 删除字典值 + :param dtype: 字典类型 + :param key: 字典Key + :return: True False + """ + if not dtype or not key: + return False + return self._db.query(SYSTEMDICT).filter(SYSTEMDICT.TYPE == dtype, + SYSTEMDICT.KEY == key).delete() + + def exists(self, dtype, key): + """ + 查询字典是否存在 + :param dtype: 字典类型 + :param key: 字典Key + :return: True False + """ + if not dtype or not key: + return False + ret = self._db.query(SYSTEMDICT).filter(SYSTEMDICT.TYPE == dtype, + SYSTEMDICT.KEY == key).count() + if ret > 0: + return True + else: + return False diff --git a/app/helper/display_helper.py b/app/helper/display_helper.py new file mode 100644 index 0000000..47f8004 --- /dev/null +++ b/app/helper/display_helper.py @@ -0,0 +1,43 @@ +import os + +from pyvirtualdisplay import Display + +from app.utils.commons import singleton +from app.utils import ExceptionUtils +from config import XVFB_PATH + + +@singleton +class DisplayHelper(object): + _display = None + + def __init__(self): + self.init_config() + + def init_config(self): + self.quit() + if self.can_display(): + try: + self._display = Display(visible=False, size=(1024, 768)) + self._display.start() + os.environ["NASTOOL_DISPLAY"] = "true" + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def get_display(self): + return self._display + + def quit(self): + os.environ["NASTOOL_DISPLAY"] = "" + if self._display: + self._display.stop() + + @staticmethod + def can_display(): + for path in XVFB_PATH: + if os.path.exists(path): + return True + return False + + def __del__(self): + self.quit() diff --git a/app/helper/ffmpeg_helper.py b/app/helper/ffmpeg_helper.py new file mode 100644 index 0000000..c75ba4f --- /dev/null +++ b/app/helper/ffmpeg_helper.py @@ -0,0 +1,19 @@ +from app.utils import SystemUtils + + +class FfmpegHelper: + + @staticmethod + def get_thumb_image_from_video(video_path, image_path, frames="00:03:01"): + """ + 使用ffmpeg从视频文件中截取缩略图 + """ + if not video_path or not image_path: + return False + cmd = 'ffmpeg -i "{video_path}" -ss {frames} -vframes 1 -f image2 "{image_path}"'.format(video_path=video_path, + frames=frames, + image_path=image_path) + result = SystemUtils.execute(cmd) + if result: + return True + return False diff --git a/app/helper/indexer_helper.py b/app/helper/indexer_helper.py new file mode 100644 index 0000000..82f31f9 --- /dev/null +++ b/app/helper/indexer_helper.py @@ -0,0 +1,113 @@ +import os.path +import pickle + +from app.utils import StringUtils, ExceptionUtils +from app.utils.commons import singleton +from config import Config + + +@singleton +class IndexerHelper: + _indexers = [] + + def __init__(self): + self.init_config() + + def init_config(self): + try: + with open(os.path.join(Config().get_inner_config_path(), + "sites.dat"), + "rb") as f: + self._indexers = pickle.load(f) + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def get_all_indexers(self): + return self._indexers + + def get_indexer(self, + url, + cookie=None, + name=None, + rule=None, + public=None, + proxy=False, + parser=None, + ua=None, + render=None, + language=None, + pri=None): + if not url: + return None + for indexer in self._indexers: + if not indexer.get("domain"): + continue + if StringUtils.url_equal(indexer.get("domain"), url): + return IndexerConf(datas=indexer, + cookie=cookie, + name=name, + rule=rule, + public=public, + proxy=proxy, + parser=parser, + ua=ua, + render=render, + builtin=True, + language=language, + pri=pri) + return None + + +class IndexerConf(object): + + def __init__(self, + datas=None, + cookie=None, + name=None, + rule=None, + public=None, + proxy=False, + parser=None, + ua=None, + render=None, + builtin=True, + language=None, + pri=None): + if not datas: + return + # ID + self.id = datas.get('id') + # 名称 + self.name = datas.get('name') if not name else name + # 是否内置站点 + self.builtin = builtin + # 域名 + self.domain = datas.get('domain') + # 搜索 + self.search = datas.get('search', {}) + # 批量搜索,如果为空对象则表示不支持批量搜索 + self.batch = self.search.get("batch", {}) if builtin else {} + # 解析器 + self.parser = parser if parser is not None else datas.get('parser') + # 是否启用渲染 + self.render = render if render is not None else datas.get("render") + # 浏览 + self.browse = datas.get('browse', {}) + # 种子过滤 + self.torrents = datas.get('torrents', {}) + # 分类 + self.category = datas.get('category', {}) + # Cookie + self.cookie = cookie + # User-Agent + self.ua = ua + # 过滤规则 + self.rule = rule + # 是否公开站点 + self.public = public + # 是否使用代理 + self.proxy = proxy + # 仅支持的特定语种 + self.language = language + # 索引器优先级 + self.pri = pri if pri else 0 diff --git a/app/helper/meta_helper.py b/app/helper/meta_helper.py new file mode 100644 index 0000000..0385703 --- /dev/null +++ b/app/helper/meta_helper.py @@ -0,0 +1,229 @@ +import os +import pickle +import random +import time +from enum import Enum +from threading import RLock + +from app.utils import ExceptionUtils +from app.utils.commons import singleton +from config import Config + +lock = RLock() + +CACHE_EXPIRE_TIMESTAMP_STR = "cache_expire_timestamp" +EXPIRE_TIMESTAMP = 7 * 24 * 3600 + + +@singleton +class MetaHelper(object): + """ + { + "id": '', + "title": '', + "year": '', + "type": MediaType + } + """ + _meta_data = {} + + _meta_path = None + _tmdb_cache_expire = False + + def __init__(self): + self.init_config() + + def init_config(self): + laboratory = Config().get_config('laboratory') + if laboratory: + self._tmdb_cache_expire = laboratory.get("tmdb_cache_expire") + self._meta_path = os.path.join(Config().get_config_path(), 'tmdb.dat') + self._meta_data = self.__load_meta_data(self._meta_path) + + def clear_meta_data(self): + """ + 清空所有TMDB缓存 + """ + with lock: + self._meta_data = {} + + def get_meta_data_path(self): + """ + 返回TMDB缓存文件路径 + """ + return self._meta_path + + def get_meta_data_by_key(self, key): + """ + 根据KEY值获取缓存值 + """ + with lock: + info: dict = self._meta_data.get(key) + if info: + expire = info.get(CACHE_EXPIRE_TIMESTAMP_STR) + if not expire or int(time.time()) < expire: + info[CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + self.update_meta_data({key: info}) + elif expire and self._tmdb_cache_expire: + self.delete_meta_data(key) + return info or {} + + def dump_meta_data(self, search, page, num): + """ + 分页获取当前缓存列表 + @param search: 检索的缓存key + @param page: 页码 + @param num: 单页大小 + @return: 总数, 缓存列表 + """ + if page == 1: + begin_pos = 0 + else: + begin_pos = (page - 1) * num + + with lock: + search_metas = [(k, { + "id": v.get("id"), + "title": v.get("title"), + "year": v.get("year"), + "media_type": v.get("type").value if isinstance(v.get("type"), Enum) else v.get("type"), + "poster_path": v.get("poster_path"), + "backdrop_path": v.get("backdrop_path") + }, str(k).replace("[电影]", "").replace("[电视剧]", "").replace("[未知]", "").replace("-None", "")) + for k, v in self._meta_data.items() if search.lower() in k.lower() and v.get("id") != 0] + return len(search_metas), search_metas[begin_pos: begin_pos + num] + + def delete_meta_data(self, key): + """ + 删除缓存信息 + @param key: 缓存key + @return: 被删除的缓存内容 + """ + with lock: + return self._meta_data.pop(key, None) + + def delete_meta_data_by_tmdbid(self, tmdbid): + """ + 清空对应TMDBID的所有缓存记录,以强制更新TMDB中最新的数据 + """ + for key in list(self._meta_data): + if str(self._meta_data.get(key, {}).get("id")) == str(tmdbid): + with lock: + self._meta_data.pop(key) + + def delete_unknown_meta(self): + """ + 清除未识别的缓存记录,以便重新检索TMDB + """ + for key in list(self._meta_data): + if str(self._meta_data.get(key, {}).get("id")) == '0': + with lock: + self._meta_data.pop(key) + + def modify_meta_data(self, key, title): + """ + 删除缓存信息 + @param key: 缓存key + @param title: 标题 + @return: 被修改后缓存内容 + """ + with lock: + if self._meta_data.get(key): + self._meta_data[key]['title'] = title + self._meta_data[key][CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + return self._meta_data.get(key) + + @staticmethod + def __load_meta_data(path): + """ + 从文件中加载缓存 + """ + try: + if os.path.exists(path): + with open(path, 'rb') as f: + data = pickle.load(f) + return data + return {} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {} + + def update_meta_data(self, meta_data): + """ + 新增或更新缓存条目 + """ + if not meta_data: + return + with lock: + for key, item in meta_data.items(): + if not self._meta_data.get(key): + item[CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + self._meta_data[key] = item + + def save_meta_data(self, force=False): + """ + 保存缓存数据到文件 + """ + meta_data = self.__load_meta_data(self._meta_path) + new_meta_data = {k: v for k, v in self._meta_data.items() if str(v.get("id")) != '0'} + + if not force \ + and not self._random_sample(new_meta_data) \ + and meta_data.keys() == new_meta_data.keys(): + return + + with open(self._meta_path, 'wb') as f: + pickle.dump(new_meta_data, f, pickle.HIGHEST_PROTOCOL) + + def _random_sample(self, new_meta_data): + """ + 采样分析是否需要保存 + """ + ret = False + if len(new_meta_data) < 25: + keys = list(new_meta_data.keys()) + for k in keys: + info = new_meta_data.get(k) + expire = info.get(CACHE_EXPIRE_TIMESTAMP_STR) + if not expire: + ret = True + info[CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + elif int(time.time()) >= expire: + ret = True + if self._tmdb_cache_expire: + new_meta_data.pop(k) + else: + count = 0 + keys = random.sample(new_meta_data.keys(), 25) + for k in keys: + info = new_meta_data.get(k) + expire = info.get(CACHE_EXPIRE_TIMESTAMP_STR) + if not expire: + ret = True + info[CACHE_EXPIRE_TIMESTAMP_STR] = int(time.time()) + EXPIRE_TIMESTAMP + elif int(time.time()) >= expire: + ret = True + if self._tmdb_cache_expire: + new_meta_data.pop(k) + count += 1 + if count >= 5: + ret |= self._random_sample(new_meta_data) + return ret + + def get_cache_title(self, key): + """ + 获取缓存的标题 + """ + cache_media_info = self._meta_data.get(key) + if not cache_media_info or not cache_media_info.get("id"): + return None + return cache_media_info.get("title") + + def set_cache_title(self, key, cn_title): + """ + 重新设置缓存标题 + """ + cache_media_info = self._meta_data.get(key) + if not cache_media_info: + return + self._meta_data[key]['title'] = cn_title diff --git a/app/helper/ocr_helper.py b/app/helper/ocr_helper.py new file mode 100644 index 0000000..04dfa2f --- /dev/null +++ b/app/helper/ocr_helper.py @@ -0,0 +1,31 @@ +import base64 + +from app.utils import RequestUtils +from config import DEFAULT_OCR_SERVER + + +class OcrHelper: + req = None + _ocr_b64_url = "%s/captcha/base64" % DEFAULT_OCR_SERVER + + def __init__(self): + self.req = RequestUtils(content_type="application/json") + + def get_captcha_text(self, image_url=None, image_b64=None): + """ + 根据图片地址,获取验证码图片,并识别内容 + """ + if not image_url and not image_b64: + return "" + if image_url: + ret = self.req.get_res(image_url) + if ret is not None: + image_bin = ret.content + if not image_bin: + return "" + image_b64 = base64.b64encode(image_bin).decode() + ret = self.req.post_res(url=self._ocr_b64_url, + json={"base64_img": image_b64}) + if ret: + return ret.json().get("result") + return "" diff --git a/app/helper/opensubtitles.py b/app/helper/opensubtitles.py new file mode 100644 index 0000000..01cdb9e --- /dev/null +++ b/app/helper/opensubtitles.py @@ -0,0 +1,103 @@ +from functools import lru_cache +from urllib.parse import quote + +from pyquery import PyQuery + +import log +from app.helper.chrome_helper import ChromeHelper +from config import Config + + +class OpenSubtitles: + _cookie = "" + _ua = None + _url_imdbid = "https://www.opensubtitles.org/zh/search/imdbid-%s/sublanguageid-chi" + _url_keyword = "https://www.opensubtitles.org/zh/search/moviename-%s/sublanguageid-chi" + + def __init__(self): + self._ua = Config().get_ua() + + def search_subtitles(self, query): + if query.get("imdbid"): + return self.__search_subtitles_by_imdbid(query.get("imdbid")) + else: + return self.__search_subtitles_by_keyword("%s %s" % (query.get("name"), query.get("year"))) + + def __search_subtitles_by_imdbid(self, imdbid): + """ + 按TMDBID搜索OpenSubtitles + """ + return self.__parse_opensubtitles_results(url=self._url_imdbid % str(imdbid).replace("tt", "")) + + def __search_subtitles_by_keyword(self, keyword): + """ + 按关键字搜索OpenSubtitles + """ + return self.__parse_opensubtitles_results(url=self._url_keyword % quote(keyword)) + + @classmethod + @lru_cache(maxsize=128) + def __parse_opensubtitles_results(cls, url): + """ + 搜索并解析结果 + """ + chrome = ChromeHelper() + if not chrome.get_status(): + log.error("【Subtitle】未找到浏览器内核,当前环境无法检索opensubtitles字幕!") + return [] + # 访问页面 + if not chrome.visit(url): + log.error("【Subtitle】无法连接opensubtitles.org!") + return [] + # 源码 + html_text = chrome.get_html() + # Cookie + cls._cookie = chrome.get_cookies() + # 解析列表 + ret_subtitles = [] + html_doc = PyQuery(html_text) + global_season = '' + for tr in html_doc('#search_results > tbody > tr:not([style])'): + tr_doc = PyQuery(tr) + # 季 + season = tr_doc('span[id^="season-"] > a > b').text() + if season: + global_season = season + continue + # 集 + episode = tr_doc('span[itemprop="episodeNumber"]').text() + # 标题 + title = tr_doc('strong > a.bnone').text() + # 描述 下载链接 + if not global_season: + description = tr_doc('td:nth-child(1)').text() + if description and len(description.split("\n")) > 1: + description = description.split("\n")[1] + link = tr_doc('td:nth-child(5) > a').attr("href") + else: + description = tr_doc('span[itemprop="name"]').text() + link = tr_doc('a[href^="/download/"]').attr("href") + if link: + link = "https://www.opensubtitles.org%s" % link + else: + continue + ret_subtitles.append({ + "season": global_season, + "episode": episode, + "title": title, + "description": description, + "link": link + }) + return ret_subtitles + + def get_cookie(self): + """ + 返回Cookie + """ + return self._cookie + + def get_ua(self): + """ + 返回User-Agent + """ + return self._ua diff --git a/app/helper/progress_helper.py b/app/helper/progress_helper.py new file mode 100644 index 0000000..8bc388a --- /dev/null +++ b/app/helper/progress_helper.py @@ -0,0 +1,39 @@ +from app.utils.commons import singleton + + +@singleton +class ProgressHelper(object): + _process_detail = {} + + def __init__(self): + self._process_detail = {} + + def init_config(self): + pass + + def reset(self, ptype="search"): + self._process_detail[ptype] = { + "enable": False, + "value": 0, + "text": "请稍候..." + } + + def start(self, ptype="search"): + self.reset(ptype) + self._process_detail[ptype]['enable'] = True + + def end(self, ptype="search"): + if not self._process_detail.get(ptype): + return + self._process_detail[ptype]['enable'] = False + + def update(self, value=None, text=None, ptype="search"): + if not self._process_detail.get(ptype, {}).get('enable'): + return + if value: + self._process_detail[ptype]['value'] = value + if text: + self._process_detail[ptype]['text'] = text + + def get_process(self, ptype="search"): + return self._process_detail.get(ptype) diff --git a/app/helper/security_helper.py b/app/helper/security_helper.py new file mode 100644 index 0000000..cc6ec84 --- /dev/null +++ b/app/helper/security_helper.py @@ -0,0 +1,65 @@ +import ipaddress + +from app.utils import ExceptionUtils +from config import Config + + +class SecurityHelper: + media_server_webhook_allow_ip = {} + telegram_webhook_allow_ip = {} + synology_webhook_allow_ip = {} + + def __init__(self): + security = Config().get_config('security') + if security: + self.media_server_webhook_allow_ip = security.get('media_server_webhook_allow_ip') or {} + self.telegram_webhook_allow_ip = security.get('telegram_webhook_allow_ip') or {} + self.synology_webhook_allow_ip = security.get('synology_webhook_allow_ip') or {} + + def check_mediaserver_ip(self, ip): + return self.allow_access(self.media_server_webhook_allow_ip, ip) + + def check_telegram_ip(self, ip): + return self.allow_access(self.telegram_webhook_allow_ip, ip) + + def check_synology_ip(self, ip): + return self.allow_access(self.synology_webhook_allow_ip, ip) + + def check_slack_ip(self, ip): + return self.allow_access({"ipve": "127.0.0.1"}, ip) + + @staticmethod + def allow_access(allow_ips, ip): + """ + 判断IP是否合法 + :param allow_ips: 充许的IP范围 {"ipv4":, "ipv6":} + :param ip: 需要检查的ip + """ + if not allow_ips: + return True + try: + ipaddr = ipaddress.ip_address(ip) + if ipaddr.version == 4: + if not allow_ips.get('ipv4'): + return True + allow_ipv4s = allow_ips.get('ipv4').split(",") + for allow_ipv4 in allow_ipv4s: + if ipaddr in ipaddress.ip_network(allow_ipv4): + return True + elif ipaddr.ipv4_mapped: + if not allow_ips.get('ipv4'): + return True + allow_ipv4s = allow_ips.get('ipv4').split(",") + for allow_ipv4 in allow_ipv4s: + if ipaddr.ipv4_mapped in ipaddress.ip_network(allow_ipv4): + return True + else: + if not allow_ips.get('ipv6'): + return True + allow_ipv6s = allow_ips.get('ipv6').split(",") + for allow_ipv6 in allow_ipv6s: + if ipaddr in ipaddress.ip_network(allow_ipv6): + return True + except Exception as e: + ExceptionUtils.exception_traceback(e) + return False diff --git a/app/helper/site_helper.py b/app/helper/site_helper.py new file mode 100644 index 0000000..85f5e08 --- /dev/null +++ b/app/helper/site_helper.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from lxml import etree + + +class SiteHelper: + @classmethod + def is_logged_in(cls, html_text): + """ + 判断站点是否已经登陆 + :param html_text: + :return: + """ + html = etree.HTML(html_text) + if not html: + return False + # 存在明显的密码输入框,说明未登录 + if html.xpath("//input[@type='password']"): + return False + # 是否存在登出和用户面板等链接 + logout_or_usercp = html.xpath('//a[contains(@href, "logout") or contains(@data-url, "logout")' + ' or contains(@href, "mybonus") ' + ' or contains(@onclick, "logout") or contains(@href, "usercp")]') + + if logout_or_usercp: + return True + + user_info_div = html.xpath('//div[@class="user-info-side"]') + if user_info_div: + return True + + return False diff --git a/app/helper/submodule_helper.py b/app/helper/submodule_helper.py new file mode 100644 index 0000000..0518c79 --- /dev/null +++ b/app/helper/submodule_helper.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +import importlib +import pkgutil + + +class SubmoduleHelper: + @classmethod + def import_submodules(cls, package, filter_func=lambda name, obj: True): + """ + 导入子模块 + :param package: 父包名 + :param filter_func: 子模块过滤函数,入参为模块名和模块对象,返回True则导入,否则不导入 + :return: + """ + + submodules = [] + packages = importlib.import_module(package).__path__ + for importer, package_name, _ in pkgutil.iter_modules(packages): + full_package_name = f'{package}.{package_name}' + if full_package_name.startswith('_'): + continue + module = importlib.import_module(full_package_name) + for name, obj in module.__dict__.items(): + if name.startswith('_'): + continue + if isinstance(obj, type) and filter_func(name, obj): + submodules.append(obj) + + return submodules diff --git a/app/helper/thread_helper.py b/app/helper/thread_helper.py new file mode 100644 index 0000000..5b1cedb --- /dev/null +++ b/app/helper/thread_helper.py @@ -0,0 +1,18 @@ +from concurrent.futures import ThreadPoolExecutor + +from app.utils.commons import singleton + + +@singleton +class ThreadHelper: + _thread_num = 50 + executor = None + + def __init__(self): + self.executor = ThreadPoolExecutor(max_workers=self._thread_num) + + def init_config(self): + pass + + def start_thread(self, func, kwargs): + self.executor.submit(func, *kwargs) diff --git a/app/helper/words_helper.py b/app/helper/words_helper.py new file mode 100644 index 0000000..b6c880e --- /dev/null +++ b/app/helper/words_helper.py @@ -0,0 +1,202 @@ +import regex as re + +from app.helper import DbHelper +from app.utils.commons import singleton +from app.utils.exception_utils import ExceptionUtils + + +@singleton +class WordsHelper: + dbhelper = None + ignored_words_info = [] + ignored_words_noregex_info = [] + replaced_words_info = [] + replaced_words_noregex_info = [] + replaced_offset_words_info = [] + offset_words_info = [] + + def __init__(self): + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.ignored_words_info = self.dbhelper.get_custom_words(enabled=1, wtype=1, regex=1) + self.ignored_words_noregex_info = self.dbhelper.get_custom_words(enabled=1, wtype=1, regex=0) + self.replaced_words_info = self.dbhelper.get_custom_words(enabled=1, wtype=2, regex=1) + self.replaced_words_noregex_info = self.dbhelper.get_custom_words(enabled=1, wtype=2, regex=0) + self.replaced_offset_words_info = self.dbhelper.get_custom_words(enabled=1, wtype=3, regex=1) + self.offset_words_info = self.dbhelper.get_custom_words(enabled=1, wtype=4, regex=1) + + def process(self, title): + # 错误信息 + msg = [] + # 应用自定义识别 + used_ignored_words = [] + # 应用替换 + used_replaced_words = [] + # 应用集偏移 + used_offset_words = [] + # 屏蔽 + if self.ignored_words_info: + for ignored_word_info in self.ignored_words_info: + ignored = ignored_word_info.REPLACED + ignored_word = ignored + title, ignore_msg, ignore_flag = self.replace_regex(replaced=ignored, + replace="", + title=title) + if ignore_flag: + used_ignored_words.append(ignored_word) + elif ignore_msg: + msg.append(f"自定义屏蔽词 {ignored_word} 设置有误:{ignore_msg}") + if self.ignored_words_noregex_info: + for ignored_word_noregex_info in self.ignored_words_noregex_info: + ignored = ignored_word_noregex_info.REPLACED + ignored_word = ignored + title, ignore_msg, ignore_flag = self.replace_noregex(replaced=ignored, + replace="", + title=title) + if ignore_flag: + used_ignored_words.append(ignored_word) + elif ignore_msg: + msg.append(f"自定义屏蔽词 {ignored_word} 设置有误:{ignore_msg}") + # 替换 + if self.replaced_words_info: + for replaced_word_info in self.replaced_words_info: + replaced = replaced_word_info.REPLACED + replace = replaced_word_info.REPLACE + replaced_word = f"{replaced}@{replace}" + title, replace_msg, replace_flag = self.replace_regex(replaced=replaced, + replace=replace, + title=title) + if replace_flag: + used_replaced_words.append(replaced_word) + elif replace_msg: + msg.append(f"自定义替换词 {replaced_word} 格式有误:{replace_msg}") + if self.replaced_words_noregex_info: + for replaced_word_noregex_info in self.replaced_words_noregex_info: + replaced = replaced_word_noregex_info.REPLACED + replace = replaced_word_noregex_info.REPLACE + replaced_word = f"{replaced}@{replace}" + title, replace_msg, replace_flag = self.replace_noregex(replaced=replaced, + replace=replace, + title=title) + if replace_flag: + used_replaced_words.append(replaced_word) + elif replace_msg: + msg.append(f"自定义替换词 {replaced_word} 格式有误:{replace_msg}") + # 替换+集偏移 + if self.replaced_offset_words_info: + for replaced_offset_word_info in self.replaced_offset_words_info: + replaced = replaced_offset_word_info.REPLACED + replace = replaced_offset_word_info.REPLACE + front = replaced_offset_word_info.FRONT + back = replaced_offset_word_info.BACK + offset = replaced_offset_word_info.OFFSET + replaced_word = f"{replaced}@{replace}" + offset_word = f"{front}@{back}@{offset}" + replaced_offset_word = f"{replaced}@{replace}@{front}@{back}@{offset}" + # 替换 + title_replace, replace_msg, replace_flag = self.replace_regex(replaced=replaced, + replace=replace, + title=title) + # 替换应用成功进行集数偏移 + if replace_flag: + title_offset, offset_msg, offset_flag = self.episode_offset(front=front, + back=back, + offset=offset, + title=title_replace) + # 集数偏移应用成功 + if offset_flag: + used_replaced_words.append(replaced_word) + used_offset_words.append(offset_word) + title = title_offset + elif offset_msg: + msg.append(f"自定义替换+集偏移词 {replaced_offset_word} 集偏移部分格式有误:{offset_msg}") + elif replace_msg: + msg.append(f"自定义替换+集偏移词 {replaced_offset_word} 替换部分格式有误:{replace_msg}") + # 集数偏移 + if self.offset_words_info: + for offset_word_info in self.offset_words_info: + front = offset_word_info.FRONT + back = offset_word_info.BACK + offset = offset_word_info.OFFSET + offset_word = f"{front}@{back}@{offset}" + title, offset_msg, offset_flag = self.episode_offset(front, back, offset, title) + if offset_flag: + used_offset_words.append(offset_word) + elif offset_msg: + msg.append(f"自定义集偏移词 {offset_word} 格式有误:{offset_msg}") + + return title, msg, {"ignored": used_ignored_words, + "replaced": used_replaced_words, + "offset": used_offset_words} + + @staticmethod + def replace_regex(replaced, replace, title): + msg = "" + try: + if not re.findall(r'%s' % replaced, title): + return title, msg, False + else: + title = re.sub(r'%s' % replaced, r'%s' % replace, title) + return title, msg, True + except Exception as err: + ExceptionUtils.exception_traceback(err) + msg = str(err) + return title, msg, False + + @staticmethod + def replace_noregex(replaced, replace, title): + msg = "" + try: + if title.find(replaced) == -1: + return title, msg, False + else: + title = title.replace(replaced, replace) + return title, msg, True + except Exception as err: + ExceptionUtils.exception_traceback(err) + msg = str(err) + return title, msg, False + + @staticmethod + def episode_offset(front, back, offset, title): + msg = "" + try: + if back and not re.findall(r'%s' % back, title): + return title, msg, False + if front and not re.findall(r'%s' % front, title): + return title, msg, False + offset_word_info_re = re.compile(r'(?<=%s.*?)[0-9]+(?=.*?%s)' % (front, back)) + episode_nums_str = re.findall(offset_word_info_re, title) + if not episode_nums_str: + return title, msg, False + episode_nums_offset_int = [] + offset_order_flag = False + for episode_num_str in episode_nums_str: + episode_num_int = int(episode_num_str) + offset_caculate = offset.replace("EP", str(episode_num_int)) + episode_num_offset_int = eval(offset_caculate) + # 向前偏移 + if episode_num_int > episode_num_offset_int: + offset_order_flag = True + # 向后偏移 + else: + offset_order_flag = False + episode_nums_offset_int.append(episode_num_offset_int) + episode_nums_dict = dict(zip(episode_nums_str, episode_nums_offset_int)) + # 集数向前偏移,集数按升序处理 + if offset_order_flag: + episode_nums_list = sorted(episode_nums_dict.items(), key=lambda x: x[1]) + # 集数向后偏移,集数按降序处理 + else: + episode_nums_list = sorted(episode_nums_dict.items(), key=lambda x: x[1], reverse=True) + for episode_num in episode_nums_list: + episode_offset_re = re.compile( + r'(?<=%s.*?)%s(?=.*?%s)' % (front, episode_num[0], back)) + title = re.sub(episode_offset_re, r'%s' % str(episode_num[1]).zfill(2), title) + return title, msg, True + except Exception as err: + ExceptionUtils.exception_traceback(err) + msg = str(err) + return title, msg, False diff --git a/app/indexer/__init__.py b/app/indexer/__init__.py new file mode 100644 index 0000000..256eaa1 --- /dev/null +++ b/app/indexer/__init__.py @@ -0,0 +1 @@ +from .indexer import Indexer diff --git a/app/indexer/client/__init__.py b/app/indexer/client/__init__.py new file mode 100644 index 0000000..370dd6f --- /dev/null +++ b/app/indexer/client/__init__.py @@ -0,0 +1 @@ +from .builtin import BuiltinIndexer diff --git a/app/indexer/client/_base.py b/app/indexer/client/_base.py new file mode 100644 index 0000000..3f0255f --- /dev/null +++ b/app/indexer/client/_base.py @@ -0,0 +1,229 @@ +import datetime +import xml.dom.minidom +from abc import ABCMeta, abstractmethod + +import log +from app.filter import Filter +from app.helper import ProgressHelper +from app.media import Media +from app.media.meta import MetaInfo +from app.utils import DomUtils, RequestUtils, StringUtils, ExceptionUtils +from app.utils.types import MediaType, SearchType + + +class _IIndexClient(metaclass=ABCMeta): + media = None + index_type = None + api_key = None + host = None + filter = None + progress = None + _reverse_title_sites = ['keepfriends'] + + def __init__(self): + self.media = Media() + self.filter = Filter() + self.progress = ProgressHelper() + + @abstractmethod + def match(self, ctype): + """ + 匹配实例 + """ + pass + + @abstractmethod + def get_status(self): + """ + 检查连通性 + """ + pass + + @abstractmethod + def get_indexers(self): + """ + :return: indexer 信息 [(indexerId, indexerName, url)] + """ + pass + + @abstractmethod + def search(self, order_seq, + indexer, + key_word, + filter_args: dict, + match_media, + in_from: SearchType): + """ + 根据关键字多线程检索 + """ + pass + + def filter_search_results(self, result_array: list, + order_seq, + indexer, + filter_args: dict, + match_media, + start_time): + """ + 从检索结果中匹配符合资源条件的记录 + """ + ret_array = [] + index_sucess = 0 + index_rule_fail = 0 + index_match_fail = 0 + index_error = 0 + for item in result_array: + # 这此站标题和副标题相反 + if indexer.id in self._reverse_title_sites: + torrent_name = item.get('description') + description = item.get('title') + else: + torrent_name = item.get('title') + description = item.get('description') + if not torrent_name: + index_error += 1 + continue + enclosure = item.get('enclosure') + size = item.get('size') + seeders = item.get('seeders') + peers = item.get('peers') + page_url = item.get('page_url') + uploadvolumefactor = round(float(item.get('uploadvolumefactor')), 1) if item.get( + 'uploadvolumefactor') is not None else 1.0 + downloadvolumefactor = round(float(item.get('downloadvolumefactor')), 1) if item.get( + 'downloadvolumefactor') is not None else 1.0 + imdbid = item.get("imdbid") + # 全匹配模式下,非公开站点,过滤掉做种数为0的 + if filter_args.get("seeders") and not indexer.public and str(seeders) == "0": + log.info(f"【{self.index_type}】{torrent_name} 做种数为0") + index_rule_fail += 1 + continue + # 识别种子名称 + meta_info = MetaInfo(title=torrent_name, subtitle=description) + if not meta_info.get_name(): + log.info(f"【{self.index_type}】{torrent_name} 无法识别到名称") + index_match_fail += 1 + continue + # 大小及促销等 + meta_info.set_torrent_info(size=size, + imdbid=imdbid, + upload_volume_factor=uploadvolumefactor, + download_volume_factor=downloadvolumefactor) + + # 先过滤掉可以明确的类型 + if meta_info.type == MediaType.TV and filter_args.get("type") == MediaType.MOVIE: + log.info( + f"【{self.index_type}】{torrent_name} 是 {meta_info.type.value},不匹配类型:{filter_args.get('type').value}") + index_rule_fail += 1 + continue + # 检查订阅过滤规则匹配 + match_flag, res_order, match_msg = self.filter.check_torrent_filter(meta_info=meta_info, + filter_args=filter_args, + uploadvolumefactor=uploadvolumefactor, + downloadvolumefactor=downloadvolumefactor) + if not match_flag: + log.info(f"【{self.index_type}】{match_msg}") + index_rule_fail += 1 + continue + # 识别媒体信息 + if not match_media: + # 不过滤 + media_info = meta_info + else: + # 0-识别并模糊匹配;1-识别并精确匹配 + if meta_info.imdb_id \ + and match_media.imdb_id \ + and str(meta_info.imdb_id) == str(match_media.imdb_id): + # IMDBID匹配,合并媒体数据 + media_info = self.media.merge_media_info(meta_info, match_media) + else: + # 查询缓存 + cache_info = self.media.get_cache_info(meta_info) + if match_media \ + and str(cache_info.get("id")) == str(match_media.tmdb_id): + # 缓存匹配,合并媒体数据 + media_info = self.media.merge_media_info(meta_info, match_media) + else: + # 重新识别 + media_info = self.media.get_media_info(title=torrent_name, subtitle=description, chinese=False) + if not media_info: + log.warn(f"【{self.index_type}】{torrent_name} 识别媒体信息出错!") + index_error += 1 + continue + elif not media_info.tmdb_info: + log.info( + f"【{self.index_type}】{torrent_name} 识别为 {media_info.get_name()} 未匹配到媒体信息") + index_match_fail += 1 + continue + # TMDBID是否匹配 + if str(media_info.tmdb_id) != str(match_media.tmdb_id): + log.info( + f"【{self.index_type}】{torrent_name} 识别为 {media_info.type.value} {media_info.get_title_string()} 不匹配") + index_match_fail += 1 + continue + # 合并媒体数据 + media_info = self.media.merge_media_info(media_info, match_media) + # 过滤类型 + if filter_args.get("type"): + if (filter_args.get("type") == MediaType.TV and media_info.type == MediaType.MOVIE) \ + or (filter_args.get("type") == MediaType.MOVIE and media_info.type == MediaType.TV): + log.info( + f"【{self.index_type}】{torrent_name} 是 {media_info.type.value},不是 {filter_args.get('type').value}") + index_rule_fail += 1 + continue + # 洗版 + if match_media.over_edition: + # 季集不完整的资源不要 + if media_info.type != MediaType.MOVIE \ + and media_info.get_episode_list(): + log.info(f"【{self.index_type}】{media_info.get_title_string()}{media_info.get_season_string()} " + f"正在洗版,过滤掉季集不完整的资源:{torrent_name} {description}") + continue + # 检查优先级是否更好 + if match_media.res_order \ + and int(res_order) <= int(match_media.res_order): + log.info( + f"【{self.index_type}】{media_info.get_title_string()}{media_info.get_season_string()} " + f"正在洗版,已洗版优先级:{100 - int(match_media.res_order)}," + f"当前资源优先级:{100 - int(res_order)}," + f"跳过低优先级或同优先级资源:{torrent_name}" + ) + continue + # 检查标题是否匹配季、集、年 + if not self.filter.is_torrent_match_sey(media_info, + filter_args.get("season"), + filter_args.get("episode"), + filter_args.get("year")): + log.info( + f"【{self.index_type}】{torrent_name} 识别为 {media_info.type.value} {media_info.get_title_string()} {media_info.get_season_episode_string()} 不匹配季/集/年份") + index_match_fail += 1 + continue + + # 匹配到了 + log.info( + f"【{self.index_type}】{torrent_name} {description} 识别为 {media_info.get_title_string()} {media_info.get_season_episode_string()} 匹配成功") + media_info.set_torrent_info(site=indexer.name, + site_order=order_seq, + enclosure=enclosure, + res_order=res_order, + filter_rule=filter_args.get("rule"), + size=size, + seeders=seeders, + peers=peers, + description=description, + page_url=page_url, + upload_volume_factor=uploadvolumefactor, + download_volume_factor=downloadvolumefactor) + if media_info not in ret_array: + index_sucess += 1 + ret_array.append(media_info) + else: + index_rule_fail += 1 + # 循环结束 + # 计算耗时 + end_time = datetime.datetime.now() + log.info( + f"【{self.index_type}】{indexer.name} 共检索到 {len(result_array)} 条数据,过滤 {index_rule_fail},不匹配 {index_match_fail},错误 {index_error},有效 {index_sucess},耗时 {(end_time - start_time).seconds} 秒") + self.progress.update(ptype='search', + text=f"{indexer.name} 共检索到 {len(result_array)} 条数据,过滤 {index_rule_fail},不匹配 {index_match_fail},错误 {index_error},有效 {index_sucess},耗时 {(end_time - start_time).seconds} 秒") + return ret_array diff --git a/app/indexer/client/_rarbg.py b/app/indexer/client/_rarbg.py new file mode 100644 index 0000000..e71e553 --- /dev/null +++ b/app/indexer/client/_rarbg.py @@ -0,0 +1,66 @@ +import requests + +import log +from app.utils import RequestUtils +from config import Config + + +class Rarbg: + _appid = "nastool" + _req = None + _token = None + _api_url = "http://torrentapi.org/pubapi_v2.php" + + def __init__(self): + self.init_config() + + def init_config(self): + session = requests.session() + self._req = RequestUtils(proxies=Config().get_proxies(), session=session, timeout=10) + self.__get_token() + + def __get_token(self): + if self._token: + return + res = self._req.get_res(url=self._api_url, params={'app_id': self._appid, 'get_token': 'get_token'}) + if res and res.json(): + self._token = res.json().get('token') + + def search(self, keyword, indexer, imdb_id=None): + if not keyword: + return [] + self.__get_token() + if not self._token: + log.warn(f"【INDEXER】{indexer.name} 未获取到token,无法搜索") + return [] + params = {'app_id': self._appid, 'mode': 'search', 'token': self._token, 'format': 'json_extended', 'limit': 100} + if imdb_id: + params['search_imdb'] = imdb_id + else: + params['search_string'] = keyword + res = self._req.get_res(url=self._api_url, params=params) + torrents = [] + if res and res.status_code == 200: + results = res.json().get('torrent_results') or [] + for result in results: + if not result or not result.get('title'): + continue + torrent = {'indexer': indexer.id, + 'title': result.get('title'), + 'enclosure': result.get('download'), + 'size': result.get('size'), + 'seeders': result.get('seeders'), + 'peers': result.get('leechers'), + 'freeleech': True, + 'downloadvolumefactor': 0.0, + 'uploadvolumefactor': 1.0, + 'page_url': result.get('info_page'), + 'imdbid': result.get('episode_info').get('imdb') if result.get('episode_info') else ''} + torrents.append(torrent) + elif res is not None: + log.warn(f"【INDEXER】{indexer.name} 搜索失败,错误码:{res.status_code}") + return [] + else: + log.warn(f"【INDEXER】{indexer.name} 搜索失败,无法连接 torrentapi.org") + return [] + return torrents diff --git a/app/indexer/client/_render_spider.py b/app/indexer/client/_render_spider.py new file mode 100644 index 0000000..96b8702 --- /dev/null +++ b/app/indexer/client/_render_spider.py @@ -0,0 +1,129 @@ +# coding: utf-8 +import copy +import time +from urllib.parse import quote + +from pyquery import PyQuery +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as es +from selenium.webdriver.support.wait import WebDriverWait + +from app.helper import ChromeHelper +from app.indexer.client._spider import TorrentSpider +from app.utils import ExceptionUtils +from config import Config + + +class RenderSpider(object): + + torrentspider = None + torrents_info_array = [] + result_num = 100 + + def __init__(self): + self.torrentspider = TorrentSpider() + self.init_config() + + def init_config(self): + self.torrents_info_array = [] + self.result_num = Config().get_config('pt').get('site_search_result_num') or 100 + + def search(self, keyword, indexer, page=None, mtype=None): + """ + 开始搜索 + """ + + if not indexer: + return [] + if not keyword: + keyword = "" + if isinstance(keyword, list): + keyword = " ".join(keyword) + chrome = ChromeHelper() + if not chrome.get_status(): + return [] + # 请求路径 + torrentspath = indexer.search.get('paths', [{}])[0].get('path', '') or '' + search_url = indexer.domain + torrentspath.replace("{keyword}", quote(keyword)) + # 请求方式,支持GET和浏览仿真 + method = indexer.search.get('paths', [{}])[0].get('method', '') + if method == "chrome": + # 请求参数 + params = indexer.search.get('paths', [{}])[0].get('params', {}) + # 搜索框 + search_input = params.get('keyword') + # 搜索按钮 + search_button = params.get('submit') + # 预执行脚本 + pre_script = params.get('script') + # referer + if params.get('referer'): + referer = indexer.domain + params.get('referer').replace('{keyword}', quote(keyword)) + else: + referer = indexer.domain + if not search_input or not search_button: + return [] + # 使用浏览器打开页面 + if not chrome.visit(url=search_url, + cookie=indexer.cookie, + ua=indexer.ua): + return [] + cloudflare = chrome.pass_cloudflare() + if not cloudflare: + return [] + # 模拟搜索操作 + try: + # 执行脚本 + if pre_script: + chrome.execute_script(pre_script) + # 等待可点击 + submit_obj = WebDriverWait(driver=chrome.browser, + timeout=10).until(es.element_to_be_clickable((By.XPATH, + search_button))) + if submit_obj: + # 输入用户名 + chrome.browser.find_element(By.XPATH, search_input).send_keys(keyword) + # 提交搜索 + submit_obj.click() + else: + return [] + except Exception as e: + ExceptionUtils.exception_traceback(e) + return [] + else: + # referer + referer = indexer.domain + # 使用浏览器获取HTML文本 + if not chrome.visit(url=search_url, + cookie=indexer.cookie, + ua=indexer.ua): + return [] + cloudflare = chrome.pass_cloudflare() + if not cloudflare: + return [] + # 等待页面加载完成 + time.sleep(5) + # 获取HTML文本 + html_text = chrome.get_html() + if not html_text: + return [] + # 重新获取Cookie和UA + indexer.cookie = chrome.get_cookies() + indexer.ua = chrome.get_ua() + # 设置抓虫参数 + self.torrentspider.setparam(keyword=keyword, + indexer=indexer, + referer=referer, + page=page, + mtype=mtype) + # 种子筛选器 + torrents_selector = indexer.torrents.get('list', {}).get('selector', '') + if not torrents_selector: + return [] + # 解析HTML文本 + html_doc = PyQuery(html_text) + for torn in html_doc(torrents_selector): + self.torrents_info_array.append(copy.deepcopy(self.torrentspider.Getinfo(PyQuery(torn)))) + if len(self.torrents_info_array) >= int(self.result_num): + break + return self.torrents_info_array diff --git a/app/indexer/client/_spider.py b/app/indexer/client/_spider.py new file mode 100644 index 0000000..1258fbf --- /dev/null +++ b/app/indexer/client/_spider.py @@ -0,0 +1,650 @@ +import copy +import datetime +import re +from urllib.parse import quote + +from jinja2 import Template +from pyquery import PyQuery + +import feapder +import log +from app.utils import StringUtils, SystemUtils +from app.utils.exception_utils import ExceptionUtils +from app.utils.types import MediaType +from config import Config +from feapder.utils.tools import urlencode + + +class TorrentSpider(feapder.AirSpider): + _webdriver_path = SystemUtils.get_webdriver_path() + __custom_setting__ = dict( + USE_SESSION=True, + SPIDER_THREAD_COUNT=1, + SPIDER_MAX_RETRY_TIMES=0, + REQUEST_LOST_TIMEOUT=10, + RETRY_FAILED_REQUESTS=False, + LOG_LEVEL="ERROR", + RANDOM_HEADERS=False, + WEBDRIVER=dict( + pool_size=1, + load_images=False, + proxy=None, + headless=True, + driver_type="CHROME", + timeout=20, + window_size=(1024, 800), + executable_path=_webdriver_path, + render_time=10, + custom_argument=["--ignore-certificate-errors"], + ) + ) + # 是否检索完成标志 + is_complete = False + # 索引器ID + indexerid = None + # 索引器名称 + indexername = None + # 站点域名 + domain = None + # 站点Cookie + cookie = None + # 站点UA + ua = None + # 代理 + proxies = None + # 是否渲染 + render = False + # Referer + referer = None + # 检索关键字 + keyword = None + # 媒体类型 + mtype = None + # 检索路径、方式配置 + search = {} + # 批量检索配置 + batch = {} + # 浏览配置 + browse = {} + # 站点分类配置 + category = {} + # 站点种子列表配置 + list = {} + # 站点种子字段配置 + fields = {} + # 页码 + page = 0 + # 检索条数 + result_num = 100 + torrents_info = {} + torrents_info_array = [] + + def setparam(self, indexer, + keyword: [str, list] = None, + page=None, + referer=None, + mtype: MediaType = None): + """ + 设置查询参数 + :param indexer: 索引器 + :param keyword: 检索关键字,如果数组则为批量检索 + :param page: 页码 + :param referer: Referer + :param mtype: 媒体类型 + """ + if not indexer: + return + self.keyword = keyword + self.mtype = mtype + self.indexerid = indexer.id + self.indexername = indexer.name + self.search = indexer.search + self.batch = indexer.batch + self.browse = indexer.browse + self.category = indexer.category + self.list = indexer.torrents.get('list', {}) + self.fields = indexer.torrents.get('fields') + self.render = indexer.render + self.domain = indexer.domain + self.page = page + if self.domain and not str(self.domain).endswith("/"): + self.domain = self.domain + "/" + if indexer.ua: + self.ua = indexer.ua + else: + self.ua = Config().get_ua() + if indexer.proxy: + self.proxies = Config().get_proxies() + if indexer.cookie: + self.cookie = indexer.cookie + if referer: + self.referer = referer + self.result_num = Config().get_config('pt').get('site_search_result_num') or 100 + self.torrents_info_array = [] + + def start_requests(self): + """ + 开始请求 + """ + + if not self.search or not self.domain: + self.is_complete = True + return + + # 种子搜索相对路径 + paths = self.search.get('paths', []) + torrentspath = "" + if len(paths) == 1: + torrentspath = paths[0].get('path', '') + else: + for path in paths: + if path.get("type") == "all" and not self.mtype: + torrentspath = path.get('path') + break + elif path.get("type") == "movie" and self.mtype == MediaType.MOVIE: + torrentspath = path.get('path') + break + elif path.get("type") == "tv" and self.mtype == MediaType.TV: + torrentspath = path.get('path') + break + elif path.get("type") == "anime" and self.mtype == MediaType.ANIME: + torrentspath = path.get('path') + break + + # 关键字搜索 + if self.keyword: + + if isinstance(self.keyword, list): + # 批量查询 + if self.batch: + delimiter = self.batch.get('delimiter') or ' ' + space_replace = self.batch.get('space_replace') or ' ' + search_word = delimiter.join([str(k).replace(' ', space_replace) for k in self.keyword]) + else: + search_word = " ".join(self.keyword) + # 查询模式:或 + search_mode = "1" + else: + # 单个查询 + search_word = self.keyword + # 查询模式与 + search_mode = "0" + + # 检索URL + if self.search.get("params"): + # 变量字典 + inputs_dict = { + "keyword": search_word + } + # 查询参数 + params = { + "search_mode": search_mode, + "page": self.page or 0 + } + # 额外参数 + for key, value in self.search.get("params").items(): + params.update({ + "%s" % key: str(value).format(**inputs_dict) + }) + # 分类条件 + if self.category: + if self.mtype == MediaType.MOVIE: + cats = self.category.get("movie") or [] + elif self.mtype: + cats = self.category.get("tv") or [] + else: + cats = self.category.get("movie") or [] + self.category.get("tv") or [] + for cat in cats: + if self.category.get("field"): + value = params.get(self.category.get("field"), "") + params.update({ + "%s" % self.category.get("field"): value + self.category.get("delimiter", ' ') + cat.get("id") + }) + else: + params.update({ + "%s" % cat.get("id"): 1 + }) + searchurl = self.domain + torrentspath + "?" + urlencode(params) + else: + # 变量字典 + inputs_dict = { + "keyword": quote(search_word), + "page": self.page or 0 + } + # 无额外参数 + searchurl = self.domain + str(torrentspath).format(**inputs_dict) + + # 列表浏览 + else: + # 变量字典 + inputs_dict = { + "page": self.page or 0, + "keyword": "" + } + # 有单独浏览路径 + if self.browse: + torrentspath = self.browse.get("path") + if self.browse.get("start"): + inputs_dict.update({ + "page": self.browse.get("start") + }) + elif self.page: + torrentspath = torrentspath + f"?page={self.page}" + # 检索Url + searchurl = self.domain + str(torrentspath).format(**inputs_dict) + + log.info(f"【Spider】开始请求:{searchurl}") + yield feapder.Request(url=searchurl, + use_session=True, + render=self.render) + + def download_midware(self, request): + request.headers = { + "User-Agent": self.ua, + "Cookie": self.cookie + } + if self.proxies: + request.proxies = self.proxies + return request + + def Gettitle_default(self, torrent): + # title default + if 'title' not in self.fields: + return + selector = self.fields.get('title', {}) + if 'selector' in selector: + title = torrent(selector.get('selector', '')).clone() + if "remove" in selector: + removelist = selector.get('remove', '').split(', ') + for v in removelist: + title.remove(v) + if 'attribute' in selector: + items = [item.attr(selector.get('attribute')) for item in title.items() if item] + else: + items = [item.text() for item in title.items() if item] + if items: + if "contents" in selector \ + and len(items) > int(selector.get("contents")): + items = items[0].split("\n")[selector.get("contents")] + elif "index" in selector \ + and len(items) > int(selector.get("index")): + items = items[int(selector.get("index"))] + else: + items = items[0] + self.torrents_info['title'] = items if not isinstance(items, list) else items[0] + elif 'text' in selector: + render_dict = {} + if "title_default" in self.fields: + title_default_selector = self.fields.get('title_default', {}) + title_default_item = torrent(title_default_selector.get('selector', '')).clone() + if "remove" in title_default_selector: + removelist = title_default_selector.get('remove', '').split(', ') + for v in removelist: + title_default_item.remove(v) + if 'attribute' in title_default_selector: + render_dict.update( + {'title_default': title_default_item.attr(title_default_selector.get('attribute'))}) + else: + render_dict.update({'title_default': title_default_item.text()}) + if "title_optional" in self.fields: + title_optional_selector = self.fields.get('title_optional', {}) + title_optional_item = torrent(title_optional_selector.get('selector', '')).clone() + if "remove" in title_optional_selector: + removelist = title_optional_selector.get('remove', '').split(', ') + for v in removelist: + title_optional_item.remove(v) + if 'attribute' in title_optional_selector: + render_dict.update( + {'title_optional': title_optional_item.attr(title_optional_selector.get('attribute'))}) + else: + render_dict.update({'title_optional': title_optional_item.text()}) + self.torrents_info['title'] = Template(selector.get('text')).render(fields=render_dict) + if 'filters' in selector: + self.torrents_info['title'] = self.__filter_text(self.torrents_info.get('title'), + selector.get('filters')) + + def Gettitle_optional(self, torrent): + # title optional + if 'description' not in self.fields: + return + selector = self.fields.get('description', {}) + if "selector" in selector \ + or "selectors" in selector: + description = torrent(selector.get('selector', selector.get('selectors', ''))).clone() + if description: + if 'remove' in selector: + removelist = selector.get('remove', '').split(', ') + for v in removelist: + description.remove(v) + if 'attribute' in selector: + items = [x.attr(selector.get('attribute')) for x in description.items()] + else: + items = [item.text() for item in description.items() if item] + if items: + if "contents" in selector \ + and len(items) > int(selector.get("contents")): + items = items[0].split("\n")[selector.get("contents")] + elif "index" in selector \ + and len(items) > int(selector.get("index")): + items = items[int(selector.get("index"))] + else: + items = items[0] + self.torrents_info['description'] = items if not isinstance(items, list) else items[0] + elif "text" in selector: + render_dict = {} + if "tags" in self.fields: + tags_selector = self.fields.get('tags', {}) + tags_item = torrent(tags_selector.get('selector', '')).clone() + if "remove" in tags_selector: + removelist = tags_selector.get('remove', '').split(', ') + for v in removelist: + tags_item.remove(v) + render_dict.update({'tags': tags_item.text()}) + if "subject" in self.fields: + subject_selector = self.fields.get('subject', {}) + subject_item = torrent(subject_selector.get('selector', '')).clone() + if "remove" in subject_selector: + removelist = subject_selector.get('remove', '').split(', ') + for v in removelist: + subject_item.remove(v) + render_dict.update({'subject': subject_item.text()}) + if "description_free_forever" in self.fields: + render_dict.update({"description_free_forever": torrent(self.fields.get("description_free_forever", + {}).get("selector", + '')).text()}) + if "description_normal" in self.fields: + render_dict.update({"description_normal": torrent(self.fields.get("description_normal", + {}).get("selector", + '')).text()}) + self.torrents_info['description'] = Template(selector.get('text')).render(fields=render_dict) + if 'filters' in selector: + self.torrents_info['description'] = self.__filter_text(self.torrents_info.get('description'), + selector.get('filters')) + + def Getdetails(self, torrent): + # details + if 'details' not in self.fields: + return + details = torrent(self.fields.get('details', {}).get('selector', '')) + items = [item.attr(self.fields.get('details', {}).get('attribute')) for item in details.items()] + if items: + if not items[0].startswith("http"): + if items[0].startswith("//"): + self.torrents_info['page_url'] = self.domain.split(":")[0] + ":" + items[0] + elif items[0].startswith("/"): + self.torrents_info['page_url'] = self.domain + items[0][1:] + else: + self.torrents_info['page_url'] = self.domain + items[0] + else: + self.torrents_info['page_url'] = items[0] + if 'filters' in self.fields.get('details', {}): + self.torrents_info['page_url'] = self.__filter_text(self.torrents_info.get('page_url'), + self.fields.get('details', + {}).get('filters')) + + def Getdownload(self, torrent): + # download link + if 'download' not in self.fields: + return + if "detail" in self.fields.get('download', {}): + selector = self.fields.get('download', {}).get("detail", {}) + if "xpath" in selector: + self.torrents_info['enclosure'] = f'[{selector.get("xpath", "")}' \ + f'|{self.cookie or ""}' \ + f'|{self.ua or ""}' \ + f'|{self.referer or ""}]' + elif "hash" in selector: + self.torrents_info['enclosure'] = f'#{selector.get("hash", "")}' \ + f'|{self.cookie or ""}' \ + f'|{self.ua or ""}' \ + f'|{self.referer or ""}#' + else: + download = torrent(self.fields.get('download', {}).get('selector', '')) + items = [item.attr(self.fields.get('download', {}).get('attribute')) for item in download.items()] + if items: + if not items[0].startswith("http") and not items[0].startswith("magnet"): + self.torrents_info['enclosure'] = self.domain + items[0][1:] if items[0].startswith( + "/") else self.domain + items[0] + else: + self.torrents_info['enclosure'] = items[0] + + def Getimdbid(self, torrent): + # imdbid + if "imdbid" not in self.fields: + return + selector = self.fields.get('imdbid', {}) + imdbid = torrent(selector.get('selector', '')) + if 'attribute' in selector: + items = [item.attr(selector.get('attribute')) for item in imdbid.items() if item] + else: + items = [item.text() for item in imdbid.items() if item] + self.torrents_info['imdbid'] = items[0] if items else '' + if 'filters' in selector: + self.torrents_info['imdbid'] = self.__filter_text(self.torrents_info.get('imdbid'), + selector.get('filters')) + + def Getsize(self, torrent): + # torrent size + if 'size' not in self.fields: + return + selector = self.fields.get('size', {}) + size = torrent(selector.get('selector', selector.get("selectors", ''))) + items = [item.text() for item in size.items() if item] + if "index" in selector \ + and len(items) > selector.get('index'): + self.torrents_info['size'] = StringUtils.num_filesize( + items[selector.get('index')].replace("\n", "").strip()) + elif len(items) > 0: + self.torrents_info['size'] = StringUtils.num_filesize( + items[0].replace("\n", "").strip()) + if 'filters' in selector: + self.torrents_info['size'] = self.__filter_text(self.torrents_info.get('size'), + selector.get('filters')) + if self.torrents_info.get('size'): + self.torrents_info['size'] = StringUtils.num_filesize(self.torrents_info.get('size')) + + def Getleechers(self, torrent): + # torrent leechers + if 'leechers' not in self.fields: + return + selector = self.fields.get('leechers', {}) + leechers = torrent(selector.get('selector', '')) + items = [item.text() for item in leechers.items() if item] + self.torrents_info['peers'] = items[0] if items else 0 + if 'filters' in selector: + self.torrents_info['peers'] = self.__filter_text(self.torrents_info.get('peers'), + selector.get('filters')) + + def Getseeders(self, torrent): + # torrent leechers + if 'seeders' not in self.fields: + return + selector = self.fields.get('seeders', {}) + seeders = torrent(selector.get('selector', '')) + items = [item.text() for item in seeders.items() if item] + self.torrents_info['seeders'] = items[0].split("/")[0] if items else 0 + if 'filters' in selector: + self.torrents_info['seeders'] = self.__filter_text(self.torrents_info.get('seeders'), + selector.get('filters')) + + def Getgrabs(self, torrent): + # torrent grabs + if 'grabs' not in self.fields: + return + selector = self.fields.get('grabs', {}) + grabs = torrent(selector.get('selector', '')) + items = [item.text() for item in grabs.items() if item] + self.torrents_info['grabs'] = items[0] if items else '' + if 'filters' in selector: + self.torrents_info['grabs'] = self.__filter_text(self.torrents_info.get('grabs'), + selector.get('filters')) + + def Getpubdate(self, torrent): + # torrent pubdate + if 'date_added' not in self.fields: + return + selector = self.fields.get('date_added', {}) + pubdate = torrent(selector.get('selector', '')) + if 'attribute' in selector: + items = [item.attr(selector.get('attribute')) for item in pubdate.items() if item] + else: + items = [item.text() for item in pubdate.items() if item] + self.torrents_info['pubdate'] = items[0] if items else '' + if 'filters' in selector: + self.torrents_info['pubdate'] = self.__filter_text(self.torrents_info.get('pubdate'), + selector.get('filters')) + + def Getelapsed_date(self, torrent): + # torrent pubdate + if 'date_elapsed' not in self.fields: + return + selector = self.fields.get('date_elapsed', {}) + date_elapsed = torrent(selector.get('selector', '')) + if 'attribute' in selector: + items = [item.attr(selector.get('attribute')) for item in date_elapsed.items() if item] + else: + items = [item.text() for item in date_elapsed.items() if item] + self.torrents_info['date_elapsed'] = items[0] if items else '' + if 'filters' in selector: + self.torrents_info['date_elapsed'] = self.__filter_text(self.torrents_info.get('date_elapsed'), + selector.get('filters')) + + def Getdownloadvolumefactor(self, torrent): + # downloadvolumefactor + selector = self.fields.get('downloadvolumefactor', {}) + if not selector: + return + if 'case' in selector: + for downloadvolumefactorselector in list(selector.get('case', + {}).keys()): + downloadvolumefactor = torrent(downloadvolumefactorselector) + if len(downloadvolumefactor) > 0: + self.torrents_info['downloadvolumefactor'] = selector.get('case', + {}).get( + downloadvolumefactorselector) + break + elif "selector" in selector: + downloadvolume = torrent(selector.get('selector', '')) + if downloadvolume: + items = [item.text() for item in downloadvolume.items() if item] + if items: + downloadvolumefactor = re.search(r'(\d+\.?\d*)', items[0]) + if downloadvolumefactor: + self.torrents_info['downloadvolumefactor'] = int(downloadvolumefactor.group(1)) + + def Getuploadvolumefactor(self, torrent): + # uploadvolumefactor + selector = self.fields.get('uploadvolumefactor', {}) + if not selector: + return + if 'case' in selector: + for uploadvolumefactorselector in list(selector.get('case', + {}).keys()): + uploadvolumefactor = torrent(uploadvolumefactorselector) + if len(uploadvolumefactor) > 0: + self.torrents_info['uploadvolumefactor'] = selector.get('case', + {}).get(uploadvolumefactorselector) + break + elif "selector" in selector: + uploadvolume = torrent(selector.get('selector', '')) + if uploadvolume: + items = [item.text() for item in uploadvolume.items() if item] + if items: + uploadvolumefactor = re.search(r'(\d+\.?\d*)', items[0]) + if uploadvolumefactor: + self.torrents_info['uploadvolumefactor'] = int(uploadvolumefactor.group(1)) + + def Getinfo(self, torrent): + """ + 解析单条种子数据 + """ + self.torrents_info = {'indexer': self.indexerid} + try: + self.Gettitle_default(torrent) + self.Gettitle_optional(torrent) + self.Getdetails(torrent) + self.Getdownload(torrent) + self.Getgrabs(torrent) + self.Getleechers(torrent) + self.Getseeders(torrent) + self.Getsize(torrent) + self.Getimdbid(torrent) + self.Getdownloadvolumefactor(torrent) + self.Getuploadvolumefactor(torrent) + self.Getpubdate(torrent) + self.Getelapsed_date(torrent) + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("【Spider】%s 检索出现错误:%s" % (self.indexername, str(err))) + return self.torrents_info + + @staticmethod + def __filter_text(text, filters): + """ + 对文件进行处理 + """ + if not text or not filters or not isinstance(filters, list): + return text + if not isinstance(text, str): + text = str(text) + for filter_item in filters: + try: + method_name = filter_item.get("name") + args = filter_item.get("args") + if method_name == "re_search" and isinstance(args, list): + text = re.search(r"%s" % args[0], text).group(args[-1]) + elif method_name == "split" and isinstance(args, list): + text = text.split(r"%s" % args[0])[args[-1]] + elif method_name == "replace" and isinstance(args, list): + text = text.replace(r"%s" % args[0], r"%s" % args[-1]) + elif method_name == "dateparse" and isinstance(args, str): + text = datetime.datetime.strptime(text, r"%s" % args) + elif method_name == "strip": + text = text.strip() + elif method_name == "appendleft": + text = f"{args}{text}" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return text.strip() + + def parse(self, request, response): + """ + 解析整个页面 + """ + try: + # 获取站点文本 + html_text = response.extract() + if not html_text: + self.is_complete = True + return + # 解析站点文本对象 + html_doc = PyQuery(html_text) + # 种子筛选器 + torrents_selector = self.list.get('selector', '') + str_list = list(torrents_selector) + # 兼容选择器中has()函数 部分情况下无双引号会报错 + has_index = torrents_selector.find('has') + if has_index != -1 and torrents_selector.find('"') == -1: + flag = 0 + str_list.insert(has_index + 4, '"') + for i in range(len(str_list)): + if i > has_index + 2: + n = str_list[i] + if n == '(': + flag = flag + 1 + if n == ')': + flag = flag - 1 + if flag == 0: + str_list.insert(i, '"') + torrents_selector = "".join(str_list) + # 遍历种子html列表 + for torn in html_doc(torrents_selector): + self.torrents_info_array.append(copy.deepcopy(self.Getinfo(PyQuery(torn)))) + if len(self.torrents_info_array) >= int(self.result_num): + break + + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.warn("【Spider】错误:%s" % str(err)) + finally: + self.is_complete = True diff --git a/app/indexer/client/_tnode.py b/app/indexer/client/_tnode.py new file mode 100644 index 0000000..07727ff --- /dev/null +++ b/app/indexer/client/_tnode.py @@ -0,0 +1,104 @@ +import re + +import log +from app.utils import RequestUtils, StringUtils +from config import Config + + +class TNodeSpider(object): + _indexerid = None + _domain = None + _name = "" + _proxy = None + _cookie = None + _ua = None + _token = None + _size = 100 + _searchurl = "%sapi/torrent/advancedSearch" + _downloadurl = "%sapi/torrent/download/%s" + _pageurl = "%storrent/info/%s" + + def __init__(self, indexer): + if indexer: + self._indexerid = indexer.id + self._domain = indexer.domain + self._searchurl = self._searchurl % self._domain + self._name = indexer.name + if indexer.proxy: + self._proxy = Config().get_proxies() + self._cookie = indexer.cookie + self._ua = indexer.ua + self.init_config() + + def init_config(self): + self._size = Config().get_config('pt').get('site_search_result_num') or 100 + self.__get_token() + + def __get_token(self): + if not self._domain: + return + res = RequestUtils(headers=self._ua, + cookies=self._cookie, + proxies=self._proxy, + timeout=15).get_res(url=self._domain) + if res and res.status_code == 200: + csrf_token = re.search(r'', res.text) + if csrf_token: + self._token = csrf_token.group(1) + + def search(self, keyword, page=0): + if not self._token: + log.warn(f"【INDEXER】{self._name} 未获取到token,无法搜索") + return [] + params = { + "page": int(page) + 1, + "size": self._size, + "type": "title", + "keyword": keyword or "", + "sorter": "id", + "order": "desc", + "tags": [], + "category": [501, 502, 503, 504], + "medium": [], + "videoCoding": [], + "audioCoding": [], + "resolution": [], + "group": [] + } + res = RequestUtils( + headers={ + 'X-CSRF-TOKEN': self._token, + "Content-Type": "application/json; charset=utf-8", + "User-Agent": f"{self._ua}" + }, + cookies=self._cookie, + proxies=self._proxy, + timeout=30 + ).post_res(url=self._searchurl, json=params) + torrents = [] + if res and res.status_code == 200: + results = res.json().get('data', {}).get("torrents") or [] + for result in results: + torrent = { + 'indexer': self._indexerid, + 'title': result.get('title'), + 'description': result.get('subtitle'), + 'enclosure': self._downloadurl % (self._domain, result.get('id')), + 'pubdate': StringUtils.timestamp_to_date(result.get('upload_time')), + 'size': result.get('size'), + 'seeders': result.get('seeding'), + 'peers': result.get('leeching'), + 'grabs': result.get('complete'), + 'downloadvolumefactor': result.get('downloadRate'), + 'uploadvolumefactor': result.get('uploadRate'), + 'page_url': self._pageurl % (self._domain, result.get('id')), + 'imdbid': result.get('imdb') + } + torrents.append(torrent) + elif res is not None: + log.warn(f"【INDEXER】{self._name} 搜索失败,错误码:{res.status_code}") + return [] + else: + log.warn(f"【INDEXER】{self._name} 搜索失败,无法连接 {self._domain}") + return [] + return torrents diff --git a/app/indexer/client/builtin.py b/app/indexer/client/builtin.py new file mode 100644 index 0000000..318220a --- /dev/null +++ b/app/indexer/client/builtin.py @@ -0,0 +1,220 @@ +import copy +import datetime +import time + +import log +from app.helper import IndexerHelper, IndexerConf, ProgressHelper, ChromeHelper +from app.indexer.client._base import _IIndexClient +from app.indexer.client._rarbg import Rarbg +from app.indexer.client._render_spider import RenderSpider +from app.indexer.client._spider import TorrentSpider +from app.indexer.client._tnode import TNodeSpider +from app.sites import Sites +from app.utils import StringUtils +from app.utils.types import SearchType, IndexerType +from config import Config + + +class BuiltinIndexer(_IIndexClient): + schema = "builtin" + _client_config = {} + index_type = IndexerType.BUILTIN.value + progress = None + sites = None + + def __init__(self, config=None): + super().__init__() + self._client_config = config or {} + self.init_config() + + def init_config(self): + self.sites = Sites() + self.progress = ProgressHelper() + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.index_type] else False + + def get_status(self): + """ + 检查连通性 + :return: True、False + """ + return True + + def get_indexers(self, check=True, public=False, indexer_id=None): + ret_indexers = [] + # 选中站点配置 + indexer_sites = Config().get_config("pt").get("indexer_sites") or [] + _indexer_domains = [] + # 检查浏览器状态 + chrome_ok = ChromeHelper().get_status() + # 私有站点 + for site in Sites().get_sites(): + if not site.get("rssurl") and not site.get("signurl"): + continue + if not site.get("cookie"): + continue + url = site.get("signurl") or site.get("rssurl") + public_site = self.sites.get_public_sites(url=url) + if public_site: + if not public: + continue + is_public = True + proxy = public_site.get("proxy") + language = public_site.get("language") + render = False if not chrome_ok else public_site.get("render") + parser = public_site.get("parser") + else: + is_public = False + proxy = site.get("proxy") + language = None + render = False if not chrome_ok else None + parser = None + indexer = IndexerHelper().get_indexer(url=url, + cookie=site.get("cookie"), + ua=site.get("ua"), + name=site.get("name"), + rule=site.get("rule"), + pri=site.get('pri'), + public=is_public, + proxy=proxy, + render=render, + language=language, + parser=parser) + if indexer: + if indexer_id and indexer.id == indexer_id: + return indexer + if check and indexer_sites and indexer.id not in indexer_sites: + continue + if indexer.domain not in _indexer_domains: + _indexer_domains.append(indexer.domain) + indexer.name = site.get("name") + ret_indexers.append(indexer) + # 公开站点 + if public: + for site, attr in self.sites.get_public_sites(): + indexer = IndexerHelper().get_indexer(url=site, + public=True, + proxy=attr.get("proxy"), + render=attr.get("render"), + language=attr.get("language"), + parser=attr.get("parser")) + if indexer: + if indexer_id and indexer.id == indexer_id: + return indexer + if check and indexer_sites and indexer.id not in indexer_sites: + continue + if indexer.domain not in _indexer_domains: + _indexer_domains.append(indexer.domain) + ret_indexers.append(indexer) + return ret_indexers + + def search(self, order_seq, + indexer, + key_word, + filter_args: dict, + match_media, + in_from: SearchType): + """ + 根据关键字多线程检索 + """ + if not indexer or not key_word: + return None + # 不是配置的索引站点过滤掉 + indexer_sites = Config().get_config("pt").get("indexer_sites") or [] + if indexer_sites and indexer.id not in indexer_sites: + return [] + # fix 共用同一个dict时会导致某个站点的更新全局全效 + if filter_args is None: + _filter_args = {} + else: + _filter_args = copy.deepcopy(filter_args) + # 不在设定搜索范围的站点过滤掉 + if _filter_args.get("site") and indexer.name not in _filter_args.get("site"): + return [] + # 搜索条件没有过滤规则时,使用站点的过滤规则 + if not _filter_args.get("rule") and indexer.rule: + _filter_args.update({"rule": indexer.rule}) + # 计算耗时 + start_time = datetime.datetime.now() + log.info(f"【{self.index_type}】开始检索Indexer:{indexer.name} ...") + # 特殊符号处理 + search_word = StringUtils.handler_special_chars(text=key_word, + replace_word=" ", + allow_space=True) + # 避免对英文站搜索中文 + if indexer.language == "en" and StringUtils.is_chinese(search_word): + log.warn(f"【{self.index_type}】{indexer.name} 无法使用中文名搜索") + return [] + result_array = [] + try: + if indexer.parser == "Rarbg": + imdb_id = match_media.imdb_id if match_media else None + result_array = Rarbg().search(keyword=search_word, indexer=indexer, imdb_id=imdb_id) + elif indexer.parser == "TNodeSpider": + result_array = TNodeSpider(indexer=indexer).search(keyword=search_word) + elif indexer.parser == "RenderSpider": + result_array = RenderSpider().search(keyword=search_word, + indexer=indexer, + mtype=match_media.type if match_media else None) + else: + result_array = self.__spider_search(keyword=search_word, + indexer=indexer, + mtype=match_media.type if match_media else None) + except Exception as err: + print(str(err)) + if len(result_array) == 0: + log.warn(f"【{self.index_type}】{indexer.name} 未检索到数据") + self.progress.update(ptype='search', text=f"{indexer.name} 未检索到数据") + return [] + else: + log.warn(f"【{self.index_type}】{indexer.name} 返回数据:{len(result_array)}") + return self.filter_search_results(result_array=result_array, + order_seq=order_seq, + indexer=indexer, + filter_args=_filter_args, + match_media=match_media, + start_time=start_time) + + def list(self, index_id, page=0, keyword=None): + """ + 根据站点ID检索站点首页资源 + """ + if not index_id: + return [] + indexer: IndexerConf = self.get_indexers(indexer_id=index_id) + if not indexer: + return [] + if indexer.parser == "RenderSpider": + return RenderSpider().search(keyword=keyword, + indexer=indexer, + page=page) + elif indexer.parser == "TNodeSpider": + return TNodeSpider(indexer=indexer).search(keyword=keyword, page=page) + return self.__spider_search(indexer=indexer, + page=page, + keyword=keyword) + + @staticmethod + def __spider_search(indexer, keyword=None, page=None, mtype=None, timeout=30): + """ + 根据关键字搜索单个站点 + """ + spider = TorrentSpider() + spider.setparam(indexer=indexer, + keyword=keyword, + page=page, + mtype=mtype) + spider.start() + # 循环判断是否获取到数据 + sleep_count = 0 + while not spider.is_complete: + sleep_count += 1 + time.sleep(1) + if sleep_count > timeout: + break + # 返回数据 + result_array = spider.torrents_info_array.copy() + spider.torrents_info_array.clear() + return result_array diff --git a/app/indexer/indexer.py b/app/indexer/indexer.py new file mode 100644 index 0000000..ca07664 --- /dev/null +++ b/app/indexer/indexer.py @@ -0,0 +1,174 @@ +import datetime +from concurrent.futures import ThreadPoolExecutor, as_completed + +import log +from app.conf import ModuleConf +from app.helper import ProgressHelper, SubmoduleHelper +from app.indexer.client import BuiltinIndexer +from app.utils import ExceptionUtils, StringUtils +from app.utils.commons import singleton +from app.utils.types import SearchType, IndexerType +from config import Config + + +@singleton +class Indexer(object): + _indexer_schemas = [] + _client = None + _client_type = None + progress = None + + def __init__(self): + self._indexer_schemas = SubmoduleHelper.import_submodules( + 'app.indexer.client', + filter_func=lambda _, obj: hasattr(obj, 'schema') + ) + log.debug(f"【Indexer】加载索引器:{self._indexer_schemas}") + self.init_config() + + def init_config(self): + self.progress = ProgressHelper() + self._client_type = ModuleConf.INDEXER_DICT.get( + Config().get_config("pt").get('search_indexer') or 'builtin' + ) or IndexerType.BUILTIN + self._client = self.__get_client(self._client_type) + + def __build_class(self, ctype, conf): + for indexer_schema in self._indexer_schemas: + try: + if indexer_schema.match(ctype): + return indexer_schema(conf) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None + + def get_indexers(self): + """ + 获取当前索引器的索引站点 + """ + if not self._client: + return [] + return self._client.get_indexers() + + def get_indexer_dict(self): + """ + 获取索引器字典 + """ + return [ + { + "id": index.id, + "name": index.name + } for index in self.get_indexers() + ] + + def get_indexer_hash_dict(self): + """ + 获取索引器Hash字典 + """ + IndexerDict = {} + for item in self.get_indexers() or []: + IndexerDict[StringUtils.md5_hash(item.name)] = { + "id": item.id, + "name": item.name, + "public": item.public, + "builtin": item.builtin + } + return IndexerDict + + def get_indexer_names(self): + """ + 获取当前索引器的索引站点名称 + """ + return [indexer.name for indexer in self.get_indexers()] + + @staticmethod + def get_builtin_indexers(check=True, public=True, indexer_id=None): + """ + 获取内置索引器的索引站点 + """ + return BuiltinIndexer().get_indexers(check=check, public=public, indexer_id=indexer_id) + + @staticmethod + def list_builtin_resources(index_id, page=0, keyword=None): + """ + 获取内置索引器的资源列表 + :param index_id: 内置站点ID + :param page: 页码 + :param keyword: 搜索关键字 + """ + return BuiltinIndexer().list(index_id=index_id, page=page, keyword=keyword) + + def __get_client(self, ctype: IndexerType, conf=None): + return self.__build_class(ctype=ctype.value, conf=conf) + + def get_client(self): + """ + 获取当前索引器 + """ + return self._client + + def get_client_type(self): + """ + 获取当前索引器类型 + """ + return self._client_type + + def search_by_keyword(self, + key_word: [str, list], + filter_args: dict, + match_media=None, + in_from: SearchType = None): + """ + 根据关键字调用 Index API 检索 + :param key_word: 检索的关键字,不能为空 + :param filter_args: 过滤条件,对应属性为空则不过滤,{"season":季, "episode":集, "year":年, "type":类型, "site":站点, + "":, "restype":质量, "pix":分辨率, "sp_state":促销状态, "key":其它关键字} + sp_state: 为UL DL,* 代表不关心, + :param match_media: 需要匹配的媒体信息 + :param in_from: 搜索渠道 + :return: 命中的资源媒体信息列表 + """ + if not key_word: + return [] + + indexers = self.get_indexers() + if not indexers: + log.error(f"【{self._client_type.value}】没有有效的索引器配置!") + return [] + # 计算耗时 + start_time = datetime.datetime.now() + if filter_args and filter_args.get("site"): + log.info(f"【{self._client_type.value}】开始检索 %s,站点:%s ..." % (key_word, filter_args.get("site"))) + self.progress.update(ptype='search', text="开始检索 %s,站点:%s ..." % (key_word, filter_args.get("site"))) + else: + log.info(f"【{self._client_type.value}】开始并行检索 %s,线程数:%s ..." % (key_word, len(indexers))) + self.progress.update(ptype='search', text="开始并行检索 %s,线程数:%s ..." % (key_word, len(indexers))) + # 多线程 + executor = ThreadPoolExecutor(max_workers=len(indexers)) + all_task = [] + for index in indexers: + order_seq = 100 - int(index.pri) + task = executor.submit(self._client.search, + order_seq, + index, + key_word, + filter_args, + match_media, + in_from) + all_task.append(task) + ret_array = [] + finish_count = 0 + for future in as_completed(all_task): + result = future.result() + finish_count += 1 + self.progress.update(ptype='search', value=round(100 * (finish_count / len(all_task)))) + if result: + ret_array = ret_array + result + # 计算耗时 + end_time = datetime.datetime.now() + log.info(f"【{self._client_type.value}】所有站点检索完成,有效资源数:%s,总耗时 %s 秒" + % (len(ret_array), (end_time - start_time).seconds)) + self.progress.update(ptype='search', text="所有站点检索完成,有效资源数:%s,总耗时 %s 秒" + % (len(ret_array), (end_time - start_time).seconds), + value=100) + return ret_array diff --git a/app/media/__init__.py b/app/media/__init__.py new file mode 100644 index 0000000..2900436 --- /dev/null +++ b/app/media/__init__.py @@ -0,0 +1,5 @@ +from .category import Category +from .media import Media +from .scraper import Scraper +from .douban import DouBan +from .bangumi import Bangumi diff --git a/app/media/bangumi.py b/app/media/bangumi.py new file mode 100644 index 0000000..9d46a99 --- /dev/null +++ b/app/media/bangumi.py @@ -0,0 +1,105 @@ +from datetime import datetime +from functools import lru_cache + +import requests + +from app.utils import RequestUtils +from app.utils.types import MediaType + + +class Bangumi(object): + """ + https://bangumi.github.io/api/ + """ + + _urls = { + "calendar": "calendar", + "detail": "v0/subjects/%s", + } + _base_url = "https://api.bgm.tv/" + _req = RequestUtils(session=requests.Session()) + _page_num = 30 + + def __init__(self): + pass + + @classmethod + @lru_cache(maxsize=128) + def __invoke(cls, url, **kwargs): + req_url = cls._base_url + url + params = {} + if kwargs: + params.update(kwargs) + resp = cls._req.get_res(url=req_url, params=params) + return resp.json() if resp else None + + def calendar(self): + """ + 获取每日放送 + """ + return self.__invoke(self._urls["calendar"], _ts=datetime.strftime(datetime.now(), '%Y%m%d')) + + def detail(self, bid): + """ + 获取番剧详情 + """ + return self.__invoke(self._urls["detail"] % bid, _ts=datetime.strftime(datetime.now(), '%Y%m%d')) + + @staticmethod + def __dict_item(item, weekday): + """ + 转换为字典 + """ + bid = item.get("id") + detail = item.get("url") + title = item.get("name_cn", item.get("name")) + air_date = item.get("air_date") + rating = item.get("rating") + if rating: + score = rating.get("score") + else: + score = 0 + images = item.get("images") + if images: + image = images.get("large") + else: + image = '' + summary = item.get("summary") + return { + 'id': "BG:%s" % bid, + 'orgid': bid, + 'title': title, + 'year': air_date[:4] if air_date else "", + 'type': 'TV', + 'media_type': MediaType.TV.value, + 'vote': score, + 'image': image, + 'overview': summary, + 'url': detail, + 'weekday': weekday + } + + def get_bangumi_calendar(self, page=1, week=None): + """ + 获取每日放送 + """ + infos = self.calendar() + if not infos: + return [] + start_pos = (int(page) - 1) * self._page_num + ret_list = [] + pos = 0 + for info in infos: + weeknum = info.get("weekday", {}).get("id") + if week and int(weeknum) != int(week): + continue + weekday = info.get("weekday", {}).get("cn") + items = info.get("items") + for item in items: + if pos >= start_pos: + ret_list.append(self.__dict_item(item, weekday)) + pos += 1 + if pos >= start_pos + self._page_num: + break + + return ret_list diff --git a/app/media/category.py b/app/media/category.py new file mode 100644 index 0000000..11605df --- /dev/null +++ b/app/media/category.py @@ -0,0 +1,165 @@ +import os +import shutil + +import ruamel.yaml + +import log +from app.utils import ExceptionUtils +from config import Config +from app.utils.commons import singleton + + +@singleton +class Category: + _category_path = None + _categorys = None + _tv_categorys = None + _movie_categorys = None + _anime_categorys = None + + def __init__(self): + self.init_config() + + def init_config(self): + media = Config().get_config('media') + if media: + category = media.get('category') + if not category: + return + self._category_path = os.path.join(Config().get_config_path(), "%s.yaml" % category) + try: + if not os.path.exists(self._category_path): + shutil.copy(os.path.join(Config().get_inner_config_path(), "default-category.yaml"), + self._category_path) + log.console("【Config】分类配置文件 %s.yaml 不存在,已将配置文件模板复制到配置目录..." % category) + with open(self._category_path, mode='r', encoding='utf-8') as f: + try: + yaml = ruamel.yaml.YAML() + self._categorys = yaml.load(f) + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.console("【Config】%s.yaml 分类配置文件格式出现严重错误!请检查:%s" % (category, str(e))) + self._categorys = {} + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.console("【Config】加载 %s.yaml 配置出错:%s" % (category, str(err))) + return False + + if self._categorys: + self._movie_categorys = self._categorys.get('movie') + self._tv_categorys = self._categorys.get('tv') + self._anime_categorys = self._categorys.get('anime') + + def get_movie_category_flag(self): + """ + 获取电影分类标志 + """ + if self._movie_categorys: + return True + return False + + def get_tv_category_flag(self): + """ + 获取电视剧分类标志 + """ + if self._tv_categorys: + return True + return False + + def get_anime_category_flag(self): + """ + 获取动漫分类标志 + """ + if self._anime_categorys: + return True + return False + + def get_movie_categorys(self): + """ + 获取电影分类清单 + """ + if not self._movie_categorys: + return [] + return self._movie_categorys.keys() + + def get_tv_categorys(self): + """ + 获取电视剧分类清单 + """ + if not self._tv_categorys: + return [] + return self._tv_categorys.keys() + + def get_anime_categorys(self): + """ + 获取动漫分类清单 + """ + if not self._anime_categorys: + return [] + return self._anime_categorys.keys() + + def get_movie_category(self, tmdb_info): + """ + 判断电影的分类 + :param tmdb_info: 识别的TMDB中的信息 + :return: 二级分类的名称 + """ + return self.get_category(self._movie_categorys, tmdb_info) + + def get_tv_category(self, tmdb_info): + """ + 判断电视剧的分类 + :param tmdb_info: 识别的TMDB中的信息 + :return: 二级分类的名称 + """ + return self.get_category(self._tv_categorys, tmdb_info) + + def get_anime_category(self, tmdb_info): + """ + 判断动漫的分类 + :param tmdb_info: 识别的TMDB中的信息 + :return: 二级分类的名称 + """ + return self.get_category(self._anime_categorys, tmdb_info) + + @staticmethod + def get_category(categorys, tmdb_info): + """ + 根据 TMDB信息与分类配置文件进行比较,确定所属分类 + :param categorys: 分类配置 + :param tmdb_info: TMDB信息 + :return: 分类的名称 + """ + if not tmdb_info: + return "" + if not categorys: + return "" + for key, item in categorys.items(): + if not item: + return key + match_flag = True + for attr, value in item.items(): + if not value: + continue + info_value = tmdb_info.get(attr) + if not info_value: + match_flag = False + continue + elif attr == "production_countries": + info_values = [str(val.get("iso_3166_1")).upper() for val in info_value] + else: + if isinstance(info_value, list): + info_values = [str(val).upper() for val in info_value] + else: + info_values = [str(info_value).upper()] + + if value.find(",") != -1: + values = [str(val).upper() for val in value.split(",")] + else: + values = [str(value).upper()] + + if not set(values).intersection(set(info_values)): + match_flag = False + if match_flag: + return key + return "" diff --git a/app/media/douban.py b/app/media/douban.py new file mode 100644 index 0000000..cb64f22 --- /dev/null +++ b/app/media/douban.py @@ -0,0 +1,442 @@ +import random +from threading import Lock +from time import sleep + +import zhconv + +from app.utils.commons import singleton +from app.utils import ExceptionUtils, StringUtils + +import log +from config import Config +from app.media.doubanapi import DoubanApi, DoubanWeb +from app.media.meta import MetaInfo +from app.utils import RequestUtils +from app.utils.types import MediaType + +lock = Lock() + + +@singleton +class DouBan: + cookie = None + doubanapi = None + doubanweb = None + message = None + _movie_num = 20 + _tv_num = 20 + + def __init__(self): + self.init_config() + + def init_config(self): + self.doubanapi = DoubanApi() + self.doubanweb = DoubanWeb() + douban = Config().get_config('douban') + if douban: + # Cookie + self.cookie = douban.get('cookie') + if not self.cookie: + try: + res = RequestUtils(timeout=5).get_res("https://www.douban.com/") + if res: + self.cookie = StringUtils.str_from_cookiejar(res.cookies) + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.warn(f"【Douban】获取cookie失败:{format(err)}") + + def get_douban_detail(self, doubanid, mtype=None, wait=False): + """ + 根据豆瓣ID返回豆瓣详情,带休眠 + """ + log.info("【Douban】正在通过API查询豆瓣详情:%s" % doubanid) + # 随机休眠 + if wait: + time = round(random.uniform(1, 5), 1) + log.info("【Douban】随机休眠:%s 秒" % time) + sleep(time) + if mtype == MediaType.MOVIE: + douban_info = self.doubanapi.movie_detail(doubanid) + elif mtype: + douban_info = self.doubanapi.tv_detail(doubanid) + else: + douban_info = self.doubanapi.movie_detail(doubanid) + if not douban_info: + douban_info = self.doubanapi.tv_detail(doubanid) + if not douban_info: + log.warn("【Douban】%s 未找到豆瓣详细信息" % doubanid) + return None + if douban_info.get("localized_message"): + log.warn("【Douban】查询豆瓣详情错误:%s" % douban_info.get("localized_message")) + return None + if not douban_info.get("title"): + return None + if douban_info.get("title") == "未知电影" or douban_info.get("title") == "未知电视剧": + return None + log.info("【Douban】查询到数据:%s" % douban_info.get("title")) + return douban_info + + def __search_douban_id(self, metainfo): + """ + 给定名称和年份,查询一条豆瓣信息返回对应ID + :param metainfo: 已进行识别过的媒体信息 + """ + if metainfo.year: + year_range = [int(metainfo.year), int(metainfo.year) + 1, int(metainfo.year) - 1] + else: + year_range = [] + if metainfo.type == MediaType.MOVIE: + search_res = self.doubanapi.movie_search(metainfo.title).get("items") or [] + if not search_res: + return None + for res in search_res: + douban_meta = MetaInfo(title=res.get("target", {}).get("title")) + if metainfo.title == douban_meta.get_name() \ + and (int(res.get("target", {}).get("year")) in year_range or not year_range): + return res.get("target_id") + return None + elif metainfo.type == MediaType.TV: + search_res = self.doubanapi.tv_search(metainfo.title).get("items") or [] + if not search_res: + return None + for res in search_res: + douban_meta = MetaInfo(title=res.get("target", {}).get("title")) + if metainfo.title == douban_meta.get_name() \ + and (str(res.get("target", {}).get("year")) == str(metainfo.year) or not metainfo.year): + return res.get("target_id") + if metainfo.title == douban_meta.get_name() \ + and metainfo.get_season_string() == douban_meta.get_season_string(): + return res.get("target_id") + return search_res[0].get("target_id") + + def get_douban_info(self, metainfo): + """ + 查询附带演职人员的豆瓣信息 + :param metainfo: 已进行识别过的媒体信息 + """ + doubanid = self.__search_douban_id(metainfo) + if not doubanid: + return None + if metainfo.type == MediaType.MOVIE: + douban_info = self.doubanapi.movie_detail(doubanid) + celebrities = self.doubanapi.movie_celebrities(doubanid) + if douban_info and celebrities: + douban_info["directors"] = celebrities.get("directors") + douban_info["actors"] = celebrities.get("actors") + return douban_info + elif metainfo.type == MediaType.TV: + douban_info = self.doubanapi.tv_detail(doubanid) + celebrities = self.doubanapi.tv_celebrities(doubanid) + if douban_info and celebrities: + douban_info["directors"] = celebrities.get("directors") + douban_info["actors"] = celebrities.get("actors") + return douban_info + + def get_douban_wish(self, dtype, userid, start, wait=False): + """ + 获取豆瓣想看列表数据 + """ + if wait: + time = round(random.uniform(1, 5), 1) + log.info("【Douban】随机休眠:%s 秒" % time) + sleep(time) + if dtype == "do": + web_infos = self.doubanweb.do(cookie=self.cookie, userid=userid, start=start) + elif dtype == "collect": + web_infos = self.doubanweb.collect(cookie=self.cookie, userid=userid, start=start) + else: + web_infos = self.doubanweb.wish(cookie=self.cookie, userid=userid, start=start) + if not web_infos: + return [] + for web_info in web_infos: + web_info["id"] = web_info.get("url").split("/")[-2] + return web_infos + + def get_user_info(self, userid, wait=False): + if wait: + time = round(random.uniform(1, 5), 1) + log.info("【Douban】随机休眠:%s 秒" % time) + sleep(time) + return self.doubanweb.user(cookie=self.cookie, userid=userid) + + def search_douban_medias(self, keyword, mtype: MediaType = None, season=None, episode=None, page=1): + """ + 根据关键字搜索豆瓣,返回可能的标题和年份信息 + """ + if not keyword: + return [] + result = self.doubanapi.search(keyword) + if not result: + return [] + ret_medias = [] + for item_obj in result.get("items"): + if mtype and mtype.value != item_obj.get("type_name"): + continue + if item_obj.get("type_name") not in (MediaType.TV.value, MediaType.MOVIE.value): + continue + item = item_obj.get("target") + meta_info = MetaInfo(title=item.get("title")) + meta_info.title = item.get("title") + if item_obj.get("type_name") == MediaType.MOVIE.value: + meta_info.type = MediaType.MOVIE + else: + meta_info.type = MediaType.TV + if season: + if meta_info.type != MediaType.TV: + continue + if season != 1 and meta_info.begin_season != season: + continue + if episode and str(episode).isdigit(): + if meta_info.type != MediaType.TV: + continue + meta_info.begin_episode = int(episode) + meta_info.title = "%s 第%s集" % (meta_info.title, episode) + meta_info.year = item.get("year") + meta_info.tmdb_id = "DB:%s" % item.get("id") + meta_info.douban_id = item.get("id") + meta_info.overview = item.get("card_subtitle") or "" + meta_info.poster_path = item.get("cover_url").split('?')[0] + rating = item.get("rating", {}) or {} + meta_info.vote_average = rating.get("value") + if meta_info not in ret_medias: + ret_medias.append(meta_info) + + return ret_medias[(page - 1) * 20:page * 20] + + def get_media_detail_from_web(self, doubanid): + """ + 从豆瓣详情页抓紧媒体信息 + :param doubanid: 豆瓣ID + :return: {title, year, intro, cover_url, rating{value}, episodes_count} + """ + log.info("【Douban】正在通过网页查询豆瓣详情:%s" % doubanid) + web_info = self.doubanweb.detail(cookie=self.cookie, doubanid=doubanid) + if not web_info: + return {} + ret_media = {} + try: + # 标题 + title = web_info.get("title") + if title: + title = title + metainfo = MetaInfo(title=title) + if metainfo.cn_name: + title = metainfo.cn_name + # 有中文的去掉日文和韩文 + if title and StringUtils.is_chinese(title) and " " in title: + titles = title.split() + title = titles[0] + for _title in titles[1:]: + # 忽略繁体 + if zhconv.convert(_title, 'zh-hans') == title: + break + # 忽略日韩文 + if not StringUtils.is_japanese(_title) \ + and not StringUtils.is_korean(_title): + title = f"{title} {_title}" + break + else: + break + else: + title = metainfo.en_name + if not title: + return None + ret_media['title'] = title + ret_media['season'] = metainfo.begin_season + else: + return None + # 年份 + year = web_info.get("year") + if year: + ret_media['year'] = year[1:-1] + # 简介 + ret_media['intro'] = "".join( + [str(x).strip() for x in web_info.get("intro") or []]) + # 封面图 + cover_url = web_info.get("cover") + if cover_url: + ret_media['cover_url'] = cover_url.replace("s_ratio_poster", "m_ratio_poster") + # 评分 + rating = web_info.get("rate") + if rating: + ret_media['rating'] = {"value": float(rating)} + # 季数 + season_num = web_info.get("season_num") + if season_num: + ret_media['season'] = int(season_num) + # 集数 + episode_num = web_info.get("episode_num") + if episode_num: + ret_media['episodes_count'] = int(episode_num) + # IMDBID + imdbid = web_info.get('imdb') + if imdbid: + ret_media['imdbid'] = str(imdbid).strip() + except Exception as err: + ExceptionUtils.exception_traceback(err) + if ret_media: + log.info("【Douban】查询到数据:%s" % ret_media.get("title")) + else: + log.warn("【Douban】%s 未查询到豆瓣数据:%s" % doubanid) + return ret_media + + def get_douban_online_movie(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.movie_showing(start=(page - 1) * self._movie_num, + count=self._movie_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_hot_movie(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.movie_hot_gaia(start=(page - 1) * self._movie_num, + count=self._movie_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_hot_anime(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.tv_animation(start=(page - 1) * self._tv_num, + count=self._tv_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_hot_tv(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.tv_hot(start=(page - 1) * self._tv_num, + count=self._tv_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_new_movie(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.movie_soon(start=(page - 1) * self._movie_num, + count=self._movie_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_hot_show(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.show_hot(start=(page - 1) * self._tv_num, + count=self._tv_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_top250_movie(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.movie_top250(start=(page - 1) * self._movie_num, + count=self._movie_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_chinese_weekly_tv(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.tv_chinese_best_weekly(start=(page - 1) * self._tv_num, + count=self._tv_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_weekly_tv_global(self, page=1): + if not self.doubanapi: + return [] + infos = self.doubanapi.tv_global_best_weekly(start=(page - 1) * self._tv_num, + count=self._tv_num) + if not infos: + return [] + return self.__dict_items(infos.get("subject_collection_items")) + + def get_douban_disover(self, mtype, sort, tags, page=1): + if not self.doubanapi: + return [] + if mtype == MediaType.MOVIE: + infos = self.doubanapi.movie_recommend(start=(page - 1) * self._movie_num, + count=self._movie_num, + sort=sort, + tags=tags) + else: + infos = self.doubanapi.tv_recommend(start=(page - 1) * self._tv_num, + count=self._tv_num, + sort=sort, + tags=tags) + if not infos: + return [] + return self.__dict_items(infos.get("items")) + + @staticmethod + def __dict_items(infos, media_type=None): + """ + 转化为字典 + """ + # ID + ret_infos = [] + for info in infos: + rid = info.get("id") + # 评分 + rating = info.get('rating') + if rating: + vote_average = float(rating.get("value")) + else: + vote_average = 0 + # 标题 + title = info.get('title') + # 年份 + year = info.get('year') + + if not media_type: + if info.get("type") not in ("movie", "tv"): + continue + mtype = MediaType.MOVIE if info.get("type") == "movie" else MediaType.TV + else: + mtype = media_type + + if mtype == MediaType.MOVIE: + type_str = "MOV" + # 海报 + poster_path = info.get('cover', {}).get("url") + if not poster_path: + poster_path = info.get('cover_url') + if not poster_path: + poster_path = info.get('pic', {}).get("large") + else: + type_str = "TV" + # 海报 + poster_path = info.get('pic', {}).get("normal") + + # 简介 + overview = info.get("card_subtitle") or "" + if not year and overview: + if overview.split("/")[0].strip().isdigit(): + year = overview.split("/")[0].strip() + + # 高清海报 + if poster_path: + poster_path = poster_path.replace("s_ratio_poster", "m_ratio_poster") + + ret_infos.append({ + 'id': "DB:%s" % rid, + 'orgid': rid, + 'title': title, + 'type': type_str, + 'media_type': mtype.value, + 'year': year[:4] if year else "", + 'vote': vote_average, + 'image': poster_path, + 'overview': overview + }) + return ret_infos diff --git a/app/media/doubanapi/__init__.py b/app/media/doubanapi/__init__.py new file mode 100644 index 0000000..81f6bce --- /dev/null +++ b/app/media/doubanapi/__init__.py @@ -0,0 +1,2 @@ +from .apiv2 import DoubanApi +from .webapi import DoubanWeb diff --git a/app/media/doubanapi/apiv2.py b/app/media/doubanapi/apiv2.py new file mode 100644 index 0000000..6a92413 --- /dev/null +++ b/app/media/doubanapi/apiv2.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +import base64 +import hashlib +import hmac +from datetime import datetime +from functools import lru_cache +from random import choice +from urllib import parse + +import requests + +from app.utils import RequestUtils +from app.utils.commons import singleton + + +@singleton +class DoubanApi(object): + _urls = { + # 搜索类 + # sort=U:近期热门 T:标记最多 S:评分最高 R:最新上映 + # q=search_word&start=0&count=20&sort=U + # 聚合搜索 + "search": "/search/weixin", + "search_agg": "/search", + + # 电影探索 + # sort=U:综合排序 T:近期热度 S:高分优先 R:首播时间 + # tags='日本,动画,2022'&start=0&count=20&sort=U + "movie_recommend": "/movie/recommend", + # 电视剧探索 + "tv_recommend": "/tv/recommend", + # 搜索 + "movie_tag": "/movie/tag", + "tv_tag": "/tv/tag", + # q=search_word&start=0&count=20 + "movie_search": "/search/movie", + "tv_search": "/search/movie", + "book_search": "/search/book", + "group_search": "/search/group", + + # 各类主题合集 + # start=0&count=20 + # 正在上映 + "movie_showing": "/subject_collection/movie_showing/items", + # 热门电影 + "movie_hot_gaia": "/subject_collection/movie_hot_gaia/items", + # 即将上映 + "movie_soon": "/subject_collection/movie_soon/items", + # TOP250 + "movie_top250": "/subject_collection/movie_top250/items", + # 高分经典科幻片榜 + "movie_scifi": "/subject_collection/movie_scifi/items", + # 高分经典喜剧片榜 + "movie_comedy": "/subject_collection/movie_comedy/items", + # 高分经典动作片榜 + "movie_action": "/subject_collection/movie_action/items", + # 高分经典爱情片榜 + "movie_love": "/subject_collection/movie_love/items", + + # 热门剧集 + "tv_hot": "/subject_collection/tv_hot/items", + # 国产剧 + "tv_domestic": "/subject_collection/tv_domestic/items", + # 美剧 + "tv_american": "/subject_collection/tv_american/items", + # 本剧 + "tv_japanese": "/subject_collection/tv_japanese/items", + # 韩剧 + "tv_korean": "/subject_collection/tv_korean/items", + # 动画 + "tv_animation": "/subject_collection/tv_animation/items", + # 综艺 + "tv_variety_show": "/subject_collection/tv_variety_show/items", + # 华语口碑周榜 + "tv_chinese_best_weekly": "/subject_collection/tv_chinese_best_weekly/items", + # 全球口碑周榜 + "tv_global_best_weekly": "/subject_collection/tv_global_best_weekly/items", + + # 执门综艺 + "show_hot": "/subject_collection/show_hot/items", + # 国内综艺 + "show_domestic": "/subject_collection/show_domestic/items", + # 国外综艺 + "show_foreign": "/subject_collection/show_foreign/items", + + "book_bestseller": "/subject_collection/book_bestseller/items", + "book_top250": "/subject_collection/book_top250/items", + # 虚构类热门榜 + "book_fiction_hot_weekly": "/subject_collection/book_fiction_hot_weekly/items", + # 非虚构类热门 + "book_nonfiction_hot_weekly": "/subject_collection/book_nonfiction_hot_weekly/items", + + # 音乐 + "music_single": "/subject_collection/music_single/items", + + # rank list + "movie_rank_list": "/movie/rank_list", + "movie_year_ranks": "/movie/year_ranks", + "book_rank_list": "/book/rank_list", + "tv_rank_list": "/tv/rank_list", + + # movie info + "movie_detail": "/movie/", + "movie_rating": "/movie/%s/rating", + "movie_photos": "/movie/%s/photos", + "movie_trailers": "/movie/%s/trailers", + "movie_interests": "/movie/%s/interests", + "movie_reviews": "/movie/%s/reviews", + "movie_recommendations": "/movie/%s/recommendations", + "movie_celebrities": "/movie/%s/celebrities", + + # tv info + "tv_detail": "/tv/", + "tv_rating": "/tv/%s/rating", + "tv_photos": "/tv/%s/photos", + "tv_trailers": "/tv/%s/trailers", + "tv_interests": "/tv/%s/interests", + "tv_reviews": "/tv/%s/reviews", + "tv_recommendations": "/tv/%s/recommendations", + "tv_celebrities": "/tv/%s/celebrities", + + # book info + "book_detail": "/book/", + "book_rating": "/book/%s/rating", + "book_interests": "/book/%s/interests", + "book_reviews": "/book/%s/reviews", + "book_recommendations": "/book/%s/recommendations", + + # music info + "music_detail": "/music/", + "music_rating": "/music/%s/rating", + "music_interests": "/music/%s/interests", + "music_reviews": "/music/%s/reviews", + "music_recommendations": "/music/%s/recommendations", + } + + _user_agents = [ + "api-client/1 com.douban.frodo/7.22.0.beta9(231) Android/23 product/Mate 40 vendor/HUAWEI model/Mate 40 brand/HUAWEI rom/android network/wifi platform/AndroidPad" + "api-client/1 com.douban.frodo/7.18.0(230) Android/22 product/MI 9 vendor/Xiaomi model/MI 9 brand/Android rom/miui6 network/wifi platform/mobile nd/1", + "api-client/1 com.douban.frodo/7.1.0(205) Android/29 product/perseus vendor/Xiaomi model/Mi MIX 3 rom/miui6 network/wifi platform/mobile nd/1", + "api-client/1 com.douban.frodo/7.3.0(207) Android/22 product/MI 9 vendor/Xiaomi model/MI 9 brand/Android rom/miui6 network/wifi platform/mobile nd/1"] + _api_secret_key = "bf7dddc7c9cfe6f7" + _api_key = "0dad551ec0f84ed02907ff5c42e8ec70" + _base_url = "https://frodo.douban.com/api/v2" + _session = requests.Session() + + def __init__(self): + pass + + @classmethod + def __sign(cls, url: str, ts: int, method='GET') -> str: + url_path = parse.urlparse(url).path + raw_sign = '&'.join([method.upper(), parse.quote(url_path, safe=''), str(ts)]) + return base64.b64encode(hmac.new(cls._api_secret_key.encode(), raw_sign.encode(), hashlib.sha1).digest() + ).decode() + + @classmethod + @lru_cache(maxsize=256) + def __invoke(cls, url, **kwargs): + req_url = cls._base_url + url + + params = {'apiKey': cls._api_key} + if kwargs: + params.update(kwargs) + + ts = params.pop('_ts', int(datetime.strftime(datetime.now(), '%Y%m%d'))) + params.update({'os_rom': 'android', 'apiKey': cls._api_key, '_ts': ts, '_sig': cls.__sign(url=req_url, ts=ts)}) + + headers = {'User-Agent': choice(cls._user_agents)} + resp = RequestUtils(headers=headers, session=cls._session).get_res(url=req_url, params=params) + + return resp.json() if resp else None + + def search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["search"], q=keyword, start=start, count=count, _ts=ts) + + def movie_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_search"], q=keyword, start=start, count=count, _ts=ts) + + def tv_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_search"], q=keyword, start=start, count=count, _ts=ts) + + def book_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["book_search"], q=keyword, start=start, count=count, _ts=ts) + + def group_search(self, keyword, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["group_search"], q=keyword, start=start, count=count, _ts=ts) + + def movie_showing(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_showing"], start=start, count=count, _ts=ts) + + def movie_soon(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_soon"], start=start, count=count, _ts=ts) + + def movie_hot_gaia(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_hot_gaia"], start=start, count=count, _ts=ts) + + def tv_hot(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_hot"], start=start, count=count, _ts=ts) + + def tv_animation(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_animation"], start=start, count=count, _ts=ts) + + def tv_variety_show(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_variety_show"], start=start, count=count, _ts=ts) + + def tv_rank_list(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_rank_list"], start=start, count=count, _ts=ts) + + def show_hot(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["show_hot"], start=start, count=count, _ts=ts) + + def movie_detail(self, subject_id): + return self.__invoke(self._urls["movie_detail"] + subject_id) + + def movie_celebrities(self, subject_id): + return self.__invoke(self._urls["movie_celebrities"] % subject_id) + + def tv_detail(self, subject_id): + return self.__invoke(self._urls["tv_detail"] + subject_id) + + def tv_celebrities(self, subject_id): + return self.__invoke(self._urls["tv_celebrities"] % subject_id) + + def book_detail(self, subject_id): + return self.__invoke(self._urls["book_detail"] + subject_id) + + def movie_top250(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_top250"], start=start, count=count, _ts=ts) + + def movie_recommend(self, tags='', sort='T', start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["movie_recommend"], tags=tags, sort=sort, start=start, count=count, _ts=ts) + + def tv_recommend(self, tags='', sort='T', start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_recommend"], tags=tags, sort=sort, start=start, count=count, _ts=ts) + + def tv_chinese_best_weekly(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_chinese_best_weekly"], start=start, count=count, _ts=ts) + + def tv_global_best_weekly(self, start=0, count=20, ts=datetime.strftime(datetime.now(), '%Y%m%d')): + return self.__invoke(self._urls["tv_global_best_weekly"], start=start, count=count, _ts=ts) diff --git a/app/media/doubanapi/webapi.py b/app/media/doubanapi/webapi.py new file mode 100644 index 0000000..801f36f --- /dev/null +++ b/app/media/doubanapi/webapi.py @@ -0,0 +1,294 @@ +from functools import lru_cache + +import requests +from lxml import etree + +from app.utils import RequestUtils, ExceptionUtils +from app.utils.commons import singleton + + +@singleton +class DoubanWeb(object): + + _session = requests.Session() + + _movie_base = "https://movie.douban.com" + _search_base = "https://search.douban.com" + _page_limit = 50 + _timout = 5 + + _weburls = { + # 详情 + "detail": f"{_movie_base}/subject/%s", + # 正在热映 + "nowplaying": f"{_movie_base}/cinema/nowplaying", + # 即将上映 + "later": f"{_movie_base}/cinema/later", + # 看过 + "collect": f"{_movie_base}/people/%s/collect?start=%s&sort=time&rating=all&filter=all&mode=grid", + # 想看 + "wish": f"{_movie_base}/people/%s/wish?start=%s&sort=time&rating=all&filter=all&mode=grid", + # 在看 + "do": f"{_movie_base}/people/%s/do?start=%s&sort=time&rating=all&filter=all&mode=grid", + # 搜索 + "search": f"{_search_base}/movie/subject_search?search_text=%s", + # TOP 250 + "top250": f"{_movie_base}/top250", + # 用户名称 + "user": f"{_movie_base}/people/%s/", + } + + _webparsers = { + "detail": { + "title": "//span[@property='v:itemreviewed']/text()", + "year": "//div[@id='content']//span[@class='year']/text()", + "intro": "//span[@property='v:summary']/text()", + "cover": "//div[@id='mainpic']//img/@src", + "rate": "//strong[@property='v:average']/text()", + "imdb": "//div[@id='info']/span[contains(text(), 'IMDb:')]/following-sibling::text()", + "season": "//div[@id='info']/span[contains(text(), '季数')]/following-sibling::text()", + "episode_num": "//div[@id='info']/span[contains(text(), '集数')]/following-sibling::text()" + }, + "nowplaying": { + "list": "//div[@id='nowplaying']//ul[@class='lists']/li", + "item": { + "id": "./@data-subject", + "title": "./@data-title", + "rate": "./@data-score", + "cover": "./li[@class='poster']/a/img/@src", + "year": "./@data-release" + } + }, + "later": { + "list": "//div[@id='showing-soon']/div", + "item": { + "id": "./@data-subject", + "title": "./div[@class='intro']/h3/a/text()]", + "cover": "./a[class='thumb']/img/@src", + "url": "./div[@class='intro']/h3/a/@href" + } + }, + "top250": { + "list": "//ol[@class='grid_view']/li", + "dates": "//div[@class='info']//span[@class='date']/text()", + "item": { + "title": "./div[@class='item']/div[@class='pic']/a/img/@alt", + "cover": "./div[@class='item']/div[@class='pic']/a/img/@src", + "url": "./div[@class='item']/div[@class='pic']/a/@href" + } + }, + "collect": { + "list": "//div[@class='grid-view']/div[@class='item']", + "dates": "//div[@class='info']//span[@class='date']/text()", + "item": { + "title": "./div[@class='info']/ul/li[@class='title']/a/em/text()", + "cover": "./div[@class='pic']/a/img/@src", + "url": "./div[@class='info']/ul/li[@class='title']/a/@href" + } + }, + "wish": { + "list": "//div[@class='grid-view']/div[@class='item']", + "item": { + "title": "./div[@class='info']/ul/li[@class='title']/a/em/text()", + "cover": "./div[@class='pic']/a/img/@src", + "url": "./div[@class='info']/ul/li[@class='title']/a/@href", + "date": "./div[@class='info']//span[@class='date']/text()" + } + }, + "do": { + "list": "//div[@class='grid-view']/div[@class='item']", + "item": { + "title": "./div[@class='info']/ul/li[@class='title']/a/em/text()", + "cover": "./div[@class='pic']/a/img/@src", + "url": "./div[@class='info']/ul/li[@class='title']/a/@href" + } + }, + "search": { + "list": "//div[@class='item-root']", + "item": { + "title": "./div[@class='title']/a/text()", + "url": "./div[@class='detail']/div[@class='title']/a/@href", + "cover": "./a/img[class='cover']/@src", + "intro": "./div[@class='detail']/div[@class='meta abstract']/text()", + "rate": "./div[@class='detail']/div[@class='rating']/span[@class='rating_nums']/text()", + "actor": "./div[@class='detail']/div[@class='meta abstract_2']/text()" + } + }, + "user": { + "name": "//div[@class='side-info']/div[@class='side-info-txt']/h3/text()" + } + } + + _jsonurls = { + # 最新电影 + "movie_new": f"{_movie_base}/j/search_subjects?type=movie&tag=最新&page_limit={_page_limit}&page_start=%s", + # 热门电影 + "movie_hot": f"{_movie_base}/j/search_subjects?type=movie&tag=热门&page_limit={_page_limit}&page_start=%s", + # 高分电影 + "movie_rate": f"{_movie_base}/j/search_subjects?type=movie&tag=豆瓣高分&page_limit={_page_limit}&page_start=%s", + # 热门电视剧 + "tv_hot": f"{_movie_base}/j/search_subjects?type=tv&tag=热门&page_limit={_page_limit}&page_start=%s", + # 热门动漫 + "anime_hot": f"{_movie_base}/j/search_subjects?type=tv&tag=日本动画&page_limit={_page_limit}&page_start=%s", + # 热门综艺 + "variety_hot": f"{_movie_base}/j/search_subjects?type=tv&tag=综艺&page_limit={_page_limit}&page_start=%s", + } + + def __int__(self, cookie=None): + pass + + @classmethod + def __invoke_web(cls, url, cookie, *kwargs): + req_url = cls._weburls.get(url) + if not req_url: + return None + return RequestUtils(cookies=cookie, + session=cls._session, + timeout=cls._timout).get(url=req_url % kwargs) + + @classmethod + def __invoke_json(cls, url, *kwargs): + req_url = cls._jsonurls.get(url) + if not req_url: + return None + req = RequestUtils(session=cls._session, + timeout=cls._timout).get_res(url=req_url % kwargs) + return req.json() if req else None + + @staticmethod + def __get_json(json): + if not json: + return None + return json.get("subjects") + + @classmethod + def __get_list(cls, url, html): + if not url or not html: + return None + xpaths = cls._webparsers.get(url) + if not xpaths: + return None + items = etree.HTML(html).xpath(xpaths.get("list")) + if not items: + return None + result = [] + for item in items: + obj = {} + for key, value in xpaths.get("item").items(): + text = item.xpath(value) + if text: + obj[key] = text[0] + if obj: + result.append(obj) + return result + + @classmethod + def __get_obj(cls, url, html): + if not url or not html: + return None + xpaths = cls._webparsers.get(url) + if not xpaths: + return None + obj = {} + for key, value in xpaths.items(): + try: + text = etree.HTML(html).xpath(value) + if text: + obj[key] = text[0] + except Exception as e: + ExceptionUtils.exception_traceback(e) + return obj + + @classmethod + @lru_cache(maxsize=256) + def detail(cls, cookie, doubanid): + """ + 查询详情 + """ + return cls.__get_obj("detail", cls.__invoke_web("detail", cookie, doubanid)) + + @classmethod + @lru_cache(maxsize=10) + def user(cls, cookie, userid): + """ + 查询用户信息 + """ + return cls.__get_obj("user", cls.__invoke_web("user", cookie, userid)) + + def nowplaying(self, cookie): + """ + 正在热映 + """ + return self.__get_list("nowplaying", self.__invoke_web("nowplaying", cookie)) + + def later(self, cookie): + """ + 即将上映 + """ + return self.__get_list("later", self.__invoke_web("later", cookie)) + + def collect(self, cookie, userid, start=0): + """ + 看过 + """ + return self.__get_list("collect", self.__invoke_web("collect", cookie, userid, start)) + + def wish(self, cookie, userid, start=0): + """ + 想看 + """ + return self.__get_list("wish", self.__invoke_web("wish", cookie, userid, start)) + + def do(self, cookie, userid, start=0): + """ + 在看 + """ + return self.__get_list("do", self.__invoke_web("do", cookie, userid, start)) + + def search(self, cookie, keyword): + """ + 搜索 + """ + return self.__get_list("search", self.__invoke_web("search", cookie, keyword)) + + def top250(self, cookie): + """ + TOP 250 + """ + return self.__get_list("top250", self.__invoke_web("top250", cookie)) + + def movie_new(self, start=0): + """ + 最新电影 + """ + return self.__get_json(self.__invoke_json("movie_new", start)) + + def movie_hot(self, start=0): + """ + 热门电影 + """ + return self.__get_json(self.__invoke_json("movie_hot", start)) + + def movie_rate(self, start=0): + """ + 高分电影 + """ + return self.__get_json(self.__invoke_json("movie_rate", start)) + + def tv_hot(self, start=0): + """ + 热门电视剧 + """ + return self.__get_json(self.__invoke_json("tv_hot", start)) + + def anime_hot(self, start=0): + """ + 热门动漫 + """ + return self.__get_json(self.__invoke_json("anime_hot", start)) + + def variety_hot(self, start=0): + """ + 热门综艺 + """ + return self.__get_json(self.__invoke_json("variety_hot", start)) diff --git a/app/media/fanart.py b/app/media/fanart.py new file mode 100644 index 0000000..4dd53f8 --- /dev/null +++ b/app/media/fanart.py @@ -0,0 +1,214 @@ +from functools import lru_cache + +from app.utils import RequestUtils, ExceptionUtils +from app.utils.types import MediaType +from config import Config, FANART_MOVIE_API_URL, FANART_TV_API_URL + + +class Fanart: + _proxies = Config().get_proxies() + _movie_image_types = ['movieposter', + 'hdmovielogo', + 'moviebackground', + 'moviedisc', + 'moviebanner', + 'moviethumb'] + _tv_image_types = ['hdtvlogo', + 'tvthumb', + 'showbackground', + 'tvbanner', + 'seasonposter', + 'seasonbanner', + 'seasonthumb', + 'tvposter', + 'hdclearart'] + _images = {} + + def __init__(self): + self.init_config() + + def init_config(self): + self._images = {} + + def __get_fanart_images(self, media_type, queryid): + if not media_type or not queryid: + return + try: + ret = self.__request_fanart(media_type=media_type, queryid=queryid) + if ret and ret.status_code == 200: + if media_type == MediaType.MOVIE: + for image_type in self._movie_image_types: + images = ret.json().get(image_type) + if isinstance(images, list): + self._images[image_type] = images[0].get('url') if isinstance(images[0], dict) else "" + else: + self._images[image_type] = "" + else: + for image_type in self._tv_image_types: + images = ret.json().get(image_type) + if isinstance(images, list): + if image_type in ['seasonposter', 'seasonthumb', 'seasonbanner']: + if not self._images.get(image_type): + self._images[image_type] = {} + for image in images: + if image.get("season") not in self._images[image_type].keys(): + self._images[image_type][image.get("season")] = image.get("url") + else: + self._images[image_type] = images[0].get('url') if isinstance(images[0], dict) else "" + else: + self._images[image_type] = "" + except Exception as e2: + ExceptionUtils.exception_traceback(e2) + + @classmethod + @lru_cache(maxsize=256) + def __request_fanart(cls, media_type, queryid): + if media_type == MediaType.MOVIE: + image_url = FANART_MOVIE_API_URL % queryid + else: + image_url = FANART_TV_API_URL % queryid + try: + return RequestUtils(proxies=cls._proxies, timeout=5).get_res(image_url) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return None + + def get_backdrop(self, media_type, queryid, default=""): + """ + 获取横幅背景图 + """ + if not media_type or not queryid: + return "" + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.MOVIE: + return self._images.get("moviethumb", default) + else: + return self._images.get("tvthumb", default) + + def get_poster(self, media_type, queryid, default=None): + """ + 获取海报 + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.MOVIE: + return self._images.get("movieposter", default) + else: + return self._images.get("tvposter", default) + + def get_background(self, media_type, queryid, default=None): + """ + 获取海报 + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.MOVIE: + return self._images.get("moviebackground", default) + else: + return self._images.get("showbackground", default) + + def get_banner(self, media_type, queryid, default=None): + """ + 获取海报 + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.MOVIE: + return self._images.get("moviebanner", default) + else: + return self._images.get("tvbanner", default) + + def get_disc(self, media_type, queryid, default=None): + """ + 获取光盘封面 + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.MOVIE: + return self._images.get("moviedisc", default) + else: + return None + + def get_logo(self, media_type, queryid, default=None): + """ + 获取海报 + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.MOVIE: + return self._images.get("hdmovielogo", default) + else: + return self._images.get("hdtvlogo", default) + + def get_thumb(self, media_type, queryid, default=None): + """ + 获取缩略图 + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.MOVIE: + return self._images.get("moviethumb", default) + else: + return self._images.get("tvthumb", default) + + def get_clearart(self, media_type, queryid, default=None): + """ + 获取clearart + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type == MediaType.TV: + return self._images.get("hdclearart", default) + else: + return None + + def get_seasonposter(self, media_type, queryid, season, default=None): + """ + 获取seasonposter + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type != MediaType.TV: + return None + return self._images.get("seasonposter", {}).get(season, "") or default + + def get_seasonthumb(self, media_type, queryid, season, default=None): + """ + 获取seasonposter + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type != MediaType.TV: + return None + return self._images.get("seasonthumb", {}).get(season, "") or default + + def get_seasonbanner(self, media_type, queryid, season, default=None): + """ + 获取seasonbanner + """ + if not media_type or not queryid: + return None + if not self._images: + self.__get_fanart_images(media_type=media_type, queryid=queryid) + if media_type != MediaType.TV: + return None + return self._images.get("seasonbanner", {}).get(season, "") or default diff --git a/app/media/media.py b/app/media/media.py new file mode 100644 index 0000000..3384f2b --- /dev/null +++ b/app/media/media.py @@ -0,0 +1,2131 @@ +import difflib +import os +import random +import re +import traceback +from functools import lru_cache + +import zhconv +from lxml import etree + +import log +from app.helper import MetaHelper +from app.media.meta.metainfo import MetaInfo +from app.media.tmdbv3api import TMDb, Search, Movie, TV, Person, Find, TMDbException, Discover, Trending, Episode, Genre +from app.utils import PathUtils, EpisodeFormat, RequestUtils, NumberUtils, StringUtils, cacheman +from app.utils.types import MediaType, MatchMode +from config import Config, KEYWORD_BLACKLIST, KEYWORD_SEARCH_WEIGHT_3, KEYWORD_SEARCH_WEIGHT_2, KEYWORD_SEARCH_WEIGHT_1, \ + KEYWORD_STR_SIMILARITY_THRESHOLD, KEYWORD_DIFF_SCORE_THRESHOLD, TMDB_IMAGE_ORIGINAL_URL, DEFAULT_TMDB_PROXY, \ + TMDB_IMAGE_FACE_URL, TMDB_PEOPLE_PROFILE_URL, TMDB_IMAGE_W500_URL + + +class Media: + # TheMovieDB + tmdb = None + search = None + movie = None + tv = None + episode = None + person = None + find = None + trending = None + discover = None + genre = None + meta = None + _rmt_match_mode = None + _search_keyword = None + _search_tmdbweb = None + + def __init__(self): + self.init_config() + + def init_config(self): + app = Config().get_config('app') + laboratory = Config().get_config('laboratory') + if app: + if app.get('rmt_tmdbkey'): + self.tmdb = TMDb() + if laboratory.get('tmdb_proxy'): + self.tmdb.domain = DEFAULT_TMDB_PROXY + else: + self.tmdb.domain = app.get("tmdb_domain") + self.tmdb.cache = True + self.tmdb.api_key = app.get('rmt_tmdbkey') + self.tmdb.language = 'zh' + self.tmdb.proxies = Config().get_proxies() + self.tmdb.debug = True + self.search = Search() + self.movie = Movie() + self.tv = TV() + self.episode = Episode() + self.find = Find() + self.person = Person() + self.trending = Trending() + self.discover = Discover() + self.genre = Genre() + self.meta = MetaHelper() + rmt_match_mode = app.get('rmt_match_mode', 'normal') + if rmt_match_mode: + rmt_match_mode = rmt_match_mode.upper() + else: + rmt_match_mode = "NORMAL" + if rmt_match_mode == "STRICT": + self._rmt_match_mode = MatchMode.STRICT + else: + self._rmt_match_mode = MatchMode.NORMAL + laboratory = Config().get_config('laboratory') + if laboratory: + self._search_keyword = laboratory.get("search_keyword") + self._search_tmdbweb = laboratory.get("search_tmdbweb") + + @staticmethod + def __compare_tmdb_names(file_name, tmdb_names): + """ + 比较文件名是否匹配,忽略大小写和特殊字符 + :param file_name: 识别的文件名或者种子名 + :param tmdb_names: TMDB返回的译名 + :return: True or False + """ + if not file_name or not tmdb_names: + return False + if not isinstance(tmdb_names, list): + tmdb_names = [tmdb_names] + file_name = StringUtils.handler_special_chars(file_name).upper() + for tmdb_name in tmdb_names: + tmdb_name = StringUtils.handler_special_chars(tmdb_name).strip().upper() + if file_name == tmdb_name: + return True + return False + + def __search_tmdb_allnames(self, mtype: MediaType, tmdb_id): + """ + 检索tmdb中所有的标题和译名,用于名称匹配 + :param mtype: 类型:电影、电视剧、动漫 + :param tmdb_id: TMDB的ID + :return: 所有译名的清单 + """ + if not mtype or not tmdb_id: + return {}, [] + ret_names = [] + tmdb_info = self.get_tmdb_info(mtype=mtype, tmdbid=tmdb_id) + if not tmdb_info: + return tmdb_info, [] + if mtype == MediaType.MOVIE: + alternative_titles = tmdb_info.get("alternative_titles", {}).get("titles", []) + for alternative_title in alternative_titles: + title = alternative_title.get("title") + if title and title not in ret_names: + ret_names.append(title) + translations = tmdb_info.get("translations", {}).get("translations", []) + for translation in translations: + title = translation.get("data", {}).get("title") + if title and title not in ret_names: + ret_names.append(title) + else: + alternative_titles = tmdb_info.get("alternative_titles", {}).get("results", []) + for alternative_title in alternative_titles: + name = alternative_title.get("title") + if name and name not in ret_names: + ret_names.append(name) + translations = tmdb_info.get("translations", {}).get("translations", []) + for translation in translations: + name = translation.get("data", {}).get("name") + if name and name not in ret_names: + ret_names.append(name) + return tmdb_info, ret_names + + def __search_tmdb(self, file_media_name, + search_type, + first_media_year=None, + media_year=None, + season_number=None, + language=None): + """ + 检索tmdb中的媒体信息,匹配返回一条尽可能正确的信息 + :param file_media_name: 剑索的名称 + :param search_type: 类型:电影、电视剧、动漫 + :param first_media_year: 年份,如要是季集需要是首播年份(first_air_date) + :param media_year: 当前季集年份 + :param season_number: 季集,整数 + :param language: 语言,默认是zh-CN + :return: TMDB的INFO,同时会将search_type赋值到media_type中 + """ + if not self.search: + return None + if not file_media_name: + return None + if language: + self.tmdb.language = language + else: + self.tmdb.language = 'zh-CN' + # TMDB检索 + info = {} + if search_type == MediaType.MOVIE: + year_range = [first_media_year] + if first_media_year: + year_range.append(str(int(first_media_year) + 1)) + year_range.append(str(int(first_media_year) - 1)) + for year in year_range: + log.debug( + f"【Meta】正在识别{search_type.value}:{file_media_name}, 年份={year} ...") + info = self.__search_movie_by_name(file_media_name, year) + if info: + info['media_type'] = MediaType.MOVIE + log.info("【Meta】%s 识别到 电影:TMDBID=%s, 名称=%s, 上映日期=%s" % ( + file_media_name, + info.get('id'), + info.get('title'), + info.get('release_date'))) + break + else: + # 有当前季和当前季集年份,使用精确匹配 + if media_year and season_number: + log.debug( + f"【Meta】正在识别{search_type.value}:{file_media_name}, 季集={season_number}, 季集年份={media_year} ...") + info = self.__search_tv_by_season(file_media_name, + media_year, + season_number) + if not info: + log.debug( + f"【Meta】正在识别{search_type.value}:{file_media_name}, 年份={StringUtils.xstr(first_media_year)} ...") + info = self.__search_tv_by_name(file_media_name, + first_media_year) + if info: + info['media_type'] = MediaType.TV + log.info("【Meta】%s 识别到 电视剧:TMDBID=%s, 名称=%s, 首播日期=%s" % ( + file_media_name, + info.get('id'), + info.get('name'), + info.get('first_air_date'))) + # 返回 + if info: + return info + else: + log.info("【Meta】%s 以年份 %s 在TMDB中未找到%s信息!" % ( + file_media_name, StringUtils.xstr(first_media_year), search_type.value if search_type else "")) + return info + + def __search_movie_by_name(self, file_media_name, first_media_year): + """ + 根据名称查询电影TMDB匹配 + :param file_media_name: 识别的文件名或种子名 + :param first_media_year: 电影上映日期 + :return: 匹配的媒体信息 + """ + try: + if first_media_year: + movies = self.search.movies({"query": file_media_name, "year": first_media_year}) + else: + movies = self.search.movies({"query": file_media_name}) + except TMDbException as err: + log.error(f"【Meta】连接TMDB出错:{str(err)}") + return None + except Exception as e: + log.error(f"【Meta】连接TMDB出错:{str(e)}") + return None + log.debug(f"【Meta】API返回:{str(self.search.total_results)}") + if len(movies) == 0: + log.debug(f"【Meta】{file_media_name} 未找到相关电影信息!") + return {} + else: + info = {} + if first_media_year: + for movie in movies: + if movie.get('release_date'): + if self.__compare_tmdb_names(file_media_name, movie.get('title')) \ + and movie.get('release_date')[0:4] == str(first_media_year): + return movie + if self.__compare_tmdb_names(file_media_name, movie.get('original_title')) \ + and movie.get('release_date')[0:4] == str(first_media_year): + return movie + else: + for movie in movies: + if self.__compare_tmdb_names(file_media_name, movie.get('title')) \ + or self.__compare_tmdb_names(file_media_name, movie.get('original_title')): + return movie + if not info: + index = 0 + for movie in movies: + if first_media_year: + if not movie.get('release_date'): + continue + if movie.get('release_date')[0:4] != str(first_media_year): + continue + index += 1 + info, names = self.__search_tmdb_allnames(MediaType.MOVIE, movie.get("id")) + if self.__compare_tmdb_names(file_media_name, names): + return info + else: + index += 1 + info, names = self.__search_tmdb_allnames(MediaType.MOVIE, movie.get("id")) + if self.__compare_tmdb_names(file_media_name, names): + return info + if index > 5: + break + return {} + + def __search_tv_by_name(self, file_media_name, first_media_year): + """ + 根据名称查询电视剧TMDB匹配 + :param file_media_name: 识别的文件名或者种子名 + :param first_media_year: 电视剧的首播年份 + :return: 匹配的媒体信息 + """ + try: + if first_media_year: + tvs = self.search.tv_shows({"query": file_media_name, "first_air_date_year": first_media_year}) + else: + tvs = self.search.tv_shows({"query": file_media_name}) + except TMDbException as err: + log.error(f"【Meta】连接TMDB出错:{str(err)}") + return None + except Exception as e: + log.error(f"【Meta】连接TMDB出错:{str(e)}") + return None + log.debug(f"【Meta】API返回:{str(self.search.total_results)}") + if len(tvs) == 0: + log.debug(f"【Meta】{file_media_name} 未找到相关剧集信息!") + return {} + else: + info = {} + if first_media_year: + for tv in tvs: + if tv.get('first_air_date'): + if self.__compare_tmdb_names(file_media_name, tv.get('name')) \ + and tv.get('first_air_date')[0:4] == str(first_media_year): + return tv + if self.__compare_tmdb_names(file_media_name, tv.get('original_name')) \ + and tv.get('first_air_date')[0:4] == str(first_media_year): + return tv + else: + for tv in tvs: + if self.__compare_tmdb_names(file_media_name, tv.get('name')) \ + or self.__compare_tmdb_names(file_media_name, tv.get('original_name')): + return tv + if not info: + index = 0 + for tv in tvs: + if first_media_year: + if not tv.get('first_air_date'): + continue + if tv.get('first_air_date')[0:4] != str(first_media_year): + continue + index += 1 + info, names = self.__search_tmdb_allnames(MediaType.TV, tv.get("id")) + if self.__compare_tmdb_names(file_media_name, names): + return info + else: + index += 1 + info, names = self.__search_tmdb_allnames(MediaType.TV, tv.get("id")) + if self.__compare_tmdb_names(file_media_name, names): + return info + if index > 5: + break + return {} + + def __search_tv_by_season(self, file_media_name, media_year, season_number): + """ + 根据电视剧的名称和季的年份及序号匹配TMDB + :param file_media_name: 识别的文件名或者种子名 + :param media_year: 季的年份 + :param season_number: 季序号 + :return: 匹配的媒体信息 + """ + + def __season_match(tv_info, season_year): + if not tv_info: + return False + try: + seasons = self.get_tmdb_tv_seasons(tv_info=tv_info) + for season in seasons: + if season.get("air_date") and season.get("season_number"): + if season.get("air_date")[0:4] == str(season_year) \ + and season.get("season_number") == int(season_number): + return True + except Exception as e1: + log.error(f"【Meta】连接TMDB出错:{e1}") + return False + return False + + try: + tvs = self.search.tv_shows({"query": file_media_name}) + except TMDbException as err: + log.error(f"【Meta】连接TMDB出错:{str(err)}") + return None + except Exception as e: + log.error(f"【Meta】连接TMDB出错:{e}") + return None + + if len(tvs) == 0: + log.debug("【Meta】%s 未找到季%s相关信息!" % (file_media_name, season_number)) + return {} + else: + for tv in tvs: + if (self.__compare_tmdb_names(file_media_name, tv.get('name')) + or self.__compare_tmdb_names(file_media_name, tv.get('original_name'))) \ + and (tv.get('first_air_date') and tv.get('first_air_date')[0:4] == str(media_year)): + return tv + + for tv in tvs[:5]: + info, names = self.__search_tmdb_allnames(MediaType.TV, tv.get("id")) + if not self.__compare_tmdb_names(file_media_name, names): + continue + if __season_match(tv_info=info, season_year=media_year): + return info + return {} + + def __search_multi_tmdb(self, file_media_name): + """ + 根据名称同时查询电影和电视剧,不带年份 + :param file_media_name: 识别的文件名或种子名 + :return: 匹配的媒体信息 + """ + try: + multis = self.search.multi({"query": file_media_name}) or [] + except TMDbException as err: + log.error(f"【Meta】连接TMDB出错:{str(err)}") + return None + except Exception as e: + log.error(f"【Meta】连接TMDB出错:{str(e)}") + return None + log.debug(f"【Meta】API返回:{str(self.search.total_results)}") + if len(multis) == 0: + log.debug(f"【Meta】{file_media_name} 未找到相关媒体息!") + return {} + else: + info = {} + for multi in multis: + if multi.get("media_type") == "movie": + if self.__compare_tmdb_names(file_media_name, multi.get('title')) \ + or self.__compare_tmdb_names(file_media_name, multi.get('original_title')): + info = multi + elif multi.get("media_type") == "tv": + if self.__compare_tmdb_names(file_media_name, multi.get('name')) \ + or self.__compare_tmdb_names(file_media_name, multi.get('original_name')): + info = multi + if not info: + for multi in multis[:5]: + if multi.get("media_type") == "movie": + movie_info, names = self.__search_tmdb_allnames(MediaType.MOVIE, multi.get("id")) + if self.__compare_tmdb_names(file_media_name, names): + info = movie_info + elif multi.get("media_type") == "tv": + tv_info, names = self.__search_tmdb_allnames(MediaType.TV, multi.get("id")) + if self.__compare_tmdb_names(file_media_name, names): + info = tv_info + # 返回 + if info: + info['media_type'] = MediaType.MOVIE if info.get('media_type') == 'movie' else MediaType.TV + return info + else: + log.info("【Meta】%s 在TMDB中未找到媒体信息!" % file_media_name) + return info + + @lru_cache(maxsize=128) + def __search_tmdb_web(self, file_media_name, mtype: MediaType): + """ + 检索TMDB网站,直接抓取结果,结果只有一条时才返回 + :param file_media_name: 名称 + """ + if not file_media_name: + return None + if StringUtils.is_chinese(file_media_name): + return {} + log.info("【Meta】正在从TheDbMovie网站查询:%s ..." % file_media_name) + tmdb_url = "https://www.themoviedb.org/search?query=%s" % file_media_name + res = RequestUtils(timeout=5).get_res(url=tmdb_url) + if res and res.status_code == 200: + html_text = res.text + if not html_text: + return None + try: + tmdb_links = [] + html = etree.HTML(html_text) + links = html.xpath("//a[@data-id]/@href") + for link in links: + if not link or (not link.startswith("/tv") and not link.startswith("/movie")): + continue + if link not in tmdb_links: + tmdb_links.append(link) + if len(tmdb_links) == 1: + tmdbinfo = self.get_tmdb_info( + mtype=MediaType.TV if tmdb_links[0].startswith("/tv") else MediaType.MOVIE, + tmdbid=tmdb_links[0].split("/")[-1]) + if tmdbinfo: + if mtype == MediaType.TV and tmdbinfo.get('media_type') != MediaType.TV: + return {} + if tmdbinfo.get('media_type') == MediaType.MOVIE: + log.info("【Meta】%s 从WEB识别到 电影:TMDBID=%s, 名称=%s, 上映日期=%s" % ( + file_media_name, + tmdbinfo.get('id'), + tmdbinfo.get('title'), + tmdbinfo.get('release_date'))) + else: + log.info("【Meta】%s 从WEB识别到 电视剧:TMDBID=%s, 名称=%s, 首播日期=%s" % ( + file_media_name, + tmdbinfo.get('id'), + tmdbinfo.get('name'), + tmdbinfo.get('first_air_date'))) + return tmdbinfo + elif len(tmdb_links) > 1: + log.info("【Meta】%s TMDB网站返回数据过多:%s" % (file_media_name, len(tmdb_links))) + else: + log.info("【Meta】%s TMDB网站未查询到媒体信息!" % file_media_name) + except Exception as err: + print(str(err)) + return None + return None + + def get_tmdb_info(self, mtype: MediaType, + tmdbid, + language=None, + append_to_response=None, + chinese=True): + """ + 给定TMDB号,查询一条媒体信息 + :param mtype: 类型:电影、电视剧、动漫,为空时都查(此时用不上年份) + :param tmdbid: TMDB的ID,有tmdbid时优先使用tmdbid,否则使用年份和标题 + :param language: 语种 + :param append_to_response: 附加信息 + :param chinese: 是否转换中文标题 + """ + if not self.tmdb: + log.error("【Meta】TMDB API Key 未设置!") + return None + if language: + self.tmdb.language = language + else: + self.tmdb.language = 'zh-CN' + if mtype == MediaType.MOVIE: + tmdb_info = self.__get_tmdb_movie_detail(tmdbid, append_to_response) + if tmdb_info: + tmdb_info['media_type'] = MediaType.MOVIE + else: + tmdb_info = self.__get_tmdb_tv_detail(tmdbid, append_to_response) + if tmdb_info: + tmdb_info['media_type'] = MediaType.TV + if tmdb_info: + # 转换genreid + tmdb_info['genre_ids'] = self.__get_genre_ids_from_detail(tmdb_info.get('genres')) + # 转换中文标题 + if chinese: + tmdb_info = self.__update_tmdbinfo_cn_title(tmdb_info) + + return tmdb_info + + def __update_tmdbinfo_cn_title(self, tmdb_info): + """ + 更新TMDB信息中的中文名称 + """ + # 查找中文名 + org_title = tmdb_info.get("title") if tmdb_info.get("media_type") == MediaType.MOVIE else tmdb_info.get( + "name") + if not StringUtils.is_chinese(org_title) and self.tmdb.language == 'zh-CN': + cn_title = self.__get_tmdb_chinese_title(tmdbinfo=tmdb_info) + if cn_title and cn_title != org_title: + if tmdb_info.get("media_type") == MediaType.MOVIE: + tmdb_info['title'] = cn_title + else: + tmdb_info['name'] = cn_title + return tmdb_info + + def get_tmdb_infos(self, title, year=None, mtype: MediaType = None, page=1): + """ + 查询名称中有关键字的所有的TMDB信息并返回 + """ + if not self.tmdb: + log.error("【Meta】TMDB API Key 未设置!") + return [] + if not title: + return [] + if not mtype and not year: + results = self.__search_multi_tmdbinfos(title) + else: + if not mtype: + results = list( + set(self.__search_movie_tmdbinfos(title, year)).union(set(self.__search_tv_tmdbinfos(title, year)))) + # 组合结果的情况下要排序 + results = sorted(results, + key=lambda x: x.get("release_date") or x.get("first_air_date") or "0000-00-00", + reverse=True) + elif mtype == MediaType.MOVIE: + results = self.__search_movie_tmdbinfos(title, year) + else: + results = self.__search_tv_tmdbinfos(title, year) + return results[(page - 1) * 20:page * 20] + + def __search_multi_tmdbinfos(self, title): + """ + 同时查询模糊匹配的电影、电视剧TMDB信息 + """ + if not title: + return [] + ret_infos = [] + multis = self.search.multi({"query": title}) or [] + for multi in multis: + if multi.get("media_type") in ["movie", "tv"]: + multi['media_type'] = MediaType.MOVIE if multi.get("media_type") == "movie" else MediaType.TV + ret_infos.append(multi) + return ret_infos + + def __search_movie_tmdbinfos(self, title, year): + """ + 查询模糊匹配的所有电影TMDB信息 + """ + if not title: + return [] + ret_infos = [] + if year: + movies = self.search.movies({"query": title, "year": year}) or [] + else: + movies = self.search.movies({"query": title}) or [] + for movie in movies: + if title in movie.get("title"): + movie['media_type'] = MediaType.MOVIE + ret_infos.append(movie) + return ret_infos + + def __search_tv_tmdbinfos(self, title, year): + """ + 查询模糊匹配的所有电视剧TMDB信息 + """ + if not title: + return [] + ret_infos = [] + if year: + tvs = self.search.tv_shows({"query": title, "first_air_date_year": year}) or [] + else: + tvs = self.search.tv_shows({"query": title}) or [] + for tv in tvs: + if title in tv.get("name"): + tv['media_type'] = MediaType.TV + ret_infos.append(tv) + return ret_infos + + @staticmethod + def __make_cache_key(meta_info): + """ + 生成缓存的key + """ + if not meta_info: + return None + return f"[{meta_info.type.value}]{meta_info.get_name()}-{meta_info.year}-{meta_info.begin_season}" + + def get_cache_info(self, meta_info): + """ + 根据名称查询是否已经有缓存 + """ + if not meta_info: + return {} + return self.meta.get_meta_data_by_key(self.__make_cache_key(meta_info)) + + def get_media_info(self, title, + subtitle=None, + mtype=None, + strict=None, + cache=True, + chinese=True, + append_to_response=None): + """ + 只有名称信息,判别是电影还是电视剧并搜刮TMDB信息,用于种子名称识别 + :param title: 种子名称 + :param subtitle: 种子副标题 + :param mtype: 类型:电影、电视剧、动漫 + :param strict: 是否严格模式,为true时,不会再去掉年份再查一次 + :param cache: 是否使用缓存,默认TRUE + :param chinese: 原标题为英文时是否从别名中检索中文名称 + :param append_to_response: 额外查询的信息 + :return: 带有TMDB信息的MetaInfo对象 + """ + if not self.tmdb: + log.error("【Meta】TMDB API Key 未设置!") + return None + if not title: + return None + # 识别 + meta_info = MetaInfo(title, subtitle=subtitle) + if not meta_info.get_name() or not meta_info.type: + log.warn("【Rmt】%s 未识别出有效信息!" % meta_info.org_string) + return None + if mtype: + meta_info.type = mtype + media_key = self.__make_cache_key(meta_info) + if not cache or not self.meta.get_meta_data_by_key(media_key): + # 缓存没有或者强制不使用缓存 + if meta_info.type != MediaType.TV and not meta_info.year: + file_media_info = self.__search_multi_tmdb(file_media_name=meta_info.get_name()) + else: + if meta_info.type == MediaType.TV: + # 确定是电视 + file_media_info = self.__search_tmdb(file_media_name=meta_info.get_name(), + first_media_year=meta_info.year, + search_type=meta_info.type, + media_year=meta_info.year, + season_number=meta_info.begin_season + ) + if not file_media_info and meta_info.year and self._rmt_match_mode == MatchMode.NORMAL and not strict: + # 非严格模式下去掉年份再查一次 + file_media_info = self.__search_tmdb(file_media_name=meta_info.get_name(), + search_type=meta_info.type + ) + else: + # 有年份先按电影查 + file_media_info = self.__search_tmdb(file_media_name=meta_info.get_name(), + first_media_year=meta_info.year, + search_type=MediaType.MOVIE + ) + # 没有再按电视剧查 + if not file_media_info: + file_media_info = self.__search_tmdb(file_media_name=meta_info.get_name(), + first_media_year=meta_info.year, + search_type=MediaType.TV + ) + if not file_media_info and self._rmt_match_mode == MatchMode.NORMAL and not strict: + # 非严格模式下去掉年份和类型再查一次 + file_media_info = self.__search_multi_tmdb(file_media_name=meta_info.get_name()) + if not file_media_info and self._search_tmdbweb: + file_media_info = self.__search_tmdb_web(file_media_name=meta_info.get_name(), + mtype=meta_info.type) + if not file_media_info and self._search_keyword: + cache_name = cacheman["tmdb_supply"].get(meta_info.get_name()) + is_movie = False + if not cache_name: + cache_name, is_movie = self.__search_engine(meta_info.get_name()) + cacheman["tmdb_supply"].set(meta_info.get_name(), cache_name) + if cache_name: + log.info("【Meta】开始辅助查询:%s ..." % cache_name) + if is_movie: + file_media_info = self.__search_tmdb(file_media_name=cache_name, search_type=MediaType.MOVIE) + else: + file_media_info = self.__search_multi_tmdb(file_media_name=cache_name) + # 补充全量信息 + if file_media_info and not file_media_info.get("genres"): + file_media_info = self.get_tmdb_info(mtype=file_media_info.get("media_type"), + tmdbid=file_media_info.get("id"), + chinese=chinese, + append_to_response=append_to_response) + # 保存到缓存 + if file_media_info is not None: + self.__insert_media_cache(media_key=media_key, + file_media_info=file_media_info) + else: + # 使用缓存信息 + cache_info = self.meta.get_meta_data_by_key(media_key) + if cache_info.get("id"): + file_media_info = self.get_tmdb_info(mtype=cache_info.get("type"), + tmdbid=cache_info.get("id"), + chinese=chinese, + append_to_response=append_to_response) + else: + file_media_info = None + # 赋值TMDB信息并返回 + meta_info.set_tmdb_info(file_media_info) + return meta_info + + def __insert_media_cache(self, media_key, file_media_info): + """ + 将TMDB信息插入缓存 + """ + if file_media_info: + # 缓存标题 + cache_title = file_media_info.get( + "title") if file_media_info.get( + "media_type") == MediaType.MOVIE else file_media_info.get("name") + # 缓存年份 + cache_year = file_media_info.get('release_date') if file_media_info.get( + "media_type") == MediaType.MOVIE else file_media_info.get('first_air_date') + if cache_year: + cache_year = cache_year[:4] + self.meta.update_meta_data({ + media_key: { + "id": file_media_info.get("id"), + "type": file_media_info.get("media_type"), + "year": cache_year, + "title": cache_title, + "poster_path": file_media_info.get("poster_path"), + "backdrop_path": file_media_info.get("backdrop_path") + } + }) + else: + self.meta.update_meta_data({media_key: {'id': 0}}) + + def get_media_info_on_files(self, + file_list, + tmdb_info=None, + media_type=None, + season=None, + episode_format: EpisodeFormat = None, + chinese=True): + """ + 根据文件清单,搜刮TMDB信息,用于文件名称的识别 + :param file_list: 文件清单,如果是列表也可以是单个文件,也可以是一个目录 + :param tmdb_info: 如有传入TMDB信息则以该TMDB信息赋于所有文件,否则按名称从TMDB检索,用于手工识别时传入 + :param media_type: 媒体类型:电影、电视剧、动漫,如有传入以该类型赋于所有文件,否则按名称从TMDB检索并识别 + :param season: 季号,如有传入以该季号赋于所有文件,否则从名称中识别 + :param episode_format: EpisodeFormat + :param chinese: 原标题为英文时是否从别名中检索中文名称 + :return: 带有TMDB信息的每个文件对应的MetaInfo对象字典 + """ + # 存储文件路径与媒体的对应关系 + if not self.tmdb: + log.error("【Meta】TMDB API Key 未设置!") + return {} + return_media_infos = {} + # 不是list的转为list + if not isinstance(file_list, list): + file_list = [file_list] + # 遍历每个文件,看得出来的名称是不是不一样,不一样的先搜索媒体信息 + for file_path in file_list: + try: + if not os.path.exists(file_path): + log.warn("【Meta】%s 不存在" % file_path) + continue + # 解析媒体名称 + # 先用自己的名称 + file_name = os.path.basename(file_path) + parent_name = os.path.basename(os.path.dirname(file_path)) + parent_parent_name = os.path.basename(PathUtils.get_parent_paths(file_path, 2)) + # 过滤掉蓝光原盘目录下的子文件 + if not os.path.isdir(file_path) \ + and PathUtils.get_bluray_dir(file_path): + log.info("【Meta】%s 跳过蓝光原盘文件:" % file_path) + continue + # 没有自带TMDB信息 + if not tmdb_info: + # 识别名称 + meta_info = MetaInfo(title=file_name) + # 识别不到则使用上级的名称 + if not meta_info.get_name() or not meta_info.year: + parent_info = MetaInfo(parent_name) + if not parent_info.get_name() or not parent_info.year: + parent_parent_info = MetaInfo(parent_parent_name) + parent_info.type = parent_parent_info.type if parent_parent_info.type and parent_info.type != MediaType.TV else parent_info.type + parent_info.cn_name = parent_parent_info.cn_name if parent_parent_info.cn_name else parent_info.cn_name + parent_info.en_name = parent_parent_info.en_name if parent_parent_info.en_name else parent_info.en_name + parent_info.year = parent_parent_info.year if parent_parent_info.year else parent_info.year + parent_info.begin_season = NumberUtils.max_ele(parent_info.begin_season, + parent_parent_info.begin_season) + if not meta_info.get_name(): + meta_info.cn_name = parent_info.cn_name + meta_info.en_name = parent_info.en_name + if not meta_info.year: + meta_info.year = parent_info.year + if parent_info.type and parent_info.type == MediaType.TV \ + and meta_info.type != MediaType.TV: + meta_info.type = parent_info.type + if meta_info.type == MediaType.TV: + meta_info.begin_season = NumberUtils.max_ele(parent_info.begin_season, + meta_info.begin_season) + if not meta_info.get_name() or not meta_info.type: + log.warn("【Rmt】%s 未识别出有效信息!" % meta_info.org_string) + continue + # 区配缓存及TMDB + media_key = self.__make_cache_key(meta_info) + if not self.meta.get_meta_data_by_key(media_key): + # 没有缓存数据 + file_media_info = self.__search_tmdb(file_media_name=meta_info.get_name(), + first_media_year=meta_info.year, + search_type=meta_info.type, + media_year=meta_info.year, + season_number=meta_info.begin_season) + if not file_media_info: + if self._rmt_match_mode == MatchMode.NORMAL: + # 去掉年份再查一次,有可能是年份错误 + file_media_info = self.__search_tmdb(file_media_name=meta_info.get_name(), + search_type=meta_info.type) + if not file_media_info and self._search_tmdbweb: + # 从网站查询 + file_media_info = self.__search_tmdb_web(file_media_name=meta_info.get_name(), + mtype=meta_info.type) + if not file_media_info and self._search_keyword: + cache_name = cacheman["tmdb_supply"].get(meta_info.get_name()) + is_movie = False + if not cache_name: + cache_name, is_movie = self.__search_engine(meta_info.get_name()) + cacheman["tmdb_supply"].set(meta_info.get_name(), cache_name) + if cache_name: + log.info("【Meta】开始辅助查询:%s ..." % cache_name) + if is_movie: + file_media_info = self.__search_tmdb(file_media_name=cache_name, + search_type=MediaType.MOVIE) + else: + file_media_info = self.__search_multi_tmdb(file_media_name=cache_name) + # 补全TMDB信息 + if file_media_info and not file_media_info.get("genres"): + file_media_info = self.get_tmdb_info(mtype=file_media_info.get("media_type"), + tmdbid=file_media_info.get("id"), + chinese=chinese) + # 保存到缓存 + if file_media_info is not None: + self.__insert_media_cache(media_key=media_key, + file_media_info=file_media_info) + else: + # 使用缓存信息 + cache_info = self.meta.get_meta_data_by_key(media_key) + if cache_info.get("id"): + file_media_info = self.get_tmdb_info(mtype=cache_info.get("type"), + tmdbid=cache_info.get("id"), + chinese=chinese) + else: + # 缓存为未识别 + file_media_info = None + # 赋值TMDB信息 + meta_info.set_tmdb_info(file_media_info) + # 自带TMDB信息 + else: + meta_info = MetaInfo(title=file_name, mtype=media_type) + meta_info.set_tmdb_info(tmdb_info) + if season and meta_info.type != MediaType.MOVIE: + meta_info.begin_season = int(season) + if episode_format: + begin_ep, end_ep = episode_format.split_episode(file_name) + if begin_ep is not None: + meta_info.begin_episode = begin_ep + if end_ep is not None: + meta_info.end_episode = end_ep + # 加入缓存 + self.save_rename_cache(file_name, tmdb_info) + # 按文件路程存储 + return_media_infos[file_path] = meta_info + except Exception as err: + print(str(err)) + log.error("【Rmt】发生错误:%s - %s" % (str(err), traceback.format_exc())) + # 循环结束 + return return_media_infos + + @staticmethod + def __dict_tmdbinfos(infos, mtype=None): + """ + TMDB电影信息转为字典 + """ + if not infos: + return [] + ret_infos = [] + for info in infos: + tmdbid = info.get("id") + vote = round(float(info.get("vote_average")), 1) if info.get("vote_average") else 0, + image = TMDB_IMAGE_W500_URL % info.get("poster_path") + overview = info.get("overview") + if mtype: + media_type = mtype.value + year = info.get("release_date")[0:4] if info.get( + "release_date") and mtype == MediaType.MOVIE else info.get( + "first_air_date")[0:4] if info.get( + "first_air_date") else "" + typestr = 'MOV' if mtype == MediaType.MOVIE else 'TV' + title = info.get("title") if mtype == MediaType.MOVIE else info.get("name") + else: + media_type = MediaType.MOVIE.value if info.get( + "media_type") == "movie" else MediaType.TV.value + year = info.get("release_date")[0:4] if info.get( + "release_date") and info.get( + "media_type") == "movie" else info.get( + "first_air_date")[0:4] if info.get( + "first_air_date") else "" + typestr = 'MOV' if info.get("media_type") == "movie" else 'TV' + title = info.get("title") if info.get("media_type") == "movie" else info.get("name") + + ret_infos.append({ + 'id': tmdbid, + 'orgid': tmdbid, + 'tmdbid': tmdbid, + 'title': title, + 'type': typestr, + 'media_type': media_type, + 'year': year, + 'vote': vote, + 'image': image, + 'overview': overview + }) + + return ret_infos + + def get_tmdb_hot_movies(self, page): + """ + 获取热门电影 + :param page: 第几页 + :return: TMDB信息列表 + """ + if not self.movie: + return [] + return self.__dict_tmdbinfos(self.movie.popular(page), MediaType.MOVIE) + + def get_tmdb_hot_tvs(self, page): + """ + 获取热门电视剧 + :param page: 第几页 + :return: TMDB信息列表 + """ + if not self.tv: + return [] + return self.__dict_tmdbinfos(self.tv.popular(page), MediaType.TV) + + def get_tmdb_new_movies(self, page): + """ + 获取最新电影 + :param page: 第几页 + :return: TMDB信息列表 + """ + if not self.movie: + return [] + return self.__dict_tmdbinfos(self.movie.now_playing(page), MediaType.MOVIE) + + def get_tmdb_new_tvs(self, page): + """ + 获取最新电视剧 + :param page: 第几页 + :return: TMDB信息列表 + """ + if not self.tv: + return [] + return self.__dict_tmdbinfos(self.tv.on_the_air(page), MediaType.TV) + + def get_tmdb_upcoming_movies(self, page): + """ + 获取即将上映电影 + :param page: 第几页 + :return: TMDB信息列表 + """ + if not self.movie: + return [] + return self.__dict_tmdbinfos(self.movie.upcoming(page), MediaType.MOVIE) + + def get_tmdb_trending_all_week(self, page=1): + """ + 获取即将上映电影 + :param page: 第几页 + :return: TMDB信息列表 + """ + if not self.movie: + return [] + return self.__dict_tmdbinfos(self.trending.all_week(page=page)) + + def __get_tmdb_movie_detail(self, tmdbid, append_to_response=None): + """ + 获取电影的详情 + :param tmdbid: TMDB ID + :return: TMDB信息 + """ + """ + { + "adult": false, + "backdrop_path": "/r9PkFnRUIthgBp2JZZzD380MWZy.jpg", + "belongs_to_collection": { + "id": 94602, + "name": "穿靴子的猫(系列)", + "poster_path": "/anHwj9IupRoRZZ98WTBvHpTiE6A.jpg", + "backdrop_path": "/feU1DWV5zMWxXUHJyAIk3dHRQ9c.jpg" + }, + "budget": 90000000, + "genres": [ + { + "id": 16, + "name": "动画" + }, + { + "id": 28, + "name": "动作" + }, + { + "id": 12, + "name": "冒险" + }, + { + "id": 35, + "name": "喜剧" + }, + { + "id": 10751, + "name": "家庭" + }, + { + "id": 14, + "name": "奇幻" + } + ], + "homepage": "", + "id": 315162, + "imdb_id": "tt3915174", + "original_language": "en", + "original_title": "Puss in Boots: The Last Wish", + "overview": "时隔11年,臭屁自大又爱卖萌的猫大侠回来了!如今的猫大侠(安东尼奥·班德拉斯 配音),依旧幽默潇洒又不拘小节、数次“花式送命”后,九条命如今只剩一条,于是不得不请求自己的老搭档兼“宿敌”——迷人的软爪妞(萨尔玛·海耶克 配音)来施以援手来恢复自己的九条生命。", + "popularity": 8842.129, + "poster_path": "/rnn30OlNPiC3IOoWHKoKARGsBRK.jpg", + "production_companies": [ + { + "id": 33, + "logo_path": "/8lvHyhjr8oUKOOy2dKXoALWKdp0.png", + "name": "Universal Pictures", + "origin_country": "US" + }, + { + "id": 521, + "logo_path": "/kP7t6RwGz2AvvTkvnI1uteEwHet.png", + "name": "DreamWorks Animation", + "origin_country": "US" + } + ], + "production_countries": [ + { + "iso_3166_1": "US", + "name": "United States of America" + } + ], + "release_date": "2022-12-07", + "revenue": 260725470, + "runtime": 102, + "spoken_languages": [ + { + "english_name": "English", + "iso_639_1": "en", + "name": "English" + }, + { + "english_name": "Spanish", + "iso_639_1": "es", + "name": "Español" + } + ], + "status": "Released", + "tagline": "", + "title": "穿靴子的猫2", + "video": false, + "vote_average": 8.614, + "vote_count": 2291 + } + """ + if not self.movie: + return {} + try: + log.info("【Meta】正在查询TMDB电影:%s ..." % tmdbid) + tmdbinfo = self.movie.details(tmdbid, append_to_response) + return tmdbinfo or {} + except Exception as e: + print(str(e)) + return None + + def __get_tmdb_tv_detail(self, tmdbid, append_to_response=None): + """ + 获取电视剧的详情 + :param tmdbid: TMDB ID + :return: TMDB信息 + """ + """ + { + "adult": false, + "backdrop_path": "/uDgy6hyPd82kOHh6I95FLtLnj6p.jpg", + "created_by": [ + { + "id": 35796, + "credit_id": "5e84f06a3344c600153f6a57", + "name": "Craig Mazin", + "gender": 2, + "profile_path": "/uEhna6qcMuyU5TP7irpTUZ2ZsZc.jpg" + }, + { + "id": 1295692, + "credit_id": "5e84f03598f1f10016a985c0", + "name": "Neil Druckmann", + "gender": 2, + "profile_path": "/bVUsM4aYiHbeSYE1xAw2H5Z1ANU.jpg" + } + ], + "episode_run_time": [], + "first_air_date": "2023-01-15", + "genres": [ + { + "id": 18, + "name": "剧情" + }, + { + "id": 10765, + "name": "Sci-Fi & Fantasy" + }, + { + "id": 10759, + "name": "动作冒险" + } + ], + "homepage": "https://www.hbo.com/the-last-of-us", + "id": 100088, + "in_production": true, + "languages": [ + "en" + ], + "last_air_date": "2023-01-15", + "last_episode_to_air": { + "air_date": "2023-01-15", + "episode_number": 1, + "id": 2181581, + "name": "当你迷失在黑暗中", + "overview": "在一场全球性的流行病摧毁了文明之后,一个顽强的幸存者负责照顾一个 14 岁的小女孩,她可能是人类最后的希望。", + "production_code": "", + "runtime": 81, + "season_number": 1, + "show_id": 100088, + "still_path": "/aRquEWm8wWF1dfa9uZ1TXLvVrKD.jpg", + "vote_average": 8, + "vote_count": 33 + }, + "name": "最后生还者", + "next_episode_to_air": { + "air_date": "2023-01-22", + "episode_number": 2, + "id": 4071039, + "name": "虫草变异菌", + "overview": "", + "production_code": "", + "runtime": 55, + "season_number": 1, + "show_id": 100088, + "still_path": "/jkUtYTmeap6EvkHI4n0j5IRFrIr.jpg", + "vote_average": 10, + "vote_count": 1 + }, + "networks": [ + { + "id": 49, + "name": "HBO", + "logo_path": "/tuomPhY2UtuPTqqFnKMVHvSb724.png", + "origin_country": "US" + } + ], + "number_of_episodes": 9, + "number_of_seasons": 1, + "origin_country": [ + "US" + ], + "original_language": "en", + "original_name": "The Last of Us", + "overview": "不明真菌疫情肆虐之后的美国,被真菌感染的人都变成了可怕的怪物,乔尔(Joel)为了换回武器答应将小女孩儿艾莉(Ellie)送到指定地点,由此开始了两人穿越美国的漫漫旅程。", + "popularity": 5585.639, + "poster_path": "/nOY3VBFO0VnlN9nlRombnMTztyh.jpg", + "production_companies": [ + { + "id": 3268, + "logo_path": "/tuomPhY2UtuPTqqFnKMVHvSb724.png", + "name": "HBO", + "origin_country": "US" + }, + { + "id": 11073, + "logo_path": "/aCbASRcI1MI7DXjPbSW9Fcv9uGR.png", + "name": "Sony Pictures Television Studios", + "origin_country": "US" + }, + { + "id": 23217, + "logo_path": "/kXBZdQigEf6QiTLzo6TFLAa7jKD.png", + "name": "Naughty Dog", + "origin_country": "US" + }, + { + "id": 115241, + "logo_path": null, + "name": "The Mighty Mint", + "origin_country": "US" + }, + { + "id": 119645, + "logo_path": null, + "name": "Word Games", + "origin_country": "US" + }, + { + "id": 125281, + "logo_path": "/3hV8pyxzAJgEjiSYVv1WZ0ZYayp.png", + "name": "PlayStation Productions", + "origin_country": "US" + } + ], + "production_countries": [ + { + "iso_3166_1": "US", + "name": "United States of America" + } + ], + "seasons": [ + { + "air_date": "2023-01-15", + "episode_count": 9, + "id": 144593, + "name": "第 1 季", + "overview": "", + "poster_path": "/aUQKIpZZ31KWbpdHMCmaV76u78T.jpg", + "season_number": 1 + } + ], + "spoken_languages": [ + { + "english_name": "English", + "iso_639_1": "en", + "name": "English" + } + ], + "status": "Returning Series", + "tagline": "", + "type": "Scripted", + "vote_average": 8.924, + "vote_count": 601 + } + """ + if not self.tv: + return {} + try: + log.info("【Meta】正在查询TMDB电视剧:%s ..." % tmdbid) + tmdbinfo = self.tv.details(tmdbid, append_to_response) + return tmdbinfo or {} + except Exception as e: + print(str(e)) + return None + + def get_tmdb_tv_season_detail(self, tmdbid, season: int): + """ + 获取电视剧季的详情 + :param tmdbid: TMDB ID + :param season: 季,数字 + :return: TMDB信息 + """ + """ + { + "_id": "5e614cd3357c00001631a6ef", + "air_date": "2023-01-15", + "episodes": [ + { + "air_date": "2023-01-15", + "episode_number": 1, + "id": 2181581, + "name": "当你迷失在黑暗中", + "overview": "在一场全球性的流行病摧毁了文明之后,一个顽强的幸存者负责照顾一个 14 岁的小女孩,她可能是人类最后的希望。", + "production_code": "", + "runtime": 81, + "season_number": 1, + "show_id": 100088, + "still_path": "/aRquEWm8wWF1dfa9uZ1TXLvVrKD.jpg", + "vote_average": 8, + "vote_count": 33, + "crew": [ + { + "job": "Writer", + "department": "Writing", + "credit_id": "619c370063536a00619a08ee", + "adult": false, + "gender": 2, + "id": 35796, + "known_for_department": "Writing", + "name": "Craig Mazin", + "original_name": "Craig Mazin", + "popularity": 15.211, + "profile_path": "/uEhna6qcMuyU5TP7irpTUZ2ZsZc.jpg" + }, + ], + "guest_stars": [ + { + "character": "Marlene", + "credit_id": "63c4ca5e5f2b8d00aed539fc", + "order": 500, + "adult": false, + "gender": 1, + "id": 1253388, + "known_for_department": "Acting", + "name": "Merle Dandridge", + "original_name": "Merle Dandridge", + "popularity": 21.679, + "profile_path": "/lKwHdTtDf6NGw5dUrSXxbfkZLEk.jpg" + } + ] + }, + ], + "name": "第 1 季", + "overview": "", + "id": 144593, + "poster_path": "/aUQKIpZZ31KWbpdHMCmaV76u78T.jpg", + "season_number": 1 + } + """ + if not self.tv: + return {} + try: + log.info("【Meta】正在查询TMDB电视剧:%s,季:%s ..." % (tmdbid, season)) + tmdbinfo = self.tv.season_details(tmdbid, season) + return tmdbinfo or {} + except Exception as e: + print(str(e)) + return {} + + def get_tmdb_tv_seasons_byid(self, tmdbid): + """ + 根据TMDB查询TMDB电视剧的所有季 + """ + if not tmdbid: + return [] + return self.get_tmdb_tv_seasons( + tv_info=self.__get_tmdb_tv_detail( + tmdbid=tmdbid + ) + ) + + @staticmethod + def get_tmdb_tv_seasons(tv_info): + """ + 查询TMDB电视剧的所有季 + :param tv_info: TMDB 的季信息 + :return: 带有season_number、episode_count 的每季总集数的字典列表 + """ + """ + "seasons": [ + { + "air_date": "2006-01-08", + "episode_count": 11, + "id": 3722, + "name": "特别篇", + "overview": "", + "poster_path": "/snQYndfsEr3Sto2jOmkmsQuUXAQ.jpg", + "season_number": 0 + }, + { + "air_date": "2005-03-27", + "episode_count": 9, + "id": 3718, + "name": "第 1 季", + "overview": "", + "poster_path": "/foM4ImvUXPrD2NvtkHyixq5vhPx.jpg", + "season_number": 1 + } + ] + """ + if not tv_info: + return [] + return tv_info.get("seasons") or [] + + def get_tmdb_season_episodes(self, tmdbid, season: int): + """ + :param: tmdbid: TMDB ID + :param: season: 季号 + """ + """ + 从TMDB的季集信息中获得某季的集信息 + """ + """ + "episodes": [ + { + "air_date": "2023-01-15", + "episode_number": 1, + "id": 2181581, + "name": "当你迷失在黑暗中", + "overview": "在一场全球性的流行病摧毁了文明之后,一个顽强的幸存者负责照顾一个 14 岁的小女孩,她可能是人类最后的希望。", + "production_code": "", + "runtime": 81, + "season_number": 1, + "show_id": 100088, + "still_path": "/aRquEWm8wWF1dfa9uZ1TXLvVrKD.jpg", + "vote_average": 8, + "vote_count": 33 + }, + ] + """ + if not tmdbid: + return [] + season_info = self.get_tmdb_tv_season_detail(tmdbid=tmdbid, season=season) + if not season_info: + return [] + return season_info.get("episodes") or [] + + @staticmethod + def get_tmdb_backdrops(tmdbinfo): + """ + 获取TMDB的背景图 + """ + """ + { + "backdrops": [ + { + "aspect_ratio": 1.778, + "height": 2160, + "iso_639_1": "en", + "file_path": "/qUroDlCDUMwRWbkyjZGB9THkMgZ.jpg", + "vote_average": 5.312, + "vote_count": 1, + "width": 3840 + }, + { + "aspect_ratio": 1.778, + "height": 2160, + "iso_639_1": "en", + "file_path": "/iyxvxEQIfQjzJJTfszZxmH5UV35.jpg", + "vote_average": 0, + "vote_count": 0, + "width": 3840 + }, + { + "aspect_ratio": 1.778, + "height": 720, + "iso_639_1": "en", + "file_path": "/8SRY6IcMKO1E5p83w7bjvcqklp9.jpg", + "vote_average": 0, + "vote_count": 0, + "width": 1280 + }, + { + "aspect_ratio": 1.778, + "height": 1080, + "iso_639_1": "en", + "file_path": "/erkJ7OxJWFdLBOcn2MvIdhTLHTu.jpg", + "vote_average": 0, + "vote_count": 0, + "width": 1920 + } + ] + } + """ + if not tmdbinfo: + return [] + backdrops = tmdbinfo.get("images", {}).get("backdrops") or [] + result = [TMDB_IMAGE_ORIGINAL_URL % backdrop.get("file_path") for backdrop in backdrops] + result.append(TMDB_IMAGE_ORIGINAL_URL % tmdbinfo.get("backdrop_path")) + return result + + @staticmethod + def get_tmdb_season_episodes_num(tv_info, season: int): + """ + 从TMDB的季信息中获得具体季有多少集 + :param season: 季号,数字 + :param tv_info: 已获取的TMDB季的信息 + :return: 该季的总集数 + """ + if not tv_info: + return 0 + seasons = tv_info.get("seasons") + if not seasons: + return 0 + for sea in seasons: + if sea.get("season_number") == int(season): + return int(sea.get("episode_count")) + return 0 + + @staticmethod + def __dict_media_crews(crews): + """ + 字典化媒体工作人员 + """ + return [{ + "id": crew.get("id"), + "gender": crew.get("gender"), + "known_for_department": crew.get("known_for_department"), + "name": crew.get("name"), + "original_name": crew.get("original_name"), + "popularity": crew.get("popularity"), + "image": TMDB_IMAGE_FACE_URL % crew.get("profile_path"), + "credit_id": crew.get("credit_id"), + "department": crew.get("department"), + "job": crew.get("job"), + "profile": TMDB_PEOPLE_PROFILE_URL % crew.get('id') + } for crew in crews or []] + + @staticmethod + def __dict_media_casts(casts): + """ + 字典化媒体演职人员 + """ + return [{ + "id": cast.get("id"), + "gender": cast.get("gender"), + "known_for_department": cast.get("known_for_department"), + "name": cast.get("name"), + "original_name": cast.get("original_name"), + "popularity": cast.get("popularity"), + "image": TMDB_IMAGE_FACE_URL % cast.get("profile_path"), + "cast_id": cast.get("cast_id"), + "role": cast.get("character"), + "credit_id": cast.get("credit_id"), + "order": cast.get("order"), + "profile": TMDB_PEOPLE_PROFILE_URL % cast.get('id') + } for cast in casts or []] + + def get_tmdb_directors_actors(self, tmdbinfo): + """ + 查询导演和演员 + :param tmdbinfo: TMDB元数据 + :return: 导演列表,演员列表 + """ + """ + "cast": [ + { + "adult": false, + "gender": 2, + "id": 3131, + "known_for_department": "Acting", + "name": "Antonio Banderas", + "original_name": "Antonio Banderas", + "popularity": 60.896, + "profile_path": "/iWIUEwgn2KW50MssR7tdPeFoRGW.jpg", + "cast_id": 2, + "character": "Puss in Boots (voice)", + "credit_id": "6052480e197de4006bb47b9a", + "order": 0 + } + ], + "crew": [ + { + "adult": false, + "gender": 2, + "id": 5524, + "known_for_department": "Production", + "name": "Andrew Adamson", + "original_name": "Andrew Adamson", + "popularity": 9.322, + "profile_path": "/qqIAVKAe5LHRbPyZUlptsqlo4Kb.jpg", + "credit_id": "63b86b2224b33300a0585bf1", + "department": "Production", + "job": "Executive Producer" + } + ] + """ + if not tmdbinfo: + return [], [] + _credits = tmdbinfo.get("credits") + if not _credits: + return [], [] + directors = [] + actors = [] + for cast in self.__dict_media_casts(_credits.get("cast")): + if cast.get("known_for_department") == "Acting": + actors.append(cast) + for crew in self.__dict_media_crews(_credits.get("crew")): + if crew.get("job") == "Director": + directors.append(crew) + return directors, actors + + def get_tmdb_cats(self, mtype, tmdbid): + """ + 获取TMDB的演员列表 + :param: mtype: 媒体类型 + :param: tmdbid: TMDBID + """ + try: + if mtype == MediaType.MOVIE: + if not self.movie: + return [] + return self.__dict_media_casts(self.movie.credits(tmdbid).get("cast")) + else: + if not self.tv: + return [] + return self.__dict_media_casts(self.tv.credits(tmdbid).get("cast")) + except Exception as err: + print(str(err)) + return [] + + @staticmethod + def get_tmdb_genres_names(tmdbinfo): + """ + 从TMDB数据中获取风格名称 + """ + """ + "genres": [ + { + "id": 16, + "name": "动画" + }, + { + "id": 28, + "name": "动作" + }, + { + "id": 12, + "name": "冒险" + }, + { + "id": 35, + "name": "喜剧" + }, + { + "id": 10751, + "name": "家庭" + }, + { + "id": 14, + "name": "奇幻" + } + ] + """ + if not tmdbinfo: + return "" + genres = tmdbinfo.get("genres") or [] + genres_list = [genre.get("name") for genre in genres] + return ", ".join(genres_list) if genres_list else "" + + def get_tmdb_genres(self, mtype): + """ + 获取TMDB的风格列表 + :param: mtype: 媒体类型 + """ + if not self.genre: + return [] + try: + if mtype == MediaType.MOVIE: + return self.genre.movie_list() + else: + return self.genre.tv_list() + except Exception as err: + print(str(err)) + return [] + + @staticmethod + def get_get_production_country_names(tmdbinfo): + """ + 从TMDB数据中获取制片国家名称 + """ + """ + "production_countries": [ + { + "iso_3166_1": "US", + "name": "美国" + } + ] + """ + if not tmdbinfo: + return "" + countries = tmdbinfo.get("production_countries") or [] + countries_list = [country.get("name") for country in countries] + return ", ".join(countries_list) if countries_list else "" + + @staticmethod + def get_tmdb_production_company_names(tmdbinfo): + """ + 从TMDB数据中获取制片公司名称 + """ + """ + "production_companies": [ + { + "id": 2, + "logo_path": "/wdrCwmRnLFJhEoH8GSfymY85KHT.png", + "name": "DreamWorks Animation", + "origin_country": "US" + } + ] + """ + if not tmdbinfo: + return "" + companies = tmdbinfo.get("production_companies") or [] + companies_list = [company.get("name") for company in companies] + return ", ".join(companies_list) if companies_list else "" + + @staticmethod + def get_tmdb_crews(tmdbinfo, nums=None): + """ + 从TMDB数据中获取制片人员 + """ + if not tmdbinfo: + return "" + crews = tmdbinfo.get("credits", {}).get("crew") or [] + result = [{crew.get("name"): crew.get("job")} for crew in crews] + if nums: + return result[:nums] + else: + return result + + def get_tmdb_en_title(self, media_info): + """ + 获取TMDB的英文名称 + """ + en_info = self.get_tmdb_info(mtype=media_info.type, + tmdbid=media_info.tmdb_id, + language="en-US") + if en_info: + return en_info.get("title") if media_info.type == MediaType.MOVIE else en_info.get("name") + return None + + def get_episode_title(self, media_info): + """ + 获取剧集的标题 + """ + if media_info.type == MediaType.MOVIE: + return None + if media_info.tmdb_id: + if not media_info.begin_episode: + return None + episodes = self.get_tmdb_season_episodes(tmdbid=media_info.tmdb_id, + season=int(media_info.get_season_seq())) + for episode in episodes: + if episode.get("episode_number") == media_info.begin_episode: + return episode.get("name") + return None + + def get_movie_similar(self, tmdbid, page=1): + """ + 查询类似电影 + """ + if not self.movie: + return [] + try: + movies = self.movie.similar(movie_id=tmdbid, page=page) or [] + return self.__dict_tmdbinfos(movies, MediaType.MOVIE) + except Exception as e: + print(str(e)) + return [] + + def get_movie_recommendations(self, tmdbid, page=1): + """ + 查询电影关联推荐 + """ + if not self.movie: + return [] + try: + movies = self.movie.recommendations(movie_id=tmdbid, page=page) or [] + return self.__dict_tmdbinfos(movies, MediaType.MOVIE) + except Exception as e: + print(str(e)) + return [] + + def get_tv_similar(self, tmdbid, page=1): + """ + 查询类似电视剧 + """ + if not self.tv: + return [] + try: + tvs = self.tv.similar(tv_id=tmdbid, page=page) or [] + return self.__dict_tmdbinfos(tvs, MediaType.TV) + except Exception as e: + print(str(e)) + return [] + + def get_tv_recommendations(self, tmdbid, page=1): + """ + 查询电视剧关联推荐 + """ + if not self.tv: + return [] + try: + tvs = self.tv.recommendations(tv_id=tmdbid, page=page) or [] + return self.__dict_tmdbinfos(tvs, MediaType.TV) + except Exception as e: + print(str(e)) + return [] + + def get_tmdb_discover(self, mtype, params=None, page=1): + """ + 浏览电影、电视剧(复杂过滤条件) + """ + if not self.discover: + return [] + try: + if mtype == MediaType.MOVIE: + movies = self.discover.discover_movies(params=params, page=page) + return self.__dict_tmdbinfos(movies, mtype) + elif mtype == MediaType.TV: + tvs = self.discover.discover_tv_shows(params=params, page=page) + return self.__dict_tmdbinfos(tvs, mtype) + except Exception as e: + print(str(e)) + return [] + + def get_person_medias(self, personid, mtype, page=1): + """ + 查询人物相关影视作品 + """ + if not self.person: + return [] + result = [] + try: + if mtype == MediaType.MOVIE: + movies = self.person.movie_credits(person_id=personid) or [] + result = self.__dict_tmdbinfos(movies, mtype) + elif mtype == MediaType.TV: + tvs = self.person.tv_credits(person_id=personid) or [] + result = self.__dict_tmdbinfos(tvs, mtype) + return result[(page - 1) * 20: page * 20] + except Exception as e: + print(str(e)) + return [] + + @staticmethod + def __search_engine(feature_name): + """ + 辅助识别关键字 + """ + is_movie = False + if not feature_name: + return None, is_movie + # 剔除不必要字符 + feature_name = re.compile(r"^\w+字幕[组社]?", re.IGNORECASE).sub("", feature_name) + backlist = sorted(KEYWORD_BLACKLIST, key=lambda x: len(x), reverse=True) + for single in backlist: + feature_name = feature_name.replace(single, " ") + if not feature_name: + return None, is_movie + + def cal_score(strongs, r_dict): + for i, s in enumerate(strongs): + if len(strongs) < 5: + if i < 2: + score = KEYWORD_SEARCH_WEIGHT_3[0] + else: + score = KEYWORD_SEARCH_WEIGHT_3[1] + elif len(strongs) < 10: + if i < 2: + score = KEYWORD_SEARCH_WEIGHT_2[0] + else: + score = KEYWORD_SEARCH_WEIGHT_2[1] if i < (len(strongs) >> 1) else KEYWORD_SEARCH_WEIGHT_2[2] + else: + if i < 2: + score = KEYWORD_SEARCH_WEIGHT_1[0] + else: + score = KEYWORD_SEARCH_WEIGHT_1[1] if i < (len(strongs) >> 2) else KEYWORD_SEARCH_WEIGHT_1[ + 2] if i < ( + len(strongs) >> 1) \ + else KEYWORD_SEARCH_WEIGHT_1[3] if i < (len(strongs) >> 2 + len(strongs) >> 1) else \ + KEYWORD_SEARCH_WEIGHT_1[ + 4] + if r_dict.__contains__(s.lower()): + r_dict[s.lower()] += score + continue + r_dict[s.lower()] = score + + bing_url = "https://www.cn.bing.com/search?q=%s&qs=n&form=QBRE&sp=-1" % feature_name + baidu_url = "https://www.baidu.com/s?ie=utf-8&tn=baiduhome_pg&wd=%s" % feature_name + res_bing = RequestUtils(timeout=5).get_res(url=bing_url) + res_baidu = RequestUtils(timeout=5).get_res(url=baidu_url) + ret_dict = {} + if res_bing and res_bing.status_code == 200: + html_text = res_bing.text + if html_text: + html = etree.HTML(html_text) + strongs_bing = list( + filter(lambda x: (0 if not x else difflib.SequenceMatcher(None, feature_name, + x).ratio()) > KEYWORD_STR_SIMILARITY_THRESHOLD, + map(lambda x: x.text, html.cssselect( + "#sp_requery strong, #sp_recourse strong, #tile_link_cn strong, .b_ad .ad_esltitle~div strong, h2 strong, .b_caption p strong, .b_snippetBigText strong, .recommendationsTableTitle+.b_slideexp strong, .recommendationsTableTitle+table strong, .recommendationsTableTitle+ul strong, .pageRecoContainer .b_module_expansion_control strong, .pageRecoContainer .b_title>strong, .b_rs strong, .b_rrsr strong, #dict_ans strong, .b_listnav>.b_ans_stamp>strong, #b_content #ans_nws .na_cnt strong, .adltwrnmsg strong")))) + if strongs_bing: + title = html.xpath("//aside//h2[@class = \" b_entityTitle\"]/text()") + if len(title) > 0: + if title: + t = re.compile(r"\s*\(\d{4}\)$").sub("", title[0]) + ret_dict[t] = 200 + if html.xpath("//aside//div[@data-feedbk-ids = \"Movie\"]"): + is_movie = True + cal_score(strongs_bing, ret_dict) + if res_baidu and res_baidu.status_code == 200: + html_text = res_baidu.text + if html_text: + html = etree.HTML(html_text) + ems = list( + filter(lambda x: (0 if not x else difflib.SequenceMatcher(None, feature_name, + x).ratio()) > KEYWORD_STR_SIMILARITY_THRESHOLD, + map(lambda x: x.text, html.cssselect("em")))) + if len(ems) > 0: + cal_score(ems, ret_dict) + if not ret_dict: + return None, False + ret = sorted(ret_dict.items(), key=lambda d: d[1], reverse=True) + log.info("【Meta】推断关键字为:%s ..." % ([k[0] for i, k in enumerate(ret) if i < 4])) + if len(ret) == 1: + keyword = ret[0][0] + else: + pre = ret[0] + nextw = ret[1] + if nextw[0].find(pre[0]) > -1: + # 满分直接判定 + if int(pre[1]) >= 100: + keyword = pre[0] + # 得分相差30 以上, 选分高 + elif int(pre[1]) - int(nextw[1]) > KEYWORD_DIFF_SCORE_THRESHOLD: + keyword = pre[0] + # 重复的不选 + elif nextw[0].replace(pre[0], "").strip() == pre[0]: + keyword = pre[0] + # 纯数字不选 + elif pre[0].isdigit(): + keyword = nextw[0] + else: + keyword = nextw[0] + + else: + keyword = pre[0] + log.info("【Meta】选择关键字为:%s " % keyword) + return keyword, is_movie + + @staticmethod + def __get_genre_ids_from_detail(genres): + """ + 从TMDB详情中获取genre_id列表 + """ + if not genres: + return [] + genre_ids = [] + for genre in genres: + genre_ids.append(genre.get('id')) + return genre_ids + + @staticmethod + def __get_tmdb_chinese_title(tmdbinfo): + """ + 从别名中获取中文标题 + """ + if not tmdbinfo: + return None + if tmdbinfo.get("media_type") == MediaType.MOVIE: + alternative_titles = tmdbinfo.get("alternative_titles", {}).get("titles", []) + else: + alternative_titles = tmdbinfo.get("alternative_titles", {}).get("results", []) + for alternative_title in alternative_titles: + iso_3166_1 = alternative_title.get("iso_3166_1") + if iso_3166_1 == "CN": + title = alternative_title.get("title") + if title and StringUtils.is_chinese(title) and zhconv.convert(title, "zh-hans") == title: + return title + return tmdbinfo.get("title") if tmdbinfo.get("media_type") == MediaType.MOVIE else tmdbinfo.get("name") + + def get_tmdbperson_chinese_name(self, person_id): + """ + 查询TMDB人物中文名称 + """ + if not self.person: + return "" + alter_names = [] + name = "" + try: + aka_names = self.person.details(person_id).get("also_known_as", []) or [] + except Exception as err: + print(str(err)) + return "" + for aka_name in aka_names: + if StringUtils.is_chinese(aka_name): + alter_names.append(aka_name) + if len(alter_names) == 1: + name = alter_names[0] + elif len(alter_names) > 1: + for alter_name in alter_names: + if alter_name == zhconv.convert(alter_name, 'zh-hans'): + name = alter_name + return name + + def get_tmdbperson_aka_names(self, person_id): + """ + 查询人物又名 + """ + if not self.person: + return [] + try: + aka_names = self.person.details(person_id).get("also_known_as", []) or [] + return aka_names + except Exception as err: + print(str(err)) + return [] + + def get_random_discover_backdrop(self): + """ + 获取TMDB热门电影随机一张背景图 + """ + try: + # 随机类型 + mtype = MediaType.MOVIE if random.uniform(0, 1) > 0.5 else MediaType.TV + # 热门电影/电视剧 + if mtype == MediaType.MOVIE: + medias = self.discover.discover_movies(params={"sort_by": "popularity.desc"}) + else: + medias = self.discover.discover_tv_shows(params={"sort_by": "popularity.desc"}) + if medias: + backdrops = [media.get("backdrop_path") for media in medias if media.get("backdrop_path")] + # 随机一张 + return TMDB_IMAGE_ORIGINAL_URL % backdrops[round(random.uniform(0, len(backdrops) - 1))] + except Exception as err: + print(str(err)) + return "" + + def save_rename_cache(self, file_name, cache_info): + """ + 将手动识别的信息加入缓存 + """ + if not file_name or not cache_info: + return + meta_info = MetaInfo(title=file_name) + self.__insert_media_cache(self.__make_cache_key(meta_info), cache_info) + + @staticmethod + def merge_media_info(target, source): + """ + 将soruce中有效的信息合并到target中并返回 + """ + target.set_tmdb_info(source.tmdb_info) + target.fanart_poster = source.get_poster_image() + target.fanart_backdrop = source.get_backdrop_image() + target.set_download_info(download_setting=source.download_setting, + save_path=source.save_path) + return target + + def get_tmdbid_by_imdbid(self, imdbid): + """ + 根据IMDBID查询TMDB信息 + """ + if not self.find: + return None + try: + result = self.find.find_by_imdbid(imdbid) or {} + tmdbinfo = result.get('movie_results') or result.get("tv_results") + if tmdbinfo: + tmdbinfo = tmdbinfo[0] + return tmdbinfo.get("id") + except Exception as err: + print(str(err)) + return None + + @staticmethod + def get_detail_url(mtype, tmdbid): + """ + 获取TMDB/豆瓣详情页地址 + """ + if not tmdbid: + return "" + if str(tmdbid).startswith("DB:"): + return "https://movie.douban.com/subject/%s" % str(tmdbid).replace("DB:", "") + elif mtype == MediaType.MOVIE: + return "https://www.themoviedb.org/movie/%s" % tmdbid + else: + return "https://www.themoviedb.org/tv/%s" % tmdbid + + def get_episode_images(self, tv_id, season_id, episode_id, orginal=False): + """ + 获取剧集中某一集封面 + """ + if not self.episode: + return "" + res = self.episode.images(tv_id, season_id, episode_id) + if res: + if orginal: + return TMDB_IMAGE_ORIGINAL_URL % res[0].get("file_path") + else: + return TMDB_IMAGE_W500_URL % res[0].get("file_path") + else: + return "" + + def get_tmdb_factinfo(self, media_info): + """ + 获取TMDB发布信息 + """ + result = [] + if media_info.vote_average: + result.append({"评分": media_info.vote_average}) + if media_info.original_title: + result.append({"原始标题": media_info.original_title}) + status = media_info.tmdb_info.get("status") + if status: + result.append({"状态": status}) + if media_info.release_date: + result.append({"上映日期": media_info.release_date}) + revenue = media_info.tmdb_info.get("revenue") + if revenue: + result.append({"收入": StringUtils.str_amount(revenue)}) + budget = media_info.tmdb_info.get("budget") + if media_info.vote_average: + result.append({"成本": StringUtils.str_amount(budget)}) + if budget: + result.append({"原始语言": media_info.original_language}) + production_country = self.get_get_production_country_names(tmdbinfo=media_info.tmdb_info) + if production_country: + result.append({"出品国家": production_country}), + production_company = self.get_tmdb_production_company_names(tmdbinfo=media_info.tmdb_info) + if production_company: + result.append({"制作公司": production_company}) + + return result diff --git a/app/media/meta/__init__.py b/app/media/meta/__init__.py new file mode 100644 index 0000000..a317292 --- /dev/null +++ b/app/media/meta/__init__.py @@ -0,0 +1,5 @@ +from .metainfo import MetaInfo +from .metaanime import MetaAnime +from ._base import MetaBase +from .metavideo import MetaVideo +from .release_groups import ReleaseGroupsMatcher diff --git a/app/media/meta/_base.py b/app/media/meta/_base.py new file mode 100644 index 0000000..156ebf8 --- /dev/null +++ b/app/media/meta/_base.py @@ -0,0 +1,710 @@ +import re +import cn2an +from app.media.fanart import Fanart +from config import ANIME_GENREIDS, DEFAULT_TMDB_IMAGE, TMDB_IMAGE_W500_URL +from app.media.category import Category +from app.utils import StringUtils, ExceptionUtils +from app.utils.types import MediaType + + +class MetaBase(object): + """ + 媒体信息基类 + """ + proxies = None + category_handler = None + # 是否处理的文件 + fileflag = False + # 原字符串 + org_string = None + # 副标题 + subtitle = None + # 类型 电影、电视剧 + type = None + # 识别的中文名 + cn_name = None + # 识别的英文名 + en_name = None + # 总季数 + total_seasons = 0 + # 识别的开始季 数字 + begin_season = None + # 识别的结束季 数字 + end_season = None + # 总集数 + total_episodes = 0 + # 识别的开始集 + begin_episode = None + # 识别的结束集 + end_episode = None + # Partx Cd Dvd Disk Disc + part = None + # 识别的资源类型 + resource_type = None + # 识别的效果 + resource_effect = None + # 识别的分辨率 + resource_pix = None + # 识别的制作组/字幕组 + resource_team = None + # 视频编码 + video_encode = None + # 音频编码 + audio_encode = None + # 二级分类 + category = None + # TMDB ID + tmdb_id = 0 + # IMDB ID + imdb_id = "" + # TVDB ID + tvdb_id = 0 + # 豆瓣 ID + douban_id = 0 + # 自定义搜索词 + keyword = None + # 媒体标题 + title = None + # 媒体原语种 + original_language = None + # 媒体原发行标题 + original_title = None + # 媒体发行日期 + release_date = None + # 播放时长 + runtime = 0 + # 媒体年份 + year = None + # 封面图片 + backdrop_path = None + poster_path = None + fanart_backdrop = None + fanart_poster = None + # 评分 + vote_average = 0 + # 描述 + overview = None + # TMDB 的其它信息 + tmdb_info = {} + # 本地状态 1-已订阅 2-已存在 + fav = "0" + # 站点列表 + rss_sites = [] + search_sites = [] + # 种子附加信息 + # 站点名称 + site = None + # 站点优先级 + site_order = 0 + # 操作用户 + user_name = None + # 种子链接 + enclosure = None + # 资源优先级 + res_order = 0 + # 使用的过滤规则 + filter_rule = None + # 是否洗版 + over_edition = None + # 种子大小 + size = 0 + # 做种者 + seeders = 0 + # 下载者 + peers = 0 + # 种子描述 + description = None + # 详情页面 + page_url = None + # 上传因子 + upload_volume_factor = None + # 下载因子 + download_volume_factor = None + # HR + hit_and_run = None + # 订阅ID + rssid = None + # 保存目录 + save_path = None + # 下载设置 + download_setting = None + # 识别辅助 + ignored_words = None + replaced_words = None + offset_words = None + # 备注字典 + note = {} + # 副标题解析 + _subtitle_flag = False + _subtitle_season_re = r"[第\s]+([0-9一二三四五六七八九十S\-]+)\s*季" + _subtitle_season_all_re = r"全\s*([0-9一二三四五六七八九十]+)\s*季|([0-9一二三四五六七八九十]+)\s*季全" + _subtitle_episode_re = r"[第\s]+([0-9一二三四五六七八九十EP\-]+)\s*[集话話期]" + _subtitle_episode_all_re = r"([0-9一二三四五六七八九十]+)\s*集全|全\s*([0-9一二三四五六七八九十]+)\s*[集话話期]" + + def __init__(self, title, subtitle=None, fileflag=False): + self.category_handler = Category() + self.fanart = Fanart() + if not title: + return + self.org_string = title + self.subtitle = subtitle + self.fileflag = fileflag + + def get_name(self): + if self.cn_name and StringUtils.is_all_chinese(self.cn_name): + return self.cn_name + elif self.en_name: + return self.en_name + elif self.cn_name: + return self.cn_name + return "" + + def get_title_string(self): + if self.title: + return "%s (%s)" % (self.title, self.year) if self.year else self.title + elif self.get_name(): + return "%s (%s)" % (self.get_name(), self.year) if self.year else self.get_name() + else: + return "" + + def get_star_string(self): + if self.vote_average: + return "评分:%s" % self.get_stars() + else: + return "" + + def get_vote_string(self): + if self.vote_average: + return "评分:%s" % round(float(self.vote_average), 1) + else: + return "" + + def get_type_string(self): + if not self.type: + return "" + return "类型:%s" % self.type.value + + def get_title_vote_string(self): + if not self.vote_average: + return self.get_title_string() + else: + return "%s\n%s" % (self.get_title_string(), self.get_star_string()) + + def get_title_ep_string(self): + string = self.get_title_string() + if self.get_episode_list(): + string = "%s %s" % (string, self.get_season_episode_string()) + else: + if self.get_season_list(): + string = "%s %s" % (string, self.get_season_string()) + return string + + def get_overview_string(self, max_len=140): + """ + 返回带限定长度的简介信息 + :param max_len: 内容长度 + :return: + """ + if not hasattr(self, "overview"): + return "" + + overview = str(self.overview).strip() + placeholder = ' ...' + max_len = max(len(placeholder), max_len - len(placeholder)) + overview = (overview[:max_len] + placeholder) if len(overview) > max_len else overview + return overview + + # 返回季字符串 + def get_season_string(self): + if self.begin_season is not None: + return "S%s" % str(self.begin_season).rjust(2, "0") \ + if self.end_season is None \ + else "S%s-S%s" % \ + (str(self.begin_season).rjust(2, "0"), + str(self.end_season).rjust(2, "0")) + else: + if self.type == MediaType.MOVIE: + return "" + else: + return "S01" + + # 返回begin_season 的Sxx + def get_season_item(self): + if self.begin_season is not None: + return "S%s" % str(self.begin_season).rjust(2, "0") + else: + if self.type == MediaType.MOVIE: + return "" + else: + return "S01" + + # 返回begin_season 的数字 + def get_season_seq(self): + if self.begin_season is not None: + return str(self.begin_season) + else: + if self.type == MediaType.MOVIE: + return "" + else: + return "1" + + # 返回季的数组 + def get_season_list(self): + if self.begin_season is None: + if self.type == MediaType.MOVIE: + return [] + else: + return [1] + elif self.end_season is not None: + return [season for season in range(self.begin_season, self.end_season + 1)] + else: + return [self.begin_season] + + # 返回集字符串 + def get_episode_string(self): + if self.begin_episode is not None: + return "E%s" % str(self.begin_episode).rjust(2, "0") \ + if self.end_episode is None \ + else "E%s-E%s" % \ + ( + str(self.begin_episode).rjust(2, "0"), + str(self.end_episode).rjust(2, "0")) + else: + return "" + + # 返回集的数组 + def get_episode_list(self): + if self.begin_episode is None: + return [] + elif self.end_episode is not None: + return [episode for episode in range(self.begin_episode, self.end_episode + 1)] + else: + return [self.begin_episode] + + # 返回集的并列表达方式,用于支持单文件多集 + def get_episode_items(self): + return "E%s" % "E".join(str(episode).rjust(2, '0') for episode in self.get_episode_list()) + + # 返回单文件多集的集数表达方式,用于支持单文件多集 + def get_episode_seqs(self): + episodes = self.get_episode_list() + if episodes: + # 集 xx + if len(episodes) == 1: + return str(episodes[0]) + else: + return "%s-%s" % (episodes[0], episodes[-1]) + else: + return "" + + # 返回begin_episode 的数字 + def get_episode_seq(self): + episodes = self.get_episode_list() + if episodes: + return str(episodes[0]) + else: + return "" + + # 返回季集字符串 + def get_season_episode_string(self): + if self.type == MediaType.MOVIE: + return "" + else: + seaion = self.get_season_string() + episode = self.get_episode_string() + if seaion and episode: + return "%s %s" % (seaion, episode) + elif seaion: + return "%s" % seaion + elif episode: + return "%s" % episode + return "" + + # 返回资源类型字符串,含分辨率 + def get_resource_type_string(self): + ret_string = "" + if self.resource_type: + ret_string = f"{ret_string} {self.resource_type}" + if self.resource_effect: + ret_string = f"{ret_string} {self.resource_effect}" + if self.resource_pix: + ret_string = f"{ret_string} {self.resource_pix}" + return ret_string + + # 返回资源类型字符串,不含分辨率 + def get_edtion_string(self): + ret_string = "" + if self.resource_type: + ret_string = f"{ret_string} {self.resource_type}" + if self.resource_effect: + ret_string = f"{ret_string} {self.resource_effect}" + return ret_string.strip() + + # 返回发布组/字幕组字符串 + def get_resource_team_string(self): + if self.resource_team: + return self.resource_team + else: + return "" + + # 返回视频编码 + def get_video_encode_string(self): + return self.video_encode or "" + + # 返回音频编码 + def get_audio_encode_string(self): + return self.audio_encode or "" + + # 返回背景图片地址 + def get_backdrop_image(self, default=True, original=False): + if self.fanart_backdrop: + return self.fanart_backdrop + else: + self.fanart_backdrop = self.fanart.get_backdrop(media_type=self.type, + queryid=self.tmdb_id if self.type == MediaType.MOVIE else self.tvdb_id) + if self.fanart_backdrop: + return self.fanart_backdrop + elif self.backdrop_path: + if original: + return self.backdrop_path.replace("/w500", "/original") + else: + return self.backdrop_path + else: + return "../static/img/tmdb.webp" if default else "" + + # 返回消息图片地址 + def get_message_image(self): + if self.fanart_backdrop: + return self.fanart_backdrop + else: + self.fanart_backdrop = self.fanart.get_backdrop(media_type=self.type, + queryid=self.tmdb_id if self.type == MediaType.MOVIE else self.tvdb_id) + if self.fanart_backdrop: + return self.fanart_backdrop + elif self.backdrop_path: + return self.backdrop_path + elif self.poster_path: + return self.poster_path + else: + return DEFAULT_TMDB_IMAGE + + # 返回海报图片地址 + def get_poster_image(self, original=False): + if self.poster_path: + if original: + return self.poster_path.replace("/w500", "/original") + else: + return self.poster_path + if not self.fanart_poster: + self.fanart_poster = self.fanart.get_poster(media_type=self.type, + queryid=self.tmdb_id if self.type == MediaType.MOVIE else self.tvdb_id) + return self.fanart_poster or "" + + # 查询TMDB详情页URL + def get_detail_url(self): + if self.tmdb_id: + if str(self.tmdb_id).startswith("DB:"): + return "https://movie.douban.com/subject/%s" % str(self.tmdb_id).replace("DB:", "") + elif self.type == MediaType.MOVIE: + return "https://www.themoviedb.org/movie/%s" % self.tmdb_id + else: + return "https://www.themoviedb.org/tv/%s" % self.tmdb_id + elif self.douban_id: + return "https://movie.douban.com/subject/%s" % self.douban_id + return "" + + def get_douban_detail_url(self): + if self.douban_id: + return "https://movie.douban.com/subject/%s" % self.douban_id + return "" + + # 返回评分星星个数 + def get_stars(self): + if not self.vote_average: + return "" + return "".rjust(int(self.vote_average), "★") + + # 返回促销信息 + def get_volume_factor_string(self): + return self.get_free_string(self.upload_volume_factor, self.download_volume_factor) + + @staticmethod + def get_free_string(upload_volume_factor, download_volume_factor): + if upload_volume_factor is None or download_volume_factor is None: + return "未知" + free_strs = { + "1.0 1.0": "普通", + "1.0 0.0": "免费", + "2.0 1.0": "2X", + "2.0 0.0": "2X免费", + "1.0 0.5": "50%", + "2.0 0.5": "2X 50%", + "1.0 0.7": "70%", + "1.0 0.3": "30%" + } + return free_strs.get('%.1f %.1f' % (upload_volume_factor, download_volume_factor), "未知") + + # 是否包含季 + def is_in_season(self, season): + if isinstance(season, list): + if self.end_season is not None: + meta_season = list(range(self.begin_season, self.end_season + 1)) + else: + if self.begin_season is not None: + meta_season = [self.begin_season] + else: + meta_season = [1] + + return set(meta_season).issuperset(set(season)) + else: + if self.end_season is not None: + return self.begin_season <= int(season) <= self.end_season + else: + if self.begin_season is not None: + return int(season) == self.begin_season + else: + return int(season) == 1 + + # 是否包含集 + def is_in_episode(self, episode): + if isinstance(episode, list): + if self.end_episode is not None: + meta_episode = list(range(self.begin_episode, self.end_episode + 1)) + else: + meta_episode = [self.begin_episode] + return set(meta_episode).issuperset(set(episode)) + else: + if self.end_episode is not None: + return self.begin_episode <= int(episode) <= self.end_episode + else: + return int(episode) == self.begin_episode + + # 整合TMDB识别的信息 + def set_tmdb_info(self, info): + if not info: + return + self.type = self.__get_tmdb_type(info) + if not self.type: + return + self.tmdb_id = info.get('id') + if not self.tmdb_id: + return + if info.get("external_ids"): + self.tvdb_id = info.get("external_ids", {}).get("tvdb_id", 0) + self.imdb_id = info.get("external_ids", {}).get("imdb_id", "") + self.tmdb_info = info + self.vote_average = round(float(info.get('vote_average')), 1) if info.get('vote_average') else 0 + self.overview = info.get('overview') + if self.type == MediaType.MOVIE: + self.title = info.get('title') + self.original_title = info.get('original_title') + self.original_language = info.get('original_language') + self.runtime = info.get("runtime") + self.release_date = info.get('release_date') + if self.release_date: + self.year = self.release_date[0:4] + self.category = self.category_handler.get_movie_category(info) + else: + self.title = info.get('name') + self.original_title = info.get('original_name') + self.original_language = info.get('original_language') + self.runtime = info.get("episode_run_time")[0] if info.get("episode_run_time") else None + self.release_date = info.get('first_air_date') + if self.release_date: + self.year = self.release_date[0:4] + if self.type == MediaType.TV: + self.category = self.category_handler.get_tv_category(info) + else: + self.category = self.category_handler.get_anime_category(info) + self.poster_path = TMDB_IMAGE_W500_URL % info.get('poster_path') if info.get( + 'poster_path') else "" + self.backdrop_path = TMDB_IMAGE_W500_URL % info.get('backdrop_path') if info.get( + 'backdrop_path') else "" + + # 整合种了信息 + def set_torrent_info(self, + site=None, + site_order=0, + enclosure=None, + res_order=0, + filter_rule=None, + size=0, + seeders=0, + peers=0, + description=None, + page_url=None, + upload_volume_factor=None, + download_volume_factor=None, + rssid=None, + hit_and_run=None, + imdbid=None, + over_edition=None): + if site: + self.site = site + if site_order: + self.site_order = site_order + if enclosure: + self.enclosure = enclosure + if res_order: + self.res_order = res_order + if filter_rule: + self.filter_rule = filter_rule + if size: + self.size = size + if seeders: + self.seeders = seeders + if peers: + self.peers = peers + if description: + self.description = description + if page_url: + self.page_url = page_url + if upload_volume_factor is not None: + self.upload_volume_factor = upload_volume_factor + if download_volume_factor is not None: + self.download_volume_factor = download_volume_factor + if rssid: + self.rssid = rssid + if hit_and_run is not None: + self.hit_and_run = hit_and_run + if imdbid is not None: + self.imdb_id = imdbid + if over_edition is not None: + self.over_edition = over_edition + + # 整合下载参数 + def set_download_info(self, download_setting=None, save_path=None): + if download_setting: + self.download_setting = download_setting + if save_path: + self.save_path = save_path + + # 判断电视剧是否为动漫 + def __get_tmdb_type(self, info): + if not info: + return self.type + if not info.get('media_type'): + return self.type + if info.get('media_type') == MediaType.TV: + genre_ids = info.get("genre_ids") + if not genre_ids: + return MediaType.TV + if isinstance(genre_ids, list): + genre_ids = [str(val).upper() for val in genre_ids] + else: + genre_ids = [str(genre_ids).upper()] + if set(genre_ids).intersection(set(ANIME_GENREIDS)): + return MediaType.ANIME + else: + return MediaType.TV + else: + return info.get('media_type') + + def init_subtitle(self, title_text): + if not title_text: + return + if re.search(r'[全第季集话話期]', title_text, re.IGNORECASE): + # 第x季 + season_str = re.search(r'%s' % self._subtitle_season_re, title_text, re.IGNORECASE) + if season_str: + seasons = season_str.group(1) + if seasons: + seasons = seasons.upper().replace("S", "").strip() + else: + return + try: + end_season = None + if seasons.find('-') != -1: + seasons = seasons.split('-') + begin_season = int(cn2an.cn2an(seasons[0].strip(), mode='smart')) + if len(seasons) > 1: + end_season = int(cn2an.cn2an(seasons[1].strip(), mode='smart')) + else: + begin_season = int(cn2an.cn2an(seasons, mode='smart')) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return + if self.begin_season is None and isinstance(begin_season, int): + self.begin_season = begin_season + self.total_seasons = 1 + if self.begin_season is not None \ + and self.end_season is None \ + and isinstance(end_season, int) \ + and end_season != self.begin_season: + self.end_season = end_season + self.total_seasons = (self.end_season - self.begin_season) + 1 + self.type = MediaType.TV + self._subtitle_flag = True + # 第x集 + episode_str = re.search(r'%s' % self._subtitle_episode_re, title_text, re.IGNORECASE) + if episode_str: + episodes = episode_str.group(1) + if episodes: + episodes = episodes.upper().replace("E", "").replace("P", "").strip() + else: + return + try: + end_episode = None + if episodes.find('-') != -1: + episodes = episodes.split('-') + begin_episode = int(cn2an.cn2an(episodes[0].strip(), mode='smart')) + if len(episodes) > 1: + end_episode = int(cn2an.cn2an(episodes[1].strip(), mode='smart')) + else: + begin_episode = int(cn2an.cn2an(episodes, mode='smart')) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return + if self.begin_episode is None and isinstance(begin_episode, int): + self.begin_episode = begin_episode + self.total_episodes = 1 + if self.begin_episode is not None \ + and self.end_episode is None \ + and isinstance(end_episode, int) \ + and end_episode != self.begin_episode: + self.end_episode = end_episode + self.total_episodes = (self.end_episode - self.begin_episode) + 1 + self.type = MediaType.TV + self._subtitle_flag = True + # x集全 + episode_all_str = re.search(r'%s' % self._subtitle_episode_all_re, title_text, re.IGNORECASE) + if episode_all_str: + self.begin_episode = None + self.end_episode = None + self.total_episodes = 0 + self.type = MediaType.TV + # 全x季 x季全 + season_all_str = re.search(r"%s" % self._subtitle_season_all_re, title_text, re.IGNORECASE) + if season_all_str: + season_all = season_all_str.group(1) + if not season_all: + season_all = season_all_str.group(2) + if season_all and self.begin_season is None and self.begin_episode is None: + try: + self.total_seasons = int(cn2an.cn2an(season_all.strip(), mode='smart')) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return + self.begin_season = 1 + self.end_season = self.total_seasons + self.type = MediaType.TV + self._subtitle_flag = True + + def to_dict(self): + """ + 转化为字典 + """ + return { + "id": self.tmdb_id, + 'orgid': self.tmdb_id, + "title": self.title, + "year": self.year, + "type": self.type.value if self.type else "", + "media_type": self.type.value if self.type else "", + 'vote': self.vote_average, + 'image': self.poster_path, + "imdb_id": self.imdb_id, + "tmdb_id": self.tmdb_id, + "overview": str(self.overview).strip() if self.overview else '', + "link": self.get_detail_url() + } diff --git a/app/media/meta/metaanime.py b/app/media/meta/metaanime.py new file mode 100644 index 0000000..a535971 --- /dev/null +++ b/app/media/meta/metaanime.py @@ -0,0 +1,220 @@ +import re + +import zhconv + +import anitopy +from app.media.meta._base import MetaBase +from app.media.meta.release_groups import ReleaseGroupsMatcher +from app.utils import StringUtils, ExceptionUtils +from app.utils.types import MediaType + + +class MetaAnime(MetaBase): + """ + 识别动漫 + """ + _anime_no_words = ['CHS&CHT', 'MP4', 'GB MP4', 'WEB-DL'] + _name_nostring_re = r"S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}" + + def __init__(self, title, subtitle=None, fileflag=False): + super().__init__(title, subtitle, fileflag) + if not title: + return + # 调用第三方模块识别动漫 + try: + original_title = title + # 字幕组信息会被预处理掉 + anitopy_info_origin = anitopy.parse(title) + title = self.__prepare_title(title) + anitopy_info = anitopy.parse(title) + if anitopy_info: + # 名称 + name = anitopy_info.get("anime_title") + if name and name.find("/") != -1: + name = name.split("/")[-1].strip() + if not name or name in self._anime_no_words or (len(name) < 5 and not StringUtils.is_chinese(name)): + anitopy_info = anitopy.parse("[ANIME]" + title) + if anitopy_info: + name = anitopy_info.get("anime_title") + if not name or name in self._anime_no_words or (len(name) < 5 and not StringUtils.is_chinese(name)): + name_match = re.search(r'\[(.+?)]', title) + if name_match and name_match.group(1): + name = name_match.group(1).strip() + # 拆份中英文名称 + if name: + lastword_type = "" + for word in name.split(): + if not word: + continue + if word.endswith(']'): + word = word[:-1] + if word.isdigit(): + if lastword_type == "cn": + self.cn_name = "%s %s" % (self.cn_name or "", word) + elif lastword_type == "en": + self.en_name = "%s %s" % (self.en_name or "", word) + elif StringUtils.is_chinese(word): + self.cn_name = "%s %s" % (self.cn_name or "", word) + lastword_type = "cn" + else: + self.en_name = "%s %s" % (self.en_name or "", word) + lastword_type = "en" + if self.cn_name: + _, self.cn_name, _, _, _, _ = StringUtils.get_keyword_from_string(self.cn_name) + if self.cn_name: + self.cn_name = re.sub(r'%s' % self._name_nostring_re, '', self.cn_name, flags=re.IGNORECASE).strip() + self.cn_name = zhconv.convert(self.cn_name, "zh-hans") + if self.en_name: + self.en_name = re.sub(r'%s' % self._name_nostring_re, '', self.en_name, flags=re.IGNORECASE).strip().title() + self._name = StringUtils.str_title(self.en_name) + # 年份 + year = anitopy_info.get("anime_year") + if str(year).isdigit(): + self.year = str(year) + # 季号 + anime_season = anitopy_info.get("anime_season") + if isinstance(anime_season, list): + if len(anime_season) == 1: + begin_season = anime_season[0] + end_season = None + else: + begin_season = anime_season[0] + end_season = anime_season[-1] + elif anime_season: + begin_season = anime_season + end_season = None + else: + begin_season = None + end_season = None + if begin_season: + self.begin_season = int(begin_season) + if end_season and int(end_season) != self.begin_season: + self.end_season = int(end_season) + self.total_seasons = (self.end_season - self.begin_season) + 1 + else: + self.total_seasons = 1 + self.type = MediaType.TV + # 集号 + episode_number = anitopy_info.get("episode_number") + if isinstance(episode_number, list): + if len(episode_number) == 1: + begin_episode = episode_number[0] + end_episode = None + else: + begin_episode = episode_number[0] + end_episode = episode_number[-1] + elif episode_number: + begin_episode = episode_number + end_episode = None + else: + begin_episode = None + end_episode = None + if begin_episode: + try: + self.begin_episode = int(begin_episode) + if end_episode and int(end_episode) != self.begin_episode: + self.end_episode = int(end_episode) + self.total_episodes = (self.end_episode - self.begin_episode) + 1 + else: + self.total_episodes = 1 + except Exception as err: + ExceptionUtils.exception_traceback(err) + self.begin_episode = None + self.end_episode = None + self.type = MediaType.TV + # 类型 + if not self.type: + anime_type = anitopy_info.get('anime_type') + if isinstance(anime_type, list): + anime_type = anime_type[0] + if anime_type and anime_type.upper() == "TV": + self.type = MediaType.TV + else: + self.type = MediaType.MOVIE + # 分辨率 + self.resource_pix = anitopy_info.get("video_resolution") + if isinstance(self.resource_pix, list): + self.resource_pix = self.resource_pix[0] + if self.resource_pix: + if re.search(r'x', self.resource_pix, re.IGNORECASE): + self.resource_pix = re.split(r'[Xx]', self.resource_pix)[-1] + "p" + else: + self.resource_pix = self.resource_pix.lower() + if str(self.resource_pix).isdigit(): + self.resource_pix = str(self.resource_pix) + "p" + # 制作组/字幕组 + self.resource_team = \ + anitopy_info_origin.get("release_group") or \ + ReleaseGroupsMatcher().match(title=original_title) or None + # 视频编码 + self.video_encode = anitopy_info.get("video_term") + if isinstance(self.video_encode, list): + self.video_encode = self.video_encode[0] + # 音频编码 + self.audio_encode = anitopy_info.get("audio_term") + if isinstance(self.audio_encode, list): + self.audio_encode = self.audio_encode[0] + # 解析副标题,只要季和集 + self.init_subtitle(self.org_string) + if not self._subtitle_flag and self.subtitle: + self.init_subtitle(self.subtitle) + if not self.type: + self.type = MediaType.TV + except Exception as e: + ExceptionUtils.exception_traceback(e) + + @staticmethod + def __prepare_title(title): + """ + 对命名进行预处理 + """ + if not title: + return title + # 所有【】换成[] + title = title.replace("【", "[").replace("】", "]").strip() + # 截掉xx番剧漫 + match = re.search(r"新番|月?番|[日美国][漫剧]", title) + if match and match.span()[1] < len(title) - 1: + title = re.sub(".*番.|.*[日美国][漫剧].", "", title) + elif match: + title = title[:title.rfind('[')] + # 截掉分类 + first_item = title.split(']')[0] + if first_item and re.search(r"[动漫画纪录片电影视连续剧集日美韩中港台海外亚洲华语大陆综艺原盘高清]{2,}|TV|Animation|Movie|Documentar|Anime", + zhconv.convert(first_item, "zh-hans"), + re.IGNORECASE): + title = re.sub(r"^[^]]*]", "", title).strip() + # 去掉大小 + title = re.sub(r'[0-9.]+\s*[MGT]i?B(?![A-Z]+)', "", title, flags=re.IGNORECASE) + # 将TVxx改为xx + title = re.sub(r"\[TV\s+(\d{1,4})", r"[\1", title, flags=re.IGNORECASE) + # 将4K转为2160p + title = re.sub(r'\[4k]', '2160p', title, flags=re.IGNORECASE) + # 处理/分隔的中英文标题 + names = title.split("]") + if len(names) > 1 and title.find("- ") == -1: + titles = [] + for name in names: + if not name: + continue + left_char = '' + if name.startswith('['): + left_char = '[' + name = name[1:] + if name and name.find("/") != -1: + if name.split("/")[-1].strip(): + titles.append("%s%s" % (left_char, name.split("/")[-1].strip())) + else: + titles.append("%s%s" % (left_char, name.split("/")[0].strip())) + elif name: + if StringUtils.is_chinese(name) and not StringUtils.is_all_chinese(name): + if not re.search(r"\[\d+", name, re.IGNORECASE): + name = re.sub(r'[\d|#::\-()()\u4e00-\u9fff]', '', name).strip() + if not name or name.strip().isdigit(): + continue + if name == '[': + titles.append("") + else: + titles.append("%s%s" % (left_char, name.strip())) + return "]".join(titles) + return title diff --git a/app/media/meta/metainfo.py b/app/media/meta/metainfo.py new file mode 100644 index 0000000..ad98482 --- /dev/null +++ b/app/media/meta/metainfo.py @@ -0,0 +1,65 @@ +import os.path +import regex as re + +import log +from app.helper import WordsHelper +from app.media.meta.metaanime import MetaAnime +from app.media.meta.metavideo import MetaVideo +from app.utils.types import MediaType +from config import RMT_MEDIAEXT + + +def MetaInfo(title, subtitle=None, mtype=None): + """ + 媒体整理入口,根据名称和副标题,判断是哪种类型的识别,返回对应对象 + :param title: 标题、种子名、文件名 + :param subtitle: 副标题、描述 + :param mtype: 指定识别类型,为空则自动识别类型 + :return: MetaAnime、MetaVideo + """ + + # 应用自定义识别词 + title, msg, used_info = WordsHelper().process(title) + if subtitle: + subtitle, _, _ = WordsHelper().process(subtitle) + + if msg: + for msg_item in msg: + log.warn("【Meta】%s" % msg_item) + + # 判断是否处理文件 + if title and os.path.splitext(title)[-1] in RMT_MEDIAEXT: + fileflag = True + else: + fileflag = False + + if mtype == MediaType.ANIME or is_anime(title): + meta_info = MetaAnime(title, subtitle, fileflag) + else: + meta_info = MetaVideo(title, subtitle, fileflag) + + meta_info.ignored_words = used_info.get("ignored") + meta_info.replaced_words = used_info.get("replaced") + meta_info.offset_words = used_info.get("offset") + + return meta_info + + +def is_anime(name): + """ + 判断是否为动漫 + :param name: 名称 + :return: 是否动漫 + """ + if not name: + return False + if re.search(r'【[+0-9XVPI-]+】\s*【', name, re.IGNORECASE): + return True + if re.search(r'\s+-\s+[\dv]{1,4}\s+', name, re.IGNORECASE): + return True + if re.search(r"S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}", name, + re.IGNORECASE): + return False + if re.search(r'\[[+0-9XVPI-]+]\s*\[', name, re.IGNORECASE): + return True + return False diff --git a/app/media/meta/metavideo.py b/app/media/meta/metavideo.py new file mode 100644 index 0000000..af33eec --- /dev/null +++ b/app/media/meta/metavideo.py @@ -0,0 +1,547 @@ +import os +import re + +from config import RMT_MEDIAEXT +from app.media.meta._base import MetaBase +from app.utils import StringUtils +from app.utils.tokens import Tokens +from app.utils.types import MediaType +from app.media.meta.release_groups import ReleaseGroupsMatcher + + +class MetaVideo(MetaBase): + """ + 识别电影、电视剧 + """ + # 控制标位区 + _stop_name_flag = False + _stop_cnname_flag = False + _last_token = "" + _last_token_type = "" + _continue_flag = True + _unknown_name_str = "" + _source = "" + _effect = [] + # 正则式区 + _season_re = r"S(\d{2})|^S(\d{1,2})$|S(\d{1,2})E" + _episode_re = r"EP?(\d{2,4})|^EP?(\d{1,4})$|S\d{1,2}EP?(\d{1,4})$" + _part_re = r"(^PART[0-9ABI]{0,2}$|^CD[0-9]{0,2}$|^DVD[0-9]{0,2}$|^DISK[0-9]{0,2}$|^DISC[0-9]{0,2}$)" + _roman_numerals = r"^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$" + _source_re = r"^BLURAY$|^HDTV$|^UHDTV$|^HDDVD$|^WEBRIP$|^DVDRIP$|^BDRIP$|^BLU$|^WEB$|^BD$|^HDRip$" + _effect_re = r"^REMUX$|^UHD$|^SDR$|^HDR\d*$|^DOLBY$|^DOVI$|^DV$|^3D$|^REPACK$" + _resources_type_re = r"%s|%s" % (_source_re, _effect_re) + _name_no_begin_re = r"^\[.+?]" + _name_no_chinese_re = r".*版|.*字幕" + _name_se_words = ['共', '第', '季', '集', '话', '話', '期'] + _name_nostring_re = r"^PTS|^JADE|^AOD|^CHC|^[A-Z]{1,4}TV[\-0-9UVHDK]*" \ + r"|HBO$|\s+HBO|\d{1,2}th|\d{1,2}bit|NETFLIX|AMAZON|IMAX|^3D|\s+3D|^BBC\s+|\s+BBC|BBC$|DISNEY\+?|XXX|\s+DC$" \ + r"|[第\s共]+[0-9一二三四五六七八九十\-\s]+季" \ + r"|[第\s共]+[0-9一二三四五六七八九十\-\s]+[集话話]" \ + r"|连载|日剧|美剧|电视剧|动画片|动漫|欧美|西德|日韩|超高清|高清|蓝光|翡翠台|梦幻天堂·龙网|★?\d*月?新番" \ + r"|最终季|合集|[多中国英葡法俄日韩德意西印泰台港粤双文语简繁体特效内封官译外挂]+字幕|版本|出品|台版|港版|\w+字幕组" \ + r"|未删减版|UNCUT$|UNRATE$|WITH EXTRAS$|RERIP$|SUBBED$|PROPER$|REPACK$|SEASON$|EPISODE$|Complete$|Extended$|Extended Version$" \ + r"|S\d{2}\s*-\s*S\d{2}|S\d{2}|\s+S\d{1,2}|EP?\d{2,4}\s*-\s*EP?\d{2,4}|EP?\d{2,4}|\s+EP?\d{1,4}" \ + r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]" \ + r"|[248]K|\d{3,4}[PIX]+" \ + r"|CD[\s.]*[1-9]|DVD[\s.]*[1-9]|DISK[\s.]*[1-9]|DISC[\s.]*[1-9]" + _resources_pix_re = r"^[SBUHD]*(\d{3,4}[PI]+)|\d{3,4}X(\d{3,4})" + _resources_pix_re2 = r"(^[248]+K)" + _video_encode_re = r"^[HX]26[45]$|^AVC$|^HEVC$|^VC\d?$|^MPEG\d?$|^Xvid$|^DivX$|^HDR\d*$" + _audio_encode_re = r"^DTS\d?$|^DTSHD$|^DTSHDMA$|^Atmos$|^TrueHD\d?$|^AC3$|^\dAudios?$|^DDP\d?$|^DD\d?$|^LPCM\d?$|^AAC\d?$|^FLAC\d?$|^HD\d?$|^MA\d?$" + + def __init__(self, title, subtitle=None, fileflag=False): + super().__init__(title, subtitle, fileflag) + if not title: + return + original_title = title + self._source = "" + self._effect = [] + # 判断是否纯数字命名 + if os.path.splitext(title)[-1] in RMT_MEDIAEXT \ + and os.path.splitext(title)[0].isdigit() \ + and len(os.path.splitext(title)[0]) < 5: + self.begin_episode = int(os.path.splitext(title)[0]) + self.type = MediaType.TV + return + # 去掉名称中第1个[]的内容 + title = re.sub(r'%s' % self._name_no_begin_re, "", title, count=1) + # 把xxxx-xxxx年份换成前一个年份,常出现在季集上 + title = re.sub(r'([\s.]+)(\d{4})-(\d{4})', r'\1\2', title) + # 把大小去掉 + title = re.sub(r'[0-9.]+\s*[MGT]i?B(?![A-Z]+)', "", title, flags=re.IGNORECASE) + # 把年月日去掉 + title = re.sub(r'\d{4}[\s._-]\d{1,2}[\s._-]\d{1,2}', "", title) + # 拆分tokens + tokens = Tokens(title) + self.tokens = tokens + # 解析名称、年份、季、集、资源类型、分辨率等 + token = tokens.get_next() + while token: + # Part + self.__init_part(token) + # 标题 + if self._continue_flag: + self.__init_name(token) + # 年份 + if self._continue_flag: + self.__init_year(token) + # 分辨率 + if self._continue_flag: + self.__init_resource_pix(token) + # 季 + if self._continue_flag: + self.__init_season(token) + # 集 + if self._continue_flag: + self.__init_episode(token) + # 资源类型 + if self._continue_flag: + self.__init_resource_type(token) + # 视频编码 + if self._continue_flag: + self.__init_video_encode(token) + # 音频编码 + if self._continue_flag: + self.__init_audio_encode(token) + # 取下一个,直到没有为卡 + token = tokens.get_next() + self._continue_flag = True + # 合成质量 + if self._effect: + self._effect.reverse() + self.resource_effect = " ".join(self._effect) + if self._source: + self.resource_type = self._source.strip() + # 提取原盘DIY + if self.resource_type and "BluRay" in self.resource_type: + if (self.subtitle and re.findall(r'D[Ii]Y', self.subtitle)) \ + or re.findall(r'-D[Ii]Y@', original_title): + self.resource_type = f"{self.resource_type} DIY" + # 解析副标题,只要季和集 + self.init_subtitle(self.org_string) + if not self._subtitle_flag and self.subtitle: + self.init_subtitle(self.subtitle) + # 没有识别出类型时默认为电影 + if not self.type: + self.type = MediaType.MOVIE + # 去掉名字中不需要的干扰字符,过短的纯数字不要 + self.cn_name = self.__fix_name(self.cn_name) + self.en_name = StringUtils.str_title(self.__fix_name(self.en_name)) + # 处理part + if self.part and self.part.upper() == "PART": + self.part = None + # 制作组/字幕组 + self.resource_team = ReleaseGroupsMatcher().match(title=original_title) or None + + def __fix_name(self, name): + if not name: + return name + name = re.sub(r'%s' % self._name_nostring_re, '', name, + flags=re.IGNORECASE).strip() + name = re.sub(r'\s+', ' ', name) + if name.isdigit() \ + and int(name) < 1800 \ + and not self.year \ + and not self.begin_season \ + and not self.resource_pix \ + and not self.resource_type \ + and not self.audio_encode \ + and not self.video_encode: + if self.begin_episode is None: + self.begin_episode = int(name) + name = None + elif self.is_in_episode(int(name)) and not self.begin_season: + name = None + return name + + def __init_name(self, token): + if not token: + return + # 回收标题 + if self._unknown_name_str: + if not self.cn_name: + if not self.en_name: + self.en_name = self._unknown_name_str + elif self._unknown_name_str != self.year: + self.en_name = "%s %s" % (self.en_name, self._unknown_name_str) + self._last_token_type = "enname" + self._unknown_name_str = "" + if self._stop_name_flag: + return + if token.upper() == "AKA": + self._continue_flag = False + self._stop_name_flag = True + return + if token in self._name_se_words: + self._last_token_type = 'name_se_words' + return + if StringUtils.is_chinese(token): + # 含有中文,直接做为标题(连着的数字或者英文会保留),且不再取用后面出现的中文 + self._last_token_type = "cnname" + if not self.cn_name: + self.cn_name = token + elif not self._stop_cnname_flag: + if not re.search("%s" % self._name_no_chinese_re, token, flags=re.IGNORECASE) \ + and not re.search("%s" % self._name_se_words, token, flags=re.IGNORECASE): + self.cn_name = "%s %s" % (self.cn_name, token) + self._stop_cnname_flag = True + else: + is_roman_digit = re.search(self._roman_numerals, token) + # 阿拉伯数字或者罗马数字 + if token.isdigit() or is_roman_digit: + # 第季集后面的不要 + if self._last_token_type == 'name_se_words': + return + if self.get_name(): + # 名字后面以 0 开头的不要,极有可能是集 + if token.startswith('0'): + return + # 检查是否真正的数字 + if token.isdigit(): + try: + int(token) + except ValueError: + return + # 中文名后面跟的数字不是年份的极有可能是集 + if not is_roman_digit \ + and self._last_token_type == "cnname" \ + and int(token) < 1900: + return + if (token.isdigit() and len(token) < 4) or is_roman_digit: + # 4位以下的数字或者罗马数字,拼装到已有标题中 + if self._last_token_type == "cnname": + self.cn_name = "%s %s" % (self.cn_name, token) + elif self._last_token_type == "enname": + self.en_name = "%s %s" % (self.en_name, token) + self._continue_flag = False + elif token.isdigit() and len(token) == 4: + # 4位数字,可能是年份,也可能真的是标题的一部分,也有可能是集 + if not self._unknown_name_str: + self._unknown_name_str = token + else: + # 名字未出现前的第一个数字,记下来 + if not self._unknown_name_str: + self._unknown_name_str = token + elif re.search(r"%s" % self._season_re, token, re.IGNORECASE) \ + or re.search(r"%s" % self._episode_re, token, re.IGNORECASE) \ + or re.search(r"(%s)" % self._resources_type_re, token, re.IGNORECASE) \ + or re.search(r"%s" % self._resources_pix_re, token, re.IGNORECASE): + # 季集等不要 + self._stop_name_flag = True + return + else: + # 后缀名不要 + if ".%s".lower() % token in RMT_MEDIAEXT: + return + # 英文或者英文+数字,拼装起来 + if self.en_name: + self.en_name = "%s %s" % (self.en_name, token) + else: + self.en_name = token + self._last_token_type = "enname" + + def __init_part(self, token): + if not self.get_name(): + return + if not self.year \ + and not self.begin_season \ + and not self.begin_episode \ + and not self.resource_pix \ + and not self.resource_type: + return + re_res = re.search(r"%s" % self._part_re, token, re.IGNORECASE) + if re_res: + if not self.part: + self.part = re_res.group(1) + nextv = self.tokens.cur() + if nextv \ + and ((nextv.isdigit() and (len(nextv) == 1 or len(nextv) == 2 and nextv.startswith('0'))) + or nextv.upper() in ['A', 'B', 'C', 'I', 'II', 'III']): + self.part = "%s%s" % (self.part, nextv) + self.tokens.get_next() + self._last_token_type = "part" + self._continue_flag = False + self._stop_name_flag = False + + def __init_year(self, token): + if not self.get_name(): + return + if not token.isdigit(): + return + if len(token) != 4: + return + if not 1900 < int(token) < 2050: + return + if self.year: + if self.en_name: + self.en_name = "%s %s" % (self.en_name, self.year) + elif self.cn_name: + self.cn_name = "%s %s" % (self.cn_name, self.year) + self.year = token + self._last_token_type = "year" + self._continue_flag = False + self._stop_name_flag = True + + def __init_resource_pix(self, token): + if not self.get_name(): + return + re_res = re.findall(r"%s" % self._resources_pix_re, token, re.IGNORECASE) + if re_res: + self._last_token_type = "pix" + self._continue_flag = False + self._stop_name_flag = True + resource_pix = None + for pixs in re_res: + if isinstance(pixs, tuple): + pix_t = None + for pix_i in pixs: + if pix_i: + pix_t = pix_i + break + if pix_t: + resource_pix = pix_t + else: + resource_pix = pixs + if resource_pix and not self.resource_pix: + self.resource_pix = resource_pix.lower() + break + if self.resource_pix \ + and self.resource_pix.isdigit() \ + and self.resource_pix[-1] not in 'kpi': + self.resource_pix = "%sp" % self.resource_pix + else: + re_res = re.search(r"%s" % self._resources_pix_re2, token, re.IGNORECASE) + if re_res: + self._last_token_type = "pix" + self._continue_flag = False + self._stop_name_flag = True + if not self.resource_pix: + self.resource_pix = re_res.group(1).lower() + + def __init_season(self, token): + re_res = re.findall(r"%s" % self._season_re, token, re.IGNORECASE) + if re_res: + self._last_token_type = "season" + self.type = MediaType.TV + self._stop_name_flag = True + self._continue_flag = True + for se in re_res: + if isinstance(se, tuple): + se_t = None + for se_i in se: + if se_i and str(se_i).isdigit(): + se_t = se_i + break + if se_t: + se = int(se_t) + else: + break + else: + se = int(se) + if self.begin_season is None: + self.begin_season = se + self.total_seasons = 1 + else: + if se > self.begin_season: + self.end_season = se + self.total_seasons = (self.end_season - self.begin_season) + 1 + if self.fileflag and self.total_seasons > 1: + self.end_season = None + self.total_seasons = 1 + elif token.isdigit(): + try: + int(token) + except ValueError: + return + if self._last_token_type == "SEASON" \ + and self.begin_season is None \ + and len(token) < 3: + self.begin_season = int(token) + self.total_seasons = 1 + self._last_token_type = "season" + self._stop_name_flag = True + self._continue_flag = False + self.type = MediaType.TV + elif token.upper() == "SEASON" and self.begin_season is None: + self._last_token_type = "SEASON" + + def __init_episode(self, token): + re_res = re.findall(r"%s" % self._episode_re, token, re.IGNORECASE) + if re_res: + self._last_token_type = "episode" + self._continue_flag = False + self._stop_name_flag = True + self.type = MediaType.TV + for se in re_res: + if isinstance(se, tuple): + se_t = None + for se_i in se: + if se_i and str(se_i).isdigit(): + se_t = se_i + break + if se_t: + se = int(se_t) + else: + break + else: + se = int(se) + if self.begin_episode is None: + self.begin_episode = se + self.total_episodes = 1 + else: + if se > self.begin_episode: + self.end_episode = se + self.total_episodes = (self.end_episode - self.begin_episode) + 1 + if self.fileflag and self.total_episodes > 2: + self.end_episode = None + self.total_episodes = 1 + elif token.isdigit(): + try: + int(token) + except ValueError: + return + if self.begin_episode is not None \ + and self.end_episode is None \ + and len(token) < 5 \ + and int(token) > self.begin_episode \ + and self._last_token_type == "episode": + self.end_episode = int(token) + self.total_episodes = (self.end_episode - self.begin_episode) + 1 + if self.fileflag and self.total_episodes > 2: + self.end_episode = None + self.total_episodes = 1 + self._continue_flag = False + self.type = MediaType.TV + elif self.begin_episode is None \ + and 1 < len(token) < 4 \ + and self._last_token_type != "year" \ + and self._last_token_type != "videoencode" \ + and token != self._unknown_name_str: + self.begin_episode = int(token) + self.total_episodes = 1 + self._last_token_type = "episode" + self._continue_flag = False + self._stop_name_flag = True + self.type = MediaType.TV + elif self._last_token_type == "EPISODE" \ + and self.begin_episode is None \ + and len(token) < 5: + self.begin_episode = int(token) + self.total_episodes = 1 + self._last_token_type = "episode" + self._continue_flag = False + self._stop_name_flag = True + self.type = MediaType.TV + elif token.upper() == "EPISODE": + self._last_token_type = "EPISODE" + + def __init_resource_type(self, token): + if not self.get_name(): + return + source_res = re.search(r"(%s)" % self._source_re, token, re.IGNORECASE) + if source_res: + self._last_token_type = "source" + self._continue_flag = False + self._stop_name_flag = True + if not self._source: + self._source = source_res.group(1) + self._last_token = self._source.upper() + return + elif token.upper() == "DL" \ + and self._last_token_type == "source" \ + and self._last_token == "WEB": + self._source = "WEB-DL" + self._continue_flag = False + return + elif token.upper() == "RAY" \ + and self._last_token_type == "source" \ + and self._last_token == "BLU": + self._source = "BluRay" + self._continue_flag = False + return + elif token.upper() == "WEBDL": + self._source = "WEB-DL" + self._continue_flag = False + return + effect_res = re.search(r"(%s)" % self._effect_re, token, re.IGNORECASE) + if effect_res: + self._last_token_type = "effect" + self._continue_flag = False + self._stop_name_flag = True + effect = effect_res.group(1) + if effect not in self._effect: + self._effect.append(effect) + self._last_token = effect.upper() + + def __init_video_encode(self, token): + if not self.get_name(): + return + if not self.year \ + and not self.resource_pix \ + and not self.resource_type \ + and not self.begin_season \ + and not self.begin_episode: + return + re_res = re.search(r"(%s)" % self._video_encode_re, token, re.IGNORECASE) + if re_res: + self._continue_flag = False + self._stop_name_flag = True + self._last_token_type = "videoencode" + if not self.video_encode: + self.video_encode = re_res.group(1).upper() + self._last_token = self.video_encode + elif self.video_encode == "10bit": + self.video_encode = f"{re_res.group(1).upper()} 10bit" + self._last_token = re_res.group(1).upper() + elif token.upper() in ['H', 'X']: + self._continue_flag = False + self._stop_name_flag = True + self._last_token_type = "videoencode" + self._last_token = token.upper() if token.upper() == "H" else token.lower() + elif token in ["264", "265"] \ + and self._last_token_type == "videoencode" \ + and self._last_token in ['H', 'X']: + self.video_encode = "%s%s" % (self._last_token, token) + elif token.isdigit() \ + and self._last_token_type == "videoencode" \ + and self._last_token in ['VC', 'MPEG']: + self.video_encode = "%s%s" % (self._last_token, token) + elif token.upper() == "10BIT": + self._last_token_type = "videoencode" + if not self.video_encode: + self.video_encode = "10bit" + else: + self.video_encode = f"{self.video_encode} 10bit" + + def __init_audio_encode(self, token): + if not self.get_name(): + return + if not self.year \ + and not self.resource_pix \ + and not self.resource_type \ + and not self.begin_season \ + and not self.begin_episode: + return + re_res = re.search(r"(%s)" % self._audio_encode_re, token, re.IGNORECASE) + if re_res: + self._continue_flag = False + self._stop_name_flag = True + self._last_token_type = "audioencode" + self._last_token = re_res.group(1).upper() + if not self.audio_encode: + self.audio_encode = re_res.group(1) + else: + if self.audio_encode.upper() == "DTS": + self.audio_encode = "%s-%s" % (self.audio_encode, re_res.group(1)) + else: + self.audio_encode = "%s %s" % (self.audio_encode, re_res.group(1)) + elif token.isdigit() \ + and self._last_token_type == "audioencode": + if self.audio_encode: + if self._last_token.isdigit(): + self.audio_encode = "%s.%s" % (self.audio_encode, token) + elif self.audio_encode[-1].isdigit(): + self.audio_encode = "%s %s.%s" % (self.audio_encode[:-1], self.audio_encode[-1], token) + else: + self.audio_encode = "%s %s" % (self.audio_encode, token) + self._last_token = token diff --git a/app/media/meta/release_groups.py b/app/media/meta/release_groups.py new file mode 100644 index 0000000..71e7030 --- /dev/null +++ b/app/media/meta/release_groups.py @@ -0,0 +1,103 @@ +import re +from config import Config + + +class ReleaseGroupsMatcher(object): + """ + 识别制作组、字幕组 + """ + __config = None + __release_groups = None + RELEASE_GROUPS = { + "0ff": ['FF(?:(?:A|WE)B|CD|E(?:DU|B)|TV)'], + "1pt": [], + "52pt": [], + "audiences": ['Audies', 'AD(?:Audio|E(?:|book)|Music|Web)'], + "azusa": [], + "beitai": ['BeiTai'], + "btschool": ['Bts(?:CHOOL|HD|PAD|TV)', 'Zone'], + "carpt": ['CarPT'], + "chdbits": ['CHD(?:|Bits|PAD|(?:|HK)TV|WEB)', 'StBOX', 'OneHD', 'Lee', 'xiaopie'], + "discfan": [], + "dragonhd": [], + "eastgame": ['(?:(?:iNT|(?:HALFC|Mini(?:S|H|FH)D))-|)TLF'], + "filelist": [], + "gainbound": ['(?:DG|GBWE)B'], + "hares": ['Hares(?:|(?:M|T)V|Web)'], + "hd4fans": [], + "hdarea": ['HDA(?:pad|rea|TV)', 'EPiC'], + "hdatmos": [], + "hdbd": [], + "hdchina": ['HDC(?:|hina|TV)', 'k9611', 'tudou', 'iHD'], + "hddolby": ['D(?:ream|BTV)', '(?:HD|QHstudI)o'], + "hdfans": ['beAst(?:|TV)'], + "hdhome": ['HDH(?:|ome|Pad|TV|WEB)'], + "hdpt": ['HDPT(?:|Web)'], + "hdsky": ['HDS(?:|ky|TV|Pad|WEB)', 'AQLJ'], + "hdtime": [], + "HDU": [], + "hdvideo": [], + "hdzone": ['HDZ(?:|one)'], + "hhanclub": ['HHWEB'], + "hitpt": [], + "htpt": ['HTPT'], + "iptorrents": [], + "joyhd": [], + "keepfrds": ['FRDS', 'Yumi', 'cXcY'], + "lemonhd": ['L(?:eague(?:(?:C|H)D|(?:M|T)V|NF|WEB)|HD)', 'i18n', 'CiNT'], + "mteam": ['MTeam(?:|TV)', 'MPAD'], + "nanyangpt": [], + "nicept": [], + "oshen": [], + "ourbits": ['Our(?:Bits|TV)', 'FLTTH', 'Ao', 'PbK', 'MGs', 'iLove(?:HD|TV)'], + "piggo": ['PiGo(?:NF|(?:H|WE)B)'], + "ptchina": [], + "pterclub": ['PTer(?:|DIY|Game|(?:M|T)V|WEB)'], + "pthome": ['PTH(?:|Audio|eBook|music|ome|tv|WEB)'], + "ptmsg": [], + "ptsbao": ['PTsbao', 'OPS', 'F(?:Fans(?:AIeNcE|BD|D(?:VD|IY)|TV|WEB)|HDMv)', 'SGXT'], + "pttime": [], + "putao": ['PuTao'], + "soulvoice": [], + "springsunday": ['CMCT(?:|V)'], + "sharkpt": ['Shark(?:|WEB|DIY|TV|MV)'], + "tccf": [], + "tjupt": ['TJUPT'], + "totheglory": ['TTG', 'WiKi', 'NGB', 'DoA', '(?:ARi|ExRE)N'], + "U2": [], + "ultrahd": [], + "others": ['B(?:MDru|eyondHD|TN)', 'C(?:fandora|trlhd|MRG)', 'DON', 'EVO', 'FLUX', 'HONE(?:|yG)', + 'N(?:oGroup|T(?:b|G))', 'PandaMoon', 'SMURF', 'T(?:EPES|aengoo|rollHD )'], + "anime": ['ANi', 'HYSUB', 'KTXP', 'LoliHouse', 'MCE', 'Nekomoe kissaten', '(?:Lilith|NC)-Raws', '织梦字幕组'] + } + + def __init__(self): + self.__config = Config() + release_groups = [] + for site_groups in self.RELEASE_GROUPS.values(): + for release_group in site_groups: + release_groups.append(release_group) + custom_release_groups = (self.__config.get_config('laboratory') or {}).get('release_groups') + if custom_release_groups: + if custom_release_groups.startswith(';'): + custom_release_groups = custom_release_groups[1:] + if custom_release_groups.endswith(';'): + custom_release_groups = custom_release_groups[:-1] + custom_release_groups = custom_release_groups.replace(";", "|") + self.__release_groups = f"{'|'.join(release_groups)}|{custom_release_groups}" + else: + self.__release_groups = '|'.join(release_groups) + + def match(self, title=None, groups=None): + """ + :param title: 资源标题或文件名 + :param groups: 制作组/字幕组 + :return: 匹配结果 + """ + if not title: + return "" + if not groups: + groups = self.__release_groups + title = f"{title} " + groups_re = re.compile(r"(?<=[-@\[£【])(?:%s)(?=[@.\s\]\[】])" % groups, re.I) + return '@'.join(re.findall(groups_re, title)) diff --git a/app/media/scraper.py b/app/media/scraper.py new file mode 100644 index 0000000..ebb5faa --- /dev/null +++ b/app/media/scraper.py @@ -0,0 +1,542 @@ +import os.path +import time +from xml.dom import minidom + +import log +from app.helper import FfmpegHelper +from app.media.douban import DouBan +from config import TMDB_IMAGE_W500_URL +from app.utils import DomUtils, RequestUtils, ExceptionUtils +from app.utils.types import MediaType +from app.media import Media + + +class Scraper: + media = None + + def __init__(self): + self.media = Media() + self.douban = DouBan() + + def __gen_common_nfo(self, + tmdbinfo: dict, + doubaninfo: dict, + scraper_nfo: dict, + doc, + root, + chinese=False): + if scraper_nfo.get("basic"): + # 添加时间 + DomUtils.add_node(doc, root, "dateadded", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + # TMDB + DomUtils.add_node(doc, root, "tmdbid", tmdbinfo.get("id") or "") + uniqueid_tmdb = DomUtils.add_node(doc, root, "uniqueid", tmdbinfo.get("id") or "") + uniqueid_tmdb.setAttribute("type", "tmdb") + uniqueid_tmdb.setAttribute("default", "true") + # TVDB IMDB + if tmdbinfo.get("external_ids"): + tvdbid = tmdbinfo.get("external_ids", {}).get("tvdb_id", 0) + if tvdbid: + DomUtils.add_node(doc, root, "tvdbid", tvdbid) + uniqueid_tvdb = DomUtils.add_node(doc, root, "uniqueid", tvdbid) + uniqueid_tvdb.setAttribute("type", "tvdb") + imdbid = tmdbinfo.get("external_ids", {}).get("imdb_id", "") + if imdbid: + DomUtils.add_node(doc, root, "imdbid", imdbid) + uniqueid_imdb = DomUtils.add_node(doc, root, "uniqueid", imdbid) + uniqueid_imdb.setAttribute("type", "imdb") + uniqueid_imdb.setAttribute("default", "true") + uniqueid_tmdb.setAttribute("default", "false") + + # 简介 + xplot = DomUtils.add_node(doc, root, "plot") + xplot.appendChild(doc.createCDATASection(tmdbinfo.get("overview") or "")) + xoutline = DomUtils.add_node(doc, root, "outline") + xoutline.appendChild(doc.createCDATASection(tmdbinfo.get("overview") or "")) + if scraper_nfo.get("credits"): + # 导演 + directors, actors = self.media.get_tmdb_directors_actors(tmdbinfo=tmdbinfo) + if chinese: + directors, actors = self.__gen_people_chinese_info(directors, actors, doubaninfo) + for director in directors: + xdirector = DomUtils.add_node(doc, root, "director", director.get("name") or "") + xdirector.setAttribute("tmdbid", str(director.get("id") or "")) + # 演员 + for actor in actors: + xactor = DomUtils.add_node(doc, root, "actor") + DomUtils.add_node(doc, xactor, "name", actor.get("name") or "") + DomUtils.add_node(doc, xactor, "type", "Actor") + DomUtils.add_node(doc, xactor, "role", actor.get("role") or "") + DomUtils.add_node(doc, xactor, "order", actor.get("order") if actor.get("order") is not None else "") + DomUtils.add_node(doc, xactor, "tmdbid", actor.get("id") or "") + DomUtils.add_node(doc, xactor, "thumb", actor.get('image')) + DomUtils.add_node(doc, xactor, "profile", actor.get('profile')) + if scraper_nfo.get("basic"): + # 风格 + genres = tmdbinfo.get("genres") or [] + for genre in genres: + DomUtils.add_node(doc, root, "genre", genre.get("name") or "") + # 评分 + DomUtils.add_node(doc, root, "rating", tmdbinfo.get("vote_average") or "0") + return doc + + def gen_movie_nfo_file(self, + tmdbinfo: dict, + doubaninfo: dict, + scraper_movie_nfo: dict, + out_path, + file_name): + """ + 生成电影的NFO描述文件 + :param tmdbinfo: TMDB元数据 + :param doubaninfo: 豆瓣元数据 + :param scraper_movie_nfo: 刮削配置 + :param out_path: 电影根目录 + :param file_name: 电影文件名,不含后缀 + """ + # 开始生成XML + log.info("【Scraper】正在生成电影NFO文件:%s" % file_name) + doc = minidom.Document() + root = DomUtils.add_node(doc, doc, "movie") + # 公共部分 + doc = self.__gen_common_nfo(tmdbinfo=tmdbinfo, + doubaninfo=doubaninfo, + scraper_nfo=scraper_movie_nfo, + doc=doc, + root=root, + chinese=scraper_movie_nfo.get("credits_chinese")) + # 基础部分 + if scraper_movie_nfo.get("basic"): + # 标题 + DomUtils.add_node(doc, root, "title", tmdbinfo.get("title") or "") + DomUtils.add_node(doc, root, "originaltitle", tmdbinfo.get("original_title") or "") + # 发布日期 + DomUtils.add_node(doc, root, "premiered", tmdbinfo.get("release_date") or "") + # 年份 + DomUtils.add_node(doc, root, "year", + tmdbinfo.get("release_date")[:4] if tmdbinfo.get("release_date") else "") + # 保存 + self.__save_nfo(doc, os.path.join(out_path, "%s.nfo" % file_name)) + + def gen_tv_nfo_file(self, + tmdbinfo: dict, + doubaninfo: dict, + scraper_tv_nfo: dict, + out_path): + """ + 生成电视剧的NFO描述文件 + :param tmdbinfo: TMDB元数据 + :param doubaninfo: 豆瓣元数据 + :param scraper_tv_nfo: 刮削配置 + :param out_path: 电视剧根目录 + """ + # 开始生成XML + log.info("【Scraper】正在生成电视剧NFO文件:%s" % out_path) + doc = minidom.Document() + root = DomUtils.add_node(doc, doc, "tvshow") + # 公共部分 + doc = self.__gen_common_nfo(tmdbinfo=tmdbinfo, + doubaninfo=doubaninfo, + scraper_nfo=scraper_tv_nfo, + doc=doc, + root=root, + chinese=scraper_tv_nfo.get("credits_chinese")) + if scraper_tv_nfo.get("basic"): + # 标题 + DomUtils.add_node(doc, root, "title", tmdbinfo.get("name") or "") + DomUtils.add_node(doc, root, "originaltitle", tmdbinfo.get("original_name") or "") + # 发布日期 + DomUtils.add_node(doc, root, "premiered", tmdbinfo.get("first_air_date") or "") + # 年份 + DomUtils.add_node(doc, root, "year", + tmdbinfo.get("first_air_date")[:4] if tmdbinfo.get("first_air_date") else "") + DomUtils.add_node(doc, root, "season", "-1") + DomUtils.add_node(doc, root, "episode", "-1") + # 保存 + self.__save_nfo(doc, os.path.join(out_path, "tvshow.nfo")) + + def gen_tv_season_nfo_file(self, tmdbinfo: dict, season, out_path): + """ + 生成电视剧季的NFO描述文件 + :param tmdbinfo: TMDB季媒体信息 + :param season: 季号 + :param out_path: 电视剧季的目录 + """ + log.info("【Scraper】正在生成季NFO文件:%s" % out_path) + doc = minidom.Document() + root = DomUtils.add_node(doc, doc, "season") + # 添加时间 + DomUtils.add_node(doc, root, "dateadded", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + # 简介 + xplot = DomUtils.add_node(doc, root, "plot") + xplot.appendChild(doc.createCDATASection(tmdbinfo.get("overview") or "")) + xoutline = DomUtils.add_node(doc, root, "outline") + xoutline.appendChild(doc.createCDATASection(tmdbinfo.get("overview") or "")) + # 标题 + DomUtils.add_node(doc, root, "title", "季 %s" % season) + # 发行日期 + DomUtils.add_node(doc, root, "premiered", tmdbinfo.get("air_date") or "") + DomUtils.add_node(doc, root, "releasedate", tmdbinfo.get("air_date") or "") + # 发行年份 + DomUtils.add_node(doc, root, "year", tmdbinfo.get("air_date")[:4] if tmdbinfo.get("air_date") else "") + # seasonnumber + DomUtils.add_node(doc, root, "seasonnumber", season) + # 保存 + self.__save_nfo(doc, os.path.join(out_path, "season.nfo")) + + def gen_tv_episode_nfo_file(self, + tmdbinfo: dict, + scraper_tv_nfo, + season: int, + episode: int, + out_path, + file_name): + """ + 生成电视剧集的NFO描述文件 + :param tmdbinfo: TMDB元数据 + :param scraper_tv_nfo: 刮削配置 + :param season: 季号 + :param episode: 集号 + :param out_path: 电视剧季的目录 + :param file_name: 电视剧文件名,不含后缀 + """ + # 开始生成集的信息 + log.info("【Scraper】正在生成剧集NFO文件:%s" % file_name) + # 集的信息 + episode_detail = {} + for episode_info in tmdbinfo.get("episodes") or []: + if int(episode_info.get("episode_number")) == int(episode): + episode_detail = episode_info + if not episode_detail: + return + doc = minidom.Document() + root = DomUtils.add_node(doc, doc, "episodedetails") + if scraper_tv_nfo.get("episode_basic"): + # 添加时间 + DomUtils.add_node(doc, root, "dateadded", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + # TMDBID + uniqueid = DomUtils.add_node(doc, root, "uniqueid", tmdbinfo.get("id") or "") + uniqueid.setAttribute("type", "tmdb") + uniqueid.setAttribute("default", "true") + # tmdbid + DomUtils.add_node(doc, root, "tmdbid", tmdbinfo.get("id") or "") + # 标题 + DomUtils.add_node(doc, root, "title", episode_detail.get("name") or "第 %s 集" % episode) + # 简介 + xplot = DomUtils.add_node(doc, root, "plot") + xplot.appendChild(doc.createCDATASection(episode_detail.get("overview") or "")) + xoutline = DomUtils.add_node(doc, root, "outline") + xoutline.appendChild(doc.createCDATASection(episode_detail.get("overview") or "")) + # 发布日期 + DomUtils.add_node(doc, root, "aired", episode_detail.get("air_date") or "") + # 年份 + DomUtils.add_node(doc, root, "year", + episode_detail.get("air_date")[:4] if episode_detail.get("air_date") else "") + # 季 + DomUtils.add_node(doc, root, "season", season) + # 集 + DomUtils.add_node(doc, root, "episode", episode) + # 评分 + DomUtils.add_node(doc, root, "rating", episode_detail.get("vote_average") or "0") + if scraper_tv_nfo.get("episode_credits"): + # 导演 + directors = episode_detail.get("crew") or [] + for director in directors: + if director.get("known_for_department") == "Directing": + xdirector = DomUtils.add_node(doc, root, "director", director.get("name") or "") + xdirector.setAttribute("tmdbid", str(director.get("id") or "")) + # 演员 + actors = episode_detail.get("guest_stars") or [] + for actor in actors: + if actor.get("known_for_department") == "Acting": + xactor = DomUtils.add_node(doc, root, "actor") + DomUtils.add_node(doc, xactor, "name", actor.get("name") or "") + DomUtils.add_node(doc, xactor, "type", "Actor") + DomUtils.add_node(doc, xactor, "tmdbid", actor.get("id") or "") + # 保存文件 + self.__save_nfo(doc, os.path.join(out_path, os.path.join(out_path, "%s.nfo" % file_name))) + + @staticmethod + def __save_image(url, out_path, itype=''): + """ + 下载poster.jpg并保存 + """ + if not url or not out_path: + return + if itype: + image_path = os.path.join(out_path, "%s.%s" % (itype, str(url).split('.')[-1])) + else: + image_path = out_path + if os.path.exists(image_path): + return + try: + log.info(f"【Scraper】正在下载{itype}图片:{url} ...") + r = RequestUtils().get_res(url) + if r: + with open(file=image_path, + mode="wb") as img: + img.write(r.content) + log.info(f"【Scraper】{itype}图片已保存:{out_path}") + else: + log.info(f"【Scraper】{itype}图片下载失败,请检查网络连通性") + except Exception as err: + ExceptionUtils.exception_traceback(err) + + @staticmethod + def __save_nfo(doc, out_file): + xml_str = doc.toprettyxml(indent=" ", encoding="utf-8") + with open(out_file, "wb") as xml_file: + xml_file.write(xml_str) + + def gen_scraper_files(self, media, scraper_nfo, scraper_pic, dir_path, file_name, file_ext): + """ + 刮削元数据 + :param media: 已识别的媒体信息 + :param scraper_nfo: NFO刮削配置 + :param scraper_pic: 图片刮削配置 + :param dir_path: 文件路径 + :param file_name: 文件名,不含后缀 + :param file_ext: 文件后缀 + """ + if not scraper_nfo: + scraper_nfo = {} + if not scraper_pic: + scraper_pic = {} + try: + # 电影 + if media.type == MediaType.MOVIE: + scraper_movie_nfo = scraper_nfo.get("movie") + scraper_movie_pic = scraper_pic.get("movie") + # movie nfo + if scraper_movie_nfo.get("basic") or scraper_movie_nfo.get("credits"): + # 已存在时不处理 + if not os.path.exists(os.path.join(dir_path, "movie.nfo")) \ + and not os.path.exists(os.path.join(dir_path, "%s.nfo" % file_name)): + # 查询Douban信息 + if scraper_movie_nfo.get("credits") and scraper_movie_nfo.get("credits_chinese"): + doubaninfo = self.douban.get_douban_info(media) + else: + doubaninfo = None + # 生成电影描述文件 + self.gen_movie_nfo_file(tmdbinfo=media.tmdb_info, + doubaninfo=doubaninfo, + scraper_movie_nfo=scraper_movie_nfo, + out_path=dir_path, + file_name=file_name) + # poster + if scraper_movie_pic.get("poster"): + poster_image = media.get_poster_image(original=True) + if poster_image: + self.__save_image(poster_image, dir_path, "poster") + # backdrop + if scraper_movie_pic.get("backdrop"): + backdrop_image = media.get_backdrop_image(default=False, original=True) + if backdrop_image: + self.__save_image(backdrop_image, dir_path, "fanart") + # background + if scraper_movie_pic.get("background"): + background_image = media.fanart.get_background(media_type=media.type, queryid=media.tmdb_id) + if background_image: + self.__save_image(background_image, dir_path, "background") + # logo + if scraper_movie_pic.get("logo"): + logo_image = media.fanart.get_logo(media_type=media.type, queryid=media.tmdb_id) + if logo_image: + self.__save_image(logo_image, dir_path, "logo") + # disc + if scraper_movie_pic.get("disc"): + disc_image = media.fanart.get_disc(media_type=media.type, queryid=media.tmdb_id) + if disc_image: + self.__save_image(disc_image, dir_path, "disc") + # banner + if scraper_movie_pic.get("banner"): + banner_image = media.fanart.get_banner(media_type=media.type, queryid=media.tmdb_id) + if banner_image: + self.__save_image(banner_image, dir_path, "banner") + # thumb + if scraper_movie_pic.get("thumb"): + thumb_image = media.fanart.get_thumb(media_type=media.type, queryid=media.tmdb_id) + if thumb_image: + self.__save_image(thumb_image, dir_path, "thumb") + # 电视剧 + else: + scraper_tv_nfo = scraper_nfo.get("tv") + scraper_tv_pic = scraper_pic.get("tv") + # tv nfo + if not os.path.exists(os.path.join(os.path.dirname(dir_path), "tvshow.nfo")): + if scraper_tv_nfo.get("basic") or scraper_tv_nfo.get("credits"): + # 查询Douban信息 + if scraper_tv_nfo.get("credits") and scraper_tv_nfo.get("credits_chinese"): + doubaninfo = self.douban.get_douban_info(media) + else: + doubaninfo = None + # 根目录描述文件 + self.gen_tv_nfo_file(media.tmdb_info, doubaninfo, scraper_tv_nfo, os.path.dirname(dir_path)) + # poster + if scraper_tv_pic.get("poster"): + poster_image = media.get_poster_image(original=True) + if poster_image: + self.__save_image(poster_image, os.path.dirname(dir_path), "poster") + # backdrop + if scraper_tv_pic.get("backdrop"): + backdrop_image = media.get_backdrop_image(default=False, original=True) + if backdrop_image: + self.__save_image(backdrop_image, os.path.dirname(dir_path), "fanart") + # background + if scraper_tv_pic.get("background"): + background_image = media.fanart.get_background(media_type=media.type, queryid=media.tvdb_id) + if background_image: + self.__save_image(background_image, dir_path, "show") + # logo + if scraper_tv_pic.get("logo"): + logo_image = media.fanart.get_logo(media_type=media.type, queryid=media.tvdb_id) + if logo_image: + self.__save_image(logo_image, dir_path, "logo") + # clearart + if scraper_tv_pic.get("clearart"): + clearart_image = media.fanart.get_disc(media_type=media.type, queryid=media.tvdb_id) + if clearart_image: + self.__save_image(clearart_image, dir_path, "clearart") + # banner + if scraper_tv_pic.get("banner"): + banner_image = media.fanart.get_banner(media_type=media.type, queryid=media.tvdb_id) + if banner_image: + self.__save_image(banner_image, dir_path, "banner") + # thumb + if scraper_tv_pic.get("thumb"): + thumb_image = media.fanart.get_thumb(media_type=media.type, queryid=media.tvdb_id) + if thumb_image: + self.__save_image(thumb_image, dir_path, "thumb") + # season nfo + if scraper_tv_nfo.get("season_basic"): + if not os.path.exists(os.path.join(dir_path, "season.nfo")): + # season nfo + seasoninfo = self.media.get_tmdb_tv_season_detail(tmdbid=media.tmdb_id, + season=int(media.get_season_seq())) + if seasoninfo: + self.gen_tv_season_nfo_file(seasoninfo, int(media.get_season_seq()), dir_path) + # episode nfo + if scraper_tv_nfo.get("episode_basic") \ + or scraper_tv_nfo.get("episode_credits"): + if not os.path.exists(os.path.join(dir_path, "%s.nfo" % file_name)): + seasoninfo = self.media.get_tmdb_tv_season_detail(tmdbid=media.tmdb_id, + season=int(media.get_season_seq())) + if seasoninfo: + self.gen_tv_episode_nfo_file(tmdbinfo=seasoninfo, + scraper_tv_nfo=scraper_tv_nfo, + season=int(media.get_season_seq()), + episode=int(media.get_episode_seq()), + out_path=dir_path, + file_name=file_name) + # season poster + if scraper_tv_pic.get("season_poster"): + season_poster = "season%s-poster" % media.get_season_seq().rjust(2, '0') + seasonposter = media.fanart.get_seasonposter(media_type=media.type, + queryid=media.tvdb_id, + season=media.get_season_seq()) + if seasonposter: + self.__save_image(seasonposter, + os.path.dirname(dir_path), + season_poster) + else: + seasoninfo = self.media.get_tmdb_tv_season_detail(tmdbid=media.tmdb_id, + season=int(media.get_season_seq())) + if seasoninfo: + self.__save_image(TMDB_IMAGE_W500_URL % seasoninfo.get("poster_path"), + os.path.dirname(dir_path), + season_poster) + # season banner + if scraper_tv_pic.get("season_banner"): + seasonbanner = media.fanart.get_seasonbanner(media_type=media.type, + queryid=media.tvdb_id, + season=media.get_season_seq()) + if seasonbanner: + self.__save_image(seasonbanner, + os.path.dirname(dir_path), + "season%s-banner" % media.get_season_seq().rjust(2, '0')) + # season thumb + if scraper_tv_pic.get("season_thumb"): + seasonthumb = media.fanart.get_seasonthumb(media_type=media.type, + queryid=media.tvdb_id, + season=media.get_season_seq()) + if seasonthumb: + self.__save_image(seasonthumb, + os.path.dirname(dir_path), + "season%s-landscape" % media.get_season_seq().rjust(2, '0')) + # episode thumb + if scraper_tv_pic.get("episode_thumb"): + episode_thumb = os.path.join(dir_path, file_name + "-thumb.jpg") + if not os.path.exists(episode_thumb): + # 优先从TMDB查询 + episode_image = self.media.get_episode_images(tv_id=media.tmdb_id, + season_id=media.get_season_seq(), + episode_id=media.get_episode_seq(), + orginal=True) + if episode_image: + self.__save_image(episode_image, episode_thumb) + else: + # 从视频文件生成缩略图 + video_path = os.path.join(dir_path, file_name + file_ext) + log.info(f"【Scraper】正在生成缩略图:{video_path} ...") + FfmpegHelper().get_thumb_image_from_video(video_path=video_path, + image_path=episode_thumb) + log.info(f"【Scraper】缩略图生成完成:{episode_thumb}") + + except Exception as e: + ExceptionUtils.exception_traceback(e) + + def __gen_people_chinese_info(self, directors, actors, doubaninfo): + """ + 匹配豆瓣演职人员中文名 + """ + if doubaninfo: + directors_douban = doubaninfo.get("directors") or [] + actors_douban = doubaninfo.get("actors") or [] + # douban英文名姓和名分开匹配,(豆瓣中名前姓后,TMDB中不确定) + for director_douban in directors_douban: + if director_douban["latin_name"]: + director_douban["latin_name"] = director_douban.get("latin_name", "").lower().split(" ") + else: + director_douban["latin_name"] = director_douban.get("name", "").lower().split(" ") + for actor_douban in actors_douban: + if actor_douban["latin_name"]: + actor_douban["latin_name"] = actor_douban.get("latin_name", "").lower().split(" ") + else: + actor_douban["latin_name"] = actor_douban.get("name", "").lower().split(" ") + # 导演 + if directors: + for director in directors: + director_douban = self.__match_people_in_douban(director, directors_douban) + if director_douban: + director["name"] = director_douban.get("name") + else: + log.info("【Scraper】豆瓣该影片或剧集无导演 %s 信息" % director.get("name")) + # 演员 + if actors: + for actor in actors: + actor_douban = self.__match_people_in_douban(actor, actors_douban) + if actor_douban: + actor["name"] = actor_douban.get("name") + if actor_douban.get("character") != "演员": + actor["character"] = actor_douban.get("character")[2:] + else: + log.info("【Scraper】豆瓣该影片或剧集无演员 %s 信息" % actor.get("name")) + else: + log.info("【Scraper】豆瓣无该影片或剧集信息") + return directors, actors + + def __match_people_in_douban(self, people, peoples_douban): + """ + 名字加又名构成匹配列表 + """ + people_aka_names = self.media.get_tmdbperson_aka_names(people.get("id")) or [] + people_aka_names.append(people.get("name")) + for people_aka_name in people_aka_names: + for people_douban in peoples_douban: + latin_match_res = True + # 姓和名分开匹配 + for latin_name in people_douban.get("latin_name"): + latin_match_res = latin_match_res and (latin_name in people_aka_name.lower()) + if latin_match_res or (people_douban.get("name") == people_aka_name): + return people_douban + return None diff --git a/app/media/tmdbv3api/__init__.py b/app/media/tmdbv3api/__init__.py new file mode 100644 index 0000000..584a4d3 --- /dev/null +++ b/app/media/tmdbv3api/__init__.py @@ -0,0 +1,11 @@ +from .tmdb import TMDb +from .exceptions import TMDbException +from .objs.movie import Movie +from .objs.search import Search +from .objs.tv import TV +from .objs.person import Person +from .objs.find import Find +from .objs.discover import Discover +from .objs.trending import Trending +from .objs.episode import Episode +from .objs.genre import Genre diff --git a/app/media/tmdbv3api/as_obj.py b/app/media/tmdbv3api/as_obj.py new file mode 100644 index 0000000..24d73e6 --- /dev/null +++ b/app/media/tmdbv3api/as_obj.py @@ -0,0 +1,84 @@ +# encoding: utf-8 +import sys + +from app.media.tmdbv3api.exceptions import TMDbException + + +class AsObj: + def __init__(self, **entries): + if "success" in entries and entries["success"] is False: + raise TMDbException(entries["status_message"]) + for key, value in entries.items(): + if isinstance(value, list): + value = [AsObj(**item) if isinstance(item, dict) else item for item in value] + if isinstance(value, dict): + value = AsObj(**value) + setattr(self, key, value) + + def __delitem__(self, key): + return delattr(self, key) + + def __getitem__(self, key): + return getattr(self, key) + + def __iter__(self): + return iter(self.__dict__) + + def __len__(self): + return len(self.__dict__) + + def __repr__(self): + return str(self.__dict__) + + def __setitem__(self, key, value): + return setattr(self, key, value) + + def __str__(self): + return str(self.__dict__) + + if sys.version_info >= (3, 8): + def __reversed__(self): + return reversed(self.__dict__) + + if sys.version_info >= (3, 9): + def __class_getitem__(cls, key): + return cls.__dict__.__class_getitem__(key) + + def __ior__(self, value): + return self.__dict__.__ior__(value) + + def __or__(self, value): + return self.__dict__.__or__(value) + + def clear(self): + return self.__dict__.clear() + + def copy(self): + return AsObj(**self.__dict__.copy()) + + def fromkeys(self, keys, value=None): + return AsObj(**self.__dict__.fromkeys(keys, value)) + + def get(self, key, value=None): + return self.__dict__.get(key, value) + + def items(self): + return self.__dict__.items() + + def keys(self): + return self.__dict__.keys() + + def pop(self, key, value=None): + return self.__dict__.pop(key, value) + + def popitem(self): + return self.__dict__.popitem() + + def setdefault(self, key, value=None): + return self.__dict__.setdefault(key, value) + + def update(self, entries): + return self.__dict__.update(entries) + + def values(self): + return self.__dict__.values() diff --git a/app/media/tmdbv3api/exceptions.py b/app/media/tmdbv3api/exceptions.py new file mode 100644 index 0000000..e17eeb2 --- /dev/null +++ b/app/media/tmdbv3api/exceptions.py @@ -0,0 +1,2 @@ +class TMDbException(Exception): + pass diff --git a/app/media/tmdbv3api/objs/__init__.py b/app/media/tmdbv3api/objs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/media/tmdbv3api/objs/discover.py b/app/media/tmdbv3api/objs/discover.py new file mode 100644 index 0000000..b42b648 --- /dev/null +++ b/app/media/tmdbv3api/objs/discover.py @@ -0,0 +1,52 @@ +from app.media.tmdbv3api.tmdb import TMDb + +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode + + +class Discover(TMDb): + _urls = { + "movies": "/discover/movie", + "tvs": "/discover/tv" + } + + def discover_movies(self, params, page=1): + """ + Discover movies by different types of data like average rating, number of votes, genres and certifications. + :param params: dict + :param page: int + :return: + """ + if not params: + params = {} + if page: + params.update({"page": page}) + return self._get_obj( + self._call( + self._urls["movies"], + urlencode(params) + ), + "results" + ) + + def discover_tv_shows(self, params, page=1): + """ + Discover TV shows by different types of data like average rating, number of votes, genres, + the network they aired on and air dates. + :param params: dict + :param page: int + :return: + """ + if not params: + params = {} + if page: + params.update({"page": page}) + return self._get_obj( + self._call( + self._urls["tvs"], + urlencode(params) + ), + "results" + ) diff --git a/app/media/tmdbv3api/objs/episode.py b/app/media/tmdbv3api/objs/episode.py new file mode 100644 index 0000000..05729e1 --- /dev/null +++ b/app/media/tmdbv3api/objs/episode.py @@ -0,0 +1,24 @@ +from app.media.tmdbv3api.tmdb import TMDb + + +class Episode(TMDb): + _urls = { + "images": "/tv/%s/season/%s/episode/%s/images" + } + + def images(self, tv_id, season_num, episode_num, include_image_language=None): + """ + Get the images that belong to a TV episode. + :param tv_id: int + :param season_num: int + :param episode_num: int + :param include_image_language: str + :return: + """ + return self._get_obj( + self._call( + self._urls["images"] % (tv_id, season_num, episode_num), + "include_image_language=%s" % include_image_language if include_image_language else "", + ), + "stills" + ) diff --git a/app/media/tmdbv3api/objs/find.py b/app/media/tmdbv3api/objs/find.py new file mode 100644 index 0000000..d817f53 --- /dev/null +++ b/app/media/tmdbv3api/objs/find.py @@ -0,0 +1,12 @@ +from app.media.tmdbv3api.tmdb import TMDb + + +class Find(TMDb): + _urls = { + "find": "/find/%s" + } + + def find_by_imdbid(self, imdbid): + return self._call( + self._urls["find"] % imdbid, + "external_source=imdb_id") diff --git a/app/media/tmdbv3api/objs/genre.py b/app/media/tmdbv3api/objs/genre.py new file mode 100644 index 0000000..3d54633 --- /dev/null +++ b/app/media/tmdbv3api/objs/genre.py @@ -0,0 +1,22 @@ +from app.media.tmdbv3api.tmdb import TMDb + + +class Genre(TMDb): + _urls = { + "movie_list": "/genre/movie/list", + "tv_list": "/genre/tv/list" + } + + def movie_list(self): + """ + Get the list of official genres for movies. + :return: + """ + return self._get_obj(self._call(self._urls["movie_list"], ""), "genres") + + def tv_list(self): + """ + Get the list of official genres for TV shows. + :return: + """ + return self._get_obj(self._call(self._urls["tv_list"], ""), "genres") diff --git a/app/media/tmdbv3api/objs/movie.py b/app/media/tmdbv3api/objs/movie.py new file mode 100644 index 0000000..42a47fd --- /dev/null +++ b/app/media/tmdbv3api/objs/movie.py @@ -0,0 +1,295 @@ +import warnings + +from app.media.tmdbv3api.as_obj import AsObj +from app.media.tmdbv3api.tmdb import TMDb + +try: + from urllib import quote +except ImportError: + from urllib.parse import quote + +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode + + +class Movie(TMDb): + _urls = { + "details": "/movie/%s", + "alternative_titles": "/movie/%s/alternative_titles", + "changes": "/movie/%s/changes", + "credits": "/movie/%s/credits", + "external_ids": "/movie/%s/external_ids", + "images": "/movie/%s/images", + "keywords": "/movie/%s/keywords", + "lists": "/movie/%s/lists", + "reviews": "/movie/%s/reviews", + "videos": "/movie/%s/videos", + "recommendations": "/movie/%s/recommendations", + "latest": "/movie/latest", + "now_playing": "/movie/now_playing", + "top_rated": "/movie/top_rated", + "upcoming": "/movie/upcoming", + "popular": "/movie/popular", + "search_movie": "/search/movie", + "similar": "/movie/%s/similar", + "external": "/find/%s", + "release_dates": "/movie/%s/release_dates", + "watch_providers": "/movie/%s/watch/providers", + "translations": "/movie/%s/translations", + "discover": "/discover/movie" + } + + def details( + self, + movie_id, + append_to_response="", + ): + """ + Get the primary information about a movie. + :param movie_id: + :param append_to_response: + :return: + """ + if append_to_response == "all": + append_to_response = "images,credits,alternative_titles,translations,external_ids" + elif append_to_response is None: + append_to_response = "alternative_titles,translations,external_ids" + return AsObj( + **self._call( + self._urls["details"] % movie_id, + "append_to_response=" + append_to_response, + ) + ) + + def alternative_titles(self, movie_id): + """ + Get all of the alternative titles for a movie. + :param movie_id: + :return: + """ + return AsObj(**self._call(self._urls["alternative_titles"] % movie_id, "")) + + def changes(self, movie_id, start_date="", end_date="", page=1): + """ + Get all of the alternative titles for a movie. + You can query up to 14 days in a single query by using the start_date and end_date query parameters. + :param movie_id: + :param start_date: + :param end_date: + :param page: + :return: + """ + return self._get_obj( + self._call( + self._urls["changes"] % movie_id, + urlencode({ + "start_date": str(start_date), + "end_date": str(end_date), + "page": str(page) + }) + ), + "changes" + ) + + def credidiscoverts(self, movie_id): + """ + Get the cast and crew for a movie. + :param movie_id: + :return: + """ + return AsObj(**self._call(self._urls["credits"] % movie_id, "")) + + def external_ids(self, movie_id): + """ + Get the external ids for a movie. + :param movie_id: + :return: + """ + return self._get_obj( + self._call(self._urls["external_ids"] % (str(movie_id)), ""), None + ) + + def images(self, movie_id, include_image_language=""): + """ + Get the images that belong to a movie. + Querying images with a language parameter will filter the results. + If you want to include a fallback language (especially useful for backdrops) you can use the include_image_language parameter. + This should be a comma seperated value like so: include_image_language=en,null. + :param movie_id: + :param include_image_language: + :return: + """ + return AsObj(**self._call(self._urls['images'] % movie_id, "include_image_language=" + include_image_language)) + + def keywords(self, movie_id): + """ + Get the keywords associated to a movie. + :param movie_id: + :return: + """ + return AsObj(**self._call(self._urls['keywords'] % movie_id, '')) + + def lists(self, movie_id, page=1): + """ + Get a list of lists that this movie belongs to. + :param movie_id: + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["lists"] % movie_id, "page=" + str(page)) + ) + + def recommendations(self, movie_id, page=1): + """ + Get a list of recommended movies for a movie. + :param movie_id: + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["recommendations"] % movie_id, "page=" + str(page)) + ) + + def release_dates(self, movie_id): + """ + Get the release date along with the certification for a movie. + :param movie_id: + :return: + """ + return AsObj(**self._call(self._urls['release_dates'] % movie_id, '')) + + def reviews(self, movie_id, page=1): + """ + Get the user reviews for a movie. + :param movie_id: + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["reviews"] % movie_id, "page=" + str(page)) + ) + + def videos(self, vid, page=1): + """ + Get the videos that have been added to a movie. + :param vid: + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["videos"] % vid, "page=" + str(page))) + + def latest(self): + """ + Get the most newly created movie. This is a live response and will continuously change. + :return: + """ + return AsObj(**self._call(self._urls["latest"], "")) + + def now_playing(self, page=1): + """ + Get a list of movies in theatres. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["now_playing"], "page=" + str(page))) + + def top_rated(self, page=1): + """ + Get the top rated movies on TMDb. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["top_rated"], "page=" + str(page))) + + def upcoming(self, page=1): + """ + Get a list of upcoming movies in theatres. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["upcoming"], "page=" + str(page))) + + def popular(self, page=1): + """ + Get a list of the current popular movies on TMDb. This list updates daily. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["popular"], "page=" + str(page))) + + def search(self, term, page=1): + """ + Search for movies. + :param term: + :param page: + :return: + """ + return self._get_obj( + self._call( + self._urls["search_movie"], + "query=" + quote(term) + "&page=" + str(page), + ) + ) + + def similar(self, movie_id, page=1): + """ + Get a list of similar movies. + :param movie_id: + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["similar"] % movie_id, "page=" + str(page)) + ) + + def external(self, external_id, external_source): + """ + The find method makes it easy to search for objects in our database by an external id. For example, an IMDB ID. + :param external_id: str + :param external_source str + :return: + """ + warnings.warn("external method is deprecated use tmdbv3api.Find().find(external_id, external_source)", + DeprecationWarning) + return self._get_obj( + self._call( + self._urls["external"] % external_id, + "external_source=" + external_source, + ), + key=None, + ) + + def watch_providers(self, movie_id): + """ + Get the Watch Providers for a movie. + :param movie_id: + :return: + """ + return AsObj(**self._call(self._urls["watch_providers"] % movie_id, "")) + + def translations(self, movie_id): + """ + Get the Watch Providers for a movie. + :param movie_id: + :return: + """ + return AsObj(**self._call(self._urls["translations"] % movie_id, "")) + + def discover(self, page): + """ + Movie discover. + :param page: + :return: + """ + return AsObj(**self._call(self._urls["discover"], "page=" + str(page))) + + def credits(self, movie_id): + """ + Get the Credits for a movie. + :param movie_id: + :return: + """ + return AsObj(**self._call(self._urls["credits"] % movie_id, "")) diff --git a/app/media/tmdbv3api/objs/person.py b/app/media/tmdbv3api/objs/person.py new file mode 100644 index 0000000..ab93440 --- /dev/null +++ b/app/media/tmdbv3api/objs/person.py @@ -0,0 +1,150 @@ +from app.media.tmdbv3api.as_obj import AsObj +from app.media.tmdbv3api.tmdb import TMDb + +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode + + +class Person(TMDb): + _urls = { + "details": "/person/%s", + "changes": "/person/%s/changes", + "movie_credits": "/person/%s/movie_credits", + "tv_credits": "/person/%s/tv_credits", + "combined_credits": "/person/%s/combined_credits", + "external_ids": "/person/%s/external_ids", + "images": "/person/%s/images", + "tagged_images": "/person/%s/tagged_images", + "translations": "/person/%s/translations", + "latest": "/person/latest", + "popular": "/person/popular", + } + + def details( + self, + person_id, + append_to_response="combined_credits,translations,external_ids", + ): + """ + Get the primary person details by id. + :param person_id: + :param append_to_response: + :return: + """ + return AsObj( + **self._call( + self._urls["details"] % person_id, + "append_to_response=" + append_to_response, + ) + ) + + def changes(self, person_id, start_date="", end_date="", page=1): + """ + Get the changes for a person. By default only the last 24 hours are returned. + You can query up to 14 days in a single query by using the start_date and end_date query parameters. + :param person_id: + :param start_date: + :param end_date: + :param page: + :return: + """ + return self._get_obj( + self._call( + self._urls["changes"] % person_id, + urlencode({ + "start_date": str(start_date), + "end_date": str(end_date), + "page": str(page) + }) + ), + "changes" + ) + + def movie_credits(self, person_id): + """ + Get the movie credits for a person. + :param person_id: + :return: + """ + return self._get_obj( + self._call( + self._urls["movie_credits"] % person_id, + "" + ), + "cast" + ) + + def tv_credits(self, person_id): + """ + Get the TV show credits for a person. + :param person_id: + :return: + """ + return self._get_obj( + self._call( + self._urls["tv_credits"] % person_id, + "" + ), + "cast" + ) + + def combined_credits(self, person_id): + """ + Get the movie and TV credits together in a single response. + :param person_id: + :return: + """ + return AsObj(**self._call(self._urls["combined_credits"] % person_id, "")) + + def external_ids(self, person_id): + """ + Get the external ids for a person. + :param person_id: + :return: + """ + return self._get_obj( + self._call(self._urls["external_ids"] % (str(person_id)), ""), None + ) + + def images(self, person_id): + """ + Get the images for a person. + :param person_id: + :param include_image_language: + :return: + """ + return AsObj(**self._call(self._urls['images'] % person_id, "")) + + def tagged_images(self, person_id): + """ + Get the images that this person has been tagged in. + :param person_id: + :param include_image_language: + :return: + """ + return AsObj(**self._call(self._urls['tagged_images'] % person_id, "")) + + def translations(self, person_id): + """ + Get a list of translations that have been created for a person. + :param person_id: + :return: + """ + return AsObj(**self._call(self._urls["translations"] % person_id, "")) + + def latest(self): + """ + Get the most newly created person. This is a live response and will continuously change. + :return: + """ + return AsObj(**self._call(self._urls["latest"], "")) + + def popular(self, page=1): + """ + Get the list of popular people on TMDB. This list updates daily. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["popular"], "page=" + str(page))) diff --git a/app/media/tmdbv3api/objs/search.py b/app/media/tmdbv3api/objs/search.py new file mode 100644 index 0000000..36516ec --- /dev/null +++ b/app/media/tmdbv3api/objs/search.py @@ -0,0 +1,74 @@ +from app.media.tmdbv3api.tmdb import TMDb + +try: + from urllib import urlencode +except ImportError: + from urllib.parse import urlencode + + +class Search(TMDb): + _urls = { + "companies": "/search/company", + "collections": "/search/collection", + "keywords": "/search/keyword", + "movies": "/search/movie", + "multi": "/search/multi", + "people": "/search/person", + "tv_shows": "/search/tv", + } + + def companies(self, params): + """ + Search for movies. + :param params: + :return: + """ + return self._get_obj(self._call(self._urls["companies"], urlencode(params))) + + def collections(self, params): + """ + Search for movies. + :param params: + :return: + """ + return self._get_obj(self._call(self._urls["collections"], urlencode(params))) + + def keywords(self, params): + """ + Search for movies. + :param params: + :return: + """ + return self._get_obj(self._call(self._urls["keywords"], urlencode(params))) + + def movies(self, params): + """ + Search for movies. + :param params: + :return: + """ + return self._get_obj(self._call(self._urls["movies"], urlencode(params))) + + def multi(self, params): + """ + Search for movies. + :param params: + :return: + """ + return self._get_obj(self._call(self._urls["multi"], urlencode(params))) + + def people(self, params): + """ + Search for movies. + :param params: + :return: + """ + return self._get_obj(self._call(self._urls["people"], urlencode(params))) + + def tv_shows(self, params): + """ + Search for movies. + :param params: + :return: + """ + return self._get_obj(self._call(self._urls["tv_shows"], urlencode(params))) diff --git a/app/media/tmdbv3api/objs/trending.py b/app/media/tmdbv3api/objs/trending.py new file mode 100644 index 0000000..e181b3f --- /dev/null +++ b/app/media/tmdbv3api/objs/trending.py @@ -0,0 +1,77 @@ +from app.media.tmdbv3api.tmdb import TMDb + + +class Trending(TMDb): + _urls = {"trending": "/trending/%s/%s"} + + def _trending(self, media_type="all", time_window="day", page=1): + return self._get_obj( + self._call( + self._urls["trending"] % (media_type, time_window), + "page=%s" % page + ) + ) + + def all_day(self, page=1): + """ + Get all daily trending + :param page: int + :return: + """ + return self._trending(media_type="all", time_window="day", page=page) + + def all_week(self, page=1): + """ + Get all weekly trending + :param page: int + :return: + """ + return self._trending(media_type="all", time_window="week", page=page) + + def movie_day(self, page=1): + """ + Get movie daily trending + :param page: int + :return: + """ + return self._trending(media_type="movie", time_window="day", page=page) + + def movie_week(self, page=1): + """ + Get movie weekly trending + :param page: int + :return: + """ + return self._trending(media_type="movie", time_window="week", page=page) + + def tv_day(self, page=1): + """ + Get tv daily trending + :param page: int + :return: + """ + return self._trending(media_type="tv", time_window="day", page=page) + + def tv_week(self, page=1): + """ + Get tv weekly trending + :param page: int + :return: + """ + return self._trending(media_type="tv", time_window="week", page=page) + + def person_day(self, page=1): + """ + Get person daily trending + :param page: int + :return: + """ + return self._trending(media_type="person", time_window="day", page=page) + + def person_week(self, page=1): + """ + Get person weekly trending + :param page: int + :return: + """ + return self._trending(media_type="person", time_window="week", page=page) diff --git a/app/media/tmdbv3api/objs/tv.py b/app/media/tmdbv3api/objs/tv.py new file mode 100644 index 0000000..fb9d8ed --- /dev/null +++ b/app/media/tmdbv3api/objs/tv.py @@ -0,0 +1,241 @@ +from app.media.tmdbv3api.as_obj import AsObj +from app.media.tmdbv3api.tmdb import TMDb + +try: + from urllib import quote +except ImportError: + from urllib.parse import quote + + +class TV(TMDb): + _urls = { + "details": "/tv/%s", + "latest": "/tv/latest", + "search_tv": "/search/tv", + "popular": "/tv/popular", + "top_rated": "/tv/top_rated", + "similar": "/tv/%s/similar", + "recommendations": "/tv/%s/recommendations", + "videos": "/tv/%s/videos", + "airing_today": "/tv/airing_today", + "on_the_air": "/tv/on_the_air", + "screened_theatrically": "/tv/%s/screened_theatrically", + "external_ids": "/tv/%s/external_ids", + "reviews": "/tv/%s/reviews", + "keywords": "/tv/%s/keywords", + "watch_providers": "/tv/%s/watch/providers", + "translations": "/tv/%s/translations", + "season_details": "/tv/%s/season/%s", + "alternative_titles": "/tv/%s/alternative_titles", + "credits": "/tv/%s/credits", + "discover": "/discover/tv", + "images": "/tv/%s/images" + } + + def details( + self, show_id, append_to_response="" + ): + """ + Get the primary TV show details by id. + :param show_id: + :param append_to_response: + :return: + """ + if append_to_response == "all": + append_to_response = "images,credits,alternative_titles,translations,external_ids" + elif append_to_response is None: + append_to_response = "alternative_titles,translations,external_ids" + return AsObj( + **self._call( + self._urls["details"] % str(show_id), + "append_to_response=" + append_to_response, + ) + ) + + def latest(self): + """ + Get the most newly created TV show. This is a live response and will continuously change. + :return: + """ + return AsObj(**self._call(self._urls["latest"], "")) + + def search(self, term, page=1): + """ + Search for a TV show. + :param term: + :param page: + :return: + """ + return self._get_obj( + self._call( + self._urls["search_tv"], "query=" + quote(term) + "&page=" + str(page) + ) + ) + + def similar(self, tv_id, page=1): + """ + Get the primary TV show details by id. + :param tv_id: + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["similar"] % str(tv_id), "page=" + str(page)) + ) + + def popular(self, page=1): + """ + Get a list of the current popular TV shows on TMDb. This list updates daily. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["popular"], "page=" + str(page))) + + def top_rated(self, page=1): + """ + Get a list of the top rated TV shows on TMDb. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["top_rated"], "page=" + str(page))) + + def recommendations(self, tv_id, page=1): + """ + Get the list of TV show recommendations for this item. + :param tv_id: + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["recommendations"] % tv_id, "page=" + str(page)) + ) + + def videos(self, tv_id, page=1): + """ + Get the videos that have been added to a TV show. + :param tv_id: + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["videos"] % tv_id, "page=" + str(page)) + ) + + def airing_today(self, page=1): + """ + Get a list of TV shows that are airing today. + This query is purely day based as we do not currently support airing times. + :param page: + :return: + """ + return self._get_obj( + self._call(self._urls["airing_today"], "page=" + str(page)) + ) + + def on_the_air(self, page=1): + """ + Get a list of shows that are currently on the air. + :param page: + :return: + """ + return self._get_obj(self._call(self._urls["on_the_air"], "page=" + str(page))) + + def screened_theatrically(self, tv_id): + """ + Get a list of seasons or episodes that have been screened in a film festival or theatre. + :param tv_id: + :return: + """ + return self._get_obj( + self._call(self._urls["screened_theatrically"] % tv_id, "") + ) + + def external_ids(self, vid): + """ + Get the external ids for a TV show. + :param vid: + :return: + """ + return self._get_obj( + self._call(self._urls["external_ids"] % (str(vid)), ""), None + ) + + def keywords(self, tv_id): + """ + Get the keywords that have been added to a TV show. + :param tv_id: int + :return: + """ + return self._get_obj(self._call(self._urls["keywords"] % tv_id, "")) + + def reviews(self, tv_id, page=1): + """ + Get the reviews for a TV show. + :param page: int + :param tv_id: int + :return: + """ + return self._get_obj( + self._call(self._urls["reviews"] % tv_id, "page=" + str(page)) + ) + + def watch_providers(self, tv_id): + """ + Get the Watch Providers for a TV show. + :param tv_id: + :return: + """ + return AsObj(**self._call(self._urls["watch_providers"] % tv_id, "")) + + def translations(self, tv_id): + """ + Get the translations for a TV show. + :param tv_id: tvid + :return: + """ + return AsObj(**self._call(self._urls["translations"] % tv_id, "")) + + def season_details(self, tv_id, season_number): + """ + Get the Season Detail for a TV show. + :param tv_id: tmdbid + :param season_number: season number + :return: + """ + return AsObj(**self._call(self._urls["season_details"] % (tv_id, season_number), "")) + + def alternative_titles(self, tv_id): + """ + Get all of the alternative titles for a TV show. + :param tv_id: + :return: + """ + return AsObj(**self._call(self._urls["alternative_titles"] % tv_id, "")) + + def credits(self, tv_id): + """ + Get the cast and crew for a TV show. + :param tv_id: + :return: + """ + return AsObj(**self._call(self._urls["credits"] % tv_id, "")) + + def discover(self, page): + """ + Tv discover. + :param page: + :return: + """ + return AsObj(**self._call(self._urls["discover"], "page=" + str(page))) + + def images(self, tv_id, include_image_language=""): + """ + Get the images that belong to a movie. + Querying images with a language parameter will filter the results. + If you want to include a fallback language (especially useful for backdrops) you can use the include_image_language parameter. + This should be a comma seperated value like so: include_image_language=en,null. + :param tv_id: + :param include_image_language: + :return: + """ + return AsObj(**self._call(self._urls['images'] % tv_id, "include_image_language=" + include_image_language)) diff --git a/app/media/tmdbv3api/tmdb.py b/app/media/tmdbv3api/tmdb.py new file mode 100644 index 0000000..04a19e8 --- /dev/null +++ b/app/media/tmdbv3api/tmdb.py @@ -0,0 +1,205 @@ +# -*- coding: utf-8 -*- + +import logging +import os +import time +from functools import lru_cache + +import requests +import requests.exceptions + +from .as_obj import AsObj +from .exceptions import TMDbException + +logger = logging.getLogger(__name__) + + +class TMDb(object): + TMDB_API_KEY = "TMDB_API_KEY" + TMDB_LANGUAGE = "TMDB_LANGUAGE" + TMDB_WAIT_ON_RATE_LIMIT = "TMDB_WAIT_ON_RATE_LIMIT" + TMDB_DEBUG_ENABLED = "TMDB_DEBUG_ENABLED" + TMDB_CACHE_ENABLED = "TMDB_CACHE_ENABLED" + TMDB_PROXIES = "TMDB_PROXIES" + TMDB_DOMAIN = "TMDB_DOMAIN" + REQUEST_CACHE_MAXSIZE = 256 + + def __init__(self, obj_cached=True, session=None): + self._session = requests.Session() if session is None else session + self._remaining = 40 + self._reset = None + self.obj_cached = obj_cached + if os.environ.get(self.TMDB_LANGUAGE) is None: + os.environ[self.TMDB_LANGUAGE] = "zh-CN" + if not os.environ.get(self.TMDB_DOMAIN): + os.environ[self.TMDB_DOMAIN] = "https://api.themoviedb.org/3" + + @property + def page(self): + return os.environ["page"] + + @property + def total_results(self): + return os.environ["total_results"] + + @property + def total_pages(self): + return os.environ["total_pages"] + + @property + def api_key(self): + return os.environ.get(self.TMDB_API_KEY) + + @property + def domain(self): + return os.environ.get(self.TMDB_DOMAIN) + + @domain.setter + def domain(self, domain): + if domain: + if not str(domain).startswith('http'): + domain = "https://%s" % domain + if not str(domain).endswith('/3'): + domain = "%s/3" % domain + os.environ[self.TMDB_DOMAIN] = str(domain) + else: + os.environ[self.TMDB_DOMAIN] = '' + + @property + def proxies(self): + return os.environ.get(self.TMDB_PROXIES) + + @proxies.setter + def proxies(self, proxies): + if proxies: + proxies_strs = [] + for key, value in proxies.items(): + if not value: + continue + proxies_strs.append("'%s': '%s'" % (key, value)) + if proxies_strs: + os.environ[self.TMDB_PROXIES] = "{%s}" % ",".join(proxies_strs) + else: + os.environ[self.TMDB_PROXIES] = 'None' + + @api_key.setter + def api_key(self, api_key): + os.environ[self.TMDB_API_KEY] = str(api_key) + + @property + def language(self): + return os.environ.get(self.TMDB_LANGUAGE) + + @language.setter + def language(self, language): + os.environ[self.TMDB_LANGUAGE] = language + + @property + def wait_on_rate_limit(self): + if os.environ.get(self.TMDB_WAIT_ON_RATE_LIMIT) == "False": + return False + else: + return True + + @wait_on_rate_limit.setter + def wait_on_rate_limit(self, wait_on_rate_limit): + os.environ[self.TMDB_WAIT_ON_RATE_LIMIT] = str(wait_on_rate_limit) + + @property + def debug(self): + if os.environ.get(self.TMDB_DEBUG_ENABLED) == "True": + return True + else: + return False + + @debug.setter + def debug(self, debug): + os.environ[self.TMDB_DEBUG_ENABLED] = str(debug) + + @property + def cache(self): + if os.environ.get(self.TMDB_CACHE_ENABLED) == "False": + return False + else: + return True + + @cache.setter + def cache(self, cache): + os.environ[self.TMDB_CACHE_ENABLED] = str(cache) + + @staticmethod + def _get_obj(result, key="results", all_details=False): + if "success" in result and result["success"] is False: + raise TMDbException(result["status_message"]) + if all_details is True or key is None: + return AsObj(**result) + else: + return [AsObj(**res) for res in result[key]] + + @staticmethod + @lru_cache(maxsize=REQUEST_CACHE_MAXSIZE) + def cached_request(method, url, data, proxies): + return requests.request(method, url, data=data, proxies=eval(proxies), verify=False, timeout=10) + + def cache_clear(self): + return self.cached_request.cache_clear() + + def _call( + self, action, append_to_response, call_cached=True, method="GET", data=None + ): + if self.api_key is None or self.api_key == "": + raise TMDbException("No API key found.") + + url = "%s%s?api_key=%s&%s&language=%s" % ( + self.domain, + action, + self.api_key, + append_to_response, + self.language, + ) + + if self.cache and self.obj_cached and call_cached and method != "POST": + req = self.cached_request(method, url, data, self.proxies) + else: + req = self._session.request(method, url, data=data, proxies=eval(self.proxies), timeout=10, verify=False) + + headers = req.headers + + if "X-RateLimit-Remaining" in headers: + self._remaining = int(headers["X-RateLimit-Remaining"]) + + if "X-RateLimit-Reset" in headers: + self._reset = int(headers["X-RateLimit-Reset"]) + + if self._remaining < 1: + current_time = int(time.time()) + sleep_time = self._reset - current_time + + if self.wait_on_rate_limit: + logger.warning("Rate limit reached. Sleeping for: %d" % sleep_time) + time.sleep(abs(sleep_time)) + self._call(action, append_to_response, call_cached, method, data) + else: + raise TMDbException( + "Rate limit reached. Try again in %d seconds." % sleep_time + ) + + json = req.json() + + if "page" in json: + os.environ["page"] = str(json["page"]) + + if "total_results" in json: + os.environ["total_results"] = str(json["total_results"]) + + if "total_pages" in json: + os.environ["total_pages"] = str(json["total_pages"]) + + if self.debug: + logger.info(json) + logger.info(self.cached_request.cache_info()) + + if "errors" in json: + raise TMDbException(json["errors"]) + + return json diff --git a/app/mediaserver/__init__.py b/app/mediaserver/__init__.py new file mode 100644 index 0000000..7e2ca7b --- /dev/null +++ b/app/mediaserver/__init__.py @@ -0,0 +1,2 @@ +from .media_server import MediaServer +from .webhook_event import WebhookEvent diff --git a/app/mediaserver/client/__init__.py b/app/mediaserver/client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/mediaserver/client/_base.py b/app/mediaserver/client/_base.py new file mode 100644 index 0000000..7674beb --- /dev/null +++ b/app/mediaserver/client/_base.py @@ -0,0 +1,108 @@ +from abc import ABCMeta, abstractmethod + + +class _IMediaClient(metaclass=ABCMeta): + + @abstractmethod + def match(self, ctype): + """ + 匹配实例 + """ + pass + + @abstractmethod + def get_status(self): + """ + 检查连通性 + """ + pass + + @abstractmethod + def get_user_count(self): + """ + 获得用户数量 + """ + pass + + @abstractmethod + def get_activity_log(self, num): + """ + 获取Emby活动记录 + """ + pass + + @abstractmethod + def get_medias_count(self): + """ + 获得电影、电视剧、动漫媒体数量 + :return: MovieCount SeriesCount SongCount + """ + pass + + @abstractmethod + def get_movies(self, title, year): + """ + 根据标题和年份,检查电影是否在存在,存在则返回列表 + :param title: 标题 + :param year: 年份,可以为空,为空时不按年份过滤 + :return: 含title、year属性的字典列表 + """ + pass + + @abstractmethod + def get_no_exists_episodes(self, meta_info, season, total_num): + """ + 根据标题、年份、季、总集数,查询缺少哪几集 + :param meta_info: 已识别的需要查询的媒体信息 + :param season: 季号,数字 + :param total_num: 该季的总集数 + :return: 该季不存在的集号列表 + """ + pass + + @abstractmethod + def get_image_by_id(self, item_id, image_type): + """ + 根据ItemId查询图片地址 + :param item_id: 在服务器中的ID + :param image_type: 图片的类弄地,poster或者backdrop等 + :return: 图片对应在TMDB中的URL + """ + pass + + @abstractmethod + def refresh_root_library(self): + """ + 刷新整个媒体库 + """ + pass + + @abstractmethod + def refresh_library_by_items(self, items): + """ + 按类型、名称、年份来刷新媒体库 + :param items: 已识别的需要刷新媒体库的媒体信息列表 + """ + pass + + @abstractmethod + def get_libraries(self): + """ + 获取媒体服务器所有媒体库列表 + """ + pass + + @abstractmethod + def get_items(self, parent): + """ + 获取媒体库中的所有媒体 + :param parent: 上一级的ID + """ + pass + + @abstractmethod + def get_playing_sessions(self): + """ + 获取正在播放的会话 + """ + pass diff --git a/app/mediaserver/client/emby.py b/app/mediaserver/client/emby.py new file mode 100644 index 0000000..8da8720 --- /dev/null +++ b/app/mediaserver/client/emby.py @@ -0,0 +1,492 @@ +import os +import re + +import log +from config import Config +from app.mediaserver.client._base import _IMediaClient +from app.utils import RequestUtils, SystemUtils, ExceptionUtils +from app.utils.types import MediaType, MediaServerType + + +class Emby(_IMediaClient): + schema = "emby" + server_type = MediaServerType.EMBY.value + _client_config = {} + + _apikey = None + _host = None + _user = None + _libraries = [] + + def __init__(self, config=None): + if config: + self._client_config = config + else: + self._client_config = Config().get_config('emby') + self.init_config() + + def init_config(self): + if self._client_config: + self._host = self._client_config.get('host') + if self._host: + if not self._host.startswith('http'): + self._host = "http://" + self._host + if not self._host.endswith('/'): + self._host = self._host + "/" + self._apikey = self._client_config.get('api_key') + if self._host and self._apikey: + self._libraries = self.__get_emby_librarys() + self._user = self.get_admin_user() + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.server_type] else False + + def get_status(self): + """ + 测试连通性 + """ + return True if self.get_medias_count() else False + + def __get_emby_librarys(self): + """ + 获取Emby媒体库列表 + """ + if not self._host or not self._apikey: + return [] + req_url = "%semby/Library/SelectableMediaFolders?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + log.error(f"【{self.server_type}】Library/SelectableMediaFolders 未获取到返回数据") + return [] + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Library/SelectableMediaFolders 出错:" + str(e)) + return [] + + def get_admin_user(self): + """ + 获得管理员用户 + """ + if not self._host or not self._apikey: + return None + req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + users = res.json() + for user in users: + if user.get("Policy", {}).get("IsAdministrator"): + return user.get("Id") + else: + log.error(f"【{self.server_type}】Users 未获取到返回数据") + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Users出错:" + str(e)) + return None + + def get_user_count(self): + """ + 获得用户数量 + """ + if not self._host or not self._apikey: + return 0 + req_url = "%semby/Users/Query?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json().get("TotalRecordCount") + else: + log.error(f"【{self.server_type}】Users/Query 未获取到返回数据") + return 0 + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Users/Query出错:" + str(e)) + return 0 + + def get_activity_log(self, num): + """ + 获取Emby活动记录 + """ + if not self._host or not self._apikey: + return [] + req_url = "%semby/System/ActivityLog/Entries?api_key=%s&" % (self._host, self._apikey) + ret_array = [] + try: + res = RequestUtils().get_res(req_url) + if res: + ret_json = res.json() + items = ret_json.get('Items') + for item in items: + if item.get("Type") == "AuthenticationSucceeded": + event_type = "LG" + event_date = SystemUtils.get_local_time(item.get("Date")) + event_str = "%s, %s" % (item.get("Name"), item.get("ShortOverview")) + activity = {"type": event_type, "event": event_str, "date": event_date} + ret_array.append(activity) + if item.get("Type") == "VideoPlayback": + event_type = "PL" + event_date = SystemUtils.get_local_time(item.get("Date")) + event_str = item.get("Name") + activity = {"type": event_type, "event": event_str, "date": event_date} + ret_array.append(activity) + else: + log.error(f"【{self.server_type}】System/ActivityLog/Entries 未获取到返回数据") + return [] + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接System/ActivityLog/Entries出错:" + str(e)) + return [] + return ret_array[:num] + + def get_medias_count(self): + """ + 获得电影、电视剧、动漫媒体数量 + :return: MovieCount SeriesCount SongCount + """ + if not self._host or not self._apikey: + return {} + req_url = "%semby/Items/Counts?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + log.error(f"【{self.server_type}】Items/Counts 未获取到返回数据") + return {} + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items/Counts出错:" + str(e)) + return {} + + def __get_emby_series_id_by_name(self, name, year): + """ + 根据名称查询Emby中剧集的SeriesId + :param name: 标题 + :param year: 年份 + :return: None 表示连不通,""表示未找到,找到返回ID + """ + if not self._host or not self._apikey: + return None + req_url = "%semby/Items?IncludeItemTypes=Series&Fields=ProductionYear&StartIndex=0&Recursive=true&SearchTerm=%s&Limit=10&IncludeSearchTypes=false&api_key=%s" % ( + self._host, name, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + for res_item in res_items: + if res_item.get('Name') == name and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + return res_item.get('Id') + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items出错:" + str(e)) + return None + return "" + + def get_movies(self, title, year=None): + """ + 根据标题和年份,检查电影是否在Emby中存在,存在则返回列表 + :param title: 标题 + :param year: 年份,可以为空,为空时不按年份过滤 + :return: 含title、year属性的字典列表 + """ + if not self._host or not self._apikey: + return None + req_url = "%semby/Items?IncludeItemTypes=Movie&Fields=ProductionYear&StartIndex=0&Recursive=true&SearchTerm=%s&Limit=10&IncludeSearchTypes=false&api_key=%s" % ( + self._host, title, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + ret_movies = [] + for res_item in res_items: + if res_item.get('Name') == title and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + ret_movies.append( + {'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))}) + return ret_movies + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items出错:" + str(e)) + return None + return [] + + def __get_emby_tv_episodes(self, title, year, tmdb_id=None, season=None): + """ + 根据标题和年份和季,返回Emby中的剧集列表 + :param title: 标题 + :param year: 年份,可以为空,为空时不按年份过滤 + :param tmdb_id: TMDBID + :param season: 季 + :return: 集号的列表 + """ + if not self._host or not self._apikey: + return None + # 电视剧 + item_id = self.__get_emby_series_id_by_name(title, year) + if item_id is None: + return None + if not item_id: + return [] + # 验证tmdbid是否相同 + item_tmdbid = self.get_iteminfo(item_id).get("ProviderIds", {}).get("Tmdb") + if tmdb_id and item_tmdbid: + if str(tmdb_id) != str(item_tmdbid): + return [] + # /Shows/Id/Episodes 查集的信息 + if not season: + season = 1 + req_url = "%semby/Shows/%s/Episodes?Season=%s&IsMissing=false&api_key=%s" % ( + self._host, item_id, season, self._apikey) + try: + res_json = RequestUtils().get_res(req_url) + if res_json: + res_items = res_json.json().get("Items") + exists_episodes = [] + for res_item in res_items: + exists_episodes.append(int(res_item.get("IndexNumber"))) + return exists_episodes + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Shows/Id/Episodes出错:" + str(e)) + return None + return [] + + def get_no_exists_episodes(self, meta_info, season, total_num): + """ + 根据标题、年份、季、总集数,查询Emby中缺少哪几集 + :param meta_info: 已识别的需要查询的媒体信息 + :param season: 季号,数字 + :param total_num: 该季的总集数 + :return: 该季不存在的集号列表 + """ + if not self._host or not self._apikey: + return None + exists_episodes = self.__get_emby_tv_episodes(meta_info.title, meta_info.year, meta_info.tmdb_id, season) + if not isinstance(exists_episodes, list): + return None + total_episodes = [episode for episode in range(1, total_num + 1)] + return list(set(total_episodes).difference(set(exists_episodes))) + + def get_image_by_id(self, item_id, image_type): + """ + 根据ItemId从Emby查询图片地址 + :param item_id: 在Emby中的ID + :param image_type: 图片的类弄地,poster或者backdrop等 + :return: 图片对应在TMDB中的URL + """ + if not self._host or not self._apikey: + return None + req_url = "%semby/Items/%s/RemoteImages?api_key=%s" % (self._host, item_id, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + images = res.json().get("Images") + for image in images: + if image.get("ProviderName") == "TheMovieDb" and image.get("Type") == image_type: + return image.get("Url") + else: + log.error(f"【{self.server_type}】Items/RemoteImages 未获取到返回数据") + return None + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items/Id/RemoteImages出错:" + str(e)) + return None + return None + + def __refresh_emby_library_by_id(self, item_id): + """ + 通知Emby刷新一个项目的媒体库 + """ + if not self._host or not self._apikey: + return False + req_url = "%semby/Items/%s/Refresh?Recursive=true&api_key=%s" % (self._host, item_id, self._apikey) + try: + res = RequestUtils().post_res(req_url) + if res: + return True + else: + log.info(f"【{self.server_type}】刷新媒体库对象 {item_id} 失败,无法连接Emby!") + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items/Id/Refresh出错:" + str(e)) + return False + return False + + def refresh_root_library(self): + """ + 通知Emby刷新整个媒体库 + """ + if not self._host or not self._apikey: + return False + req_url = "%semby/Library/Refresh?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().post_res(req_url) + if res: + return True + else: + log.info(f"【{self.server_type}】刷新媒体库失败,无法连接Emby!") + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Library/Refresh出错:" + str(e)) + return False + return False + + def refresh_library_by_items(self, items): + """ + 按类型、名称、年份来刷新媒体库 + :param items: 已识别的需要刷新媒体库的媒体信息列表 + """ + if not items: + return + # 收集要刷新的媒体库信息 + log.info(f"【{self.server_type}】开始刷新Emby媒体库...") + library_ids = [] + for item in items: + if not item: + continue + library_id = self.__get_emby_library_id_by_item(item) + if library_id and library_id not in library_ids: + library_ids.append(library_id) + # 开始刷新媒体库 + if "/" in library_ids: + self.refresh_root_library() + return + for library_id in library_ids: + if library_id != "/": + self.__refresh_emby_library_by_id(library_id) + log.info(f"【{self.server_type}】Emby媒体库刷新完成") + + def __get_emby_library_id_by_item(self, item): + """ + 根据媒体信息查询在哪个媒体库,返回要刷新的位置的ID + :param item: 由title、year、type组成的字典 + """ + if not item.get("title") or not item.get("year") or not item.get("type"): + return None + if item.get("type") == MediaType.TV: + item_id = self.__get_emby_series_id_by_name(item.get("title"), item.get("year")) + if item_id: + # 存在电视剧,则直接刷新这个电视剧就行 + return item_id + else: + if self.get_movies(item.get("title"), item.get("year")): + # 已存在,不用刷新 + return None + # 查找需要刷新的媒体库ID + for library in self._libraries: + # 找同级路径最多的媒体库(要求容器内映射路径与实际一致) + max_equal_path_id = None + max_path_len = 0 + equal_path_num = 0 + for folder in library.get("SubFolders"): + path_list = re.split(pattern='/+|\\\\+', string=folder.get("Path")) + if item.get("category") != path_list[-1]: + continue + try: + path_len = len(os.path.commonpath([item.get("target_path"), folder.get("Path")])) + if path_len >= max_path_len: + max_path_len = path_len + max_equal_path_id = folder.get("Id") + equal_path_num += 1 + except Exception as err: + ExceptionUtils.exception_traceback(err) + continue + if max_equal_path_id: + return max_equal_path_id if equal_path_num == 1 else library.get("Id") + # 如果找不到,只要路径中有分类目录名就命中 + for folder in library.get("SubFolders"): + if folder.get("Path") and re.search(r"[/\\]%s" % item.get("category"), folder.get("Path")): + return library.get("Id") + # 刷新根目录 + return "/" + + def get_libraries(self): + """ + 获取媒体服务器所有媒体库列表 + """ + if self._host and self._apikey: + self._libraries = self.__get_emby_librarys() + libraries = [] + for library in self._libraries: + libraries.append({"id": library.get("Id"), "name": library.get("Name")}) + return libraries + + def get_iteminfo(self, itemid): + """ + 获取单个项目详情 + """ + if not itemid: + return {} + if not self._host or not self._apikey: + return {} + req_url = "%semby/Users/%s/Items/%s?api_key=%s" % (self._host, self._user, itemid, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res and res.status_code == 200: + return res.json() + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {} + + def get_items(self, parent): + """ + 获取媒体服务器所有媒体库列表 + """ + if not parent: + yield {} + if not self._host or not self._apikey: + yield {} + req_url = "%semby/Users/%s/Items?ParentId=%s&api_key=%s" % (self._host, self._user, parent, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res and res.status_code == 200: + results = res.json().get("Items") or [] + for result in results: + if not result: + continue + if result.get("Type") in ["Movie", "Series"]: + item_info = self.get_iteminfo(result.get("Id")) + yield {"id": result.get("Id"), + "library": item_info.get("ParentId"), + "type": item_info.get("Type"), + "title": item_info.get("Name"), + "originalTitle": item_info.get("OriginalTitle"), + "year": item_info.get("ProductionYear"), + "tmdbid": item_info.get("ProviderIds", {}).get("Tmdb"), + "imdbid": item_info.get("ProviderIds", {}).get("Imdb"), + "path": item_info.get("Path"), + "json": str(item_info)} + elif "Folder" in result.get("Type"): + for item in self.get_items(parent=result.get('Id')): + yield item + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Users/Items出错:" + str(e)) + yield {} + + def get_playing_sessions(self): + """ + 获取正在播放的会话 + """ + if not self._host or not self._apikey: + return [] + playing_sessions = [] + req_url = "%semby/Sessions?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res and res.status_code == 200: + sessions = res.json() + for session in sessions: + if session.get("NowPlayingItem"): + playing_sessions.append(session) + return playing_sessions + except Exception as e: + ExceptionUtils.exception_traceback(e) + return [] diff --git a/app/mediaserver/client/jellyfin.py b/app/mediaserver/client/jellyfin.py new file mode 100644 index 0000000..4d511fd --- /dev/null +++ b/app/mediaserver/client/jellyfin.py @@ -0,0 +1,424 @@ +import re + +import log +from config import Config +from app.mediaserver.client._base import _IMediaClient +from app.utils.types import MediaServerType +from app.utils import RequestUtils, SystemUtils, ExceptionUtils + + +class Jellyfin(_IMediaClient): + schema = "jellyfin" + server_type = MediaServerType.JELLYFIN.value + _client_config = {} + + _apikey = None + _host = None + _user = None + _libraries = [] + + def __init__(self, config=None): + if config: + self._client_config = config + else: + self._client_config = Config().get_config('jellyfin') + self.init_config() + + def init_config(self): + if self._client_config: + self._host = self._client_config.get('host') + if self._host: + if not self._host.startswith('http'): + self._host = "http://" + self._host + if not self._host.endswith('/'): + self._host = self._host + "/" + self._apikey = self._client_config.get('api_key') + if self._host and self._apikey: + self._user = self.get_admin_user() + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.server_type] else False + + def get_status(self): + """ + 测试连通性 + """ + return True if self.get_medias_count() else False + + def __get_jellyfin_librarys(self): + """ + 获取Jellyfin媒体库的信息 + """ + if not self._host or not self._apikey: + return [] + req_url = "%sLibrary/VirtualFolders?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + log.error(f"【{self.server_type}】Library/VirtualFolders 未获取到返回数据") + return [] + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Library/VirtualFolders 出错:" + str(e)) + return [] + + def get_user_count(self): + """ + 获得用户数量 + """ + if not self._host or not self._apikey: + return 0 + req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return len(res.json()) + else: + log.error(f"【{self.server_type}】Users 未获取到返回数据") + return 0 + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Users出错:" + str(e)) + return 0 + + def get_admin_user(self): + """ + 获得管理员用户 + """ + if not self._host or not self._apikey: + return None + req_url = "%sUsers?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + users = res.json() + for user in users: + if user.get("Policy", {}).get("IsAdministrator"): + return user.get("Id") + else: + log.error(f"【{self.server_type}】Users 未获取到返回数据") + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Users出错:" + str(e)) + return None + + def get_activity_log(self, num): + """ + 获取Jellyfin活动记录 + """ + if not self._host or not self._apikey: + return [] + req_url = "%sSystem/ActivityLog/Entries?api_key=%s&Limit=%s" % (self._host, self._apikey, num) + ret_array = [] + try: + res = RequestUtils().get_res(req_url) + if res: + ret_json = res.json() + items = ret_json.get('Items') + for item in items: + if item.get("Type") == "SessionStarted": + event_type = "LG" + event_date = re.sub(r'\dZ', 'Z', item.get("Date")) + event_str = "%s, %s" % (item.get("Name"), item.get("ShortOverview")) + activity = {"type": event_type, "event": event_str, + "date": SystemUtils.get_local_time(event_date)} + ret_array.append(activity) + if item.get("Type") == "VideoPlayback": + event_type = "PL" + event_date = re.sub(r'\dZ', 'Z', item.get("Date")) + activity = {"type": event_type, "event": item.get("Name"), + "date": SystemUtils.get_local_time(event_date)} + ret_array.append(activity) + else: + log.error(f"【{self.server_type}】System/ActivityLog/Entries 未获取到返回数据") + return [] + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接System/ActivityLog/Entries出错:" + str(e)) + return [] + return ret_array + + def get_medias_count(self): + """ + 获得电影、电视剧、动漫媒体数量 + :return: MovieCount SeriesCount SongCount + """ + if not self._host or not self._apikey: + return None + req_url = "%sItems/Counts?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + return res.json() + else: + log.error(f"【{self.server_type}】Items/Counts 未获取到返回数据") + return {} + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items/Counts出错:" + str(e)) + return {} + + def __get_jellyfin_series_id_by_name(self, name, year): + """ + 根据名称查询Jellyfin中剧集的SeriesId + """ + if not self._host or not self._apikey or not self._user: + return None + req_url = "%sUsers/%s/Items?api_key=%s&searchTerm=%s&IncludeItemTypes=Series&Limit=10&Recursive=true" % ( + self._host, self._user, self._apikey, name) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + for res_item in res_items: + if res_item.get('Name') == name and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + return res_item.get('Id') + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items出错:" + str(e)) + return None + return "" + + def __get_jellyfin_season_id_by_name(self, name, year, season): + """ + 根据名称查询Jellyfin中剧集和季对应季的Id + """ + if not self._host or not self._apikey or not self._user: + return None, None + series_id = self.__get_jellyfin_series_id_by_name(name, year) + if series_id is None: + return None, None + if not series_id: + return "", "" + if not season: + season = 1 + req_url = "%sShows/%s/Seasons?api_key=%s&userId=%s" % ( + self._host, series_id, self._apikey, self._user) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + for res_item in res_items: + if int(res_item.get('IndexNumber')) == int(season): + return series_id, res_item.get('Id') + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Shows/Id/Seasons出错:" + str(e)) + return None, None + return "", "" + + def get_movies(self, title, year=None): + """ + 根据标题和年份,检查电影是否在Jellyfin中存在,存在则返回列表 + :param title: 标题 + :param year: 年份,为空则不过滤 + :return: 含title、year属性的字典列表 + """ + if not self._host or not self._apikey or not self._user: + return None + req_url = "%sUsers/%s/Items?api_key=%s&searchTerm=%s&IncludeItemTypes=Movie&Limit=10&Recursive=true" % ( + self._host, self._user, self._apikey, title) + try: + res = RequestUtils().get_res(req_url) + if res: + res_items = res.json().get("Items") + if res_items: + ret_movies = [] + for res_item in res_items: + if res_item.get('Name') == title and ( + not year or str(res_item.get('ProductionYear')) == str(year)): + ret_movies.append( + {'title': res_item.get('Name'), 'year': str(res_item.get('ProductionYear'))}) + return ret_movies + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items出错:" + str(e)) + return None + return [] + + def __get_jellyfin_tv_episodes(self, title, year=None, tmdb_id=None, season=None): + """ + 根据标题和年份和季,返回Jellyfin中的剧集列表 + :param title: 标题 + :param year: 年份,可以为空,为空时不按年份过滤 + :param tmdb_id: TMDBID + :param season: 季 + :return: 集号的列表 + """ + if not self._host or not self._apikey or not self._user: + return None + # 电视剧 + series_id, season_id = self.__get_jellyfin_season_id_by_name(title, year, season) + if series_id is None or season_id is None: + return None + if not series_id or not season_id: + return [] + # 验证tmdbid是否相同 + item_tmdbid = self.get_iteminfo(series_id).get("ProviderIds", {}).get("Tmdb") + if tmdb_id and item_tmdbid: + if str(tmdb_id) != str(item_tmdbid): + return [] + req_url = "%sShows/%s/Episodes?seasonId=%s&&userId=%s&isMissing=false&api_key=%s" % ( + self._host, series_id, season_id, self._user, self._apikey) + try: + res_json = RequestUtils().get_res(req_url) + if res_json: + res_items = res_json.json().get("Items") + exists_episodes = [] + for res_item in res_items: + exists_episodes.append(int(res_item.get("IndexNumber"))) + return exists_episodes + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Shows/Id/Episodes出错:" + str(e)) + return None + return [] + + def get_no_exists_episodes(self, meta_info, season, total_num): + """ + 根据标题、年份、季、总集数,查询Jellyfin中缺少哪几集 + :param meta_info: 已识别的需要查询的媒体信息 + :param season: 季号,数字 + :param total_num: 该季的总集数 + :return: 该季不存在的集号列表 + """ + if not self._host or not self._apikey: + return None + exists_episodes = self.__get_jellyfin_tv_episodes(meta_info.title, meta_info.year, meta_info.tmdb_id, season) + if not isinstance(exists_episodes, list): + return None + total_episodes = [episode for episode in range(1, total_num + 1)] + return list(set(total_episodes).difference(set(exists_episodes))) + + def get_image_by_id(self, item_id, image_type): + """ + 根据ItemId从Jellyfin查询图片地址 + :param item_id: 在Emby中的ID + :param image_type: 图片的类弄地,poster或者backdrop等 + :return: 图片对应在TMDB中的URL + """ + if not self._host or not self._apikey: + return None + req_url = "%sItems/%s/RemoteImages?api_key=%s" % (self._host, item_id, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res: + images = res.json().get("Images") + for image in images: + if image.get("ProviderName") == "TheMovieDb" and image.get("Type") == image_type: + return image.get("Url") + else: + log.error(f"【{self.server_type}】Items/RemoteImages 未获取到返回数据") + return None + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Items/Id/RemoteImages出错:" + str(e)) + return None + return None + + def refresh_root_library(self): + """ + 通知Jellyfin刷新整个媒体库 + """ + if not self._host or not self._apikey: + return False + req_url = "%sLibrary/Refresh?api_key=%s" % (self._host, self._apikey) + try: + res = RequestUtils().post_res(req_url) + if res: + return True + else: + log.info(f"【{self.server_type}】刷新媒体库失败,无法连接Jellyfin!") + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Library/Refresh出错:" + str(e)) + return False + + def refresh_library_by_items(self, items): + """ + 按类型、名称、年份来刷新媒体库,Jellyfin没有刷单个项目的API,这里直接刷新整库 + :param items: 已识别的需要刷新媒体库的媒体信息列表 + """ + # 没找到单项目刷新的对应的API,先按全库刷新 + if not items: + return False + if not self._host or not self._apikey: + return False + return self.refresh_root_library() + + def get_libraries(self): + """ + 获取媒体服务器所有媒体库列表 + """ + if self._host and self._apikey: + self._libraries = self.__get_jellyfin_librarys() + libraries = [] + for library in self._libraries: + libraries.append({"id": library.get("ItemId"), "name": library.get("Name")}) + return libraries + + def get_iteminfo(self, itemid): + """ + 获取单个项目详情 + """ + if not itemid: + return {} + if not self._host or not self._apikey: + return {} + req_url = "%sUsers/%s/Items/%s?api_key=%s" % ( + self._host, self._user, itemid, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res and res.status_code == 200: + return res.json() + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {} + + def get_items(self, parent): + """ + 获取媒体服务器所有媒体库列表 + """ + if not parent: + yield {} + if not self._host or not self._apikey: + yield {} + req_url = "%sUsers/%s/Items?parentId=%s&api_key=%s" % (self._host, self._user, parent, self._apikey) + try: + res = RequestUtils().get_res(req_url) + if res and res.status_code == 200: + results = res.json().get("Items") or [] + for result in results: + if not result: + continue + if result.get("Type") in ["Movie", "Series"]: + item_info = self.get_iteminfo(result.get("Id")) + yield {"id": result.get("Id"), + "library": item_info.get("ParentId"), + "type": item_info.get("Type"), + "title": item_info.get("Name"), + "originalTitle": item_info.get("OriginalTitle"), + "year": item_info.get("ProductionYear"), + "tmdbid": item_info.get("ProviderIds", {}).get("Tmdb"), + "imdbid": item_info.get("ProviderIds", {}).get("Imdb"), + "path": item_info.get("Path"), + "json": str(item_info)} + elif "Folder" in result.get("Type"): + for item in self.get_items(result.get("Id")): + yield item + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【{self.server_type}】连接Users/Items出错:" + str(e)) + yield {} + + def get_playing_sessions(self): + """ + 获取正在播放的会话 + """ + pass diff --git a/app/mediaserver/client/plex.py b/app/mediaserver/client/plex.py new file mode 100644 index 0000000..abc9fe5 --- /dev/null +++ b/app/mediaserver/client/plex.py @@ -0,0 +1,216 @@ +from app.utils import ExceptionUtils +from app.utils.types import MediaServerType + +import log +from config import Config +from app.mediaserver.client._base import _IMediaClient +from plexapi.myplex import MyPlexAccount +from plexapi.server import PlexServer + + +class Plex(_IMediaClient): + schema = "plex" + server_type = MediaServerType.PLEX.value + _client_config = {} + + _host = None + _token = None + _username = None + _password = None + _servername = None + _plex = None + _libraries = [] + + def __init__(self, config=None): + if config: + self._client_config = config + else: + self._client_config = Config().get_config('plex') + self.init_config() + + def init_config(self): + if self._client_config: + self._host = self._client_config.get('host') + self._token = self._client_config.get('token') + if self._host: + if not self._host.startswith('http'): + self._host = "http://" + self._host + if not self._host.endswith('/'): + self._host = self._host + "/" + self._username = self._client_config.get('username') + self._password = self._client_config.get('password') + self._servername = self._client_config.get('servername') + if self._host and self._token: + try: + self._plex = PlexServer(self._host, self._token) + except Exception as e: + ExceptionUtils.exception_traceback(e) + self._plex = None + log.error(f"【{self.server_type}】Plex服务器连接失败:{str(e)}") + elif self._username and self._password and self._servername: + try: + self._plex = MyPlexAccount(self._username, self._password).resource(self._servername).connect() + except Exception as e: + ExceptionUtils.exception_traceback(e) + self._plex = None + log.error(f"【{self.server_type}】Plex服务器连接失败:{str(e)}") + + @classmethod + def match(cls, ctype): + return True if ctype in [cls.schema, cls.server_type] else False + + def get_status(self): + """ + 测试连通性 + """ + return True if self._plex else False + + @staticmethod + def get_user_count(**kwargs): + """ + 获得用户数量,Plex只能配置一个用户,固定返回1 + """ + return 1 + + def get_activity_log(self, num): + """ + 获取Plex活动记录 + """ + if not self._plex: + return [] + ret_array = [] + historys = self._plex.library.history(num) + for his in historys: + event_type = "PL" + event_date = his.viewedAt.strftime('%Y-%m-%d %H:%M:%S') + event_str = "开始播放 %s" % his.title + activity = {"type": event_type, "event": event_str, "date": event_date} + ret_array.append(activity) + if ret_array: + ret_array = sorted(ret_array, key=lambda x: x['date'], reverse=True) + return ret_array + + def get_medias_count(self): + """ + 获得电影、电视剧、动漫媒体数量 + :return: MovieCount SeriesCount SongCount + """ + if not self._plex: + return {} + sections = self._plex.library.sections() + MovieCount = SeriesCount = SongCount = 0 + for sec in sections: + if sec.type == "movie": + MovieCount += sec.totalSize + if sec.type == "show": + SeriesCount += sec.totalSize + if sec.type == "artist": + SongCount += sec.totalSize + return {"MovieCount": MovieCount, "SeriesCount": SeriesCount, "SongCount": SongCount, "EpisodeCount": 0} + + def get_movies(self, title, year=None): + """ + 根据标题和年份,检查电影是否在Plex中存在,存在则返回列表 + :param title: 标题 + :param year: 年份,为空则不过滤 + :return: 含title、year属性的字典列表 + """ + if not self._plex: + return None + ret_movies = [] + if year: + movies = self._plex.library.search(title=title, year=year, libtype="movie") + else: + movies = self._plex.library.search(title=title, libtype="movie") + for movie in movies: + ret_movies.append({'title': movie.title, 'year': movie.year}) + return ret_movies + + # 根据标题、年份、季、总集数,查询Plex中缺少哪几集 + def get_no_exists_episodes(self, meta_info, season, total_num): + """ + 根据标题、年份、季、总集数,查询Plex中缺少哪几集 + :param meta_info: 已识别的需要查询的媒体信息 + :param season: 季号,数字 + :param total_num: 该季的总集数 + :return: 该季不存在的集号列表 + """ + if not self._plex: + return None + exists_episodes = [] + video = self._plex.library.search(title=meta_info.title, year=meta_info.year, libtype="show") + if video: + for episode in video[0].episodes(): + if episode.seasonNumber == season: + exists_episodes.append(episode.index) + total_episodes = [episode for episode in range(1, total_num + 1)] + return list(set(total_episodes).difference(set(exists_episodes))) + + @staticmethod + def get_image_by_id(**kwargs): + """ + 根据ItemId从Plex查询图片地址,该函数Plex下不使用 + """ + return None + + def refresh_root_library(self): + """ + 通知Plex刷新整个媒体库 + """ + if not self._plex: + return False + return self._plex.library.update() + + def refresh_library_by_items(self, items): + """ + 按类型、名称、年份来刷新媒体库,未找到对应的API,直接刷整库 + """ + if not self._plex: + return False + return self._plex.library.update() + + def get_libraries(self): + """ + 获取媒体服务器所有媒体库列表 + """ + if not self._plex: + return [] + try: + self._libraries = self._plex.library.sections() + except Exception as err: + ExceptionUtils.exception_traceback(err) + return [] + libraries = [] + for library in self._libraries: + libraries.append({"id": library.key, "name": library.title}) + return libraries + + def get_items(self, parent): + """ + 获取媒体服务器所有媒体库列表 + """ + if not parent: + yield {} + if not self._plex: + yield {} + try: + section = self._plex.library.sectionByID(parent) + if section: + for item in section.all(): + if not item: + continue + yield {"id": item.key, + "library": item.librarySectionID, + "type": item.type, + "title": item.title, + "year": item.year, + "json": str(item.__dict__)} + except Exception as err: + ExceptionUtils.exception_traceback(err) + yield {} + + def get_playing_sessions(self): + """ + 获取正在播放的会话 + """ + pass diff --git a/app/mediaserver/media_server.py b/app/mediaserver/media_server.py new file mode 100644 index 0000000..d0e011d --- /dev/null +++ b/app/mediaserver/media_server.py @@ -0,0 +1,246 @@ +import threading + +import log +from app.conf import ModuleConf +from app.db import MediaDb +from app.helper import ProgressHelper, SubmoduleHelper +from app.utils import ExceptionUtils +from app.utils.commons import singleton +from app.utils.types import MediaServerType +from config import Config + +lock = threading.Lock() +server_lock = threading.Lock() + + +@singleton +class MediaServer: + _mediaserver_schemas = [] + _server_type = None + _server = None + mediadb = None + progress = None + + def __init__(self): + self._mediaserver_schemas = SubmoduleHelper.import_submodules( + 'app.mediaserver.client', + filter_func=lambda _, obj: hasattr(obj, 'schema') + ) + log.debug(f"【MediaServer】加载媒体服务器:{self._mediaserver_schemas}") + self.init_config() + + def init_config(self): + self.mediadb = MediaDb() + self.progress = ProgressHelper() + # 当前使用的媒体库服务器 + _type = Config().get_config('media').get('media_server') or 'emby' + self._server_type = ModuleConf.MEDIASERVER_DICT.get(_type) + self._server = None + + def __build_class(self, ctype, conf): + for mediaserver_schema in self._mediaserver_schemas: + try: + if mediaserver_schema.match(ctype): + return mediaserver_schema(conf) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None + + @property + def server(self): + with server_lock: + if not self._server: + self._server = self.__get_server(self._server_type) + return self._server + + def __get_server(self, ctype: MediaServerType, conf=None): + return self.__build_class(ctype=ctype.value, conf=conf) + + def get_type(self): + """ + 当前使用的媒体库服务器 + """ + return self._server_type + + def get_activity_log(self, limit): + """ + 获取媒体服务器的活动日志 + :param limit: 条数限制 + """ + if not self.server: + return [] + return self.server.get_activity_log(limit) + + def get_user_count(self): + """ + 获取媒体服务器的总用户数 + """ + if not self.server: + return 0 + return self.server.get_user_count() + + def get_medias_count(self): + """ + 获取媒体服务器各类型的媒体库 + :return: MovieCount SeriesCount SongCount + """ + if not self.server: + return None + return self.server.get_medias_count() + + def refresh_root_library(self): + """ + 刷新媒体服务器整个媒体库 + """ + if not self.server: + return + return self.server.refresh_root_library() + + def get_image_by_id(self, item_id, image_type): + """ + 根据ItemId从媒体服务器查询图片地址 + :param item_id: 在Emby中的ID + :param image_type: 图片的类弄地,poster或者backdrop等 + :return: 图片对应在TMDB中的URL + """ + if not self.server: + return None + return self.server.get_image_by_id(item_id, image_type) + + def get_no_exists_episodes(self, meta_info, + season_number, + episode_count): + """ + 根据标题、年份、季、总集数,查询媒体服务器中缺少哪几集 + :param meta_info: 已识别的需要查询的媒体信息 + :param season_number: 季号,数字 + :param episode_count: 该季的总集数 + :return: 该季不存在的集号列表 + """ + if not self.server: + return None + return self.server.get_no_exists_episodes(meta_info, + season_number, + episode_count) + + def get_movies(self, title, year=None): + """ + 根据标题和年份,检查电影是否在媒体服务器中存在,存在则返回列表 + :param title: 标题 + :param year: 年份,可以为空,为空时不按年份过滤 + :return: 含title、year属性的字典列表 + """ + if not self.server: + return None + return self.server.get_movies(title, year) + + def refresh_library_by_items(self, items): + """ + 按类型、名称、年份来刷新媒体库 + :param items: 已识别的需要刷新媒体库的媒体信息列表 + """ + if not self.server: + return + return self.server.refresh_library_by_items(items) + + def get_libraries(self): + """ + 获取媒体服务器所有媒体库列表 + """ + if not self.server: + return [] + return self.server.get_libraries() + + def get_items(self, parent): + """ + 获取媒体库中的所有媒体 + :param parent: 上一级的ID + """ + if not self.server: + return [] + return self.server.get_items(parent) + + def sync_mediaserver(self): + """ + 同步媒体库所有数据到本地数据库 + """ + if not self.server: + return + with lock: + # 开始进度条 + log.info("【MediaServer】开始同步媒体库数据...") + self.progress.start("mediasync") + self.progress.update(ptype="mediasync", text="请稍候...") + # 汇总统计 + medias_count = self.get_medias_count() + total_media_count = medias_count.get("MovieCount") + medias_count.get("SeriesCount") + total_count = 0 + movie_count = 0 + tv_count = 0 + # 清空登记薄 + self.mediadb.empty() + for library in self.get_libraries(): + # 获取媒体库所有项目 + self.progress.update(ptype="mediasync", + text="正在获取 %s 数据..." % (library.get("name"))) + for item in self.get_items(library.get("id")): + if not item: + continue + if self.mediadb.insert(self._server_type.value, item): + total_count += 1 + if item.get("type") in ['Movie', 'movie']: + movie_count += 1 + elif item.get("type") in ['Series', 'show']: + tv_count += 1 + self.progress.update(ptype="mediasync", + text="正在同步 %s,已完成:%s / %s ..." % ( + library.get("name"), total_count, total_media_count), + value=round(100 * total_count / total_media_count, 1)) + # 更新总体同步情况 + self.mediadb.statistics(server_type=self._server_type.value, + total_count=total_count, + movie_count=movie_count, + tv_count=tv_count) + # 结束进度条 + self.progress.update(ptype="mediasync", + value=100, + text="媒体库数据同步完成,同步数量:%s" % total_count) + self.progress.end("mediasync") + log.info("【MediaServer】媒体库数据同步完成,同步数量:%s" % total_count) + + def check_item_exists(self, title, year=None, tmdbid=None): + """ + 检查媒体库是否已存在某项目,非实时同步数据,仅用于展示 + """ + return self.mediadb.exists(server_type=self._server_type.value, + title=title, + year=year, + tmdbid=tmdbid) + + def get_mediasync_status(self): + """ + 获取当前媒体库同步状态 + """ + status = self.mediadb.get_statistics(server_type=self._server_type.value) + if not status: + return {} + else: + return {"movie_count": status.MOVIE_COUNT, "tv_count": status.TV_COUNT, "time": status.UPDATE_TIME} + + def get_iteminfo(self, itemid): + """ + 根据ItemId从媒体服务器查询项目详情 + :param itemid: 在Emby中的ID + :return: 图片对应在TMDB中的URL + """ + if not self.server: + return None + return self.server.get_iteminfo(itemid) + + def get_playing_sessions(self): + """ + 获取正在播放的会话 + """ + if not self.server: + return None + return self.server.get_playing_sessions() diff --git a/app/mediaserver/webhook_event.py b/app/mediaserver/webhook_event.py new file mode 100644 index 0000000..2953b0b --- /dev/null +++ b/app/mediaserver/webhook_event.py @@ -0,0 +1,198 @@ +import time + +from app.message import Message +from app.mediaserver import MediaServer +from app.media import Media +from web.backend.web_utils import WebUtils + + +class WebhookEvent: + message = None + mediaserver = None + media = None + + def __init__(self): + self.message = Message() + self.mediaserver = MediaServer() + self.media = Media() + + @staticmethod + def __parse_plex_msg(message): + """ + 解析Plex报文 + """ + eventItem = {'event': message.get('event', {}), + 'item_name': message.get('Metadata', {}).get('title'), + 'user_name': message.get('Account', {}).get('title') + } + return eventItem + + @staticmethod + def __parse_jellyfin_msg(message): + """ + 解析Jellyfin报文 + """ + eventItem = {'event': message.get('NotificationType', {}), + 'item_name': message.get('Name'), + 'user_name': message.get('NotificationUsername') + } + return eventItem + + @staticmethod + def __parse_emby_msg(message): + """ + 解析Emby报文 + """ + eventItem = {'event': message.get('Event', {})} + if message.get('Item'): + if message.get('Item', {}).get('Type') == 'Episode': + eventItem['item_type'] = "TV" + eventItem['item_name'] = "%s %s%s %s" % ( + message.get('Item', {}).get('SeriesName'), + "S" + str(message.get('Item', {}).get('ParentIndexNumber')), + "E" + str(message.get('Item', {}).get('IndexNumber')), + message.get('Item', {}).get('Name')) + eventItem['item_id'] = message.get('Item', {}).get('SeriesId') + eventItem['season_id'] = message.get('Item', {}).get('ParentIndexNumber') + eventItem['episode_id'] = message.get('Item', {}).get('IndexNumber') + eventItem['tmdb_id'] = message.get('Item', {}).get('ProviderIds', {}).get('Tmdb') + if message.get('Item', {}).get('Overview') and len(message.get('Item', {}).get('Overview')) > 100: + eventItem['overview'] = str(message.get('Item', {}).get('Overview'))[:100] + "..." + else: + eventItem['overview'] = message.get('Item', {}).get('Overview') + eventItem['percentage'] = message.get('TranscodingInfo', {}).get('CompletionPercentage') + else: + eventItem['item_type'] = "MOV" + eventItem['item_name'] = "%s %s" % ( + message.get('Item', {}).get('Name'), "(" + str(message.get('Item', {}).get('ProductionYear')) + ")") + eventItem['item_path'] = message.get('Item', {}).get('Path') + eventItem['item_id'] = message.get('Item', {}).get('Id') + eventItem['tmdb_id'] = message.get('Item', {}).get('ProviderIds', {}).get('Tmdb') + if len(message.get('Item', {}).get('Overview')) > 100: + eventItem['overview'] = str(message.get('Item', {}).get('Overview'))[:100] + "..." + else: + eventItem['overview'] = message.get('Item', {}).get('Overview') + eventItem['percentage'] = message.get('TranscodingInfo', {}).get('CompletionPercentage') + if message.get('Session'): + eventItem['ip'] = message.get('Session').get('RemoteEndPoint') + eventItem['device_name'] = message.get('Session').get('DeviceName') + eventItem['client'] = message.get('Session').get('Client') + if message.get("User"): + eventItem['user_name'] = message.get("User").get('Name') + + return eventItem + + def plex_action(self, message): + """ + 执行Plex webhook动作 + """ + event_info = self.__parse_plex_msg(message) + if event_info.get("event") in ["media.play", "media.stop"]: + self.send_webhook_message(event_info, 'plex') + + def jellyfin_action(self, message): + """ + 执行Jellyfin webhook动作 + """ + event_info = self.__parse_jellyfin_msg(message) + if event_info.get("event") in ["PlaybackStart", "PlaybackStop"]: + self.send_webhook_message(event_info, 'jellyfin') + + def emby_action(self, message): + """ + 执行Emby webhook动作 + """ + event_info = self.__parse_emby_msg(message) + if event_info.get("event") == "system.webhooktest": + return + elif event_info.get("event") in ["playback.start", + "playback.stop", + "user.authenticated", + "user.authenticationfailed"]: + self.send_webhook_message(event_info, 'emby') + + def send_webhook_message(self, event_info, channel): + """ + 发送消息 + """ + _webhook_actions = { + "system.webhooktest": "测试", + "playback.start": "开始播放", + "playback.stop": "停止播放", + "playback.pause": "暂停播放", + "playback.unpause": "开始播放", + "user.authenticated": "登录成功", + "user.authenticationfailed": "登录失败", + "media.play": "开始播放", + "PlaybackStart": "开始播放", + "PlaybackStop": "停止播放", + "media.stop": "停止播放", + "item.rate": "标记了", + } + _webhook_images = { + "emby": "https://emby.media/notificationicon.png", + "plex": "https://www.plex.tv/wp-content/uploads/2022/04/new-logo-process-lines-gray.png", + "jellyfin": "https://play-lh.googleusercontent.com/SCsUK3hCCRqkJbmLDctNYCfehLxsS4ggD1ZPHIFrrAN1Tn9yhjmGMPep2D9lMaaa9eQi" + } + + if self.is_ignore_webhook_message(event_info.get('user_name'), event_info.get('device_name')): + return + + # 消息标题 + if event_info.get('item_type') == "TV": + message_title = f"{_webhook_actions.get(event_info.get('event'))}剧集 {event_info.get('item_name')}" + elif event_info.get('item_type') == "MOV": + message_title = f"{_webhook_actions.get(event_info.get('event'))}电影 {event_info.get('item_name')}" + else: + message_title = f"{_webhook_actions.get(event_info.get('event'))}" + + # 消息内容 + if {event_info.get('user_name')}: + message_texts = [f"用户:{event_info.get('user_name')}"] + if event_info.get('device_name'): + message_texts.append(f"设备:{event_info.get('client')} {event_info.get('device_name')}") + if event_info.get('ip'): + message_texts.append(f"位置:{event_info.get('ip')} {WebUtils.get_location(event_info.get('ip'))}") + if event_info.get('percentage'): + percentage = round(float(event_info.get('percentage')), 2) + message_texts.append(f"进度:{percentage}%") + if event_info.get('overview'): + message_texts.append(f"剧情:{event_info.get('overview')}") + message_texts.append(f"时间:{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}") + + # 消息图片 + image_url = '' + if event_info.get('item_id'): + if event_info.get("item_type") == "TV": + iteminfo = self.mediaserver.get_iteminfo(event_info.get('item_id')) + tmdb_id = iteminfo.get('ProviderIds', {}).get('Tmdb') + try: + # 从tmdb获取剧集某季某集图片 + image_url = self.media.get_episode_images(tmdb_id, + event_info.get('season_id'), + event_info.get('episode_id')) + except IOError: + pass + + if not image_url: + image_url = self.mediaserver.get_image_by_id(event_info.get('item_id'), + "Backdrop") or _webhook_images.get(channel) + else: + image_url = _webhook_images.get(channel) + # 发送消息 + self.message.send_mediaserver_message(title=message_title, text="\n".join(message_texts), image=image_url) + + def is_ignore_webhook_message(self, user_name, device_name): + """ + 判断是否忽略通知 + """ + if not user_name and not device_name: + return False + webhook_ignore = self.message.get_webhook_ignore() + if not webhook_ignore: + return False + if user_name in webhook_ignore or \ + device_name in webhook_ignore or \ + (user_name + ':' + device_name) in webhook_ignore: + return True + return False diff --git a/app/message/__init__.py b/app/message/__init__.py new file mode 100644 index 0000000..4c0632e --- /dev/null +++ b/app/message/__init__.py @@ -0,0 +1,2 @@ +from .message import Message +from .message_center import MessageCenter diff --git a/app/message/client/__init__.py b/app/message/client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/message/client/_base.py b/app/message/client/_base.py new file mode 100644 index 0000000..872347f --- /dev/null +++ b/app/message/client/_base.py @@ -0,0 +1,35 @@ +from abc import ABCMeta, abstractmethod + + +class _IMessageClient(metaclass=ABCMeta): + + @abstractmethod + def match(self, ctype): + """ + 匹配实例 + """ + pass + + @abstractmethod + def send_msg(self, title, text, image, url, user_id): + """ + 消息发送入口,支持文本、图片、链接跳转、指定发送对象 + :param title: 消息标题 + :param text: 消息内容 + :param image: 图片地址 + :param url: 点击消息跳转URL + :param user_id: 消息发送对象的ID,为空则发给所有人 + :return: 发送状态,错误信息 + """ + pass + + @abstractmethod + def send_list_msg(self, medias: list, user_id="", title="", url=""): + """ + 发送列表类消息 + :param title: 消息标题 + :param medias: 媒体列表 + :param user_id: 消息发送对象的ID,为空则发给所有人 + :param url: 跳转链接地址 + """ + pass diff --git a/app/message/client/bark.py b/app/message/client/bark.py new file mode 100644 index 0000000..252c1a6 --- /dev/null +++ b/app/message/client/bark.py @@ -0,0 +1,63 @@ +from urllib.parse import quote_plus + +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, StringUtils, ExceptionUtils + + +class Bark(_IMessageClient): + schema = "bark" + + _server = None + _apikey = None + _params = None + _client_config = {} + + def __init__(self, config): + self._client_config = config + self.init_config() + + def init_config(self): + if self._client_config: + self._server = StringUtils.get_base_url(self._client_config.get('server')) + self._apikey = self._client_config.get('apikey') + self._params = self._client_config.get('params') + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送Bark消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 未使用 + :param url: 未使用 + :param user_id: 未使用 + :return: 发送状态、错误信息 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + try: + if not self._server or not self._apikey: + return False, "参数未配置" + sc_url = "%s/%s/%s/%s" % (self._server, self._apikey, quote_plus(title), quote_plus(text)) + if self._params: + sc_url = "%s?%s" % (sc_url, self._params) + res = RequestUtils().post_res(sc_url) + if res: + ret_json = res.json() + code = ret_json['code'] + message = ret_json['message'] + if code == 200: + return True, message + else: + return False, message + else: + return False, "未获取到返回信息" + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, **kwargs): + pass diff --git a/app/message/client/chanify.py b/app/message/client/chanify.py new file mode 100644 index 0000000..41cc193 --- /dev/null +++ b/app/message/client/chanify.py @@ -0,0 +1,61 @@ +from urllib import parse + +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, StringUtils, ExceptionUtils + + +class Chanify(_IMessageClient): + schema = "chanify" + + _server = None + _token = None + _client_config = {} + + def __init__(self, config): + self._client_config = config + self.init_config() + + def init_config(self): + if self._client_config: + self._server = StringUtils.get_base_url(self._client_config.get('server')) + self._token = self._client_config.get('token') + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送Bark消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 未使用 + :param url: 未使用 + :param user_id: 未使用 + :return: 发送状态、错误信息 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + try: + if not self._server or not self._token: + return False, "参数未配置" + sc_url = "%s/v1/sender/%s" % (self._server, self._token) + # 发送文本 + data = parse.urlencode({ + 'title': title, + 'text': text + }).encode() + res = RequestUtils().post_res(sc_url, params=data) + if res: + if res.status_code == 200: + return True, "发送成功" + else: + return False, "错误码:%s" % res.status_code + else: + return False, "未获取到返回信息" + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, **kwargs): + pass diff --git a/app/message/client/gotify.py b/app/message/client/gotify.py new file mode 100644 index 0000000..11b0cab --- /dev/null +++ b/app/message/client/gotify.py @@ -0,0 +1,71 @@ +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, StringUtils, ExceptionUtils + + +class Gotify(_IMessageClient): + schema = "gotify" + + _server = None + _token = None + _priority = None + _client_config = {} + + def __init__(self, config): + self._client_config = config + self.init_config() + + def init_config(self): + if self._client_config: + self._server = StringUtils.get_base_url(self._client_config.get('server')) + self._token = self._client_config.get('token') + try: + self._priority = int(self._client_config.get('priority')) + except Exception as e: + self._priority = 8 + ExceptionUtils.exception_traceback(e) + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送Bark消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 未使用 + :param url: 点击消息跳转URL, 为空时则没有任何动作 + :param user_id: 未使用 + :return: 发送状态、错误信息 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + try: + if not self._server or not self._token: + return False, "参数未配置" + sc_url = "%s/message?token=%s" % (self._server, self._token) + sc_data = { + "title": title, + "message": text, + "priority": self._priority, + "extras": { + "client::notification": { + "click": { + "url": url + } + }, + } + } + res = RequestUtils(content_type="application/json").post_res(sc_url, json=sc_data) + if res and res.status_code == 200: + return True, "发送成功" + elif res: + return False, f"错误码:{res.status_code}" + else: + return False, "未获取到返回信息" + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, **kwargs): + pass diff --git a/app/message/client/iyuu.py b/app/message/client/iyuu.py new file mode 100644 index 0000000..4787d62 --- /dev/null +++ b/app/message/client/iyuu.py @@ -0,0 +1,56 @@ +from urllib.parse import urlencode + +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, ExceptionUtils + + +class IyuuMsg(_IMessageClient): + schema = "iyuu" + + _token = None + _client_config = {} + + def __init__(self, config): + self._client_config = config + self.init_config() + + def init_config(self): + if self._client_config: + self._token = self._client_config.get('token') + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送爱语飞飞消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 未使用 + :param url: 未使用 + :param user_id: 未使用 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + if not self._token: + return False, "参数未配置" + try: + sc_url = "http://iyuu.cn/%s.send?%s" % (self._token, urlencode({"text": title, "desp": text})) + res = RequestUtils().get_res(sc_url) + if res: + ret_json = res.json() + errno = ret_json.get('errcode') + error = ret_json.get('errmsg') + if errno == 0: + return True, error + else: + return False, error + else: + return False, "未获取到返回信息" + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, **kwargs): + pass diff --git a/app/message/client/pushdeer.py b/app/message/client/pushdeer.py new file mode 100644 index 0000000..aa3b018 --- /dev/null +++ b/app/message/client/pushdeer.py @@ -0,0 +1,53 @@ +from pypushdeer import PushDeer + +from app.message.client._base import _IMessageClient +from app.utils import StringUtils, ExceptionUtils + + +class PushDeerClient(_IMessageClient): + schema = "pushdeer" + + _server = None + _apikey = None + _client_config = {} + + def __init__(self, config): + self._client_config = config + self.init_config() + + def init_config(self): + if self._client_config: + self._server = StringUtils.get_base_url(self._client_config.get('server')) + self._apikey = self._client_config.get('apikey') + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送PushDeer消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 未使用 + :param url: 未使用 + :param user_id: 未使用 + :return: 发送状态、错误信息 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + try: + if not self._server or not self._apikey: + return False, "参数未配置" + pushdeer = PushDeer(server=self._server, pushkey=self._apikey) + res = pushdeer.send_markdown(title, desp=text) + if res: + return True, "成功" + else: + return False, "失败" + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, **kwargs): + pass diff --git a/app/message/client/pushplus.py b/app/message/client/pushplus.py new file mode 100644 index 0000000..d2dbdff --- /dev/null +++ b/app/message/client/pushplus.py @@ -0,0 +1,74 @@ +import time +from urllib.parse import urlencode + +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, ExceptionUtils + + +class PushPlus(_IMessageClient): + schema = "pushplus" + + _token = None + _topic = None + _channel = None + _webhook = None + _client_config = {} + + def __init__(self, config): + self._client_config = config + self.init_config() + + def init_config(self): + if self._client_config: + self._token = self._client_config.get('token') + self._topic = self._client_config.get('topic') + self._channel = self._client_config.get('channel') + self._webhook = self._client_config.get('webhook') + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送ServerChan消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 未使用 + :param url: 未使用 + :param user_id: 未使用 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + if not text: + text = "无" + if not self._token or not self._channel: + return False, "参数未配置" + try: + values = { + "token": self._token, + "channel": self._channel, + "topic": self._topic, + "webhook": self._webhook, + "title": title, + "content": text, + "timestamp": time.time_ns() + 60 + } + sc_url = "http://www.pushplus.plus/send?%s" % urlencode(values) + res = RequestUtils().get_res(sc_url) + if res: + ret_json = res.json() + code = ret_json.get("code") + msg = ret_json.get("msg") + if code == 200: + return True, msg + else: + return False, msg + else: + return False, "未获取到返回信息" + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, **kwargs): + pass diff --git a/app/message/client/serverchan.py b/app/message/client/serverchan.py new file mode 100644 index 0000000..9a770a6 --- /dev/null +++ b/app/message/client/serverchan.py @@ -0,0 +1,56 @@ +from urllib.parse import urlencode + +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, ExceptionUtils + + +class ServerChan(_IMessageClient): + schema = "serverchan" + + _sckey = None + _client_config = {} + + def __init__(self, config): + self._client_config = config + self.init_config() + + def init_config(self): + if self._client_config: + self._sckey = self._client_config.get('sckey') + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送ServerChan消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 未使用 + :param url: 未使用 + :param user_id: 未使用 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + if not self._sckey: + return False, "参数未配置" + try: + sc_url = "https://sctapi.ftqq.com/%s.send?%s" % (self._sckey, urlencode({"title": title, "desp": text})) + res = RequestUtils().get_res(sc_url) + if res: + ret_json = res.json() + errno = ret_json.get('code') + error = ret_json.get('message') + if errno == 0: + return True, error + else: + return False, error + else: + return False, "未获取到返回信息" + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, **kwargs): + pass diff --git a/app/message/client/slack.py b/app/message/client/slack.py new file mode 100644 index 0000000..fa02fdb --- /dev/null +++ b/app/message/client/slack.py @@ -0,0 +1,264 @@ +import re +from threading import Lock + +import requests +from slack_sdk.errors import SlackApiError + +import log +from app.message.client._base import _IMessageClient +from app.utils import ExceptionUtils +from config import Config +from slack_bolt import App +from slack_bolt.adapter.socket_mode import SocketModeHandler + +lock = Lock() + + +class Slack(_IMessageClient): + schema = "slack" + + _client_config = {} + _interactive = False + _ds_url = None + _service = None + _channel = None + _client = None + + def __init__(self, config): + self._config = Config() + self._client_config = config + self._interactive = config.get("interactive") + self._channel = config.get("channel") or "全体" + self.init_config() + + def init_config(self): + self._ds_url = "http://127.0.0.1:%s/slack" % self._config.get_config("app").get("web_port") + if self._client_config: + try: + slack_app = App(token=self._client_config.get("bot_token")) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return + self._client = slack_app.client + + # 注册消息响应 + @slack_app.event("message") + def slack_message(message): + local_res = requests.post(self._ds_url, json=message, timeout=10) + log.debug("【Slack】message: %s processed, response is: %s" % (message, local_res.text)) + + @slack_app.action(re.compile(r"actionId-\d+")) + def slack_action(ack, body): + ack() + local_res = requests.post(self._ds_url, json=body, timeout=60) + log.debug("【Slack】message: %s processed, response is: %s" % (body, local_res.text)) + + @slack_app.event("app_mention") + def slack_mention(say, body): + say(f"收到,请稍等... <@{body.get('event', {}).get('user')}>") + local_res = requests.post(self._ds_url, json=body, timeout=10) + log.debug("【Slack】message: %s processed, response is: %s" % (body, local_res.text)) + + @slack_app.shortcut(re.compile(r"/*")) + def slack_shortcut(ack, body): + ack() + local_res = requests.post(self._ds_url, json=body, timeout=10) + log.debug("【Slack】message: %s processed, response is: %s" % (body, local_res.text)) + + # 启动服务 + if self._interactive: + try: + self._service = SocketModeHandler( + slack_app, + self._client_config.get("app_token") + ) + self._service.connect() + log.info("Slack消息接收服务启动") + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("Slack消息接收服务启动失败: %s" % str(err)) + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def stop_service(self): + if self._service: + try: + self._service.close() + except Exception as err: + print(str(err)) + log.info("Slack消息接收服务已停止") + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送Telegram消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 消息图片地址 + :param url: 点击消息转转的URL + :param user_id: 用户ID,如有则只发消息给该用户 + :user_id: 发送消息的目标用户ID,为空则发给管理员 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + if not self._client: + return False, "消息客户端未就绪" + try: + if user_id: + channel = user_id + else: + # 消息广播 + channel = self.__find_public_channel() + # 拼装消息内容 + titles = str(title).split('\n') + if len(titles) > 1: + title = titles[0] + if not text: + text = "\n".join(titles[1:]) + else: + text = "%s\n%s" % ("\n".join(titles[1:]), text) + block = { + "type": "section", + "text": { + "type": "mrkdwn", + "text": f"*{title}*\n{text}" + } + } + # 消息图片 + if image: + block['accessory'] = { + "type": "image", + "image_url": f"{image}", + "alt_text": f"{title}" + } + blocks = [block] + # 链接 + if image and url: + blocks.append({ + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "查看详情", + "emoji": True + }, + "value": "click_me_url", + "url": f"{url}", + "action_id": "actionId-url" + } + ] + }) + # 发送 + result = self._client.chat_postMessage( + channel=channel, + blocks=blocks + ) + return True, result + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, medias: list, user_id="", **kwargs): + """ + 发送列表类消息 + """ + if not medias: + return False, "参数有误" + if not self._client: + return False, "消息客户端未就绪" + try: + if user_id: + channel = user_id + else: + # 消息广播 + channel = self.__find_public_channel() + title = f"共找到{len(medias)}条相关信息,请选择" + # 消息主体 + title_section = { + "type": "section", + "text": { + "type": "mrkdwn", + "text": f"*{title}*" + } + } + blocks = [title_section] + # 列表 + if medias: + blocks.append({ + "type": "divider" + }) + index = 1 + for media in medias: + if media.get_poster_image(): + if media.get_star_string(): + text = f"{index}. *<{media.get_detail_url()}|{media.get_title_string()}>*" \ + f"\n{media.get_type_string()}" \ + f"\n{media.get_star_string()}" \ + f"\n{media.get_overview_string(50)}" + else: + text = f"{index}. *<{media.get_detail_url()}|{media.get_title_string()}>*" \ + f"\n{media.get_type_string()}" \ + f"\n{media.get_overview_string(50)}" + blocks.append( + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": text + }, + "accessory": { + "type": "image", + "image_url": f"{media.get_poster_image()}", + "alt_text": f"{media.get_title_string()}" + } + } + ) + blocks.append( + { + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "选择", + "emoji": True + }, + "value": f"{index}", + "action_id": f"actionId-{index}" + } + ] + } + ) + index += 1 + # 发送 + result = self._client.chat_postMessage( + channel=channel, + blocks=blocks + ) + return True, result + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def __find_public_channel(self): + """ + 查找公共频道 + """ + if not self._client: + return "" + conversation_id = "" + try: + for result in self._client.conversations_list(): + if conversation_id: + break + for channel in result["channels"]: + if channel.get("name") == self._channel: + conversation_id = channel.get("id") + break + except SlackApiError as e: + print(f"Slack Error: {e}") + return conversation_id diff --git a/app/message/client/synologychat.py b/app/message/client/synologychat.py new file mode 100644 index 0000000..1344b16 --- /dev/null +++ b/app/message/client/synologychat.py @@ -0,0 +1,169 @@ +import json +from urllib.parse import quote +from threading import Lock + +from app.message.client._base import _IMessageClient +from app.utils import ExceptionUtils, RequestUtils, StringUtils +from config import Config + +lock = Lock() + + +class SynologyChat(_IMessageClient): + schema = "synologychat" + + _client_config = {} + _interactive = False + _domain = None + _webhook_url = None + _token = None + _client = None + _req = None + + def __init__(self, config): + self._config = Config() + self._client_config = config + self._interactive = config.get("interactive") + self._req = RequestUtils(content_type="application/x-www-form-urlencoded") + self.init_config() + + def init_config(self): + if self._client_config: + self._webhook_url = self._client_config.get("webhook_url") + if self._webhook_url: + self._domain = StringUtils.get_base_url(self._webhook_url) + self._token = self._client_config.get('token') + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def check_token(self, token): + return True if token == self._token else False + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送Telegram消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 消息图片地址 + :param url: 点击消息转转的URL + :param user_id: 用户ID,如有则只发消息给该用户 + :user_id: 发送消息的目标用户ID,为空则发给管理员 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + if not self._webhook_url or not self._token: + return False, "参数未配置" + try: + # 拼装消息内容 + titles = str(title).split('\n') + if len(titles) > 1: + title = titles[0] + if not text: + text = "\n".join(titles[1:]) + else: + text = f"%s\n%s" % ("\n".join(titles[1:]), text) + + if text: + caption = "*%s*\n%s" % (title, text.replace("\n\n", "\n")) + else: + caption = title + if url and image: + caption = f"{caption}\n\n<{url}|查看详情>" + payload_data = {'text': quote(caption)} + if image: + payload_data['file_url'] = quote(image) + if user_id: + payload_data['user_ids'] = [int(user_id)] + else: + userids = self.__get_bot_users() + if not userids: + return False, "机器人没有对任何用户可见" + payload_data['user_ids'] = userids + return self.__send_request(payload_data) + + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, medias: list, user_id="", title="", **kwargs): + """ + 发送列表类消息 + """ + if not medias: + return False, "参数有误" + if not self._webhook_url or not self._token: + return False, "参数未配置" + try: + if not title or not isinstance(medias, list): + return False, "数据错误" + index, image, caption = 1, "", "*%s*" % title + for media in medias: + if not image: + image = media.get_message_image() + if media.get_vote_string(): + caption = "%s\n%s. <%s|%s>\n%s,%s" % (caption, + index, + media.get_detail_url(), + media.get_title_string(), + media.get_type_string(), + media.get_vote_string()) + else: + caption = "%s\n%s. <%s|%s>\n%s" % (caption, + index, + media.get_detail_url(), + media.get_title_string(), + media.get_type_string()) + index += 1 + + if user_id: + user_ids = [int(user_id)] + else: + user_ids = self.__get_bot_users() + payload_data = { + "text": quote(caption), + "file_url": quote(image), + "user_ids": user_ids + } + return self.__send_request(payload_data) + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def __get_bot_users(self): + """ + 查询机器人可见的用户列表 + """ + if not self._domain or not self._token: + return [] + req_url = f"{self._domain}" \ + f"/webapi/entry.cgi?api=SYNO.Chat.External&method=user_list&version=2&token=" \ + f"{self._token}" + ret = self._req.get_res(url=req_url) + if ret and ret.status_code == 200: + users = ret.json().get("data", {}).get("users", []) or [] + return [user.get("user_id") for user in users] + else: + return [] + + def __send_request(self, payload_data): + """ + 发送消息请求 + """ + payload = f"payload={json.dumps(payload_data)}" + ret = self._req.post_res(url=self._webhook_url, params=payload) + if ret and ret.status_code == 200: + result = ret.json() + if result: + errno = result.get('error', {}).get('code') + errmsg = result.get('error', {}).get('errors') + if not errno: + return True, "" + return False, f"{errno}-{errmsg}" + else: + return False, f"{ret.text}" + elif ret: + return False, f"错误码:{ret.status_code}" + else: + return False, "未获取到返回信息" diff --git a/app/message/client/telegram.py b/app/message/client/telegram.py new file mode 100644 index 0000000..67a3a49 --- /dev/null +++ b/app/message/client/telegram.py @@ -0,0 +1,317 @@ +from threading import Event, Lock +from urllib.parse import urlencode + +import requests + +import log +from app.helper import ThreadHelper +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, ExceptionUtils +from config import Config + +lock = Lock() +WEBHOOK_STATUS = False + + +class Telegram(_IMessageClient): + schema = "telegram" + + _telegram_token = None + _telegram_chat_id = None + _webhook = None + _webhook_url = None + _telegram_user_ids = [] + _telegram_admin_ids = [] + _domain = None + _message_proxy_event = None + _client_config = {} + _interactive = False + _enabled = True + + def __init__(self, config): + self._client_config = config + self._interactive = config.get("interactive") + self._domain = Config().get_domain() + if self._domain and self._domain.endswith("/"): + self._domain = self._domain[:-1] + self.init_config() + + def init_config(self): + if self._client_config: + self._telegram_token = self._client_config.get('token') + self._telegram_chat_id = self._client_config.get('chat_id') + self._webhook = self._client_config.get('webhook') + telegram_admin_ids = self._client_config.get('admin_ids') + if telegram_admin_ids: + self._telegram_admin_ids = telegram_admin_ids.split(",") + self._telegram_user_ids = self._telegram_admin_ids + telegram_user_ids = self._client_config.get('user_ids') + if telegram_user_ids: + self._telegram_user_ids.extend(telegram_user_ids.split(",")) + if self._telegram_token and self._telegram_chat_id: + if self._webhook: + if self._domain: + self._webhook_url = "%s/telegram" % self._domain + self.__set_bot_webhook() + if self._message_proxy_event: + self._message_proxy_event.set() + self._message_proxy_event = None + elif self._interactive: + self.__del_bot_webhook() + if not self._message_proxy_event: + event = Event() + self._message_proxy_event = event + ThreadHelper().start_thread(self.__start_telegram_message_proxy, [event]) + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def get_admin(self): + """ + 获取允许使用远程命令的user_id列表 + """ + return self._telegram_admin_ids + + def get_users(self): + """ + 获取允许使用telegram机器人的user_id列表 + """ + return self._telegram_user_ids + + def send_msg(self, title, text="", image="", url="", user_id=""): + """ + 发送Telegram消息 + :param title: 消息标题 + :param text: 消息内容 + :param image: 消息图片地址 + :param url: 点击消息转转的URL + :param user_id: 用户ID,如有则只发消息给该用户 + :user_id: 发送消息的目标用户ID,为空则发给管理员 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + try: + if not self._telegram_token or not self._telegram_chat_id: + return False, "参数未配置" + + # text中的Markdown特殊字符转义 + text = text.replace("[", r"\[").replace("_", r"\_").replace("*", r"\*").replace("`", r"\`") + # 拼装消息内容 + titles = str(title).split('\n') + if len(titles) > 1: + title = titles[0] + if not text: + text = "\n".join(titles[1:]) + else: + text = "%s\n%s" % ("\n".join(titles[1:]), text) + if text: + caption = "*%s*\n%s" % (title, text.replace("\n\n", "\n")) + else: + caption = title + if image and url: + caption = "%s\n\n[查看详情](%s)" % (caption, url) + if user_id: + chat_id = user_id + else: + chat_id = self._telegram_chat_id + + return self.__send_request(chat_id=chat_id, image=image, caption=caption) + + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def send_list_msg(self, medias: list, user_id="", title="", **kwargs): + """ + 发送列表类消息 + """ + try: + if not self._telegram_token or not self._telegram_chat_id: + return False, "参数未配置" + if not title or not isinstance(medias, list): + return False, "数据错误" + index, image, caption = 1, "", "*%s*" % title + for media in medias: + if not image: + image = media.get_message_image() + if media.get_vote_string(): + caption = "%s\n%s. [%s](%s)\n%s,%s" % (caption, + index, + media.get_title_string(), + media.get_detail_url(), + media.get_type_string(), + media.get_vote_string()) + else: + caption = "%s\n%s. [%s](%s)\n%s" % (caption, + index, + media.get_title_string(), + media.get_detail_url(), + media.get_type_string()) + index += 1 + + if user_id: + chat_id = user_id + else: + chat_id = self._telegram_chat_id + + return self.__send_request(chat_id=chat_id, image=image, caption=caption) + + except Exception as msg_e: + ExceptionUtils.exception_traceback(msg_e) + return False, str(msg_e) + + def __send_request(self, chat_id="", image="", caption=""): + """ + 向Telegram发送报文 + """ + def _res_parse(result): + if result: + ret_json = result.json() + status = ret_json.get("ok") + if status: + return True, "" + else: + return False, ret_json.get("description") + else: + return False, "未获取到返回信息" + + proxies = Config().get_proxies() + if image: + # 发送图文消息 + values = {"chat_id": chat_id, "photo": image, "caption": caption, "parse_mode": "Markdown"} + sc_url = "https://api.telegram.org/bot%s/sendPhoto?" % self._telegram_token + res = RequestUtils(proxies=proxies).get_res(sc_url + urlencode(values)) + flag, msg = _res_parse(res) + if flag: + return flag, msg + else: + photo_req = RequestUtils(proxies=proxies).get_res(image) + if photo_req and photo_req.content: + sc_url = "https://api.telegram.org/bot%s/sendPhoto" % self._telegram_token + data = {"chat_id": chat_id, "caption": caption, "parse_mode": "Markdown"} + files = {"photo": photo_req.content} + res = requests.post(sc_url, proxies=proxies, data=data, files=files) + flag, msg = _res_parse(res) + if flag: + return flag, msg + # 发送文本消息 + values = {"chat_id": chat_id, "text": caption, "parse_mode": "Markdown"} + sc_url = "https://api.telegram.org/bot%s/sendMessage?" % self._telegram_token + res = RequestUtils(proxies=proxies).get_res(sc_url + urlencode(values)) + flag, msg = _res_parse(res) + return flag, msg + + def __set_bot_webhook(self): + """ + 设置Telegram Webhook + """ + if not self._webhook_url: + return + + try: + lock.acquire() + global WEBHOOK_STATUS + if not WEBHOOK_STATUS: + WEBHOOK_STATUS = True + else: + return + finally: + lock.release() + + status = self.__get_bot_webhook() + if status and status != 1: + if status == 2: + self.__del_bot_webhook() + values = {"url": self._webhook_url, "allowed_updates": ["message"]} + sc_url = "https://api.telegram.org/bot%s/setWebhook?" % self._telegram_token + res = RequestUtils(proxies=Config().get_proxies()).get_res(sc_url + urlencode(values)) + if res is not None: + json = res.json() + if json.get("ok"): + log.info("【Telegram】Webhook 设置成功,地址为:%s" % self._webhook_url) + else: + log.error("【Telegram】Webhook 设置失败:" % json.get("description")) + else: + log.error("【Telegram】Webhook 设置失败:网络连接故障!") + + def __get_bot_webhook(self): + """ + 获取Telegram已设置的Webhook + :return: 状态:1-存在且相等,2-存在不相等,3-不存在,0-网络出错 + """ + sc_url = "https://api.telegram.org/bot%s/getWebhookInfo" % self._telegram_token + res = RequestUtils(proxies=Config().get_proxies()).get_res(sc_url) + if res is not None and res.json(): + if res.json().get("ok"): + result = res.json().get("result") or {} + webhook_url = result.get("url") or "" + if webhook_url: + log.info("【Telegram】Webhook 地址为:%s" % webhook_url) + pending_update_count = result.get("pending_update_count") + last_error_message = result.get("last_error_message") + if pending_update_count and last_error_message: + log.warn("【Telegram】Webhook 有 %s 条消息挂起,最后一次失败原因为:%s" % ( + pending_update_count, last_error_message)) + if webhook_url == self._webhook_url: + return 1 + else: + return 2 + else: + return 3 + else: + return 0 + + def __del_bot_webhook(self): + """ + 删除Telegram Webhook + :return: 是否成功 + """ + sc_url = "https://api.telegram.org/bot%s/deleteWebhook" % self._telegram_token + res = RequestUtils(proxies=Config().get_proxies()).get_res(sc_url) + if res and res.json() and res.json().get("ok"): + return True + else: + return False + + def __start_telegram_message_proxy(self, event: Event): + log.info("Telegram消息接收服务启动") + + long_poll_timeout = 5 + + def consume_messages(_config, _offset, _sc_url, _ds_url): + try: + values = {"timeout": long_poll_timeout, "offset": _offset} + res = RequestUtils(proxies=_config.get_proxies()).get_res(_sc_url + urlencode(values)) + if res and res.json(): + for msg in res.json().get("result", []): + # 无论本地是否成功,先更新offset,即消息最多成功消费一次 + _offset = msg["update_id"] + 1 + log.debug("【Telegram】接收到消息: %s" % msg) + local_res = requests.post(_ds_url, json=msg, timeout=10) + log.debug("【Telegram】message: %s processed, response is: %s" % (msg, local_res.text)) + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【Telegram】消息接收出现错误: %s" % e) + return _offset + + offset = 0 + while True: + _config = Config() + web_port = _config.get_config("app").get("web_port") + sc_url = "https://api.telegram.org/bot%s/getUpdates?" % self._telegram_token + ds_url = "http://127.0.0.1:%s/telegram" % web_port + if not self._enabled: + log.info("Telegram消息接收服务已停止") + break + + i = 0 + while i < 20 and not event.is_set(): + offset = consume_messages(_config, offset, sc_url, ds_url) + i = i + 1 + + def stop_service(self): + """ + 停止服务 + """ + self._enabled = False diff --git a/app/message/client/wechat.py b/app/message/client/wechat.py new file mode 100644 index 0000000..6d78b88 --- /dev/null +++ b/app/message/client/wechat.py @@ -0,0 +1,220 @@ +import json +import threading +from datetime import datetime + +from app.message.client._base import _IMessageClient +from app.utils import RequestUtils, ExceptionUtils +from config import DEFAULT_WECHAT_PROXY + +lock = threading.Lock() + + +class WeChat(_IMessageClient): + schema = "wechat" + + _instance = None + _access_token = None + _expires_in = None + _access_token_time = None + _default_proxy = False + _client_config = {} + _corpid = None + _corpsecret = None + _agent_id = None + _interactive = False + + _send_msg_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" + _token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s" + + def __init__(self, config): + self._client_config = config + self._interactive = config.get("interactive") + self.init_config() + + def init_config(self): + if self._client_config: + self._corpid = self._client_config.get('corpid') + self._corpsecret = self._client_config.get('corpsecret') + self._agent_id = self._client_config.get('agentid') + self._default_proxy = self._client_config.get('default_proxy') + if self._default_proxy: + if isinstance(self._default_proxy, bool): + self._send_msg_url = f"{DEFAULT_WECHAT_PROXY}/cgi-bin/message/send?access_token=%s" + self._token_url = f"{DEFAULT_WECHAT_PROXY}/cgi-bin/gettoken?corpid=%s&corpsecret=%s" + else: + self._send_msg_url = f"{self._default_proxy}/cgi-bin/message/send?access_token=%s" + self._token_url = f"{self._default_proxy}/cgi-bin/gettoken?corpid=%s&corpsecret=%s" + if self._corpid and self._corpsecret and self._agent_id: + self.__get_access_token() + + @classmethod + def match(cls, ctype): + return True if ctype == cls.schema else False + + def __get_access_token(self, force=False): + """ + 获取微信Token + :return: 微信Token + """ + token_flag = True + if not self._access_token: + token_flag = False + else: + if (datetime.now() - self._access_token_time).seconds >= self._expires_in: + token_flag = False + + if not token_flag or force: + if not self._corpid or not self._corpsecret: + return None + try: + token_url = self._token_url % (self._corpid, self._corpsecret) + res = RequestUtils().get_res(token_url) + if res: + ret_json = res.json() + if ret_json.get('errcode') == 0: + self._access_token = ret_json.get('access_token') + self._expires_in = ret_json.get('expires_in') + self._access_token_time = datetime.now() + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None + return self._access_token + + def __send_message(self, title, text, user_id=None): + """ + 发送文本消息 + :param title: 消息标题 + :param text: 消息内容 + :param user_id: 消息发送对象的ID,为空则发给所有人 + :return: 发送状态,错误信息 + """ + if not self.__get_access_token(): + return False, "参数未配置或配置不正确" + message_url = self._send_msg_url % self.__get_access_token() + if text: + conent = "%s\n%s" % (title, text.replace("\n\n", "\n")) + else: + conent = title + if not user_id: + user_id = "@all" + req_json = { + "touser": user_id, + "msgtype": "text", + "agentid": self._agent_id, + "text": { + "content": conent + }, + "safe": 0, + "enable_id_trans": 0, + "enable_duplicate_check": 0 + } + return self.__post_request(message_url, req_json) + + def __send_image_message(self, title, text, image_url, url, user_id=None): + """ + 发送图文消息 + :param title: 消息标题 + :param text: 消息内容 + :param image_url: 图片地址 + :param url: 点击消息跳转URL + :param user_id: 消息发送对象的ID,为空则发给所有人 + :return: 发送状态,错误信息 + """ + if not self.__get_access_token(): + return False, "获取微信access_token失败,请检查参数配置" + message_url = self._send_msg_url % self.__get_access_token() + if text: + text = text.replace("\n\n", "\n") + if not user_id: + user_id = "@all" + req_json = { + "touser": user_id, + "msgtype": "news", + "agentid": self._agent_id, + "news": { + "articles": [ + { + "title": title, + "description": text, + "picurl": image_url, + "url": url + } + ] + } + } + return self.__post_request(message_url, req_json) + + def send_msg(self, title, text="", image="", url="", user_id=None): + """ + 微信消息发送入口,支持文本、图片、链接跳转、指定发送对象 + :param title: 消息标题 + :param text: 消息内容 + :param image: 图片地址 + :param url: 点击消息跳转URL + :param user_id: 消息发送对象的ID,为空则发给所有人 + :return: 发送状态,错误信息 + """ + if not title and not text: + return False, "标题和内容不能同时为空" + if image: + ret_code, ret_msg = self.__send_image_message(title, text, image, url, user_id) + else: + ret_code, ret_msg = self.__send_message(title, text, user_id) + return ret_code, ret_msg + + def send_list_msg(self, medias: list, user_id="", title="", **kwargs): + """ + 发送列表类消息 + """ + if not self.__get_access_token(): + return False, "参数未配置或配置不正确" + if not isinstance(medias, list): + return False, "数据错误" + message_url = self._send_msg_url % self.__get_access_token() + if not user_id: + user_id = "@all" + articles = [] + index = 1 + for media in medias: + if media.get_vote_string(): + title = f"{index}. {media.get_title_string()}\n{media.get_type_string()},{media.get_vote_string()}" + else: + title = f"{index}. {media.get_title_string()}\n{media.get_type_string()}" + articles.append({ + "title": title, + "description": "", + "picurl": media.get_message_image() if index == 1 else media.get_poster_image(), + "url": media.get_detail_url() + }) + index += 1 + req_json = { + "touser": user_id, + "msgtype": "news", + "agentid": self._agent_id, + "news": { + "articles": articles + } + } + return self.__post_request(message_url, req_json) + + def __post_request(self, message_url, req_json): + """ + 向微信发送请求 + """ + headers = {'content-type': 'application/json'} + try: + res = RequestUtils(headers=headers).post(message_url, + params=json.dumps(req_json, ensure_ascii=False).encode('utf-8')) + if res: + ret_json = res.json() + if ret_json.get('errcode') == 0: + return True, ret_json.get('errmsg') + else: + if ret_json.get('errcode') == 42001: + self.__get_access_token(force=True) + return False, ret_json.get('errmsg') + else: + return False, None + except Exception as err: + ExceptionUtils.exception_traceback(err) + return False, str(err) diff --git a/app/message/message.py b/app/message/message.py new file mode 100644 index 0000000..c553993 --- /dev/null +++ b/app/message/message.py @@ -0,0 +1,540 @@ +import json +import re +from enum import Enum + +import log +from app.conf import ModuleConf +from app.helper import DbHelper, SubmoduleHelper +from app.message.message_center import MessageCenter +from app.utils import StringUtils, ExceptionUtils +from app.utils.commons import singleton +from app.utils.types import SearchType, MediaType +from config import Config + + +@singleton +class Message(object): + dbhelper = None + messagecenter = None + _message_schemas = [] + _active_clients = [] + _active_interactive_clients = {} + _client_configs = {} + _webhook_ignore = None + _domain = None + + def __init__(self): + self._message_schemas = SubmoduleHelper.import_submodules( + 'app.message.client', + filter_func=lambda _, obj: hasattr(obj, 'schema') + ) + log.debug(f"【Message】加载消息服务:{self._message_schemas}") + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.messagecenter = MessageCenter() + self._domain = Config().get_domain() + # 停止旧服务 + if self._active_clients: + for active_client in self._active_clients: + if active_client.get("search_type") in self.get_search_types(): + client = active_client.get("client") + if client and hasattr(client, "stop_service"): + client.stop_service() + # 活跃的客户端 + self._active_clients = [] + # 活跃的交互客户端 + self._active_interactive_clients = {} + # 全量客户端配置 + self._client_configs = {} + for client_config in self.dbhelper.get_message_client() or []: + config = json.loads(client_config.CONFIG) if client_config.CONFIG else {} + config.update({ + "interactive": client_config.INTERACTIVE + }) + client_conf = { + "id": client_config.ID, + "name": client_config.NAME, + "type": client_config.TYPE, + "config": config, + "switchs": json.loads(client_config.SWITCHS) if client_config.SWITCHS else [], + "interactive": client_config.INTERACTIVE, + "enabled": client_config.ENABLED + } + self._client_configs[str(client_config.ID)] = client_conf + if not client_config.ENABLED or not config: + continue + client = { + "search_type": ModuleConf.MESSAGE_CONF.get('client').get(client_config.TYPE, {}).get('search_type'), + "client": self.__build_class(ctype=client_config.TYPE, conf=config) + } + client.update(client_conf) + self._active_clients.append(client) + if client.get("interactive"): + self._active_interactive_clients[client.get("search_type")] = client + + def __build_class(self, ctype, conf): + for message_schema in self._message_schemas: + try: + if message_schema.match(ctype): + return message_schema(conf) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None + + def get_status(self, ctype=None, config=None): + """ + 测试消息设置状态 + """ + if not config or not ctype: + return False + # 测试状态不启动监听服务 + state, ret_msg = self.__build_class(ctype=ctype, + conf=config).send_msg(title="测试", + text="这是一条测试消息", + url="https://github.com/NAStool/nas-tools") + if not state: + log.error(f"【Message】{ctype} 发送测试消息失败:%s" % ret_msg) + return state + + def get_webhook_ignore(self): + """ + 获取Emby/Jellyfin不通知的设备清单 + """ + return self._webhook_ignore or [] + + def __sendmsg(self, client, title, text="", image="", url="", user_id=""): + """ + 通用消息发送 + :param client: 消息端 + :param title: 消息标题 + :param text: 消息内容 + :param image: 图片URL + :param url: 消息跳转地址 + :param user_id: 用户ID,如有则只发给这个用户 + :return: 发送状态、错误信息 + """ + if not client or not client.get('client'): + return None + cname = client.get('name') + log.info(f"【Message】发送消息 {cname}:title={title}, text={text}") + if self._domain: + if url: + if not url.startswith("http"): + url = "%s?next=%s" % (self._domain, url) + else: + url = self._domain + else: + url = "" + state, ret_msg = client.get('client').send_msg(title=title, + text=text, + image=image, + url=url, + user_id=user_id) + if not state: + log.error(f"【Message】{cname} 消息发送失败:%s" % ret_msg) + return state + + def send_channel_msg(self, channel, title, text="", image="", url="", user_id=""): + """ + 按渠道发送消息,用于消息交互 + :param channel: 消息渠道 + :param title: 消息标题 + :param text: 消息内容 + :param image: 图片URL + :param url: 消息跳转地址 + :param user_id: 用户ID,如有则只发给这个用户 + :return: 发送状态、错误信息 + """ + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + client = self._active_interactive_clients.get(channel) + if client: + state = self.__sendmsg(client=client, + title=title, + text=text, + image=image, + url=url, + user_id=user_id) + return state + return False + + def __send_list_msg(self, client, medias, user_id, title): + """ + 发送选择类消息 + """ + if not client or not client.get('client'): + return None + cname = client.get('name') + log.info(f"【Message】发送消息 {cname}:title={title}") + state, ret_msg = client.get('client').send_list_msg(medias=medias, + user_id=user_id, + title=title, + url=self._domain) + if not state: + log.error(f"【Message】{cname} 发送消息失败:%s" % ret_msg) + return state + + def send_channel_list_msg(self, channel, title, medias: list, user_id=""): + """ + 发送列表选择消息,用于消息交互 + :param channel: 消息渠道 + :param title: 消息标题 + :param medias: 媒体信息列表 + :param user_id: 用户ID,如有则只发给这个用户 + :return: 发送状态、错误信息 + """ + client = self._active_interactive_clients.get(channel) + if client: + state = self.__send_list_msg(client=client, + title=title, + medias=medias, + user_id=user_id) + return state + return False + + def send_download_message(self, in_from: SearchType, can_item): + """ + 发送下载的消息 + :param in_from: 下载来源 + :param can_item: 下载的媒体信息 + :return: 发送状态、错误信息 + """ + msg_title = f"{can_item.get_title_ep_string()} 开始下载" + msg_text = f"{can_item.get_star_string()}" + msg_text = f"{msg_text}\n来自:{in_from.value}" + if can_item.user_name: + msg_text = f"{msg_text}\n用户:{can_item.user_name}" + if can_item.site: + if in_from == SearchType.USERRSS: + msg_text = f"{msg_text}\n任务:{can_item.site}" + else: + msg_text = f"{msg_text}\n站点:{can_item.site}" + if can_item.get_resource_type_string(): + msg_text = f"{msg_text}\n质量:{can_item.get_resource_type_string()}" + if can_item.size: + if str(can_item.size).isdigit(): + size = StringUtils.str_filesize(can_item.size) + else: + size = can_item.size + msg_text = f"{msg_text}\n大小:{size}" + if can_item.org_string: + msg_text = f"{msg_text}\n种子:{can_item.org_string}" + if can_item.seeders: + msg_text = f"{msg_text}\n做种数:{can_item.seeders}" + msg_text = f"{msg_text}\n促销:{can_item.get_volume_factor_string()}" + if can_item.hit_and_run: + msg_text = f"{msg_text}\nHit&Run:是" + if can_item.description: + html_re = re.compile(r'<[^>]+>', re.S) + description = html_re.sub('', can_item.description) + can_item.description = re.sub(r'<[^>]+>', '', description) + msg_text = f"{msg_text}\n描述:{can_item.description}" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=msg_title, content=msg_text) + # 发送消息 + for client in self._active_clients: + if "download_start" in client.get("switchs"): + self.__sendmsg( + client=client, + title=msg_title, + text=msg_text, + image=can_item.get_message_image(), + url='downloading' + ) + + def send_transfer_movie_message(self, in_from: Enum, media_info, exist_filenum, category_flag): + """ + 发送转移电影的消息 + :param in_from: 转移来源 + :param media_info: 转移的媒体信息 + :param exist_filenum: 已存在的文件数 + :param category_flag: 二级分类开关 + :return: 发送状态、错误信息 + """ + msg_title = f"{media_info.get_title_string()} 已入库" + if media_info.vote_average: + msg_str = f"{media_info.get_vote_string()},类型:电影" + else: + msg_str = "类型:电影" + if media_info.category: + if category_flag: + msg_str = f"{msg_str},类别:{media_info.category}" + if media_info.get_resource_type_string(): + msg_str = f"{msg_str},质量:{media_info.get_resource_type_string()}" + msg_str = f"{msg_str},大小:{StringUtils.str_filesize(media_info.size)},来自:{in_from.value}" + if exist_filenum != 0: + msg_str = f"{msg_str},{exist_filenum}个文件已存在" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=msg_title, content=msg_str) + # 发送消息 + for client in self._active_clients: + if "transfer_finished" in client.get("switchs"): + self.__sendmsg( + client=client, + title=msg_title, + text=msg_str, + image=media_info.get_message_image(), + url='history' + ) + + def send_transfer_tv_message(self, message_medias: dict, in_from: Enum): + """ + 发送转移电视剧/动漫的消息 + """ + for item_info in message_medias.values(): + if item_info.total_episodes == 1: + msg_title = f"{item_info.get_title_string()} {item_info.get_season_episode_string()} 已入库" + else: + msg_title = f"{item_info.get_title_string()} {item_info.get_season_string()} 共{item_info.total_episodes}集 已入库" + if item_info.vote_average: + msg_str = f"{item_info.get_vote_string()},类型:{item_info.type.value}" + else: + msg_str = f"类型:{item_info.type.value}" + if item_info.category: + msg_str = f"{msg_str},类别:{item_info.category}" + if item_info.total_episodes == 1: + msg_str = f"{msg_str},大小:{StringUtils.str_filesize(item_info.size)},来自:{in_from.value}" + else: + msg_str = f"{msg_str},总大小:{StringUtils.str_filesize(item_info.size)},来自:{in_from.value}" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=msg_title, content=msg_str) + # 发送消息 + for client in self._active_clients: + if "transfer_finished" in client.get("switchs"): + self.__sendmsg( + client=client, + title=msg_title, + text=msg_str, + image=item_info.get_message_image(), + url='history') + + def send_download_fail_message(self, item, error_msg): + """ + 发送下载失败的消息 + """ + title = "添加下载任务失败:%s %s" % (item.get_title_string(), item.get_season_episode_string()) + text = f"站点:{item.site}\n种子名称:{item.org_string}\n种子链接:{item.enclosure}\n错误信息:{error_msg}" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "download_fail" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text, + image=item.get_message_image() + ) + + def send_rss_success_message(self, in_from: Enum, media_info): + """ + 发送订阅成功的消息 + """ + if media_info.type == MediaType.MOVIE: + msg_title = f"{media_info.get_title_string()} 已添加订阅" + else: + msg_title = f"{media_info.get_title_string()} {media_info.get_season_string()} 已添加订阅" + msg_str = f"类型:{media_info.type.value}" + if media_info.vote_average: + msg_str = f"{msg_str},{media_info.get_vote_string()}" + msg_str = f"{msg_str},来自:{in_from.value}" + if media_info.user_name: + msg_str = f"{msg_str},用户:{media_info.user_name}" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=msg_title, content=msg_str) + # 发送消息 + for client in self._active_clients: + if "rss_added" in client.get("switchs"): + self.__sendmsg( + client=client, + title=msg_title, + text=msg_str, + image=media_info.get_message_image(), + url='movie_rss' if media_info.type == MediaType.MOVIE else 'tv_rss' + ) + + def send_rss_finished_message(self, media_info): + """ + 发送订阅完成的消息,只针对电视剧 + """ + if media_info.type == MediaType.MOVIE: + return + else: + if media_info.over_edition: + msg_title = f"{media_info.get_title_string()} {media_info.get_season_string()} 已完成洗版" + else: + msg_title = f"{media_info.get_title_string()} {media_info.get_season_string()} 已完成订阅" + msg_str = f"类型:{media_info.type.value}" + if media_info.vote_average: + msg_str = f"{msg_str},{media_info.get_vote_string()}" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=msg_title, content=msg_str) + # 发送消息 + for client in self._active_clients: + if "rss_finished" in client.get("switchs"): + self.__sendmsg( + client=client, + title=msg_title, + text=msg_str, + image=media_info.get_message_image(), + url='downloaded' + ) + + def send_site_signin_message(self, msgs: list): + """ + 发送站点签到消息 + """ + if not msgs: + return + title = "站点签到" + text = "\n".join(msgs) + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "site_signin" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text + ) + + def send_site_message(self, title=None, text=None): + """ + 发送站点消息 + """ + if not title: + return + if not text: + text = "" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "site_message" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text + ) + + def send_transfer_fail_message(self, path, count, text): + """ + 发送转移失败的消息 + """ + if not path or not count: + return + title = f"【{count} 个文件入库失败】" + text = f"源路径:{path}\n原因:{text}" + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "transfer_fail" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text, + url="unidentification" + ) + + def send_brushtask_remove_message(self, title, text): + """ + 发送刷流删种的消息 + """ + if not title or not text: + return + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "brushtask_remove" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text, + url="brushtask" + ) + + def send_brushtask_added_message(self, title, text): + """ + 发送刷流下种的消息 + """ + if not title or not text: + return + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "brushtask_added" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text, + url="brushtask" + ) + + def send_mediaserver_message(self, title, text, image): + """ + 发送媒体服务器的消息 + """ + if not title or not text or not image: + return + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "mediaserver_message" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text, + image=image + ) + + def send_custom_message(self, title, text="", image=""): + """ + 发送自定义消息 + """ + if not title: + return + # 插入消息中心 + self.messagecenter.insert_system_message(level="INFO", title=title, content=text) + # 发送消息 + for client in self._active_clients: + if "custom_message" in client.get("switchs"): + self.__sendmsg( + client=client, + title=title, + text=text, + image=image + ) + + def get_message_client_info(self, cid=None): + """ + 获取消息端信息 + """ + if cid: + return self._client_configs.get(str(cid)) + return self._client_configs + + def get_interactive_client(self, client_type=None): + """ + 查询当前可以交互的渠道 + """ + if client_type: + return self._active_interactive_clients.get(client_type) + else: + return [client for client in self._active_interactive_clients.values()] + + @staticmethod + def get_search_types(): + """ + 查询可交互的渠道 + """ + return [info.get("search_type") + for info in ModuleConf.MESSAGE_CONF.get('client').values() + if info.get('search_type')] diff --git a/app/message/message_center.py b/app/message/message_center.py new file mode 100644 index 0000000..80b477d --- /dev/null +++ b/app/message/message_center.py @@ -0,0 +1,59 @@ +import datetime +import time +from collections import deque + +from app.utils.commons import singleton + + +@singleton +class MessageCenter: + _message_queue = deque(maxlen=50) + _message_index = 0 + + def __init__(self): + pass + + def insert_system_message(self, level, title, content=None): + """ + 新增系统消息 + :param level: 级别 + :param title: 标题 + :param content: 内容 + """ + if not level or not title: + return + if not content and title.find(":") != -1: + strings = title.split(":") + if strings and len(strings) > 1: + title = strings[0] + content = strings[1] + title = title.replace("\n", "
").strip() if title else "" + content = content.replace("\n", "
").strip() if content else "" + self.__append_message_queue(level, title, content) + + def __append_message_queue(self, level, title, content): + """ + 将消息增加到队列 + """ + self._message_queue.appendleft({"level": level, + "title": title, + "content": content, + "time": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))}) + + def get_system_messages(self, num=20, lst_time=None): + """ + 查询系统消息 + :param num:条数 + :param lst_time: 最后时间 + """ + if not lst_time: + return list(self._message_queue)[-num:] + else: + ret_messages = [] + for message in list(self._message_queue): + if (datetime.datetime.strptime(message.get("time"), '%Y-%m-%d %H:%M:%S') - datetime.datetime.strptime( + lst_time, '%Y-%m-%d %H:%M:%S')).seconds > 0: + ret_messages.append(message) + else: + break + return ret_messages diff --git a/app/rss.py b/app/rss.py new file mode 100644 index 0000000..f22de7f --- /dev/null +++ b/app/rss.py @@ -0,0 +1,628 @@ +import re +import xml.dom.minidom +from threading import Lock + +import log +from app.downloader import Downloader +from app.filter import Filter +from app.helper import DbHelper +from app.media import Media +from app.media.meta import MetaInfo +from app.sites import Sites +from app.subscribe import Subscribe +from app.utils import DomUtils, RequestUtils, StringUtils, ExceptionUtils, RssTitleUtils, Torrent +from app.utils.types import MediaType, SearchType + +lock = Lock() + + +class Rss: + _sites = [] + filter = None + media = None + downloader = None + searcher = None + dbhelper = None + subscribe = None + + def __init__(self): + self.media = Media() + self.downloader = Downloader() + self.sites = Sites() + self.filter = Filter() + self.dbhelper = DbHelper() + self.subscribe = Subscribe() + self.init_config() + + def init_config(self): + self._sites = self.sites.get_sites(rss=True) + + def rssdownload(self): + """ + RSS订阅检索下载入口,由定时服务调用 + """ + + if not self._sites: + return + + with lock: + log.info("【Rss】开始RSS订阅...") + + # 读取电影订阅 + rss_movies = self.subscribe.get_subscribe_movies(state='R') + if not rss_movies: + log.warn("【Rss】没有正在订阅的电影") + else: + log.info("【Rss】电影订阅清单:%s" + % " ".join('%s' % info.get("name") for _, info in rss_movies.items())) + # 读取电视剧订阅 + rss_tvs = self.subscribe.get_subscribe_tvs(state='R') + if not rss_tvs: + log.warn("【Rss】没有正在订阅的电视剧") + else: + log.info("【Rss】电视剧订阅清单:%s" + % " ".join('%s' % info.get("name") for _, info in rss_tvs.items())) + # 没有订阅退出 + if not rss_movies and not rss_tvs: + return + + # 获取有订阅的站点范围 + check_sites = [] + check_all = False + for rid, rinfo in rss_movies.items(): + rss_sites = rinfo.get("rss_sites") + if not rss_sites: + check_all = True + break + else: + check_sites += rss_sites + if not check_all: + for rid, rinfo in rss_tvs.items(): + rss_sites = rinfo.get("rss_sites") + if not rss_sites: + check_all = True + break + else: + check_sites += rss_sites + if check_all: + check_sites = [] + else: + check_sites = list(set(check_sites)) + + # 匹配到的资源列表 + rss_download_torrents = [] + # 缺失的资源详情 + rss_no_exists = {} + # 遍历站点资源 + for site_info in self._sites: + if not site_info: + continue + # 站点名称 + site_name = site_info.get("name") + # 没有订阅的站点中的不检索 + if check_sites and site_name not in check_sites: + continue + # 站点rss链接 + rss_url = site_info.get("rssurl") + if not rss_url: + log.info(f"【Rss】{site_name} 未配置rssurl,跳过...") + continue + site_cookie = site_info.get("cookie") + site_ua = site_info.get("ua") + # 是否解析种子详情 + site_parse = site_info.get("parse") + # 是否使用代理 + site_proxy = site_info.get("proxy") + # 使用的规则 + site_fliter_rule = site_info.get("rule") + # 开始下载RSS + log.info(f"【Rss】正在处理:{site_name}") + if site_info.get("pri"): + site_order = 100 - int(site_info.get("pri")) + else: + site_order = 0 + rss_acticles = self.parse_rssxml(rss_url) + if not rss_acticles: + log.warn(f"【Rss】{site_name} 未下载到数据") + continue + else: + log.info(f"【Rss】{site_name} 获取数据:{len(rss_acticles)}") + # 处理RSS结果 + res_num = 0 + for article in rss_acticles: + try: + # 种子名 + title = article.get('title') + # 种子链接 + enclosure = article.get('enclosure') + # 种子页面 + page_url = article.get('link') + # 种子大小 + size = article.get('size') + # 开始处理 + log.info(f"【Rss】开始处理:{title}") + # 检查这个种子是不是下过了 + if self.dbhelper.is_torrent_rssd(enclosure): + log.info(f"【Rss】{title} 已成功订阅过") + continue + # 识别种子名称,开始检索TMDB + media_info = MetaInfo(title=title) + cache_info = self.media.get_cache_info(media_info) + if cache_info.get("id"): + # 使用缓存信息 + media_info.tmdb_id = cache_info.get("id") + media_info.type = cache_info.get("type") + media_info.title = cache_info.get("title") + media_info.year = cache_info.get("year") + else: + # 重新查询TMDB + media_info = self.media.get_media_info(title=title) + if not media_info: + log.warn(f"【Rss】{title} 无法识别出媒体信息!") + continue + elif not media_info.tmdb_info: + log.info(f"【Rss】{title} 识别为 {media_info.get_name()} 未匹配到TMDB媒体信息") + # 大小及种子页面 + media_info.set_torrent_info(size=size, + page_url=page_url, + site=site_name, + site_order=site_order, + enclosure=enclosure) + # 检查种子是否匹配订阅,返回匹配到的订阅ID、是否洗版、总集数、上传因子、下载因子 + match_flag, match_msg, match_info = self.check_torrent_rss( + media_info=media_info, + rss_movies=rss_movies, + rss_tvs=rss_tvs, + site_filter_rule=site_fliter_rule, + site_cookie=site_cookie, + site_parse=site_parse, + site_ua=site_ua, + site_proxy=site_proxy) + for msg in match_msg: + log.info(f"【Rss】{msg}") + + # 未匹配 + if not match_flag: + continue + + # 非模糊匹配命中,检查本地情况,检查删除订阅 + if not match_info.get("fuzzy_match"): + # 匹配到订阅,如没有TMDB信息则重新查询 + if not media_info.tmdb_info and media_info.tmdb_id: + media_info.set_tmdb_info(self.media.get_tmdb_info(mtype=media_info.type, + tmdbid=media_info.tmdb_id)) + if not media_info.tmdb_info: + continue + # 非洗版时检查本地是否存在 + if not match_info.get("over_edition"): + if media_info.type == MediaType.MOVIE: + exist_flag, rss_no_exists, _ = self.downloader.check_exists_medias( + meta_info=media_info, + no_exists=rss_no_exists + ) + else: + # 从登记薄中获取缺失剧集 + season = 1 + if match_info.get("season"): + season = int(str(match_info.get("season")).replace("S", "")) + # 设定的总集数 + total_ep = match_info.get("total") + # 设定的开始集数 + current_ep = match_info.get("current_ep") + # 表登记的缺失集数 + episodes = self.subscribe.get_subscribe_tv_episodes(match_info.get("id")) + if episodes is None: + episodes = [] + if current_ep: + episodes = list(range(int(current_ep), int(total_ep) + 1)) + rss_no_exists[media_info.tmdb_id] = [ + { + "season": season, + "episodes": episodes, + "total_episodes": total_ep + } + ] + else: + rss_no_exists[media_info.tmdb_id] = [ + { + "season": season, + "episodes": episodes, + "total_episodes": total_ep + } + ] + # 检查本地媒体库情况 + exist_flag, library_no_exists, _ = self.downloader.check_exists_medias( + meta_info=media_info, + total_ep={season: total_ep} + ) + # 取交集做为缺失集 + rss_no_exists = Torrent.get_intersection_episodes(target=rss_no_exists, + source=library_no_exists, + title=media_info.tmdb_id) + if rss_no_exists.get(media_info.tmdb_id): + log.info("【Rss】%s 订阅缺失季集:%s" % ( + media_info.get_title_string(), + rss_no_exists.get(media_info.tmdb_id) + )) + # 本地已存在 + if exist_flag: + continue + # 洗版模式 + else: + # 洗版时季集不完整的资源不要 + if media_info.type != MediaType.MOVIE \ + and media_info.get_episode_list(): + log.info( + f"【Rss】{media_info.get_title_string()}{media_info.get_season_string()} " + f"正在洗版,过滤掉季集不完整的资源:{title}" + ) + continue + if not self.subscribe.check_subscribe_over_edition( + rtype=media_info.type, + rssid=match_info.get("id"), + res_order=match_info.get("res_order")): + log.info( + f"【Rss】{media_info.get_title_string()}{media_info.get_season_string()} " + f"正在洗版,跳过低优先级或同优先级资源:{title}" + ) + continue + # 模糊匹配 + else: + # 不做处理,直接下载 + pass + + # 设置种子信息 + media_info.set_torrent_info(res_order=match_info.get("res_order"), + filter_rule=match_info.get("filter_rule"), + over_edition=match_info.get("over_edition"), + download_volume_factor=match_info.get("download_volume_factor"), + upload_volume_factor=match_info.get("upload_volume_factor"), + rssid=match_info.get("id")) + # 设置下载参数 + media_info.set_download_info(download_setting=match_info.get("download_setting"), + save_path=match_info.get("save_path")) + # 插入数据库历史记录 + self.dbhelper.insert_rss_torrents(media_info) + # 加入下载列表 + if media_info not in rss_download_torrents: + rss_download_torrents.append(media_info) + res_num = res_num + 1 + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【Rss】处理RSS发生错误:%s" % str(e)) + continue + log.info("【Rss】%s 处理结束,匹配到 %s 个有效资源" % (site_name, res_num)) + log.info("【Rss】所有RSS处理结束,共 %s 个有效资源" % len(rss_download_torrents)) + # 开始择优下载 + self.download_rss_torrent(rss_download_torrents=rss_download_torrents, + rss_no_exists=rss_no_exists) + + @staticmethod + def parse_rssxml(url): + """ + 解析RSS订阅URL,获取RSS中的种子信息 + :param url: RSS地址 + :return: 种子信息列表 + """ + _special_title_sites = { + 'pt.keepfrds.com': RssTitleUtils.keepfriends_title + } + + # 开始处理 + ret_array = [] + if not url: + return [] + site_domain = StringUtils.get_url_domain(url) + try: + ret = RequestUtils().get_res(url) + if not ret: + return [] + ret.encoding = ret.apparent_encoding + except Exception as e2: + ExceptionUtils.exception_traceback(e2) + log.console(str(e2)) + return [] + if ret: + ret_xml = ret.text + try: + # 解析XML + dom_tree = xml.dom.minidom.parseString(ret_xml) + rootNode = dom_tree.documentElement + items = rootNode.getElementsByTagName("item") + for item in items: + try: + # 标题 + title = DomUtils.tag_value(item, "title", default="") + if not title: + continue + # 标题特殊处理 + if site_domain and site_domain in _special_title_sites: + title = _special_title_sites.get(site_domain)(title) + # 描述 + description = DomUtils.tag_value(item, "description", default="") + # 种子页面 + link = DomUtils.tag_value(item, "link", default="") + # 种子链接 + enclosure = DomUtils.tag_value(item, "enclosure", "url", default="") + if not enclosure and not link: + continue + # 部分RSS只有link没有enclosure + if not enclosure and link: + enclosure = link + link = None + # 大小 + size = DomUtils.tag_value(item, "enclosure", "length", default=0) + if size and str(size).isdigit(): + size = int(size) + else: + size = 0 + # 发布日期 + pubdate = DomUtils.tag_value(item, "pubDate", default="") + if pubdate: + # 转换为时间 + pubdate = StringUtils.get_time_stamp(pubdate) + # 返回对象 + tmp_dict = {'title': title, + 'enclosure': enclosure, + 'size': size, + 'description': description, + 'link': link, + 'pubdate': pubdate} + ret_array.append(tmp_dict) + except Exception as e1: + ExceptionUtils.exception_traceback(e1) + continue + except Exception as e2: + ExceptionUtils.exception_traceback(e2) + return ret_array + return ret_array + + def check_torrent_rss(self, + media_info, + rss_movies, + rss_tvs, + site_filter_rule, + site_cookie, + site_parse, + site_ua, + site_proxy): + """ + 判断种子是否命中订阅 + :param media_info: 已识别的种子媒体信息 + :param rss_movies: 电影订阅清单 + :param rss_tvs: 电视剧订阅清单 + :param site_filter_rule: 站点过滤规则 + :param site_cookie: 站点的Cookie + :param site_parse: 是否解析种子详情 + :param site_ua: 站点请求UA + :param site_proxy: 是否使用代理 + :return: 匹配到的订阅ID、是否洗版、总集数、匹配规则的资源顺序、上传因子、下载因子,匹配的季(电视剧) + """ + # 默认值 + # 匹配状态 0不在订阅范围内 -1不符合过滤条件 1匹配 + match_flag = False + # 匹配的rss信息 + match_msg = [] + match_rss_info = {} + # 上传因素 + upload_volume_factor = None + # 下载因素 + download_volume_factor = None + hit_and_run = False + + # 匹配电影 + if media_info.type == MediaType.MOVIE and rss_movies: + for rid, rss_info in rss_movies.items(): + rss_sites = rss_info.get('rss_sites') + # 过滤订阅站点 + if rss_sites and media_info.site not in rss_sites: + continue + # tmdbid或名称年份匹配 + name = rss_info.get('name') + year = rss_info.get('year') + tmdbid = rss_info.get('tmdbid') + fuzzy_match = rss_info.get('fuzzy_match') + # 非模糊匹配 + if not fuzzy_match: + # 有tmdbid时使用tmdbid匹配 + if tmdbid and not tmdbid.startswith("DB:"): + if str(media_info.tmdb_id) != str(tmdbid): + continue + else: + # 豆瓣年份与tmdb取向不同 + if year and str(media_info.year) not in [str(year), + str(int(year) + 1), + str(int(year) - 1)]: + continue + if name != media_info.title: + continue + # 模糊匹配 + else: + # 匹配年份 + if year and str(year) != str(media_info.year): + continue + # 匹配关键字或正则表达式 + search_title = f"{media_info.org_string} {media_info.title} {media_info.year}" + if not re.search(name, search_title, re.I) and name not in search_title: + continue + # 媒体匹配成功 + match_flag = True + match_rss_info = rss_info + + break + # 匹配电视剧 + elif rss_tvs: + # 匹配种子标题 + for rid, rss_info in rss_tvs.items(): + rss_sites = rss_info.get('rss_sites') + # 过滤订阅站点 + if rss_sites and media_info.site not in rss_sites: + continue + # 有tmdbid时精确匹配 + name = rss_info.get('name') + year = rss_info.get('year') + season = rss_info.get('season') + tmdbid = rss_info.get('tmdbid') + fuzzy_match = rss_info.get('fuzzy_match') + # 非模糊匹配 + if not fuzzy_match: + if tmdbid and not tmdbid.startswith("DB:"): + if str(media_info.tmdb_id) != str(tmdbid): + continue + else: + # 匹配年份,年份可以为空 + if year and str(year) != str(media_info.year): + continue + # 匹配名称 + if name != media_info.title: + continue + # 匹配季,季可以为空 + if season and season != media_info.get_season_string(): + continue + # 模糊匹配 + else: + # 匹配季,季可以为空 + if season and season != "S00" and season != media_info.get_season_string(): + continue + # 匹配年份 + if year and str(year) != str(media_info.year): + continue + # 匹配关键字或正则表达式 + search_title = f"{media_info.org_string} {media_info.title} {media_info.year}" + if not re.search(name, search_title, re.I) and name not in search_title: + continue + # 媒体匹配成功 + match_flag = True + match_rss_info = rss_info + break + # 名称匹配成功,开始过滤 + if match_flag: + # 解析种子详情 + if site_parse: + # 检测Free + torrent_attr = self.sites.check_torrent_attr(torrent_url=media_info.page_url, + cookie=site_cookie, + ua=site_ua, + proxy=site_proxy) + if torrent_attr.get('2xfree'): + download_volume_factor = 0.0 + upload_volume_factor = 2.0 + elif torrent_attr.get('free'): + download_volume_factor = 0.0 + upload_volume_factor = 1.0 + else: + upload_volume_factor = 1.0 + download_volume_factor = 1.0 + if torrent_attr.get('hr'): + hit_and_run = True + # 设置属性 + media_info.set_torrent_info(upload_volume_factor=upload_volume_factor, + download_volume_factor=download_volume_factor, + hit_and_run=hit_and_run) + # 订阅无过滤规则应用站点设置 + filter_rule = match_rss_info.get('filter_rule') or site_filter_rule + filter_dict = { + "restype": match_rss_info.get('filter_restype'), + "pix": match_rss_info.get('filter_pix'), + "team": match_rss_info.get('filter_team'), + "rule": filter_rule + } + match_filter_flag, res_order, match_filter_msg = self.filter.check_torrent_filter(meta_info=media_info, + filter_args=filter_dict) + if not match_filter_flag: + match_msg.append(match_filter_msg) + return False, match_msg, match_rss_info + else: + match_msg.append("%s 识别为 %s %s 匹配订阅成功" % ( + media_info.org_string, + media_info.get_title_string(), + media_info.get_season_episode_string())) + match_msg.append(f"种子描述:{media_info.subtitle}") + match_rss_info.update({ + "res_order": res_order, + "filter_rule": filter_rule, + "upload_volume_factor": upload_volume_factor, + "download_volume_factor": download_volume_factor}) + return True, match_msg, match_rss_info + else: + match_msg.append("%s 识别为 %s %s 不在订阅范围" % ( + media_info.org_string, + media_info.get_title_string(), + media_info.get_season_episode_string())) + return False, match_msg, match_rss_info + + def download_rss_torrent(self, rss_download_torrents, rss_no_exists): + """ + 根据缺失情况以及匹配到的结果选择下载种子 + """ + + if not rss_download_torrents: + return + + finished_rss_torrents = [] + updated_rss_torrents = [] + + def __finish_rss(download_item): + """ + 完成订阅 + """ + if not download_item: + return + if not download_item.rssid \ + or download_item.rssid in finished_rss_torrents: + return + finished_rss_torrents.append(download_item.rssid) + self.subscribe.finish_rss_subscribe(rssid=download_item.rssid, + media=download_item) + + def __update_tv_rss(download_item, left_media): + """ + 更新订阅集数 + """ + if not download_item or not left_media: + return + if not download_item.rssid \ + or download_item.rssid in updated_rss_torrents: + return + updated_rss_torrents.append(download_item.rssid) + self.subscribe.update_subscribe_tv_lack(rssid=download_item.rssid, + media_info=download_item, + seasoninfo=left_media) + + def __update_over_edition(download_item): + """ + 更新洗版订阅 + """ + if not download_item: + return + if not download_item.rssid \ + or download_item.rssid in updated_rss_torrents: + return + if download_item.get_episode_list(): + return + updated_rss_torrents.append(download_item.rssid) + self.subscribe.update_subscribe_over_edition(rtype=download_item.type, + rssid=download_item.rssid, + media=download_item) + + # 去重择优后开始添加下载 + download_items, left_medias = self.downloader.batch_download(SearchType.RSS, + rss_download_torrents, + rss_no_exists) + # 批量删除订阅 + if download_items: + for item in download_items: + if not item.rssid: + continue + if item.over_edition: + # 更新洗版订阅 + __update_over_edition(item) + elif not left_medias or not left_medias.get(item.tmdb_id): + # 删除电视剧订阅 + __finish_rss(item) + else: + # 更新电视剧缺失剧集 + __update_tv_rss(item, left_medias.get(item.tmdb_id)) + log.info("【Rss】实际下载了 %s 个资源" % len(download_items)) + else: + log.info("【Rss】未下载到任何资源") diff --git a/app/rsschecker.py b/app/rsschecker.py new file mode 100644 index 0000000..8fda61a --- /dev/null +++ b/app/rsschecker.py @@ -0,0 +1,662 @@ +import json +import traceback + +import jsonpath +from apscheduler.executors.pool import ThreadPoolExecutor +from apscheduler.schedulers.background import BackgroundScheduler +from lxml import etree + +import log +from app.downloader import Downloader +from app.filter import Filter +from app.helper import DbHelper +from app.media import Media +from app.media.meta import MetaInfo +from app.message import Message +from app.searcher import Searcher +from app.subscribe import Subscribe +from app.utils import RequestUtils, StringUtils, ExceptionUtils +from app.utils.commons import singleton +from app.utils.types import MediaType, SearchType +from config import Config + + +@singleton +class RssChecker(object): + message = None + searcher = None + filter = None + media = None + filterrule = None + downloader = None + subscribe = None + dbhelper = None + + _scheduler = None + _rss_tasks = [] + _rss_parsers = [] + _site_users = { + "D": "下载", + "R": "订阅", + "S": "搜索" + } + + def __init__(self): + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.message = Message() + self.searcher = Searcher() + self.filter = Filter() + self.media = Media() + self.downloader = Downloader() + self.subscribe = Subscribe() + # 移除现有任务 + try: + if self._scheduler: + self._scheduler.remove_all_jobs() + if self._scheduler.running: + self._scheduler.shutdown() + self._scheduler = None + except Exception as e: + ExceptionUtils.exception_traceback(e) + # 读取解析器列表 + rss_parsers = self.dbhelper.get_userrss_parser() + self._rss_parsers = [] + for rss_parser in rss_parsers: + self._rss_parsers.append( + { + "id": rss_parser.ID, + "name": rss_parser.NAME, + "type": rss_parser.TYPE, + "format": rss_parser.FORMAT, + "params": rss_parser.PARAMS, + "note": rss_parser.NOTE + } + ) + # 读取任务任务列表 + rsstasks = self.dbhelper.get_userrss_tasks() + self._rss_tasks = [] + for task in rsstasks: + parser = self.get_userrss_parser(task.PARSER) + if task.FILTER: + filterrule = self.filter.get_rule_groups(groupid=task.FILTER) + else: + filterrule = {} + # 解析属性 + note = {} + if task.NOTE: + try: + note = json.loads(task.NOTE) + except Exception as e: + print(str(e)) + note = {} + save_path = note.get("save_path") or "" + recognization = note.get("recognization") or "Y" + self._rss_tasks.append({ + "id": task.ID, + "name": task.NAME, + "address": task.ADDRESS, + "parser": task.PARSER, + "parser_name": parser.get("name") if parser else "", + "interval": task.INTERVAL, + "uses": task.USES if task.USES != "S" else "R", + "uses_text": self._site_users.get(task.USES), + "include": task.INCLUDE, + "exclude": task.EXCLUDE, + "filter": task.FILTER, + "filter_name": filterrule.get("name") if filterrule else "", + "update_time": task.UPDATE_TIME, + "counter": task.PROCESS_COUNT, + "state": task.STATE, + "save_path": task.SAVE_PATH or save_path, + "download_setting": task.DOWNLOAD_SETTING or "", + "recognization": task.RECOGNIZATION or recognization, + "over_edition": task.OVER_EDITION or 0, + "sites": json.loads(task.SITES) if task.SITES else {"rss_sites": [], "search_sites": []}, + "filter_args": json.loads(task.FILTER_ARGS) + if task.FILTER_ARGS else {"restype": "", "pix": "", "team": ""}, + }) + if not self._rss_tasks: + return + # 启动RSS任务 + self._scheduler = BackgroundScheduler(timezone=Config().get_timezone(), + executors={ + 'default': ThreadPoolExecutor(30) + }) + rss_flag = False + for task in self._rss_tasks: + if task.get("state") == "Y" and task.get("interval") and str(task.get("interval")).isdigit(): + rss_flag = True + self._scheduler.add_job(func=self.check_task_rss, + args=[task.get("id")], + trigger='interval', + seconds=int(task.get("interval")) * 60) + if rss_flag: + self._scheduler.print_jobs() + self._scheduler.start() + log.info("自定义订阅服务启动") + + def get_rsstask_info(self, taskid=None): + """ + 获取单个RSS任务详细信息 + """ + if taskid: + if str(taskid).isdigit(): + taskid = int(taskid) + for task in self._rss_tasks: + if task.get("id") == taskid: + return task + else: + return {} + return self._rss_tasks + + def check_task_rss(self, taskid): + """ + 处理自定义RSS任务,由定时服务调用 + :param taskid: 自定义RSS的ID + """ + if not taskid: + return + # 需要下载的项目 + rss_download_torrents = [] + # 需要订阅的项目 + rss_subscribe_torrents = [] + # 需要搜索的项目 + rss_search_torrents = [] + # 任务信息 + taskinfo = self.get_rsstask_info(taskid) + if not taskinfo: + return + rss_result = self.__parse_userrss_result(taskinfo) + if len(rss_result) == 0: + log.warn("【RssChecker】%s 未下载到数据" % taskinfo.get("name")) + return + else: + log.info("【RssChecker】%s 获取数据:%s" % (taskinfo.get("name"), len(rss_result))) + # 处理RSS结果 + res_num = 0 + no_exists = {} + for res in rss_result: + try: + # 种子名 + title = res.get('title') + if not title: + continue + # 种子链接 + enclosure = res.get('enclosure') + # 种子页面 + page_url = res.get('link') + # 种子大小 + size = StringUtils.str_filesize(res.get('size')) + # 年份 + year = res.get('year') + if year and len(year) > 4: + year = year[:4] + # 类型 + mediatype = res.get('type') + if mediatype: + mediatype = MediaType.MOVIE if mediatype == "movie" else MediaType.TV + + log.info("【RssChecker】开始处理:%s" % title) + + # 检查是不是处理过 + meta_name = "%s %s" % (title, year) if year else title + if self.dbhelper.is_userrss_finished(meta_name, enclosure): + log.info("【RssChecker】%s 已处理过" % title) + continue + + if taskinfo.get("uses") == "D": + # 识别种子名称,开始检索TMDB + media_info = MetaInfo(title=meta_name, + mtype=mediatype) + cache_info = self.media.get_cache_info(media_info) + if taskinfo.get("recognization") == "Y": + if cache_info.get("id"): + # 有缓存,直接使用缓存 + media_info.tmdb_id = cache_info.get("id") + media_info.type = cache_info.get("type") + media_info.title = cache_info.get("title") + media_info.year = cache_info.get("year") + else: + media_info = self.media.get_media_info(title=meta_name, + mtype=mediatype) + if not media_info: + log.warn("【RssChecker】%s 识别媒体信息出错!" % title) + continue + if not media_info.tmdb_info: + log.info("【RssChecker】%s 识别为 %s 未匹配到媒体信息" % (title, media_info.get_name())) + continue + # 检查是否已存在 + if media_info.type == MediaType.MOVIE: + exist_flag, no_exists, _ = self.downloader.check_exists_medias(meta_info=media_info, + no_exists=no_exists) + if exist_flag: + log.info("【RssChecker】电影 %s 已存在" % media_info.get_title_string()) + continue + else: + exist_flag, no_exists, _ = self.downloader.check_exists_medias(meta_info=media_info, + no_exists=no_exists) + # 当前剧集已存在,跳过 + if exist_flag: + # 已全部存在 + if not no_exists or not no_exists.get( + media_info.tmdb_id): + log.info("【RssChecker】电视剧 %s %s 已存在" % ( + media_info.get_title_string(), media_info.get_season_episode_string())) + continue + if no_exists.get(media_info.tmdb_id): + log.info("【RssChecker】%s 缺失季集:%s" + % (media_info.get_title_string(), no_exists.get(media_info.tmdb_id))) + # 大小及种子页面 + media_info.set_torrent_info(size=size, + page_url=page_url, + site=taskinfo.get("name"), + enclosure=enclosure) + # 检查种子是否匹配过滤条件 + filter_args = { + "include": taskinfo.get("include"), + "exclude": taskinfo.get("exclude"), + "rule": taskinfo.get("filter") + } + match_flag, res_order, match_msg = self.filter.check_torrent_filter(meta_info=media_info, + filter_args=filter_args) + # 未匹配 + if not match_flag: + log.info(f"【RssChecker】{match_msg}") + continue + else: + # 匹配优先级 + media_info.set_torrent_info(res_order=res_order) + if taskinfo.get("recognization") == "Y": + log.info("【RssChecker】%s 识别为 %s %s 匹配成功" % ( + title, + media_info.get_title_string(), + media_info.get_season_episode_string())) + # 补充TMDB完整信息 + if not media_info.tmdb_info: + media_info.set_tmdb_info(self.media.get_tmdb_info(mtype=media_info.type, + tmdbid=media_info.tmdb_id)) + # TMDB信息插入订阅任务 + if media_info.type != MediaType.MOVIE: + self.dbhelper.insert_userrss_mediainfos(taskid, media_info) + else: + log.info(f"【RssChecker】{title} 匹配成功") + # 添加下载列表 + if not enclosure: + log.warn("【RssChecker】%s RSS报文中没有enclosure种子链接" % taskinfo.get("name")) + continue + if media_info not in rss_download_torrents: + rss_download_torrents.append(media_info) + res_num = res_num + 1 + elif taskinfo.get("uses") == "R": + media_info = MetaInfo(title=meta_name, mtype=mediatype) + # 检查种子是否匹配过滤条件 + filter_args = { + "include": taskinfo.get("include"), + "exclude": taskinfo.get("exclude"), + "rule": -1 + + } + match_flag, _, match_msg = self.filter.check_torrent_filter(meta_info=media_info, + filter_args=filter_args) + # 未匹配 + if not match_flag: + log.info(f"【RssChecker】{match_msg}") + continue + # 添加订阅列表 + self.dbhelper.insert_rss_torrents(media_info) + if media_info not in rss_subscribe_torrents: + rss_subscribe_torrents.append(media_info) + res_num = res_num + 1 + else: + continue + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【RssChecker】处理RSS发生错误:%s - %s" % (str(e), traceback.format_exc())) + continue + log.info("【RssChecker】%s 处理结束,匹配到 %s 个有效资源" % (taskinfo.get("name"), res_num)) + # 添加下载 + if rss_download_torrents: + for media in rss_download_torrents: + ret, ret_msg = self.downloader.download(media_info=media, + download_dir=taskinfo.get("save_path"), + download_setting=taskinfo.get("download_setting")) + if ret: + self.message.send_download_message(in_from=SearchType.USERRSS, + can_item=media) + # 下载类型的 这里下载成功了 插入数据库 + self.dbhelper.insert_rss_torrents(media) + # 登记自定义RSS任务下载记录 + downloader = self.downloader.get_default_client_type().value + if media.download_setting: + download_attr = self.downloader.get_download_setting(media.download_setting) + if download_attr.get("downloader"): + downloader = download_attr.get("downloader") + self.dbhelper.insert_userrss_task_history(taskid, media.org_string, downloader) + else: + log.error("【RssChecker】添加下载任务 %s 失败:%s" % ( + media.get_title_string(), ret_msg or "请检查下载任务是否已存在")) + if ret_msg: + self.message.send_download_fail_message(media, ret_msg) + # 添加订阅 + if rss_subscribe_torrents: + for media in rss_subscribe_torrents: + code, msg, rss_media = self.subscribe.add_rss_subscribe( + mtype=media.type, + name=media.get_name(), + year=media.year, + season=media.begin_season, + rss_sites=taskinfo.get("sites", {}).get("rss_sites"), + search_sites=taskinfo.get("sites", {}).get("search_sites"), + over_edition=True if taskinfo.get("over_edition") else False, + filter_restype=taskinfo.get("filter_args", {}).get("restype"), + filter_pix=taskinfo.get("filter_args", {}).get("pix"), + filter_team=taskinfo.get("filter_args", {}).get("team"), + filter_rule=taskinfo.get("filter"), + save_path=taskinfo.get("save_path"), + download_setting=taskinfo.get("download_setting"), + ) + if rss_media and code == 0: + self.message.send_rss_success_message(in_from=SearchType.USERRSS, media_info=rss_media) + else: + log.warn("【RssChecker】%s 添加订阅失败:%s" % (media.get_name(), msg)) + + # 更新状态 + counter = len(rss_download_torrents) + len(rss_subscribe_torrents) + len(rss_search_torrents) + if counter: + self.dbhelper.update_userrss_task_info(taskid, counter) + + def __parse_userrss_result(self, taskinfo): + """ + 获取RSS链接数据,根据PARSER进行解析获取返回结果 + """ + rss_parser = self.get_userrss_parser(taskinfo.get("parser")) + if not rss_parser: + log.error("【RssChecker】任务 %s 的解析配置不存在" % taskinfo.get("name")) + return [] + if not rss_parser.get("format"): + log.error("【RssChecker】任务 %s 的解析配置不正确" % taskinfo.get("name")) + return [] + try: + rss_parser_format = json.loads(rss_parser.get("format")) + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【RssChecker】任务 %s 的解析配置不是合法的Json格式" % taskinfo.get("name")) + return [] + # 拼装链接 + rss_url = taskinfo.get("address") + if not rss_url: + return [] + if rss_parser.get("params"): + _dict = { + "TMDBKEY": Config().get_config("app").get("rmt_tmdbkey") + } + try: + param_url = rss_parser.get("params").format(**_dict) + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【RssChecker】任务 %s 的解析配置附加参数不合法" % taskinfo.get("name")) + return [] + rss_url = "%s?%s" % (rss_url, param_url) if rss_url.find("?") == -1 else "%s&%s" % (rss_url, param_url) + # 请求数据 + try: + ret = RequestUtils().get_res(rss_url) + if not ret: + return [] + ret.encoding = ret.apparent_encoding + except Exception as e2: + ExceptionUtils.exception_traceback(e2) + return [] + # 解析数据 XPATH + rss_result = [] + if rss_parser.get("type") == "XML": + try: + result_tree = etree.XML(ret.text.encode("utf-8")) + item_list = result_tree.xpath(rss_parser_format.get("list")) or [] + for item in item_list: + rss_item = {} + for key, attr in rss_parser_format.get("item", {}).items(): + if attr.get("path"): + if attr.get("namespaces"): + value = item.xpath("//ns:%s" % attr.get("path"), + namespaces={"ns": attr.get("namespaces")}) + else: + value = item.xpath(attr.get("path")) + elif attr.get("value"): + value = attr.get("value") + else: + continue + if value: + rss_item.update({key: value[0]}) + rss_result.append(rss_item) + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("【RssChecker】任务 %s 获取的订阅报文无法解析:%s" % (taskinfo.get("name"), str(err))) + return [] + elif rss_parser.get("type") == "JSON": + try: + result_json = json.loads(ret.text) + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("【RssChecker】任务 %s 获取的订阅报文不是合法的Json格式:%s" % (taskinfo.get("name"), str(err))) + return [] + item_list = jsonpath.jsonpath(result_json, rss_parser_format.get("list"))[0] + if not isinstance(item_list, list): + log.error("【RssChecker】任务 %s 获取的订阅报文list后不是列表" % taskinfo.get("name")) + return [] + for item in item_list: + rss_item = {} + for key, attr in rss_parser_format.get("item", {}).items(): + if attr.get("path"): + value = jsonpath.jsonpath(item, attr.get("path")) + elif attr.get("value"): + value = attr.get("value") + else: + continue + if value: + rss_item.update({key: value[0]}) + rss_result.append(rss_item) + return rss_result + + def get_userrss_parser(self, pid=None): + if pid: + for rss_parser in self._rss_parsers: + if rss_parser.get("id") == int(pid): + return rss_parser + return {} + else: + return self._rss_parsers + + def get_rss_articles(self, taskid): + """ + 查看自定义RSS报文 + :param taskid: 自定义RSS的ID + """ + if not taskid: + return + # 下载订阅的文章列表 + rss_articles = [] + # 任务信息 + taskinfo = self.get_rsstask_info(taskid) + if not taskinfo: + return + rss_result = self.__parse_userrss_result(taskinfo) + if len(rss_result) == 0: + return [] + for res in rss_result: + try: + # 种子名 + title = res.get('title') + if not title: + continue + # 种子链接 + enclosure = res.get('enclosure') + # 种子页面 + link = res.get('link') + # 副标题 + description = res.get('description') + # 种子大小 + size = StringUtils.str_filesize(res.get('size')) + # 发布日期 + date = StringUtils.unify_datetime_str(res.get('date')) + # 年份 + year = res.get('year') + if year and len(year) > 4: + year = year[:4] + # 检查是不是处理过 + meta_name = "%s %s" % (title, year) if year else title + finish_flag = self.dbhelper.is_userrss_finished(meta_name, enclosure) + # 信息聚合 + params = { + "title": title, + "link": link, + "enclosure": enclosure, + "size": size, + "description": description, + "date": date, + "finish_flag": finish_flag, + } + if params not in rss_articles: + rss_articles.append(params) + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【RssChecker】获取RSS报文发生错误:%s - %s" % (str(e), traceback.format_exc())) + return rss_articles + + def test_rss_articles(self, taskid, title): + """ + 测试RSS报文 + :param taskid: 自定义RSS的ID + :param title: RSS报文title + """ + # 任务信息 + taskinfo = self.get_rsstask_info(taskid) + if not taskinfo: + return + # 识别种子名称,开始检索TMDB + media_info = MetaInfo(title=title) + cache_info = self.media.get_cache_info(media_info) + if cache_info.get("id"): + # 有缓存,直接使用缓存 + media_info.tmdb_id = cache_info.get("id") + media_info.type = cache_info.get("type") + media_info.title = cache_info.get("title") + media_info.year = cache_info.get("year") + else: + media_info = self.media.get_media_info(title=title) + if not media_info: + log.warn("【RssChecker】%s 识别媒体信息出错!" % title) + # 检查是否匹配 + filter_args = { + "include": taskinfo.get("include"), + "exclude": taskinfo.get("exclude"), + "rule": taskinfo.get("filter") if taskinfo.get("uses") == "D" else None + } + match_flag, res_order, match_msg = self.filter.check_torrent_filter(meta_info=media_info, + filter_args=filter_args) + # 未匹配 + if not match_flag: + log.info(f"【RssChecker】{match_msg}") + else: + log.info("【RssChecker】%s 识别为 %s %s 匹配成功" % ( + title, + media_info.get_title_string(), + media_info.get_season_episode_string())) + media_info.set_torrent_info(res_order=res_order) + # 检查是否已存在 + no_exists = {} + exist_flag = False + if not media_info.tmdb_id: + log.info("【RssChecker】%s 识别为 %s 未匹配到媒体信息" % (title, media_info.get_name())) + else: + if media_info.type == MediaType.MOVIE: + exist_flag, no_exists, _ = self.downloader.check_exists_medias(meta_info=media_info, + no_exists=no_exists) + if exist_flag: + log.info("【RssChecker】电影 %s 已存在" % media_info.get_title_string()) + else: + exist_flag, no_exists, _ = self.downloader.check_exists_medias(meta_info=media_info, + no_exists=no_exists) + if exist_flag: + # 已全部存在 + if not no_exists or not no_exists.get( + media_info.tmdb_id): + log.info("【RssChecker】电视剧 %s %s 已存在" % ( + media_info.get_title_string(), media_info.get_season_episode_string())) + if no_exists.get(media_info.tmdb_id): + log.info("【RssChecker】%s 缺失季集:%s" + % (media_info.get_title_string(), no_exists.get(media_info.tmdb_id))) + return media_info, match_flag, exist_flag + + def check_rss_articles(self, flag, articles): + """ + RSS报文处理设置 + :param flag: set_finished/set_unfinish + :param articles: 报文(title/enclosure) + """ + try: + if flag == "set_finished": + for article in articles: + title = article.get("title") + enclosure = article.get("enclosure") + if not self.dbhelper.is_userrss_finished(title, enclosure): + self.dbhelper.simple_insert_rss_torrents(title, enclosure) + elif flag == "set_unfinish": + for article in articles: + self.dbhelper.simple_delete_rss_torrents(article.get("title"), article.get("enclosure")) + else: + return False + return True + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【RssChecker】设置RSS报文状态时发生错误:%s - %s" % (str(e), traceback.format_exc())) + return False + + def download_rss_articles(self, taskid, articles): + """ + RSS报文下载 + :param taskid: 自定义RSS的ID + :param articles: 报文(title/enclosure) + """ + if not taskid: + return + # 任务信息 + taskinfo = self.get_rsstask_info(taskid) + if not taskinfo: + return + for article in articles: + media = self.media.get_media_info(title=article.get("title")) + media.set_torrent_info(enclosure=article.get("enclosure")) + ret, ret_msg = self.downloader.download(media_info=media, + download_dir=taskinfo.get("save_path"), + download_setting=taskinfo.get("download_setting")) + if ret: + self.message.send_download_message(in_from=SearchType.USERRSS, + can_item=media) + # 插入数据库 + self.dbhelper.insert_rss_torrents(media) + # 登记自定义RSS任务下载记录 + downloader = self.downloader.get_default_client_type().value + if taskinfo.get("download_setting"): + download_attr = self.downloader.get_download_setting(taskinfo.get("download_setting")) + if download_attr.get("downloader"): + downloader = download_attr.get("downloader") + self.dbhelper.insert_userrss_task_history(taskid, media.org_string, downloader) + else: + log.error("【RssChecker】添加下载任务 %s 失败:%s" % ( + media.get_title_string(), ret_msg or "请检查下载任务是否已存在")) + if ret_msg: + self.message.send_download_fail_message(media, ret_msg) + return False + return True + + def get_userrss_mediainfos(self): + taskinfos = self.dbhelper.get_userrss_tasks() + mediainfos_all = [] + for taskinfo in taskinfos: + mediainfos = json.loads(taskinfo.MEDIAINFOS) if taskinfo.MEDIAINFOS else [] + if mediainfos: + mediainfos_all += mediainfos + return mediainfos_all diff --git a/app/scheduler.py b/app/scheduler.py new file mode 100644 index 0000000..4b09dea --- /dev/null +++ b/app/scheduler.py @@ -0,0 +1,265 @@ +import datetime +import math +import random +import traceback + +from apscheduler.executors.pool import ThreadPoolExecutor +from apscheduler.schedulers.background import BackgroundScheduler + +import log +from app.doubansync import DoubanSync +from app.downloader import Downloader +from app.helper import MetaHelper +from app.mediaserver import MediaServer +from app.rss import Rss +from app.sites import Sites, SiteUserInfo, SiteSignin +from app.subscribe import Subscribe +from app.sync import Sync +from app.utils import ExceptionUtils +from app.utils.commons import singleton +from config import PT_TRANSFER_INTERVAL, METAINFO_SAVE_INTERVAL, \ + SYNC_TRANSFER_INTERVAL, RSS_CHECK_INTERVAL, REFRESH_PT_DATA_INTERVAL, \ + RSS_REFRESH_TMDB_INTERVAL, META_DELETE_UNKNOWN_INTERVAL, REFRESH_WALLPAPER_INTERVAL, Config +from web.backend.wallpaper import get_login_wallpaper + + +@singleton +class Scheduler: + SCHEDULER = None + _pt = None + _douban = None + _media = None + + def __init__(self): + self.init_config() + + def init_config(self): + self._pt = Config().get_config('pt') + self._media = Config().get_config('media') + self._douban = Config().get_config('douban') + + def run_service(self): + """ + 读取配置,启动定时服务 + """ + self.SCHEDULER = BackgroundScheduler(timezone=Config().get_timezone(), + executors={ + 'default': ThreadPoolExecutor(20) + }) + if not self.SCHEDULER: + return + if self._pt: + # 站点签到 + ptsignin_cron = str(self._pt.get('ptsignin_cron')) + if ptsignin_cron: + if '-' in ptsignin_cron: + try: + time_range = ptsignin_cron.split("-") + start_time_range_str = time_range[0] + end_time_range_str = time_range[1] + start_time_range_array = start_time_range_str.split(":") + end_time_range_array = end_time_range_str.split(":") + start_hour = int(start_time_range_array[0]) + start_minute = int(start_time_range_array[1]) + end_hour = int(end_time_range_array[0]) + end_minute = int(end_time_range_array[1]) + + def start_random_job(): + task_time_count = random.randint(start_hour * 60 + start_minute, end_hour * 60 + end_minute) + self.start_data_site_signin_job(math.floor(task_time_count / 60), task_time_count % 60) + + self.SCHEDULER.add_job(start_random_job, + "cron", + hour=start_hour, + minute=start_minute) + log.info("站点自动签到服务时间范围随机模式启动,起始时间于%s:%s" % ( + str(start_hour).rjust(2, '0'), str(start_minute).rjust(2, '0'))) + except Exception as e: + log.info("站点自动签到时间 时间范围随机模式 配置格式错误:%s %s" % (ptsignin_cron, str(e))) + elif ptsignin_cron.find(':') != -1: + try: + hour = int(ptsignin_cron.split(":")[0]) + minute = int(ptsignin_cron.split(":")[1]) + except Exception as e: + log.info("站点自动签到时间 配置格式错误:%s" % str(e)) + hour = minute = 0 + self.SCHEDULER.add_job(SiteSignin().signin, + "cron", + hour=hour, + minute=minute) + log.info("站点自动签到服务启动") + else: + try: + hours = float(ptsignin_cron) + except Exception as e: + log.info("站点自动签到时间 配置格式错误:%s" % str(e)) + hours = 0 + if hours: + self.SCHEDULER.add_job(SiteSignin().signin, + "interval", + hours=hours) + log.info("站点自动签到服务启动") + + # 下载文件转移 + pt_monitor = self._pt.get('pt_monitor') + if pt_monitor: + self.SCHEDULER.add_job(Downloader().transfer, 'interval', seconds=PT_TRANSFER_INTERVAL) + log.info("下载文件转移服务启动") + + # RSS下载器 + pt_check_interval = self._pt.get('pt_check_interval') + if pt_check_interval: + if isinstance(pt_check_interval, str) and pt_check_interval.isdigit(): + pt_check_interval = int(pt_check_interval) + else: + try: + pt_check_interval = round(float(pt_check_interval)) + except Exception as e: + log.error("RSS订阅周期 配置格式错误:%s" % str(e)) + pt_check_interval = 0 + if pt_check_interval: + if pt_check_interval < 300: + pt_check_interval = 300 + self.SCHEDULER.add_job(Rss().rssdownload, 'interval', seconds=pt_check_interval) + log.info("RSS订阅服务启动") + + # RSS订阅定时检索 + search_rss_interval = self._pt.get('search_rss_interval') + if search_rss_interval: + if isinstance(search_rss_interval, str) and search_rss_interval.isdigit(): + search_rss_interval = int(search_rss_interval) + else: + try: + search_rss_interval = round(float(search_rss_interval)) + except Exception as e: + log.error("订阅定时搜索周期 配置格式错误:%s" % str(e)) + search_rss_interval = 0 + if search_rss_interval: + if search_rss_interval < 6: + search_rss_interval = 6 + self.SCHEDULER.add_job(Subscribe().subscribe_search_all, 'interval', hours=search_rss_interval) + log.info("订阅定时搜索服务启动") + + # 豆瓣电影同步 + if self._douban: + douban_interval = self._douban.get('interval') + if douban_interval: + if isinstance(douban_interval, str): + if douban_interval.isdigit(): + douban_interval = int(douban_interval) + else: + try: + douban_interval = float(douban_interval) + except Exception as e: + log.info("豆瓣同步服务启动失败:%s" % str(e)) + douban_interval = 0 + if douban_interval: + self.SCHEDULER.add_job(DoubanSync().sync, 'interval', hours=douban_interval) + log.info("豆瓣同步服务启动") + + # 媒体库同步 + if self._media: + mediasync_interval = self._media.get("mediasync_interval") + if mediasync_interval: + if isinstance(mediasync_interval, str): + if mediasync_interval.isdigit(): + mediasync_interval = int(mediasync_interval) + else: + try: + mediasync_interval = round(float(mediasync_interval)) + except Exception as e: + log.info("豆瓣同步服务启动失败:%s" % str(e)) + mediasync_interval = 0 + if mediasync_interval: + self.SCHEDULER.add_job(MediaServer().sync_mediaserver, 'interval', hours=mediasync_interval) + log.info("媒体库同步服务启动") + + # 元数据定时保存 + self.SCHEDULER.add_job(MetaHelper().save_meta_data, 'interval', seconds=METAINFO_SAVE_INTERVAL) + + # 定时把队列中的监控文件转移走 + self.SCHEDULER.add_job(Sync().transfer_mon_files, 'interval', seconds=SYNC_TRANSFER_INTERVAL) + + # RSS队列中检索 + self.SCHEDULER.add_job(Subscribe().subscribe_search, 'interval', seconds=RSS_CHECK_INTERVAL) + + # 站点数据刷新 + self.SCHEDULER.add_job(SiteUserInfo().refresh_pt_date_now, + 'interval', + hours=REFRESH_PT_DATA_INTERVAL, + next_run_time=datetime.datetime.now() + datetime.timedelta(minutes=1)) + + # 豆瓣RSS转TMDB,定时更新TMDB数据 + self.SCHEDULER.add_job(Subscribe().refresh_rss_metainfo, 'interval', hours=RSS_REFRESH_TMDB_INTERVAL) + + # 定时清除未识别的缓存 + self.SCHEDULER.add_job(MetaHelper().delete_unknown_meta, 'interval', hours=META_DELETE_UNKNOWN_INTERVAL) + + # 定时刷新壁纸 + self.SCHEDULER.add_job(get_login_wallpaper, + 'interval', + hours=REFRESH_WALLPAPER_INTERVAL, + next_run_time=datetime.datetime.now()) + + self.SCHEDULER.print_jobs() + + self.SCHEDULER.start() + + def stop_service(self): + """ + 停止定时服务 + """ + try: + if self.SCHEDULER: + self.SCHEDULER.remove_all_jobs() + self.SCHEDULER.shutdown() + self.SCHEDULER = None + except Exception as e: + ExceptionUtils.exception_traceback(e) + + def start_data_site_signin_job(self, hour, minute): + year = datetime.datetime.now().year + month = datetime.datetime.now().month + day = datetime.datetime.now().day + # 随机数从1秒开始,不在整点签到 + second = random.randint(1, 59) + log.info("站点自动签到时间 即将在%s-%s-%s,%s:%s:%s签到" % ( + str(year), str(month), str(day), str(hour), str(minute), str(second))) + if hour < 0 or hour > 24: + hour = -1 + if minute < 0 or minute > 60: + minute = -1 + if hour < 0 or minute < 0: + log.warn("站点自动签到时间 配置格式错误:不启动任务") + return + self.SCHEDULER.add_job(SiteSignin().signin, + "date", + run_date=datetime.datetime(year, month, day, hour, minute, second)) + + +def run_scheduler(): + """ + 启动定时服务 + """ + try: + Scheduler().run_service() + except Exception as err: + log.error("启动定时服务失败:%s - %s" % (str(err), traceback.format_exc())) + + +def stop_scheduler(): + """ + 停止定时服务 + """ + try: + Scheduler().stop_service() + except Exception as err: + log.debug("停止定时服务失败:%s" % str(err)) + + +def restart_scheduler(): + """ + 重启定时服务 + """ + stop_scheduler() + run_scheduler() diff --git a/app/searcher.py b/app/searcher.py new file mode 100644 index 0000000..f4a828c --- /dev/null +++ b/app/searcher.py @@ -0,0 +1,181 @@ +import log +from app.helper import DbHelper +from app.indexer import Indexer +from config import Config +from app.message import Message +from app.downloader import Downloader +from app.media import Media +from app.helper import ProgressHelper +from app.utils.types import SearchType + + +class Searcher: + downloader = None + media = None + message = None + indexer = None + progress = None + dbhelper = None + + _search_auto = True + + def __init__(self): + self.downloader = Downloader() + self.media = Media() + self.message = Message() + self.progress = ProgressHelper() + self.dbhelper = DbHelper() + self.indexer = Indexer() + self.init_config() + + def init_config(self): + self._search_auto = Config().get_config("pt").get('search_auto', True) + + def search_medias(self, + key_word: [str, list], + filter_args: dict, + match_media=None, + in_from: SearchType = None): + """ + 根据关键字调用索引器检查媒体 + :param key_word: 检索的关键字,不能为空 + :param filter_args: 过滤条件 + :param match_media: 区配的媒体信息 + :param in_from: 搜索渠道 + :return: 命中的资源媒体信息列表 + """ + if not key_word: + return [] + if not self.indexer: + return [] + return self.indexer.search_by_keyword(key_word=key_word, + filter_args=filter_args, + match_media=match_media, + in_from=in_from) + + def search_one_media(self, media_info, + in_from: SearchType, + no_exists: dict, + sites: list = None, + filters: dict = None, + user_name=None): + """ + 只检索和下载一个资源,用于精确检索下载,由微信、Telegram或豆瓣调用 + :param media_info: 已识别的媒体信息 + :param in_from: 搜索渠道 + :param no_exists: 缺失的剧集清单 + :param sites: 检索哪些站点 + :param filters: 过滤条件,为空则不过滤 + :param user_name: 用户名 + :return: 请求的资源是否全部下载完整,如完整则返回媒体信息 + 请求的资源如果是剧集则返回下载后仍然缺失的季集信息 + 搜索到的结果数量 + 下载到的结果数量,如为None则表示未开启自动下载 + """ + if not media_info: + return None, {}, 0, 0 + # 进度计数重置 + self.progress.start('search') + # 查找的季 + if media_info.begin_season is None: + search_season = None + else: + search_season = media_info.get_season_list() + # 查找的集 + search_episode = media_info.get_episode_list() + if search_episode and not search_season: + search_season = [1] + # 过滤条件 + filter_args = {"season": search_season, + "episode": search_episode, + "year": media_info.year, + "type": media_info.type, + "site": sites, + "seeders": True} + if filters: + filter_args.update(filters) + if media_info.keyword: + # 直接使用搜索词搜索 + first_search_name = media_info.keyword + second_search_name = None + else: + # 中文名 + if media_info.cn_name: + search_cn_name = media_info.cn_name + else: + search_cn_name = media_info.title + # 英文名 + search_en_name = None + if media_info.en_name: + search_en_name = media_info.en_name + else: + if media_info.original_language == "en": + search_en_name = media_info.original_title + else: + # 此处使用独立对象,避免影响TMDB语言 + en_title = Media().get_tmdb_en_title(media_info) + if en_title: + search_en_name = en_title + # 两次搜索名称 + second_search_name = None + if Config().get_config("laboratory").get("search_en_title"): + if search_en_name: + first_search_name = search_en_name + second_search_name = search_cn_name + else: + first_search_name = search_cn_name + else: + first_search_name = search_cn_name + if search_en_name: + second_search_name = search_en_name + # 开始搜索 + log.info("【Searcher】开始检索 %s ..." % first_search_name) + media_list = self.search_medias(key_word=first_search_name, + filter_args=filter_args, + match_media=media_info, + in_from=in_from) + # 使用名称重新搜索 + if len(media_list) == 0 \ + and second_search_name \ + and second_search_name != first_search_name: + log.info("【Searcher】%s 未检索到资源,尝试通过 %s 重新检索 ..." % (first_search_name, second_search_name)) + media_list = self.search_medias(key_word=second_search_name, + filter_args=filter_args, + match_media=media_info, + in_from=in_from) + + if len(media_list) == 0: + log.info("【Searcher】%s 未搜索到任何资源" % second_search_name) + return None, no_exists, 0, 0 + else: + if in_from in self.message.get_search_types(): + # 保存搜索记录 + self.dbhelper.delete_all_search_torrents() + # 搜索结果排序 + media_list = sorted(media_list, key=lambda x: "%s%s%s%s" % (str(x.title).ljust(100, ' '), + str(x.res_order).rjust(3, '0'), + str(x.site_order).rjust(3, '0'), + str(x.seeders).rjust(10, '0')), + reverse=True) + # 插入数据库 + self.dbhelper.insert_search_results(media_list) + # 微信未开自动下载时返回 + if not self._search_auto: + return None, no_exists, len(media_list), None + # 择优下载 + download_items, left_medias = self.downloader.batch_download(in_from=in_from, + media_list=media_list, + need_tvs=no_exists, + user_name=user_name) + # 统计下载情况,下全了返回True,没下全返回False + if not download_items: + log.info("【Searcher】%s 未下载到资源" % media_info.title) + return None, left_medias, len(media_list), 0 + else: + log.info("【Searcher】实际下载了 %s 个资源" % len(download_items)) + # 还有剩下的缺失,说明没下完,返回False + if left_medias: + return None, left_medias, len(media_list), len(download_items) + # 全部下完了 + else: + return download_items[0], no_exists, len(media_list), len(download_items) diff --git a/app/sites/__init__.py b/app/sites/__init__.py new file mode 100644 index 0000000..8394b0a --- /dev/null +++ b/app/sites/__init__.py @@ -0,0 +1,4 @@ +from app.sites.site_userinfo import SiteUserInfo +from .sites import Sites +from .site_cookie import SiteCookie +from .site_signin import SiteSignin diff --git a/app/sites/site_cookie.py b/app/sites/site_cookie.py new file mode 100644 index 0000000..2b040eb --- /dev/null +++ b/app/sites/site_cookie.py @@ -0,0 +1,302 @@ +import base64 +import time + +from lxml import etree +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as es +from selenium.webdriver.support.wait import WebDriverWait + +import log +from app.helper import ChromeHelper, ProgressHelper, DbHelper, OcrHelper, SiteHelper +from app.sites.sites import Sites +from app.conf import SiteConf +from app.utils import StringUtils, RequestUtils, ExceptionUtils +from app.utils.commons import singleton + + +@singleton +class SiteCookie(object): + progress = None + sites = None + ocrhelper = None + dbhelpter = None + captcha_code = {} + + def __init__(self): + self.init_config() + + def init_config(self): + self.dbhelpter = DbHelper() + self.progress = ProgressHelper() + self.sites = Sites() + self.ocrhelper = OcrHelper() + self.captcha_code = {} + + def set_code(self, code, value): + """ + 设置验证码的值 + """ + self.captcha_code[code] = value + + def get_code(self, code): + """ + 获取验证码的值 + """ + return self.captcha_code.get(code) + + def __get_site_cookie_ua(self, + url, + username, + password, + twostepcode=None, + ocrflag=False): + """ + 获取站点cookie和ua + :param url: 站点地址 + :param username: 用户名 + :param password: 密码 + :param twostepcode: 两步验证 + :param ocrflag: 是否开启OCR识别 + :return: cookie、ua、message + """ + if not url or not username or not password: + return None, None, "参数错误" + # 全局锁 + chrome = ChromeHelper() + if not chrome.get_status(): + return None, None, "需要浏览器内核环境才能更新站点信息" + if not chrome.visit(url=url): + return None, None, "Chrome模拟访问失败" + # 循环检测是否过cf + cloudflare = chrome.pass_cloudflare() + if not cloudflare: + return None, None, "跳转站点失败,无法通过Cloudflare验证" + # 登录页面代码 + html_text = chrome.get_html() + if not html_text: + return None, None, "获取源码失败" + if SiteHelper.is_logged_in(html_text): + return chrome.get_cookies(), chrome.get_ua(), "已经登录过且Cookie未失效" + # 查找用户名输入框 + html = etree.HTML(html_text) + username_xpath = None + for xpath in SiteConf.SITE_LOGIN_XPATH.get("username"): + if html.xpath(xpath): + username_xpath = xpath + break + if not username_xpath: + return None, None, "未找到用户名输入框" + # 查找密码输入框 + password_xpath = None + for xpath in SiteConf.SITE_LOGIN_XPATH.get("password"): + if html.xpath(xpath): + password_xpath = xpath + break + if not password_xpath: + return None, None, "未找到密码输入框" + # 查找两步验证码 + twostepcode_xpath = None + for xpath in SiteConf.SITE_LOGIN_XPATH.get("twostep"): + if html.xpath(xpath): + twostepcode_xpath = xpath + break + # 查找验证码输入框 + captcha_xpath = None + for xpath in SiteConf.SITE_LOGIN_XPATH.get("captcha"): + if html.xpath(xpath): + captcha_xpath = xpath + break + # 查找验证码图片 + captcha_img_url = None + if captcha_xpath: + for xpath in SiteConf.SITE_LOGIN_XPATH.get("captcha_img"): + if html.xpath(xpath): + captcha_img_url = html.xpath(xpath)[0] + break + if not captcha_img_url: + return None, None, "未找到验证码图片" + # 查找登录按钮 + submit_xpath = None + for xpath in SiteConf.SITE_LOGIN_XPATH.get("submit"): + if html.xpath(xpath): + submit_xpath = xpath + break + if not submit_xpath: + return None, None, "未找到登录按钮" + # 点击登录按钮 + try: + submit_obj = WebDriverWait(driver=chrome.browser, + timeout=6).until(es.element_to_be_clickable((By.XPATH, + submit_xpath))) + if submit_obj: + # 输入用户名 + chrome.browser.find_element(By.XPATH, username_xpath).send_keys(username) + # 输入密码 + chrome.browser.find_element(By.XPATH, password_xpath).send_keys(password) + # 输入两步验证码 + if twostepcode and twostepcode_xpath: + twostepcode_element = chrome.browser.find_element(By.XPATH, twostepcode_xpath) + if twostepcode_element.is_displayed(): + twostepcode_element.send_keys(twostepcode) + # 识别验证码 + if captcha_xpath: + captcha_element = chrome.browser.find_element(By.XPATH, captcha_xpath) + if captcha_element.is_displayed(): + code_url = self.__get_captcha_url(url, captcha_img_url) + if ocrflag: + # 自动OCR识别验证码 + captcha = self.get_captcha_text(chrome, code_url) + if captcha: + log.info("【Sites】验证码地址为:%s,识别结果:%s" % (code_url, captcha)) + else: + return None, None, "验证码识别失败" + else: + # 等待用户输入 + captcha = None + code_key = StringUtils.generate_random_str(5) + for sec in range(30, 0, -1): + if self.get_code(code_key): + # 用户输入了 + captcha = self.get_code(code_key) + log.info("【Sites】接收到验证码:%s" % captcha) + self.progress.update(ptype='sitecookie', + text="接收到验证码:%s" % captcha) + break + else: + # 获取验证码图片base64 + code_bin = self.get_captcha_base64(chrome, code_url) + if not code_bin: + return None, None, "获取验证码图片数据失败" + else: + code_bin = f"data:image/png;base64,{code_bin}" + # 推送到前端 + self.progress.update(ptype='sitecookie', + text=f"{code_bin}|{code_key}") + time.sleep(1) + if not captcha: + return None, None, "验证码输入超时" + # 输入验证码 + captcha_element.send_keys(captcha) + else: + # 不可见元素不处理 + pass + # 提交登录 + submit_obj.click() + else: + return None, None, "未找到登录按钮" + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None, None, "仿真登录失败:%s" % str(e) + # 登录后的源码 + html_text = chrome.get_html() + if not html_text: + return None, None, "获取源码失败" + if SiteHelper.is_logged_in(html_text): + return chrome.get_cookies(), chrome.get_ua(), "" + else: + # 读取错误信息 + error_xpath = None + for xpath in SiteConf.SITE_LOGIN_XPATH.get("error"): + if html.xpath(xpath): + error_xpath = xpath + break + if not error_xpath: + return None, None, "登录失败" + else: + error_msg = html.xpath(error_xpath)[0] + return None, None, error_msg + + def get_captcha_text(self, chrome, code_url): + """ + 识别验证码图片的内容 + """ + code_b64 = self.get_captcha_base64(chrome=chrome, + image_url=code_url) + if not code_b64: + return "" + return self.ocrhelper.get_captcha_text(image_b64=code_b64) + + @staticmethod + def __get_captcha_url(siteurl, imageurl): + """ + 获取验证码图片的URL + """ + if not siteurl or not imageurl: + return "" + if imageurl.startswith("/"): + imageurl = imageurl[1:] + return "%s/%s" % (StringUtils.get_base_url(siteurl), imageurl) + + def update_sites_cookie_ua(self, + username, + password, + twostepcode=None, + siteid=None, + ocrflag=False): + """ + 更新所有站点Cookie和ua + """ + # 获取站点列表 + sites = self.sites.get_sites(siteid=siteid) + if siteid: + sites = [sites] + # 总数量 + site_num = len(sites) + # 当前数量 + curr_num = 0 + # 返回码、返回消息 + retcode = 0 + messages = [] + # 开始进度 + self.progress.start('sitecookie') + for site in sites: + if not site.get("signurl") and not site.get("rssurl"): + log.info("【Sites】%s 未设置地址,跳过" % site.get("name")) + continue + log.info("【Sites】开始更新 %s Cookie和User-Agent ..." % site.get("name")) + self.progress.update(ptype='sitecookie', + text="开始更新 %s Cookie和User-Agent ..." % site.get("name")) + # 登录页面地址 + baisc_url = StringUtils.get_base_url(site.get("signurl") or site.get("rssurl")) + site_conf = self.sites.get_grapsite_conf(url=baisc_url) + if site_conf.get("LOGIN"): + login_url = "%s/%s" % (baisc_url, site_conf.get("LOGIN")) + else: + login_url = "%s/login.php" % baisc_url + # 获取Cookie和User-Agent + cookie, ua, msg = self.__get_site_cookie_ua(url=login_url, + username=username, + password=password, + twostepcode=twostepcode, + ocrflag=ocrflag) + # 更新进度 + curr_num += 1 + if not cookie: + log.error("【Sites】获取 %s 信息失败:%s" % (site.get("name"), msg)) + messages.append("%s %s" % (site.get("name"), msg)) + self.progress.update(ptype='sitecookie', + value=round(100 * (curr_num / site_num)), + text="%s %s" % (site.get("name"), msg)) + retcode = 1 + else: + self.dbhelpter.update_site_cookie_ua(site.get("id"), cookie, ua) + log.info("【Sites】更新 %s 的Cookie和User-Agent成功" % site.get("name")) + messages.append("%s %s" % (site.get("name"), msg or "更新Cookie和User-Agent成功")) + self.progress.update(ptype='sitecookie', + value=round(100 * (curr_num / site_num)), + text="%s %s" % (site.get("name"), msg or "更新Cookie和User-Agent成功")) + self.progress.end('sitecookie') + return retcode, messages + + @staticmethod + def get_captcha_base64(chrome, image_url): + """ + 根据图片地址,获取验证码图片base64编码 + """ + if not image_url: + return "" + ret = RequestUtils(headers=chrome.get_ua(), + cookies=chrome.get_cookies()).get_res(image_url) + if ret: + return base64.b64encode(ret.content).decode() + return "" diff --git a/app/sites/site_signin.py b/app/sites/site_signin.py new file mode 100644 index 0000000..127d88b --- /dev/null +++ b/app/sites/site_signin.py @@ -0,0 +1,166 @@ +import re +from multiprocessing.dummy import Pool as ThreadPool +from threading import Lock + +from lxml import etree +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as es +from selenium.webdriver.support.wait import WebDriverWait + +import log +from app.conf import SiteConf +from app.helper import ChromeHelper, SubmoduleHelper, DbHelper, SiteHelper +from app.message import Message +from app.sites.sites import Sites +from app.utils import RequestUtils, ExceptionUtils, StringUtils +from app.utils.commons import singleton +from config import Config + +lock = Lock() + + +@singleton +class SiteSignin(object): + sites = None + dbhelper = None + message = None + + _MAX_CONCURRENCY = 10 + + def __init__(self): + # 加载模块 + self._site_schema = SubmoduleHelper.import_submodules('app.sites.sitesignin', + filter_func=lambda _, obj: hasattr(obj, 'match')) + log.debug(f"【Sites】加载站点签到:{self._site_schema}") + self.init_config() + + def init_config(self): + self.sites = Sites() + self.dbhelper = DbHelper() + self.message = Message() + + def __build_class(self, url): + for site_schema in self._site_schema: + try: + if site_schema.match(url): + return site_schema + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None + + def signin(self): + """ + 站点并发签到 + """ + sites = self.sites.get_sites(signin=True) + if not sites: + return + with ThreadPool(min(len(sites), self._MAX_CONCURRENCY)) as p: + status = p.map(self.__signin_site, sites) + if status: + self.message.send_site_signin_message(status) + + def __signin_site(self, site_info): + """ + 签到一个站点 + """ + site_module = self.__build_class(site_info.get("signurl")) + if site_module: + return site_module.signin(site_info) + else: + return self.__signin_base(site_info) + + @staticmethod + def __signin_base(site_info): + """ + 通用签到处理 + :param site_info: 站点信息 + :return: 签到结果信息 + """ + if not site_info: + return "" + site = site_info.get("name") + try: + site_url = site_info.get("signurl") + site_cookie = site_info.get("cookie") + ua = site_info.get("ua") + if not site_url or not site_cookie: + log.warn("【Sites】未配置 %s 的站点地址或Cookie,无法签到" % str(site)) + return "" + chrome = ChromeHelper() + if site_info.get("chrome") and chrome.get_status(): + # 首页 + log.info("【Sites】开始站点仿真签到:%s" % site) + home_url = StringUtils.get_base_url(site_url) + if not chrome.visit(url=home_url, ua=ua, cookie=site_cookie): + log.warn("【Sites】%s 无法打开网站" % site) + return f"【{site}】无法打开网站!" + # 循环检测是否过cf + cloudflare = chrome.pass_cloudflare() + if not cloudflare: + log.warn("【Sites】%s 跳转站点失败" % site) + return f"【{site}】跳转站点失败!" + # 判断是否已签到 + html_text = chrome.get_html() + if not html_text: + log.warn("【Sites】%s 获取站点源码失败" % site) + return f"【{site}】获取站点源码失败!" + # 查找签到按钮 + html = etree.HTML(html_text) + xpath_str = None + for xpath in SiteConf.SITE_CHECKIN_XPATH: + if html.xpath(xpath): + xpath_str = xpath + break + if re.search(r'已签|签到已得', html_text, re.IGNORECASE) \ + and not xpath_str: + log.info("【Sites】%s 今日已签到" % site) + return f"【{site}】今日已签到" + if not xpath_str: + if SiteHelper.is_logged_in(html_text): + log.warn("【Sites】%s 未找到签到按钮,模拟登录成功" % site) + return f"【{site}】模拟登录成功" + else: + log.info("【Sites】%s 未找到签到按钮,且模拟登录失败" % site) + return f"【{site}】模拟登录失败!" + # 开始仿真 + try: + checkin_obj = WebDriverWait(driver=chrome.browser, timeout=6).until( + es.element_to_be_clickable((By.XPATH, xpath_str))) + if checkin_obj: + checkin_obj.click() + log.info("【Sites】%s 仿真签到成功" % site) + return f"【{site}】仿真签到成功" + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.warn("【Sites】%s 仿真签到失败:%s" % (site, str(e))) + return f"【{site}】签到失败!" + # 模拟登录 + else: + if site_url.find("attendance.php") != -1: + checkin_text = "签到" + else: + checkin_text = "模拟登录" + log.info(f"【Sites】开始站点{checkin_text}:{site}") + # 访问链接 + res = RequestUtils(cookies=site_cookie, + headers=ua, + proxies=Config().get_proxies() if site_info.get("proxy") else None + ).get_res(url=site_url) + if res and res.status_code == 200: + if not SiteHelper.is_logged_in(res.text): + log.warn(f"【Sites】{site} {checkin_text}失败,请检查Cookie") + return f"【{site}】{checkin_text}失败,请检查Cookie!" + else: + log.info(f"【Sites】{site} {checkin_text}成功") + return f"【{site}】{checkin_text}成功" + elif res is not None: + log.warn(f"【Sites】{site} {checkin_text}失败,状态码:{res.status_code}") + return f"【{site}】{checkin_text}失败,状态码:{res.status_code}!" + else: + log.warn(f"【Sites】{site} {checkin_text}失败,无法打开网站") + return f"【{site}】{checkin_text}失败,无法打开网站!" + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.warn("【Sites】%s 签到出错:%s" % (site, str(e))) + return f"{site} 签到出错:{str(e)}!" diff --git a/app/sites/site_userinfo.py b/app/sites/site_userinfo.py new file mode 100644 index 0000000..7411b10 --- /dev/null +++ b/app/sites/site_userinfo.py @@ -0,0 +1,366 @@ +import json +from datetime import datetime +from multiprocessing.dummy import Pool as ThreadPool +from threading import Lock + +import requests + +import log +from app.helper import ChromeHelper, SubmoduleHelper, DbHelper +from app.message import Message +from app.sites.sites import Sites +from app.utils import RequestUtils, ExceptionUtils +from app.utils.commons import singleton +from config import Config + +lock = Lock() + + +@singleton +class SiteUserInfo(object): + + sites = None + dbhelper = None + message = None + + _MAX_CONCURRENCY = 10 + _last_update_time = None + _sites_data = {} + + def __init__(self): + + # 加载模块 + self._site_schema = SubmoduleHelper.import_submodules('app.sites.siteuserinfo', + filter_func=lambda _, obj: hasattr(obj, 'schema')) + self._site_schema.sort(key=lambda x: x.order) + log.debug(f"【Sites】加载站点解析:{self._site_schema}") + self.init_config() + + def init_config(self): + self.sites = Sites() + self.dbhelper = DbHelper() + self.message = Message() + # 站点上一次更新时间 + self._last_update_time = None + # 站点数据 + self._sites_data = {} + + def __build_class(self, html_text): + for site_schema in self._site_schema: + try: + if site_schema.match(html_text): + return site_schema + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None + + def build(self, url, site_name, site_cookie=None, ua=None, emulate=None, proxy=False): + if not site_cookie: + return None + session = requests.Session() + log.debug(f"【Sites】站点 {site_name} url={url} site_cookie={site_cookie} ua={ua}") + # 检测环境,有浏览器内核的优先使用仿真签到 + chrome = ChromeHelper() + if emulate and chrome.get_status(): + if not chrome.visit(url=url, ua=ua, cookie=site_cookie): + log.error("【Sites】%s 无法打开网站" % site_name) + return None + # 循环检测是否过cf + cloudflare = chrome.pass_cloudflare() + if not cloudflare: + log.error("【Sites】%s 跳转站点失败" % site_name) + return None + # 判断是否已签到 + html_text = chrome.get_html() + else: + proxies = Config().get_proxies() if proxy else None + res = RequestUtils(cookies=site_cookie, + session=session, + headers=ua, + proxies=proxies + ).get_res(url=url) + if res and res.status_code == 200: + if "charset=utf-8" in res.text or "charset=UTF-8" in res.text: + res.encoding = "UTF-8" + else: + res.encoding = res.apparent_encoding + html_text = res.text + # 第一次登录反爬 + if html_text.find("title") == -1: + i = html_text.find("window.location") + if i == -1: + return None + tmp_url = url + html_text[i:html_text.find(";")] \ + .replace("\"", "").replace("+", "").replace(" ", "").replace("window.location=", "") + res = RequestUtils(cookies=site_cookie, + session=session, + headers=ua, + proxies=proxies + ).get_res(url=tmp_url) + if res and res.status_code == 200: + if "charset=utf-8" in res.text or "charset=UTF-8" in res.text: + res.encoding = "UTF-8" + else: + res.encoding = res.apparent_encoding + html_text = res.text + if not html_text: + return None + else: + log.error("【Sites】站点 %s 被反爬限制:%s, 状态码:%s" % (site_name, url, res.status_code)) + return None + + # 兼容假首页情况,假首页通常没有 0: + for head, date, content in site_user_info.message_unread_contents: + msg_title = f"【站点 {site_user_info.site_name} 消息】" + msg_text = f"时间:{date}\n标题:{head}\n内容:\n{content}" + self.message.send_site_message(title=msg_title, text=msg_text) + else: + self.message.send_site_message( + title=f"站点 {site_user_info.site_name} 收到 {site_user_info.message_unread} 条新消息,请登陆查看") + + def refresh_pt_date_now(self): + """ + 强制刷新站点数据 + """ + self.__refresh_all_site_data(force=True) + + def get_pt_date(self, specify_sites=None, force=False): + """ + 获取站点上传下载量 + """ + self.__refresh_all_site_data(force=force, specify_sites=specify_sites) + return self._sites_data + + def __refresh_all_site_data(self, force=False, specify_sites=None): + """ + 多线程刷新站点下载上传量,默认间隔6小时 + """ + if not self.sites.get_sites(): + return + + with lock: + + if not force \ + and not specify_sites \ + and self._last_update_time \ + and (datetime.now() - self._last_update_time).seconds < 6 * 3600: + return + + if specify_sites \ + and not isinstance(specify_sites, list): + specify_sites = [specify_sites] + + # 没有指定站点,默认使用全部站点 + if not specify_sites: + refresh_sites = self.sites.get_sites(statistic=True) + else: + refresh_sites = [site for site in self.sites.get_sites(statistic=True) if + site.get("name") in specify_sites] + + if not refresh_sites: + return + + # 并发刷新 + with ThreadPool(min(len(refresh_sites), self._MAX_CONCURRENCY)) as p: + site_user_infos = p.map(self.__refresh_site_data, refresh_sites) + site_user_infos = [info for info in site_user_infos if info] + + # 登记历史数据 + self.dbhelper.insert_site_statistics_history(site_user_infos) + # 实时用户数据 + self.dbhelper.update_site_user_statistics(site_user_infos) + # 更新站点图标 + self.dbhelper.update_site_favicon(site_user_infos) + # 实时做种信息 + self.dbhelper.update_site_seed_info(site_user_infos) + # 站点图标重新加载 + self.sites.init_favicons() + + # 更新时间 + self._last_update_time = datetime.now() + + def get_pt_site_statistics_history(self, days=7): + """ + 获取站点上传下载量 + """ + site_urls = [] + for site in self.sites.get_sites(statistic=True): + site_url = site.get("strict_url") + if site_url: + site_urls.append(site_url) + + return self.dbhelper.get_site_statistics_recent_sites(days=days, strict_urls=site_urls) + + def get_site_user_statistics(self, sites=None, encoding="RAW"): + """ + 获取站点用户数据 + :param sites: 站点名称 + :param encoding: RAW/DICT + :return: + """ + statistic_sites = self.sites.get_sites(statistic=True) + if not sites: + site_urls = [site.get("strict_url") for site in statistic_sites] + else: + site_urls = [site.get("strict_url") for site in statistic_sites + if site.get("name") in sites] + + raw_statistics = self.dbhelper.get_site_user_statistics(strict_urls=site_urls) + if encoding == "RAW": + return raw_statistics + + return self.__todict(raw_statistics) + + def get_pt_site_activity_history(self, site, days=365 * 2): + """ + 查询站点 上传,下载,做种数据 + :param site: 站点名称 + :param days: 最大数据量 + :return: + """ + site_activities = [["time", "upload", "download", "bonus", "seeding", "seeding_size"]] + sql_site_activities = self.dbhelper.get_site_statistics_history(site=site, days=days) + for sql_site_activity in sql_site_activities: + timestamp = datetime.strptime(sql_site_activity.DATE, '%Y-%m-%d').timestamp() * 1000 + site_activities.append( + [timestamp, + sql_site_activity.UPLOAD, + sql_site_activity.DOWNLOAD, + sql_site_activity.BONUS, + sql_site_activity.SEEDING, + sql_site_activity.SEEDING_SIZE]) + + return site_activities + + def get_pt_site_seeding_info(self, site): + """ + 查询站点 做种分布信息 + :param site: 站点名称 + :return: seeding_info:[uploader_num, seeding_size] + """ + site_seeding_info = {"seeding_info": []} + seeding_info = self.dbhelper.get_site_seeding_info(site=site) + if not seeding_info: + return site_seeding_info + + site_seeding_info["seeding_info"] = json.loads(seeding_info[0]) + return site_seeding_info + + @staticmethod + def __todict(raw_statistics): + statistics = [] + for site in raw_statistics: + statistics.append({"site": site.SITE, + "username": site.USERNAME, + "user_level": site.USER_LEVEL, + "join_at": site.JOIN_AT, + "update_at": site.UPDATE_AT, + "upload": site.UPLOAD, + "download": site.DOWNLOAD, + "ratio": site.RATIO, + "seeding": site.SEEDING, + "leeching": site.LEECHING, + "seeding_size": site.SEEDING_SIZE, + "bonus": site.BONUS, + "url": site.URL, + "msg_unread": site.MSG_UNREAD + }) + return statistics diff --git a/app/sites/sites.py b/app/sites/sites.py new file mode 100644 index 0000000..676d134 --- /dev/null +++ b/app/sites/sites.py @@ -0,0 +1,422 @@ +import json +import random +import time +from datetime import datetime +from functools import lru_cache + +from lxml import etree + +from app.conf import SiteConf +from app.helper import ChromeHelper, SiteHelper, DbHelper +from app.message import Message +from app.utils import RequestUtils, StringUtils, ExceptionUtils +from app.utils.commons import singleton +from config import Config + + +@singleton +class Sites: + message = None + dbhelper = None + + _sites = [] + _siteByIds = {} + _siteByUrls = {} + _site_favicons = {} + _rss_sites = [] + _brush_sites = [] + _statistic_sites = [] + _signin_sites = [] + + _MAX_CONCURRENCY = 10 + + def __init__(self): + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.message = Message() + # 原始站点列表 + self._sites = [] + # ID存储站点 + self._siteByIds = {} + # URL存储站点 + self._siteByUrls = {} + # 开启订阅功能站点 + self._rss_sites = [] + # 开启刷流功能站点: + self._brush_sites = [] + # 开启统计功能站点: + self._statistic_sites = [] + # 开启签到功能站点: + self._signin_sites = [] + # 站点图标 + self.init_favicons() + # 站点数据 + self._sites = self.dbhelper.get_config_site() + for site in self._sites: + # 站点属性 + site_note = self.__get_site_note_items(site.NOTE) + # 站点用途:Q签到、D订阅、S刷流 + site_rssurl = site.RSSURL + site_signurl = site.SIGNURL + site_cookie = site.COOKIE + site_uses = site.INCLUDE or '' + uses = [] + if site_uses: + signin_enable = True if "Q" in site_uses and site_signurl and site_cookie else False + rss_enable = True if "D" in site_uses and site_rssurl else False + brush_enable = True if "S" in site_uses and site_rssurl and site_cookie else False + statistic_enable = True if "T" in site_uses and (site_rssurl or site_signurl) and site_cookie else False + uses.append("Q") if signin_enable else None + uses.append("D") if rss_enable else None + uses.append("S") if brush_enable else None + uses.append("T") if statistic_enable else None + else: + signin_enable = False + rss_enable = False + brush_enable = False + statistic_enable = False + site_info = { + "id": site.ID, + "name": site.NAME, + "pri": site.PRI or 0, + "rssurl": site_rssurl, + "signurl": site_signurl, + "cookie": site_cookie, + "rule": site_note.get("rule"), + "download_setting": site_note.get("download_setting"), + "signin_enable": signin_enable, + "rss_enable": rss_enable, + "brush_enable": brush_enable, + "statistic_enable": statistic_enable, + "uses": uses, + "ua": site_note.get("ua"), + "parse": True if site_note.get("parse") == "Y" else False, + "unread_msg_notify": True if site_note.get("message") == "Y" else False, + "chrome": True if site_note.get("chrome") == "Y" else False, + "proxy": True if site_note.get("proxy") == "Y" else False, + "subtitle": True if site_note.get("subtitle") == "Y" else False, + "strict_url": StringUtils.get_base_url(site_signurl or site_rssurl) + } + # 以ID存储 + self._siteByIds[site.ID] = site_info + # 以域名存储 + site_strict_url = StringUtils.get_url_domain(site.SIGNURL or site.RSSURL) + if site_strict_url: + self._siteByUrls[site_strict_url] = site_info + + def init_favicons(self): + """ + 加载图标到内存 + """ + self._site_favicons = {site.SITE: site.FAVICON for site in self.dbhelper.get_site_favicons()} + + def get_sites(self, + siteid=None, + siteurl=None, + rss=False, + brush=False, + signin=False, + statistic=False): + """ + 获取站点配置 + """ + if siteid: + return self._siteByIds.get(int(siteid)) or {} + if siteurl: + return self._siteByUrls.get(StringUtils.get_url_domain(siteurl)) or {} + + ret_sites = [] + for site in self._siteByIds.values(): + if rss and not site.get('rss_enable'): + continue + if brush and not site.get('brush_enable'): + continue + if signin and not site.get('signin_enable'): + continue + if statistic and not site.get('statistic_enable'): + continue + ret_sites.append(site) + if siteid or siteurl: + return {} + return ret_sites + + def get_site_dict(self, + rss=False, + brush=False, + signin=False, + statistic=False): + """ + 获取站点字典 + """ + return [ + { + "id": site.get("id"), + "name": site.get("name") + } for site in self.get_sites( + rss=rss, + brush=brush, + signin=signin, + statistic=statistic + ) + ] + + def get_site_names(self, + rss=False, + brush=False, + signin=False, + statistic=False): + """ + 获取站点名称 + """ + return [ + site.get("name") for site in self.get_sites( + rss=rss, + brush=brush, + signin=signin, + statistic=statistic + ) + ] + + def get_site_favicon(self, site_name=None): + """ + 获取站点图标 + """ + if site_name: + return self._site_favicons.get(site_name) + else: + return self._site_favicons + + def get_site_download_setting(self, site_name=None): + """ + 获取站点下载设置 + """ + if site_name: + for site in self._siteByIds.values(): + if site.get("name") == site_name: + return site.get("download_setting") + return None + + def test_connection(self, site_id): + """ + 测试站点连通性 + :param site_id: 站点编号 + :return: 是否连通、错误信息、耗时 + """ + site_info = self.get_sites(siteid=site_id) + if not site_info: + return False, "站点不存在", 0 + site_cookie = site_info.get("cookie") + if not site_cookie: + return False, "未配置站点Cookie", 0 + ua = site_info.get("ua") + site_url = StringUtils.get_base_url(site_info.get("signurl") or site_info.get("rssurl")) + if not site_url: + return False, "未配置站点地址", 0 + chrome = ChromeHelper() + if site_info.get("chrome") and chrome.get_status(): + # 计时 + start_time = datetime.now() + if not chrome.visit(url=site_url, ua=ua, cookie=site_cookie): + return False, "Chrome模拟访问失败", 0 + # 循环检测是否过cf + cloudflare = chrome.pass_cloudflare() + seconds = int((datetime.now() - start_time).microseconds / 1000) + if not cloudflare: + return False, "跳转站点失败", seconds + # 判断是否已签到 + html_text = chrome.get_html() + if not html_text: + return False, "获取站点源码失败", 0 + if SiteHelper.is_logged_in(html_text): + return True, "连接成功", seconds + else: + return False, "Cookie失效", seconds + else: + # 计时 + start_time = datetime.now() + res = RequestUtils(cookies=site_cookie, + headers=ua, + proxies=Config().get_proxies() if site_info.get("proxy") else None + ).get_res(url=site_url) + seconds = int((datetime.now() - start_time).microseconds / 1000) + if res and res.status_code == 200: + if not SiteHelper.is_logged_in(res.text): + return False, "Cookie失效", seconds + else: + return True, "连接成功", seconds + elif res is not None: + return False, f"连接失败,状态码:{res.status_code}", seconds + else: + return False, "无法打开网站", seconds + + def get_site_attr(self, url): + """ + 整合公有站点和私有站点的属性 + """ + site_info = self.get_sites(siteurl=url) + public_site = self.get_public_sites(url=url) + if public_site: + site_info.update(public_site) + return site_info + + def parse_site_download_url(self, page_url, xpath): + """ + 从站点详情页面中解析中下载链接 + :param page_url: 详情页面地址 + :param xpath: 解析XPATH,同时还包括Cookie、UA和Referer + """ + if not page_url or not xpath: + return "" + cookie, ua, referer, page_source = None, None, None, None + xpaths = xpath.split("|") + xpath = xpaths[0] + if len(xpaths) > 1: + cookie = xpaths[1] + if len(xpaths) > 2: + ua = xpaths[2] + if len(xpaths) > 3: + referer = xpaths[3] + try: + site_info = self.get_public_sites(url=page_url) + if not site_info.get("referer"): + referer = None + req = RequestUtils( + headers=ua, + cookies=cookie, + referer=referer, + proxies=Config().get_proxies() if site_info.get("proxy") else None + ).get_res(url=page_url) + if req and req.status_code == 200: + if req.text: + page_source = req.text + # xpath解析 + if page_source: + html = etree.HTML(page_source) + urls = html.xpath(xpath) + if urls: + return str(urls[0]) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return None + + @staticmethod + @lru_cache(maxsize=128) + def __get_site_page_html(url, cookie, ua, render=False, proxy=False): + chrome = ChromeHelper(headless=True) + if render and chrome.get_status(): + # 开渲染 + if chrome.visit(url=url, cookie=cookie, ua=ua): + # 等待页面加载完成 + time.sleep(10) + return chrome.get_html() + else: + res = RequestUtils( + cookies=cookie, + headers=ua, + proxies=Config().get_proxies() if proxy else None + ).get_res(url=url) + if res and res.status_code == 200: + res.encoding = res.apparent_encoding + return res.text + return "" + + @staticmethod + def get_grapsite_conf(url): + """ + 根据地址找到RSS_SITE_GRAP_CONF对应配置 + """ + for k, v in SiteConf.RSS_SITE_GRAP_CONF.items(): + if StringUtils.url_equal(k, url): + return v + return {} + + def check_torrent_attr(self, torrent_url, cookie, ua=None, proxy=False): + """ + 检验种子是否免费,当前做种人数 + :param torrent_url: 种子的详情页面 + :param cookie: 站点的Cookie + :param ua: 站点的ua + :param proxy: 是否使用代理 + :return: 种子属性,包含FREE 2XFREE HR PEER_COUNT等属性 + """ + ret_attr = { + "free": False, + "2xfree": False, + "hr": False, + "peer_count": 0 + } + if not torrent_url: + return ret_attr + xpath_strs = self.get_grapsite_conf(torrent_url) + if not xpath_strs: + return ret_attr + html_text = self.__get_site_page_html(url=torrent_url, + cookie=cookie, + ua=ua, + render=xpath_strs.get('RENDER'), + proxy=proxy) + if not html_text: + return ret_attr + try: + html = etree.HTML(html_text) + # 检测2XFREE + for xpath_str in xpath_strs.get("2XFREE"): + if html.xpath(xpath_str): + ret_attr["free"] = True + ret_attr["2xfree"] = True + # 检测FREE + for xpath_str in xpath_strs.get("FREE"): + if html.xpath(xpath_str): + ret_attr["free"] = True + # 检测HR + for xpath_str in xpath_strs.get("HR"): + if html.xpath(xpath_str): + ret_attr["hr"] = True + # 检测PEER_COUNT当前做种人数 + for xpath_str in xpath_strs.get("PEER_COUNT"): + peer_count_dom = html.xpath(xpath_str) + if peer_count_dom: + peer_count_str = ''.join(peer_count_dom[0].itertext()) + peer_count_digit_str = "" + for m in peer_count_str: + if m.isdigit(): + peer_count_digit_str = peer_count_digit_str + m + ret_attr["peer_count"] = int(peer_count_digit_str) if len(peer_count_digit_str) > 0 else 0 + except Exception as err: + ExceptionUtils.exception_traceback(err) + # 随机休眼后再返回 + time.sleep(round(random.uniform(1, 5), 1)) + return ret_attr + + @staticmethod + def is_public_site(url): + """ + 判断是否为公开BT站点 + """ + _, netloc = StringUtils.get_url_netloc(url) + if netloc in SiteConf.PUBLIC_TORRENT_SITES.keys(): + return True + return False + + @staticmethod + def get_public_sites(url=None): + """ + 查询所有公开BT站点 + """ + if url: + _, netloc = StringUtils.get_url_netloc(url) + return SiteConf.PUBLIC_TORRENT_SITES.get(netloc) or {} + else: + return SiteConf.PUBLIC_TORRENT_SITES.items() + + @staticmethod + def __get_site_note_items(note): + """ + 从note中提取站点信息 + """ + infos = {} + if note: + infos = json.loads(note) + return infos diff --git a/app/sites/sitesignin/_base.py b/app/sites/sitesignin/_base.py new file mode 100644 index 0000000..30c4eaf --- /dev/null +++ b/app/sites/sitesignin/_base.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from abc import ABCMeta, abstractmethod + +from app.utils import StringUtils + + +class _ISiteSigninHandler(metaclass=ABCMeta): + """ + 实现站点签到的基类,所有站点签到类都需要继承此类,并实现match和signin方法 + 实现类放置到sitesignin目录下将会自动加载 + """ + # 匹配的站点Url,每一个实现类都需要设置为自己的站点Url + site_url = "" + + @abstractmethod + def match(self, url): + """ + 根据站点Url判断是否匹配当前站点签到类,大部分情况使用默认实现即可 + :param url: 站点Url + :return: 是否匹配,如匹配则会调用该类的signin方法 + """ + return True if StringUtils.url_equal(url, self.site_url) else False + + @abstractmethod + def signin(self, site_info: dict): + """ + 执行签到操作 + :param site_info: 站点信息,含有站点Url、站点Cookie、UA等信息 + :return: 签到结果信息 + """ + pass diff --git a/app/sites/siteuserinfo/__init__.py b/app/sites/siteuserinfo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/sites/siteuserinfo/_base.py b/app/sites/siteuserinfo/_base.py new file mode 100644 index 0000000..fc5695a --- /dev/null +++ b/app/sites/siteuserinfo/_base.py @@ -0,0 +1,319 @@ +# -*- coding: utf-8 -*- +import base64 +import json +import re +from abc import ABCMeta, abstractmethod +from urllib.parse import urljoin, urlsplit + +import requests +from lxml import etree + +import log +from app.helper import SiteHelper +from app.utils import RequestUtils +from app.utils.types import SiteSchema + +SITE_BASE_ORDER = 1000 + + +class _ISiteUserInfo(metaclass=ABCMeta): + # 站点模版 + schema = SiteSchema.NexusPhp + # 站点解析时判断顺序,值越小越先解析 + order = SITE_BASE_ORDER + + def __init__(self, site_name, url, site_cookie, index_html, session=None, ua=None): + super().__init__() + # 站点信息 + self.site_name = None + self.site_url = None + self.site_favicon = None + # 用户信息 + self.username = None + self.userid = None + # 未读消息 + self.message_unread = 0 + self.message_unread_contents = [] + + # 流量信息 + self.upload = 0 + self.download = 0 + self.ratio = 0 + + # 种子信息 + self.seeding = 0 + self.leeching = 0 + self.uploaded = 0 + self.completed = 0 + self.incomplete = 0 + self.seeding_size = 0 + self.leeching_size = 0 + self.uploaded_size = 0 + self.completed_size = 0 + self.incomplete_size = 0 + # 做种人数, 种子大小 + self.seeding_info = [] + + # 用户详细信息 + self.user_level = None + self.join_at = None + self.bonus = 0.0 + + # 错误信息 + self.err_msg = None + # 内部数据 + self._base_url = None + self._site_cookie = None + self._index_html = None + self._addition_headers = None + + # 站点页面 + self._brief_page = "index.php" + self._user_detail_page = "userdetails.php?id=" + self._user_traffic_page = "index.php" + self._torrent_seeding_page = "getusertorrentlistajax.php?userid=" + self._user_mail_unread_page = "messages.php?action=viewmailbox&box=1&unread=yes" + self._sys_mail_unread_page = "messages.php?action=viewmailbox&box=-2&unread=yes" + self._torrent_seeding_params = None + self._torrent_seeding_headers = None + + split_url = urlsplit(url) + self.site_name = site_name + self.site_url = url + self._base_url = f"{split_url.scheme}://{split_url.netloc}" + self._favicon_url = urljoin(self._base_url, "favicon.ico") + self.site_favicon = "" + self._site_cookie = site_cookie + self._index_html = index_html + self._session = session if session else requests.Session() + self._ua = ua + + def site_schema(self): + """ + 站点解析模型 + :return: 站点解析模型 + """ + return self.schema + + @classmethod + def match(cls, html_text): + """ + 是否匹配当前解析模型 + :param html_text: 站点首页html + :return: 是否匹配 + """ + return False + + def parse(self): + """ + 解析站点信息 + :return: + """ + self._parse_favicon(self._index_html) + if not self._parse_logged_in(self._index_html): + return + + self._parse_site_page(self._index_html) + self._parse_user_base_info(self._index_html) + self._pase_unread_msgs() + if self._user_traffic_page: + self._parse_user_traffic_info(self._get_page_content(urljoin(self._base_url, self._user_traffic_page))) + if self._user_detail_page: + self._parse_user_detail_info(self._get_page_content(urljoin(self._base_url, self._user_detail_page))) + + self._parse_seeding_pages() + self.seeding_info = json.dumps(self.seeding_info) + + def _pase_unread_msgs(self): + """ + 解析所有未读消息标题和内容 + :return: + """ + unread_msg_links = [] + if self.message_unread > 0: + links = {self._user_mail_unread_page, self._sys_mail_unread_page} + for link in links: + if not link: + continue + + msg_links = [] + next_page = self._parse_message_unread_links( + self._get_page_content(urljoin(self._base_url, link)), msg_links) + while next_page: + next_page = self._parse_message_unread_links( + self._get_page_content(urljoin(self._base_url, next_page)), msg_links) + + unread_msg_links.extend(msg_links) + + for msg_link in unread_msg_links: + print(msg_link) + log.debug(f"【Sites】{self.site_name} 信息链接 {msg_link}") + head, date, content = self._parse_message_content(self._get_page_content(urljoin(self._base_url, msg_link))) + log.debug(f"【Sites】{self.site_name} 标题 {head} 时间 {date} 内容 {content}") + self.message_unread_contents.append((head, date, content)) + + def _parse_seeding_pages(self): + seeding_pages = [] + if self._torrent_seeding_page: + if isinstance(self._torrent_seeding_page, list): + seeding_pages.extend(self._torrent_seeding_page) + else: + seeding_pages.append(self._torrent_seeding_page) + + for seeding_page in seeding_pages: + # 第一页 + next_page = self._parse_user_torrent_seeding_info( + self._get_page_content(urljoin(self._base_url, seeding_page), + self._torrent_seeding_params, + self._torrent_seeding_headers)) + + # 其他页处理 + while next_page: + next_page = self._parse_user_torrent_seeding_info( + self._get_page_content(urljoin(urljoin(self._base_url, seeding_page), next_page), + self._torrent_seeding_params, + self._torrent_seeding_headers), + multi_page=True) + + @staticmethod + def _prepare_html_text(html_text): + """ + 处理掉HTML中的干扰部分 + """ + return re.sub(r"#\d+", "", re.sub(r"\d+px", "", html_text)) + + @abstractmethod + def _parse_message_unread_links(self, html_text, msg_links): + """ + 获取未阅读消息链接 + :param html_text: + :return: + """ + pass + + def _parse_favicon(self, html_text): + """ + 解析站点favicon,返回base64 fav图标 + :param html_text: + :return: + """ + html = etree.HTML(html_text) + if html: + fav_link = html.xpath('//head/link[contains(@rel, "icon")]/@href') + if fav_link: + self._favicon_url = urljoin(self._base_url, fav_link[0]) + + res = RequestUtils(cookies=self._site_cookie, session=self._session, timeout=60, headers=self._ua).get_res( + url=self._favicon_url) + if res: + self.site_favicon = base64.b64encode(res.content).decode() + + def _get_page_content(self, url, params=None, headers=None): + """ + :param url: 网页地址 + :param params: post参数 + :param headers: 额外的请求头 + :return: + """ + req_headers = None + if self._ua or headers or self._addition_headers: + req_headers = {} + if headers: + req_headers.update(headers) + + if isinstance(self._ua, str): + req_headers.update({ + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "User-Agent": f"{self._ua}" + }) + else: + req_headers.update(self._ua) + + if self._addition_headers: + req_headers.update(self._addition_headers) + + if params: + res = RequestUtils(cookies=self._site_cookie, session=self._session, timeout=60, + headers=req_headers).post_res( + url=url, params=params) + else: + res = RequestUtils(cookies=self._site_cookie, session=self._session, timeout=60, + headers=req_headers).get_res( + url=url) + if res is not None and res.status_code in (200, 500): + if "charset=utf-8" in res.text or "charset=UTF-8" in res.text: + res.encoding = "UTF-8" + else: + res.encoding = res.apparent_encoding + return res.text + + return "" + + @abstractmethod + def _parse_site_page(self, html_text): + """ + 解析站点相关信息页面 + :param html_text: + :return: + """ + pass + + @abstractmethod + def _parse_user_base_info(self, html_text): + """ + 解析用户基础信息 + :param html_text: + :return: + """ + pass + + def _parse_logged_in(self, html_text): + """ + 解析用户是否已经登陆 + :param html_text: + :return: True/False + """ + logged_in = SiteHelper.is_logged_in(html_text) + if not logged_in: + self.err_msg = "未检测到已登陆,请检查cookies是否过期" + log.warn(f"【Sites】{self.site_name} 未登录,跳过后续操作") + + return logged_in + + @abstractmethod + def _parse_user_traffic_info(self, html_text): + """ + 解析用户的上传,下载,分享率等信息 + :param html_text: + :return: + """ + pass + + @abstractmethod + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 解析用户的做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + pass + + @abstractmethod + def _parse_user_detail_info(self, html_text): + """ + 解析用户的详细信息 + 加入时间/等级/魔力值等 + :param html_text: + :return: + """ + pass + + @abstractmethod + def _parse_message_content(self, html_text): + """ + 解析短消息内容 + :param html_text: + :return: head: message, date: time, content: message content + """ + pass diff --git a/app/sites/siteuserinfo/discuz.py b/app/sites/siteuserinfo/discuz.py new file mode 100644 index 0000000..41717a1 --- /dev/null +++ b/app/sites/siteuserinfo/discuz.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class DiscuzUserInfo(_ISiteUserInfo): + schema = SiteSchema.DiscuzX + order = SITE_BASE_ORDER + 10 + + @classmethod + def match(cls, html_text): + html = etree.HTML(html_text) + if not html: + return False + + printable_text = html.xpath("string(.)") if html else "" + return 'Powered by Discuz!' in printable_text + + def _parse_user_base_info(self, html_text): + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + + user_info = html.xpath('//a[contains(@href, "&uid=")]') + if user_info: + user_id_match = re.search(r"&uid=(\d+)", user_info[0].attrib['href']) + if user_id_match and user_id_match.group().strip(): + self.userid = user_id_match.group(1) + self._torrent_seeding_page = f"forum.php?&mod=torrents&cat_5up=on" + self._user_detail_page = user_info[0].attrib['href'] + self.username = user_info[0].text.strip() + + def _parse_site_page(self, html_text): + # TODO + pass + + def _parse_user_detail_info(self, html_text): + """ + 解析用户额外信息,加入时间,等级 + :param html_text: + :return: + """ + html = etree.HTML(html_text) + if not html: + return None + + # 用户等级 + user_levels_text = html.xpath('//a[contains(@href, "usergroup")]/text()') + if user_levels_text: + self.user_level = user_levels_text[-1].strip() + + # 加入日期 + join_at_text = html.xpath('//li[em[text()="注册时间"]]/text()') + if join_at_text: + self.join_at = StringUtils.unify_datetime_str(join_at_text[0].strip()) + + # 分享率 + ratio_text = html.xpath('//li[contains(.//text(), "分享率")]//text()') + if ratio_text: + ratio_match = re.search(r"\(([\d,.]+)\)", ratio_text[0]) + if ratio_match and ratio_match.group(1).strip(): + self.bonus = StringUtils.str_float(ratio_match.group(1)) + + # 积分 + bouns_text = html.xpath('//li[em[text()="积分"]]/text()') + if bouns_text: + self.bonus = StringUtils.str_float(bouns_text[0].strip()) + + # 上传 + upload_text = html.xpath('//li[em[contains(text(),"上传量")]]/text()') + if upload_text: + self.upload = StringUtils.num_filesize(upload_text[0].strip().split('/')[-1]) + + # 下载 + download_text = html.xpath('//li[em[contains(text(),"下载量")]]/text()') + if download_text: + self.download = StringUtils.num_filesize(download_text[0].strip().split('/')[-1]) + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + html = etree.HTML(html_text) + if not html: + return None + + size_col = 3 + seeders_col = 4 + # 搜索size列 + if html.xpath('//tr[position()=1]/td[.//img[@class="size"] and .//img[@alt="size"]]'): + size_col = len(html.xpath('//tr[position()=1]/td[.//img[@class="size"] ' + 'and .//img[@alt="size"]]/preceding-sibling::td')) + 1 + # 搜索seeders列 + if html.xpath('//tr[position()=1]/td[.//img[@class="seeders"] and .//img[@alt="seeders"]]'): + seeders_col = len(html.xpath('//tr[position()=1]/td[.//img[@class="seeders"] ' + 'and .//img[@alt="seeders"]]/preceding-sibling::td')) + 1 + + page_seeding = 0 + page_seeding_size = 0 + page_seeding_info = [] + seeding_sizes = html.xpath(f'//tr[position()>1]/td[{size_col}]') + seeding_seeders = html.xpath(f'//tr[position()>1]/td[{seeders_col}]//text()') + if seeding_sizes and seeding_seeders: + page_seeding = len(seeding_sizes) + + for i in range(0, len(seeding_sizes)): + size = StringUtils.num_filesize(seeding_sizes[i].xpath("string(.)").strip()) + seeders = StringUtils.str_int(seeding_seeders[i]) + + page_seeding_size += size + page_seeding_info.append([seeders, size]) + + self.seeding += page_seeding + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) + + # 是否存在下页数据 + next_page = None + next_page_text = html.xpath('//a[contains(.//text(), "下一页") or contains(.//text(), "下一頁")]/@href') + if next_page_text: + next_page = next_page_text[-1].strip() + + return next_page + + def _parse_user_traffic_info(self, html_text): + pass + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + return None, None, None diff --git a/app/sites/siteuserinfo/file_list.py b/app/sites/siteuserinfo/file_list.py new file mode 100644 index 0000000..59d823b --- /dev/null +++ b/app/sites/siteuserinfo/file_list.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class FileListSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.FileList + order = SITE_BASE_ORDER + 50 + + @classmethod + def match(cls, html_text): + html = etree.HTML(html_text) + if not html: + return False + + printable_text = html.xpath("string(.)") if html else "" + return 'Powered by FileList' in printable_text + + def _parse_site_page(self, html_text): + html_text = self._prepare_html_text(html_text) + + user_detail = re.search(r"userdetails.php\?id=(\d+)", html_text) + if user_detail and user_detail.group().strip(): + self._user_detail_page = user_detail.group().strip().lstrip('/') + self.userid = user_detail.group(1) + + self._torrent_seeding_page = f"snatchlist.php?id={self.userid}&action=torrents&type=seeding" + + def _parse_user_base_info(self, html_text): + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + + ret = html.xpath(f'//a[contains(@href, "userdetails") and contains(@href, "{self.userid}")]//text()') + if ret: + self.username = str(ret[0]) + + def _parse_user_traffic_info(self, html_text): + """ + 上传/下载/分享率 [做种数/魔力值] + :param html_text: + :return: + """ + return + + def _parse_user_detail_info(self, html_text): + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + + upload_html = html.xpath('//table//tr/td[text()="Uploaded"]/following-sibling::td//text()') + if upload_html: + self.upload = StringUtils.num_filesize(upload_html[0]) + download_html = html.xpath('//table//tr/td[text()="Downloaded"]/following-sibling::td//text()') + if download_html: + self.download = StringUtils.num_filesize(download_html[0]) + + self.ratio = 0 if self.download == 0 else self.upload / self.download + + user_level_html = html.xpath('//table//tr/td[text()="Class"]/following-sibling::td//text()') + if user_level_html: + self.user_level = user_level_html[0].strip() + + join_at_html = html.xpath('//table//tr/td[contains(text(), "Join")]/following-sibling::td//text()') + if join_at_html: + self.join_at = StringUtils.unify_datetime_str(join_at_html[0].strip()) + + bonus_html = html.xpath('//a[contains(@href, "shop.php")]') + if bonus_html: + self.bonus = StringUtils.str_float(bonus_html[0].xpath("string(.)").strip()) + pass + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + html = etree.HTML(html_text) + if not html: + return None + + size_col = 6 + seeders_col = 7 + + page_seeding = 0 + page_seeding_size = 0 + page_seeding_info = [] + seeding_sizes = html.xpath(f'//table/tr[position()>1]/td[{size_col}]') + seeding_seeders = html.xpath(f'//table/tr[position()>1]/td[{seeders_col}]') + if seeding_sizes and seeding_seeders: + page_seeding = len(seeding_sizes) + + for i in range(0, len(seeding_sizes)): + size = StringUtils.num_filesize(seeding_sizes[i].xpath("string(.)").strip()) + seeders = StringUtils.str_int(seeding_seeders[i].xpath("string(.)").strip()) + + page_seeding_size += size + page_seeding_info.append([seeders, size]) + + self.seeding += page_seeding + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) + + # 是否存在下页数据 + next_page = None + + return next_page + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + return None, None, None diff --git a/app/sites/siteuserinfo/gazelle.py b/app/sites/siteuserinfo/gazelle.py new file mode 100644 index 0000000..ec4dfe4 --- /dev/null +++ b/app/sites/siteuserinfo/gazelle.py @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class GazelleSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.Gazelle + order = SITE_BASE_ORDER + + @classmethod + def match(cls, html_text): + html = etree.HTML(html_text) + if not html: + return False + + printable_text = html.xpath("string(.)") if html else "" + + return "Powered by Gazelle" in printable_text or "DIC Music" in printable_text + + def _parse_user_base_info(self, html_text): + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + + tmps = html.xpath('//a[contains(@href, "user.php?id=")]') + if tmps: + user_id_match = re.search(r"user.php\?id=(\d+)", tmps[0].attrib['href']) + if user_id_match and user_id_match.group().strip(): + self.userid = user_id_match.group(1) + self._torrent_seeding_page = f"torrents.php?type=seeding&userid={self.userid}" + self._user_detail_page = f"user.php?id={self.userid}" + self.username = tmps[0].text.strip() + + tmps = html.xpath('//*[@id="header-uploaded-value"]/@data-value') + if tmps: + self.upload = StringUtils.num_filesize(tmps[0]) + else: + tmps = html.xpath('//li[@id="stats_seeding"]/span/text()') + if tmps: + self.upload = StringUtils.num_filesize(tmps[0]) + + tmps = html.xpath('//*[@id="header-downloaded-value"]/@data-value') + if tmps: + self.download = StringUtils.num_filesize(tmps[0]) + else: + tmps = html.xpath('//li[@id="stats_leeching"]/span/text()') + if tmps: + self.download = StringUtils.num_filesize(tmps[0]) + + self.ratio = 0.0 if self.download <= 0.0 else round(self.upload / self.download, 3) + + tmps = html.xpath('//a[contains(@href, "bonus.php")]/@data-tooltip') + if tmps: + bonus_match = re.search(r"([\d,.]+)", tmps[0]) + if bonus_match and bonus_match.group(1).strip(): + self.bonus = StringUtils.str_float(bonus_match.group(1)) + else: + tmps = html.xpath('//a[contains(@href, "bonus.php")]') + if tmps: + bonus_text = tmps[0].xpath("string(.)") + bonus_match = re.search(r"([\d,.]+)", bonus_text) + if bonus_match and bonus_match.group(1).strip(): + self.bonus = StringUtils.str_float(bonus_match.group(1)) + + def _parse_site_page(self, html_text): + # TODO + pass + + def _parse_user_detail_info(self, html_text): + """ + 解析用户额外信息,加入时间,等级 + :param html_text: + :return: + """ + html = etree.HTML(html_text) + if not html: + return None + + # 用户等级 + user_levels_text = html.xpath('//*[@id="class-value"]/@data-value') + if user_levels_text: + self.user_level = user_levels_text[0].strip() + else: + user_levels_text = html.xpath('//li[contains(text(), "用户等级")]/text()') + if user_levels_text: + self.user_level = user_levels_text[0].split(':')[1].strip() + + # 加入日期 + join_at_text = html.xpath('//*[@id="join-date-value"]/@data-value') + if join_at_text: + self.join_at = StringUtils.unify_datetime_str(join_at_text[0].strip()) + else: + join_at_text = html.xpath( + '//div[contains(@class, "box_userinfo_stats")]//li[contains(text(), "加入时间")]/span/text()') + if join_at_text: + self.join_at = StringUtils.unify_datetime_str(join_at_text[0].strip()) + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + html = etree.HTML(html_text) + if not html: + return None + + size_col = 3 + # 搜索size列 + if html.xpath('//table[contains(@id, "torrent")]//tr[1]/td'): + size_col = len(html.xpath('//table[contains(@id, "torrent")]//tr[1]/td')) - 3 + # 搜索seeders列 + seeders_col = size_col + 2 + + page_seeding = 0 + page_seeding_size = 0 + page_seeding_info = [] + seeding_sizes = html.xpath(f'//table[contains(@id, "torrent")]//tr[position()>1]/td[{size_col}]') + seeding_seeders = html.xpath(f'//table[contains(@id, "torrent")]//tr[position()>1]/td[{seeders_col}]/text()') + if seeding_sizes and seeding_seeders: + page_seeding = len(seeding_sizes) + + for i in range(0, len(seeding_sizes)): + size = StringUtils.num_filesize(seeding_sizes[i].xpath("string(.)").strip()) + seeders = int(seeding_seeders[i]) + + page_seeding_size += size + page_seeding_info.append([seeders, size]) + + if multi_page: + self.seeding += page_seeding + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) + else: + if not self.seeding: + self.seeding = page_seeding + if not self.seeding_size: + self.seeding_size = page_seeding_size + if not self.seeding_info: + self.seeding_info = page_seeding_info + + # 是否存在下页数据 + next_page = None + next_page_text = html.xpath('//a[contains(.//text(), "Next") or contains(.//text(), "下一页")]/@href') + if next_page_text: + next_page = next_page_text[-1].strip() + + return next_page + + def _parse_user_traffic_info(self, html_text): + # TODO + pass + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + return None, None, None diff --git a/app/sites/siteuserinfo/ipt_project.py b/app/sites/siteuserinfo/ipt_project.py new file mode 100644 index 0000000..cb57e10 --- /dev/null +++ b/app/sites/siteuserinfo/ipt_project.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class IptSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.Ipt + order = SITE_BASE_ORDER + 35 + + @classmethod + def match(cls, html_text): + return 'IPTorrents' in html_text + + def _parse_user_base_info(self, html_text): + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + tmps = html.xpath('//a[contains(@href, "/u/")]//text()') + tmps_id = html.xpath('//a[contains(@href, "/u/")]/@href') + if tmps: + self.username = str(tmps[-1]) + if tmps_id: + user_id_match = re.search(r"/u/(\d+)", tmps_id[0]) + if user_id_match and user_id_match.group().strip(): + self.userid = user_id_match.group(1) + self._user_detail_page = f"user.php?u={self.userid}" + self._torrent_seeding_page = f"peers?u={self.userid}" + + tmps = html.xpath('//div[@class = "stats"]/div/div') + if tmps: + self.upload = StringUtils.num_filesize(str(tmps[0].xpath('span/text()')[1]).strip()) + self.download = StringUtils.num_filesize(str(tmps[0].xpath('span/text()')[2]).strip()) + self.seeding = StringUtils.str_int(tmps[0].xpath('a')[2].xpath('text()')[0]) + self.leeching = StringUtils.str_int(tmps[0].xpath('a')[2].xpath('text()')[1]) + self.ratio = StringUtils.str_float(str(tmps[0].xpath('span/text()')[0]).strip().replace('-', '0')) + self.bonus = StringUtils.str_float(tmps[0].xpath('a')[3].xpath('text()')[0]) + + def _parse_site_page(self, html_text): + # TODO + pass + + def _parse_user_detail_info(self, html_text): + html = etree.HTML(html_text) + if not html: + return + + user_levels_text = html.xpath('//tr/th[text()="Class"]/following-sibling::td[1]/text()') + if user_levels_text: + self.user_level = user_levels_text[0].strip() + + # 加入日期 + join_at_text = html.xpath('//tr/th[text()="Join date"]/following-sibling::td[1]/text()') + if join_at_text: + self.join_at = StringUtils.unify_datetime_str(join_at_text[0].split(' (')[0]) + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + html = etree.HTML(html_text) + if not html: + return + # seeding start + seeding_end_pos = 3 + if html.xpath('//tr/td[text() = "Leechers"]'): + seeding_end_pos = len(html.xpath('//tr/td[text() = "Leechers"]/../preceding-sibling::tr')) + 1 + seeding_end_pos = seeding_end_pos - 3 + + page_seeding = 0 + page_seeding_size = 0 + seeding_torrents = html.xpath('//tr/td[text() = "Seeders"]/../following-sibling::tr/td[position()=6]/text()') + if seeding_torrents: + page_seeding = seeding_end_pos + for per_size in seeding_torrents[:seeding_end_pos]: + if '(' in per_size and ')' in per_size: + per_size = per_size.split('(')[-1] + per_size = per_size.split(')')[0] + + page_seeding_size += StringUtils.num_filesize(per_size) + + self.seeding = page_seeding + self.seeding_size = page_seeding_size + + def _parse_user_traffic_info(self, html_text): + # TODO + pass + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + return None, None, None diff --git a/app/sites/siteuserinfo/nexus_php.py b/app/sites/siteuserinfo/nexus_php.py new file mode 100644 index 0000000..5c54015 --- /dev/null +++ b/app/sites/siteuserinfo/nexus_php.py @@ -0,0 +1,343 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +import log +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.exception_utils import ExceptionUtils +from app.utils.types import SiteSchema + + +class NexusPhpSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.NexusPhp + order = SITE_BASE_ORDER * 2 + + @classmethod + def match(cls, html_text): + """ + 默认使用NexusPhp解析 + :param html_text: + :return: + """ + return True + + def _parse_site_page(self, html_text): + html_text = self._prepare_html_text(html_text) + + user_detail = re.search(r"userdetails.php\?id=(\d+)", html_text) + if user_detail and user_detail.group().strip(): + self._user_detail_page = user_detail.group().strip().lstrip('/') + self.userid = user_detail.group(1) + self._torrent_seeding_page = f"getusertorrentlistajax.php?userid={self.userid}&type=seeding" + else: + user_detail = re.search(r"(userdetails)", html_text) + if user_detail and user_detail.group().strip(): + self._user_detail_page = user_detail.group().strip().lstrip('/') + self.userid = None + self._torrent_seeding_page = None + + def _parse_message_unread(self, html_text): + """ + 解析未读短消息数量 + :param html_text: + :return: + """ + html = etree.HTML(html_text) + if not html: + return + + message_labels = html.xpath('//a[contains(@href, "messages.php")]/..') + if message_labels: + message_text = message_labels[0].xpath("string(.)") + + log.debug(f"【Sites】{self.site_name} 消息原始信息 {message_text}") + message_unread_match = re.findall(r"[^Date](信息箱\s*|\(|你有\xa0)(\d+)", message_text) + + if message_unread_match and len(message_unread_match[-1]) == 2: + self.message_unread = StringUtils.str_int(message_unread_match[-1][1]) + + def _parse_user_base_info(self, html_text): + # 合并解析,减少额外请求调用 + self.__parse_user_traffic_info(html_text) + self._user_traffic_page = None + + self._parse_message_unread(html_text) + + html = etree.HTML(html_text) + if not html: + return + + ret = html.xpath(f'//a[contains(@href, "userdetails") and contains(@href, "{self.userid}")]//b//text()') + if ret: + self.username = str(ret[0]) + return + ret = html.xpath(f'//a[contains(@href, "userdetails") and contains(@href, "{self.userid}")]//text()') + if ret: + self.username = str(ret[0]) + + ret = html.xpath('//a[contains(@href, "userdetails")]//strong//text()') + if ret: + self.username = str(ret[0]) + return + + def __parse_user_traffic_info(self, html_text): + html_text = self._prepare_html_text(html_text) + upload_match = re.search(r"[^总]上[传傳]量?[::_<>/a-zA-Z-=\"'\s#;]+([\d,.\s]+[KMGTPI]*B)", html_text, + re.IGNORECASE) + self.upload = StringUtils.num_filesize(upload_match.group(1).strip()) if upload_match else 0 + download_match = re.search(r"[^总子影力]下[载載]量?[::_<>/a-zA-Z-=\"'\s#;]+([\d,.\s]+[KMGTPI]*B)", html_text, + re.IGNORECASE) + self.download = StringUtils.num_filesize(download_match.group(1).strip()) if download_match else 0 + ratio_match = re.search(r"分享率[::_<>/a-zA-Z-=\"'\s#;]+([\d,.\s]+)", html_text) + self.ratio = StringUtils.str_float(ratio_match.group(1)) if ( + ratio_match and ratio_match.group(1).strip()) else 0.0 + leeching_match = re.search(r"(Torrents leeching|下载中)[\u4E00-\u9FA5\D\s]+(\d+)[\s\S]+<", html_text) + self.leeching = StringUtils.str_int(leeching_match.group(2)) if leeching_match and leeching_match.group( + 2).strip() else 0 + html = etree.HTML(html_text) + tmps = html.xpath('//span[@class = "ucoin-symbol ucoin-gold"]//text()') if html else None + if tmps: + self.bonus = StringUtils.str_float(str(tmps[-1])) + return + tmps = html.xpath('//a[contains(@href,"mybonus")]/text()') if html else None + if tmps: + bonus_text = str(tmps[0]).strip() + bonus_match = re.search(r"([\d,.]+)", bonus_text) + if bonus_match and bonus_match.group(1).strip(): + self.bonus = StringUtils.str_float(bonus_match.group(1)) + return + bonus_match = re.search(r"mybonus.[\[\]::<>/a-zA-Z_\-=\"'\s#;.(使用魔力值豆]+\s*([\d,.]+)[<()&\s]", html_text) + try: + if bonus_match and bonus_match.group(1).strip(): + self.bonus = StringUtils.str_float(bonus_match.group(1)) + return + bonus_match = re.search(r"[魔力值|\]][\[\]::<>/a-zA-Z_\-=\"'\s#;]+\s*([\d,.]+)[<()&\s]", html_text, + flags=re.S) + if bonus_match and bonus_match.group(1).strip(): + self.bonus = StringUtils.str_float(bonus_match.group(1)) + except Exception as err: + ExceptionUtils.exception_traceback(err) + + def _parse_user_traffic_info(self, html_text): + """ + 上传/下载/分享率 [做种数/魔力值] + :param html_text: + :return: + """ + pass + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + html = etree.HTML(str(html_text).replace(r'\/', '/')) + if not html: + return None + + size_col = 3 + seeders_col = 4 + # 搜索size列 + size_col_xpath = '//tr[position()=1]/td[(img[@class="size"] and img[@alt="size"]) or (text() = "大小")]' + if html.xpath(size_col_xpath): + size_col = len(html.xpath(f'{size_col_xpath}/preceding-sibling::td')) + 1 + # 搜索seeders列 + seeders_col_xpath = '//tr[position()=1]/td[(img[@class="seeders"] and img[@alt="seeders"]) or (text() = "在做种")]' + if html.xpath(seeders_col_xpath): + seeders_col = len(html.xpath(f'{seeders_col_xpath}/preceding-sibling::td')) + 1 + + page_seeding = 0 + page_seeding_size = 0 + page_seeding_info = [] + seeding_sizes = html.xpath(f'//tr[position()>1]/td[{size_col}]') + seeding_seeders = html.xpath(f'//tr[position()>1]/td[{seeders_col}]//text()') + if seeding_sizes and seeding_seeders: + page_seeding = len(seeding_sizes) + + for i in range(0, len(seeding_sizes)): + size = StringUtils.num_filesize(seeding_sizes[i].xpath("string(.)").strip()) + seeders = StringUtils.str_int(seeding_seeders[i]) + + page_seeding_size += size + page_seeding_info.append([seeders, size]) + + self.seeding += page_seeding + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) + + # 是否存在下页数据 + next_page = None + next_page_text = html.xpath('//a[contains(.//text(), "下一页") or contains(.//text(), "下一頁")]/@href') + if next_page_text: + next_page = next_page_text[-1].strip() + # fix up page url + if self.userid not in next_page: + next_page = f'{next_page}&userid={self.userid}&type=seeding' + + return next_page + + def _parse_user_detail_info(self, html_text): + """ + 解析用户额外信息,加入时间,等级 + :param html_text: + :return: + """ + html = etree.HTML(html_text) + if not html: + return + + self.__get_user_level(html) + + # 加入日期 + join_at_text = html.xpath( + '//tr/td[text()="加入日期" or text()="注册日期" or *[text()="加入日期"]]/following-sibling::td[1]//text()' + '|//div/b[text()="加入日期"]/../text()') + if join_at_text: + self.join_at = StringUtils.unify_datetime_str(join_at_text[0].split(' (')[0].strip()) + + # 做种体积 & 做种数 + # seeding 页面获取不到的话,此处再获取一次 + seeding_sizes = html.xpath('//tr/td[text()="当前上传"]/following-sibling::td[1]//' + 'table[tr[1][td[4 and text()="尺寸"]]]//tr[position()>1]/td[4]') + seeding_seeders = html.xpath('//tr/td[text()="当前上传"]/following-sibling::td[1]//' + 'table[tr[1][td[5 and text()="做种者"]]]//tr[position()>1]/td[5]//text()') + tmp_seeding = len(seeding_sizes) + tmp_seeding_size = 0 + tmp_seeding_info = [] + for i in range(0, len(seeding_sizes)): + size = StringUtils.num_filesize(seeding_sizes[i].xpath("string(.)").strip()) + seeders = StringUtils.str_int(seeding_seeders[i]) + + tmp_seeding_size += size + tmp_seeding_info.append([seeders, size]) + + if not self.seeding_size: + self.seeding_size = tmp_seeding_size + if not self.seeding: + self.seeding = tmp_seeding + if not self.seeding_info: + self.seeding_info = tmp_seeding_info + + seeding_sizes = html.xpath('//tr/td[text()="做种统计"]/following-sibling::td[1]//text()') + if seeding_sizes: + seeding_match = re.search(r"总做种数:\s+(\d+)", seeding_sizes[0], re.IGNORECASE) + seeding_size_match = re.search(r"总做种体积:\s+([\d,.\s]+[KMGTPI]*B)", seeding_sizes[0], re.IGNORECASE) + tmp_seeding = StringUtils.str_int(seeding_match.group(1)) if ( + seeding_match and seeding_match.group(1)) else 0 + tmp_seeding_size = StringUtils.num_filesize( + seeding_size_match.group(1).strip()) if seeding_size_match else 0 + if not self.seeding_size: + self.seeding_size = tmp_seeding_size + if not self.seeding: + self.seeding = tmp_seeding + + self.__fixup_torrent_seeding_page(html) + + def __fixup_torrent_seeding_page(self, html): + """ + 修正种子页面链接 + :param html: + :return: + """ + # 单独的种子页面 + seeding_url_text = html.xpath('//a[contains(@href,"getusertorrentlist.php") ' + 'and contains(@href,"seeding")]/@href') + if seeding_url_text: + self._torrent_seeding_page = seeding_url_text[0].strip() + # 从JS调用种获取用户ID + seeding_url_text = html.xpath('//a[contains(@href, "javascript: getusertorrentlistajax") ' + 'and contains(@href,"seeding")]/@href') + csrf_text = html.xpath('//meta[@name="x-csrf"]/@content') + if not self._torrent_seeding_page and seeding_url_text: + user_js = re.search(r"javascript: getusertorrentlistajax\(\s*'(\d+)", seeding_url_text[0]) + if user_js and user_js.group(1).strip(): + self.userid = user_js.group(1).strip() + self._torrent_seeding_page = f"getusertorrentlistajax.php?userid={self.userid}&type=seeding" + elif seeding_url_text and csrf_text: + if csrf_text[0].strip(): + self._torrent_seeding_page \ + = f"ajax_getusertorrentlist.php" + self._torrent_seeding_params = {'userid': self.userid, 'type': 'seeding', 'csrf': csrf_text[0].strip()} + + # 分类做种模式 + # 临时屏蔽 + # seeding_url_text = html.xpath('//tr/td[text()="当前做种"]/following-sibling::td[1]' + # '/table//td/a[contains(@href,"seeding")]/@href') + # if seeding_url_text: + # self._torrent_seeding_page = seeding_url_text + + def __get_user_level(self, html): + # 等级 获取同一行等级数据,图片格式等级,取title信息,否则取文本信息 + user_levels_text = html.xpath('//tr/td[text()="等級" or text()="等级" or *[text()="等级"]]/' + 'following-sibling::td[1]/img[1]/@title') + if user_levels_text: + self.user_level = user_levels_text[0].strip() + return + + user_levels_text = html.xpath('//tr/td[text()="等級" or text()="等级"]/' + 'following-sibling::td[1 and not(img)]' + '|//tr/td[text()="等級" or text()="等级"]/' + 'following-sibling::td[1 and img[not(@title)]]') + if user_levels_text: + self.user_level = user_levels_text[0].xpath("string(.)").strip() + return + + user_levels_text = html.xpath('//tr/td[text()="等級" or text()="等级"]/' + 'following-sibling::td[1]') + if user_levels_text: + self.user_level = user_levels_text[0].xpath("string(.)").strip() + return + + user_levels_text = html.xpath('//a[contains(@href, "userdetails")]/text()') + if not self.user_level and user_levels_text: + for user_level_text in user_levels_text: + user_level_match = re.search(r"\[(.*)]", user_level_text) + if user_level_match and user_level_match.group(1).strip(): + self.user_level = user_level_match.group(1).strip() + break + + def _parse_message_unread_links(self, html_text, msg_links): + html = etree.HTML(html_text) + if not html: + return None + + message_links = html.xpath('//tr[not(./td/img[@alt="Read"])]/td/a[contains(@href, "viewmessage")]/@href') + msg_links.extend(message_links) + # 是否存在下页数据 + next_page = None + next_page_text = html.xpath('//a[contains(.//text(), "下一页") or contains(.//text(), "下一頁")]/@href') + if next_page_text: + next_page = next_page_text[-1].strip() + + return next_page + + def _parse_message_content(self, html_text): + html = etree.HTML(html_text) + if not html: + return None, None, None + # 标题 + message_head_text = None + message_head = html.xpath('//h1/text()' + '|//div[@class="layui-card-header"]/span[1]/text()') + if message_head: + message_head_text = message_head[-1].strip() + + # 消息时间 + message_date_text = None + message_date = html.xpath('//h1/following-sibling::table[.//tr/td[@class="colhead"]]//tr[2]/td[2]' + '|//div[@class="layui-card-header"]/span[2]/span[2]') + if message_date: + message_date_text = message_date[0].xpath("string(.)").strip() + + # 消息内容 + message_content_text = None + message_content = html.xpath('//h1/following-sibling::table[.//tr/td[@class="colhead"]]//tr[3]/td' + '|//div[contains(@class,"layui-card-body")]') + if message_content: + message_content_text = message_content[0].xpath("string(.)").strip() + + return message_head_text, message_date_text, message_content_text diff --git a/app/sites/siteuserinfo/nexus_project.py b/app/sites/siteuserinfo/nexus_project.py new file mode 100644 index 0000000..0880998 --- /dev/null +++ b/app/sites/siteuserinfo/nexus_project.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +import re + +from app.sites.siteuserinfo._base import SITE_BASE_ORDER +from app.sites.siteuserinfo.nexus_php import NexusPhpSiteUserInfo +from app.utils.types import SiteSchema + + +class NexusProjectSiteUserInfo(NexusPhpSiteUserInfo): + schema = SiteSchema.NexusProject + order = SITE_BASE_ORDER + 25 + + @classmethod + def match(cls, html_text): + return 'Nexus Project' in html_text + + def _parse_site_page(self, html_text): + html_text = self._prepare_html_text(html_text) + + user_detail = re.search(r"userdetails.php\?id=(\d+)", html_text) + if user_detail and user_detail.group().strip(): + self._user_detail_page = user_detail.group().strip().lstrip('/') + self.userid = user_detail.group(1) + + self._torrent_seeding_page = f"viewusertorrents.php?id={self.userid}&show=seeding" diff --git a/app/sites/siteuserinfo/nexus_rabbit.py b/app/sites/siteuserinfo/nexus_rabbit.py new file mode 100644 index 0000000..6f76430 --- /dev/null +++ b/app/sites/siteuserinfo/nexus_rabbit.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +import json + +from lxml import etree + +from app.sites.siteuserinfo._base import SITE_BASE_ORDER +from app.sites.siteuserinfo.nexus_php import NexusPhpSiteUserInfo +from app.utils.exception_utils import ExceptionUtils +from app.utils.types import SiteSchema + + +class NexusRabbitSiteUserInfo(NexusPhpSiteUserInfo): + schema = SiteSchema.NexusRabbit + order = SITE_BASE_ORDER + 5 + + @classmethod + def match(cls, html_text): + html = etree.HTML(html_text) + if not html: + return False + + printable_text = html.xpath("string(.)") if html else "" + return 'Style by Rabbit' in printable_text + + def _parse_site_page(self, html_text): + super()._parse_site_page(html_text) + self._torrent_seeding_page = f"getusertorrentlistajax.php?page=1&limit=5000000&type=seeding&uid={self.userid}" + self._torrent_seeding_headers = {"Accept": "application/json, text/javascript, */*; q=0.01"} + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + + try: + torrents = json.loads(html_text).get('data') + except Exception as e: + ExceptionUtils.exception_traceback(e) + return + + page_seeding_size = 0 + page_seeding_info = [] + + page_seeding = len(torrents) + for torrent in torrents: + seeders = int(torrent.get('seeders', 0)) + size = int(torrent.get('size', 0)) + page_seeding_size += int(torrent.get('size', 0)) + + page_seeding_info.append([seeders, size]) + + self.seeding += page_seeding + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) diff --git a/app/sites/siteuserinfo/small_horse.py b/app/sites/siteuserinfo/small_horse.py new file mode 100644 index 0000000..875c282 --- /dev/null +++ b/app/sites/siteuserinfo/small_horse.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class SmallHorseSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.SmallHorse + order = SITE_BASE_ORDER + 30 + + @classmethod + def match(cls, html_text): + return 'Small Horse' in html_text + + def _parse_site_page(self, html_text): + html_text = self._prepare_html_text(html_text) + + user_detail = re.search(r"user.php\?id=(\d+)", html_text) + if user_detail and user_detail.group().strip(): + self._user_detail_page = user_detail.group().strip().lstrip('/') + self.userid = user_detail.group(1) + self._user_traffic_page = f"user.php?id={self.userid}" + + def _parse_user_base_info(self, html_text): + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + ret = html.xpath('//a[contains(@href, "user.php")]//text()') + if ret: + self.username = str(ret[0]) + + def _parse_user_traffic_info(self, html_text): + """ + 上传/下载/分享率 [做种数/魔力值] + :param html_text: + :return: + """ + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + tmps = html.xpath('//ul[@class = "stats nobullet"]') + if tmps: + if tmps[1].xpath("li") and tmps[1].xpath("li")[0].xpath("span//text()"): + self.join_at = StringUtils.unify_datetime_str(tmps[1].xpath("li")[0].xpath("span//text()")[0]) + self.upload = StringUtils.num_filesize(str(tmps[1].xpath("li")[2].xpath("text()")[0]).split(":")[1].strip()) + self.download = StringUtils.num_filesize( + str(tmps[1].xpath("li")[3].xpath("text()")[0]).split(":")[1].strip()) + if tmps[1].xpath("li")[4].xpath("span//text()"): + self.ratio = StringUtils.str_float(str(tmps[1].xpath("li")[4].xpath("span//text()")[0]).replace('∞', '0')) + else: + self.ratio = StringUtils.str_float(str(tmps[1].xpath("li")[5].xpath("text()")[0]).split(":")[1]) + self.bonus = StringUtils.str_float(str(tmps[1].xpath("li")[5].xpath("text()")[0]).split(":")[1]) + self.user_level = str(tmps[3].xpath("li")[0].xpath("text()")[0]).split(":")[1].strip() + self.seeding = StringUtils.str_int( + (tmps[4].xpath("li")[5].xpath("text()")[0]).split(":")[1].replace("[", "")) + self.leeching = StringUtils.str_int( + (tmps[4].xpath("li")[6].xpath("text()")[0]).split(":")[1].replace("[", "")) + + def _parse_user_detail_info(self, html_text): + pass + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + pass + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + return None, None, None diff --git a/app/sites/siteuserinfo/tnode.py b/app/sites/siteuserinfo/tnode.py new file mode 100644 index 0000000..d6846f3 --- /dev/null +++ b/app/sites/siteuserinfo/tnode.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +import json +import re + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class TNodeSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.TNode + order = SITE_BASE_ORDER + 60 + + @classmethod + def match(cls, html_text): + return 'Powered By TNode' in html_text + + def _parse_site_page(self, html_text): + html_text = self._prepare_html_text(html_text) + + # + csrf_token = re.search(r'', html_text) + if csrf_token: + self._addition_headers = {'X-CSRF-TOKEN': csrf_token.group(1)} + self._user_detail_page = "api/user/getMainInfo" + self._torrent_seeding_page = "api/user/listTorrentActivity?id=&type=seeding&page=1&size=20000" + + def _parse_logged_in(self, html_text): + """ + 判断是否登录成功, 通过判断是否存在用户信息 + 暂时跳过检测,待后续优化 + :param html_text: + :return: + """ + return True + + def _parse_user_base_info(self, html_text): + self.username = self.userid + + def _parse_user_traffic_info(self, html_text): + pass + + def _parse_user_detail_info(self, html_text): + detail = json.loads(html_text) + if detail.get("status") != 200: + return + + user_info = detail.get("data", {}) + self.userid = user_info.get("id") + self.username = user_info.get("username") + self.user_level = user_info.get("class", {}).get("name") + self.join_at = user_info.get("regTime", 0) + self.join_at = StringUtils.unify_datetime_str(str(self.join_at)) + + self.upload = user_info.get("upload") + self.download = user_info.get("download") + self.ratio = 0 if self.download <= 0 else round(self.upload / self.download, 3) + self.bonus = user_info.get("bonus") + + self.message_unread = user_info.get("unreadAdmin", 0) + user_info.get("unreadInbox", 0) + user_info.get( + "unreadSystem", 0) + pass + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 解析用户做种信息 + """ + seeding_info = json.loads(html_text) + if seeding_info.get("status") != 200: + return + + torrents = seeding_info.get("data", {}).get("torrents", []) + + page_seeding_size = 0 + page_seeding_info = [] + for torrent in torrents: + size = torrent.get("size", 0) + seeders = torrent.get("seeding", 0) + + page_seeding_size += size + page_seeding_info.append([seeders, size]) + + self.seeding += len(torrents) + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) + + # 是否存在下页数据 + next_page = None + + return next_page + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + """ + 系统信息 api/message/listSystem?page=1&size=20 + 收件箱信息 api/message/listInbox?page=1&size=20 + 管理员信息 api/message/listAdmin?page=1&size=20 + :param html_text: + :return: + """ + return None, None, None diff --git a/app/sites/siteuserinfo/torrent_leech.py b/app/sites/siteuserinfo/torrent_leech.py new file mode 100644 index 0000000..b2a1aef --- /dev/null +++ b/app/sites/siteuserinfo/torrent_leech.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class TorrentLeechSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.TorrentLeech + order = SITE_BASE_ORDER + 40 + + @classmethod + def match(cls, html_text): + return 'TorrentLeech' in html_text + + def _parse_site_page(self, html_text): + html_text = self._prepare_html_text(html_text) + + user_detail = re.search(r"/profile/([^/]+)/", html_text) + if user_detail and user_detail.group().strip(): + self._user_detail_page = user_detail.group().strip().lstrip('/') + self.userid = user_detail.group(1) + self._user_traffic_page = f"profile/{self.userid}/view" + self._torrent_seeding_page = f"profile/{self.userid}/seeding" + + def _parse_user_base_info(self, html_text): + self.username = self.userid + + def _parse_user_traffic_info(self, html_text): + """ + 上传/下载/分享率 [做种数/魔力值] + :param html_text: + :return: + """ + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + upload_html = html.xpath('//div[contains(@class,"profile-uploaded")]//span/text()') + if upload_html: + self.upload = StringUtils.num_filesize(upload_html[0]) + download_html = html.xpath('//div[contains(@class,"profile-downloaded")]//span/text()') + if download_html: + self.download = StringUtils.num_filesize(download_html[0]) + ratio_html = html.xpath('//div[contains(@class,"profile-ratio")]//span/text()') + if ratio_html: + self.ratio = StringUtils.str_float(ratio_html[0].replace('∞', '0')) + + user_level_html = html.xpath('//table[contains(@class, "profileViewTable")]' + '//tr/td[text()="Class"]/following-sibling::td/text()') + if user_level_html: + self.user_level = user_level_html[0].strip() + + join_at_html = html.xpath('//table[contains(@class, "profileViewTable")]' + '//tr/td[text()="Registration date"]/following-sibling::td/text()') + if join_at_html: + self.join_at = StringUtils.unify_datetime_str(join_at_html[0].strip()) + + bonus_html = html.xpath('//span[contains(@class, "total-TL-points")]/text()') + if bonus_html: + self.bonus = StringUtils.str_float(bonus_html[0].strip()) + + def _parse_user_detail_info(self, html_text): + pass + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + html = etree.HTML(html_text) + if not html: + return None + + size_col = 2 + seeders_col = 7 + + page_seeding = 0 + page_seeding_size = 0 + page_seeding_info = [] + seeding_sizes = html.xpath(f'//tbody/tr/td[{size_col}]') + seeding_seeders = html.xpath(f'//tbody/tr/td[{seeders_col}]/text()') + if seeding_sizes and seeding_seeders: + page_seeding = len(seeding_sizes) + + for i in range(0, len(seeding_sizes)): + size = StringUtils.num_filesize(seeding_sizes[i].xpath("string(.)").strip()) + seeders = StringUtils.str_int(seeding_seeders[i]) + + page_seeding_size += size + page_seeding_info.append([seeders, size]) + + self.seeding += page_seeding + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) + + # 是否存在下页数据 + next_page = None + + return next_page + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + return None, None, None diff --git a/app/sites/siteuserinfo/unit3d.py b/app/sites/siteuserinfo/unit3d.py new file mode 100644 index 0000000..d33b454 --- /dev/null +++ b/app/sites/siteuserinfo/unit3d.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +import re + +from lxml import etree + +from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER +from app.utils import StringUtils +from app.utils.types import SiteSchema + + +class Unit3dSiteUserInfo(_ISiteUserInfo): + schema = SiteSchema.Unit3d + order = SITE_BASE_ORDER + 15 + + @classmethod + def match(cls, html_text): + return "unit3d.js" in html_text + + def _parse_user_base_info(self, html_text): + html_text = self._prepare_html_text(html_text) + html = etree.HTML(html_text) + + tmps = html.xpath('//a[contains(@href, "/users/") and contains(@href, "settings")]/@href') + if tmps: + user_name_match = re.search(r"/users/(.+)/settings", tmps[0]) + if user_name_match and user_name_match.group().strip(): + self.username = user_name_match.group(1) + self._torrent_seeding_page = f"/users/{self.username}/active?perPage=100&client=&seeding=include" + self._user_detail_page = f"/users/{self.username}" + + tmps = html.xpath('//a[contains(@href, "bonus/earnings")]') + if tmps: + bonus_text = tmps[0].xpath("string(.)") + bonus_match = re.search(r"([\d,.]+)", bonus_text) + if bonus_match and bonus_match.group(1).strip(): + self.bonus = StringUtils.str_float(bonus_match.group(1)) + + def _parse_site_page(self, html_text): + # TODO + pass + + def _parse_user_detail_info(self, html_text): + """ + 解析用户额外信息,加入时间,等级 + :param html_text: + :return: + """ + html = etree.HTML(html_text) + if not html: + return None + + # 用户等级 + user_levels_text = html.xpath('//div[contains(@class, "content")]//span[contains(@class, "badge-user")]/text()') + if user_levels_text: + self.user_level = user_levels_text[0].strip() + + # 加入日期 + join_at_text = html.xpath('//div[contains(@class, "content")]//h4[contains(text(), "注册日期") ' + 'or contains(text(), "註冊日期") ' + 'or contains(text(), "Registration date")]/text()') + if join_at_text: + self.join_at = StringUtils.unify_datetime_str( + join_at_text[0].replace('注册日期', '').replace('註冊日期', '').replace('Registration date', '')) + + def _parse_user_torrent_seeding_info(self, html_text, multi_page=False): + """ + 做种相关信息 + :param html_text: + :param multi_page: 是否多页数据 + :return: 下页地址 + """ + html = etree.HTML(html_text) + if not html: + return None + + size_col = 9 + seeders_col = 2 + # 搜索size列 + if html.xpath('//tr[position()=1]/th[contains(@class,"size")]'): + size_col = len(html.xpath('//tr[position()=1]/th[contains(@class,"size")]/preceding-sibling::th')) + 1 + # 搜索seeders列 + if html.xpath('//tr[position()=1]/th[contains(@class,"seeders")]'): + seeders_col = len(html.xpath('//tr[position()=1]/th[contains(@class,"seeders")]/preceding-sibling::th')) + 1 + + page_seeding = 0 + page_seeding_size = 0 + page_seeding_info = [] + seeding_sizes = html.xpath(f'//tr[position()]/td[{size_col}]') + seeding_seeders = html.xpath(f'//tr[position()]/td[{seeders_col}]') + if seeding_sizes and seeding_seeders: + page_seeding = len(seeding_sizes) + + for i in range(0, len(seeding_sizes)): + size = StringUtils.num_filesize(seeding_sizes[i].xpath("string(.)").strip()) + seeders = StringUtils.str_int(seeding_seeders[i].xpath("string(.)").strip()) + + page_seeding_size += size + page_seeding_info.append([seeders, size]) + + self.seeding += page_seeding + self.seeding_size += page_seeding_size + self.seeding_info.extend(page_seeding_info) + + # 是否存在下页数据 + next_page = None + next_pages = html.xpath('//ul[@class="pagination"]/li[contains(@class,"active")]/following-sibling::li') + if next_pages and len(next_pages) > 1: + page_num = next_pages[0].xpath("string(.)").strip() + if page_num.isdigit(): + next_page = f"{self._torrent_seeding_page}&page={page_num}" + + return next_page + + def _parse_user_traffic_info(self, html_text): + html_text = self._prepare_html_text(html_text) + upload_match = re.search(r"[^总]上[传傳]量?[::_<>/a-zA-Z-=\"'\s#;]+([\d,.\s]+[KMGTPI]*B)", html_text, + re.IGNORECASE) + self.upload = StringUtils.num_filesize(upload_match.group(1).strip()) if upload_match else 0 + download_match = re.search(r"[^总子影力]下[载載]量?[::_<>/a-zA-Z-=\"'\s#;]+([\d,.\s]+[KMGTPI]*B)", html_text, + re.IGNORECASE) + self.download = StringUtils.num_filesize(download_match.group(1).strip()) if download_match else 0 + ratio_match = re.search(r"分享率[::_<>/a-zA-Z-=\"'\s#;]+([\d,.\s]+)", html_text) + self.ratio = StringUtils.str_float(ratio_match.group(1)) if ( + ratio_match and ratio_match.group(1).strip()) else 0.0 + + def _parse_message_unread_links(self, html_text, msg_links): + return None + + def _parse_message_content(self, html_text): + return None, None, None diff --git a/app/speedlimiter.py b/app/speedlimiter.py new file mode 100644 index 0000000..792e4f2 --- /dev/null +++ b/app/speedlimiter.py @@ -0,0 +1,212 @@ +from app.conf import SystemConfig +from app.downloader import Downloader +from app.mediaserver import MediaServer +from app.utils import ExceptionUtils +from app.utils.commons import singleton +from app.utils.types import DownloaderType, MediaServerType +from app.helper.security_helper import SecurityHelper +from apscheduler.schedulers.background import BackgroundScheduler +from config import Config + +import log + + +@singleton +class SpeedLimiter: + downloader = None + mediaserver = None + limit_enabled = False + limit_flag = False + qb_limit = False + qb_download_limit = 0 + qb_upload_limit = 0 + qb_upload_ratio = 0 + tr_limit = False + tr_download_limit = 0 + tr_upload_limit = 0 + tr_upload_ratio = 0 + unlimited_ips = {"ipv4": "0.0.0.0/0", "ipv6": "::/0"} + auto_limit = False + bandwidth = 0 + + _scheduler = None + + def __init__(self): + self.init_config() + + def init_config(self): + self.downloader = Downloader() + self.mediaserver = MediaServer() + + config = SystemConfig().get_system_config("SpeedLimit") + if config: + try: + self.bandwidth = int(float(config.get("bandwidth") or 0)) * 1000000 + residual_ratio = float(config.get("residual_ratio") or 1) + if residual_ratio > 1: + residual_ratio = 1 + allocation = (config.get("allocation") or "1:1").split(":") + if len(allocation) != 2 or not str(allocation[0]).isdigit() or not str(allocation[-1]).isdigit(): + allocation = ["1", "1"] + self.qb_upload_ratio = round(int(allocation[0]) / (int(allocation[-1]) + int(allocation[0])) * residual_ratio, 2) + self.tr_upload_ratio = round(int(allocation[-1]) / (int(allocation[-1]) + int(allocation[0])) * residual_ratio, 2) + except Exception as e: + ExceptionUtils.exception_traceback(e) + self.bandwidth = 0 + self.qb_upload_ratio = 0 + self.tr_upload_ratio = 0 + self.auto_limit = True if self.bandwidth and (self.qb_upload_ratio or self.tr_upload_ratio) else False + try: + self.qb_download_limit = int(float(config.get("qb_download") or 0)) * 1024 + self.qb_upload_limit = int(float(config.get("qb_upload") or 0)) * 1024 + except Exception as e: + ExceptionUtils.exception_traceback(e) + self.qb_download_limit = 0 + self.qb_upload_limit = 0 + self.qb_limit = True if self.qb_download_limit or self.qb_upload_limit or self.auto_limit else False + try: + self.tr_download_limit = int(float(config.get("tr_download") or 0)) + self.tr_upload_limit = int(float(config.get("tr_upload") or 0)) + except Exception as e: + self.tr_download_limit = 0 + self.tr_upload_limit = 0 + ExceptionUtils.exception_traceback(e) + self.tr_limit = True if self.tr_download_limit or self.tr_upload_limit or self.auto_limit else False + self.limit_enabled = True if self.qb_limit or self.tr_limit else False + self.unlimited_ips["ipv4"] = config.get("ipv4") or "0.0.0.0/0" + self.unlimited_ips["ipv6"] = config.get("ipv6") or "::/0" + else: + self.limit_enabled = False + # 移出现有任务 + try: + if self._scheduler: + self._scheduler.remove_all_jobs() + if self._scheduler.running: + self._scheduler.shutdown() + self._scheduler = None + except Exception as e: + ExceptionUtils.exception_traceback(e) + # 启动限速任务 + if self.limit_enabled: + self._scheduler = BackgroundScheduler(timezone=Config().get_timezone()) + self._scheduler.add_job(func=self.__check_playing_sessions, + args=[self.mediaserver.get_type(), True], + trigger='interval', + seconds=300) + self._scheduler.print_jobs() + self._scheduler.start() + log.info("播放限速服务启动") + + def __start(self): + """ + 开始限速 + """ + if self.qb_limit: + self.downloader.set_speed_limit( + downloader=DownloaderType.QB, + download_limit=self.qb_download_limit, + upload_limit=self.qb_upload_limit + ) + if not self.limit_flag: + log.info(f"【SpeedLimiter】Qbittorrent下载器开始限速") + if self.tr_limit: + self.downloader.set_speed_limit( + downloader=DownloaderType.TR, + download_limit=self.tr_download_limit, + upload_limit=self.tr_upload_limit + ) + if not self.limit_flag: + log.info(f"【SpeedLimiter】Transmission下载器开始限速") + self.limit_flag = True + + def __stop(self): + """ + 停止限速 + """ + if self.qb_limit: + self.downloader.set_speed_limit( + downloader=DownloaderType.QB, + download_limit=0, + upload_limit=0 + ) + if self.limit_flag: + log.info(f"【SpeedLimiter】Qbittorrent下载器停止限速") + if self.tr_limit: + self.downloader.set_speed_limit( + downloader=DownloaderType.TR, + download_limit=0, + upload_limit=0 + ) + if self.limit_flag: + log.info(f"【SpeedLimiter】Transmission下载器停止限速") + self.limit_flag = False + + def emby_action(self, message): + """ + 检查emby Webhook消息 + """ + if self.limit_enabled and message.get("Event") in ["playback.start", "playback.stop"]: + self.__check_playing_sessions(mediaserver_type=MediaServerType.EMBY, time_check=False) + + def jellyfin_action(self, message): + """ + 检查jellyfin Webhook消息 + """ + pass + + def plex_action(self, message): + """ + 检查plex Webhook消息 + """ + pass + + def __check_playing_sessions(self, mediaserver_type, time_check=False): + """ + 检查是否限速 + """ + if mediaserver_type != self.mediaserver.get_type(): + return + playing_sessions = self.mediaserver.get_playing_sessions() + limit_flag = False + if mediaserver_type == MediaServerType.EMBY: + total_bit_rate = 0 + for session in playing_sessions: + if not SecurityHelper.allow_access(self.unlimited_ips, session.get("RemoteEndPoint")) \ + and session.get("NowPlayingItem").get("MediaType") == "Video": + total_bit_rate += int(session.get("NowPlayingItem").get("Bitrate")) or 0 + if total_bit_rate: + limit_flag = True + if self.auto_limit: + residual_bandwidth = (self.bandwidth - total_bit_rate) + if residual_bandwidth < 0: + self.qb_upload_limit = 10*1024 + self.tr_upload_limit = 10 + else: + qb_upload_limit = residual_bandwidth / 8 / 1024 * self.qb_upload_ratio + tr_upload_limit = residual_bandwidth / 8 / 1024 * self.tr_upload_ratio + self.qb_upload_limit = qb_upload_limit * 1024 if qb_upload_limit > 10 else 10*1024 + self.tr_upload_limit = tr_upload_limit if tr_upload_limit > 10 else 10 + elif mediaserver_type == MediaServerType.JELLYFIN: + pass + elif mediaserver_type == MediaServerType.PLEX: + pass + else: + return + if time_check or self.auto_limit: + if limit_flag: + self.__start() + else: + self.__stop() + else: + if not self.limit_flag and limit_flag: + self.__start() + elif self.limit_flag and not limit_flag: + self.__stop() + else: + pass + + + + + + diff --git a/app/subscribe.py b/app/subscribe.py new file mode 100644 index 0000000..dc51c93 --- /dev/null +++ b/app/subscribe.py @@ -0,0 +1,852 @@ +import json +from threading import Lock + +import log +from app.downloader import Downloader +from app.filter import Filter +from app.helper import DbHelper, MetaHelper +from app.media import Media, DouBan +from app.media.meta import MetaInfo +from app.message import Message +from app.searcher import Searcher +from app.sites import Sites +from app.indexer import Indexer +from app.utils import Torrent +from app.utils.types import MediaType, SearchType +from web.backend.web_utils import WebUtils + +lock = Lock() + + +class Subscribe: + dbhelper = None + metahelper = None + searcher = None + message = None + media = None + downloader = None + sites = None + douban = None + filter = None + + def __init__(self): + self.dbhelper = DbHelper() + self.metahelper = MetaHelper() + self.searcher = Searcher() + self.message = Message() + self.media = Media() + self.downloader = Downloader() + self.sites = Sites() + self.douban = DouBan() + self.indexer = Indexer() + self.filter = Filter() + + def add_rss_subscribe(self, mtype, name, year, + keyword=None, + season=None, + fuzzy_match=False, + mediaid=None, + rss_sites=None, + search_sites=None, + over_edition=False, + filter_restype=None, + filter_pix=None, + filter_team=None, + filter_rule=None, + save_path=None, + download_setting=None, + total_ep=None, + current_ep=None, + state="D", + rssid=None): + """ + 添加电影、电视剧订阅 + :param mtype: 类型,电影、电视剧、动漫 + :param name: 标题 + :param year: 年份,如要是剧集需要是首播年份 + :param keyword: 自定义搜索词 + :param season: 第几季,数字 + :param fuzzy_match: 是否模糊匹配 + :param mediaid: 媒体ID,DB:/BG:/TMDBID + :param rss_sites: 订阅站点列表,为空则表示全部站点 + :param search_sites: 搜索站点列表,为空则表示全部站点 + :param over_edition: 是否选版 + :param filter_restype: 质量过滤 + :param filter_pix: 分辨率过滤 + :param filter_team: 制作组/字幕组过滤 + :param filter_rule: 关键字过滤 + :param save_path: 保存路径 + :param download_setting: 下载设置 + :param state: 添加订阅时的状态 + :param rssid: 修改订阅时传入 + :param total_ep: 总集数 + :param current_ep: 开始订阅集数 + :return: 错误码:0代表成功,错误信息 + """ + if not name: + return -1, "标题或类型有误", None + year = int(year) if str(year).isdigit() else "" + rss_sites = rss_sites or [] + search_sites = search_sites or [] + over_edition = 1 if over_edition else 0 + filter_rule = int(filter_rule) if str(filter_rule).isdigit() else None + total_ep = int(total_ep) if str(total_ep).isdigit() else None + current_ep = int(current_ep) if str(current_ep).isdigit() else None + download_setting = int(download_setting) if str(download_setting).replace("-", "").isdigit() else "" + fuzzy_match = True if fuzzy_match else False + # 检索媒体信息 + if not fuzzy_match: + # 根据TMDBID查询,从推荐加订阅的情况 + if mediaid: + # 根据ID查询 + media_info = WebUtils.get_mediainfo_from_id(mtype=mtype, mediaid=mediaid) + else: + # 根据名称和年份查询 + if season: + title = "%s %s 第%s季".strip() % (name, year, season) + else: + title = "%s %s".strip() % (name, year) + media_info = self.media.get_media_info(title=title, + mtype=mtype, + strict=True if year else False, + cache=False) + # 检查TMDB信息 + if not media_info or not media_info.tmdb_info: + return 1, "无法TMDB查询到媒体信息", None + # 添加订阅 + if media_info.type != MediaType.MOVIE: + # 电视剧 + if season: + total_episode = self.media.get_tmdb_season_episodes_num(tv_info=media_info.tmdb_info, + season=int(season)) + else: + # 查询季及集信息 + total_seasoninfo = self.media.get_tmdb_tv_seasons(tv_info=media_info.tmdb_info) + if not total_seasoninfo: + return 2, "获取剧集信息失败", media_info + # 按季号降序排序 + total_seasoninfo = sorted(total_seasoninfo, + key=lambda x: x.get("season_number"), + reverse=True) + # 取最新季 + season = total_seasoninfo[0].get("season_number") + total_episode = total_seasoninfo[0].get("episode_count") + if not total_episode: + return 3, "第%s季获取剧集数失败,请确认该季是否存在" % season, media_info + media_info.begin_season = int(season) + media_info.total_episodes = total_episode + if total_ep: + total = total_ep + else: + total = media_info.total_episodes + if current_ep: + lack = total - current_ep - 1 + else: + lack = total + if rssid: + self.dbhelper.delete_rss_tv(rssid=rssid) + code = self.dbhelper.insert_rss_tv(media_info=media_info, + total=total, + lack=lack, + state=state, + rss_sites=rss_sites, + search_sites=search_sites, + over_edition=over_edition, + filter_restype=filter_restype, + filter_pix=filter_pix, + filter_team=filter_team, + filter_rule=filter_rule, + save_path=save_path, + download_setting=download_setting, + total_ep=total_ep, + current_ep=current_ep, + fuzzy_match=0, + desc=media_info.overview, + note=self.gen_rss_note(media_info), + keyword=keyword) + else: + # 电影 + if rssid: + self.dbhelper.delete_rss_movie(rssid=rssid) + code = self.dbhelper.insert_rss_movie(media_info=media_info, + state=state, + rss_sites=rss_sites, + search_sites=search_sites, + over_edition=over_edition, + filter_restype=filter_restype, + filter_pix=filter_pix, + filter_team=filter_team, + filter_rule=filter_rule, + save_path=save_path, + download_setting=download_setting, + fuzzy_match=0, + desc=media_info.overview, + note=self.gen_rss_note(media_info), + keyword=keyword) + else: + # 模糊匹配 + media_info = MetaInfo(title=name, mtype=mtype) + media_info.title = name + media_info.type = mtype + if season: + media_info.begin_season = int(season) + if mtype == MediaType.MOVIE: + if rssid: + self.dbhelper.delete_rss_movie(rssid=rssid) + code = self.dbhelper.insert_rss_movie(media_info=media_info, + state="R", + rss_sites=rss_sites, + search_sites=search_sites, + over_edition=over_edition, + filter_restype=filter_restype, + filter_pix=filter_pix, + filter_team=filter_team, + filter_rule=filter_rule, + save_path=save_path, + download_setting=download_setting, + fuzzy_match=1, + keyword=keyword) + else: + if rssid: + self.dbhelper.delete_rss_tv(rssid=rssid) + code = self.dbhelper.insert_rss_tv(media_info=media_info, + total=0, + lack=0, + state="R", + rss_sites=rss_sites, + search_sites=search_sites, + over_edition=over_edition, + filter_restype=filter_restype, + filter_pix=filter_pix, + filter_team=filter_team, + filter_rule=filter_rule, + save_path=save_path, + download_setting=download_setting, + fuzzy_match=1, + keyword=keyword) + + if code == 0: + return code, "添加订阅成功", media_info + elif code == 9: + return code, "订阅已存在", media_info + else: + return code, "添加订阅失败", media_info + + def finish_rss_subscribe(self, rssid, media): + """ + 完成订阅 + :param rssid: 订阅ID + :param media: 识别的媒体信息,发送消息使用 + """ + if not rssid or not media: + return + # 电影订阅 + rtype = "MOV" if media.type == MediaType.MOVIE else "TV" + if media.type == MediaType.MOVIE: + # 查询电影RSS数据 + rss = self.dbhelper.get_rss_movies(rssid=rssid) + if not rss: + return + # 登记订阅历史 + self.dbhelper.insert_rss_history(rssid=rssid, + rtype=rtype, + name=rss[0].NAME, + year=rss[0].YEAR, + tmdbid=rss[0].TMDBID, + image=media.get_poster_image(), + desc=media.overview) + + # 删除订阅 + self.dbhelper.delete_rss_movie(rssid=rssid) + + # 电视剧订阅 + else: + # 查询电视剧RSS数据 + rss = self.dbhelper.get_rss_tvs(rssid=rssid) + if not rss: + return + total = rss[0].TOTAL_EP + # 登记订阅历史 + self.dbhelper.insert_rss_history(rssid=rssid, + rtype=rtype, + name=rss[0].NAME, + year=rss[0].YEAR, + season=rss[0].SEASON, + tmdbid=rss[0].TMDBID, + image=media.get_poster_image(), + desc=media.overview, + total=total if total else rss[0].TOTAL, + start=rss[0].CURRENT_EP) + # 删除订阅 + self.dbhelper.delete_rss_tv(rssid=rssid) + + # 发送订阅完成的消息 + log.info("【Rss】%s %s %s 订阅完成,删除订阅..." % ( + media.type.value, + media.get_title_string(), + media.get_season_string() + )) + self.message.send_rss_finished_message(media_info=media) + + def get_subscribe_movies(self, rid=None, state=None): + """ + 获取电影订阅 + """ + ret_dict = {} + rss_movies = self.dbhelper.get_rss_movies(rssid=rid, state=state) + rss_sites_valid = self.sites.get_site_names(rss=True) + search_sites_valid = self.indexer.get_indexer_names() + for rss_movie in rss_movies: + desc = rss_movie.DESC + note = rss_movie.NOTE + tmdbid = rss_movie.TMDBID + rss_sites = json.loads(rss_movie.RSS_SITES) if rss_movie.RSS_SITES else [] + search_sites = json.loads(rss_movie.SEARCH_SITES) if rss_movie.SEARCH_SITES else [] + over_edition = True if rss_movie.OVER_EDITION == 1 else False + filter_restype = rss_movie.FILTER_RESTYPE + filter_pix = rss_movie.FILTER_PIX + filter_team = rss_movie.FILTER_TEAM + filter_rule = rss_movie.FILTER_RULE + download_setting = rss_movie.DOWNLOAD_SETTING + save_path = rss_movie.SAVE_PATH + fuzzy_match = True if rss_movie.FUZZY_MATCH == 1 else False + keyword = rss_movie.KEYWORD + # 兼容旧配置 + if desc and desc.find('{') != -1: + desc = self.__parse_rss_desc(desc) + rss_sites = desc.get("rss_sites") + search_sites = desc.get("search_sites") + over_edition = True if desc.get("over_edition") == 'Y' else False + filter_restype = desc.get("restype") + filter_pix = desc.get("pix") + filter_team = desc.get("team") + filter_rule = desc.get("rule") + download_setting = "" + save_path = "" + fuzzy_match = False if tmdbid else True + if note: + note_info = self.__parse_rss_desc(note) + else: + note_info = {} + rss_sites = [site for site in rss_sites if site in rss_sites_valid] + search_sites = [site for site in search_sites if site in search_sites_valid] + ret_dict[str(rss_movie.ID)] = { + "id": rss_movie.ID, + "name": rss_movie.NAME, + "year": rss_movie.YEAR, + "tmdbid": rss_movie.TMDBID, + "image": rss_movie.IMAGE, + "overview": rss_movie.DESC, + "rss_sites": rss_sites, + "search_sites": search_sites, + "over_edition": over_edition, + "filter_restype": filter_restype, + "filter_pix": filter_pix, + "filter_team": filter_team, + "filter_rule": filter_rule, + "save_path": save_path, + "download_setting": download_setting, + "fuzzy_match": fuzzy_match, + "state": rss_movie.STATE, + "poster": note_info.get("poster"), + "release_date": note_info.get("release_date"), + "vote": note_info.get("vote"), + "keyword": keyword + + } + return ret_dict + + def get_subscribe_tvs(self, rid=None, state=None): + ret_dict = {} + rss_tvs = self.dbhelper.get_rss_tvs(rssid=rid, state=state) + rss_sites_valid = self.sites.get_site_names(rss=True) + search_sites_valid = self.indexer.get_indexer_names() + for rss_tv in rss_tvs: + desc = rss_tv.DESC + note = rss_tv.NOTE + tmdbid = rss_tv.TMDBID + rss_sites = json.loads(rss_tv.RSS_SITES) if rss_tv.RSS_SITES else [] + search_sites = json.loads(rss_tv.SEARCH_SITES) if rss_tv.SEARCH_SITES else [] + over_edition = True if rss_tv.OVER_EDITION == 1 else False + filter_restype = rss_tv.FILTER_RESTYPE + filter_pix = rss_tv.FILTER_PIX + filter_team = rss_tv.FILTER_TEAM + filter_rule = rss_tv.FILTER_RULE + download_setting = rss_tv.DOWNLOAD_SETTING + save_path = rss_tv.SAVE_PATH + total_ep = rss_tv.TOTAL_EP + current_ep = rss_tv.CURRENT_EP + fuzzy_match = True if rss_tv.FUZZY_MATCH == 1 else False + keyword = rss_tv.KEYWORD + # 兼容旧配置 + if desc and desc.find('{') != -1: + desc = self.__parse_rss_desc(desc) + rss_sites = desc.get("rss_sites") + search_sites = desc.get("search_sites") + over_edition = True if desc.get("over_edition") == 'Y' else False + filter_restype = desc.get("restype") + filter_pix = desc.get("pix") + filter_team = desc.get("team") + filter_rule = desc.get("rule") + save_path = "" + download_setting = "" + total_ep = desc.get("total") + current_ep = desc.get("current") + fuzzy_match = False if tmdbid else True + if note: + note_info = self.__parse_rss_desc(note) + else: + note_info = {} + rss_sites = [site for site in rss_sites if site in rss_sites_valid] + search_sites = [site for site in search_sites if site in search_sites_valid] + ret_dict[str(rss_tv.ID)] = { + "id": rss_tv.ID, + "name": rss_tv.NAME, + "year": rss_tv.YEAR, + "season": rss_tv.SEASON, + "tmdbid": rss_tv.TMDBID, + "image": rss_tv.IMAGE, + "overview": rss_tv.DESC, + "rss_sites": rss_sites, + "search_sites": search_sites, + "over_edition": over_edition, + "filter_restype": filter_restype, + "filter_pix": filter_pix, + "filter_team": filter_team, + "filter_rule": filter_rule, + "save_path": save_path, + "download_setting": download_setting, + "total": rss_tv.TOTAL, + "lack": rss_tv.LACK, + "total_ep": total_ep, + "current_ep": current_ep, + "fuzzy_match": fuzzy_match, + "state": rss_tv.STATE, + "poster": note_info.get("poster"), + "release_date": note_info.get("release_date"), + "vote": note_info.get("vote"), + "keyword": keyword + } + return ret_dict + + @staticmethod + def __parse_rss_desc(desc): + """ + 解析订阅的JSON字段 + """ + if not desc: + return {} + return json.loads(desc) or {} + + @staticmethod + def gen_rss_note(media): + """ + 生成订阅的JSON备注信息 + :param media: 媒体信息 + :return: 备注信息 + """ + if not media: + return {} + note = { + "poster": media.get_poster_image(), + "release_date": media.release_date, + "vote": media.vote_average + } + return json.dumps(note) + + def refresh_rss_metainfo(self): + """ + 定时将豆瓣订阅转换为TMDB的订阅,并更新订阅的TMDB信息 + """ + # 更新电影 + log.info("【Subscribe】开始刷新订阅TMDB信息...") + rss_movies = self.get_subscribe_movies(state='R') + for rid, rss_info in rss_movies.items(): + # 跳过模糊匹配的 + if rss_info.get("fuzzy_match"): + continue + rssid = rss_info.get("id") + name = rss_info.get("name") + year = rss_info.get("year") or "" + tmdbid = rss_info.get("tmdbid") + # 更新TMDB信息 + media_info = self.__get_media_info(tmdbid=tmdbid, + name=name, + year=year, + mtype=MediaType.MOVIE, + cache=False) + if media_info and media_info.tmdb_id and media_info.title != name: + log.info(f"【Subscribe】检测到TMDB信息变化,更新电影订阅 {name} 为 {media_info.title}") + # 更新订阅信息 + self.dbhelper.update_rss_movie_tmdb(rid=rssid, + tmdbid=media_info.tmdb_id, + title=media_info.title, + year=media_info.year, + image=media_info.get_message_image(), + desc=media_info.overview, + note=self.gen_rss_note(media_info)) + # 清除TMDB缓存 + self.metahelper.delete_meta_data_by_tmdbid(media_info.tmdb_id) + + # 更新电视剧 + rss_tvs = self.get_subscribe_tvs(state='R') + for rid, rss_info in rss_tvs.items(): + # 跳过模糊匹配的 + if rss_info.get("fuzzy_match"): + continue + rssid = rss_info.get("id") + name = rss_info.get("name") + year = rss_info.get("year") or "" + tmdbid = rss_info.get("tmdbid") + season = rss_info.get("season") or 1 + total = rss_info.get("total") + total_ep = rss_info.get("total_ep") + lack = rss_info.get("lack") + # 更新TMDB信息 + media_info = self.__get_media_info(tmdbid=tmdbid, + name=name, + year=year, + mtype=MediaType.TV, + cache=False) + if media_info and media_info.tmdb_id: + # 获取总集数 + total_episode = self.media.get_tmdb_season_episodes_num(tv_info=media_info.tmdb_info, + season=int(str(season).replace("S", ""))) + # 设置总集数的,不更新集数 + if total_ep: + total_episode = total_ep + if total_episode and (name != media_info.title or total != total_episode): + # 新的缺失集数 + lack_episode = total_episode - (total - lack) + log.info( + f"【Subscribe】检测到TMDB信息变化,更新电视剧订阅 {name} 为 {media_info.title},总集数为:{total_episode}") + # 更新订阅信息 + self.dbhelper.update_rss_tv_tmdb(rid=rssid, + tmdbid=media_info.tmdb_id, + title=media_info.title, + year=media_info.year, + total=total_episode, + lack=lack_episode, + image=media_info.get_message_image(), + desc=media_info.overview, + note=self.gen_rss_note(media_info)) + # 更新缺失季集 + self.dbhelper.update_rss_tv_episodes(rid=rssid, episodes=range(total - lack + 1, total + 1)) + # 清除TMDB缓存 + self.metahelper.delete_meta_data_by_tmdbid(media_info.tmdb_id) + log.info("【Subscribe】订阅TMDB信息刷新完成") + + def __get_media_info(self, tmdbid, name, year, mtype, cache=True): + """ + 综合返回媒体信息 + """ + if tmdbid and not str(tmdbid).startswith("DB:"): + media_info = MetaInfo(title="%s %s".strip() % (name, year)) + tmdb_info = self.media.get_tmdb_info(mtype=mtype, tmdbid=tmdbid) + media_info.set_tmdb_info(tmdb_info) + else: + media_info = self.media.get_media_info(title="%s %s" % (name, year), mtype=mtype, strict=True, cache=cache) + return media_info + + def subscribe_search_all(self): + """ + 搜索R状态的所有订阅,由定时服务调用 + """ + self.subscribe_search(state="R") + + def subscribe_search(self, state="D"): + """ + RSS订阅队列中状态的任务处理,先进行存量资源检索,缺失的才标志为RSS状态,由定时服务调用 + """ + try: + lock.acquire() + # 处理电影 + self.subscribe_search_movie(state=state) + # 处理电视剧 + self.subscribe_search_tv(state=state) + finally: + lock.release() + + def subscribe_search_movie(self, rssid=None, state='D'): + """ + 检索电影RSS + :param rssid: 订阅ID,未输入时检索所有状态为D的,输入时检索该ID任何状态的 + :param state: 检索的状态,默认为队列中才检索 + """ + if rssid: + rss_movies = self.get_subscribe_movies(rid=rssid) + else: + rss_movies = self.get_subscribe_movies(state=state) + if rss_movies: + log.info("【Subscribe】共有 %s 个电影订阅需要检索" % len(rss_movies)) + for rid, rss_info in rss_movies.items(): + # 跳过模糊匹配的 + if rss_info.get("fuzzy_match"): + continue + # 搜索站点范围 + rssid = rss_info.get("id") + name = rss_info.get("name") + year = rss_info.get("year") or "" + tmdbid = rss_info.get("tmdbid") + over_edition = rss_info.get("over_edition") + keyword = rss_info.get("keyword") + + # 开始搜索 + self.dbhelper.update_rss_movie_state(rssid=rssid, state='S') + # 识别 + media_info = self.__get_media_info(tmdbid, name, year, MediaType.MOVIE) + # 未识别到媒体信息 + if not media_info or not media_info.tmdb_info: + self.dbhelper.update_rss_movie_state(rssid=rssid, state='R') + continue + media_info.set_download_info(download_setting=rss_info.get("download_setting"), + save_path=rss_info.get("save_path")) + # 自定义搜索词 + media_info.keyword = keyword + # 非洗版的情况检查是否存在 + if not over_edition: + # 检查是否存在 + exist_flag, no_exists, _ = self.downloader.check_exists_medias(meta_info=media_info) + # 已经存在 + if exist_flag: + log.info("【Subscribe】电影 %s 已存在" % media_info.get_title_string()) + self.finish_rss_subscribe(rssid=rssid, media=media_info) + continue + else: + # 洗版时按缺失来下载 + no_exists = {} + # 把洗版标志加入检索 + media_info.over_edition = over_edition + # 将当前的优先级传入搜索 + media_info.res_order = self.dbhelper.get_rss_overedition_order(rtype=media_info.type, + rssid=rssid) + # 开始检索 + filter_dict = { + "restype": rss_info.get('filter_restype'), + "pix": rss_info.get('filter_pix'), + "team": rss_info.get('filter_team'), + "rule": rss_info.get('filter_rule'), + "site": rss_info.get("search_sites") + } + search_result, _, _, _ = self.searcher.search_one_media( + media_info=media_info, + in_from=SearchType.RSS, + no_exists=no_exists, + sites=rss_info.get("search_sites"), + filters=filter_dict) + if search_result: + # 洗版 + if over_edition: + self.update_subscribe_over_edition(rtype=search_result.type, + rssid=rssid, + media=search_result) + else: + self.finish_rss_subscribe(rssid=rssid, media=media_info) + else: + self.dbhelper.update_rss_movie_state(rssid=rssid, state='R') + + def subscribe_search_tv(self, rssid=None, state="D"): + """ + 检索电视剧RSS + :param rssid: 订阅ID,未输入时检索所有状态为D的,输入时检索该ID任何状态的 + :param state: 检索的状态,默认为队列中才检索 + """ + if rssid: + rss_tvs = self.get_subscribe_tvs(rid=rssid) + else: + rss_tvs = self.get_subscribe_tvs(state=state) + if rss_tvs: + log.info("【Subscribe】共有 %s 个电视剧订阅需要检索" % len(rss_tvs)) + rss_no_exists = {} + for rid, rss_info in rss_tvs.items(): + # 跳过模糊匹配的 + if rss_info.get("fuzzy_match"): + continue + rssid = rss_info.get("id") + name = rss_info.get("name") + year = rss_info.get("year") or "" + tmdbid = rss_info.get("tmdbid") + over_edition = rss_info.get("over_edition") + keyword = rss_info.get("keyword") + # 开始搜索 + self.dbhelper.update_rss_tv_state(rssid=rssid, state='S') + # 识别 + media_info = self.__get_media_info(tmdbid, name, year, MediaType.TV) + # 未识别到媒体信息 + if not media_info or not media_info.tmdb_info: + self.dbhelper.update_rss_tv_state(rssid=rssid, state='R') + continue + # 取下载设置 + media_info.set_download_info(download_setting=rss_info.get("download_setting"), + save_path=rss_info.get("save_path")) + # 从登记薄中获取缺失剧集 + season = 1 + if rss_info.get("season"): + season = int(str(rss_info.get("season")).replace("S", "")) + # 订阅季 + media_info.begin_season = season + # 订阅ID + media_info.rssid = rssid + # 自定义集数 + total_ep = rss_info.get("total") + current_ep = rss_info.get("current_ep") + # 自定义搜索词 + media_info.keyword = keyword + # 表中记录的剩余订阅集数 + episodes = self.get_subscribe_tv_episodes(rss_info.get("id")) + if episodes is None: + episodes = [] + if current_ep: + episodes = list(range(current_ep, total_ep + 1)) + rss_no_exists[media_info.tmdb_id] = [ + { + "season": season, + "episodes": episodes, + "total_episodes": total_ep + } + ] + else: + rss_no_exists[media_info.tmdb_id] = [ + { + "season": season, + "episodes": episodes, + "total_episodes": total_ep + } + ] + # 非洗版时检查本地媒体库情况 + if not over_edition: + exist_flag, library_no_exists, _ = self.downloader.check_exists_medias( + meta_info=media_info, + total_ep={season: total_ep}) + # 当前剧集已存在,跳过 + if exist_flag: + # 已全部存在 + if not library_no_exists \ + or not library_no_exists.get(media_info.tmdb_id): + log.info("【Subscribe】电视剧 %s 订阅剧集已全部存在" % ( + media_info.get_title_string())) + # 完成订阅 + self.finish_rss_subscribe(rssid=rss_info.get("id"), + media=media_info) + continue + # 取交集做为缺失集 + rss_no_exists = Torrent.get_intersection_episodes(target=rss_no_exists, + source=library_no_exists, + title=media_info.tmdb_id) + if rss_no_exists.get(media_info.tmdb_id): + log.info("【Subscribe】%s 订阅缺失季集:%s" % ( + media_info.get_title_string(), + rss_no_exists.get(media_info.tmdb_id) + )) + else: + # 把洗版标志加入检索 + media_info.over_edition = over_edition + # 将当前的优先级传入检索 + media_info.res_order = self.dbhelper.get_rss_overedition_order(rtype=MediaType.TV, + rssid=rssid) + + # 开始检索 + filter_dict = { + "restype": rss_info.get('filter_restype'), + "pix": rss_info.get('filter_pix'), + "team": rss_info.get('filter_team'), + "rule": rss_info.get('filter_rule'), + "site": rss_info.get("search_sites") + } + search_result, no_exists, _, _ = self.searcher.search_one_media( + media_info=media_info, + in_from=SearchType.RSS, + no_exists=rss_no_exists, + sites=rss_info.get("search_sites"), + filters=filter_dict) + if search_result \ + or not no_exists \ + or not no_exists.get(media_info.tmdb_id): + # 洗版 + if over_edition: + self.update_subscribe_over_edition(rtype=media_info.type, + rssid=rssid, + media=search_result) + else: + # 完成订阅 + self.finish_rss_subscribe(rssid=rssid, media=media_info) + elif no_exists: + # 更新状态 + self.update_subscribe_tv_lack(rssid=rssid, + media_info=media_info, + seasoninfo=no_exists.get(media_info.tmdb_id)) + + def update_rss_state(self, rtype, rssid, state): + """ + 根据类型更新订阅状态 + :param rtype: 订阅类型 + :param rssid: 订阅ID + :param state: 状态 R/D/S + """ + if rtype == MediaType.MOVIE: + self.dbhelper.update_rss_movie_state(rssid=rssid, state=state) + else: + self.dbhelper.update_rss_tv_state(rssid=rssid, state=state) + + def update_subscribe_over_edition(self, rtype, rssid, media): + """ + 更新洗版订阅 + :param rtype: 订阅类型 + :param rssid: 订阅ID + :param media: 含订阅信息的媒体信息 + :return 完成订阅返回True,否则返回False + """ + if not rssid \ + or not media.res_order \ + or not media.filter_rule \ + or not media.res_order: + return False + # 更新订阅命中的优先级 + self.dbhelper.update_rss_filter_order(rtype=media.type, + rssid=rssid, + res_order=media.res_order) + # 检查是否匹配最高优先级规则 + over_edition_order = self.filter.get_rule_first_order(rulegroup=media.filter_rule) + if int(media.res_order) >= int(over_edition_order): + # 完成洗版订阅 + self.finish_rss_subscribe(rssid=rssid, media=media) + return True + else: + self.update_rss_state(rtype=rtype, rssid=rssid, state='R') + return False + + def check_subscribe_over_edition(self, rtype, rssid, res_order): + """ + 检查洗版订阅的优先级 + :param rtype: 订阅类型 + :param rssid: 订阅ID + :param res_order: 优先级 + :return 资源更优先返回True,否则返回False + """ + pre_res_order = self.dbhelper.get_rss_overedition_order(rtype=rtype, rssid=rssid) + if not pre_res_order: + return True + return True if int(pre_res_order) < int(res_order) else False + + def update_subscribe_tv_lack(self, rssid, media_info, seasoninfo): + """ + 更新电视剧订阅缺失集数 + """ + if not seasoninfo: + return + self.dbhelper.update_rss_tv_state(rssid=rssid, state='R') + for info in seasoninfo: + if str(info.get("season")) == media_info.get_season_seq(): + if info.get("episodes"): + log.info("【Subscribe】更新电视剧 %s %s 缺失集数为 %s" % ( + media_info.get_title_string(), + media_info.get_season_string(), + len(info.get("episodes")))) + self.dbhelper.update_rss_tv_lack(rssid=rssid, lack_episodes=info.get("episodes")) + break + + def get_subscribe_tv_episodes(self, rssid): + """ + 查询数据库中订阅的电视剧缺失集数 + """ + return self.dbhelper.get_rss_tv_episodes(rssid) diff --git a/app/subtitle.py b/app/subtitle.py new file mode 100644 index 0000000..d256116 --- /dev/null +++ b/app/subtitle.py @@ -0,0 +1,363 @@ +import datetime +import os.path +import re +import shutil + +from lxml import etree + +import log +from app.conf import SiteConf +from app.helper import OpenSubtitles +from app.utils import RequestUtils, PathUtils, SystemUtils, StringUtils, ExceptionUtils +from app.utils.commons import singleton +from app.utils.types import MediaType +from config import Config, RMT_SUBEXT + + +@singleton +class Subtitle: + opensubtitles = None + _save_tmp_path = None + _server = None + _host = None + _api_key = None + _remote_path = None + _local_path = None + _opensubtitles_enable = False + + def __init__(self): + self.init_config() + + def init_config(self): + self.opensubtitles = OpenSubtitles() + self._save_tmp_path = Config().get_temp_path() + if not os.path.exists(self._save_tmp_path): + os.makedirs(self._save_tmp_path) + subtitle = Config().get_config('subtitle') + if subtitle: + self._server = subtitle.get("server") + if self._server == "chinesesubfinder": + self._api_key = subtitle.get("chinesesubfinder", {}).get("api_key") + self._host = subtitle.get("chinesesubfinder", {}).get('host') + if self._host: + if not self._host.startswith('http'): + self._host = "http://" + self._host + if not self._host.endswith('/'): + self._host = self._host + "/" + self._local_path = subtitle.get("chinesesubfinder", {}).get("local_path") + self._remote_path = subtitle.get("chinesesubfinder", {}).get("remote_path") + else: + self._opensubtitles_enable = subtitle.get("opensubtitles", {}).get("enable") + + def download_subtitle(self, items, server=None): + """ + 字幕下载入口 + :param items: {"type":, "file", "file_ext":, "name":, "title", "year":, "season":, "episode":, "bluray":} + :param server: 字幕下载服务器 + :return: 是否成功,消息内容 + """ + if not items: + return False, "参数有误" + _server = self._server if not server else server + if not _server: + return False, "未配置字幕下载器" + if _server == "opensubtitles": + if server or self._opensubtitles_enable: + return self.__download_opensubtitles(items) + elif _server == "chinesesubfinder": + return self.__download_chinesesubfinder(items) + return False, "未配置字幕下载器" + + def __search_opensubtitles(self, item): + """ + 爬取OpenSubtitles.org字幕 + """ + if not self.opensubtitles: + return [] + return self.opensubtitles.search_subtitles(item) + + def __download_opensubtitles(self, items): + """ + 调用OpenSubtitles Api下载字幕 + """ + if not self.opensubtitles: + return False, "未配置OpenSubtitles" + subtitles_cache = {} + success = False + ret_msg = "" + for item in items: + if not item: + continue + if not item.get("name") or not item.get("file"): + continue + if item.get("type") == MediaType.TV and not item.get("imdbid"): + log.warn("【Subtitle】电视剧类型需要imdbid检索字幕,跳过...") + ret_msg = "电视剧需要imdbid检索字幕" + continue + subtitles = subtitles_cache.get(item.get("name")) + if subtitles is None: + log.info( + "【Subtitle】开始从Opensubtitle.org检索字幕: %s,imdbid=%s" % (item.get("name"), item.get("imdbid"))) + subtitles = self.__search_opensubtitles(item) + if not subtitles: + subtitles_cache[item.get("name")] = [] + log.info("【Subtitle】%s 未检索到字幕" % item.get("name")) + ret_msg = "%s 未检索到字幕" % item.get("name") + else: + subtitles_cache[item.get("name")] = subtitles + log.info("【Subtitle】opensubtitles.org返回数据:%s" % len(subtitles)) + if not subtitles: + continue + # 成功数 + subtitle_count = 0 + for subtitle in subtitles: + # 标题 + if not item.get("imdbid"): + if str(subtitle.get('title')) != "%s (%s)" % (item.get("name"), item.get("year")): + continue + # 季 + if item.get('season') \ + and str(subtitle.get('season').replace("Season", "").strip()) != str(item.get('season')): + continue + # 集 + if item.get('episode') \ + and str(subtitle.get('episode')) != str(item.get('episode')): + continue + # 字幕文件名 + SubFileName = subtitle.get('description') + # 下载链接 + Download_Link = subtitle.get('link') + # 下载后的字幕文件路径 + Media_File = "%s.chi.zh-cn%s" % (item.get("file"), item.get("file_ext")) + log.info("【Subtitle】正在从opensubtitles.org下载字幕 %s 到 %s " % (SubFileName, Media_File)) + # 下载 + ret = RequestUtils(cookies=self.opensubtitles.get_cookie(), + headers=self.opensubtitles.get_ua()).get_res(Download_Link) + if ret and ret.status_code == 200: + # 保存ZIP + file_name = self.__get_url_subtitle_name(ret.headers.get('content-disposition'), Download_Link) + if not file_name: + continue + zip_file = os.path.join(self._save_tmp_path, file_name) + zip_path = os.path.splitext(zip_file)[0] + with open(zip_file, 'wb') as f: + f.write(ret.content) + # 解压文件 + shutil.unpack_archive(zip_file, zip_path, format='zip') + # 遍历转移文件 + for sub_file in PathUtils.get_dir_files(in_path=zip_path, exts=RMT_SUBEXT): + self.__transfer_subtitle(sub_file, Media_File) + # 删除临时文件 + try: + shutil.rmtree(zip_path) + os.remove(zip_file) + except Exception as err: + ExceptionUtils.exception_traceback(err) + else: + log.error("【Subtitle】下载字幕文件失败:%s" % Download_Link) + continue + # 最多下载3个字幕 + subtitle_count += 1 + if subtitle_count > 2: + break + if not subtitle_count: + if item.get('episode'): + log.info("【Subtitle】%s 第%s季 第%s集 未找到符合条件的字幕" % ( + item.get("name"), item.get("season"), item.get("episode"))) + ret_msg = "%s 第%s季 第%s集 未找到符合条件的字幕" % ( + item.get("name"), item.get("season"), item.get("episode")) + else: + log.info("【Subtitle】%s 未找到符合条件的字幕" % item.get("name")) + ret_msg = "%s 未找到符合条件的字幕" % item.get("name") + else: + log.info("【Subtitle】%s 共下载了 %s 个字幕" % (item.get("name"), subtitle_count)) + ret_msg = "%s 共下载了 %s 个字幕" % (item.get("name"), subtitle_count) + success = True + if success: + return True, ret_msg + else: + return False, ret_msg + + def __download_chinesesubfinder(self, items): + """ + 调用ChineseSubFinder下载字幕 + """ + if not self._host or not self._api_key: + return False, "未配置ChineseSubFinder" + req_url = "%sapi/v1/add-job" % self._host + notify_items = [] + success = False + ret_msg = "" + for item in items: + if not item: + continue + if not item.get("name") or not item.get("file"): + continue + if item.get("bluray"): + file_path = "%s.mp4" % item.get("file") + else: + if os.path.splitext(item.get("file"))[-1] != item.get("file_ext"): + file_path = "%s%s" % (item.get("file"), item.get("file_ext")) + else: + file_path = item.get("file") + + # 路径替换 + if self._local_path and self._remote_path and file_path.startswith(self._local_path): + file_path = file_path.replace(self._local_path, self._remote_path).replace('\\', '/') + + # 一个名称只建一个任务 + if file_path not in notify_items: + notify_items.append(file_path) + log.info("【Subtitle】通知ChineseSubFinder下载字幕: %s" % file_path) + params = { + "video_type": 0 if item.get("type") == MediaType.MOVIE else 1, + "physical_video_file_full_path": file_path, + "task_priority_level": 3, + "media_server_inside_video_id": "", + "is_bluray": item.get("bluray") + } + try: + res = RequestUtils(headers={ + "Authorization": "Bearer %s" % self._api_key + }).post(req_url, json=params) + if not res or res.status_code != 200: + log.error("【Subtitle】调用ChineseSubFinder API失败!") + ret_msg = "调用ChineseSubFinder API失败" + else: + # 如果文件目录没有识别的nfo元数据, 此接口会返回控制符,推测是ChineseSubFinder的原因 + # emby refresh元数据时异步的 + if res.text: + job_id = res.json().get("job_id") + message = res.json().get("message") + if not job_id: + log.warn("【Subtitle】ChineseSubFinder下载字幕出错:%s" % message) + ret_msg = "ChineseSubFinder下载字幕出错:%s" % message + else: + log.info("【Subtitle】ChineseSubFinder任务添加成功:%s" % job_id) + ret_msg = "ChineseSubFinder任务添加成功:%s" % job_id + success = True + else: + log.error("【Subtitle】%s 目录缺失nfo元数据" % file_path) + ret_msg = "%s 目录下缺失nfo元数据:" % file_path + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【Subtitle】连接ChineseSubFinder出错:" + str(e)) + ret_msg = "连接ChineseSubFinder出错:%s" % str(e) + if success: + return True, ret_msg + else: + return False, ret_msg + + @staticmethod + def __transfer_subtitle(sub_file, media_file): + """ + 转移字幕 + """ + new_sub_file = "%s%s" % (os.path.splitext(media_file)[0], os.path.splitext(sub_file)[-1]) + if os.path.exists(new_sub_file): + return 1 + else: + return SystemUtils.copy(sub_file, new_sub_file) + + def download_subtitle_from_site(self, media_info, cookie, ua, download_dir): + """ + 从站点下载字幕文件,并保存到本地 + """ + if not media_info.page_url: + return + # 字幕下载目录 + log.info("【Subtitle】开始从站点下载字幕:%s" % media_info.page_url) + if not download_dir: + log.warn("【Subtitle】未找到字幕下载目录") + return + # 读取网站代码 + request = RequestUtils(cookies=cookie, headers=ua) + res = request.get_res(media_info.page_url) + if res and res.status_code == 200: + if not res.text: + log.warn(f"【Subtitle】读取页面代码失败:{media_info.page_url}") + return + html = etree.HTML(res.text) + sublink_list = [] + for xpath in SiteConf.SITE_SUBTITLE_XPATH: + sublinks = html.xpath(xpath) + if sublinks: + for sublink in sublinks: + if not sublink: + continue + if not sublink.startswith("http"): + base_url = StringUtils.get_base_url(media_info.page_url) + if sublink.startswith("/"): + sublink = "%s%s" % (base_url, sublink) + else: + sublink = "%s/%s" % (base_url, sublink) + sublink_list.append(sublink) + # 下载所有字幕文件 + for sublink in sublink_list: + log.info(f"【Subtitle】找到字幕下载链接:{sublink},开始下载...") + # 下载 + ret = request.get_res(sublink) + if ret and ret.status_code == 200: + # 创建目录 + if not os.path.exists(download_dir): + os.makedirs(download_dir) + # 保存ZIP + file_name = self.__get_url_subtitle_name(ret.headers.get('content-disposition'), sublink) + if not file_name: + log.warn(f"【Subtitle】链接不是字幕文件:{sublink}") + continue + if file_name.lower().endswith(".zip"): + # ZIP包 + zip_file = os.path.join(self._save_tmp_path, file_name) + # 解压路径 + zip_path = os.path.splitext(zip_file)[0] + with open(zip_file, 'wb') as f: + f.write(ret.content) + # 解压文件 + shutil.unpack_archive(zip_file, zip_path, format='zip') + # 遍历转移文件 + for sub_file in PathUtils.get_dir_files(in_path=zip_path, exts=RMT_SUBEXT): + target_sub_file = os.path.join(download_dir, + os.path.splitext(os.path.basename(sub_file))[0]) + log.info(f"【Subtitle】转移字幕 {sub_file} 到 {target_sub_file}") + self.__transfer_subtitle(sub_file, target_sub_file) + # 删除临时文件 + try: + shutil.rmtree(zip_path) + os.remove(zip_file) + except Exception as err: + ExceptionUtils.exception_traceback(err) + else: + sub_file = os.path.join(self._save_tmp_path, file_name) + # 保存 + with open(sub_file, 'wb') as f: + f.write(ret.content) + target_sub_file = os.path.join(download_dir, + os.path.splitext(os.path.basename(sub_file))[0]) + log.info(f"【Subtitle】转移字幕 {sub_file} 到 {target_sub_file}") + self.__transfer_subtitle(sub_file, target_sub_file) + else: + log.error(f"【Subtitle】下载字幕文件失败:{sublink}") + continue + if sublink_list: + log.info(f"【Subtitle】{media_info.page_url} 页面字幕下载完成") + elif res is not None: + log.warn(f"【Subtitle】连接 {media_info.page_url} 失败,状态码:{res.status_code}") + else: + log.warn(f"【Subtitle】无法打开链接:{media_info.page_url}") + + @staticmethod + def __get_url_subtitle_name(disposition, url): + """ + 从下载请求中获取字幕文件名 + """ + file_name = re.findall(r"filename=\"?(.+)\"?", disposition or "") + if file_name: + file_name = str(file_name[0].encode('ISO-8859-1').decode()).split(";")[0].strip() + if file_name.endswith('"'): + file_name = file_name[:-1] + elif url and os.path.splitext(url)[-1] in (RMT_SUBEXT + ['.zip']): + file_name = url.split("/")[-1] + else: + file_name = str(datetime.datetime.now()) + return file_name diff --git a/app/sync.py b/app/sync.py new file mode 100644 index 0000000..e193705 --- /dev/null +++ b/app/sync.py @@ -0,0 +1,394 @@ +import os +import threading +import traceback + +from watchdog.events import FileSystemEventHandler +from watchdog.observers import Observer +from watchdog.observers.polling import PollingObserver + +import log +from app.conf import ModuleConf +from app.helper import DbHelper +from config import RMT_MEDIAEXT, Config +from app.filetransfer import FileTransfer +from app.utils.commons import singleton +from app.utils import PathUtils, ExceptionUtils +from app.utils.types import SyncType, OsType + +lock = threading.Lock() + + +class FileMonitorHandler(FileSystemEventHandler): + """ + 目录监控响应类 + """ + + def __init__(self, monpath, sync, **kwargs): + super(FileMonitorHandler, self).__init__(**kwargs) + self._watch_path = monpath + self.sync = sync + + def on_created(self, event): + self.sync.file_change_handler(event, "创建", event.src_path) + + def on_moved(self, event): + self.sync.file_change_handler(event, "移动", event.dest_path) + + """ + def on_modified(self, event): + self.sync.file_change_handler(event, "修改", event.src_path) + """ + + +@singleton +class Sync(object): + filetransfer = None + dbhelper = None + + sync_dir_config = {} + _observer = [] + _sync_paths = [] + _sync_sys = OsType.LINUX + _synced_files = [] + _need_sync_paths = {} + + def __init__(self): + self.init_config() + + def init_config(self): + self.dbhelper = DbHelper() + self.filetransfer = FileTransfer() + sync = Config().get_config('sync') + sync_paths = self.dbhelper.get_config_sync_paths() + if sync and sync_paths: + if sync.get('nas_sys') == "windows": + self._sync_sys = OsType.WINDOWS + self._sync_paths = sync_paths + self.init_sync_dirs() + + def init_sync_dirs(self): + """ + 初始化监控文件配置 + """ + self.sync_dir_config = {} + if self._sync_paths: + for sync_item in self._sync_paths: + if not sync_item: + continue + # ID + sync_id = sync_item.ID + # 启用标志 + enabled = True if sync_item.ENABLED else False + # 仅硬链接标志 + only_link = False if sync_item.RENAME else True + # 转移方式 + path_syncmode = ModuleConf.RMT_MODES.get(sync_item.MODE) + # 源目录|目的目录|未知目录 + monpath = sync_item.SOURCE + target_path = sync_item.DEST + unknown_path = sync_item.UNKNOWN + if target_path and unknown_path: + log.info("【Sync】读取到监控目录:%s,目的目录:%s,未识别目录:%s,转移方式:%s" % ( + monpath, target_path, unknown_path, path_syncmode.value)) + elif target_path: + log.info( + "【Sync】读取到监控目录:%s,目的目录:%s,转移方式:%s" % (monpath, target_path, path_syncmode.value)) + else: + log.info("【Sync】读取到监控目录:%s,转移方式:%s" % (monpath, path_syncmode.value)) + if not enabled: + log.info("【Sync】%s 不进行监控和同步:手动关闭" % monpath) + continue + if only_link: + log.info("【Sync】%s 不进行识别和重命名" % monpath) + if target_path and not os.path.exists(target_path): + log.info("【Sync】目的目录不存在,正在创建:%s" % target_path) + os.makedirs(target_path) + if unknown_path and not os.path.exists(unknown_path): + log.info("【Sync】未识别目录不存在,正在创建:%s" % unknown_path) + os.makedirs(unknown_path) + # 登记关系 + if os.path.exists(monpath): + self.sync_dir_config[monpath] = { + 'id': sync_id, + 'target': target_path, + 'unknown': unknown_path, + 'onlylink': only_link, + 'syncmod': path_syncmode + } + else: + log.error("【Sync】%s 目录不存在!" % monpath) + + def get_sync_dirs(self): + """ + 返回所有的同步监控目录 + """ + if not self.sync_dir_config: + return [] + return [os.path.normpath(key) for key in self.sync_dir_config.keys()] + + def file_change_handler(self, event, text, event_path): + """ + 处理文件变化 + :param event: 事件 + :param text: 事件描述 + :param event_path: 事件文件路径 + """ + if not event.is_directory: + # 文件发生变化 + try: + if not os.path.exists(event_path): + return + log.debug("【Sync】文件%s:%s" % (text, event_path)) + # 判断是否处理过了 + need_handler_flag = False + try: + lock.acquire() + if event_path not in self._synced_files: + self._synced_files.append(event_path) + need_handler_flag = True + finally: + lock.release() + if not need_handler_flag: + log.debug("【Sync】文件已处理过:%s" % event_path) + return + # 不是监控目录下的文件不处理 + is_monitor_file = False + for tpath in self.sync_dir_config.keys(): + if PathUtils.is_path_in_path(tpath, event_path): + is_monitor_file = True + break + if not is_monitor_file: + return + # 目的目录的子文件不处理 + for tpath in self.sync_dir_config.values(): + if not tpath: + continue + if PathUtils.is_path_in_path(tpath.get('target'), event_path): + return + if PathUtils.is_path_in_path(tpath.get('unknown'), event_path): + return + # 媒体库目录及子目录不处理 + if self.filetransfer.is_target_dir_path(event_path): + return + # 回收站及隐藏的文件不处理 + if PathUtils.is_invalid_path(event_path): + return + # 上级目录 + from_dir = os.path.dirname(event_path) + # 找到是哪个监控目录下的 + monitor_dir = event_path + is_root_path = False + for m_path in self.sync_dir_config.keys(): + if PathUtils.is_path_in_path(m_path, event_path): + monitor_dir = m_path + if os.path.normpath(m_path) == os.path.normpath(from_dir): + is_root_path = True + + # 查找目的目录 + target_dirs = self.sync_dir_config.get(monitor_dir) + target_path = target_dirs.get('target') + unknown_path = target_dirs.get('unknown') + onlylink = target_dirs.get('onlylink') + sync_mode = target_dirs.get('syncmod') + + # 只做硬链接,不做识别重命名 + if onlylink: + if self.dbhelper.is_sync_in_history(event_path, target_path): + return + log.info("【Sync】开始同步 %s" % event_path) + ret, msg = self.filetransfer.link_sync_file(src_path=monitor_dir, + in_file=event_path, + target_dir=target_path, + sync_transfer_mode=sync_mode) + if ret != 0: + log.warn("【Sync】%s 同步失败,错误码:%s" % (event_path, ret)) + elif not msg: + self.dbhelper.insert_sync_history(event_path, monitor_dir, target_path) + log.info("【Sync】%s 同步完成" % event_path) + # 识别转移 + else: + # 不是媒体文件不处理 + name = os.path.basename(event_path) + if not name: + return + if name.lower() != "index.bdmv": + ext = os.path.splitext(name)[-1] + if ext.lower() not in RMT_MEDIAEXT: + return + # 监控根目录下的文件发生变化时直接发走 + if is_root_path: + ret, ret_msg = self.filetransfer.transfer_media(in_from=SyncType.MON, + in_path=event_path, + target_dir=target_path, + unknown_dir=unknown_path, + rmt_mode=sync_mode) + if not ret: + log.warn("【Sync】%s 转移失败:%s" % (event_path, ret_msg)) + else: + try: + lock.acquire() + if self._need_sync_paths.get(from_dir): + files = self._need_sync_paths[from_dir].get('files') + if not files: + files = [event_path] + else: + if event_path not in files: + files.append(event_path) + else: + return + self._need_sync_paths[from_dir].update({'files': files}) + else: + self._need_sync_paths[from_dir] = {'target': target_path, + 'unknown': unknown_path, + 'syncmod': sync_mode, + 'files': [event_path]} + finally: + lock.release() + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("【Sync】发生错误:%s - %s" % (str(e), traceback.format_exc())) + + def transfer_mon_files(self): + """ + 批量转移文件,由定时服务定期调用执行 + """ + try: + lock.acquire() + finished_paths = [] + for path in list(self._need_sync_paths): + if not PathUtils.is_invalid_path(path) and os.path.exists(path): + log.info("【Sync】开始转移监控目录文件...") + target_info = self._need_sync_paths.get(path) + bluray_dir = PathUtils.get_bluray_dir(path) + if not bluray_dir: + src_path = path + files = target_info.get('files') + else: + src_path = bluray_dir + files = [] + if src_path not in finished_paths: + finished_paths.append(src_path) + else: + continue + target_path = target_info.get('target') + unknown_path = target_info.get('unknown') + sync_mode = target_info.get('syncmod') + # 判断是否根目录 + is_root_path = False + for m_path in self.sync_dir_config.keys(): + if os.path.normpath(m_path) == os.path.normpath(src_path): + is_root_path = True + ret, ret_msg = self.filetransfer.transfer_media(in_from=SyncType.MON, + in_path=src_path, + files=files, + target_dir=target_path, + unknown_dir=unknown_path, + rmt_mode=sync_mode, + root_path=is_root_path) + if not ret: + log.warn("【Sync】%s转移失败:%s" % (path, ret_msg)) + self._need_sync_paths.pop(path) + finally: + lock.release() + + def run_service(self): + """ + 启动监控服务 + """ + self._observer = [] + for monpath in self.sync_dir_config.keys(): + if monpath and os.path.exists(monpath): + try: + if self._sync_sys == OsType.WINDOWS: + # 考虑到windows的docker需要直接指定才能生效(修改配置文件为windows) + observer = PollingObserver(timeout=10) + else: + # 内部处理系统操作类型选择最优解 + observer = Observer(timeout=10) + self._observer.append(observer) + observer.schedule(FileMonitorHandler(monpath, self), path=monpath, recursive=True) + observer.daemon = True + observer.start() + log.info("%s 的监控服务启动" % monpath) + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error("%s 启动目录监控失败:%s" % (monpath, str(e))) + + def stop_service(self): + """ + 关闭监控服务 + """ + if self._observer: + for observer in self._observer: + observer.stop() + self._observer = [] + + def transfer_all_sync(self, sid=None): + """ + 全量转移Sync目录下的文件,WEB界面点击目录同步时获发 + """ + for monpath, target_dirs in self.sync_dir_config.items(): + if not monpath: + continue + if sid and sid != target_dirs.get('id'): + continue + target_path = target_dirs.get('target') + unknown_path = target_dirs.get('unknown') + onlylink = target_dirs.get('onlylink') + sync_mode = target_dirs.get('syncmod') + # 只做硬链接,不做识别重命名 + if onlylink: + for link_file in PathUtils.get_dir_files(monpath): + if self.dbhelper.is_sync_in_history(link_file, target_path): + continue + log.info("【Sync】开始同步 %s" % link_file) + ret, msg = self.filetransfer.link_sync_file(src_path=monpath, + in_file=link_file, + target_dir=target_path, + sync_transfer_mode=sync_mode) + if ret != 0: + log.warn("【Sync】%s 同步失败,错误码:%s" % (link_file, ret)) + elif not msg: + self.dbhelper.insert_sync_history(link_file, monpath, target_path) + log.info("【Sync】%s 同步完成" % link_file) + else: + for path in PathUtils.get_dir_level1_medias(monpath, RMT_MEDIAEXT): + if PathUtils.is_invalid_path(path): + continue + ret, ret_msg = self.filetransfer.transfer_media(in_from=SyncType.MON, + in_path=path, + target_dir=target_path, + unknown_dir=unknown_path, + rmt_mode=sync_mode) + if not ret: + log.error("【Sync】%s 处理失败:%s" % (monpath, ret_msg)) + + +def run_monitor(): + """ + 启动监控 + """ + try: + Sync().run_service() + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("启动目录同步服务失败:%s" % str(err)) + + +def stop_monitor(): + """ + 停止监控 + """ + try: + Sync().stop_service() + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("停止目录同步服务失败:%s" % str(err)) + + +def restart_monitor(): + """ + 重启监控 + """ + stop_monitor() + run_monitor() diff --git a/app/torrentremover.py b/app/torrentremover.py new file mode 100644 index 0000000..d33686a --- /dev/null +++ b/app/torrentremover.py @@ -0,0 +1,305 @@ +import json +from threading import Lock + +from apscheduler.schedulers.background import BackgroundScheduler + +import log +from app.conf import ModuleConf +from app.downloader import Downloader +from app.helper import DbHelper +from app.message import Message +from app.utils import ExceptionUtils +from app.utils.commons import singleton +from config import Config + +lock = Lock() + + +@singleton +class TorrentRemover(object): + message = None + downloader = None + dbhelper = None + + _scheduler = None + _remove_tasks = {} + + def __init__(self): + self.init_config() + + def init_config(self): + self.message = Message() + self.downloader = Downloader() + self.dbhelper = DbHelper() + # 移出现有任务 + try: + if self._scheduler: + self._scheduler.remove_all_jobs() + if self._scheduler.running: + self._scheduler.shutdown() + self._scheduler = None + except Exception as e: + ExceptionUtils.exception_traceback(e) + # 读取任务任务列表 + removetasks = self.dbhelper.get_torrent_remove_tasks() + self._remove_tasks = {} + for task in removetasks: + config = task.CONFIG + self._remove_tasks[str(task.ID)] = { + "id": task.ID, + "name": task.NAME, + "downloader": task.DOWNLOADER, + "onlynastool": task.ONLYNASTOOL, + "samedata": task.SAMEDATA, + "action": task.ACTION, + "config": json.loads(config) if config else {}, + "interval": task.INTERVAL, + "enabled": task.ENABLED, + } + if not self._remove_tasks: + return + # 启动删种任务 + self._scheduler = BackgroundScheduler(timezone=Config().get_timezone()) + remove_flag = False + for task in self._remove_tasks.values(): + if task.get("enabled") and task.get("interval") and task.get("config"): + remove_flag = True + self._scheduler.add_job(func=self.auto_remove_torrents, + args=[task.get("id")], + trigger='interval', + seconds=int(task.get("interval")) * 60) + if remove_flag: + self._scheduler.print_jobs() + self._scheduler.start() + log.info("自动删种服务启动") + + def get_torrent_remove_tasks(self, taskid=None): + """ + 获取删种任务详细信息 + """ + if taskid: + task = self._remove_tasks.get(str(taskid)) + return task if task else {} + return self._remove_tasks + + def auto_remove_torrents(self, taskids=None): + """ + 处理自动删种任务,由定时服务调用 + :param taskids: 自动删种任务的ID + """ + # 获取自动删种任务 + tasks = [] + # 如果没有指定任务ID,则处理所有启用任务 + if not taskids: + for task in self._remove_tasks.values(): + if task.get("enabled") and task.get("interval") and task.get("config"): + tasks.append(task) + # 如果指定任务id,则处理指定任务无论是否启用 + elif isinstance(taskids, list): + for taskid in taskids: + task = self._remove_tasks.get(str(taskid)) + if task: + tasks.append(task) + else: + task = self._remove_tasks.get(str(taskids)) + tasks = [task] if task else [] + if not tasks: + return + for task in tasks: + try: + lock.acquire() + # 获取需删除种子列表 + downloader_type = ModuleConf.TORRENTREMOVER_DICT.get(task.get("downloader")).get("downloader_type") + task.get("config")["samedata"] = task.get("samedata") + task.get("config")["onlynastool"] = task.get("onlynastool") + torrents = self.downloader.get_remove_torrents( + downloader=downloader_type, + config=task.get("config") + ) + log.info(f"【TorrentRemover】自动删种任务:{task.get('name')} 获取符合处理条件种子数 {len(torrents)}") + title = f"自动删种任务:{task.get('name')}" + text = "" + if task.get("action") == 1: + text = f"共暂停{len(torrents)}个种子" + for torrent in torrents: + name = torrent.get("name") + site = torrent.get("site") + size = round(torrent.get("size")/1021/1024/1024, 3) + text_item = f"{name} 来自站点:{site} 大小:{size} GB" + log.info(f"【TorrentRemover】暂停种子:{text_item}") + text = f"{text}\n{text_item}" + # 暂停种子 + self.downloader.stop_torrents(downloader=downloader_type, + ids=[torrent.get("id")]) + elif task.get("action") == 2: + text = f"共删除{len(torrents)}个种子" + for torrent in torrents: + name = torrent.get("name") + site = torrent.get("site") + size = round(torrent.get("size") / 1021 / 1024 / 1024, 3) + text_item = f"{name} 来自站点:{site} 大小:{size} GB" + log.info(f"【TorrentRemover】删除种子:{text_item}") + text = f"{text}\n{text_item}" + # 删除种子 + self.downloader.delete_torrents(downloader=downloader_type, + delete_file=False, + ids=[torrent.get("id")]) + elif task.get("action") == 3: + text = f"共删除{len(torrents)}个种子(及文件)" + for torrent in torrents: + name = torrent.get("name") + site = torrent.get("site") + size = round(torrent.get("size") / 1021 / 1024 / 1024, 3) + text_item = f"{name} 来自站点:{site} 大小:{size} GB" + log.info(f"【TorrentRemover】删除种子及文件:{text_item}") + text = f"{text}\n{text_item}" + # 删除种子 + self.downloader.delete_torrents(downloader=downloader_type, + delete_file=True, + ids=[torrent.get("id")]) + if torrents and title and text: + self.message.send_brushtask_remove_message(title=title, text=text) + except Exception as e: + ExceptionUtils.exception_traceback(e) + log.error(f"【TorrentRemover】自动删种任务:{task.get('name')}异常:{str(e)}") + finally: + lock.release() + + def update_torrent_remove_task(self, data): + """ + 更新自动删种任务 + """ + tid = data.get("tid") + name = data.get("name") + if not name: + return False, "名称参数不合法" + action = data.get("action") + if not str(action).isdigit() or int(action) not in [1, 2, 3]: + return False, "动作参数不合法" + else: + action = int(action) + interval = data.get("interval") + if not str(interval).isdigit(): + return False, "运行间隔参数不合法" + else: + interval = int(interval) + enabled = data.get("enabled") + if not str(enabled).isdigit() or int(enabled) not in [0, 1]: + return False, "状态参数不合法" + else: + enabled = int(enabled) + samedata = data.get("samedata") + if not str(enabled).isdigit() or int(samedata) not in [0, 1]: + return False, "处理辅种参数不合法" + else: + samedata = int(samedata) + onlynastool = data.get("onlynastool") + if not str(enabled).isdigit() or int(onlynastool) not in [0, 1]: + return False, "仅处理NASTOOL添加种子参数不合法" + else: + onlynastool = int(onlynastool) + ratio = data.get("ratio") or 0 + if not str(ratio).replace(".", "").isdigit(): + return False, "分享率参数不合法" + else: + ratio = round(float(ratio), 2) + seeding_time = data.get("seeding_time") or 0 + if not str(seeding_time).isdigit(): + return False, "做种时间参数不合法" + else: + seeding_time = int(seeding_time) + upload_avs = data.get("upload_avs") or 0 + if not str(upload_avs).isdigit(): + return False, "平均上传速度参数不合法" + else: + upload_avs = int(upload_avs) + size = data.get("size") + size = str(size).split("-") if size else [] + if size and (len(size) != 2 or not str(size[0]).isdigit() or not str(size[-1]).isdigit()): + return False, "种子大小参数不合法" + else: + size = [int(size[0]), int(size[-1])] if size else [] + tags = data.get("tags") + tags = tags.split(";") if tags else [] + tags = [tag for tag in tags if tag] + savepath_key = data.get("savepath_key") + tracker_key = data.get("tracker_key") + downloader = data.get("downloader") + if downloader not in ModuleConf.TORRENTREMOVER_DICT.keys(): + return False, "下载器参数不合法" + if downloader == "Qb": + qb_state = data.get("qb_state") + qb_state = qb_state.split(";") if qb_state else [] + qb_state = [state for state in qb_state if state] + if qb_state: + for qb_state_item in qb_state: + if qb_state_item not in ModuleConf.TORRENTREMOVER_DICT.get("Qb").get("torrent_state").keys(): + return False, "种子状态参数不合法" + qb_category = data.get("qb_category") + qb_category = qb_category.split(";") if qb_category else [] + qb_category = [category for category in qb_category if category] + tr_state = [] + tr_error_key = "" + else: + qb_state = [] + qb_category = [] + tr_state = data.get("tr_state") + tr_state = tr_state.split(";") if tr_state else [] + tr_state = [state for state in tr_state if state] + if tr_state: + for tr_state_item in tr_state: + if tr_state_item not in ModuleConf.TORRENTREMOVER_DICT.get("Tr").get("torrent_state").keys(): + return False, "种子状态参数不合法" + tr_error_key = data.get("tr_error_key") + config = { + "ratio": ratio, + "seeding_time": seeding_time, + "upload_avs": upload_avs, + "size": size, + "tags": tags, + "savepath_key": savepath_key, + "tracker_key": tracker_key, + "qb_state": qb_state, + "qb_category": qb_category, + "tr_state": tr_state, + "tr_error_key": tr_error_key, + } + if tid: + self.dbhelper.delete_torrent_remove_task(tid=tid) + self.dbhelper.insert_torrent_remove_task( + name=name, + action=action, + interval=interval, + enabled=enabled, + samedata=samedata, + onlynastool=onlynastool, + downloader=downloader, + config=config, + ) + return True, "更新成功" + + def delete_torrent_remove_task(self, taskid=None): + """ + 删除自动删种任务 + """ + if not taskid: + return False + else: + self.dbhelper.delete_torrent_remove_task(tid=taskid) + return True + + def get_remove_torrents(self, taskid): + """ + 获取满足自动删种任务的种子 + """ + task = self._remove_tasks.get(str(taskid)) + if not task: + return False, [] + else: + task.get("config")["samedata"] = task.get("samedata") + task.get("config")["onlynastool"] = task.get("onlynastool") + torrents = self.downloader.get_remove_torrents( + downloader=ModuleConf.TORRENTREMOVER_DICT.get(task.get("downloader")).get("downloader_type"), + config=task.get("config") + ) + return True, torrents diff --git a/app/utils/__init__.py b/app/utils/__init__.py new file mode 100644 index 0000000..addef48 --- /dev/null +++ b/app/utils/__init__.py @@ -0,0 +1,13 @@ +from .dom_utils import DomUtils +from .episode_format import EpisodeFormat +from .http_utils import RequestUtils +from .json_utils import JsonUtils +from .number_utils import NumberUtils +from .path_utils import PathUtils +from .string_utils import StringUtils +from .system_utils import SystemUtils +from .tokens import Tokens +from .torrent import Torrent +from .cache_manager import cacheman, TokenCache, ConfigLoadCache +from .exception_utils import ExceptionUtils +from .rsstitle_utils import RssTitleUtils diff --git a/app/utils/cache_manager.py b/app/utils/cache_manager.py new file mode 100644 index 0000000..fdf140b --- /dev/null +++ b/app/utils/cache_manager.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +import time + +from cacheout import CacheManager, LRUCache, Cache + +CACHES = { + "tmdb_supply": {'maxsize': 200} +} + +cacheman = CacheManager(CACHES, cache_class=LRUCache) + +TokenCache = Cache(maxsize=256, ttl=4*3600, timer=time.time, default=None) + +ConfigLoadCache = Cache(maxsize=1, ttl=10, timer=time.time, default=None) diff --git a/app/utils/commons.py b/app/utils/commons.py new file mode 100644 index 0000000..fc00c6b --- /dev/null +++ b/app/utils/commons.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +import threading + +# 线程锁 +lock = threading.RLock() + +# 全局实例 +INSTANCES = {} + + +# 单例模式注解 +def singleton(cls): + # 创建字典用来保存类的实例对象 + global INSTANCES + + def _singleton(*args, **kwargs): + # 先判断这个类有没有对象 + if cls not in INSTANCES: + with lock: + if cls not in INSTANCES: + INSTANCES[cls] = cls(*args, **kwargs) + pass + # 将实例对象返回 + return INSTANCES[cls] + + return _singleton diff --git a/app/utils/dom_utils.py b/app/utils/dom_utils.py new file mode 100644 index 0000000..2e9070a --- /dev/null +++ b/app/utils/dom_utils.py @@ -0,0 +1,30 @@ +class DomUtils: + + @staticmethod + def tag_value(tag_item, tag_name, attname="", default=None): + """ + 解析XML标签值 + """ + tagNames = tag_item.getElementsByTagName(tag_name) + if tagNames: + if attname: + attvalue = tagNames[0].getAttribute(attname) + if attvalue: + return attvalue + else: + firstChild = tagNames[0].firstChild + if firstChild: + return firstChild.data + return default + + @staticmethod + def add_node(doc, parent, name, value=None): + """ + 添加一个DOM节点 + """ + node = doc.createElement(name) + parent.appendChild(node) + if value is not None: + text = doc.createTextNode(str(value)) + node.appendChild(text) + return node diff --git a/app/utils/episode_format.py b/app/utils/episode_format.py new file mode 100644 index 0000000..031f194 --- /dev/null +++ b/app/utils/episode_format.py @@ -0,0 +1,85 @@ +import re +import parse +from config import SPLIT_CHARS + + +class EpisodeFormat(object): + _key = "" + + def __init__(self, eformat, details: str = None, offset=None, key="ep"): + self._format = eformat + self._start_ep = None + self._end_ep = None + if details: + if re.compile("\\d{1,4}-\\d{1,4}").match(details): + self._start_ep = details + self._end_ep = details + else: + tmp = details.split(",") + if len(tmp) > 1: + self._start_ep = int(tmp[0]) + self._end_ep = int(tmp[0]) if int(tmp[0]) > int(tmp[1]) else int(tmp[1]) + else: + self._start_ep = self._end_ep = int(tmp[0]) + self.__offset = int(offset) if offset else 0 + self._key = key + + @property + def format(self): + return self._format + + @property + def start_ep(self): + return self._start_ep + + @property + def end_ep(self): + return self._end_ep + + @property + def offset(self): + return self.__offset + + def match(self, file: str): + if not self._format: + return True + s, e = self.__handle_single(file) + if not s: + return False + if self._start_ep is None: + return True + if self._start_ep <= s <= self._end_ep: + return True + return False + + def split_episode(self, file_name): + # 指定的具体集数,直接返回 + if self._start_ep is not None and self._start_ep == self._end_ep: + if isinstance(self._start_ep, str): + s, e = self._start_ep.split("-") + if int(s) == int(e): + return int(s) + self.__offset, None + return int(s) + self.__offset, int(e) + self.__offset + return self._start_ep + self.__offset, None + if not self._format: + return None, None + s, e = self.__handle_single(file_name) + return s + self.__offset if s is not None else None, e + self.__offset if e is not None else None + + def __handle_single(self, file: str): + if not self._format: + return None, None + ret = parse.parse(self._format, file) + if not ret or not ret.__contains__(self._key): + return None, None + episodes = ret.__getitem__(self._key) + if not re.compile(r"^(EP)?(\d{1,4})(-(EP)?(\d{1,4}))?$", re.IGNORECASE).match(episodes): + return None, None + episode_splits = list(filter(lambda x: re.compile(r'[a-zA-Z]*\d{1,4}', re.IGNORECASE).match(x), + re.split(r'%s' % SPLIT_CHARS, episodes))) + if len(episode_splits) == 1: + return int(re.compile(r'[a-zA-Z]*', re.IGNORECASE).sub("", episode_splits[0])), None + else: + return int(re.compile(r'[a-zA-Z]*', re.IGNORECASE).sub("", episode_splits[0])), int( + re.compile(r'[a-zA-Z]*', re.IGNORECASE).sub("", episode_splits[1])) + diff --git a/app/utils/exception_utils.py b/app/utils/exception_utils.py new file mode 100644 index 0000000..fa5e2f3 --- /dev/null +++ b/app/utils/exception_utils.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +import traceback + + +class ExceptionUtils: + @classmethod + def exception_traceback(cls, e): + print(f"\nException: {str(e)}\nCallstack:\n{traceback.format_exc()}\n") diff --git a/app/utils/http_utils.py b/app/utils/http_utils.py new file mode 100644 index 0000000..f5d5b64 --- /dev/null +++ b/app/utils/http_utils.py @@ -0,0 +1,164 @@ +import requests +import urllib3 +from urllib3.exceptions import InsecureRequestWarning +from config import Config + +urllib3.disable_warnings(InsecureRequestWarning) + + +class RequestUtils: + _headers = None + _cookies = None + _proxies = None + _timeout = 20 + _session = None + + def __init__(self, + headers=None, + cookies=None, + proxies=False, + session=None, + timeout=None, + referer=None, + content_type=None): + if not content_type: + content_type = "application/x-www-form-urlencoded; charset=UTF-8" + if headers: + if isinstance(headers, str): + self._headers = { + "Content-Type": content_type, + "User-Agent": f"{headers}" + } + else: + self._headers = headers + else: + self._headers = { + "Content-Type": content_type, + "User-Agent": Config().get_ua() + } + if referer: + self._headers.update({ + "referer": referer + }) + if cookies: + if isinstance(cookies, str): + self._cookies = self.cookie_parse(cookies) + else: + self._cookies = cookies + if proxies: + self._proxies = proxies + if session: + self._session = session + if timeout: + self._timeout = timeout + + def post(self, url, params=None, json=None): + if json is None: + json = {} + try: + if self._session: + return self._session.post(url, + data=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + json=json) + else: + return requests.post(url, + data=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + json=json) + except requests.exceptions.RequestException: + return None + + def get(self, url, params=None): + try: + if self._session: + r = self._session.get(url, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + params=params) + else: + r = requests.get(url, + verify=False, + headers=self._headers, + proxies=self._proxies, + timeout=self._timeout, + params=params) + return str(r.content, 'utf-8') + except requests.exceptions.RequestException: + return None + + def get_res(self, url, params=None, allow_redirects=True): + try: + if self._session: + return self._session.get(url, + params=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects) + else: + return requests.get(url, + params=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects) + except requests.exceptions.RequestException: + return None + + def post_res(self, url, params=None, allow_redirects=True, files=None, json=None): + try: + if self._session: + return self._session.post(url, + data=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects, + files=files, + json=json) + else: + return requests.post(url, + data=params, + verify=False, + headers=self._headers, + proxies=self._proxies, + cookies=self._cookies, + timeout=self._timeout, + allow_redirects=allow_redirects, + files=files, + json=json) + except requests.exceptions.RequestException: + return None + + @staticmethod + def cookie_parse(cookies_str, array=False): + if not cookies_str: + return {} + cookie_dict = {} + cookies = cookies_str.split(';') + for cookie in cookies: + cstr = cookie.split('=') + if len(cstr) > 1: + cookie_dict[cstr[0].strip()] = cstr[1].strip() + if array: + cookiesList = [] + for cookieName, cookieValue in cookie_dict.items(): + cookies = {'name': cookieName, 'value': cookieValue} + cookiesList.append(cookies) + return cookiesList + return cookie_dict diff --git a/app/utils/json_utils.py b/app/utils/json_utils.py new file mode 100644 index 0000000..ccfe2e5 --- /dev/null +++ b/app/utils/json_utils.py @@ -0,0 +1,24 @@ +import json +from enum import Enum + + +class JsonUtils: + + @staticmethod + def json_serializable(obj): + """ + 将普通对象转化为支持json序列化的对象 + @param obj: 待转化的对象 + @return: 支持json序列化的对象 + """ + + def _try(o): + if isinstance(o, Enum): + return o.value + try: + return o.__dict__ + except Exception as err: + print(str(err)) + return str(o) + + return json.loads(json.dumps(obj, default=lambda o: _try(o))) diff --git a/app/utils/number_utils.py b/app/utils/number_utils.py new file mode 100644 index 0000000..693fc14 --- /dev/null +++ b/app/utils/number_utils.py @@ -0,0 +1,12 @@ +class NumberUtils: + + @staticmethod + def max_ele(a, b): + """ + 返回非空最大值 + """ + if not a: + return b + if not b: + return a + return max(int(a), int(b)) diff --git a/app/utils/path_utils.py b/app/utils/path_utils.py new file mode 100644 index 0000000..ce85c90 --- /dev/null +++ b/app/utils/path_utils.py @@ -0,0 +1,155 @@ +import os + + +class PathUtils: + + @staticmethod + def get_dir_files(in_path, exts="", filesize=0, episode_format=None): + """ + 获得目录下的媒体文件列表List ,按后缀、大小、格式过滤 + """ + if not in_path: + return [] + if not os.path.exists(in_path): + return [] + ret_list = [] + if os.path.isdir(in_path): + for root, dirs, files in os.walk(in_path): + for file in files: + cur_path = os.path.join(root, file) + # 检查路径是否合法 + if PathUtils.is_invalid_path(cur_path): + continue + # 检查格式匹配 + if episode_format and not episode_format.match(file): + continue + # 检查后缀 + if exts and os.path.splitext(file)[-1].lower() not in exts: + continue + # 检查文件大小 + if filesize and os.path.getsize(cur_path) < filesize: + continue + # 命中 + if cur_path not in ret_list: + ret_list.append(cur_path) + else: + # 检查路径是否合法 + if PathUtils.is_invalid_path(in_path): + return [] + # 检查后缀 + if exts and os.path.splitext(in_path)[-1].lower() not in exts: + return [] + # 检查格式 + if episode_format and not episode_format.match(os.path.basename(in_path)): + return [] + # 检查文件大小 + if filesize and os.path.getsize(in_path) < filesize: + return [] + ret_list.append(in_path) + return ret_list + + @staticmethod + def get_dir_level1_files(in_path, exts=""): + """ + 查询目录下的文件(只查询一级) + """ + ret_list = [] + if not os.path.exists(in_path): + return [] + for file in os.listdir(in_path): + path = os.path.join(in_path, file) + if os.path.isfile(path): + if not exts or os.path.splitext(file)[-1].lower() in exts: + ret_list.append(path) + return ret_list + + @staticmethod + def get_dir_level1_medias(in_path, exts=""): + """ + 根据后缀,返回目录下所有的文件及文件夹列表(只查询一级) + """ + ret_list = [] + if not os.path.exists(in_path): + return [] + if os.path.isdir(in_path): + for file in os.listdir(in_path): + path = os.path.join(in_path, file) + if os.path.isfile(path): + if not exts or os.path.splitext(file)[-1].lower() in exts: + ret_list.append(path) + else: + ret_list.append(path) + else: + ret_list.append(in_path) + return ret_list + + @staticmethod + def is_invalid_path(path): + """ + 判断是否不能处理的路径 + """ + if not path: + return True + if path.find('/@Recycle/') != -1 or path.find('/#recycle/') != -1 or path.find('/.') != -1 or path.find( + '/@eaDir') != -1: + return True + return False + + @staticmethod + def is_path_in_path(path1, path2): + """ + 判断两个路径是否包含关系 path1 in path2 + """ + if not path1 or not path2: + return False + path1 = os.path.normpath(path1) + path2 = os.path.normpath(path2) + if path1 == path2: + return True + path = os.path.dirname(path2) + while True: + if path == path1: + return True + path = os.path.dirname(path) + if path == os.path.dirname(path): + break + return False + + @staticmethod + def get_bluray_dir(path): + """ + 判断是否蓝光原盘目录,是则返回原盘的根目录,否则返回空 + """ + if not path or not os.path.exists(path): + return None + if os.path.isdir(path): + if os.path.exists(os.path.join(path, "BDMV", "index.bdmv")): + return path + elif os.path.normpath(path).endswith("BDMV") \ + and os.path.exists(os.path.join(path, "index.bdmv")): + return os.path.dirname(path) + elif os.path.normpath(path).endswith("STREAM") \ + and os.path.exists(os.path.join(os.path.dirname(path), "index.bdmv")): + return PathUtils.get_parent_paths(path, 2) + else: + # 电视剧原盘下会存在多个目录形如:Spider Man 2021/DIsc1, Spider Man 2021/Disc2 + for level1 in PathUtils.get_dir_level1_medias(path): + if os.path.exists(os.path.join(level1, "BDMV", "index.bdmv")): + return path + return None + else: + if str(os.path.splitext(path)[-1]).lower() in [".m2ts", ".ts"] \ + and os.path.normpath(os.path.dirname(path)).endswith("STREAM") \ + and os.path.exists(os.path.join(PathUtils.get_parent_paths(path, 2), "index.bdmv")): + return PathUtils.get_parent_paths(path, 3) + else: + return None + + @staticmethod + def get_parent_paths(path, level: int = 1): + """ + 获取父目录路径,level为向上查找的层数 + """ + for lv in range(0, level): + path = os.path.dirname(path) + return path diff --git a/app/utils/rsstitle_utils.py b/app/utils/rsstitle_utils.py new file mode 100644 index 0000000..dc2ad1f --- /dev/null +++ b/app/utils/rsstitle_utils.py @@ -0,0 +1,30 @@ +import re + +from app.utils.exception_utils import ExceptionUtils + + +class RssTitleUtils: + + @staticmethod + def keepfriends_title(title): + """ + 处理pt.keepfrds.com的RSS标题 + """ + if not title: + return "" + try: + title_search = re.search(r"\[(.*)]", title, re.IGNORECASE) + if title_search: + if title_search.span()[0] == 0: + title_all = re.findall(r"\[(.*?)]", title, re.IGNORECASE) + if title_all and len(title_all) > 1: + torrent_name = title_all[-1] + torrent_desc = title.replace(f"[{torrent_name}]", "").strip() + title = "%s %s" % (torrent_name, torrent_desc) + else: + torrent_name = title_search.group(1) + torrent_desc = title.replace(title_search.group(), "").strip() + title = "%s %s" % (torrent_name, torrent_desc) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return title diff --git a/app/utils/string_utils.py b/app/utils/string_utils.py new file mode 100644 index 0000000..ad27d8d --- /dev/null +++ b/app/utils/string_utils.py @@ -0,0 +1,440 @@ +import bisect +import datetime +import hashlib +import random +import re +from urllib import parse + +import dateparser +import dateutil.parser + +import cn2an +from app.utils.exception_utils import ExceptionUtils +from app.utils.types import MediaType + + +class StringUtils: + + @staticmethod + def num_filesize(text): + """ + 将文件大小文本转化为字节 + """ + if not text: + return 0 + if not isinstance(text, str): + text = str(text) + if text.isdigit(): + return int(text) + text = text.replace(",", "").replace(" ", "").upper() + size = re.sub(r"[KMGTPI]*B?", "", text, flags=re.IGNORECASE) + try: + size = float(size) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return 0 + if text.find("PB") != -1 or text.find("PIB") != -1: + size *= 1024 ** 5 + elif text.find("TB") != -1 or text.find("TIB") != -1: + size *= 1024 ** 4 + elif text.find("GB") != -1 or text.find("GIB") != -1: + size *= 1024 ** 3 + elif text.find("MB") != -1 or text.find("MIB") != -1: + size *= 1024 ** 2 + elif text.find("KB") != -1 or text.find("KIB") != -1: + size *= 1024 + return round(size) + + @staticmethod + def str_timelong(time_sec): + """ + 将数字转换为时间描述 + """ + if not isinstance(time_sec, int) or not isinstance(time_sec, float): + try: + time_sec = float(time_sec) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return "" + d = [(0, '秒'), (60 - 1, '分'), (3600 - 1, '小时'), (86400 - 1, '天')] + s = [x[0] for x in d] + index = bisect.bisect_left(s, time_sec) - 1 + if index == -1: + return str(time_sec) + else: + b, u = d[index] + return str(round(time_sec / (b + 1))) + u + + @staticmethod + def is_chinese(word): + """ + 判断是否含有中文 + """ + if isinstance(word, list): + word = " ".join(word) + chn = re.compile(r'[\u4e00-\u9fff]') + if chn.search(word): + return True + else: + return False + + @staticmethod + def is_japanese(word): + jap = re.compile(r'[\u3040-\u309F\u30A0-\u30FF]') + if jap.search(word): + return True + else: + return False + + @staticmethod + def is_korean(word): + kor = re.compile(r'[\uAC00-\uD7FF]') + if kor.search(word): + return True + else: + return False + + @staticmethod + def is_all_chinese(word): + """ + 判断是否全是中文 + """ + for ch in word: + if ch == ' ': + continue + if '\u4e00' <= ch <= '\u9fff': + continue + else: + return False + return True + + @staticmethod + def xstr(s): + """ + 字符串None输出为空 + """ + return s if s else '' + + @staticmethod + def str_sql(in_str): + """ + 转化SQL字符 + """ + return "" if not in_str else str(in_str) + + @staticmethod + def str_int(text): + """ + web字符串转int + :param text: + :return: + """ + int_val = 0 + try: + int_val = int(text.strip().replace(',', '')) + except Exception as e: + ExceptionUtils.exception_traceback(e) + + return int_val + + @staticmethod + def str_float(text): + """ + web字符串转float + :param text: + :return: + """ + float_val = 0.0 + try: + float_val = float(text.strip().replace(',', '')) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return float_val + + @staticmethod + def handler_special_chars(text, replace_word="", allow_space=False): + """ + 忽略特殊字符 + """ + # 需要忽略的特殊字符 + CONVERT_EMPTY_CHARS = r"[、.。,,·::;;!!'’\"“”()()\[\]【】「」\-——\+\|\\_/&#~~]" + if not text: + return text + if not isinstance(text, list): + text = re.sub(r"[\u200B-\u200D\uFEFF]", + "", + re.sub(r"%s" % CONVERT_EMPTY_CHARS, replace_word, text), + flags=re.IGNORECASE) + if not allow_space: + return re.sub(r"\s+", "", text) + else: + return re.sub(r"\s+", " ", text).strip() + else: + return [StringUtils.handler_special_chars(x) for x in text] + + @staticmethod + def str_filesize(size, pre=2): + """ + 将字节计算为文件大小描述(带单位的格式化后返回) + """ + if not size: + return size + size = re.sub(r"\s|B|iB", "", str(size), re.I) + if size.replace(".", "").isdigit(): + try: + size = float(size) + d = [(1024 - 1, 'K'), (1024 ** 2 - 1, 'M'), (1024 ** 3 - 1, 'G'), (1024 ** 4 - 1, 'T')] + s = [x[0] for x in d] + index = bisect.bisect_left(s, size) - 1 + if index == -1: + return str(size) + "B" + else: + b, u = d[index] + return str(round(size / (b + 1), pre)) + u + except Exception as e: + ExceptionUtils.exception_traceback(e) + return "" + if re.findall(r"[KMGTP]", size, re.I): + return size + else: + return size + "B" + + @staticmethod + def url_equal(url1, url2): + """ + 比较两个地址是否为同一个网站 + """ + if not url1 or not url2: + return False + if url1.startswith("http"): + url1 = parse.urlparse(url1).netloc + if url2.startswith("http"): + url2 = parse.urlparse(url2).netloc + if url1.replace("www.", "") == url2.replace("www.", ""): + return True + return False + + @staticmethod + def get_url_netloc(url): + """ + 获取URL的协议和域名部分 + """ + if not url: + return "", "" + if not url.startswith("http"): + return "http", url + addr = parse.urlparse(url) + return addr.scheme, addr.netloc + + @staticmethod + def get_url_domain(url): + """ + 获取URL的域名部分,不含WWW和HTTP + """ + if not url: + return "" + _, netloc = StringUtils.get_url_netloc(url) + if netloc: + return netloc.lower().replace("www.", "") + return "" + + @staticmethod + def get_base_url(url): + """ + 获取URL根地址 + """ + if not url: + return "" + scheme, netloc = StringUtils.get_url_netloc(url) + return f"{scheme}://{netloc}" + + @staticmethod + def clear_file_name(name): + if not name: + return None + return re.sub(r"[*?\\/\"<>~]", "", name, flags=re.IGNORECASE).replace(":", ":") + + @staticmethod + def get_keyword_from_string(content): + """ + 从检索关键字中拆分中年份、季、集、类型 + """ + if not content: + return None, None, None, None, None + # 去掉查询中的电影或电视剧关键字 + if re.search(r'^电视剧|\s+电视剧|^动漫|\s+动漫', content): + mtype = MediaType.TV + else: + mtype = None + content = re.sub(r'^电影|^电视剧|^动漫|\s+电影|\s+电视剧|\s+动漫', '', content).strip() + # 稍微切一下剧集吧 + season_num = None + episode_num = None + year = None + season_re = re.search(r"第\s*([0-9一二三四五六七八九十]+)\s*季", content, re.IGNORECASE) + if season_re: + mtype = MediaType.TV + season_num = int(cn2an.cn2an(season_re.group(1), mode='smart')) + episode_re = re.search(r"第\s*([0-9一二三四五六七八九十]+)\s*集", content, re.IGNORECASE) + if episode_re: + mtype = MediaType.TV + episode_num = int(cn2an.cn2an(episode_re.group(1), mode='smart')) + if episode_num and not season_num: + season_num = 1 + year_re = re.search(r"[\s(]+(\d{4})[\s)]*", content) + if year_re: + year = year_re.group(1) + key_word = re.sub( + r'第\s*[0-9一二三四五六七八九十]+\s*季|第\s*[0-9一二三四五六七八九十]+\s*集|[\s(]+(\d{4})[\s)]*', '', + content, + flags=re.IGNORECASE).strip() + if key_word: + key_word = re.sub(r'\s+', ' ', key_word) + if not key_word: + key_word = year + + return mtype, key_word, season_num, episode_num, year, content + + @staticmethod + def generate_random_str(randomlength=16): + """ + 生成一个指定长度的随机字符串 + """ + random_str = '' + base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' + length = len(base_str) - 1 + for i in range(randomlength): + random_str += base_str[random.randint(0, length)] + return random_str + + @staticmethod + def get_time_stamp(date): + tempsTime = None + try: + tempsTime = dateutil.parser.parse(date) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return tempsTime + + @staticmethod + def unify_datetime_str(datetime_str): + """ + 日期时间格式化 统一转成 2020-10-14 07:48:04 这种格式 + # 场景1: 带有时区的日期字符串 eg: Sat, 15 Oct 2022 14:02:54 +0800 + # 场景2: 中间带T的日期字符串 eg: 2020-10-14T07:48:04 + # 场景3: 中间带T的日期字符串 eg: 2020-10-14T07:48:04.208 + # 场景4: 日期字符串以GMT结尾 eg: Fri, 14 Oct 2022 07:48:04 GMT + # 场景5: 日期字符串以UTC结尾 eg: Fri, 14 Oct 2022 07:48:04 UTC + # 场景6: 日期字符串以Z结尾 eg: Fri, 14 Oct 2022 07:48:04Z + # 场景7: 日期字符串为相对时间 eg: 1 month, 2 days ago + :param datetime_str: + :return: + """ + # 传入的参数如果是None 或者空字符串 直接返回 + if not datetime_str: + return datetime_str + + try: + return dateparser.parse(datetime_str).strftime('%Y-%m-%d %H:%M:%S') + except Exception as e: + ExceptionUtils.exception_traceback(e) + return datetime_str + + @staticmethod + def timestamp_to_date(timestamp, date_format='%Y-%m-%d %H:%M:%S'): + """ + 时间戳转日期 + :param timestamp: + :param date_format: + :return: + """ + try: + return datetime.datetime.fromtimestamp(timestamp).strftime(date_format) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return timestamp + + @staticmethod + def to_bool(text, default_val: bool = False) -> bool: + """ + 字符串转bool + :param text: 要转换的值 + :param default_val: 默认值 + :return: + """ + if isinstance(text, str) and not text: + return default_val + if isinstance(text, bool): + return text + if isinstance(text, int) or isinstance(text, float): + return True if text > 0 else False + if isinstance(text, str) and text.lower() in ['y', 'true', '1']: + return True + return False + + @staticmethod + def str_from_cookiejar(cj): + """ + 将cookiejar转换为字符串 + :param cj: + :return: + """ + return '; '.join(['='.join(item) for item in cj.items()]) + + @staticmethod + def get_idlist_from_string(content, dicts): + """ + 从字符串中提取id列表 + :param content: 字符串 + :param dicts: 字典 + :return: + """ + if not content: + return [] + id_list = [] + content_list = content.split() + for dic in dicts: + if dic.get('name') in content_list and dic.get('id') not in id_list: + id_list.append(dic.get('id')) + content = content.replace(dic.get('name'), '') + return id_list, re.sub(r'\s+', ' ', content).strip() + + @staticmethod + def str_title(s): + """ + 讲英文的首字母大写 + :param s: en_name string + :return: string title + """ + return s.title() if s else s + + @staticmethod + def md5_hash(data): + """ + MD5 HASH + """ + if not data: + return "" + return hashlib.md5(str(data).encode()).hexdigest() + + @staticmethod + def str_timehours(minutes): + """ + 将分钟转换成小时和分钟 + :param minutes: + :return: + """ + if not minutes: + return "" + hours = minutes // 60 + minutes = minutes % 60 + return "%s小时%s分" % (hours, minutes) + + @staticmethod + def str_amount(amount, curr="$"): + """ + 格式化显示金额 + """ + if not amount: + return "0" + return curr + format(amount, ",") diff --git a/app/utils/system_utils.py b/app/utils/system_utils.py new file mode 100644 index 0000000..ed7da0a --- /dev/null +++ b/app/utils/system_utils.py @@ -0,0 +1,324 @@ +import datetime +import os +import platform +import shutil +import subprocess + +from app.utils.path_utils import PathUtils +from app.utils.exception_utils import ExceptionUtils +from app.utils.types import OsType +from config import WEBDRIVER_PATH + + +class SystemUtils: + + @staticmethod + def __get_hidden_shell(): + if os.name == "nt": + st = subprocess.STARTUPINFO() + st.dwFlags = subprocess.STARTF_USESHOWWINDOW + st.wShowWindow = subprocess.SW_HIDE + return st + else: + return None + + @staticmethod + def get_used_of_partition(path): + """ + 获取系统存储空间占用信息 + """ + if not path: + return 0, 0 + if not os.path.exists(path): + return 0, 0 + try: + total_b, used_b, free_b = shutil.disk_usage(path) + return used_b, total_b + except Exception as e: + ExceptionUtils.exception_traceback(e) + return 0, 0 + + @staticmethod + def get_system(): + """ + 获取操作系统类型 + """ + if SystemUtils.is_windows(): + return OsType.WINDOWS + elif SystemUtils.is_synology(): + return OsType.SYNOLOGY + elif SystemUtils.is_docker(): + return OsType.DOCKER + elif SystemUtils.is_macos(): + return OsType.MACOS + else: + return OsType.LINUX + + @staticmethod + def get_free_space_gb(folder): + """ + 计算目录剩余空间大小 + """ + total_b, used_b, free_b = shutil.disk_usage(folder) + return free_b / 1024 / 1024 / 1024 + + @staticmethod + def get_local_time(utc_time_str): + """ + 通过UTC的时间字符串获取时间 + """ + try: + utc_date = datetime.datetime.strptime(utc_time_str.replace('0000', ''), '%Y-%m-%dT%H:%M:%S.%fZ') + local_date = utc_date + datetime.timedelta(hours=8) + local_date_str = datetime.datetime.strftime(local_date, '%Y-%m-%d %H:%M:%S') + except Exception as e: + ExceptionUtils.exception_traceback(e) + return utc_time_str + return local_date_str + + @staticmethod + def check_process(pname): + """ + 检查进程序是否存在 + """ + if not pname: + return False + text = subprocess.Popen('ps -ef | grep -v grep | grep %s' % pname, shell=True).communicate() + return True if text else False + + @staticmethod + def execute(cmd): + """ + 执行命令,获得返回结果 + """ + try: + with os.popen(cmd) as p: + return p.readline().strip() + except Exception as err: + print(str(err)) + return "" + + @staticmethod + def is_docker(): + return os.path.exists('/.dockerenv') + + @staticmethod + def is_synology(): + if SystemUtils.is_windows(): + return False + return True if "synology" in SystemUtils.execute('uname -a') else False + + @staticmethod + def is_windows(): + return True if os.name == "nt" else False + + @staticmethod + def is_macos(): + return True if platform.system() == 'Darwin' else False + + @staticmethod + def is_lite_version(): + return True if SystemUtils.is_docker() \ + and os.environ.get("NASTOOL_VERSION") == "lite" else False + + @staticmethod + def get_webdriver_path(): + if SystemUtils.is_lite_version(): + return None + else: + return WEBDRIVER_PATH.get(SystemUtils.get_system().value) + + @staticmethod + def copy(src, dest): + """ + 复制 + """ + try: + shutil.copy2(os.path.normpath(src), os.path.normpath(dest)) + return 0, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def move(src, dest): + """ + 移动 + """ + try: + tmp_file = os.path.normpath(os.path.join(os.path.dirname(src), + os.path.basename(dest))) + shutil.move(os.path.normpath(src), tmp_file) + shutil.move(tmp_file, os.path.normpath(dest)) + return 0, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def link(src, dest): + """ + 硬链接 + """ + try: + if platform.release().find("-z4-") >= 0: + # 兼容极空间Z4 + tmp = os.path.normpath(os.path.join(PathUtils.get_parent_paths(dest, 2), + os.path.basename(dest))) + os.link(os.path.normpath(src), tmp) + shutil.move(tmp, os.path.normpath(dest)) + else: + os.link(os.path.normpath(src), os.path.normpath(dest)) + return 0, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def softlink(src, dest): + """ + 软链接 + """ + try: + os.symlink(os.path.normpath(src), os.path.normpath(dest)) + return 0, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def rclone_move(src, dest): + """ + Rclone移动 + """ + try: + src = os.path.normpath(src) + dest = dest.replace("\\", "/") + retcode = subprocess.run(['rclone', 'moveto', + src, + f'NASTOOL:{dest}'], + startupinfo=SystemUtils.__get_hidden_shell()).returncode + return retcode, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def rclone_copy(src, dest): + """ + Rclone复制 + """ + try: + src = os.path.normpath(src) + dest = dest.replace("\\", "/") + retcode = subprocess.run(['rclone', 'copyto', + src, + f'NASTOOL:{dest}'], + startupinfo=SystemUtils.__get_hidden_shell()).returncode + return retcode, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def minio_move(src, dest): + """ + Minio移动 + """ + try: + src = os.path.normpath(src) + dest = dest.replace("\\", "/") + if dest.startswith("/"): + dest = dest[1:] + retcode = subprocess.run(['mc', 'mv', + '--recursive', + src, + f'NASTOOL/{dest}'], + startupinfo=SystemUtils.__get_hidden_shell()).returncode + return retcode, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def minio_copy(src, dest): + """ + Minio复制 + """ + try: + src = os.path.normpath(src) + dest = dest.replace("\\", "/") + if dest.startswith("/"): + dest = dest[1:] + retcode = subprocess.run(['mc', 'cp', + '--recursive', + src, + f'NASTOOL/{dest}'], + startupinfo=SystemUtils.__get_hidden_shell()).returncode + return retcode, "" + except Exception as err: + ExceptionUtils.exception_traceback(err) + return -1, str(err) + + @staticmethod + def get_windows_drives(): + """ + 获取Windows所有盘符 + """ + vols = [] + for i in range(65, 91): + vol = chr(i) + ':' + if os.path.isdir(vol): + vols.append(vol) + return vols + + def find_hardlinks(self, file, fdir=None): + """ + 查找文件的所有硬链接 + """ + ret_files = [] + if os.name == "nt": + ret = subprocess.run( + ['fsutil', 'hardlink', 'list', file], + startupinfo=self.__get_hidden_shell(), + stdout=subprocess.PIPE + ) + if ret.returncode != 0: + return [] + if ret.stdout: + drive = os.path.splitdrive(file)[0] + link_files = ret.stdout.decode('GBK').replace('\\', '/').split('\r\n') + for link_file in link_files: + if link_file \ + and "$RECYCLE.BIN" not in link_file \ + and os.path.normpath(file) != os.path.normpath(f'{drive}{link_file}'): + link_file = f'{drive.upper()}{link_file}' + file_name = os.path.basename(link_file) + file_path = os.path.dirname(link_file) + ret_files.append({ + "file": link_file, + "filename": file_name, + "filepath": file_path + }) + else: + inode = os.stat(file).st_ino + if not fdir: + fdir = os.path.dirname(file) + stdout = subprocess.run( + ['find', fdir, '-inum', str(inode)], + stdout=subprocess.PIPE + ).stdout + if stdout: + link_files = stdout.decode('utf-8').split('\n') + for link_file in link_files: + if link_file \ + and os.path.normpath(file) != os.path.normpath(link_file): + file_name = os.path.basename(link_file) + file_path = os.path.dirname(link_file) + ret_files.append({ + "file": link_file, + "filename": file_name, + "filepath": file_path + }) + + return ret_files diff --git a/app/utils/tokens.py b/app/utils/tokens.py new file mode 100644 index 0000000..e454a2d --- /dev/null +++ b/app/utils/tokens.py @@ -0,0 +1,40 @@ +import re + +from config import SPLIT_CHARS + + +class Tokens: + _text = "" + _index = 0 + _tokens = [] + + def __init__(self, text): + self._text = text + self._tokens = [] + self.load_text(text) + + def load_text(self, text): + splited_text = re.split(r'%s' % SPLIT_CHARS, text) + for sub_text in splited_text: + if sub_text: + self._tokens.append(sub_text) + + def cur(self): + if self._index >= len(self._tokens): + return None + else: + token = self._tokens[self._index] + return token + + def get_next(self): + token = self.cur() + if token: + self._index = self._index + 1 + return token + + def peek(self): + index = self._index + 1 + if index >= len(self._tokens): + return None + else: + return self._tokens[index] diff --git a/app/utils/torrent.py b/app/utils/torrent.py new file mode 100644 index 0000000..a128886 --- /dev/null +++ b/app/utils/torrent.py @@ -0,0 +1,259 @@ +import os.path +import re +import datetime +from urllib.parse import quote, unquote + +from bencode import bdecode + +from app.utils.http_utils import RequestUtils +from config import Config + +# Trackers列表 +trackers = [ + "udp://tracker.opentrackr.org:1337/announce", + "udp://9.rarbg.com:2810/announce", + "udp://opentracker.i2p.rocks:6969/announce", + "https://opentracker.i2p.rocks:443/announce", + "udp://tracker.torrent.eu.org:451/announce", + "udp://tracker1.bt.moack.co.kr:80/announce", + "udp://tracker.pomf.se:80/announce", + "udp://tracker.moeking.me:6969/announce", + "udp://tracker.dler.org:6969/announce", + "udp://p4p.arenabg.com:1337/announce", + "udp://open.stealth.si:80/announce", + "udp://movies.zsw.ca:6969/announce", + "udp://ipv4.tracker.harry.lu:80/announce", + "udp://explodie.org:6969/announce", + "udp://exodus.desync.com:6969/announce", + "https://tracker.nanoha.org:443/announce", + "https://tracker.lilithraws.org:443/announce", + "https://tr.burnabyhighstar.com:443/announce", + "http://tracker.mywaifu.best:6969/announce", + "http://bt.okmp3.ru:2710/announce" +] + + +class Torrent: + _torrent_temp_path = None + + def __init__(self): + self._torrent_temp_path = Config().get_temp_path() + if not os.path.exists(self._torrent_temp_path): + os.makedirs(self._torrent_temp_path) + + def get_torrent_info(self, url, cookie=None, ua=None, referer=None, proxy=False): + """ + 把种子下载到本地,返回种子内容 + :param url: 种子链接 + :param cookie: 站点Cookie + :param ua: 站点UserAgent + :param referer: 关联地址,有的网站需要这个否则无法下载 + :param proxy: 是否使用内置代理 + :return: 种子保存路径、种子内容、种子文件列表主目录、种子文件列表、错误信息 + """ + if not url: + return None, None, "", [], "URL为空" + if url.startswith("magnet:"): + return None, url, "", [], f"{url} 为磁力链接" + try: + # 下载保存种子文件 + file_path, content, errmsg = self.save_torrent_file(url=url, + cookie=cookie, + ua=ua, + referer=referer, + proxy=proxy) + if not file_path: + return None, content, "", [], errmsg + # 解析种子文件 + files_folder, files, retmsg = self.get_torrent_files(file_path) + # 种子文件路径、种子内容、种子文件列表主目录、种子文件列表、错误信息 + return file_path, content, files_folder, files, retmsg + + except Exception as err: + return None, None, "", [], "下载种子文件出现异常:%s" % str(err) + + def save_torrent_file(self, url, cookie=None, ua=None, referer=None, proxy=False): + """ + 把种子下载到本地 + :return: 种子保存路径,错误信息 + """ + req = RequestUtils( + headers=ua, + cookies=cookie, + referer=referer, + proxies=Config().get_proxies() if proxy else None + ).get_res(url=url, allow_redirects=False) + while req and req.status_code in [301, 302]: + url = req.headers['Location'] + if url and url.startswith("magnet:"): + return None, url, f"获取到磁力链接:{url}" + req = RequestUtils( + headers=ua, + cookies=cookie, + referer=referer, + proxies=Config().get_proxies() if proxy else None + ).get_res(url=url, allow_redirects=False) + if req and req.status_code == 200: + if not req.content: + return None, None, "未下载到种子数据" + # 解析内容格式 + if req.text and str(req.text).startswith("magnet:"): + return None, req.text, "磁力链接" + else: + try: + bdecode(req.content) + except Exception as err: + print(str(err)) + return None, None, "种子数据有误,请确认链接是否正确,如为PT站点则需手工在站点下载一次种子" + # 读取种子文件名 + file_name = self.__get_url_torrent_filename(req, url) + # 种子文件路径 + file_path = os.path.join(self._torrent_temp_path, file_name) + # 种子内容 + file_content = req.content + # 写入磁盘 + with open(file_path, 'wb') as f: + f.write(file_content) + elif req is None: + return None, None, "无法打开链接:%s" % url + else: + return None, None, "下载种子出错,状态码:%s" % req.status_code + + return file_path, file_content, "" + + @staticmethod + def convert_hash_to_magnet(hash_text, title): + """ + 根据hash值,转换为磁力链,自动添加tracker + :param hash_text: 种子Hash值 + :param title: 种子标题 + """ + if not hash_text or not title: + return None + hash_text = re.search(r'[0-9a-z]+', hash_text, re.IGNORECASE) + if not hash_text: + return None + hash_text = hash_text.group(0) + ret_magnet = f'magnet:?xt=urn:btih:{hash_text}&dn={quote(title)}' + for tracker in trackers: + ret_magnet = f'{ret_magnet}&tr={quote(tracker)}' + return ret_magnet + + @staticmethod + def add_trackers_to_magnet(url, title=None): + """ + 添加tracker和标题到磁力链接 + """ + if not url or not title: + return None + ret_magnet = url + if title and url.find("&dn=") == -1: + ret_magnet = f'{ret_magnet}&dn={quote(title)}' + for tracker in trackers: + ret_magnet = f'{ret_magnet}&tr={quote(tracker)}' + return ret_magnet + + @staticmethod + def get_torrent_files(path): + """ + 解析Torrent文件,获取文件清单 + :return: 种子文件列表主目录、种子文件列表、错误信息 + """ + if not path or not os.path.exists(path): + return "", [], f"种子文件不存在:{path}" + file_names = [] + file_folder = "" + try: + torrent = bdecode(open(path, 'rb').read()) + if torrent.get("info"): + files = torrent.get("info", {}).get("files") or [] + if files: + for item in files: + if item.get("path"): + file_names.append(item["path"][0]) + file_folder = torrent.get("info", {}).get("name") + else: + file_names.append(torrent.get("info", {}).get("name")) + except Exception as err: + return file_folder, file_names, "解析种子文件异常:%s" % str(err) + return file_folder, file_names, "" + + def read_torrent_content(self, path): + """ + 读取本地种子文件的内容 + :return: 种子内容、种子文件列表主目录、种子文件列表、错误信息 + """ + if not path or not os.path.exists(path): + return None, "", [], "种子文件不存在:%s" % path + content, retmsg, file_folder, files = None, "", "", [] + try: + # 读取种子文件内容 + with open(path, 'rb') as f: + content = f.read() + # 解析种子文件 + file_folder, files, retmsg = self.get_torrent_files(path) + except Exception as e: + retmsg = "读取种子文件出错:%s" % str(e) + return content, file_folder, files, retmsg + + @staticmethod + def __get_url_torrent_filename(req, url): + """ + 从下载请求中获取种子文件名 + """ + if not req: + return "" + disposition = req.headers.get('content-disposition') or "" + file_name = re.findall(r"filename=\"?(.+)\"?", disposition) + if file_name: + file_name = unquote(str(file_name[0].encode('ISO-8859-1').decode()).split(";")[0].strip()) + if file_name.endswith('"'): + file_name = file_name[:-1] + elif url and url.endswith(".torrent"): + file_name = unquote(url.split("/")[-1]) + else: + file_name = str(datetime.datetime.now()) + return file_name + + @staticmethod + def get_magnet_title(url): + """ + 从磁力链接中获取标题 + """ + if not url: + return "" + title = re.findall(r"dn=(.+)&?", url) + return unquote(title[0]) if title else "" + + @staticmethod + def get_intersection_episodes(target, source, title): + """ + 对两个季集字典进行判重,有相同项目的取集的交集 + """ + if not source or not title: + return target + if not source.get(title): + return target + if not target.get(title): + target[title] = source.get(title) + return target + index = -1 + for target_info in target.get(title): + index += 1 + source_info = None + for info in source.get(title): + if info.get("season") == target_info.get("season"): + source_info = info + break + if not source_info: + continue + if not source_info.get("episodes"): + continue + if not target_info.get("episodes"): + target_episodes = source_info.get("episodes") + target[title][index]["episodes"] = target_episodes + continue + target_episodes = list(set(target_info.get("episodes")).intersection(set(source_info.get("episodes")))) + target[title][index]["episodes"] = target_episodes + return target + diff --git a/app/utils/types.py b/app/utils/types.py new file mode 100644 index 0000000..1f7956a --- /dev/null +++ b/app/utils/types.py @@ -0,0 +1,96 @@ +from enum import Enum + + +class MediaType(Enum): + TV = '电视剧' + MOVIE = '电影' + ANIME = '动漫' + UNKNOWN = '未知' + + +class DownloaderType(Enum): + QB = 'Qbittorrent' + TR = 'Transmission' + Client115 = '115网盘' + PikPak = 'PikPak' + + +class SyncType(Enum): + MAN = "手动整理" + MON = "目录同步" + + +class SearchType(Enum): + WX = "微信" + WEB = "WEB" + DB = "豆瓣" + RSS = "电影/电视剧订阅" + USERRSS = "自定义订阅" + OT = "手动下载" + TG = "Telegram" + API = "第三方API请求" + SLACK = "Slack" + SYNOLOGY = "Synology Chat" + + +class RmtMode(Enum): + LINK = "硬链接" + SOFTLINK = "软链接" + COPY = "复制" + MOVE = "移动" + RCLONECOPY = "Rclone复制" + RCLONE = "Rclone移动" + MINIOCOPY = "Minio复制" + MINIO = "Minio移动" + + +class MatchMode(Enum): + NORMAL = "正常模式" + STRICT = "严格模式" + + +class OsType(Enum): + WINDOWS = "Windows" + LINUX = "Linux" + SYNOLOGY = "Synology" + MACOS = "MacOS" + DOCKER = "Docker" + + +class IndexerType(Enum): + BUILTIN = "Indexer" + + +class MediaServerType(Enum): + JELLYFIN = "Jellyfin" + EMBY = "Emby" + PLEX = "Plex" + + +class BrushDeleteType(Enum): + NOTDELETE = "不删除" + SEEDTIME = "做种时间" + RATIO = "分享率" + UPLOADSIZE = "上传量" + DLTIME = "下载耗时" + AVGUPSPEED = "平均上传速度" + IATIME = "未活动时间" + + +# 站点框架 +class SiteSchema(Enum): + DiscuzX = "Discuz!" + Gazelle = "Gazelle" + Ipt = "IPTorrents" + NexusPhp = "NexusPhp" + NexusProject = "NexusProject" + NexusRabbit = "NexusRabbit" + SmallHorse = "Small Horse" + Unit3d = "Unit3d" + TorrentLeech = "TorrentLeech" + FileList = "FileList" + TNode = "TNode" + + +MovieTypes = ['MOV', '电影'] +TvTypes = ['TV', '电视剧'] diff --git a/build_sites.py b/build_sites.py new file mode 100644 index 0000000..68521fd --- /dev/null +++ b/build_sites.py @@ -0,0 +1,17 @@ +import os.path +import pickle +import ruamel.yaml +from app.utils.path_utils import PathUtils +from config import Config + + +if __name__ == "__main__": + _indexers = [] + _site_path = os.path.join(Config().get_config_path(), "sites") + cfg_files = PathUtils.get_dir_files(in_path=_site_path, exts=[".yml"]) + for cfg_file in cfg_files: + with open(cfg_file, mode='r', encoding='utf-8') as f: + print(cfg_file) + _indexers.append(ruamel.yaml.YAML().load(f)) + with open(os.path.join(Config().get_inner_config_path(), "sites.dat"), 'wb') as f: + pickle.dump(_indexers, f, pickle.HIGHEST_PROTOCOL) diff --git a/check_config.py b/check_config.py new file mode 100644 index 0000000..678475e --- /dev/null +++ b/check_config.py @@ -0,0 +1,753 @@ +import json +import os +from werkzeug.security import generate_password_hash +from app.helper import DbHelper +from app.utils import StringUtils, ExceptionUtils +from config import Config + + +def check_config(): + """ + 检查配置文件,如有错误进行日志输出 + """ + # 检查日志输出 + if Config().get_config('app'): + logtype = Config().get_config('app').get('logtype') + if logtype: + print("日志输出类型为:%s" % logtype) + if logtype == "server": + logserver = Config().get_config('app').get('logserver') + if not logserver: + print("【Config】日志中心地址未配置,无法正常输出日志") + else: + print("日志将上送到服务器:%s" % logserver) + elif logtype == "file": + logpath = Config().get_config('app').get('logpath') + if not logpath: + print("【Config】日志文件路径未配置,无法正常输出日志") + else: + print("日志将写入文件:%s" % logpath) + + # 检查WEB端口 + web_port = Config().get_config('app').get('web_port') + if not web_port: + print("WEB服务端口未设置,将使用默认3000端口") + + # 检查登录用户和密码 + login_user = Config().get_config('app').get('login_user') + login_password = Config().get_config('app').get('login_password') + if not login_user or not login_password: + print("WEB管理用户或密码未设置,将使用默认用户:admin,密码:password") + else: + print("WEB管理页面用户:%s" % str(login_user)) + + # 检查HTTPS + ssl_cert = Config().get_config('app').get('ssl_cert') + ssl_key = Config().get_config('app').get('ssl_key') + if not ssl_cert or not ssl_key: + print("未启用https,请使用 http://IP:%s 访问管理页面" % str(web_port)) + else: + if not os.path.exists(ssl_cert): + print("ssl_cert文件不存在:%s" % ssl_cert) + if not os.path.exists(ssl_key): + print("ssl_key文件不存在:%s" % ssl_key) + print("已启用https,请使用 https://IP:%s 访问管理页面" % str(web_port)) + + rmt_tmdbkey = Config().get_config('app').get('rmt_tmdbkey') + if not rmt_tmdbkey: + print("TMDB API Key未配置,媒体整理、搜索下载等功能将无法正常运行!") + rmt_match_mode = Config().get_config('app').get('rmt_match_mode') + if rmt_match_mode: + rmt_match_mode = rmt_match_mode.upper() + else: + rmt_match_mode = "NORMAL" + if rmt_match_mode == "STRICT": + print("TMDB匹配模式:严格模式") + else: + print("TMDB匹配模式:正常模式") + else: + print("配置文件格式错误,找不到app配置项!") + + # 检查媒体库目录路径 + if Config().get_config('media'): + media_server = Config().get_config('media').get('media_server') + if media_server: + print("媒体管理软件设置为:%s" % media_server) + if media_server == "jellyfin": + if not Config().get_config('jellyfin'): + print("jellyfin未配置") + else: + if not Config().get_config('jellyfin').get('host') \ + or not Config().get_config('jellyfin').get('api_key'): + print("jellyfin配置不完整") + elif media_server == "plex": + if not Config().get_config('plex'): + print("plex未配置") + else: + if not Config().get_config('plex').get('token') \ + and not Config().get_config('plex').get('username'): + print("plex配置不完整") + else: + if not Config().get_config('emby'): + print("emby未配置") + else: + if not Config().get_config('emby').get('host') \ + or not Config().get_config('emby').get('api_key'): + print("emby配置不完整") + + movie_paths = Config().get_config('media').get('movie_path') + if not movie_paths: + print("未配置电影媒体库目录") + else: + if not isinstance(movie_paths, list): + movie_paths = [movie_paths] + for movie_path in movie_paths: + if not os.path.exists(movie_path): + print("电影媒体库目录不存在:%s" % movie_path) + + tv_paths = Config().get_config('media').get('tv_path') + if not tv_paths: + print("未配置电视剧媒体库目录") + else: + if not isinstance(tv_paths, list): + tv_paths = [tv_paths] + for tv_path in tv_paths: + if not os.path.exists(tv_path): + print("电视剧媒体库目录不存在:%s" % tv_path) + + anime_paths = Config().get_config('media').get('anime_path') + if anime_paths: + if not isinstance(anime_paths, list): + anime_paths = [anime_paths] + for anime_path in anime_paths: + if not os.path.exists(anime_path): + print("动漫媒体库目录不存在:%s" % anime_path) + + category = Config().get_config('media').get('category') + if not category: + print("未配置分类策略") + else: + print("配置文件格式错误,找不到media配置项!") + + # 检查站点配置 + if Config().get_config('pt'): + pt_client = Config().get_config('pt').get('pt_client') + print("下载软件设置为:%s" % pt_client) + + rmt_mode = Config().get_config('pt').get('rmt_mode', 'copy') + if rmt_mode == "link": + print("默认文件转移模式为:硬链接") + elif rmt_mode == "softlink": + print("默认文件转移模式为:软链接") + elif rmt_mode == "move": + print("默认文件转移模式为:移动") + elif rmt_mode == "rclone": + print("默认文件转移模式为:rclone移动") + elif rmt_mode == "rclonecopy": + print("默认文件转移模式为:rclone复制") + else: + print("默认文件转移模式为:复制") + + search_indexer = Config().get_config('pt').get('search_indexer') + if search_indexer: + print("索引器设置为:%s" % search_indexer) + + search_auto = Config().get_config('pt').get('search_auto') + if search_auto: + print("微信等移动端渠道搜索已开启自动择优下载") + + ptsignin_cron = Config().get_config('pt').get('ptsignin_cron') + if not ptsignin_cron: + print("站点自动签到时间未配置,站点签到功能已关闭") + + pt_check_interval = Config().get_config('pt').get('pt_check_interval') + if not pt_check_interval: + print("RSS订阅周期未配置,RSS订阅功能已关闭") + + pt_monitor = Config().get_config('pt').get('pt_monitor') + if not pt_monitor: + print("下载软件监控未开启,下载器监控功能已关闭") + else: + print("配置文件格式错误,找不到pt配置项!") + + # 检查Douban配置 + if not Config().get_config('douban'): + print("豆瓣未配置") + else: + if not Config().get_config('douban').get('users') \ + or not Config().get_config('douban').get('types') \ + or not Config().get_config('douban').get('days'): + print("豆瓣配置不完整") + + +def update_config(): + """ + 升级配置文件 + """ + _config = Config().get_config() + _dbhelper = DbHelper() + overwrite_cofig = False + + # 密码初始化 + login_password = _config.get("app", {}).get("login_password") or "password" + if login_password and not login_password.startswith("[hash]"): + _config['app']['login_password'] = "[hash]%s" % generate_password_hash( + login_password) + overwrite_cofig = True + + # 实验室配置初始化 + if not _config.get("laboratory"): + _config['laboratory'] = { + 'search_keyword': False, + 'tmdb_cache_expire': True, + 'use_douban_titles': False, + 'search_en_title': True, + 'chrome_browser': False + } + overwrite_cofig = True + + # 安全配置初始化 + if not _config.get("security"): + _config['security'] = { + 'media_server_webhook_allow_ip': { + 'ipv4': '0.0.0.0/0', + 'ipv6': '::/0' + }, + 'telegram_webhook_allow_ip': { + 'ipv4': '127.0.0.1', + 'ipv6': '::/0' + } + } + overwrite_cofig = True + + # Synology Chat安全配置初始化 + if not _config.get("security", {}).get("synology_webhook_allow_ip"): + _config['security']['synology_webhook_allow_ip'] = { + 'ipv4': '127.0.0.1', + 'ipv6': '::/0' + } + overwrite_cofig = True + + # API密钥初始化 + if not _config.get("security", {}).get("api_key"): + _config['security']['api_key'] = _config.get("security", + {}).get("subscribe_token") \ + or StringUtils.generate_random_str() + if _config.get('security', {}).get('subscribe_token'): + _config['security'].pop('subscribe_token') + overwrite_cofig = True + + # 刮削NFO配置初始化 + if not _config.get("scraper_nfo"): + _config['scraper_nfo'] = { + "movie": { + "basic": True, + "credits": True, + "credits_chinese": False}, + "tv": { + "basic": True, + "credits": True, + "credits_chinese": False, + "season_basic": True, + "episode_basic": True, + "episode_credits": True} + } + overwrite_cofig = True + + # 刮削图片配置初始化 + if not _config.get("scraper_pic"): + _config['scraper_pic'] = { + "movie": { + "poster": True, + "backdrop": True, + "background": True, + "logo": True, + "disc": True, + "banner": True, + "thumb": True}, + "tv": { + "poster": True, + "backdrop": True, + "background": True, + "logo": True, + "clearart": True, + "banner": True, + "thumb": True, + "season_poster": True, + "season_banner": True, + "season_thumb": True, + "episode_thumb": False} + } + overwrite_cofig = True + + # 下载目录配置初始化 + if not _config.get('downloaddir'): + dl_client = _config.get('pt', {}).get('pt_client') + if dl_client and _config.get(dl_client): + save_path = _config.get(dl_client).get('save_path') + if not isinstance(save_path, dict): + save_path = {"movie": save_path, + "tv": save_path, "anime": save_path} + container_path = _config.get(dl_client).get('save_containerpath') + if not isinstance(container_path, dict): + container_path = {"movie": container_path, + "tv": container_path, "anime": container_path} + downloaddir = [] + type_dict = {"movie": "电影", "tv": "电视剧", "anime": "动漫"} + for mtype, path in save_path.items(): + if not path: + continue + save_dir = path.split('|')[0] + save_label = None + if len(path.split('|')) > 1: + save_label = path.split('|')[1] + container_dir = container_path.get(mtype) + if save_dir: + downloaddir.append({"save_path": save_dir, + "type": type_dict.get(mtype), + "category": "", + "container_path": container_dir, + "label": save_label}) + _config['downloaddir'] = downloaddir + if _config.get('qbittorrent', {}).get('save_path'): + _config['qbittorrent'].pop('save_path') + if _config.get('qbittorrent', {}).get('save_containerpath'): + _config['qbittorrent'].pop('save_containerpath') + if _config.get('transmission', {}).get('save_path'): + _config['transmission'].pop('save_path') + if _config.get('transmission', {}).get('save_containerpath'): + _config['transmission'].pop('save_containerpath') + if _config.get('client115', {}).get('save_path'): + _config['client115'].pop('save_path') + if _config.get('client115', {}).get('save_containerpath'): + _config['client115'].pop('save_containerpath') + if _config.get('pikpak', {}).get('save_path'): + _config['pikpak'].pop('save_path') + if _config.get('pikpak', {}).get('save_containerpath'): + _config['pikpak'].pop('save_containerpath') + overwrite_cofig = True + elif isinstance(_config.get('downloaddir'), dict): + downloaddir_list = [] + for path, attr in _config.get('downloaddir').items(): + downloaddir_list.append({"save_path": path, + "type": attr.get("type"), + "category": attr.get("category"), + "container_path": attr.get("path"), + "label": attr.get("label")}) + _config['downloaddir'] = downloaddir_list + overwrite_cofig = True + + # 自定义识别词兼容旧配置 + try: + ignored_words = Config().get_config('laboratory').get("ignored_words") + if ignored_words: + ignored_words = ignored_words.split("||") + for ignored_word in ignored_words: + if not _dbhelper.is_custom_words_existed(replaced=ignored_word): + _dbhelper.insert_custom_word(replaced=ignored_word, + replace="", + front="", + back="", + offset=0, + wtype=1, + gid=-1, + season=-2, + enabled=1, + regex=1, + whelp="") + _config['laboratory'].pop('ignored_words') + overwrite_cofig = True + replaced_words = Config().get_config('laboratory').get("replaced_words") + if replaced_words: + replaced_words = replaced_words.split("||") + for replaced_word in replaced_words: + replaced_word = replaced_word.split("@") + if not _dbhelper.is_custom_words_existed(replaced=replaced_word[0]): + _dbhelper.insert_custom_word(replaced=replaced_word[0], + replace=replaced_word[1], + front="", + back="", + offset=0, + wtype=2, + gid=-1, + season=-2, + enabled=1, + regex=1, + whelp="") + _config['laboratory'].pop('replaced_words') + overwrite_cofig = True + offset_words = Config().get_config('laboratory').get("offset_words") + if offset_words: + offset_words = offset_words.split("||") + for offset_word in offset_words: + offset_word = offset_word.split("@") + if not _dbhelper.is_custom_words_existed(front=offset_word[0], back=offset_word[1]): + _dbhelper.insert_custom_word(replaced="", + replace="", + front=offset_word[0], + back=offset_word[1], + offset=offset_word[2], + wtype=4, + gid=-1, + season=-2, + enabled=1, + regex=1, + whelp="") + _config['laboratory'].pop('offset_words') + overwrite_cofig = True + except Exception as e: + ExceptionUtils.exception_traceback(e) + + # 目录同步兼容旧配置 + try: + sync_paths = Config().get_config('sync').get('sync_path') + rmt_mode = Config().get_config('pt').get('sync_mod') + if sync_paths: + if isinstance(sync_paths, list): + for sync_items in sync_paths: + SyncPath = {'from': "", + 'to': "", + 'unknown': "", + 'syncmod': rmt_mode, + 'rename': 1, + 'enabled': 1} + # 是否启用 + if sync_items.startswith("#"): + SyncPath['enabled'] = 0 + sync_items = sync_items[1:-1] + # 是否重命名 + if sync_items.startswith("["): + SyncPath['rename'] = 0 + sync_items = sync_items[1:-1] + # 转移方式 + config_items = sync_items.split("@") + if not config_items: + continue + if len(config_items) > 1: + SyncPath['syncmod'] = config_items[-1] + else: + SyncPath['syncmod'] = rmt_mode + if not SyncPath['syncmod']: + continue + # 源目录|目的目录|未知目录 + paths = config_items[0].split("|") + if not paths: + continue + if len(paths) > 0: + if not paths[0]: + continue + SyncPath['from'] = os.path.normpath(paths[0]) + if len(paths) > 1: + SyncPath['to'] = os.path.normpath(paths[1]) + if len(paths) > 2: + SyncPath['unknown'] = os.path.normpath(paths[2]) + # 相同from的同步目录不能同时开启 + if SyncPath['enabled'] == 1: + _dbhelper.check_config_sync_paths(source=SyncPath['from'], + enabled=0) + _dbhelper.insert_config_sync_path(source=SyncPath['from'], + dest=SyncPath['to'], + unknown=SyncPath['unknown'], + mode=SyncPath['syncmod'], + rename=SyncPath['rename'], + enabled=SyncPath['enabled']) + else: + _dbhelper.insert_config_sync_path(source=sync_paths, + dest="", + unknown="", + mode=rmt_mode, + rename=1, + enabled=0) + _config['sync'].pop('sync_path') + overwrite_cofig = True + except Exception as e: + ExceptionUtils.exception_traceback(e) + + # 消息服务兼容旧配置 + try: + message = Config().get_config('message') or {} + msg_channel = message.get('msg_channel') + if msg_channel: + switchs = [] + switch = message.get('switch') + if switch: + if switch.get("download_start"): + switchs.append("download_start") + if switch.get("download_fail"): + switchs.append("download_fail") + if switch.get("transfer_finished"): + switchs.append("transfer_finished") + if switch.get("transfer_fail"): + switchs.append("transfer_fail") + if switch.get("rss_added"): + switchs.append("rss_added") + if switch.get("rss_finished"): + switchs.append("rss_finished") + if switch.get("site_signin"): + switchs.append("site_signin") + switchs.append('site_message') + switchs.append('brushtask_added') + switchs.append('brushtask_remove') + switchs.append('mediaserver_message') + if message.get('telegram'): + token = message.get('telegram', {}).get('telegram_token') + chat_id = message.get('telegram', {}).get('telegram_chat_id') + user_ids = message.get('telegram', {}).get('telegram_user_ids') + webhook = message.get('telegram', {}).get('webhook') + if token and chat_id: + name = "Telegram" + ctype = 'telegram' + enabled = 1 if msg_channel == ctype else 0 + interactive = 1 if enabled else 0 + client_config = json.dumps({ + 'token': token, + 'chat_id': chat_id, + 'user_ids': user_ids, + 'webhook': webhook + }) + _dbhelper.insert_message_client(name=name, + ctype=ctype, + config=client_config, + switchs=switchs, + interactive=interactive, + enabled=enabled) + if message.get('wechat'): + corpid = message.get('wechat', {}).get('corpid') + corpsecret = message.get('wechat', {}).get('corpsecret') + agent_id = message.get('wechat', {}).get('agentid') + default_proxy = message.get('wechat', {}).get('default_proxy') + token = message.get('wechat', {}).get('Token') + encodingAESkey = message.get( + 'wechat', {}).get('EncodingAESKey') + if corpid and corpsecret and agent_id: + name = "WeChat" + ctype = 'wechat' + enabled = 1 if msg_channel == ctype else 0 + interactive = 1 if enabled else 0 + client_config = json.dumps({ + 'corpid': corpid, + 'corpsecret': corpsecret, + 'agentid': agent_id, + 'default_proxy': default_proxy, + 'token': token, + 'encodingAESKey': encodingAESkey + }) + _dbhelper.insert_message_client(name=name, + ctype=ctype, + config=client_config, + switchs=switchs, + interactive=interactive, + enabled=enabled) + if message.get('serverchan'): + sckey = message.get('serverchan', {}).get('sckey') + if sckey: + name = "ServerChan" + ctype = 'serverchan' + interactive = 0 + enabled = 1 if msg_channel == ctype else 0 + client_config = json.dumps({ + 'sckey': sckey + }) + _dbhelper.insert_message_client(name=name, + ctype=ctype, + config=client_config, + switchs=switchs, + interactive=interactive, + enabled=enabled) + if message.get('bark'): + server = message.get('bark', {}).get('server') + apikey = message.get('bark', {}).get('apikey') + if server and apikey: + name = "Bark" + ctype = 'bark' + interactive = 0 + enabled = 1 if msg_channel == ctype else 0 + client_config = json.dumps({ + 'server': server, + 'apikey': apikey + }) + _dbhelper.insert_message_client(name=name, + ctype=ctype, + config=client_config, + switchs=switchs, + interactive=interactive, + enabled=enabled) + if message.get('pushplus'): + token = message.get('pushplus', {}).get('push_token') + topic = message.get('pushplus', {}).get('push_topic') + channel = message.get('pushplus', {}).get('push_channel') + webhook = message.get('pushplus', {}).get('push_webhook') + if token and channel: + name = "PushPlus" + ctype = 'pushplus' + interactive = 0 + enabled = 1 if msg_channel == ctype else 0 + client_config = json.dumps({ + 'token': token, + 'topic': topic, + 'channel': channel, + 'webhook': webhook + }) + _dbhelper.insert_message_client(name=name, + ctype=ctype, + config=client_config, + switchs=switchs, + interactive=interactive, + enabled=enabled) + if message.get('iyuu'): + token = message.get('iyuu', {}).get('iyuu_token') + if token: + name = "IyuuMsg" + ctype = 'iyuu' + interactive = 0 + enabled = 1 if msg_channel == ctype else 0 + client_config = json.dumps({ + 'token': token + }) + _dbhelper.insert_message_client(name=name, + ctype=ctype, + config=client_config, + switchs=switchs, + interactive=interactive, + enabled=enabled) + # 删除旧配置 + if _config.get('message', {}).get('msg_channel'): + _config['message'].pop('msg_channel') + if _config.get('message', {}).get('switch'): + _config['message'].pop('switch') + if _config.get('message', {}).get('wechat'): + _config['message'].pop('wechat') + if _config.get('message', {}).get('telegram'): + _config['message'].pop('telegram') + if _config.get('message', {}).get('serverchan'): + _config['message'].pop('serverchan') + if _config.get('message', {}).get('bark'): + _config['message'].pop('bark') + if _config.get('message', {}).get('pushplus'): + _config['message'].pop('pushplus') + if _config.get('message', {}).get('iyuu'): + _config['message'].pop('iyuu') + overwrite_cofig = True + except Exception as e: + ExceptionUtils.exception_traceback(e) + + # 站点兼容旧配置 + try: + sites = _dbhelper.get_config_site() + for site in sites: + if not site.NOTE or str(site.NOTE).find('{') != -1: + continue + # 是否解析种子详情为|分隔的第1位 + site_parse = str(site.NOTE).split("|")[0] or "Y" + # 站点过滤规则为|分隔的第2位 + rule_groupid = str(site.NOTE).split("|")[1] if site.NOTE and len( + str(site.NOTE).split("|")) > 1 else "" + # 站点未读消息为|分隔的第3位 + site_unread_msg_notify = str(site.NOTE).split("|")[2] if site.NOTE and len( + str(site.NOTE).split("|")) > 2 else "Y" + # 自定义UA为|分隔的第4位 + ua = str(site.NOTE).split("|")[3] if site.NOTE and len( + str(site.NOTE).split("|")) > 3 else "" + # 是否开启浏览器仿真为|分隔的第5位 + chrome = str(site.NOTE).split("|")[4] if site.NOTE and len( + str(site.NOTE).split("|")) > 4 else "N" + # 是否使用代理为|分隔的第6位 + proxy = str(site.NOTE).split("|")[5] if site.NOTE and len( + str(site.NOTE).split("|")) > 5 else "N" + _dbhelper.update_config_site_note(tid=site.ID, note=json.dumps({ + "parse": site_parse, + "rule": rule_groupid, + "message": site_unread_msg_notify, + "ua": ua, + "chrome": chrome, + "proxy": proxy + })) + + except Exception as e: + ExceptionUtils.exception_traceback(e) + + # 订阅兼容旧配置 + try: + def __parse_rss_desc(desc): + rss_sites = [] + search_sites = [] + over_edition = False + restype = None + pix = None + team = None + rule = None + total = None + current = None + notes = str(desc).split('#') + # 订阅站点 + if len(notes) > 0: + if notes[0]: + rss_sites = [s for s in str(notes[0]).split( + '|') if s and len(s) < 20] + # 搜索站点 + if len(notes) > 1: + if notes[1]: + search_sites = [s for s in str(notes[1]).split('|') if s] + # 洗版 + if len(notes) > 2: + over_edition = notes[2] + # 过滤条件 + if len(notes) > 3: + if notes[3]: + filters = notes[3].split('@') + if len(filters) > 0: + restype = filters[0] + if len(filters) > 1: + pix = filters[1] + if len(filters) > 2: + rule = int( + filters[2]) if filters[2].isdigit() else None + if len(filters) > 3: + team = filters[3] + # 总集数及当前集数 + if len(notes) > 4: + if notes[4]: + ep_info = notes[4].split('@') + if len(ep_info) > 0: + total = int(ep_info[0]) if ep_info[0] else None + if len(ep_info) > 1: + current = int(ep_info[1]) if ep_info[1] else None + return { + "rss_sites": rss_sites, + "search_sites": search_sites, + "over_edition": over_edition, + "restype": restype, + "pix": pix, + "team": team, + "rule": rule, + "total": total, + "current": current + } + + # 电影订阅 + rss_movies = _dbhelper.get_rss_movies() + for movie in rss_movies: + if not movie.DESC or str(movie.DESC).find('#') == -1: + continue + # 更新到具体字段 + _dbhelper.update_rss_movie_desc( + rid=movie.ID, + desc=json.dumps(__parse_rss_desc(movie.DESC)) + ) + # 电视剧订阅 + rss_tvs = _dbhelper.get_rss_tvs() + for tv in rss_tvs: + if not tv.DESC or str(tv.DESC).find('#') == -1: + continue + # 更新到具体字段 + _dbhelper.update_rss_tv_desc( + rid=tv.ID, + desc=json.dumps(__parse_rss_desc(tv.DESC)) + ) + + except Exception as e: + ExceptionUtils.exception_traceback(e) + + # 重写配置文件 + if overwrite_cofig: + Config().save_config(_config) diff --git a/config.py b/config.py new file mode 100644 index 0000000..9d3a7f2 --- /dev/null +++ b/config.py @@ -0,0 +1,193 @@ +import os +import shutil +import sys +from threading import Lock +import ruamel.yaml + +# 种子名/文件名要素分隔字符 +SPLIT_CHARS = r"\.|\s+|\(|\)|\[|]|-|\+|【|】|/|~|;|&|\||#|_|「|」|(|)|~" +# 默认User-Agent +DEFAULT_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" +# 收藏了的媒体的目录名,名字可以改,在Emby中点击红星则会自动将电影转移到此分类下,需要在Emby Webhook中配置用户行为通知 +RMT_FAVTYPE = '精选' +# 支持的媒体文件后缀格式 +RMT_MEDIAEXT = ['.mp4', '.mkv', '.ts', '.iso', + '.rmvb', '.avi', '.mov', '.mpeg', + '.mpg', '.wmv', '.3gp', '.asf', + '.m4v', '.flv', '.m2ts', '.strm'] +# 支持的字幕文件后缀格式 +RMT_SUBEXT = ['.srt', '.ass', '.ssa'] +# 电视剧动漫的分类genre_ids +ANIME_GENREIDS = ['16'] +# 默认过滤的文件大小,150M +RMT_MIN_FILESIZE = 150 * 1024 * 1024 +# 删种检查时间间隔 +AUTO_REMOVE_TORRENTS_INTERVAL = 1800 +# 下载文件转移检查时间间隔, +PT_TRANSFER_INTERVAL = 300 +# TMDB信息缓存定时保存时间 +METAINFO_SAVE_INTERVAL = 600 +# SYNC目录同步聚合转移时间 +SYNC_TRANSFER_INTERVAL = 60 +# RSS队列中处理时间间隔 +RSS_CHECK_INTERVAL = 300 +# 站点流量数据刷新时间间隔(小时) +REFRESH_PT_DATA_INTERVAL = 6 +# 刷新订阅TMDB数据的时间间隔(小时) +RSS_REFRESH_TMDB_INTERVAL = 6 +# 刷流删除的检查时间间隔 +BRUSH_REMOVE_TORRENTS_INTERVAL = 300 +# 定时清除未识别的缓存时间间隔(小时) +META_DELETE_UNKNOWN_INTERVAL = 12 +# 定时刷新壁纸的间隔(小时) +REFRESH_WALLPAPER_INTERVAL = 1 +# fanart的api,用于拉取封面图片 +FANART_MOVIE_API_URL = 'https://webservice.fanart.tv/v3/movies/%s?api_key=d2d31f9ecabea050fc7d68aa3146015f' +FANART_TV_API_URL = 'https://webservice.fanart.tv/v3/tv/%s?api_key=d2d31f9ecabea050fc7d68aa3146015f' +# 默认背景图地址 +DEFAULT_TMDB_IMAGE = 'https://s3.bmp.ovh/imgs/2022/07/10/77ef9500c851935b.webp' +# 默认微信消息代理服务器地址 +DEFAULT_WECHAT_PROXY = 'https://wechat.nastool.cn' +# 默认OCR识别服务地址 +DEFAULT_OCR_SERVER = 'https://nastool.cn' +# 默认TMDB代理服务地址 +DEFAULT_TMDB_PROXY = 'https://tmdb.nastool.cn' +# 默认CookieCloud服务地址 +DEFAULT_COOKIECLOUD_SERVER = 'http://nastool.cn:8088' +# TMDB图片地址 +TMDB_IMAGE_W500_URL = 'https://image.tmdb.org/t/p/w500%s' +TMDB_IMAGE_ORIGINAL_URL = 'https://image.tmdb.org/t/p/original%s' +TMDB_IMAGE_FACE_URL = 'https://image.tmdb.org/t/p/h632%s' +TMDB_PEOPLE_PROFILE_URL = 'https://www.themoviedb.org/person/%s' +# 添加下载时增加的标签,开始只监控NASTool添加的下载时有效 +PT_TAG = "NASTOOL" +# 电影默认命名格式 +DEFAULT_MOVIE_FORMAT = '{title} ({year})/{title} ({year})-{part} - {videoFormat}' +# 电视剧默认命名格式 +DEFAULT_TV_FORMAT = '{title} ({year})/Season {season}/{title} - {season_episode}-{part} - 第 {episode} 集' +# 辅助识别参数 +KEYWORD_SEARCH_WEIGHT_1 = [10, 3, 2, 0.5, 0.5] +KEYWORD_SEARCH_WEIGHT_2 = [10, 2, 1] +KEYWORD_SEARCH_WEIGHT_3 = [10, 2] +KEYWORD_STR_SIMILARITY_THRESHOLD = 0.2 +KEYWORD_DIFF_SCORE_THRESHOLD = 30 +KEYWORD_BLACKLIST = ['中字', '韩语', '双字', '中英', '日语', '双语', '国粤', 'HD', 'BD', '中日', '粤语', '完全版', + '法语', '西班牙语', 'HRHDTVAC3264', '未删减版', '未删减', '国语', '字幕组', '人人影视', 'www66ystv', + '人人影视制作', '英语', 'www6vhaotv', '无删减版', '完成版', '德意'] + +# WebDriver路径 +WEBDRIVER_PATH = { + "Docker": "/usr/lib/chromium/chromedriver", + "Synology": "/var/packages/NASTool/target/bin/chromedriver" +} + +# Xvfb虚拟显示路程 +XVFB_PATH = [ + "/usr/bin/Xvfb", + "/usr/local/bin/Xvfb" +] + +# 线程锁 +lock = Lock() + +# 全局实例 +_CONFIG = None + + +def singleconfig(cls): + def _singleconfig(*args, **kwargs): + global _CONFIG + if not _CONFIG: + with lock: + _CONFIG = cls(*args, **kwargs) + return _CONFIG + + return _singleconfig + + +@singleconfig +class Config(object): + _config = {} + _config_path = None + + def __init__(self): + self._config_path = os.environ.get('NASTOOL_CONFIG') + if not os.environ.get('TZ'): + os.environ['TZ'] = 'Asia/Shanghai' + self.init_syspath() + self.init_config() + + def init_config(self): + try: + if not self._config_path: + print("【Config】NASTOOL_CONFIG 环境变量未设置,程序无法工作,正在退出...") + quit() + if not os.path.exists(self._config_path): + cfg_tp_path = os.path.join(self.get_inner_config_path(), "config.yaml") + cfg_tp_path = cfg_tp_path.replace("\\", "/") + shutil.copy(cfg_tp_path, self._config_path) + print("【Config】config.yaml 配置文件不存在,已将配置文件模板复制到配置目录...") + with open(self._config_path, mode='r', encoding='utf-8') as cf: + try: + # 读取配置 + print("正在加载配置:%s" % self._config_path) + self._config = ruamel.yaml.YAML().load(cf) + except Exception as e: + print("【Config】配置文件 config.yaml 格式出现严重错误!请检查:%s" % str(e)) + self._config = {} + except Exception as err: + print("【Config】加载 config.yaml 配置出错:%s" % str(err)) + return False + + def init_syspath(self): + with open(os.path.join(self.get_root_path(), + "third_party.txt"), "r") as f: + for third_party_lib in f.readlines(): + module_path = os.path.join(self.get_root_path(), + "third_party", + third_party_lib.strip()).replace("\\", "/") + if module_path not in sys.path: + sys.path.append(module_path) + + def get_proxies(self): + return self.get_config('app').get("proxies") + + def get_ua(self): + return self.get_config('app').get("user_agent") or DEFAULT_UA + + def get_config(self, node=None): + if not node: + return self._config + return self._config.get(node, {}) + + def save_config(self, new_cfg): + self._config = new_cfg + with open(self._config_path, mode='w', encoding='utf-8') as sf: + yaml = ruamel.yaml.YAML() + return yaml.dump(new_cfg, sf) + + def get_config_path(self): + return os.path.dirname(self._config_path) + + def get_temp_path(self): + return os.path.join(self.get_config_path(), "temp") + + @staticmethod + def get_root_path(): + return os.path.dirname(os.path.realpath(__file__)) + + def get_inner_config_path(self): + return os.path.join(self.get_root_path(), "config") + + def get_script_path(self): + return os.path.join(self.get_inner_config_path(), "scripts") + + def get_domain(self): + domain = (self.get_config('app') or {}).get('domain') + if domain and not domain.startswith('http'): + domain = "http://" + domain + return domain + + @staticmethod + def get_timezone(): + return os.environ.get('TZ') diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 0000000..0624add --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,320 @@ +# 【配置注意要符合yaml语法,:号后有1个空格,不能使用全角标点符号】 +# 【最新版本已经可以通过WEB页面对所有配置项进行配置,推荐使用WEB页面进行配置】 +# 【文件转移方式的说明】 +# 目前支持的文件转移方式:link、copy、softlink、move、rclone、rclonecopy,link即硬链接、softlink为软链接、copy为复制、move为移动、rclone针对rclone网盘挂载(rclone为移动、rclonecopy为复制) +# link要求源目录和目的目录或媒体库目录在一个磁盘分区或者存储空间,Docker运行时link模式需要直接映射源目录和目的目录或媒体库目录的上级目录,否则docker可能仍然会认为是跨盘 +# softlink模式注意宿主机的源目录映射到docker容器中后要路径要一致,否则可能软链接成功但无法在宿主机使用 +# copy模式会直接复制一份文件数据 +# move会直接移动原文件,会影响做种,请谨慎使用 +# rclone需要自行映射rclone配置目录到容器中,或在容器内完成rclone配置 +app: + # 【日志记录类型】:server、file、console + # 如果是使用Docker安装建议设置为console,通过Docker管理器查看日志 + # 如果是使用群晖套件建议配置为 server,可将日志输出到群晖的日志中心便于查看 + # 其它情况可以设置为file,将日志写入文件 + logtype: console + # 【日志文件的路径】:logtype为file时生效 + logpath: + # 【群晖日志中心IP和端口】:logtype为SERVER时生效。端口一般是514,只需要改动IP为群晖的IP,示例:127.0.0.1:514 + logserver: 127.0.0.1:514 + # 【日志级别】:info、debug、error + loglevel: info + # 【WEB管理界面监听地址】:如需支持ipv6需设置为::,如::无法访问可改为0.0.0.0 + web_host: "::" + # 【WEB管理界面端口】:默认3000 + web_port: 3000 + # 【WEB管理页面登录用户】,默认admin + login_user: admin + # 【WEB管理页面登录密码】:默认password,如果是全数字密码,要用''括起来 + login_password: password + # 【WEB管理界面使用的HTTPS的证书和KEY的路径】,留空则不启用HTTPS + ssl_cert: + ssl_key: + # 【TMDB API KEY】:需要在https://www.themoviedb.org/申请,必须配置,否则无法识别媒体资源和重命名 + # 以下地址需要网络能够正常访问:api.themoviedb.org、webservice.fanart.tv + rmt_tmdbkey: + # 【使用TMDB服务器域名】:api.themoviedb.org、api.tmdb.org,如api.themoviedb.org无法访问可偿试使用api.tmdb.org + tmdb_domain: api.tmdb.org + # 【TMDB匹配模式】:normal、strict,normal模式下如使用文件名/种子名中的年份无法匹配到媒体信息,会去掉年份再匹配一次;strict模式则严格按文件中年份匹配 + # normal模式下会提升识别成功率,但也可能会导致误识别率增加;strict模式可以降低误识别率,但可能导致很多文件名/种子名中年份不正确的无法被识别(特别是剧集,需要是首播年份) + rmt_match_mode: normal + # 【设置代理】,themoviedb、fanart、telegram等将使用代理访问,http和https均需配置,可以是http也可以是socks5、socks5h(remote DNS) ,但需要带http或socks5前缀,两项可以配置为一样,留空则不启用 + # 示例:'http://127.0.0.1:7890' 'socks5://127.0.0.1:8018' 'socks5h://127.0.0.1:8018' + proxies: + http: + https: + # 【本系统的WEB的外网地址】:需要是外网IP或者域名,需要包含端口,用于微信/Telegram信息点击跳转,如不需要可配空 + # 示例:http://IP:3000 + domain: "" + # 【UserAgent】:可适当修改,用于站点签到、豆瓣数据抓取等 + user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" + # 【登录界面壁纸】:themoviedb、bing,设置为themoviedb时需要配置TMDB API Key时才生效 + wallpaper: bing + # Debug mode + debug: true + +# 【配置媒体库信息】 +media: + # 【媒体库管理软件】:emby、jellyfin、plex,需要在emby或jellyfin或plex区配置详细信息,用于下载检查控重、媒体库展示等,建议配置 + media_server: emby + # 【媒体库数据同步周期】:定时同步媒体服务器数据到本地,单位小时 + mediasync_interval: 12 + # 【媒体库电影文件存放目录】:支持配置多个目录,不同的硬盘需映射为不同的根目录,以更于程序区分 + movie_path: + # 【媒体库电视剧文件存放目录】:支持配置多个目录,不同的硬盘需映射为不同的根目录,以更于程序区分 + tv_path: + # 【媒体库动漫文件单独存放目录】:支持配置多个目录,不同的硬盘需映射为不同的根目录,以更于程序区分 + # 如果设置了该目录,则所有动漫电视剧都会识别为动漫并存放在该目录下,否则动漫电视剧会识别为电视剧并存放在电视剧目录分类下;动漫电影仍然在电影目录分类下 + anime_path: + # 【无法识别时转移存放的目录】:如有多个磁盘,需要对应配置多个目录,否则跨盘无法硬链接 + # 注意:如果你在sync区域配置了未识别目录,由会优先转移到对应未识别目录下,只有下载文件转移及sync未配置未识别目录时才会使用该目录 + # 未识别的记录同时会在媒体整理->手动识别下面出现,unknown_path只是硬链接一份用于备份,同时手工识别处理后程序也不会主动删除,如果不想要多硬链接一份,可以不配置该目录 + unknown_path: + # 【二级分类开关】:电影/电视剧/动漫是否需要二级分类,启用二级分类后会在电影/电视剧/动漫目录下按二级分类名建立子目录 + # 此处配置分类的策略名,配置文件目录中需要有与策略名同名的.yaml配置文件 + # 默认策略default-category分类设置可参考"default-category.yaml",分类参见README.MD说明 + # 如不需要启动分类,则该项配置为空 + category: "default-category" + # 【转移到媒体库的最小文件大小】:避免预告片/MV等影响识别,单位M + min_filesize: 150 + # 【文件名转移忽略词】:文件名包含忽略词,忽略转移 + ignored_files: + # 【文件路径转移忽略词】:文件路径包含忽略词,忽略转移 + ignored_paths: + # 【洗版开关】:如开启则则新下载了更大的文件会覆盖媒体库目录中已有的文件 + filesize_cover: true + # 【电影命名定义】:程序会按定义的命名格式对电影进行重命名;/代表上下级目录,{}内为占位符;占位符会使用文件识别出来的实际值替换;占位符外的字符会当成普通字符,直接体现在名称上 + # 电影占位符有:{title}:标题,{en_title}:英文标题,{original_title}:原语种标题,{original_name}:原文件名,{year}:年份,{edition}:版本(Bluray/WEB-DL等),{videoFormat}:分辨率(1080p/4k等),{videoCodec}:视频编码,{audioCodec}:音频编码及声道,{effect}: 视频特效(DV,HDR等), {tmdbid}:TMDB的ID,{part}:part1/disc1/dvd1,{releaseGroup}:制作组/字幕组等 + movie_name_format: "{title} ({year})/{title}-{part} ({year}) - {videoFormat}" + # 【电视剧命名定义】:程序会按定义的命名格式对电视剧进行重命名;/代表上下级目录,{}内为占位符;占位符会使用文件识别出来的实际值替换,占位符外的字符会当成普通字符,直接体现在名称上 + # 电视剧占位符有:{title}:标题,{en_title}:英文标题,{original_title}:原语种标题,{original_name}:原文件名,{year}:年份,{edition}:版本(Bluray/WEB-DL等),{videoFormat}:分辨率(1080p/4k等),{videoCodec}:视频编码,{audioCodec}:音频编码及声道,{effect}: 视频特效(DV,HDR等), {tmdbid}:TMDB的ID,{season}:季数,{episode}:集数,{season_episode}:剧集SxxExx,{part}:part1/disc1/dvd1,{releaseGroup}:制作组/字幕组等 + tv_name_format: "{title} ({year})/Season {season}/{title}-{part} - {season_episode} - 第{episode}集" + # 【刮削元数据及图片】:开启后文件转移完成时会自动生成nfo描述文件及poster海报,协助媒体服务器识别和搜刮 + nfo_poster: false + # 【实时刷新媒体库】:开启后文件转移完成时会实时刷新媒体服务器(Emby/Jellyfin/Plex)的媒体库 + refresh_mediaserver: true + +# 配置Emby服务器信息 +emby: + # 【Emby服务器IP地址和端口】:注意区分http和https,http时可以不加http://,https时必须加https:// + host: http://127.0.0.1:8096 + # 【Emby ApiKey】:在Emby设置->高级->API密钥处生成,注意不要复制到了应用名称 + api_key: + +# 配置Jellyfin服务器信息 +jellyfin: + # 【Jellyfin服务器IP地址和端口】:注意区分http和https,http时可以不加http://,https时必须加https:// + host: http://127.0.0.1:8096 + # 【Jellyfin ApiKey】:在Jellyfin设置->高级->API密钥处生成 + api_key: + +# 配置Plex服务器信息 +plex: + # 【Plex服务器IP地址和端口】:注意区分http和https,http时可以不加http://,https时必须加https:// + host: http://127.0.0.1:32400 + # 【X-Plex-Token】:Plex页面Cookie中的X-Plex-Token,如填写token则无需填写servername、username、password + token: + # 【Plex服务器的名称】 + servername: + # 【Plex用户名】 + username: + # 【Plex用户密码】 + password: + +# 【配置nfo刮削信息】 +scraper_nfo: + # 电影 + movie: + basic: true + credits: true + credits_chinese: true + # 电视剧 + tv: + basic: true + credits: true + credits_chinese: true + # 季 + season_basic: true + # 集 + episode_basic: true + episode_credits: true + +# 【配置图片刮削信息】 +scraper_pic: + # 电影 + movie: + poster: true + backdrop: true + background: true + logo: true + disc: true + banner: true + thumb: true + # 电视剧 + tv: + poster: true + backdrop: true + background: true + logo: true + clearart: true + banner: true + thumb: true + # 季 + season_poster: true + season_banner: true + season_thumb: true + # 集 + episode_thumb: false + +# 【配置消息通知服务】 +message: + # 【Emby播放状态通知白名单】:配置了Emby webhooks插件回调时,用户播放媒体库中的媒体时会发送消息通知,本处配置哪些用户的设备不通知,避免打扰,配置格式:用户:设备名称,可用 - 增加多项 + webhook_ignore: + +# 【配置文件夹监控】:文件夹内容发生变化时自动识别转移 +sync: + # 监控目录配置已转移至数据库 + # 【监控目录操作系统类型】:windows、linux。如果是windows,目录同步功能性能会比较差,会导致NAS不能休眠,除非是挂载的windows的远程共享目录或者是windows的docker,否则建议设置为linux + nas_sys: linux + +# 【配置站点检索信息】 +pt: + # 【下载使用的客户端软件】:qbittorrent、transmission、client115等 + pt_client: qbittorrent + # 【下载软件监控开关】:是否监控下载软件:true、false,如为true则下载完成会自动转移和重命名,如为false则不会处理 + # 下载软件监控与Sync下载目录同步不要同时开启,否则功能存在重复 + pt_monitor: false + # 【只监控NASTool添加的下载】:启用后只有NASTool添加的下载才会被自动转移和显示,关闭则下载软件中所有的任务都会转移和显示 + pt_monitor_only: true + # 【下载完成后转移到媒体库的转移模式】:link、copy、softlink、move、rclone、rclonecopy、minio、miniocopy,详情参考顶部说明 + rmt_mode: link + #【聚合检索使用的检索器】:builtin + search_indexer: builtin + # 【内建索引器使用的站点】:只有在该站点列表中内建索引器搜索时才会使用 + indexer_sites: + # 【远程搜索自动择优下载开关】:如开启则微信等渠道搜索后会自动择优选择一项下载,如不开启则需要手工点击进入WEB页面选择下载 + # 如没有配置app.domain或无公网环境建议开启,否则无法跳转WEB页面手工选择 + search_auto: true + # 【远程下载不完整自动订阅】:如开启,远程搜索下载不完整时,会自动添加RSS订阅 + search_no_result_rss: false + # 【站点每日签到时间】 + # 两种配置方法,1、配置间隔,单位小时,建议不要设置为24小时的整数倍,避免每天的签到时间一样。2、配置固定时间,如'08:00',注意要加引号和冒号。3、配置时间范围,如08:00-09:00,表示在该时间范围内随机执行一次 + ptsignin_cron: "08:01" + # 【RSS订阅开关】:此处配置RSS订阅检查时间间隔,即每隔多长时间检查一下各站点是否有资源更新,建议不要少于30分钟,单位时间为秒 + # 配置为空或者0则不启用RSS订阅功能 + pt_check_interval: 1800 + # 【定量搜索RSS开关】:打开后,每隔设置时间会通过站点资源检索的方式查询和下载订阅,单位:小时,配置小于6小时时强制为6小时,不配置则为关 + search_rss_interval: 6 + # 【下载优先规则】:订阅及远程搜索下载将按此优先规则选择下载资源,字典:site 站点优先、seeder做种数优先 + download_order: site + # 【搜索结果数量限制】:每个站点返回搜索结果的最大数量 + site_search_result_num: 100 + +# 【配置qBittorrent下载软件】:pt区的pt_client如配置为qbittorrent则需要同步配置该项 +qbittorrent: + # 【qBittorrent IP地址和端口】:注意如果qb启动了HTTPS证书,则需要配置为https://IP + qbhost: + qbport: + # qBittorrent 登录用户名和密码 + qbusername: + qbpassword: + # 转移完成后是否自动强制作种,按需要设置 + force_upload: true + # 是否开始自动管理模式 + auto_management: false + +# 【配置transmission下载软件】:pt区的pt_client如配置为transmission则需要同步配置该项,需要3.0以上版本,否则可能会报错 +transmission: + # 【transmission IP地址和端口】:注意如果tr启用了HTTPS证书,则需要配置为https://IP + trhost: + trport: + # transmission 登录用户名和密码 + trusername: + trpassword: + +# 配置 115 网盘下载器 +client115: + # 115 Cookie 抓包获取 + cookie: + +# 配置 pikpak 网盘下载器 +pikpak: + # 用户名 + username: + # 密码 + password: + # 代理 + proxy: + +# 【下载目录】:配置下载目录,自按分类下载到指定目录 +downloaddir: + +# 【配置豆瓣账号信息】:配置后会自动同步豆瓣收藏,豆瓣标记想看内容后,后台自动下载 +douban: + # 【用户ID列表】:豆瓣电影点个我主页people后面的那一串数字,或者使用豆瓣App个人信息中查看。可以配置多个,注意要加引号 + # 这里可以是自己的,也可以是别人的,比如填写几个大V的账号ID,实现热门影视自动下载 + users: + - "" + # 【豆瓣Cookie】:选配,嫌麻烦的可以不用配置,可能影响个别电影的同步 + cookie: + # 【同步天数】:同步多少天内加入的数据 + days: 30 + # 【同步间隔】:多久同步一次数据,单位小时,建议不要太频繁,避免被检测到后封号 + interval: + # 【同步数据类型】:同步哪些类型的收藏数据:do 在看,wish 想看,collect 看过,用逗号分隔配置 + types: "wish" + # 【自动开载开关】:同步到豆瓣的数据后是否自动检索站点并下载 + auto_search: true + # 【自动添加RSS开关】:站点检索找不到的记录是否自动添加RSS订阅(可实现未搜索到的自动追更) + auto_rss: true + +# 【配置字幕自动下载】 +subtitle: + # 【下载渠道】:opensubtitles、chinesesubfinder + server: opensubtitles + # opensubtitles.org + opensubtitles: + # 是否启用 + enable: true + # 配置ChineseSubFinder的服务器地址和API Key,API Key在ChineseSubFinder->配置中心->实验室->API Key处生成 + chinesesubfinder: + # IP地址和端口 + host: + # API KEY + api_key: + # NASTOOL媒体的映射路径 + local_path: + # ChineseSubFinder媒体的映射路径 + remote_path: + +# 【配置安全】 +security: + # 【媒体服务器webhook允许ip范围】:即只有如下范围的IP才允许调用webhook + media_server_webhook_allow_ip: + ipv4: 0.0.0.0/0 + ipv6: ::/0 + # 【Telegram webhook允许ip范围】:即只有如下范围的IP才允许调用webhook + telegram_webhook_allow_ip: + ipv4: 127.0.0.1 + ipv6: ::/0 + # 【Synology Chat webhook允许ip范围】:即只有如下范围的IP才允许调用webhook + synology_webhook_allow_ip: + ipv4: 127.0.0.1 + ipv6: ::/0 + # 【API认证密钥】:用于Jellyseerr、Overseerr中Authorization认证以及非客户端类的API调用 + api_key: + +# 【实验室】 +laboratory: + # 【识别增强】关键字猜想 + search_keyword: false + # 【识别增强】通过TMDB WEB检索 + search_tmdbweb: false + # 【TMDB缓存过期策略】:是否开启TMDB缓存过期策略,默认7天过期,过期缓存将被删除, 7天内访问过期时间可以被刷新 + tmdb_cache_expire: true + # 【使用豆瓣名称联想】:开启将使用豆瓣进行电影电视剧的名称联想,否则使用TMDB的数据 + use_douban_titles: false + # 【精确搜索使用英文名称】:开启后对于精确搜索场景(远程搜索、订阅搜索等)将会使用英文名检索站点资源以提升匹配度,但对有些站点资源标题全是中文的则需要关闭,否则匹配不到 + search_en_title: true + # 【使用TMDB代理】 + tmdb_proxy: false diff --git a/config/default-category.yaml b/config/default-category.yaml new file mode 100644 index 0000000..c5d857d --- /dev/null +++ b/config/default-category.yaml @@ -0,0 +1,219 @@ +# 配置电影的分类策略, 配置为空或者不配置该项则不启用电影分类 +movie: + # 分类名同时也是目录名,会按先后顺序匹配,匹配后程序会按这个名称建立二级目录 + 华语电影: + # 分类依据,可以是:original_language 语种、production_countries(电影)/origin_country(电视剧) 国家或地区、genre_ids 内容类型等,只要TMDB API返回的字段中有就行 + # 配置多项条件时,需要同时满足;不需要的匹配项可以删掉或者配置为空 + # 匹配值对应用,号分隔,这里是匹配语种 + original_language: 'zh,cn,bo,za' + 动画电影: + # 匹配 genre_ids 内容类型,16是动漫 + genre_ids: '16' + # 未配置任何过滤条件时,则按先后顺序不符合上面分类的都会在这个分类下,建议配置在最末尾 + 外语电影: + +# 配置电视剧的分类策略, 配置为空或者不配置该项则不启用电视剧分类 +tv: + # 分类名同时也是目录名,会按先后顺序匹配,匹配后程序会按这个名称建立二级目录 + # 如果有配置动漫独立目录,则实际上不会使用到tv下的动漫二级分类 + 动漫: + # 匹配 genre_ids 内容类型,16是动漫 + genre_ids: '16' + 纪录片: + # 匹配 genre_ids 内容类型,99是纪录片 + genre_ids: '99' + 儿童: + # 匹配 genre_ids 内容类型,10762是儿童 + genre_ids: '10762' + 综艺: + # 匹配 genre_ids 内容类型,10764 10767都是综艺 + genre_ids: '10764,10767' + 国产剧: + # 匹配 origin_country 国家,CN是中国大陆,TW是中国台湾,HK是中国香港 + origin_country: 'CN,TW,HK' + 欧美剧: + # 匹配 origin_country 国家,主要欧美国家列表 + origin_country: 'US,FR,GB,DE,ES,IT,NL,PT,RU,UK' + 日韩剧: + # 匹配 origin_country 国家,主要亚洲国家列表 + origin_country: 'JP,KP,KR,TH,IN,SG' + # 未匹配以上分类,则命名为未分类 + 未分类: + +# 配置动漫的分类策略, 配置为空或者不配置该项则不启用动漫分类 +anime: + # 如果你的anime_path动漫目录已经直接设置到了动漫子目录,则这个分类可以取消 + 动漫: + # 匹配 genre_ids 内容类型,16是动漫 + genre_ids: '16' + +## genre_ids 内容类型 字典,注意部分中英文是不一样的 +# 28 Action +# 12 Adventure +# 16 Animation +# 35 Comedy +# 80 Crime +# 99 Documentary +# 18 Drama +# 10751 Family +# 14 Fantasy +# 36 History +# 27 Horror +# 10402 Music +# 9648 Mystery +# 10749 Romance +# 878 Science Fiction +# 10770 TV Movie +# 53 Thriller +# 10752 War +# 37 Western +# 28 动作 +# 12 冒险 +# 16 动画 +# 35 喜剧 +# 80 犯罪 +# 99 纪录 +# 18 剧情 +# 10751 家庭 +# 14 奇幻 +# 36 历史 +# 27 恐怖 +# 10402 音乐 +# 9648 悬疑 +# 10749 爱情 +# 878 科幻 +# 10770 电视电影 +# 53 惊悚 +# 10752 战争 +# 37 西部 + +## original_language 语种 字典 +# af 南非语 +# ar 阿拉伯语 +# az 阿塞拜疆语 +# be 比利时语 +# bg 保加利亚语 +# ca 加泰隆语 +# cs 捷克语 +# cy 威尔士语 +# da 丹麦语 +# de 德语 +# dv 第维埃语 +# el 希腊语 +# en 英语 +# eo 世界语 +# es 西班牙语 +# et 爱沙尼亚语 +# eu 巴士克语 +# fa 法斯语 +# fi 芬兰语 +# fo 法罗语 +# fr 法语 +# gl 加里西亚语 +# gu 古吉拉特语 +# he 希伯来语 +# hi 印地语 +# hr 克罗地亚语 +# hu 匈牙利语 +# hy 亚美尼亚语 +# id 印度尼西亚语 +# is 冰岛语 +# it 意大利语 +# ja 日语 +# ka 格鲁吉亚语 +# kk 哈萨克语 +# kn 卡纳拉语 +# ko 朝鲜语 +# kok 孔卡尼语 +# ky 吉尔吉斯语 +# lt 立陶宛语 +# lv 拉脱维亚语 +# mi 毛利语 +# mk 马其顿语 +# mn 蒙古语 +# mr 马拉地语 +# ms 马来语 +# mt 马耳他语 +# nb 挪威语(伯克梅尔) +# nl 荷兰语 +# ns 北梭托语 +# pa 旁遮普语 +# pl 波兰语 +# pt 葡萄牙语 +# qu 克丘亚语 +# ro 罗马尼亚语 +# ru 俄语 +# sa 梵文 +# se 北萨摩斯语 +# sk 斯洛伐克语 +# sl 斯洛文尼亚语 +# sq 阿尔巴尼亚语 +# sv 瑞典语 +# sw 斯瓦希里语 +# syr 叙利亚语 +# ta 泰米尔语 +# te 泰卢固语 +# th 泰语 +# tl 塔加路语 +# tn 茨瓦纳语 +# tr 土耳其语 +# ts 宗加语 +# tt 鞑靼语 +# uk 乌克兰语 +# ur 乌都语 +# uz 乌兹别克语 +# vi 越南语 +# xh 班图语 +# zh 中文 +# cn 中文 +# zu 祖鲁语 + +## origin_country 国家地区 字典 +# AR 阿根廷 +# AU 澳大利亚 +# BE 比利时 +# BR 巴西 +# CA 加拿大 +# CH 瑞士 +# CL 智利 +# CO 哥伦比亚 +# CZ 捷克 +# DE 德国 +# DK 丹麦 +# EG 埃及 +# ES 西班牙 +# FR 法国 +# GR 希腊 +# HK 香港 +# IL 以色列 +# IN 印度 +# IQ 伊拉克 +# IR 伊朗 +# IT 意大利 +# JP 日本 +# MM 缅甸 +# MO 澳门 +# MX 墨西哥 +# MY 马来西亚 +# NL 荷兰 +# NO 挪威 +# PH 菲律宾 +# PK 巴基斯坦 +# PL 波兰 +# RU 俄罗斯 +# SE 瑞典 +# SG 新加坡 +# TH 泰国 +# TR 土耳其 +# US 美国 +# VN 越南 +# CN 中国 内地 +# GB 英国 +# TW 中国台湾 +# NZ 新西兰 +# SA 沙特阿拉伯 +# LA 老挝 +# KP 朝鲜 北朝鲜 +# KR 韩国 南朝鲜 +# PT 葡萄牙 +# MN 蒙古国 蒙古 diff --git a/config/scripts/init_filter.sql b/config/scripts/init_filter.sql new file mode 100644 index 0000000..044e6ba --- /dev/null +++ b/config/scripts/init_filter.sql @@ -0,0 +1,100 @@ +INSERT OR IGNORE INTO "CONFIG_FILTER_GROUP" ("ID","GROUP_NAME","IS_DEFAULT","NOTE") VALUES + (1000,'日常观影','N',NULL); +INSERT OR IGNORE INTO "CONFIG_FILTER_RULES" ("ID","GROUP_ID","ROLE_NAME","PRIORITY","INCLUDE","EXCLUDE","SIZE_LIMIT","NOTE") VALUES + (10000,'1000','1080p特效-bluray','1','特效 +1080[pi] +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10001,'1000','1080p中字-bluray','2','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +1080[pi] +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10002,'1000','4k特效-bluray','3','特效 +4k|2160p +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10003,'1000','4k中字-bluray','4','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +4k|2160p +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10004,'1000','高清特效-bluray','5','特效 +720p +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10005,'1000','高清中字-bluray','6','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +720p +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10006,'1000','1080p-bluray','7','1080[pi] +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10007,'1000','4k-bluray','8','4k|2160p +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10008,'1000','高清-bluray','9','720p +blu-?ray +[Hx].?26[45]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10025,'1000','1080p特效-其他来源','1','特效 +1080[pi]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10026,'1000','1080p中字-其他来源','2','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +1080[pi]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10027,'1000','4k特效-其他来源','3','特效 +4k|2160p','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10028,'1000','4k中字-其他来源','4','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +4k|2160p','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','1,30',NULL), + (10029,'1000','高清特效-其他来源','5','特效 +720p','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10030,'1000','高清中字-其他来源','6','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +720p','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10031,'1000','1080p-其他来源','7','1080[pi]','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10032,'1000','4k-其他来源','8','4k|2160p','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL), + (10033,'1000','高清-其他来源','9','720p','Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC|\Wsdr\W|minibd|[\W_]diy[\W_]|[\W_]3d[\W_]|REMUX','30',NULL); +INSERT OR IGNORE INTO "CONFIG_FILTER_GROUP" ("ID","GROUP_NAME","IS_DEFAULT","NOTE") VALUES + (1001,'洗版收藏','N',NULL); +INSERT OR IGNORE INTO "CONFIG_FILTER_RULES" ("ID","GROUP_ID","ROLE_NAME","PRIORITY","INCLUDE","EXCLUDE","SIZE_LIMIT","NOTE") VALUES + (10009,'1001','DIY典藏-4K-原盘','1','Mbps@Audies|Oldboys +4k|2160p +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10010,'1001','DIY典藏-1080p-原盘','2','Mbps@Audies|Oldboys +1080[pi] +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10011,'1001','特效典藏-4K-原盘','3','特效 +4k|2160p +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10012,'1001','特效典藏-1080p-原盘','4','特效 +1080[pi] +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10013,'1001','中字典藏-4K-原盘','5','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +4k|2160p +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10014,'1001','中字典藏-1080p-原盘','6','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +1080[pi] +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10015,'1001','典藏-4K-原盘','7','4k|2160p +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10016,'1001','典藏-1080p-原盘','8','1080[pi] +Blu-?Ray.+VC-?1|Blu-?Ray.+AVC|UHD.+blu-?ray.+HEVC','[Hx].?26[45]','20,99',NULL), + (10017,'1001','DIY典藏-4K-REMUX','1','Mbps@Audies|Oldboys +4k|2160p +remux','[Hx].?26[45]','20,99',NULL), + (10018,'1001','DIY典藏-1080p-REMUX','2','Mbps@Audies|Oldboys +1080[pi] +remux','[Hx].?26[45]','20,99',NULL), + (10019,'1001','特效典藏-4K-REMUX','3','特效 +4k|2160p +remux','[Hx].?26[45]','20,99',NULL), + (10020,'1001','特效典藏-1080p-REMUX','4','特效 +1080[pi] +remux','[Hx].?26[45]','20,99',NULL), + (10021,'1001','中字典藏-4K-REMUX','5','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +4k|2160p +remux','[Hx].?26[45]','20,99',NULL), + (10022,'1001','中字典藏-1080p-REMUX','6','[中国國繁简](/|\s|\\|\|)?[繁简英粤]|[英简繁](/|\s|\\|\|)?[中繁简]|繁體|简体|[中国國][字配]|国语|國語|中文 +1080[pi] +remux','[Hx].?26[45]','20,99',NULL), + (10023,'1001','典藏-4K-REMUX','7','4k|2160p +remux','[Hx].?26[45]','20,99',NULL), + (10024,'1001','典藏-1080p-REMUX','8','1080[pi] +remux','[Hx].?26[45]','20,99',NULL); +INSERT OR IGNORE INTO "CONFIG_FILTER_GROUP" ("ID","GROUP_NAME","IS_DEFAULT","NOTE") VALUES + (9999,'不过滤','Y',NULL); \ No newline at end of file diff --git a/config/scripts/init_userrss_v3.sql b/config/scripts/init_userrss_v3.sql new file mode 100644 index 0000000..1235aaf --- /dev/null +++ b/config/scripts/init_userrss_v3.sql @@ -0,0 +1,100 @@ +INSERT OR REPLACE INTO "CONFIG_RSS_PARSER" ("ID", "NAME", "TYPE", "FORMAT", "PARAMS", "NOTE", "SYSDEF") VALUES ('1', '通用', 'XML', '{ + "list": "//channel/item", + "item": { + "title": { + "path": ".//title/text()" + }, + "enclosure": { + "path": ".//enclosure[@type=''application/x-bittorrent'']/@url" + }, + "link": { + "path": ".//link/text()" + }, + "date": { + "path": ".//pubDate/text()" + }, + "description": { + "path": ".//description/text()" + }, + "size": { + "path": ".//link/@length" + } + } +}', '', '', 'Y'); +INSERT OR REPLACE INTO "CONFIG_RSS_PARSER" ("ID", "NAME", "TYPE", "FORMAT", "PARAMS", "NOTE", "SYSDEF") VALUES ('2', '蜜柑计划', 'XML', '{ + "list": "//channel/item", + "item": { + "title": { + "path": ".//title/text()" + }, + "enclosure": { + "path": ".//enclosure[@type=''application/x-bittorrent'']/@url" + }, + "link": { + "path": "link/text()", + "namespaces": "https://mikanani.me/0.1/" + }, + "date": { + "path": "pubDate/text()", + "namespaces": "https://mikanani.me/0.1/" + }, + "description": { + "path": ".//description/text()" + }, + "size": { + "path": ".//enclosure[@type=''application/x-bittorrent'']/@length" + } + } +}', '', '', 'Y'); +INSERT OR REPLACE INTO "CONFIG_RSS_PARSER" ("ID", "NAME", "TYPE", "FORMAT", "PARAMS", "NOTE", "SYSDEF") VALUES ('3', 'TMDB电影片单', 'JSON', '{ + "list": "$.items", + "item": { + "title": { + "path": "title" + }, + "year": { + "path": "release_date" + }, + "type": { + "value": "movie" + } + } +}', 'api_key={TMDBKEY}&language=zh-CN', '', 'Y'); +INSERT OR REPLACE INTO "CONFIG_RSS_PARSER" ("ID", "NAME", "TYPE", "FORMAT", "PARAMS", "NOTE", "SYSDEF") VALUES ('4', 'TMDB电视剧片单', 'JSON', '{ + "list": "$.items", + "item": { + "title": { + "path": "name" + }, + "year": { + "path": "first_air_date" + }, + "type": { + "value": "tv" + } + } +}', 'api_key={TMDBKEY}&language=zh-CN', '', 'Y'); +INSERT OR REPLACE INTO "CONFIG_RSS_PARSER" ("ID", "NAME", "TYPE", "FORMAT", "PARAMS", "NOTE", "SYSDEF") VALUES ('5', 'Nyaa', 'XML', '{ + "list": "//channel/item", + "item": { + "title": { + "path": ".//title/text()" + }, + "enclosure": { + "path": ".//link/text()" + }, + "link": { + "path": ".//guid/text()" + }, + "date": { + "path": ".//pubDate/text()" + }, + "description": { + "path": ".//description/text()" + }, + "size": { + "path": "size/text()", + "namespaces": "https://nyaa.si/xmlns/nyaa" + } + } +}', '', '', 'Y'); \ No newline at end of file diff --git a/config/scripts/reset_db_version.sql b/config/scripts/reset_db_version.sql new file mode 100644 index 0000000..9083322 --- /dev/null +++ b/config/scripts/reset_db_version.sql @@ -0,0 +1 @@ +delete from alembic_version where 1 \ No newline at end of file diff --git a/config/scripts/update_subscribe.sql b/config/scripts/update_subscribe.sql new file mode 100644 index 0000000..7f97acb --- /dev/null +++ b/config/scripts/update_subscribe.sql @@ -0,0 +1,2 @@ +UPDATE RSS_MOVIES SET DOWNLOAD_SETTING = null WHERE DOWNLOAD_SETTING = -1; +UPDATE RSS_TVS SET DOWNLOAD_SETTING = null WHERE DOWNLOAD_SETTING = -1; diff --git a/config/scripts/update_userpris.sql b/config/scripts/update_userpris.sql new file mode 100644 index 0000000..5b1e5b7 --- /dev/null +++ b/config/scripts/update_userpris.sql @@ -0,0 +1 @@ +UPDATE main.CONFIG_USERS SET PRIS = replace(PRIS, '推荐', '探索') WHERE 1 \ No newline at end of file diff --git a/config/scripts/update_userrss.sql b/config/scripts/update_userrss.sql new file mode 100644 index 0000000..7fc540c --- /dev/null +++ b/config/scripts/update_userrss.sql @@ -0,0 +1 @@ +UPDATE CONFIG_USER_RSS SET PROCESS_COUNT = '0' WHERE PROCESS_COUNT is null \ No newline at end of file diff --git a/config/sites.dat b/config/sites.dat new file mode 100644 index 0000000000000000000000000000000000000000..1301d4366371ad4151e1a2571a394dd9ab0fd136 GIT binary patch literal 562159 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 #JLv&=TOeI zR7&1Tx}wT!sRU)l|7+~Z8mdC}22IX~Q}e~CKPpfF08YK7z<2;f33}{Bw^M#uUeB>b zp%QN?b3}uUx=w&wCx~0U6es`yxB4hB9zYVeKHIKa@hfYHIXH|)PlQ`1id(}KC;$Mr zMk+8KKoYk;=XPs=9YV*}gv!(*@S@d|;MYmw*F*&h0Kl&z1;ztN;@9Wf^~Ey&*T zvuSk!{8}J>%~7BL0Q{P#z<2;j{Q8R9uYtC|Tw4+$V&xK=JsFOjERHQzpa1|ITdu%( z07)GCg4;0;q+Um-;+J08 zIQb+5gR=4R3G`*JtWZ8JkWa_UCy^j2n;@S+8TQI1$|rDz+pglad})_e)1Fy+ZVSkq zrRLI0t81FHlzdBRL%Jo?*jQKEQk(HwN|{E_3WE1O3MbG`F;%^K^eF4Geb?>^vjrbl z%cr!d2|l*quaR_5h@$WzCUcacP|9tDK&Hfz9Z0Iq(5YhD!XEZ-ee)dWj>y2AmRPqz zG8SYl9NFU4d6hUUxw~~gkDTOZTD#P(dZE}-oV=CrZ^PWNmC7Ak3EjOmo$ac{y8?}n zwDm1^%nER{RtRb9I|Kr?$Tm%~7H@>8Elq}q+Gx%}9gN&eN|sKUuh2F~I(~IZ^ECp? z0W23D);9D9cFpRf1&kuc*xyz?odgtDbu^rMtH(Q5J zM_@I8)#%vxQ9fkP9j?LM=12Z!BrjwQE@aKW!nwl@Z6@#roxmHCpF0$iFeh+|9dIrt z@VPRy(+F$;umM2)(B_gq_v75*d0EqoY3V#zI!{cWM&Nt^=Q~YDB9tuU*`}s(DU49i zvcvz#GO{+fB~s>iy0I4b#9HxdB7t=P*2ywbL?B=}$M;cJo;wWjQ`2Ah%B>~G% zbxzJMJ$JY{+nr5x$C6>;Uo!zA!(QZGJPxt*fx?#!KRK&(;#DO-A6S{a`**PyDsi*> z74~i<5GX~)-&Bz&r!*OQa-zAUPfp>HbN}O=w0$v#L>S-ZY64a%61V)d1Vkya(*5M@ zlJkLEvW`AZH@3hHzp&$z1gZhJ3p=)>rF6iGX{+#K%6yKFS>;D`=@$qXcxq%7d5J)v z#TY-}hl^qM4$;klk?FLnLN^DX!4-Bq?4yUdry9sw(Bvl z^>RM&WdaQV8r^fH!{-B=1KZ{;T55)+W?Xg`oDa;Xv7SvfEX=@I#%-)q=L0WMYlCR* z5?H&$ZLQhSr%?$(gM3`1s*_LwOgv&*1#cA03%rwCjQ;BwKB zpGx2g09TaZ^j|T7D*;?thVyW<2)q-(JLMaJ+S^qCu1a1j`W<>F6|u#4;7)>PuKC!F z8uHg>yKps~y%tw{t@Ov)1g-;copj+E0@nk$UiJ`!4%!7^SMmY(Iy>;4qeeiwQ>9I3ubBh_~$KOcB28sRJAHjde?c(&e(<w*a_BLcs zF>MNjZt^8-H@9C}`#ss~{RDk|4}5)(T+L$y?f`Iya~vXFxD-wDwBVPxF{UT%{zO2} z&mF-)N6*gyBIfa-96n?N1Dfp`x&SpwStAPR$eGJzHVh?G1tfZekl0D>7D>?5!P074GzFA&%X z08b9joJrtn09YwKQ$^qg0JzUQ^9X_40bn4K-nOTra;47>PL$X#Mv+cRGzumk`G zB59MM!-3~jeM@!8CDq-fhWQr` ztsWQr9|DKwals+m>|4RXIxaYd_Vl>mSOOhCF8CHZSdR-1Vv~AYa5RC=92X4Tk*jVG z^1glTX&+^V1P7@0?S6XCi;qY7)S=^o^XQWv7o4vEj|-ltz@b%M`xx;5x7T|OnY0iL zOZPqh@jWlzx$mYMqL&*w>vuLUM$h`KQGjRt)+%rS3T^x8cd2gD&{DeR=8x@t;gP6! zq4R#_w5{j;E>?i&{VEjbRK4wj^&1K;tFLs=O%J_(&#tIjp~HTSG^&UFniSw+zh(tG zRdyR3wL+g=Te|NvFT8fs^HHxtXZ+qtn|j9YDg}7P?-~XES5@CGO_pnK%E%Kan`-~< z0ja$`n|-RO_Ol4&R|9B0D5-X3nV6^P)#2LPZEA0SgB_!_x4%i?c)b4{?~J=6d!BN( zDzxW`<{WR~k%&EX;O-^b2HywA>F^TpWdeZ`t@$beyeEP8JDx3%#GF z7t+#9SehxOPa!Z1z$~Zf$li%uO?dAFm%_ahwCwOdvW$ez*^HwbRw5UE6%qhr53D`x zj7%T^;vPE9xr}sS)gj1Qr310^9KuFY@G+CPPn7 zG?(g=_Hm1KGOXXDb&c3)b@Q|;%dsiSG?9GE)CZR&8Uy}MKG>oH_D(le7dX13Ni zQtd?qwAT1!0#;ZSiS%g%tgtLn%OwP?uxu#Rz7d(^jma~~>-0{Vz!rs+3C~>fu^UtE z7iPP#jLu$&tG!TC?Pn3#3}CaQ+E)=k$!w4!L#g(10OiR$Xp?r(8EjE#ps?%epu?&5 zPNdqa(c9rjwOS+9>g1_*p*Qkj+rTl~g22?LH#QNd2H>VQ9*|UfP1cQFv|0nJH4;$W zNT3!#Er9s=De}4~R~CL<#AWey5iL6!iM%d~L@)!rO1fcLsdA=`fUr_4B-LI`pb~)3 zs;wme1y!i1A{5+807uf$#m?xuom6{CyQ%h2?M;-l%$DpfsF+cho>91^u^}_VFVfk5 z@;y|)`{VRJ;Eb9_3Dn_o>Toj2e3F1=Bf5qv(#vDf%gn}qfqQ3Kzx$5_w0`&71STQ- zEGP6#0pk@d=slLeG<*Xu_nx_sz-$0`ea1KtmO%D=LyIuEX4Yr z`8NV8#QS>!XW|aGll0D(im=SaKgk{qj=h=B5$Jez?%y!0soD7dCZO5)-x1Jk{2vHt zHvW$UG#fvYZfQ3DaRSM!bN9+*s6JHoO?CKlw;2N~5ibU1y*QR$*kt?=&x|E77+wr68}9HT(qun0$*J)t4n#lj zQjQc>$pAK~+4)ff2I3nq?6A=q*;($xzHZy~p*}dWaLf0wW;{du-cliAuAz z9%aq@0ts!5L!&0rv!U$p3fj`_@EHmWhj8bp1jYwhYnv z0aq(948Spt?vF%yay#45!LE5Du;y85SYQ0rR|q&-uwJqp`Qop=<&%iNT4`9R0v#Vx z#>>FA4pPoY(%U|yvHAgCrfRHyNP!WMR87+91!{jk?tBTc7|4E{7FA32Q3Z~Hbn4i) zy%96*N2&`QnF66y?sGJ)+NsYgFbcWd;}ZBXXz!yB?fdMzKu8G>2L&u6_kTzm^(!=` z+NfVsU<9O46AgvhZZi}v^C9)q@6(#9pZ-vRV<2{#WEcj%{>c0GK6m}zyB@^V2MdtP zw4~m72mFebRMzxW1%@JDesqFfKYGst550c(uD#Daw&&fSg7t*gAJQ-VJ#DIf=^F}+ z2BlzJ0w;#IaU#hL5Yj6BCk?7rX^-tTYMFosz=ULv06PM&-}`Wa5m1Ie$_%6>)gv9O zz))zBBpHE$dhhLNy}rG{59y8`OG~OdI#z+95I;#`y1%{S64(u~4N^3t(xTH8u+pM! z7U7s>r@!sz1a?E}q4Q}*)k9BIz^aF~Z+GCHTi^BCW1qkfConxFJI|KUl4^vWuE0?6 zDO_D0dC1B0Bm9sXqYpV>{KkLCfegckoG*UkKjbjs`H(A=PreL}FMi|epHC3Xm%;JH zZ+saXU;M_G!I4*MD}w_z2xV|U18F-esi_fJXN4=u75Z?%%>5sr!$%6+KTO{#o20${T^856%h{% zZxzngt-{&P=Uik+MH!J>g*UN30tSbAa)Hbi7 zZHOvaYRh#5psfUI3%1>M5s;$5v)tQmqeLLDxwc7&x8+-!J+FLAW3zV&UPtXad`L%U zVq_38kQMl!Y^~uByty_+Z>YJrT>lYlo}x#VyWvde4GVkJ(AZp`u8aCI*5ymQ6H3`I zpQjT6W5bc?i|$4SW!!IWQz_QbeUa+0?(c=GzFu}&w$g0qH*7bcP5a%3DpZ#(x+2=y zD$i%W$?Jq77F4lZyD2$>F*${>N5*z=Xj`?n-_wzMbU`rODf45xV0jkU)cy$p;aQxF z6{XEXh|6kp+aPoga@{J-*$tjGRaO-IueKf=UEy`5SGq0}eH|6L3!}n)bZHS>5@L#Z zoxmvoPQg5K_?U*?kZp0Ni zC`MQMTwL#mhg=E04!o{^ALB#Xjhu~x@oZSt`YY6i#R zVqWbz=z8I1mx-3Y*Jcn;?c>JKW_S*aCeY;~uWn-IB*{Gwk(fPs@x%%_7qw-N+Y@q99 zK1N_8MrEUOR3ejHnhZ^HG?#ReZ@_Qz5po}GZ$QtBzL~k7za9jh}Y=#j~6zAxT4H1+qH%yt*jcP5(|O ztVkEU`UQb^yO~}2yG#cn3kKCJxroqVuvkoj=W9z9kp{zVV}zw3AV3|;d8z_MQELHVPn`6&Ll$vkBL@-h6e+C1$4{J8(~ z5&5~jBGmMpaMQ2M@&D^g)4ncDSu$+jw?`jZa1kwX z-N9950A!M1RaWz>k}X1Q0xdeP>d@!)3AdnOQ)5GAU2Wx7Xpn^8l=~5G`{L3jT<-7E zKOTn_Y|p2k!q2@QxKV!I^&o!kyXMn^-?%I8)#h>xT6l50To<>?%ci!C3S832m!T0Z zZr5>~F2h=OnLO8b5x5+{<<7+|H=K@n5RNX|h$}0q$AuMD;kt@e;>t}q-LsB5MM7N zumivj;q+ZWAdqJ>?+-J8Ufz%Cj8y{*UEY4G zfnBGU_d~XL9WD>8Ixa7AR~MrJn~O15aVx4ASpjT5qck;vIRLP;i?cuklxO%20w>@b z*pBqf4+)$E0GorT^+I4F0PMth=1l^N0bmylB~KW@EdhYND3sYHpiIPZ1Xkc1*vA1S zo`6akZ6u&f#Cr*xi(kRpiD$k|K#7MxBd{6YKw$2f|0JMH#3AfaRWLe@z*hVUo`WDS z5>UaS9RyUL=(7agiC@8u2PPSTYXM-Wl1}nz7$)YQn%RNVkW4}X$1_(Fm;nG|m$bm){b$}J&=&ysW}cbJELZ^mB+oq4 zM8~HBz|}Y$=XxRq09uc%$h1_}ppt@;9{cY3#7FmjIIKQ2I$%6PeJJ>PNoC#k3J2-2 z9jYUC_AJ+NAoFc4KHIUiZ@rhPX@pO`s=b(vXd&HkRW82NM&|u6GyBOwt5O0WG-5Gx zZI(wOb7|6_s+Jmr<{Xo}HHQwVWX>=TvIWClGrDFB_;>PY93Hf6+$^Ja2TO!#4ehB2 z(K!Sx?=dmWu`jNGQ)C)jP!Xaf1eE5un!te)A-dBkLS#vOrPL;htiMCE_lcoTDnhhX z0g4dSD{xRnh~67q+!5o*iz8J%d*G(3BG*U@^acl1sLs5x|(0!cN8 z-WNFMs;{1G&ml$9ZR^MJ?@RkK@FhUjVnhn5V{f6}YN zGDK};h~8$$s0>lhoi58>`X2%yV1Yl1SHr&(KxESmGDOqZH(+;xQs~SX zce@PHeEJE-nUx_rfdGhSR)**#0^pzhYs(O=;D!93l_9!-9iTEq7ZT`t8KP~pq%uS; z1OgIU{KidW59&b65UrydIH`!&Q|yhMOF(6a&LeP0$PnE@XH%VNMc)ntFLt<{=rPKhQB8O|~*b ze*|!6&mKs>;XgU?WNB-NO5WmEEp5%ktjSHL_s)2if~0kC8^R~jzvW(Cx~avh0wJ@p zIZN1-e@RzW`FPP4VJc_t?|{7NAB1e#G^Hx{U%a{&FZbVq_QE95hQ=N63CD0P3p6j) zEGC~ZG)U|hx-vBD! zIW%@~^oSPITELcakfOunC^xAS+^ERLq0qbhjZRZWQ-}44lJf|LB1=}%)ZAD;XJ%7n zrmAsAL%>q#LMnkU1#Q~VY~+}!9?=B^RF7yA0o5ZaC!l&nl>`o)9?^Mh@n1rZ=qfs^ zdPG+fP(7k+2pl*)qAS^=@Z1jT5oI+5f~piQD#QMi{;9?+33C`at4DM{$4vEz9wcyZ z^@u)0tExxzB7uN779Rsf-W!GO73MBOeUUlYhLL)02e$?yZ+vYwI0cB4MFf6vw%VZYIRoXEwC@C}@~ zW=hW<5gXgo#@}dT8*FTI+K42_LPAP^;@+bQDWw?ptB}%M0xG1moPY``okKu{lx`=W zLP{Sdpah4<2&j(ZC*RQ|!B^^MJtP0Fkw z+_$Q+K3&_eyH#ljIlqThrMqYd%P(s~Ls&uJ(4-+;NbmB~5F$%Phy}2OEhr1%0s;XG zApS|0_!#zN*+|P&UmBdh4*wOhSS6WD>uRfOGSOG2!B`jVLF^WKWEGtTJNX=TPa&Yz z2^EH{n9!+!5$R1e&EA$P7fmSTEmsP%UCt&j?}8Faorvc<*u!lvCdlSap1M|EYGW~!G{T(F=P_!ZmMjAq~M|n)i`tkZg2cetU@v7Eqc{X z4!6xA(6Czz_RFn_Tei%^e=f&V&c*b++&&zGq^+a75*|k(0XPy6r-C&}*~}>r08?Ny z$J>iEpkgd$5FM5rG8%C-knB8$bvOEsAc7(O5~}V_hr830yDO|!yEk||-JJ$^(TKy{ z$n-8i17s(^lebO*f>kWXo_U5~Kw5t>SG0`c^T3S27vDg3d>=R02~0;PM<#fXJnZ&?D)J+h}7D2)u{{z|to$ z1OTo#X_FyF?}=TqGK%?kW2xt_2Dglk68wm^qUl+bQ+zRt``=u+ZOCUj_ z;c~yzmaZsSd&ZiOLTN$3*X4H;#K)}>K~iPu4q1$o`Spvkil6&I)UDx2_QOr;6Lk%N zu8NQ&^IM}=2d*&Vj61NW9|EP4ZAA9)EehJN@cZo7m&DUuO z@|1pb?zm6$gr#kb#k{dZ7EcX}Q|1SBAc%|2j|e~#6SA1jurFV1ItUwm=}OT}@-IJ$ zM^bc=!}BT~u)#5gXD@*<@Mw(Nqevi{qf#&!K1rl1^Hz=}n8Rm#9Y+O}{OD}Xs#O^TkSQu&Y5OU(WB|es8 zS@oA37uPJb~tzHiqjY^mSTRK|*sZEl+~wNp8!oglpUDt!iwL zA&UpIML;+;c|a%uunh=j)8Q1l35_^b!Oq36Ga~NJ zfV(r2yDI^(b@z0-E37s&;&3-I`E;izW$xr$ldT>s+@AR=0Vo7wMPM|( zfyKl#e;}Zn;63OTqGU`jd}APi;{o8__sl2)69M3s^vomzMF4QO;8+%cDF84Uo>@j9 z*d~u(6(ZL<0G-8v_6GVHoUSo<5C|gNgiVG5+D&Xh1KQ05G@vafpaE@~fCjXc1T>(% zp1@HEXyL2lAs!BBgF|5cYM@c=KyCv2ug9U#_P8Ll-LV7Pfp(+V|IL!d=4wZr8?V8i zC*mz)!!4y&jK8!NBL0__ZrkoP?<`Fo2aDJ~A7Jn14Pe7wFmY}t&>wey|KtbOq{+~M zH8kg#H<374j=K5xl4+&sK(XGju=Taq9&C&9$lmesUDK4V_DV04pI1PNz6GVzGdPqS zxuGQ#<_-NxdLgR#12O&0rwGUmJqRM8@i%nh@cgJub8vq|pK7unX}60%ORGaMRfl#` zxAO=@|B)CXU7W$*a-=6h2c^DA7a&Y-w`adizy^TMa4TF>Hz%%{jOT2os+eh3dBpQ$ zI=t@&jhnvB9;yb2qNx8cj5ryJ34cnTG$#Bx0UHy#PF%L;iBc208CG7f`|S}=L$Tt2 z(lLz{|BFC7v0}dH^?2K(+qOdrqF5+Jb&Y9>nIIF$zvK?Q!^=?M_*Ximf#cr@v=cby zk7!3*KesoDe_j=CJwMZqTOhx(l17&)bL5q|;iWl>K(OuUn3wGdP<7Nb-RVr3qv=Vo z)oDf%2m(WgYmUv~0^3;k0Og^HX58nQ|&~9?x=e>t=Vl~m%(f_HnoGHZ z-aO&<2y4-QI%>2Zy~ga0;zF8~9mQ#Gldd?M_F5XGVvGMu5!p=G~-ak?2YU?J*u*aK>njDks@hj*N$LL3TLvkhzTVLR%>G|NV5y*c&IMQV3 zJ?v_>pzmSV643Xs>j~(4*bM~qJ?tg|Div}w0hJ1Ql)wPIm?7r&%<}{S0#E!*2*0WI zsi|t&n&s*A-Sfc1`yPHi^l~;dcscXGSW@pfUdXy!ALOSTXH7f&oPd4*az(3=l*pzla2$Y%Z5K0Ydqh~q z`tF;uqBoNHwe_&Tz-ik^pfZ0%=8|Y>xmE88t~4xjF>3vWLaSX;3MG@*@7a}t_8b0~ z8ok`mOYl-&jH-n!Q-EqArzcn{6|DE+#qDoLuAU5SzT8h2j>W2VtgKoO zC{O?ZPJUE@(EyS-`Jp%`kJD*vJJL>O_fjJTlDM)yNe{HZ-ct$`AejgspHW~mfFwTN zyFWg<`Z2`3dx;)s1->sSPypf$eEf<6qXD>ljI92$<^{E7cdQb69Cf*F5My`g<7f9kW)4ZT2-IB_|WtTLDj3}F9 zcC+|*^h&r*g`M0iK34e~RbD1tTjy)wEv~Iv6i?I4e{9)xILpN_7Sdao%P~c{98;2W zIb?H;T#nvX*)VD{s2h{9b7cAwm;zu5fcWu?#M{zjXgdPUC4FHHZ4>^3qomt}ZxgWF zgy3@Yq<2D1ob2A8806D6%B#FB>FubD}Fwv6BR*WsBO7A0k)@uiUe)TK}G&Ge7--V9FQ|! z?bm-Q)gd{H7a|*0rOv}t(RY&&t+_zw^I}w3PBx3%$VJE3!KnFeObv{Aa6LSM=jjBV zm%O-&?2~ZVen7)+22>?!TnvOi#vb%ov$%aeedktE4EI<*zW(BuI%A8L(X5pTgC4OB% zU^al+LJ7N&K(G}UzsTiFf#q94ax#gIgwjb_ci%^6R59iK1Qx*E1@6h2H|>S$cJ-Sq zZ42iJN`qvV$hF2js`}cmMqdRMX8nAKZY_jc3#D5hCa?&=BDbHNRNsk=^x~{b&(MR# z@L;jH^c(@J;o?ldwwLlcI;ZYhNW~>zk&}>O%a`efDz*;DHZb@0zp->_;n`| zTuGCm;0nzp4X)0}j`XXveFnzy3_K~#UIJ2;tjrxtIdZU)6~@87Esb?`jXOf@1XSRO zL{O^(FHHZdZMeA_HdmuZ;!{?w?qqCkxgS(RiWpm?#zxYZ)WTZhHkKz5n`tRZYk2y>w&e9DGgjXa-C&gl z!b&#rgIIP%%>8sk>wsXy{rk&V@}@l7g%xzR9G71%{ZUEaVgMIQ4V)?hX#i>2YY952 z0zgIbq_Ng3GZ(W(R7HSIX9penMRCRk-7QmE|W0?3q)MZ4FvL6|H^$O>Y$+9)~p*Jq}8o>`ukcY z_Y$ZBP={qZ{^=iiJ(4T4i->(ak}702?SqybjYNXxDm21f)OXO0D%{dlGD$8cAWAWw z6vnxdz!m_0#j>jiR0HrUmR&=j20*Plc8Hdj&Y?R_%L%h*i&&z+t>^FZ$&Xlx8F^Yk zVWwh+Pkqe0y%zso-g?ZYS6_JF-fKU+=cb2Weev$ScRlm^T~Gb)h4*ict6ABMjtk$M z&HBFHj3ube5V~&8ZP~lxYwWpgxCyr5CNSS1&()gxg-K&5CNBycjmffrP)`~*~+<|P8EP4hhh%kV3B{qfAN2&@Ev zC>ceddGV_NAY%2*Z~|uoKvaqIt_02jfWQx_T>|R>AUyNT2?VtG&P4>Y*3P8_D)B3r zlb-n;fqDQKnYK5XONvI0-jnO{-|TY$*zU$5+P@Mw9smX+X_FzY%eP4aP_D~&2`Ja) zWdh1|`91;Vy8MuUo;es!w*n@M`3-?_;JUzhho7OGeQWP|vzw&Ew4?y=hy9xh&kPHA zErR2KR;JsCEi#RI}?si#lMYiUq`yp|>f^6^?C4-93GWXU6r_r`e2$N^+O2uG2@$PK(0ErfHU z0xX1cvjRmpTznAN50Yr5cX!dYa$DY~0J$yiS0HI6oLK5jL6%-%i3QP}*buqpAsSV3 z%f}QTx#i;uBqg_Wka80uvOG(hN@RIX0TNlBSKxnD<(raZm2dnK$1vyi|Pd}E3` zb#|!c-?Nm6GkGDF5;4&64tfaX--S95exEPZ_xaM~`FA-&!_B76>;SELQ%<1ktKMX2 zNskg;LLmQ9qR0l5Tupd`375hRCOK8qW{bo1_8Fp|Y@i!TKRKU(rJo?DcmaV!qUz0i z>5Py8=E!V)AAz|5=DH_mzWnYlJF4D1Mcc~Zc!og0;V{n;I2nW1ja6^<(v8J%!)HvqM&OXEdh;e7Qx3(S2v`mU zR*}CDScYp^=G-|wT=q8+K~3n}Gznqu5O!+P0JvFcbO_5Xwo{7Q2~7 zOJ%Us<;8C1)7Zf&cC&=m&c>ykjoIM{mOIWzI45{SnbkCP4oscnHg%Yf&||fEq-T#F ztG8EV=@bW(k02Bh@)0iNm}#+_%>=aA%|!&X*i8iiEq1eoz=11va{*gihdT+Lxo+BS zWI$Z4LU!&N~M>%F%?B-(x4sNlV&(f+E zyZJnUfF}|ErWbi#+@dqUW)eDE?B*W2p~Y@KNT34uxL@q%UILW>{9-rv5wH{ngo5`I z5DLQ<_rBDD7`ir6#-*JS=i8^Q}{a-O@0bc!65BQM~u+)7lbiRldIl_+om z0hOCxNkEwc>j@}xU^fBPjkuqH7O{DPfHDVOC7?usHwY+Epck)Ii`b+HoQVWIB1g~6 zC7?xYP9?A!-#`H7nX?G20e~>cGv^b~A~x?Nphax%CZI)ZenG&X4ctne`7MEfC}93d zpb_7|$Rypn2^F#V4M#;XvK~UEF~~!SSrc z*wcjaJPl_v#%eZWZ1QY|oUms$<1@VWF(4z3!L^$g35*3Gg=FGm#0c3$nhdcM(VXK| zE;2G9afhd9+X_{}nP&*t(mM$Io+BWNkz?FpUmhvT$ZeBAvT__Qj*;CSI$#r|aB&|2 zd;qx19zIAe@Qz}mQM>=bUPQ7}!nRiK#9+3f)?4^Gr*_gfv zuD4mrUEEet`{v#AH(vZC+$-^2!JF)6W%@2Wa#ceb8Ve*Wudg@Ps+SW+kyI} z`4a(1L4yM+`^N+%ojl2X_q2CdaAcIl+^%e=)~-pJNxSUR+@^xjX_E=0;Fjn|#&=pf zX9YXrl29ZTP637%M3+1Lw$#?4MoCMqL=nlHeOj98YK7aG zy?IluJuinmapawJW^nsb8fm7kgEPyHZrg*dJ6Tf0ypxyna)TtUSwSGkwZ;#MAKV07 z)RBHIEw7>6t4lYvcva<1>E@Q00s*rEvt~1m1o_)GGmtlZWws7K1py)+eMBOMo(ct5_s zuj0wWf&Q7Q7=>^-DbBs+PtZQ{oXB+!&mO~C1Yl9}V^}BaP(8vHgY2o}it_9WyK4XH zX>#)g+E|R+VX<>dqxH}{>J^EjP7C@jWxmM^I}I0hnjHA~HUXPj9qU*k_HX-XSzyon zl&#yeYzMcWdTbvSt)YCn+Sp4QLCP@xeu#9+U^Kw(r)EC1AaE+af!hF5umqL@z(9HCRRX~#SNsDm(xU^=qdas{ z#oh?m^rneG#|vGY$QE?#XaND;I$B6Tw~kIBpj$_$640%q3IfRsUG!<%o=G?ACQ;wl zZoluf+pY`Ar|Jfg95OMP?Im8-_L9nm1RF%DJUc`|eGOk=3fAhqOid$-t@o<-GEsiG zD4y~GKK+I^8$`tfx@v={wJ&0ubUnhjUQ^e?Q_94)_Rp5wi0mO970gAmgx(#jvnH!) zPtTg1O`zjvO;T(j*akDF640|IXAuZyNBsPX5+(OvMD-Xes#>^o9Lbq1$gXas{;9sorI6W=t+mRGOvM$%Nwc-_dfd2zR$kPr8eDA`0DfT-}}@PE+0duS#G2UdYa`X1$dg}76p#O zX_f;d{aSX!=G`eY=i2aZjX%-z-az`$rDr-at7p2iFprvPXgBQvUY{OKc~Ai!O?gOx zBIvFrInQ%f;AdDbG^=%4xUy{hd4+qQdu-3UKZP-R?V(*bLK9sdLnl?9q6>ObnUt=C%L=~Nw0p1KB)BSmldG&>Q@yQ4e3>vl4RJ+yW_m{ z6*)bTthH;#0}s7^_pUrW8QP-zK0Q$V)gLH8{nZ~SkW_zFRhYxW9r7_})o}G=NPhKI zdZ6;FdlaDj>OKXM%CE*s*p9|%`-`saz|Xw!+D*^DcJnp+?)hZ&ZVV}}zDetN7#g@56>lGnkI>}u~DZ8)K_t9=xp>}o#+lFF{e>eosKhDJB9f3ow< zaAyRqtK{lP1t__Ci~{*2SHlw}R=QR?@XR%3YYX?@_2BFGK5Uh1T_YSS88nIJkAt@E zaiXnTq(A`xypc^&U^IXvGx@P#CPyWn2a3eASLjlA4sBo0rP*#B2im*q+mFqM-NkmAK3O@eFbu2tMM7Xw0gB?*5D() zverk;hR~Nb;pV?C0uktRba5;W)7zKq;Vp>t|i z(zc#cyNZB4r-l^CH3TF%k#g_+=F5e4L|&CE@&2omh7M*uOV{;a)~5*sd-}1fMn$Bj z^>mb7$>eZU!ri9Ok*H76c91?XPY}=}QBM(Q=Sb86Jy|K42fG#iV_Ju}iZ7WOe}%2x zbFxy?11a+={S5L0W)A^-RtxiK9|60m?@YiRswXS6`GU82AvRy&+(yll+dhCAwLNdL zAz+YEFue!_=bPduQ)|9Fcc;(DNydR8U;*7xZQ5Z3+R>&>l(LGGw9KXr#?#VbKW)&- zyiQ!gN_XwU>+U zkZ|vc;F?qBY`P&Qk3{U&oI_wGfR)b2b34g+r&nRJ30I`nd=kTFWtl3WB8~}2{DSo+JA zC`vx4fcSgkA?o{pB5v+nf0J zLHK*soSAZvSrBTnzB0%EuT!G0gVAzLx^7FGrhn1H|F2U``%a(G*6F=l{Qo-BvMc=^ zI$Cun$48G=y_bMJT6K(P?jm51RzbM*9s>4g)v=zrmw>9n21=$@9X7Gl>$>1RGIy}W z19P-0_at$JuK>8dAU zzl`XSY2K1GrdJO21Da4InM<{*Zt@H-snPj|s@Rp(^)6+0Ln;Ns&@R zvHGN0zH$6{pz7?k{gZxG!>?-byvNNpysiOI=92{UXv_}@ zsD|dR2q^R5j|7xx@HPP@8Vsi6sS`oM`P;f zXCXv2;k?7o(C&BZk@dA((+%l{TID?SSyfw>ZU|8xMg(VKg0Chk8k>jiFn(nt>dvn7 z(#@4Mi!Fly?B$Lfky*(J)ejS@pTtaO66h)hM1h>%V zpiY<6r>h&hOmSUp!`9**&FQ9Se<>@$?4o@XV8y8w=WA=8O`2pbSc(|2maNzxC4d0|9)+CFR>+S@&J0ZEddI-e)jP4!}chQK$-N?-tqKR&23rZ8c zj=)gF5t#L!xsAYZ0GMxhbt7;z0LgKhPZAgnK+>A#c>-eqNKVsyg@7_ke?lN&md3AZ z5ywMp%xbm}@XbsMfsV5=Pi6}mtt=v-(aK^18m*j0K%+$cd;>#zr_ak8jDOM&{eTW=h&Dh(z}Dj z##}~w%EnwypyO=Jacm)oxXgS4%EnwmAebHT^D93aGZZi%5asWS=#x?~%M~C6Gp#^A z3T9*%va`zH%Hs?ZvW9~T!(#DysA3^*=N^Gl}F53Nwj>;H*)9spVYTcSwd`NA>r^fK*95vlE&FG*9UOf(|4sn8(|l^#2{(~bt%s{YgW1#- z6rr=Qy!jj3Dbwp#8;zcYo$a%rP-A)%SOs8}lrru^U^Rf%QtP=tfwKXeE!B?)5dZ}Y zG_X)L=yL#^lU!w^Ojq5WY*8qL@XWDYo@{qNm%5Rs4s z6}^{(O+=EK+k97B#csX`yrYZc_2_H@bV-qY6!sA%v{2n2d6=4}FJq75vto|()J zR1(vv1kT4daJPA;fxyK8Fc3+*Sk69^v-C4|vC8?rMxf(zz9ZOzW&w{Tpjp6C1T+hH zECI~|jwPU3z>Nfyv-A@J$>n_egRitR-B2B>2Hbbgt#|Ex>XuMi@aP~ds9#PfH8c1*0*7X1@cZ=cU}Xk>L3^4R{3U^oX9k~V3z`{xnSf>n|D8a4nZZDwI8cA> z9WQ7+D`(Aa!LxNsV{^T*w3-*xq+6m(dJJDg^LOU2bWX?zL;sbJ)ry2f_*m^IJyts^ z`LSBz3^8ID{4N_$AA|{;Ps>qsPT*R0 zK%f+Cwh{>PHSt56>;Hgl+r8$UB6-|U9mvME_JU4#lvFALyfl3kEd_}na}9yujDEc7 zh~|Y{jeWfjG?W7wR-`e`Bids@ib0p^rgo!QxT0U#$ zOrZ|v5??J%w>9sXoo25*(8|kEIqs9mTv#<7r|}|pnPfS_6K}3gyt!q^w!O<-O2>1u zcmG$}3v=+G^sAqKoxofGbCW+grOD8f6U{jmvB(>tXgBkg|2%Ea#E{ICTmFj#Y@!Lb z{FewwqG^u%mhY0pK&U3`8+2nn+?X$pzDXcR`^2vq2kV@$=7>_J$GdH06eNkv5d;>% z^#!sy(VIY!*>Sjj_?+-=NC-j0NAg2_bR5mDTa3A~SZ;$+1WpBTYVye=O@<~9noBx) zG-Z}DLuuRQ%y8yqIDu0z(u>`5rNc?jCBeis^Jyu_J~_gd&SWC9`oc?SEJ$QIjCCp# znN=EIO=~vY;><*LJfAC7S#1z_0ZpyMc!}14WresWPq-Sb4W@X5^lu06| zmVnLdAdzDT*vt;nGz|o7W(SFjW&$>|6H4UR%ueDwg{niCEo@Q5A>f(oPD*r4qiYg5 zl2c(9zMIajLl>@-#MW&DY-R^tcsl``*$E|bY-T5M2d&kqb}L(4iw=TaR|g&XiJY<6 z-7jfsZY&o82ifY^zs%l_x-VgYkpYbj^^MzGJmdwMcee>k+q?+&cg3a0ASx~9{|fQv z0{$;9QkCpWI8wbxBh`z_ijzjFo6!g#woh=(Hsjg4Ssu1e5eU*m@qtV3D`E#v$(Lu{ z_y(<(!;Nxra85~};m#3PRb5d}&oT}8bss2ILs*)h- zxEn_-kaEmZMzbP&g}GZ;2XZ^|7Qu50>HZtu7rS=sr)Aa%}EX6wQ34#E&y4-z;J0PZZ${1<^V01SlV7Kyy% zg(NKh%uQ_NtoP!z=I5+Onhc$z{}h|loYWHpG$-{G0nJH0LqKy<&k@j^)LR6CoK)WB z~2Cy zQ%zI2y5!_^UEQL_hROC{7p?JqoW9OKYCpLtUF|KJIk~a9%4@FJxd=`sE;MlBZT96- z6IcrfbX5W?a#%Eb%zhqC2dN!L^t@lk>??3wzD3T|w|JGA+QtSX3vuQitCfG?zOk<4 zl3H&^aSOH^{gd}~wIz}TDwf0fJEOV=1W+=E`$)9{0SxIXBICr{?cnR-6x8`wKqxw45scT}#drfroRs3j0c4w$V3 z_M>uTn2Iw}$Tm6j4Sy>!a;K}vzPXzQZ92*Mo|tFb*I_d!Ty&@mgbwOINI&$T{zC-X zIjEmcWuUERbA3&Q+(6dhnI^bW<|#T7WVp;T1jZn+8ROpT%_|`=w9P=pi3l7QL@VYc zS`2bkj^)U)`O?-_9Orzz+WHP{Ar{1`eD@8};(1u(gDNc{I#^qCaYfp)r|N%7b8@Qw zc(=Jc8!&C{#c4xM)XUpPdp7Ukygb(yOj~1dq=?I%n=md(29lz_&{ zvj}LcJcoeB%I6YDuHw*ddsAIwx+*K<(C^#;(7Nlsh{J-?Qhv3hE>qQAA`Y84lp5)7 zCeT%pZs$ZCn(5uaqH0}9drH-MCxMPrwa#Y?K|F7o2q;zSast8Rh@V~uK*XW1tMrpF zv$*~8K02f74R>ESdXJ6G4$CyOk!dJq$EZw0 zDS_^gX_!pg!JDN?5eQh2W*PxJobt&u98h{`_I2%iT5sodt$XOD`l6RIRrE7>(=#3c zTm1(4g=zxwYBj~ZYjCKF2T1KA`;NGs7h?4s{srizQqn%WrC6$4ilxcvrBb%>?on1Io=E?gzb8IBhh2FD=bPdeG;z-A7;+fLY1&g>p6Fe4!K~@`aG@?A4>E zFPM+!6DJPkjh>O~)$~V2G_EC}wTZ4L&`xclJR6Rk)t;D>b@vN&W)3E$Pgs13fE9b_ z9-e848u(qhqtw8c30P{N)4xNEXDY<9@C;m}GjLIIp6Nm~!fCLVy|55>{X*RJ<~0I~ z04#D&gUAUDY0{qtHqbiQz0R_+;PhcrrUn)G)i39@Pp5t}>Fwc}cQy~U&^2}q`sQ|?Z z1iC|jVkT{?0L5$qD=^Y4-E+l}>c~}Qj!Se1-Ok1_=hBi06qI2)IQF_b!!uo_#?myl z3dUBsjpa#m4HQz*nU?Ql(@>)B#E zdKigvPhG<^y%2Z3jhf9T>8ve4g#LJpfGt1-p6RCuK%xOM4I!RsIe_xyiYnO>MUS#Y zVc5a0YpNaQnFh!8YKEd#bEXS6=VHnlO8HnzdWHm8lq-63bT zNvNH~_a;rOZy=y)^9ll*Hg6%IA}{YGpdv4yBcPS4zD+>svOgz~rOWaTQ-PM_2q;~) zgn+VR*AY;GmU04TffIlr&@)>JtOkHM%`-a)tO0;%$}`szP)(PQ6VSp`Um_4_x|jj% zbAvW;Z+T`cfd&8=Y|l&~&;$S@lXT98WMGbF_oxia1OgqGfmzKAhSCVu5KtPyS^`QV zSWiG{1RDq_jo=Of0p-?=pr6TQVEQztn^C1QC=StQ?P+V5tOyZr3j*S;|Gkn-BPi%z zLuF%?e`dVTx$93aJ~5ix3vrFNa5VJ7YY6Ct8v=Uabp(P7&-(!JnZ&)T>T9wL;(<1` z_u9>m@3|*j%wv-Bob@5hj=MGSUJ63+{241kTC2k_nRcwjK zx|!t#Uq{mckHGP^lav=cj)E>yY^$ZQ*)oB%CAadiem_P}4g~ABFw6Q4jasRAR9;(E z`mad)eUaUxwBOGW=nmTNGqgPfPr@Pcw119((te*OFcjYy=8j=BEc^Gfpl6M;^Ue2+_)NXcK}e-)>j!Lcv#f3lR={*rxr-5F%9 zZMiPfhrs@leRISea%*<`rQwACi>F1SPq0td?Y=P*2r2zHWrooS&C-q_V6(KYw}{pb z?~-N3WD04?ipe8gaNAnPMR#@KaoglnA_+fD(b< zAfQCxo;0dN-~s~rzA}!09`Bn*K#%v$ComD=IPOEwEFn+?0C$ULRuh;40HfiV3If3! zO?&_txz+*bZ3;PllvfgP9nBL2I!*+B2V2lU_HqIm$X-c61KFzx1c9u%hJZ%!4-iOB z1nyl^Re`f}K{2;iU$}YS?&osjTrK9-lqr#Kmuzq8E*|is97&CAKS`jgBHPaKfM23_ zN8wI9%K1Xy+NUC&sjLa44EtAkb+z@V$lAQSW=ZQHJoYNR@@B884u9^hSr)lX^;}!Z ze24aw2mD9SgluhFZ+T8%=c3u!g}gB_z< zjc*g^4z0#N(Y9(e{)K>QHU1BQ?$K&Yy*D?wbwnZEL#C5`KkkmsrJt(RIFEqFzb6m~ zSc;BWn)AMNNNP1M=Y@1at8oH^I;gL{sinDc(FE+fltQNvHN6{JN~&wOw0(bPuSAw! zjl)ys9J&<*;$|HI%foc?j=GSw6(U<+OlOpASwX;t*G}*9ofRFUdmzEvq<`++dFnaR zdm1~Vq7mJZ;5jAl``ZXu%B0i3zDQzD3|fbm@ucbjRc1FdK|)FyTEiLH!@>I;B$nlE6Wu zQZC3o_WCtN5;?m*3Rs6ofcfE8E}^k#7={; z)7-|6?94vbQnhvrty%J<^U^xL&$V1lO{A&ixUl8!3ro1qb(js-Wo$6vgObWLi(>}1 zB^Z}b9h^V@LQodg0k#CSI%Y%sa9FdGb)MK%~(c3ev&c0L!4@V&o@Zk&r-`dpbL z%>*_8*dW!hG6c>8aGrR62?5B-K~fHEuuBPuP~ipc=(-&?*onzi2mQ(`X}*Amt7Y|0 z&nT>jvOh%qk=OeyeJzKt<#IKjCU7x;i@^emABRX6W)Do8H@U&28ibP>*JzSrHUZTj zTuMNb6lW9AB*jGplx0;Yuvd&%AzT^(rCoiMfYPphOyDH^3IagS z{DXkfuKKfkPQ^D6I(cR!fh7PC-FW7B0?Pm(2JuWWfztutQR12P1eA8wKwv$-fg8^= zPZPKZ07fS1AQWI+nP1t?u=u^}bGPH~BPz0U^TnsMnvpsO-2kdf^j^P-;bE)lT`dIUkc~68+deCQ;7TYKV$5JZI&cV-?pTy)YzL1kG$(54bUo zUdXet7;7;JF-6iVT!~Mi7s9_8Dl74+1cm_^=02_6W=FBLZH!-W&fMg}m zi0jQZ|GrKxuVNOSbNQ$%Azi;pT35=CN5E2kTp>>~>dM@ho)ZNMe^kvjS_*{wT(_1} z$u5_+Gf(bie={r6*_yjBSI}mVx^URc^JbrGbiUi@IK9xDXf$90IgGkq@N+Gm;I^1$ z1>H%D?XZFpzURC6EFuG8CqYnbcOoXi#N-4K&1jhW=&&R-(1>diBzm26@mYlKlk4te zxH~zyyPD!KPt#q=aG()~yODq)#Alhw7L?DjkU#;#8Z2|3DI=hvVw!*wTp9^z?06Xg zjU8_wa2y)N-RGG*2xu^QF98iEpCk|jlkq`EPmuL|i_a{5Z&3a=K=k8E_c=YbnuyY^jeqpKE%SN7W_O_}Z@ zu>74@sNvK<33OFB)j0yo@VjmFcd!U7<7rO`EQJI*PGI>fJ2(g$%}_R}1eW6n1hXT4 zejNZIyFsfOp;+Bgnn2I)B>JR!b_*1sp4~zP4yvA=slW0(tU2l zHhBqWG`Wr!qY`)P6`;i31_g>BaW}o~J7$c;ohr78#GNR%p&mDV9GVqyD|P9%X*ifN zm9(vDcU1~d?QV+#N!9M&6X?kuv3`U41?9U!s}Web=cb2Vzh_r;GbAK)*FvKzbC*$o zGIy6KFdBjE_ynD%x`1J~hKO6D5m@Sy1`LVZT}zuPa(A5q6uH}_z-Wlvxx9+(on`lI z4o#7}naM=%_z22s+`Vx?H16iJQ*{Sr4T1bSCafOL8;!efvtv}_ z?z;rKL*wqNw5{y1uM-H^W9HuoU^VXtS-lk%OOT) zJkZj1H?S9!k98A)gT}`SN!wjT+bV5$4FQ$5yN*CR1g$P1Gb(v2WuBlLi!t+ry=9&v za4Gwl+wi`@qLVN0BX}e=->KvFlENur_;G4`t_*vG|d<=iAHV^whKkom0M1F3s zXdN0IsWKx+DR!F=+e#Pf9&bfZ~)j~ox4*)FdWge72dYX^okM>(<;w6$B z2ua(eIA$tsHN|OGw+DO=nfwZVdsIwmXNwfs?jd z#TE}s+wHcZb!{kr2cm@XftI#w=9sCpU53EHmA1Q?R#n=rl|VO3+f~yImA0!TP=Uuu zg^(Gy5~u`FDWPCJ0hP9EB;es29hbH{pe2;IW<%Le(z~tj&KI%!6agz@=c0B*mTzHC zQ1R`{+zL|#g+CKe#kXDzZG!Z%89_i5-wFvR7x7{ON=RrwAzZ@UsL| z@$EYVRPpUi0%sx>j=0M+J=hy(0YGfznSlh9dN_)JD!xr3po(v01XS_OBcO_Jj}kDj zf`Mq86mix14(Yi)%Pv+ux0eWXT+i)y%u;GP{SO2*o&HAxnofUIkcKx{~Lir zGrL~!fh5`W$m~}_WXk-B*Qd$t!E7=}ZacPwjs(Zlt8PS@WIi_g)JtkQ_faZRc&ly? z@|69Vyk55~o38Ys)a&WRZA||6{du8+v=bo^88I;be-abI}W?D(_jO99+35cgLp zPyhh#pRE9D%a%>?%sC323}9J;j(;$4Kj1qosoTERugGp00wZ&;0RLL-|8t&82oX;& zqCd)vC|7{Yh_nKez}uSUnMwr~16Y~h5}pk%VIW7~Y!r%b)*F9#?iH-{>bGB-cL=1s zHiw{z&J4p443i<)ra%Dz3_*(m69G*1%ytD90$A?wKeC;l<+j;``CvTk{E{`e4e{xS z&AV~bUOx4bPr`63>n)$a;B9My55?9aGMB`x5lR~91Exi2eHf#3h7=ZvJvZM_y6>3} zymr?I+g&O`+>6_I?aIBlT>)}0?oePXDh*D+*&GE<0 z2(dIiLT{9%alZm&X*{UFSg%OW$0RYUpuPZPX z050I)6gUY$l2K@v8#Qp>Q&+v-dfnbT?|$u?C-N>Bqp}OekLkxKxIRi;|9=V;0D$X1 zRiFsKbkF=;fjIycCg}S-WT`hI%j~=EBKOl_1`U-5rt;T2k((2WoS%Z)G%32>W8$w^&h|lH%`LRiU zTon4JG(NYMCgTeE!FNfPD)jAM&~iG~RH2Eo9@}^At}t8hakYF(o0{Nb3;r4j8V8}5 zc-X3l{Tz^g&8-B6mmPrxvv+)7R2&?tkZ5>Xs?ekl+UQuA(#JWEakTc`QtQ>Bkag(L z6+ec~*z9MPxV7Jw+B)dUpj9b|kZ^0M*M(KncbD~u+@PYL89oy`NzcSi!ddY)Hy)o( zk?|8|KXW!Gv12CUFzQ6v1v#0(Bmg4I*``T8yd&x@dRV~D8#I@cHLu4SQf4-72j?2h zTmr{qkK=ebUpk*aaF8J0yVmx~VUEkn4f!XATC!?GIAu~1J+GD360M>K0qe$b+M|2u zLLn8TCiP(qw23pt+=TU_o}!UZHJEvB9AIfPheJPL?_FBLWKnEOO5QH&JS=K74BH zt19G_cB!u(Uz*9Z9mU=?&EA&$!`R=Ioa&RwIAVxpZ3b|e4&bun3UDHD!~q=mAsbvR z#ds~17-BGiWdN2XA3$j`G=OL>=>VRZ9l$=c9Z-)rlzm4oEhWXtGn&1-p1jAfzb z*eB#tT3(4uUWoy51TAiPt-QA53O$~ww$G;RGhzEox9vPH0PMukr%*_>d!9PwyHni$=ygmRDVFqaouPM50@Vnk?S%M zIg!Wmhd*UL!7^%?j(5TxH(%Bo%-(@5xL527k;14R^nus06-nj3JUfHfIjO}9UcdXcy?0;pyBFSnVav3sDF6s-_ulp3 z)W!UG_cg)CJvZ)}x_IjDvYwH5mU{Gg_?@Nx|F`!g@O4$y`YoLYI#D{(Hf>3JTbiU3 zw3L=YDTNYB=?JB?;U+n4vdKh}QU*~O1&xXraKHf-1VK?$6b0m|s5pzl^Z6W}Qz<+L zL_~2w{@*(LJL~S7bN0+d~=kK4W0*=O&whwoc!>6W+Nd!-%wYSy6uDuWf+(S0-C(- z4FrzEFK~l}l+^@E0N^SHpK1aN0N}C%K??*<0D#+tz&uGnlehI@moLXJa1sj4@dQ*b zbt-`~@CzIZz}^#B4FG#}WYHv04gmY-zyt)=0Ki5S>Hi3<1AvWTV6G#e+1x%xU<-bM zWgsv=Adm%s&t72um%vT{7*kMd@Fg??z?(_?5=6#EPGTB+;}}p7xbP25DS^oV@Mh9B z*$Ykfswonp=J(XbsHEzT1XNP>Cju&|`ZEEQRQ-j3N~)%lDj8bds~r4EV2bGHL;!H! z<0n6zVR6ZU0S=!#F&9)-HE7SxH$V63tM}e|uOqA)7YVCSbtn20DT_>I3M7Ub%4?|b z`W)u!gVvfx%)vf8gVuPY$bj6;yPWS>wN+OV7>JoS(3^TOwgZ+X!zPX~WeY0qdK-aA+-2TNptH;+(K}ZrOLE@Xe`#}Ave|i` z>lQh5HiyYN^Kki$C)`|!M8^_$57Mi{rFS}%-uV_gW-PV?V`cIB4uPI1z4KMt23-!) z7tVZ*09bRVPH=tk4FVv~;jZ^o*%@(HhuJ@pkb{!5L$s|b44-#k(p@7{Z z#0)(`%qSn*ajEvv9+J<2M~Gr}Krtq8vCNs71ZDu30U-I+<{zB)fpwgjGrg3SX2Q}; zF?}+D3;-#alWaP6wveZB&lY$To-NR_r;*t1S+fLY%w)PD?EW#uDgo_aXwv!Mo#nh=6p8;ndR| zNr(^@!)YX730^+|DZEr|b+o`coj0Po_R>=MuNCv=&c%|RO)BtPkahH)^!;>|P`>WO zTc{InVS2hsO7C#uUCUlrfWf{%M%ncQ76Mr49sRM*r!?tYzoI$Mx)K{hb8}9 z@1#w5gpO(2gf9`WoG!ZbKL}V(*Y~+Yf;U{yM6-a(mk(Z9TvWTG$m+zl&UCMEW^OBL zY|j5LS-Fz{UVPP+SLXj0Ui;v``CAL>T7vvP6}5NORd6Hx&&5|YH13vvX{bg+#aDGg z7K^|3rirY7su+Js^}xyVLw4PA%$4ObUY{ax3IKnqhuGwiCY{NH=F(0cq51g%{w{4V z!_-(NG5+5ta58}9{<-3zcJs3=C$XBENy7Y@mV`u>L=v7IrJqsFHurozO|&n+&P+h@Q3Usw2L%#zNy6tr@I_4J%*-m0ab{XKFl>C-oHm<{L7>1 znlZ=no!RO`;F^jF*y=+dN@ftS)rY_&%_eXT?sm=*Zl#pKS^#TZuF010Nlm5XR0h-7 zqNohunQuP!AlI}Z*M;SD)>a=vf1FLg=1o8st|4IaCOBM^&6|+AgOtHHtJ$Iu_^|8i zphKT)5)oW!Q*&d*j^-ek(IJfu^^Ln)g2qcF-l}U1)L5`hCH(&){9V{5 z`Trzw_IA8tcc;2tcdFad7cAO_M!48E@SR14flL#D?O1HLdv~h&N5ny0Tk|V&Zrnht z6|h<%YyOP{E&_0o*Nxb5QJ%~_F5 z;K-%BHDBgcnC6{-k$|R|f0clynIFOJ2kvAosdWqi%_@H(fm!$kPQ&O{0&@W1_zAfX zfieI%>)=TUXcmAk63{FF-zKmWe*`-`5Q_vf3&6h!oQ7XuZxon;>>g#gMiWq$tB8QI zTxSqa4l7IGJT!`t6_|SnM3hy^K6fe-eTF@%`E(y6P&l7%>@_-sR2^GTLaKp)5>ibB zl#psBpoCN_0VSj!AP~j)CqJpnKMmNKZM>wm0riFY%2j@Q+tBCkd-pRBT`yV5-~K6w zfjTN;p!f$$chsi{>@UDQjkGZvmn^%IC5dqKNl!rih3`}esJ{~EE&?icIo%)Mv5>Dc zFVJ*E&G>frDT$X^az|6uSXWYCU2-DsXm-_=*0u)qB|_7bHe@daB)@=$HLf-o3a2dZ za`cDoA;3~l!+hI?Q~^`tTANEvONp%_Rnm;M>RMY$#DTmEw_#YQvL)hcZ9{c%S)4$0 zLg%N`Jp>;k02v>~Vge%oAavXJ9nZTLcP_S;b?7wwt6Xnwt%3e}_OfXSgBKYNc9%`t zhF{ezjCZ8QXq)+TY!n&M5>U7AN_8(AFWK zqC**`ewQ_6TTzFpq^vBY{%j$ps@l3*6ksaLZat+rs9QFzq0uU;ft@0q9`90#Vhwi> zW-Z+shttEj^5LE?jmrJ#}R-^ks`aCdTgcPF6%dtb4e?h0##Mm+AumbYAv0W*~? zX#JeI1cV31R0_;e0=kbWC!qCnvIKNvvx`8K-Y9uE$J}yi-yFpjB97clArOVXrfkw# z$oKN=uM7Ee1au+)9RXd)|3E+&^5+TYLOzmi?L+OGGgof3RW0(?@n_!kx#!;Hrs&ai zyr#Mpzwb#A$rt&Mx`sbOpu5)a{S%QqsqdsOj!j;|vtMPlwW=n%bskh5)YaBwO>Azj zSYr5w6;a?;&C1wV)df6beolKTBKZY@u8T-M&laMciupbP6_NauKr}&;=R@K0 zHxWgfpE9VwO`f7@Q=)t@DeB++jZSHnmzNb_mY07hP^kWmv+-SXPn2IG@}omunj@Ks zX3yI`xcByV$M-V2LCBZ^AF*34P2w_80VZ)7tN_Bjk%Xp0uaazzowrp*ld3h&dQ=mP25s0DJsl3yNhXj2u;2+T>&OvDOO-SR3yGyF78{6d75lFu=u1o1RoSTKe@WZ7y3scz3heG-d*#O(q=8r)lQ@_wV|1!C>CmZYF72jU>zHQDZM1E* zWjIv7n*jFp&`smE^t}W`v^CX#TY5lMe3J3R9xI-pbrJtaY7);;x@S~;A`j!e^i%XR zN)ck7CNL9@hkC0Y6UYESwlvRMK4evVs(~_l_#jpS<=xcAQbameFC+ApWjPW_E=v^x zA8iqN>9`LnK9SzI6L_vp;JN8ld}U~a6ZmCzKvbB={DVMLKPPztb3vy6`=H`;a)%7R z)9xEJcgRQrg>#3*R##Avxb~cpeM41tfg(MFvE~vM?kZNY#`7{){t&d@tu+z>{rtb#Ds-v zEpsgan;pZq-#Az*KFI*WY58_KW()J6OW#4jilFcnc_)F>@hqo%w@Qaqd||~895zij^wX?Y}+YKI@?Y(=h>9S){8T8Z~6|}J_GOZ3{mlYn1HCl zR{NKSF01&?j%=H+(NZVrLH0+*r%67{lQf3V$uP%vF>*pwRR!Xg3{=#L6FW5hnD)VNSP=oq#b$(1})?XZduJb|0lZeLVrAb7KpwMumCIRssfVzT|00 zb|ZFNlqYkKi+C&^7tyk(k=XL@XxvVq8&=~672je4R^tX0-x31V_$pMxQL~hQ6y^!! zUg~55I{@tT?-)8!@s+k#hY8(mF1Pu!pzR113-WiHXCm)ELvPd^)I(c}LWv;e8s=n0 zjXFotpUkQ3JP}15`jLCxtLT0m+z+#fyn#SHfO_1QnyU#k0FdM#$?q!G%|glB%X8Dt zGq+?w#swd;Q4*LA05@uZ`5^&KRq-1Fs_J{5fTpS_1g^dVa|?keGeyeR=*R^= z!3%$t3w)A*$^{-EpmKrF5Ky_mg9KDA@Mi*%?$2CDKgS~x1)TRhy2C29^`C#4=&@A? zh<{%d{(JxG#`cGwYZeQ*(u)un^t;poll>Gpz^Wt-Qh@!e4wOrRsGGMK0URR)t3 zm;`~qbnIspSPbA)kMFS!LU+p!M(65~pbwtC`-VL?-Cg(YuM&l`6re=mYz3@D!JMN& z8Pabo_Pjag`@N=9RlvBFja9qqkytC+TpQpSzIgARM{nJG)0+xEhNETJN}p8AaG?U! zGHh3%7+MCD9=S+?QvsZn;xP(HFGfk}k!)*iV?#@3&ztYr+x~E2*Bx;~J^fH|LxTbo zH#8|Q1>y$OA8A%#5r9)txIR3Z_pX)&bACe*c6d1FG18yA{f5GRJ9SguKqs_r${Q76 z-IQw-7>~*&Q;@++frS8;dHjye`F&Su*z!>OS1l!M7HaxwLelgp0Wcy>6=d^y;!9KW9=pjBCZL_qSk zO!ptZ53~v(|Au5ANc35`o*sC&-O|m%CCDtfTNq4WHh|gQlXi>=ktQ7`1kHIaFJotP zM>x`(wpBRNhkzB1;G&}+0TGVO^7r%s72qhfZ)VYY#O!-+AA3fCQ<~eSA5TARo*TT> z6A0KsCIA)_Kqw-@5npoxocYnSnpJ#|`FN1|epUIwky5OuGb*LnNT3rbMgOM8mQdo} zXV&`myox8oq~b{!7uMKZyK`H9M3dZ!W=rHh#P!vSq8`eaES*pRMHPWg1QZ>@n)3YG z?>aF{a{e{Z9Tg8W6NtnE$+tvp9{zKDtXhG+&rHf^B6^DOY-`>?n>Lk-m&5bXg+8N6 z=|3d(i#7Td8eNXTyByzI&-cVnzxvE3rBgXo&Ay9fBh7=yYyl$HXE!OaifS6nM`$;a zGi2jLDcs>7s}Oq?CzyjKFFDtAz~sG66{i;@2`9)`dj65K$;_-}xhU-8tC& zgk?ycCa@O3+Vs02Y0}vZp*hdoj_rn2n~^c!qirkBfG*?*1lHiiB9%x)$oBIYjgMSjR(gg78uM)7*1gA2El_sQ4 zhO;jE@|hRe;yR2Zc;*?L>Eda-r!vI_xh_2B9(zQwstWYSBm%bD2fA=F0bA|E$rfa# z38_11i+0ciwkVlYVAt0{hrZ6>XdB622@Y2{+O1)wwGR8ps8&;cf}s4u!vd|T0+=k3J4t&-A*OvXamuE6^Zl_@6>xCp>Sk~(KG zfh>Tmtg}l9Se_p1>{0^4)1yd=?{nO@H7nHxWoz%|2OrH83#Cz7ixT`U9`!G31G`zQ zq`93iw-XL|c25I^3CED}=;4QdJM@GOle9^AIXqfUrAFux*3-eVj%rNZm@ELN$2LGXG4s#JI* zfqhgeOhE@ysqkIiCIPVNhF&G0!i1Upe5(#&0f7?y5ghshvy#9(05}?>yfy(=FUzDMBD zlr#K>-W8TJ#1=5knUpc#WDBY$_!WUjP2f4Y#_pi|LBUmvEWb`|_Av3lOHqJ-M;gAP zb|B{Eu-sbkPdYWMd_eiI@*#owmjWXIV5jzP1yGjWTRt~--7Gf3&!r8D9)>yYSr3nB zz0^Kj6f+k--Cv`pbIHb$IbuB`8eJ>f*RYM7%W{nK<(l?kD8Pt)o)y3LbHp0OG_GQe846IWkx`%++6-Sry33Nk9Jx0T z?g^hPf~V@B1*Mjg=;c`NIeLuaXkeXWNqRuO z)YED7D7@68w{P zHF*ZdoIer`Q*ZY&CsUM-$Bd${!y&*M;Vt~sHZaeuK${&J#$R-3w#jEM0@iNbR+Fqn(Oyh=#0|MuM)6yv$vbOm0+Bg^Ka5NG%SlIpqiGShkS7VdtCbM>hsa(-uawAMOTZG@zE12U zxIC?s`^qUQ_nk3Y>1RZKn{5Q7j>yTf)K?H#4nUad$Z_GN5pNt4dhLUU=SmNNetQ%BpD`Uj`jKwt%4>}md)Eo*!p~4t}p+WUR&B69rHT^HliPW`FjF3qTeBs_c5Y>v-Z@p zY;iMs3U+-xb?6hxhj7^$38r>8!Ev5&mZo)@xMphN0+IDtw4QiddX z_tRlh-?g$cRXI0`X|)Pgt7PLalR(6vC%X~5d6Xv$Hx5jLi^t+w0WEu;B{q#T1w+Oh zK{q4^!-aAq+LypK0NaE+?@wSm04dXB1`?JIc5ZxmM3%^h%ahdf9*0ZYOoFntYy8vLTh zJ2YZ8BuI&L?`1qJYnt|Z3E&r&|NS8W<$r%cU?zTn%Z|W2Pe2Lbe-cnacrd?1bMZ%T z4i3zC0!j#%6Hxwl3jyVS4FRQl-%dcw&D>5v+17~G5F7CJDO5*P;nFCuM|PGI_Dyn9zN_say7 z%>60>C3C+u7{?#vjruS zKTaSblg&c}_9rym8I^0^5ixZg+2tc`Sa%s?zhfUxhv0mQJ}JTZv;rhJf2=^EwDz%q zBQ_jzS@=26AuX9)PEHnYDdn<_n@em&Yn;4wXvja(bEP4lSAaC+3knpXA>BStjLIHn zgRw)m5S$%%%84ESH%)5n_^S#qcD(n;?apa5KBDO|*xwcn1Rvpjv_@Lz@!_$7;RK8i zqZb-5K3o9?jE_{H81dmg<~z2N%9W9`pA=zf%fo^KqvfAM4i~k8l0Q)0mVtdi*`}7D zxuwipcG=FFChet`vIgA6G&a_iwV-}ROIhyIo{QyuxHsZ1$Lwzs_9r+Wk-RkX5U3mMu>R?9}_3_Y%{aIAkJ+=c=;@8~42fQ3NNoxr8(ldzYd5l-OGumegkUrXfGK1iSxKq-La9drJL#Xblroc!yI$WPe)?n#(uC&|P+ioj9;OT7~>wsK07&dQ1AJnKqq$cqqwE9YR^wqf0HW+;IZ z@s3WEAwP_O5Y#96hkR$W`Ix*&jFe%wlK-BLE~OimU52A46Ic$vmV0}x6Q11b)xHwr z4qbW{9kX;PJUyF$(4{M+OV1$?#WZ{7X=WC#H)#mO3GX z{Y-eiv834l90%M+W1Voo1*q?QYe^CRIiB#{v?e^E#8Z1V%Ra6<-&9gAgAlV?NDyW{GK#+n*s|iD?kBpCw>pp+Q|gM8L*EgTsA3H#Pu7yg9K+E{4x$A1&BvC!zkpAxXK&<>|<)3m4V zAc@Gf9rRTr@A9OryZaX9ufb=cNPU( zn|~A7fyGv+&E&#bd)w&*)e0W(HJWW=Tij60T}1q zdBl$S(xh|DM{{YHIfugjHf@8i1wjpGzDoeKEtp`e;@>AQ2EbVVDtg=DLJeKet4_B2N(LB!KiVyVQPFyOa=Ej?U$_^S{}3%Q07$%jEePfl~mS zl78|?lg{Kpb7?1!6JYx^ZQB4_uuDHCAQb3w|6J)ZyR;%2W#%8WWEo5Ej>4rIl)| z|EKJ>a3vl~LR&rC*ZpFbav`LnXiX@(Reoz-XO}eXvYAX%XTp?Flb#1V%r5mbyHp-c z*NmCNcUF#|fpST`TSDM$0B7SYYf1^M0kB3wC+8DDc4hFDU{g*YV8bsRcFBfcrY28v zZ0~HgC~Pl0^Npk)WS1O*ZUddQ1ReTgBLOAoHW9D{ox?6!f-ZFj<>t9jKFpP5&@XJ=gL1Kb}_|pMb3@4 z(P{;(R)`xn6SxS#MP4^z$3=NE_qd41;&Blzd!8k>cRnAD@O*PI-8dg}{(Om;tS2Dp zrMC#X)JQ-m)eFS)O9*TQuvNB#Ed(U$5>&3oi^MFtPQI<#dD5+<62Hnmb)NKB;%@nb zpQd-pj(wJZWygF2Al7L|p-IL?ev?;WN8v(M!Yj-_35b3l_hW$>z^#pPR^te0%n}WB=`qAcmQI72TE}8C^k750GhC-b#!2sDKH(ttd7pdEAp0) zq<4ep-I*&fi)_}{At6*WZ|>r`O>w{EYt9AYELzoo#&QLQBikwbTBE=e04dVFmXAo~ zS8d!chY-4eRyC$^s{+HZ?7**W3QPfz#;-wszXsd>S~NeYyPOb4L!%nPc(DRVn~Y&? z>J^v_;Mf$eabgFzHsoI8;M#Mu)kT|YtAoaPZ#gw=ub@$_VSA+l!x4{;-nvSGDFA%E z729#i2(~lYMpll(=gCG^hB205WMvp*8D__o7)x6}6)auHCy&bDB*x~JAIVN|GXxJm zeN)+{4MoWQj5taZ_luPK`XVTP>a!ldB-b+E z=F7A?8GcO`zy7YkZ~*Y@p9)|Crt+&F{qlvO4{?*R$94}A`AX*oe%fw;rog!=;@ltw zh5^8rdx!$l0i;=ghtaus*7ZSJ)H^=Pl)}!KaWq*3r;5a>@d^wFfF7Huz+?a^mXllx z2lrD74~sTPk@vVeQ*(Wkp|PoOXR5d}OMwvpa6mpzf$;!*N!FbW{+ipPL;|im{Wmse zFAeJA&Ny7|Vw#!;XQqiWCn_)k0Gv5Vf$;#+IP<vggf;J*3A0+>Tl-1DU%0Gb{56XwgKYi}?8&iSxlIIWXKxU@U-f1r7|+AyFg6lJoE{%*%UK zAwQDDSCx&`mxl?kwpJkxXUo)O)9|~Bnjnj_D$)|iBB(`Z5snIT1BaDJd1tf8gz}M-E3I?7a5D5m7 zFKrTTFkOB8Tn_!psN9zhdKvlEd1b$V)GUk-dyzwgA6)Y^J+eX8URE!5j(09pM`({N zugbQ@`YA;i^FAn}7Q=JixIatRqx{_Fe+it3tL_uMSKYCJDNQ=`HkwO2FrDb|U(vQk zhyR9v)nMTEdJh57U@Z3EUU#D$NTv4RWLs)HgCaI}oCxW0bV%d@Ckq`gfxvPA%l#gD^a6trRMJ|}QhP-ZpA8!A zY-Z9%6zrV*fok*7>BB-JNQK{27qkY|aZ8fG+RnQLv~(JtMp9yXEcrDFM~1d^wT!K7 zr>m*uG-cy@y`~B%5(bC1>VlxECjLxksG)KiIs?xn(afG_N>D$!pSKbA!BAKUAFnX^ zeC*j)tI6|day3k@_M0p$Y>Hb<^`RG@oztm`Zj{4~av7`v0UKlNRqq{UaQB13-H85o z8QhJ^;BHLM;0n{v_2eqPvkh22HpokS1A&bIHUdaqtq%x;yD8_!t+cucRyT+4hnakkfv3Q?|mOalB`ygu^d&V@=4I9XggIFtpwHWkkg~7d)Kooy&E+eoG zzgQ;>?iBnTV>m`Y}#cd@}rKMvH{F$8$V;7kM7`X z{Q|wPTr_(4VFH$m_RiMB(x#r4HeIM=+I)-e%m#Tw+VpJ#Hpm;&rtc82LEaE9{eVCP zIIRj?iJ7MeTm;}E5kGwv>DJ}Aj(p7c|J2GI2}ZZe`V(wXGz;*|w*>Z}v`K46XUq$9 z7L}V(y&3)SX9Bp=K=>}Y@I?YU0PK*-okyf>K7g-pmK#D5txsoJkB+N`5yurb31@uEWt0Z1xDRU0vdB$Oh999=Mm7l zzRL(`5bkOMtI#O6K*-WZ;7kD6padpM;4A>xDxfYj0gcN2JOLFne4W4r_#+rpf%yZ0 zN&x7@v>$Sbh~d@Db?l89xQW4S2P8rSG62x4X`6Hu4$qS>R)xb01XSVhA^}x6yhK11 z4u2!i7ZJ66F*3}{1o{I25gnN0d4)6r0Pd9_RH5U=0Pr*($DJ$Ewj(ypSNX%BJzsca z&vlROx&0GK3W#0vORMW^E-#>fV2aA-!}Zl!kzEAnIVz!mTb;---a(@(!?;BO zR<~_eAf*gr&HE!#A=#}y=LMDVou4DY_z*3s1mnXBFsJmL3QUItBMmb(l+09uG^F2( zm5DFU5nnt&dn&&8v;q`gd{%+9;){sjPwu4tD>o;5G&Cm3&Xmc!9sj)&?{aS(H0MJ>#RbU!`G+srz9*-KT?~0XcHpiV3j*CvcK$EJ` z__G4kX#7Qi=^$j%jPytZmE2YR&R&=J{v3ry?+5LIrV5QC6re(*uL9Gc&`8l!Ym{g7 zbk*cNZ@%N12d{qaO>fpUm;%5j*mAa!xpgS+Qt}$)NH;dpno2h|DKG-e zGWZ+*G>f{14yBaP>osKA@B0zXf;}C zPqiAm6rfgPw*o1(8oK<%J@PL-j$Y$B8dSZ;^$H9J504KU3MJN zMmz1PXyaA|hC_J(kKU!gWB_SAik6+YN1heOQEuExYpUG1OM&6gKfs^66_^YljX%+f z6Zglr+BoUoKTC7RVqHE~*5wBk7!CjqeO>`59@03p=DpDdH15&3J$K&rOxrbkAAaXE zAGoe4BPyU!N|~_4NG=Ah(~r}IVmMhWPJT^+5diQt_=W;g0HpXDsuX-+7)32TaklACZf3?(<=Y6yQQ%?Twp z;c6I4ZbE5JD7gt&Ly_EAX$}%lP?}RL{}f7dknz9c(sKX=Ic)<67lr>D+-|n^>D9|@ z$6sb$-G0th?HQBBKex?EC(GG1zci=F`G+WSW_C%D;{>+6p8GuwY?;TmH4)c7$9S)O z4o-=ZfM`T35fP(o?q^8K$A#G_L0y* zv!2!$!n&jhNxo+8p(IjHrjG6O)2c+!j}-)>OdTdmU@@L#v0wJ!>X{CuBvMQCl{E4} zmf%5__`{+Ow9+UFGTQeNC8xl3cLJZH6Zn+$Nu(rq1}E?}?11H%ugitly^cWPbR7Bo z@;*qVMAkyn@1dnrVfs`teLH~_09JUv9kG>Kp2p>r@hCjEqUGfEv@*u!EJY*yj9f`K ztm+7UT}8lV2?1mL1_GUA3F$`Fl&1E`n1|_1l-t8RO2A5Myu@)K)zp5MC{g`Q#(azJ zL;@W19RfCIhu6PDEQyqe4%~@%j!wLD(kGExlNRIocSpMs~y6S|2YBC4k0av$Gf%!8C9N;H6dM7 zD@0X@X^*N@wci+X^xWLs9P)X)5mPnCkp!%o!`Ey3UZTW$l_0Gx=&8tC_!SvX$2OqD zLgCIt0viEr6y3=r0-FGcrY8A?gLFAuq9jZrwIw%s%Gh;VFjuz7c%4V!0sxYyA-OMO zlSi6#CJ&lRJ9(shJ>T?f+CC5O@jUDy%p3wD--%C)p~ zAuL^p$M)%SCUh+Us|tdS z>P-Y{AQP$)Wzky*)B>n=l~x9TNiQT4^^%<;Z(xhn7_{)rH${3-X;q)=!h7g!J)X8+ z`r~5+8UQqi(&}CUjQ|?uE-g}8H34W!-$8ZSK_6v{b?6}2^>xspFF_vNS`8(5r3ANN z|FSi#k(nHe(;d~icB4aiiuyKtbT?MM-Le#Zm%wEJE=#`@N|Vk~h~_*mC$>Fnj^1v@ z{0D6}^$4j6}iX%BVE4&u3sS!_a_2Z0=N?QhUU)% zUI*ZH-j@^WVhK~D(r_|2;w89>#6?$N&Lyw_0B)87b0Gmuj8sqHMEn959f7%=z)1jb z%0(6c0-6Wu2?8n`{4oJddo+koqNO^<5?GH$vFQy=hQMY3*c%~}2!X8tuwx0#76RJ< zU{`?%1p*ZSu<#?@7J(>rlDUdN6@G!QY+&vra4`UURRZ%R0+#^5I1J4130w{UZ^pA7 zi}kq#_)(lVf)76%m(sWb4$LtG<^aHpNZX_%PF%!`Zxtt=NI=DjClOF_;xYm%PFzkv z(=WY_K$L#T45Od3phbl99zPutxefW4vaR)vEjdBrbMJm^?|pYY^FB8v)6uzNW;{oTM0LxW_K3grCAk=zOLBoUIAwdkc<-J^Z{2&-o8ph_$O_-dhf!H!y8@II z-ljk?WQE6d{5mA4UT%#%jgz<|HRDA~*`7Dw^UNdn#l3SRh99AAl^EWszzC#s!pr!m z0x2biYi^0Wb5l(mrJQ#e#>lgG->~PVyW^fYGQ-c%uF4EQtH20oo#5H$6c`U6b+QL} zH!hHjCo=?eOKlC{Q`0Kqv0FT*U0{Bw)r4qn56DXY7@Zb=@ zq7n?>n0c07Nsi0$uVn&Q1WoQWc9C9V7o{hFMW@B%$1Cg@08n9J%lj&UA^=6+9d7I! zDor}a4>afbhQ{`3j?nL~w0#VA*T;x6FB5=d10p&cF8)CP$_=>dy_!3q1hC4ZOy&!A zrvg0)v`^j}w4SLVlZmIUU<;!CV#>D_lm)o^%)zKB@qb3TkpLDU zPdI`z<{flqKAaKBjd>@51ppTKCug@3z)lvDJLt~waOZgO@52P5EF{UVx$O`mfJGtT zuAEDC8zY+F73)GIc7M9K1thF z&;w^4Ab>>LNLz!I^D_iQDRYv4$ajGN4%2BAq*a{^EWe@~BE1MRu>6L=asbP{y|(WJ zu=Q$R31H3Ik}=QIu_$eed4a$Rc)CKm^hE+ux)sknI7|Suijas(IC=Vg(e9+qz+926 zE@l9MGXY2;nB=~UO&)2|nLKDN?c~u^HW|~4wyod>1n?0AqyWwt{<+d+0$7zBrkIu@ z;fCklVSfnVv!kzsnMY%y0XZ9e>@l`q1hD4zFw1DoruOh!>pB6fvJ$hJrXp2|=fPe} z1n@{u7^O|kjTH;#HdVDs?yGil2NFq~vHV91!v9_0ezi<1b0@&^KISg@TW|AG{Ou-l zxBZuU@V9f!$HKqf8~*h^`RlIAkOwU99os{R{Kam>%z5lmTcHO0?D+(=Ld_Newn7c~ z*=+=Dg&HUE#d%;G&r8oXuGay(i7l?jfQ2Kz0h^MJ9TIiv{9R4$4ry$tZ`{=qfa60H`+yy_b*(`&%RzLI z;tpyKDwso|t#7t@XY{MKu@_b!SHk}Uum*a2XN*Ns^B$dkF} zH9QstyJ*?7a>u?ks!Ph4x6=(POv03U2Z0JqfC^!q-$@`66Pa5HWbuov?8V+iKr}#A z{w2E;);W`x05(d6*(@r7{1lj-)5(u`Zj4CdnfI zh4)}uqGty8qFRw>K7r}D@x(n)U``_-xoB})5}36FH0RCR3CzPUa2O5D2MB12n@i4vDgZXl{KoBz&HToylYhKKrT%>2XZv$nL@GE%^{aBrfu-5;F94?Jps_GU~IA6 zHxfX`3b^a#fev)sS2RXtXVBiZ4`EZ1I)XiYCtaU}j-4bA_fZ0q0ZdNc)6%5V(`YVj zPdmv--cQ>T(2oXBamn z1~cYK`WZ2U=7$6jFpjhY=-8(SSWfOW$GB<8zWFsD#8QVtJ%g^T8@Ur@|1#!}bOsw* zY--WXeU@V@q5*+jE)m%J@gT~U(!J9VFaQ;YfrCvEQ8@ z%mSK?C^XNr7Pxu!*-Z+Fvb2rab)qrfxr3g=o+;orUzK~6mJ7P<(fb;#?PtpqflcpHI;)bc#UVIqh`&S~V z@Na%zOT@zH=+^uAh**%TZ*mL2>=piRf4GIV9$_w4MXw)n3cj;dIQg$C2Xk=?0Wf)B z^Ke1`P6B5FI8)-r-bG+FfYlO7bvuEx0G#DUmX!l2Pfuki$!Olr7KLMkXP&{?mXgXy zeu>GPMq3Bo!^d$5b7yaL%|mqd96aqg(jQ+Suol2t>B27(I2XXV!h%Gk$2tJ((sz(V zzuWD==h)&JbP(+NI_S_RJ&vxfy%fu$gqF$Dc(6mu&PR{(+xk;>>G}ASo-do@pA(3} zu2X(nrAg=8isn3TC-!X>LXmsoAJ8^Ji@@b!#Qc!JMgSY-lK&|Jn*fA0D*lteW&oSz zEc#yrBvSi)|L3@GYgTxlKC{;2n!Y8d3#xF*)ZRAQzL;!jbmdfn-^DMBa(VavO>;<* z4rZ^wW)X}kY$O~e=40a&)K>x!QY6%>g{L1U;-NE8l-b{PSue^mo*ZGxdwxImV z>j)^nawCDx_?5IZ1J=xmqOS(CXuzg3bA{{~rdI^4WMO&y^2-U+yOWM-nBH9qFih`m z1=3ayct_-06fTHV+v~HJYZT!y>vEKVJMQ18+_LgnTGtW+4=TVC0-smlSd^Ld<==Lu z^_mYx{w3t=XJYfB^{21dbbj13S&XXnvAoPECQo(5%)Jcu9c~C?SB|@81+C0+7bB4@7S= znxCj5pc8;tkzlcRDV!XKSl=(%4WpJ7=%>I45NU91fC5tiq$%qWOO}7$=_^WBo~^z` z-wwht_k_x%d!uPw3k)2szzDFAaBr*v#{x(*H?_P+ffp)uBI5lf;e&MSSen%$1H}rA zfEWah%~Sw^c&T3KhoTpnT>2myY_;cR6RMj#9Nt1&)`9}ZE5L#RixilSO|7pgLrmwT zwD}=dP@waW>m&0*uH*04i8?%wy`$v?&R1Xr!VvLpFHoQuz1>A^l z#HJT*sA=5Y5_dTAT$(j?ac~|2jFujHtJ<$xMAKPzNv0R6e`2K zC(A!+;_$?6f42pE&rO%?n}>#6y!X%gAl|!Zf8)JB#C1!LW*gbdheE<{DI8$qy&t7l zqJEtITGshUSfi`+nXNjX+39sYQs|I(fl{7RwvLPBfxT$%73kxH+L?$1l)hRdW^m`%>m@*`Efn@ z1J)bX)33D^fjmh;JVFV(E9WYmc&pOKdkcZf(f=0q!s!_7r%SiImB1L&z2+eTs9g-M-PdaeE8e?2=jr2g%%)6-r(Y*v!)4K>PY@7_T2j6zzwpBezr(;( z95&XWb2)kbn_agKb7h?jgP##t4`98wFJqHOnsg=)noB!**5=;y)3m)7?{Tfje11$o z;)fw%@V?lV+AD%MubiK%I!W}nF|uv`K}(kO_UGF*P5D4Qy0M01%6Y9Wm!F)@LQw` zcBg0N@SSagKxmuDvPuYS2e4fuj6Zk(Mf8t(`_Y3PZr+4f?Cw;Xbf?;sKHR(!jc~EOl<%w& zYipw{wwDoT0?_1LY&-0@rEE!4wz)+Qxosnhx0DpumlRhQ6`#4Jc+HaH4e=Y=OLA_! zjaDy#)l0;Un+Y@nX!g1hJ1)wT*%@Gui+C&^7tyk3t&WjQ290pAit7nn z4B%o>qBRnz15hWPUqYZBK)u{cwGe0kfb9AnFA{ZDjv{TJlAI6hL>AVXd%{oCyHA$-s>Qfvo_rRv>tufaWo;B~XiBU}Od6Qv_N7;6-?b zNUYB#sEh&U53`G>A-)_J*{Iq|;8*~75ow!rWKb9I`d(#F7ZOkz)OG?YgSv=-%AhI< zs0`|Z1R@!f`2zi%ihy%C@A1;D}ah+x(EBo(xdEnv5to_{WHxyul9j($vI<8u! zO$tz}be;m^p;hwHuWpYk8!Xw$*S6M3vY)=yK}%J8+pxV4Kl1ENU-UD>j$WynhE=Z= zC_uf^P6g7YCNGdUeT2=HUWnCqBulL{t&*i(3Q)4NTLG}x-g?(=zjc~_evD?E??e^h zNSLmp8!BPCUI9v&-lRY=BuqY4L~J{kQ(xQdoG*>K<=4mfR?cqY*UQrJ>vj#w(d&Pf zbn0XGmtJ4QK2>^s9f88i=Yx|@T{K6QUjHJ!nt;8{gx4~?J{6DT9=)dO(Q9gYdc6pZ z@aXk@c1)B#-8@NPD$YDpy*uyNJ*PD3+;gHi&(%b1`Ee9PPtZ1WD>l=_w+KMK0)Y;W zG2bD86$`-)-eb%GrPoEIVXyK2LF-YD1ka6O&(P~~_Te(#|0{O;q}kI45K!I1AOewY z!NUw3s`R>uIqWML%LlRP6J7)Kx}+m_Cvcfg;Ij1ex=1NFfoHP=qU`Br4uL4idGf2} za=h>K`rMr9Q)wy6o^DPfFc04j$&iq2I<~;d)42B~cog23pk+@ZvCoK;&0;#;K;#ml zmv9?WOu))w@EMs&paj1t^?ydXkzQYbXXb3JqBBv72NMuj2=5m9wJ+UDub+_fubJ+M z7U2Zx&Q=08NyBS}USEbMawpz0op{UA)9a#&;KaL;y%1$jH*Y4e45NRUcl5_rPHECv zIni9&mD5R6aW!pgnu==)*fbRw^4AkM32$+!f5>+Wz3yl=K0`N_!;R%Km>wixwHm%} z#=)Z39mT?z>6j`OzDht93tuB3iiMTl7k-#tkLYz#S#a|Fm|YiTPd7gyuo{!cud;|u z9%<5tAt*Eioh8FkaNMa1a-Zhwu(5+-)Je)aCml<`$Mni zG8Xjts@)bwauAQP{i4@ZwP1$RniVZ{1HCTN3cCrMNK@w{WRsap+ByisXU`u*>eS?mqnQT## zKEN~INa{g)U8Df)!gJ}Y&D)OtSVzE07SM(330TR3L$6n$gDTQ@P%g#9Ic!l=pj6ZFF_8BfG1vwc^rj-L9ZwM`Lq+wiP)vVia&`F{GOgr+EnT>^t$U z-7V`*-LmdX&$I79BV2V``0}Fk>1G#!omh2udUr7SXT>h2b+5^}@fKRGfz>d*_*)6o z0`R97kDVLk$?R0H7qfUQo*U7!XVH$G8?$JH`+yp{VbgVBwip67T?csfIs#P~{b64G z1_Gissg?_>CISHfs9Zc=98{kD;@lH{lHOV20CwLG5Qu~W$tU($ryYYP$+Lf*cVfrj zW>w^5+ z{uctuv;UQV^6W1YP@esGx}`k(=Ln1g&kpB3kM2-KZGAVMcG@bX*@yo2;oJ7y{002q zb02w|L$;5IvX2CQ;LxPmM?QXVY4%C9r!@Oy0$r!s|Hckh znteE%RGNJvfzD|5D9Kh74$`+<^SYlvuMX#R&j<~PZyWb0%N9SPvmu9N!z2b znumGaR}nZGK$zG4Oah>N3*~h`poEmBQZSd&Iud_jA@Cl2dxnsbO#*jT*U(RdrrSEn z*Ah^s?|K3e)0eyvX**O2DWN~@UBo;2AVql8B3veU?jjDIc+VMd-92Q?&_l+I^n{d< zkDS0CWd{^vGar_2zK6gJ05eh^GWH?fb7s!;qqH;=mS)0|d5k~?fMi=w9#ye}g*=UW zu)w46V1brBjl?!rqKoA4{~+C%hA|;!xXp(MSRxt6hK~?97QZO=9~-)nkdnB4y8AzL zM#~ZZihw25yo67;5>irgng0Ee?g)EVBHj5X0yaIo*S|xozVAXjkvs7g>cm@^o{$nA zkrS`)*X(X?0S5a5>6ZQk76OnkwK-7KRU%5Kgh5T&3`?zMwONI4weGCHOl-*N)V@tsOQ zI6kTH>~Z~YT6d;(7haN+X9K%#Ip#{pOKu`?3V>6*eHoiP(xfwa&|KQdBm6Wc&pEVh z|3_1ggi_ei2g2 z^O?8Mnx*-?o8_*@dukN9c^6GZLFAqXJ4{IRG$AEStljCEyZFv*#(WS`A0==$xRSFa z-t%q(YXGbfy6HXwns)w^1Z>)Qhmf*q=TnC>o~2XdBWzLXZNoFq$D}9I@C$jyF8mIi zwKbSQNPU-p)?oe~0ZZ~Zgp?)uQg=|URtFupPj5?_zsEc&Lh;8w0*>H_R2VS^=wO5P^#TT;z2lc3hMv zvopZ%nDJOVE}~`6CM>ph*1QB6^IP_YO-z7E@(h73_y}x~c+Y1EAk;6+Ct&`UfX)1m z-SzJYL~-JttzakRg%4=FXC=Cc8=T|V(Uw?4&zBI0h_z&QW1V&snj{akg69iOjNeK? z6XU;;04m?&5(-4jI|!f+n<@YO1T<6r&k1P7;olROgFk}fXJGzGpbP-cI(QOxyfRfM z5m2V;YywO1N3g>~ur2{*s;(k%8h(MjQDAN&pw!i^1T?DjLj<%)@e>5J;_$BtXw2v= z_IVao@FLOOuMB?8Jr z&8J%t50yN+T-vE$eQjeUknr_uF^Eqbi~hicESTwvM;l2RS%(ND#9uxr6EwUqxQ0( zx(G!-DjTaWm%lg1>!b{gJ{IOSI%RpNVZKdO{~fhKT{R1{Wb*Hx9RbNvd9_CtNU4-; z-1_k7{g^vxeKMm4#!`6rE9y2v|+d}sN5i;MggbG*)gZ`jSE<#oIkQy%GUO|xFHZk1Rw zI|-shIMXo+rbDTh+^w+&lyxvi(P1GS(1@pjbSFoaV2fE3?kL~g8E|(-dUrKw&CH~` z60?RzJnqKk-7t8-9pHyKCWc`@gKukK?k6w;06uepd6a8kk=Z&`skX z2)``lv`;f4fyg7O30?F*Z2|M^nRGPwx&^I*oVGp6YyVA<%W5&&6yZ+DDpe38>EJ z?F6DZl03`WV#IsD`o>FZktJ~?cCXIJ^rzE^O8VHW8b||6<#EEUz}auzNB1W+4 zYK{99u&Fi7rxZX2?D7*k&L$SmiBS+@H2fsm+X(scB`+RrN3>pQpF7GHeFU=Mc3!Gt zY+h1^GR@Ucuq))K&hyDP_*|Nb;|T?risM@f6eAVKaftg?;1mF>Jze3xz5)p_M&?pq zl-XPu1wGe&Wybu3ZfK^C|5kvRI)0{r&D3Fjp}+}{5G_yPd19`UqcqD&8O9yTuOatI zL9d+@9>1dtn!@Av3NVGo9~D4p7^FTie^OvB0N>Da`&)CNxRo)6NBK|6Y&w*J9y_@_ zUZHu-F3zpUG4_S&Xz+hxyQV8$vvVqF_+$B z#SsT0y~jQ5cfH|xoIv3lo`ap<<9NRO!|6RlO(};K-n5^^j?wfUXA|g&^d6_twu=5v zClHDL%ozl*RP;c4k6pBGRaxF6UeBm0^`w+BSJO{T?{N(QP496Xftlz>DNEwn3mvLz z%3OMnTlgUV-=_DtiyffpJ?TdXGQQ9TmVmPvHOW^d5b_X*Zaf-lHFZo=ETUFTN6${{5SPO8VBW=8eBh3LOD+%5UJBVi|AoBCDoKpdXM$& zI^^T9MN~Et=!x_mYiL{3d#ojJ2Hte{ruS&3rE*v*FF^IR1VMGs9Nq3Y++scnl~g?= zm)_&`G+B|&RG7V1>yg$Zx6|Ob0@&^KISg@TW|AG{H^oWNe9Ik z3n#tDoqT7S-s3I;n%?811T?+Jy#zG9$NdBjTzZcWv&Gj$dXI0@SxxWp9Rix(hVXuGtKJpCjtjIt4IHD*$uO1^%zK?hqHS8hP|O#J@yc= z;zOt@_Y#Q2hvqo~)mU)CtRBB3uzy)SGFH4q(oqTrgi0m(OZAe5)|!&4n%cVR%zQ{q z`ZoulrBKOaXm(EJ9DK{?u!vnJH8q@EAG6v0NHKvl6F4T%Az*WT3`6}Q0`>SsJ$~WY z;0~>?ZK$o^Ro|S2`X$o&h>EAZymyRrl-egD&0|ht>y2o=(H{sqoUO|isI|5}Dp%Gw zG;r3<6}{skiA&VRD%!XNHZJknh^!K}(t{A_Y_rBdmC!EGHe<2W{!ie7CB6xP?G>DIa2An4Grs ztu!5J0z52tT5aiADf)^cQrQxbm*T4||K5yu6LTS_Bz=G`bX`fBadVLkp~+A}nkVSw zRefyIsH`+&9-}YNK83nc^JM}f06=5lnTMiZ5Cx~|T%F^m-ye^_bX4?d&Y17fy490n z{rLd_P^{qaz3y~~BJUtD?RS|KOHVHgg{0Z$AiFhGnbv1_qQ1`AwG9^+(3lFvZ1rmY zLubZ7uQsN9xJMxod-KYwo1e1*$pnH%JPpLdgx%LYkRvXL53zAkN17LDC{mAlM!6^U zGc*yF0gXLNPB!`~O>`m~-A`@fB<=i2+c*iGKPkOfFsC^k@@>1<6wN6b@pXQxG>txO zqp+y?+C~%{04teViaAAJ;S{YA z7w$I^(1rUZ0=jU&g@7*HpCFK4sMt5S0&1x!Af)f<7i`?@tkSszWcXESbFhDrAp5mK zSMeq43LOyWfff29nm#})^s)8;h1{OI>MLr3EbdGzDiJ0VG=~SNt#YK=7XOy!mh0>2 z&%Q0!qKc!`$ypnxb~v=jn!U9Kh2du}n^qPyl}+20U!-$?ipKZxl#Cbkk{g(Llm=!V zmA)E`tl5-{yodcW3itM-v`0cc!Dm3T$M901*&VJ?=+SdI{ zJAr6FV{Rh=i6h+gCfjsn4td+H{5YEVHgYG`woCT`8S^-uuqnaNXJ02EDZ$40_c;Z& zU7h>o*?#G+A!B|-FQRROd78j@xHaDIR)_6ZUVj~%H{@-kQ#9o5{%c9{sE@toiP74a zF~6o?6XDlH8FRlSU;|3L`^0^T-a*cbg3&t~SduX>(0UYEVqPR5i#KMQXHo2W^o~?? zvNtBL($Z8|lG01b+l02X(K}%v&5p)~*7z4OSJG(6ckE886V20pZv75moXA)@TsTf- z|H4{Cf0V!Vn}x04tn^#IjK0(3=xzq@6peV^X>5KtTfdt*Ds=1j6#}}`dy;_e^nOV| z*DL}v@kj79o_P>^5@&OG4UOvN@NERT zzB$~?7IbrXJ^|evUO+%MhZhpi&Ea+ex;cC!f%Kch{!OhdmDxt!9uD1m?cICYuK(>9 zZr*eIC!B4fUgp@}msZv7s!Xv}?3NgoOZYx@pV&g6yY`9u7sGNRy*pSjEbX+XF)X(d z=z0uG16zo8!{!D88pCo6foO(!ZshkrhGm#72Ai=lEVJU_?=;Gz?E z@?Ug7<4%5}0OL-6s=xuL5IZUtAd|5HG70WETi|DDTmwv=Q-A>`zf<6V)rcLJ7lo90 z_Wn=pdGyx3H@zvrRVT9KWjdmfC4X0dktP3B;Qv&W*tzKfNw_fO;z)WOkT{b2*r^&v z@-+enD2`-)9<|yc*8!RdVhM5&#Hm+L9DNu#XG*_ocg2U}Njk)noW_pPc#_iz^h7+# zQrgydl9LH&Jjp2pqKntG>#1|ibBtc+`+74(=^jyfuZM1GfM!cu!o{8c)E;<-y%!lcxhB17EfDL27MaW$QB#fcNe`Dib zZ?#$7MB61-78lj-D6$D`w$5y=ZLJF`qVy#*w-ps%b>)@*|9aI`_~SucOOW(CMmwVs z`?H2>7%ILhe#uZ4J*)W)AEXQqQs$Lu6e1!g=qw~z8D>e6>@tbBtg%z*yvP^Oq;zH; zoS7&0OkUO z4qzyTe0eXe4{z(HsQr<-OX5yTJTiO@gU5{`ijC z_+R!4|F=Kd__ooJMQvToQha|P45<4DQ`&zvJ}lvtc*bntJF|I_ktlg10h<>YiIO)F zuz8V@26+nsn->|0fwvK`d6At&$?I^@z77}d$$Q3_hNV3E-kEi5Q9^CtneQ8)N)nRs zyu|V&62{XJZ9}3r9*(agQbb2wL1%4r1p4Dj0va9hIs!I2!by~Dqa#vx&<5?G%h+Nk zu@8rSqU2ev)my9TvMnvkrUmttL3MS2w1PPC3)O|cg^35l4R437VYDh0I-hm1xTPdW z=2`9i?B*zyvH2i@3Q*`3Uj8t4R+A_pM-)aU#UdSaFQ z@bxPMtdieH&Bi*&k$*4Y&QRswbp(_LYbT&;?>h*n+WP?lr69&|!almnbXKsmtU2y{OOXvx2#OvnW$&?XKC zcm|zP4)9C`$N`?Ez(M5z+k3b5!Ch>7o11p*C}sYNGGN=zt;=4X@OTadn5FYd0ahwN z3b0y%E>VC&sNrDTw>oI4YHu56NwuO(2q(DaP=A-uuu^}`3XuA1RbZc~Key9H*c5GH zk8P-F+@0W-L-}1zqe}T*qW~$t>lCm#!!~X%%dvZxYrl=vRD(qs z=f5X->M(xqpdZTk-J$>)zjg)wPceS;(=vW`%__}telPYu5V_-4vRjq&+fLvBaelM& zwv-{~*W3lJ?;G^$FxS_C>-!lyM!CLU5a;tO7=WgH3; zPfH_zGUnZMXel~ksa$@&mq0|_dFE^3(1R5I?JHU4(0U)Gi%RR=L%`B{xUjpIz^Qnu zQ@t0CIE!S#)p7q#*}w<$Wdrhyil8pr)Dl#K?{92Y$w2sDvU2s>QB2U`&p0B44*w<8 z7eoSuy!KrAK||wi(IP}5gM#9kE?(ZAjsd~T+eg@Sr{k{nbQus|BCra;DsNxLE^nnt z=kgZKrM!k|^5U_Pe9kR^wYpFZv+-UNdK5X$^bP(+NI_S_R z%Z|2N>&hM?#3|&I53sl-Qg~;Cuk*%Th3%faTJ#&K468E^Vv-a~v85}vOLrIwPf1}4 zs2Bw`VeBppbCn z2+Vl|ln&cLKJhWyd{B?0ATwTm^%q59rhrB75D{~ z(7^mR0j-(YoBg#GzraKf%tQj40AOSUW;KCr0MM%*?lab-4*T^r_NcO7PZH=l`}GPb mIc2|IC7|qAZ`x4ys}BKXzxokS_G<+JWxu{kpfLLtl>R?wQJP`^ literal 0 HcmV?d00001 diff --git a/db_scripts/README b/db_scripts/README new file mode 100644 index 0000000..98e4f9c --- /dev/null +++ b/db_scripts/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/db_scripts/env.py b/db_scripts/env.py new file mode 100644 index 0000000..0192775 --- /dev/null +++ b/db_scripts/env.py @@ -0,0 +1,80 @@ +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +from app.db.models import Base +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +target_metadata = Base.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + render_as_batch=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/db_scripts/script.py.mako b/db_scripts/script.py.mako new file mode 100644 index 0000000..55df286 --- /dev/null +++ b/db_scripts/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/db_scripts/versions/720a6289a697_1_1_0.py b/db_scripts/versions/720a6289a697_1_1_0.py new file mode 100644 index 0000000..6eb4d57 --- /dev/null +++ b/db_scripts/versions/720a6289a697_1_1_0.py @@ -0,0 +1,150 @@ +"""1.1.0 + +Revision ID: 720a6289a697 +Revises: None +Create Date: 2023-01-22 08:18:00.723780 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '720a6289a697' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # 1.0.0 + op.execute('DROP TABLE IF EXISTS IGNORED_WORDS') + op.execute('DROP TABLE IF EXISTS REPLACED_WORDS') + op.execute('DROP TABLE IF EXISTS OFFSET_WORDS') + try: + with op.batch_alter_table("CUSTOM_WORDS") as batch_op: + batch_op.alter_column('OFFSET', type_=sa.Text, existing_type=sa.Integer) + except Exception as e: + print(str(e)) + # 1.0.1 + try: + with op.batch_alter_table("CONFIG_USER_RSS") as batch_op: + batch_op.add_column(sa.Column('SAVE_PATH', sa.Text)) + batch_op.add_column(sa.Column('DOWNLOAD_SETTING', sa.Integer)) + except Exception as e: + print(str(e)) + # 1.0.2 + try: + with op.batch_alter_table("RSS_MOVIES") as batch_op: + batch_op.add_column(sa.Column('RSS_SITES', sa.Text)) + batch_op.add_column(sa.Column('SEARCH_SITES', sa.Text)) + batch_op.add_column(sa.Column('OVER_EDITION', sa.Integer)) + batch_op.add_column(sa.Column('FILTER_RESTYPE', sa.Text)) + batch_op.add_column(sa.Column('FILTER_PIX', sa.Text)) + batch_op.add_column(sa.Column('FILTER_RULE', sa.Integer)) + batch_op.add_column(sa.Column('FILTER_TEAM', sa.Text)) + batch_op.add_column(sa.Column('SAVE_PATH', sa.Text)) + batch_op.add_column(sa.Column('DOWNLOAD_SETTING', sa.Integer)) + batch_op.add_column(sa.Column('FUZZY_MATCH', sa.Integer)) + batch_op.add_column(sa.Column('NOTE', sa.Text)) + except Exception as e: + print(str(e)) + try: + with op.batch_alter_table("RSS_TVS") as batch_op: + batch_op.add_column(sa.Column('RSS_SITES', sa.Text)) + batch_op.add_column(sa.Column('SEARCH_SITES', sa.Text)) + batch_op.add_column(sa.Column('OVER_EDITION', sa.Integer)) + batch_op.add_column(sa.Column('FILTER_RESTYPE', sa.Text)) + batch_op.add_column(sa.Column('FILTER_PIX', sa.Text)) + batch_op.add_column(sa.Column('FILTER_RULE', sa.Integer)) + batch_op.add_column(sa.Column('FILTER_TEAM', sa.Text)) + batch_op.add_column(sa.Column('SAVE_PATH', sa.Text)) + batch_op.add_column(sa.Column('DOWNLOAD_SETTING', sa.Integer)) + batch_op.add_column(sa.Column('FUZZY_MATCH', sa.Integer)) + batch_op.add_column(sa.Column('TOTAL_EP', sa.Integer)) + batch_op.add_column(sa.Column('CURRENT_EP', sa.Integer)) + batch_op.add_column(sa.Column('NOTE', sa.Text)) + except Exception as e: + print(str(e)) + # 1.0.3 + try: + with op.batch_alter_table("TRANSFER_HISTORY") as batch_op: + batch_op.alter_column('FILE_PATH', new_column_name="SOURCE_PATH", existing_type=sa.Text) + batch_op.alter_column('FILE_NAME', new_column_name="SOURCE_FILENAME", existing_type=sa.Text) + batch_op.alter_column('SE', new_column_name="SEASON_EPISODE", existing_type=sa.Text) + batch_op.add_column(sa.Column('TMDBID', sa.Integer)) + batch_op.add_column(sa.Column('DEST_PATH', sa.Text)) + batch_op.add_column(sa.Column('DEST_FILENAME', sa.Text)) + except Exception as e: + print(str(e)) + try: + with op.batch_alter_table("DOWNLOAD_SETTING") as batch_op: + batch_op.add_column(sa.Column('DOWNLOADER', sa.Text)) + except Exception as e: + print(str(e)) + # 1.0.7 + try: + with op.batch_alter_table("TRANSFER_UNKNOWN") as batch_op: + batch_op.add_column(sa.Column('MODE', sa.Text, nullable=True)) + except Exception as e: + print(str(e)) + # 1.0.8 + try: + with op.batch_alter_table("CONFIG_USER_RSS") as batch_op: + batch_op.add_column(sa.Column('RECOGNIZATION', sa.Text, nullable=True)) + batch_op.add_column(sa.Column('MEDIAINFOS', sa.Text, nullable=True)) + except Exception as e: + print(str(e)) + # 1.0.9 + try: + with op.batch_alter_table("SITE_USER_INFO_STATS") as batch_op: + batch_op.drop_column('FAVICON') + except Exception as e: + print(e) + try: + with op.batch_alter_table("DOUBAN_MEDIAS") as batch_op: + batch_op.add_column(sa.Column('ADD_TIME', sa.Text, nullable=True)) + except Exception as e: + print(str(e)) + try: + with op.batch_alter_table("SITE_BRUSH_TASK") as batch_op: + batch_op.add_column(sa.Column('SENDMESSAGE', sa.Text, nullable=True)) + batch_op.add_column(sa.Column('FORCEUPLOAD', sa.Text, nullable=True)) + except Exception as e: + print(str(e)) + # 1.0.10 + try: + with op.batch_alter_table("RSS_MOVIES") as batch_op: + batch_op.add_column(sa.Column('FILTER_ORDER', sa.Integer, nullable=True)) + except Exception as e: + print(str(e)) + try: + with op.batch_alter_table("RSS_TVS") as batch_op: + batch_op.add_column(sa.Column('FILTER_ORDER', sa.Integer, nullable=True)) + except Exception as e: + print(str(e)) + # 1.0.11 + try: + with op.batch_alter_table("RSS_MOVIES") as batch_op: + batch_op.add_column(sa.Column('KEYWORD', sa.Text, nullable=True)) + except Exception as e: + print(str(e)) + try: + with op.batch_alter_table("RSS_TVS") as batch_op: + batch_op.add_column(sa.Column('KEYWORD', sa.Text, nullable=True)) + except Exception as e: + print(str(e)) + # 1.0.12 + try: + with op.batch_alter_table("CONFIG_USER_RSS") as batch_op: + batch_op.add_column(sa.Column('OVER_EDITION', sa.Integer, nullable=True)) + batch_op.add_column(sa.Column('SITES', sa.Text, nullable=True)) + batch_op.add_column(sa.Column('FILTER_ARGS', sa.Text, nullable=True)) + except Exception as e: + print(str(e)) + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/dbscript_gen.py b/dbscript_gen.py new file mode 100644 index 0000000..d5e4b52 --- /dev/null +++ b/dbscript_gen.py @@ -0,0 +1,12 @@ +import os +from config import Config +from alembic.config import Config as AlembicConfig +from alembic.command import revision as alembic_revision + +db_version = input("请输入版本号:") +db_location = os.path.join(Config().get_config_path(), 'user.db').replace('\\', '/') +script_location = os.path.join(os.path.dirname(__file__), 'db_scripts').replace('\\', '/') +alembic_cfg = AlembicConfig() +alembic_cfg.set_main_option('script_location', script_location) +alembic_cfg.set_main_option('sqlalchemy.url', f"sqlite:///{db_location}") +alembic_revision(alembic_cfg, db_version, True) diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..293e513 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,41 @@ +FROM alpine +RUN apk add --no-cache libffi-dev \ + && apk add --no-cache $(echo $(wget --no-check-certificate -qO- https://raw.githubusercontent.com/NAStool/nas-tools/master/package_list.txt)) \ + && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ + && echo "${TZ}" > /etc/timezone \ + && ln -sf /usr/bin/python3 /usr/bin/python \ + && curl https://rclone.org/install.sh | bash \ + && if [ "$(uname -m)" = "x86_64" ]; then ARCH=amd64; elif [ "$(uname -m)" = "aarch64" ]; then ARCH=arm64; fi \ + && curl https://dl.min.io/client/mc/release/linux-${ARCH}/mc --create-dirs -o /usr/bin/mc \ + && chmod +x /usr/bin/mc \ + && pip install --upgrade pip setuptools wheel \ + && pip install cython \ + && pip install -r https://raw.githubusercontent.com/NAStool/nas-tools/master/requirements.txt \ + && apk del libffi-dev \ + && npm install pm2 -g \ + && rm -rf /tmp/* /root/.cache /var/cache/apk/* +ENV LANG="C.UTF-8" \ + TZ="Asia/Shanghai" \ + NASTOOL_CONFIG="/config/config.yaml" \ + NASTOOL_AUTO_UPDATE=true \ + NASTOOL_CN_UPDATE=true \ + NASTOOL_VERSION=master \ + PS1="\u@\h:\w \$ " \ + REPO_URL="https://github.com/NAStool/nas-tools.git" \ + PYPI_MIRROR="https://pypi.tuna.tsinghua.edu.cn/simple" \ + ALPINE_MIRROR="mirrors.ustc.edu.cn" \ + PUID=0 \ + PGID=0 \ + UMASK=000 \ + WORKDIR="/nas-tools" +WORKDIR ${WORKDIR} +RUN python_ver=$(python3 -V | awk '{print $2}') \ + && echo "${WORKDIR}/" > /usr/lib/python${python_ver%.*}/site-packages/nas-tools.pth \ + && echo 'fs.inotify.max_user_watches=524288' >> /etc/sysctl.conf \ + && echo 'fs.inotify.max_user_instances=524288' >> /etc/sysctl.conf \ + && git config --global pull.ff only \ + && git clone -b master ${REPO_URL} ${WORKDIR} --depth=1 --recurse-submodule \ + && git config --global --add safe.directory ${WORKDIR} +EXPOSE 3000 +VOLUME ["/config"] +ENTRYPOINT ["/nas-tools/docker/entrypoint.sh"] \ No newline at end of file diff --git a/docker/Dockerfile.beta b/docker/Dockerfile.beta new file mode 100644 index 0000000..fafe141 --- /dev/null +++ b/docker/Dockerfile.beta @@ -0,0 +1,41 @@ +FROM alpine +RUN apk add --no-cache libffi-dev \ + && apk add --no-cache $(echo $(wget --no-check-certificate -qO- https://raw.githubusercontent.com/NAStool/nas-tools/dev/package_list.txt)) \ + && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ + && echo "${TZ}" > /etc/timezone \ + && ln -sf /usr/bin/python3 /usr/bin/python \ + && curl https://rclone.org/install.sh | bash \ + && if [ "$(uname -m)" = "x86_64" ]; then ARCH=amd64; elif [ "$(uname -m)" = "aarch64" ]; then ARCH=arm64; fi \ + && curl https://dl.min.io/client/mc/release/linux-${ARCH}/mc --create-dirs -o /usr/bin/mc \ + && chmod +x /usr/bin/mc \ + && pip install --upgrade pip setuptools wheel \ + && pip install cython \ + && pip install -r https://raw.githubusercontent.com/NAStool/nas-tools/dev/requirements.txt \ + && apk del libffi-dev \ + && npm install pm2 -g \ + && rm -rf /tmp/* /root/.cache /var/cache/apk/* +ENV LANG="C.UTF-8" \ + TZ="Asia/Shanghai" \ + NASTOOL_CONFIG="/config/config.yaml" \ + NASTOOL_AUTO_UPDATE=true \ + NASTOOL_CN_UPDATE=true \ + NASTOOL_VERSION=dev \ + PS1="\u@\h:\w \$ " \ + REPO_URL="https://github.com/NAStool/nas-tools.git" \ + PYPI_MIRROR="https://pypi.tuna.tsinghua.edu.cn/simple" \ + ALPINE_MIRROR="mirrors.ustc.edu.cn" \ + PUID=0 \ + PGID=0 \ + UMASK=000 \ + WORKDIR="/nas-tools" +WORKDIR ${WORKDIR} +RUN python_ver=$(python3 -V | awk '{print $2}') \ + && echo "${WORKDIR}/" > /usr/lib/python${python_ver%.*}/site-packages/nas-tools.pth \ + && echo 'fs.inotify.max_user_watches=524288' >> /etc/sysctl.conf \ + && echo 'fs.inotify.max_user_instances=524288' >> /etc/sysctl.conf \ + && git config --global pull.ff only \ + && git clone -b dev ${REPO_URL} ${WORKDIR} --depth=1 --recurse-submodule \ + && git config --global --add safe.directory ${WORKDIR} +EXPOSE 3000 +VOLUME ["/config"] +ENTRYPOINT ["/nas-tools/docker/entrypoint.sh"] diff --git a/docker/Dockerfile.lite b/docker/Dockerfile.lite new file mode 100644 index 0000000..023172a --- /dev/null +++ b/docker/Dockerfile.lite @@ -0,0 +1,48 @@ +FROM alpine +RUN apk add --no-cache libffi-dev \ + git \ + gcc \ + musl-dev \ + python3-dev \ + py3-pip \ + libxml2-dev \ + libxslt-dev \ + tzdata \ + su-exec \ + dumb-init \ + npm \ + && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \ + && echo "${TZ}" > /etc/timezone \ + && ln -sf /usr/bin/python3 /usr/bin/python \ + && pip install --upgrade pip setuptools wheel \ + && pip install cython \ + && pip install -r https://raw.githubusercontent.com/NAStool/nas-tools/master/requirements.txt \ + && npm install pm2 -g \ + && apk del --purge libffi-dev gcc musl-dev libxml2-dev libxslt-dev \ + && pip uninstall -y cython \ + && rm -rf /tmp/* /root/.cache /var/cache/apk/* +ENV LANG="C.UTF-8" \ + TZ="Asia/Shanghai" \ + NASTOOL_CONFIG="/config/config.yaml" \ + NASTOOL_AUTO_UPDATE=false \ + NASTOOL_CN_UPDATE=true \ + NASTOOL_VERSION=lite \ + PS1="\u@\h:\w \$ " \ + REPO_URL="https://github.com/NAStool/nas-tools.git" \ + PYPI_MIRROR="https://pypi.tuna.tsinghua.edu.cn/simple" \ + ALPINE_MIRROR="mirrors.ustc.edu.cn" \ + PUID=0 \ + PGID=0 \ + UMASK=000 \ + WORKDIR="/nas-tools" +WORKDIR ${WORKDIR} +RUN python_ver=$(python3 -V | awk '{print $2}') \ + && echo "${WORKDIR}/" > /usr/lib/python${python_ver%.*}/site-packages/nas-tools.pth \ + && echo 'fs.inotify.max_user_watches=524288' >> /etc/sysctl.conf \ + && echo 'fs.inotify.max_user_instances=524288' >> /etc/sysctl.conf \ + && git config --global pull.ff only \ + && git clone -b master ${REPO_URL} ${WORKDIR} --depth=1 --recurse-submodule \ + && git config --global --add safe.directory ${WORKDIR} +EXPOSE 3000 +VOLUME ["/config"] +ENTRYPOINT ["/nas-tools/docker/entrypoint.sh"] \ No newline at end of file diff --git a/docker/compose.yml b/docker/compose.yml new file mode 100644 index 0000000..18e2eb8 --- /dev/null +++ b/docker/compose.yml @@ -0,0 +1,19 @@ +version: "3" +services: + nas-tools: + image: jxxghp/nas-tools:latest + ports: + - 3000:3000 # 默认的webui控制端口 + volumes: + - ./config:/config # 冒号左边请修改为你想保存配置的路径 + - /你的媒体目录:/你想设置的容器内能见到的目录 # 媒体目录,多个目录需要分别映射进来,需要满足配置文件说明中的要求 + environment: + - PUID=0 # 想切换为哪个用户来运行程序,该用户的uid + - PGID=0 # 想切换为哪个用户来运行程序,该用户的gid + - UMASK=000 # 掩码权限,默认000,可以考虑设置为022 + - NASTOOL_AUTO_UPDATE=false # 如需在启动容器时自动升级程程序请设置为true + #- REPO_URL=https://ghproxy.com/https://github.com/NAStool/nas-tools.git # 当你访问github网络很差时,可以考虑解释本行注释 + restart: always + network_mode: bridge + hostname: nas-tools + container_name: nas-tools \ No newline at end of file diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 0000000..d6fd324 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +cd ${WORKDIR} +if [ "${NASTOOL_AUTO_UPDATE}" = "true" ]; then + if [ ! -s /tmp/requirements.txt.sha256sum ]; then + sha256sum requirements.txt > /tmp/requirements.txt.sha256sum + fi + if [ ! -s /tmp/third_party.txt.sha256sum ]; then + sha256sum third_party.txt > /tmp/third_party.txt.sha256sum + fi + if [ "${NASTOOL_VERSION}" != "lite" ]; then + if [ ! -s /tmp/package_list.txt.sha256sum ]; then + sha256sum package_list.txt > /tmp/package_list.txt.sha256sum + fi + fi + echo "更新程序..." + git remote set-url origin "${REPO_URL}" &> /dev/null + echo "windows/" > .gitignore + if [ "${NASTOOL_VERSION}" == "dev" ]; then + branch="dev" + else + branch="master" + fi + git clean -dffx + git fetch --depth 1 origin ${branch} + git reset --hard origin/${branch} + if [ $? -eq 0 ]; then + echo "更新成功..." + # Python依赖包更新 + hash_old=$(cat /tmp/requirements.txt.sha256sum) + hash_new=$(sha256sum requirements.txt) + if [ "${hash_old}" != "${hash_new}" ]; then + echo "检测到requirements.txt有变化,重新安装依赖..." + if [ "${NASTOOL_CN_UPDATE}" = "true" ]; then + pip install --upgrade pip setuptools wheel -i "${PYPI_MIRROR}" + pip install -r requirements.txt -i "${PYPI_MIRROR}" + else + pip install --upgrade pip setuptools wheel + pip install -r requirements.txt + fi + if [ $? -ne 0 ]; then + echo "无法安装依赖,请更新镜像..." + else + echo "依赖安装成功..." + sha256sum requirements.txt > /tmp/requirements.txt.sha256sum + hash_old=$(cat /tmp/third_party.txt.sha256sum) + hash_new=$(sha256sum third_party.txt) + if [ "${hash_old}" != "${hash_new}" ]; then + echo "检测到third_party.txt有变化,更新第三方组件..." + git submodule update --init --recursive + if [ $? -ne 0 ]; then + echo "无法更新第三方组件,请更新镜像..." + else + echo "第三方组件安装成功..." + sha256sum third_party.txt > /tmp/third_party.txt.sha256sum + fi + fi + fi + fi + # 系统软件包更新 + if [ "${NASTOOL_VERSION}" != "lite" ]; then + hash_old=$(cat /tmp/package_list.txt.sha256sum) + hash_new=$(sha256sum package_list.txt) + if [ "${hash_old}" != "${hash_new}" ]; then + echo "检测到package_list.txt有变化,更新软件包..." + if [ "${NASTOOL_CN_UPDATE}" = "true" ]; then + sed -i "s/dl-cdn.alpinelinux.org/${ALPINE_MIRROR}/g" /etc/apk/repositories + apk update -f + fi + apk add --no-cache libffi-dev + apk add --no-cache $(echo $(cat package_list.txt)) + if [ $? -ne 0 ]; then + echo "无法更新软件包,请更新镜像..." + else + apk del libffi-dev + echo "软件包安装成功..." + sha256sum package_list.txt > /tmp/package_list.txt.sha256sum + fi + fi + fi + else + echo "更新失败,继续使用旧的程序来启动..." + fi +else + echo "程序自动升级已关闭,如需自动升级请在创建容器时设置环境变量:NASTOOL_AUTO_UPDATE=true" +fi + +echo "以PUID=${PUID},PGID=${PGID}的身份启动程序..." + +if [ "${NASTOOL_VERSION}" = "lite" ]; then + mkdir -p /.pm2 + chown -R "${PUID}":"${PGID}" "${WORKDIR}" /config /.pm2 +else + mkdir -p /.local + mkdir -p /.pm2 + chown -R "${PUID}":"${PGID}" "${WORKDIR}" /config /usr/lib/chromium /.local /.pm2 + export PATH=${PATH}:/usr/lib/chromium +fi +umask "${UMASK}" +exec su-exec "${PUID}":"${PGID}" "$(which dumb-init)" "$(which pm2-runtime)" start run.py -n NAStool --interpreter python3 diff --git a/docker/readme.md b/docker/readme.md new file mode 100644 index 0000000..c18713b --- /dev/null +++ b/docker/readme.md @@ -0,0 +1,93 @@ +## 特点 + +- 基于alpine实现,镜像体积小; + +- 镜像层数少; + +- 支持 amd64/arm64 架构; + +- 重启即可更新程序,如果依赖有变化,会自动尝试重新安装依赖,若依赖自动安装不成功,会提示更新镜像; + +- 可以以非root用户执行任务,降低程序权限和潜在风险; + +- 可以设置文件掩码权限umask。 + +- lite 版本不包含浏览器内核及xvfb,不支持浏览器仿真;不支持Rclone/Minio转移方式;不支持复杂依赖变更时的自动安装升级;但是体积更小。 + +## 创建 + +**注意** + +- 媒体目录的设置必须符合 [配置说明](https://github.com/NAStool/nas-tools#%E9%85%8D%E7%BD%AE) 的要求。 + +- umask含义详见:http://www.01happy.com/linux-umask-analyze 。 + +- 创建后请根据 [配置说明](https://github.com/NAStool/nas-tools#%E9%85%8D%E7%BD%AE) 及该文件本身的注释,修改`config/config.yaml`,修改好后再重启容器,最后访问`http://:`。 + +**docker cli** + +``` +docker run -d \ + --name nas-tools \ + --hostname nas-tools \ + -p 3000:3000 `# 默认的webui控制端口` \ + -v $(pwd)/config:/config `# 冒号左边请修改为你想在主机上保存配置文件的路径` \ + -v /你的媒体目录:/你想设置的容器内能见到的目录 `# 媒体目录,多个目录需要分别映射进来` \ + -e PUID=0 `# 想切换为哪个用户来运行程序,该用户的uid,详见下方说明` \ + -e PGID=0 `# 想切换为哪个用户来运行程序,该用户的gid,详见下方说明` \ + -e UMASK=000 `# 掩码权限,默认000,可以考虑设置为022` \ + -e NASTOOL_AUTO_UPDATE=false `# 如需在启动容器时自动升级程程序请设置为true` \ + -e NASTOOL_CN_UPDATE=false `# 如果开启了容器启动自动升级程序,并且网络不太友好时,可以设置为true,会使用国内源进行软件更新` \ + jxxghp/nas-tools +``` + +如果你访问github的网络不太好,可以考虑在创建容器时增加设置一个环境变量`-e REPO_URL="https://ghproxy.com/https://github.com/NAStool/nas-tools.git" \`。 + +**docker-compose** + +新建`docker-compose.yaml`文件如下,并以命令`docker-compose up -d`启动。 + +``` +version: "3" +services: + nas-tools: + image: jxxghp/nas-tools:latest + ports: + - 3000:3000 # 默认的webui控制端口 + volumes: + - ./config:/config # 冒号左边请修改为你想保存配置的路径 + - /你的媒体目录:/你想设置的容器内能见到的目录 # 媒体目录,多个目录需要分别映射进来,需要满足配置文件说明中的要求 + environment: + - PUID=0 # 想切换为哪个用户来运行程序,该用户的uid + - PGID=0 # 想切换为哪个用户来运行程序,该用户的gid + - UMASK=000 # 掩码权限,默认000,可以考虑设置为022 + - NASTOOL_AUTO_UPDATE=false # 如需在启动容器时自动升级程程序请设置为true + - NASTOOL_CN_UPDATE=false # 如果开启了容器启动自动升级程序,并且网络不太友好时,可以设置为true,会使用国内源进行软件更新 + #- REPO_URL=https://ghproxy.com/https://github.com/NAStool/nas-tools.git # 当你访问github网络很差时,可以考虑解释本行注释 + restart: always + network_mode: bridge + hostname: nas-tools + container_name: nas-tools +``` + +## 后续如何更新 + +- 正常情况下,如果设置了`NASTOOL_AUTO_UPDATE=true`,重启容器即可自动更新nas-tools程序。 + +- 设置了`NASTOOL_AUTO_UPDATE=true`时,如果启动时的日志提醒你 "更新失败,继续使用旧的程序来启动...",请再重启一次,如果一直都报此错误,请改善你的网络。 + +- 设置了`NASTOOL_AUTO_UPDATE=true`时,如果启动时的日志提醒你 "无法安装依赖,请更新镜像...",则需要删除旧容器,删除旧镜像,重新pull镜像,再重新创建容器。 + +## 关于PUID/PGID的说明 + +- 如在使用诸如emby、jellyfin、plex、qbittorrent、transmission、deluge、jackett、sonarr、radarr等等的docker镜像,请保证创建本容器时的PUID/PGID和它们一样。 + +- 在docker宿主上,登陆媒体文件所有者的这个用户,然后分别输入`id -u`和`id -g`可获取到uid和gid,分别设置为PUID和PGID即可。 + +- `PUID=0` `PGID=0`指root用户,它拥有最高权限,若你的媒体文件的所有者不是root,不建议设置为`PUID=0` `PGID=0`。 + +## 如果要硬连接如何映射 + +参考下图,由imogel@telegram制作。 + +![如何映射](volume.png) diff --git a/docker/volume.png b/docker/volume.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0d81f368ef3436784c1736326de8c3c33922c1 GIT binary patch literal 40521 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 xF!?Y?fI$97&Erc9U|0WgvyTkz|NkpBa6P^$w 1: + logport = int(logserver[1] or '514') + else: + logport = 514 + log_server_handler = logging.handlers.SysLogHandler((logip, logport), + logging.handlers.SysLogHandler.LOG_USER) + log_server_handler.setFormatter(logging.Formatter('%(filename)s: %(message)s')) + self.logger.addHandler(log_server_handler) + elif logtype == "file": + # 记录日志到文件 + logpath = os.environ.get('NASTOOL_LOG') or self.__config.get_config('app').get('logpath') or "" + if logpath: + if not os.path.exists(logpath): + os.makedirs(logpath) + log_file_handler = RotatingFileHandler(filename=os.path.join(logpath, module + ".txt"), + maxBytes=5 * 1024 * 1024, + backupCount=3, + encoding='utf-8') + log_file_handler.setFormatter(logging.Formatter('%(asctime)s\t%(levelname)s: %(message)s')) + self.logger.addHandler(log_file_handler) + # 记录日志到终端 + log_console_handler = logging.StreamHandler() + log_console_handler.setFormatter(logging.Formatter('%(asctime)s\t%(levelname)s: %(message)s')) + self.logger.addHandler(log_console_handler) + + @staticmethod + def get_instance(module): + if not module: + module = "run" + if Logger.__instance.get(module): + return Logger.__instance.get(module) + with lock: + Logger.__instance[module] = Logger(module) + return Logger.__instance.get(module) + + +def __append_log_queue(level, text): + global LOG_INDEX, LOG_QUEUE + with lock: + text = escape(text) + if text.startswith("【"): + source = re.findall(r"(?<=【).*?(?=】)", text)[0] + text = text.replace(f"【{source}】", "") + else: + source = "System" + LOG_QUEUE.append({ + "time": time.strftime('%H:%M:%S', time.localtime(time.time())), + "level": level, + "source": source, + "text": text}) + LOG_INDEX += 1 + + +def debug(text, module=None): + return Logger.get_instance(module).logger.debug(text) + + +def info(text, module=None): + __append_log_queue("INFO", text) + return Logger.get_instance(module).logger.info(text) + + +def error(text, module=None): + __append_log_queue("ERROR", text) + return Logger.get_instance(module).logger.error(text) + + +def warn(text, module=None): + __append_log_queue("WARN", text) + return Logger.get_instance(module).logger.warning(text) + + +def console(text): + __append_log_queue("INFO", text) + print(text) diff --git a/package_list.txt b/package_list.txt new file mode 100644 index 0000000..153cc56 --- /dev/null +++ b/package_list.txt @@ -0,0 +1,19 @@ +git +gcc +musl-dev +python3-dev +py3-pip +libxml2-dev +libxslt-dev +tzdata +su-exec +zip +curl +bash +fuse +xvfb +inotify-tools +chromium-chromedriver +npm +dumb-init +ffmpeg \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..cbf82ec --- /dev/null +++ b/requirements.txt @@ -0,0 +1,104 @@ +alembic==1.8.1 +aniso8601==9.0.1 +APScheduler==3.9.1 +asttokens==2.0.8 +async-generator==1.10 +attrs==22.1.0 +backcall==0.2.0 +backports.shutil-get-terminal-size==1.0.0 +beautifulsoup4==4.11.1 +better-exceptions==0.3.3 +bs4==0.0.1 +cacheout==0.14.1 +certifi==2022.6.15 +cffi==1.15.1 +charset-normalizer==2.1.1 +click==8.1.3 +cn2an==0.5.17 +colorama==0.4.4 +colored==1.3.93 +cssselect==1.1.0 +DBUtils==3.0.2 +dateparser==1.1.4 +decorator==5.1.1 +executing==1.1.0 +Flask==2.1.2 +Flask-Login==0.6.2 +fast-bencode==1.1.3 +flask-compress==1.13 +flask-restx==0.5.1 +greenlet==1.1.3.post0 +h11==0.12.0 +humanize==4.4.0 +idna==3.3 +influxdb==5.3.1 +itsdangerous==2.1.2 +jedi==0.18.1 +Jinja2==3.1.2 +jsonpath==0.82 +jsonschema==4.16.0 +loguru==0.6.0 +lxml==4.9.1 +Mako==1.2.3 +MarkupSafe==2.1.1 +matplotlib-inline==0.1.6 +msgpack==1.0.4 +outcome==1.2.0 +parse==1.19.0 +parsel==1.6.0 +parso==0.8.3 +pexpect==4.8.0 +pickleshare==0.7.5 +pikpakapi==0.1.1 +proces==0.1.2 +prompt-toolkit==3.0.31 +ptyprocess==0.7.0 +pure-eval==0.2.2 +pycparser==2.21 +pycryptodome==3.15.0 +Pygments==2.13.0 +PyJWT==2.5.0 +pymongo==4.2.0 +PyMySQL==1.0.2 +pyperclip==1.8.2 +pypushdeer==0.0.3 +pyquery==1.4.3 +pyrsistent==0.18.1 +PySocks==1.7.1 +python-dateutil==2.8.2 +python-dotenv==0.20.0 +pytz==2022.2.1 +pytz-deprecation-shim==0.1.0.post0 +PyVirtualDisplay==3.0 +redis==3.5.3 +redis-py-cluster==2.1.3 +regex==2022.9.13 +requests==2.28.1 +ruamel.yaml==0.17.21 +ruamel.yaml.clib==0.2.7 +selenium==4.4.3 +six==1.16.0 +slack-sdk==3.19.5 +sniffio==1.2.0 +sortedcontainers==2.4.0 +soupsieve==2.3.2.post1 +SQLAlchemy==1.4.42 +stack-data==0.5.1 +terminal-layout==2.1.2 +tqdm==4.64.0 +traitlets==5.4.0 +trio==0.21.0 +trio-websocket==0.9.2 +typing_extensions==4.3.0 +tzdata==2022.2 +tzlocal==4.2 +undetected-chromedriver==3.1.7 +urllib3==1.26.12 +w3lib==2.0.1 +watchdog==2.1.9 +wcwidth==0.2.5 +webdriver-manager==3.8.5 +websockets==10.3 +Werkzeug==2.1.2 +wsproto==1.2.0 +zhconv==1.4.3 diff --git a/run.py b/run.py new file mode 100644 index 0000000..465d3de --- /dev/null +++ b/run.py @@ -0,0 +1,199 @@ +import os +import signal +import sys +import time +import warnings + +from watchdog.events import FileSystemEventHandler +from watchdog.observers import Observer + +warnings.filterwarnings('ignore') + +# 运行环境判断 +is_windows_exe = getattr(sys, 'frozen', False) and (os.name == "nt") +if is_windows_exe: + # 托盘相关库 + import threading + from windows.trayicon import TrayIcon, NullWriter + + # 初始化环境变量 + os.environ["NASTOOL_CONFIG"] = os.path.join(os.path.dirname(sys.executable), + "config", + "config.yaml").replace("\\", "/") + os.environ["NASTOOL_LOG"] = os.path.join(os.path.dirname(sys.executable), + "config", + "logs").replace("\\", "/") + try: + config_dir = os.path.join(os.path.dirname(sys.executable), + "config").replace("\\", "/") + if not os.path.exists(config_dir): + os.makedirs(config_dir) + except Exception as err: + print(str(err)) + +from config import Config +import log +from web.main import App +from app.utils import SystemUtils, ConfigLoadCache +from app.utils.commons import INSTANCES +from app.db import init_db, update_db, init_data +from app.helper import IndexerHelper, DisplayHelper, ChromeHelper +from app.brushtask import BrushTask +from app.rsschecker import RssChecker +from app.scheduler import run_scheduler, restart_scheduler +from app.sync import run_monitor, restart_monitor +from app.torrentremover import TorrentRemover +from app.speedlimiter import SpeedLimiter +from check_config import update_config, check_config +from version import APP_VERSION + + +def sigal_handler(num, stack): + """ + 信号处理 + """ + if SystemUtils.is_docker(): + log.warn('捕捉到退出信号:%s,开始退出...' % num) + # 停止虚拟显示 + DisplayHelper().quit() + # 退出主进程 + sys.exit() + + +def get_run_config(): + """ + 获取运行配置 + """ + _web_host = "::" + _web_port = 3000 + _ssl_cert = None + _ssl_key = None + _debug = False + + app_conf = Config().get_config('app') + if app_conf: + if app_conf.get("web_host"): + _web_host = app_conf.get("web_host").replace('[', '').replace(']', '') + _web_port = int(app_conf.get('web_port')) if str(app_conf.get('web_port', '')).isdigit() else 3000 + _ssl_cert = app_conf.get('ssl_cert') + _ssl_key = app_conf.get('ssl_key') + _ssl_key = app_conf.get('ssl_key') + _debug = True if app_conf.get("debug") else False + + app_arg = dict(host=_web_host, port=_web_port, debug=_debug, threaded=True, use_reloader=False) + if _ssl_cert: + app_arg['ssl_context'] = (_ssl_cert, _ssl_key) + return app_arg + + +# 退出事件 +signal.signal(signal.SIGINT, sigal_handler) +signal.signal(signal.SIGTERM, sigal_handler) + + +def init_system(): + # 配置 + log.console('NAStool 当前版本号:%s' % APP_VERSION) + # 数据库初始化 + init_db() + # 数据库更新 + update_db() + # 数据初始化 + init_data() + # 升级配置文件 + update_config() + # 检查配置文件 + check_config() + + +def start_service(): + log.console("开始启动服务...") + # 加载索引器配置 + IndexerHelper() + # 启动虚拟显示 + DisplayHelper() + # 启动定时服务 + run_scheduler() + # 启动监控服务 + run_monitor() + # 启动刷流服务 + BrushTask() + # 启动自定义订阅服务 + RssChecker() + # 启动自动删种服务 + TorrentRemover() + # 启动播放限速服务 + SpeedLimiter() + # 初始化浏览器驱动 + if not is_windows_exe: + ChromeHelper().init_driver() + + +def monitor_config(): + class _ConfigHandler(FileSystemEventHandler): + """ + 配置文件变化响应 + """ + + def __init__(self): + FileSystemEventHandler.__init__(self) + + def on_modified(self, event): + if not event.is_directory \ + and os.path.basename(event.src_path) == "config.yaml": + # 10秒内只能加载一次 + if ConfigLoadCache.get(event.src_path): + return + ConfigLoadCache.set(event.src_path, True) + log.console("进程 %s 检测到配置文件已修改,正在重新加载..." % os.getpid()) + time.sleep(1) + # 重新加载配置 + Config().init_config() + # 重载singleton服务 + for instance in INSTANCES.values(): + if hasattr(instance, "init_config"): + instance.init_config() + # 重启定时服务 + restart_scheduler() + # 重启监控服务 + restart_monitor() + + # 配置文件监听 + _observer = Observer(timeout=10) + _observer.schedule(_ConfigHandler(), path=Config().get_config_path(), recursive=False) + _observer.daemon = True + _observer.start() + + +# 系统初始化 +init_system() + +# 启动服务 +start_service() + +# 监听配置文件变化 +monitor_config() + +# 本地运行 +if __name__ == '__main__': + # Windows启动托盘 + if is_windows_exe: + homepage = Config().get_config('app').get('domain') + if not homepage: + homepage = "http://localhost:%s" % str(Config().get_config('app').get('web_port')) + log_path = os.environ.get("NASTOOL_LOG") + + sys.stdout = NullWriter() + sys.stderr = NullWriter() + + + def traystart(): + TrayIcon(homepage, log_path) + + + if len(os.popen("tasklist| findstr %s" % os.path.basename(sys.executable), 'r').read().splitlines()) <= 2: + p1 = threading.Thread(target=traystart, daemon=True) + p1.start() + + # gunicorn 启动 + App.run(**get_run_config()) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/__init__.py b/tests/cases/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/meta_cases.py b/tests/cases/meta_cases.py new file mode 100644 index 0000000..f8001bc --- /dev/null +++ b/tests/cases/meta_cases.py @@ -0,0 +1,913 @@ +meta_cases = [{ + "title": "【爪爪字幕组】★7月新番[欢迎来到实力至上主义的教室 第二季/Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e S2][11][1080p][HEVC][GB][MP4][招募翻译校对]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Youkoso Jitsuryoku Shijou Shugi No Kyoushitsu E", + "year": "", + "part": "", + "season": "S02", + "episode": "E11", + "restype": "", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "" + } +}, { + "title": "National.Parks.Adventure.AKA.America.Wild:.National.Parks.Adventure.3D.2016.1080p.Blu-ray.AVC.TrueHD.7.1", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "National Parks Adventure", + "year": "2016", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay 3D", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "TrueHD 7.1" + } +}, { + "title": "[秋叶原冥途战争][Akiba Maid Sensou][2022][WEB-DL][1080][TV Series][第01话][LeagueWEB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Akiba Maid Sensou", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "哆啦A梦:大雄的宇宙小战争 2021 (2022) - 1080p.mp4", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "哆啦A梦:大雄的宇宙小战争 2021", + "en_name": "", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "新精武门1991 (1991).mkv", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "新精武门1991", + "en_name": "", + "year": "1991", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "24 S01 1080p WEB-DL AAC2.0 H.264-BTN", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "24", + "year": "", + "part": "", + "season": "S01", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC 2.0" + } +}, { + "title": "Qi Refining for 3000 Years S01E06 2022 1080p B-Blobal WEB-DL X264 AAC-AnimeS@AdWeb", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Qi Refining For 3000 Years", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E06", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "Noumin Kanren no Skill Bakka Agetetara Naze ka Tsuyoku Natta S01E02 2022 1080p B-Global WEB-DL X264 AAC-AnimeS@ADWeb[2022年10月新番]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Noumin Kanren No Skill Bakka Agetetara Naze Ka Tsuyoku Natta", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "dou luo da lu S01E229 2018 2160p WEB-DL H265 AAC-ADWeb[[国漫连载] 斗罗大陆 第229集 4k | 国语中字]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Dou Luo Da Lu", + "year": "2018", + "part": "", + "season": "S01", + "episode": "E229", + "restype": "WEB-DL", + "pix": "2160p", + "video_codec": "H265", + "audio_codec": "AAC" + } +}, { + "title": "Thor Love and Thunder (2022) [1080p] [WEBRip] [5.1]", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Thor Love And Thunder", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "5.1" + } +}, { + "title": "[Animations(动画片)][[诛仙][Jade Dynasty][2022][WEB-DL][2160][TV Series][TV 08][LeagueWEB]][诛仙/诛仙动画 第一季 第08集 | 类型:动画 [国语中字]][680.12 MB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Jade Dynasty", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E08", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "钢铁侠2 (2010) 1080p AC3.mp4", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "钢铁侠2", + "en_name": "", + "year": "2010", + "part": "", + "season": "", + "episode": "", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "AC3" + } +}, { + "title": "Wonder Woman 1984 2020 BluRay 1080p Atmos TrueHD 7.1 X264-EPiC", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Wonder Woman 1984", + "year": "2020", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "Atmos TrueHD 7.1" + } +}, { + "title": "9-1-1 - S04E03 - Future Tense WEBDL-1080p.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "9 1 1", + "year": "", + "part": "", + "season": "S04", + "episode": "E03", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "【幻月字幕组】【22年日剧】【据幸存的六人所说】【04】【1080P】【中日双语】", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "据幸存的六人所说", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E04", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "【爪爪字幕组】★7月新番[即使如此依旧步步进逼/Soredemo Ayumu wa Yosetekuru][09][1080p][HEVC][GB][MP4][招募翻译校对]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Soredemo Ayumu Wa Yosetekuru", + "year": "", + "part": "", + "season": "S01", + "episode": "E09", + "restype": "", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "" + } +}, { + "title": "[猎户不鸽发布组] 不死者之王 第四季 OVERLORD Ⅳ [02] [1080p] [简中内封] [2022年7月番]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "不死者之王", + "en_name": "Overlord Ⅳ", + "year": "", + "part": "", + "season": "S04", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[GM-Team][国漫][寻剑 第1季][Sword Quest Season 1][2002][02][AVC][GB][1080P]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Sword Quest", + "year": "2002", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "" + } +}, { + "title": " [猎户不鸽发布组] 组长女儿与照料专员 / 组长女儿与保姆 Kumichou Musume to Sewagakari [09] [1080p+] [简中内嵌] [2022年7月番]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "组长女儿与保姆", + "en_name": "Kumichou Musume To Sewagakari", + "year": "", + "part": "", + "season": "S01", + "episode": "E09", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "Nande Koko ni Sensei ga!? 2019 Blu-ray Remux 1080p AVC LPCM-7³ ACG", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Nande Koko Ni Sensei Ga!?", + "year": "2019", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay Remux", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "LPCM 7³" + } +}, { + "title": "30.Rock.S02E01.1080p.BluRay.X264-BORDURE.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "30 Rock", + "year": "", + "part": "", + "season": "S02", + "episode": "E01", + "restype": "BluRay", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "" + } +}, { + "title": "[Gal to Kyouryuu][02][BDRIP][1080P][H264_FLAC].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Gal To Kyouryuu", + "year": "", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "FLAC" + } +}, { + "title": "[AI-Raws] 逆境無頼カイジ #13 (BD HEVC 1920x1080 yuv444p10le FLAC)[7CFEE642].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "逆境無頼カイジ", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E13", + "restype": "BD", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "FLAC" + } +}, { + "title": "Mr. Robot - S02E06 - eps2.4_m4ster-s1ave.aes SDTV.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Mr Robot", + "year": "", + "part": "", + "season": "S02", + "episode": "E06", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[神印王座][Throne of Seal][2022][WEB-DL][2160][TV Series][TV 22][LeagueWEB] 神印王座 第一季 第22集 | 类型:动画 [国语中字][967.44 MB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Throne Of Seal", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E22", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "S02E1000.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "", + "year": "", + "part": "", + "season": "S02", + "episode": "E1000", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "西部世界 12.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "西部世界", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E12", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[ANi] OVERLORD 第四季 - 04 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Overlord", + "year": "", + "part": "", + "season": "S04", + "episode": "E04", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "AAC" + } +}, { + "title": "[SweetSub&LoliHouse] Made in Abyss S2 - 03v2 [WebRip 1080p HEVC-10bit AAC ASSx2].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Made In Abyss", + "year": "", + "part": "", + "season": "S02", + "episode": "E03", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "AAC" + } +}, { + "title": "[GM-Team][国漫][斗破苍穹 第5季][Fights Break Sphere V][2022][05][HEVC][GB][4K]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Fights Break Sphere V", + "year": "2022", + "part": "", + "season": "S05", + "episode": "E05", + "restype": "", + "pix": "2160p", + "video_codec": "HEVC", + "audio_codec": "" + } +}, { + "title": "Ousama Ranking S01E02-[1080p][BDRIP][X265.FLAC].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Ousama Ranking", + "year": "", + "part": "", + "season": "S01", + "episode": "E02", + "restype": "BDRIP", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "FLAC" + } +}, { + "title": "[Nekomoe kissaten&LoliHouse] Soredemo Ayumu wa Yosetekuru - 01v2 [WebRip 1080p HEVC-10bit EAC3 ASSx2].mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Soredemo Ayumu Wa Yosetekuru", + "year": "", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "EAC3" + } +}, { + "title": "[喵萌奶茶屋&LoliHouse] 金装的薇尔梅 / Kinsou no Vermeil - 01 [WebRip 1080p HEVC-10bit AAC][简繁内封字幕]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Kinsou No Vermeil", + "year": "", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "AAC" + } +}, { + "title": "Hataraku.Maou-sama.S02E05.2022.1080p.CR.WEB-DL.X264.AAC-ADWeb.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Hataraku Maou Sama", + "year": "2022", + "part": "", + "season": "S02", + "episode": "E05", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "The Witch Part 2:The Other One 2022 1080p WEB-DL AAC5.1 H264-tG1R0", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "The Witch Part 2:The Other One", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC 5.1" + } +}, { + "title": "一夜新娘 - S02E07 - 第 7 集.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "一夜新娘", + "en_name": "", + "year": "", + "part": "", + "season": "S02", + "episode": "E07", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[ANi] 處刑少女的生存之道 - 07 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "处刑少女的生存之道", + "en_name": "", + "year": "", + "part": "", + "season": "S01", + "episode": "E07", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "AAC" + } +}, { + "title": "Stand-up.Comedy.S01E01.PartA.2022.1080p.WEB-DL.H264.AAC-TJUPT.mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Stand Up Comedy", + "year": "2022", + "part": "PartA", + "season": "S01", + "episode": "E01", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC" + } +}, { + "title": "教父3.The.Godfather.Part.III.1990.1080p.NF.WEBRip.H264.DDP5.1-PTerWEB.mkv", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "教父3", + "en_name": "The Godfather Part Iii", + "year": "1990", + "part": "", + "season": "", + "episode": "", + "restype": "WEBRip", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "DDP 5.1" + } +}, { + "title": "A.Quiet.Place.Part.II.2020.1080p.UHD.BluRay.DD+7.1.DoVi.X265-PuTao", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "A Quiet Place Part Ii", + "year": "2020", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay DoVi UHD", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "DD 7.1" + } +}, { + "title": "Childhood.In.A.Capsule.S01E16.2022.1080p.KKTV.WEB-DL.X264.AAC-ADWeb.mkv", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Childhood In A Capsule", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E16", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "AAC" + } +}, { + "title": "[桜都字幕组] 异世界归来的舅舅 / Isekai Ojisan [01][1080p][简体内嵌]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Isekai Ojisan", + "year": "", + "part": "", + "season": "S01", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "【喵萌奶茶屋】★04月新番★[夏日重現/Summer Time Rendering][15][720p][繁日雙語][招募翻譯片源]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Summer Time Rendering", + "year": "", + "part": "", + "season": "S01", + "episode": "E15", + "restype": "", + "pix": "720p", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "[NC-Raws] 打工吧!魔王大人 第二季 / Hataraku Maou-sama!! - 02 (B-Global 1920x1080 HEVC AAC MKV)", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Hataraku Maou-Sama!!", + "year": "", + "part": "", + "season": "S02", + "episode": "E02", + "restype": "", + "pix": "1080p", + "video_codec": "HEVC", + "audio_codec": "AAC" + } +}, { + "title": "The Witch Part 2 The Other One 2022 1080p WEB-DL AAC5.1 H.264-tG1R0", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "The Witch Part 2 The Other One", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC 5.1" + } +}, { + "title": "The 355 2022 BluRay 1080p DTS-HD MA5.1 X265.10bit-BeiTai", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "The 355", + "year": "2022", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay", + "pix": "1080p", + "video_codec": "X265 10bit", + "audio_codec": "DTS-HD MA 5.1" + } +}, { + "title": "Sense8 s01-s02 2015-2017 1080P WEB-DL X265 AC3£cXcY@FRDS", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Sense8", + "year": "2015", + "part": "", + "season": "S01-S02", + "episode": "", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "" + } +}, { + "title": "The Heart of Genius S01 13-14 2022 1080p WEB-DL H264 AAC", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "The Heart Of Genius", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E13-E14", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC" + } +}, { + "title": "The Heart of Genius E13-14 2022 1080p WEB-DL H264 AAC", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "The Heart Of Genius", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E13-E14", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "H264", + "audio_codec": "AAC" + } +}, { + "title": "2022.8.2.Twelve.Monkeys.1995.GBR.4K.REMASTERED.BluRay.1080p.X264.DTS [3.4 GB]", + "subtitle": "", + "target": { + "type": "电影", + "cn_name": "", + "en_name": "Twelve Monkeys", + "year": "1995", + "part": "", + "season": "", + "episode": "", + "restype": "BluRay", + "pix": "4k", + "video_codec": "X264", + "audio_codec": "DTS" + } +}, { + "title": "[NC-Raws] 王者天下 第四季 - 17 (Baha 1920x1080 AVC AAC MP4) [3B1AA7BB].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "王者天下", + "en_name": "", + "year": "", + "part": "", + "season": "S04", + "episode": "E17", + "restype": "", + "pix": "1080p", + "video_codec": "AVC", + "audio_codec": "AAC" + } +}, { + "title": "Sense8 S2E1 2015-2017 1080P WEB-DL X265 AC3£cXcY@FRDS", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Sense8", + "year": "2015", + "part": "", + "season": "S02", + "episode": "E01", + "restype": "WEB-DL", + "pix": "1080p", + "video_codec": "X265", + "audio_codec": "" + } +}, { + "title": "[xyx98]传颂之物/Utawarerumono/うたわれるもの[BDrip][1920x1080][TV 01-26 Fin][hevc-yuv420p10 flac_ac3][ENG PGS]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "うたわれるもの", + "year": "", + "part": "", + "season": "S01", + "episode": "E01-E26", + "restype": "", + "pix": "1080p", + "video_codec": "", + "audio_codec": "flac" + } +}, { + "title": "[云歌字幕组][7月新番][欢迎来到实力至上主义的教室 第二季][01][X264 10bit][1080p][简体中文].mp4", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "欢迎来到实力至上主义的教室", + "en_name": "", + "year": "", + "part": "", + "season": "S02", + "episode": "E01", + "restype": "", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "" + } +}, { + "title": "[诛仙][Jade Dynasty][2022][WEB-DL][2160][TV Series][TV 04][LeagueWEB]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Jade Dynasty", + "year": "2022", + "part": "", + "season": "S01", + "episode": "E04", + "restype": "", + "pix": "", + "video_codec": "", + "audio_codec": "" + } +}, { + "title": "Rick and Morty.S06E06.JuRicksic.Mort.1080p.HMAX.WEBRip.DD5.1.X264-NTb[rartv]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Rick And Morty", + "year": "", + "part": "", + "season": "S06", + "episode": "E06", + "restype": "WEBRip", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "DD 5.1" + } +}, { + "title": "rick and Morty.S06E05.JuRicksic.Mort.1080p.HMAX.WEBRip.DD5.1.X264-NTb[rartv]", + "subtitle": "", + "target": { + "type": "电视剧", + "cn_name": "", + "en_name": "Rick And Morty", + "year": "", + "part": "", + "season": "S06", + "episode": "E05", + "restype": "WEBRip", + "pix": "1080p", + "video_codec": "X264", + "audio_codec": "DD 5.1" + } +}] diff --git a/tests/run.py b/tests/run.py new file mode 100644 index 0000000..4e0d2ef --- /dev/null +++ b/tests/run.py @@ -0,0 +1,12 @@ +import unittest + +from tests.test_metainfo import MetaInfoTest + +if __name__ == '__main__': + suite = unittest.TestSuite() + # 测试名称识别 + suite.addTest(MetaInfoTest('test_metainfo')) + + # 运行测试 + runner = unittest.TextTestRunner() + runner.run(suite) diff --git a/tests/test_metainfo.py b/tests/test_metainfo.py new file mode 100644 index 0000000..a638fe8 --- /dev/null +++ b/tests/test_metainfo.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +from unittest import TestCase + +from app.media.meta import MetaInfo +from tests.cases.meta_cases import meta_cases + + +class MetaInfoTest(TestCase): + def setUp(self) -> None: + pass + + def tearDown(self) -> None: + pass + + def test_metainfo(self): + for info in meta_cases: + if not info.get("title"): + continue + meta_info = MetaInfo(title=info.get("title"), subtitle=info.get("subtitle")) + target = { + "type": meta_info.type.value, + "cn_name": meta_info.cn_name or "", + "en_name": meta_info.en_name or "", + "year": meta_info.year or "", + "part": meta_info.part or "", + "season": meta_info.get_season_string(), + "episode": meta_info.get_episode_string(), + "restype": meta_info.get_edtion_string(), + "pix": meta_info.resource_pix or "", + "video_codec": meta_info.video_encode or "", + "audio_codec": meta_info.audio_encode or "" + } + self.assertEqual(target, info.get("target")) diff --git a/third_party.txt b/third_party.txt new file mode 100644 index 0000000..e478a92 --- /dev/null +++ b/third_party.txt @@ -0,0 +1,6 @@ +feapder +qbittorrent-api +anitopy +plexapi +transmission-rpc +slack_bolt \ No newline at end of file diff --git a/version.py b/version.py new file mode 100644 index 0000000..59a6d97 --- /dev/null +++ b/version.py @@ -0,0 +1 @@ +APP_VERSION = 'v2.9.2' diff --git a/web/.DS_Store b/web/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f477d0872a9982bcf008507b290bc5b64bebb316 GIT binary patch literal 6148 zcmeHKL2uJA6n<{YnyfCFnVGk*(JW2!qTl~68qL;?y|&YKI?kKnd$}AIVX?>u;rtc9 zJ(n_#w)rr6k;KbU_tu%riZIFIxgsQ!7$L7;CfP(T2Xc{3a>X6$3deQaQTK4Qdf=b- zJpZJ>?s+TUKfd4dPL3b0*RFH>?!8CPMi=QclRSAafn!72O@mwbgiMVXm&19M%8Vyw z%iJ<7{;>i^LWlPNYgPfPfK}kS0=z$XaK^ykMx)v~kfamC>P literal 0 HcmV?d00001 diff --git a/web/__init__.py b/web/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/action.py b/web/action.py new file mode 100644 index 0000000..a6bf779 --- /dev/null +++ b/web/action.py @@ -0,0 +1,4565 @@ +import base64 +import datetime +import importlib +import json +import os.path +import re +import shutil +import signal +from math import floor +from urllib.parse import unquote + +import cn2an +from flask_login import logout_user, current_user +from werkzeug.security import generate_password_hash + +import log +from app.brushtask import BrushTask +from app.conf import SystemConfig, ModuleConf +from app.doubansync import DoubanSync +from app.downloader import Downloader +from app.downloader.client import Qbittorrent, Transmission +from app.filetransfer import FileTransfer +from app.filter import Filter +from app.helper import DbHelper, ProgressHelper, ThreadHelper, \ + MetaHelper, DisplayHelper, WordsHelper, CookieCloudHelper +from app.indexer import Indexer +from app.media import Category, Media, Bangumi, DouBan +from app.media.meta import MetaInfo, MetaBase +from app.mediaserver import MediaServer +from app.message import Message, MessageCenter +from app.rss import Rss +from app.rsschecker import RssChecker +from app.scheduler import stop_scheduler +from app.sites import Sites, SiteUserInfo, SiteSignin, SiteCookie +from app.subscribe import Subscribe +from app.subtitle import Subtitle +from app.sync import Sync, stop_monitor +from app.torrentremover import TorrentRemover +from app.speedlimiter import SpeedLimiter +from app.utils import StringUtils, EpisodeFormat, RequestUtils, PathUtils, \ + SystemUtils, ExceptionUtils, Torrent +from app.utils.types import RmtMode, OsType, SearchType, DownloaderType, SyncType, MediaType, MovieTypes, TvTypes +from config import RMT_MEDIAEXT, TMDB_IMAGE_W500_URL, RMT_SUBEXT, Config +from web.backend.search_torrents import search_medias_for_web, search_media_by_message +from web.backend.web_utils import WebUtils + + +class WebAction: + dbhelper = None + _actions = {} + TvTypes = ['TV', '电视剧'] + + def __init__(self): + self.dbhelper = DbHelper() + self._actions = { + "sch": self.__sch, + "search": self.__search, + "download": self.__download, + "download_link": self.__download_link, + "download_torrent": self.__download_torrent, + "pt_start": self.__pt_start, + "pt_stop": self.__pt_stop, + "pt_remove": self.__pt_remove, + "pt_info": self.__pt_info, + "del_unknown_path": self.__del_unknown_path, + "rename": self.__rename, + "rename_udf": self.__rename_udf, + "delete_history": self.__delete_history, + "logging": self.__logging, + "version": self.__version, + "update_site": self.__update_site, + "get_site": self.__get_site, + "del_site": self.__del_site, + "get_site_favicon": self.__get_site_favicon, + "restart": self.__restart, + "update_system": self.update_system, + "reset_db_version": self.__reset_db_version, + "logout": self.__logout, + "update_config": self.__update_config, + "update_directory": self.__update_directory, + "add_or_edit_sync_path": self.__add_or_edit_sync_path, + "get_sync_path": self.__get_sync_path, + "delete_sync_path": self.__delete_sync_path, + "check_sync_path": self.__check_sync_path, + "remove_rss_media": self.__remove_rss_media, + "add_rss_media": self.__add_rss_media, + "re_identification": self.re_identification, + "media_info": self.__media_info, + "test_connection": self.__test_connection, + "user_manager": self.__user_manager, + "refresh_rss": self.__refresh_rss, + "refresh_message": self.__refresh_message, + "delete_tmdb_cache": self.__delete_tmdb_cache, + "movie_calendar_data": self.__movie_calendar_data, + "tv_calendar_data": self.__tv_calendar_data, + "modify_tmdb_cache": self.__modify_tmdb_cache, + "rss_detail": self.__rss_detail, + "truncate_blacklist": self.truncate_blacklist, + "truncate_rsshistory": self.truncate_rsshistory, + "add_brushtask": self.__add_brushtask, + "del_brushtask": self.__del_brushtask, + "brushtask_detail": self.__brushtask_detail, + "add_downloader": self.__add_downloader, + "delete_downloader": self.__delete_downloader, + "get_downloader": self.__get_downloader, + "name_test": self.__name_test, + "rule_test": self.__rule_test, + "net_test": self.__net_test, + "add_filtergroup": self.__add_filtergroup, + "restore_filtergroup": self.__restore_filtergroup, + "set_default_filtergroup": self.__set_default_filtergroup, + "del_filtergroup": self.__del_filtergroup, + "add_filterrule": self.__add_filterrule, + "del_filterrule": self.__del_filterrule, + "filterrule_detail": self.__filterrule_detail, + "get_site_activity": self.__get_site_activity, + "get_site_history": self.__get_site_history, + "get_recommend": self.get_recommend, + "get_downloaded": self.get_downloaded, + "get_site_seeding_info": self.__get_site_seeding_info, + "clear_tmdb_cache": self.__clear_tmdb_cache, + "check_site_attr": self.__check_site_attr, + "refresh_process": self.__refresh_process, + "restory_backup": self.__restory_backup, + "start_mediasync": self.__start_mediasync, + "mediasync_state": self.__mediasync_state, + "get_tvseason_list": self.__get_tvseason_list, + "get_userrss_task": self.__get_userrss_task, + "delete_userrss_task": self.__delete_userrss_task, + "update_userrss_task": self.__update_userrss_task, + "get_rssparser": self.__get_rssparser, + "delete_rssparser": self.__delete_rssparser, + "update_rssparser": self.__update_rssparser, + "run_userrss": self.__run_userrss, + "run_brushtask": self.__run_brushtask, + "list_site_resources": self.__list_site_resources, + "list_rss_articles": self.__list_rss_articles, + "rss_article_test": self.__rss_article_test, + "list_rss_history": self.__list_rss_history, + "rss_articles_check": self.__rss_articles_check, + "rss_articles_download": self.__rss_articles_download, + "add_custom_word_group": self.__add_custom_word_group, + "delete_custom_word_group": self.__delete_custom_word_group, + "add_or_edit_custom_word": self.__add_or_edit_custom_word, + "get_custom_word": self.__get_custom_word, + "delete_custom_word": self.__delete_custom_word, + "check_custom_words": self.__check_custom_words, + "export_custom_words": self.__export_custom_words, + "analyse_import_custom_words_code": self.__analyse_import_custom_words_code, + "import_custom_words": self.__import_custom_words, + "get_categories": self.__get_categories, + "re_rss_history": self.__re_rss_history, + "delete_rss_history": self.__delete_rss_history, + "share_filtergroup": self.__share_filtergroup, + "import_filtergroup": self.__import_filtergroup, + "get_transfer_statistics": self.get_transfer_statistics, + "get_library_spacesize": self.get_library_spacesize, + "get_library_mediacount": self.get_library_mediacount, + "get_library_playhistory": self.get_library_playhistory, + "get_search_result": self.get_search_result, + "search_media_infos": self.search_media_infos, + "get_movie_rss_list": self.get_movie_rss_list, + "get_tv_rss_list": self.get_tv_rss_list, + "get_rss_history": self.get_rss_history, + "get_transfer_history": self.get_transfer_history, + "get_unknown_list": self.get_unknown_list, + "get_customwords": self.get_customwords, + "get_directorysync": self.get_directorysync, + "get_users": self.get_users, + "get_filterrules": self.get_filterrules, + "get_downloading": self.get_downloading, + "test_site": self.__test_site, + "get_sub_path": self.__get_sub_path, + "rename_file": self.__rename_file, + "delete_files": self.__delete_files, + "download_subtitle": self.__download_subtitle, + "get_download_setting": self.__get_download_setting, + "update_download_setting": self.__update_download_setting, + "delete_download_setting": self.__delete_download_setting, + "update_message_client": self.__update_message_client, + "delete_message_client": self.__delete_message_client, + "check_message_client": self.__check_message_client, + "get_message_client": self.__get_message_client, + "test_message_client": self.__test_message_client, + "get_sites": self.__get_sites, + "get_indexers": self.__get_indexers, + "get_download_dirs": self.__get_download_dirs, + "find_hardlinks": self.__find_hardlinks, + "update_sites_cookie_ua": self.__update_sites_cookie_ua, + "set_site_captcha_code": self.__set_site_captcha_code, + "update_torrent_remove_task": self.__update_torrent_remove_task, + "get_torrent_remove_task": self.__get_torrent_remove_task, + "delete_torrent_remove_task": self.__delete_torrent_remove_task, + "get_remove_torrents": self.__get_remove_torrents, + "auto_remove_torrents": self.__auto_remove_torrents, + "get_douban_history": self.get_douban_history, + "delete_douban_history": self.__delete_douban_history, + "list_brushtask_torrents": self.__list_brushtask_torrents, + "set_system_config": self.__set_system_config, + "get_site_user_statistics": self.get_site_user_statistics, + "send_custom_message": self.send_custom_message, + "cookiecloud_sync": self.__cookiecloud_sync, + "media_detail": self.media_detail, + "media_similar": self.__media_similar, + "media_recommendations": self.__media_recommendations, + "media_person": self.__media_person, + "person_medias": self.__person_medias, + "save_user_script": self.__save_user_script, + "run_directory_sync": self.__run_directory_sync + } + + def action(self, cmd, data=None): + func = self._actions.get(cmd) + if not func: + return {"code": -1, "msg": "非授权访问!"} + else: + return func(data) + + def api_action(self, cmd, data=None): + result = self.action(cmd, data) + if not result: + return { + "code": -1, + "success": False, + "message": "服务异常,未获取到返回结果" + } + code = result.get("code", result.get("retcode", 0)) + if not code or str(code) == "0": + success = True + else: + success = False + message = result.get("msg", result.get("retmsg", "")) + for key in ['code', 'retcode', 'msg', 'retmsg']: + if key in result: + result.pop(key) + return { + "code": code, + "success": success, + "message": message, + "data": result + } + + @staticmethod + def restart_server(): + """ + 停止进程 + """ + # 停止定时服务 + stop_scheduler() + # 停止监控 + stop_monitor() + # 签退 + logout_user() + # 关闭虚拟显示 + DisplayHelper().quit() + # 重启进程 + if os.name == "nt": + os.kill(os.getpid(), getattr(signal, "SIGKILL", signal.SIGTERM)) + elif SystemUtils.is_synology(): + os.system( + "ps -ef | grep -v grep | grep 'python run.py'|awk '{print $2}'|xargs kill -9") + else: + os.system("pm2 restart NAStool") + + @staticmethod + def handle_message_job(msg, in_from=SearchType.OT, user_id=None, user_name=None): + """ + 处理消息事件 + """ + if not msg: + return + commands = { + "/ptr": {"func": TorrentRemover().auto_remove_torrents, "desp": "删种"}, + "/ptt": {"func": Downloader().transfer, "desp": "下载文件转移"}, + "/pts": {"func": SiteSignin().signin, "desp": "站点签到"}, + "/rst": {"func": Sync().transfer_all_sync, "desp": "目录同步"}, + "/rss": {"func": Rss().rssdownload, "desp": "RSS订阅"}, + "/db": {"func": DoubanSync().sync, "desp": "豆瓣同步"}, + "/ssa": {"func": Subscribe().subscribe_search_all, "desp": "订阅搜索"}, + "/tbl": {"func": WebAction().truncate_blacklist, "desp": "清理转移缓存"}, + "/trh": {"func": WebAction().truncate_rsshistory, "desp": "清理RSS缓存"}, + "/utf": {"func": WebAction().unidentification, "desp": "重新识别"}, + "/udt": {"func": WebAction().update_system, "desp": "系统更新"} + } + command = commands.get(msg) + message = Message() + + if command: + # 启动服务 + ThreadHelper().start_thread(command.get("func"), ()) + message.send_channel_msg( + channel=in_from, title="正在运行 %s ..." % command.get("desp"), user_id=user_id) + else: + # 站点检索或者添加订阅 + ThreadHelper().start_thread(search_media_by_message, + (msg, in_from, user_id, user_name)) + + @staticmethod + def set_config_value(cfg, cfg_key, cfg_value): + """ + 根据Key设置配置值 + """ + # 密码 + if cfg_key == "app.login_password": + if cfg_value and not cfg_value.startswith("[hash]"): + cfg['app']['login_password'] = "[hash]%s" % generate_password_hash( + cfg_value) + else: + cfg['app']['login_password'] = cfg_value or "password" + return cfg + # 代理 + if cfg_key == "app.proxies": + if cfg_value: + if not cfg_value.startswith("http") and not cfg_value.startswith("sock"): + cfg['app']['proxies'] = { + "https": "http://%s" % cfg_value, "http": "http://%s" % cfg_value} + else: + cfg['app']['proxies'] = {"https": "%s" % + cfg_value, "http": "%s" % cfg_value} + else: + cfg['app']['proxies'] = {"https": None, "http": None} + return cfg + # 豆瓣用户列表 + if cfg_key == "douban.users": + vals = cfg_value.split(",") + cfg['douban']['users'] = vals + return cfg + # 最大支持三层赋值 + keys = cfg_key.split(".") + if keys: + if len(keys) == 1: + cfg[keys[0]] = cfg_value + elif len(keys) == 2: + if not cfg.get(keys[0]): + cfg[keys[0]] = {} + cfg[keys[0]][keys[1]] = cfg_value + elif len(keys) == 3: + if cfg.get(keys[0]): + if not cfg[keys[0]].get(keys[1]) or isinstance(cfg[keys[0]][keys[1]], str): + cfg[keys[0]][keys[1]] = {} + cfg[keys[0]][keys[1]][keys[2]] = cfg_value + else: + cfg[keys[0]] = {} + cfg[keys[0]][keys[1]] = {} + cfg[keys[0]][keys[1]][keys[2]] = cfg_value + + return cfg + + @staticmethod + def set_config_directory(cfg, oper, cfg_key, cfg_value, update_value=None): + """ + 更新目录数据 + """ + + def remove_sync_path(obj, key): + if not isinstance(obj, list): + return [] + ret_obj = [] + for item in obj: + if item.split("@")[0].replace("\\", "/") != key.split("@")[0].replace("\\", "/"): + ret_obj.append(item) + return ret_obj + + # 最大支持二层赋值 + keys = cfg_key.split(".") + if keys: + if len(keys) == 1: + if cfg.get(keys[0]): + if not isinstance(cfg[keys[0]], list): + cfg[keys[0]] = [cfg[keys[0]]] + if oper == "add": + cfg[keys[0]].append(cfg_value) + elif oper == "sub": + cfg[keys[0]].remove(cfg_value) + if not cfg[keys[0]]: + cfg[keys[0]] = None + elif oper == "set": + cfg[keys[0]].remove(cfg_value) + if update_value: + cfg[keys[0]].append(update_value) + else: + cfg[keys[0]] = cfg_value + elif len(keys) == 2: + if cfg.get(keys[0]): + if not cfg[keys[0]].get(keys[1]): + cfg[keys[0]][keys[1]] = [] + if not isinstance(cfg[keys[0]][keys[1]], list): + cfg[keys[0]][keys[1]] = [cfg[keys[0]][keys[1]]] + if oper == "add": + cfg[keys[0]][keys[1]].append( + cfg_value.replace("\\", "/")) + elif oper == "sub": + cfg[keys[0]][keys[1]] = remove_sync_path( + cfg[keys[0]][keys[1]], cfg_value) + if not cfg[keys[0]][keys[1]]: + cfg[keys[0]][keys[1]] = None + elif oper == "set": + cfg[keys[0]][keys[1]] = remove_sync_path( + cfg[keys[0]][keys[1]], cfg_value) + if update_value: + cfg[keys[0]][keys[1]].append( + update_value.replace("\\", "/")) + else: + cfg[keys[0]] = {} + cfg[keys[0]][keys[1]] = cfg_value.replace("\\", "/") + return cfg + + @staticmethod + def __sch(data): + """ + 启动定时服务 + """ + commands = { + "autoremovetorrents": TorrentRemover().auto_remove_torrents, + "pttransfer": Downloader().transfer, + "ptsignin": SiteSignin().signin, + "sync": Sync().transfer_all_sync, + "rssdownload": Rss().rssdownload, + "douban": DoubanSync().sync, + "subscribe_search_all": Subscribe().subscribe_search_all, + } + sch_item = data.get("item") + if sch_item and commands.get(sch_item): + ThreadHelper().start_thread(commands.get(sch_item), ()) + return {"retmsg": "服务已启动", "item": sch_item} + + @staticmethod + def __search(data): + """ + WEB检索资源 + """ + search_word = data.get("search_word") + ident_flag = False if data.get("unident") else True + filters = data.get("filters") + tmdbid = data.get("tmdbid") + media_type = data.get("media_type") + if media_type: + if media_type in MovieTypes: + media_type = MediaType.MOVIE + else: + media_type = MediaType.TV + if search_word: + ret, ret_msg = search_medias_for_web(content=search_word, + ident_flag=ident_flag, + filters=filters, + tmdbid=tmdbid, + media_type=media_type) + if ret != 0: + return {"code": ret, "msg": ret_msg} + return {"code": 0} + + def __download(self, data): + """ + 从WEB添加下载 + """ + dl_id = data.get("id") + dl_dir = data.get("dir") + dl_setting = data.get("setting") + results = self.dbhelper.get_search_result_by_id(dl_id) + for res in results: + media = Media().get_media_info(title=res.TORRENT_NAME, subtitle=res.DESCRIPTION) + if not media: + continue + media.set_torrent_info(enclosure=res.ENCLOSURE, + size=res.SIZE, + site=res.SITE, + page_url=res.PAGEURL, + upload_volume_factor=float( + res.UPLOAD_VOLUME_FACTOR), + download_volume_factor=float(res.DOWNLOAD_VOLUME_FACTOR)) + # 添加下载 + ret, ret_msg = Downloader().download(media_info=media, + download_dir=dl_dir, + download_setting=dl_setting) + if ret: + # 发送消息 + media.user_name = current_user.username + Message().send_download_message(in_from=SearchType.WEB, + can_item=media) + else: + return {"retcode": -1, "retmsg": ret_msg} + return {"retcode": 0, "retmsg": ""} + + @staticmethod + def __download_link(data): + """ + 从WEB添加下载链接 + """ + site = data.get("site") + enclosure = data.get("enclosure") + title = data.get("title") + description = data.get("description") + page_url = data.get("page_url") + size = data.get("size") + seeders = data.get("seeders") + uploadvolumefactor = data.get("uploadvolumefactor") + downloadvolumefactor = data.get("downloadvolumefactor") + dl_dir = data.get("dl_dir") + dl_setting = data.get("dl_setting") + if not title or not enclosure: + return {"code": -1, "msg": "种子信息有误"} + media = Media().get_media_info(title=title, subtitle=description) + media.site = site + media.enclosure = enclosure + media.page_url = page_url + media.size = size + media.upload_volume_factor = float(uploadvolumefactor) + media.download_volume_factor = float(downloadvolumefactor) + media.seeders = seeders + # 添加下载 + ret, ret_msg = Downloader().download(media_info=media, + download_dir=dl_dir, + download_setting=dl_setting) + if ret: + # 发送消息 + media.user_name = current_user.username + Message().send_download_message(SearchType.WEB, media) + return {"code": 0, "msg": "下载成功"} + else: + return {"code": 1, "msg": ret_msg or "如连接正常,请检查下载任务是否存在"} + + @staticmethod + def __download_torrent(data): + """ + 从种子文件添加下载 + """ + + def __download(_media_info, _file_path): + _media_info.site = "WEB" + # 添加下载 + ret, ret_msg = Downloader().download(media_info=_media_info, + download_dir=dl_dir, + download_setting=dl_setting, + torrent_file=_file_path) + # 发送消息 + _media_info.user_name = current_user.username + if ret: + Message().send_download_message(SearchType.WEB, _media_info) + else: + Message().send_download_fail_message(_media_info, ret_msg) + + dl_dir = data.get("dl_dir") + dl_setting = data.get("dl_setting") + files = data.get("files") + magnets = data.get("magnets") + if not files and not magnets: + return {"code": -1, "msg": "没有种子文件或磁链"} + for file_item in files: + if not file_item: + continue + file_name = file_item.get("upload", {}).get("filename") + file_path = os.path.join(Config().get_temp_path(), file_name) + media_info = Media().get_media_info(title=file_name) + __download(media_info, file_path) + for magnet in magnets: + if not magnet: + continue + file_path = None + title = Torrent().get_magnet_title(magnet) + if title: + media_info = Media().get_media_info(title=title) + else: + media_info = MetaInfo(title="磁力链接") + media_info.org_string = magnet + media_info.set_torrent_info(enclosure=magnet, + download_volume_factor=0, + upload_volume_factor=1) + __download(media_info, file_path) + return {"code": 0, "msg": "添加下载完成!"} + + @staticmethod + def __pt_start(data): + """ + 开始下载 + """ + tid = data.get("id") + if id: + Downloader().start_torrents(ids=tid) + return {"retcode": 0, "id": tid} + + @staticmethod + def __pt_stop(data): + """ + 停止下载 + """ + tid = data.get("id") + if id: + Downloader().stop_torrents(ids=tid) + return {"retcode": 0, "id": tid} + + @staticmethod + def __pt_remove(data): + """ + 删除下载 + """ + tid = data.get("id") + if id: + Downloader().delete_torrents(ids=tid, delete_file=True) + return {"retcode": 0, "id": tid} + + @staticmethod + def __pt_info(data): + """ + 查询具体种子的信息 + """ + ids = data.get("ids") + Client, Torrents = Downloader().get_torrents(torrent_ids=ids) + DispTorrents = [] + for torrent in Torrents: + if not torrent: + continue + if Client == DownloaderType.QB: + if torrent.get('state') in ['pausedDL']: + state = "Stoped" + speed = "已暂停" + else: + state = "Downloading" + dlspeed = StringUtils.str_filesize(torrent.get('dlspeed')) + eta = StringUtils.str_timelong(torrent.get('eta')) + upspeed = StringUtils.str_filesize(torrent.get('upspeed')) + speed = "%s%sB/s %s%sB/s %s" % (chr(8595), + dlspeed, chr(8593), upspeed, eta) + # 进度 + progress = round(torrent.get('progress') * 100) + # 主键 + key = torrent.get('hash') + elif Client == DownloaderType.Client115: + state = "Downloading" + dlspeed = StringUtils.str_filesize(torrent.get('peers')) + upspeed = StringUtils.str_filesize(torrent.get('rateDownload')) + speed = "%s%sB/s %s%sB/s" % (chr(8595), + dlspeed, chr(8593), upspeed) + # 进度 + progress = round(torrent.get('percentDone'), 1) + # 主键 + key = torrent.get('info_hash') + elif Client == DownloaderType.PikPak: + key = torrent.get('id') + if torrent.get('finish'): + speed = "PikPak: 下载完成" + else: + speed = "PikPak: 下载中" + state = "" + progress = "" + else: + if torrent.status in ['stopped']: + state = "Stoped" + speed = "已暂停" + else: + state = "Downloading" + dlspeed = StringUtils.str_filesize(torrent.rateDownload) + upspeed = StringUtils.str_filesize(torrent.rateUpload) + speed = "%s%sB/s %s%sB/s" % (chr(8595), + dlspeed, chr(8593), upspeed) + # 进度 + progress = round(torrent.progress, 1) + # 主键 + key = torrent.id + + torrent_info = {'id': key, 'speed': speed, + 'state': state, 'progress': progress} + if torrent_info not in DispTorrents: + DispTorrents.append(torrent_info) + return {"retcode": 0, "torrents": DispTorrents} + + def __del_unknown_path(self, data): + """ + 删除路径 + """ + tids = data.get("id") + if isinstance(tids, list): + for tid in tids: + if not tid: + continue + self.dbhelper.delete_transfer_unknown(tid) + return {"retcode": 0} + else: + retcode = self.dbhelper.delete_transfer_unknown(tids) + return {"retcode": retcode} + + def __rename(self, data): + """ + 手工转移 + """ + path = dest_dir = None + syncmod = ModuleConf.RMT_MODES.get(data.get("syncmod")) + logid = data.get("logid") + if logid: + paths = self.dbhelper.get_transfer_path_by_id(logid) + if paths: + path = os.path.join( + paths[0].SOURCE_PATH, paths[0].SOURCE_FILENAME) + dest_dir = paths[0].DEST + else: + return {"retcode": -1, "retmsg": "未查询到转移日志记录"} + else: + unknown_id = data.get("unknown_id") + if unknown_id: + paths = self.dbhelper.get_unknown_path_by_id(unknown_id) + if paths: + path = paths[0].PATH + dest_dir = paths[0].DEST + else: + return {"retcode": -1, "retmsg": "未查询到未识别记录"} + if not dest_dir: + dest_dir = "" + if not path: + return {"retcode": -1, "retmsg": "输入路径有误"} + tmdbid = data.get("tmdb") + mtype = data.get("type") + season = data.get("season") + episode_format = data.get("episode_format") + episode_details = data.get("episode_details") + episode_offset = data.get("episode_offset") + min_filesize = data.get("min_filesize") + if mtype in MovieTypes: + media_type = MediaType.MOVIE + elif mtype in TvTypes: + media_type = MediaType.TV + else: + media_type = MediaType.ANIME + # 如果改次手动修复时一个单文件,自动修复改目录下同名文件,需要配合episode_format生效 + need_fix_all = False + if os.path.splitext(path)[-1].lower() in RMT_MEDIAEXT and episode_format: + path = os.path.dirname(path) + need_fix_all = True + # 开始转移 + succ_flag, ret_msg = self.__manual_transfer(inpath=path, + syncmod=syncmod, + outpath=dest_dir, + media_type=media_type, + episode_format=episode_format, + episode_details=episode_details, + episode_offset=episode_offset, + need_fix_all=need_fix_all, + min_filesize=min_filesize, + tmdbid=tmdbid, + season=season) + if succ_flag: + if not need_fix_all and not logid: + # 更新记录状态 + self.dbhelper.update_transfer_unknown_state(path) + return {"retcode": 0, "retmsg": "转移成功"} + else: + return {"retcode": 2, "retmsg": ret_msg} + + def __rename_udf(self, data): + """ + 自定义识别 + """ + inpath = data.get("inpath") + if not os.path.exists(inpath): + return {"retcode": -1, "retmsg": "输入路径不存在"} + outpath = data.get("outpath") + syncmod = ModuleConf.RMT_MODES.get(data.get("syncmod")) + tmdbid = data.get("tmdb") + mtype = data.get("type") + season = data.get("season") + episode_format = data.get("episode_format") + episode_details = data.get("episode_details") + episode_offset = data.get("episode_offset") + min_filesize = data.get("min_filesize") + if mtype in MovieTypes: + media_type = MediaType.MOVIE + elif mtype in TvTypes: + media_type = MediaType.TV + else: + media_type = MediaType.ANIME + # 开始转移 + succ_flag, ret_msg = self.__manual_transfer(inpath=inpath, + syncmod=syncmod, + outpath=outpath, + media_type=media_type, + episode_format=episode_format, + episode_details=episode_details, + episode_offset=episode_offset, + min_filesize=min_filesize, + tmdbid=tmdbid, + season=season) + if succ_flag: + return {"retcode": 0, "retmsg": "转移成功"} + else: + return {"retcode": 2, "retmsg": ret_msg} + + @staticmethod + def __manual_transfer(inpath, + syncmod, + outpath=None, + media_type=None, + episode_format=None, + episode_details=None, + episode_offset=None, + min_filesize=None, + tmdbid=None, + season=None, + need_fix_all=False + ): + """ + 开始手工转移文件 + """ + inpath = os.path.normpath(inpath) + if outpath: + outpath = os.path.normpath(outpath) + if not os.path.exists(inpath): + return False, "输入路径不存在" + if tmdbid: + # 有输入TMDBID + tmdb_info = Media().get_tmdb_info(mtype=media_type, tmdbid=tmdbid) + if not tmdb_info: + return False, "识别失败,无法查询到TMDB信息" + # 按识别的信息转移 + succ_flag, ret_msg = FileTransfer().transfer_media(in_from=SyncType.MAN, + in_path=inpath, + rmt_mode=syncmod, + target_dir=outpath, + tmdb_info=tmdb_info, + media_type=media_type, + season=season, + episode=( + EpisodeFormat(episode_format, + episode_details, + episode_offset), + need_fix_all), + min_filesize=min_filesize, + udf_flag=True) + else: + # 按识别的信息转移 + succ_flag, ret_msg = FileTransfer().transfer_media(in_from=SyncType.MAN, + in_path=inpath, + rmt_mode=syncmod, + target_dir=outpath, + media_type=media_type, + episode=( + EpisodeFormat(episode_format, + episode_details, + episode_offset), + need_fix_all), + min_filesize=min_filesize, + udf_flag=True) + return succ_flag, ret_msg + + def __delete_history(self, data): + """ + 删除识别记录及文件 + """ + logids = data.get('logids') + flag = data.get('flag') + for logid in logids: + # 读取历史记录 + paths = self.dbhelper.get_transfer_path_by_id(logid) + if paths: + # 删除记录 + self.dbhelper.delete_transfer_log_by_id(logid) + # 根据flag删除文件 + source_path = paths[0].SOURCE_PATH + source_filename = paths[0].SOURCE_FILENAME + dest = paths[0].DEST + dest_path = paths[0].DEST_PATH + dest_filename = paths[0].DEST_FILENAME + if flag in ["del_source", "del_all"]: + del_flag, del_msg = self.delete_media_file( + source_path, source_filename) + if not del_flag: + log.error(f"【History】{del_msg}") + else: + log.info(f"【History】{del_msg}") + if flag in ["del_dest", "del_all"]: + if dest_path and dest_filename: + del_flag, del_msg = self.delete_media_file( + dest_path, dest_filename) + if not del_flag: + log.error(f"【History】{del_msg}") + else: + log.info(f"【History】{del_msg}") + else: + meta_info = MetaInfo(title=source_filename) + meta_info.title = paths[0].TITLE + meta_info.category = paths[0].CATEGORY + meta_info.year = paths[0].YEAR + if paths[0].SEASON_EPISODE: + meta_info.begin_season = int( + str(paths[0].SEASON_EPISODE).replace("S", "")) + if paths[0].TYPE == MediaType.MOVIE.value: + meta_info.type = MediaType.MOVIE + else: + meta_info.type = MediaType.TV + # 删除文件 + dest_path = FileTransfer().get_dest_path_by_info(dest=dest, meta_info=meta_info) + if dest_path and dest_path.find(meta_info.title) != -1: + rm_parent_dir = False + if not meta_info.get_season_list(): + # 电影,删除整个目录 + try: + shutil.rmtree(dest_path) + except Exception as e: + ExceptionUtils.exception_traceback(e) + elif not meta_info.get_episode_string(): + # 电视剧但没有集数,删除季目录 + try: + shutil.rmtree(dest_path) + except Exception as e: + ExceptionUtils.exception_traceback(e) + rm_parent_dir = True + else: + # 有集数的电视剧,删除对应的集数文件 + for dest_file in PathUtils.get_dir_files(dest_path): + file_meta_info = MetaInfo( + os.path.basename(dest_file)) + if file_meta_info.get_episode_list() and set( + file_meta_info.get_episode_list() + ).issubset(set(meta_info.get_episode_list())): + try: + os.remove(dest_file) + except Exception as e: + ExceptionUtils.exception_traceback( + e) + rm_parent_dir = True + if rm_parent_dir \ + and not PathUtils.get_dir_files(os.path.dirname(dest_path), exts=RMT_MEDIAEXT): + # 没有媒体文件时,删除整个目录 + try: + shutil.rmtree(os.path.dirname(dest_path)) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"retcode": 0} + + @staticmethod + def delete_media_file(filedir, filename): + """ + 删除媒体文件,空目录也支被删除 + """ + filedir = os.path.normpath(filedir).replace("\\", "/") + file = os.path.join(filedir, filename) + try: + if not os.path.exists(file): + return False, f"{file} 不存在" + os.remove(file) + nfoname = f"{os.path.splitext(filename)[0]}.nfo" + nfofile = os.path.join(filedir, nfoname) + if os.path.exists(nfofile): + os.remove(nfofile) + # 检查空目录并删除 + if re.findall(r"^S\d{2}|^Season", os.path.basename(filedir), re.I): + # 当前是季文件夹,判断并删除 + seaon_dir = filedir + if seaon_dir.count('/') > 1 and not PathUtils.get_dir_files(seaon_dir, exts=RMT_MEDIAEXT): + shutil.rmtree(seaon_dir) + # 媒体文件夹 + media_dir = os.path.dirname(seaon_dir) + else: + media_dir = filedir + # 检查并删除媒体文件夹,非根目录且目录大于二级,且没有媒体文件时才会删除 + if media_dir != '/' \ + and media_dir.count('/') > 1 \ + and not re.search(r'[a-zA-Z]:/$', media_dir) \ + and not PathUtils.get_dir_files(media_dir, exts=RMT_MEDIAEXT): + shutil.rmtree(media_dir) + return True, f"{file} 删除成功" + except Exception as e: + ExceptionUtils.exception_traceback(e) + return True, f"{file} 删除失败" + + @staticmethod + def __logging(data): + """ + 查询实时日志 + """ + log_list = [] + refresh_new = data.get('refresh_new') + source = data.get('source') + + if not source: + if not refresh_new: + log_list = list(log.LOG_QUEUE) + elif log.LOG_INDEX: + if log.LOG_INDEX > len(list(log.LOG_QUEUE)): + log_list = list(log.LOG_QUEUE) + else: + log_list = list(log.LOG_QUEUE)[-log.LOG_INDEX:] + log.LOG_INDEX = 0 + else: + queue_logs = list(log.LOG_QUEUE) + for message in queue_logs: + if str(message.get("source")) == source: + log_list.append(message) + else: + continue + + if refresh_new: + if int(refresh_new) < len(log_list): + log_list = log_list[int(refresh_new):] + elif int(refresh_new) >= len(log_list): + log_list = [] + return {"loglist": log_list} + + @staticmethod + def __version(data): + """ + 检查新版本 + """ + version, url, flag = WebUtils.get_latest_version() + if flag: + return {"code": 0, "version": version, "url": url} + return {"code": -1, "version": "", "url": ""} + + def __update_site(self, data): + """ + 维护站点信息 + """ + + def __is_site_duplicate(query_name, query_tid): + # 检查是否重名 + _sites = self.dbhelper.get_site_by_name(name=query_name) + for site in _sites: + site_id = site.ID + if str(site_id) != str(query_tid): + return True + return False + + tid = data.get('site_id') + name = data.get('site_name') + site_pri = data.get('site_pri') + rssurl = data.get('site_rssurl') + signurl = data.get('site_signurl') + cookie = data.get('site_cookie') + note = data.get('site_note') + if isinstance(note, dict): + note = json.dumps(note) + rss_uses = data.get('site_include') + + if __is_site_duplicate(name, tid): + return {"code": 400, "msg": "站点名称重复"} + + if tid: + sites = self.dbhelper.get_site_by_id(tid) + # 站点不存在 + if not sites: + return {"code": 400, "msg": "站点不存在"} + + old_name = sites[0].NAME + + ret = self.dbhelper.update_config_site(tid=tid, + name=name, + site_pri=site_pri, + rssurl=rssurl, + signurl=signurl, + cookie=cookie, + note=note, + rss_uses=rss_uses) + if ret and (name != old_name): + # 更新历史站点数据信息 + self.dbhelper.update_site_user_statistics_site_name( + name, old_name) + self.dbhelper.update_site_seed_info_site_name(name, old_name) + self.dbhelper.update_site_statistics_site_name(name, old_name) + + else: + ret = self.dbhelper.insert_config_site(name=name, + site_pri=site_pri, + rssurl=rssurl, + signurl=signurl, + cookie=cookie, + note=note, + rss_uses=rss_uses) + # 生效站点配置 + Sites().init_config() + # 初始化刷流任务 + BrushTask().init_config() + return {"code": ret} + + @staticmethod + def __get_site(data): + """ + 查询单个站点信息 + """ + tid = data.get("id") + site_free = False + site_2xfree = False + site_hr = False + if tid: + ret = Sites().get_sites(siteid=tid) + if ret.get("rssurl"): + site_attr = Sites().get_grapsite_conf(ret.get("rssurl")) + if site_attr.get("FREE"): + site_free = True + if site_attr.get("2XFREE"): + site_2xfree = True + if site_attr.get("HR"): + site_hr = True + else: + ret = [] + return {"code": 0, "site": ret, "site_free": site_free, "site_2xfree": site_2xfree, "site_hr": site_hr} + + @staticmethod + def __get_sites(data): + """ + 查询多个站点信息 + """ + rss = True if data.get("rss") else False + brush = True if data.get("brush") else False + signin = True if data.get("signin") else False + statistic = True if data.get("statistic") else False + basic = True if data.get("basic") else False + if basic: + sites = Sites().get_site_dict(rss=rss, + brush=brush, + signin=signin, + statistic=statistic) + else: + sites = Sites().get_sites(rss=rss, + brush=brush, + signin=signin, + statistic=statistic) + return {"code": 0, "sites": sites} + + def __del_site(self, data): + """ + 删除单个站点信息 + """ + tid = data.get("id") + if tid: + ret = self.dbhelper.delete_config_site(tid) + Sites().init_config() + BrushTask().init_config() + return {"code": ret} + else: + return {"code": 0} + + def __restart(self, data): + """ + 重启 + """ + # 退出主进程 + self.restart_server() + return {"code": 0} + + def update_system(self, data=None): + """ + 更新 + """ + # 升级 + if SystemUtils.is_synology(): + if SystemUtils.execute('/bin/ps -w -x | grep -v grep | grep -w "nastool update" | wc -l') == '0': + # 调用群晖套件内置命令升级 + os.system('nastool update') + # 重启 + self.restart_server() + else: + # 清除git代理 + os.system("git config --global --unset http.proxy") + os.system("git config --global --unset https.proxy") + # 设置git代理 + proxy = Config().get_proxies() or {} + http_proxy = proxy.get("http") + https_proxy = proxy.get("https") + if http_proxy or https_proxy: + os.system( + f"git config --global http.proxy {http_proxy or https_proxy}") + os.system( + f"git config --global https.proxy {https_proxy or http_proxy}") + # 清理 + os.system("git clean -dffx") + # 升级 + branch = "dev" if os.environ.get( + "NASTOOL_VERSION") == "dev" else "master" + os.system(f"git fetch --depth 1 origin {branch}") + os.system(f"git reset --hard origin/{branch}") + os.system("git submodule update --init --recursive") + # 安装依赖 + os.system('pip install -r /nas-tools/requirements.txt') + # 重启 + self.restart_server() + return {"code": 0} + + def __reset_db_version(self, data): + """ + 重置数据库版本 + """ + try: + self.dbhelper.drop_table("alembic_version") + return {"code": 0} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + @staticmethod + def __logout(data): + """ + 注销 + """ + logout_user() + return {"code": 0} + + def __update_config(self, data): + """ + 更新配置信息 + """ + cfg = Config().get_config() + cfgs = dict(data).items() + # 仅测试不保存 + config_test = False + # 修改配置 + for key, value in cfgs: + if key == "test" and value: + config_test = True + continue + # 生效配置 + cfg = self.set_config_value(cfg, key, value) + + # 保存配置 + if not config_test: + Config().save_config(cfg) + + return {"code": 0} + + def __add_or_edit_sync_path(self, data): + """ + 维护同步目录 + """ + sid = data.get("sid") + source = data.get("from") + dest = data.get("to") + unknown = data.get("unknown") + mode = data.get("syncmod") + rename = 1 if StringUtils.to_bool(data.get("rename"), False) else 0 + enabled = 1 if StringUtils.to_bool(data.get("enabled"), False) else 0 + # 源目录检查 + if not source: + return {"code": 1, "msg": f'源目录不能为空'} + if not os.path.exists(source): + return {"code": 1, "msg": f'{source}目录不存在'} + # windows目录用\,linux目录用/ + source = os.path.normpath(source) + # 目的目录检查,目的目录可为空 + if dest: + dest = os.path.normpath(dest) + if PathUtils.is_path_in_path(source, dest): + return {"code": 1, "msg": "目的目录不可包含在源目录中"} + if unknown: + unknown = os.path.normpath(unknown) + + # 硬链接不能跨盘 + if mode == "link" and dest: + common_path = os.path.commonprefix([source, dest]) + if not common_path or common_path == "/": + return {"code": 1, "msg": "硬链接不能跨盘"} + + # 编辑先删再增 + if sid: + self.dbhelper.delete_config_sync_path(sid) + # 若启用,则关闭其他相同源目录的同步目录 + if enabled == 1: + self.dbhelper.check_config_sync_paths(source=source, + enabled=0) + # 插入数据库 + self.dbhelper.insert_config_sync_path(source=source, + dest=dest, + unknown=unknown, + mode=mode, + rename=rename, + enabled=enabled) + Sync().init_config() + return {"code": 0, "msg": ""} + + def __get_sync_path(self, data): + """ + 查询同步目录 + """ + try: + sid = data.get("sid") + sync_item = self.dbhelper.get_config_sync_paths(sid=sid)[0] + syncpath = {'id': sync_item.ID, + 'from': sync_item.SOURCE, + 'to': sync_item.DEST or "", + 'unknown': sync_item.UNKNOWN or "", + 'syncmod': sync_item.MODE, + 'rename': sync_item.RENAME, + 'enabled': sync_item.ENABLED} + return {"code": 0, "data": syncpath} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": "查询识别词失败"} + + def __delete_sync_path(self, data): + """ + 移出同步目录 + """ + sid = data.get("sid") + self.dbhelper.delete_config_sync_path(sid) + Sync().init_config() + return {"code": 0} + + def __check_sync_path(self, data): + """ + 维护同步目录 + """ + flag = data.get("flag") + sid = data.get("sid") + checked = data.get("checked") + if flag == "rename": + self.dbhelper.check_config_sync_paths(sid=sid, + rename=1 if checked else 0) + Sync().init_config() + return {"code": 0} + elif flag == "enable": + # 若启用,则关闭其他相同源目录的同步目录 + if checked: + sync_item = self.dbhelper.get_config_sync_paths(sid=sid)[0] + self.dbhelper.check_config_sync_paths(source=sync_item.SOURCE, + enabled=0) + self.dbhelper.check_config_sync_paths(sid=sid, + enabled=1 if checked else 0) + Sync().init_config() + return {"code": 0} + else: + return {"code": 1} + + def __remove_rss_media(self, data): + """ + 移除RSS订阅 + """ + name = data.get("name") + mtype = data.get("type") + year = data.get("year") + season = data.get("season") + rssid = data.get("rssid") + page = data.get("page") + tmdbid = data.get("tmdbid") + if not str(tmdbid).isdigit(): + tmdbid = None + if name: + name = MetaInfo(title=name).get_name() + if mtype: + if mtype in MovieTypes: + self.dbhelper.delete_rss_movie( + title=name, year=year, rssid=rssid, tmdbid=tmdbid) + else: + self.dbhelper.delete_rss_tv( + title=name, season=season, rssid=rssid, tmdbid=tmdbid) + return {"code": 0, "page": page, "name": name} + + def __add_rss_media(self, data): + """ + 添加RSS订阅 + """ + name = data.get("name") + _subscribe = Subscribe() + year = data.get("year") + keyword = data.get("keyword") + season = data.get("season") + fuzzy_match = data.get("fuzzy_match") + mediaid = data.get("mediaid") + rss_sites = data.get("rss_sites") + search_sites = data.get("search_sites") + over_edition = data.get("over_edition") + filter_restype = data.get("filter_restype") + filter_pix = data.get("filter_pix") + filter_team = data.get("filter_team") + filter_rule = data.get("filter_rule") + save_path = data.get("save_path") + download_setting = data.get("download_setting") + total_ep = data.get("total_ep") + current_ep = data.get("current_ep") + rssid = data.get("rssid") + page = data.get("page") + mtype = MediaType.MOVIE if data.get( + "type") in MovieTypes else MediaType.TV + media_info = None + if isinstance(season, list): + code = 0 + msg = "" + for sea in season: + code, msg, media_info = _subscribe.add_rss_subscribe(mtype=mtype, + name=name, + year=year, + keyword=keyword, + season=sea, + fuzzy_match=fuzzy_match, + mediaid=mediaid, + rss_sites=rss_sites, + search_sites=search_sites, + over_edition=over_edition, + filter_restype=filter_restype, + filter_pix=filter_pix, + filter_team=filter_team, + filter_rule=filter_rule, + save_path=save_path, + download_setting=download_setting, + rssid=rssid) + if code != 0: + break + else: + code, msg, media_info = _subscribe.add_rss_subscribe(mtype=mtype, + name=name, + year=year, + keyword=keyword, + season=season, + fuzzy_match=fuzzy_match, + mediaid=mediaid, + rss_sites=rss_sites, + search_sites=search_sites, + over_edition=over_edition, + filter_restype=filter_restype, + filter_pix=filter_pix, + filter_team=filter_team, + filter_rule=filter_rule, + save_path=save_path, + download_setting=download_setting, + total_ep=total_ep, + current_ep=current_ep, + rssid=rssid) + if not rssid and media_info: + if mtype == MediaType.MOVIE: + rssid = self.dbhelper.get_rss_movie_id( + title=name, tmdbid=media_info.tmdb_id) + else: + rssid = self.dbhelper.get_rss_tv_id( + title=name, tmdbid=media_info.tmdb_id) + return {"code": code, "msg": msg, "page": page, "name": name, "rssid": rssid} + + def re_identification(self, data): + """ + 未识别的重新识别 + """ + flag = data.get("flag") + ids = data.get("ids") + ret_flag = True + ret_msg = [] + if flag == "unidentification": + for wid in ids: + paths = self.dbhelper.get_unknown_path_by_id(wid) + if paths: + path = paths[0].PATH + dest_dir = paths[0].DEST + rmt_mode = ModuleConf.get_enum_item( + RmtMode, paths[0].MODE) if paths[0].MODE else None + else: + return {"retcode": -1, "retmsg": "未查询到未识别记录"} + if not dest_dir: + dest_dir = "" + if not path: + return {"retcode": -1, "retmsg": "未识别路径有误"} + succ_flag, msg = FileTransfer().transfer_media(in_from=SyncType.MAN, + rmt_mode=rmt_mode, + in_path=path, + target_dir=dest_dir) + if succ_flag: + self.dbhelper.update_transfer_unknown_state(path) + else: + ret_flag = False + if msg not in ret_msg: + ret_msg.append(msg) + elif flag == "history": + for wid in ids: + paths = self.dbhelper.get_transfer_path_by_id(wid) + if paths: + path = os.path.join( + paths[0].SOURCE_PATH, paths[0].SOURCE_FILENAME) + dest_dir = paths[0].DEST + rmt_mode = ModuleConf.get_enum_item( + RmtMode, paths[0].MODE) if paths[0].MODE else None + else: + return {"retcode": -1, "retmsg": "未查询到转移日志记录"} + if not dest_dir: + dest_dir = "" + if not path: + return {"retcode": -1, "retmsg": "未识别路径有误"} + succ_flag, msg = FileTransfer().transfer_media(in_from=SyncType.MAN, + rmt_mode=rmt_mode, + in_path=path, + target_dir=dest_dir) + if not succ_flag: + ret_flag = False + if msg not in ret_msg: + ret_msg.append(msg) + if ret_flag: + return {"retcode": 0, "retmsg": "转移成功"} + else: + return {"retcode": 2, "retmsg": "、".join(ret_msg)} + + def __media_info(self, data): + """ + 查询媒体信息 + """ + mediaid = data.get("id") + mtype = data.get("type") + title = data.get("title") + year = data.get("year") + page = data.get("page") + rssid = data.get("rssid") + seasons = [] + link_url = "" + vote_average = 0 + poster_path = "" + release_date = "" + overview = "" + # 类型 + if mtype in MovieTypes: + media_type = MediaType.MOVIE + else: + media_type = MediaType.TV + + # 先取订阅信息 + rssid_ok = False + if rssid: + rssid = str(rssid) + if media_type == MediaType.MOVIE: + rssinfo = Subscribe().get_subscribe_movies(rid=rssid) + else: + rssinfo = Subscribe().get_subscribe_tvs(rid=rssid) + if not rssinfo: + return { + "code": 1, + "retmsg": "无法查询到订阅信息", + "rssid": rssid, + "type_str": media_type.value + } + overview = rssinfo[rssid].get("overview") + poster_path = rssinfo[rssid].get("poster") + title = rssinfo[rssid].get("name") + vote_average = rssinfo[rssid].get("vote") + year = rssinfo[rssid].get("year") + release_date = rssinfo[rssid].get("release_date") + link_url = Media().get_detail_url(mtype=media_type, + tmdbid=rssinfo[rssid].get("tmdbid")) + if overview and poster_path: + rssid_ok = True + + # 订阅信息不足 + if not rssid_ok: + if mediaid: + media = WebUtils.get_mediainfo_from_id( + mtype=media_type, mediaid=mediaid) + else: + media = Media().get_media_info( + title=f"{title} {year}", mtype=media_type) + if not media or not media.tmdb_info: + return { + "code": 1, + "retmsg": "无法查询到TMDB信息", + "rssid": rssid, + "type_str": media_type.value + } + if not mediaid: + mediaid = media.tmdb_id + link_url = media.get_detail_url() + overview = media.overview + poster_path = media.get_poster_image() + title = media.title + vote_average = round(float(media.vote_average or 0), 1) + year = media.year + if media_type != MediaType.MOVIE: + release_date = media.tmdb_info.get('first_air_date') + seasons = [{ + "text": "第%s季" % cn2an.an2cn(season.get("season_number"), mode='low'), + "num": season.get("season_number")} for season in + Media().get_tmdb_tv_seasons(tv_info=media.tmdb_info)] + else: + release_date = media.tmdb_info.get('release_date') + + # 查订阅信息 + if not rssid: + if media_type == MediaType.MOVIE: + rssid = self.dbhelper.get_rss_movie_id( + title=title, tmdbid=mediaid) + else: + rssid = self.dbhelper.get_rss_tv_id( + title=title, tmdbid=mediaid) + + return { + "code": 0, + "type": mtype, + "type_str": media_type.value, + "page": page, + "title": title, + "vote_average": vote_average, + "poster_path": poster_path, + "release_date": release_date, + "year": year, + "overview": overview, + "link_url": link_url, + "tmdbid": mediaid, + "rssid": rssid, + "seasons": seasons + } + + @staticmethod + def __test_connection(data): + """ + 测试连通性 + """ + # 支持两种传入方式:命令数组或单个命令,单个命令时xx|xx模式解析为模块和类,进行动态引入 + command = data.get("command") + ret = None + if command: + try: + module_obj = None + if isinstance(command, list): + for cmd_str in command: + ret = eval(cmd_str) + if not ret: + break + else: + if command.find("|") != -1: + module = command.split("|")[0] + class_name = command.split("|")[1] + module_obj = getattr( + importlib.import_module(module), class_name)() + if hasattr(module_obj, "init_config"): + module_obj.init_config() + ret = module_obj.get_status() + else: + ret = eval(command) + # 重载配置 + Config().init_config() + if module_obj: + if hasattr(module_obj, "init_config"): + module_obj.init_config() + except Exception as e: + ret = None + ExceptionUtils.exception_traceback(e) + return {"code": 0 if ret else 1} + return {"code": 0} + + def __user_manager(self, data): + """ + 用户管理 + """ + oper = data.get("oper") + name = data.get("name") + if oper == "add": + password = generate_password_hash(str(data.get("password"))) + pris = data.get("pris") + if isinstance(pris, list): + pris = ",".join(pris) + ret = self.dbhelper.insert_user(name, password, pris) + else: + ret = self.dbhelper.delete_user(name) + + if ret == 1 or ret: + return {"code": 0, "success": False} + return {"code": -1, "success": False, 'message': '操作失败'} + + @staticmethod + def __refresh_rss(data): + """ + 重新搜索RSS + """ + mtype = data.get("type") + rssid = data.get("rssid") + page = data.get("page") + if mtype == "MOV": + ThreadHelper().start_thread(Subscribe().subscribe_search_movie, (rssid,)) + else: + ThreadHelper().start_thread(Subscribe().subscribe_search_tv, (rssid,)) + return {"code": 0, "page": page} + + @staticmethod + def get_system_message(lst_time): + messages = MessageCenter().get_system_messages(lst_time=lst_time) + if messages: + lst_time = messages[0].get("time") + return { + "code": 0, + "message": messages, + "lst_time": lst_time + } + + def __refresh_message(self, data): + """ + 刷新首页消息中心 + """ + lst_time = data.get("lst_time") + system_msg = self.get_system_message(lst_time=lst_time) + messages = system_msg.get("message") + lst_time = system_msg.get("lst_time") + message_html = [] + for message in list(reversed(messages)): + level = "bg-red" if message.get("level") == "ERROR" else "" + content = re.sub(r"#+", "
", + re.sub(r"<[^>]+>", "", + re.sub(r"
", "####", message.get("content"), flags=re.IGNORECASE))) + message_html.append(f""" +
+
+
+ +
+
+ {message.get("title")} +
{content}
+
{message.get("time")}
+
+
+
+ """) + return {"code": 0, "message": message_html, "lst_time": lst_time} + + @staticmethod + def __delete_tmdb_cache(data): + """ + 删除tmdb缓存 + """ + if MetaHelper().delete_meta_data(data.get("cache_key")): + MetaHelper().save_meta_data() + return {"code": 0} + + @staticmethod + def __movie_calendar_data(data): + """ + 查询电影上映日期 + """ + tid = data.get("id") + rssid = data.get("rssid") + if tid and tid.startswith("DB:"): + doubanid = tid.replace("DB:", "") + douban_info = DouBan().get_douban_detail( + doubanid=doubanid, mtype=MediaType.MOVIE) + if not douban_info: + return {"code": 1, "retmsg": "无法查询到豆瓣信息"} + poster_path = douban_info.get("cover_url") or "" + title = douban_info.get("title") + rating = douban_info.get("rating", {}) or {} + vote_average = rating.get("value") or "无" + release_date = douban_info.get("pubdate") + if release_date: + release_date = re.sub( + r"\(.*\)", "", douban_info.get("pubdate")[0]) + if not release_date: + return {"code": 1, "retmsg": "上映日期不正确"} + else: + return {"code": 0, + "type": "电影", + "title": title, + "start": release_date, + "id": tid, + "year": release_date[0:4] if release_date else "", + "poster": poster_path, + "vote_average": vote_average, + "rssid": rssid + } + else: + if tid: + tmdb_info = Media().get_tmdb_info(mtype=MediaType.MOVIE, tmdbid=tid) + else: + return {"code": 1, "retmsg": "没有TMDBID信息"} + if not tmdb_info: + return {"code": 1, "retmsg": "无法查询到TMDB信息"} + poster_path = TMDB_IMAGE_W500_URL % tmdb_info.get('poster_path') if tmdb_info.get( + 'poster_path') else "" + title = tmdb_info.get('title') + vote_average = tmdb_info.get("vote_average") + release_date = tmdb_info.get('release_date') + if not release_date: + return {"code": 1, "retmsg": "上映日期不正确"} + else: + return {"code": 0, + "type": "电影", + "title": title, + "start": release_date, + "id": tid, + "year": release_date[0:4] if release_date else "", + "poster": poster_path, + "vote_average": vote_average, + "rssid": rssid + } + + @staticmethod + def __tv_calendar_data(data): + """ + 查询电视剧上映日期 + """ + tid = data.get("id") + season = data.get("season") + name = data.get("name") + rssid = data.get("rssid") + if tid and tid.startswith("DB:"): + doubanid = tid.replace("DB:", "") + douban_info = DouBan().get_douban_detail(doubanid=doubanid, mtype=MediaType.TV) + if not douban_info: + return {"code": 1, "retmsg": "无法查询到豆瓣信息"} + poster_path = douban_info.get("cover_url") or "" + title = douban_info.get("title") + rating = douban_info.get("rating", {}) or {} + vote_average = rating.get("value") or "无" + release_date = re.sub(r"\(.*\)", "", douban_info.get("pubdate")[0]) + if not release_date: + return {"code": 1, "retmsg": "上映日期不正确"} + else: + return {"code": 0, + "type": "电视剧", + "title": title, + "start": release_date, + "id": tid, + "year": release_date[0:4] if release_date else "", + "poster": poster_path, + "vote_average": vote_average, + "rssid": rssid + } + else: + if tid: + tmdb_info = Media().get_tmdb_tv_season_detail(tmdbid=tid, season=season) + else: + return {"code": 1, "retmsg": "没有TMDBID信息"} + if not tmdb_info: + return {"code": 1, "retmsg": "无法查询到TMDB信息"} + episode_events = [] + air_date = tmdb_info.get("air_date") + if not tmdb_info.get("poster_path"): + tv_tmdb_info = Media().get_tmdb_info(mtype=MediaType.TV, tmdbid=tid) + if tv_tmdb_info: + poster_path = TMDB_IMAGE_W500_URL % tv_tmdb_info.get( + "poster_path") + else: + poster_path = "" + else: + poster_path = TMDB_IMAGE_W500_URL % tmdb_info.get( + "poster_path") + year = air_date[0:4] if air_date else "" + for episode in tmdb_info.get("episodes"): + episode_events.append({ + "type": "剧集", + "title": "%s 第%s季第%s集" % ( + name, + season, + episode.get("episode_number") + ) if season != 1 else "%s 第%s集" % ( + name, + episode.get("episode_number") + ), + "start": episode.get("air_date"), + "id": tid, + "year": year, + "poster": poster_path, + "vote_average": episode.get("vote_average") or "无", + "rssid": rssid + }) + return {"code": 0, "events": episode_events} + + @staticmethod + def __rss_detail(data): + rid = data.get("rssid") + mtype = data.get("rsstype") + if mtype in MovieTypes: + rssdetail = Subscribe().get_subscribe_movies(rid=rid) + if not rssdetail: + return {"code": 1} + rssdetail = list(rssdetail.values())[0] + rssdetail["type"] = "MOV" + else: + rssdetail = Subscribe().get_subscribe_tvs(rid=rid) + if not rssdetail: + return {"code": 1} + rssdetail = list(rssdetail.values())[0] + rssdetail["type"] = "TV" + return {"code": 0, "detail": rssdetail} + + @staticmethod + def __modify_tmdb_cache(data): + """ + 修改TMDB缓存的标题 + """ + if MetaHelper().modify_meta_data(data.get("key"), data.get("title")): + MetaHelper().save_meta_data(force=True) + return {"code": 0} + + def truncate_blacklist(self, data): + """ + 清空文件转移黑名单记录 + """ + self.dbhelper.truncate_transfer_blacklist() + return {"code": 0} + + def truncate_rsshistory(self, data): + """ + 清空RSS历史记录 + """ + self.dbhelper.truncate_rss_history() + self.dbhelper.truncate_rss_episodes() + return {"code": 0} + + def __add_brushtask(self, data): + """ + 新增刷流任务 + """ + # 输入值 + brushtask_id = data.get("brushtask_id") + brushtask_name = data.get("brushtask_name") + brushtask_site = data.get("brushtask_site") + brushtask_interval = data.get("brushtask_interval") + brushtask_downloader = data.get("brushtask_downloader") + brushtask_totalsize = data.get("brushtask_totalsize") + brushtask_state = data.get("brushtask_state") + brushtask_transfer = 'Y' if data.get("brushtask_transfer") else 'N' + brushtask_sendmessage = 'Y' if data.get( + "brushtask_sendmessage") else 'N' + brushtask_forceupload = 'Y' if data.get( + "brushtask_forceupload") else 'N' + brushtask_free = data.get("brushtask_free") + brushtask_hr = data.get("brushtask_hr") + brushtask_torrent_size = data.get("brushtask_torrent_size") + brushtask_include = data.get("brushtask_include") + brushtask_exclude = data.get("brushtask_exclude") + brushtask_dlcount = data.get("brushtask_dlcount") + brushtask_peercount = data.get("brushtask_peercount") + brushtask_seedtime = data.get("brushtask_seedtime") + brushtask_seedratio = data.get("brushtask_seedratio") + brushtask_seedsize = data.get("brushtask_seedsize") + brushtask_dltime = data.get("brushtask_dltime") + brushtask_avg_upspeed = data.get("brushtask_avg_upspeed") + brushtask_iatime = data.get("brushtask_iatime") + brushtask_pubdate = data.get("brushtask_pubdate") + brushtask_upspeed = data.get("brushtask_upspeed") + brushtask_downspeed = data.get("brushtask_downspeed") + # 选种规则 + rss_rule = { + "free": brushtask_free, + "hr": brushtask_hr, + "size": brushtask_torrent_size, + "include": brushtask_include, + "exclude": brushtask_exclude, + "dlcount": brushtask_dlcount, + "peercount": brushtask_peercount, + "pubdate": brushtask_pubdate, + "upspeed": brushtask_upspeed, + "downspeed": brushtask_downspeed + } + # 删除规则 + remove_rule = { + "time": brushtask_seedtime, + "ratio": brushtask_seedratio, + "uploadsize": brushtask_seedsize, + "dltime": brushtask_dltime, + "avg_upspeed": brushtask_avg_upspeed, + "iatime": brushtask_iatime + } + # 添加记录 + item = { + "name": brushtask_name, + "site": brushtask_site, + "free": brushtask_free, + "interval": brushtask_interval, + "downloader": brushtask_downloader, + "seed_size": brushtask_totalsize, + "transfer": brushtask_transfer, + "state": brushtask_state, + "rss_rule": rss_rule, + "remove_rule": remove_rule, + "sendmessage": brushtask_sendmessage, + "forceupload": brushtask_forceupload + } + self.dbhelper.insert_brushtask(brushtask_id, item) + + # 重新初始化任务 + BrushTask().init_config() + return {"code": 0} + + def __del_brushtask(self, data): + """ + 删除刷流任务 + """ + brush_id = data.get("id") + if brush_id: + self.dbhelper.delete_brushtask(brush_id) + # 重新初始化任务 + BrushTask().init_config() + return {"code": 0} + return {"code": 1} + + def __brushtask_detail(self, data): + """ + 查询刷流任务详情 + """ + brush_id = data.get("id") + brushtask = self.dbhelper.get_brushtasks(brush_id) + if not brushtask: + return {"code": 1, "task": {}} + site_info = Sites().get_sites(siteid=brushtask.SITE) + task = { + "id": brushtask.ID, + "name": brushtask.NAME, + "site": brushtask.SITE, + "interval": brushtask.INTEVAL, + "state": brushtask.STATE, + "downloader": brushtask.DOWNLOADER, + "transfer": brushtask.TRANSFER, + "free": brushtask.FREELEECH, + "rss_rule": eval(brushtask.RSS_RULE), + "remove_rule": eval(brushtask.REMOVE_RULE), + "seed_size": brushtask.SEED_SIZE, + "download_count": brushtask.DOWNLOAD_COUNT, + "remove_count": brushtask.REMOVE_COUNT, + "download_size": StringUtils.str_filesize(brushtask.DOWNLOAD_SIZE), + "upload_size": StringUtils.str_filesize(brushtask.UPLOAD_SIZE), + "lst_mod_date": brushtask.LST_MOD_DATE, + "site_url": StringUtils.get_base_url(site_info.get("signurl") or site_info.get("rssurl")), + "sendmessage": brushtask.SENDMESSAGE, + "forceupload": brushtask.FORCEUPLOAD + } + return {"code": 0, "task": task} + + def __add_downloader(self, data): + """ + 添加自定义下载器 + """ + test = data.get("test") + dl_id = data.get("id") + dl_name = data.get("name") + dl_type = data.get("type") + if test: + # 测试 + if dl_type == "qbittorrent": + downloader = Qbittorrent( + config={ + "qbhost": data.get("host"), + "qbport": data.get("port"), + "qbusername": data.get("username"), + "qbpassword": data.get("password") + }) + else: + downloader = Transmission( + config={ + "trhost": data.get("host"), + "trport": data.get("port"), + "trusername": data.get("username"), + "trpassword": data.get("password") + }) + if downloader.get_status(): + return {"code": 0} + else: + return {"code": 1} + else: + # 保存 + self.dbhelper.update_user_downloader( + did=dl_id, + name=dl_name, + dtype=dl_type, + user_config={ + "host": data.get("host"), + "port": data.get("port"), + "username": data.get("username"), + "password": data.get("password"), + "save_dir": data.get("save_dir") + }, + note=None) + BrushTask().init_config() + return {"code": 0} + + def __delete_downloader(self, data): + """ + 删除自定义下载器 + """ + dl_id = data.get("id") + if dl_id: + self.dbhelper.delete_user_downloader(dl_id) + BrushTask().init_config() + return {"code": 0} + + def __get_downloader(self, data): + """ + 查询自定义下载器 + """ + dl_id = data.get("id") + if dl_id: + info = self.dbhelper.get_user_downloaders(dl_id) + if info: + return {"code": 0, "info": info.as_dict()} + return {"code": 1} + + def __name_test(self, data): + """ + 名称识别测试 + """ + name = data.get("name") + if not name: + return {"code": -1} + media_info = Media().get_media_info(title=name) + if not media_info: + return {"code": 0, "data": {"name": "无法识别"}} + return {"code": 0, "data": self.mediainfo_dict(media_info)} + + @staticmethod + def mediainfo_dict(media_info): + if not media_info: + return {} + tmdb_id = media_info.tmdb_id + tmdb_link = media_info.get_detail_url() + tmdb_S_E_link = "" + if tmdb_id: + if media_info.get_season_string(): + tmdb_S_E_link = "%s/season/%s" % (tmdb_link, + media_info.get_season_seq()) + if media_info.get_episode_string(): + tmdb_S_E_link = "%s/episode/%s" % ( + tmdb_S_E_link, media_info.get_episode_seq()) + return { + "type": media_info.type.value if media_info.type else "", + "name": media_info.get_name(), + "title": media_info.title, + "year": media_info.year, + "season_episode": media_info.get_season_episode_string(), + "part": media_info.part, + "tmdbid": tmdb_id, + "tmdblink": tmdb_link, + "tmdb_S_E_link": tmdb_S_E_link, + "category": media_info.category, + "restype": media_info.resource_type, + "effect": media_info.resource_effect, + "pix": media_info.resource_pix, + "team": media_info.resource_team, + "video_codec": media_info.video_encode, + "audio_codec": media_info.audio_encode, + "org_string": media_info.org_string, + "ignored_words": media_info.ignored_words, + "replaced_words": media_info.replaced_words, + "offset_words": media_info.offset_words + } + + @staticmethod + def __rule_test(data): + title = data.get("title") + subtitle = data.get("subtitle") + size = data.get("size") + rulegroup = data.get("rulegroup") + if not title: + return {"code": -1} + meta_info = MetaInfo(title=title, subtitle=subtitle) + meta_info.size = float(size) * 1024 ** 3 if size else 0 + match_flag, res_order, match_msg = \ + Filter().check_torrent_filter(meta_info=meta_info, + filter_args={"rule": rulegroup}) + return { + "code": 0, + "flag": match_flag, + "text": "匹配" if match_flag else "未匹配", + "order": 100 - res_order if res_order else 0 + } + + @staticmethod + def __net_test(data): + target = data + if target == "image.tmdb.org": + target = target + "/t/p/w500/wwemzKWzjKYJFfCeiB57q3r4Bcm.png" + if target == "qyapi.weixin.qq.com": + target = target + "/cgi-bin/message/send" + target = "https://" + target + start_time = datetime.datetime.now() + if target.find("themoviedb") != -1 \ + or target.find("telegram") != -1 \ + or target.find("fanart") != -1 \ + or target.find("tmdb") != -1: + res = RequestUtils(proxies=Config().get_proxies(), + timeout=5).get_res(target) + else: + res = RequestUtils(timeout=5).get_res(target) + seconds = int((datetime.datetime.now() - + start_time).microseconds / 1000) + if not res: + return {"res": False, "time": "%s 毫秒" % seconds} + elif res.ok: + return {"res": True, "time": "%s 毫秒" % seconds} + else: + return {"res": False, "time": "%s 毫秒" % seconds} + + @staticmethod + def __get_site_activity(data): + """ + 查询site活动[上传,下载,魔力值] + :param data: {"name":site_name} + :return: + """ + if not data or "name" not in data: + return {"code": 1, "msg": "查询参数错误"} + + resp = {"code": 0} + + resp.update( + {"dataset": SiteUserInfo().get_pt_site_activity_history(data["name"])}) + return resp + + @staticmethod + def __get_site_history(data): + """ + 查询site 历史[上传,下载] + :param data: {"days":累计时间} + :return: + """ + if not data or "days" not in data or not isinstance(data["days"], int): + return {"code": 1, "msg": "查询参数错误"} + + resp = {"code": 0} + _, _, site, upload, download = SiteUserInfo().get_pt_site_statistics_history(data["days"] + 1) + + # 调整为dataset组织数据 + dataset = [["site", "upload", "download"]] + dataset.extend([[site, upload, download] + for site, upload, download in zip(site, upload, download)]) + resp.update({"dataset": dataset}) + return resp + + @staticmethod + def __get_site_seeding_info(data): + """ + 查询site 做种分布信息 大小,做种数 + :param data: {"name":site_name} + :return: + """ + if not data or "name" not in data: + return {"code": 1, "msg": "查询参数错误"} + + resp = {"code": 0} + + seeding_info = SiteUserInfo().get_pt_site_seeding_info( + data["name"]).get("seeding_info", []) + # 调整为dataset组织数据 + dataset = [["seeders", "size"]] + dataset.extend(seeding_info) + + resp.update({"dataset": dataset}) + return resp + + def __add_filtergroup(self, data): + """ + 新增规则组 + """ + name = data.get("name") + default = data.get("default") + if not name: + return {"code": -1} + self.dbhelper.add_filter_group(name, default) + Filter().init_config() + return {"code": 0} + + def __restore_filtergroup(self, data): + """ + 恢复初始规则组 + """ + groupids = data.get("groupids") + init_rulegroups = data.get("init_rulegroups") + for groupid in groupids: + try: + self.dbhelper.delete_filtergroup(groupid) + except Exception as err: + ExceptionUtils.exception_traceback(err) + for init_rulegroup in init_rulegroups: + if str(init_rulegroup.get("id")) == groupid: + for sql in init_rulegroup.get("sql"): + self.dbhelper.excute(sql) + Filter().init_config() + return {"code": 0} + + def __set_default_filtergroup(self, data): + groupid = data.get("id") + if not groupid: + return {"code": -1} + self.dbhelper.set_default_filtergroup(groupid) + Filter().init_config() + return {"code": 0} + + def __del_filtergroup(self, data): + groupid = data.get("id") + self.dbhelper.delete_filtergroup(groupid) + Filter().init_config() + return {"code": 0} + + def __add_filterrule(self, data): + rule_id = data.get("rule_id") + item = { + "group": data.get("group_id"), + "name": data.get("rule_name"), + "pri": data.get("rule_pri"), + "include": data.get("rule_include"), + "exclude": data.get("rule_exclude"), + "size": data.get("rule_sizelimit"), + "free": data.get("rule_free") + } + self.dbhelper.insert_filter_rule(ruleid=rule_id, item=item) + Filter().init_config() + return {"code": 0} + + def __del_filterrule(self, data): + ruleid = data.get("id") + self.dbhelper.delete_filterrule(ruleid) + Filter().init_config() + return {"code": 0} + + @staticmethod + def __filterrule_detail(data): + rid = data.get("ruleid") + groupid = data.get("groupid") + ruleinfo = Filter().get_rules(groupid=groupid, ruleid=rid) + if ruleinfo: + ruleinfo['include'] = "\n".join(ruleinfo.get("include")) + ruleinfo['exclude'] = "\n".join(ruleinfo.get("exclude")) + return {"code": 0, "info": ruleinfo} + + def get_recommend(self, data): + Type = data.get("type") + SubType = data.get("subtype") + CurrentPage = data.get("page") + if not CurrentPage: + CurrentPage = 1 + else: + CurrentPage = int(CurrentPage) + + res_list = [] + if Type in ['MOV', 'TV']: + if SubType == "hm": + # TMDB热门电影 + res_list = Media().get_tmdb_hot_movies(CurrentPage) + elif SubType == "ht": + # TMDB热门电视剧 + res_list = Media().get_tmdb_hot_tvs(CurrentPage) + elif SubType == "nm": + # TMDB最新电影 + res_list = Media().get_tmdb_new_movies(CurrentPage) + elif SubType == "nt": + # TMDB最新电视剧 + res_list = Media().get_tmdb_new_tvs(CurrentPage) + elif SubType == "dbom": + # 豆瓣正在上映 + res_list = DouBan().get_douban_online_movie(CurrentPage) + elif SubType == "dbhm": + # 豆瓣热门电影 + res_list = DouBan().get_douban_hot_movie(CurrentPage) + elif SubType == "dbht": + # 豆瓣热门电视剧 + res_list = DouBan().get_douban_hot_tv(CurrentPage) + elif SubType == "dbdh": + # 豆瓣热门动画 + res_list = DouBan().get_douban_hot_anime(CurrentPage) + elif SubType == "dbnm": + # 豆瓣最新电影 + res_list = DouBan().get_douban_new_movie(CurrentPage) + elif SubType == "dbtop": + # 豆瓣TOP250电影 + res_list = DouBan().get_douban_top250_movie(CurrentPage) + elif SubType == "dbzy": + # 豆瓣最新电视剧 + res_list = DouBan().get_douban_hot_show(CurrentPage) + elif SubType == "dbct": + # 华语口碑剧集榜 + res_list = DouBan().get_douban_chinese_weekly_tv(CurrentPage) + elif SubType == "dbgt": + # 全球口碑剧集榜 + res_list = DouBan().get_douban_weekly_tv_global(CurrentPage) + elif SubType == "sim": + # 相似推荐 + TmdbId = data.get("tmdbid") + res_list = self.__media_similar({ + "tmdbid": TmdbId, + "page": CurrentPage, + "type": Type + }).get("data") + elif SubType == "more": + # 更多推荐 + TmdbId = data.get("tmdbid") + res_list = self.__media_recommendations({ + "tmdbid": TmdbId, + "page": CurrentPage, + "type": Type + }).get("data") + elif SubType == "person": + # 人物作品 + PersonId = data.get("personid") + res_list = self.__person_medias({ + "personid": PersonId, + "type": Type, + "page": CurrentPage + }).get("data") + elif SubType == "bangumi": + # Bangumi每日放送 + Week = data.get("week") + res_list = Bangumi().get_bangumi_calendar(page=CurrentPage, week=Week) + elif Type == "SEARCH": + # 搜索词条 + Keyword = data.get("keyword") + Source = data.get("source") + medias = WebUtils.search_media_infos( + keyword=Keyword, source=Source, page=CurrentPage) + res_list = [media.to_dict() for media in medias] + elif Type == "DOWNLOADED": + # 近期下载 + res_list = self.get_downloaded({ + "page": CurrentPage + }).get("Items") + elif Type == "TRENDING": + # TMDB流行趋势 + res_list = Media().get_tmdb_trending_all_week(page=CurrentPage) + elif Type == "DISCOVER": + # TMDB发现 + mtype = MediaType.MOVIE if SubType in MovieTypes else MediaType.TV + # 过滤参数 with_genres with_original_language + params = data.get("params") or {} + res_list = Media().get_tmdb_discover(mtype=mtype, page=CurrentPage, params=params) + elif Type == "DOUBANTAG": + # 豆瓣发现 + mtype = MediaType.MOVIE if SubType in MovieTypes else MediaType.TV + # 参数 + params = data.get("params") or {} + # 排序 + sort = params.get("sort") or "T" + # 选中的分类 + tags = params.get("tags") or "" + # 过滤参数 + res_list = DouBan().get_douban_disover(mtype=mtype, + sort=sort, + tags=tags, + page=CurrentPage) + + # 补充存在与订阅状态 + filetransfer = FileTransfer() + for res in res_list: + fav, rssid = filetransfer.get_media_exists_flag(mtype=Type, + title=res.get( + "title"), + year=res.get( + "year"), + mediaid=res.get("id")) + res.update({ + 'fav': fav, + 'rssid': rssid + }) + return {"code": 0, "Items": res_list} + + def get_downloaded(self, data): + page = data.get("page") + Items = self.dbhelper.get_download_history(page=page) + if Items: + return {"code": 0, "Items": [{ + 'id': item.TMDBID, + 'orgid': item.TMDBID, + 'tmdbid': item.TMDBID, + 'title': item.TITLE, + 'type': 'MOV' if item.TYPE == "电影" else "TV", + 'media_type': item.TYPE, + 'year': item.YEAR, + 'vote': item.VOTE, + 'image': item.POSTER, + 'overview': item.TORRENT, + "date": item.DATE, + "site": item.SITE + } for item in Items]} + else: + return {"code": 0, "Items": []} + + @staticmethod + def parse_brush_rule_string(rules: dict): + if not rules: + return "" + rule_filter_string = {"gt": ">", "lt": "<", "bw": ""} + rule_htmls = [] + if rules.get("size"): + sizes = rules.get("size").split("#") + if sizes[0]: + if sizes[1]: + sizes[1] = sizes[1].replace(",", "-") + rule_htmls.append( + '种子大小: %s %sGB' + % (rule_filter_string.get(sizes[0]), sizes[1])) + if rules.get("pubdate"): + pubdates = rules.get("pubdate").split("#") + if pubdates[0]: + if pubdates[1]: + pubdates[1] = pubdates[1].replace(",", "-") + rule_htmls.append( + '发布时间: %s %s小时' + % (rule_filter_string.get(pubdates[0]), pubdates[1])) + if rules.get("upspeed"): + rule_htmls.append('上传限速: %sB/s' + % StringUtils.str_filesize(int(rules.get("upspeed")) * 1024)) + if rules.get("downspeed"): + rule_htmls.append('下载限速: %sB/s' + % StringUtils.str_filesize(int(rules.get("downspeed")) * 1024)) + if rules.get("include"): + rule_htmls.append( + '包含: %s' + % rules.get("include")) + if rules.get("hr"): + rule_htmls.append( + '排除: HR') + if rules.get("exclude"): + rule_htmls.append( + '排除: %s' + % rules.get("exclude")) + if rules.get("dlcount"): + rule_htmls.append('同时下载: %s' + % rules.get("dlcount")) + if rules.get("peercount"): + peer_counts = None + if rules.get("peercount") == "#": + peer_counts = None + elif "#" in rules.get("peercount"): + peer_counts = rules.get("peercount").split("#") + peer_counts[1] = peer_counts[1].replace(",", "-") if (len(peer_counts) >= 2 and peer_counts[1]) else \ + peer_counts[1] + else: + try: + # 兼容性代码 + peer_counts = ["lt", int(rules.get("peercount"))] + except Exception as err: + ExceptionUtils.exception_traceback(err) + pass + if peer_counts: + rule_htmls.append( + '做种人数: %s %s' + % (rule_filter_string.get(peer_counts[0]), peer_counts[1])) + if rules.get("time"): + times = rules.get("time").split("#") + if times[0]: + rule_htmls.append( + '做种时间: %s %s小时' + % (rule_filter_string.get(times[0]), times[1])) + if rules.get("ratio"): + ratios = rules.get("ratio").split("#") + if ratios[0]: + rule_htmls.append( + '分享率: %s %s' + % (rule_filter_string.get(ratios[0]), ratios[1])) + if rules.get("uploadsize"): + uploadsizes = rules.get("uploadsize").split("#") + if uploadsizes[0]: + rule_htmls.append( + '上传量: %s %sGB' + % (rule_filter_string.get(uploadsizes[0]), uploadsizes[1])) + if rules.get("dltime"): + dltimes = rules.get("dltime").split("#") + if dltimes[0]: + rule_htmls.append( + '下载耗时: %s %s小时' + % (rule_filter_string.get(dltimes[0]), dltimes[1])) + if rules.get("avg_upspeed"): + avg_upspeeds = rules.get("avg_upspeed").split("#") + if avg_upspeeds[0]: + rule_htmls.append( + '平均上传速度: %s %sKB/S' + % (rule_filter_string.get(avg_upspeeds[0]), avg_upspeeds[1])) + if rules.get("iatime"): + iatimes = rules.get("iatime").split("#") + if iatimes[0]: + rule_htmls.append( + '未活动时间: %s %s小时' + % (rule_filter_string.get(iatimes[0]), iatimes[1])) + + return "
".join(rule_htmls) + + @staticmethod + def __clear_tmdb_cache(data): + """ + 清空TMDB缓存 + """ + try: + MetaHelper().clear_meta_data() + os.remove(MetaHelper().get_meta_data_path()) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 0, "msg": str(e)} + return {"code": 0} + + @staticmethod + def __check_site_attr(data): + """ + 检查站点标识 + """ + site_attr = Sites().get_grapsite_conf(data.get("url")) + site_free = site_2xfree = site_hr = False + if site_attr.get("FREE"): + site_free = True + if site_attr.get("2XFREE"): + site_2xfree = True + if site_attr.get("HR"): + site_hr = True + return {"code": 0, "site_free": site_free, "site_2xfree": site_2xfree, "site_hr": site_hr} + + @staticmethod + def __refresh_process(data): + """ + 刷新进度条 + """ + detail = ProgressHelper().get_process(data.get("type")) + if detail: + return {"code": 0, "value": detail.get("value"), "text": detail.get("text")} + else: + return {"code": 1, "value": 0, "text": "正在处理..."} + + @staticmethod + def __restory_backup(data): + """ + 解压恢复备份文件 + """ + filename = data.get("file_name") + if filename: + config_path = Config().get_config_path() + temp_path = Config().get_temp_path() + file_path = os.path.join(temp_path, filename) + try: + shutil.unpack_archive(file_path, config_path, format='zip') + return {"code": 0, "msg": ""} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + finally: + if os.path.exists(file_path): + os.remove(file_path) + + return {"code": 1, "msg": "文件不存在"} + + @staticmethod + def __start_mediasync(data): + """ + 开始媒体库同步 + """ + ThreadHelper().start_thread(MediaServer().sync_mediaserver, ()) + return {"code": 0} + + @staticmethod + def __mediasync_state(data): + """ + 获取媒体库同步数据情况 + """ + status = MediaServer().get_mediasync_status() + if not status: + return {"code": 0, "text": "未同步"} + else: + return {"code": 0, "text": "电影:%s,电视剧:%s,同步时间:%s" % + (status.get("movie_count"), + status.get("tv_count"), + status.get("time"))} + + @staticmethod + def __get_tvseason_list(data): + """ + 获取剧集季列表 + """ + tmdbid = data.get("tmdbid") + title = data.get("title") + if title: + title_season = MetaInfo(title=title).begin_season + else: + title_season = None + if not str(tmdbid).isdigit(): + media_info = WebUtils.get_mediainfo_from_id(mtype=MediaType.TV, + mediaid=tmdbid) + season_infos = Media().get_tmdb_tv_seasons(media_info.tmdb_info) + else: + season_infos = Media().get_tmdb_tv_seasons_byid(tmdbid=tmdbid) + if title_season: + seasons = [ + { + "text": "第%s季" % title_season, + "num": title_season + } + ] + else: + seasons = [ + { + "text": "第%s季" % cn2an.an2cn(season.get("season_number"), mode='low'), + "num": season.get("season_number") + } + for season in season_infos + ] + return {"code": 0, "seasons": seasons} + + @staticmethod + def __get_userrss_task(data): + """ + 获取自定义订阅详情 + """ + taskid = data.get("id") + return {"code": 0, "detail": RssChecker().get_rsstask_info(taskid=taskid)} + + def __delete_userrss_task(self, data): + """ + 删除自定义订阅 + """ + if self.dbhelper.delete_userrss_task(data.get("id")): + RssChecker().init_config() + return {"code": 0} + else: + return {"code": 1} + + def __update_userrss_task(self, data): + """ + 新增或修改自定义订阅 + """ + uses = data.get("uses") + params = { + "id": data.get("id"), + "name": data.get("name"), + "address": data.get("address"), + "parser": data.get("parser"), + "interval": data.get("interval"), + "uses": uses, + "include": data.get("include"), + "exclude": data.get("exclude"), + "filter_rule": data.get("rule"), + "state": data.get("state"), + "save_path": data.get("save_path"), + "download_setting": data.get("download_setting"), + } + if uses == "D": + params.update({ + "recognization": data.get("recognization") + }) + elif uses == "R": + params.update({ + "over_edition": data.get("over_edition"), + "sites": data.get("sites"), + "filter_args": { + "restype": data.get("restype"), + "pix": data.get("pix"), + "team": data.get("team") + } + }) + else: + return {"code": 1} + if self.dbhelper.update_userrss_task(params): + RssChecker().init_config() + return {"code": 0} + else: + return {"code": 1} + + @staticmethod + def __get_rssparser(data): + """ + 获取订阅解析器详情 + """ + pid = data.get("id") + return {"code": 0, "detail": RssChecker().get_userrss_parser(pid=pid)} + + def __delete_rssparser(self, data): + """ + 删除订阅解析器 + """ + if self.dbhelper.delete_userrss_parser(data.get("id")): + RssChecker().init_config() + return {"code": 0} + else: + return {"code": 1} + + def __update_rssparser(self, data): + """ + 新增或更新订阅解析器 + """ + params = { + "id": data.get("id"), + "name": data.get("name"), + "type": data.get("type"), + "format": data.get("format"), + "params": data.get("params") + } + if self.dbhelper.update_userrss_parser(params): + RssChecker().init_config() + return {"code": 0} + else: + return {"code": 1} + + @staticmethod + def __run_userrss(data): + RssChecker().check_task_rss(data.get("id")) + return {"code": 0} + + @staticmethod + def __run_brushtask(data): + BrushTask().check_task_rss(data.get("id")) + return {"code": 0} + + @staticmethod + def __list_site_resources(data): + resources = Indexer().list_builtin_resources(index_id=data.get("id"), + page=data.get("page"), + keyword=data.get("keyword")) + if not resources: + return {"code": 1, "msg": "获取站点资源出现错误,无法连接到站点!"} + else: + return {"code": 0, "data": resources} + + @staticmethod + def __list_rss_articles(data): + uses = RssChecker().get_rsstask_info(taskid=data.get("id")).get("uses") + articles = RssChecker().get_rss_articles(data.get("id")) + count = len(articles) + if articles: + return {"code": 0, "data": articles, "count": count, "uses": uses} + else: + return {"code": 1, "msg": "未获取到报文"} + + def __rss_article_test(self, data): + taskid = data.get("taskid") + title = data.get("title") + if not taskid: + return {"code": -1} + if not title: + return {"code": -1} + media_info, match_flag, exist_flag = RssChecker( + ).test_rss_articles(taskid=taskid, title=title) + if not media_info: + return {"code": 0, "data": {"name": "无法识别"}} + media_dict = self.mediainfo_dict(media_info) + media_dict.update({"match_flag": match_flag, "exist_flag": exist_flag}) + return {"code": 0, "data": media_dict} + + def __list_rss_history(self, data): + downloads = [] + historys = self.dbhelper.get_userrss_task_history(data.get("id")) + count = len(historys) + for history in historys: + params = { + "title": history.TITLE, + "downloader": history.DOWNLOADER, + "date": history.DATE + } + downloads.append(params) + if downloads: + return {"code": 0, "data": downloads, "count": count} + else: + return {"code": 1, "msg": "无下载记录"} + + @staticmethod + def __rss_articles_check(data): + if not data.get("articles"): + return {"code": 2} + res = RssChecker().check_rss_articles( + flag=data.get("flag"), articles=data.get("articles")) + if res: + return {"code": 0} + else: + return {"code": 1} + + @staticmethod + def __rss_articles_download(data): + if not data.get("articles"): + return {"code": 2} + res = RssChecker().download_rss_articles( + taskid=data.get("taskid"), articles=data.get("articles")) + if res: + return {"code": 0} + else: + return {"code": 1} + + def __add_custom_word_group(self, data): + try: + tmdb_id = data.get("tmdb_id") + tmdb_type = data.get("tmdb_type") + if tmdb_type == "tv": + if not self.dbhelper.is_custom_word_group_existed(tmdbid=tmdb_id, gtype=2): + tmdb_info = Media().get_tmdb_info(mtype=MediaType.TV, tmdbid=tmdb_id) + if not tmdb_info: + return {"code": 1, "msg": "添加失败,无法查询到TMDB信息"} + self.dbhelper.insert_custom_word_groups(title=tmdb_info.get("name"), + year=tmdb_info.get( + "first_air_date")[0:4], + gtype=2, + tmdbid=tmdb_id, + season_count=tmdb_info.get("number_of_seasons")) + return {"code": 0, "msg": ""} + else: + return {"code": 1, "msg": "识别词组(TMDB ID)已存在"} + elif tmdb_type == "movie": + if not self.dbhelper.is_custom_word_group_existed(tmdbid=tmdb_id, gtype=1): + tmdb_info = Media().get_tmdb_info(mtype=MediaType.MOVIE, tmdbid=tmdb_id) + if not tmdb_info: + return {"code": 1, "msg": "添加失败,无法查询到TMDB信息"} + self.dbhelper.insert_custom_word_groups(title=tmdb_info.get("title"), + year=tmdb_info.get( + "release_date")[0:4], + gtype=1, + tmdbid=tmdb_id, + season_count=0) + return {"code": 0, "msg": ""} + else: + return {"code": 1, "msg": "识别词组(TMDB ID)已存在"} + else: + return {"code": 1, "msg": "无法识别媒体类型"} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + def __delete_custom_word_group(self, data): + try: + gid = data.get("gid") + self.dbhelper.delete_custom_word_group(gid=gid) + WordsHelper().init_config() + return {"code": 0, "msg": ""} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + def __add_or_edit_custom_word(self, data): + try: + wid = data.get("id") + gid = data.get("gid") + group_type = data.get("group_type") + replaced = data.get("new_replaced") + replace = data.get("new_replace") + front = data.get("new_front") + back = data.get("new_back") + offset = data.get("new_offset") + whelp = data.get("new_help") + wtype = data.get("type") + season = data.get("season") + enabled = data.get("enabled") + regex = data.get("regex") + # 集数偏移格式检查 + if wtype in ["3", "4"]: + if not re.findall(r'EP', offset): + return {"code": 1, "msg": "偏移集数格式有误"} + if re.findall(r'(?!-|\+|\*|/|[0-9]).', re.sub(r'EP', "", offset)): + return {"code": 1, "msg": "偏移集数格式有误"} + if wid: + self.dbhelper.delete_custom_word(wid=wid) + # 电影 + if group_type == "1": + season = -2 + # 屏蔽 + if wtype == "1": + if not self.dbhelper.is_custom_words_existed(replaced=replaced): + self.dbhelper.insert_custom_word(replaced=replaced, + replace="", + front="", + back="", + offset="", + wtype=wtype, + gid=gid, + season=season, + enabled=enabled, + regex=regex, + whelp=whelp if whelp else "") + WordsHelper().init_config() + return {"code": 0, "msg": ""} + else: + return {"code": 1, "msg": "识别词已存在\n(被替换词:%s)" % replaced} + # 替换 + elif wtype == "2": + if not self.dbhelper.is_custom_words_existed(replaced=replaced): + self.dbhelper.insert_custom_word(replaced=replaced, + replace=replace, + front="", + back="", + offset="", + wtype=wtype, + gid=gid, + season=season, + enabled=enabled, + regex=regex, + whelp=whelp if whelp else "") + WordsHelper().init_config() + return {"code": 0, "msg": ""} + else: + return {"code": 1, "msg": "识别词已存在\n(被替换词:%s)" % replaced} + # 集偏移 + elif wtype == "4": + if not self.dbhelper.is_custom_words_existed(front=front, back=back): + self.dbhelper.insert_custom_word(replaced="", + replace="", + front=front, + back=back, + offset=offset, + wtype=wtype, + gid=gid, + season=season, + enabled=enabled, + regex=regex, + whelp=whelp if whelp else "") + WordsHelper().init_config() + return {"code": 0, "msg": ""} + else: + return {"code": 1, "msg": "识别词已存在\n(前后定位词:%s@%s)" % (front, back)} + # 替换+集偏移 + elif wtype == "3": + if not self.dbhelper.is_custom_words_existed(replaced=replaced): + self.dbhelper.insert_custom_word(replaced=replaced, + replace=replace, + front=front, + back=back, + offset=offset, + wtype=wtype, + gid=gid, + season=season, + enabled=enabled, + regex=regex, + whelp=whelp if whelp else "") + WordsHelper().init_config() + return {"code": 0, "msg": ""} + else: + return {"code": 1, "msg": "识别词已存在\n(被替换词:%s)" % replaced} + else: + return {"code": 1, "msg": ""} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + def __get_custom_word(self, data): + try: + wid = data.get("wid") + word_info = self.dbhelper.get_custom_words(wid=wid) + if word_info: + word_info = word_info[0] + word = {"id": word_info.ID, + "replaced": word_info.REPLACED, + "replace": word_info.REPLACE, + "front": word_info.FRONT, + "back": word_info.BACK, + "offset": word_info.OFFSET, + "type": word_info.TYPE, + "group_id": word_info.GROUP_ID, + "season": word_info.SEASON, + "enabled": word_info.ENABLED, + "regex": word_info.REGEX, + "help": word_info.HELP, } + else: + word = {} + return {"code": 0, "data": word} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": "查询识别词失败"} + + def __delete_custom_word(self, data): + try: + wid = data.get("id") + self.dbhelper.delete_custom_word(wid) + WordsHelper().init_config() + return {"code": 0, "msg": ""} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + def __check_custom_words(self, data): + try: + flag_dict = {"enable": 1, "disable": 0} + ids_info = data.get("ids_info") + enabled = flag_dict.get(data.get("flag")) + ids = [id_info.split("_")[1] for id_info in ids_info] + for wid in ids: + self.dbhelper.check_custom_word(wid=wid, enabled=enabled) + WordsHelper().init_config() + return {"code": 0, "msg": ""} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": "识别词状态设置失败"} + + def __export_custom_words(self, data): + try: + note = data.get("note") + ids_info = data.get("ids_info").split("@") + group_ids = [] + word_ids = [] + for id_info in ids_info: + wid = id_info.split("_") + group_ids.append(wid[0]) + word_ids.append(wid[1]) + export_dict = {} + for group_id in group_ids: + if group_id == "-1": + export_dict["-1"] = {"id": -1, + "title": "通用", + "type": 1, + "words": {}, } + else: + group_info = self.dbhelper.get_custom_word_groups( + gid=group_id) + if group_info: + group_info = group_info[0] + export_dict[str(group_info.ID)] = {"id": group_info.ID, + "title": group_info.TITLE, + "year": group_info.YEAR, + "type": group_info.TYPE, + "tmdbid": group_info.TMDBID, + "season_count": group_info.SEASON_COUNT, + "words": {}, } + for word_id in word_ids: + word_info = self.dbhelper.get_custom_words(wid=word_id) + if word_info: + word_info = word_info[0] + export_dict[str(word_info.GROUP_ID)]["words"][str(word_info.ID)] = {"id": word_info.ID, + "replaced": word_info.REPLACED, + "replace": word_info.REPLACE, + "front": word_info.FRONT, + "back": word_info.BACK, + "offset": word_info.OFFSET, + "type": word_info.TYPE, + "season": word_info.SEASON, + "regex": word_info.REGEX, + "help": word_info.HELP, } + export_string = json.dumps(export_dict) + "@@@@@@" + str(note) + string = base64.b64encode( + export_string.encode("utf-8")).decode('utf-8') + return {"code": 0, "string": string} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + @staticmethod + def __analyse_import_custom_words_code(data): + try: + import_code = data.get('import_code') + string = base64.b64decode(import_code.encode( + "utf-8")).decode('utf-8').split("@@@@@@") + note_string = string[1] + import_dict = json.loads(string[0]) + groups = [] + for group in import_dict.values(): + wid = group.get('id') + title = group.get("title") + year = group.get("year") + wtype = group.get("type") + tmdbid = group.get("tmdbid") + season_count = group.get("season_count") or "" + words = group.get("words") + if tmdbid: + link = "https://www.themoviedb.org/%s/%s" % ( + "movie" if int(wtype) == 1 else "tv", tmdbid) + else: + link = "" + groups.append({"id": wid, + "name": "%s(%s)" % (title, year) if year else title, + "link": link, + "type": wtype, + "seasons": season_count, + "words": words}) + return {"code": 0, "groups": groups, "note_string": note_string} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + def __import_custom_words(self, data): + try: + import_code = data.get('import_code') + ids_info = data.get('ids_info') + string = base64.b64decode(import_code.encode( + "utf-8")).decode('utf-8').split("@@@@@@") + import_dict = json.loads(string[0]) + import_group_ids = [id_info.split("_")[0] for id_info in ids_info] + group_id_dict = {} + for import_group_id in import_group_ids: + import_group_info = import_dict.get(import_group_id) + if int(import_group_info.get("id")) == -1: + group_id_dict["-1"] = -1 + continue + title = import_group_info.get("title") + year = import_group_info.get("year") + gtype = import_group_info.get("type") + tmdbid = import_group_info.get("tmdbid") + season_count = import_group_info.get("season_count") + if not self.dbhelper.is_custom_word_group_existed(tmdbid=tmdbid, gtype=gtype): + self.dbhelper.insert_custom_word_groups(title=title, + year=year, + gtype=gtype, + tmdbid=tmdbid, + season_count=season_count) + group_info = self.dbhelper.get_custom_word_groups( + tmdbid=tmdbid, gtype=gtype) + if group_info: + group_id_dict[import_group_id] = group_info[0].ID + for id_info in ids_info: + id_info = id_info.split('_') + import_group_id = id_info[0] + import_word_id = id_info[1] + import_word_info = import_dict.get( + import_group_id).get("words").get(import_word_id) + gid = group_id_dict.get(import_group_id) + replaced = import_word_info.get("replaced") + replace = import_word_info.get("replace") + front = import_word_info.get("front") + back = import_word_info.get("back") + offset = import_word_info.get("offset") + whelp = import_word_info.get("help") + wtype = int(import_word_info.get("type")) + season = import_word_info.get("season") + regex = import_word_info.get("regex") + # 屏蔽, 替换, 替换+集偏移 + if wtype in [1, 2, 3]: + if self.dbhelper.is_custom_words_existed(replaced=replaced): + return {"code": 1, "msg": "识别词已存在\n(被替换词:%s)" % replaced} + # 集偏移 + elif wtype == 4: + if self.dbhelper.is_custom_words_existed(front=front, back=back): + return {"code": 1, "msg": "识别词已存在\n(前后定位词:%s@%s)" % (front, back)} + self.dbhelper.insert_custom_word(replaced=replaced, + replace=replace, + front=front, + back=back, + offset=offset, + wtype=wtype, + gid=gid, + season=season, + enabled=1, + regex=regex, + whelp=whelp if whelp else "") + WordsHelper().init_config() + return {"code": 0, "msg": ""} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e)} + + @staticmethod + def __get_categories(data): + if data.get("type") == "电影": + categories = Category().get_movie_categorys() + elif data.get("type") == "电视剧": + categories = Category().get_tv_categorys() + else: + categories = Category().get_anime_categorys() + return {"code": 0, "category": list(categories), "id": data.get("id"), "value": data.get("value")} + + def __delete_rss_history(self, data): + rssid = data.get("rssid") + self.dbhelper.delete_rss_history(rssid=rssid) + return {"code": 0} + + def __re_rss_history(self, data): + rssid = data.get("rssid") + rtype = data.get("type") + rssinfo = self.dbhelper.get_rss_history(rtype=rtype, rid=rssid) + if rssinfo: + if rtype == "MOV": + mtype = MediaType.MOVIE + else: + mtype = MediaType.TV + if rssinfo[0].SEASON: + season = int(str(rssinfo[0].SEASON).replace("S", "")) + else: + season = None + code, msg, _ = Subscribe().add_rss_subscribe(mtype=mtype, + name=rssinfo[0].NAME, + year=rssinfo[0].YEAR, + season=season, + mediaid=rssinfo[0].TMDBID, + total_ep=rssinfo[0].TOTAL, + current_ep=rssinfo[0].START) + return {"code": code, "msg": msg} + else: + return {"code": 1, "msg": "订阅历史记录不存在"} + + def __share_filtergroup(self, data): + gid = data.get("id") + group_info = self.dbhelper.get_config_filter_group(gid=gid) + if not group_info: + return {"code": 1, "msg": "规则组不存在"} + group_rules = self.dbhelper.get_config_filter_rule(groupid=gid) + if not group_rules: + return {"code": 1, "msg": "规则组没有对应规则"} + rules = [] + for rule in group_rules: + rules.append({ + "name": rule.ROLE_NAME, + "pri": rule.PRIORITY, + "include": rule.INCLUDE, + "exclude": rule.EXCLUDE, + "size": rule.SIZE_LIMIT, + "free": rule.NOTE + }) + rule_json = { + "name": group_info[0].GROUP_NAME, + "rules": rules + } + json_string = base64.b64encode(json.dumps( + rule_json).encode("utf-8")).decode('utf-8') + return {"code": 0, "string": json_string} + + def __import_filtergroup(self, data): + content = data.get("content") + try: + json_str = base64.b64decode( + str(content).encode("utf-8")).decode('utf-8') + json_obj = json.loads(json_str) + if json_obj: + if not json_obj.get("name"): + return {"code": 1, "msg": "数据格式不正确"} + self.dbhelper.add_filter_group(name=json_obj.get("name")) + group_id = self.dbhelper.get_filter_groupid_by_name( + json_obj.get("name")) + if not group_id: + return {"code": 1, "msg": "数据内容不正确"} + if json_obj.get("rules"): + for rule in json_obj.get("rules"): + self.dbhelper.insert_filter_rule(item={ + "group": group_id, + "name": rule.get("name"), + "pri": rule.get("pri"), + "include": rule.get("include"), + "exclude": rule.get("exclude"), + "size": rule.get("size"), + "free": rule.get("free") + }) + Filter().init_config() + return {"code": 0, "msg": ""} + except Exception as err: + ExceptionUtils.exception_traceback(err) + return {"code": 1, "msg": "数据格式不正确,%s" % str(err)} + + @staticmethod + def get_library_spacesize(data=None): + """ + 查询媒体库存储空间 + """ + # 磁盘空间 + UsedPercent = 0 + TotalSpaceList = [] + media = Config().get_config('media') + if media: + # 电影目录 + movie_paths = media.get('movie_path') + if not isinstance(movie_paths, list): + movie_paths = [movie_paths] + movie_used, movie_total = 0, 0 + for movie_path in movie_paths: + if not movie_path: + continue + used, total = SystemUtils.get_used_of_partition(movie_path) + if "%s-%s" % (used, total) not in TotalSpaceList: + TotalSpaceList.append("%s-%s" % (used, total)) + movie_used += used + movie_total += total + # 电视目录 + tv_paths = media.get('tv_path') + if not isinstance(tv_paths, list): + tv_paths = [tv_paths] + tv_used, tv_total = 0, 0 + for tv_path in tv_paths: + if not tv_path: + continue + used, total = SystemUtils.get_used_of_partition(tv_path) + if "%s-%s" % (used, total) not in TotalSpaceList: + TotalSpaceList.append("%s-%s" % (used, total)) + tv_used += used + tv_total += total + # 动漫目录 + anime_paths = media.get('anime_path') + if not isinstance(anime_paths, list): + anime_paths = [anime_paths] + anime_used, anime_total = 0, 0 + for anime_path in anime_paths: + if not anime_path: + continue + used, total = SystemUtils.get_used_of_partition(anime_path) + if "%s-%s" % (used, total) not in TotalSpaceList: + TotalSpaceList.append("%s-%s" % (used, total)) + anime_used += used + anime_total += total + # 总空间 + TotalSpaceAry = [] + if movie_total not in TotalSpaceAry: + TotalSpaceAry.append(movie_total) + if tv_total not in TotalSpaceAry: + TotalSpaceAry.append(tv_total) + if anime_total not in TotalSpaceAry: + TotalSpaceAry.append(anime_total) + TotalSpace = sum(TotalSpaceAry) + # 已使用空间 + UsedSapceAry = [] + if movie_used not in UsedSapceAry: + UsedSapceAry.append(movie_used) + if tv_used not in UsedSapceAry: + UsedSapceAry.append(tv_used) + if anime_used not in UsedSapceAry: + UsedSapceAry.append(anime_used) + UsedSapce = sum(UsedSapceAry) + # 电影电视使用百分比格式化 + if TotalSpace: + UsedPercent = "%0.1f" % ((UsedSapce / TotalSpace) * 100) + # 总剩余空间 格式化 + FreeSpace = "{:,} TB".format( + round((TotalSpace - UsedSapce) / 1024 / 1024 / 1024 / 1024, 2)) + # 总使用空间 格式化 + UsedSapce = "{:,} TB".format( + round(UsedSapce / 1024 / 1024 / 1024 / 1024, 2)) + # 总空间 格式化 + TotalSpace = "{:,} TB".format( + round(TotalSpace / 1024 / 1024 / 1024 / 1024, 2)) + + return {"code": 0, + "UsedPercent": UsedPercent, + "FreeSpace": FreeSpace, + "UsedSapce": UsedSapce, + "TotalSpace": TotalSpace} + + def get_transfer_statistics(self, data=None): + """ + 查询转移历史统计数据 + """ + MovieChartLabels = [] + MovieNums = [] + TvChartData = {} + TvNums = [] + AnimeNums = [] + for statistic in self.dbhelper.get_transfer_statistics(): + if statistic[0] == "电影": + MovieChartLabels.append(statistic[1]) + MovieNums.append(statistic[2]) + else: + if not TvChartData.get(statistic[1]): + TvChartData[statistic[1]] = {"tv": 0, "anime": 0} + if statistic[0] == "电视剧": + TvChartData[statistic[1]]["tv"] += statistic[2] + elif statistic[0] == "动漫": + TvChartData[statistic[1]]["anime"] += statistic[2] + TvChartLabels = list(TvChartData) + for tv_data in TvChartData.values(): + TvNums.append(tv_data.get("tv")) + AnimeNums.append(tv_data.get("anime")) + + return { + "code": 0, + "MovieChartLabels": MovieChartLabels, + "MovieNums": MovieNums, + "TvChartLabels": TvChartLabels, + "TvNums": TvNums, + "AnimeNums": AnimeNums + } + + @staticmethod + def get_library_mediacount(data=None): + """ + 查询媒体库统计数据 + """ + MediaServerClient = MediaServer() + media_counts = MediaServerClient.get_medias_count() + UserCount = MediaServerClient.get_user_count() + if media_counts: + return { + "code": 0, + "Movie": "{:,}".format(media_counts.get('MovieCount')), + "Series": "{:,}".format(media_counts.get('SeriesCount')), + "Episodes": "{:,}".format(media_counts.get('EpisodeCount')) if media_counts.get( + 'EpisodeCount') else "", + "Music": "{:,}".format(media_counts.get('SongCount')), + "User": UserCount + } + else: + return {"code": -1, "msg": "媒体库服务器连接失败"} + + @staticmethod + def get_library_playhistory(data=None): + """ + 查询媒体库播放记录 + """ + return {"code": 0, "result": MediaServer().get_activity_log(30)} + + def get_search_result(self, data=None): + """ + 查询所有搜索结果 + """ + SearchResults = {} + res = self.dbhelper.get_search_results() + total = len(res) + for item in res: + # 质量(来源、效果)、分辨率 + if item.RES_TYPE: + try: + res_mix = json.loads(item.RES_TYPE) + except Exception as err: + ExceptionUtils.exception_traceback(err) + continue + respix = res_mix.get("respix") or "" + video_encode = res_mix.get("video_encode") or "" + restype = res_mix.get("restype") or "" + reseffect = res_mix.get("reseffect") or "" + else: + restype = "" + respix = "" + reseffect = "" + video_encode = "" + # 分组标识 (来源,分辨率) + group_key = re.sub(r"[-.\s@|]", "", f"{respix}_{restype}").lower() + # 分组信息 + group_info = { + "respix": respix, + "restype": restype, + } + # 种子唯一标识 (大小,质量(来源、效果),制作组组成) + unique_key = re.sub(r"[-.\s@|]", "", + f"{respix}_{restype}_{video_encode}_{reseffect}_{item.SIZE}_{item.OTHERINFO}").lower() + # 标识信息 + unique_info = { + "video_encode": video_encode, + "size": item.SIZE, + "reseffect": reseffect, + "releasegroup": item.OTHERINFO + } + # 结果 + title_string = f"{item.TITLE}" + if item.YEAR: + title_string = f"{title_string} ({item.YEAR})" + # 电视剧季集标识 + mtype = item.TYPE or "" + SE_key = item.ES_STRING if item.ES_STRING and mtype != "MOV" else "MOV" + media_type = {"MOV": "电影", "TV": "电视剧", "ANI": "动漫"}.get(mtype) + # 种子信息 + torrent_item = { + "id": item.ID, + "seeders": item.SEEDERS, + "enclosure": item.ENCLOSURE, + "site": item.SITE, + "torrent_name": item.TORRENT_NAME, + "description": item.DESCRIPTION, + "pageurl": item.PAGEURL, + "uploadvalue": item.UPLOAD_VOLUME_FACTOR, + "downloadvalue": item.DOWNLOAD_VOLUME_FACTOR, + "size": item.SIZE, + "respix": respix, + "restype": restype, + "reseffect": reseffect, + "releasegroup": item.OTHERINFO, + "video_encode": video_encode + } + # 促销 + free_item = { + "value": f"{item.UPLOAD_VOLUME_FACTOR} {item.DOWNLOAD_VOLUME_FACTOR}", + "name": MetaBase.get_free_string(item.UPLOAD_VOLUME_FACTOR, item.DOWNLOAD_VOLUME_FACTOR) + } + # 季 + filter_season = SE_key.split()[0] if SE_key and SE_key not in [ + "MOV", "TV"] else None + # 合并搜索结果 + if SearchResults.get(title_string): + # 种子列表 + result_item = SearchResults[title_string] + torrent_dict = SearchResults[title_string].get("torrent_dict") + SE_dict = torrent_dict.get(SE_key) + if SE_dict: + group = SE_dict.get(group_key) + if group: + unique = group.get("group_torrents").get(unique_key) + if unique: + unique["torrent_list"].append(torrent_item) + group["group_total"] += 1 + else: + group["group_total"] += 1 + group.get("group_torrents")[unique_key] = { + "unique_info": unique_info, + "torrent_list": [torrent_item] + } + else: + SE_dict[group_key] = { + "group_info": group_info, + "group_total": 1, + "group_torrents": { + unique_key: { + "unique_info": unique_info, + "torrent_list": [torrent_item] + } + } + } + else: + torrent_dict[SE_key] = { + group_key: { + "group_info": group_info, + "group_total": 1, + "group_torrents": { + unique_key: { + "unique_info": unique_info, + "torrent_list": [torrent_item] + } + } + } + } + # 过滤条件 + torrent_filter = dict(result_item.get("filter")) + if free_item not in torrent_filter.get("free"): + torrent_filter["free"].append(free_item) + if item.SITE not in torrent_filter.get("site"): + torrent_filter["site"].append(item.SITE) + if video_encode \ + and video_encode not in torrent_filter.get("video"): + torrent_filter["video"].append(video_encode) + if filter_season \ + and filter_season not in torrent_filter.get("season"): + torrent_filter["season"].append(filter_season) + else: + # 是否已存在 + if item.TMDBID: + exist_flag = MediaServer().check_item_exists( + title=item.TITLE, year=item.YEAR, tmdbid=item.TMDBID) + else: + exist_flag = False + SearchResults[title_string] = { + "key": item.ID, + "title": item.TITLE, + "year": item.YEAR, + "type_key": mtype, + "image": item.IMAGE, + "type": media_type, + "vote": item.VOTE, + "tmdbid": item.TMDBID, + "backdrop": item.IMAGE, + "poster": item.POSTER, + "overview": item.OVERVIEW, + "exist": exist_flag, + "torrent_dict": { + SE_key: { + group_key: { + "group_info": group_info, + "group_total": 1, + "group_torrents": { + unique_key: { + "unique_info": unique_info, + "torrent_list": [torrent_item] + } + } + } + } + }, + "filter": { + "site": [item.SITE], + "free": [free_item], + "video": [video_encode] if video_encode else [], + "season": [filter_season] if filter_season else [] + } + } + + # 提升整季的顺序到顶层 + def se_sort(k): + k = re.sub(r" +|(?<=s\d)\D*?(?=e)|(?<=s\d\d)\D*?(?=e)", + " ", k[0], flags=re.I).split() + return (k[0], k[1]) if len(k) > 1 else ("Z" + k[0], "ZZZ") + + # 开始排序季集顺序 + for title, item in SearchResults.items(): + # 排序筛选器 季 + item["filter"]["season"].sort(reverse=True) + # 排序种子列 集 + item["torrent_dict"] = sorted(item["torrent_dict"].items(), + key=se_sort, + reverse=True) + return {"code": 0, "total": total, "result": SearchResults} + + @staticmethod + def search_media_infos(data): + """ + 根据关键字搜索相似词条 + """ + SearchWord = data.get("keyword") + if not SearchWord: + return [] + SearchSourceType = data.get("searchtype") + medias = WebUtils.search_media_infos(keyword=SearchWord, + source=SearchSourceType) + + return {"code": 0, "result": [media.to_dict() for media in medias]} + + @staticmethod + def get_movie_rss_list(data=None): + """ + 查询所有电影订阅 + """ + return {"code": 0, "result": Subscribe().get_subscribe_movies()} + + @staticmethod + def get_tv_rss_list(data=None): + """ + 查询所有电视剧订阅 + """ + return {"code": 0, "result": Subscribe().get_subscribe_tvs()} + + def get_rss_history(self, data): + """ + 查询所有订阅历史 + """ + mtype = data.get("type") + return {"code": 0, "result": [rec.as_dict() for rec in self.dbhelper.get_rss_history(rtype=mtype)]} + + @staticmethod + def get_downloading(data=None): + """ + 查询正在下载的任务 + """ + torrents = Downloader().get_downloading_progress() + MediaHander = Media() + for torrent in torrents: + # 识别 + name = torrent.get("name") + media_info = MediaHander.get_media_info(title=name) + if not media_info: + torrent.update({ + "title": name, + "image": "" + }) + continue + if not media_info.tmdb_info: + year = media_info.year + if year: + title = "%s (%s) %s" % (media_info.get_name(), + year, media_info.get_season_episode_string()) + else: + title = "%s %s" % (media_info.get_name(), + media_info.get_season_episode_string()) + else: + title = "%s %s" % (media_info.get_title_string( + ), media_info.get_season_episode_string()) + poster_path = media_info.get_poster_image() + torrent.update({ + "title": title, + "image": poster_path or "" + }) + return {"code": 0, "result": torrents} + + def get_transfer_history(self, data): + """ + 查询媒体整理历史记录 + """ + PageNum = data.get("pagenum") + if not PageNum: + PageNum = 30 + SearchStr = data.get("keyword") + CurrentPage = data.get("page") + if not CurrentPage: + CurrentPage = 1 + else: + CurrentPage = int(CurrentPage) + totalCount, historys = self.dbhelper.get_transfer_history( + SearchStr, CurrentPage, PageNum) + historys_list = [] + for history in historys: + history = history.as_dict() + sync_mode = history.get("MODE") + rmt_mode = ModuleConf.get_dictenum_key( + ModuleConf.RMT_MODES, sync_mode) if sync_mode else "" + history.update({ + "SYNC_MODE": sync_mode, + "RMT_MODE": rmt_mode + }) + historys_list.append(history) + TotalPage = floor(totalCount / PageNum) + 1 + + return { + "code": 0, + "total": totalCount, + "result": historys_list, + "totalPage": TotalPage, + "pageNum": PageNum, + "currentPage": CurrentPage + } + + def get_unknown_list(self, data=None): + """ + 查询所有未识别记录 + """ + Items = [] + Records = self.dbhelper.get_transfer_unknown_paths() + for rec in Records: + if not rec.PATH: + continue + path = rec.PATH.replace("\\", "/") if rec.PATH else "" + path_to = rec.DEST.replace("\\", "/") if rec.DEST else "" + sync_mode = rec.MODE or "" + rmt_mode = ModuleConf.get_dictenum_key(ModuleConf.RMT_MODES, + sync_mode) if sync_mode else "" + Items.append({ + "id": rec.ID, + "path": path, + "to": path_to, + "name": path, + "sync_mode": sync_mode, + "rmt_mode": rmt_mode, + }) + + return {"code": 0, "items": Items} + + def unidentification(self): + """ + 重新识别所有未识别记录 + """ + ItemIds = [] + Records = self.dbhelper.get_transfer_unknown_paths() + for rec in Records: + if not rec.PATH: + continue + ItemIds.append(rec.ID) + + if len(ItemIds) > 0: + WebAction.re_identification(self, {"flag": "unidentification", "ids": ItemIds}) + + def get_customwords(self, data=None): + words = [] + words_info = self.dbhelper.get_custom_words(gid=-1) + for word_info in words_info: + words.append({"id": word_info.ID, + "replaced": word_info.REPLACED, + "replace": word_info.REPLACE, + "front": word_info.FRONT, + "back": word_info.BACK, + "offset": word_info.OFFSET, + "type": word_info.TYPE, + "group_id": word_info.GROUP_ID, + "season": word_info.SEASON, + "enabled": word_info.ENABLED, + "regex": word_info.REGEX, + "help": word_info.HELP, }) + groups = [{"id": "-1", + "name": "通用", + "link": "", + "type": "1", + "seasons": "0", + "words": words}] + groups_info = self.dbhelper.get_custom_word_groups() + for group_info in groups_info: + gid = group_info.ID + name = "%s (%s)" % (group_info.TITLE, group_info.YEAR) + gtype = group_info.TYPE + if gtype == 1: + link = "https://www.themoviedb.org/movie/%s" % group_info.TMDBID + else: + link = "https://www.themoviedb.org/tv/%s" % group_info.TMDBID + words = [] + words_info = self.dbhelper.get_custom_words(gid=gid) + for word_info in words_info: + words.append({"id": word_info.ID, + "replaced": word_info.REPLACED, + "replace": word_info.REPLACE, + "front": word_info.FRONT, + "back": word_info.BACK, + "offset": word_info.OFFSET, + "type": word_info.TYPE, + "group_id": word_info.GROUP_ID, + "season": word_info.SEASON, + "enabled": word_info.ENABLED, + "regex": word_info.REGEX, + "help": word_info.HELP, }) + groups.append({"id": gid, + "name": name, + "link": link, + "type": group_info.TYPE, + "seasons": group_info.SEASON_COUNT, + "words": words}) + return { + "code": 0, + "result": groups + } + + def get_directorysync(self, data=None): + """ + 查询所有同步目录 + """ + sync_paths = self.dbhelper.get_config_sync_paths() + SyncPaths = [] + if sync_paths: + for sync_item in sync_paths: + SyncPath = {'id': sync_item.ID, + 'from': sync_item.SOURCE, + 'to': sync_item.DEST or "", + 'unknown': sync_item.UNKNOWN or "", + 'syncmod': sync_item.MODE, + 'syncmod_name': RmtMode[sync_item.MODE.upper()].value, + 'rename': sync_item.RENAME, + 'enabled': sync_item.ENABLED} + SyncPaths.append(SyncPath) + SyncPaths = sorted(SyncPaths, key=lambda o: o.get("from")) + return {"code": 0, "result": SyncPaths} + + def get_users(self, data=None): + """ + 查询所有用户 + """ + user_list = self.dbhelper.get_users() + Users = [] + for user in user_list: + pris = str(user.PRIS).split(",") + Users.append({"id": user.ID, "name": user.NAME, "pris": pris}) + return {"code": 0, "result": Users} + + @staticmethod + def get_filterrules(data=None): + """ + 查询所有过滤规则 + """ + RuleGroups = Filter().get_rule_infos() + sql_file = os.path.join(Config().get_script_path(), "init_filter.sql") + with open(sql_file, "r", encoding="utf-8") as f: + sql_list = f.read().split(';\n') + Init_RuleGroups = [] + i = 0 + while i < len(sql_list): + rulegroup = {} + rulegroup_info = re.findall( + r"[0-9]+,'[^\"]+NULL", sql_list[i], re.I)[0].split(",") + rulegroup['id'] = int(rulegroup_info[0]) + rulegroup['name'] = rulegroup_info[1][1:-1] + rulegroup['rules'] = [] + rulegroup['sql'] = [sql_list[i]] + if i + 1 < len(sql_list): + rules = re.findall( + r"[0-9]+,'[^\"]+NULL", sql_list[i + 1], re.I)[0].split("),\n (") + for rule in rules: + rule_info = {} + rule = rule.split(",") + rule_info['name'] = rule[2][1:-1] + rule_info['include'] = rule[4][1:-1] + rule_info['exclude'] = rule[5][1:-1] + rulegroup['rules'].append(rule_info) + rulegroup["sql"].append(sql_list[i + 1]) + Init_RuleGroups.append(rulegroup) + i = i + 2 + return { + "code": 0, + "ruleGroups": RuleGroups, + "initRules": Init_RuleGroups + } + + def __update_directory(self, data): + """ + 维护媒体库目录 + """ + cfg = self.set_config_directory(Config().get_config(), + data.get("oper"), + data.get("key"), + data.get("value"), + data.get("replace_value")) + # 保存配置 + Config().save_config(cfg) + return {"code": 0} + + @staticmethod + def __test_site(data): + """ + 测试站点连通性 + """ + flag, msg, times = Sites().test_connection(data.get("id")) + code = 0 if flag else -1 + return {"code": code, "msg": msg, "time": times} + + @staticmethod + def __get_sub_path(data): + """ + 查询下级子目录 + """ + r = [] + try: + ft = data.get("filter") or "ALL" + d = data.get("dir") + if not d or d == "/": + if SystemUtils.get_system() == OsType.WINDOWS: + partitions = SystemUtils.get_windows_drives() + if partitions: + dirs = [os.path.join(partition, "/") + for partition in partitions] + else: + dirs = [os.path.join("C:/", f) + for f in os.listdir("C:/")] + else: + dirs = [os.path.join("/", f) for f in os.listdir("/")] + else: + d = os.path.normpath(unquote(d)) + if not os.path.isdir(d): + d = os.path.dirname(d) + dirs = [os.path.join(d, f) for f in os.listdir(d)] + dirs.sort() + for ff in dirs: + if os.path.isdir(ff): + if 'ONLYDIR' in ft or 'ALL' in ft: + r.append({ + "path": ff.replace("\\", "/"), + "name": os.path.basename(ff), + "type": "dir", + "rel": os.path.dirname(ff).replace("\\", "/") + }) + else: + ext = os.path.splitext(ff)[-1][1:] + flag = False + if 'ONLYFILE' in ft or 'ALL' in ft: + flag = True + elif "MEDIAFILE" in ft and f".{str(ext).lower()}" in RMT_MEDIAEXT: + flag = True + elif "SUBFILE" in ft and f".{str(ext).lower()}" in RMT_SUBEXT: + flag = True + if flag: + r.append({ + "path": ff.replace("\\", "/"), + "name": os.path.basename(ff), + "type": "file", + "rel": os.path.dirname(ff).replace("\\", "/"), + "ext": ext, + "size": StringUtils.str_filesize(os.path.getsize(ff)) + }) + + except Exception as e: + ExceptionUtils.exception_traceback(e) + return { + "code": -1, + "message": '加载路径失败: %s' % str(e) + } + return { + "code": 0, + "count": len(r), + "data": r + } + + @staticmethod + def __rename_file(data): + """ + 文件重命名 + """ + path = data.get("path") + name = data.get("name") + if path and name: + try: + shutil.move(path, os.path.join(os.path.dirname(path), name)) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": -1, "msg": str(e)} + return {"code": 0} + + def __delete_files(self, data): + """ + 删除文件 + """ + files = data.get("files") + if files: + # 删除文件 + for file in files: + del_flag, del_msg = self.delete_media_file(filedir=os.path.dirname(file), + filename=os.path.basename(file)) + if not del_flag: + log.error(f"【MediaFile】{del_msg}") + else: + log.info(f"【MediaFile】{del_msg}") + return {"code": 0} + + @staticmethod + def __download_subtitle(data): + """ + 从配置的字幕服务下载单个文件的字幕 + """ + path = data.get("path") + name = data.get("name") + media = Media().get_media_info(title=name) + if not media or not media.tmdb_info: + return {"code": -1, "msg": f"{name} 无法从TMDB查询到媒体信息"} + if not media.imdb_id: + media.set_tmdb_info(Media().get_tmdb_info(mtype=media.type, + tmdbid=media.tmdb_id)) + subtitle_item = [{"type": media.type, + "file": os.path.splitext(path)[0], + "file_ext": os.path.splitext(name)[-1], + "name": media.en_name if media.en_name else media.cn_name, + "title": media.title, + "year": media.year, + "season": media.begin_season, + "episode": media.begin_episode, + "bluray": False, + "imdbid": media.imdb_id}] + success, retmsg = Subtitle().download_subtitle(items=subtitle_item) + if success: + return {"code": 0, "msg": retmsg} + else: + return {"code": -1, "msg": retmsg} + + @staticmethod + def __get_download_setting(data): + sid = data.get("sid") + if sid: + download_setting = Downloader().get_download_setting(sid=sid) + else: + download_setting = list( + Downloader().get_download_setting().values()) + return {"code": 0, "data": download_setting} + + def __update_download_setting(self, data): + sid = data.get("sid") + name = data.get("name") + category = data.get("category") + tags = data.get("tags") + content_layout = data.get("content_layout") + is_paused = data.get("is_paused") + upload_limit = data.get("upload_limit") + download_limit = data.get("download_limit") + ratio_limit = data.get("ratio_limit") + seeding_time_limit = data.get("seeding_time_limit") + downloader = data.get("downloader") + self.dbhelper.update_download_setting(sid=sid, + name=name, + category=category, + tags=tags, + content_layout=content_layout, + is_paused=is_paused, + upload_limit=upload_limit or 0, + download_limit=download_limit or 0, + ratio_limit=ratio_limit or 0, + seeding_time_limit=seeding_time_limit or 0, + downloader=downloader) + Downloader().init_config() + return {"code": 0} + + def __delete_download_setting(self, data): + sid = data.get("sid") + self.dbhelper.delete_download_setting(sid=sid) + Downloader().init_config() + return {"code": 0} + + def __update_message_client(self, data): + """ + 更新消息设置 + """ + name = data.get("name") + cid = data.get("cid") + ctype = data.get("type") + config = data.get("config") + switchs = data.get("switchs") + interactive = data.get("interactive") + enabled = data.get("enabled") + if cid: + self.dbhelper.delete_message_client(cid=cid) + self.dbhelper.insert_message_client(name=name, + ctype=ctype, + config=config, + switchs=switchs, + interactive=interactive, + enabled=enabled) + Message().init_config() + return {"code": 0} + + def __delete_message_client(self, data): + """ + 删除消息设置 + """ + if self.dbhelper.delete_message_client(cid=data.get("cid")): + Message().init_config() + return {"code": 0} + else: + return {"code": 1} + + def __check_message_client(self, data): + """ + 维护消息设置 + """ + flag = data.get("flag") + cid = data.get("cid") + ctype = data.get("type") + checked = data.get("checked") + if flag == "interactive": + # TG/WX只能开启一个交互 + if checked: + self.dbhelper.check_message_client(interactive=0, ctype=ctype) + self.dbhelper.check_message_client(cid=cid, + interactive=1 if checked else 0) + Message().init_config() + return {"code": 0} + elif flag == "enable": + self.dbhelper.check_message_client(cid=cid, + enabled=1 if checked else 0) + Message().init_config() + return {"code": 0} + else: + return {"code": 1} + + @staticmethod + def __get_message_client(data): + """ + 获取消息设置 + """ + cid = data.get("cid") + return {"code": 0, "detail": Message().get_message_client_info(cid=cid)} + + @staticmethod + def __test_message_client(data): + """ + 测试消息设置 + """ + ctype = data.get("type") + config = json.loads(data.get("config")) + res = Message().get_status(ctype=ctype, config=config) + if res: + return {"code": 0} + else: + return {"code": 1} + + @staticmethod + def __get_indexers(data=None): + """ + 获取索引器 + """ + return {"code": 0, "indexers": Indexer().get_indexer_dict()} + + @staticmethod + def __get_download_dirs(data): + """ + 获取下载目录 + """ + sid = data.get("sid") + site = data.get("site") + if not sid and site: + sid = Sites().get_site_download_setting(site_name=site) + dirs = Downloader().get_download_dirs(setting=sid) + return {"code": 0, "paths": dirs} + + @staticmethod + def __find_hardlinks(data): + files = data.get("files") + file_dir = data.get("dir") + if not files: + return [] + if not file_dir and os.name != "nt": + # 取根目录下一级为查找目录 + file_dir = os.path.commonpath(files).replace("\\", "/") + if file_dir != "/": + file_dir = "/" + str(file_dir).split("/")[1] + else: + return [] + hardlinks = {} + if files: + try: + for file in files: + hardlinks[os.path.basename(file)] = SystemUtils( + ).find_hardlinks(file=file, fdir=file_dir) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1} + return {"code": 0, "data": hardlinks} + + @staticmethod + def __update_sites_cookie_ua(data): + """ + 更新所有站点的Cookie和UA + """ + siteid = data.get("siteid") + username = data.get("username") + password = data.get("password") + twostepcode = data.get("two_step_code") + ocrflag = data.get("ocrflag") + # 保存设置 + SystemConfig().set_system_config(key="CookieUserInfo", + value={ + "username": username, + "password": password, + "two_step_code": twostepcode + }) + retcode, messages = SiteCookie().update_sites_cookie_ua(siteid=siteid, + username=username, + password=password, + twostepcode=twostepcode, + ocrflag=ocrflag) + if retcode == 0: + Sites().init_config() + return {"code": retcode, "messages": messages} + + @staticmethod + def __set_site_captcha_code(data): + """ + 设置站点验证码 + """ + code = data.get("code") + value = data.get("value") + SiteCookie().set_code(code=code, value=value) + return {"code": 0} + + @staticmethod + def __update_torrent_remove_task(data): + """ + 更新自动删种任务 + """ + flag, msg = TorrentRemover().update_torrent_remove_task(data=data) + if not flag: + return {"code": 1, "msg": msg} + else: + TorrentRemover().init_config() + return {"code": 0} + + @staticmethod + def __get_torrent_remove_task(data=None): + """ + 获取自动删种任务 + """ + if data: + tid = data.get("tid") + else: + tid = None + return {"code": 0, "detail": TorrentRemover().get_torrent_remove_tasks(taskid=tid)} + + @staticmethod + def __delete_torrent_remove_task(data): + """ + 删除自动删种任务 + """ + tid = data.get("tid") + flag = TorrentRemover().delete_torrent_remove_task(taskid=tid) + if flag: + TorrentRemover().init_config() + return {"code": 0} + else: + return {"code": 1} + + @staticmethod + def __get_remove_torrents(data): + """ + 获取满足自动删种任务的种子 + """ + tid = data.get("tid") + flag, torrents = TorrentRemover().get_remove_torrents(taskid=tid) + if not flag or not torrents: + return {"code": 1, "msg": "未获取到符合处理条件种子"} + return {"code": 0, "data": torrents} + + @staticmethod + def __auto_remove_torrents(data): + """ + 执行自动删种任务 + """ + tid = data.get("tid") + TorrentRemover().auto_remove_torrents(taskids=tid) + return {"code": 0} + + @staticmethod + def __get_site_favicon(data): + """ + 获取站点图标 + """ + sitename = data.get("name") + return {"code": 0, "icon": Sites().get_site_favicon(site_name=sitename)} + + def get_douban_history(self, data=None): + """ + 查询豆瓣同步历史 + """ + results = self.dbhelper.get_douban_history() + return {"code": 0, "result": [item.as_dict() for item in results]} + + def __delete_douban_history(self, data): + """ + 删除豆瓣同步历史 + """ + self.dbhelper.delete_douban_history(data.get("id")) + return {"code": 0} + + def __list_brushtask_torrents(self, data): + """ + 获取刷流任务的种子明细 + """ + results = self.dbhelper.get_brushtask_torrents(brush_id=data.get("id"), + active=False) + if not results: + return {"code": 1, "msg": "未下载种子或未获取到种子明细"} + return {"code": 0, "data": [item.as_dict() for item in results]} + + @staticmethod + def __set_system_config(data): + """ + 设置系统设置(数据库) + """ + key = data.get("key") + value = data.get("value") + if not key or not value: + return {"code": 1} + try: + SystemConfig().set_system_config(key=key, value=value) + if key == "SpeedLimit": + SpeedLimiter().init_config() + return {"code": 0} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1} + + @staticmethod + def get_site_user_statistics(data): + """ + 获取站点用户统计信息 + """ + sites = data.get("sites") + encoding = data.get("encoding") or "RAW" + sort_by = data.get("sort_by") + sort_on = data.get("sort_on") + site_hash = data.get("site_hash") + statistics = SiteUserInfo().get_site_user_statistics(sites=sites, encoding=encoding) + if sort_by and sort_on in ["asc", "desc"]: + if sort_on == "asc": + statistics.sort(key=lambda x: x[sort_by]) + else: + statistics.sort(key=lambda x: x[sort_by], reverse=True) + if site_hash == "Y": + for item in statistics: + item["site_hash"] = StringUtils.md5_hash(item.get("site")) + return {"code": 0, "data": statistics} + + @staticmethod + def send_custom_message(data): + """ + 发送自定义消息 + """ + title = data.get("title") + text = data.get("text") or "" + image = data.get("image") or "" + Message().send_custom_message(title=title, text=text, image=image) + return {"code": 0} + + @staticmethod + def get_rmt_modes(): + RmtModes = ModuleConf.RMT_MODES_LITE if SystemUtils.is_lite_version( + ) else ModuleConf.RMT_MODES + return [{ + "value": value, + "name": name.value + } for value, name in RmtModes.items()] + + def __cookiecloud_sync(self, data): + """ + CookieCloud数据同步 + """ + server = data.get("server") + key = data.get("key") + password = data.get("password") + # 保存设置 + SystemConfig().set_system_config(key="CookieCloud", + value={ + "server": server, + "key": key, + "password": password + }) + # 同步数据 + contents, retmsg = CookieCloudHelper(server=server, + key=key, + password=password).download_data() + if not contents: + return {"code": 1, "msg": retmsg} + success_count = 0 + for domain, content_list in contents.items(): + if domain.startswith('.'): + domain = domain[1:] + cookie_str = "" + for content in content_list: + cookie_str += content.get("name") + \ + "=" + content.get("value") + ";" + if not cookie_str: + continue + site_info = Sites().get_sites(siteurl=domain) + if not site_info: + continue + self.dbhelper.update_site_cookie_ua(tid=site_info.get("id"), + cookie=cookie_str) + success_count += 1 + if success_count: + # 重载站点信息 + Sites().init_config() + return {"code": 0, "msg": f"成功更新 {success_count} 个站点的Cookie数据"} + return {"code": 0, "msg": "同步完成,但未更新任何站点的Cookie!"} + + @staticmethod + def media_detail(data): + """ + 获取媒体详情 + """ + # TMDBID 或 DB:豆瓣ID + tmdbid = data.get("tmdbid") + mtype = MediaType.MOVIE if data.get( + "type") in MovieTypes else MediaType.TV + if not tmdbid: + return {"code": 1, "msg": "未指定媒体ID"} + media_info = WebUtils.get_mediainfo_from_id( + mtype=mtype, mediaid=tmdbid) + # 检查TMDB信息 + if not media_info or not media_info.tmdb_info: + return { + "code": 1, + "msg": "无法查询到TMDB信息" + } + # 查询存在及订阅状态 + fav, rssid = FileTransfer().get_media_exists_flag(mtype=mtype, + title=media_info.title, + year=media_info.year, + mediaid=media_info.tmdb_id) + MediaHander = Media() + return { + "code": 0, + "data": { + "tmdbid": media_info.tmdb_id, + "douban_id": media_info.douban_id, + "background": MediaHander.get_tmdb_backdrops(tmdbinfo=media_info.tmdb_info), + "image": media_info.get_poster_image(), + "vote": media_info.vote_average, + "year": media_info.year, + "title": media_info.title, + "genres": MediaHander.get_tmdb_genres_names(tmdbinfo=media_info.tmdb_info), + "overview": media_info.overview, + "runtime": StringUtils.str_timehours(media_info.runtime), + "fact": MediaHander.get_tmdb_factinfo(media_info), + "crews": MediaHander.get_tmdb_crews(tmdbinfo=media_info.tmdb_info, nums=6), + "actors": MediaHander.get_tmdb_cats(mtype=mtype, tmdbid=media_info.tmdb_id), + "link": media_info.get_detail_url(), + "douban_link": media_info.get_douban_detail_url(), + "fav": fav, + "rssid": rssid + } + } + + @staticmethod + def __media_similar(data): + """ + 查询TMDB相似媒体 + """ + tmdbid = data.get("tmdbid") + page = data.get("page") or 1 + mtype = MediaType.MOVIE if data.get( + "type") in MovieTypes else MediaType.TV + if not tmdbid: + return {"code": 1, "msg": "未指定TMDBID"} + if mtype == MediaType.MOVIE: + result = Media().get_movie_similar(tmdbid=tmdbid, page=page) + else: + result = Media().get_tv_similar(tmdbid=tmdbid, page=page) + return {"code": 0, "data": result} + + @staticmethod + def __media_recommendations(data): + """ + 查询TMDB同类推荐媒体 + """ + tmdbid = data.get("tmdbid") + page = data.get("page") or 1 + mtype = MediaType.MOVIE if data.get( + "type") in MovieTypes else MediaType.TV + if not tmdbid: + return {"code": 1, "msg": "未指定TMDBID"} + if mtype == MediaType.MOVIE: + result = Media().get_movie_recommendations(tmdbid=tmdbid, page=page) + else: + result = Media().get_tv_recommendations(tmdbid=tmdbid, page=page) + return {"code": 0, "data": result} + + @staticmethod + def __media_person(data): + """ + 查询TMDB媒体所有演员 + """ + tmdbid = data.get("tmdbid") + mtype = MediaType.MOVIE if data.get( + "type") in MovieTypes else MediaType.TV + if not tmdbid: + return {"code": 1, "msg": "未指定TMDBID"} + return {"code": 0, "data": Media().get_tmdb_cats(tmdbid=tmdbid, + mtype=mtype)} + + @staticmethod + def __person_medias(data): + """ + 查询演员参演作品 + """ + personid = data.get("personid") + page = data.get("page") or 1 + mtype = MediaType.MOVIE if data.get( + "type") in MovieTypes else MediaType.TV + if not personid: + return {"code": 1, "msg": "未指定演员ID"} + return {"code": 0, "data": Media().get_person_medias(personid=personid, + mtype=mtype, + page=page)} + + @staticmethod + def __save_user_script(data): + """ + 保存用户自定义脚本 + """ + script = data.get("javascript") or "" + css = data.get("css") or "" + SystemConfig().set_system_config(key="CustomScript", + value={ + "css": css, + "javascript": script + }) + return {"code": 0, "msg": "保存成功"} + + @staticmethod + def __run_directory_sync(data): + """ + 执行单个目录的目录同步 + """ + Sync().transfer_all_sync(sid=data.get("sid")) + return {"code": 0, "msg": "执行成功"} diff --git a/web/apiv1.py b/web/apiv1.py new file mode 100644 index 0000000..7f457d4 --- /dev/null +++ b/web/apiv1.py @@ -0,0 +1,2278 @@ +from flask import Blueprint, request +from flask_restx import Api, reqparse, Resource + +from app.brushtask import BrushTask +from app.rsschecker import RssChecker +from app.sites import Sites +from app.utils import TokenCache +from config import Config +from web.action import WebAction +from web.backend.user import User +from web.security import require_auth, login_required, generate_access_token + +apiv1_bp = Blueprint("apiv1", + __name__, + static_url_path='', + static_folder='./frontend/static/', + template_folder='./frontend/', ) +Apiv1 = Api(apiv1_bp, + version="1.0", + title="NAStool Api", + description="POST接口调用 /user/login 获取Token,GET接口使用 基础设置->安全->Api Key 调用", + doc="/", + security='Bearer Auth', + authorizations={"Bearer Auth": {"type": "apiKey", "name": "Authorization", "in": "header"}}, + ) +# API分组 +user = Apiv1.namespace('user', description='用户') +system = Apiv1.namespace('system', description='系统') +config = Apiv1.namespace('config', description='设置') +site = Apiv1.namespace('site', description='站点') +service = Apiv1.namespace('service', description='服务') +subscribe = Apiv1.namespace('subscribe', description='订阅') +rss = Apiv1.namespace('rss', description='自定义RSS') +recommend = Apiv1.namespace('recommend', description='推荐') +search = Apiv1.namespace('search', description='搜索') +download = Apiv1.namespace('download', description='下载') +organization = Apiv1.namespace('organization', description='整理') +torrentremover = Apiv1.namespace('torrentremover', description='自动删种') +library = Apiv1.namespace('library', description='媒体库') +brushtask = Apiv1.namespace('brushtask', description='刷流') +media = Apiv1.namespace('media', description='媒体') +sync = Apiv1.namespace('sync', description='目录同步') +filterrule = Apiv1.namespace('filterrule', description='过滤规则') +words = Apiv1.namespace('words', description='识别词') +message = Apiv1.namespace('message', description='消息通知') +douban = Apiv1.namespace('douban', description='豆瓣') + + +class ApiResource(Resource): + """ + API 认证 + """ + method_decorators = [require_auth] + + +class ClientResource(Resource): + """ + 登录认证 + """ + method_decorators = [login_required] + + +def Failed(): + """ + 返回失败报名 + """ + return { + "code": -1, + "success": False, + "data": {} + } + + +@user.route('/login') +class UserLogin(Resource): + parser = reqparse.RequestParser() + parser.add_argument('username', type=str, help='用户名', location='form', required=True) + parser.add_argument('password', type=str, help='密码', location='form', required=True) + + @user.doc(parser=parser) + def post(self): + """ + 用户登录 + """ + args = self.parser.parse_args() + username = args.get('username') + password = args.get('password') + if not username or not password: + return {"code": 1, "success": False, "message": "用户名或密码错误"} + user_info = User().get_user(username) + if not user_info: + return {"code": 1, "success": False, "message": "用户名或密码错误"} + # 校验密码 + if not user_info.verify_password(password): + return {"code": 1, "success": False, "message": "用户名或密码错误"} + # 缓存Token + token = generate_access_token(username) + TokenCache.set(token, token) + return { + "code": 0, + "success": True, + "data": { + "token": token, + "apikey": Config().get_config("security").get("api_key"), + "userinfo": { + "userid": user_info.id, + "username": user_info.username, + "userpris": str(user_info.pris).split(",") + } + } + } + + +@user.route('/info') +class UserInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('username', type=str, help='用户名', location='form', required=True) + + @user.doc(parser=parser) + def post(self): + """ + 获取用户信息 + """ + args = self.parser.parse_args() + username = args.get('username') + user_info = User().get_user(username) + if not user_info: + return {"code": 1, "success": False, "message": "用户名不正确"} + return { + "code": 0, + "success": True, + "data": { + "userid": user_info.id, + "username": user_info.username, + "userpris": str(user_info.pris).split(",") + } + } + + +@user.route('/manage') +class UserManage(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('oper', type=str, help='操作类型(add 新增/del删除)', location='form', required=True) + parser.add_argument('name', type=str, help='用户名', location='form', required=True) + parser.add_argument('pris', type=str, help='权限', location='form') + + @user.doc(parser=parser) + def post(self): + """ + 用户管理 + """ + return WebAction().api_action(cmd='user_manager', data=self.parser.parse_args()) + + +@user.route('/list') +class UserList(ClientResource): + @staticmethod + def post(): + """ + 查询所有用户 + """ + return WebAction().api_action(cmd='get_users') + + +@service.route('/mediainfo') +class ServiceMediaInfo(ApiResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='名称', location='args', required=True) + + @service.doc(parser=parser) + def get(self): + """ + 识别媒体信息(密钥认证) + """ + return WebAction().api_action(cmd='name_test', data=self.parser.parse_args()) + + +@service.route('/name/test') +class ServiceNameTest(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='名称', location='form', required=True) + + @service.doc(parser=parser) + def post(self): + """ + 名称识别测试 + """ + return WebAction().api_action(cmd='name_test', data=self.parser.parse_args()) + + +@service.route('/rule/test') +class ServiceRuleTest(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('title', type=str, help='名称', location='form', required=True) + parser.add_argument('subtitle', type=str, help='描述', location='form') + parser.add_argument('size', type=float, help='大小(GB)', location='form') + + @service.doc(parser=parser) + def post(self): + """ + 过滤规则测试 + """ + return WebAction().api_action(cmd='rule_test', data=self.parser.parse_args()) + + +@service.route('/network/test') +class ServiceNetworkTest(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('url', type=str, help='URL地址', location='form', required=True) + + @service.doc(parser=parser) + def post(self): + """ + 网络连接性测试 + """ + return WebAction().api_action(cmd='net_test', data=self.parser.parse_args().get("url")) + + +@service.route('/run') +class ServiceRun(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('item', type=str, + help='服务名称(autoremovetorrents、pttransfer、ptsignin、sync、rssdownload、douban、subscribe_search_all)', + location='form', + required=True) + + @service.doc(parser=parser) + def post(self): + """ + 运行服务 + """ + return WebAction().api_action(cmd='sch', data=self.parser.parse_args()) + + +@site.route('/statistics') +class SiteStatistic(ApiResource): + @staticmethod + def get(): + """ + 获取站点数据明细(密钥认证) + """ + # 返回站点信息 + return { + "code": 0, + "success": True, + "data": { + "user_statistics": WebAction().get_site_user_statistics({"encoding": "DICT"}).get("data") + } + } + + +@site.route('/sites') +class SiteSites(ApiResource): + @staticmethod + def get(): + """ + 获取所有站点配置(密钥认证) + """ + return { + "code": 0, + "success": True, + "data": { + "user_sites": Sites().get_sites() + } + } + + +@site.route('/update') +class SiteUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('site_name', type=str, help='站点名称', location='form', required=True) + parser.add_argument('site_id', type=int, help='更新站点ID', location='form') + parser.add_argument('site_pri', type=str, help='优先级', location='form') + parser.add_argument('site_rssurl', type=str, help='RSS地址', location='form') + parser.add_argument('site_signurl', type=str, help='站点地址', location='form') + parser.add_argument('site_cookie', type=str, help='Cookie', location='form') + parser.add_argument('site_note', type=str, help='站点属性', location='form') + parser.add_argument('site_include', type=str, help='站点用途', location='form') + + @site.doc(parser=parser) + def post(self): + """ + 新增/删除站点 + """ + return WebAction().api_action(cmd='update_site', data=self.parser.parse_args()) + + +@site.route('/info') +class SiteInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='站点ID', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 查询单个站点详情 + """ + return WebAction().api_action(cmd='get_site', data=self.parser.parse_args()) + + +@site.route('/favicon') +class SiteFavicon(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='站点名称', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 获取站点图标(Base64) + """ + return WebAction().api_action(cmd='get_site_favicon', data=self.parser.parse_args()) + + +@site.route('/test') +class SiteTest(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='站点ID', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 测试站点连通性 + """ + return WebAction().api_action(cmd='test_site', data=self.parser.parse_args()) + + +@site.route('/delete') +class SiteDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='站点ID', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 删除站点 + """ + return WebAction().api_action(cmd='del_site', data=self.parser.parse_args()) + + +@site.route('/statistics/activity') +class SiteStatisticsActivity(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='站点名称', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 查询站点 上传/下载/做种数据 + """ + return WebAction().api_action(cmd='get_site_activity', data=self.parser.parse_args()) + + +@site.route('/check') +class SiteCheck(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('url', type=str, help='站点地址', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 检查站点是否支持FREE/HR检测 + """ + return WebAction().api_action(cmd='check_site_attr', data=self.parser.parse_args()) + + +@site.route('/statistics/history') +class SiteStatisticsHistory(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('days', type=int, help='时间范围(天)', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 查询所有站点历史数据 + """ + return WebAction().api_action(cmd='get_site_history', data=self.parser.parse_args()) + + +@site.route('/statistics/seedinfo') +class SiteStatisticsSeedinfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='站点名称', location='form', required=True) + + @site.doc(parser=parser) + def post(self): + """ + 查询站点做种分布 + """ + return WebAction().api_action(cmd='get_site_seeding_info', data=self.parser.parse_args()) + + +@site.route('/resources') +class SiteResources(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='站点索引ID', location='form', required=True) + parser.add_argument('page', type=int, help='页码', location='form') + parser.add_argument('keyword', type=str, help='站点名称', location='form') + + @site.doc(parser=parser) + def post(self): + """ + 查询站点资源列表 + """ + return WebAction().api_action(cmd='list_site_resources', data=self.parser.parse_args()) + + +@site.route('/list') +class SiteList(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('basic', type=int, help='只查询基本信息(0-否/1-是)', location='form') + parser.add_argument('rss', type=int, help='订阅(0-否/1-是)', location='form') + parser.add_argument('brush', type=int, help='刷流(0-否/1-是)', location='form') + parser.add_argument('signin', type=int, help='签到(0-否/1-是)', location='form') + parser.add_argument('statistic', type=int, help='数据统计(0-否/1-是)', location='form') + + def post(self): + """ + 查询站点列表 + """ + return WebAction().api_action(cmd='get_sites', data=self.parser.parse_args()) + + +@site.route('/indexers') +class SiteIndexers(ClientResource): + + @staticmethod + def post(): + """ + 查询站点索引列表 + """ + return WebAction().api_action(cmd='get_indexers') + + +@search.route('/keyword') +class SearchKeyword(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('search_word', type=str, help='搜索关键字', location='form', required=True) + parser.add_argument('unident', type=int, help='快速模式(0-否/1-是)', location='form') + parser.add_argument('filters', type=str, help='过滤条件', location='form') + parser.add_argument('tmdbid', type=str, help='TMDBID', location='form') + parser.add_argument('media_type', type=str, help='类型(电影/电视剧)', location='form') + + @search.doc(parser=parser) + def post(self): + """ + 根据关键字/TMDBID搜索 + """ + return WebAction().api_action(cmd='search', data=self.parser.parse_args()) + + +@search.route('/result') +class SearchResult(ClientResource): + @staticmethod + def post(): + """ + 查询搜索结果 + """ + return WebAction().api_action(cmd='get_search_result') + + +@download.route('/search') +class DownloadSearch(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='搜索结果ID', location='form', required=True) + parser.add_argument('dir', type=str, help='保存目录', location='form') + parser.add_argument('setting', type=str, help='下载设置', location='form') + + @download.doc(parser=parser) + def post(self): + """ + 下载搜索结果 + """ + return WebAction().api_action(cmd='download', data=self.parser.parse_args()) + + +@download.route('/item') +class DownloadItem(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('enclosure', type=str, help='链接URL', location='form', required=True) + parser.add_argument('title', type=str, help='标题', location='form', required=True) + parser.add_argument('site', type=str, help='站点名称', location='form') + parser.add_argument('description', type=str, help='描述', location='form') + parser.add_argument('page_url', type=str, help='详情页面URL', location='form') + parser.add_argument('size', type=str, help='大小', location='form') + parser.add_argument('seeders', type=str, help='做种数', location='form') + parser.add_argument('uploadvolumefactor', type=float, help='上传因子', location='form') + parser.add_argument('downloadvolumefactor', type=float, help='下载因子', location='form') + parser.add_argument('dl_dir', type=str, help='保存目录', location='form') + + @download.doc(parser=parser) + def post(self): + """ + 下载链接 + """ + return WebAction().api_action(cmd='download_link', data=self.parser.parse_args()) + + +@download.route('/start') +class DownloadStart(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='任务ID', location='form', required=True) + + @download.doc(parser=parser) + def post(self): + """ + 开始下载任务 + """ + return WebAction().api_action(cmd='pt_start', data=self.parser.parse_args()) + + +@download.route('/stop') +class DownloadStop(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='任务ID', location='form', required=True) + + @download.doc(parser=parser) + def post(self): + """ + 暂停下载任务 + """ + return WebAction().api_action(cmd='pt_stop', data=self.parser.parse_args()) + + +@download.route('/info') +class DownloadInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('ids', type=str, help='任务IDS', location='form', required=True) + + @download.doc(parser=parser) + def post(self): + """ + 查询下载进度 + """ + return WebAction().api_action(cmd='pt_info', data=self.parser.parse_args()) + + +@download.route('/remove') +class DownloadRemove(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='任务ID', location='form', required=True) + + @download.doc(parser=parser) + def post(self): + """ + 删除下载任务 + """ + return WebAction().api_action(cmd='pt_remove', data=self.parser.parse_args()) + + +@download.route('/history') +class DownloadHistory(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('page', type=str, help='第几页', location='form', required=True) + + @download.doc(parser=parser) + def post(self): + """ + 查询下载历史 + """ + return WebAction().api_action(cmd='get_downloaded', data=self.parser.parse_args()) + + +@download.route('/now') +class DownloadNow(ClientResource): + @staticmethod + def post(): + """ + 查询正在下载的任务 + """ + return WebAction().api_action(cmd='get_downloading') + + +@download.route('/config/info') +class DownloadConfigInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=str, help='下载设置ID', location='form', required=True) + + @download.doc(parser=parser) + def post(self): + """ + 查询下载设置 + """ + return WebAction().api_action(cmd='get_download_setting', data=self.parser.parse_args()) + + +@download.route('/config/update') +class DownloadConfigUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=str, help='下载设置ID', location='form', required=True) + parser.add_argument('name', type=str, help='名称', location='form', required=True) + parser.add_argument('category', type=str, help='分类', location='form') + parser.add_argument('tags', type=str, help='标签', location='form') + parser.add_argument('content_layout', type=int, help='布局(0-全局/1-原始/2-创建子文件夹/3-不建子文件夹)', + location='form') + parser.add_argument('is_paused', type=int, help='动作(0-添加后开始/1-添加后暂停)', location='form') + parser.add_argument('upload_limit', type=int, help='上传速度限制', location='form') + parser.add_argument('download_limit', type=int, help='下载速度限制', location='form') + parser.add_argument('ratio_limit', type=int, help='分享率限制', location='form') + parser.add_argument('seeding_time_limit', type=int, help='做种时间限制', location='form') + parser.add_argument('downloader', type=str, help='下载器(Qbittorrent/Transmission)', location='form') + + @download.doc(parser=parser) + def post(self): + """ + 新增/修改下载设置 + """ + return WebAction().api_action(cmd='update_download_setting', data=self.parser.parse_args()) + + +@download.route('/config/delete') +class DownloadConfigDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=str, help='下载设置ID', location='form', required=True) + + @download.doc(parser=parser) + def post(self): + """ + 删除下载设置 + """ + return WebAction().api_action(cmd='delete_download_setting', data=self.parser.parse_args()) + + +@download.route('/config/list') +class DownloadConfigList(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=str, help='ID', location='form') + + def post(self): + """ + 查询下载设置 + """ + return WebAction().api_action(cmd="get_download_setting", data=self.parser.parse_args()) + + +@download.route('/config/directory') +class DownloadConfigDirectory(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=str, help='下载设置ID', location='form') + + def post(self): + """ + 查询下载保存目录 + """ + return WebAction().api_action(cmd="get_download_dirs", data=self.parser.parse_args()) + + +@organization.route('/unknown/delete') +class UnknownDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='未识别记录ID', location='form', required=True) + + @organization.doc(parser=parser) + def post(self): + """ + 删除未识别记录 + """ + return WebAction().api_action(cmd='del_unknown_path', data=self.parser.parse_args()) + + +@organization.route('/unknown/rename') +class UnknownRename(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('logid', type=str, help='转移历史记录ID', location='form') + parser.add_argument('unknown_id', type=str, help='未识别记录ID', location='form') + parser.add_argument('syncmod', type=str, help='转移模式', location='form', required=True) + parser.add_argument('tmdb', type=int, help='TMDB ID', location='form') + parser.add_argument('title', type=str, help='标题', location='form') + parser.add_argument('year', type=str, help='年份', location='form') + parser.add_argument('type', type=str, help='类型(MOV/TV/ANIME)', location='form') + parser.add_argument('season', type=int, help='季号', location='form') + parser.add_argument('episode_format', type=str, help='集数定位', location='form') + parser.add_argument('min_filesize', type=int, help='最小文件大小', location='form') + + @organization.doc(parser=parser) + def post(self): + """ + 手动识别 + """ + return WebAction().api_action(cmd='rename', data=self.parser.parse_args()) + + +@organization.route('/unknown/renameudf') +class UnknownRenameUDF(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('inpath', type=str, help='源目录', location='form', required=True) + parser.add_argument('outpath', type=str, help='目的目录', location='form', required=True) + parser.add_argument('syncmod', type=str, help='转移模式', location='form', required=True) + parser.add_argument('tmdb', type=int, help='TMDB ID', location='form') + parser.add_argument('title', type=str, help='标题', location='form') + parser.add_argument('year', type=str, help='年份', location='form') + parser.add_argument('type', type=str, help='类型(MOV/TV/ANIME)', location='form') + parser.add_argument('season', type=int, help='季号', location='form') + parser.add_argument('episode_format', type=str, help='集数定位', location='form') + parser.add_argument('episode_details', type=str, help='集数范围', location='form') + parser.add_argument('episode_offset', type=str, help='集数偏移', location='form') + parser.add_argument('min_filesize', type=int, help='最小文件大小', location='form') + + @organization.doc(parser=parser) + def post(self): + """ + 自定义识别 + """ + return WebAction().api_action(cmd='rename_udf', data=self.parser.parse_args()) + + +@organization.route('/unknown/redo') +class UnknownRedo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('flag', type=str, help='类型(unknow/history)', location='form', required=True) + parser.add_argument('ids', type=list, help='记录ID', location='form', required=True) + + @organization.doc(parser=parser) + def post(self): + """ + 重新识别 + """ + return WebAction().api_action(cmd='re_identification', data=self.parser.parse_args()) + + +@organization.route('/history/delete') +class TransferHistoryDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('logids', type=list, help='记录IDS', location='form', required=True) + + @organization.doc(parser=parser) + def post(self): + """ + 删除媒体整理历史记录 + """ + return WebAction().api_action(cmd='delete_history', data=self.parser.parse_args()) + + +@organization.route('/unknown/list') +class TransferUnknownList(ClientResource): + @staticmethod + def post(): + """ + 查询所有未识别记录 + """ + return WebAction().api_action(cmd='get_unknown_list') + + +@organization.route('/history/list') +class TransferHistoryList(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('page', type=int, help='页码', location='form', required=True) + parser.add_argument('pagenum', type=int, help='每页条数', location='form', required=True) + parser.add_argument('keyword', type=str, help='过滤关键字', location='form') + + @organization.doc(parser=parser) + def post(self): + """ + 查询媒体整理历史记录 + """ + return WebAction().api_action(cmd='get_transfer_history', data=self.parser.parse_args()) + + +@organization.route('/history/statistics') +class HistoryStatistics(ClientResource): + + @staticmethod + def post(): + """ + 查询转移历史统计数据 + """ + return WebAction().api_action(cmd='get_transfer_statistics') + + +@organization.route('/cache/empty') +class TransferCacheEmpty(ClientResource): + + @staticmethod + def post(): + """ + 清空文件转移缓存 + """ + return WebAction().api_action(cmd='truncate_blacklist') + + +@library.route('/sync/start') +class LibrarySyncStart(ClientResource): + + @staticmethod + def post(): + """ + 开始媒体库同步 + """ + return WebAction().api_action(cmd='start_mediasync') + + +@library.route('/sync/status') +class LibrarySyncStatus(ClientResource): + + @staticmethod + def post(): + """ + 查询媒体库同步状态 + """ + return WebAction().api_action(cmd='mediasync_state') + + +@library.route('/mediaserver/playhistory') +class LibraryPlayHistory(ClientResource): + + @staticmethod + def post(): + """ + 查询媒体库播放历史 + """ + return WebAction().api_action(cmd='get_library_playhistory') + + +@library.route('/mediaserver/statistics') +class LibraryStatistics(ClientResource): + + @staticmethod + def post(): + """ + 查询媒体库统计数据 + """ + return WebAction().api_action(cmd="get_library_mediacount") + + +@library.route('/space') +class LibrarySpace(ClientResource): + + @staticmethod + def post(): + """ + 查询媒体库存储空间 + """ + return WebAction().api_action(cmd='get_library_spacesize') + + +@system.route('/logging') +class SystemLogging(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('refresh_new', type=int, help='是否刷新增量日志(0-否/1-是)', location='form', required=True) + + @system.doc(parser=parser) + def post(self): + """ + 获取实时日志 + """ + return WebAction().api_action(cmd='logging', data=self.parser.parse_args()) + + +@system.route('/version') +class SystemVersion(ClientResource): + + @staticmethod + def post(): + """ + 查询最新版本号 + """ + return WebAction().api_action(cmd='version') + + +@system.route('/path') +class SystemPath(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('dir', type=str, help='路径', location='form', required=True) + parser.add_argument('filter', type=str, help='过滤器(ONLYFILE/ONLYDIR/MEDIAFILE/SUBFILE/ALL)', location='form', + required=True) + + @system.doc(parser=parser) + def post(self): + """ + 查询目录的子目录/文件 + """ + return WebAction().api_action(cmd='get_sub_path', data=self.parser.parse_args()) + + +@system.route('/restart') +class SystemRestart(ClientResource): + + @staticmethod + def post(): + """ + 重启 + """ + return WebAction().api_action(cmd='restart') + + +@system.route('/update') +class SystemUpdate(ClientResource): + + @staticmethod + def post(): + """ + 升级 + """ + return WebAction().api_action(cmd='update_system') + + +@system.route('/logout') +class SystemUpdate(ClientResource): + + @staticmethod + def post(): + """ + 注销 + """ + token = request.headers.get("Authorization", default=None) + if token: + TokenCache.delete(token) + return { + "code": 0, + "success": True + } + + +@system.route('/message') +class SystemMessage(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('lst_time', type=str, help='时间(YYYY-MM-DD HH24:MI:SS)', location='form') + + @system.doc(parser=parser) + def post(self): + """ + 查询消息中心消息 + """ + return WebAction().get_system_message(lst_time=self.parser.parse_args().get("lst_time")) + + +@system.route('/progress') +class SystemProgress(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(search/mediasync)', location='form', required=True) + + @system.doc(parser=parser) + def post(self): + """ + 查询搜索/媒体同步等进度 + """ + return WebAction().api_action(cmd='refresh_process', data=self.parser.parse_args()) + + +@config.route('/update') +class ConfigUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('items', type=dict, help='配置项', location='form', required=True) + + @config.doc(parser=parser) + def post(self): + """ + 新增/修改配置 + """ + return WebAction().api_action(cmd='update_config', data=self.parser.parse_args().get("items")) + + +@config.route('/test') +class ConfigTest(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('command', type=str, help='测试命令', location='form', required=True) + + @config.doc(parser=parser) + def post(self): + """ + 测试配置连通性 + """ + return WebAction().api_action(cmd='test_connection', data=self.parser.parse_args()) + + +@config.route('/restore') +class ConfigRestore(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('file_name', type=str, help='备份文件名', location='form', required=True) + + @config.doc(parser=parser) + def post(self): + """ + 恢复备份的配置 + """ + return WebAction().api_action(cmd='restory_backup', data=self.parser.parse_args()) + + +@config.route('/info') +class ConfigInfo(ClientResource): + @staticmethod + def post(): + """ + 获取所有配置信息 + """ + return { + "code": 0, + "success": True, + "data": Config().get_config() + } + + +@config.route('/directory') +class ConfigDirectory(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('oper', type=str, help='操作类型(add/sub/set)', location='form', required=True) + parser.add_argument('key', type=str, help='配置项', location='form', required=True) + parser.add_argument('value', type=str, help='配置值', location='form', required=True) + + @config.doc(parser=parser) + def post(self): + """ + 配置媒体库目录 + """ + return WebAction().api_action(cmd='update_directory', data=self.parser.parse_args()) + + +@subscribe.route('/delete') +class SubscribeDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='名称', location='form') + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form') + parser.add_argument('year', type=str, help='发行年份', location='form') + parser.add_argument('season', type=int, help='季号', location='form') + parser.add_argument('rssid', type=int, help='已有订阅ID', location='form') + parser.add_argument('tmdbid', type=str, help='TMDBID', location='form') + + @subscribe.doc(parser=parser) + def post(self): + """ + 删除订阅 + """ + return WebAction().api_action(cmd='remove_rss_media', data=self.parser.parse_args()) + + +@subscribe.route('/add') +class SubscribeAdd(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='名称', location='form', required=True) + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + parser.add_argument('year', type=str, help='发行年份', location='form') + parser.add_argument('keyword', type=str, help='自定义搜索词', location='form') + parser.add_argument('season', type=int, help='季号', location='form') + parser.add_argument('rssid', type=int, help='已有订阅ID', location='form') + parser.add_argument('mediaid', type=str, help='TMDBID/DB:豆瓣ID', location='form') + parser.add_argument('fuzzy_match', type=int, help='模糊匹配(0-否/1-是)', location='form') + parser.add_argument('rss_sites', type=list, help='RSS站点', location='form') + parser.add_argument('search_sites', type=list, help='搜索站点', location='form') + parser.add_argument('over_edition', type=int, help='洗版(0-否/1-是)', location='form') + parser.add_argument('filter_restype', type=str, help='资源类型', location='form') + parser.add_argument('filter_pix', type=str, help='分辨率', location='form') + parser.add_argument('filter_team', type=str, help='字幕组/发布组', location='form') + parser.add_argument('filter_rule', type=int, help='过滤规则', location='form') + parser.add_argument('download_setting', type=int, help='下载设置', location='form') + parser.add_argument('save_path', type=str, help='保存路径', location='form') + parser.add_argument('total_ep', type=int, help='总集数', location='form') + parser.add_argument('current_ep', type=int, help='开始集数', location='form') + + @subscribe.doc(parser=parser) + def post(self): + """ + 新增/修改订阅 + """ + return WebAction().api_action(cmd='add_rss_media', data=self.parser.parse_args()) + + +@subscribe.route('/movie/date') +class SubscribeMovieDate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='TMDBID/DB:豆瓣ID', location='form', required=True) + + @subscribe.doc(parser=parser) + def post(self): + """ + 电影上映日期 + """ + return WebAction().api_action(cmd='movie_calendar_data', data=self.parser.parse_args()) + + +@subscribe.route('/tv/date') +class SubscribeTVDate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='TMDBID/DB:豆瓣ID', location='form', required=True) + parser.add_argument('season', type=int, help='季号', location='form', required=True) + parser.add_argument('name', type=str, help='名称', location='form') + + @subscribe.doc(parser=parser) + def post(self): + """ + 电视剧上映日期 + """ + return WebAction().api_action(cmd='tv_calendar_data', data=self.parser.parse_args()) + + +@subscribe.route('/search') +class SubscribeSearch(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + parser.add_argument('rssid', type=int, help='订阅ID', location='form', required=True) + + @subscribe.doc(parser=parser) + def post(self): + """ + 订阅刷新搜索 + """ + return WebAction().api_action(cmd='refresh_rss', data=self.parser.parse_args()) + + +@subscribe.route('/info') +class SubscribeInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('rssid', type=int, help='订阅ID', location='form', required=True) + parser.add_argument('type', type=str, help='订阅类型(MOV/TV)', location='form', required=True) + + @subscribe.doc(parser=parser) + def post(self): + """ + 订阅详情 + """ + return WebAction().api_action(cmd='rss_detail', data=self.parser.parse_args()) + + +@subscribe.route('/redo') +class SubscribeRedo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('rssid', type=int, help='订阅历史ID', location='form', required=True) + parser.add_argument('type', type=str, help='订阅类型(MOV/TV)', location='form', required=True) + + @subscribe.doc(parser=parser) + def post(self): + """ + 历史重新订阅 + """ + return WebAction().api_action(cmd='re_rss_history', data=self.parser.parse_args()) + + +@subscribe.route('/history/delete') +class SubscribeHistoryDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('rssid', type=int, help='订阅ID', location='form', required=True) + + @subscribe.doc(parser=parser) + def post(self): + """ + 删除订阅历史 + """ + return WebAction().api_action(cmd='delete_rss_history', data=self.parser.parse_args()) + + +@subscribe.route('/history') +class SubscribeHistory(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + + @subscribe.doc(parser=parser) + def post(self): + """ + 查询订阅历史 + """ + return WebAction().api_action(cmd='get_rss_history', data=self.parser.parse_args()) + + +@subscribe.route('/cache/delete') +class SubscribeCacheDelete(ClientResource): + @staticmethod + def post(): + """ + 清理订阅缓存 + """ + return WebAction().api_action(cmd='truncate_rsshistory') + + +@subscribe.route('/movie/list') +class SubscribeMovieList(ClientResource): + @staticmethod + def post(): + """ + 查询所有电影订阅 + """ + return WebAction().api_action(cmd='get_movie_rss_list') + + +@subscribe.route('/tv/list') +class SubscribeTvList(ClientResource): + @staticmethod + def post(): + """ + 查询所有电视剧订阅 + """ + return WebAction().api_action(cmd='get_tv_rss_list') + + +@recommend.route('/list') +class RecommendList(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, + help='类型(hm/ht/nm/nt/dbom/dbhm/dbht/dbdh/dbnm/dbtop/dbzy/bangumi)', + location='form', required=True) + parser.add_argument('page', type=int, help='页码', location='form', required=True) + + @recommend.doc(parser=parser) + def post(self): + """ + 推荐列表 + """ + return WebAction().api_action(cmd='get_recommend', data=self.parser.parse_args()) + + +@rss.route('/info') +class RssInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='任务ID', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 自定义订阅任务详情 + """ + return WebAction().api_action(cmd='get_userrss_task', data=self.parser.parse_args()) + + +@rss.route('/delete') +class RssDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='任务ID', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 删除自定义订阅任务 + """ + return WebAction().api_action(cmd='delete_userrss_task', data=self.parser.parse_args()) + + +@rss.route('/update') +class RssUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='任务ID', location='form') + parser.add_argument('name', type=str, help='任务名称', location='form', required=True) + parser.add_argument('address', type=str, help='RSS地址', location='form', required=True) + parser.add_argument('parser', type=int, help='解析器ID', location='form', required=True) + parser.add_argument('interval', type=int, help='刷新间隔(分钟)', location='form', required=True) + parser.add_argument('uses', type=str, help='动作', location='form', required=True) + parser.add_argument('state', type=str, help='状态(Y/N)', location='form', required=True) + parser.add_argument('include', type=str, help='包含', location='form') + parser.add_argument('exclude', type=str, help='排除', location='form') + parser.add_argument('filterrule', type=int, help='过滤规则', location='form') + parser.add_argument('note', type=str, help='备注', location='form') + + @rss.doc(parser=parser) + def post(self): + """ + 新增/修改自定义订阅任务 + """ + return WebAction().api_action(cmd='update_userrss_task', data=self.parser.parse_args()) + + +@rss.route('/parser/info') +class RssParserInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='解析器ID', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 解析器详情 + """ + return WebAction().api_action(cmd='get_rssparser', data=self.parser.parse_args()) + + +@rss.route('/parser/delete') +class RssParserDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='解析器ID', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 删除解析器 + """ + return WebAction().api_action(cmd='delete_rssparser', data=self.parser.parse_args()) + + +@rss.route('/parser/update') +class RssParserUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='解析器ID', location='form', required=True) + parser.add_argument('name', type=str, help='名称', location='form', required=True) + parser.add_argument('type', type=str, help='类型(JSON/XML)', location='form', required=True) + parser.add_argument('format', type=str, help='解析格式', location='form', required=True) + parser.add_argument('params', type=str, help='附加参数', location='form') + + @rss.doc(parser=parser) + def post(self): + """ + 新增/修改解析器 + """ + return WebAction().api_action(cmd='update_rssparser', data=self.parser.parse_args()) + + +@rss.route('/parser/list') +class RssParserList(ClientResource): + @staticmethod + def post(): + """ + 查询所有解析器 + """ + return { + "code": 0, + "success": True, + "data": { + "parsers": RssChecker().get_userrss_parser() + } + } + + +@rss.route('/list') +class RssList(ClientResource): + @staticmethod + def post(): + """ + 查询所有自定义订阅任务 + """ + return { + "code": 0, + "success": False, + "data": { + "tasks": RssChecker().get_rsstask_info(), + "parsers": RssChecker().get_userrss_parser() + } + } + + +@rss.route('/preview') +class RssPreview(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='任务ID', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 自定义订阅预览 + """ + return WebAction().api_action(cmd='list_rss_articles', data=self.parser.parse_args()) + + +@rss.route('/name/test') +class RssNameTest(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('taskid', type=int, help='任务ID', location='form', required=True) + parser.add_argument('title', type=str, help='名称', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 自定义订阅名称测试 + """ + return WebAction().api_action(cmd='rss_article_test', data=self.parser.parse_args()) + + +@rss.route('/item/history') +class RssItemHistory(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='任务ID', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 自定义订阅任务条目处理记录 + """ + return WebAction().api_action(cmd='list_rss_history', data=self.parser.parse_args()) + + +@rss.route('/item/set') +class RssItemSet(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('flag', type=str, help='操作类型(set_finished/set_unfinish)', location='form', required=True) + parser.add_argument('articles', type=list, help='条目({title/enclosure})', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 自定义订阅任务条目状态调整 + """ + return WebAction().api_action(cmd='rss_articles_check', data=self.parser.parse_args()) + + +@rss.route('/item/download') +class RssItemDownload(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('taskid', type=int, help='任务ID', location='form', required=True) + parser.add_argument('articles', type=list, help='条目({title/enclosure})', location='form', required=True) + + @rss.doc(parser=parser) + def post(self): + """ + 自定义订阅任务条目下载 + """ + return WebAction().api_action(cmd='rss_articles_download', data=self.parser.parse_args()) + + +@media.route('/search') +class MediaSearch(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('keyword', type=str, help='关键字', location='form', required=True) + + @media.doc(parser=parser) + def post(self): + """ + 搜索TMDB/豆瓣词条 + """ + return WebAction().api_action(cmd='search_media_infos', data=self.parser.parse_args()) + + +@media.route('/cache/update') +class MediaCacheUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('key', type=str, help='缓存Key值', location='form', required=True) + parser.add_argument('title', type=str, help='标题', location='form', required=True) + + @media.doc(parser=parser) + def post(self): + """ + 修改TMDB缓存标题 + """ + return WebAction().api_action(cmd='modify_tmdb_cache', data=self.parser.parse_args()) + + +@media.route('/cache/delete') +class MediaCacheDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('cache_key', type=str, help='缓存Key值', location='form', required=True) + + @media.doc(parser=parser) + def post(self): + """ + 删除TMDB缓存 + """ + return WebAction().api_action(cmd='delete_tmdb_cache', data=self.parser.parse_args()) + + +@media.route('/cache/clear') +class MediaCacheClear(ClientResource): + + @staticmethod + def post(): + """ + 清空TMDB缓存 + """ + return WebAction().api_action(cmd='clear_tmdb_cache') + + +@media.route('/tv/seasons') +class MediaTvSeasons(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('tmdbid', type=str, help='TMDBID', location='form', required=True) + + @media.doc(parser=parser) + def post(self): + """ + 查询电视剧季列表 + """ + return WebAction().api_action(cmd='get_tvseason_list', data=self.parser.parse_args()) + + +@media.route('/category/list') +class MediaCategoryList(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(电影/电视剧/动漫)', location='form', required=True) + + @media.doc(parser=parser) + def post(self): + """ + 查询二级分类配置 + """ + return WebAction().api_action(cmd='get_categories', data=self.parser.parse_args()) + + +@media.route('/info') +class MediaInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + parser.add_argument('id', type=str, help='TMDBID/DB:豆瓣ID', location='form') + parser.add_argument('title', type=str, help='标题', location='form') + parser.add_argument('year', type=str, help='年份', location='form') + parser.add_argument('rssid', type=str, help='订阅ID', location='form') + + @media.doc(parser=parser) + def post(self): + """ + 识别媒体信息 + """ + return WebAction().api_action(cmd='media_info', data=self.parser.parse_args()) + + +@media.route('/detail') +class MediaDetail(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + parser.add_argument('tmdbid', type=str, help='TMDBID/DB:豆瓣ID', location='form') + + @media.doc(parser=parser) + def post(self): + """ + 查询TMDB媒体详情 + """ + return WebAction().api_action(cmd='media_detail', data=self.parser.parse_args()) + + +@media.route('/similar') +class MediaSimilar(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + parser.add_argument('tmdbid', type=str, help='TMDBID', location='form') + parser.add_argument('page', type=int, help='页码', location='form') + + @media.doc(parser=parser) + def post(self): + """ + 根据TMDBID查询类似媒体 + """ + return WebAction().api_action(cmd='media_similar', data=self.parser.parse_args()) + + +@media.route('/recommendations') +class MediaRecommendations(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + parser.add_argument('tmdbid', type=str, help='TMDBID', location='form') + parser.add_argument('page', type=int, help='页码', location='form') + + @media.doc(parser=parser) + def post(self): + """ + 根据TMDBID查询推荐媒体 + """ + return WebAction().api_action(cmd='media_recommendations', data=self.parser.parse_args()) + + +@media.route('/person') +class MediaPersonList(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(MOV/TV)', location='form', required=True) + parser.add_argument('personid', type=str, help='演员ID', location='form') + parser.add_argument('page', type=int, help='页码', location='form') + + @media.doc(parser=parser) + def post(self): + """ + 查询TMDB演员参演作品 + """ + return WebAction().api_action(cmd='person_medias', data=self.parser.parse_args()) + + +@media.route('/subtitle/download') +class MediaSubtitleDownload(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('path', type=str, help='文件路径(含文件名)', location='form', required=True) + parser.add_argument('name', type=str, help='名称(用于识别)', location='form', required=True) + + @media.doc(parser=parser) + def post(self): + """ + 下载单个文件字幕 + """ + return WebAction().api_action(cmd='download_subtitle', data=self.parser.parse_args()) + + +@brushtask.route('/update') +class BrushTaskUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('brushtask_id', type=str, help='刷流任务ID', location='form') + parser.add_argument('brushtask_name', type=str, help='任务名称', location='form', required=True) + parser.add_argument('brushtask_site', type=int, help='站点', location='form', required=True) + parser.add_argument('brushtask_interval', type=int, help='刷新间隔(分钟)', location='form', required=True) + parser.add_argument('brushtask_downloader', type=int, help='下载器', location='form', required=True) + parser.add_argument('brushtask_totalsize', type=int, help='保种体积(GB)', location='form', required=True) + parser.add_argument('brushtask_state', type=str, help='状态(Y/N)', location='form', required=True) + parser.add_argument('brushtask_transfer', type=str, help='转移到媒体库(Y/N)', location='form') + parser.add_argument('brushtask_sendmessage', type=str, help='消息推送(Y/N)', location='form') + parser.add_argument('brushtask_forceupload', type=str, help='强制做种(Y/N)', location='form') + parser.add_argument('brushtask_free', type=str, help='促销(FREE/2XFREE)', location='form') + parser.add_argument('brushtask_hr', type=str, help='Hit&Run(HR)', location='form') + parser.add_argument('brushtask_torrent_size', type=int, help='种子大小(GB)', location='form') + parser.add_argument('brushtask_include', type=str, help='包含', location='form') + parser.add_argument('brushtask_exclude', type=str, help='排除', location='form') + parser.add_argument('brushtask_dlcount', type=int, help='同时下载任务数', location='form') + parser.add_argument('brushtask_peercount', type=int, help='做种人数限制', location='form') + parser.add_argument('brushtask_seedtime', type=float, help='做种时间(小时)', location='form') + parser.add_argument('brushtask_seedratio', type=float, help='分享率', location='form') + parser.add_argument('brushtask_seedsize', type=int, help='上传量(GB)', location='form') + parser.add_argument('brushtask_dltime', type=float, help='下载耗时(小时)', location='form') + parser.add_argument('brushtask_avg_upspeed', type=int, help='平均上传速度(KB/S)', location='form') + parser.add_argument('brushtask_iatime', type=float, help='未活动时间(小时)', location='form') + parser.add_argument('brushtask_pubdate', type=int, help='发布时间(小时)', location='form') + parser.add_argument('brushtask_upspeed', type=int, help='上传限速(KB/S)', location='form') + parser.add_argument('brushtask_downspeed', type=int, help='下载限速(KB/S)', location='form') + + @brushtask.doc(parser=parser) + def post(self): + """ + 新增/修改刷流任务 + """ + return WebAction().api_action(cmd='add_brushtask', data=self.parser.parse_args()) + + +@brushtask.route('/delete') +class BrushTaskDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='刷流任务ID', location='form', required=True) + + @brushtask.doc(parser=parser) + def post(self): + """ + 删除刷流任务 + """ + return WebAction().api_action(cmd='del_brushtask', data=self.parser.parse_args()) + + +@brushtask.route('/info') +class BrushTaskInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='刷流任务ID', location='form', required=True) + + @brushtask.doc(parser=parser) + def post(self): + """ + 刷流任务详情 + """ + return WebAction().api_action(cmd='brushtask_detail', data=self.parser.parse_args()) + + +@brushtask.route('/list') +class BrushTaskList(ClientResource): + @staticmethod + def post(): + """ + 查询所有刷流任务 + """ + return { + "code": 0, + "success": True, + "data": { + "tasks": BrushTask().get_brushtask_info() + } + } + + +@brushtask.route('/torrents') +class BrushTaskTorrents(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='刷流任务ID', location='form', required=True) + + @brushtask.doc(parser=parser) + def post(self): + """ + 查询刷流任务种子明细 + """ + return WebAction().api_action(cmd='list_brushtask_torrents', data=self.parser.parse_args()) + + +@brushtask.route('/downloader/update') +class BrushTaskDownloaderUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('test', type=int, help='测试(0-否/1-是)', location='form', required=True) + parser.add_argument('id', type=int, help='下载器ID', location='form') + parser.add_argument('name', type=str, help='名称', location='form', required=True) + parser.add_argument('type', type=str, help='类型(qbittorrent/transmission)', location='form', required=True) + parser.add_argument('host', type=str, help='地址', location='form', required=True) + parser.add_argument('port', type=int, help='端口', location='form', required=True) + parser.add_argument('username', type=str, help='用户名', location='form') + parser.add_argument('password', type=str, help='密码', location='form') + parser.add_argument('save_dir', type=str, help='保存目录', location='form') + + @brushtask.doc(parser=parser) + def post(self): + """ + 新增/修改刷流下载器 + """ + return WebAction().api_action(cmd='add_downloader', data=self.parser.parse_args()) + + +@brushtask.route('/downloader/delete') +class BrushTaskDownloaderDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='下载器ID', location='form', required=True) + + @brushtask.doc(parser=parser) + def post(self): + """ + 删除刷流下载器 + """ + return WebAction().api_action(cmd='delete_downloader', data=self.parser.parse_args()) + + +@brushtask.route('/downloader/info') +class BrushTaskDownloaderInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='下载器ID', location='form', required=True) + + @brushtask.doc(parser=parser) + def post(self): + """ + 刷流下载器详情 + """ + return WebAction().api_action(cmd='get_downloader', data=self.parser.parse_args()) + + +@brushtask.route('/downloader/list') +class BrushTaskDownloaderList(ClientResource): + @staticmethod + def post(): + """ + 查询所有刷流下载器 + """ + return { + "code": 0, + "success": True, + "data": { + "downloaders": BrushTask().get_downloader_info() + } + } + + +@brushtask.route('/run') +class BrushTaskRun(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='刷流任务ID', location='form', required=True) + + @brushtask.doc(parser=parser) + def post(self): + """ + 刷流下载器详情 + """ + return WebAction().api_action(cmd='run_brushtask', data=self.parser.parse_args()) + + +@filterrule.route('/list') +class FilterRuleList(ClientResource): + @staticmethod + def post(): + """ + 查询所有过滤规则 + """ + return WebAction().api_action(cmd='get_filterrules') + + +@filterrule.route('/group/add') +class FilterRuleGroupAdd(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('name', type=str, help='名称', location='form', required=True) + parser.add_argument('default', type=str, help='默认(Y/N)', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 新增规则组 + """ + return WebAction().api_action(cmd='add_filtergroup', data=self.parser.parse_args()) + + +@filterrule.route('/group/restore') +class FilterRuleGroupRestore(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('groupids', type=list, help='规则组ID', location='form', required=True) + parser.add_argument('init_rulegroups', type=list, help='规则组脚本', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 恢复默认规则组 + """ + return WebAction().api_action(cmd='restore_filtergroup', data=self.parser.parse_args()) + + +@filterrule.route('/group/default') +class FilterRuleGroupDefault(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='规则组ID', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 设置默认规则组 + """ + return WebAction().api_action(cmd='set_default_filtergroup', data=self.parser.parse_args()) + + +@filterrule.route('/group/delete') +class FilterRuleGroupDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=str, help='规则组ID', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 删除规则组 + """ + return WebAction().api_action(cmd='del_filtergroup', data=self.parser.parse_args()) + + +@filterrule.route('/rule/update') +class FilterRuleUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('rule_id', type=int, help='规则ID', location='form') + parser.add_argument('group_id', type=int, help='规则组ID', location='form', required=True) + parser.add_argument('rule_name', type=str, help='规则名称', location='form', required=True) + parser.add_argument('rule_pri', type=str, help='优先级', location='form', required=True) + parser.add_argument('rule_include', type=str, help='包含', location='form') + parser.add_argument('rule_exclude', type=str, help='排除', location='form') + parser.add_argument('rule_sizelimit', type=str, help='大小限制', location='form') + parser.add_argument('rule_free', type=str, help='促销(FREE/2XFREE)', location='form') + + @filterrule.doc(parser=parser) + def post(self): + """ + 新增/修改规则 + """ + return WebAction().api_action(cmd='add_filterrule', data=self.parser.parse_args()) + + +@filterrule.route('/rule/delete') +class FilterRuleDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='规则ID', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 删除规则 + """ + return WebAction().api_action(cmd='del_filterrule', data=self.parser.parse_args()) + + +@filterrule.route('/rule/info') +class FilterRuleInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('ruleid', type=int, help='规则ID', location='form', required=True) + parser.add_argument('groupid', type=int, help='规则组ID', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 规则详情 + """ + return WebAction().api_action(cmd='filterrule_detail', data=self.parser.parse_args()) + + +@filterrule.route('/rule/share') +class FilterRuleShare(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='规则组ID', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 分享规则组 + """ + return WebAction().api_action(cmd='share_filtergroup', data=self.parser.parse_args()) + + +@filterrule.route('/rule/import') +class FilterRuleImport(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('content', type=str, help='规则内容', location='form', required=True) + + @filterrule.doc(parser=parser) + def post(self): + """ + 导入规则组 + """ + return WebAction().api_action(cmd='import_filtergroup', data=self.parser.parse_args()) + + +@words.route('/group/add') +class WordsGroupAdd(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('tmdb_id', type=str, help='TMDBID', location='form', required=True) + parser.add_argument('tmdb_type', type=str, help='类型(movie/tv)', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 新增识别词组 + """ + return WebAction().api_action(cmd='add_custom_word_group', data=self.parser.parse_args()) + + +@words.route('/group/delete') +class WordsGroupDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('gid', type=int, help='识别词组ID', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 删除识别词组 + """ + return WebAction().api_action(cmd='delete_custom_word_group', data=self.parser.parse_args()) + + +@words.route('/item/update') +class WordItemUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='识别词ID', location='form', required=True) + parser.add_argument('gid', type=int, help='识别词组ID', location='form', required=True) + parser.add_argument('group_type', type=str, help='媒体类型(1-电影/2-电视剧)', location='form', required=True) + parser.add_argument('new_replaced', type=str, help='被替换词', location='form') + parser.add_argument('new_replace', type=str, help='替换词', location='form') + parser.add_argument('new_front', type=str, help='前定位词', location='form') + parser.add_argument('new_back', type=str, help='后定位词', location='form') + parser.add_argument('new_offset', type=str, help='偏移集数', location='form') + parser.add_argument('new_help', type=str, help='备注', location='form') + parser.add_argument('type', type=str, help='识别词类型(1-屏蔽/2-替换/3-替换+集偏移/4-集偏移)', location='form', + required=True) + parser.add_argument('season', type=str, help='季', location='form') + parser.add_argument('enabled', type=str, help='状态(1-启用/0-停用)', location='form', required=True) + parser.add_argument('regex', type=str, help='正则表达式(1-使用/0-不使用)', location='form') + + @words.doc(parser=parser) + def post(self): + """ + 新增/修改识别词 + """ + return WebAction().api_action(cmd='add_or_edit_custom_word', data=self.parser.parse_args()) + + +@words.route('/item/info') +class WordItemInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('wid', type=int, help='识别词ID', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 识别词详情 + """ + return WebAction().api_action(cmd='get_custom_word', data=self.parser.parse_args()) + + +@words.route('/item/delete') +class WordItemDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='识别词ID', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 删除识别词 + """ + return WebAction().api_action(cmd='delete_custom_word', data=self.parser.parse_args()) + + +@words.route('/item/status') +class WordItemStatus(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('ids_info', type=list, help='识别词IDS', location='form', required=True) + parser.add_argument('flag', type=int, help='状态(1/0)', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 设置识别词状态 + """ + return WebAction().api_action(cmd='check_custom_words', data=self.parser.parse_args()) + + +@words.route('/item/export') +class WordItemExport(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('note', type=str, help='备注', location='form', required=True) + parser.add_argument('ids_info', type=str, help='识别词IDS(@_)', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 导出识别词 + """ + return WebAction().api_action(cmd='export_custom_words', data=self.parser.parse_args()) + + +@words.route('/item/analyse') +class WordItemAnalyse(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('import_code', type=str, help='识别词代码', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 分析识别词 + """ + return WebAction().api_action(cmd='analyse_import_custom_words_code', data=self.parser.parse_args()) + + +@words.route('/item/import') +class WordItemImport(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('import_code', type=str, help='识别词代码', location='form', required=True) + parser.add_argument('ids_info', type=list, help='识别词IDS', location='form', required=True) + + @words.doc(parser=parser) + def post(self): + """ + 导入识别词 + """ + return WebAction().api_action(cmd='import_custom_words', data=self.parser.parse_args()) + + +@words.route('/list') +class WordList(ClientResource): + @staticmethod + def post(): + """ + 查询所有自定义识别词 + """ + return WebAction().api_action(cmd='get_customwords') + + +@sync.route('/directory/update') +class SyncDirectoryUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=int, help='同步目录ID', location='form') + parser.add_argument('from', type=str, help='源目录', location='form', required=True) + parser.add_argument('to', type=str, help='目的目录', location='form') + parser.add_argument('unknown', type=str, help='未知目录', location='form') + parser.add_argument('syncmod', type=str, help='同步模式', location='form') + parser.add_argument('rename', type=str, help='重命名', location='form') + parser.add_argument('enabled', type=str, help='开启', location='form') + + @sync.doc(parser=parser) + def post(self): + """ + 新增/修改同步目录 + """ + return WebAction().api_action(cmd='add_or_edit_sync_path', data=self.parser.parse_args()) + + +@sync.route('/directory/info') +class SyncDirectoryInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=int, help='同步目录ID', location='form', required=True) + + @sync.doc(parser=parser) + def post(self): + """ + 同步目录详情 + """ + return WebAction().api_action(cmd='get_sync_path', data=self.parser.parse_args()) + + +@sync.route('/directory/delete') +class SyncDirectoryDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=int, help='同步目录ID', location='form', required=True) + + @sync.doc(parser=parser) + def post(self): + """ + 删除同步目录 + """ + return WebAction().api_action(cmd='delete_sync_path', data=self.parser.parse_args()) + + +@sync.route('/directory/status') +class SyncDirectoryStatus(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=int, help='同步目录ID', location='form', required=True) + parser.add_argument('flag', type=str, help='操作(rename/enable)', location='form', required=True) + parser.add_argument('checked', type=int, help='状态(0-否/1-是)', location='form', required=True) + + @sync.doc(parser=parser) + def post(self): + """ + 设置同步目录状态 + """ + return WebAction().api_action(cmd='check_sync_path', data=self.parser.parse_args()) + + +@sync.route('/directory/list') +class SyncDirectoryList(ClientResource): + @staticmethod + def post(): + """ + 查询所有同步目录 + """ + return WebAction().api_action(cmd='get_directorysync') + + +@sync.route('/directory/run') +class SyncDirectoryRun(ApiResource): + parser = reqparse.RequestParser() + parser.add_argument('sid', type=int, help='同步目录ID', location='args', required=True) + + @sync.doc(parser=parser) + def get(self): + """ + 立即运行单个目录同步服务(密钥认证) + """ + return WebAction().api_action(cmd='run_directory_sync', data=self.parser.parse_args()) + + +@sync.route('/run') +class SyncRun(ApiResource): + + @staticmethod + def get(): + """ + 立即运行所有目录同步服务(密钥认证) + """ + return WebAction().api_action(cmd='sch', data={"item": "sync"}) + + +@message.route('/client/update') +class MessageClientUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('cid', type=int, help='ID', location='form') + parser.add_argument('name', type=str, help='名称', location='form', required=True) + parser.add_argument('type', type=str, help='类型(wechat/telegram/serverchan/bark/pushplus/iyuu/slack/gotify)', + location='form', required=True) + parser.add_argument('config', type=str, help='配置项(JSON)', location='form', required=True) + parser.add_argument('switchs', type=list, help='开关', location='form', required=True) + parser.add_argument('interactive', type=int, help='是否开启交互(0/1)', location='form', required=True) + parser.add_argument('enabled', type=int, help='是否启用(0/1)', location='form', required=True) + + @message.doc(parser=parser) + def post(self): + """ + 新增/修改通知消息服务渠道 + """ + return WebAction().api_action(cmd='update_message_client', data=self.parser.parse_args()) + + +@message.route('/client/delete') +class MessageClientDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('cid', type=int, help='ID', location='form', required=True) + + @message.doc(parser=parser) + def post(self): + """ + 删除通知消息服务渠道 + """ + return WebAction().api_action(cmd='delete_message_client', data=self.parser.parse_args()) + + +@message.route('/client/status') +class MessageClientStatus(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('flag', type=str, help='操作类型(interactive/enable)', location='form', required=True) + parser.add_argument('cid', type=int, help='ID', location='form', required=True) + + @message.doc(parser=parser) + def post(self): + """ + 设置通知消息服务渠道状态 + """ + return WebAction().api_action(cmd='check_message_client', data=self.parser.parse_args()) + + +@message.route('/client/info') +class MessageClientInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('cid', type=int, help='ID', location='form', required=True) + + @message.doc(parser=parser) + def post(self): + """ + 查询通知消息服务渠道设置 + """ + return WebAction().api_action(cmd='get_message_client', data=self.parser.parse_args()) + + +@message.route('/client/test') +class MessageClientTest(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('type', type=str, help='类型(wechat/telegram/serverchan/bark/pushplus/iyuu/slack/gotify)', + location='form', required=True) + parser.add_argument('config', type=str, help='配置(JSON)', location='form', required=True) + + @message.doc(parser=parser) + def post(self): + """ + 测试通知消息服务配置正确性 + """ + return WebAction().api_action(cmd='test_message_client', data=self.parser.parse_args()) + + +@torrentremover.route('/task/info') +class TorrentRemoverTaskInfo(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('tid', type=int, help='任务ID', location='form', required=True) + + @torrentremover.doc(parser=parser) + def post(self): + """ + 查询自动删种任务详情 + """ + return WebAction().api_action(cmd='get_torrent_remove_task', data=self.parser.parse_args()) + + +@torrentremover.route('/task/list') +class TorrentRemoverTaskList(ClientResource): + @staticmethod + @torrentremover.doc() + def post(): + """ + 查询所有自动删种任务 + """ + return WebAction().api_action(cmd='get_torrent_remove_task') + + +@torrentremover.route('/task/delete') +class TorrentRemoverTaskDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('tid', type=int, help='任务ID', location='form', required=True) + + @torrentremover.doc(parser=parser) + def post(self): + """ + 删除自动删种任务 + """ + return WebAction().api_action(cmd='delete_torrent_remove_task', data=self.parser.parse_args()) + + +@torrentremover.route('/task/update') +class TorrentRemoverTaskUpdate(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('tid', type=int, help='任务ID', location='form') + parser.add_argument('name', type=str, help='名称', location='form', required=True) + parser.add_argument('action', type=int, help='动作(1-暂停/2-删除种子/3-删除种子及文件)', location='form', + required=True) + parser.add_argument('interval', type=int, help='运行间隔(分钟)', location='form', required=True) + parser.add_argument('enabled', type=int, help='状态(0-停用/1-启用)', location='form', required=True) + parser.add_argument('samedata', type=int, help='处理辅种(0-否/1-是)', location='form', required=True) + parser.add_argument('onlynastool', type=int, help='只管理NASTool添加的下载(0-否/1-是)', location='form', + required=True) + parser.add_argument('ratio', type=float, help='分享率', location='form') + parser.add_argument('seeding_time', type=int, help='做种时间(小时)', location='form') + parser.add_argument('upload_avs', type=int, help='平均上传速度(KB/S)', location='form') + parser.add_argument('size', type=str, help='种子大小(GB)', location='form') + parser.add_argument('savepath_key', type=str, help='保存路径关键词', location='form') + parser.add_argument('tracker_key', type=str, help='tracker关键词', location='form') + parser.add_argument('downloader', type=str, help='下载器(Qb/Tr)', location='form') + parser.add_argument('qb_state', type=str, help='Qb种子状态(多个用;分隔)', location='form') + parser.add_argument('qb_category', type=str, help='Qb分类(多个用;分隔)', location='form') + parser.add_argument('tr_state', type=str, help='Tr种子状态(多个用;分隔)', location='form') + parser.add_argument('tr_error_key', type=str, help='Tr错误信息关键词', location='form') + + @torrentremover.doc(parser=parser) + def post(self): + """ + 新增/修改自动删种任务 + """ + return WebAction().api_action(cmd='update_torrent_remove_task', data=self.parser.parse_args()) + + +@douban.route('/history/list') +class DoubanHistoryList(ClientResource): + + @staticmethod + def post(): + """ + 查询豆瓣同步历史记录 + """ + return WebAction().api_action(cmd='get_douban_history') + + +@douban.route('/history/delete') +class DoubanHistoryDelete(ClientResource): + parser = reqparse.RequestParser() + parser.add_argument('id', type=int, help='ID', location='form', required=True) + + @douban.doc(parser=parser) + def post(self): + """ + 删除豆瓣同步历史记录 + """ + return WebAction().api_action(cmd='delete_douban_history', data=self.parser.parse_args()) + + +@douban.route('/run') +class DoubanRun(ClientResource): + @staticmethod + def post(): + """ + 立即同步豆瓣数据 + """ + # 返回站点信息 + return WebAction().api_action(cmd='sch', data={"item": "douban"}) diff --git a/web/backend/WXBizMsgCrypt3.py b/web/backend/WXBizMsgCrypt3.py new file mode 100644 index 0000000..ce10d0c --- /dev/null +++ b/web/backend/WXBizMsgCrypt3.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python +# -*- encoding:utf-8 -*- + +""" 对企业微信发送给企业后台的消息加解密示例代码. +@copyright: Copyright (c) 1998-2014 Tencent Inc. + +""" +import base64 +import hashlib +# ------------------------------------------------------------------------ +import logging +import random +import socket +import struct +import time +import xml.etree.cElementTree as ET + +from Crypto.Cipher import AES + +# Description:定义错误码含义 +######################################################################### +WXBizMsgCrypt_OK = 0 +WXBizMsgCrypt_ValidateSignature_Error = -40001 +WXBizMsgCrypt_ParseXml_Error = -40002 +WXBizMsgCrypt_ComputeSignature_Error = -40003 +WXBizMsgCrypt_IllegalAesKey = -40004 +WXBizMsgCrypt_ValidateCorpid_Error = -40005 +WXBizMsgCrypt_EncryptAES_Error = -40006 +WXBizMsgCrypt_DecryptAES_Error = -40007 +WXBizMsgCrypt_IllegalBuffer = -40008 +WXBizMsgCrypt_EncodeBase64_Error = -40009 +WXBizMsgCrypt_DecodeBase64_Error = -40010 +WXBizMsgCrypt_GenReturnXml_Error = -40011 + +""" +关于Crypto.Cipher模块,ImportError: No module named 'Crypto'解决方案 +请到官方网站 https://www.dlitz.net/software/pycrypto/ 下载pycrypto。 +下载后,按照README中的“Installation”小节的提示进行pycrypto安装。 +""" + + +class FormatException(Exception): + pass + + +def throw_exception(message, exception_class=FormatException): + """my define raise exception function""" + raise exception_class(message) + + +class SHA1: + """计算企业微信的消息签名接口""" + + @staticmethod + def getSHA1(token, timestamp, nonce, encrypt): + """用SHA1算法生成安全签名 + @param token: 票据 + @param timestamp: 时间戳 + @param encrypt: 密文 + @param nonce: 随机字符串 + @return: 安全签名 + """ + try: + sortlist = [token, timestamp, nonce, encrypt] + sortlist.sort() + sha = hashlib.sha1() + sha.update("".join(sortlist).encode()) + return WXBizMsgCrypt_OK, sha.hexdigest() + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_ComputeSignature_Error, None + + +class XMLParse: + """提供提取消息格式中的密文及生成回复消息格式的接口""" + + # xml消息模板 + AES_TEXT_RESPONSE_TEMPLATE = """ + + +%(timestamp)s + +""" + + @staticmethod + def extract(xmltext): + """提取出xml数据包中的加密消息 + @param xmltext: 待提取的xml字符串 + @return: 提取出的加密消息字符串 + """ + try: + xml_tree = ET.fromstring(xmltext) + encrypt = xml_tree.find("Encrypt") + return WXBizMsgCrypt_OK, encrypt.text + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_ParseXml_Error, None + + def generate(self, encrypt, signature, timestamp, nonce): + """生成xml消息 + @param encrypt: 加密后的消息密文 + @param signature: 安全签名 + @param timestamp: 时间戳 + @param nonce: 随机字符串 + @return: 生成的xml字符串 + """ + resp_dict = { + 'msg_encrypt': encrypt, + 'msg_signaturet': signature, + 'timestamp': timestamp, + 'nonce': nonce, + } + resp_xml = self.AES_TEXT_RESPONSE_TEMPLATE % resp_dict + return resp_xml + + +class PKCS7Encoder: + """提供基于PKCS7算法的加解密接口""" + + block_size = 32 + + def encode(self, text): + """ 对需要加密的明文进行填充补位 + @param text: 需要进行填充补位操作的明文 + @return: 补齐明文字符串 + """ + text_length = len(text) + # 计算需要填充的位数 + amount_to_pad = self.block_size - (text_length % self.block_size) + if amount_to_pad == 0: + amount_to_pad = self.block_size + # 获得补位所用的字符 + pad = chr(amount_to_pad) + return text + (pad * amount_to_pad).encode() + + @staticmethod + def decode(decrypted): + """删除解密后明文的补位字符 + @param decrypted: 解密后的明文 + @return: 删除补位字符后的明文 + """ + pad = ord(decrypted[-1]) + if pad < 1 or pad > 32: + pad = 0 + return decrypted[:-pad] + + +class Prpcrypt(object): + """提供接收和推送给企业微信消息的加解密接口""" + + def __init__(self, key): + + # self.key = base64.b64decode(key+"=") + self.key = key + # 设置加解密模式为AES的CBC模式 + self.mode = AES.MODE_CBC + + def encrypt(self, text, receiveid): + """对明文进行加密 + @param text: 需要加密的明文 + @param receiveid: receiveid + @return: 加密得到的字符串 + """ + # 16位随机字符串添加到明文开头 + text = text.encode() + text = self.get_random_str() + struct.pack("I", socket.htonl(len(text))) + text + receiveid.encode() + + # 使用自定义的填充方式对明文进行补位填充 + pkcs7 = PKCS7Encoder() + text = pkcs7.encode(text) + # 加密 + cryptor = AES.new(self.key, self.mode, self.key[:16]) + try: + ciphertext = cryptor.encrypt(text) + # 使用BASE64对加密后的字符串进行编码 + return WXBizMsgCrypt_OK, base64.b64encode(ciphertext) + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_EncryptAES_Error, None + + def decrypt(self, text, receiveid): + """对解密后的明文进行补位删除 + @param text: 密文 + @param receiveid: receiveid + @return: 删除填充补位后的明文 + """ + try: + cryptor = AES.new(self.key, self.mode, self.key[:16]) + # 使用BASE64对密文进行解码,然后AES-CBC解密 + plain_text = cryptor.decrypt(base64.b64decode(text)) + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_DecryptAES_Error, None + try: + pad = plain_text[-1] + # 去掉补位字符串 + # pkcs7 = PKCS7Encoder() + # plain_text = pkcs7.encode(plain_text) + # 去除16位随机字符串 + content = plain_text[16:-pad] + xml_len = socket.ntohl(struct.unpack("I", content[: 4])[0]) + xml_content = content[4: xml_len + 4] + from_receiveid = content[xml_len + 4:] + except Exception as e: + logger = logging.getLogger() + logger.error(e) + return WXBizMsgCrypt_IllegalBuffer, None + + if from_receiveid.decode('utf8') != receiveid: + return WXBizMsgCrypt_ValidateCorpid_Error, None + return 0, xml_content + + @staticmethod + def get_random_str(): + """ 随机生成16位字符串 + @return: 16位字符串 + """ + return str(random.randint(1000000000000000, 9999999999999999)).encode() + + +class WXBizMsgCrypt(object): + # 构造函数 + def __init__(self, sToken, sEncodingAESKey, sReceiveId): + try: + self.key = base64.b64decode(sEncodingAESKey + "=") + assert len(self.key) == 32 + except Exception as err: + print(str(err)) + throw_exception("[error]: EncodingAESKey unvalid !", FormatException) + # return WXBizMsgCrypt_IllegalAesKey,None + self.m_sToken = sToken + self.m_sReceiveId = sReceiveId + + # 验证URL + # @param sMsgSignature: 签名串,对应URL参数的msg_signature + # @param sTimeStamp: 时间戳,对应URL参数的timestamp + # @param sNonce: 随机串,对应URL参数的nonce + # @param sEchoStr: 随机串,对应URL参数的echostr + # @param sReplyEchoStr: 解密之后的echostr,当return返回0时有效 + # @return:成功0,失败返回对应的错误码 + + def VerifyURL(self, sMsgSignature, sTimeStamp, sNonce, sEchoStr): + sha1 = SHA1() + ret, signature = sha1.getSHA1(self.m_sToken, sTimeStamp, sNonce, sEchoStr) + if ret != 0: + return ret, None + if not signature == sMsgSignature: + return WXBizMsgCrypt_ValidateSignature_Error, None + pc = Prpcrypt(self.key) + ret, sReplyEchoStr = pc.decrypt(sEchoStr, self.m_sReceiveId) + return ret, sReplyEchoStr + + def EncryptMsg(self, sReplyMsg, sNonce, timestamp=None): + # 将企业回复用户的消息加密打包 + # @param sReplyMsg: 企业号待回复用户的消息,xml格式的字符串 + # @param sTimeStamp: 时间戳,可以自己生成,也可以用URL参数的timestamp,如为None则自动用当前时间 + # @param sNonce: 随机串,可以自己生成,也可以用URL参数的nonce + # sEncryptMsg: 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串, + # return:成功0,sEncryptMsg,失败返回对应的错误码None + pc = Prpcrypt(self.key) + ret, encrypt = pc.encrypt(sReplyMsg, self.m_sReceiveId) + encrypt = encrypt.decode('utf8') + if ret != 0: + return ret, None + if timestamp is None: + timestamp = str(int(time.time())) + # 生成安全签名 + sha1 = SHA1() + ret, signature = sha1.getSHA1(self.m_sToken, timestamp, sNonce, encrypt) + if ret != 0: + return ret, None + xmlParse = XMLParse() + return ret, xmlParse.generate(encrypt, signature, timestamp, sNonce) + + def DecryptMsg(self, sPostData, sMsgSignature, sTimeStamp, sNonce): + # 检验消息的真实性,并且获取解密后的明文 + # @param sMsgSignature: 签名串,对应URL参数的msg_signature + # @param sTimeStamp: 时间戳,对应URL参数的timestamp + # @param sNonce: 随机串,对应URL参数的nonce + # @param sPostData: 密文,对应POST请求的数据 + # xml_content: 解密后的原文,当return返回0时有效 + # @return: 成功0,失败返回对应的错误码 + # 验证安全签名 + xmlParse = XMLParse() + ret, encrypt = xmlParse.extract(sPostData) + if ret != 0: + return ret, None + sha1 = SHA1() + ret, signature = sha1.getSHA1(self.m_sToken, sTimeStamp, sNonce, encrypt) + if ret != 0: + return ret, None + if not signature == sMsgSignature: + return WXBizMsgCrypt_ValidateSignature_Error, None + pc = Prpcrypt(self.key) + ret, xml_content = pc.decrypt(encrypt, self.m_sReceiveId) + return ret, xml_content diff --git a/web/backend/__init__.py b/web/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/web/backend/search_torrents.py b/web/backend/search_torrents.py new file mode 100644 index 0000000..6fdfce6 --- /dev/null +++ b/web/backend/search_torrents.py @@ -0,0 +1,500 @@ +import os.path +import re + +import log +from app.downloader import Downloader +from app.helper import DbHelper, ProgressHelper +from app.indexer import Indexer +from app.media import Media, DouBan +from app.media.meta import MetaInfo +from app.message import Message +from app.searcher import Searcher +from app.sites import Sites +from app.subscribe import Subscribe +from app.utils import StringUtils, Torrent +from app.utils.types import SearchType, IndexerType +from config import Config +from web.backend.web_utils import WebUtils + +SEARCH_MEDIA_CACHE = {} +SEARCH_MEDIA_TYPE = {} + + +def search_medias_for_web(content, ident_flag=True, filters=None, tmdbid=None, media_type=None): + """ + WEB资源搜索 + :param content: 关键字文本,可以包括 类型、标题、季、集、年份等信息,使用 空格分隔,也支持种子的命名格式 + :param ident_flag: 是否进行媒体信息识别 + :param filters: 其它过滤条件 + :param tmdbid: TMDBID或DB:豆瓣ID + :param media_type: 媒体类型,配合tmdbid传入 + :return: 错误码,错误原因,成功时直接插入数据库 + """ + mtype, key_word, season_num, episode_num, year, content = StringUtils.get_keyword_from_string(content) + if not key_word: + log.info("【Web】%s 检索关键字有误!" % content) + return -1, "%s 未识别到搜索关键字!" % content + # 类型 + if media_type: + mtype = media_type + # 开始进度 + search_process = ProgressHelper() + search_process.start('search') + # 识别媒体 + media_info = None + if ident_flag: + + # 有TMDBID或豆瓣ID + if tmdbid: + media_info = WebUtils.get_mediainfo_from_id(mtype=mtype, mediaid=tmdbid) + else: + # 按输入名称查 + media_info = Media().get_media_info(mtype=media_type or mtype, + title=content) + + # 整合集 + if media_info: + if season_num: + media_info.begin_season = int(season_num) + if episode_num: + media_info.begin_episode = int(episode_num) + + if media_info and media_info.tmdb_info: + # 查询到TMDB信息 + log.info(f"【Web】从TMDB中匹配到{media_info.type.value}:{media_info.get_title_string()}") + # 查找的季 + if media_info.begin_season is None: + search_season = None + else: + search_season = media_info.get_season_list() + # 查找的集 + search_episode = media_info.get_episode_list() + if search_episode and not search_season: + search_season = [1] + # 中文名 + if media_info.cn_name: + search_cn_name = media_info.cn_name + else: + search_cn_name = media_info.title + # 英文名 + search_en_name = None + if media_info.en_name: + search_en_name = media_info.en_name + else: + if media_info.original_language == "en": + search_en_name = media_info.original_title + else: + en_title = Media().get_tmdb_en_title(media_info) + if en_title: + search_en_name = en_title + # 两次搜索名称 + second_search_name = None + if Config().get_config("laboratory").get("search_en_title"): + if search_en_name: + first_search_name = search_en_name + second_search_name = search_cn_name + else: + first_search_name = search_cn_name + else: + first_search_name = search_cn_name + if search_en_name: + second_search_name = search_en_name + + filter_args = {"season": search_season, + "episode": search_episode, + "year": media_info.year, + "type": media_info.type} + else: + # 查询不到数据,使用快速搜索 + log.info(f"【Web】{content} 未从TMDB匹配到媒体信息,将使用快速搜索...") + ident_flag = False + media_info = None + first_search_name = key_word + second_search_name = None + filter_args = { + "season": season_num, + "episode": episode_num, + "year": year + } + # 快速搜索 + else: + first_search_name = key_word + second_search_name = None + filter_args = { + "season": season_num, + "episode": episode_num, + "year": year + } + # 整合高级查询条件 + if filters: + filter_args.update(filters) + # 开始检索 + log.info("【Web】开始检索 %s ..." % content) + media_list = Searcher().search_medias(key_word=first_search_name, + filter_args=filter_args, + match_media=media_info, + in_from=SearchType.WEB) + # 使用第二名称重新搜索 + if ident_flag \ + and len(media_list) == 0 \ + and second_search_name \ + and second_search_name != first_search_name: + search_process.start('search') + search_process.update(ptype='search', + text="%s 未检索到资源,尝试通过 %s 重新检索 ..." % (first_search_name, second_search_name)) + log.info("【Searcher】%s 未检索到资源,尝试通过 %s 重新检索 ..." % (first_search_name, second_search_name)) + media_list = Searcher().search_medias(key_word=second_search_name, + filter_args=filter_args, + match_media=media_info, + in_from=SearchType.WEB) + # 清空缓存结果 + dbhepler = DbHelper() + dbhepler.delete_all_search_torrents() + # 结束进度 + search_process.end('search') + if len(media_list) == 0: + log.info("【Web】%s 未检索到任何资源" % content) + return 1, "%s 未检索到任何资源" % content + else: + log.info("【Web】共检索到 %s 个有效资源" % len(media_list)) + # 插入数据库 + media_list = sorted(media_list, key=lambda x: "%s%s%s" % (str(x.res_order).rjust(3, '0'), + str(x.site_order).rjust(3, '0'), + str(x.seeders).rjust(10, '0')), reverse=True) + dbhepler.insert_search_results(media_items=media_list, + ident_flag=ident_flag, + title=content) + return 0, "" + + +def search_media_by_message(input_str, in_from: SearchType, user_id, user_name=None): + """ + 输入字符串,解析要求并进行资源检索 + :param input_str: 输入字符串,可以包括标题、年份、季、集的信息,使用空格隔开 + :param in_from: 搜索下载的请求来源 + :param user_id: 需要发送消息的,传入该参数,则只给对应用户发送交互消息 + :param user_name: 用户名称 + :return: 请求的资源是否全部下载完整、请求的文本对应识别出来的媒体信息、请求的资源如果是剧集,则返回下载后仍然缺失的季集信息 + """ + global SEARCH_MEDIA_TYPE + global SEARCH_MEDIA_CACHE + + if not input_str: + log.info("【Searcher】检索关键字有误!") + return + # 如果是数字,表示选择项 + if input_str.isdigit() and int(input_str) < 10: + # 获取之前保存的可选项 + choose = int(input_str) - 1 + if not SEARCH_MEDIA_CACHE.get(user_id) or \ + choose < 0 or choose >= len(SEARCH_MEDIA_CACHE.get(user_id)): + Message().send_channel_msg(channel=in_from, + title="输入有误!", + user_id=user_id) + log.warn("【Web】错误的输入值:%s" % input_str) + return + media_info = SEARCH_MEDIA_CACHE[user_id][choose] + if not SEARCH_MEDIA_TYPE.get(user_id) \ + or SEARCH_MEDIA_TYPE.get(user_id) == "SEARCH": + # 如果是豆瓣数据,需要重新查询TMDB的数据 + if media_info.douban_id: + _title = media_info.get_title_string() + # 先从网页抓取(含TMDBID) + doubaninfo = DouBan().get_media_detail_from_web(media_info.douban_id) + if doubaninfo and doubaninfo.get("imdbid"): + tmdbid = Media().get_tmdbid_by_imdbid(doubaninfo.get("imdbid")) + if tmdbid: + # 按IMDBID查询TMDB + media_info.set_tmdb_info(Media().get_tmdb_info(mtype=media_info.type, tmdbid=tmdbid)) + media_info.imdb_id = doubaninfo.get("imdbid") + else: + search_episode = media_info.begin_episode + media_info = Media().get_media_info(title="%s %s" % (media_info.title, media_info.year), + mtype=media_info.type, + strict=True) + media_info.begin_episode = search_episode + if not media_info or not media_info.tmdb_info: + Message().send_channel_msg(channel=in_from, + title="%s 从TMDB查询不到媒体信息!" % _title, + user_id=user_id) + return + # 搜索 + __search_media(in_from=in_from, + media_info=media_info, + user_id=user_id, + user_name=user_name) + else: + # 订阅 + __rss_media(in_from=in_from, + media_info=media_info, + user_id=user_id, + user_name=user_name) + # 接收到文本,开始查询可能的媒体信息供选择 + else: + if input_str.startswith("订阅"): + SEARCH_MEDIA_TYPE[user_id] = "SUBSCRIBE" + input_str = re.sub(r"订阅[::\s]*", "", input_str) + elif input_str.startswith("http") or input_str.startswith("magnet:"): + SEARCH_MEDIA_TYPE[user_id] = "DOWNLOAD" + else: + input_str = re.sub(r"(搜索|下载)[::\s]*", "", input_str) + SEARCH_MEDIA_TYPE[user_id] = "SEARCH" + + # 下载链接 + if SEARCH_MEDIA_TYPE[user_id] == "DOWNLOAD": + if input_str.startswith("http"): + # 检查是不是有这个站点 + site_info = Sites().get_sites(siteurl=input_str) + # 偿试下载种子文件 + filepath, content, retmsg = Torrent().save_torrent_file( + url=input_str, + cookie=site_info.get("cookie"), + ua=site_info.get("ua"), + proxy=site_info.get("proxy") + ) + # 下载种子出错 + if not content and retmsg: + Message().send_channel_msg(channel=in_from, + title=retmsg, + user_id=user_id) + return + if isinstance(content, str): + # 磁力链 + title = Torrent().get_magnet_title(content) + if title: + meta_info = Media().get_media_info(title=title) + else: + meta_info = MetaInfo(title="磁力链接") + meta_info.org_string = content + meta_info.set_torrent_info( + enclosure=content, + download_volume_factor=0, + upload_volume_factor=1 + ) + else: + # 识别文件名 + filename = os.path.basename(filepath) + # 识别 + meta_info = Media().get_media_info(title=filename) + meta_info.set_torrent_info( + enclosure=input_str + ) + else: + # 磁力链 + filepath = None + title = Torrent().get_magnet_title(input_str) + if title: + meta_info = Media().get_media_info(title=title) + else: + meta_info = MetaInfo(title="磁力链接") + meta_info.org_string = input_str + meta_info.set_torrent_info( + enclosure=input_str, + download_volume_factor=0, + upload_volume_factor=1 + ) + # 开始下载 + meta_info.user_name = user_name + state, retmsg = Downloader().download(media_info=meta_info, + torrent_file=filepath) + if state: + Message().send_download_message(in_from=in_from, + can_item=meta_info) + else: + Message().send_channel_msg(channel=in_from, + title=f"添加下载失败,{retmsg}", + user_id=user_id) + + # 搜索或订阅 + else: + # 获取字符串中可能的RSS站点列表 + rss_sites, content = StringUtils.get_idlist_from_string(input_str, + [{ + "id": site.get("name"), + "name": site.get("name") + } for site in Sites().get_sites(rss=True)]) + + # 索引器类型 + indexer_type = Indexer().get_client_type() + indexers = Indexer().get_indexers() + + # 获取字符串中可能的搜索站点列表 + if indexer_type == IndexerType.BUILTIN: + content = input_str + search_sites, _ = StringUtils.get_idlist_from_string(input_str, [{ + "id": indexer.name, + "name": indexer.name + } for indexer in indexers]) + else: + search_sites, content = StringUtils.get_idlist_from_string(content, [{ + "id": indexer.name, + "name": indexer.name + } for indexer in indexers]) + + # 获取字符串中可能的下载设置 + download_setting, content = StringUtils.get_idlist_from_string(content, [{ + "id": dl.get("id"), + "name": dl.get("name") + } for dl in Downloader().get_download_setting().values()]) + if download_setting: + download_setting = download_setting[0] + + # 识别媒体信息,列出匹配到的所有媒体 + log.info("【Web】正在识别 %s 的媒体信息..." % content) + if not content: + Message().send_channel_msg(channel=in_from, + title="无法识别搜索内容!", + user_id=user_id) + return + + # 搜索名称 + medias = WebUtils.search_media_infos( + keyword=content + ) + if not medias: + # 查询不到媒体信息 + Message().send_channel_msg(channel=in_from, + title="%s 查询不到媒体信息!" % content, + user_id=user_id) + return + + # 保存识别信息到临时结果中,由于消息长度限制只取前8条 + SEARCH_MEDIA_CACHE[user_id] = [] + for meta_info in medias[:8]: + # 合并站点和下载设置信息 + meta_info.rss_sites = rss_sites + meta_info.search_sites = search_sites + meta_info.set_download_info(download_setting=download_setting) + SEARCH_MEDIA_CACHE[user_id].append(meta_info) + + if 1 == len(SEARCH_MEDIA_CACHE[user_id]): + # 只有一条数据,直接开始搜索 + media_info = SEARCH_MEDIA_CACHE[user_id][0] + if not SEARCH_MEDIA_TYPE.get(user_id) \ + or SEARCH_MEDIA_TYPE.get(user_id) == "SEARCH": + # 如果是豆瓣数据,需要重新查询TMDB的数据 + if media_info.douban_id: + _title = media_info.get_title_string() + media_info = Media().get_media_info(title="%s %s" % (media_info.title, media_info.year), + mtype=media_info.type, strict=True) + if not media_info or not media_info.tmdb_info: + Message().send_channel_msg(channel=in_from, + title="%s 从TMDB查询不到媒体信息!" % _title, + user_id=user_id) + return + # 发送消息 + Message().send_channel_msg(channel=in_from, + title=media_info.get_title_vote_string(), + text=media_info.get_overview_string(), + image=media_info.get_message_image(), + url=media_info.get_detail_url(), + user_id=user_id) + # 开始搜索 + __search_media(in_from=in_from, + media_info=media_info, + user_id=user_id, + user_name=user_name) + else: + # 添加订阅 + __rss_media(in_from=in_from, + media_info=media_info, + user_id=user_id, + user_name=user_name) + else: + # 发送消息通知选择 + Message().send_channel_list_msg(channel=in_from, + title="共找到%s条相关信息,请回复对应序号" % len( + SEARCH_MEDIA_CACHE[user_id]), + medias=SEARCH_MEDIA_CACHE[user_id], + user_id=user_id) + + +def __search_media(in_from, media_info, user_id, user_name=None): + """ + 开始搜索和发送消息 + """ + # 检查是否存在,电视剧返回不存在的集清单 + exist_flag, no_exists, messages = Downloader().check_exists_medias(meta_info=media_info) + if messages: + Message().send_channel_msg(channel=in_from, + title="\n".join(messages), + user_id=user_id) + # 已经存在 + if exist_flag: + return + + # 开始检索 + Message().send_channel_msg(channel=in_from, + title="开始检索 %s ..." % media_info.title, + user_id=user_id) + search_result, no_exists, search_count, download_count = Searcher().search_one_media(media_info=media_info, + in_from=in_from, + no_exists=no_exists, + sites=media_info.search_sites, + user_name=user_name) + # 没有搜索到数据 + if not search_count: + Message().send_channel_msg(channel=in_from, + title="%s 未搜索到任何资源" % media_info.title, + user_id=user_id) + else: + # 搜索到了但是没开自动下载 + if download_count is None: + Message().send_channel_msg(channel=in_from, + title="%s 共搜索到%s个资源,点击选择下载" % (media_info.title, search_count), + image=media_info.get_message_image(), + url="search", + user_id=user_id) + return + else: + # 搜索到了但是没下载到数据 + if download_count == 0: + Message().send_channel_msg(channel=in_from, + title="%s 共搜索到%s个结果,但没有下载到任何资源" % ( + media_info.title, search_count), + user_id=user_id) + # 没有下载完成,且打开了自动添加订阅 + if not search_result and Config().get_config('pt').get('search_no_result_rss'): + # 添加订阅 + __rss_media(in_from=in_from, + media_info=media_info, + user_id=user_id, + state='R', + user_name=user_name) + + +def __rss_media(in_from, media_info, user_id=None, state='D', user_name=None): + """ + 开始添加订阅和发送消息 + """ + # 添加订阅 + if media_info.douban_id: + code, msg, media_info = Subscribe().add_rss_subscribe(mtype=media_info.type, + name=media_info.title, + year=media_info.year, + season=media_info.begin_season, + mediaid=f"DB:{media_info.douban_id}", + state=state, + rss_sites=media_info.rss_sites, + search_sites=media_info.search_sites) + else: + code, msg, media_info = Subscribe().add_rss_subscribe(mtype=media_info.type, + name=media_info.title, + year=media_info.year, + season=media_info.begin_season, + mediaid=media_info.tmdb_id, + state=state, + rss_sites=media_info.rss_sites, + search_sites=media_info.search_sites) + if code == 0: + log.info("【Web】%s %s 已添加订阅" % (media_info.type.value, media_info.get_title_string())) + if in_from in Message().get_search_types(): + media_info.user_name = user_name + Message().send_rss_success_message(in_from=in_from, + media_info=media_info) + else: + if in_from in Message().get_search_types(): + log.info("【Web】%s 添加订阅失败:%s" % (media_info.title, msg)) + Message().send_channel_msg(channel=in_from, + title="%s 添加订阅失败:%s" % (media_info.title, msg), + user_id=user_id) diff --git a/web/backend/user.py b/web/backend/user.py new file mode 100644 index 0000000..9acd1c8 --- /dev/null +++ b/web/backend/user.py @@ -0,0 +1,69 @@ +from flask_login import UserMixin +from werkzeug.security import check_password_hash + +from app.helper import DbHelper +from config import Config + + +class User(UserMixin): + """ + 用户 + """ + dbhelper = None + admin_users = [] + + def __init__(self, user=None): + self.dbhelper = DbHelper() + if user: + self.id = user.get('id') + self.username = user.get('name') + self.password_hash = user.get('password') + self.pris = user.get('pris') + self.admin_users = [{ + "id": 0, + "name": Config().get_config('app').get('login_user'), + "password": Config().get_config('app').get('login_password')[6:], + "pris": "我的媒体库,资源搜索,探索,站点管理,订阅管理,下载管理,媒体整理,服务,系统设置" + }] + + def verify_password(self, password): + """ + 验证密码 + """ + if self.password_hash is None: + return False + return check_password_hash(self.password_hash, password) + + def get_id(self): + """ + 获取用户ID + """ + return self.id + + def get(self, user_id): + """ + 根据用户ID获取用户实体,为 login_user 方法提供支持 + """ + if user_id is None: + return None + for user in self.admin_users: + if user.get('id') == user_id: + return User(user) + for user in self.dbhelper.get_users(): + if not user: + continue + if user.ID == user_id: + return User({"id": user.ID, "name": user.NAME, "password": user.PASSWORD, "pris": user.PRIS}) + return None + + def get_user(self, user_name): + """ + 根据用户名获取用户对像 + """ + for user in self.admin_users: + if user.get("name") == user_name: + return User(user) + for user in self.dbhelper.get_users(): + if user.NAME == user_name: + return User({"id": user.ID, "name": user.NAME, "password": user.PASSWORD, "pris": user.PRIS}) + return None diff --git a/web/backend/wallpaper.py b/web/backend/wallpaper.py new file mode 100644 index 0000000..2a64b5c --- /dev/null +++ b/web/backend/wallpaper.py @@ -0,0 +1,49 @@ +import base64 +import datetime +from functools import lru_cache + +from app.media import Media +from app.utils import RequestUtils, ExceptionUtils +from config import Config + + +@lru_cache(maxsize=1) +def get_login_wallpaper(today=datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d')): + """ + 获取Base64编码的壁纸图片 + """ + wallpaper = Config().get_config('app').get('wallpaper') + tmdbkey = Config().get_config('app').get('rmt_tmdbkey') + if (not wallpaper or wallpaper == "themoviedb") and tmdbkey: + img_url = __get_themoviedb_wallpaper(today) + else: + img_url = __get_bing_wallpaper(today) + if img_url: + res = RequestUtils().get_res(img_url) + if res and res.status_code == 200: + return base64.b64encode(res.content).decode() + return "" + + +def __get_themoviedb_wallpaper(today): + """ + 获取TheMovieDb的随机背景图 + """ + return Media().get_random_discover_backdrop() + + +def __get_bing_wallpaper(today): + """ + 获取Bing每日壁纸 + """ + url = "https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&today=%s" % today + try: + resp = RequestUtils(timeout=5).get_res(url) + except Exception as err: + ExceptionUtils.exception_traceback(err) + return "" + if resp and resp.status_code == 200: + if resp.json(): + for image in resp.json().get('images') or []: + return f"https://cn.bing.com{image.get('url')}" + return "" diff --git a/web/backend/web_utils.py b/web/backend/web_utils.py new file mode 100644 index 0000000..f333b20 --- /dev/null +++ b/web/backend/web_utils.py @@ -0,0 +1,157 @@ +import cn2an + +from app.media import Media, Bangumi, DouBan +from app.media.meta import MetaInfo +from app.utils import StringUtils, ExceptionUtils, SystemUtils, RequestUtils +from app.utils.types import MediaType +from config import Config +from version import APP_VERSION + + +class WebUtils: + + @staticmethod + def get_location(ip): + """ + 根据IP址查询真实地址 + """ + url = 'https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?co=&resource_id=6006&t=1529895387942&ie=utf8' \ + '&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&' \ + 'cb=jQuery110203920624944751099_1529894588086&_=1529894588088&query=%s' % ip + r = RequestUtils().get_res(url) + r.encoding = 'gbk' + html = r.text + try: + c1 = html.split('location":"')[1] + c2 = c1.split('","')[0] + return c2 + except Exception as err: + ExceptionUtils.exception_traceback(err) + return "" + + @staticmethod + def get_current_version(): + """ + 获取当前版本号 + """ + commit_id = SystemUtils.execute('git rev-parse HEAD') + if commit_id and len(commit_id) > 7: + commit_id = commit_id[:7] + return "%s %s" % (APP_VERSION, commit_id) + + @staticmethod + def get_latest_version(): + """ + 获取最新版本号 + """ + try: + version_res = RequestUtils(proxies=Config().get_proxies()).get_res( + "https://api.github.com/repos/NAStool/nas-tools/releases/latest") + commit_res = RequestUtils(proxies=Config().get_proxies()).get_res( + "https://api.github.com/repos/NAStool/nas-tools/commits/master") + if version_res and commit_res: + ver_json = version_res.json() + commit_json = commit_res.json() + version = f"{ver_json['tag_name']} {commit_json['sha'][:7]}" + url = ver_json["html_url"] + return version, url, True + except Exception as e: + ExceptionUtils.exception_traceback(e) + return None, None, False + + @staticmethod + def get_mediainfo_from_id(mtype, mediaid): + """ + 根据TMDB/豆瓣/BANGUMI获取媒体信息 + """ + if not mediaid: + return None + media_info = None + if str(mediaid).startswith("DB:"): + # 豆瓣 + doubanid = mediaid[3:] + info = DouBan().get_douban_detail(doubanid=doubanid, mtype=mtype) + if not info: + return None + title = info.get("title") + original_title = info.get("original_title") + year = info.get("year") + if original_title: + media_info = Media().get_media_info(title=f"{original_title} {year}", + mtype=mtype, + append_to_response="all") + if not media_info or not media_info.tmdb_info: + media_info = Media().get_media_info(title=f"{title} {year}", + mtype=mtype, + append_to_response="all") + media_info.douban_id = doubanid + elif str(mediaid).startswith("BG:"): + # BANGUMI + bangumiid = str(mediaid)[3:] + info = Bangumi().detail(bid=bangumiid) + if not info: + return None + title = info.get("name") + title_cn = info.get("name_cn") + year = info.get("date")[:4] if info.get("date") else "" + media_info = Media().get_media_info(title=f"{title} {year}", + mtype=MediaType.TV, + append_to_response="all") + if not media_info or not media_info.tmdb_info: + media_info = Media().get_media_info(title=f"{title_cn} {year}", + mtype=MediaType.TV, + append_to_response="all") + else: + # TMDB + info = Media().get_tmdb_info(tmdbid=mediaid, + mtype=mtype, + append_to_response="all") + if not info: + return None + media_info = MetaInfo(title=info.get("title") if mtype == MediaType.MOVIE else info.get("name")) + media_info.set_tmdb_info(info) + + return media_info + + @staticmethod + def search_media_infos(keyword, source=None, page=1): + """ + 搜索TMDB或豆瓣词条 + :param: keyword 关键字 + :param: source 渠道 tmdb/douban + :param: season 季号 + :param: episode 集号 + """ + if not keyword: + return [] + mtype, key_word, season_num, episode_num, _, content = StringUtils.get_keyword_from_string(keyword) + if source == "tmdb": + use_douban_titles = False + elif source == "douban": + use_douban_titles = True + else: + use_douban_titles = Config().get_config("laboratory").get("use_douban_titles") + if use_douban_titles: + medias = DouBan().search_douban_medias(keyword=key_word, + mtype=mtype, + season=season_num, + episode=episode_num, + page=page) + else: + meta_info = MetaInfo(title=content) + tmdbinfos = Media().get_tmdb_infos(title=meta_info.get_name(), + year=meta_info.year, + mtype=mtype, + page=page) + medias = [] + for tmdbinfo in tmdbinfos: + tmp_info = MetaInfo(title=keyword) + tmp_info.set_tmdb_info(tmdbinfo) + if meta_info.type != MediaType.MOVIE and tmp_info.type == MediaType.MOVIE: + continue + if tmp_info.begin_season: + tmp_info.title = "%s 第%s季" % (tmp_info.title, cn2an.an2cn(meta_info.begin_season, mode='low')) + if tmp_info.begin_episode: + tmp_info.title = "%s 第%s集" % (tmp_info.title, meta_info.begin_episode) + medias.append(tmp_info) + return medias diff --git a/web/main.py b/web/main.py new file mode 100644 index 0000000..ecf6e02 --- /dev/null +++ b/web/main.py @@ -0,0 +1,1760 @@ +import base64 +import datetime +import os.path +import re +import shutil +import sqlite3 +import time +import traceback +import urllib +import xml.dom.minidom +from functools import wraps +from math import floor +from pathlib import Path +from threading import Lock +from urllib import parse + +from flask import Flask, request, json, render_template, make_response, session, send_from_directory, send_file +from flask_compress import Compress +from flask_login import LoginManager, login_user, login_required, current_user + +import log +from app.brushtask import BrushTask +from app.conf import ModuleConf, SystemConfig +from app.downloader import Downloader +from app.filter import Filter +from app.helper import SecurityHelper, MetaHelper, ChromeHelper, ThreadHelper +from app.indexer import Indexer +from app.media.meta import MetaInfo +from app.mediaserver import WebhookEvent +from app.message import Message +from app.rsschecker import RssChecker +from app.sites import Sites, SiteUserInfo +from app.speedlimiter import SpeedLimiter +from app.subscribe import Subscribe +from app.sync import Sync +from app.torrentremover import TorrentRemover +from app.utils import DomUtils, SystemUtils, ExceptionUtils, StringUtils +from app.utils.types import * +from config import PT_TRANSFER_INTERVAL, Config +from web.action import WebAction +from web.apiv1 import apiv1_bp +from web.backend.WXBizMsgCrypt3 import WXBizMsgCrypt +from web.backend.user import User +from web.backend.wallpaper import get_login_wallpaper +from web.backend.web_utils import WebUtils +from web.security import require_auth + +# 配置文件锁 +ConfigLock = Lock() + +# Flask App +App = Flask(__name__) +App.config['JSON_AS_ASCII'] = False +App.secret_key = os.urandom(24) +App.permanent_session_lifetime = datetime.timedelta(days=30) + +# 启用压缩 +Compress(App) + +# 登录管理模块 +LoginManager = LoginManager() +LoginManager.login_view = "login" +LoginManager.init_app(App) + +# API注册 +App.register_blueprint(apiv1_bp, url_prefix="/api/v1") + + +@App.after_request +def add_header(r): + """ + 统一添加Http头,标用缓存,避免Flask多线程+Chrome内核会发生的静态资源加载出错的问题 + r.headers["Cache-Control"] = "no-cache, no-store, max-age=0" + r.headers["Pragma"] = "no-cache" + r.headers["Expires"] = "0" + """ + return r + + +# 定义获取登录用户的方法 +@LoginManager.user_loader +def load_user(user_id): + return User().get(user_id) + + +# 页面不存在 +@App.errorhandler(404) +def page_not_found(error): + return render_template("404.html", error=error), 404 + + +# 服务错误 +@App.errorhandler(500) +def page_server_error(error): + return render_template("500.html", error=error), 500 + + +def action_login_check(func): + """ + Action安全认证 + """ + + @wraps(func) + def login_check(*args, **kwargs): + if not current_user.is_authenticated: + return {"code": -1, "msg": "用户未登录"} + return func(*args, **kwargs) + + return login_check + + +# 主页面 +@App.route('/', methods=['GET', 'POST']) +def login(): + def redirect_to_navigation(userinfo): + """ + 跳转到导航页面 + """ + # 判断当前的运营环境 + SystemFlag = SystemUtils.get_system() + SyncMod = Config().get_config('pt').get('rmt_mode') + TMDBFlag = 1 if Config().get_config('app').get('rmt_tmdbkey') else 0 + if not SyncMod: + SyncMod = "link" + RmtModeDict = WebAction().get_rmt_modes() + RestypeDict = ModuleConf.TORRENT_SEARCH_PARAMS.get("restype") + PixDict = ModuleConf.TORRENT_SEARCH_PARAMS.get("pix") + SiteFavicons = Sites().get_site_favicon() + Indexers = Indexer().get_indexers() + SearchSource = "douban" if Config().get_config("laboratory").get("use_douban_titles") else "tmdb" + CustomScriptCfg = SystemConfig().get_system_config("CustomScript") + return render_template('navigation.html', + GoPage=GoPage, + UserName=userinfo.username, + UserPris=str(userinfo.pris).split(","), + SystemFlag=SystemFlag.value, + TMDBFlag=TMDBFlag, + AppVersion=WebUtils.get_current_version(), + RestypeDict=RestypeDict, + PixDict=PixDict, + SyncMod=SyncMod, + SiteFavicons=SiteFavicons, + RmtModeDict=RmtModeDict, + Indexers=Indexers, + SearchSource=SearchSource, + CustomScriptCfg=CustomScriptCfg) + + def redirect_to_login(errmsg=''): + """ + 跳转到登录页面 + """ + return render_template('login.html', + GoPage=GoPage, + LoginWallpaper=get_login_wallpaper(), + err_msg=errmsg) + + # 登录认证 + if request.method == 'GET': + GoPage = request.args.get("next") or "" + if GoPage.startswith('/'): + GoPage = GoPage[1:] + if current_user.is_authenticated: + userid = current_user.id + username = current_user.username + if userid is None or username is None: + return redirect_to_login() + else: + # 登录成功 + return redirect_to_navigation(User().get_user(username)) + else: + return redirect_to_login() + + else: + GoPage = request.form.get('next') or "" + if GoPage.startswith('/'): + GoPage = GoPage[1:] + username = request.form.get('username') + password = request.form.get('password') + remember = request.form.get('remember') + if not username: + return redirect_to_login('请输入用户名') + user_info = User().get_user(username) + if not user_info: + return redirect_to_login('用户名或密码错误') + # 校验密码 + if user_info.verify_password(password): + # 创建用户 Session + login_user(user_info) + session.permanent = True if remember else False + # 登录成功 + return redirect_to_navigation(user_info) + else: + return redirect_to_login('用户名或密码错误') + + +# 开始 +@App.route('/index', methods=['POST', 'GET']) +@login_required +def index(): + # 媒体服务器类型 + MSType = Config().get_config('media').get('media_server') + # 获取媒体数量 + MediaCounts = WebAction().get_library_mediacount() + if MediaCounts.get("code") == 0: + ServerSucess = True + else: + ServerSucess = False + + # 获得活动日志 + Activity = WebAction().get_library_playhistory().get("result") + + # 磁盘空间 + LibrarySpaces = WebAction().get_library_spacesize() + + # 转移历史统计 + TransferStatistics = WebAction().get_transfer_statistics() + + return render_template("index.html", + ServerSucess=ServerSucess, + MediaCount={'MovieCount': MediaCounts.get("Movie"), + 'SeriesCount': MediaCounts.get("Series"), + 'SongCount': MediaCounts.get("Music"), + "EpisodeCount": MediaCounts.get("Episodes")}, + Activitys=Activity, + UserCount=MediaCounts.get("User"), + FreeSpace=LibrarySpaces.get("FreeSpace"), + TotalSpace=LibrarySpaces.get("TotalSpace"), + UsedSapce=LibrarySpaces.get("UsedSapce"), + UsedPercent=LibrarySpaces.get("UsedPercent"), + MovieChartLabels=TransferStatistics.get("MovieChartLabels"), + TvChartLabels=TransferStatistics.get("TvChartLabels"), + MovieNums=TransferStatistics.get("MovieNums"), + TvNums=TransferStatistics.get("TvNums"), + AnimeNums=TransferStatistics.get("AnimeNums"), + MediaServerType=MSType + ) + + +# 资源搜索页面 +@App.route('/search', methods=['POST', 'GET']) +@login_required +def search(): + # 权限 + if current_user.is_authenticated: + username = current_user.username + pris = User().get_user(username).get("pris") + else: + pris = "" + # 结果 + res = WebAction().get_search_result() + SearchResults = res.get("result") + Count = res.get("total") + return render_template("search.html", + UserPris=str(pris).split(","), + Count=Count, + Results=SearchResults, + SiteDict=Indexer().get_indexer_hash_dict(), + UPCHAR=chr(8593)) + + +# 电影订阅页面 +@App.route('/movie_rss', methods=['POST', 'GET']) +@login_required +def movie_rss(): + RssItems = WebAction().get_movie_rss_list().get("result") + RuleGroups = {str(group["id"]): group["name"] for group in Filter().get_rule_groups()} + DownloadSettings = Downloader().get_download_setting() + return render_template("rss/movie_rss.html", + Count=len(RssItems), + RuleGroups=RuleGroups, + DownloadSettings=DownloadSettings, + Items=RssItems + ) + + +# 电视剧订阅页面 +@App.route('/tv_rss', methods=['POST', 'GET']) +@login_required +def tv_rss(): + RssItems = WebAction().get_tv_rss_list().get("result") + RuleGroups = {str(group["id"]): group["name"] for group in Filter().get_rule_groups()} + DownloadSettings = Downloader().get_download_setting() + return render_template("rss/tv_rss.html", + Count=len(RssItems), + RuleGroups=RuleGroups, + DownloadSettings=DownloadSettings, + Items=RssItems + ) + + +# 订阅历史页面 +@App.route('/rss_history', methods=['POST', 'GET']) +@login_required +def rss_history(): + mtype = request.args.get("t") + RssHistory = WebAction().get_rss_history({"type": mtype}).get("result") + return render_template("rss/rss_history.html", + Count=len(RssHistory), + Items=RssHistory, + Type=mtype + ) + + +# 订阅日历页面 +@App.route('/rss_calendar', methods=['POST', 'GET']) +@login_required +def rss_calendar(): + Today = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d') + # 电影订阅 + RssMovieItems = [ + { + "tmdbid": movie.get("tmdbid"), + "rssid": movie.get("id") + } for movie in Subscribe().get_subscribe_movies().values() if movie.get("tmdbid") + ] + # 电视剧订阅 + RssTvItems = [ + { + "id": tv.get("tmdbid"), + "rssid": tv.get("id"), + "season": int(str(tv.get('season')).replace("S", "")), + "name": tv.get("name"), + } for tv in Subscribe().get_subscribe_tvs().values() if tv.get('season') and tv.get("tmdbid") + ] + # 自定义订阅 + RssTvItems += RssChecker().get_userrss_mediainfos() + # 电视剧订阅去重 + Uniques = set() + UniqueTvItems = [] + for item in RssTvItems: + unique = f"{item.get('id')}_{item.get('season')}" + if unique not in Uniques: + Uniques.add(unique) + UniqueTvItems.append(item) + return render_template("rss/rss_calendar.html", + Today=Today, + RssMovieItems=RssMovieItems, + RssTvItems=UniqueTvItems) + + +# 站点维护页面 +@App.route('/site', methods=['POST', 'GET']) +@login_required +def sites(): + CfgSites = Sites().get_sites() + RuleGroups = {str(group["id"]): group["name"] for group in Filter().get_rule_groups()} + DownloadSettings = {did: attr["name"] for did, attr in Downloader().get_download_setting().items()} + ChromeOk = ChromeHelper().get_status() + CookieCloudCfg = SystemConfig().get_system_config('CookieCloud') + CookieUserInfoCfg = SystemConfig().get_system_config('CookieUserInfo') + return render_template("site/site.html", + Sites=CfgSites, + RuleGroups=RuleGroups, + DownloadSettings=DownloadSettings, + ChromeOk=ChromeOk, + CookieCloudCfg=CookieCloudCfg, + CookieUserInfoCfg=CookieUserInfoCfg) + + +# 站点列表页面 +@App.route('/sitelist', methods=['POST', 'GET']) +@login_required +def sitelist(): + IndexerSites = Indexer().get_builtin_indexers(check=False, public=False) + return render_template("site/sitelist.html", + Sites=IndexerSites, + Count=len(IndexerSites)) + + +# 站点资源页面 +@App.route('/resources', methods=['POST', 'GET']) +@login_required +def resources(): + site_id = request.args.get("site") + site_name = request.args.get("title") + page = request.args.get("page") or 0 + keyword = request.args.get("keyword") + Results = WebAction().action("list_site_resources", {"id": site_id, "page": page, "keyword": keyword}).get( + "data") or [] + return render_template("site/resources.html", + Results=Results, + SiteId=site_id, + Title=site_name, + KeyWord=keyword, + TotalCount=len(Results), + PageRange=range(0, 10), + CurrentPage=int(page), + TotalPage=10) + + +# 推荐页面 +@App.route('/recommend', methods=['POST', 'GET']) +@login_required +def recommend(): + Type = request.args.get("type") or "" + SubType = request.args.get("subtype") or "" + Title = request.args.get("title") or "" + SubTitle = request.args.get("subtitle") or "" + CurrentPage = request.args.get("page") or 1 + Week = request.args.get("week") or "" + TmdbId = request.args.get("tmdbid") or "" + PersonId = request.args.get("personid") or "" + Keyword = request.args.get("keyword") or "" + Source = request.args.get("source") or "" + FilterKey = request.args.get("filter") or "" + Params = json.loads(request.args.get("params")) if request.args.get("params") else {} + return render_template("discovery/recommend.html", + Type=Type, + SubType=SubType, + Title=Title, + CurrentPage=CurrentPage, + Week=Week, + TmdbId=TmdbId, + PersonId=PersonId, + SubTitle=SubTitle, + Keyword=Keyword, + Source=Source, + Filter=FilterKey, + FilterConf=ModuleConf.DISCOVER_FILTER_CONF.get(FilterKey) if FilterKey else {}, + Params=Params) + + +# 推荐页面 +@App.route('/ranking', methods=['POST', 'GET']) +@login_required +def ranking(): + return render_template("discovery/ranking.html", + DiscoveryType="RANKING") + + +# 豆瓣电影 +@App.route('/douban_movie', methods=['POST', 'GET']) +@login_required +def douban_movie(): + return render_template("discovery/recommend.html", + Type="DOUBANTAG", + SubType="MOV", + Title="豆瓣电影", + Filter="douban_movie", + FilterConf=ModuleConf.DISCOVER_FILTER_CONF.get('douban_movie')) + + +# 豆瓣电视剧 +@App.route('/douban_tv', methods=['POST', 'GET']) +@login_required +def douban_tv(): + return render_template("discovery/recommend.html", + Type="DOUBANTAG", + SubType="TV", + Title="豆瓣电视剧", + Filter="douban_tv", + FilterConf=ModuleConf.DISCOVER_FILTER_CONF.get('douban_tv')) + + +@App.route('/tmdb_movie', methods=['POST', 'GET']) +@login_required +def tmdb_movie(): + return render_template("discovery/recommend.html", + Type="DISCOVER", + SubType="MOV", + Title="TMDB电影", + Filter="tmdb_movie", + FilterConf=ModuleConf.DISCOVER_FILTER_CONF.get('tmdb_movie')) + + +@App.route('/tmdb_tv', methods=['POST', 'GET']) +@login_required +def tmdb_tv(): + return render_template("discovery/recommend.html", + Type="DISCOVER", + SubType="TV", + Title="TMDB电视剧", + Filter="tmdb_tv", + FilterConf=ModuleConf.DISCOVER_FILTER_CONF.get('tmdb_tv')) + + +# Bangumi每日放送 +@App.route('/bangumi', methods=['POST', 'GET']) +@login_required +def discovery_bangumi(): + return render_template("discovery/ranking.html", + DiscoveryType="BANGUMI") + + +# 媒体详情页面 +@App.route('/media_detail', methods=['POST', 'GET']) +@login_required +def media_detail(): + TmdbId = request.args.get("id") + Type = request.args.get("type") + return render_template("discovery/mediainfo.html", + TmdbId=TmdbId, + Type=Type) + + +# 演职人员页面 +@App.route('/discovery_person', methods=['POST', 'GET']) +@login_required +def discovery_person(): + TmdbId = request.args.get("tmdbid") + Title = request.args.get("title") + SubTitle = request.args.get("subtitle") + Type = request.args.get("type") + return render_template("discovery/person.html", + TmdbId=TmdbId, + Title=Title, + SubTitle=SubTitle, + Type=Type) + + +# 正在下载页面 +@App.route('/downloading', methods=['POST', 'GET']) +@login_required +def downloading(): + DispTorrents = WebAction().get_downloading().get("result") + return render_template("download/downloading.html", + DownloadCount=len(DispTorrents), + Torrents=DispTorrents, + Client=Config().get_config("pt").get("pt_client")) + + +# 近期下载页面 +@App.route('/downloaded', methods=['POST', 'GET']) +@login_required +def downloaded(): + CurrentPage = request.args.get("page") or 1 + return render_template("discovery/recommend.html", + Type='DOWNLOADED', + Title='近期下载', + CurrentPage=CurrentPage) + + +@App.route('/torrent_remove', methods=['POST', 'GET']) +@login_required +def torrent_remove(): + TorrentRemoveTasks = TorrentRemover().get_torrent_remove_tasks() + return render_template("download/torrent_remove.html", + DownloaderConfig=ModuleConf.TORRENTREMOVER_DICT, + Count=len(TorrentRemoveTasks), + TorrentRemoveTasks=TorrentRemoveTasks) + + +# 数据统计页面 +@App.route('/statistics', methods=['POST', 'GET']) +@login_required +def statistics(): + # 刷新单个site + refresh_site = request.args.getlist("refresh_site") + # 强制刷新所有 + refresh_force = True if request.args.get("refresh_force") else False + # 总上传下载 + TotalUpload = 0 + TotalDownload = 0 + TotalSeedingSize = 0 + TotalSeeding = 0 + # 站点标签及上传下载 + SiteNames = [] + SiteUploads = [] + SiteDownloads = [] + SiteRatios = [] + SiteErrs = {} + # 站点上传下载 + SiteData = SiteUserInfo().get_pt_date(specify_sites=refresh_site, force=refresh_force) + if isinstance(SiteData, dict): + for name, data in SiteData.items(): + if not data: + continue + up = data.get("upload", 0) + dl = data.get("download", 0) + ratio = data.get("ratio", 0) + seeding = data.get("seeding", 0) + seeding_size = data.get("seeding_size", 0) + err_msg = data.get("err_msg", "") + + SiteErrs.update({name: err_msg}) + + if not up and not dl and not ratio: + continue + if not str(up).isdigit() or not str(dl).isdigit(): + continue + if name not in SiteNames: + SiteNames.append(name) + TotalUpload += int(up) + TotalDownload += int(dl) + TotalSeeding += int(seeding) + TotalSeedingSize += int(seeding_size) + SiteUploads.append(int(up)) + SiteDownloads.append(int(dl)) + SiteRatios.append(round(float(ratio), 1)) + + # 近期上传下载各站点汇总 + CurrentUpload, CurrentDownload, _, _, _ = SiteUserInfo().get_pt_site_statistics_history( + days=2) + + # 站点用户数据 + SiteUserStatistics = WebAction().get_site_user_statistics({"encoding": "DICT"}).get("data") + + return render_template("site/statistics.html", + CurrentDownload=CurrentDownload, + CurrentUpload=CurrentUpload, + TotalDownload=TotalDownload, + TotalUpload=TotalUpload, + TotalSeedingSize=TotalSeedingSize, + TotalSeeding=TotalSeeding, + SiteDownloads=SiteDownloads, + SiteUploads=SiteUploads, + SiteRatios=SiteRatios, + SiteNames=SiteNames, + SiteErr=SiteErrs, + SiteUserStatistics=SiteUserStatistics) + + +# 刷流任务页面 +@App.route('/brushtask', methods=['POST', 'GET']) +@login_required +def brushtask(): + # 站点列表 + CfgSites = Sites().get_sites(brush=True) + # 下载器列表 + Downloaders = BrushTask().get_downloader_info() + # 任务列表 + Tasks = BrushTask().get_brushtask_info() + return render_template("site/brushtask.html", + Count=len(Tasks), + Sites=CfgSites, + Tasks=Tasks, + Downloaders=Downloaders) + + +# 自定义下载器页面 +@App.route('/userdownloader', methods=['POST', 'GET']) +@login_required +def userdownloader(): + downloaders = BrushTask().get_downloader_info() + return render_template("download/userdownloader.html", + Count=len(downloaders), + Downloaders=downloaders) + + +# 服务页面 +@App.route('/service', methods=['POST', 'GET']) +@login_required +def service(): + scheduler_cfg_list = [] + RuleGroups = Filter().get_rule_groups() + pt = Config().get_config('pt') + if pt: + # RSS订阅 + pt_check_interval = pt.get('pt_check_interval') + if str(pt_check_interval).isdigit(): + tim_rssdownload = str(round(int(pt_check_interval) / 60)) + " 分钟" + rss_state = 'ON' + else: + tim_rssdownload = "" + rss_state = 'OFF' + svg = ''' + + + + + + + ''' + + scheduler_cfg_list.append( + {'name': 'RSS订阅', 'time': tim_rssdownload, 'state': rss_state, 'id': 'rssdownload', 'svg': svg, + 'color': "blue"}) + + search_rss_interval = pt.get('search_rss_interval') + if str(search_rss_interval).isdigit(): + if int(search_rss_interval) < 6: + search_rss_interval = 6 + tim_rsssearch = str(int(search_rss_interval)) + " 小时" + rss_search_state = 'ON' + else: + tim_rsssearch = "" + rss_search_state = 'OFF' + + svg = ''' + + + + + + ''' + + scheduler_cfg_list.append( + {'name': '订阅搜索', 'time': tim_rsssearch, 'state': rss_search_state, 'id': 'subscribe_search_all', + 'svg': svg, + 'color': "blue"}) + + # 下载文件转移 + pt_monitor = pt.get('pt_monitor') + if pt_monitor: + tim_pttransfer = str(round(PT_TRANSFER_INTERVAL / 60)) + " 分钟" + sta_pttransfer = 'ON' + else: + tim_pttransfer = "" + sta_pttransfer = 'OFF' + svg = ''' + + + + + + + + ''' + scheduler_cfg_list.append( + {'name': '下载文件转移', 'time': tim_pttransfer, 'state': sta_pttransfer, 'id': 'pttransfer', 'svg': svg, + 'color': "green"}) + + # 删种 + torrent_remove_tasks = TorrentRemover().get_torrent_remove_tasks() + if torrent_remove_tasks: + sta_autoremovetorrents = 'ON' + svg = ''' + + + + + + + + + ''' + scheduler_cfg_list.append( + {'name': '自动删种', 'state': sta_autoremovetorrents, + 'id': 'autoremovetorrents', 'svg': svg, 'color': "twitter"}) + + # 自动签到 + tim_ptsignin = pt.get('ptsignin_cron') + if tim_ptsignin: + if str(tim_ptsignin).find(':') == -1: + tim_ptsignin = "%s 小时" % tim_ptsignin + sta_ptsignin = 'ON' + svg = ''' + + + + + + + ''' + scheduler_cfg_list.append( + {'name': '站点签到', 'time': tim_ptsignin, 'state': sta_ptsignin, 'id': 'ptsignin', 'svg': svg, + 'color': "facebook"}) + + # 目录同步 + sync_paths = Sync().get_sync_dirs() + if sync_paths: + sta_sync = 'ON' + svg = ''' + + + + + + ''' + scheduler_cfg_list.append( + {'name': '目录同步', 'time': '实时监控', 'state': sta_sync, 'id': 'sync', 'svg': svg, + 'color': "orange"}) + # 豆瓣同步 + douban_cfg = Config().get_config('douban') + if douban_cfg: + interval = douban_cfg.get('interval') + if interval: + interval = "%s 小时" % interval + sta_douban = "ON" + svg = ''' + + + + + + ''' + scheduler_cfg_list.append( + {'name': '豆瓣想看', 'time': interval, 'state': sta_douban, 'id': 'douban', 'svg': svg, + 'color': "pink"}) + + # 清理文件整理缓存 + svg = ''' + + + + + + ''' + scheduler_cfg_list.append( + {'name': '清理转移缓存', 'time': '手动', 'state': 'OFF', 'id': 'blacklist', 'svg': svg, 'color': 'red'}) + + # 清理RSS缓存 + svg = ''' + + + + + + ''' + scheduler_cfg_list.append( + {'name': '清理RSS缓存', 'time': '手动', 'state': 'OFF', 'id': 'rsshistory', 'svg': svg, 'color': 'purple'}) + + # 名称识别测试 + svg = ''' + + + + + + + ''' + scheduler_cfg_list.append( + {'name': '名称识别测试', 'time': '', 'state': 'OFF', 'id': 'nametest', 'svg': svg, 'color': 'lime'}) + + # 过滤规则测试 + svg = ''' + + + + + + + + + + + + + ''' + scheduler_cfg_list.append( + {'name': '过滤规则测试', 'time': '', 'state': 'OFF', 'id': 'ruletest', 'svg': svg, 'color': 'yellow'}) + + # 网络连通性测试 + svg = ''' + + + + + + + + + + + + ''' + targets = ModuleConf.NETTEST_TARGETS + scheduler_cfg_list.append( + {'name': '网络连通性测试', 'time': '', 'state': 'OFF', 'id': 'nettest', 'svg': svg, 'color': 'cyan', + "targets": targets}) + + # 备份 + svg = ''' + + + + + + ''' + scheduler_cfg_list.append( + {'name': '备份&恢复', 'time': '', 'state': 'OFF', 'id': 'backup', 'svg': svg, 'color': 'green'}) + return render_template("service.html", + Count=len(scheduler_cfg_list), + RuleGroups=RuleGroups, + SchedulerTasks=scheduler_cfg_list) + + +# 历史记录页面 +@App.route('/history', methods=['POST', 'GET']) +@login_required +def history(): + pagenum = request.args.get("pagenum") + keyword = request.args.get("s") or "" + current_page = request.args.get("page") + Result = WebAction().get_transfer_history({"keyword": keyword, "page": current_page, "pagenum": pagenum}) + if Result.get("totalPage") <= 5: + StartPage = 1 + EndPage = Result.get("totalPage") + else: + if Result.get("currentPage") <= 3: + StartPage = 1 + EndPage = 5 + elif Result.get("currentPage") >= Result.get("totalPage") - 2: + StartPage = Result.get("totalPage") - 4 + EndPage = Result.get("totalPage") + else: + StartPage = Result.get("currentPage") - 2 + if Result.get("totalPage") > Result.get("currentPage") + 2: + EndPage = Result.get("currentPage") + 2 + else: + EndPage = Result.get("totalPage") + PageRange = range(StartPage, EndPage + 1) + + return render_template("rename/history.html", + TotalCount=Result.get("total"), + Count=len(Result.get("result")), + Historys=Result.get("result"), + Search=keyword, + CurrentPage=Result.get("currentPage"), + TotalPage=Result.get("totalPage"), + PageRange=PageRange, + PageNum=Result.get("currentPage")) + + +# TMDB缓存页面 +@App.route('/tmdbcache', methods=['POST', 'GET']) +@login_required +def tmdbcache(): + page_num = request.args.get("pagenum") + if not page_num: + page_num = 30 + search_str = request.args.get("s") + if not search_str: + search_str = "" + current_page = request.args.get("page") + if not current_page: + current_page = 1 + else: + current_page = int(current_page) + total_count, tmdb_caches = MetaHelper().dump_meta_data(search_str, current_page, page_num) + + total_page = floor(total_count / page_num) + 1 + + if total_page <= 5: + start_page = 1 + end_page = total_page + else: + if current_page <= 3: + start_page = 1 + end_page = 5 + else: + start_page = current_page - 3 + if total_page > current_page + 3: + end_page = current_page + 3 + else: + end_page = total_page + + page_range = range(start_page, end_page + 1) + + return render_template("rename/tmdbcache.html", + TotalCount=total_count, + Count=len(tmdb_caches), + TmdbCaches=tmdb_caches, + Search=search_str, + CurrentPage=current_page, + TotalPage=total_page, + PageRange=page_range, + PageNum=page_num) + + +# 手工识别页面 +@App.route('/unidentification', methods=['POST', 'GET']) +@login_required +def unidentification(): + Items = WebAction().get_unknown_list().get("items") + return render_template("rename/unidentification.html", + TotalCount=len(Items), + Items=Items) + + +# 文件管理页面 +@App.route('/mediafile', methods=['POST', 'GET']) +@login_required +def mediafile(): + download_dirs = Downloader().get_download_visit_dirs() + if download_dirs: + try: + DirD = os.path.commonpath(download_dirs).replace("\\", "/") + except Exception as err: + print(str(err)) + DirD = "/" + else: + DirD = "/" + DirR = request.args.get("dir") + return render_template("rename/mediafile.html", + Dir=DirR or DirD) + + +# 基础设置页面 +@App.route('/basic', methods=['POST', 'GET']) +@login_required +def basic(): + proxy = Config().get_config('app').get("proxies", {}).get("http") + if proxy: + proxy = proxy.replace("http://", "") + RmtModeDict = WebAction().get_rmt_modes() + CustomScriptCfg = SystemConfig().get_system_config("CustomScript") + return render_template("setting/basic.html", + Config=Config().get_config(), + Proxy=proxy, + RmtModeDict=RmtModeDict, + CustomScriptCfg=CustomScriptCfg) + + +# 自定义识别词设置页面 +@App.route('/customwords', methods=['POST', 'GET']) +@login_required +def customwords(): + groups = WebAction().get_customwords().get("result") + return render_template("setting/customwords.html", + Groups=groups, + GroupsCount=len(groups)) + + +# 目录同步页面 +@App.route('/directorysync', methods=['POST', 'GET']) +@login_required +def directorysync(): + RmtModeDict = WebAction().get_rmt_modes() + SyncPaths = WebAction().get_directorysync().get("result") + return render_template("setting/directorysync.html", + SyncPaths=SyncPaths, + SyncCount=len(SyncPaths), + RmtModeDict=RmtModeDict) + + +# 豆瓣页面 +@App.route('/douban', methods=['POST', 'GET']) +@login_required +def douban(): + DoubanHistory = WebAction().get_douban_history().get("result") + return render_template("setting/douban.html", + Config=Config().get_config(), + HistoryCount=len(DoubanHistory), + DoubanHistory=DoubanHistory) + + +# 下载器页面 +@App.route('/downloader', methods=['POST', 'GET']) +@login_required +def downloader(): + return render_template("setting/downloader.html", + Config=Config().get_config(), + SpeedLimitConf=SystemConfig().get_system_config("SpeedLimit") or {}, + DownloaderConf=ModuleConf.DOWNLOADER_CONF) + + +# 下载设置页面 +@App.route('/download_setting', methods=['POST', 'GET']) +@login_required +def download_setting(): + DownloadSetting = Downloader().get_download_setting() + DefaultDownloadSetting = Downloader().get_default_download_setting() + Count = len(DownloadSetting) + return render_template("setting/download_setting.html", + DownloadSetting=DownloadSetting, + DefaultDownloadSetting=DefaultDownloadSetting, + DownloaderTypes=DownloaderType, + Count=Count) + + +# 索引器页面 +@App.route('/indexer', methods=['POST', 'GET']) +@login_required +def indexer(): + indexers = Indexer().get_builtin_indexers(check=False) + private_count = len([item.id for item in indexers if not item.public]) + public_count = len([item.id for item in indexers if item.public]) + return render_template("setting/indexer.html", + Config=Config().get_config(), + PrivateCount=private_count, + PublicCount=public_count, + Indexers=indexers, + IndexerConf=ModuleConf.INDEXER_CONF) + + +# 媒体库页面 +@App.route('/library', methods=['POST', 'GET']) +@login_required +def library(): + return render_template("setting/library.html", Config=Config().get_config()) + + +# 媒体服务器页面 +@App.route('/mediaserver', methods=['POST', 'GET']) +@login_required +def mediaserver(): + return render_template("setting/mediaserver.html", + Config=Config().get_config(), + MediaServerConf=ModuleConf.MEDIASERVER_CONF) + + +# 通知消息页面 +@App.route('/notification', methods=['POST', 'GET']) +@login_required +def notification(): + MessageClients = Message().get_message_client_info() + Channels = ModuleConf.MESSAGE_CONF.get("client") + Switchs = ModuleConf.MESSAGE_CONF.get("switch") + return render_template("setting/notification.html", + Channels=Channels, + Switchs=Switchs, + ClientCount=len(MessageClients), + MessageClients=MessageClients) + + +# 字幕设置页面 +@App.route('/subtitle', methods=['POST', 'GET']) +@login_required +def subtitle(): + ChromeOk = ChromeHelper().get_status() + return render_template("setting/subtitle.html", + Config=Config().get_config(), + ChromeOk=ChromeOk) + + +# 用户管理页面 +@App.route('/users', methods=['POST', 'GET']) +@login_required +def users(): + Users = WebAction().get_users().get("result") + return render_template("setting/users.html", Users=Users, UserCount=len(Users)) + + +# 过滤规则设置页面 +@App.route('/filterrule', methods=['POST', 'GET']) +@login_required +def filterrule(): + result = WebAction().get_filterrules() + return render_template("setting/filterrule.html", + Count=len(result.get("ruleGroups")), + RuleGroups=result.get("ruleGroups"), + Init_RuleGroups=result.get("initRules")) + + +# 自定义订阅页面 +@App.route('/user_rss', methods=['POST', 'GET']) +@login_required +def user_rss(): + Tasks = RssChecker().get_rsstask_info() + RssParsers = RssChecker().get_userrss_parser() + RuleGroups = {str(group["id"]): group["name"] for group in Filter().get_rule_groups()} + DownloadSettings = {did: attr["name"] for did, attr in Downloader().get_download_setting().items()} + RestypeDict = ModuleConf.TORRENT_SEARCH_PARAMS.get("restype") + PixDict = ModuleConf.TORRENT_SEARCH_PARAMS.get("pix") + return render_template("rss/user_rss.html", + Tasks=Tasks, + Count=len(Tasks), + RssParsers=RssParsers, + RuleGroups=RuleGroups, + RestypeDict=RestypeDict, + PixDict=PixDict, + DownloadSettings=DownloadSettings) + + +# RSS解析器页面 +@App.route('/rss_parser', methods=['POST', 'GET']) +@login_required +def rss_parser(): + RssParsers = RssChecker().get_userrss_parser() + return render_template("rss/rss_parser.html", + RssParsers=RssParsers, + Count=len(RssParsers)) + + +# 事件响应 +@App.route('/do', methods=['POST']) +@action_login_check +def do(): + try: + cmd = request.form.get("cmd") + data = request.form.get("data") + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": -1, "msg": str(e)} + if data: + data = json.loads(data) + return WebAction().action(cmd, data) + + +# 目录事件响应 +@App.route('/dirlist', methods=['POST']) +@login_required +def dirlist(): + r = ['
') + return make_response(''.join(r), 200) + + +# 禁止搜索引擎 +@App.route('/robots.txt', methods=['GET', 'POST']) +def robots(): + return send_from_directory("", "robots.txt") + + +# 响应企业微信消息 +@App.route('/wechat', methods=['GET', 'POST']) +def wechat(): + # 当前在用的交互渠道 + interactive_client = Message().get_interactive_client(SearchType.WX) + if not interactive_client: + return make_response("NAStool没有启用微信交互", 200) + conf = interactive_client.get("config") + sToken = conf.get('token') + sEncodingAESKey = conf.get('encodingAESKey') + sCorpID = conf.get('corpid') + if not sToken or not sEncodingAESKey or not sCorpID: + return + wxcpt = WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID) + sVerifyMsgSig = request.args.get("msg_signature") + sVerifyTimeStamp = request.args.get("timestamp") + sVerifyNonce = request.args.get("nonce") + + if request.method == 'GET': + if not sVerifyMsgSig and not sVerifyTimeStamp and not sVerifyNonce: + return "NAStool微信交互服务正常!
微信回调配置步聚:
1、在微信企业应用接收消息设置页面生成Token和EncodingAESKey并填入设置->消息通知->微信对应项,打开微信交互开关。
2、保存并重启本工具,保存并重启本工具,保存并重启本工具。
3、在微信企业应用接收消息设置页面输入此地址:http(s)://IP:PORT/wechat(IP、PORT替换为本工具的外网访问地址及端口,需要有公网IP并做好端口转发,最好有域名)。" + sVerifyEchoStr = request.args.get("echostr") + log.debug("收到微信验证请求: echostr= %s" % sVerifyEchoStr) + ret, sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr) + if ret != 0: + log.error("微信请求验证失败 VerifyURL ret: %s" % str(ret)) + # 验证URL成功,将sEchoStr返回给企业号 + return sEchoStr + else: + try: + sReqData = request.data + log.debug("收到微信消息:%s" % str(sReqData)) + ret, sMsg = wxcpt.DecryptMsg(sReqData, sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce) + if ret != 0: + log.error("解密微信消息失败 DecryptMsg ret = %s" % str(ret)) + return make_response("ok", 200) + # 解析XML报文 + """ + 1、消息格式: + + + + 1348831860 + + + 1234567890123456 + 1 + + 2、事件格式: + + + + 1348831860 + + + 1 + + """ + dom_tree = xml.dom.minidom.parseString(sMsg.decode('UTF-8')) + root_node = dom_tree.documentElement + # 消息类型 + msg_type = DomUtils.tag_value(root_node, "MsgType") + # 用户ID + user_id = DomUtils.tag_value(root_node, "FromUserName") + # 没的消息类型和用户ID的消息不要 + if not msg_type or not user_id: + log.info("收到微信心跳报文...") + return make_response("ok", 200) + # 解析消息内容 + content = "" + if msg_type == "event": + # 事件消息 + event_key = DomUtils.tag_value(root_node, "EventKey") + if event_key: + log.info("点击菜单:%s" % event_key) + keys = event_key.split('#') + if len(keys) > 2: + content = ModuleConf.WECHAT_MENU.get(keys[2]) + elif msg_type == "text": + # 文本消息 + content = DomUtils.tag_value(root_node, "Content", default="") + if content: + # 处理消息内容 + WebAction().handle_message_job(msg=content, + in_from=SearchType.WX, + user_id=user_id, + user_name=user_id) + return make_response(content, 200) + except Exception as err: + ExceptionUtils.exception_traceback(err) + log.error("微信消息处理发生错误:%s - %s" % (str(err), traceback.format_exc())) + return make_response("ok", 200) + + +# Plex Webhook +@App.route('/plex', methods=['POST']) +def plex_webhook(): + if not SecurityHelper().check_mediaserver_ip(request.remote_addr): + log.warn(f"非法IP地址的媒体服务器消息通知:{request.remote_addr}") + return '不允许的IP地址请求' + request_json = json.loads(request.form.get('payload', {})) + log.debug("收到Plex Webhook报文:%s" % str(request_json)) + ThreadHelper().start_thread(WebhookEvent().plex_action, (request_json,)) + ThreadHelper().start_thread(SpeedLimiter().plex_action, (request_json,)) + return 'Ok' + + +# Jellyfin Webhook +@App.route('/jellyfin', methods=['POST']) +def jellyfin_webhook(): + if not SecurityHelper().check_mediaserver_ip(request.remote_addr): + log.warn(f"非法IP地址的媒体服务器消息通知:{request.remote_addr}") + return '不允许的IP地址请求' + request_json = request.get_json() + log.debug("收到Jellyfin Webhook报文:%s" % str(request_json)) + ThreadHelper().start_thread(WebhookEvent().jellyfin_action, (request_json,)) + ThreadHelper().start_thread(SpeedLimiter().jellyfin_action, (request_json,)) + return 'Ok' + + +@App.route('/emby', methods=['POST']) +# Emby Webhook +def emby_webhook(): + if not SecurityHelper().check_mediaserver_ip(request.remote_addr): + log.warn(f"非法IP地址的媒体服务器消息通知:{request.remote_addr}") + return '不允许的IP地址请求' + request_json = json.loads(request.form.get('data', {})) + log.debug("收到Emby Webhook报文:%s" % str(request_json)) + ThreadHelper().start_thread(WebhookEvent().emby_action, (request_json,)) + ThreadHelper().start_thread(SpeedLimiter().emby_action, (request_json,)) + return 'Ok' + + +# Telegram消息响应 +@App.route('/telegram', methods=['POST', 'GET']) +def telegram(): + """ + { + 'update_id': , + 'message': { + 'message_id': , + 'from': { + 'id': , + 'is_bot': False, + 'first_name': '', + 'username': '', + 'language_code': 'zh-hans' + }, + 'chat': { + 'id': , + 'first_name': '', + 'username': '', + 'type': 'private' + }, + 'date': , + 'text': '' + } + } + """ + # 当前在用的交互渠道 + interactive_client = Message().get_interactive_client(SearchType.TG) + if not interactive_client: + return 'NAStool未启用Telegram交互' + msg_json = request.get_json() + if not SecurityHelper().check_telegram_ip(request.remote_addr): + log.error("收到来自 %s 的非法Telegram消息:%s" % (request.remote_addr, msg_json)) + return '不允许的IP地址请求' + if msg_json: + message = msg_json.get("message", {}) + text = message.get("text") + user_id = message.get("from", {}).get("id") + log.info("收到Telegram消息:from=%s, text=%s" % (user_id, text)) + # 获取用户名 + user_name = message.get("from", {}).get("username") + if text: + # 检查权限 + if text.startswith("/"): + if str(user_id) not in interactive_client.get("client").get_admin(): + Message().send_channel_msg(channel=SearchType.TG, + title="只有管理员才有权限执行此命令", + user_id=user_id) + return '只有管理员才有权限执行此命令' + else: + if not str(user_id) in interactive_client.get("client").get_users(): + message.send_channel_msg(channel=SearchType.TG, + title="你不在用户白名单中,无法使用此机器人", + user_id=user_id) + return '你不在用户白名单中,无法使用此机器人' + WebAction().handle_message_job(msg=text, + in_from=SearchType.TG, + user_id=user_id, + user_name=user_name) + return 'Ok' + + +# Synology Chat消息响应 +@App.route('/synology', methods=['POST', 'GET']) +def synology(): + """ + token: bot token + user_id + username + post_id + timestamp + text + """ + # 当前在用的交互渠道 + interactive_client = Message().get_interactive_client(SearchType.SYNOLOGY) + if not interactive_client: + return 'NAStool未启用Synology Chat交互' + msg_data = request.form + if not SecurityHelper().check_synology_ip(request.remote_addr): + log.error("收到来自 %s 的非法Synology Chat消息:%s" % (request.remote_addr, msg_data)) + return '不允许的IP地址请求' + if msg_data: + token = msg_data.get("token") + if not interactive_client.get("client").check_token(token): + log.error("收到来自 %s 的非法Synology Chat消息:token校验不通过!" % request.remote_addr) + return 'token校验不通过' + text = msg_data.get("text") + user_id = int(msg_data.get("user_id")) + log.info("收到Synology Chat消息:from=%s, text=%s" % (user_id, text)) + # 获取用户名 + user_name = msg_data.get("username") + if text: + WebAction().handle_message_job(msg=text, + in_from=SearchType.SYNOLOGY, + user_id=user_id, + user_name=user_name) + return 'Ok' + + +# Slack消息响应 +@App.route('/slack', methods=['POST']) +def slack(): + """ + # 消息 + { + 'client_msg_id': '', + 'type': 'message', + 'text': 'hello', + 'user': '', + 'ts': '1670143568.444289', + 'blocks': [{ + 'type': 'rich_text', + 'block_id': 'i2j+', + 'elements': [{ + 'type': 'rich_text_section', + 'elements': [{ + 'type': 'text', + 'text': 'hello' + }] + }] + }], + 'team': '', + 'client': '', + 'event_ts': '1670143568.444289', + 'channel_type': 'im' + } + # 快捷方式 + { + "type": "shortcut", + "token": "XXXXXXXXXXXXX", + "action_ts": "1581106241.371594", + "team": { + "id": "TXXXXXXXX", + "domain": "shortcuts-test" + }, + "user": { + "id": "UXXXXXXXXX", + "username": "aman", + "team_id": "TXXXXXXXX" + }, + "callback_id": "shortcut_create_task", + "trigger_id": "944799105734.773906753841.38b5894552bdd4a780554ee59d1f3638" + } + # 按钮点击 + { + "type": "block_actions", + "team": { + "id": "T9TK3CUKW", + "domain": "example" + }, + "user": { + "id": "UA8RXUSPL", + "username": "jtorrance", + "team_id": "T9TK3CUKW" + }, + "api_app_id": "AABA1ABCD", + "token": "9s8d9as89d8as9d8as989", + "container": { + "type": "message_attachment", + "message_ts": "1548261231.000200", + "attachment_id": 1, + "channel_id": "CBR2V3XEX", + "is_ephemeral": false, + "is_app_unfurl": false + }, + "trigger_id": "12321423423.333649436676.d8c1bb837935619ccad0f624c448ffb3", + "client": { + "id": "CBR2V3XEX", + "name": "review-updates" + }, + "message": { + "bot_id": "BAH5CA16Z", + "type": "message", + "text": "This content can't be displayed.", + "user": "UAJ2RU415", + "ts": "1548261231.000200", + ... + }, + "response_url": "https://hooks.slack.com/actions/AABA1ABCD/1232321423432/D09sSasdasdAS9091209", + "actions": [ + { + "action_id": "WaXA", + "block_id": "=qXel", + "text": { + "type": "plain_text", + "text": "View", + "emoji": true + }, + "value": "click_me_123", + "type": "button", + "action_ts": "1548426417.840180" + } + ] + } + """ + # 只有本地转发请求能访问 + if not SecurityHelper().check_slack_ip(request.remote_addr): + log.warn(f"非法IP地址的Slack消息通知:{request.remote_addr}") + return '不允许的IP地址请求' + + # 当前在用的交互渠道 + interactive_client = Message().get_interactive_client(SearchType.SLACK) + if not interactive_client: + return 'NAStool未启用Slack交互' + msg_json = request.get_json() + if msg_json: + if msg_json.get("type") == "message": + channel = msg_json.get("client") + text = msg_json.get("text") + username = "" + elif msg_json.get("type") == "block_actions": + channel = msg_json.get("client", {}).get("id") + text = msg_json.get("actions")[0].get("value") + username = msg_json.get("user", {}).get("name") + elif msg_json.get("type") == "event_callback": + channel = msg_json.get("event", {}).get("client") + text = re.sub(r"<@[0-9A-Z]+>", "", msg_json.get("event", {}).get("text"), flags=re.IGNORECASE).strip() + username = "" + elif msg_json.get("type") == "shortcut": + channel = "" + text = msg_json.get("callback_id") + username = msg_json.get("user", {}).get("username") + else: + return "Error" + WebAction().handle_message_job(msg=text, + in_from=SearchType.SLACK, + user_id=channel, + user_name=username) + return "Ok" + + +# Jellyseerr Overseerr订阅接口 +@App.route('/subscribe', methods=['POST', 'GET']) +@require_auth +def subscribe(): + """ + { + "notification_type": "{{notification_type}}", + "event": "{{event}}", + "subject": "{{subject}}", + "message": "{{message}}", + "image": "{{image}}", + "{{media}}": { + "media_type": "{{media_type}}", + "tmdbId": "{{media_tmdbid}}", + "tvdbId": "{{media_tvdbid}}", + "status": "{{media_status}}", + "status4k": "{{media_status4k}}" + }, + "{{request}}": { + "request_id": "{{request_id}}", + "requestedBy_email": "{{requestedBy_email}}", + "requestedBy_username": "{{requestedBy_username}}", + "requestedBy_avatar": "{{requestedBy_avatar}}" + }, + "{{issue}}": { + "issue_id": "{{issue_id}}", + "issue_type": "{{issue_type}}", + "issue_status": "{{issue_status}}", + "reportedBy_email": "{{reportedBy_email}}", + "reportedBy_username": "{{reportedBy_username}}", + "reportedBy_avatar": "{{reportedBy_avatar}}" + }, + "{{comment}}": { + "comment_message": "{{comment_message}}", + "commentedBy_email": "{{commentedBy_email}}", + "commentedBy_username": "{{commentedBy_username}}", + "commentedBy_avatar": "{{commentedBy_avatar}}" + }, + "{{extra}}": [] + } + """ + req_json = request.get_json() + if not req_json: + return make_response("非法请求!", 400) + notification_type = req_json.get("notification_type") + if notification_type not in ["MEDIA_APPROVED", "MEDIA_AUTO_APPROVED"]: + return make_response("ok", 200) + subject = req_json.get("subject") + media_type = MediaType.MOVIE if req_json.get("media", {}).get("media_type") == "movie" else MediaType.TV + tmdbId = req_json.get("media", {}).get("tmdbId") + if not media_type or not tmdbId or not subject: + return make_response("请求参数不正确!", 500) + # 添加订阅 + code = 0 + msg = "ok" + meta_info = MetaInfo(title=subject, mtype=media_type) + if media_type == MediaType.MOVIE: + code, msg, meta_info = Subscribe().add_rss_subscribe(mtype=media_type, + name=meta_info.get_name(), + year=meta_info.year, + mediaid=tmdbId) + meta_info.user_name = req_json.get("request", {}).get("requestedBy_username") + Message().send_rss_success_message(in_from=SearchType.API, + media_info=meta_info) + else: + seasons = [] + for extra in req_json.get("extra", []): + if extra.get("name") == "Requested Seasons": + seasons = [int(str(sea).strip()) for sea in extra.get("value").split(", ") if str(sea).isdigit()] + break + for season in seasons: + code, msg, meta_info = Subscribe().add_rss_subscribe(mtype=media_type, + name=meta_info.get_name(), + year=meta_info.year, + mediaid=tmdbId, + season=season) + Message().send_rss_success_message(in_from=SearchType.API, + media_info=meta_info) + if code == 0: + return make_response("ok", 200) + else: + return make_response(msg, 500) + + +# 备份配置文件 +@App.route('/backup', methods=['POST']) +@login_required +def backup(): + """ + 备份用户设置文件 + :return: 备份文件.zip_file + """ + try: + # 创建备份文件夹 + config_path = Path(Config().get_config_path()) + backup_file = f"bk_{time.strftime('%Y%m%d%H%M%S')}" + backup_path = config_path / "backup_file" / backup_file + backup_path.mkdir(parents=True) + # 把现有的相关文件进行copy备份 + shutil.copy(f'{config_path}/config.yaml', backup_path) + shutil.copy(f'{config_path}/default-category.yaml', backup_path) + shutil.copy(f'{config_path}/user.db', backup_path) + conn = sqlite3.connect(f'{backup_path}/user.db') + cursor = conn.cursor() + # 执行操作删除不需要备份的表 + table_list = [ + 'SEARCH_RESULT_INFO', + 'RSS_TORRENTS', + 'DOUBAN_MEDIAS', + 'TRANSFER_HISTORY', + 'TRANSFER_UNKNOWN', + 'TRANSFER_BLACKLIST', + 'SYNC_HISTORY', + 'DOWNLOAD_HISTORY', + 'alembic_version' + ] + for table in table_list: + cursor.execute(f"""DROP TABLE IF EXISTS {table};""") + conn.commit() + cursor.close() + conn.close() + zip_file = str(backup_path) + '.zip' + if os.path.exists(zip_file): + zip_file = str(backup_path) + '.zip' + shutil.make_archive(str(backup_path), 'zip', str(backup_path)) + shutil.rmtree(str(backup_path)) + except Exception as e: + ExceptionUtils.exception_traceback(e) + return make_response("创建备份失败", 400) + return send_file(zip_file) + + +# 上传文件到服务器 +@App.route('/upload', methods=['POST']) +@login_required +def upload(): + try: + files = request.files['file'] + temp_path = Config().get_temp_path() + if not os.path.exists(temp_path): + os.makedirs(temp_path) + file_path = Path(temp_path) / files.filename + files.save(str(file_path)) + return {"code": 0, "filepath": str(file_path)} + except Exception as e: + ExceptionUtils.exception_traceback(e) + return {"code": 1, "msg": str(e), "filepath": ""} + + +# base64模板过滤器 +@App.template_filter('b64encode') +def b64encode(s): + return base64.b64encode(s.encode()).decode() + + +# split模板过滤器 +@App.template_filter('split') +def split(string, char, pos): + return string.split(char)[pos] + + +# 刷流规则过滤器 +@App.template_filter('brush_rule_string') +def brush_rule_string(rules): + return WebAction.parse_brush_rule_string(rules) + + +# 大小格式化过滤器 +@App.template_filter('str_filesize') +def str_filesize(size): + return StringUtils.str_filesize(size, pre=1) + + +# MD5 HASH过滤器 +@App.template_filter('hash') +def md5_hash(text): + return StringUtils.md5_hash(text) diff --git a/web/robots.txt b/web/robots.txt new file mode 100644 index 0000000..1f53798 --- /dev/null +++ b/web/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/web/security.py b/web/security.py new file mode 100644 index 0000000..17d0818 --- /dev/null +++ b/web/security.py @@ -0,0 +1,118 @@ +import datetime +from functools import wraps + +import jwt +from flask import request + +from app.utils import TokenCache +from config import Config + + +def require_auth(func): + """ + API安全认证 + """ + + @wraps(func) + def wrapper(*args, **kwargs): + auth = request.headers.get("Authorization") + if auth: + auth = str(auth).split()[-1] + if auth == Config().get_config("security").get("api_key"): + return func(*args, **kwargs) + return { + "code": 401, + "success": False, + "message": "安全认证未通过,请检查ApiKey" + } + + return wrapper + + +def generate_access_token(username: str, algorithm: str = 'HS256', exp: float = 2): + """ + 生成access_token + :param username: 用户名(自定义部分) + :param algorithm: 加密算法 + :param exp: 过期时间,默认2小时 + :return:token + """ + + now = datetime.datetime.utcnow() + exp_datetime = now + datetime.timedelta(hours=exp) + access_payload = { + 'exp': exp_datetime, + 'iat': now, + 'username': username + } + access_token = jwt.encode(access_payload, + Config().get_config("security").get("api_key"), + algorithm=algorithm) + return access_token + + +def __decode_auth_token(token: str, algorithms='HS256'): + """ + 解密token + :param token:token字符串 + :return: 是否有效,playload + """ + key = Config().get_config("security").get("api_key") + try: + payload = jwt.decode(token, + key=key, + algorithms=algorithms) + except jwt.ExpiredSignatureError: + return False, jwt.decode(token, + key=key, + algorithms=algorithms, + options={'verify_exp': False}) + except (jwt.DecodeError, jwt.InvalidTokenError, jwt.ImmatureSignatureError): + return False, {} + else: + return True, payload + + +def identify(auth_header: str): + """ + 用户鉴权,返回是否有效、用户名 + """ + flag = False + if auth_header: + flag, payload = __decode_auth_token(auth_header) + if payload: + return flag, payload.get("username") or "" + return flag, "" + + +def login_required(func): + """ + 登录保护,验证用户是否登录 + :param func: + :return: + """ + + @wraps(func) + def wrapper(*args, **kwargs): + + def auth_failed(): + return { + "code": 403, + "success": False, + "message": "安全认证未通过,请检查Token" + } + + token = request.headers.get("Authorization", default=None) + if not token: + return auth_failed() + latest_token = TokenCache.get(token) + if not latest_token: + return auth_failed() + flag, username = identify(latest_token) + if not username: + return auth_failed() + if not flag and username: + TokenCache.set(token, generate_access_token(username)) + return func(*args, **kwargs) + + return wrapper diff --git a/web/static/.DS_Store b/web/static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..940e942902c4c95c53cc11d73aa9ce43019c31f2 GIT binary patch literal 6148 zcmeH~J!%6%427R!7lt%jx}3%b$PET#pTHMLVK4#Pfk0Bv(ew1vWSu%J;R&QS(yZ9s zuh>}uu>I%x1(*PA=&sm#n3*wO;SD!jzD^(a>-+t}idTWBh?%i6VYXk}5)lvq5fA|p z5P<~|$Wt7f=LJ2J9z_I1U>OAb`_SmFy>z6;r-LCz0P33MFs@^kpf)d1d+A7Jg=RH9 zShZS=AzqJmYOCvd=}66XSPdUmcQ&75XqN4;#)M`)L_q{ZU`Ak-`Q+#Sk^bBKKWkAc z0wVCw2-x~?I_&vUb+$gdp4VTi>gz$L#^nq@egc^IQM{#xaliS3+Dk_&D>VHG1O^2W H_)`MkK;;pJ literal 0 HcmV?d00001 diff --git a/web/static/components/card/index.js b/web/static/components/card/index.js new file mode 100644 index 0000000..f79bebb --- /dev/null +++ b/web/static/components/card/index.js @@ -0,0 +1,2 @@ +export * from "./normal/index.js"; +export * from "./person/index.js"; \ No newline at end of file diff --git a/web/static/components/card/normal/index.js b/web/static/components/card/normal/index.js new file mode 100644 index 0000000..17439c6 --- /dev/null +++ b/web/static/components/card/normal/index.js @@ -0,0 +1,189 @@ +import { NormalCardPlaceholder } from "./placeholder.js"; export { NormalCardPlaceholder }; + +import { html, nothing } from "../../utility/lit-core.min.js"; +import { CustomElement, Golbal } from "../../utility/utility.js"; +import { observeState } from "../../utility/lit-state.js"; +import { cardState } from "./state.js"; + +export class NormalCard extends observeState(CustomElement) { + + static properties = { + tmdb_id: { attribute: "card-tmdbid" }, + res_type: { attribute: "card-restype" }, + media_type: { attribute: "card-mediatype" }, + show_sub: { attribute: "card-showsub"}, + title: { attribute: "card-title" }, + fav: { attribute: "card-fav" , reflect: true}, + date: { attribute: "card-date" }, + vote: { attribute: "card-vote" }, + image: { attribute: "card-image" }, + overview: { attribute: "card-overview" }, + year: { attribute: "card-year" }, + site: { attribute: "card-site" }, + weekday: { attribute: "card-weekday" }, + lazy: {}, + _placeholder: { state: true }, + _card_id: { state: true }, + _card_image_error: { state: true }, + }; + + constructor() { + super(); + this.lazy = "0"; + this._placeholder = true; + this._card_image_error = false; + this._card_id = Symbol("normalCard_data_card_id"); + } + + _render_left_up() { + if (this.weekday || this.res_type) { + let color; + let text; + if (this.weekday) { + color = "bg-orange"; + text = this.weekday; + } else if (this.res_type) { + color = this.res_type === "电影" ? "bg-lime" : "bg-blue"; + text = this.res_type; + } + return html` + + ${text} + `; + } else { + return nothing; + } + } + + _render_right_up() { + if (this.fav == "2") { + return html` +
+ + + + +
`; + } else if (this.vote && this.vote != "0.0" && this.vote != "0") { + return html` +
+ ${this.vote} +
`; + } else { + return nothing; + } + } + + _render_bottom() { + if (this.show_sub == "1") { + return html` + `; + } else { + return nothing; + } + } + + render() { + return html` +
{ if (Golbal.is_touch_device()){ cardState.more_id = this._card_id } } } + @mouseenter=${() => { if (!Golbal.is_touch_device()){ cardState.more_id = this._card_id } } } + @mouseleave=${() => { if (!Golbal.is_touch_device()){ cardState.more_id = undefined } } }> + ${this._placeholder ? NormalCardPlaceholder.render_placeholder() : nothing} +
+ { if (this.lazy != "1") {this.image = Golbal.noImage; this._card_image_error = true} }} + @load=${() => { this._placeholder = false }}/> + ${this._render_left_up()} + ${this._render_right_up()} +
+
{ navmenu(`media_detail?type=${this.media_type}&id=${this.tmdb_id}`) }}> +
+ ${this.year ? html`
${this.site ? this.site : this.year}
` : nothing } + ${this.title + ? html` +

+ ${this.title} +

` + : nothing } + ${this.overview + ? html` +

+ ${this.overview} +

` + : nothing } + ${this.date + ? html` +

+ ${this.date} +

` + : nothing } +
+ ${this._render_bottom()} +
+
+ `; + } + + _fav_change() { + const options = { + detail: { + fav: this.fav + }, + bubbles: true, + composed: true, + }; + this.dispatchEvent(new CustomEvent("fav_change", options)); + } + + _loveClick(e) { + e.stopPropagation(); + Golbal.lit_love_click(this.title, this.year, this.media_type, this.tmdb_id, this.fav, + () => { + this.fav = "0"; + this._fav_change(); + }, + () => { + this.fav = "1"; + this._fav_change(); + }); + } + +} + +window.customElements.define("normal-card", NormalCard); \ No newline at end of file diff --git a/web/static/components/card/normal/placeholder.js b/web/static/components/card/normal/placeholder.js new file mode 100644 index 0000000..724ed30 --- /dev/null +++ b/web/static/components/card/normal/placeholder.js @@ -0,0 +1,26 @@ +import { html } from "../../utility/lit-core.min.js"; +import { CustomElement } from "../../utility/utility.js"; + +export class NormalCardPlaceholder extends CustomElement { + constructor() { + super(); + } + + static render_placeholder() { + return html` +
+
+
+ `; + } + + render() { + return html` +
+ ${NormalCardPlaceholder.render_placeholder()} +
+ `; + } +} + +window.customElements.define("normal-card-placeholder", NormalCardPlaceholder); \ No newline at end of file diff --git a/web/static/components/card/normal/state.js b/web/static/components/card/normal/state.js new file mode 100644 index 0000000..3ac5542 --- /dev/null +++ b/web/static/components/card/normal/state.js @@ -0,0 +1,11 @@ +import { LitState } from "../../utility/lit-state.js" + +class CardState extends LitState { + static get stateVars() { + return { + more_id: undefined + }; + } +} + +export const cardState = new CardState(); \ No newline at end of file diff --git a/web/static/components/card/person/index.js b/web/static/components/card/person/index.js new file mode 100644 index 0000000..7d3cde1 --- /dev/null +++ b/web/static/components/card/person/index.js @@ -0,0 +1,47 @@ +import { html } from "../../utility/lit-core.min.js"; +import { CustomElement, Golbal } from "../../utility/utility.js"; + +export class PersonCard extends CustomElement { + + static properties = { + person_id: { attribute: "person-id" }, + person_image: { attribute: "person-image" }, + person_name: { attribute: "person-name" }, + person_role: { attribute: "person-role" }, + lazy: {}, + }; + + constructor() { + super(); + this.lazy = "0"; + } + + render() { + return html` +
+
+
+ +
+

+ ${this.person_name} +

+
+ ${this.person_role} +
+
+
+ `; + } + +} + +window.customElements.define("person-card", PersonCard); \ No newline at end of file diff --git a/web/static/components/custom/chips/index.html b/web/static/components/custom/chips/index.html new file mode 100644 index 0000000..1d99287 --- /dev/null +++ b/web/static/components/custom/chips/index.html @@ -0,0 +1,147 @@ + \ No newline at end of file diff --git a/web/static/components/custom/img/index.js b/web/static/components/custom/img/index.js new file mode 100644 index 0000000..8f4a1ea --- /dev/null +++ b/web/static/components/custom/img/index.js @@ -0,0 +1,101 @@ +import { html, nothing } from "../../utility/lit-core.min.js"; +import { CustomElement, Golbal } from "../../utility/utility.js"; + +export class CustomImg extends CustomElement { + + static properties = { + img_src: { attribute: "img-src" }, + img_noimage: { attribute: "img-noimage" }, + img_class: { attribute: "img-class" }, + img_style: { attribute: "img-style" }, + img_ratio: { attribute: "img-ratio" }, + div_style: { attribute: "div-style" }, + img_placeholder: { attribute: "img-placeholder" }, + img_error: { attribute: "img-error" }, + img_src_list: { type: Array }, + lazy: {}, + _placeholder: { state: true }, + _timeout_update_img: { state: true }, + }; + + constructor() { + super(); + this.img_noimage = Golbal.noImage; + this.lazy = "0"; + this.img_placeholder = "1"; + this.img_error = "1"; + this.img_src_list = []; + this._timeout_update_img = 0; + this._placeholder = true; + } + + willUpdate(changedProperties) { + if (changedProperties.has("img_src")) { + this._placeholder = true; + } + if (changedProperties.has("img_src_list")) { + this._timeout_update_img = 0; + this._update_img(); + } + } + + firstUpdated() { + this._query_img = this.querySelector("img"); + } + + _update_img() { + if (this.img_src_list) { + if (this.img_src_list.length > 1) { + this._query_img.classList.remove("lit-custom-img-carousel-show"); + setTimeout(() => { + this.img_src = this.img_src_list[this._timeout_update_img]; + this._timeout_update_img ++; + if (this._timeout_update_img >= this.img_src_list.length) { + this._timeout_update_img = 0; + } + }, 1000); + } else if (this.img_src_list.length == 1) { + this.img_src = this.img_src_list[0]; + } + } + } + + render() { + return html` + +
+
+ { if (this.lazy != "1" && this.img_error == "1") { this.img_src = this.img_noimage } }} + @load=${() => { + this._placeholder = false; + // 图像渐入 + if (this.img_src_list.length > 0) { + this._query_img.classList.add("lit-custom-img-carousel"); + setTimeout(() => { + this._query_img.classList.add("lit-custom-img-carousel-show"); + setTimeout(() => { + this._update_img(); + }, 7000); + }, 100); + } + }}/> +
+ `; + } + +} + +window.customElements.define("custom-img", CustomImg); \ No newline at end of file diff --git a/web/static/components/custom/index.js b/web/static/components/custom/index.js new file mode 100644 index 0000000..788f5ef --- /dev/null +++ b/web/static/components/custom/index.js @@ -0,0 +1,2 @@ +export * from "./img/index.js"; +export * from "./slide/index.js"; \ No newline at end of file diff --git a/web/static/components/custom/slide/index.js b/web/static/components/custom/slide/index.js new file mode 100644 index 0000000..546a5ea --- /dev/null +++ b/web/static/components/custom/slide/index.js @@ -0,0 +1,178 @@ +import { html } from "../../utility/lit-core.min.js"; +import { CustomElement } from "../../utility/utility.js"; + +export class CustomSlide extends CustomElement { + + static properties = { + slide_title: { attribute: "slide-title" }, + slide_click: { attribute: "slide-click" }, + lazy: { attribute: "lazy" }, + //slide_scroll: { attribute: "slide-scroll" , reflect: true, type: Number }, + slide_card: { type: Array }, + _disabled: { state: true }, + }; + + constructor() { + super(); + this._disabled = 0; + this.slide_title = "加载中.."; + this.slide_click = "javascript:void(0)"; + this.slide_card = Array(20).fill(html``); + } + + render() { + return html` + + + `; + } + + updated(changedProperties) { + // slide数据刷新时触发界面状态改变 + if (changedProperties.has("slide_card")) { + this._countDisabled(); + } + } + + // 绑定事件 + firstUpdated() { + this._scrollbar = this.querySelector("div.media-slide-hide-scrollbar"); + this._card_number = this.querySelector("div.media-slide-card-number"); + // 初次获取元素参数 + this._countMaxNumber(); + // 窗口大小发生改变时 + this._countMaxNumber_resize = () => { this._countMaxNumber() }; // 防止无法卸载事件 + window.addEventListener("resize", this._countMaxNumber_resize); + } + + // 卸载事件 + disconnectedCallback() { + window.removeEventListener("resize", this._countMaxNumber_resize); + super.disconnectedCallback(); + } + + _countMaxNumber() { + this._card_width = this._card_number.getBoundingClientRect().width; + this._card_max = Math.trunc(this._scrollbar.clientWidth / this._card_width); + this._card_current_load_index = 0; + this._countDisabled(); + } + + _countDisabled() { + this._card_current = this._scrollbar.scrollLeft == 0 ? 0 : Math.trunc((this._scrollbar.scrollLeft + this._card_width / 2) / this._card_width) + if (this.slide_card.length * this._card_width <= this._scrollbar.clientWidth){ + this._disabled = 3; + } else if (this._scrollbar.scrollLeft == 0) { + this._disabled = 0; + } else if (this._scrollbar.scrollLeft >= this._scrollbar.scrollWidth - this._scrollbar.clientWidth - 2){ + this._disabled = 2; + } else { + this._disabled = 1; + } + // 懒加载 + if (this.lazy) { + if (this._card_current > this._card_current_load_index - this._card_max) { + const card_list = this._card_number.querySelectorAll(this.lazy); + if (card_list.length > 0) { + const show_max = this._card_current + this._card_max + 1; + for (let i = this._card_current; i < show_max; i++) { + if (i >= card_list.length) { + break; + } + card_list[i].removeAttribute("lazy"); + } + this._card_current_load_index = show_max; + } + } + } + } + + _slideNext(next) { + let run_to_left_px; + if (next) { + const card_index = this._card_current + this._card_max; + run_to_left_px = card_index * this._card_width; + if (run_to_left_px >= this._scrollbar.scrollWidth - this._scrollbar.clientWidth) { + run_to_left_px = this._scrollbar.scrollWidth - this._scrollbar.clientWidth; + } + } else { + const card_index = this._card_current - this._card_max; + run_to_left_px = card_index * this._card_width; + if (run_to_left_px <= 0) { + run_to_left_px = 0; + } + } + $(this._scrollbar).animate({ + scrollLeft: run_to_left_px + }, 350, () => { + this._scrollbar.scrollLeft = run_to_left_px; + }); + } + + +} + +window.customElements.define("custom-slide", CustomSlide); \ No newline at end of file diff --git a/web/static/components/index.js b/web/static/components/index.js new file mode 100644 index 0000000..2cd1cfb --- /dev/null +++ b/web/static/components/index.js @@ -0,0 +1,11 @@ +// 导入所有组件 +const body_div = document.createElement("div"); +[ +"custom/chips/index.html", +] +.forEach((name) => { + const my_wc = document.createElement("div"); + $(my_wc).load("../static/components/" + name); + body_div.appendChild(my_wc); +}) +document.body.appendChild(body_div); \ No newline at end of file diff --git a/web/static/components/layout/index.js b/web/static/components/layout/index.js new file mode 100644 index 0000000..342a219 --- /dev/null +++ b/web/static/components/layout/index.js @@ -0,0 +1,2 @@ +export * from "./navbar/index.js"; +export * from "./searchbar/index.js"; \ No newline at end of file diff --git a/web/static/components/layout/navbar/button.js b/web/static/components/layout/navbar/button.js new file mode 100644 index 0000000..691b095 --- /dev/null +++ b/web/static/components/layout/navbar/button.js @@ -0,0 +1,16 @@ +import { html } from "../../utility/lit-core.min.js"; +import { CustomElement } from "../../utility/utility.js"; + + +export class LayoutNavbarButton extends CustomElement { + render() { + return html` + + `; + } +} + + +window.customElements.define("layout-navbar-button", LayoutNavbarButton); \ No newline at end of file diff --git a/web/static/components/layout/navbar/index.js b/web/static/components/layout/navbar/index.js new file mode 100644 index 0000000..4dd1b80 --- /dev/null +++ b/web/static/components/layout/navbar/index.js @@ -0,0 +1,795 @@ +import { LayoutNavbarButton } from "./button.js"; export { LayoutNavbarButton }; +import { html, nothing } from "../../utility/lit-core.min.js"; +import { CustomElement } from "../../utility/utility.js"; + +// name: 服务原名 +// page: 导航路径 +// icon: 项目图标 +// : 显示别名 (可选) +const navbar_list = [ + { + name: "我的媒体库", + page: "index", + icon: html` + + `, + }, + { + name: "探索", + list: [ + { + name: "榜单推荐", + page: "ranking", + icon: html` + + + + + + + + + `, + }, + { + name: "豆瓣电影", + page: "douban_movie", + icon: html` + + + + + + + + + + + + + `, + }, + { + name: "豆瓣电视剧", + page: "douban_tv", + icon: html` + + + + + + + `, + }, + { + name: "TMDB电影", + page: "tmdb_movie", + icon: html` + + + + + + + + + + + + + `, + }, + { + name: "TMDB电视剧", + page: "tmdb_tv", + icon: html` + + + + + + + `, + }, + { + name: "BANGUMI", + page: "bangumi", + icon: html` + + + + + + + + + + `, + }, + ], + }, + { + name: "资源搜索", + page: "search", + icon: html` + + `, + }, + { + name: "站点管理", + list: [ + { + name: "站点维护", + page: "site", + icon: html` + + `, + }, + { + name: "数据统计", + page: "statistics", + icon: html` + + + + + + + `, + }, + { + name: "刷流任务", + page: "brushtask", + icon: html` + + + + + + + + + `, + }, + { + name: "站点资源", + page: "sitelist", + icon: html` + + + + + + + + + `, + }, + ], + }, + { + name: "订阅管理", + list: [ + { + name: "电影订阅", + page: "movie_rss", + icon: html` + + + + + + + + + + + + + `, + }, + { + name: "电视剧订阅", + page: "tv_rss", + icon: html` + + + + + + + `, + }, + { + name: "自定义订阅", + page: "user_rss", + icon: html` + + + + + + + + + + `, + }, + { + name: "订阅日历", + page: "rss_calendar", + icon: html` + + + + + + + + + + + `, + }, + ], + }, + { + name: "下载管理", + list: [ + { + name: "正在下载", + page: "downloading", + icon: html` + + + + + + + + + + + + + `, + }, + { + name: "近期下载", + page: "downloaded", + icon: html` + + `, + }, + { + name: "自动删种", + page: "torrent_remove", + icon: html` + + + + + + + + + `, + }, + ], + }, + { + name: "媒体整理", + list: [ + { + name: "文件管理", + page: "mediafile", + icon: html` + + + + + + + + `, + }, + { + name: "手动识别", + page: "unidentification", + icon: html` + + + + + + + + `, + }, + { + name: "历史记录", + page: "history", + icon: html` + + + + + + + `, + }, + { + name: "TMDB缓存", + page: "tmdbcache", + icon: html` + + + + + + + `, + }, + ], + }, + { + name: "服务", + page: "service", + icon: html` + + `, + }, + { + name: "系统设置", + also: "设置", + list: [ + { + name: "基础设置", + page: "basic", + icon: html` + + `, + }, + { + name: "用户管理", + page: "users", + icon: html` + + + + + + + + + `, + }, + { + name: "媒体库", + page: "library", + icon: html` + + + + + + + + + + `, + }, + { + name: "目录同步", + page: "directorysync", + icon: html` + + + + + + + `, + }, + { + name: "消息通知", + page: "notification", + icon: html` + + + + + + + `, + }, + { + name: "过滤规则", + page: "filterrule", + icon: html` + + + + + + `, + }, + { + name: "自定义识别词", + page: "customwords", + icon: html` + + + + + + + + `, + }, + { + name: "索引器", + page: "indexer", + icon: html` + + + + + + + + + + `, + }, + { + name: "下载器", + page: "downloader", + icon: html` + + + + + + + + `, + }, + { + name: "媒体服务器", + page: "mediaserver", + icon: html` + + + + + + + + + + + + + + + + `, + }, + { + name: "字幕", + page: "subtitle", + icon: html` + + + + + + + + `, + }, + { + name: "豆瓣", + page: "douban", + icon: html` + + + + + + + + + + `, + }, + ], + }, +]; + +export class LayoutNavbar extends CustomElement { + static properties = { + layout_gopage: { attribute: "layout-gopage" }, + layout_appversion: { attribute: "layout-appversion"}, + layout_userpris: { attribute: "layout-userpris", type: Array }, + _active_name: { state: true}, + _update_appversion: { state: true }, + _update_url: { state: true }, + _is_update: { state: true }, + }; + + constructor() { + super(); + this.layout_gopage = ""; + this.layout_appversion = "v2.8.3 e950041"; + this.layout_userpris = navbar_list.map((item) => (item.name)); + this._active_name = ""; + this._update_appversion = ""; + this._update_url = "https://github.com/NAStool/nas-tools"; + this._is_update = false; + this.classList.add("navbar","navbar-vertical","navbar-expand-lg","lit-navbar-fixed","lit-navbar","lit-navbar-hide-scrollbar"); + } + + firstUpdated() { + // 加载页面 + if (this.layout_gopage) { + navmenu(this.layout_gopage); + } else if (window.history.state?.page) { + //console.log("刷新页面"); + window_history_refresh(); + } else { + // 打开第一个页面 + for (const item of navbar_list) { + if (item.name === this.layout_userpris[0]) { + navmenu(item.page ?? item.list[0].page); + break; + } + } + // 默认展开探索 + setTimeout(() => { this.show_collapse("ranking") }, 200); + } + // 删除logo动画 加点延迟切换体验好 + setTimeout(() => { + document.querySelector("#logo_animation").remove(); + this.removeAttribute("hidden"); + document.querySelector("#page_content").removeAttribute("hidden"); + document.querySelector("layout-searchbar").removeAttribute("hidden"); + }, 200); + // 检查更新 + if (this.layout_userpris.includes("系统设置")) { + this._check_new_version(); + } + } + + _check_new_version() { + ajax_post("version", {}, (ret) => { + if (ret.code === 0) { + let url = null; + switch (compareVersion(ret.version, this.layout_appversion)) { + case 1: + url = ret.url; + break; + case 2: + url = "https://github.com/NAStool/nas-tools/commits/master" + break; + } + if (url) { + this._update_url = url; + this._update_appversion = ret.version; + this._is_update = true; + } + } + }); + } + + update_active(page) { + this._active_name = page ?? window.history.state?.page; + this.show_collapse(this._active_name); + } + + show_collapse(page) { + for (const item of this.querySelectorAll("[id^='lit-navbar-collapse-']")) { + for (const a of item.querySelectorAll("a")) { + if (page === a.getAttribute("data-lit-page")) { + item.classList.add("show"); + this.querySelectorAll(`button[data-bs-target='#${item.id}']`)[0].classList.remove("collapsed"); + return; + } + } + } + } + + render() { + return html` + +
+
+
+
+

+ +

+
+ ${navbar_list.map((item, index) => ( html` + ${this.layout_userpris.includes(item.name) + ? html` + ${item.list?.length > 0 + ? html` + +
+ ${item.list.map((drop) => (this._render_page_item(drop, true)))} +
` + : this._render_page_item(item, false) + } ` + : nothing } + `))} +
+
+ + + + + + + + ${!this._is_update ? this.layout_appversion : html`${this.layout_appversion}`} + + + ${this._is_update + ? html` + { + e.preventDefault(); + e.stopPropagation(); + update(this._update_appversion); + return false; + }}> + + + + + ` + : nothing } + +
+
+
+
+
+ `; + } + + _render_page_item(item, child) { + return html` + { navmenu(item.page) }}> + + ${item.icon ?? nothing} + + + ${item.also ?? item.name} + + ` + } + +} + + +window.customElements.define("layout-navbar", LayoutNavbar); \ No newline at end of file diff --git a/web/static/components/layout/searchbar/index.js b/web/static/components/layout/searchbar/index.js new file mode 100644 index 0000000..b8ccb59 --- /dev/null +++ b/web/static/components/layout/searchbar/index.js @@ -0,0 +1,182 @@ +import { html, nothing } from "../../utility/lit-core.min.js"; +import { CustomElement } from "../../utility/utility.js"; + +const search_source_icon = { + tmdb: html` + + + + + + + `, + douban: html` + + + + + + + ` +} + +export class LayoutSearchbar extends CustomElement { + static properties = { + layout_systemflag: { attribute: "layout-systemflag" }, + layout_username: { attribute: "layout-username" }, + layout_search_source: { attribute: "layout-search-source" }, + layout_userpris: { attribute: "layout-userpris", type: Array }, + _search_source: { state: true }, + }; + + constructor() { + super(); + this.layout_systemflag = "Docker"; + this.layout_username = "admin"; + this.layout_userpris = ["系统设置"]; + this.layout_search_source = "tmdb"; + this._search_source = "tmdb"; + this.classList.add("navbar", "fixed-top", "lit-searchbar"); + } + + firstUpdated() { + this._search_source = localStorage.getItem("SearchSource") ?? this.layout_search_source; + // 当前状态:是否模糊 + let blur = false; + window.addEventListener("scroll", () => { + const scroll_length = document.body.scrollTop || window.pageYOffset; + // 滚动发生时改变模糊状态 + if (!blur && scroll_length >= 5) { + // 模糊状态 + blur = true; + this.classList.add("lit-searchbar-blur"); + } else if (blur && scroll_length < 5) { + // 非模糊状态 + blur = false + this.classList.remove("lit-searchbar-blur"); + } + }); + + } + + // 卸载事件 + disconnectedCallback() { + super.disconnectedCallback(); + } + + get input() { + return this.querySelector(".home_search_bar") ?? null; + } + + render() { + return html` + + + `; + } + +} + + +window.customElements.define("layout-searchbar", LayoutSearchbar); \ No newline at end of file diff --git a/web/static/components/lit-index.js b/web/static/components/lit-index.js new file mode 100644 index 0000000..a349bbb --- /dev/null +++ b/web/static/components/lit-index.js @@ -0,0 +1,4 @@ +export * from "./custom/index.js"; +export * from "./card/index.js"; +export * from "./page/index.js"; +export * from "./layout/index.js"; \ No newline at end of file diff --git a/web/static/components/page/discovery/index.js b/web/static/components/page/discovery/index.js new file mode 100644 index 0000000..088c0bb --- /dev/null +++ b/web/static/components/page/discovery/index.js @@ -0,0 +1,161 @@ +import { html, nothing } from "../../utility/lit-core.min.js"; +import { CustomElement, Golbal } from "../../utility/utility.js"; + +export class PageDiscovery extends CustomElement { + static properties = { + discovery_type: { attribute: "discovery-type" }, + _slide_card_list: { state: true }, + _media_type_list: { state: true }, + }; + + constructor() { + super(); + this._slide_card_list = {}; + this._media_type_list = { + "RANKING": [ + { + type: "MOV", + title:"正在热映", + subtype :"dbom", + }, + { + type: "MOV", + title:"即将上映", + subtype :"dbnm", + }, + { + type: "TRENDING", + title:"TMDB流行趋势", + subtype :"tmdb", + }, + { + type: "MOV", + title:"豆瓣最新电影", + subtype :"dbnm", + }, + { + type: "MOV", + title:"豆瓣热门电影", + subtype :"dbhm", + }, + { + type: "MOV", + title:"豆瓣电影TOP250", + subtype :"dbtop", + }, + { + type: "TV", + title:"豆瓣热门电视剧", + subtype :"dbht", + }, + { + type: "TV", + title:"华语口碑剧集榜", + subtype :"dbct", + }, + { + type: "TV", + title:"全球口碑剧集榜", + subtype :"dbgt", + } + ], + "BANGUMI": [ + { + type: "TV", + title:"星期一", + subtype :"bangumi", + week :"1", + }, + { + type: "TV", + title:"星期二", + subtype :"bangumi", + week :"2", + }, + { + type: "TV", + title:"星期三", + subtype :"bangumi", + week :"3", + }, + { + type: "TV", + title:"星期四", + subtype :"bangumi", + week :"4", + }, + { + type: "TV", + title:"星期五", + subtype :"bangumi", + week :"5", + }, + { + type: "TV", + title:"星期六", + subtype :"bangumi", + week :"6", + }, + { + type: "TV", + title:"星期日", + subtype :"bangumi", + week :"7", + }, + ] + } + } + + firstUpdated() { + for (const item of this._media_type_list[this.discovery_type]) { + Golbal.get_cache_or_ajax( + "get_recommend", + self.discovery_type + item.title, + { "type": item.type, "subtype": item.subtype, "page": 1, "week": item.week}, + (ret) => { + this._slide_card_list = {...this._slide_card_list, [item.title]: ret.Items}; + } + ); + } + } + + render() { + return html` +
+ ${this._media_type_list[this.discovery_type]?.map((item) => ( html` + ( html` + { + Golbal.update_fav_data("get_recommend", item.subtype, (extra) => ( + extra.Items[index].fav = e.detail.fav, extra + )); + }} + lazy=1 + card-tmdbid=${card.id} + card-mediatype=${card.type} + card-showsub=1 + card-image=${card.image} + card-fav=${card.fav} + card-vote=${card.vote} + card-year=${card.year} + card-title=${card.title} + card-overview=${card.overview} + card-restype=${card.media_type} + class="px-2" + >`)) + : Array(20).fill(html``) + } + >` + ))} +
+ `; + } +} + + +window.customElements.define("page-discovery", PageDiscovery); \ No newline at end of file diff --git a/web/static/components/page/index.js b/web/static/components/page/index.js new file mode 100644 index 0000000..2f5f770 --- /dev/null +++ b/web/static/components/page/index.js @@ -0,0 +1,3 @@ +export * from "./discovery/index.js"; +export * from "./mediainfo/index.js"; +export * from "./person/index.js"; \ No newline at end of file diff --git a/web/static/components/page/mediainfo/index.js b/web/static/components/page/mediainfo/index.js new file mode 100644 index 0000000..77e72b6 --- /dev/null +++ b/web/static/components/page/mediainfo/index.js @@ -0,0 +1,305 @@ +import { html, nothing } from "../../utility/lit-core.min.js"; +import { CustomElement, Golbal } from "../../utility/utility.js"; + +export class PageMediainfo extends CustomElement { + static properties = { + // 类型 + media_type: { attribute: "media-type" }, + // TMDBID/DB:豆瓣ID + tmdbid: { attribute: "media-tmdbid" }, + // 是否订阅/下载 + fav: {}, + // 媒体信息 + media_info: { type: Object }, + // 类似影片 + similar_media: { type: Array }, + // 推荐影片 + recommend_media: { type: Array }, + }; + + constructor() { + super(); + this.media_info = {}; + this.similar_media = []; + this.recommend_media = []; + this.fav = undefined; + } + + firstUpdated() { + // 媒体信息、演员阵容 + Golbal.get_cache_or_ajax("media_detail", "info", { "type": this.media_type, "tmdbid": this.tmdbid}, + (ret) => { + if (ret.code === 0) { + this.media_info = ret.data; + this.tmdbid = ret.data.tmdbid; + this.fav = ret.data.fav; + // 类似 + Golbal.get_cache_or_ajax("get_recommend", "sim", { "type": this.media_type, "subtype": "sim", "tmdbid": ret.data.tmdbid, "page": 1}, + (ret) => { + if (ret.code === 0) { + this.similar_media = ret.Items; + } + } + ); + // 推荐 + Golbal.get_cache_or_ajax("get_recommend", "more", { "type": this.media_type, "subtype": "more", "tmdbid": ret.data.tmdbid, "page": 1}, + (ret) => { + if (ret.code === 0) { + this.recommend_media = ret.Items; + } + } + ); + } else { + show_fail_modal("未查询到TMDB媒体信息!"); + window.history.go(-1); + } + } + ); + } + + _render_placeholder(width, height, col, num) { + return Array(num ?? 1).fill(html` +
+
+ `); + } + + render() { + return html` + +
+ +
+ + +
+
+ + +
+
+ ${this.fav == "2" + ? html` +
+ 已下载 +
` + : nothing } +

+ ${this.media_info.title ?? this._render_placeholder("200px")} + (${this.media_info.year}) +

+
+ ${this.media_info.tmdbid} + ${this.media_info.douban_id} + ${this.media_info.runtime} + | ${this.media_info.genres} + ${Object.keys(this.media_info).length === 0 ? this._render_placeholder("205px") : nothing } +
+
+ ${Object.keys(this.media_info).length !== 0 + ? html` + { + e.stopPropagation(); + media_search(this.tmdbid + "", this.media_info.title, this.media_type); + }}> + + 搜索资源 + + ${this.fav == "1" + ? html` + + + 删除订阅 + ` + : html` + + + 添加订阅 + ` + }` + : html` + ${this._render_placeholder("100px", "30px")} + ${this._render_placeholder("100px", "30px")} + ` + } +
+
+
+
+

+ ${Object.keys(this.media_info).length === 0 ? "加载中.." : "简介"} +

+
+
+
+
+

+ ${this.media_info.overview ?? this._render_placeholder("200px", "", "col-12", 7)} +

+
+ ${this.media_info.crews + ? this.media_info.crews.map((item, index) => ( html` +
+

+ ${Object.keys(item)[0]} +

+

+ ${Object.values(item)[0]} +

+
+ `) ) + : nothing } +
+
+
+ ${this.media_info.fact + ? html` +
+
+ ${this.media_info.fact.map((item) => ( html` +
+
+
+ ${Object.keys(item)[0]} +
+
+ ${Object.values(item)[0]} +
+
+
+ `) ) } +
+
` + : this._render_placeholder("200px", "200px", "col-12") } +
+
+ + + ${this.media_info.actors && this.media_info.actors.length + ? html` + ( html` + { + navmenu("recommend?type="+this.media_type+"&subtype=person&personid="+item.id+"&title=参演作品&subtitle="+item.name) + }} + >`)) + } + >` + : nothing } + + + ${this.similar_media.length + ? html` + ( html` + { + Golbal.update_fav_data("get_recommend", "sim", (extra) => ( + extra.Items[index].fav = e.detail.fav, extra + )); + }} + lazy=1 + card-tmdbid=${item.id} + card-mediatype=${item.type} + card-showsub=1 + card-image=${item.image} + card-fav=${item.fav} + card-vote=${item.vote} + card-year=${item.year} + card-title=${item.title} + card-overview=${item.overview} + >`)) + } + >` + : nothing } + + + ${this.recommend_media.length + ? html` + ( html` + { + Golbal.update_fav_data("get_recommend", "more", (extra) => ( + extra.Items[index].fav = e.detail.fav, extra + )); + }} + lazy=1 + card-tmdbid=${item.id} + card-mediatype=${item.type} + card-showsub=1 + card-image=${item.image} + card-fav=${item.fav} + card-vote=${item.vote} + card-year=${item.year} + card-title=${item.title} + card-overview=${item.overview} + >`)) + } + >` + : nothing } + +
+ `; + } + + _update_fav_data() { + Golbal.update_fav_data("media_detail", "info", (extra) => ( + extra.data.fav = this.fav, extra + )); + } + + _loveClick(e) { + e.stopPropagation(); + Golbal.lit_love_click(this.media_info.title, this.media_info.year, this.media_type, this.tmdbid, this.fav, + () => { + this.fav = "0"; + this._update_fav_data(); + }, + () => { + this.fav = "1"; + this._update_fav_data(); + }); + } + + +} + + +window.customElements.define("page-mediainfo", PageMediainfo); \ No newline at end of file diff --git a/web/static/components/page/person/index.js b/web/static/components/page/person/index.js new file mode 100644 index 0000000..3abf5c3 --- /dev/null +++ b/web/static/components/page/person/index.js @@ -0,0 +1,67 @@ +import { html } from "../../utility/lit-core.min.js"; +import { CustomElement, Golbal } from "../../utility/utility.js"; + +export class PagePerson extends CustomElement { + static properties = { + page_title: { attribute: "page-title" }, + page_subtitle: { attribute: "page-subtitle"}, + media_type: { attribute: "media-type" }, + tmdbid: { attribute: "media-tmdbid" }, + person_list: { type: Array }, + }; + + constructor() { + super(); + this.person_list = []; + } + + // 仅执行一次 界面首次刷新后 + firstUpdated() { + Golbal.get_cache_or_ajax("media_person", this.media_type, { "tmdbid": this.tmdbid, "type": this.media_type}, + (ret) => { + if (ret.code === 0) { + this.person_list = ret.data; + } + } + ); + } + + render() { + return html` +
+ +
+
+
+
+ ${this.person_list.length != 0 + ? this.person_list.map((item, index) => ( html` + { + navmenu("recommend?type="+this.media_type+"&subtype=person&personid="+item.id+"&title=参演作品&subtitle="+item.name) + }} + > + ` ) ) + : Array(20).fill(html``) + } +
+
+
+ `; + } + +} + + +window.customElements.define("page-person", PagePerson); \ No newline at end of file diff --git a/web/static/components/utility/lit-core.min.js b/web/static/components/utility/lit-core.min.js new file mode 100644 index 0000000..dca0db4 --- /dev/null +++ b/web/static/components/utility/lit-core.min.js @@ -0,0 +1,29 @@ +/** + * @license + * Copyright 2019 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const t=window,i=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,s=Symbol(),e=new WeakMap;class o{constructor(t,i,e){if(this._$cssResult$=!0,e!==s)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=i}get styleSheet(){let t=this.i;const s=this.t;if(i&&void 0===t){const i=void 0!==s&&1===s.length;i&&(t=e.get(s)),void 0===t&&((this.i=t=new CSSStyleSheet).replaceSync(this.cssText),i&&e.set(s,t))}return t}toString(){return this.cssText}}const n=t=>new o("string"==typeof t?t:t+"",void 0,s),r=(t,...i)=>{const e=1===t.length?t[0]:i.reduce(((i,s,e)=>i+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(s)+t[e+1]),t[0]);return new o(e,t,s)},h=(s,e)=>{i?s.adoptedStyleSheets=e.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):e.forEach((i=>{const e=document.createElement("style"),o=t.litNonce;void 0!==o&&e.setAttribute("nonce",o),e.textContent=i.cssText,s.appendChild(e)}))},l=i?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let i="";for(const s of t.cssRules)i+=s.cssText;return n(i)})(t):t +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */;var a;const u=window,c=u.trustedTypes,d=c?c.emptyScript:"",v=u.reactiveElementPolyfillSupport,p={toAttribute(t,i){switch(i){case Boolean:t=t?d:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,i){let s=t;switch(i){case Boolean:s=null!==t;break;case Number:s=null===t?null:Number(t);break;case Object:case Array:try{s=JSON.parse(t)}catch(t){s=null}}return s}},f=(t,i)=>i!==t&&(i==i||t==t),m={attribute:!0,type:String,converter:p,reflect:!1,hasChanged:f};class y extends HTMLElement{constructor(){super(),this.o=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this.l=null,this.u()}static addInitializer(t){var i;this.finalize(),(null!==(i=this.v)&&void 0!==i?i:this.v=[]).push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((i,s)=>{const e=this.p(s,i);void 0!==e&&(this.m.set(e,s),t.push(e))})),t}static createProperty(t,i=m){if(i.state&&(i.attribute=!1),this.finalize(),this.elementProperties.set(t,i),!i.noAccessor&&!this.prototype.hasOwnProperty(t)){const s="symbol"==typeof t?Symbol():"__"+t,e=this.getPropertyDescriptor(t,s,i);void 0!==e&&Object.defineProperty(this.prototype,t,e)}}static getPropertyDescriptor(t,i,s){return{get(){return this[i]},set(e){const o=this[t];this[i]=e,this.requestUpdate(t,o,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||m}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),void 0!==t.v&&(this.v=[...t.v]),this.elementProperties=new Map(t.elementProperties),this.m=new Map,this.hasOwnProperty("properties")){const t=this.properties,i=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const s of i)this.createProperty(s,t[s])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(t){const i=[];if(Array.isArray(t)){const s=new Set(t.flat(1/0).reverse());for(const t of s)i.unshift(l(t))}else void 0!==t&&i.push(l(t));return i}static p(t,i){const s=i.attribute;return!1===s?void 0:"string"==typeof s?s:"string"==typeof t?t.toLowerCase():void 0}u(){var t;this._=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this.g(),this.requestUpdate(),null===(t=this.constructor.v)||void 0===t||t.forEach((t=>t(this)))}addController(t){var i,s;(null!==(i=this.S)&&void 0!==i?i:this.S=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(s=t.hostConnected)||void 0===s||s.call(t))}removeController(t){var i;null===(i=this.S)||void 0===i||i.splice(this.S.indexOf(t)>>>0,1)}g(){this.constructor.elementProperties.forEach(((t,i)=>{this.hasOwnProperty(i)&&(this.o.set(i,this[i]),delete this[i])}))}createRenderRoot(){var t;const i=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return h(i,this.constructor.elementStyles),i}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this.S)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostConnected)||void 0===i?void 0:i.call(t)}))}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this.S)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostDisconnected)||void 0===i?void 0:i.call(t)}))}attributeChangedCallback(t,i,s){this._$AK(t,s)}$(t,i,s=m){var e;const o=this.constructor.p(t,s);if(void 0!==o&&!0===s.reflect){const n=(void 0!==(null===(e=s.converter)||void 0===e?void 0:e.toAttribute)?s.converter:p).toAttribute(i,s.type);this.l=t,null==n?this.removeAttribute(o):this.setAttribute(o,n),this.l=null}}_$AK(t,i){var s;const e=this.constructor,o=e.m.get(t);if(void 0!==o&&this.l!==o){const t=e.getPropertyOptions(o),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==(null===(s=t.converter)||void 0===s?void 0:s.fromAttribute)?t.converter:p;this.l=o,this[o]=n.fromAttribute(i,t.type),this.l=null}}requestUpdate(t,i,s){let e=!0;void 0!==t&&(((s=s||this.constructor.getPropertyOptions(t)).hasChanged||f)(this[t],i)?(this._$AL.has(t)||this._$AL.set(t,i),!0===s.reflect&&this.l!==t&&(void 0===this.C&&(this.C=new Map),this.C.set(t,s))):e=!1),!this.isUpdatePending&&e&&(this._=this.T())}async T(){this.isUpdatePending=!0;try{await this._}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this.o&&(this.o.forEach(((t,i)=>this[i]=t)),this.o=void 0);let i=!1;const s=this._$AL;try{i=this.shouldUpdate(s),i?(this.willUpdate(s),null===(t=this.S)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostUpdate)||void 0===i?void 0:i.call(t)})),this.update(s)):this.P()}catch(t){throw i=!1,this.P(),t}i&&this._$AE(s)}willUpdate(t){}_$AE(t){var i;null===(i=this.S)||void 0===i||i.forEach((t=>{var i;return null===(i=t.hostUpdated)||void 0===i?void 0:i.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}P(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._}shouldUpdate(t){return!0}update(t){void 0!==this.C&&(this.C.forEach(((t,i)=>this.$(i,this[i],t))),this.C=void 0),this.P()}updated(t){}firstUpdated(t){}} +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +var _;y.finalized=!0,y.elementProperties=new Map,y.elementStyles=[],y.shadowRootOptions={mode:"open"},null==v||v({ReactiveElement:y}),(null!==(a=u.reactiveElementVersions)&&void 0!==a?a:u.reactiveElementVersions=[]).push("1.5.0");const b=window,g=b.trustedTypes,w=g?g.createPolicy("lit-html",{createHTML:t=>t}):void 0,S=`lit$${(Math.random()+"").slice(9)}$`,$="?"+S,C=`<${$}>`,T=document,P=(t="")=>T.createComment(t),x=t=>null===t||"object"!=typeof t&&"function"!=typeof t,A=Array.isArray,k=t=>A(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]),E=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,M=/-->/g,U=/>/g,N=RegExp(">|[ \t\n\f\r](?:([^\\s\"'>=/]+)([ \t\n\f\r]*=[ \t\n\f\r]*(?:[^ \t\n\f\r\"'`<>=]|(\"|')|))|$)","g"),R=/'/g,O=/"/g,V=/^(?:script|style|textarea|title)$/i,j=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),z=j(1),L=j(2),I=Symbol.for("lit-noChange"),H=Symbol.for("lit-nothing"),B=new WeakMap,D=T.createTreeWalker(T,129,null,!1),q=(t,i)=>{const s=t.length-1,e=[];let o,n=2===i?"":"",r=E;for(let i=0;i"===l[0]?(r=null!=o?o:E,a=-1):void 0===l[1]?a=-2:(a=r.lastIndex-l[2].length,h=l[1],r=void 0===l[3]?N:'"'===l[3]?O:R):r===O||r===R?r=N:r===M||r===U?r=E:(r=N,o=void 0);const c=r===N&&t[i+1].startsWith("/>")?" ":"";n+=r===E?s+C:a>=0?(e.push(h),s.slice(0,a)+"$lit$"+s.slice(a)+S+c):s+S+(-2===a?(e.push(void 0),i):c)}const h=n+(t[s]||"")+(2===i?"":"");if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return[void 0!==w?w.createHTML(h):h,e]};class J{constructor({strings:t,_$litType$:i},s){let e;this.parts=[];let o=0,n=0;const r=t.length-1,h=this.parts,[l,a]=q(t,i);if(this.el=J.createElement(l,s),D.currentNode=this.el.content,2===i){const t=this.el.content,i=t.firstChild;i.remove(),t.append(...i.childNodes)}for(;null!==(e=D.nextNode())&&h.length0){e.textContent=g?g.emptyScript:"";for(let s=0;s2||""!==s[0]||""!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=H}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,i=this,s,e){const o=this.strings;let n=!1;if(void 0===o)t=W(this,t,i,0),n=!x(t)||t!==this._$AH&&t!==I,n&&(this._$AH=t);else{const e=t;let r,h;for(t=o[0],r=0;r{var e,o;const n=null!==(e=null==s?void 0:s.renderBefore)&&void 0!==e?e:i;let r=n._$litPart$;if(void 0===r){const t=null!==(o=null==s?void 0:s.renderBefore)&&void 0!==o?o:null;n._$litPart$=r=new F(i.insertBefore(P(),t),t,void 0,null!=s?s:{})}return r._$AI(t),r}; +/** + * @license + * Copyright 2017 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */var ot,nt;const rt=y;class ht extends y{constructor(){super(...arguments),this.renderOptions={host:this},this.et=void 0}createRenderRoot(){var t,i;const s=super.createRenderRoot();return null!==(t=(i=this.renderOptions).renderBefore)&&void 0!==t||(i.renderBefore=s.firstChild),s}update(t){const i=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this.et=et(i,this.renderRoot,this.renderOptions)}connectedCallback(){var t;super.connectedCallback(),null===(t=this.et)||void 0===t||t.setConnected(!0)}disconnectedCallback(){var t;super.disconnectedCallback(),null===(t=this.et)||void 0===t||t.setConnected(!1)}render(){return I}}ht.finalized=!0,ht._$litElement$=!0,null===(ot=globalThis.litElementHydrateSupport)||void 0===ot||ot.call(globalThis,{LitElement:ht});const lt=globalThis.litElementPolyfillSupport;null==lt||lt({LitElement:ht});const at={_$AK:(t,i,s)=>{t._$AK(i,s)},_$AL:t=>t._$AL};(null!==(nt=globalThis.litElementVersions)&&void 0!==nt?nt:globalThis.litElementVersions=[]).push("3.2.2"); +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +const ut=!1;export{o as CSSResult,ht as LitElement,y as ReactiveElement,rt as UpdatingElement,at as _$LE,it as _$LH,h as adoptStyles,r as css,p as defaultConverter,l as getCompatibleStyle,z as html,ut as isServer,I as noChange,f as notEqual,H as nothing,et as render,i as supportsAdoptingStyleSheets,L as svg,n as unsafeCSS}; +//# sourceMappingURL=lit-core.min.js.map diff --git a/web/static/components/utility/lit-state.js b/web/static/components/utility/lit-state.js new file mode 100644 index 0000000..b73c048 --- /dev/null +++ b/web/static/components/utility/lit-state.js @@ -0,0 +1,258 @@ +export const observeState = superclass => class extends superclass { + + constructor() { + super(); + this._observers = []; + } + + update(changedProperties) { + stateRecorder.start(); + super.update(changedProperties); + this._initStateObservers(); + } + + connectedCallback() { + super.connectedCallback(); + if (this._wasConnected) { + this.requestUpdate(); + delete this._wasConnected; + } + } + + disconnectedCallback() { + super.disconnectedCallback(); + this._wasConnected = true; + this._clearStateObservers(); + } + + _initStateObservers() { + this._clearStateObservers(); + if (!this.isConnected) return; + this._addStateObservers(stateRecorder.finish()); + } + + _addStateObservers(stateVars) { + for (let [state, keys] of stateVars) { + const observer = () => this.requestUpdate(); + this._observers.push([state, observer]); + state.addObserver(observer, keys); + } + } + + _clearStateObservers() { + for (let [state, observer] of this._observers) { + state.removeObserver(observer); + } + this._observers = []; + } + +} + + +export class LitState { + + constructor() { + this._observers = []; + this._initStateVars(); + } + + addObserver(observer, keys) { + this._observers.push({observer, keys}); + } + + removeObserver(observer) { + this._observers = this._observers.filter(observerObj => observerObj.observer !== observer); + } + + _initStateVars() { + + if (this.constructor.stateVarOptions) { + for (let [key, options] of Object.entries(this.constructor.stateVarOptions)) { + this._initStateVar(key, options); + } + } + + if (this.constructor.stateVars) { + for (let [key, value] of Object.entries(this.constructor.stateVars)) { + this._initStateVar(key, {}); + this[key] = value; + } + } + + } + + _initStateVar(key, options) { + + if (this.hasOwnProperty(key)) { + // Property already defined, so don't re-define. + return; + } + + options = this._parseOptions(options); + + const stateVar = new options.handler({ + options: options, + recordRead: () => this._recordRead(key), + notifyChange: () => this._notifyChange(key) + }); + + Object.defineProperty( + this, + key, + { + get() { + return stateVar.get(); + }, + set(value) { + if (stateVar.shouldSetValue(value)) { + stateVar.set(value); + } + }, + configurable: true, + enumerable: true + } + ); + + } + + _parseOptions(options) { + + if (!options.handler) { + options.handler = StateVar; + } else { + + // In case of a custom `StateVar` handler is provided, we offer a + // second way of providing options to your custom handler class. + // + // You can decorate a *method* with `@stateVar()` instead of a + // variable. The method must return an object, and that object will + // be assigned to the `options` object. + // + // Within the method you have access to the `this` context. So you + // can access other properties and methods from your state class. + // And you can add arrow function callbacks where you can access + // `this`. This provides a lot of possibilities for a custom + // handler class. + if (options.propertyMethod && options.propertyMethod.kind === 'method') { + Object.assign(options, options.propertyMethod.descriptor.value.call(this)); + } + + } + + return options; + + } + + _recordRead(key) { + stateRecorder.recordRead(this, key); + } + + _notifyChange(key) { + for (const observerObj of this._observers) { + if (!observerObj.keys || observerObj.keys.includes(key)) { + observerObj.observer(key); + } + }; + } + +} + + +export class StateVar { + + constructor(args) { + this.options = args.options; // The options given in the `stateVar` declaration + this.recordRead = args.recordRead; // Callback to indicate the `stateVar` is read + this.notifyChange = args.notifyChange; // Callback to indicate the `stateVar` value has changed + this.value = undefined; // The initial value + } + + // Called when the `stateVar` on the `LitState` class is read (for example: + // `myState.myStateVar`). Should return the value of the `stateVar`. + get() { + this.recordRead(); + return this.value; + } + + // Called before the `set()` method is called. If this method returns + // `false`, the `set()` method won't be called. This can be used for + // validation and/or optimization. + shouldSetValue(value) { + return this.value !== value; + } + + // Called when the `stateVar` on the `LitState` class is set (for example: + // `myState.myStateVar = 'value'`. + set(value) { + this.value = value; + this.notifyChange(); + } + +} + + +export function stateVar(options = {}) { + + return element => { + + return { + kind: 'field', + key: Symbol(), + placement: 'own', + descriptor: {}, + initializer() { + if (typeof element.initializer === 'function') { + this[element.key] = element.initializer.call(this); + } + }, + finisher(litStateClass) { + + if (element.kind === 'method') { + // You can decorate a *method* with `@stateVar()` instead + // of a variable. When the state class is constructed, this + // method will be called, and it's return value must be an + // object that will be added to the options the stateVar + // handler will receive. + options.propertyMethod = element; + } + + if (litStateClass.stateVarOptions === undefined) { + litStateClass.stateVarOptions = {}; + } + + litStateClass.stateVarOptions[element.key] = options; + + } + }; + + }; + +} + + +class StateRecorder { + + constructor() { + this._log = null; + } + + start() { + this._log = new Map(); + } + + recordRead(stateObj, key) { + if (this._log === null) return; + const keys = this._log.get(stateObj) || []; + if (!keys.includes(key)) keys.push(key); + this._log.set(stateObj, keys); + } + + finish() { + const stateVars = this._log; + this._log = null; + return stateVars; + } + +} + +export const stateRecorder = new StateRecorder(); \ No newline at end of file diff --git a/web/static/components/utility/utility.js b/web/static/components/utility/utility.js new file mode 100644 index 0000000..0d84f4f --- /dev/null +++ b/web/static/components/utility/utility.js @@ -0,0 +1,122 @@ +import { LitElement } from "./lit-core.min.js"; + +export class CustomElement extends LitElement { + + // 兼容前进后退时重载 + connectedCallback() { + super.connectedCallback(); + this.innerHTML = ""; + } + + // 过滤空字符 + attributeChangedCallback(name, oldValue, newValue) { + super.attributeChangedCallback(name, oldValue, Golbal.repNull(newValue)); + } + + // 不使用影子dom + createRenderRoot() { + return this; + } + +} + +export class Golbal { + + // 没有图片时 + static noImage = "../static/img/no-image.png"; + static noImage_person = "../static/img/person.png"; + + // 转换传值的空字符情况 + static repNull(value) { + if (!value || value == "None" || value == "null" || value == "undefined") { + return ""; + } else { + return value; + } + } + + // 是否触摸屏设备 + static is_touch_device() { + return "ontouchstart" in window; + } + + static convert_mediaid(tmdbid) { + if (typeof(tmdbid) === "number") { + tmdbid = tmdbid + ""; + } + return tmdbid + } + + // 订阅按钮被点击时 + static lit_love_click(title, year, media_type, tmdb_id, fav, remove_func, add_func) { + if (fav == "1"){ + show_ask_modal("是否确定将 " + title + " 从订阅中移除?", function () { + hide_ask_modal(); + remove_rss_media(title, year, media_type, "", "", tmdb_id, remove_func); + }); + } else { + show_ask_modal("是否确定订阅: " + title + "?", function () { + hide_ask_modal(); + const mediaid = Golbal.convert_mediaid(tmdb_id); + if (media_type == "MOV" || media_type == "电影") { + add_rss_media(title, year, media_type, mediaid, "", "", add_func); + } else { + ajax_post("get_tvseason_list", {tmdbid: mediaid, title: title}, function (ret) { + if (ret.seasons.length === 1) { + add_rss_media(title, year, "TV", mediaid, "", ret.seasons[0].num, add_func); + } else if (ret.seasons.length > 1) { + show_rss_seasons_modal(title, year, "TV", mediaid, ret.seasons, add_func); + } else { + show_fail_modal(title + " 添加RSS订阅失败:未查询到季信息!"); + } + }); + } + }); + } + } + + // 保存额外的页面数据 + static save_page_data(name, value) { + const extra = window.history.state?.extra ?? {}; + extra[name] = value; + window_history(false, extra); + } + + // 获取额外的页面数据 + static get_page_data(name) { + return window.history.state?.extra ? window.history.state.extra[name] : undefined; + } + + // 判断直接获取缓存或ajax_post + static get_cache_or_ajax(api, name, data, func) { + const ret = Golbal.get_page_data(api + name); + //console.log("读取:", api + name, ret); + if (ret) { + func(ret); + } else { + const page = window.history.state?.page; + ajax_post(api, data, (ret) => { + // 页面已经变化, 丢弃该请求 + if (page !== window.history.state?.page) { + //console.log("丢弃:", api + name, ret); + return + } + Golbal.save_page_data(api + name, ret); + //console.log("缓存:", api + name, ret); + func(ret) + }); + } + } + + // 共用的fav数据更改时刷新缓存 + static update_fav_data(api, name, func=undefined) { + const key = api + name; + let extra = Golbal.get_page_data(key); + if (extra && func) { + extra = func(extra); + Golbal.save_page_data(key, extra); + //console.log("更新fav", extra); + } + } + +} \ No newline at end of file diff --git a/web/static/css/demo.min.css b/web/static/css/demo.min.css new file mode 100644 index 0000000..831780c --- /dev/null +++ b/web/static/css/demo.min.css @@ -0,0 +1,9 @@ +/*! +* Tabler v1.0.0-beta16 (https://tabler.io) +* @version 1.0.0-beta16 +* @link https://tabler.io +* Copyright 2018-2022 The Tabler Authors +* Copyright 2018-2022 codecalm.net Paweł Kuna +* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE) +*/ +.highlight pre,pre.highlight{max-height:30rem;margin:1.5rem 0;overflow:auto;border-radius:var(--tblr-border-radius)}.highlight pre::-webkit-scrollbar,pre.highlight::-webkit-scrollbar{width:.5rem;height:.5rem;-webkit-transition:background .3s;transition:background .3s}@media (prefers-reduced-motion:reduce){.highlight pre::-webkit-scrollbar,pre.highlight::-webkit-scrollbar{-webkit-transition:none;transition:none}}.highlight pre::-webkit-scrollbar-thumb,pre.highlight::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(var(--tblr-light-rgb),.16)}.highlight pre::-webkit-scrollbar-track,pre.highlight::-webkit-scrollbar-track{background:rgba(var(--tblr-light-rgb),.06)}.highlight pre:hover::-webkit-scrollbar-thumb,pre.highlight:hover::-webkit-scrollbar-thumb{background:rgba(var(--tblr-light-rgb),.32)}.highlight pre::-webkit-scrollbar-corner,pre.highlight::-webkit-scrollbar-corner{background:0 0}.highlight{margin:0}.highlight code>*{margin:0!important;padding:0!important}.highlight .c,.highlight .c1{color:#a0aec0}.highlight .nc,.highlight .nt,.highlight .nx{color:#ff8383}.highlight .na,.highlight .p{color:#ffe484}.highlight .dl,.highlight .s,.highlight .s2{color:#b5f4a5}.highlight .k{color:#93ddfd}.highlight .mi,.highlight .s1{color:#d9a9ff}.example{padding:2rem;margin:1rem 0 2rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:3px 3px 0 0;position:relative;min-height:12rem;display:flex;align-items:center;overflow-x:auto}.example-centered{justify-content:center}.example-centered .example-content{flex:0 auto}.example-content{font-size:.875rem;line-height:1.4285714286;color:#1d273b;flex:1;max-width:100%}.example-content .page-header{margin-bottom:0}.example-bg{background:#f1f5f9}.example-code{margin:2rem 0;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-top:none}.example-code pre{margin:0;border:0;border-radius:0 0 3px 3px}.example+.example-code{margin-top:-2rem}.example-column{margin:0 auto}.example-column>.card:last-of-type{margin-bottom:0}.example-column-1{max-width:26rem}.example-column-2{max-width:52rem}.example-modal-backdrop{background:#1d273b;opacity:.24;position:absolute;width:100%;left:0;top:0;height:100%;border-radius:2px 2px 0 0}@media not print{.theme-dark .example{background-color:#1a2234;border-color:#243049}.theme-dark .example-content{color:#f8fafc}.theme-dark .example-code{border-color:#243049;border-top:none}}@media not print{@media (prefers-color-scheme:dark){.theme-dark-auto .example{background-color:#1a2234;border-color:#243049}.theme-dark-auto .example-content{color:#f8fafc}.theme-dark-auto .example-code{border-color:#243049;border-top:none}}}.card-sponsor{background:#dbe7f6 no-repeat center/100% 100%;border-color:#548ed2;min-height:316px}body.no-transitions *{transition:none!important}.dropdown-menu-demo{display:inline-block;width:100%;position:relative;top:0;margin-bottom:1rem!important}.demo-icon-preview{position:-webkit-sticky;position:sticky;top:0}.demo-icon-preview i,.demo-icon-preview svg{width:15rem;height:15rem;font-size:15rem;stroke-width:1.5;margin:0 auto;display:block}@media (max-width:575.98px){.demo-icon-preview i,.demo-icon-preview svg{width:10rem;height:10rem;font-size:10rem}}.demo-icon-preview-icon pre{margin:0;-webkit-user-select:all;-moz-user-select:all;user-select:all}.demo-dividers>p{opacity:.2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.demo-icons-list{display:flex;flex-wrap:wrap;padding:0;margin:0 -2px -1px 0;list-style:none}.demo-icons-list>*{flex:1 0 4rem}.demo-icons-list-wrap{overflow:hidden}.demo-icons-list-item{display:flex;flex-direction:column;align-items:center;justify-content:center;aspect-ratio:1;text-align:center;padding:.5rem;border-right:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);color:inherit;cursor:pointer}.demo-icons-list-item .icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.demo-icons-list-item:hover{text-decoration:none}.settings-btn{position:fixed;right:-1px;top:10rem;border-top-right-radius:0;border-bottom-right-radius:0;box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px 0}.settings-scheme{display:inline-block;border-radius:50%;height:3rem;width:3rem;position:relative;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px 0}.settings-scheme-light{background:linear-gradient(135deg,#fff 50%,#f8fafc 50%)}.settings-scheme-mixed{background-image:linear-gradient(135deg,#1d273b 50%,#fff 50%)}.settings-scheme-transparent{background:#f8fafc}.settings-scheme-dark{background:#1d273b}.settings-scheme-colored{background-image:linear-gradient(135deg,var(--tblr-primary) 50%,#f8fafc 50%)} \ No newline at end of file diff --git a/web/static/css/dropzone.css b/web/static/css/dropzone.css new file mode 100644 index 0000000..569ac44 --- /dev/null +++ b/web/static/css/dropzone.css @@ -0,0 +1 @@ +@keyframes passing-through{0%{opacity:0;transform:translateY(40px)}30%,70%{opacity:1;transform:translateY(0px)}100%{opacity:0;transform:translateY(-40px)}}@keyframes slide-in{0%{opacity:0;transform:translateY(40px)}30%{opacity:1;transform:translateY(0px)}}@keyframes pulse{0%{transform:scale(1)}10%{transform:scale(1.1)}20%{transform:scale(1)}}.dropzone,.dropzone *{box-sizing:border-box}.dropzone{min-height:150px;border:1px solid rgba(0,0,0,.8);border-radius:5px;padding:20px 20px}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message *{cursor:pointer}.dropzone.dz-started .dz-message{display:none}.dropzone.dz-drag-hover{border-style:solid}.dropzone.dz-drag-hover .dz-message{opacity:.5}.dropzone .dz-message{text-align:center;margin:3em 0}.dropzone .dz-message .dz-button{background:none;color:inherit;border:none;padding:0;font:inherit;cursor:pointer;outline:inherit}.dropzone .dz-preview{position:relative;display:inline-block;vertical-align:top;margin:16px;min-height:100px}.dropzone .dz-preview:hover{z-index:1000}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:20px;background:#999;background:linear-gradient(to bottom, #eee, #ddd)}.dropzone .dz-preview.dz-file-preview .dz-details{opacity:1}.dropzone .dz-preview.dz-image-preview{background:#fff}.dropzone .dz-preview.dz-image-preview .dz-details{transition:opacity .2s linear}.dropzone .dz-preview .dz-remove{font-size:14px;text-align:center;display:block;cursor:pointer;border:none}.dropzone .dz-preview .dz-remove:hover{text-decoration:underline}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview .dz-details{z-index:20;position:absolute;top:0;left:0;opacity:0;font-size:13px;min-width:100%;max-width:100%;padding:2em 1em;text-align:center;color:rgba(0,0,0,.9);line-height:150%}.dropzone .dz-preview .dz-details .dz-size{margin-bottom:1em;font-size:16px}.dropzone .dz-preview .dz-details .dz-filename{white-space:nowrap}.dropzone .dz-preview .dz-details .dz-filename:hover span{border:1px solid rgba(200,200,200,.8);background-color:rgba(255,255,255,.8)}.dropzone .dz-preview .dz-details .dz-filename:not(:hover){overflow:hidden;text-overflow:ellipsis}.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span{border:1px solid transparent}.dropzone .dz-preview .dz-details .dz-filename span,.dropzone .dz-preview .dz-details .dz-size span{background-color:rgba(255,255,255,.4);padding:0 .4em;border-radius:3px}.dropzone .dz-preview:hover .dz-image img{transform:scale(1.05, 1.05);filter:blur(8px)}.dropzone .dz-preview .dz-image{border-radius:20px;overflow:hidden;width:120px;height:120px;position:relative;display:block;z-index:10}.dropzone .dz-preview .dz-image img{display:block}.dropzone .dz-preview.dz-success .dz-success-mark{animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview.dz-error .dz-error-mark{opacity:1;animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark{pointer-events:none;opacity:0;z-index:500;position:absolute;display:block;top:50%;left:50%;margin-left:-27px;margin-top:-27px;background:rgba(0,0,0,.8);border-radius:50%}.dropzone .dz-preview .dz-success-mark svg,.dropzone .dz-preview .dz-error-mark svg{display:block;width:54px;height:54px;fill:#fff}.dropzone .dz-preview.dz-processing .dz-progress{opacity:1;transition:all .2s linear}.dropzone .dz-preview.dz-complete .dz-progress{opacity:0;transition:opacity .4s ease-in}.dropzone .dz-preview:not(.dz-processing) .dz-progress{animation:pulse 6s ease infinite}.dropzone .dz-preview .dz-progress{opacity:1;z-index:1000;pointer-events:none;position:absolute;height:20px;top:50%;margin-top:-10px;left:15%;right:15%;border:3px solid rgba(0,0,0,.8);background:rgba(0,0,0,.8);border-radius:10px;overflow:hidden}.dropzone .dz-preview .dz-progress .dz-upload{background:#fff;display:block;position:relative;height:100%;width:0;transition:width 300ms ease-in-out;border-radius:17px}.dropzone .dz-preview.dz-error .dz-error-message{display:block}.dropzone .dz-preview.dz-error:hover .dz-error-message{opacity:1;pointer-events:auto}.dropzone .dz-preview .dz-error-message{pointer-events:none;z-index:1000;position:absolute;display:block;display:none;opacity:0;transition:opacity .3s ease;border-radius:8px;font-size:13px;top:130px;left:-10px;width:140px;background:#b10606;padding:.5em 1em;color:#fff}.dropzone .dz-preview .dz-error-message:after{content:"";position:absolute;top:-6px;left:64px;width:0;height:0;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #b10606}/*# sourceMappingURL=dropzone.css.map */ diff --git a/web/static/css/fullcalendar.min.css b/web/static/css/fullcalendar.min.css new file mode 100644 index 0000000..5c0056e --- /dev/null +++ b/web/static/css/fullcalendar.min.css @@ -0,0 +1 @@ +.fc-icon,.fc-unselectable{-moz-user-select:none;-ms-user-select:none}.fc .fc-button,.fc-icon{text-transform:none;font-weight:400}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc .fc-button:not(:disabled),.fc a[data-navlink],.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-unselectable{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc{display:flex;flex-direction:column;font-size:1em}.fc .fc-button,.fc-icon{display:inline-block;text-align:center}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{vertical-align:top;padding:0}.fc .fc-button,.fc .fc-button .fc-icon,.fc .fc-button-group,.fc .fc-timegrid-slot-label{vertical-align:middle}.fc a[data-navlink]:hover{text-decoration:underline}.fc .fc-button:hover,.fc .fc-list-event-title a,a.fc-event,a.fc-event:hover{text-decoration:none}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,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") format('truetype');font-weight:400;font-style:normal}.fc-icon{width:1em;height:1em;-webkit-user-select:none;user-select:none;font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before{content:"\e900"}.fc-icon-chevron-right:before{content:"\e901"}.fc-icon-chevrons-left:before{content:"\e902"}.fc-icon-chevrons-right:before{content:"\e903"}.fc-icon-minus-square:before{content:"\e904"}.fc-icon-plus-square:before{content:"\e905"}.fc-icon-x:before{content:"\e906"}.fc .fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button-primary:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color,#1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color,#1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color,#1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color,#151e27)}.fc .fc-button .fc-icon{font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color,#fff);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business,.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color,rgba(215,215,215,.3))}.fc .fc-bg-event{background:var(--fc-bg-event-color,#8fdf82);opacity:.3;opacity:var(--fc-bg-event-opacity,.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size,.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color,rgba(188,232,241,.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer,.fc-h-event,.fc-v-event{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width,8px)/ 2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width,1px);width:8px;width:var(--fc-event-resizer-dot-total-width,8px);height:8px;height:var(--fc-event-resizer-dot-total-width,8px);border-style:solid;border-color:inherit;background:var(--fc-page-bg-color,#fff)}.fc-event-selected .fc-event-resizer:before{content:'';position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after,.fc-event:focus:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color,rgba(0,0,0,.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-h-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness,8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc .fc-popover{position:absolute;z-index:9999;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd);background:var(--fc-page-bg-color,#fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}:root{--fc-daygrid-event-dot-width:8px;--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin-top:1px}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{content:"";clear:both;display:table}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));color:grey;color:var(--fc-neutral-text-color,grey)}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:700}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:0 4px;box-sizing:content-box;width:0;height:0;border:4px solid #3788d8;border:calc(var(--fc-daygrid-event-dot-width,8px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:4px;border-radius:calc(var(--fc-daygrid-event-dot-width,8px)/ 2)}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-v-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff);height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness,8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-body,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0}.fc .fc-timegrid-slot:empty:before{content:'\00a0'}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight,.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{position:absolute;top:0;bottom:0;left:0;right:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px var(--fc-page-bg-color,#fff)}.fc-timegrid-event,.fc-timegrid-more-link{font-size:.85em;font-size:var(--fc-small-font-size,.85em);border-radius:3px}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size,.85em);margin-bottom:1px}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:'\00a0-\00a0'}.fc-timegrid-event-short .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-timegrid-more-link{position:absolute;z-index:9999;color:inherit;color:var(--fc-more-link-text-color,inherit);background:var(--fc-more-link-bg-color,#d0d0d0);cursor:pointer;margin-bottom:1px}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red);border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-theme-standard .fc-list{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-list-empty{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:sticky;top:0;background:var(--fc-page-bg-color,#fff)}.fc .fc-list-table thead{position:absolute;left:-10000px}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:#f5f5f5;background-color:var(--fc-list-event-hover-bg-color,#f5f5f5)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;box-sizing:content-box;width:0;height:0;border:5px solid #3788d8;border:calc(var(--fc-list-event-dot-width,10px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:5px;border-radius:calc(var(--fc-list-event-dot-width,10px)/ 2)}.fc .fc-list-event-title a{color:inherit}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit}.fc-theme-bootstrap5 a:not([href]){color:inherit;text-decoration:inherit}.fc-theme-bootstrap5 .fc-list,.fc-theme-bootstrap5 .fc-scrollgrid,.fc-theme-bootstrap5 td,.fc-theme-bootstrap5 th{border:1px solid var(--bs-gray-400)}.fc-theme-bootstrap5 .fc-scrollgrid{border-right-width:0;border-bottom-width:0}.fc-theme-bootstrap5-shaded{background-color:var(--bs-gray-200)} \ No newline at end of file diff --git a/web/static/css/jquery.filetree.css b/web/static/css/jquery.filetree.css new file mode 100644 index 0000000..ceb3931 --- /dev/null +++ b/web/static/css/jquery.filetree.css @@ -0,0 +1,74 @@ +UL.jqueryFileTree{padding:0px;margin:0px;display:none;line-height:150%;} +UL.jqueryFileTree LI{list-style:none;padding:0px;padding-left:20px;margin:0px;white-space:nowrap;} +UL.jqueryFileTree A{color:inherit;text-decoration:none;display:inline-block;padding:0px 2px;cursor:pointer;} +UL.jqueryFileTree A:hover{background:#90b5e2;} +/* Core Styles */ +.jqueryFileTree LI.directory{background:url(../img/filetree/directory.png) left top no-repeat;white-space:normal!important;word-break:break-all;} +.jqueryFileTree LI.expanded{background:url(../img/filetree/folder_open.png) left top no-repeat;} +.jqueryFileTree LI.expanded > a{font-weight: bold;} +.jqueryFileTree LI.file{background:url(../img/filetree/file.png) left top no-repeat;} +.jqueryFileTree LI.wait{background:url(../img/filetree/spinner.gif) left top no-repeat;} +/* File Extensions*/ +.jqueryFileTree LI.ext_3gp{background:url(../img/filetree/film.png) left top no-repeat;} +.jqueryFileTree LI.ext_afp{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_afpa{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_asp{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_aspx{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_avi{background:url(../img/filetree/film.png) left top no-repeat;} +.jqueryFileTree LI.ext_bat{background:url(../img/filetree/application.png) left top no-repeat;} +.jqueryFileTree LI.ext_bmp{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_c{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_cfm{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_cgi{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_com{background:url(../img/filetree/application.png) left top no-repeat;} +.jqueryFileTree LI.ext_cpp{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_css{background:url(../img/filetree/css.png) left top no-repeat;} +.jqueryFileTree LI.ext_doc{background:url(../img/filetree/doc.png) left top no-repeat;} +.jqueryFileTree LI.ext_exe{background:url(../img/filetree/application.png) left top no-repeat;} +.jqueryFileTree LI.ext_gif{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_fla{background:url(../img/filetree/swf.png) left top no-repeat;} +.jqueryFileTree LI.ext_h{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_htm{background:url(../img/filetree/html.png) left top no-repeat;} +.jqueryFileTree LI.ext_html{background:url(../img/filetree/html.png) left top no-repeat;} +.jqueryFileTree LI.ext_img{background:url(../img/filetree/disk-image.png) left top no-repeat;} +.jqueryFileTree LI.ext_iso{background:url(../img/filetree/cdrom.png) left top no-repeat;} +.jqueryFileTree LI.ext_jar{background:url(../img/filetree/java.png) left top no-repeat;} +.jqueryFileTree LI.ext_jpg{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_jpeg{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_js{background:url(../img/filetree/script.png) left top no-repeat;} +.jqueryFileTree LI.ext_lasso{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_log{background:url(../img/filetree/txt.png) left top no-repeat;} +.jqueryFileTree LI.ext_m4p{background:url(../img/filetree/music.png) left top no-repeat;} +.jqueryFileTree LI.ext_mov{background:url(../img/filetree/film.png) left top no-repeat;} +.jqueryFileTree LI.ext_mp3{background:url(../img/filetree/music.png) left top no-repeat;} +.jqueryFileTree LI.ext_mp4{background:url(../img/filetree/film.png) left top no-repeat;} +.jqueryFileTree LI.ext_mpg{background:url(../img/filetree/film.png) left top no-repeat;} +.jqueryFileTree LI.ext_mpeg{background:url(../img/filetree/film.png) left top no-repeat;} +.jqueryFileTree LI.ext_ogg{background:url(../img/filetree/music.png) left top no-repeat;} +.jqueryFileTree LI.ext_pcx{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_pdf{background:url(../img/filetree/pdf.png) left top no-repeat;} +.jqueryFileTree LI.ext_php{background:url(../img/filetree/php.png) left top no-repeat;} +.jqueryFileTree LI.ext_plg{background:url(../img/filetree/plg.png) left top no-repeat;} +.jqueryFileTree LI.ext_png{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_ppt{background:url(../img/filetree/ppt.png) left top no-repeat;} +.jqueryFileTree LI.ext_psd{background:url(../img/filetree/psd.png) left top no-repeat;} +.jqueryFileTree LI.ext_pl{background:url(../img/filetree/script.png) left top no-repeat;} +.jqueryFileTree LI.ext_py{background:url(../img/filetree/script.png) left top no-repeat;} +.jqueryFileTree LI.ext_qcow{background:url(../img/filetree/disk-image.png) left top no-repeat;} +.jqueryFileTree LI.ext_qcow2{background:url(../img/filetree/disk-image.png) left top no-repeat;} +.jqueryFileTree LI.ext_rb{background:url(../img/filetree/ruby.png) left top no-repeat;} +.jqueryFileTree LI.ext_rbx{background:url(../img/filetree/ruby.png) left top no-repeat;} +.jqueryFileTree LI.ext_rhtml{background:url(../img/filetree/ruby.png) left top no-repeat;} +.jqueryFileTree LI.ext_rpm{background:url(../img/filetree/linux.png) left top no-repeat;} +.jqueryFileTree LI.ext_ruby{background:url(../img/filetree/ruby.png) left top no-repeat;} +.jqueryFileTree LI.ext_sql{background:url(../img/filetree/db.png) left top no-repeat;} +.jqueryFileTree LI.ext_swf{background:url(../img/filetree/swf.png) left top no-repeat;} +.jqueryFileTree LI.ext_tif{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_tiff{background:url(../img/filetree/picture.png) left top no-repeat;} +.jqueryFileTree LI.ext_txt{background:url(../img/filetree/txt.png) left top no-repeat;} +.jqueryFileTree LI.ext_vb{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_wav{background:url(../img/filetree/music.png) left top no-repeat;} +.jqueryFileTree LI.ext_wmv{background:url(../img/filetree/film.png) left top no-repeat;} +.jqueryFileTree LI.ext_xls{background:url(../img/filetree/xls.png) left top no-repeat;} +.jqueryFileTree LI.ext_xml{background:url(../img/filetree/code.png) left top no-repeat;} +.jqueryFileTree LI.ext_zip{background:url(../img/filetree/zip.png) left top no-repeat;} diff --git a/web/static/css/nprogress.css b/web/static/css/nprogress.css new file mode 100644 index 0000000..7a288bc --- /dev/null +++ b/web/static/css/nprogress.css @@ -0,0 +1,72 @@ +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: var(--tblr-primary) !important; + position: fixed; + z-index: 1031; + top: calc(env(safe-area-inset-top) + var(--safe-area-inset-top)); + left: 0; + width: 100%; + height: 2px; +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0; + width: 100px; + height: 100%; + box-shadow: 0 0 10px var(--tblr-primary), 0 0 5px var(--tblr-primary); + opacity: 1.0; + + -webkit-transform: rotate(0deg) translate(0px, -1px); + -ms-transform: rotate(0deg) translate(0px, -1px); + transform: rotate(0deg) translate(0px, -1px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: #29d; + border-left-color: #29d; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@keyframes nprogress-spinner { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + diff --git a/web/static/css/style.css b/web/static/css/style.css new file mode 100644 index 0000000..4a5af12 --- /dev/null +++ b/web/static/css/style.css @@ -0,0 +1,160 @@ +html { + --safe-area-inset-top: 0px; + min-height: calc(100% + env(safe-area-inset-top) + var(--safe-area-inset-top)); +} + +body, .page { + min-height: 100%; +} + +.theme-light .page { + background-image: linear-gradient(180deg, rgba(123, 178, 233, 0.4) 0%, rgba(231, 235, 239, 1) calc(50vh)); +} + +.theme-dark .page { + background-image: linear-gradient(180deg, var(--tblr-body-bg) 0%, var(--tblr-bg-surface) calc(50vh)); +} + +.tooltip-inner { + text-align: left; +} + +.fileTree { + width: 240px; + max-height: 200px; + overflow-y: scroll; + overflow-x: hidden; + position: absolute; + display: none; +} + +.dropzone { + border: 1px dashed var(--tblr-border-color) !important; +} + + +@media (max-width: 992px) { + .navbar ul.navbar-nav { + overflow-y: auto; + max-height: 80vh; + } +} + +.page-wrapper { + padding-top: calc(env(safe-area-inset-top) + var(--safe-area-inset-top) + 51px) !important; + padding-left: env(safe-area-inset-left) !important; + overflow: hidden !important; +} + +.page-wrapper-top-off { + margin-top: calc(0px - env(safe-area-inset-top) - var(--safe-area-inset-top) - 51px) !important; +} + +#navbar-menu { + box-shadow: none!important; + border:0!important; +} + +.offcanvas { + padding-top: calc(env(safe-area-inset-top) + var(--safe-area-inset-top)) !important; + padding-left: env(safe-area-inset-left) !important; +} + +.modal-dialog { + padding-top: calc(env(safe-area-inset-top) + var(--safe-area-inset-top)) !important; +} + + +.fc-toolbar-title { + font-size: 1.5em !important; +} + +.fc-list-event .media_calendar_item_info { + display: block !important; +} + +.fc .fc-list-event:hover td { + background-color: rgba(200, 200, 200, 0.1) !important; +} + +.lit-normal-card { + position:relative; + z-index:1; + --tblr-aspect-ratio:150%; + border:none; +} + +.lit-normal-card:hover { + transform:scale(1.05, 1.05); + opacity:1; +} + +.lit-media-info-background { + background-image: + linear-gradient(180deg, rgba(var(--tblr-body-bg-rgb),0) 50%, rgba(var(--tblr-body-bg-rgb), 1) 100%), + linear-gradient(90deg, rgba(var(--tblr-body-bg-rgb),0) 50%, rgba(var(--tblr-body-bg-rgb), 1) 100%), + linear-gradient(270deg, rgba(var(--tblr-body-bg-rgb),0) 50%, rgba(var(--tblr-body-bg-rgb), 1) 100%); + box-shadow:0 0 0 2px rgb(var(--tblr-body-bg-rgb)); +} + +.theme-light .lit-media-info-background { + background-image: + linear-gradient(180deg, rgba(231, 235, 239, 0) 50%, rgba(231, 235, 239, 1) 100%), + linear-gradient(90deg, rgba(231, 235, 239, 0) 50%, rgba(231, 235, 239, 1) 100%), + linear-gradient(270deg, rgba(231, 235, 239, 0) 50%, rgba(231, 235, 239, 1) 100%); + box-shadow:0 0 0 2px rgb(231, 235, 239); +} + +.lit-media-info-image { + width:233px; + height:350px; +} + +@media (max-width: 767.98px) { + .lit-media-info-image { + width:150px; + height:225px; + } +} + +.lit-person-card { + position:relative; + z-index:1; + --tblr-aspect-ratio:150%; + border:none; + box-shadow:0 0 0 1px #888888 inset,0 .125rem .25rem rgba(0,0,0,0.2); + background-image:linear-gradient(45deg,#99999b,#637599 60%); +} + +.lit-person-card:hover { + transform:scale(1.05, 1.05); + opacity:1; + box-shadow:0 0 0 1px #bbbbbb inset; + background-image:linear-gradient(45deg,#bbbbbd,#8597aa 60%); +} + +.grid-normal-card { + grid-template-columns: repeat(auto-fill,minmax(15rem,1fr)); +} + +.grid-media-card { + grid-template-columns: repeat(auto-fill,minmax(9.375rem,1fr)); +} + +.grid-info-card { + grid-template-columns: repeat(auto-fill,minmax(20rem,1fr)); +} + +.offcanvas-backdrop.show { + opacity: 0.5 !important; + background-color: #000 !important; +} + +.select_logger{ + display:flex; + align-items: center; +} + +.select_logger h5{ + padding-right:5px +} \ No newline at end of file diff --git a/web/static/css/tabler.min.css b/web/static/css/tabler.min.css new file mode 100644 index 0000000..a1eca7c --- /dev/null +++ b/web/static/css/tabler.min.css @@ -0,0 +1,14 @@ +/*! +* Tabler v1.0.0-beta16 (https://tabler.io) +* @version 1.0.0-beta16 +* @link https://tabler.io +* Copyright 2018-2022 The Tabler Authors +* Copyright 2018-2022 codecalm.net Paweł Kuna +* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE) +*/ +@charset "UTF-8";:root{--tblr-blue:#206bc4;--tblr-indigo:#4263eb;--tblr-purple:#ae3ec9;--tblr-pink:#d6336c;--tblr-red:#d63939;--tblr-orange:#f76707;--tblr-yellow:#f59f00;--tblr-green:#2fb344;--tblr-teal:#0ca678;--tblr-cyan:#17a2b8;--tblr-black:#000000;--tblr-white:#ffffff;--tblr-gray:#49566c;--tblr-gray-dark:#1d273b;--tblr-gray-100:#f1f5f9;--tblr-gray-200:#e2e8f0;--tblr-gray-300:#c8d3e1;--tblr-gray-400:#9ba9be;--tblr-gray-500:#6c7a91;--tblr-gray-600:#49566c;--tblr-gray-700:#313c52;--tblr-gray-800:#1d273b;--tblr-gray-900:#0f172a;--tblr-primary:#206bc4;--tblr-secondary:#616876;--tblr-success:#2fb344;--tblr-info:#4299e1;--tblr-warning:#f76707;--tblr-danger:#d63939;--tblr-light:#f8fafc;--tblr-dark:#1d273b;--tblr-muted:#616876;--tblr-blue:#206bc4;--tblr-azure:#4299e1;--tblr-indigo:#4263eb;--tblr-purple:#ae3ec9;--tblr-pink:#d6336c;--tblr-red:#d63939;--tblr-orange:#f76707;--tblr-yellow:#f59f00;--tblr-lime:#74b816;--tblr-green:#2fb344;--tblr-teal:#0ca678;--tblr-cyan:#17a2b8;--tblr-facebook:#1877F2;--tblr-twitter:#1da1f2;--tblr-linkedin:#0a66c2;--tblr-google:#dc4e41;--tblr-youtube:#ff0000;--tblr-vimeo:#1ab7ea;--tblr-dribbble:#ea4c89;--tblr-github:#181717;--tblr-instagram:#e4405f;--tblr-pinterest:#bd081c;--tblr-vk:#6383a8;--tblr-rss:#ffa500;--tblr-flickr:#0063dc;--tblr-bitbucket:#0052cc;--tblr-tabler:#206bc4;--tblr-primary-rgb:32,107,196;--tblr-secondary-rgb:97,104,118;--tblr-success-rgb:47,179,68;--tblr-info-rgb:66,153,225;--tblr-warning-rgb:247,103,7;--tblr-danger-rgb:214,57,57;--tblr-light-rgb:248,250,252;--tblr-dark-rgb:29,39,59;--tblr-muted-rgb:97,104,118;--tblr-blue-rgb:32,107,196;--tblr-azure-rgb:66,153,225;--tblr-indigo-rgb:66,99,235;--tblr-purple-rgb:174,62,201;--tblr-pink-rgb:214,51,108;--tblr-red-rgb:214,57,57;--tblr-orange-rgb:247,103,7;--tblr-yellow-rgb:245,159,0;--tblr-lime-rgb:116,184,22;--tblr-green-rgb:47,179,68;--tblr-teal-rgb:12,166,120;--tblr-cyan-rgb:23,162,184;--tblr-facebook-rgb:24,119,242;--tblr-twitter-rgb:29,161,242;--tblr-linkedin-rgb:10,102,194;--tblr-google-rgb:220,78,65;--tblr-youtube-rgb:255,0,0;--tblr-vimeo-rgb:26,183,234;--tblr-dribbble-rgb:234,76,137;--tblr-github-rgb:24,23,23;--tblr-instagram-rgb:228,64,95;--tblr-pinterest-rgb:189,8,28;--tblr-vk-rgb:99,131,168;--tblr-rss-rgb:255,165,0;--tblr-flickr-rgb:0,99,220;--tblr-bitbucket-rgb:0,82,204;--tblr-tabler-rgb:32,107,196;--tblr-white-rgb:255,255,255;--tblr-black-rgb:0,0,0;--tblr-body-color-rgb:29,39,59;--tblr-body-bg-rgb:241,245,249;--tblr-font-sans-serif:-apple-system,BlinkMacSystemFont,San Francisco,Segoe UI,Roboto,Helvetica Neue,sans-serif;--tblr-font-monospace:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;--tblr-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--tblr-body-font-family:var(--tblr-font-sans-serif);--tblr-body-font-size:0.875rem;--tblr-body-font-weight:400;--tblr-body-line-height:1.4285714286;--tblr-body-color:#1d273b;--tblr-body-bg:#f1f5f9;--tblr-border-width:1px;--tblr-border-style:solid;--tblr-border-color:#e6e7e9;--tblr-border-color-translucent:rgba(97, 104, 118, 0.16);--tblr-border-radius:4px;--tblr-border-radius-sm:2px;--tblr-border-radius-lg:8px;--tblr-border-radius-xl:1rem;--tblr-border-radius-2xl:2rem;--tblr-border-radius-pill:100rem;--tblr-link-color:var(--tblr-primary);--tblr-link-hover-color:var(--tblr-primary-darken);--tblr-code-color:var(--tblr-gray-600);--tblr-highlight-bg:#fdeccc}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--tblr-body-font-family);font-size:var(--tblr-body-font-size);font-weight:var(--tblr-body-font-weight);line-height:var(--tblr-body-line-height);color:var(--tblr-body-color);text-align:var(--tblr-body-text-align);background-color:var(--tblr-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}.hr,hr{margin:2rem 0;color:inherit;border:0;border-top:1px solid;opacity:.16}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:var(--tblr-font-weight-medium);line-height:1.2}.h1,h1{font-size:1.5rem}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1rem}.h4,h4{font-size:.875rem}.h5,h5{font-size:.75rem}.h6,h6{font-size:.625rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:85.714285%}.mark,mark{padding:.1875em;background-color:var(--tblr-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--tblr-link-color);text-decoration:none}a:hover{color:var(--tblr-link-hover-color);text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--tblr-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:85.714285%;color:var(--tblr-light)}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:85.714285%;color:var(--tblr-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:2px 4px;font-size:85.714285%;color:var(--tblr-muted);background-color:var(--tblr-code-bg);border-radius:2px}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#616876;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:.875rem;font-weight:var(--tblr-font-weight-normal)}.display-1{font-size:5rem;font-weight:300;line-height:1.2}.display-2{font-size:4.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}.display-5{font-size:3rem;font-weight:300;line-height:1.2}.display-6{font-size:2rem;font-weight:300;line-height:1.2}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:85.714285%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:.875rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:85.714285%;color:#49566c}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#f1f5f9;border:1px solid var(--tblr-border-color);border-radius:4px;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:85.714285%;color:#49566c}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--tblr-gutter-x:1.5rem;--tblr-gutter-y:0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--tblr-gutter-x:1rem;--tblr-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--tblr-gutter-y));margin-right:calc(-.5 * var(--tblr-gutter-x));margin-left:calc(-.5 * var(--tblr-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-top:var(--tblr-gutter-y)}.grid{display:grid;grid-template-rows:repeat(var(--tblr-rows,1),1fr);grid-template-columns:repeat(var(--tblr-columns,12),1fr);gap:var(--tblr-gap,1rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media (min-width:576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media (min-width:768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media (min-width:992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media (min-width:1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media (min-width:1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--tblr-gutter-x:0}.g-0,.gy-0{--tblr-gutter-y:0}.g-1,.gx-1{--tblr-gutter-x:0.25rem}.g-1,.gy-1{--tblr-gutter-y:0.25rem}.g-2,.gx-2{--tblr-gutter-x:0.5rem}.g-2,.gy-2{--tblr-gutter-y:0.5rem}.g-3,.gx-3{--tblr-gutter-x:1rem}.g-3,.gy-3{--tblr-gutter-y:1rem}.g-4,.gx-4{--tblr-gutter-x:2rem}.g-4,.gy-4{--tblr-gutter-y:2rem}.g-5,.gx-5{--tblr-gutter-x:4rem}.g-5,.gy-5{--tblr-gutter-y:4rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--tblr-gutter-x:0}.g-sm-0,.gy-sm-0{--tblr-gutter-y:0}.g-sm-1,.gx-sm-1{--tblr-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--tblr-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--tblr-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--tblr-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--tblr-gutter-x:1rem}.g-sm-3,.gy-sm-3{--tblr-gutter-y:1rem}.g-sm-4,.gx-sm-4{--tblr-gutter-x:2rem}.g-sm-4,.gy-sm-4{--tblr-gutter-y:2rem}.g-sm-5,.gx-sm-5{--tblr-gutter-x:4rem}.g-sm-5,.gy-sm-5{--tblr-gutter-y:4rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--tblr-gutter-x:0}.g-md-0,.gy-md-0{--tblr-gutter-y:0}.g-md-1,.gx-md-1{--tblr-gutter-x:0.25rem}.g-md-1,.gy-md-1{--tblr-gutter-y:0.25rem}.g-md-2,.gx-md-2{--tblr-gutter-x:0.5rem}.g-md-2,.gy-md-2{--tblr-gutter-y:0.5rem}.g-md-3,.gx-md-3{--tblr-gutter-x:1rem}.g-md-3,.gy-md-3{--tblr-gutter-y:1rem}.g-md-4,.gx-md-4{--tblr-gutter-x:2rem}.g-md-4,.gy-md-4{--tblr-gutter-y:2rem}.g-md-5,.gx-md-5{--tblr-gutter-x:4rem}.g-md-5,.gy-md-5{--tblr-gutter-y:4rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--tblr-gutter-x:0}.g-lg-0,.gy-lg-0{--tblr-gutter-y:0}.g-lg-1,.gx-lg-1{--tblr-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--tblr-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--tblr-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--tblr-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--tblr-gutter-x:1rem}.g-lg-3,.gy-lg-3{--tblr-gutter-y:1rem}.g-lg-4,.gx-lg-4{--tblr-gutter-x:2rem}.g-lg-4,.gy-lg-4{--tblr-gutter-y:2rem}.g-lg-5,.gx-lg-5{--tblr-gutter-x:4rem}.g-lg-5,.gy-lg-5{--tblr-gutter-y:4rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--tblr-gutter-x:0}.g-xl-0,.gy-xl-0{--tblr-gutter-y:0}.g-xl-1,.gx-xl-1{--tblr-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--tblr-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--tblr-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--tblr-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--tblr-gutter-x:1rem}.g-xl-3,.gy-xl-3{--tblr-gutter-y:1rem}.g-xl-4,.gx-xl-4{--tblr-gutter-x:2rem}.g-xl-4,.gy-xl-4{--tblr-gutter-y:2rem}.g-xl-5,.gx-xl-5{--tblr-gutter-x:4rem}.g-xl-5,.gy-xl-5{--tblr-gutter-y:4rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--tblr-gutter-x:0}.g-xxl-0,.gy-xxl-0{--tblr-gutter-y:0}.g-xxl-1,.gx-xxl-1{--tblr-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--tblr-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--tblr-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--tblr-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--tblr-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--tblr-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--tblr-gutter-x:2rem}.g-xxl-4,.gy-xxl-4{--tblr-gutter-y:2rem}.g-xxl-5,.gx-xxl-5{--tblr-gutter-x:4rem}.g-xxl-5,.gy-xxl-5{--tblr-gutter-y:4rem}}.markdown>table,.table{--tblr-table-color:inherit;--tblr-table-bg:transparent;--tblr-table-border-color:var(--tblr-border-color-translucent);--tblr-table-accent-bg:transparent;--tblr-table-striped-color:inherit;--tblr-table-striped-bg:var(--tblr-bg-surface-secondary);--tblr-table-active-color:inherit;--tblr-table-active-bg:rgba(0, 0, 0, 0.1);--tblr-table-hover-color:inherit;--tblr-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:var(--tblr-table-color);vertical-align:top;border-color:var(--tblr-table-border-color)}.markdown>table>:not(caption)>*>*,.table>:not(caption)>*>*{padding:.75rem .75rem;background-color:var(--tblr-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--tblr-table-accent-bg)}.markdown>table>tbody,.table>tbody{vertical-align:inherit}.markdown>table>thead,.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid var(--tblr-border-color-translucent)}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.markdown>table>:not(caption)>*,.table-bordered>:not(caption)>*{border-width:1px 0}.markdown>table>:not(caption)>*>*,.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(even)>*{--tblr-table-accent-bg:var(--tblr-table-striped-bg);color:var(--tblr-table-striped-color)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--tblr-table-accent-bg:var(--tblr-table-striped-bg);color:var(--tblr-table-striped-color)}.table-active{--tblr-table-accent-bg:var(--tblr-table-active-bg);color:var(--tblr-table-active-color)}.table-hover>tbody>tr:hover>*{--tblr-table-accent-bg:var(--tblr-table-hover-bg);color:var(--tblr-table-hover-color)}.table-primary{--tblr-table-color:#1d273b;--tblr-table-bg:#d2e1f3;--tblr-table-border-color:#c0cee1;--tblr-table-striped-bg:#c9d8ea;--tblr-table-striped-color:#1d273b;--tblr-table-active-bg:#c0cee1;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#c4d3e5;--tblr-table-hover-color:#1d273b;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-secondary{--tblr-table-color:#1d273b;--tblr-table-bg:#dfe1e4;--tblr-table-border-color:#ccced3;--tblr-table-striped-bg:#d5d8dc;--tblr-table-striped-color:#1d273b;--tblr-table-active-bg:#ccced3;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#d0d3d7;--tblr-table-hover-color:#1d273b;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-success{--tblr-table-color:#1d273b;--tblr-table-bg:#d5f0da;--tblr-table-border-color:#c3dcca;--tblr-table-striped-bg:#cce6d2;--tblr-table-striped-color:#1d273b;--tblr-table-active-bg:#c3dcca;--tblr-table-active-color:#1d273b;--tblr-table-hover-bg:#c7e1ce;--tblr-table-hover-color:#1d273b;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-info{--tblr-table-color:#1d273b;--tblr-table-bg:#d9ebf9;--tblr-table-border-color:#c6d7e6;--tblr-table-striped-bg:#d0e1f0;--tblr-table-striped-color:#1d273b;--tblr-table-active-bg:#c6d7e6;--tblr-table-active-color:#1d273b;--tblr-table-hover-bg:#cbdceb;--tblr-table-hover-color:#1d273b;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-warning{--tblr-table-color:#1d273b;--tblr-table-bg:#fde1cd;--tblr-table-border-color:#e7cebe;--tblr-table-striped-bg:#f2d8c6;--tblr-table-striped-color:#1d273b;--tblr-table-active-bg:#e7cebe;--tblr-table-active-color:#1d273b;--tblr-table-hover-bg:#ecd3c2;--tblr-table-hover-color:#1d273b;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-danger{--tblr-table-color:#1d273b;--tblr-table-bg:#f7d7d7;--tblr-table-border-color:#e1c5c7;--tblr-table-striped-bg:#eccecf;--tblr-table-striped-color:#1d273b;--tblr-table-active-bg:#e1c5c7;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#e7cacb;--tblr-table-hover-color:#1d273b;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-light{--tblr-table-color:#1d273b;--tblr-table-bg:#f8fafc;--tblr-table-border-color:#e2e5e9;--tblr-table-striped-bg:#edeff2;--tblr-table-striped-color:#1d273b;--tblr-table-active-bg:#e2e5e9;--tblr-table-active-color:#1d273b;--tblr-table-hover-bg:#e8eaee;--tblr-table-hover-color:#1d273b;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-dark{--tblr-table-color:#f8fafc;--tblr-table-bg:#1d273b;--tblr-table-border-color:#333c4e;--tblr-table-striped-bg:#283245;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#333c4e;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#2d3749;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem;font-size:.875rem;font-weight:var(--tblr-font-weight-medium)}.col-form-label{padding-top:calc(.4375rem + 1px);padding-bottom:calc(.4375rem + 1px);margin-bottom:0;font-size:inherit;font-weight:var(--tblr-font-weight-medium);line-height:1.4285714286}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.125rem + 1px);padding-bottom:calc(.125rem + 1px);font-size:.75rem}.form-text{margin-top:.25rem;font-size:85.714285%;color:#616876}.form-control{display:block;width:100%;padding:.4375rem .75rem;font-family:var(--tblr-font-sans-serif);font-size:.875rem;font-weight:400;line-height:1.4285714286;color:inherit;background-color:var(--tblr-bg-forms);background-clip:padding-box;border:1px solid var(--tblr-border-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--tblr-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:inherit;background-color:var(--tblr-bg-forms);border-color:#90b5e2;outline:0;box-shadow:0 0 0 .25rem rgba(32,107,196,.25)}.form-control::-webkit-date-and-time-value{height:1.4285714286em}.form-control::-webkit-input-placeholder{color:#a5a9b1;opacity:1}.form-control::-moz-placeholder{color:#a5a9b1;opacity:1}.form-control:-ms-input-placeholder{color:#a5a9b1;opacity:1}.form-control::-ms-input-placeholder{color:#a5a9b1;opacity:1}.form-control::placeholder{color:#a5a9b1;opacity:1}.form-control:disabled{background-color:var(--tblr-gray-100);opacity:1}.form-control::-webkit-file-upload-button{padding:.4375rem .75rem;margin:-.4375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:inherit;background-color:#f8fafc;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.4375rem .75rem;margin:-.4375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:inherit;background-color:#f8fafc;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#eceeef}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#eceeef}.form-control-plaintext{display:block;width:100%;padding:.4375rem 0;margin-bottom:0;line-height:1.4285714286;color:#1d273b;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.4285714286em + .25rem + 2px);padding:.125rem .25rem;font-size:.75rem;border-radius:2px}.form-control-sm::-webkit-file-upload-button{padding:.125rem .25rem;margin:-.125rem -.25rem;-webkit-margin-end:.25rem;margin-inline-end:.25rem}.form-control-sm::file-selector-button{padding:.125rem .25rem;margin:-.125rem -.25rem;-webkit-margin-end:.25rem;margin-inline-end:.25rem}.form-control-lg{min-height:calc(1.4285714286em + 1rem + 2px);padding:.5rem .75rem;font-size:1.25rem;border-radius:8px}.form-control-lg::-webkit-file-upload-button{padding:.5rem .75rem;margin:-.5rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem}.form-control-lg::file-selector-button{padding:.5rem .75rem;margin:-.5rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem}textarea.form-control{min-height:calc(1.4285714286em + .875rem + 2px)}textarea.form-control-sm{min-height:calc(1.4285714286em + .25rem + 2px)}textarea.form-control-lg{min-height:calc(1.4285714286em + 1rem + 2px)}.form-control-color{width:3rem;height:calc(1.4285714286em + .875rem + 2px);padding:.4375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color::-webkit-color-swatch{border-radius:var(--tblr-border-radius)}.form-control-color.form-control-sm{height:calc(1.4285714286em + .25rem + 2px)}.form-control-color.form-control-lg{height:calc(1.4285714286em + 1rem + 2px)}.form-select{display:block;width:100%;padding:.4375rem 2.25rem .4375rem .75rem;-moz-padding-start:calc(.75rem - 3px);font-family:var(--tblr-font-sans-serif);font-size:.875rem;font-weight:400;line-height:1.4285714286;color:inherit;background-color:var(--tblr-bg-forms);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23a5a9b1' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#90b5e2;outline:0;box-shadow:0 0 0 .25rem rgba(32,107,196,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e2e8f0}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 inherit}.form-select-sm{padding-top:.125rem;padding-bottom:.125rem;padding-left:.25rem;font-size:.75rem;border-radius:2px}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1.25rem;border-radius:8px}.form-check{display:block;min-height:1.25rem;padding-left:1.5rem;margin-bottom:.5rem}.form-check .form-check-input{float:left;margin-left:-1.5rem}.form-check-reverse{padding-right:1.5rem;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5rem;margin-left:0}.form-check-input{width:1rem;height:1rem;margin-top:.2142857143rem;vertical-align:top;background-color:var(--tblr-bg-forms);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:var(--tblr-border-radius)}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#90b5e2;outline:0;box-shadow:0 0 0 .25rem rgba(32,107,196,.25)}.form-check-input:checked{background-color:var(--tblr-primary);border-color:var(--tblr-border-color-translucent)}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#206bc4;border-color:#206bc4;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.7}.form-switch{padding-left:2.5rem}.form-switch .form-check-input{width:2rem;margin-left:-2.5rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23e6e7e9'/%3e%3c/svg%3e");background-position:left center;border-radius:2rem;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2390b5e2'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5rem;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5rem;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.4}.form-range{width:100%;height:1.25rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f1f5f9,0 0 0 .25rem rgba(32,107,196,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f1f5f9,0 0 0 .25rem rgba(32,107,196,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.375rem;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #fff;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#bcd3ed}.form-range::-webkit-slider-runnable-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #fff;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#bcd3ed}.form-range::-moz-range-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#6c7a91}.form-range:disabled::-moz-range-thumb{background-color:#6c7a91}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;width:100%;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-webkit-input-placeholder,.form-floating>.form-control::-webkit-input-placeholder{color:transparent}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext:-ms-input-placeholder,.form-floating>.form-control:-ms-input-placeholder{color:transparent}.form-floating>.form-control-plaintext::-ms-input-placeholder,.form-floating>.form-control::-ms-input-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:not(:-ms-input-placeholder),.form-floating>.form-control:not(:-ms-input-placeholder){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-ms-input-placeholder)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.4375rem .75rem;font-size:.875rem;font-weight:400;line-height:1.4285714286;color:var(--tblr-muted);text-align:center;white-space:nowrap;background-color:#f8fafc;border:1px solid var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem .75rem;font-size:1.25rem;border-radius:8px}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.125rem .25rem;font-size:.75rem;border-radius:2px}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:85.714285%;color:#2fb344}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.765625rem;color:#f8fafc;background-color:rgba(47,179,68,.9);border-radius:4px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#2fb344;padding-right:calc(1.4285714286em + .875rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.3571428572em + .21875rem) center;background-size:calc(.7142857143em + .4375rem) calc(.7142857143em + .4375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#2fb344;box-shadow:0 0 0 .25rem rgba(47,179,68,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.4285714286em + .875rem);background-position:top calc(.3571428572em + .21875rem) right calc(.3571428572em + .21875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#2fb344}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23a5a9b1' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .4375rem) calc(.7142857143em + .4375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#2fb344;box-shadow:0 0 0 .25rem rgba(47,179,68,.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.4285714286em + .875rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#2fb344}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#2fb344}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(47,179,68,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#2fb344}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:85.714285%;color:#d63939}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.765625rem;color:#f8fafc;background-color:rgba(214,57,57,.9);border-radius:4px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#d63939;padding-right:calc(1.4285714286em + .875rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.3571428572em + .21875rem) center;background-size:calc(.7142857143em + .4375rem) calc(.7142857143em + .4375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#d63939;box-shadow:0 0 0 .25rem rgba(214,57,57,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.4285714286em + .875rem);background-position:top calc(.3571428572em + .21875rem) right calc(.3571428572em + .21875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#d63939}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23a5a9b1' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .4375rem) calc(.7142857143em + .4375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#d63939;box-shadow:0 0 0 .25rem rgba(214,57,57,.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.4285714286em + .875rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#d63939}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#d63939}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(214,57,57,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#d63939}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--tblr-btn-padding-x:1rem;--tblr-btn-padding-y:0.4375rem;--tblr-btn-font-family:var(--tblr-font-sans-serif);--tblr-btn-font-size:0.875rem;--tblr-btn-font-weight:var(--tblr-font-weight-medium);--tblr-btn-line-height:1.4285714286;--tblr-btn-color:#1d273b;--tblr-btn-bg:transparent;--tblr-btn-border-width:1px;--tblr-btn-border-color:transparent;--tblr-btn-border-radius:var(--tblr-border-radius);--tblr-btn-hover-border-color:transparent;--tblr-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--tblr-btn-disabled-opacity:0.4;--tblr-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--tblr-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--tblr-btn-padding-y) var(--tblr-btn-padding-x);font-family:var(--tblr-btn-font-family);font-size:var(--tblr-btn-font-size);font-weight:var(--tblr-btn-font-weight);line-height:var(--tblr-btn-line-height);color:var(--tblr-btn-color);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:var(--tblr-btn-border-width) solid var(--tblr-btn-border-color);border-radius:var(--tblr-btn-border-radius);background-color:var(--tblr-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--tblr-btn-hover-color);text-decoration:none;background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--tblr-btn-color);background-color:var(--tblr-btn-bg);border-color:var(--tblr-btn-border-color)}.btn:focus-visible{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--tblr-btn-active-color);background-color:var(--tblr-btn-active-bg);border-color:var(--tblr-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--tblr-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--tblr-btn-disabled-color);pointer-events:none;background-color:var(--tblr-btn-disabled-bg);border-color:var(--tblr-btn-disabled-border-color);opacity:var(--tblr-btn-disabled-opacity)}.btn-link{--tblr-btn-font-weight:400;--tblr-btn-color:var(--tblr-link-color);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-link-hover-color);--tblr-btn-hover-border-color:transparent;--tblr-btn-active-color:var(--tblr-link-hover-color);--tblr-btn-active-border-color:transparent;--tblr-btn-disabled-color:#49566c;--tblr-btn-disabled-border-color:transparent;--tblr-btn-box-shadow:none;--tblr-btn-focus-shadow-rgb:64,128,204;text-decoration:none}.btn-link:focus-visible,.btn-link:hover{text-decoration:underline}.btn-link:focus-visible{color:var(--tblr-btn-color)}.btn-link:hover{color:var(--tblr-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--tblr-btn-padding-y:0.5rem;--tblr-btn-padding-x:0.75rem;--tblr-btn-font-size:1.25rem;--tblr-btn-border-radius:8px}.btn-group-sm>.btn,.btn-sm{--tblr-btn-padding-y:0.125rem;--tblr-btn-padding-x:0.25rem;--tblr-btn-font-size:0.75rem;--tblr-btn-border-radius:2px}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.dropdown-menu{--tblr-dropdown-zindex:1000;--tblr-dropdown-min-width:11rem;--tblr-dropdown-padding-x:0;--tblr-dropdown-padding-y:0.25rem;--tblr-dropdown-spacer:1px;--tblr-dropdown-font-size:0.875rem;--tblr-dropdown-color:#1d273b;--tblr-dropdown-bg:#ffffff;--tblr-dropdown-border-color:var(--tblr-border-color-translucent);--tblr-dropdown-border-radius:4px;--tblr-dropdown-border-width:1px;--tblr-dropdown-inner-border-radius:3px;--tblr-dropdown-divider-bg:var(--tblr-border-color-translucent);--tblr-dropdown-divider-margin-y:0.5rem;--tblr-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--tblr-dropdown-link-color:inherit;--tblr-dropdown-link-hover-color:inherit;--tblr-dropdown-link-hover-bg:rgba(var(--tblr-muted-rgb), 0.04);--tblr-dropdown-link-active-color:var(--tblr-primary);--tblr-dropdown-link-active-bg:var(--tblr-active-bg);--tblr-dropdown-link-disabled-color:#6c7a91;--tblr-dropdown-item-padding-x:0.75rem;--tblr-dropdown-item-padding-y:0.5rem;--tblr-dropdown-header-color:#49566c;--tblr-dropdown-header-padding-x:0.75rem;--tblr-dropdown-header-padding-y:0.25rem;position:absolute;z-index:var(--tblr-dropdown-zindex);display:none;min-width:var(--tblr-dropdown-min-width);padding:var(--tblr-dropdown-padding-y) var(--tblr-dropdown-padding-x);margin:0;font-size:var(--tblr-dropdown-font-size);color:var(--tblr-dropdown-color);text-align:left;list-style:none;background-color:var(--tblr-dropdown-bg);background-clip:padding-box;border:var(--tblr-dropdown-border-width) solid var(--tblr-dropdown-border-color);border-radius:var(--tblr-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--tblr-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--tblr-dropdown-spacer)}.dropup .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(135deg)}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--tblr-dropdown-spacer)}.dropend .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-135deg)}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--tblr-dropdown-spacer)}.dropstart .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(45deg)}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--tblr-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--tblr-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--tblr-dropdown-link-color);text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:var(--tblr-dropdown-link-hover-color);text-decoration:none;background-color:var(--tblr-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--tblr-dropdown-link-active-color);text-decoration:none;background-color:var(--tblr-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--tblr-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--tblr-dropdown-header-padding-y) var(--tblr-dropdown-header-padding-x);margin-bottom:0;font-size:.765625rem;color:var(--tblr-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);color:var(--tblr-dropdown-link-color)}.dropdown-menu-dark{--tblr-dropdown-color:#c8d3e1;--tblr-dropdown-bg:#1d273b;--tblr-dropdown-border-color:var(--tblr-border-color-translucent);--tblr-dropdown-link-color:#c8d3e1;--tblr-dropdown-link-hover-color:#ffffff;--tblr-dropdown-divider-bg:var(--tblr-border-color-translucent);--tblr-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--tblr-dropdown-link-active-color:var(--tblr-primary);--tblr-dropdown-link-active-bg:var(--tblr-active-bg);--tblr-dropdown-link-disabled-color:#6c7a91;--tblr-dropdown-header-color:#6c7a91}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--tblr-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.1875rem;padding-left:.1875rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--tblr-nav-link-padding-x:0.75rem;--tblr-nav-link-padding-y:0.5rem;--tblr-nav-link-color:var(--tblr-muted);--tblr-nav-link-hover-color:var(--tblr-link-hover-color);--tblr-nav-link-disabled-color:var(--tblr-disabled-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--tblr-nav-link-padding-y) var(--tblr-nav-link-padding-x);font-size:var(--tblr-nav-link-font-size);font-weight:var(--tblr-nav-link-font-weight);color:var(--tblr-nav-link-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--tblr-nav-link-hover-color);text-decoration:none}.nav-link.disabled{color:var(--tblr-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--tblr-nav-tabs-border-width:1px;--tblr-nav-tabs-border-color:var(--tblr-border-color);--tblr-nav-tabs-border-radius:var(--tblr-border-radius);--tblr-nav-tabs-link-hover-border-color:var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);--tblr-nav-tabs-link-active-color:var(--tblr-body-color);--tblr-nav-tabs-link-active-bg:#f1f5f9;--tblr-nav-tabs-link-active-border-color:var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);border-bottom:var(--tblr-nav-tabs-border-width) solid var(--tblr-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--tblr-nav-tabs-border-width));background:0 0;border:var(--tblr-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--tblr-nav-tabs-border-radius);border-top-right-radius:var(--tblr-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--tblr-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--tblr-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--tblr-nav-tabs-link-active-color);background-color:var(--tblr-nav-tabs-link-active-bg);border-color:var(--tblr-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--tblr-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--tblr-nav-pills-border-radius:4px;--tblr-nav-pills-link-active-color:var(--tblr-primary);--tblr-nav-pills-link-active-bg:var(--tblr-active-bg)}.nav-pills .nav-link{background:0 0;border:0;border-radius:var(--tblr-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--tblr-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--tblr-nav-pills-link-active-color);background-color:var(--tblr-nav-pills-link-active-bg)}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--tblr-navbar-padding-x:0;--tblr-navbar-padding-y:0.25rem;--tblr-navbar-color:var(--tblr-body-color);--tblr-navbar-hover-color:rgba(0, 0, 0, 0.7);--tblr-navbar-disabled-color:var(--tblr-disabled-color);--tblr-navbar-active-color:var(--tblr-body-color) color;--tblr-navbar-brand-padding-y:0.5rem;--tblr-navbar-brand-margin-end:1rem;--tblr-navbar-brand-font-size:1rem;--tblr-navbar-brand-color:var(--tblr-body-color);--tblr-navbar-brand-hover-color:var(--tblr-body-color) color;--tblr-navbar-nav-link-padding-x:0.75rem;--tblr-navbar-toggler-padding-y:0;--tblr-navbar-toggler-padding-x:0;--tblr-navbar-toggler-font-size:1rem;--tblr-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='var%28--tblr-body-color%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--tblr-navbar-toggler-border-color:rgba(0, 0, 0, 0.1);--tblr-navbar-toggler-border-radius:var(--tblr-border-radius);--tblr-navbar-toggler-focus-width:0;--tblr-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--tblr-navbar-padding-y) var(--tblr-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--tblr-navbar-brand-padding-y);padding-bottom:var(--tblr-navbar-brand-padding-y);margin-right:var(--tblr-navbar-brand-margin-end);font-size:var(--tblr-navbar-brand-font-size);color:var(--tblr-navbar-brand-color);white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--tblr-navbar-brand-hover-color);text-decoration:none}.navbar-nav{--tblr-nav-link-padding-x:0;--tblr-nav-link-padding-y:0.5rem;--tblr-nav-link-color:var(--tblr-navbar-color);--tblr-nav-link-hover-color:var(--tblr-navbar-hover-color);--tblr-nav-link-disabled-color:var(--tblr-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .show>.nav-link{color:var(--tblr-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--tblr-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--tblr-navbar-toggler-padding-y) var(--tblr-navbar-toggler-padding-x);font-size:var(--tblr-navbar-toggler-font-size);line-height:1;color:var(--tblr-navbar-color);background-color:transparent;border:var(--tblr-border-width) solid var(--tblr-navbar-toggler-border-color);border-radius:var(--tblr-navbar-toggler-border-radius);transition:var(--tblr-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--tblr-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--tblr-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--tblr-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark{--tblr-navbar-color:rgba(255, 255, 255, 0.7);--tblr-navbar-hover-color:rgba(255, 255, 255, 0.75);--tblr-navbar-disabled-color:var(--tblr-disabled-color);--tblr-navbar-active-color:#ffffff;--tblr-navbar-brand-color:#ffffff;--tblr-navbar-brand-hover-color:#ffffff;--tblr-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--tblr-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--tblr-card-spacer-y:1rem;--tblr-card-spacer-x:1.5rem;--tblr-card-title-spacer-y:1.25rem;--tblr-card-border-width:var(--tblr-border-width);--tblr-card-border-color:var(--tblr-border-color);--tblr-card-border-radius:var(--tblr-border-radius);--tblr-card-box-shadow:var(--tblr-shadow-card);--tblr-card-inner-border-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)));--tblr-card-cap-padding-y:1rem;--tblr-card-cap-padding-x:1.5rem;--tblr-card-cap-bg:var(--tblr-bg-surface-secondary);--tblr-card-cap-color:inherit;--tblr-card-color:inherit;--tblr-card-bg:var(--tblr-bg-surface);--tblr-card-img-overlay-padding:1rem;--tblr-card-group-margin:1.5rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--tblr-card-height);word-wrap:break-word;background-color:var(--tblr-card-bg);background-clip:border-box;border:var(--tblr-card-border-width) solid var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius)}.card>.hr,.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--tblr-card-spacer-y) var(--tblr-card-spacer-x);color:var(--tblr-card-color)}.card-title{margin-bottom:var(--tblr-card-title-spacer-y)}.card-subtitle{margin-top:calc(-.5 * var(--tblr-card-title-spacer-y));margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:var(--tblr-card-spacer-x)}.card-header{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);margin-bottom:0;color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-bottom:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-header:first-child{border-radius:var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius) 0 0}.card-footer{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-top:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-bottom:calc(-1 * var(--tblr-card-cap-padding-y));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--tblr-card-bg);border-bottom-color:var(--tblr-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--tblr-card-img-overlay-padding);border-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--tblr-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--tblr-accordion-color:var(--tblr-body-color);--tblr-accordion-bg:transparent;--tblr-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--tblr-accordion-border-color:var(--tblr-border-color-translucent);--tblr-accordion-border-width:1px;--tblr-accordion-border-radius:4px;--tblr-accordion-inner-border-radius:3px;--tblr-accordion-btn-padding-x:1.25rem;--tblr-accordion-btn-padding-y:1rem;--tblr-accordion-btn-color:var(--tblr-body-color);--tblr-accordion-btn-bg:transparent;--tblr-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='var%28--tblr-body-color%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--tblr-accordion-btn-icon-width:1rem;--tblr-accordion-btn-icon-transform:rotate(-180deg);--tblr-accordion-btn-icon-transition:transform 0.2s ease-in-out;--tblr-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='inherit'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--tblr-accordion-btn-focus-border-color:var(--tblr-border-color-translucent);--tblr-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(32, 107, 196, 0.25);--tblr-accordion-body-padding-x:1.25rem;--tblr-accordion-body-padding-y:1rem;--tblr-accordion-active-color:inherit;--tblr-accordion-active-bg:transparent}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--tblr-accordion-btn-padding-y) var(--tblr-accordion-btn-padding-x);font-size:.875rem;color:var(--tblr-accordion-btn-color);text-align:left;background-color:var(--tblr-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--tblr-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--tblr-accordion-active-color);background-color:var(--tblr-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--tblr-accordion-border-width)) 0 var(--tblr-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--tblr-accordion-btn-active-icon);transform:var(--tblr-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--tblr-accordion-btn-icon-width);height:var(--tblr-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--tblr-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--tblr-accordion-btn-icon-width);transition:var(--tblr-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--tblr-accordion-btn-focus-border-color);outline:0;box-shadow:var(--tblr-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--tblr-accordion-color);background-color:var(--tblr-accordion-bg);border:var(--tblr-accordion-border-width) solid var(--tblr-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--tblr-accordion-border-radius);border-top-right-radius:var(--tblr-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--tblr-accordion-inner-border-radius);border-top-right-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--tblr-accordion-inner-border-radius);border-bottom-left-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-body{padding:var(--tblr-accordion-body-padding-y) var(--tblr-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}.breadcrumb{--tblr-breadcrumb-padding-x:0;--tblr-breadcrumb-padding-y:0;--tblr-breadcrumb-margin-bottom:1rem;--tblr-breadcrumb-divider-color:var(--tblr-muted);--tblr-breadcrumb-item-padding-x:0.5rem;--tblr-breadcrumb-item-active-color:inherit;display:flex;flex-wrap:wrap;padding:var(--tblr-breadcrumb-padding-y) var(--tblr-breadcrumb-padding-x);margin-bottom:var(--tblr-breadcrumb-margin-bottom);font-size:var(--tblr-breadcrumb-font-size);list-style:none;background-color:var(--tblr-breadcrumb-bg);border-radius:var(--tblr-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--tblr-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--tblr-breadcrumb-item-padding-x);color:var(--tblr-breadcrumb-divider-color);content:var(--tblr-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--tblr-breadcrumb-item-active-color)}.pagination{--tblr-pagination-padding-x:0.25rem;--tblr-pagination-padding-y:0.25rem;--tblr-pagination-font-size:0.875rem;--tblr-pagination-color:var(--tblr-muted);--tblr-pagination-bg:transparent;--tblr-pagination-border-width:0;--tblr-pagination-border-color:#c8d3e1;--tblr-pagination-border-radius:4px;--tblr-pagination-hover-color:var(--tblr-link-hover-color);--tblr-pagination-hover-bg:#e2e8f0;--tblr-pagination-hover-border-color:#c8d3e1;--tblr-pagination-focus-color:var(--tblr-link-hover-color);--tblr-pagination-focus-bg:#e2e8f0;--tblr-pagination-focus-box-shadow:0 0 0 0.25rem rgba(32, 107, 196, 0.25);--tblr-pagination-active-color:#ffffff;--tblr-pagination-active-bg:var(--tblr-primary);--tblr-pagination-active-border-color:var(--tblr-primary);--tblr-pagination-disabled-color:var(--tblr-disabled-color);--tblr-pagination-disabled-bg:transparent;--tblr-pagination-disabled-border-color:#c8d3e1;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--tblr-pagination-padding-y) var(--tblr-pagination-padding-x);font-size:var(--tblr-pagination-font-size);color:var(--tblr-pagination-color);background-color:var(--tblr-pagination-bg);border:var(--tblr-pagination-border-width) solid var(--tblr-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--tblr-pagination-hover-color);text-decoration:none;background-color:var(--tblr-pagination-hover-bg);border-color:var(--tblr-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--tblr-pagination-focus-color);background-color:var(--tblr-pagination-focus-bg);outline:0;box-shadow:var(--tblr-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--tblr-pagination-active-color);background-color:var(--tblr-pagination-active-bg);border-color:var(--tblr-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--tblr-pagination-disabled-color);pointer-events:none;background-color:var(--tblr-pagination-disabled-bg);border-color:var(--tblr-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:0}.page-item:first-child .page-link{border-top-left-radius:var(--tblr-pagination-border-radius);border-bottom-left-radius:var(--tblr-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--tblr-pagination-border-radius);border-bottom-right-radius:var(--tblr-pagination-border-radius)}.pagination-lg{--tblr-pagination-padding-x:1.5rem;--tblr-pagination-padding-y:0.75rem;--tblr-pagination-font-size:1.09375rem;--tblr-pagination-border-radius:8px}.pagination-sm{--tblr-pagination-padding-x:0.5rem;--tblr-pagination-padding-y:0.25rem;--tblr-pagination-font-size:0.765625rem;--tblr-pagination-border-radius:2px}.badge{--tblr-badge-padding-x:0.5em;--tblr-badge-padding-y:0.25em;--tblr-badge-font-size:85.714285%;--tblr-badge-font-weight:var(--tblr-font-weight-medium);--tblr-badge-color:#ffffff;--tblr-badge-border-radius:4px;display:inline-block;padding:var(--tblr-badge-padding-y) var(--tblr-badge-padding-x);font-size:var(--tblr-badge-font-size);font-weight:var(--tblr-badge-font-weight);line-height:1;color:var(--tblr-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--tblr-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--tblr-alert-bg:transparent;--tblr-alert-padding-x:1rem;--tblr-alert-padding-y:1rem;--tblr-alert-margin-bottom:1rem;--tblr-alert-color:inherit;--tblr-alert-border-color:transparent;--tblr-alert-border:1px solid var(--tblr-alert-border-color);--tblr-alert-border-radius:4px;position:relative;padding:var(--tblr-alert-padding-y) var(--tblr-alert-padding-x);margin-bottom:var(--tblr-alert-margin-bottom);color:var(--tblr-alert-color);background-color:var(--tblr-alert-bg);border:var(--tblr-alert-border);border-radius:var(--tblr-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:var(--tblr-font-weight-bold)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress{--tblr-progress-height:0.5rem;--tblr-progress-font-size:0.65625rem;--tblr-progress-bg:var(--tblr-border-color);--tblr-progress-border-radius:var(--tblr-border-radius);--tblr-progress-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);--tblr-progress-bar-color:#ffffff;--tblr-progress-bar-bg:var(--tblr-primary);--tblr-progress-bar-transition:width 0.6s ease;display:flex;height:var(--tblr-progress-height);overflow:hidden;font-size:var(--tblr-progress-font-size);background-color:var(--tblr-progress-bg);border-radius:var(--tblr-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--tblr-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--tblr-progress-bar-bg);transition:var(--tblr-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--tblr-progress-height) var(--tblr-progress-height)}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--tblr-list-group-color:#0f172a;--tblr-list-group-bg:inherit;--tblr-list-group-border-color:var(--tblr-border-color);--tblr-list-group-border-width:1px;--tblr-list-group-border-radius:4px;--tblr-list-group-item-padding-x:1.5rem;--tblr-list-group-item-padding-y:1rem;--tblr-list-group-action-color:inherit;--tblr-list-group-action-hover-color:inherit;--tblr-list-group-action-hover-bg:rgba(var(--tblr-muted-rgb), 0.04);--tblr-list-group-action-active-color:#1d273b;--tblr-list-group-action-active-bg:#e2e8f0;--tblr-list-group-disabled-color:#49566c;--tblr-list-group-disabled-bg:inherit;--tblr-list-group-active-color:inherit;--tblr-list-group-active-bg:var(--tblr-active-bg);--tblr-list-group-active-border-color:var(--tblr-border-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--tblr-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--tblr-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--tblr-list-group-action-hover-color);text-decoration:none;background-color:var(--tblr-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--tblr-list-group-action-active-color);background-color:var(--tblr-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--tblr-list-group-item-padding-y) var(--tblr-list-group-item-padding-x);color:var(--tblr-list-group-color);background-color:var(--tblr-list-group-bg);border:var(--tblr-list-group-border-width) solid var(--tblr-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--tblr-list-group-disabled-color);pointer-events:none;background-color:var(--tblr-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--tblr-list-group-active-color);background-color:var(--tblr-list-group-active-bg);border-color:var(--tblr-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--tblr-list-group-border-width));border-top-width:var(--tblr-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--tblr-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#134076;background-color:#d2e1f3}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#134076;background-color:#bdcbdb}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#134076;border-color:#134076}.list-group-item-secondary{color:#3a3e47;background-color:#dfe1e4}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#3a3e47;background-color:#c9cbcd}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#3a3e47;border-color:#3a3e47}.list-group-item-success{color:#1c6b29;background-color:#d5f0da}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#1c6b29;background-color:#c0d8c4}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1c6b29;border-color:#1c6b29}.list-group-item-info{color:#285c87;background-color:#d9ebf9}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#285c87;background-color:#c3d4e0}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#285c87;border-color:#285c87}.list-group-item-warning{color:#943e04;background-color:#fde1cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#943e04;background-color:#e4cbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#943e04;border-color:#943e04}.list-group-item-danger{color:#802222;background-color:#f7d7d7}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#802222;background-color:#dec2c2}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#802222;border-color:#802222}.list-group-item-light{color:#959697;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#959697;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#959697;border-color:#959697}.list-group-item-dark{color:#111723;background-color:#d2d4d8}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#111723;background-color:#bdbfc2}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#111723;border-color:#111723}.list-group-item-muted{color:#3a3e47;background-color:#dfe1e4}.list-group-item-muted.list-group-item-action:focus,.list-group-item-muted.list-group-item-action:hover{color:#3a3e47;background-color:#c9cbcd}.list-group-item-muted.list-group-item-action.active{color:#fff;background-color:#3a3e47;border-color:#3a3e47}.list-group-item-blue{color:#134076;background-color:#d2e1f3}.list-group-item-blue.list-group-item-action:focus,.list-group-item-blue.list-group-item-action:hover{color:#134076;background-color:#bdcbdb}.list-group-item-blue.list-group-item-action.active{color:#fff;background-color:#134076;border-color:#134076}.list-group-item-azure{color:#285c87;background-color:#d9ebf9}.list-group-item-azure.list-group-item-action:focus,.list-group-item-azure.list-group-item-action:hover{color:#285c87;background-color:#c3d4e0}.list-group-item-azure.list-group-item-action.active{color:#fff;background-color:#285c87;border-color:#285c87}.list-group-item-indigo{color:#283b8d;background-color:#d9e0fb}.list-group-item-indigo.list-group-item-action:focus,.list-group-item-indigo.list-group-item-action:hover{color:#283b8d;background-color:#c3cae2}.list-group-item-indigo.list-group-item-action.active{color:#fff;background-color:#283b8d;border-color:#283b8d}.list-group-item-purple{color:#682579;background-color:#efd8f4}.list-group-item-purple.list-group-item-action:focus,.list-group-item-purple.list-group-item-action:hover{color:#682579;background-color:#d7c2dc}.list-group-item-purple.list-group-item-action.active{color:#fff;background-color:#682579;border-color:#682579}.list-group-item-pink{color:#801f41;background-color:#f7d6e2}.list-group-item-pink.list-group-item-action:focus,.list-group-item-pink.list-group-item-action:hover{color:#801f41;background-color:#dec1cb}.list-group-item-pink.list-group-item-action.active{color:#fff;background-color:#801f41;border-color:#801f41}.list-group-item-red{color:#802222;background-color:#f7d7d7}.list-group-item-red.list-group-item-action:focus,.list-group-item-red.list-group-item-action:hover{color:#802222;background-color:#dec2c2}.list-group-item-red.list-group-item-action.active{color:#fff;background-color:#802222;border-color:#802222}.list-group-item-orange{color:#943e04;background-color:#fde1cd}.list-group-item-orange.list-group-item-action:focus,.list-group-item-orange.list-group-item-action:hover{color:#943e04;background-color:#e4cbb9}.list-group-item-orange.list-group-item-action.active{color:#fff;background-color:#943e04;border-color:#943e04}.list-group-item-yellow{color:#935f00;background-color:#fdeccc}.list-group-item-yellow.list-group-item-action:focus,.list-group-item-yellow.list-group-item-action:hover{color:#935f00;background-color:#e4d4b8}.list-group-item-yellow.list-group-item-action.active{color:#fff;background-color:#935f00;border-color:#935f00}.list-group-item-lime{color:#466e0d;background-color:#e3f1d0}.list-group-item-lime.list-group-item-action:focus,.list-group-item-lime.list-group-item-action:hover{color:#466e0d;background-color:#ccd9bb}.list-group-item-lime.list-group-item-action.active{color:#fff;background-color:#466e0d;border-color:#466e0d}.list-group-item-green{color:#1c6b29;background-color:#d5f0da}.list-group-item-green.list-group-item-action:focus,.list-group-item-green.list-group-item-action:hover{color:#1c6b29;background-color:#c0d8c4}.list-group-item-green.list-group-item-action.active{color:#fff;background-color:#1c6b29;border-color:#1c6b29}.list-group-item-teal{color:#076448;background-color:#ceede4}.list-group-item-teal.list-group-item-action:focus,.list-group-item-teal.list-group-item-action:hover{color:#076448;background-color:#b9d5cd}.list-group-item-teal.list-group-item-action.active{color:#fff;background-color:#076448;border-color:#076448}.list-group-item-cyan{color:#0e616e;background-color:#d1ecf1}.list-group-item-cyan.list-group-item-action:focus,.list-group-item-cyan.list-group-item-action:hover{color:#0e616e;background-color:#bcd4d9}.list-group-item-cyan.list-group-item-action.active{color:#fff;background-color:#0e616e;border-color:#0e616e}.list-group-item-facebook{color:#0e4791;background-color:#d1e4fc}.list-group-item-facebook.list-group-item-action:focus,.list-group-item-facebook.list-group-item-action:hover{color:#0e4791;background-color:#bccde3}.list-group-item-facebook.list-group-item-action.active{color:#fff;background-color:#0e4791;border-color:#0e4791}.list-group-item-twitter{color:#116191;background-color:#d2ecfc}.list-group-item-twitter.list-group-item-action:focus,.list-group-item-twitter.list-group-item-action:hover{color:#116191;background-color:#bdd4e3}.list-group-item-twitter.list-group-item-action.active{color:#fff;background-color:#116191;border-color:#116191}.list-group-item-linkedin{color:#063d74;background-color:#cee0f3}.list-group-item-linkedin.list-group-item-action:focus,.list-group-item-linkedin.list-group-item-action:hover{color:#063d74;background-color:#b9cadb}.list-group-item-linkedin.list-group-item-action.active{color:#fff;background-color:#063d74;border-color:#063d74}.list-group-item-google{color:#842f27;background-color:#f8dcd9}.list-group-item-google.list-group-item-action:focus,.list-group-item-google.list-group-item-action:hover{color:#842f27;background-color:#dfc6c3}.list-group-item-google.list-group-item-action.active{color:#fff;background-color:#842f27;border-color:#842f27}.list-group-item-youtube{color:#900;background-color:#fcc}.list-group-item-youtube.list-group-item-action:focus,.list-group-item-youtube.list-group-item-action:hover{color:#900;background-color:#e6b8b8}.list-group-item-youtube.list-group-item-action.active{color:#fff;background-color:#900;border-color:#900}.list-group-item-vimeo{color:#106e8c;background-color:#d1f1fb}.list-group-item-vimeo.list-group-item-action:focus,.list-group-item-vimeo.list-group-item-action:hover{color:#106e8c;background-color:#bcd9e2}.list-group-item-vimeo.list-group-item-action.active{color:#fff;background-color:#106e8c;border-color:#106e8c}.list-group-item-dribbble{color:#8c2e52;background-color:#fbdbe7}.list-group-item-dribbble.list-group-item-action:focus,.list-group-item-dribbble.list-group-item-action:hover{color:#8c2e52;background-color:#e2c5d0}.list-group-item-dribbble.list-group-item-action.active{color:#fff;background-color:#8c2e52;border-color:#8c2e52}.list-group-item-github{color:#0e0e0e;background-color:#d1d1d1}.list-group-item-github.list-group-item-action:focus,.list-group-item-github.list-group-item-action:hover{color:#0e0e0e;background-color:#bcbcbc}.list-group-item-github.list-group-item-action.active{color:#fff;background-color:#0e0e0e;border-color:#0e0e0e}.list-group-item-instagram{color:#892639;background-color:#fad9df}.list-group-item-instagram.list-group-item-action:focus,.list-group-item-instagram.list-group-item-action:hover{color:#892639;background-color:#e1c3c9}.list-group-item-instagram.list-group-item-action.active{color:#fff;background-color:#892639;border-color:#892639}.list-group-item-pinterest{color:#710511;background-color:#f2ced2}.list-group-item-pinterest.list-group-item-action:focus,.list-group-item-pinterest.list-group-item-action:hover{color:#710511;background-color:#dab9bd}.list-group-item-pinterest.list-group-item-action.active{color:#fff;background-color:#710511;border-color:#710511}.list-group-item-vk{color:#3b4f65;background-color:#e0e6ee}.list-group-item-vk.list-group-item-action:focus,.list-group-item-vk.list-group-item-action:hover{color:#3b4f65;background-color:#cacfd6}.list-group-item-vk.list-group-item-action.active{color:#fff;background-color:#3b4f65;border-color:#3b4f65}.list-group-item-rss{color:#996300;background-color:#ffedcc}.list-group-item-rss.list-group-item-action:focus,.list-group-item-rss.list-group-item-action:hover{color:#996300;background-color:#e6d5b8}.list-group-item-rss.list-group-item-action.active{color:#fff;background-color:#996300;border-color:#996300}.list-group-item-flickr{color:#003b84;background-color:#cce0f8}.list-group-item-flickr.list-group-item-action:focus,.list-group-item-flickr.list-group-item-action:hover{color:#003b84;background-color:#b8cadf}.list-group-item-flickr.list-group-item-action.active{color:#fff;background-color:#003b84;border-color:#003b84}.list-group-item-bitbucket{color:#00317a;background-color:#ccdcf5}.list-group-item-bitbucket.list-group-item-action:focus,.list-group-item-bitbucket.list-group-item-action:hover{color:#00317a;background-color:#b8c6dd}.list-group-item-bitbucket.list-group-item-action.active{color:#fff;background-color:#00317a;border-color:#00317a}.list-group-item-tabler{color:#134076;background-color:#d2e1f3}.list-group-item-tabler.list-group-item-action:focus,.list-group-item-tabler.list-group-item-action:hover{color:#134076;background-color:#bdcbdb}.list-group-item-tabler.list-group-item-action.active{color:#fff;background-color:#134076;border-color:#134076}.btn-close{box-sizing:content-box;width:.75rem;height:.75rem;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/.75rem auto no-repeat;border:0;border-radius:4px;opacity:.3}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(32,107,196,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{--tblr-toast-zindex:1090;--tblr-toast-padding-x:0.75rem;--tblr-toast-padding-y:0.5rem;--tblr-toast-spacing:1.5rem;--tblr-toast-max-width:350px;--tblr-toast-font-size:0.875rem;--tblr-toast-bg:rgba(255, 255, 255, 0.85);--tblr-toast-border-width:1px;--tblr-toast-border-color:var(--tblr-border-color);--tblr-toast-border-radius:4px;--tblr-toast-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--tblr-toast-header-color:var(--tblr-muted);--tblr-toast-header-bg:rgba(255, 255, 255, 0.85);--tblr-toast-header-border-color:rgba(0, 0, 0, 0.05);width:var(--tblr-toast-max-width);max-width:100%;font-size:var(--tblr-toast-font-size);color:var(--tblr-toast-color);pointer-events:auto;background-color:var(--tblr-toast-bg);background-clip:padding-box;border:var(--tblr-toast-border-width) solid var(--tblr-toast-border-color);box-shadow:var(--tblr-toast-box-shadow);border-radius:var(--tblr-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--tblr-toast-zindex:1090;position:absolute;z-index:var(--tblr-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--tblr-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--tblr-toast-padding-y) var(--tblr-toast-padding-x);color:var(--tblr-toast-header-color);background-color:var(--tblr-toast-header-bg);background-clip:padding-box;border-bottom:var(--tblr-toast-border-width) solid var(--tblr-toast-header-border-color);border-top-left-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width));border-top-right-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--tblr-toast-padding-x));margin-left:var(--tblr-toast-padding-x)}.toast-body{padding:var(--tblr-toast-padding-x);word-wrap:break-word}.modal{--tblr-modal-zindex:1055;--tblr-modal-width:540px;--tblr-modal-padding:1.5rem;--tblr-modal-margin:0.5rem;--tblr-modal-bg:var(--tblr-bg-surface);--tblr-modal-border-color:transparent;--tblr-modal-border-width:1px;--tblr-modal-border-radius:var(--tblr-border-radius-lg);--tblr-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--tblr-modal-inner-border-radius:calc(var(--tblr-modal-border-radius) - 1px);--tblr-modal-header-padding-x:1.5rem;--tblr-modal-header-padding-y:1.5rem;--tblr-modal-header-padding:1.5rem;--tblr-modal-header-border-color:var(--tblr-border-color);--tblr-modal-header-border-width:1px;--tblr-modal-title-line-height:1.4285714286;--tblr-modal-footer-gap:0.75rem;--tblr-modal-footer-border-color:var(--tblr-border-color);--tblr-modal-footer-border-width:0;position:fixed;top:0;left:0;z-index:var(--tblr-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--tblr-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-1rem)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--tblr-modal-color);pointer-events:auto;background-color:var(--tblr-modal-bg);background-clip:padding-box;border:var(--tblr-modal-border-width) solid var(--tblr-modal-border-color);border-radius:var(--tblr-modal-border-radius);outline:0}.modal-backdrop{--tblr-backdrop-zindex:1050;--tblr-backdrop-bg:#1d273b;--tblr-backdrop-opacity:0.24;position:fixed;top:0;left:0;z-index:var(--tblr-backdrop-zindex);width:100vw;height:100vh;background-color:var(--tblr-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--tblr-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--tblr-modal-header-padding);border-bottom:var(--tblr-modal-header-border-width) solid var(--tblr-modal-header-border-color);border-top-left-radius:var(--tblr-modal-inner-border-radius);border-top-right-radius:var(--tblr-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--tblr-modal-header-padding-y) * .5) calc(var(--tblr-modal-header-padding-x) * .5);margin:calc(-.5 * var(--tblr-modal-header-padding-y)) calc(-.5 * var(--tblr-modal-header-padding-x)) calc(-.5 * var(--tblr-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--tblr-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--tblr-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--tblr-modal-padding) - var(--tblr-modal-footer-gap) * .5);background-color:var(--tblr-modal-footer-bg);border-top:var(--tblr-modal-footer-border-width) solid var(--tblr-modal-footer-border-color);border-bottom-right-radius:var(--tblr-modal-inner-border-radius);border-bottom-left-radius:var(--tblr-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--tblr-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--tblr-modal-margin:1.75rem;--tblr-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--tblr-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--tblr-modal-width:380px}}@media (min-width:992px){.modal-lg,.modal-xl{--tblr-modal-width:720px}}@media (min-width:1200px){.modal-xl{--tblr-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--tblr-tooltip-zindex:1080;--tblr-tooltip-max-width:200px;--tblr-tooltip-padding-x:0.5rem;--tblr-tooltip-padding-y:0.25rem;--tblr-tooltip-font-size:0.765625rem;--tblr-tooltip-color:var(--tblr-light);--tblr-tooltip-bg:var(--tblr-bg-surface-dark);--tblr-tooltip-border-radius:4px;--tblr-tooltip-opacity:0.9;--tblr-tooltip-arrow-width:0.8rem;--tblr-tooltip-arrow-height:0.4rem;z-index:var(--tblr-tooltip-zindex);display:block;padding:var(--tblr-tooltip-arrow-height);margin:var(--tblr-tooltip-margin);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--tblr-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--tblr-tooltip-arrow-width);height:var(--tblr-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-top-color:var(--tblr-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-right-color:var(--tblr-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-bottom-color:var(--tblr-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) 0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-left-color:var(--tblr-tooltip-bg)}.tooltip-inner{max-width:var(--tblr-tooltip-max-width);padding:var(--tblr-tooltip-padding-y) var(--tblr-tooltip-padding-x);color:var(--tblr-tooltip-color);text-align:center;background-color:var(--tblr-tooltip-bg);border-radius:var(--tblr-tooltip-border-radius)}.popover{--tblr-popover-zindex:1070;--tblr-popover-max-width:276px;--tblr-popover-font-size:0.765625rem;--tblr-popover-bg:var(--tblr-bg-surface);--tblr-popover-border-width:1px;--tblr-popover-border-color:var(--tblr-border-color);--tblr-popover-border-radius:8px;--tblr-popover-inner-border-radius:7px;--tblr-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--tblr-popover-header-padding-x:1rem;--tblr-popover-header-padding-y:0.5rem;--tblr-popover-header-font-size:0.875rem;--tblr-popover-header-bg:transparent;--tblr-popover-body-padding-x:1rem;--tblr-popover-body-padding-y:1rem;--tblr-popover-body-color:inherit;--tblr-popover-arrow-width:1rem;--tblr-popover-arrow-height:0.5rem;--tblr-popover-arrow-border:var(--tblr-popover-border-color);z-index:var(--tblr-popover-zindex);display:block;max-width:var(--tblr-popover-max-width);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-popover-font-size);word-wrap:break-word;background-color:var(--tblr-popover-bg);background-clip:padding-box;border:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-radius:var(--tblr-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--tblr-popover-arrow-width);height:var(--tblr-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--tblr-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--tblr-popover-border-width);border-top-color:var(--tblr-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--tblr-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--tblr-popover-border-width);border-right-color:var(--tblr-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--tblr-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--tblr-popover-border-width);border-bottom-color:var(--tblr-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--tblr-popover-arrow-width);margin-left:calc(-.5 * var(--tblr-popover-arrow-width));content:"";border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--tblr-popover-arrow-width) * .5) 0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--tblr-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--tblr-popover-border-width);border-left-color:var(--tblr-popover-bg)}.popover-header{padding:var(--tblr-popover-header-padding-y) var(--tblr-popover-header-padding-x);margin-bottom:0;font-size:var(--tblr-popover-header-font-size);color:var(--tblr-popover-header-color);background-color:var(--tblr-popover-header-bg);border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-top-left-radius:var(--tblr-popover-inner-border-radius);border-top-right-radius:var(--tblr-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--tblr-popover-body-padding-y) var(--tblr-popover-body-padding-x);color:var(--tblr-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:1.5rem;height:1.5rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='15 18 9 12 15 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='9 18 15 12 9 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--tblr-spinner-width);height:var(--tblr-spinner-height);vertical-align:var(--tblr-spinner-vertical-align);border-radius:50%;animation:var(--tblr-spinner-animation-speed) linear infinite var(--tblr-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--tblr-spinner-width:1.5rem;--tblr-spinner-height:1.5rem;--tblr-spinner-vertical-align:-0.125em;--tblr-spinner-border-width:2px;--tblr-spinner-animation-speed:0.75s;--tblr-spinner-animation-name:spinner-border;border:var(--tblr-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--tblr-spinner-width:1rem;--tblr-spinner-height:1rem;--tblr-spinner-border-width:1px}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--tblr-spinner-width:1.5rem;--tblr-spinner-height:1.5rem;--tblr-spinner-vertical-align:-0.125em;--tblr-spinner-animation-speed:0.75s;--tblr-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--tblr-spinner-width:1rem;--tblr-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--tblr-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--tblr-offcanvas-zindex:1045;--tblr-offcanvas-width:400px;--tblr-offcanvas-height:30vh;--tblr-offcanvas-padding-x:1.5rem;--tblr-offcanvas-padding-y:1.5rem;--tblr-offcanvas-bg:var(--tblr-bg-surface);--tblr-offcanvas-border-width:1px;--tblr-offcanvas-border-color:var(--tblr-border-color);--tblr-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:575.98px){.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}}@media (max-width:575.98px){.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--tblr-offcanvas-height:auto;--tblr-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:767.98px){.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:767.98px){.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}}@media (max-width:767.98px){.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--tblr-offcanvas-height:auto;--tblr-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:991.98px){.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}}@media (max-width:991.98px){.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--tblr-offcanvas-height:auto;--tblr-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1199.98px){.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}}@media (max-width:1199.98px){.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--tblr-offcanvas-height:auto;--tblr-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}}@media (max-width:1399.98px){.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}}@media (max-width:1399.98px){.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--tblr-offcanvas-height:auto;--tblr-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#1d273b}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.24}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--tblr-offcanvas-padding-y) * .5) calc(var(--tblr-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--tblr-offcanvas-padding-y));margin-right:calc(-.5 * var(--tblr-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--tblr-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:1.4285714286}.offcanvas-body{flex-grow:1;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.2}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.1}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.9) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.9) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#f8fafc!important;background-color:RGBA(32,107,196,var(--tblr-bg-opacity,1))!important}.text-bg-secondary{color:#f8fafc!important;background-color:RGBA(97,104,118,var(--tblr-bg-opacity,1))!important}.text-bg-success{color:#f8fafc!important;background-color:RGBA(47,179,68,var(--tblr-bg-opacity,1))!important}.text-bg-info{color:#f8fafc!important;background-color:RGBA(66,153,225,var(--tblr-bg-opacity,1))!important}.text-bg-warning{color:#f8fafc!important;background-color:RGBA(247,103,7,var(--tblr-bg-opacity,1))!important}.text-bg-danger{color:#f8fafc!important;background-color:RGBA(214,57,57,var(--tblr-bg-opacity,1))!important}.text-bg-light{color:#1d273b!important;background-color:RGBA(248,250,252,var(--tblr-bg-opacity,1))!important}.text-bg-dark{color:#f8fafc!important;background-color:RGBA(29,39,59,var(--tblr-bg-opacity,1))!important}.text-bg-muted{color:#f8fafc!important;background-color:RGBA(97,104,118,var(--tblr-bg-opacity,1))!important}.text-bg-blue{color:#f8fafc!important;background-color:RGBA(32,107,196,var(--tblr-bg-opacity,1))!important}.text-bg-azure{color:#f8fafc!important;background-color:RGBA(66,153,225,var(--tblr-bg-opacity,1))!important}.text-bg-indigo{color:#f8fafc!important;background-color:RGBA(66,99,235,var(--tblr-bg-opacity,1))!important}.text-bg-purple{color:#f8fafc!important;background-color:RGBA(174,62,201,var(--tblr-bg-opacity,1))!important}.text-bg-pink{color:#f8fafc!important;background-color:RGBA(214,51,108,var(--tblr-bg-opacity,1))!important}.text-bg-red{color:#f8fafc!important;background-color:RGBA(214,57,57,var(--tblr-bg-opacity,1))!important}.text-bg-orange{color:#f8fafc!important;background-color:RGBA(247,103,7,var(--tblr-bg-opacity,1))!important}.text-bg-yellow{color:#f8fafc!important;background-color:RGBA(245,159,0,var(--tblr-bg-opacity,1))!important}.text-bg-lime{color:#f8fafc!important;background-color:RGBA(116,184,22,var(--tblr-bg-opacity,1))!important}.text-bg-green{color:#f8fafc!important;background-color:RGBA(47,179,68,var(--tblr-bg-opacity,1))!important}.text-bg-teal{color:#f8fafc!important;background-color:RGBA(12,166,120,var(--tblr-bg-opacity,1))!important}.text-bg-cyan{color:#f8fafc!important;background-color:RGBA(23,162,184,var(--tblr-bg-opacity,1))!important}.text-bg-facebook{color:#f8fafc!important;background-color:RGBA(24,119,242,var(--tblr-bg-opacity,1))!important}.text-bg-twitter{color:#f8fafc!important;background-color:RGBA(29,161,242,var(--tblr-bg-opacity,1))!important}.text-bg-linkedin{color:#f8fafc!important;background-color:RGBA(10,102,194,var(--tblr-bg-opacity,1))!important}.text-bg-google{color:#f8fafc!important;background-color:RGBA(220,78,65,var(--tblr-bg-opacity,1))!important}.text-bg-youtube{color:#f8fafc!important;background-color:RGBA(255,0,0,var(--tblr-bg-opacity,1))!important}.text-bg-vimeo{color:#f8fafc!important;background-color:RGBA(26,183,234,var(--tblr-bg-opacity,1))!important}.text-bg-dribbble{color:#f8fafc!important;background-color:RGBA(234,76,137,var(--tblr-bg-opacity,1))!important}.text-bg-github{color:#f8fafc!important;background-color:RGBA(24,23,23,var(--tblr-bg-opacity,1))!important}.text-bg-instagram{color:#f8fafc!important;background-color:RGBA(228,64,95,var(--tblr-bg-opacity,1))!important}.text-bg-pinterest{color:#f8fafc!important;background-color:RGBA(189,8,28,var(--tblr-bg-opacity,1))!important}.text-bg-vk{color:#f8fafc!important;background-color:RGBA(99,131,168,var(--tblr-bg-opacity,1))!important}.text-bg-rss{color:#f8fafc!important;background-color:RGBA(255,165,0,var(--tblr-bg-opacity,1))!important}.text-bg-flickr{color:#f8fafc!important;background-color:RGBA(0,99,220,var(--tblr-bg-opacity,1))!important}.text-bg-bitbucket{color:#f8fafc!important;background-color:RGBA(0,82,204,var(--tblr-bg-opacity,1))!important}.text-bg-tabler{color:#f8fafc!important;background-color:RGBA(32,107,196,var(--tblr-bg-opacity,1))!important}.link-primary{color:#206bc4!important}.link-primary:focus,.link-primary:hover{color:#1a569d!important}.link-secondary{color:#616876!important}.link-secondary:focus,.link-secondary:hover{color:#4e535e!important}.link-success{color:#2fb344!important}.link-success:focus,.link-success:hover{color:#268f36!important}.link-info{color:#4299e1!important}.link-info:focus,.link-info:hover{color:#357ab4!important}.link-warning{color:#f76707!important}.link-warning:focus,.link-warning:hover{color:#c65206!important}.link-danger{color:#d63939!important}.link-danger:focus,.link-danger:hover{color:#ab2e2e!important}.link-light{color:#f8fafc!important}.link-light:focus,.link-light:hover{color:#f9fbfd!important}.link-dark{color:#1d273b!important}.link-dark:focus,.link-dark:hover{color:#171f2f!important}.link-muted{color:#616876!important}.link-muted:focus,.link-muted:hover{color:#4e535e!important}.link-blue{color:#206bc4!important}.link-blue:focus,.link-blue:hover{color:#1a569d!important}.link-azure{color:#4299e1!important}.link-azure:focus,.link-azure:hover{color:#357ab4!important}.link-indigo{color:#4263eb!important}.link-indigo:focus,.link-indigo:hover{color:#354fbc!important}.link-purple{color:#ae3ec9!important}.link-purple:focus,.link-purple:hover{color:#8b32a1!important}.link-pink{color:#d6336c!important}.link-pink:focus,.link-pink:hover{color:#ab2956!important}.link-red{color:#d63939!important}.link-red:focus,.link-red:hover{color:#ab2e2e!important}.link-orange{color:#f76707!important}.link-orange:focus,.link-orange:hover{color:#c65206!important}.link-yellow{color:#f59f00!important}.link-yellow:focus,.link-yellow:hover{color:#c47f00!important}.link-lime{color:#74b816!important}.link-lime:focus,.link-lime:hover{color:#5d9312!important}.link-green{color:#2fb344!important}.link-green:focus,.link-green:hover{color:#268f36!important}.link-teal{color:#0ca678!important}.link-teal:focus,.link-teal:hover{color:#0a8560!important}.link-cyan{color:#17a2b8!important}.link-cyan:focus,.link-cyan:hover{color:#128293!important}.link-facebook{color:#1877f2!important}.link-facebook:focus,.link-facebook:hover{color:#135fc2!important}.link-twitter{color:#1da1f2!important}.link-twitter:focus,.link-twitter:hover{color:#1781c2!important}.link-linkedin{color:#0a66c2!important}.link-linkedin:focus,.link-linkedin:hover{color:#08529b!important}.link-google{color:#dc4e41!important}.link-google:focus,.link-google:hover{color:#b03e34!important}.link-youtube{color:red!important}.link-youtube:focus,.link-youtube:hover{color:#c00!important}.link-vimeo{color:#1ab7ea!important}.link-vimeo:focus,.link-vimeo:hover{color:#1592bb!important}.link-dribbble{color:#ea4c89!important}.link-dribbble:focus,.link-dribbble:hover{color:#bb3d6e!important}.link-github{color:#181717!important}.link-github:focus,.link-github:hover{color:#131212!important}.link-instagram{color:#e4405f!important}.link-instagram:focus,.link-instagram:hover{color:#b6334c!important}.link-pinterest{color:#bd081c!important}.link-pinterest:focus,.link-pinterest:hover{color:#970616!important}.link-vk{color:#6383a8!important}.link-vk:focus,.link-vk:hover{color:#4f6986!important}.link-rss{color:orange!important}.link-rss:focus,.link-rss:hover{color:#cc8400!important}.link-flickr{color:#0063dc!important}.link-flickr:focus,.link-flickr:hover{color:#004fb0!important}.link-bitbucket{color:#0052cc!important}.link-bitbucket:focus,.link-bitbucket:hover{color:#0042a3!important}.link-tabler{color:#206bc4!important}.link-tabler:focus,.link-tabler:hover{color:#1a569d!important}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--tblr-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--tblr-aspect-ratio:100%}.ratio-2x1{--tblr-aspect-ratio:50%}.ratio-1x2{--tblr-aspect-ratio:200%}.ratio-3x1{--tblr-aspect-ratio:33.3333333333%}.ratio-1x3{--tblr-aspect-ratio:300%}.ratio-4x3{--tblr-aspect-ratio:75%}.ratio-3x4{--tblr-aspect-ratio:133.3333333333%}.ratio-16x9{--tblr-aspect-ratio:56.25%}.ratio-9x16{--tblr-aspect-ratio:177.7777777778%}.ratio-21x9{--tblr-aspect-ratio:42.8571428571%}.ratio-9x21{--tblr-aspect-ratio:233.3333333333%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.16}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-wide{border:2px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-0{border:0!important}.border-top{border-top:1px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-top-wide{border-top:2px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-top-0{border-top:0!important}.border-end{border-right:1px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-end-wide{border-right:2px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-bottom-wide{border-bottom:2px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-start-wide{border-left:2px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-start-0{border-left:0!important}.border-primary{--tblr-border-opacity:1;border-color:rgba(var(--tblr-primary-rgb),var(--tblr-border-opacity))!important}.border-secondary{--tblr-border-opacity:1;border-color:rgba(var(--tblr-secondary-rgb),var(--tblr-border-opacity))!important}.border-success{--tblr-border-opacity:1;border-color:rgba(var(--tblr-success-rgb),var(--tblr-border-opacity))!important}.border-info{--tblr-border-opacity:1;border-color:rgba(var(--tblr-info-rgb),var(--tblr-border-opacity))!important}.border-warning{--tblr-border-opacity:1;border-color:rgba(var(--tblr-warning-rgb),var(--tblr-border-opacity))!important}.border-danger{--tblr-border-opacity:1;border-color:rgba(var(--tblr-danger-rgb),var(--tblr-border-opacity))!important}.border-light{--tblr-border-opacity:1;border-color:rgba(var(--tblr-light-rgb),var(--tblr-border-opacity))!important}.border-dark{--tblr-border-opacity:1;border-color:rgba(var(--tblr-dark-rgb),var(--tblr-border-opacity))!important}.border-muted{--tblr-border-opacity:1;border-color:rgba(var(--tblr-muted-rgb),var(--tblr-border-opacity))!important}.border-blue{--tblr-border-opacity:1;border-color:rgba(var(--tblr-blue-rgb),var(--tblr-border-opacity))!important}.border-azure{--tblr-border-opacity:1;border-color:rgba(var(--tblr-azure-rgb),var(--tblr-border-opacity))!important}.border-indigo{--tblr-border-opacity:1;border-color:rgba(var(--tblr-indigo-rgb),var(--tblr-border-opacity))!important}.border-purple{--tblr-border-opacity:1;border-color:rgba(var(--tblr-purple-rgb),var(--tblr-border-opacity))!important}.border-pink{--tblr-border-opacity:1;border-color:rgba(var(--tblr-pink-rgb),var(--tblr-border-opacity))!important}.border-red{--tblr-border-opacity:1;border-color:rgba(var(--tblr-red-rgb),var(--tblr-border-opacity))!important}.border-orange{--tblr-border-opacity:1;border-color:rgba(var(--tblr-orange-rgb),var(--tblr-border-opacity))!important}.border-yellow{--tblr-border-opacity:1;border-color:rgba(var(--tblr-yellow-rgb),var(--tblr-border-opacity))!important}.border-lime{--tblr-border-opacity:1;border-color:rgba(var(--tblr-lime-rgb),var(--tblr-border-opacity))!important}.border-green{--tblr-border-opacity:1;border-color:rgba(var(--tblr-green-rgb),var(--tblr-border-opacity))!important}.border-teal{--tblr-border-opacity:1;border-color:rgba(var(--tblr-teal-rgb),var(--tblr-border-opacity))!important}.border-cyan{--tblr-border-opacity:1;border-color:rgba(var(--tblr-cyan-rgb),var(--tblr-border-opacity))!important}.border-facebook{--tblr-border-opacity:1;border-color:rgba(var(--tblr-facebook-rgb),var(--tblr-border-opacity))!important}.border-twitter{--tblr-border-opacity:1;border-color:rgba(var(--tblr-twitter-rgb),var(--tblr-border-opacity))!important}.border-linkedin{--tblr-border-opacity:1;border-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-border-opacity))!important}.border-google{--tblr-border-opacity:1;border-color:rgba(var(--tblr-google-rgb),var(--tblr-border-opacity))!important}.border-youtube{--tblr-border-opacity:1;border-color:rgba(var(--tblr-youtube-rgb),var(--tblr-border-opacity))!important}.border-vimeo{--tblr-border-opacity:1;border-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-border-opacity))!important}.border-dribbble{--tblr-border-opacity:1;border-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-border-opacity))!important}.border-github{--tblr-border-opacity:1;border-color:rgba(var(--tblr-github-rgb),var(--tblr-border-opacity))!important}.border-instagram{--tblr-border-opacity:1;border-color:rgba(var(--tblr-instagram-rgb),var(--tblr-border-opacity))!important}.border-pinterest{--tblr-border-opacity:1;border-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-border-opacity))!important}.border-vk{--tblr-border-opacity:1;border-color:rgba(var(--tblr-vk-rgb),var(--tblr-border-opacity))!important}.border-rss{--tblr-border-opacity:1;border-color:rgba(var(--tblr-rss-rgb),var(--tblr-border-opacity))!important}.border-flickr{--tblr-border-opacity:1;border-color:rgba(var(--tblr-flickr-rgb),var(--tblr-border-opacity))!important}.border-bitbucket{--tblr-border-opacity:1;border-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-border-opacity))!important}.border-tabler{--tblr-border-opacity:1;border-color:rgba(var(--tblr-tabler-rgb),var(--tblr-border-opacity))!important}.border-white{--tblr-border-opacity:1;border-color:rgba(var(--tblr-white-rgb),var(--tblr-border-opacity))!important}.border-1{--tblr-border-width:1px}.border-2{--tblr-border-width:2px}.border-3{--tblr-border-width:3px}.border-4{--tblr-border-width:4px}.border-5{--tblr-border-width:5px}.border-opacity-10{--tblr-border-opacity:0.1}.border-opacity-25{--tblr-border-opacity:0.25}.border-opacity-50{--tblr-border-opacity:0.5}.border-opacity-75{--tblr-border-opacity:0.75}.border-opacity-100{--tblr-border-opacity:1}.w-0{width:0!important}.w-1{width:.25rem!important}.w-2{width:.5rem!important}.w-3{width:1rem!important}.w-4{width:2rem!important}.w-5{width:4rem!important}.w-25{width:25%!important}.w-33{width:33.33333%!important}.w-50{width:50%!important}.w-66{width:66.66666%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-0{height:0!important}.h-1{height:.25rem!important}.h-2{height:.5rem!important}.h-3{height:1rem!important}.h-4{height:2rem!important}.h-5{height:4rem!important}.h-25{height:25%!important}.h-33{height:33.33333%!important}.h-50{height:50%!important}.h-66{height:66.66666%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:2rem!important}.m-5{margin:4rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:2rem!important;margin-left:2rem!important}.mx-5{margin-right:4rem!important;margin-left:4rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:2rem!important;margin-bottom:2rem!important}.my-5{margin-top:4rem!important;margin-bottom:4rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:2rem!important}.mt-5{margin-top:4rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:2rem!important}.me-5{margin-right:4rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:2rem!important}.mb-5{margin-bottom:4rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:2rem!important}.ms-5{margin-left:4rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:2rem!important}.p-5{padding:4rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:2rem!important;padding-left:2rem!important}.px-5{padding-right:4rem!important;padding-left:4rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:2rem!important;padding-bottom:2rem!important}.py-5{padding-top:4rem!important;padding-bottom:4rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:2rem!important}.pt-5{padding-top:4rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:2rem!important}.pe-5{padding-right:4rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:2rem!important}.pb-5{padding-bottom:4rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:2rem!important}.ps-5{padding-left:4rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:2rem!important}.gap-5{gap:4rem!important}.font-monospace{font-family:var(--tblr-font-monospace)!important}.fs-1{font-size:1.5rem!important}.fs-2{font-size:1.25rem!important}.fs-3{font-size:1rem!important}.fs-4{font-size:.875rem!important}.fs-5{font-size:.75rem!important}.fs-6{font-size:.625rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:600!important}.fw-semibold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.1428571429!important}.lh-base{line-height:1.4285714286!important}.lh-lg{line-height:1.7142857143!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--tblr-text-opacity:1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important}.text-secondary{--tblr-text-opacity:1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important}.text-success{--tblr-text-opacity:1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important}.text-info{--tblr-text-opacity:1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important}.text-warning{--tblr-text-opacity:1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important}.text-danger{--tblr-text-opacity:1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important}.text-light{--tblr-text-opacity:1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important}.text-dark{--tblr-text-opacity:1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important}.text-muted{--tblr-text-opacity:1;color:#616876!important}.text-blue{--tblr-text-opacity:1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important}.text-azure{--tblr-text-opacity:1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important}.text-indigo{--tblr-text-opacity:1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important}.text-purple{--tblr-text-opacity:1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important}.text-pink{--tblr-text-opacity:1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important}.text-red{--tblr-text-opacity:1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important}.text-orange{--tblr-text-opacity:1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important}.text-yellow{--tblr-text-opacity:1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important}.text-lime{--tblr-text-opacity:1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important}.text-green{--tblr-text-opacity:1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important}.text-teal{--tblr-text-opacity:1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important}.text-cyan{--tblr-text-opacity:1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important}.text-facebook{--tblr-text-opacity:1;color:rgba(var(--tblr-facebook-rgb),var(--tblr-text-opacity))!important}.text-twitter{--tblr-text-opacity:1;color:rgba(var(--tblr-twitter-rgb),var(--tblr-text-opacity))!important}.text-linkedin{--tblr-text-opacity:1;color:rgba(var(--tblr-linkedin-rgb),var(--tblr-text-opacity))!important}.text-google{--tblr-text-opacity:1;color:rgba(var(--tblr-google-rgb),var(--tblr-text-opacity))!important}.text-youtube{--tblr-text-opacity:1;color:rgba(var(--tblr-youtube-rgb),var(--tblr-text-opacity))!important}.text-vimeo{--tblr-text-opacity:1;color:rgba(var(--tblr-vimeo-rgb),var(--tblr-text-opacity))!important}.text-dribbble{--tblr-text-opacity:1;color:rgba(var(--tblr-dribbble-rgb),var(--tblr-text-opacity))!important}.text-github{--tblr-text-opacity:1;color:rgba(var(--tblr-github-rgb),var(--tblr-text-opacity))!important}.text-instagram{--tblr-text-opacity:1;color:rgba(var(--tblr-instagram-rgb),var(--tblr-text-opacity))!important}.text-pinterest{--tblr-text-opacity:1;color:rgba(var(--tblr-pinterest-rgb),var(--tblr-text-opacity))!important}.text-vk{--tblr-text-opacity:1;color:rgba(var(--tblr-vk-rgb),var(--tblr-text-opacity))!important}.text-rss{--tblr-text-opacity:1;color:rgba(var(--tblr-rss-rgb),var(--tblr-text-opacity))!important}.text-flickr{--tblr-text-opacity:1;color:rgba(var(--tblr-flickr-rgb),var(--tblr-text-opacity))!important}.text-bitbucket{--tblr-text-opacity:1;color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-text-opacity))!important}.text-tabler{--tblr-text-opacity:1;color:rgba(var(--tblr-tabler-rgb),var(--tblr-text-opacity))!important}.text-black{--tblr-text-opacity:1;color:rgba(var(--tblr-black-rgb),var(--tblr-text-opacity))!important}.text-white{--tblr-text-opacity:1;color:rgba(var(--tblr-white-rgb),var(--tblr-text-opacity))!important}.text-body{--tblr-text-opacity:1;color:rgba(var(--tblr-body-color-rgb),var(--tblr-text-opacity))!important}.text-black-50{--tblr-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--tblr-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--tblr-text-opacity:1;color:inherit!important}.text-opacity-25{--tblr-text-opacity:0.25}.text-opacity-50{--tblr-text-opacity:0.5}.text-opacity-75{--tblr-text-opacity:0.75}.text-opacity-100{--tblr-text-opacity:1}.bg-primary{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-primary-rgb),var(--tblr-bg-opacity))!important}.bg-secondary{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-secondary-rgb),var(--tblr-bg-opacity))!important}.bg-success{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-success-rgb),var(--tblr-bg-opacity))!important}.bg-info{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-info-rgb),var(--tblr-bg-opacity))!important}.bg-warning{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-warning-rgb),var(--tblr-bg-opacity))!important}.bg-danger{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-danger-rgb),var(--tblr-bg-opacity))!important}.bg-light{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-light-rgb),var(--tblr-bg-opacity))!important}.bg-dark{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-dark-rgb),var(--tblr-bg-opacity))!important}.bg-muted{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-muted-rgb),var(--tblr-bg-opacity))!important}.bg-blue{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-blue-rgb),var(--tblr-bg-opacity))!important}.bg-azure{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-azure-rgb),var(--tblr-bg-opacity))!important}.bg-indigo{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-indigo-rgb),var(--tblr-bg-opacity))!important}.bg-purple{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-purple-rgb),var(--tblr-bg-opacity))!important}.bg-pink{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-pink-rgb),var(--tblr-bg-opacity))!important}.bg-red{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-red-rgb),var(--tblr-bg-opacity))!important}.bg-orange{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-orange-rgb),var(--tblr-bg-opacity))!important}.bg-yellow{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-yellow-rgb),var(--tblr-bg-opacity))!important}.bg-lime{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-lime-rgb),var(--tblr-bg-opacity))!important}.bg-green{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-green-rgb),var(--tblr-bg-opacity))!important}.bg-teal{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-teal-rgb),var(--tblr-bg-opacity))!important}.bg-cyan{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-cyan-rgb),var(--tblr-bg-opacity))!important}.bg-facebook{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-facebook-rgb),var(--tblr-bg-opacity))!important}.bg-twitter{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-twitter-rgb),var(--tblr-bg-opacity))!important}.bg-linkedin{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-bg-opacity))!important}.bg-google{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-google-rgb),var(--tblr-bg-opacity))!important}.bg-youtube{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-youtube-rgb),var(--tblr-bg-opacity))!important}.bg-vimeo{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-bg-opacity))!important}.bg-dribbble{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-bg-opacity))!important}.bg-github{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-github-rgb),var(--tblr-bg-opacity))!important}.bg-instagram{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-instagram-rgb),var(--tblr-bg-opacity))!important}.bg-pinterest{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-bg-opacity))!important}.bg-vk{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-vk-rgb),var(--tblr-bg-opacity))!important}.bg-rss{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-rss-rgb),var(--tblr-bg-opacity))!important}.bg-flickr{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-flickr-rgb),var(--tblr-bg-opacity))!important}.bg-bitbucket{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-bg-opacity))!important}.bg-tabler{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-tabler-rgb),var(--tblr-bg-opacity))!important}.bg-black{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-black-rgb),var(--tblr-bg-opacity))!important}.bg-white{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-white-rgb),var(--tblr-bg-opacity))!important}.bg-body{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-body-bg-rgb),var(--tblr-bg-opacity))!important}.bg-transparent{--tblr-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--tblr-bg-opacity:0.1}.bg-opacity-25{--tblr-bg-opacity:0.25}.bg-opacity-50{--tblr-bg-opacity:0.5}.bg-opacity-75{--tblr-bg-opacity:0.75}.bg-opacity-100{--tblr-bg-opacity:1}.bg-gradient{background-image:var(--tblr-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--tblr-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--tblr-border-radius-sm)!important}.rounded-2{border-radius:var(--tblr-border-radius)!important}.rounded-3{border-radius:var(--tblr-border-radius-lg)!important}.rounded-4{border-radius:var(--tblr-border-radius-xl)!important}.rounded-5{border-radius:var(--tblr-border-radius-2xl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--tblr-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-end{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-bottom{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-start{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.object-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-scale-down{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-none{-o-object-fit:none!important;object-fit:none!important}.tracking-tight{letter-spacing:-.05em!important}.tracking-normal{letter-spacing:0!important}.tracking-wide{letter-spacing:.05em!important}.cursor-auto{cursor:auto!important}.cursor-pointer{cursor:pointer!important}.cursor-move{cursor:move!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-zoom-in{cursor:zoom-in!important}.cursor-zoom-out{cursor:zoom-out!important}.cursor-default{cursor:default!important}.cursor-none{cursor:none!important}.cursor-help{cursor:help!important}.cursor-progress{cursor:progress!important}.cursor-wait{cursor:wait!important}.cursor-text{cursor:text!important}.cursor-v-text{cursor:vertical-text!important}.cursor-grab{cursor:-webkit-grab!important;cursor:grab!important}.cursor-grabbing{cursor:-webkit-grabbing!important;cursor:grabbing!important}.border-x{border-left:1px var(--tblr-border-style) rgba(97,104,118,.16)!important;border-right:1px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-x-wide{border-left:2px var(--tblr-border-style) rgba(97,104,118,.16)!important;border-right:2px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-x-0{border-left:0!important;border-right:0!important}.border-y{border-top:1px var(--tblr-border-style) rgba(97,104,118,.16)!important;border-bottom:1px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-y-wide{border-top:2px var(--tblr-border-style) rgba(97,104,118,.16)!important;border-bottom:2px var(--tblr-border-style) rgba(97,104,118,.16)!important}.border-y-0{border-top:0!important;border-bottom:0!important}.columns-2{-moz-columns:2!important;columns:2!important}.columns-3{-moz-columns:3!important;columns:3!important}.columns-4{-moz-columns:4!important;columns:4!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:2rem!important}.m-sm-5{margin:4rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:2rem!important;margin-left:2rem!important}.mx-sm-5{margin-right:4rem!important;margin-left:4rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:2rem!important;margin-bottom:2rem!important}.my-sm-5{margin-top:4rem!important;margin-bottom:4rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:2rem!important}.mt-sm-5{margin-top:4rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:2rem!important}.me-sm-5{margin-right:4rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:2rem!important}.mb-sm-5{margin-bottom:4rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:2rem!important}.ms-sm-5{margin-left:4rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:2rem!important}.p-sm-5{padding:4rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:2rem!important;padding-left:2rem!important}.px-sm-5{padding-right:4rem!important;padding-left:4rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:2rem!important;padding-bottom:2rem!important}.py-sm-5{padding-top:4rem!important;padding-bottom:4rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:2rem!important}.pt-sm-5{padding-top:4rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:2rem!important}.pe-sm-5{padding-right:4rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:2rem!important}.pb-sm-5{padding-bottom:4rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:2rem!important}.ps-sm-5{padding-left:4rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:2rem!important}.gap-sm-5{gap:4rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.columns-sm-2{-moz-columns:2!important;columns:2!important}.columns-sm-3{-moz-columns:3!important;columns:3!important}.columns-sm-4{-moz-columns:4!important;columns:4!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:2rem!important}.m-md-5{margin:4rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:2rem!important;margin-left:2rem!important}.mx-md-5{margin-right:4rem!important;margin-left:4rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:2rem!important;margin-bottom:2rem!important}.my-md-5{margin-top:4rem!important;margin-bottom:4rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:2rem!important}.mt-md-5{margin-top:4rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:2rem!important}.me-md-5{margin-right:4rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:2rem!important}.mb-md-5{margin-bottom:4rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:2rem!important}.ms-md-5{margin-left:4rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:2rem!important}.p-md-5{padding:4rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:2rem!important;padding-left:2rem!important}.px-md-5{padding-right:4rem!important;padding-left:4rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:2rem!important;padding-bottom:2rem!important}.py-md-5{padding-top:4rem!important;padding-bottom:4rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:2rem!important}.pt-md-5{padding-top:4rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:2rem!important}.pe-md-5{padding-right:4rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:2rem!important}.pb-md-5{padding-bottom:4rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:2rem!important}.ps-md-5{padding-left:4rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:2rem!important}.gap-md-5{gap:4rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.columns-md-2{-moz-columns:2!important;columns:2!important}.columns-md-3{-moz-columns:3!important;columns:3!important}.columns-md-4{-moz-columns:4!important;columns:4!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:2rem!important}.m-lg-5{margin:4rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:2rem!important;margin-left:2rem!important}.mx-lg-5{margin-right:4rem!important;margin-left:4rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:2rem!important;margin-bottom:2rem!important}.my-lg-5{margin-top:4rem!important;margin-bottom:4rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:2rem!important}.mt-lg-5{margin-top:4rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:2rem!important}.me-lg-5{margin-right:4rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:2rem!important}.mb-lg-5{margin-bottom:4rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:2rem!important}.ms-lg-5{margin-left:4rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:2rem!important}.p-lg-5{padding:4rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:2rem!important;padding-left:2rem!important}.px-lg-5{padding-right:4rem!important;padding-left:4rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:2rem!important;padding-bottom:2rem!important}.py-lg-5{padding-top:4rem!important;padding-bottom:4rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:2rem!important}.pt-lg-5{padding-top:4rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:2rem!important}.pe-lg-5{padding-right:4rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:2rem!important}.pb-lg-5{padding-bottom:4rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:2rem!important}.ps-lg-5{padding-left:4rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:2rem!important}.gap-lg-5{gap:4rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.columns-lg-2{-moz-columns:2!important;columns:2!important}.columns-lg-3{-moz-columns:3!important;columns:3!important}.columns-lg-4{-moz-columns:4!important;columns:4!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:2rem!important}.m-xl-5{margin:4rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:2rem!important;margin-left:2rem!important}.mx-xl-5{margin-right:4rem!important;margin-left:4rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:2rem!important;margin-bottom:2rem!important}.my-xl-5{margin-top:4rem!important;margin-bottom:4rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:2rem!important}.mt-xl-5{margin-top:4rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:2rem!important}.me-xl-5{margin-right:4rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:2rem!important}.mb-xl-5{margin-bottom:4rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:2rem!important}.ms-xl-5{margin-left:4rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:2rem!important}.p-xl-5{padding:4rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:2rem!important;padding-left:2rem!important}.px-xl-5{padding-right:4rem!important;padding-left:4rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:2rem!important;padding-bottom:2rem!important}.py-xl-5{padding-top:4rem!important;padding-bottom:4rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:2rem!important}.pt-xl-5{padding-top:4rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:2rem!important}.pe-xl-5{padding-right:4rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:2rem!important}.pb-xl-5{padding-bottom:4rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:2rem!important}.ps-xl-5{padding-left:4rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:2rem!important}.gap-xl-5{gap:4rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.columns-xl-2{-moz-columns:2!important;columns:2!important}.columns-xl-3{-moz-columns:3!important;columns:3!important}.columns-xl-4{-moz-columns:4!important;columns:4!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:2rem!important}.m-xxl-5{margin:4rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:2rem!important;margin-left:2rem!important}.mx-xxl-5{margin-right:4rem!important;margin-left:4rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:2rem!important;margin-bottom:2rem!important}.my-xxl-5{margin-top:4rem!important;margin-bottom:4rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:2rem!important}.mt-xxl-5{margin-top:4rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:2rem!important}.me-xxl-5{margin-right:4rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:2rem!important}.mb-xxl-5{margin-bottom:4rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:2rem!important}.ms-xxl-5{margin-left:4rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:2rem!important}.p-xxl-5{padding:4rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:2rem!important;padding-left:2rem!important}.px-xxl-5{padding-right:4rem!important;padding-left:4rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:2rem!important;padding-bottom:2rem!important}.py-xxl-5{padding-top:4rem!important;padding-bottom:4rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:2rem!important}.pt-xxl-5{padding-top:4rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:2rem!important}.pe-xxl-5{padding-right:4rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:2rem!important}.pb-xxl-5{padding-bottom:4rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:2rem!important}.ps-xxl-5{padding-left:4rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:2rem!important}.gap-xxl-5{gap:4rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.columns-xxl-2{-moz-columns:2!important;columns:2!important}.columns-xxl-3{-moz-columns:3!important;columns:3!important}.columns-xxl-4{-moz-columns:4!important;columns:4!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:host,:root{font-size:16px;height:100%;--tblr-primary:#206bc4;--tblr-primary-fg:var(--tblr-light);--tblr-primary-darken:#1d60b0;--tblr-primary-rgb:32,107,196;--tblr-secondary:#616876;--tblr-secondary-fg:var(--tblr-light);--tblr-secondary-darken:#575e6a;--tblr-secondary-rgb:97,104,118;--tblr-success:#2fb344;--tblr-success-fg:var(--tblr-light);--tblr-success-darken:#2aa13d;--tblr-success-rgb:47,179,68;--tblr-info:#4299e1;--tblr-info-fg:var(--tblr-light);--tblr-info-darken:#3b8acb;--tblr-info-rgb:66,153,225;--tblr-warning:#f76707;--tblr-warning-fg:var(--tblr-light);--tblr-warning-darken:#de5d06;--tblr-warning-rgb:247,103,7;--tblr-danger:#d63939;--tblr-danger-fg:var(--tblr-light);--tblr-danger-darken:#c13333;--tblr-danger-rgb:214,57,57;--tblr-light:#f8fafc;--tblr-light-fg:var(--tblr-dark);--tblr-light-darken:#dfe1e3;--tblr-light-rgb:248,250,252;--tblr-dark:#1d273b;--tblr-dark-fg:var(--tblr-light);--tblr-dark-darken:#1a2335;--tblr-dark-rgb:29,39,59;--tblr-muted:#616876;--tblr-muted-fg:var(--tblr-light);--tblr-muted-darken:#575e6a;--tblr-muted-rgb:97,104,118;--tblr-blue:#206bc4;--tblr-blue-fg:var(--tblr-light);--tblr-blue-darken:#1d60b0;--tblr-blue-rgb:32,107,196;--tblr-azure:#4299e1;--tblr-azure-fg:var(--tblr-light);--tblr-azure-darken:#3b8acb;--tblr-azure-rgb:66,153,225;--tblr-indigo:#4263eb;--tblr-indigo-fg:var(--tblr-light);--tblr-indigo-darken:#3b59d4;--tblr-indigo-rgb:66,99,235;--tblr-purple:#ae3ec9;--tblr-purple-fg:var(--tblr-light);--tblr-purple-darken:#9d38b5;--tblr-purple-rgb:174,62,201;--tblr-pink:#d6336c;--tblr-pink-fg:var(--tblr-light);--tblr-pink-darken:#c12e61;--tblr-pink-rgb:214,51,108;--tblr-red:#d63939;--tblr-red-fg:var(--tblr-light);--tblr-red-darken:#c13333;--tblr-red-rgb:214,57,57;--tblr-orange:#f76707;--tblr-orange-fg:var(--tblr-light);--tblr-orange-darken:#de5d06;--tblr-orange-rgb:247,103,7;--tblr-yellow:#f59f00;--tblr-yellow-fg:var(--tblr-light);--tblr-yellow-darken:#dd8f00;--tblr-yellow-rgb:245,159,0;--tblr-lime:#74b816;--tblr-lime-fg:var(--tblr-light);--tblr-lime-darken:#68a614;--tblr-lime-rgb:116,184,22;--tblr-green:#2fb344;--tblr-green-fg:var(--tblr-light);--tblr-green-darken:#2aa13d;--tblr-green-rgb:47,179,68;--tblr-teal:#0ca678;--tblr-teal-fg:var(--tblr-light);--tblr-teal-darken:#0b956c;--tblr-teal-rgb:12,166,120;--tblr-cyan:#17a2b8;--tblr-cyan-fg:var(--tblr-light);--tblr-cyan-darken:#1592a6;--tblr-cyan-rgb:23,162,184;--tblr-facebook:#1877F2;--tblr-facebook-fg:var(--tblr-light);--tblr-facebook-darken:#166bda;--tblr-facebook-rgb:24,119,242;--tblr-twitter:#1da1f2;--tblr-twitter-fg:var(--tblr-light);--tblr-twitter-darken:#1a91da;--tblr-twitter-rgb:29,161,242;--tblr-linkedin:#0a66c2;--tblr-linkedin-fg:var(--tblr-light);--tblr-linkedin-darken:#095caf;--tblr-linkedin-rgb:10,102,194;--tblr-google:#dc4e41;--tblr-google-fg:var(--tblr-light);--tblr-google-darken:#c6463b;--tblr-google-rgb:220,78,65;--tblr-youtube:#ff0000;--tblr-youtube-fg:var(--tblr-light);--tblr-youtube-darken:#e60000;--tblr-youtube-rgb:255,0,0;--tblr-vimeo:#1ab7ea;--tblr-vimeo-fg:var(--tblr-light);--tblr-vimeo-darken:#17a5d3;--tblr-vimeo-rgb:26,183,234;--tblr-dribbble:#ea4c89;--tblr-dribbble-fg:var(--tblr-light);--tblr-dribbble-darken:#d3447b;--tblr-dribbble-rgb:234,76,137;--tblr-github:#181717;--tblr-github-fg:var(--tblr-light);--tblr-github-darken:#161515;--tblr-github-rgb:24,23,23;--tblr-instagram:#e4405f;--tblr-instagram-fg:var(--tblr-light);--tblr-instagram-darken:#cd3a56;--tblr-instagram-rgb:228,64,95;--tblr-pinterest:#bd081c;--tblr-pinterest-fg:var(--tblr-light);--tblr-pinterest-darken:#aa0719;--tblr-pinterest-rgb:189,8,28;--tblr-vk:#6383a8;--tblr-vk-fg:var(--tblr-light);--tblr-vk-darken:#597697;--tblr-vk-rgb:99,131,168;--tblr-rss:#ffa500;--tblr-rss-fg:var(--tblr-light);--tblr-rss-darken:#e69500;--tblr-rss-rgb:255,165,0;--tblr-flickr:#0063dc;--tblr-flickr-fg:var(--tblr-light);--tblr-flickr-darken:#0059c6;--tblr-flickr-rgb:0,99,220;--tblr-bitbucket:#0052cc;--tblr-bitbucket-fg:var(--tblr-light);--tblr-bitbucket-darken:#004ab8;--tblr-bitbucket-rgb:0,82,204;--tblr-tabler:#206bc4;--tblr-tabler-fg:var(--tblr-light);--tblr-tabler-darken:#1d60b0;--tblr-tabler-rgb:32,107,196;--tblr-gray-50:#f8fafc;--tblr-gray-50-fg:var(--tblr-dark);--tblr-gray-50-darken:#dfe1e3;--tblr-gray-50-rgb:248,250,252;--tblr-gray-100:#f1f5f9;--tblr-gray-100-fg:var(--tblr-dark);--tblr-gray-100-darken:#d9dde0;--tblr-gray-100-rgb:241,245,249;--tblr-gray-200:#e2e8f0;--tblr-gray-200-fg:var(--tblr-dark);--tblr-gray-200-darken:#cbd1d8;--tblr-gray-200-rgb:226,232,240;--tblr-gray-300:#c8d3e1;--tblr-gray-300-fg:var(--tblr-dark);--tblr-gray-300-darken:#b4becb;--tblr-gray-300-rgb:200,211,225;--tblr-gray-400:#9ba9be;--tblr-gray-400-fg:var(--tblr-light);--tblr-gray-400-darken:#8c98ab;--tblr-gray-400-rgb:155,169,190;--tblr-gray-500:#6c7a91;--tblr-gray-500-fg:var(--tblr-light);--tblr-gray-500-darken:#616e83;--tblr-gray-500-rgb:108,122,145;--tblr-gray-600:#49566c;--tblr-gray-600-fg:var(--tblr-light);--tblr-gray-600-darken:#424d61;--tblr-gray-600-rgb:73,86,108;--tblr-gray-700:#313c52;--tblr-gray-700-fg:var(--tblr-light);--tblr-gray-700-darken:#2c364a;--tblr-gray-700-rgb:49,60,82;--tblr-gray-800:#1d273b;--tblr-gray-800-fg:var(--tblr-light);--tblr-gray-800-darken:#1a2335;--tblr-gray-800-rgb:29,39,59;--tblr-gray-900:#0f172a;--tblr-gray-900-fg:var(--tblr-light);--tblr-gray-900-darken:#0e1526;--tblr-gray-900-rgb:15,23,42;--tblr-bg-surface:var(--tblr-white);--tblr-bg-surface-secondary:var(--tblr-light);--tblr-bg-surface-dark:var(--tblr-dark);--tblr-bg-forms:var(--tblr-bg-surface);--tblr-border-color:#e6e7e9;--tblr-border-color-light:#f2f3f4;--tblr-border-color-active:#b3b7bd;--tblr-icon-color:var(--tblr-gray-500);--tblr-active-bg:rgba(var(--tblr-primary-rgb), 0.04);--tblr-disabled-bg:var(--tblr-gray-100);--tblr-disabled-color:var(--tblr-gray-300);--tblr-code-color:var(--tblr-gray-600);--tblr-code-bg:var(--tblr-gray-100);--tblr-dark-mode-border-color:#243049;--tblr-dark-mode-border-color-light:#243049;--tblr-dark-mode-border-color-active:#314264;--tblr-font-weight-light:300;--tblr-font-weight-normal:400;--tblr-font-weight-medium:500;--tblr-font-weight-bold:600;--tblr-font-weight-headings:var(--tblr-font-weight-medium);--tblr-font-size-h1:1.5rem;--tblr-font-size-h2:1.25rem;--tblr-font-size-h3:1rem;--tblr-font-size-h4:0.875rem;--tblr-font-size-h5:0.75rem;--tblr-font-size-h6:0.625rem;--tblr-line-height-h1:2rem;--tblr-line-height-h2:1.75rem;--tblr-line-height-h3:1.5rem;--tblr-line-height-h4:1.25rem;--tblr-line-height-h5:1rem;--tblr-line-height-h6:1rem;--tblr-shadow:rgba(var(--tblr-body-color-rgb), 0.04) 0 2px 4px 0;--tblr-shadow-transparent:0 0 0 0 transparent;--tblr-shadow-button:0 1px 0 rgba(var(--tblr-body-color-rgb), 0.04);--tblr-shadow-button-inset:inset 0 -1px 0 rgba(var(--tblr-body-color-rgb), 0.2);--tblr-shadow-card:0 0 4px rgba(var(--tblr-body-color-rgb), 0.04);--tblr-shadow-card-hover:rgba(var(--tblr-body-color-rgb), 0.16) 0 2px 16px 0}@keyframes pulse{from{opacity:1;transform:scale3d(.8,.8,.8)}50%{transform:scale3d(1,1,1);opacity:1}to{opacity:1;transform:scale3d(.8,.8,.8)}}@keyframes tada{0%{transform:scale3d(1,1,1)}10%,5%{transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-5deg)}15%,25%,35%,45%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,5deg)}20%,30%,40%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-5deg)}50%{transform:scale3d(1,1,1)}}@keyframes rotate-360{from{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes blink{from{opacity:0}50%{opacity:1}to{opacity:0}}body{overflow-y:scroll;letter-spacing:0;touch-action:manipulation;text-rendering:optimizeLegibility;font-feature-settings:"liga" 0;position:relative;min-height:100%;height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media print{body{background:0 0}}::-webkit-scrollbar{width:.5rem;height:.5rem;-webkit-transition:background .3s;transition:background .3s}@media (prefers-reduced-motion:reduce){::-webkit-scrollbar{-webkit-transition:none;transition:none}}::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(var(--tblr-body-color-rgb),.16)}::-webkit-scrollbar-track{background:rgba(var(--tblr-body-color-rgb),.06)}:hover::-webkit-scrollbar-thumb{background:rgba(var(--tblr-body-color-rgb),.32)}::-webkit-scrollbar-corner{background:0 0}.layout-fluid .container,.layout-fluid [class*=" container-"],.layout-fluid [class^=container-]{max-width:100%}.layout-boxed{--tblr-theme-boxed-border-radius:0;--tblr-theme-boxed-width:1320px}@media (min-width:768px){.layout-boxed{background:#1d273b linear-gradient(to right,rgba(255,255,255,.1),transparent) fixed;padding:1rem;--tblr-theme-boxed-border-radius:4px}}.layout-boxed .page{margin:0 auto;max-width:var(--tblr-theme-boxed-width);border-radius:var(--tblr-theme-boxed-border-radius);color:#1d273b}@media (min-width:768px){.layout-boxed .page{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background:var(--tblr-body-bg)}}.layout-boxed .page>.navbar:first-child{border-top-left-radius:var(--tblr-theme-boxed-border-radius);border-top-right-radius:var(--tblr-theme-boxed-border-radius)}.navbar{--tblr-navbar-border-width:var(--tblr-border-width);--tblr-navbar-active-border-color:var(--tblr-primary);--tblr-navbar-active-bg:rgba(0, 0, 0, 0.06);--tblr-navbar-bg:transparent;align-items:stretch;min-height:3.5rem;box-shadow:inset 0 calc(-1 * var(--tblr-navbar-border-width)) 0 0 var(--tblr-navbar-border-color);background:var(--tblr-navbar-bg);--tblr-navbar-active-bg:rgba(0, 0, 0, 0.06);--tblr-navbar-bg:transparent;color:var(--tblr-body-color)}.navbar-collapse .navbar{flex-grow:1}.navbar.collapsing{min-height:0}.navbar .navbar-brand{color:var(--tblr-body-color)}.navbar .navbar-brand:focus,.navbar .navbar-brand:hover{color:var(--tblr-body-color);opacity:.8}.navbar .navbar-nav .nav-link{color:var(--tblr-body-color)}.navbar .navbar-nav .nav-link:focus,.navbar .navbar-nav .nav-link:hover{color:var(--tblr-body-color) color}.navbar .navbar-nav .nav-link.disabled{color:var(--tblr-disabled-color)}.navbar .navbar-nav .active>.nav-link,.navbar .navbar-nav .nav-link.active,.navbar .navbar-nav .nav-link.show,.navbar .navbar-nav .show>.nav-link{color:var(--tblr-body-color) color}.navbar .navbar-toggler{color:var(--tblr-body-color);border-color:transparent}.navbar .navbar-text{color:var(--tblr-body-color)}.navbar .navbar-text a,.navbar .navbar-text a:focus,.navbar .navbar-text a:hover{color:var(--tblr-body-color)}@media not print{.theme-dark .navbar{--tblr-navbar-border-color:#243049;--tblr-navbar-bg:#1d273b;--tblr-navbar-active-bg:rgba(255, 255, 255, 0.06);--tblr-navbar-bg:#1d273b;color:rgba(255,255,255,.7)}.theme-dark .navbar .navbar-brand{color:#fff}.theme-dark .navbar .navbar-brand:focus,.theme-dark .navbar .navbar-brand:hover{color:#fff;opacity:.8}.theme-dark .navbar .navbar-nav .nav-link{color:rgba(255,255,255,.7)}.theme-dark .navbar .navbar-nav .nav-link:focus,.theme-dark .navbar .navbar-nav .nav-link:hover{color:#fff}.theme-dark .navbar .navbar-nav .nav-link.disabled{color:var(--tblr-disabled-color)}.theme-dark .navbar .navbar-nav .active>.nav-link,.theme-dark .navbar .navbar-nav .nav-link.active,.theme-dark .navbar .navbar-nav .nav-link.show,.theme-dark .navbar .navbar-nav .show>.nav-link{color:#fff}.theme-dark .navbar .navbar-toggler{color:#fff;border-color:transparent}.theme-dark .navbar .navbar-text{color:rgba(255,255,255,.7)}.theme-dark .navbar .navbar-text a,.theme-dark .navbar .navbar-text a:focus,.theme-dark .navbar .navbar-text a:hover{color:rgba(255,255,255,.7)}.theme-dark .navbar::-webkit-scrollbar{width:.5rem;height:.5rem;-webkit-transition:background .3s;transition:background .3s}@media (prefers-reduced-motion:reduce){.theme-dark .navbar::-webkit-scrollbar{-webkit-transition:none;transition:none}}.theme-dark .navbar::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(var(--tblr-body-color-rgb),.16)}.theme-dark .navbar::-webkit-scrollbar-track{background:rgba(var(--tblr-body-color-rgb),.06)}.theme-dark .navbar:hover::-webkit-scrollbar-thumb{background:rgba(var(--tblr-body-color-rgb),.32)}.theme-dark .navbar::-webkit-scrollbar-corner{background:0 0}}@media not print{@media (prefers-color-scheme:dark){.theme-dark-auto .navbar{--tblr-navbar-border-color:#243049;--tblr-navbar-bg:#1d273b;--tblr-navbar-active-bg:rgba(255, 255, 255, 0.06);--tblr-navbar-bg:#1d273b;color:rgba(255,255,255,.7)}.theme-dark-auto .navbar .navbar-brand{color:#fff}.theme-dark-auto .navbar .navbar-brand:focus,.theme-dark-auto .navbar .navbar-brand:hover{color:#fff;opacity:.8}.theme-dark-auto .navbar .navbar-nav .nav-link{color:rgba(255,255,255,.7)}.theme-dark-auto .navbar .navbar-nav .nav-link:focus,.theme-dark-auto .navbar .navbar-nav .nav-link:hover{color:#fff}.theme-dark-auto .navbar .navbar-nav .nav-link.disabled{color:var(--tblr-disabled-color)}.theme-dark-auto .navbar .navbar-nav .active>.nav-link,.theme-dark-auto .navbar .navbar-nav .nav-link.active,.theme-dark-auto .navbar .navbar-nav .nav-link.show,.theme-dark-auto .navbar .navbar-nav .show>.nav-link{color:#fff}.theme-dark-auto .navbar .navbar-toggler{color:#fff;border-color:transparent}.theme-dark-auto .navbar .navbar-text{color:rgba(255,255,255,.7)}.theme-dark-auto .navbar .navbar-text a,.theme-dark-auto .navbar .navbar-text a:focus,.theme-dark-auto .navbar .navbar-text a:hover{color:rgba(255,255,255,.7)}.theme-dark-auto .navbar::-webkit-scrollbar{width:.5rem;height:.5rem;-webkit-transition:background .3s;transition:background .3s}}@media (prefers-color-scheme:dark) and (prefers-reduced-motion:reduce){.theme-dark-auto .navbar::-webkit-scrollbar{-webkit-transition:none;transition:none}}@media (prefers-color-scheme:dark){.theme-dark-auto .navbar::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(var(--tblr-body-color-rgb),.16)}}@media (prefers-color-scheme:dark){.theme-dark-auto .navbar::-webkit-scrollbar-track{background:rgba(var(--tblr-body-color-rgb),.06)}}@media (prefers-color-scheme:dark){.theme-dark-auto .navbar:hover::-webkit-scrollbar-thumb{background:rgba(var(--tblr-body-color-rgb),.32)}}@media (prefers-color-scheme:dark){.theme-dark-auto .navbar::-webkit-scrollbar-corner{background:0 0}}}.navbar .dropdown-menu{position:absolute;z-index:1030}.navbar .navbar-nav{min-height:3rem}.navbar .navbar-nav .nav-link{position:relative;min-width:2rem;min-height:2rem;justify-content:center;border-radius:var(--tblr-border-radius)}.navbar .navbar-nav .nav-link .badge{position:absolute;top:.375rem;right:.375rem;transform:translate(50%,-50%)}.navbar-nav{margin:0;padding:0}@media (max-width:575.98px){.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:576px){.navbar-expand-sm .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-sm .navbar-light .nav-item.active,.navbar-expand-sm.navbar-light .nav-item.active{position:relative}.navbar-expand-sm .navbar-light .nav-item.active:after,.navbar-expand-sm.navbar-light .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-sm.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical~.navbar,.navbar-expand-sm.navbar-vertical~.page-wrapper{margin-left:15rem}.navbar-expand-sm.navbar-vertical.navbar-right~.navbar,.navbar-expand-sm.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:15rem}}@media (max-width:767.98px){.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:768px){.navbar-expand-md .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-md .navbar-light .nav-item.active,.navbar-expand-md.navbar-light .nav-item.active{position:relative}.navbar-expand-md .navbar-light .nav-item.active:after,.navbar-expand-md.navbar-light .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-md.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical~.navbar,.navbar-expand-md.navbar-vertical~.page-wrapper{margin-left:15rem}.navbar-expand-md.navbar-vertical.navbar-right~.navbar,.navbar-expand-md.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:15rem}}@media (max-width:991.98px){.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:992px){.navbar-expand-lg .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-lg .navbar-light .nav-item.active,.navbar-expand-lg.navbar-light .nav-item.active{position:relative}.navbar-expand-lg .navbar-light .nav-item.active:after,.navbar-expand-lg.navbar-light .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-lg.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical~.navbar,.navbar-expand-lg.navbar-vertical~.page-wrapper{margin-left:15rem}.navbar-expand-lg.navbar-vertical.navbar-right~.navbar,.navbar-expand-lg.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:15rem}}@media (max-width:1199.98px){.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:1200px){.navbar-expand-xl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xl .navbar-light .nav-item.active,.navbar-expand-xl.navbar-light .nav-item.active{position:relative}.navbar-expand-xl .navbar-light .nav-item.active:after,.navbar-expand-xl.navbar-light .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical~.navbar,.navbar-expand-xl.navbar-vertical~.page-wrapper{margin-left:15rem}.navbar-expand-xl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xl.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:15rem}}@media (max-width:1399.98px){.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:1400px){.navbar-expand-xxl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xxl .navbar-light .nav-item.active,.navbar-expand-xxl.navbar-light .nav-item.active{position:relative}.navbar-expand-xxl .navbar-light .nav-item.active:after,.navbar-expand-xxl.navbar-light .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xxl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical~.navbar,.navbar-expand-xxl.navbar-vertical~.page-wrapper{margin-left:15rem}.navbar-expand-xxl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xxl.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:15rem}}.navbar-expand .navbar-collapse{flex-direction:column}.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-expand .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand .navbar-light .nav-item.active,.navbar-expand.navbar-light .nav-item.active{position:relative}.navbar-expand .navbar-light .nav-item.active:after,.navbar-expand.navbar-light .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical~.navbar,.navbar-expand.navbar-vertical~.page-wrapper{margin-left:15rem}.navbar-expand.navbar-vertical.navbar-right~.navbar,.navbar-expand.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:15rem}.navbar-brand{display:inline-flex;align-items:center;font-weight:var(--tblr-font-weight-bold);margin:0;line-height:1}.navbar-brand-image{height:2rem;width:auto}.navbar-toggler{border:0;width:2rem;height:2rem;position:relative;display:flex;align-items:center;justify-content:center}.navbar-toggler-icon{height:2px;width:1.25em;background:currentColor;border-radius:10px;transition:top .2s .2s,bottom .2s .2s,transform .2s,opacity 0s .2s;position:relative}@media (prefers-reduced-motion:reduce){.navbar-toggler-icon{transition:none}}.navbar-toggler-icon:after,.navbar-toggler-icon:before{content:"";display:block;height:inherit;width:inherit;border-radius:inherit;background:inherit;position:absolute;left:0;transition:inherit}@media (prefers-reduced-motion:reduce){.navbar-toggler-icon:after,.navbar-toggler-icon:before{transition:none}}.navbar-toggler-icon:before{top:-.45em}.navbar-toggler-icon:after{bottom:-.45em}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transform:rotate(45deg);transition:top .3s,bottom .3s,transform .3s .3s,opacity 0s .3s}@media (prefers-reduced-motion:reduce){.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transition:none}}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:before{top:0;transform:rotate(-90deg)}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:after{bottom:0;opacity:0}.navbar-light{--tblr-navbar-border-color:var(--tblr-border-color);--tblr-navbar-bg:var(--tblr-bg-surface)}.navbar-dark{--tblr-navbar-border-color:#243049;--tblr-navbar-bg:#1d273b;--tblr-navbar-active-bg:rgba(255, 255, 255, 0.06);--tblr-navbar-bg:#1d273b;color:rgba(255,255,255,.7)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff;opacity:.8}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.7)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#fff}.navbar-dark .navbar-nav .nav-link.disabled{color:var(--tblr-disabled-color)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:#fff;border-color:transparent}.navbar-dark .navbar-text{color:rgba(255,255,255,.7)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:rgba(255,255,255,.7)}.navbar-dark::-webkit-scrollbar{width:.5rem;height:.5rem;-webkit-transition:background .3s;transition:background .3s}@media (prefers-reduced-motion:reduce){.navbar-dark::-webkit-scrollbar{-webkit-transition:none;transition:none}}.navbar-dark::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(var(--tblr-body-color-rgb),.16)}.navbar-dark::-webkit-scrollbar-track{background:rgba(var(--tblr-body-color-rgb),.06)}.navbar-dark:hover::-webkit-scrollbar-thumb{background:rgba(var(--tblr-body-color-rgb),.32)}.navbar-dark::-webkit-scrollbar-corner{background:0 0}.navbar-transparent{--tblr-navbar-border-color:transparent!important;background:0 0!important}.navbar-nav{align-items:stretch}.navbar-nav .nav-item{display:flex;flex-direction:column;justify-content:center}.navbar-side{margin:0;display:flex;flex-direction:row;align-items:center;justify-content:space-around}@media (min-width:576px){.navbar-vertical.navbar-expand-sm{width:15rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-x:auto;padding:0}}@media (min-width:576px) and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-sm{transition:none}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm.navbar-right{left:auto;right:0}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm .navbar-brand{padding:.75rem 0;justify-content:center}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm .navbar-collapse{align-items:stretch}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-sm .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm~.page{padding-left:15rem}.navbar-vertical.navbar-expand-sm~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm.navbar-right~.page{padding-left:0;padding-right:15rem}}@media (min-width:576px){.navbar-vertical.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:768px){.navbar-vertical.navbar-expand-md{width:15rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-x:auto;padding:0}}@media (min-width:768px) and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-md{transition:none}}@media (min-width:768px){.navbar-vertical.navbar-expand-md.navbar-right{left:auto;right:0}}@media (min-width:768px){.navbar-vertical.navbar-expand-md .navbar-brand{padding:.75rem 0;justify-content:center}}@media (min-width:768px){.navbar-vertical.navbar-expand-md .navbar-collapse{align-items:stretch}}@media (min-width:768px){.navbar-vertical.navbar-expand-md .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-md .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}}@media (min-width:768px){.navbar-vertical.navbar-expand-md>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}}@media (min-width:768px){.navbar-vertical.navbar-expand-md~.page{padding-left:15rem}.navbar-vertical.navbar-expand-md~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width:768px){.navbar-vertical.navbar-expand-md.navbar-right~.page{padding-left:0;padding-right:15rem}}@media (min-width:768px){.navbar-vertical.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg{width:15rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-x:auto;padding:0}}@media (min-width:992px) and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-lg{transition:none}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg.navbar-right{left:auto;right:0}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.75rem 0;justify-content:center}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg .navbar-collapse{align-items:stretch}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-lg .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg~.page{padding-left:15rem}.navbar-vertical.navbar-expand-lg~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg.navbar-right~.page{padding-left:0;padding-right:15rem}}@media (min-width:992px){.navbar-vertical.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl{width:15rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-x:auto;padding:0}}@media (min-width:1200px) and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-xl{transition:none}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl.navbar-right{left:auto;right:0}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl .navbar-brand{padding:.75rem 0;justify-content:center}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl .navbar-collapse{align-items:stretch}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl~.page{padding-left:15rem}.navbar-vertical.navbar-expand-xl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl.navbar-right~.page{padding-left:0;padding-right:15rem}}@media (min-width:1200px){.navbar-vertical.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl{width:15rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-x:auto;padding:0}}@media (min-width:1400px) and (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand-xxl{transition:none}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl.navbar-right{left:auto;right:0}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl .navbar-brand{padding:.75rem 0;justify-content:center}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl .navbar-collapse{align-items:stretch}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xxl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl~.page{padding-left:15rem}.navbar-vertical.navbar-expand-xxl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl.navbar-right~.page{padding-left:0;padding-right:15rem}}@media (min-width:1400px){.navbar-vertical.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}.navbar-vertical.navbar-expand{width:15rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-x:auto;padding:0}@media (prefers-reduced-motion:reduce){.navbar-vertical.navbar-expand{transition:none}}.navbar-vertical.navbar-expand.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand~.page{padding-left:15rem}.navbar-vertical.navbar-expand~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand.navbar-right~.page{padding-left:0;padding-right:15rem}.navbar-vertical.navbar-expand .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem .75rem;justify-content:flex-start}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:0 0;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:2.5rem;color:inherit}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:4rem}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:5.5rem}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-overlap:after{content:"";height:9rem;position:absolute;top:100%;left:0;right:0;background:inherit;z-index:-1;box-shadow:inherit}.page{display:flex;flex-direction:column;position:relative;min-height:100%}.page-center{justify-content:center}.page-wrapper{flex:1;display:flex;flex-direction:column}@media print{.page-wrapper{margin:0!important}}.page-wrapper-full .page-body:first-child{margin:0;border-top:0}.page-body{margin-top:1.25rem;margin-bottom:1.25rem}.page-body-card{background:var(--tblr-bg-surface);border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding:1.25rem 0;margin-bottom:0;flex:1}.page-body~.page-body-card{margin-top:0}.page-cover{background:no-repeat center/cover;min-height:9rem}@media (min-width:768px){.page-cover{min-height:12rem}}@media (min-width:992px){.page-cover{min-height:15rem}}.page-cover-overlay{position:relative}.page-cover-overlay:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background-image:linear-gradient(180deg,rgba(0,0,0,0) 0,rgba(0,0,0,.6) 100%)}.page-header{display:flex;flex-wrap:wrap;min-height:2.25rem;flex-direction:column;justify-content:center}.page-wrapper .page-header{margin:1.25rem 0 0}.page-header-border{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding:1.25rem 0;margin:0!important;background-color:var(--tblr-bg-surface)}.page-pretitle{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted)}.page-title{margin:0;font-size:1.25rem;line-height:1.75rem;font-weight:var(--tblr-font-weight-bold);color:inherit;display:flex;align-items:center}.page-title svg{width:1.5rem;height:1.5rem;margin-right:.25rem}.page-title-lg{font-size:1.5rem;line-height:2rem}.page-subtitle{margin-top:.25rem;color:var(--tblr-muted)}.page-tabs{margin-top:.5rem;position:relative}.page-header-tabs .nav-bordered{border:0}.page-header-tabs+.page-body-card{margin-top:0}.footer{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background-color:#fff;padding:2rem 0;color:var(--tblr-muted);margin-top:auto}.footer-transparent{background-color:transparent;border-top:0}/*! + * Tabler (v0.9.0): _dark.scss + * Copyright 2018-2021 The Tabler Authors + * Copyright 2018-2021 codecalm + * Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE) + */body:not(.theme-dark) .hide-theme-light{display:none!important}@media not print{.theme-dark{--tblr-body-color:#f8fafc;--tblr-body-color-rgb:248,250,252;--tblr-muted:rgba(153, 159, 164, 1);--tblr-body-bg:#1a2234;--tblr-body-bg-rgb:26,34,52;--tblr-bg-forms:#1a2234;--tblr-bg-surface:#1d273b;--tblr-bg-surface-dark:#1a2234;--tblr-bg-surface-secondary:#1a2234;--tblr-link-color:#307fdd;--tblr-link-hover-color:#206bc4;--tblr-active-bg:#202c42;--tblr-disabled-color:var(--tblr-gray-700);--tblr-card-bg:#1a2234;--tblr-card-bg-hover:#1a2234;--tblr-card-bg-rgb:26,34,52;--tblr-card-color:#f8fafc;--tblr-border-color:var(--tblr-dark-mode-border-color);--tblr-border-color-light:var(--tblr-dark-mode-border-color-light);--tblr-border-color-active:var(--tblr-dark-mode-border-color-active);--tblr-btn-color:#1a2234;--tblr-code-color:var(--tblr-body-color);--tblr-code-bg:#243049;color:#f8fafc;background-color:#1a2234}.theme-dark .page{color:#f8fafc}.theme-dark .hide-theme-dark{display:none!important}.theme-dark .text-body{color:#f8fafc!important}.theme-dark .alert:not(.alert-important),.theme-dark .card,.theme-dark .card-footer,.theme-dark .card-stacked::after,.theme-dark .dropdown-menu,.theme-dark .footer:not(.footer-transparent),.theme-dark .modal-content,.theme-dark .modal-header,.theme-dark .toast,.theme-dark .toast-header{background-color:var(--tblr-bg-surface);color:inherit}.theme-dark .modal{--tblr-modal-border-color:var(--tblr-border-color)}.theme-dark .bg-light{background-color:#1a2234!important}.theme-dark .card-tabs .nav-tabs .nav-link{background-color:#1a2234;color:inherit}.theme-dark .card-tabs .nav-tabs .nav-link.active{background-color:#1d273b;color:inherit}.theme-dark .form-check-input:not(:checked),.theme-dark .form-control,.theme-dark .form-file-text,.theme-dark .form-select,.theme-dark .form-selectgroup-check{background-color:#1a2234;color:#f8fafc;border-color:#243049}.theme-dark .form-control-plaintext{color:#f8fafc}.theme-dark .input-group-flat .input-group-text{background-color:#1a2234}.theme-dark .input-group-text{border-color:#243049}.theme-dark .highlight{background-color:#1a2234}.theme-dark .avatar{--tblr-avatar-bg:#202c42}.theme-dark .accordion-button,.theme-dark .markdown,.theme-dark .markdown>*{color:inherit}.theme-dark .accordion-button:after,.theme-dark .btn-close{filter:invert(1) grayscale(100%) brightness(200%)}.theme-dark .apexcharts-text{fill:#f8fafc}.theme-dark .apexcharts-gridline{stroke:var(--tblr-border-color)}.theme-dark .apexcharts-legend-text{color:inherit!important}.theme-dark .navbar-brand-autodark{filter:brightness(0) invert(1)}.theme-dark .input-group-text,.theme-dark .markdown>table thead th,.theme-dark .table thead th{background:0 0}.theme-dark .list-group-header{background:#1a2234}.theme-dark .list-group-item:not(.disabled):not(:disabled){color:#f8fafc}.theme-dark .list-group-item.disabled,.theme-dark .list-group-item:disabled{color:#49566c}.theme-dark .apexcharts-radialbar-area{stroke:#243049}.theme-dark .form-control.is-invalid,.theme-dark .was-validated .form-control:invalid{border-color:var(--tblr-danger)}.theme-dark .form-control.is-valid,.theme-dark .was-validated .form-control:valid{border-color:var(--tblr-success)}}@media not print{@media (prefers-color-scheme:dark){.theme-dark-auto{--tblr-body-color:#f8fafc;--tblr-body-color-rgb:248,250,252;--tblr-muted:rgba(153, 159, 164, 1);--tblr-body-bg:#1a2234;--tblr-body-bg-rgb:26,34,52;--tblr-bg-forms:#1a2234;--tblr-bg-surface:#1d273b;--tblr-bg-surface-dark:#1a2234;--tblr-bg-surface-secondary:#1a2234;--tblr-link-color:#307fdd;--tblr-link-hover-color:#206bc4;--tblr-active-bg:#202c42;--tblr-disabled-color:var(--tblr-gray-700);--tblr-card-bg:#1a2234;--tblr-card-bg-hover:#1a2234;--tblr-card-bg-rgb:26,34,52;--tblr-card-color:#f8fafc;--tblr-border-color:var(--tblr-dark-mode-border-color);--tblr-border-color-light:var(--tblr-dark-mode-border-color-light);--tblr-border-color-active:var(--tblr-dark-mode-border-color-active);--tblr-btn-color:#1a2234;--tblr-code-color:var(--tblr-body-color);--tblr-code-bg:#243049;color:#f8fafc;background-color:#1a2234}.theme-dark-auto .page{color:#f8fafc}.theme-dark-auto .hide-theme-dark{display:none!important}.theme-dark-auto .text-body{color:#f8fafc!important}.theme-dark-auto .alert:not(.alert-important),.theme-dark-auto .card,.theme-dark-auto .card-footer,.theme-dark-auto .card-stacked::after,.theme-dark-auto .dropdown-menu,.theme-dark-auto .footer:not(.footer-transparent),.theme-dark-auto .modal-content,.theme-dark-auto .modal-header,.theme-dark-auto .toast,.theme-dark-auto .toast-header{background-color:var(--tblr-bg-surface);color:inherit}.theme-dark-auto .modal{--tblr-modal-border-color:var(--tblr-border-color)}.theme-dark-auto .bg-light{background-color:#1a2234!important}.theme-dark-auto .card-tabs .nav-tabs .nav-link{background-color:#1a2234;color:inherit}.theme-dark-auto .card-tabs .nav-tabs .nav-link.active{background-color:#1d273b;color:inherit}.theme-dark-auto .form-check-input:not(:checked),.theme-dark-auto .form-control,.theme-dark-auto .form-file-text,.theme-dark-auto .form-select,.theme-dark-auto .form-selectgroup-check{background-color:#1a2234;color:#f8fafc;border-color:#243049}.theme-dark-auto .form-control-plaintext{color:#f8fafc}.theme-dark-auto .input-group-flat .input-group-text{background-color:#1a2234}.theme-dark-auto .input-group-text{border-color:#243049}.theme-dark-auto .highlight{background-color:#1a2234}.theme-dark-auto .avatar{--tblr-avatar-bg:#202c42}.theme-dark-auto .accordion-button,.theme-dark-auto .markdown,.theme-dark-auto .markdown>*{color:inherit}.theme-dark-auto .accordion-button:after,.theme-dark-auto .btn-close{filter:invert(1) grayscale(100%) brightness(200%)}.theme-dark-auto .apexcharts-text{fill:#f8fafc}.theme-dark-auto .apexcharts-gridline{stroke:var(--tblr-border-color)}.theme-dark-auto .apexcharts-legend-text{color:inherit!important}.theme-dark-auto .navbar-brand-autodark{filter:brightness(0) invert(1)}.theme-dark-auto .input-group-text,.theme-dark-auto .markdown>table thead th,.theme-dark-auto .table thead th{background:0 0}.theme-dark-auto .list-group-header{background:#1a2234}.theme-dark-auto .list-group-item:not(.disabled):not(:disabled){color:#f8fafc}.theme-dark-auto .list-group-item.disabled,.theme-dark-auto .list-group-item:disabled{color:#49566c}.theme-dark-auto .apexcharts-radialbar-area{stroke:#243049}.theme-dark-auto .form-control.is-invalid,.theme-dark-auto .was-validated .form-control:invalid{border-color:var(--tblr-danger)}.theme-dark-auto .form-control.is-valid,.theme-dark-auto .was-validated .form-control:valid{border-color:var(--tblr-success)}}}.accordion{--tblr-accordion-color:var(--tblr-body-color)}.accordion-button:focus:not(:focus-visible){outline:0;box-shadow:none}.accordion-button:after{opacity:.7}.accordion-button:not(.collapsed){font-weight:var(--tblr-font-weight-bold);border-bottom-color:transparent;box-shadow:none}.accordion-button:not(.collapsed):after{opacity:1}.alert{--tblr-alert-color:var(--tblr-muted);background:#fff;border:1px var(--tblr-border-style) var(--tblr-border-color-translucent);border-left:.25rem var(--tblr-border-style) var(--tblr-alert-color);box-shadow:rgba(29,39,59,.04) 0 2px 4px 0}.alert>:last-child{margin-bottom:0}.alert-important{border-color:transparent;background:var(--tblr-alert-color);color:#fff}.alert-important .alert-icon,.alert-important .alert-link{color:inherit}.alert-important .alert-link:hover{color:inherit}.alert-link,.alert-link:hover{color:var(--tblr-alert-color)}.alert-primary{--tblr-alert-color:var(--tblr-primary)}.alert-secondary{--tblr-alert-color:var(--tblr-secondary)}.alert-success{--tblr-alert-color:var(--tblr-success)}.alert-info{--tblr-alert-color:var(--tblr-info)}.alert-warning{--tblr-alert-color:var(--tblr-warning)}.alert-danger{--tblr-alert-color:var(--tblr-danger)}.alert-light{--tblr-alert-color:var(--tblr-light)}.alert-dark{--tblr-alert-color:var(--tblr-dark)}.alert-muted{--tblr-alert-color:var(--tblr-muted)}.alert-blue{--tblr-alert-color:var(--tblr-blue)}.alert-azure{--tblr-alert-color:var(--tblr-azure)}.alert-indigo{--tblr-alert-color:var(--tblr-indigo)}.alert-purple{--tblr-alert-color:var(--tblr-purple)}.alert-pink{--tblr-alert-color:var(--tblr-pink)}.alert-red{--tblr-alert-color:var(--tblr-red)}.alert-orange{--tblr-alert-color:var(--tblr-orange)}.alert-yellow{--tblr-alert-color:var(--tblr-yellow)}.alert-lime{--tblr-alert-color:var(--tblr-lime)}.alert-green{--tblr-alert-color:var(--tblr-green)}.alert-teal{--tblr-alert-color:var(--tblr-teal)}.alert-cyan{--tblr-alert-color:var(--tblr-cyan)}.alert-facebook{--tblr-alert-color:var(--tblr-facebook)}.alert-twitter{--tblr-alert-color:var(--tblr-twitter)}.alert-linkedin{--tblr-alert-color:var(--tblr-linkedin)}.alert-google{--tblr-alert-color:var(--tblr-google)}.alert-youtube{--tblr-alert-color:var(--tblr-youtube)}.alert-vimeo{--tblr-alert-color:var(--tblr-vimeo)}.alert-dribbble{--tblr-alert-color:var(--tblr-dribbble)}.alert-github{--tblr-alert-color:var(--tblr-github)}.alert-instagram{--tblr-alert-color:var(--tblr-instagram)}.alert-pinterest{--tblr-alert-color:var(--tblr-pinterest)}.alert-vk{--tblr-alert-color:var(--tblr-vk)}.alert-rss{--tblr-alert-color:var(--tblr-rss)}.alert-flickr{--tblr-alert-color:var(--tblr-flickr)}.alert-bitbucket{--tblr-alert-color:var(--tblr-bitbucket)}.alert-tabler{--tblr-alert-color:var(--tblr-tabler)}.alert-icon{color:var(--tblr-alert-color);width:1.5rem!important;height:1.5rem!important;margin:-.125rem 1rem -.125rem 0}.alert-title{font-size:.875rem;line-height:1.25rem;font-weight:var(--tblr-font-weight-bold);margin-bottom:.25rem;color:var(--tblr-alert-color)}.avatar{--tblr-avatar-size:2.5rem;--tblr-avatar-bg:var(--tblr-gray-100);position:relative;width:var(--tblr-avatar-size);height:var(--tblr-avatar-size);font-size:calc(var(--tblr-avatar-size)/ 2.8571428572);font-weight:var(--tblr-font-weight-medium);display:inline-flex;align-items:center;justify-content:center;color:var(--tblr-muted);text-align:center;text-transform:uppercase;vertical-align:bottom;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:var(--tblr-avatar-bg) no-repeat center/cover;border-radius:var(--tblr-border-radius)}.avatar svg{width:calc(var(--tblr-avatar-size)/ 1.6666666667);height:calc(var(--tblr-avatar-size)/ 1.6666666667)}.avatar .badge{position:absolute;right:0;bottom:0;border-radius:100rem;box-shadow:0 0 0 2px var(--tblr-bg-surface)}a.avatar{cursor:pointer}.avatar-rounded{border-radius:100rem}.avatar-xs{--tblr-avatar-size:1.5rem}.avatar-xs .badge:empty{width:.375rem;height:.375rem}.avatar-sm{--tblr-avatar-size:2rem}.avatar-sm .badge:empty{width:.5rem;height:.5rem}.avatar-md{--tblr-avatar-size:4rem}.avatar-md .badge:empty{width:1rem;height:1rem}.avatar-lg{--tblr-avatar-size:5rem}.avatar-lg .badge:empty{width:1.25rem;height:1.25rem}.avatar-xl{--tblr-avatar-size:7rem}.avatar-xl .badge:empty{width:1.75rem;height:1.75rem}.avatar-2xl{--tblr-avatar-size:11rem}.avatar-2xl .badge:empty{width:2.75rem;height:2.75rem}.avatar-list{--tblr-list-gap:0.5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.avatar-list a.avatar:hover{z-index:1}.avatar-list-stacked .avatar{margin-right:-.5rem!important;box-shadow:0 0 0 2px 0 0 0 2px var(--tblr-card-cap-bg,var(--tblr-card-bg,var(--tblr-bg-surface)))}.avatar-upload{width:4rem;height:4rem;border:1px dashed var(--tblr-border-color);background:var(--tblr-bg-forms);flex-direction:column;transition:color .3s,background-color .3s}@media (prefers-reduced-motion:reduce){.avatar-upload{transition:none}}.avatar-upload svg{width:1.5rem;height:1.5rem;stroke-width:1}.avatar-upload:hover{border-color:var(--tblr-primary);color:var(--tblr-primary);text-decoration:none}.avatar-upload-text{font-size:.625rem;line-height:1;margin-top:.25rem}.page-cover~* .page-avatar{margin-top:calc(calc(-1 * calc(var(--tblr-avatar-size) * .5)) - 1.25rem);box-shadow:0 0 0 .25rem #f1f5f9}.badge{justify-content:center;align-items:center;background:#6c7a91;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) transparent;min-width:1.35714285em;font-weight:var(--tblr-font-weight-medium);letter-spacing:.04em;vertical-align:bottom}a.badge{color:var(--tblr-bg-surface)}.badge:empty{display:inline-block;width:.5rem;height:.5rem;min-width:0;min-height:auto;padding:0;border-radius:100rem;vertical-align:baseline}.badge .avatar{box-sizing:content-box;width:1.25rem;height:1.25rem;margin:0 .5rem 0 -.5rem}.badge .icon{width:1em;height:1em;font-size:1rem;stroke-width:2}.badge-outline{background-color:transparent;border:var(--tblr-border-width) var(--tblr-border-style) currentColor}.badge-pill{border-radius:100rem}.badges-list{--tblr-list-gap:0.5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.badge-notification{position:absolute!important;top:0!important;right:0!important;transform:translate(50%,-50%);z-index:1}.badge-blink{animation:blink 2s infinite}.breadcrumb{--tblr-breadcrumb-item-active-font-weight:var(--tblr-font-weight-bold);--tblr-breadcrumb-item-disabled-color:var(--tblr-disabled-color);--tblr-breadcrumb-link-color:var(--tblr-link-color);padding:0;margin:0;background:0 0}.breadcrumb a{color:var(--tblr-breadcrumb-link-color)}.breadcrumb a:hover{text-decoration:underline}.breadcrumb-muted{--tblr-breadcrumb-link-color:var(--tblr-muted)}.breadcrumb-item.active{font-weight:var(--tblr-breadcrumb-item-active-font-weight)}.breadcrumb-item.active a{color:inherit;pointer-events:none}.breadcrumb-item.disabled{color:var(--tblr-breadcrumb-item-disabled-color)}.breadcrumb-item.disabled:before{color:inherit}.breadcrumb-item.disabled a{color:inherit;pointer-events:none}.breadcrumb-dots{--tblr-breadcrumb-divider:"·"}.breadcrumb-arrows{--tblr-breadcrumb-divider:"›"}.breadcrumb-bullets{--tblr-breadcrumb-divider:"•"}.btn{--tblr-btn-icon-size:1.25rem;--tblr-btn-bg:var(--tblr-bg-surface);--tblr-btn-color:var(--tblr-body-color);--tblr-btn-border-color:var(--tblr-border-color);--tblr-btn-hover-bg:var(--tblr-btn-bg);--tblr-btn-hover-border-color:var(--tblr-border-color-active);--tblr-btn-box-shadow:var(--tblr-shadow-button);--tblr-btn-active-color:var(--tblr-primary);--tblr-btn-active-bg:rgba(var(--tblr-primary-rgb), 0.04);--tblr-btn-active-border-color:var(--tblr-primary);display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;box-shadow:var(--tblr-btn-box-shadow)}.btn .icon{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);min-width:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x)/ 2) 0 calc(var(--tblr-btn-padding-x)/ -4);vertical-align:bottom;color:inherit}.btn .avatar{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x)/ 2) 0 calc(var(--tblr-btn-padding-x)/ -4)}.btn .icon-right{margin:0 calc(var(--tblr-btn-padding-x)/ -4) 0 calc(var(--tblr-btn-padding-x)/ 2)}.btn .badge{top:auto}.btn-check+.btn:hover{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-link{color:var(--tblr-primary);background-color:transparent;border-color:transparent;box-shadow:none}.btn-link .icon{color:inherit}.btn-link:hover{color:var(--tblr-primary-darken);border-color:transparent}.btn-primary{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-primary-fg);--tblr-btn-bg:var(--tblr-primary);--tblr-btn-hover-color:var(--tblr-primary-fg);--tblr-btn-hover-bg:rgba(var(--tblr-primary-rgb), .8);--tblr-btn-active-color:var(--tblr-primary-fg);--tblr-btn-active-bg:rgba(var(--tblr-primary-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-primary);--tblr-btn-disabled-color:var(--tblr-primary-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-primary{--tblr-btn-color:var(--tblr-primary);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-primary);--tblr-btn-hover-color:var(--tblr-primary-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-primary);--tblr-btn-active-color:var(--tblr-primary-fg);--tblr-btn-active-bg:var(--tblr-primary);--tblr-btn-disabled-color:var(--tblr-primary);--tblr-btn-disabled-border-color:var(--tblr-primary)}.btn-secondary{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-secondary-fg);--tblr-btn-bg:var(--tblr-secondary);--tblr-btn-hover-color:var(--tblr-secondary-fg);--tblr-btn-hover-bg:rgba(var(--tblr-secondary-rgb), .8);--tblr-btn-active-color:var(--tblr-secondary-fg);--tblr-btn-active-bg:rgba(var(--tblr-secondary-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-secondary);--tblr-btn-disabled-color:var(--tblr-secondary-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-secondary{--tblr-btn-color:var(--tblr-secondary);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-secondary);--tblr-btn-hover-color:var(--tblr-secondary-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-secondary);--tblr-btn-active-color:var(--tblr-secondary-fg);--tblr-btn-active-bg:var(--tblr-secondary);--tblr-btn-disabled-color:var(--tblr-secondary);--tblr-btn-disabled-border-color:var(--tblr-secondary)}.btn-success{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-success-fg);--tblr-btn-bg:var(--tblr-success);--tblr-btn-hover-color:var(--tblr-success-fg);--tblr-btn-hover-bg:rgba(var(--tblr-success-rgb), .8);--tblr-btn-active-color:var(--tblr-success-fg);--tblr-btn-active-bg:rgba(var(--tblr-success-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-success);--tblr-btn-disabled-color:var(--tblr-success-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-success{--tblr-btn-color:var(--tblr-success);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-success);--tblr-btn-hover-color:var(--tblr-success-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-success);--tblr-btn-active-color:var(--tblr-success-fg);--tblr-btn-active-bg:var(--tblr-success);--tblr-btn-disabled-color:var(--tblr-success);--tblr-btn-disabled-border-color:var(--tblr-success)}.btn-info{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-info-fg);--tblr-btn-bg:var(--tblr-info);--tblr-btn-hover-color:var(--tblr-info-fg);--tblr-btn-hover-bg:rgba(var(--tblr-info-rgb), .8);--tblr-btn-active-color:var(--tblr-info-fg);--tblr-btn-active-bg:rgba(var(--tblr-info-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-info);--tblr-btn-disabled-color:var(--tblr-info-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-info{--tblr-btn-color:var(--tblr-info);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-info);--tblr-btn-hover-color:var(--tblr-info-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-info);--tblr-btn-active-color:var(--tblr-info-fg);--tblr-btn-active-bg:var(--tblr-info);--tblr-btn-disabled-color:var(--tblr-info);--tblr-btn-disabled-border-color:var(--tblr-info)}.btn-warning{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-warning-fg);--tblr-btn-bg:var(--tblr-warning);--tblr-btn-hover-color:var(--tblr-warning-fg);--tblr-btn-hover-bg:rgba(var(--tblr-warning-rgb), .8);--tblr-btn-active-color:var(--tblr-warning-fg);--tblr-btn-active-bg:rgba(var(--tblr-warning-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-warning);--tblr-btn-disabled-color:var(--tblr-warning-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-warning{--tblr-btn-color:var(--tblr-warning);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-warning);--tblr-btn-hover-color:var(--tblr-warning-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-warning);--tblr-btn-active-color:var(--tblr-warning-fg);--tblr-btn-active-bg:var(--tblr-warning);--tblr-btn-disabled-color:var(--tblr-warning);--tblr-btn-disabled-border-color:var(--tblr-warning)}.btn-danger{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-danger-fg);--tblr-btn-bg:var(--tblr-danger);--tblr-btn-hover-color:var(--tblr-danger-fg);--tblr-btn-hover-bg:rgba(var(--tblr-danger-rgb), .8);--tblr-btn-active-color:var(--tblr-danger-fg);--tblr-btn-active-bg:rgba(var(--tblr-danger-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-danger);--tblr-btn-disabled-color:var(--tblr-danger-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-danger{--tblr-btn-color:var(--tblr-danger);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-danger);--tblr-btn-hover-color:var(--tblr-danger-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-danger);--tblr-btn-active-color:var(--tblr-danger-fg);--tblr-btn-active-bg:var(--tblr-danger);--tblr-btn-disabled-color:var(--tblr-danger);--tblr-btn-disabled-border-color:var(--tblr-danger)}.btn-light{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-light-fg);--tblr-btn-bg:var(--tblr-light);--tblr-btn-hover-color:var(--tblr-light-fg);--tblr-btn-hover-bg:rgba(var(--tblr-light-rgb), .8);--tblr-btn-active-color:var(--tblr-light-fg);--tblr-btn-active-bg:rgba(var(--tblr-light-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-light);--tblr-btn-disabled-color:var(--tblr-light-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-light{--tblr-btn-color:var(--tblr-light);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-light);--tblr-btn-hover-color:var(--tblr-light-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-light);--tblr-btn-active-color:var(--tblr-light-fg);--tblr-btn-active-bg:var(--tblr-light);--tblr-btn-disabled-color:var(--tblr-light);--tblr-btn-disabled-border-color:var(--tblr-light)}.btn-dark{--tblr-btn-border-color:var(--tblr-dark-mode-border-color);--tblr-btn-hover-border-color:var(--tblr-dark-mode-border-color-active);--tblr-btn-active-border-color:var(--tblr-dark-mode-border-color-active);--tblr-btn-color:var(--tblr-dark-fg);--tblr-btn-bg:var(--tblr-dark);--tblr-btn-hover-color:var(--tblr-dark-fg);--tblr-btn-hover-bg:rgba(var(--tblr-dark-rgb), .8);--tblr-btn-active-color:var(--tblr-dark-fg);--tblr-btn-active-bg:rgba(var(--tblr-dark-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-dark);--tblr-btn-disabled-color:var(--tblr-dark-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-dark{--tblr-btn-color:var(--tblr-dark);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-dark);--tblr-btn-hover-color:var(--tblr-dark-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-dark);--tblr-btn-active-color:var(--tblr-dark-fg);--tblr-btn-active-bg:var(--tblr-dark);--tblr-btn-disabled-color:var(--tblr-dark);--tblr-btn-disabled-border-color:var(--tblr-dark)}.btn-muted{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-muted-fg);--tblr-btn-bg:var(--tblr-muted);--tblr-btn-hover-color:var(--tblr-muted-fg);--tblr-btn-hover-bg:rgba(var(--tblr-muted-rgb), .8);--tblr-btn-active-color:var(--tblr-muted-fg);--tblr-btn-active-bg:rgba(var(--tblr-muted-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-muted);--tblr-btn-disabled-color:var(--tblr-muted-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-muted{--tblr-btn-color:var(--tblr-muted);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-muted);--tblr-btn-hover-color:var(--tblr-muted-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-muted);--tblr-btn-active-color:var(--tblr-muted-fg);--tblr-btn-active-bg:var(--tblr-muted);--tblr-btn-disabled-color:var(--tblr-muted);--tblr-btn-disabled-border-color:var(--tblr-muted)}.btn-blue{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-blue-fg);--tblr-btn-bg:var(--tblr-blue);--tblr-btn-hover-color:var(--tblr-blue-fg);--tblr-btn-hover-bg:rgba(var(--tblr-blue-rgb), .8);--tblr-btn-active-color:var(--tblr-blue-fg);--tblr-btn-active-bg:rgba(var(--tblr-blue-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-blue);--tblr-btn-disabled-color:var(--tblr-blue-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-blue{--tblr-btn-color:var(--tblr-blue);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-blue);--tblr-btn-hover-color:var(--tblr-blue-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-blue);--tblr-btn-active-color:var(--tblr-blue-fg);--tblr-btn-active-bg:var(--tblr-blue);--tblr-btn-disabled-color:var(--tblr-blue);--tblr-btn-disabled-border-color:var(--tblr-blue)}.btn-azure{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-azure-fg);--tblr-btn-bg:var(--tblr-azure);--tblr-btn-hover-color:var(--tblr-azure-fg);--tblr-btn-hover-bg:rgba(var(--tblr-azure-rgb), .8);--tblr-btn-active-color:var(--tblr-azure-fg);--tblr-btn-active-bg:rgba(var(--tblr-azure-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-azure);--tblr-btn-disabled-color:var(--tblr-azure-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-azure{--tblr-btn-color:var(--tblr-azure);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-azure);--tblr-btn-hover-color:var(--tblr-azure-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-azure);--tblr-btn-active-color:var(--tblr-azure-fg);--tblr-btn-active-bg:var(--tblr-azure);--tblr-btn-disabled-color:var(--tblr-azure);--tblr-btn-disabled-border-color:var(--tblr-azure)}.btn-indigo{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-indigo-fg);--tblr-btn-bg:var(--tblr-indigo);--tblr-btn-hover-color:var(--tblr-indigo-fg);--tblr-btn-hover-bg:rgba(var(--tblr-indigo-rgb), .8);--tblr-btn-active-color:var(--tblr-indigo-fg);--tblr-btn-active-bg:rgba(var(--tblr-indigo-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-indigo);--tblr-btn-disabled-color:var(--tblr-indigo-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-indigo{--tblr-btn-color:var(--tblr-indigo);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-indigo);--tblr-btn-hover-color:var(--tblr-indigo-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-indigo);--tblr-btn-active-color:var(--tblr-indigo-fg);--tblr-btn-active-bg:var(--tblr-indigo);--tblr-btn-disabled-color:var(--tblr-indigo);--tblr-btn-disabled-border-color:var(--tblr-indigo)}.btn-purple{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-purple-fg);--tblr-btn-bg:var(--tblr-purple);--tblr-btn-hover-color:var(--tblr-purple-fg);--tblr-btn-hover-bg:rgba(var(--tblr-purple-rgb), .8);--tblr-btn-active-color:var(--tblr-purple-fg);--tblr-btn-active-bg:rgba(var(--tblr-purple-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-purple);--tblr-btn-disabled-color:var(--tblr-purple-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-purple{--tblr-btn-color:var(--tblr-purple);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-purple);--tblr-btn-hover-color:var(--tblr-purple-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-purple);--tblr-btn-active-color:var(--tblr-purple-fg);--tblr-btn-active-bg:var(--tblr-purple);--tblr-btn-disabled-color:var(--tblr-purple);--tblr-btn-disabled-border-color:var(--tblr-purple)}.btn-pink{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-pink-fg);--tblr-btn-bg:var(--tblr-pink);--tblr-btn-hover-color:var(--tblr-pink-fg);--tblr-btn-hover-bg:rgba(var(--tblr-pink-rgb), .8);--tblr-btn-active-color:var(--tblr-pink-fg);--tblr-btn-active-bg:rgba(var(--tblr-pink-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-pink);--tblr-btn-disabled-color:var(--tblr-pink-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-pink{--tblr-btn-color:var(--tblr-pink);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-pink);--tblr-btn-hover-color:var(--tblr-pink-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-pink);--tblr-btn-active-color:var(--tblr-pink-fg);--tblr-btn-active-bg:var(--tblr-pink);--tblr-btn-disabled-color:var(--tblr-pink);--tblr-btn-disabled-border-color:var(--tblr-pink)}.btn-red{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-red-fg);--tblr-btn-bg:var(--tblr-red);--tblr-btn-hover-color:var(--tblr-red-fg);--tblr-btn-hover-bg:rgba(var(--tblr-red-rgb), .8);--tblr-btn-active-color:var(--tblr-red-fg);--tblr-btn-active-bg:rgba(var(--tblr-red-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-red);--tblr-btn-disabled-color:var(--tblr-red-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-red{--tblr-btn-color:var(--tblr-red);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-red);--tblr-btn-hover-color:var(--tblr-red-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-red);--tblr-btn-active-color:var(--tblr-red-fg);--tblr-btn-active-bg:var(--tblr-red);--tblr-btn-disabled-color:var(--tblr-red);--tblr-btn-disabled-border-color:var(--tblr-red)}.btn-orange{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-orange-fg);--tblr-btn-bg:var(--tblr-orange);--tblr-btn-hover-color:var(--tblr-orange-fg);--tblr-btn-hover-bg:rgba(var(--tblr-orange-rgb), .8);--tblr-btn-active-color:var(--tblr-orange-fg);--tblr-btn-active-bg:rgba(var(--tblr-orange-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-orange);--tblr-btn-disabled-color:var(--tblr-orange-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-orange{--tblr-btn-color:var(--tblr-orange);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-orange);--tblr-btn-hover-color:var(--tblr-orange-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-orange);--tblr-btn-active-color:var(--tblr-orange-fg);--tblr-btn-active-bg:var(--tblr-orange);--tblr-btn-disabled-color:var(--tblr-orange);--tblr-btn-disabled-border-color:var(--tblr-orange)}.btn-yellow{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-yellow-fg);--tblr-btn-bg:var(--tblr-yellow);--tblr-btn-hover-color:var(--tblr-yellow-fg);--tblr-btn-hover-bg:rgba(var(--tblr-yellow-rgb), .8);--tblr-btn-active-color:var(--tblr-yellow-fg);--tblr-btn-active-bg:rgba(var(--tblr-yellow-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-yellow);--tblr-btn-disabled-color:var(--tblr-yellow-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-yellow{--tblr-btn-color:var(--tblr-yellow);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-yellow);--tblr-btn-hover-color:var(--tblr-yellow-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-yellow);--tblr-btn-active-color:var(--tblr-yellow-fg);--tblr-btn-active-bg:var(--tblr-yellow);--tblr-btn-disabled-color:var(--tblr-yellow);--tblr-btn-disabled-border-color:var(--tblr-yellow)}.btn-lime{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-lime-fg);--tblr-btn-bg:var(--tblr-lime);--tblr-btn-hover-color:var(--tblr-lime-fg);--tblr-btn-hover-bg:rgba(var(--tblr-lime-rgb), .8);--tblr-btn-active-color:var(--tblr-lime-fg);--tblr-btn-active-bg:rgba(var(--tblr-lime-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-lime);--tblr-btn-disabled-color:var(--tblr-lime-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-lime{--tblr-btn-color:var(--tblr-lime);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-lime);--tblr-btn-hover-color:var(--tblr-lime-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-lime);--tblr-btn-active-color:var(--tblr-lime-fg);--tblr-btn-active-bg:var(--tblr-lime);--tblr-btn-disabled-color:var(--tblr-lime);--tblr-btn-disabled-border-color:var(--tblr-lime)}.btn-green{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-green-fg);--tblr-btn-bg:var(--tblr-green);--tblr-btn-hover-color:var(--tblr-green-fg);--tblr-btn-hover-bg:rgba(var(--tblr-green-rgb), .8);--tblr-btn-active-color:var(--tblr-green-fg);--tblr-btn-active-bg:rgba(var(--tblr-green-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-green);--tblr-btn-disabled-color:var(--tblr-green-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-green{--tblr-btn-color:var(--tblr-green);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-green);--tblr-btn-hover-color:var(--tblr-green-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-green);--tblr-btn-active-color:var(--tblr-green-fg);--tblr-btn-active-bg:var(--tblr-green);--tblr-btn-disabled-color:var(--tblr-green);--tblr-btn-disabled-border-color:var(--tblr-green)}.btn-teal{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-teal-fg);--tblr-btn-bg:var(--tblr-teal);--tblr-btn-hover-color:var(--tblr-teal-fg);--tblr-btn-hover-bg:rgba(var(--tblr-teal-rgb), .8);--tblr-btn-active-color:var(--tblr-teal-fg);--tblr-btn-active-bg:rgba(var(--tblr-teal-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-teal);--tblr-btn-disabled-color:var(--tblr-teal-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-teal{--tblr-btn-color:var(--tblr-teal);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-teal);--tblr-btn-hover-color:var(--tblr-teal-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-teal);--tblr-btn-active-color:var(--tblr-teal-fg);--tblr-btn-active-bg:var(--tblr-teal);--tblr-btn-disabled-color:var(--tblr-teal);--tblr-btn-disabled-border-color:var(--tblr-teal)}.btn-cyan{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-cyan-fg);--tblr-btn-bg:var(--tblr-cyan);--tblr-btn-hover-color:var(--tblr-cyan-fg);--tblr-btn-hover-bg:rgba(var(--tblr-cyan-rgb), .8);--tblr-btn-active-color:var(--tblr-cyan-fg);--tblr-btn-active-bg:rgba(var(--tblr-cyan-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-cyan);--tblr-btn-disabled-color:var(--tblr-cyan-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-cyan{--tblr-btn-color:var(--tblr-cyan);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-cyan);--tblr-btn-hover-color:var(--tblr-cyan-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-cyan);--tblr-btn-active-color:var(--tblr-cyan-fg);--tblr-btn-active-bg:var(--tblr-cyan);--tblr-btn-disabled-color:var(--tblr-cyan);--tblr-btn-disabled-border-color:var(--tblr-cyan)}.btn-facebook{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-facebook-fg);--tblr-btn-bg:var(--tblr-facebook);--tblr-btn-hover-color:var(--tblr-facebook-fg);--tblr-btn-hover-bg:rgba(var(--tblr-facebook-rgb), .8);--tblr-btn-active-color:var(--tblr-facebook-fg);--tblr-btn-active-bg:rgba(var(--tblr-facebook-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-facebook);--tblr-btn-disabled-color:var(--tblr-facebook-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-facebook{--tblr-btn-color:var(--tblr-facebook);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-facebook);--tblr-btn-hover-color:var(--tblr-facebook-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-facebook);--tblr-btn-active-color:var(--tblr-facebook-fg);--tblr-btn-active-bg:var(--tblr-facebook);--tblr-btn-disabled-color:var(--tblr-facebook);--tblr-btn-disabled-border-color:var(--tblr-facebook)}.btn-twitter{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-twitter-fg);--tblr-btn-bg:var(--tblr-twitter);--tblr-btn-hover-color:var(--tblr-twitter-fg);--tblr-btn-hover-bg:rgba(var(--tblr-twitter-rgb), .8);--tblr-btn-active-color:var(--tblr-twitter-fg);--tblr-btn-active-bg:rgba(var(--tblr-twitter-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-twitter);--tblr-btn-disabled-color:var(--tblr-twitter-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-twitter{--tblr-btn-color:var(--tblr-twitter);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-twitter);--tblr-btn-hover-color:var(--tblr-twitter-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-twitter);--tblr-btn-active-color:var(--tblr-twitter-fg);--tblr-btn-active-bg:var(--tblr-twitter);--tblr-btn-disabled-color:var(--tblr-twitter);--tblr-btn-disabled-border-color:var(--tblr-twitter)}.btn-linkedin{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-linkedin-fg);--tblr-btn-bg:var(--tblr-linkedin);--tblr-btn-hover-color:var(--tblr-linkedin-fg);--tblr-btn-hover-bg:rgba(var(--tblr-linkedin-rgb), .8);--tblr-btn-active-color:var(--tblr-linkedin-fg);--tblr-btn-active-bg:rgba(var(--tblr-linkedin-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-linkedin);--tblr-btn-disabled-color:var(--tblr-linkedin-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-linkedin{--tblr-btn-color:var(--tblr-linkedin);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-linkedin);--tblr-btn-hover-color:var(--tblr-linkedin-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-linkedin);--tblr-btn-active-color:var(--tblr-linkedin-fg);--tblr-btn-active-bg:var(--tblr-linkedin);--tblr-btn-disabled-color:var(--tblr-linkedin);--tblr-btn-disabled-border-color:var(--tblr-linkedin)}.btn-google{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-google-fg);--tblr-btn-bg:var(--tblr-google);--tblr-btn-hover-color:var(--tblr-google-fg);--tblr-btn-hover-bg:rgba(var(--tblr-google-rgb), .8);--tblr-btn-active-color:var(--tblr-google-fg);--tblr-btn-active-bg:rgba(var(--tblr-google-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-google);--tblr-btn-disabled-color:var(--tblr-google-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-google{--tblr-btn-color:var(--tblr-google);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-google);--tblr-btn-hover-color:var(--tblr-google-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-google);--tblr-btn-active-color:var(--tblr-google-fg);--tblr-btn-active-bg:var(--tblr-google);--tblr-btn-disabled-color:var(--tblr-google);--tblr-btn-disabled-border-color:var(--tblr-google)}.btn-youtube{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-youtube-fg);--tblr-btn-bg:var(--tblr-youtube);--tblr-btn-hover-color:var(--tblr-youtube-fg);--tblr-btn-hover-bg:rgba(var(--tblr-youtube-rgb), .8);--tblr-btn-active-color:var(--tblr-youtube-fg);--tblr-btn-active-bg:rgba(var(--tblr-youtube-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-youtube);--tblr-btn-disabled-color:var(--tblr-youtube-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-youtube{--tblr-btn-color:var(--tblr-youtube);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-youtube);--tblr-btn-hover-color:var(--tblr-youtube-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-youtube);--tblr-btn-active-color:var(--tblr-youtube-fg);--tblr-btn-active-bg:var(--tblr-youtube);--tblr-btn-disabled-color:var(--tblr-youtube);--tblr-btn-disabled-border-color:var(--tblr-youtube)}.btn-vimeo{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-vimeo-fg);--tblr-btn-bg:var(--tblr-vimeo);--tblr-btn-hover-color:var(--tblr-vimeo-fg);--tblr-btn-hover-bg:rgba(var(--tblr-vimeo-rgb), .8);--tblr-btn-active-color:var(--tblr-vimeo-fg);--tblr-btn-active-bg:rgba(var(--tblr-vimeo-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-vimeo);--tblr-btn-disabled-color:var(--tblr-vimeo-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-vimeo{--tblr-btn-color:var(--tblr-vimeo);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-vimeo);--tblr-btn-hover-color:var(--tblr-vimeo-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-vimeo);--tblr-btn-active-color:var(--tblr-vimeo-fg);--tblr-btn-active-bg:var(--tblr-vimeo);--tblr-btn-disabled-color:var(--tblr-vimeo);--tblr-btn-disabled-border-color:var(--tblr-vimeo)}.btn-dribbble{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-dribbble-fg);--tblr-btn-bg:var(--tblr-dribbble);--tblr-btn-hover-color:var(--tblr-dribbble-fg);--tblr-btn-hover-bg:rgba(var(--tblr-dribbble-rgb), .8);--tblr-btn-active-color:var(--tblr-dribbble-fg);--tblr-btn-active-bg:rgba(var(--tblr-dribbble-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-dribbble);--tblr-btn-disabled-color:var(--tblr-dribbble-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-dribbble{--tblr-btn-color:var(--tblr-dribbble);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-dribbble);--tblr-btn-hover-color:var(--tblr-dribbble-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-dribbble);--tblr-btn-active-color:var(--tblr-dribbble-fg);--tblr-btn-active-bg:var(--tblr-dribbble);--tblr-btn-disabled-color:var(--tblr-dribbble);--tblr-btn-disabled-border-color:var(--tblr-dribbble)}.btn-github{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-github-fg);--tblr-btn-bg:var(--tblr-github);--tblr-btn-hover-color:var(--tblr-github-fg);--tblr-btn-hover-bg:rgba(var(--tblr-github-rgb), .8);--tblr-btn-active-color:var(--tblr-github-fg);--tblr-btn-active-bg:rgba(var(--tblr-github-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-github);--tblr-btn-disabled-color:var(--tblr-github-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-github{--tblr-btn-color:var(--tblr-github);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-github);--tblr-btn-hover-color:var(--tblr-github-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-github);--tblr-btn-active-color:var(--tblr-github-fg);--tblr-btn-active-bg:var(--tblr-github);--tblr-btn-disabled-color:var(--tblr-github);--tblr-btn-disabled-border-color:var(--tblr-github)}.btn-instagram{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-instagram-fg);--tblr-btn-bg:var(--tblr-instagram);--tblr-btn-hover-color:var(--tblr-instagram-fg);--tblr-btn-hover-bg:rgba(var(--tblr-instagram-rgb), .8);--tblr-btn-active-color:var(--tblr-instagram-fg);--tblr-btn-active-bg:rgba(var(--tblr-instagram-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-instagram);--tblr-btn-disabled-color:var(--tblr-instagram-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-instagram{--tblr-btn-color:var(--tblr-instagram);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-instagram);--tblr-btn-hover-color:var(--tblr-instagram-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-instagram);--tblr-btn-active-color:var(--tblr-instagram-fg);--tblr-btn-active-bg:var(--tblr-instagram);--tblr-btn-disabled-color:var(--tblr-instagram);--tblr-btn-disabled-border-color:var(--tblr-instagram)}.btn-pinterest{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-pinterest-fg);--tblr-btn-bg:var(--tblr-pinterest);--tblr-btn-hover-color:var(--tblr-pinterest-fg);--tblr-btn-hover-bg:rgba(var(--tblr-pinterest-rgb), .8);--tblr-btn-active-color:var(--tblr-pinterest-fg);--tblr-btn-active-bg:rgba(var(--tblr-pinterest-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-pinterest);--tblr-btn-disabled-color:var(--tblr-pinterest-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-pinterest{--tblr-btn-color:var(--tblr-pinterest);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-pinterest);--tblr-btn-hover-color:var(--tblr-pinterest-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-pinterest);--tblr-btn-active-color:var(--tblr-pinterest-fg);--tblr-btn-active-bg:var(--tblr-pinterest);--tblr-btn-disabled-color:var(--tblr-pinterest);--tblr-btn-disabled-border-color:var(--tblr-pinterest)}.btn-vk{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-vk-fg);--tblr-btn-bg:var(--tblr-vk);--tblr-btn-hover-color:var(--tblr-vk-fg);--tblr-btn-hover-bg:rgba(var(--tblr-vk-rgb), .8);--tblr-btn-active-color:var(--tblr-vk-fg);--tblr-btn-active-bg:rgba(var(--tblr-vk-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-vk);--tblr-btn-disabled-color:var(--tblr-vk-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-vk{--tblr-btn-color:var(--tblr-vk);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-vk);--tblr-btn-hover-color:var(--tblr-vk-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-vk);--tblr-btn-active-color:var(--tblr-vk-fg);--tblr-btn-active-bg:var(--tblr-vk);--tblr-btn-disabled-color:var(--tblr-vk);--tblr-btn-disabled-border-color:var(--tblr-vk)}.btn-rss{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-rss-fg);--tblr-btn-bg:var(--tblr-rss);--tblr-btn-hover-color:var(--tblr-rss-fg);--tblr-btn-hover-bg:rgba(var(--tblr-rss-rgb), .8);--tblr-btn-active-color:var(--tblr-rss-fg);--tblr-btn-active-bg:rgba(var(--tblr-rss-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-rss);--tblr-btn-disabled-color:var(--tblr-rss-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-rss{--tblr-btn-color:var(--tblr-rss);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-rss);--tblr-btn-hover-color:var(--tblr-rss-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-rss);--tblr-btn-active-color:var(--tblr-rss-fg);--tblr-btn-active-bg:var(--tblr-rss);--tblr-btn-disabled-color:var(--tblr-rss);--tblr-btn-disabled-border-color:var(--tblr-rss)}.btn-flickr{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-flickr-fg);--tblr-btn-bg:var(--tblr-flickr);--tblr-btn-hover-color:var(--tblr-flickr-fg);--tblr-btn-hover-bg:rgba(var(--tblr-flickr-rgb), .8);--tblr-btn-active-color:var(--tblr-flickr-fg);--tblr-btn-active-bg:rgba(var(--tblr-flickr-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-flickr);--tblr-btn-disabled-color:var(--tblr-flickr-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-flickr{--tblr-btn-color:var(--tblr-flickr);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-flickr);--tblr-btn-hover-color:var(--tblr-flickr-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-flickr);--tblr-btn-active-color:var(--tblr-flickr-fg);--tblr-btn-active-bg:var(--tblr-flickr);--tblr-btn-disabled-color:var(--tblr-flickr);--tblr-btn-disabled-border-color:var(--tblr-flickr)}.btn-bitbucket{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-bitbucket-fg);--tblr-btn-bg:var(--tblr-bitbucket);--tblr-btn-hover-color:var(--tblr-bitbucket-fg);--tblr-btn-hover-bg:rgba(var(--tblr-bitbucket-rgb), .8);--tblr-btn-active-color:var(--tblr-bitbucket-fg);--tblr-btn-active-bg:rgba(var(--tblr-bitbucket-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-bitbucket);--tblr-btn-disabled-color:var(--tblr-bitbucket-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-bitbucket{--tblr-btn-color:var(--tblr-bitbucket);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-bitbucket);--tblr-btn-hover-color:var(--tblr-bitbucket-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-bitbucket);--tblr-btn-active-color:var(--tblr-bitbucket-fg);--tblr-btn-active-bg:var(--tblr-bitbucket);--tblr-btn-disabled-color:var(--tblr-bitbucket);--tblr-btn-disabled-border-color:var(--tblr-bitbucket)}.btn-tabler{--tblr-btn-border-color:transparent;--tblr-btn-hover-border-color:transparent;--tblr-btn-active-border-color:transparent;--tblr-btn-color:var(--tblr-tabler-fg);--tblr-btn-bg:var(--tblr-tabler);--tblr-btn-hover-color:var(--tblr-tabler-fg);--tblr-btn-hover-bg:rgba(var(--tblr-tabler-rgb), .8);--tblr-btn-active-color:var(--tblr-tabler-fg);--tblr-btn-active-bg:rgba(var(--tblr-tabler-rgb), .8);--tblr-btn-disabled-bg:var(--tblr-tabler);--tblr-btn-disabled-color:var(--tblr-tabler-fg);--tblr-btn-box-shadow:var(--tblr-shadow-button),var(--tblr-shadow-button-inset)}.btn-outline-tabler{--tblr-btn-color:var(--tblr-tabler);--tblr-btn-bg:transparent;--tblr-btn-border-color:var(--tblr-tabler);--tblr-btn-hover-color:var(--tblr-tabler-fg);--tblr-btn-hover-border-color:transparent;--tblr-btn-hover-bg:var(--tblr-tabler);--tblr-btn-active-color:var(--tblr-tabler-fg);--tblr-btn-active-bg:var(--tblr-tabler);--tblr-btn-disabled-color:var(--tblr-tabler);--tblr-btn-disabled-border-color:var(--tblr-tabler)}.btn-ghost-primary{--tblr-btn-color:var(--tblr-primary);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-primary-fg);--tblr-btn-hover-bg:var(--tblr-primary);--tblr-btn-hover-border-color:var(--tblr-primary);--tblr-btn-active-color:var(--tblr-primary-fg);--tblr-btn-active-bg:var(--tblr-primary);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-primary);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-secondary{--tblr-btn-color:var(--tblr-secondary);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-secondary-fg);--tblr-btn-hover-bg:var(--tblr-secondary);--tblr-btn-hover-border-color:var(--tblr-secondary);--tblr-btn-active-color:var(--tblr-secondary-fg);--tblr-btn-active-bg:var(--tblr-secondary);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-secondary);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-success{--tblr-btn-color:var(--tblr-success);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-success-fg);--tblr-btn-hover-bg:var(--tblr-success);--tblr-btn-hover-border-color:var(--tblr-success);--tblr-btn-active-color:var(--tblr-success-fg);--tblr-btn-active-bg:var(--tblr-success);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-success);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-info{--tblr-btn-color:var(--tblr-info);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-info-fg);--tblr-btn-hover-bg:var(--tblr-info);--tblr-btn-hover-border-color:var(--tblr-info);--tblr-btn-active-color:var(--tblr-info-fg);--tblr-btn-active-bg:var(--tblr-info);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-info);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-warning{--tblr-btn-color:var(--tblr-warning);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-warning-fg);--tblr-btn-hover-bg:var(--tblr-warning);--tblr-btn-hover-border-color:var(--tblr-warning);--tblr-btn-active-color:var(--tblr-warning-fg);--tblr-btn-active-bg:var(--tblr-warning);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-warning);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-danger{--tblr-btn-color:var(--tblr-danger);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-danger-fg);--tblr-btn-hover-bg:var(--tblr-danger);--tblr-btn-hover-border-color:var(--tblr-danger);--tblr-btn-active-color:var(--tblr-danger-fg);--tblr-btn-active-bg:var(--tblr-danger);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-danger);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-light{--tblr-btn-color:var(--tblr-light);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-light-fg);--tblr-btn-hover-bg:var(--tblr-light);--tblr-btn-hover-border-color:var(--tblr-light);--tblr-btn-active-color:var(--tblr-light-fg);--tblr-btn-active-bg:var(--tblr-light);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-light);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-dark{--tblr-btn-color:var(--tblr-dark);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-dark-fg);--tblr-btn-hover-bg:var(--tblr-dark);--tblr-btn-hover-border-color:var(--tblr-dark);--tblr-btn-active-color:var(--tblr-dark-fg);--tblr-btn-active-bg:var(--tblr-dark);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-dark);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-muted{--tblr-btn-color:var(--tblr-muted);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-muted-fg);--tblr-btn-hover-bg:var(--tblr-muted);--tblr-btn-hover-border-color:var(--tblr-muted);--tblr-btn-active-color:var(--tblr-muted-fg);--tblr-btn-active-bg:var(--tblr-muted);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-muted);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-blue{--tblr-btn-color:var(--tblr-blue);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-blue-fg);--tblr-btn-hover-bg:var(--tblr-blue);--tblr-btn-hover-border-color:var(--tblr-blue);--tblr-btn-active-color:var(--tblr-blue-fg);--tblr-btn-active-bg:var(--tblr-blue);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-blue);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-azure{--tblr-btn-color:var(--tblr-azure);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-azure-fg);--tblr-btn-hover-bg:var(--tblr-azure);--tblr-btn-hover-border-color:var(--tblr-azure);--tblr-btn-active-color:var(--tblr-azure-fg);--tblr-btn-active-bg:var(--tblr-azure);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-azure);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-indigo{--tblr-btn-color:var(--tblr-indigo);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-indigo-fg);--tblr-btn-hover-bg:var(--tblr-indigo);--tblr-btn-hover-border-color:var(--tblr-indigo);--tblr-btn-active-color:var(--tblr-indigo-fg);--tblr-btn-active-bg:var(--tblr-indigo);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-indigo);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-purple{--tblr-btn-color:var(--tblr-purple);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-purple-fg);--tblr-btn-hover-bg:var(--tblr-purple);--tblr-btn-hover-border-color:var(--tblr-purple);--tblr-btn-active-color:var(--tblr-purple-fg);--tblr-btn-active-bg:var(--tblr-purple);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-purple);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-pink{--tblr-btn-color:var(--tblr-pink);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-pink-fg);--tblr-btn-hover-bg:var(--tblr-pink);--tblr-btn-hover-border-color:var(--tblr-pink);--tblr-btn-active-color:var(--tblr-pink-fg);--tblr-btn-active-bg:var(--tblr-pink);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-pink);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-red{--tblr-btn-color:var(--tblr-red);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-red-fg);--tblr-btn-hover-bg:var(--tblr-red);--tblr-btn-hover-border-color:var(--tblr-red);--tblr-btn-active-color:var(--tblr-red-fg);--tblr-btn-active-bg:var(--tblr-red);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-red);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-orange{--tblr-btn-color:var(--tblr-orange);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-orange-fg);--tblr-btn-hover-bg:var(--tblr-orange);--tblr-btn-hover-border-color:var(--tblr-orange);--tblr-btn-active-color:var(--tblr-orange-fg);--tblr-btn-active-bg:var(--tblr-orange);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-orange);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-yellow{--tblr-btn-color:var(--tblr-yellow);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-yellow-fg);--tblr-btn-hover-bg:var(--tblr-yellow);--tblr-btn-hover-border-color:var(--tblr-yellow);--tblr-btn-active-color:var(--tblr-yellow-fg);--tblr-btn-active-bg:var(--tblr-yellow);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-yellow);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-lime{--tblr-btn-color:var(--tblr-lime);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-lime-fg);--tblr-btn-hover-bg:var(--tblr-lime);--tblr-btn-hover-border-color:var(--tblr-lime);--tblr-btn-active-color:var(--tblr-lime-fg);--tblr-btn-active-bg:var(--tblr-lime);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-lime);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-green{--tblr-btn-color:var(--tblr-green);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-green-fg);--tblr-btn-hover-bg:var(--tblr-green);--tblr-btn-hover-border-color:var(--tblr-green);--tblr-btn-active-color:var(--tblr-green-fg);--tblr-btn-active-bg:var(--tblr-green);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-green);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-teal{--tblr-btn-color:var(--tblr-teal);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-teal-fg);--tblr-btn-hover-bg:var(--tblr-teal);--tblr-btn-hover-border-color:var(--tblr-teal);--tblr-btn-active-color:var(--tblr-teal-fg);--tblr-btn-active-bg:var(--tblr-teal);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-teal);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-cyan{--tblr-btn-color:var(--tblr-cyan);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-cyan-fg);--tblr-btn-hover-bg:var(--tblr-cyan);--tblr-btn-hover-border-color:var(--tblr-cyan);--tblr-btn-active-color:var(--tblr-cyan-fg);--tblr-btn-active-bg:var(--tblr-cyan);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-cyan);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-facebook{--tblr-btn-color:var(--tblr-facebook);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-facebook-fg);--tblr-btn-hover-bg:var(--tblr-facebook);--tblr-btn-hover-border-color:var(--tblr-facebook);--tblr-btn-active-color:var(--tblr-facebook-fg);--tblr-btn-active-bg:var(--tblr-facebook);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-facebook);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-twitter{--tblr-btn-color:var(--tblr-twitter);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-twitter-fg);--tblr-btn-hover-bg:var(--tblr-twitter);--tblr-btn-hover-border-color:var(--tblr-twitter);--tblr-btn-active-color:var(--tblr-twitter-fg);--tblr-btn-active-bg:var(--tblr-twitter);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-twitter);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-linkedin{--tblr-btn-color:var(--tblr-linkedin);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-linkedin-fg);--tblr-btn-hover-bg:var(--tblr-linkedin);--tblr-btn-hover-border-color:var(--tblr-linkedin);--tblr-btn-active-color:var(--tblr-linkedin-fg);--tblr-btn-active-bg:var(--tblr-linkedin);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-linkedin);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-google{--tblr-btn-color:var(--tblr-google);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-google-fg);--tblr-btn-hover-bg:var(--tblr-google);--tblr-btn-hover-border-color:var(--tblr-google);--tblr-btn-active-color:var(--tblr-google-fg);--tblr-btn-active-bg:var(--tblr-google);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-google);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-youtube{--tblr-btn-color:var(--tblr-youtube);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-youtube-fg);--tblr-btn-hover-bg:var(--tblr-youtube);--tblr-btn-hover-border-color:var(--tblr-youtube);--tblr-btn-active-color:var(--tblr-youtube-fg);--tblr-btn-active-bg:var(--tblr-youtube);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-youtube);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-vimeo{--tblr-btn-color:var(--tblr-vimeo);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-vimeo-fg);--tblr-btn-hover-bg:var(--tblr-vimeo);--tblr-btn-hover-border-color:var(--tblr-vimeo);--tblr-btn-active-color:var(--tblr-vimeo-fg);--tblr-btn-active-bg:var(--tblr-vimeo);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-vimeo);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-dribbble{--tblr-btn-color:var(--tblr-dribbble);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-dribbble-fg);--tblr-btn-hover-bg:var(--tblr-dribbble);--tblr-btn-hover-border-color:var(--tblr-dribbble);--tblr-btn-active-color:var(--tblr-dribbble-fg);--tblr-btn-active-bg:var(--tblr-dribbble);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-dribbble);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-github{--tblr-btn-color:var(--tblr-github);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-github-fg);--tblr-btn-hover-bg:var(--tblr-github);--tblr-btn-hover-border-color:var(--tblr-github);--tblr-btn-active-color:var(--tblr-github-fg);--tblr-btn-active-bg:var(--tblr-github);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-github);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-instagram{--tblr-btn-color:var(--tblr-instagram);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-instagram-fg);--tblr-btn-hover-bg:var(--tblr-instagram);--tblr-btn-hover-border-color:var(--tblr-instagram);--tblr-btn-active-color:var(--tblr-instagram-fg);--tblr-btn-active-bg:var(--tblr-instagram);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-instagram);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-pinterest{--tblr-btn-color:var(--tblr-pinterest);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-pinterest-fg);--tblr-btn-hover-bg:var(--tblr-pinterest);--tblr-btn-hover-border-color:var(--tblr-pinterest);--tblr-btn-active-color:var(--tblr-pinterest-fg);--tblr-btn-active-bg:var(--tblr-pinterest);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-pinterest);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-vk{--tblr-btn-color:var(--tblr-vk);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-vk-fg);--tblr-btn-hover-bg:var(--tblr-vk);--tblr-btn-hover-border-color:var(--tblr-vk);--tblr-btn-active-color:var(--tblr-vk-fg);--tblr-btn-active-bg:var(--tblr-vk);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-vk);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-rss{--tblr-btn-color:var(--tblr-rss);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-rss-fg);--tblr-btn-hover-bg:var(--tblr-rss);--tblr-btn-hover-border-color:var(--tblr-rss);--tblr-btn-active-color:var(--tblr-rss-fg);--tblr-btn-active-bg:var(--tblr-rss);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-rss);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-flickr{--tblr-btn-color:var(--tblr-flickr);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-flickr-fg);--tblr-btn-hover-bg:var(--tblr-flickr);--tblr-btn-hover-border-color:var(--tblr-flickr);--tblr-btn-active-color:var(--tblr-flickr-fg);--tblr-btn-active-bg:var(--tblr-flickr);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-flickr);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-bitbucket{--tblr-btn-color:var(--tblr-bitbucket);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-bitbucket-fg);--tblr-btn-hover-bg:var(--tblr-bitbucket);--tblr-btn-hover-border-color:var(--tblr-bitbucket);--tblr-btn-active-color:var(--tblr-bitbucket-fg);--tblr-btn-active-bg:var(--tblr-bitbucket);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-bitbucket);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-ghost-tabler{--tblr-btn-color:var(--tblr-tabler);--tblr-btn-bg:transparent;--tblr-btn-border-color:transparent;--tblr-btn-hover-color:var(--tblr-tabler-fg);--tblr-btn-hover-bg:var(--tblr-tabler);--tblr-btn-hover-border-color:var(--tblr-tabler);--tblr-btn-active-color:var(--tblr-tabler-fg);--tblr-btn-active-bg:var(--tblr-tabler);--tblr-btn-active-border-color:transparent;--tblr-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--tblr-btn-disabled-color:var(--tblr-tabler);--tblr-btn-disabled-bg:transparent;--tblr-btn-disabled-border-color:transparent;--tblr-gradient:none;--tblr-btn-box-shadow:none}.btn-group-sm>.btn,.btn-sm{--tblr-btn-line-height:1.5;--tblr-btn-icon-size:.75rem}.btn-group-lg>.btn,.btn-lg{--tblr-btn-line-height:1.5;--tblr-btn-icon-size:2rem}.btn-pill{padding-right:1.5em;padding-left:1.5em;border-radius:10rem}.btn-pill[class*=btn-icon]{padding:.375rem 15px}.btn-square{border-radius:0}.btn-icon{min-width:calc(var(--tblr-btn-line-height) * var(--tblr-btn-font-size) + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);min-height:calc(var(--tblr-btn-line-height) * var(--tblr-btn-font-size) + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);padding-left:0;padding-right:0}.btn-icon .icon{margin:calc(-1 * var(--tblr-btn-padding-x))}.btn-list{--tblr-list-gap:0.5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.btn-floating{position:fixed;z-index:1030;bottom:1.5rem;right:1.5rem;border-radius:100rem}.btn-loading{position:relative;color:transparent!important;text-shadow:none!important;pointer-events:none}.btn-loading>*{opacity:0}.btn-loading:after{content:"";display:inline-block;vertical-align:text-bottom;border:2px var(--tblr-border-style) currentColor;border-right-color:transparent;border-radius:100rem;color:var(--tblr-btn-color);position:absolute;width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);left:calc(50% - var(--tblr-btn-icon-size)/ 2);top:calc(50% - var(--tblr-btn-icon-size)/ 2);animation:spinner-border .75s linear infinite}.btn-action{padding:0;border:0;color:var(--tblr-muted);display:inline-flex;width:2rem;height:2rem;align-items:center;justify-content:center;border-radius:var(--tblr-border-radius);background:0 0}.btn-action:after{content:none}.btn-action:focus{outline:0;box-shadow:none}.btn-action.show,.btn-action:hover{color:var(--tblr-body-color);background:var(--tblr-active-bg)}.btn-action.show{color:var(--tblr-primary)}.btn-action .icon{margin:0;width:1.25rem;height:1.25rem;font-size:1.25rem;stroke-width:1}.btn-actions{display:flex}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group>.btn-check:checked+.btn,.btn-group>.btn.active,.btn-group>.btn:active{z-index:5}.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.calendar{display:block;font-size:.765625rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.calendar-nav{display:flex;align-items:center}.calendar-title{flex:1;text-align:center}.calendar-body,.calendar-header{display:flex;flex-wrap:wrap;justify-content:flex-start;padding:.5rem 0}.calendar-header{color:var(--tblr-muted)}.calendar-date{flex:0 0 14.2857142857%;max-width:14.2857142857%;padding:.2rem;text-align:center;border:0}.calendar-date.next-month,.calendar-date.prev-month{opacity:.25}.calendar-date .date-item{position:relative;display:inline-block;width:1.4rem;height:1.4rem;line-height:1.4rem;color:#66758c;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;cursor:pointer;background:0 0;border:var(--tblr-border-width) var(--tblr-border-style) transparent;border-radius:100rem;outline:0;transition:background .3s,border .3s,box-shadow .32s,color .3s}@media (prefers-reduced-motion:reduce){.calendar-date .date-item{transition:none}}.calendar-date .date-item:hover{color:var(--tblr-primary);text-decoration:none;background:#fefeff;border-color:var(--tblr-border-color)}.calendar-date .date-today{color:var(--tblr-primary);border-color:var(--tblr-border-color)}.calendar-range{position:relative}.calendar-range:before{position:absolute;top:50%;right:0;left:0;height:1.4rem;content:"";background:rgba(var(--tblr-primary-rgb),.1);transform:translateY(-50%)}.calendar-range.range-end .date-item,.calendar-range.range-start .date-item{color:#fff;background:var(--tblr-primary);border-color:var(--tblr-primary)}.calendar-range.range-start:before{left:50%}.calendar-range.range-end:before{right:50%}.carousel-indicators-vertical{left:auto;top:0;margin:0 1rem 0 0;flex-direction:column}.carousel-indicators-vertical [data-bs-target]{margin:3px 0 3px;width:3px;height:30px;border:0;border-left:10px var(--tblr-border-style) transparent;border-right:10px var(--tblr-border-style) transparent}.carousel-indicators-dot [data-bs-target]{width:.5rem;height:.5rem;border-radius:100rem;border:10px var(--tblr-border-style) transparent;margin:0}.carousel-indicators-thumb [data-bs-target]{width:2rem;height:auto;background:no-repeat center/cover;border:0;border-radius:var(--tblr-border-radius);box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px 0;margin:0 3px;opacity:.75}@media (min-width:992px){.carousel-indicators-thumb [data-bs-target]{width:4rem}}.carousel-indicators-thumb [data-bs-target]:before{content:"";padding-top:var(--tblr-aspect-ratio,100%);display:block}.carousel-indicators-thumb.carousel-indicators-vertical [data-bs-target]{margin:3px 0}.carousel-caption-background{background:red;position:absolute;left:0;right:0;bottom:0;height:90%;background:linear-gradient(0deg,rgba(29,39,59,.9),rgba(29,39,59,0))}.card{transition:transform .3s ease-out,opacity .3s ease-out,box-shadow .3s ease-out}@media (prefers-reduced-motion:reduce){.card{transition:none}}@media print{.card{border:none;box-shadow:none}}a.card{color:inherit}a.card:hover{text-decoration:none;box-shadow:rgba(var(--tblr-body-color-rgb),.16) 0 2px 16px 0}.card .card{box-shadow:none}.card-borderless,.card-borderless .card-footer,.card-borderless .card-header{border-color:transparent}.card-stamp{--tblr-stamp-size:7rem;position:absolute;top:0;right:0;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);max-height:100%;border-top-right-radius:4px;opacity:.2;overflow:hidden;pointer-events:none}.card-stamp-lg{--tblr-stamp-size:13rem}.card-stamp-icon{background:var(--tblr-muted);color:var(--tblr-card-bg,var(--tblr-bg-surface));display:flex;align-items:center;justify-content:center;border-radius:100rem;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);position:relative;top:calc(var(--tblr-stamp-size) * -.25);right:calc(var(--tblr-stamp-size) * -.25);font-size:calc(var(--tblr-stamp-size) * .75);transform:rotate(10deg)}.card-stamp-icon .icon{stroke-width:2;width:calc(var(--tblr-stamp-size) * .75);height:calc(var(--tblr-stamp-size) * .75)}.card-img,.card-img-start{border-top-left-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)));border-bottom-left-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)))}.card-img,.card-img-end{border-top-right-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)));border-bottom-right-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)))}.card-img-overlay{display:flex;flex-direction:column;justify-content:flex-end}.card-img-overlay-dark{background-image:linear-gradient(180deg,rgba(0,0,0,0) 0,rgba(0,0,0,.6) 100%)}.card-inactive{pointer-events:none;box-shadow:none}.card-inactive .card-body{opacity:.64}.card-active{--tblr-card-border-color:var(--tblr-primary);--tblr-card-bg:var(--tblr-active-bg)}.card-btn{display:flex;align-items:center;justify-content:center;padding:1rem 1.5rem;text-align:center;transition:background .3s;border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);flex:1;color:inherit;font-weight:var(--tblr-font-weight-medium)}@media (prefers-reduced-motion:reduce){.card-btn{transition:none}}.card-btn:hover{text-decoration:none;background:rgba(var(--tblr-primary-rgb),.04)}.card-btn+.card-btn{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-stacked{--tblr-card-stacked-offset:.25rem;position:relative}.card-stacked:after{position:absolute;top:calc(-1 * var(--tblr-card-stacked-offset));right:var(--tblr-card-stacked-offset);left:var(--tblr-card-stacked-offset);height:var(--tblr-card-stacked-offset);content:"";background:var(--tblr-card-bg,var(--tblr-bg-surface));border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-cover{position:relative;padding:1rem 1.5rem;background:#666 no-repeat center/cover}.card-cover:before{position:absolute;top:0;right:0;bottom:0;left:0;content:"";background:rgba(29,39,59,.48)}.card-cover:first-child,.card-cover:first-child:before{border-radius:4px 4px 0 0}.card-cover-blurred:before{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.card-actions{margin:-.5rem -.5rem -.5rem auto;padding-left:.5rem}.card-actions a{text-decoration:none}.card-header{color:inherit;display:flex;align-items:center;background:0 0}.card-header:first-child{border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-header-light{border-bottom-color:transparent;background:var(--tblr-bg-surface-secondary)}.card-header-tabs{background:var(--tblr-bg-surface-secondary);flex:1;margin:calc(var(--tblr-card-cap-padding-y) * -1) calc(var(--tblr-card-cap-padding-x) * -1) calc(var(--tblr-card-cap-padding-y) * -1);padding:calc(var(--tblr-card-cap-padding-y) * .5) calc(var(--tblr-card-cap-padding-x) * .5) 0}.card-header-pills{flex:1;margin-top:-.5rem;margin-bottom:-.5rem}.card-rotate-left{transform:rotate(-1.5deg)}.card-rotate-right{transform:rotate(1.5deg)}.card-link{color:inherit}.card-link:hover{color:inherit;text-decoration:none;box-shadow:0 1px 6px 0 rgba(0,0,0,.08)}.card-link-rotate:hover{transform:rotate(1.5deg);opacity:1}.card-link-pop:hover{transform:translateY(-2px);opacity:1}.card-footer{margin-top:auto}.card-footer:last-child{border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-footer-transparent{background:0 0;border-color:transparent;padding-top:0}.card-footer-borderless{border-top:none}.card-progress{height:.25rem}.card-progress:last-child{border-radius:0 0 2px 2px}.card-progress:first-child{border-radius:2px 2px 0 0}.card-meta{color:var(--tblr-muted)}.card-title{display:block;margin:0 0 1rem;font-size:1rem;font-weight:var(--tblr-font-weight-medium);line-height:1.5rem}a.card-title:hover{color:inherit}.card-header .card-title{margin:0}.card-subtitle{margin-bottom:1.25rem;color:var(--tblr-muted);font-weight:400}.card-header .card-subtitle{margin:0}.card-title .card-subtitle{margin:0 0 0 .25rem;font-size:.875rem}.card-body{position:relative}.card-body>:last-child{margin-bottom:0}.card-sm>.card-body{padding:1rem}@media (min-width:768px){.card-md>.card-body{padding:2.5rem}}@media (min-width:768px){.card-lg>.card-body{padding:2rem}}@media (min-width:992px){.card-lg>.card-body{padding:4rem}}@media print{.card-body{padding:0}}.card-body+.card-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-body-scrollable{overflow:auto}.card-options{top:1.5rem;right:.75rem;display:flex;margin-left:auto}.card-options-link{display:inline-block;min-width:1rem;margin-left:.25rem;color:var(--tblr-muted)}.card-status-top{position:absolute;top:0;right:0;left:0;height:2px;border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-status-start{position:absolute;right:auto;bottom:0;width:2px;height:100%;border-radius:var(--tblr-card-border-radius) 0 0 var(--tblr-card-border-radius)}.card-status-bottom{position:absolute;top:initial;bottom:0;width:100%;height:2px;border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-table{margin-bottom:0!important}.card-table tr td:first-child,.card-table tr th:first-child{padding-left:1.5rem;border-left:0}.card-table tr td:last-child,.card-table tr th:last-child{padding-right:1.5rem;border-right:0}.card-table tbody tr:first-child,.card-table tfoot tr:first-child,.card-table thead tr:first-child{border-top:0}.card-table tbody tr:first-child td,.card-table tbody tr:first-child th,.card-table tfoot tr:first-child td,.card-table tfoot tr:first-child th,.card-table thead tr:first-child td,.card-table thead tr:first-child th{border-top:0}.card-body+.card-table{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-table-border-color)}.card-code{padding:0}.card-code .highlight{margin:0;border:0}.card-code pre{margin:0!important;border:0!important}.card-chart{position:relative;z-index:1;height:3.5rem}.card-avatar{margin-left:auto;margin-right:auto;box-shadow:0 0 0 .25rem var(--tblr-card-bg,var(--tblr-bg-surface));margin-top:calc(-1 * var(--tblr-avatar-size) * .5)}.card-body+.card-list-group{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-list-group .list-group-item{padding-right:1.5rem;padding-left:1.5rem;border-right:0;border-left:0;border-radius:0}.card-list-group .list-group-item:last-child{border-bottom:0}.card-list-group .list-group-item:first-child{border-top:0}.card-tabs .nav-tabs{position:relative;z-index:1000;border-bottom:0}.card-tabs .nav-tabs .nav-link{background:var(--tblr-bg-surface-secondary);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-tabs .nav-tabs .nav-link.active,.card-tabs .nav-tabs .nav-link:active,.card-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color);color:#1d273b}.card-tabs .nav-tabs .nav-link.active{background:var(--tblr-card-bg,var(--tblr-bg-surface));border-bottom-color:transparent}.card-tabs .nav-tabs .nav-item:not(:first-child) .nav-link{border-top-left-radius:0}.card-tabs .nav-tabs .nav-item:not(:last-child) .nav-link{border-top-right-radius:0}.card-tabs .nav-tabs .nav-item+.nav-item{margin-left:calc(-1 * var(--tblr-border-width))}.card-tabs .nav-tabs-bottom{margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-link{margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-link.active{border-top-color:transparent}.card-tabs .nav-tabs-bottom .nav-item{margin-top:calc(-1 * var(--tblr-border-width));margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-item .nav-link{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:0 0 var(--tblr-border-radius) var(--tblr-border-radius)}.card-tabs .nav-tabs-bottom .nav-item:not(:first-child) .nav-link{border-bottom-left-radius:0}.card-tabs .nav-tabs-bottom .nav-item:not(:last-child) .nav-link{border-bottom-right-radius:0}.card-tabs .card{border-bottom-left-radius:0}.card-tabs .nav-tabs+.tab-content .card{border-bottom-left-radius:var(--tblr-card-border-radius);border-top-left-radius:0}.btn-close{cursor:pointer}.btn-close:focus{outline:0}.dropdown-menu{box-shadow:0 .5rem 1rem rgba(0,0,0,.15);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin:0!important}.dropdown-menu.card{padding:0;min-width:25rem;display:none}.dropdown-menu.card.show{display:flex}.dropdown-item{min-width:11rem;display:flex;align-items:center;margin:0;line-height:1.4285714286}.dropdown-item-icon{width:1.25rem!important;height:1.25rem!important;margin-right:.5rem;color:var(--tblr-muted);opacity:.7;text-align:center}.dropdown-item-indicator{margin-right:.5rem;margin-left:-.25rem;height:1.25rem;display:inline-flex;line-height:1;vertical-align:bottom;align-items:center}.dropdown-header{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);padding-bottom:.25rem;pointer-events:none}.dropdown-menu-scrollable{height:auto;max-height:13rem;overflow-x:hidden}.dropdown-menu-column{min-width:11rem}.dropdown-menu-column .dropdown-item{min-width:0}.dropdown-menu-columns{display:flex;flex:0 .25rem}.dropdown-menu-arrow:before{content:"";position:absolute;top:-.25rem;left:.75rem;display:block;background:inherit;width:14px;height:14px;transform:rotate(45deg);transform-origin:center;border:1px solid;border-color:inherit;z-index:-1;clip:rect(0,9px,9px,0)}.dropdown-menu-arrow.dropdown-menu-end:before{right:.75rem;left:auto}.dropend>.dropdown-menu{margin-top:calc(-.25rem - 1px);margin-left:-.25rem}.dropend .dropdown-toggle:after{margin-left:auto}.dropdown-menu-card{padding:0}.dropdown-menu-card>.card{margin:0;border:0;box-shadow:none}.datagrid{--tblr-datagrid-padding:1.5rem;--tblr-datagrid-item-width:15rem;display:grid;grid-gap:var(--tblr-datagrid-padding);grid-template-columns:repeat(auto-fit,minmax(var(--tblr-datagrid-item-width),1fr))}.datagrid-title{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);margin-bottom:.25rem}.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:1rem;text-align:center}@media (min-width:768px){.empty{padding:3rem}}.empty-icon{margin:0 0 1rem;width:3rem;height:3rem;line-height:1;color:var(--tblr-muted)}.empty-icon svg{width:100%;height:100%}.empty-img{margin:0 0 2rem;line-height:1}.empty-img img{height:8rem;width:auto}.empty-header{margin:0 0 1rem;font-size:4rem;font-weight:var(--tblr-font-weight-light);line-height:1;color:var(--tblr-muted)}.empty-title{font-size:1.25rem;line-height:1.75rem;font-weight:var(--tblr-font-weight-medium)}.empty-subtitle,.empty-title{margin:0 0 .5rem}.empty-action{margin-top:1.5rem}.empty-bordered{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.row>*{min-width:0}.col-separator{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}@media (max-width:991.98px){.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--tblr-gutter-x:1rem}}.container-tight{--tblr-gutter-x:1.5rem;--tblr-gutter-y:0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:30rem}.container-narrow{--tblr-gutter-x:1.5rem;--tblr-gutter-y:0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:45rem}.row-0{margin-right:0;margin-left:0}.row-0>.col,.row-0>[class*=col-]{padding-right:0;padding-left:0}.row-0 .card{margin-bottom:0}.row-sm{margin-right:-.375rem;margin-left:-.375rem}.row-sm>.col,.row-sm>[class*=col-]{padding-right:.375rem;padding-left:.375rem}.row-sm .card{margin-bottom:.75rem}.row-md{margin-right:-1.5rem;margin-left:-1.5rem}.row-md>.col,.row-md>[class*=col-]{padding-right:1.5rem;padding-left:1.5rem}.row-md .card{margin-bottom:3rem}.row-lg{margin-right:-3rem;margin-left:-3rem}.row-lg>.col,.row-lg>[class*=col-]{padding-right:3rem;padding-left:3rem}.row-lg .card{margin-bottom:6rem}.row-deck>.col,.row-deck>[class*=col-]{display:flex;align-items:stretch}.row-deck>.col .card,.row-deck>[class*=col-] .card{flex:1 1 auto}.row-cards{--tblr-gutter-x:1rem;--tblr-gutter-y:1rem;min-width:0}.row-cards .row-cards{flex:1}@media (max-width:991.98px){.row-cards{--tblr-gutter-x:0.5rem;--tblr-gutter-y:0.5rem}}.space-y{display:flex;flex-direction:column;gap:1rem}.space-x{display:flex;gap:1rem}.space-y-0{display:flex;flex-direction:column;gap:0}.space-x-0{display:flex;gap:0}.space-y-1{display:flex;flex-direction:column;gap:.25rem}.space-x-1{display:flex;gap:.25rem}.space-y-2{display:flex;flex-direction:column;gap:.5rem}.space-x-2{display:flex;gap:.5rem}.space-y-3{display:flex;flex-direction:column;gap:1rem}.space-x-3{display:flex;gap:1rem}.space-y-4{display:flex;flex-direction:column;gap:2rem}.space-x-4{display:flex;gap:2rem}.space-y-5{display:flex;flex-direction:column;gap:4rem}.space-x-5{display:flex;gap:4rem}.divide-y>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-y>:not(template):not(:first-child){padding-top:1rem!important}.divide-y>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-x>:not(template):not(:first-child){padding-left:1rem!important}.divide-x>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-0>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-y-0>:not(template):not(:first-child){padding-top:0!important}.divide-y-0>:not(template):not(:last-child){padding-bottom:0!important}.divide-x-0>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-x-0>:not(template):not(:first-child){padding-left:0!important}.divide-x-0>:not(template):not(:last-child){padding-right:0!important}.divide-y-1>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-y-1>:not(template):not(:first-child){padding-top:.25rem!important}.divide-y-1>:not(template):not(:last-child){padding-bottom:.25rem!important}.divide-x-1>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-x-1>:not(template):not(:first-child){padding-left:.25rem!important}.divide-x-1>:not(template):not(:last-child){padding-right:.25rem!important}.divide-y-2>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-y-2>:not(template):not(:first-child){padding-top:.5rem!important}.divide-y-2>:not(template):not(:last-child){padding-bottom:.5rem!important}.divide-x-2>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-x-2>:not(template):not(:first-child){padding-left:.5rem!important}.divide-x-2>:not(template):not(:last-child){padding-right:.5rem!important}.divide-y-3>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-y-3>:not(template):not(:first-child){padding-top:1rem!important}.divide-y-3>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x-3>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-x-3>:not(template):not(:first-child){padding-left:1rem!important}.divide-x-3>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-4>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-y-4>:not(template):not(:first-child){padding-top:2rem!important}.divide-y-4>:not(template):not(:last-child){padding-bottom:2rem!important}.divide-x-4>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-x-4>:not(template):not(:first-child){padding-left:2rem!important}.divide-x-4>:not(template):not(:last-child){padding-right:2rem!important}.divide-y-5>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-y-5>:not(template):not(:first-child){padding-top:4rem!important}.divide-y-5>:not(template):not(:last-child){padding-bottom:4rem!important}.divide-x-5>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)!important}.divide-x-5>:not(template):not(:first-child){padding-left:4rem!important}.divide-x-5>:not(template):not(:last-child){padding-right:4rem!important}.divide-y-fill{display:flex;flex-direction:column;height:100%}.divide-y-fill>:not(template){flex:1;display:flex;justify-content:center;flex-direction:column}.icon{--tblr-icon-size:1.25rem;width:var(--tblr-icon-size);height:var(--tblr-icon-size);font-size:var(--tblr-icon-size);vertical-align:bottom;stroke-width:1.5}.icon:hover{text-decoration:none}.icon-inline{--tblr-icon-size:1rem;vertical-align:-.2rem}.icon-filled{fill:currentColor}.icon-sm{--tblr-icon-size:1rem;stroke-width:1}.icon-md{--tblr-icon-size:2.5rem;stroke-width:1}.icon-lg{--tblr-icon-size:3.5rem;stroke-width:1}.icon-pulse{transition:all .15s ease 0s;animation:pulse 2s ease infinite;animation-fill-mode:both}.icon-tada{transition:all .15s ease 0s;animation:tada 3s ease infinite;animation-fill-mode:both}.icon-rotate{transition:all .15s ease 0s;animation:rotate-360 3s linear infinite;animation-fill-mode:both}.img-responsive{--tblr-img-responsive-ratio:75%;background:no-repeat center/cover;padding-top:var(--tblr-img-responsive-ratio)}.img-responsive-grid{padding-top:calc(var(--tblr-img-responsive-ratio) - var(--tblr-gutter-y)/ 2)}.img-responsive-1x1{--tblr-img-responsive-ratio:100%}.img-responsive-2x1{--tblr-img-responsive-ratio:50%}.img-responsive-1x2{--tblr-img-responsive-ratio:200%}.img-responsive-3x1{--tblr-img-responsive-ratio:33.3333333333%}.img-responsive-1x3{--tblr-img-responsive-ratio:300%}.img-responsive-4x3{--tblr-img-responsive-ratio:75%}.img-responsive-3x4{--tblr-img-responsive-ratio:133.3333333333%}.img-responsive-16x9{--tblr-img-responsive-ratio:56.25%}.img-responsive-9x16{--tblr-img-responsive-ratio:177.7777777778%}.img-responsive-21x9{--tblr-img-responsive-ratio:42.8571428571%}.img-responsive-9x21{--tblr-img-responsive-ratio:233.3333333333%}textarea[cols]{height:auto}.col-form-label,.form-label{display:block;font-weight:var(--tblr-font-weight-medium)}.col-form-label.required:after,.form-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-label-description{float:right;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-muted)}.form-hint{display:block;color:var(--tblr-muted)}.form-hint:last-child{margin-bottom:0}.form-hint+.form-control{margin-top:.25rem}.form-label+.form-hint{margin-top:-.25rem}.form-control+.form-hint,.form-select+.form-hint,.input-group+.form-hint{margin-top:.5rem}.form-select:-moz-focusring{color:var(--tblr-body-color)}.form-control:-webkit-autofill{box-shadow:0 0 0 1000px var(--tblr-body-bg) inset;color:var(--tblr-body-color)}.form-control.disabled,.form-control:disabled{color:var(--tblr-muted);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-control[size]{width:auto}.form-control-light{background-color:#f1f5f9;border-color:transparent}.form-control-dark{background-color:rgba(0,0,0,.1);color:#fff;border-color:transparent}.form-control-dark:focus{background-color:rgba(0,0,0,.1);box-shadow:none;border-color:rgba(255,255,255,.24)}.form-control-dark::-webkit-input-placeholder{color:rgba(255,255,255,.6)}.form-control-dark::-moz-placeholder{color:rgba(255,255,255,.6)}.form-control-dark:-ms-input-placeholder{color:rgba(255,255,255,.6)}.form-control-dark::-ms-input-placeholder{color:rgba(255,255,255,.6)}.form-control-dark::placeholder{color:rgba(255,255,255,.6)}.form-control-rounded{border-radius:10rem}.form-control-flush{padding:0;background:0 0!important;border-color:transparent!important;resize:none;box-shadow:none!important;line-height:inherit}.form-footer{margin-top:2rem}.form-fieldset{padding:1rem;margin-bottom:1rem;background:var(--tblr-body-bg);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.form-help{display:inline-flex;font-weight:var(--tblr-font-weight-bold);align-items:center;justify-content:center;width:1.125rem;height:1.125rem;font-size:.75rem;color:var(--tblr-muted);text-align:center;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:var(--tblr-gray-100);border-radius:100rem;transition:background-color .3s,color .3s}@media (prefers-reduced-motion:reduce){.form-help{transition:none}}.form-help:hover,.form-help[aria-describedby]{color:#fff;background:var(--tblr-primary)}.input-group-link{font-size:.75rem}.input-group-flat:focus-within{box-shadow:0 0 0 .25rem rgba(32,107,196,.25);border-radius:var(--tblr-border-radius)}.input-group-flat:focus-within .form-control,.input-group-flat:focus-within .input-group-text{border-color:#90b5e2!important}.input-group-flat .form-control:focus{border-color:var(--tblr-border-color);box-shadow:none}.input-group-flat .form-control:not(:last-child){border-right:0}.input-group-flat .form-control:not(:first-child){border-left:0}.input-group-flat .input-group-text{background:var(--tblr-bg-forms);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.input-group-flat .input-group-text{transition:none}}.input-group-flat .input-group-text:first-child{padding-right:0}.input-group-flat .input-group-text:last-child{padding-left:0}.form-file-button{margin-left:0;border-left:0}.input-icon{position:relative}.input-icon .form-control:not(:last-child),.input-icon .form-select:not(:last-child){padding-right:2.5rem}.input-icon .form-control:not(:first-child),.input-icon .form-select:not(:last-child){padding-left:2.5rem}.input-icon-addon{position:absolute;top:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;min-width:2.5rem;color:var(--tblr-icon-color);pointer-events:none;font-size:1.2em}.input-icon-addon:last-child{right:0;left:auto}.form-colorinput{position:relative;display:inline-block;margin:0;line-height:1;cursor:pointer}.form-colorinput-input{position:absolute;z-index:-1;opacity:0}.form-colorinput-color{display:block;width:1.5rem;height:1.5rem;color:#fff;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:3px;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.form-colorinput-color:before{position:absolute;top:0;left:0;width:100%;height:100%;content:"";background:no-repeat center center/1rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");opacity:0;transition:opacity .3s}@media (prefers-reduced-motion:reduce){.form-colorinput-color:before{transition:none}}.form-colorinput-input:checked~.form-colorinput-color:before{opacity:1}.form-colorinput-input:focus~.form-colorinput-color{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(32,107,196,.25)}.form-colorinput-light .form-colorinput-color:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%231d273b' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-imagecheck{position:relative;margin:0;cursor:pointer}.form-imagecheck-input{position:absolute;z-index:-1;opacity:0}.form-imagecheck-figure{position:relative;display:block;margin:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:3px}.form-imagecheck-input:focus~.form-imagecheck-figure{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(32,107,196,.25)}.form-imagecheck-input:checked~.form-imagecheck-figure{border-color:var(--tblr-primary)}.form-imagecheck-figure:before{position:absolute;top:.25rem;left:.25rem;z-index:1;display:block;width:1rem;height:1rem;color:#fff;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:var(--tblr-bg-forms);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius);transition:opacity .3s}@media (prefers-reduced-motion:reduce){.form-imagecheck-figure:before{transition:none}}.form-imagecheck-input:checked~.form-imagecheck-figure:before{background-color:var(--tblr-primary);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");background-repeat:repeat;background-position:center;background-size:1rem;border-color:var(--tblr-border-color-translucent)}.form-imagecheck-input[type=radio]~.form-imagecheck-figure:before{border-radius:50%}.form-imagecheck-input[type=radio]:checked~.form-imagecheck-figure:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-imagecheck-image{max-width:100%;display:block;opacity:.64;transition:opacity .3s}@media (prefers-reduced-motion:reduce){.form-imagecheck-image{transition:none}}.form-imagecheck-image:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.form-imagecheck-image:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-image,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-image,.form-imagecheck:hover .form-imagecheck-image{opacity:1}.form-imagecheck-caption{padding:.25rem;font-size:.765625rem;color:var(--tblr-muted);text-align:center;transition:color .3s}@media (prefers-reduced-motion:reduce){.form-imagecheck-caption{transition:none}}.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-caption,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-caption,.form-imagecheck:hover .form-imagecheck-caption{color:#1d273b}.form-selectgroup{display:inline-flex;margin:0 -.5rem -.5rem 0;flex-wrap:wrap}.form-selectgroup .form-selectgroup-item{margin:0 .5rem .5rem 0}.form-selectgroup-vertical{flex-direction:column}.form-selectgroup-item{display:block;position:relative}.form-selectgroup-input{position:absolute;top:0;left:0;z-index:-1;opacity:0}.form-selectgroup-label{position:relative;display:block;min-width:calc(1.4285714286em + .875rem + 2px);margin:0;padding:.4375rem .75rem;font-size:.875rem;line-height:1.4285714286;color:var(--tblr-muted);background:var(--tblr-bg-forms);text-align:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:3px;transition:border-color .3s,background .3s,color .3s}@media (prefers-reduced-motion:reduce){.form-selectgroup-label{transition:none}}.form-selectgroup-label .icon:only-child{margin:0 -.25rem}.form-selectgroup-label:hover{color:var(--tblr-body-color)}.form-selectgroup-check{display:inline-block;width:1rem;height:1rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);vertical-align:middle}.form-selectgroup-input[type=checkbox]+.form-selectgroup-label .form-selectgroup-check{border-radius:var(--tblr-border-radius)}.form-selectgroup-input[type=radio]+.form-selectgroup-label .form-selectgroup-check{border-radius:50%}.form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-check{background-color:var(--tblr-primary);background-repeat:repeat;background-position:center;background-size:1rem;border-color:var(--tblr-border-color-translucent)}.form-selectgroup-input[type=checkbox]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-selectgroup-input[type=radio]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-selectgroup-check-floated{position:absolute;top:.4375rem;right:.4375rem}.form-selectgroup-input:checked+.form-selectgroup-label{z-index:1;color:var(--tblr-primary);background:rgba(var(--tblr-primary-rgb),.04);border-color:var(--tblr-primary)}.form-selectgroup-input:focus+.form-selectgroup-label{z-index:2;color:var(--tblr-primary);border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(32,107,196,.25)}.form-selectgroup-boxes .form-selectgroup-label{text-align:left;padding:1.5rem 1rem;color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label{color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-title{color:var(--tblr-primary)}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-label-content{opacity:1}.form-selectgroup-pills{flex-wrap:wrap;align-items:flex-start}.form-selectgroup-pills .form-selectgroup-item{flex-grow:0}.form-selectgroup-pills .form-selectgroup-label{border-radius:50px}.form-control-color::-webkit-color-swatch{border:none}[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.form-control::-webkit-file-upload-button{background-color:var(--tblr-btn-color,#f8fafc)}.form-control::file-selector-button{background-color:var(--tblr-btn-color,#f8fafc)}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--tblr-btn-color,#eceeef)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-btn-color,#eceeef)}.form-check{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-check.form-check-highlight .form-check-input:not(:checked)~.form-check-label{color:var(--tblr-muted)}.form-check .form-check-label-off{color:var(--tblr-muted)}.form-check .form-check-input:checked~.form-check-label-off{display:none}.form-check .form-check-input:not(:checked)~.form-check-label-on{display:none}.form-check-input{background-size:1rem;margin-top:.125rem}.form-switch .form-check-input{transition:background-color .3s,background-position .3s}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-check-label{display:block}.form-check-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-check-description{display:block;color:var(--tblr-muted);font-size:.75rem;margin-top:.25rem}.form-check-single{margin:0}.form-check-single .form-check-input{margin:0}.form-switch .form-check-input{height:1.125rem;margin-top:.0625rem}.form-switch-lg{padding-left:3.5rem;min-height:1.5rem}.form-switch-lg .form-check-input{height:1.5rem;width:2.75rem;background-size:1.5rem;margin-left:-3.5rem}.form-switch-lg .form-check-label{padding-top:.125rem}.form-check-input:checked{border:none}.form-control.is-invalid-lite,.form-control.is-valid-lite,.form-select.is-invalid-lite,.form-select.is-valid-lite{border-color:var(--tblr-border-color)!important}.legend{--tblr-legend-size:0.75em;display:inline-block;background:var(--tblr-border-color);width:var(--tblr-legend-size);height:var(--tblr-legend-size);border-radius:var(--tblr-border-radius-sm)}.list-group{margin-left:0;margin-right:0}.list-group-header{background:var(--tblr-light);padding:.5rem 1.5rem;font-size:.75rem;font-weight:var(--tblr-font-weight-medium);line-height:1;text-transform:uppercase;color:var(--tblr-muted);border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-group-flush>.list-group-header:last-child{border-bottom-width:0}.list-group-item{background-color:inherit}.list-group-item.active{background-color:rgba(var(--tblr-muted-rgb),.04);border-left-color:#206bc4;border-left-width:2px}.list-group-item:active,.list-group-item:focus,.list-group-item:hover{background-color:rgba(var(--tblr-muted-rgb),.04)}.list-group-item.disabled,.list-group-item:disabled{color:#6c7a91;background-color:rgba(var(--tblr-muted-rgb),.04)}.list-bordered .list-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);margin-top:-1px}.list-bordered .list-item:first-child{border-top:none}.list-group-hoverable .list-group-item-actions{opacity:0;transition:opacity .3s}@media (prefers-reduced-motion:reduce){.list-group-hoverable .list-group-item-actions{transition:none}}.list-group-hoverable .list-group-item-actions.show,.list-group-hoverable .list-group-item:hover .list-group-item-actions{opacity:1}.list-timeline{position:relative;padding:0;margin:0;list-style:none}.list-timeline>li{position:relative;margin-bottom:1.5rem}.list-timeline>li:last-child{margin-bottom:0}.list-timeline-time{float:right;margin-left:1rem;color:var(--tblr-muted)}.list-timeline-icon{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;color:#fff;text-align:center;background:var(--tblr-muted);border-radius:100rem}.list-timeline-icon .icon{width:1rem;height:1rem;font-size:1rem}.list-timeline-title{margin:0;font-weight:var(--tblr-font-weight-bold)}.list-timeline-content{margin-left:3.5rem}@media screen and (min-width:768px){.list-timeline:not(.list-timeline-simple):before{position:absolute;top:0;bottom:0;left:calc(7.5rem + 2px);z-index:1;display:block;width:2px;content:"";background-color:var(--tblr-border-color)}.list-timeline:not(.list-timeline-simple)>li{z-index:2;min-height:40px}.list-timeline:not(.list-timeline-simple) .list-timeline-time{position:absolute;top:.5rem;left:0;width:5.5rem;margin:0;text-align:right}.list-timeline:not(.list-timeline-simple) .list-timeline-icon{top:0;left:6.5rem}.list-timeline:not(.list-timeline-simple) .list-timeline-content{padding:.625rem 0 0 10rem;margin:0}}.list-group-transparent{--tblr-list-group-border-radius:0;margin:0 -1.5rem}.list-group-transparent .list-group-item{background:0 0;border:0}.list-group-transparent .list-group-item .icon{color:var(--tblr-muted)}.list-group-transparent .list-group-item.active{font-weight:var(--tblr-font-weight-bold);color:inherit;background:var(--tblr-active-bg)}.list-group-transparent .list-group-item.active .icon{color:inherit}.list-separated-item{padding:1rem 0}.list-separated-item:first-child{padding-top:0}.list-separated-item:last-child{padding-bottom:0}.list-separated-item+.list-separated-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-inline-item:not(:last-child){margin-right:auto;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.list-inline-dots .list-inline-item+.list-inline-item:before{content:" · ";-webkit-margin-end:.5rem;margin-inline-end:.5rem}.loader{position:relative;display:block;width:2.5rem;height:2.5rem;color:#206bc4;vertical-align:middle}.loader:after{position:absolute;top:0;left:0;width:100%;height:100%;content:"";border:1px var(--tblr-border-style);border-color:transparent;border-top-color:currentColor;border-left-color:currentColor;border-radius:100rem;animation:rotate-360 .6s linear;animation-iteration-count:infinite}.dimmer{position:relative}.dimmer .loader{position:absolute;top:50%;right:0;left:0;display:none;margin:0 auto;transform:translateY(-50%)}.dimmer.active .loader{display:block}.dimmer.active .dimmer-content{pointer-events:none;opacity:.1}@keyframes animated-dots{0%{transform:translateX(-100%)}}.animated-dots{display:inline-block;overflow:hidden;vertical-align:bottom}.animated-dots:after{display:inline-block;content:"...";animation:animated-dots 1.2s steps(4,jump-none) infinite}.modal-content .btn-close{position:absolute;top:0;right:0;width:3.5rem;height:3.5rem;margin:0;padding:0;z-index:10}.modal-body::-webkit-scrollbar{width:.5rem;height:.5rem;-webkit-transition:background .3s;transition:background .3s}@media (prefers-reduced-motion:reduce){.modal-body::-webkit-scrollbar{-webkit-transition:none;transition:none}}.modal-body::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(var(--tblr-body-color-rgb),.16)}.modal-body::-webkit-scrollbar-track{background:rgba(var(--tblr-body-color-rgb),.06)}.modal-body:hover::-webkit-scrollbar-thumb{background:rgba(var(--tblr-body-color-rgb),.32)}.modal-body::-webkit-scrollbar-corner{background:0 0}.modal-body .modal-title{margin-bottom:1rem}.modal-body+.modal-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.modal-status{position:absolute;top:0;left:0;right:0;height:2px;background:var(--tblr-muted);border-radius:var(--tblr-border-radius-lg) var(--tblr-border-radius-lg) 0 0}.modal-header{align-items:center;min-height:3.5rem;background:#fff;padding:0 3.5rem 0 1.5rem}.modal-title{font-size:1rem;font-weight:var(--tblr-font-weight-medium);line-height:1.4285714286}.modal-footer{padding-top:0;padding-bottom:.75rem}.modal-blur{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.modal-full-width{max-width:none;margin:0 .5rem}.nav-vertical,.nav-vertical .nav{flex-direction:column;flex-wrap:nowrap}.nav-vertical .nav{margin-left:1.25rem;border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding-left:.5rem}.nav-vertical .nav-item.show .nav-link,.nav-vertical .nav-link.active{font-weight:var(--tblr-font-weight-bold)}.nav-vertical.nav-pills{margin:0 -.75rem}.nav-bordered{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.nav-bordered .nav-item+.nav-item{margin-left:1.25rem}.nav-bordered .nav-link{padding-left:0;padding-right:0;margin:0 0 -var(--tblr-border-width);border:0;border-bottom:2px var(--tblr-border-style) transparent;color:var(--tblr-muted)}.nav-bordered .nav-item.show .nav-link,.nav-bordered .nav-link.active{color:var(--tblr-primary);border-color:var(--tblr-primary)}.nav-link{display:flex;transition:color .3s;align-items:center}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link-toggle{margin-left:auto;padding:0 .25rem;transition:transform .3s}@media (prefers-reduced-motion:reduce){.nav-link-toggle{transition:none}}.nav-link-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.nav-link-toggle:after{margin:0}.nav-link[aria-expanded=true] .nav-link-toggle{transform:rotate(180deg)}.nav-link-icon{width:1.25rem;height:1.25rem;margin-right:.5rem;color:var(--tblr-icon-color)}.nav-link-icon svg{display:block;height:100%}.nav-fill .nav-item .nav-link{justify-content:center}.stars{display:inline-flex;color:#9ba9be;font-size:.75rem}.stars .star:not(:first-child){margin-left:.25rem}.pagination{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.page-link{min-width:1.75rem;border-radius:var(--tblr-border-radius)}.page-item{text-align:center}.page-item:not(.active) .page-link:hover{background:0 0}.page-item.page-next,.page-item.page-prev{flex:0 0 50%;text-align:left}.page-item.page-next{margin-left:auto;text-align:right}.page-item-subtitle{margin-bottom:2px;font-size:12px;color:var(--tblr-muted);text-transform:uppercase}.page-item.disabled .page-item-subtitle{color:var(--tblr-disabled-color)}.page-item-title{font-size:1rem;font-weight:var(--tblr-font-weight-normal);color:#1d273b}.page-link:hover .page-item-title{color:var(--tblr-primary)}.page-item.disabled .page-item-title{color:var(--tblr-disabled-color)}@keyframes progress-indeterminate{0%{right:100%;left:-35%}100%,60%{right:-90%;left:100%}}.progress{position:relative;width:100%;line-height:.5rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.progress::-webkit-progress-bar{background:var(--tblr-progress-bg)}.progress::-webkit-progress-value{background-color:var(--tblr-primary)}.progress::-moz-progress-bar{background-color:var(--tblr-primary)}.progress::-ms-fill{background-color:var(--tblr-primary);border:none}.progress-sm{height:.25rem}.progress-bar{height:100%}.progress-bar-indeterminate:after,.progress-bar-indeterminate:before{position:absolute;top:0;bottom:0;left:0;content:"";background-color:inherit;will-change:left,right}.progress-bar-indeterminate:before{animation:progress-indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.progress-separated .progress-bar{box-shadow:0 0 0 2px var(--tblr-card-bg,var(--tblr-bg-surface))}.progressbg{position:relative;padding:.25rem .5rem;display:flex}.progressbg-text{position:relative;z-index:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progressbg-progress{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;height:100%;background:0 0;pointer-events:none}.progressbg-value{font-weight:var(--tblr-font-weight-medium);margin-left:auto;padding-left:2rem}.ribbon{--tblr-ribbon-margin:0.25rem;--tblr-ribbon-border-radius:var(--tblr-border-radius);position:absolute;top:.75rem;right:calc(-1 * var(--tblr-ribbon-margin));z-index:1;padding:.25rem .75rem;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);line-height:1;color:#fff;text-align:center;text-transform:uppercase;background:var(--tblr-primary);border-color:var(--tblr-primary);border-radius:var(--tblr-ribbon-border-radius) 0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius);display:inline-flex;align-items:center;justify-content:center;min-height:2rem;min-width:2rem}.ribbon:before{position:absolute;right:0;bottom:100%;width:0;height:0;content:"";filter:brightness(70%);border:calc(var(--tblr-ribbon-margin) * .5) var(--tblr-border-style);border-color:inherit;border-top-color:transparent;border-right-color:transparent}.ribbon.bg-blue{border-color:var(--tblr-blue)}.ribbon.bg-blue-lt{border-color:rgba(var(--tblr-blue-rgb),.1)!important}.ribbon.bg-azure{border-color:var(--tblr-azure)}.ribbon.bg-azure-lt{border-color:rgba(var(--tblr-azure-rgb),.1)!important}.ribbon.bg-indigo{border-color:var(--tblr-indigo)}.ribbon.bg-indigo-lt{border-color:rgba(var(--tblr-indigo-rgb),.1)!important}.ribbon.bg-purple{border-color:var(--tblr-purple)}.ribbon.bg-purple-lt{border-color:rgba(var(--tblr-purple-rgb),.1)!important}.ribbon.bg-pink{border-color:var(--tblr-pink)}.ribbon.bg-pink-lt{border-color:rgba(var(--tblr-pink-rgb),.1)!important}.ribbon.bg-red{border-color:var(--tblr-red)}.ribbon.bg-red-lt{border-color:rgba(var(--tblr-red-rgb),.1)!important}.ribbon.bg-orange{border-color:var(--tblr-orange)}.ribbon.bg-orange-lt{border-color:rgba(var(--tblr-orange-rgb),.1)!important}.ribbon.bg-yellow{border-color:var(--tblr-yellow)}.ribbon.bg-yellow-lt{border-color:rgba(var(--tblr-yellow-rgb),.1)!important}.ribbon.bg-lime{border-color:var(--tblr-lime)}.ribbon.bg-lime-lt{border-color:rgba(var(--tblr-lime-rgb),.1)!important}.ribbon.bg-green{border-color:var(--tblr-green)}.ribbon.bg-green-lt{border-color:rgba(var(--tblr-green-rgb),.1)!important}.ribbon.bg-teal{border-color:var(--tblr-teal)}.ribbon.bg-teal-lt{border-color:rgba(var(--tblr-teal-rgb),.1)!important}.ribbon.bg-cyan{border-color:var(--tblr-cyan)}.ribbon.bg-cyan-lt{border-color:rgba(var(--tblr-cyan-rgb),.1)!important}.ribbon .icon{width:1.25rem;height:1.25rem;font-size:1.25rem}.ribbon-top{top:calc(-1 * var(--tblr-ribbon-margin));right:.75rem;width:2rem;padding:.5rem 0;border-radius:0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius)}.ribbon-top:before{top:0;right:100%;bottom:auto;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-top.ribbon-start{right:auto;left:.75rem}.ribbon-top.ribbon-start:before{top:0;right:100%;left:auto}.ribbon-start{right:auto;left:calc(-1 * var(--tblr-ribbon-margin))}.ribbon-start:before{top:auto;bottom:100%;left:0;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-bottom{top:auto;bottom:.75rem}.ribbon-bookmark{padding-left:.25rem;border-radius:0 0 var(--tblr-ribbon-border-radius) 0}.ribbon-bookmark:after{position:absolute;top:0;right:100%;display:block;width:0;height:0;content:"";border:1rem var(--tblr-border-style);border-color:inherit;border-right-width:0;border-left-color:transparent;border-left-width:.5rem}.ribbon-bookmark.ribbon-left{padding-right:.5rem}.ribbon-bookmark.ribbon-left:after{right:auto;left:100%;border-right-color:transparent;border-right-width:.5rem;border-left-width:0}.ribbon-bookmark.ribbon-top{padding-right:0;padding-bottom:.25rem;padding-left:0;border-radius:0 var(--tblr-ribbon-border-radius) 0 0}.ribbon-bookmark.ribbon-top:after{top:100%;right:0;left:0;border-color:inherit;border-width:1rem;border-top-width:0;border-bottom-color:transparent;border-bottom-width:.5rem}.markdown{line-height:1.7142857143}.markdown>:first-child{margin-top:0}.markdown>:last-child,.markdown>:last-child .highlight{margin-bottom:0}@media (min-width:768px){.markdown>.hr,.markdown>hr{margin-top:3em;margin-bottom:3em}}.markdown>.h1,.markdown>.h2,.markdown>.h3,.markdown>.h4,.markdown>.h5,.markdown>.h6,.markdown>h1,.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{font-weight:var(--tblr-font-weight-bold)}.markdown>blockquote{font-size:1rem;margin:1.5rem 0;padding:.5rem 1.5rem}.markdown>img{border-radius:var(--tblr-border-radius)}.placeholder:not(.btn):not([class*=bg-]){background-color:currentColor!important}.placeholder:not(.avatar):not([class*=card-img-]){border-radius:var(--tblr-border-radius)}.steps{--tblr-steps-color:var(--tblr-primary);--tblr-steps-inactive-color:var(--tblr-border-color);--tblr-steps-dot-size:.5rem;--tblr-steps-border-width:2px;display:flex;flex-wrap:nowrap;width:100%;padding:0;margin:0;list-style:none}.steps-blue{--tblr-steps-color:var(--tblr-blue)}.steps-azure{--tblr-steps-color:var(--tblr-azure)}.steps-indigo{--tblr-steps-color:var(--tblr-indigo)}.steps-purple{--tblr-steps-color:var(--tblr-purple)}.steps-pink{--tblr-steps-color:var(--tblr-pink)}.steps-red{--tblr-steps-color:var(--tblr-red)}.steps-orange{--tblr-steps-color:var(--tblr-orange)}.steps-yellow{--tblr-steps-color:var(--tblr-yellow)}.steps-lime{--tblr-steps-color:var(--tblr-lime)}.steps-green{--tblr-steps-color:var(--tblr-green)}.steps-teal{--tblr-steps-color:var(--tblr-teal)}.steps-cyan{--tblr-steps-color:var(--tblr-cyan)}.step-item{position:relative;flex:1 1 0;min-height:1rem;margin-top:0;color:inherit;text-align:center;cursor:default;padding-top:calc(var(--tblr-steps-dot-size))}a.step-item{cursor:pointer}a.step-item:hover{color:inherit}.step-item:after,.step-item:before{background:var(--tblr-steps-color)}.step-item:not(:last-child):after{position:absolute;left:50%;width:100%;content:"";transform:translateY(-50%)}.step-item:after{top:calc(var(--tblr-steps-dot-size) * .5);height:var(--tblr-steps-border-width)}.step-item:before{content:"";position:absolute;top:0;left:50%;z-index:1;box-sizing:content-box;display:flex;align-items:center;justify-content:center;border-radius:100rem;transform:translateX(-50%);color:var(--tblr-white);width:var(--tblr-steps-dot-size);height:var(--tblr-steps-dot-size)}.step-item.active{font-weight:var(--tblr-font-weight-bold)}.step-item.active:after{background:var(--tblr-steps-inactive-color)}.step-item.active~.step-item{color:var(--tblr-disabled-color)}.step-item.active~.step-item:after,.step-item.active~.step-item:before{background:var(--tblr-steps-inactive-color)}.steps-counter{--tblr-steps-dot-size:1.5rem;counter-reset:steps}.steps-counter .step-item{counter-increment:steps}.steps-counter .step-item:before{content:counter(steps)}.steps-vertical{--tblr-steps-dot-offset:6px;flex-direction:column}.steps-vertical.steps-counter{--tblr-steps-dot-offset:-2px}.steps-vertical .step-item{text-align:left;padding-top:0;padding-left:calc(var(--tblr-steps-dot-size) + 1rem);min-height:auto}.steps-vertical .step-item:not(:first-child){margin-top:1rem}.steps-vertical .step-item:before{top:var(--tblr-steps-dot-offset);left:0;transform:translate(0,0)}.steps-vertical .step-item:not(:last-child):after{position:absolute;content:"";transform:translateX(-50%);top:var(--tblr-steps-dot-offset);left:calc(var(--tblr-steps-dot-size) * .5);width:var(--tblr-steps-border-width);height:calc(100% + 1rem)}@keyframes status-pulsate-main{40%{transform:scale(1.25,1.25)}60%{transform:scale(1.25,1.25)}}@keyframes status-pulsate-secondary{10%{transform:scale(1,1)}30%{transform:scale(3,3)}80%{transform:scale(3,3)}100%{transform:scale(1,1)}}@keyframes status-pulsate-tertiary{25%{transform:scale(1,1)}80%{transform:scale(3,3);opacity:0}100%{transform:scale(3,3);opacity:0}}.status{--tblr-status-height:1.5rem;--tblr-status-color:#616876;--tblr-status-color-rgb:97,104,118;display:inline-flex;align-items:center;height:var(--tblr-status-height);padding:.25rem .75rem;gap:.5rem;color:var(--tblr-status-color);background:rgba(var(--tblr-status-color-rgb),.1);font-size:.875rem;text-transform:none;letter-spacing:normal;border-radius:100rem;font-weight:var(--tblr-font-weight-medium);line-height:1;margin:0}.status .status-dot{background:var(--tblr-status-color)}.status .icon{font-size:1.25rem}.status-lite{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)!important;background:0 0!important;color:var(--tblr-body-text)!important}.status-primary{--tblr-status-color:#206bc4;--tblr-status-color-rgb:32,107,196}.status-secondary{--tblr-status-color:#616876;--tblr-status-color-rgb:97,104,118}.status-success{--tblr-status-color:#2fb344;--tblr-status-color-rgb:47,179,68}.status-info{--tblr-status-color:#4299e1;--tblr-status-color-rgb:66,153,225}.status-warning{--tblr-status-color:#f76707;--tblr-status-color-rgb:247,103,7}.status-danger{--tblr-status-color:#d63939;--tblr-status-color-rgb:214,57,57}.status-light{--tblr-status-color:#f8fafc;--tblr-status-color-rgb:248,250,252}.status-dark{--tblr-status-color:#1d273b;--tblr-status-color-rgb:29,39,59}.status-muted{--tblr-status-color:#616876;--tblr-status-color-rgb:97,104,118}.status-blue{--tblr-status-color:#206bc4;--tblr-status-color-rgb:32,107,196}.status-azure{--tblr-status-color:#4299e1;--tblr-status-color-rgb:66,153,225}.status-indigo{--tblr-status-color:#4263eb;--tblr-status-color-rgb:66,99,235}.status-purple{--tblr-status-color:#ae3ec9;--tblr-status-color-rgb:174,62,201}.status-pink{--tblr-status-color:#d6336c;--tblr-status-color-rgb:214,51,108}.status-red{--tblr-status-color:#d63939;--tblr-status-color-rgb:214,57,57}.status-orange{--tblr-status-color:#f76707;--tblr-status-color-rgb:247,103,7}.status-yellow{--tblr-status-color:#f59f00;--tblr-status-color-rgb:245,159,0}.status-lime{--tblr-status-color:#74b816;--tblr-status-color-rgb:116,184,22}.status-green{--tblr-status-color:#2fb344;--tblr-status-color-rgb:47,179,68}.status-teal{--tblr-status-color:#0ca678;--tblr-status-color-rgb:12,166,120}.status-cyan{--tblr-status-color:#17a2b8;--tblr-status-color-rgb:23,162,184}.status-facebook{--tblr-status-color:#1877F2;--tblr-status-color-rgb:24,119,242}.status-twitter{--tblr-status-color:#1da1f2;--tblr-status-color-rgb:29,161,242}.status-linkedin{--tblr-status-color:#0a66c2;--tblr-status-color-rgb:10,102,194}.status-google{--tblr-status-color:#dc4e41;--tblr-status-color-rgb:220,78,65}.status-youtube{--tblr-status-color:#ff0000;--tblr-status-color-rgb:255,0,0}.status-vimeo{--tblr-status-color:#1ab7ea;--tblr-status-color-rgb:26,183,234}.status-dribbble{--tblr-status-color:#ea4c89;--tblr-status-color-rgb:234,76,137}.status-github{--tblr-status-color:#181717;--tblr-status-color-rgb:24,23,23}.status-instagram{--tblr-status-color:#e4405f;--tblr-status-color-rgb:228,64,95}.status-pinterest{--tblr-status-color:#bd081c;--tblr-status-color-rgb:189,8,28}.status-vk{--tblr-status-color:#6383a8;--tblr-status-color-rgb:99,131,168}.status-rss{--tblr-status-color:#ffa500;--tblr-status-color-rgb:255,165,0}.status-flickr{--tblr-status-color:#0063dc;--tblr-status-color-rgb:0,99,220}.status-bitbucket{--tblr-status-color:#0052cc;--tblr-status-color-rgb:0,82,204}.status-tabler{--tblr-status-color:#206bc4;--tblr-status-color-rgb:32,107,196}.status-dot{--tblr-status-dot-color:var(--tblr-status-color, #616876);--tblr-status-size:0.5rem;position:relative;display:inline-block;width:var(--tblr-status-size);height:var(--tblr-status-size);background:var(--tblr-status-dot-color);border-radius:100rem}.status-dot-animated:before{content:"";position:absolute;inset:0;z-index:0;background:inherit;border-radius:inherit;opacity:.6;animation:1s linear 2s backwards infinite status-pulsate-tertiary}.status-indicator{--tblr-status-indicator-size:2.5rem;--tblr-status-indicator-color:var(--tblr-status-color, #616876);display:block;position:relative;width:var(--tblr-status-indicator-size);height:var(--tblr-status-indicator-size)}.status-indicator-circle{--tblr-status-circle-size:.75rem;position:absolute;left:50%;top:50%;margin:calc(var(--tblr-status-circle-size)/ -2) 0 0 calc(var(--tblr-status-circle-size)/ -2);width:var(--tblr-status-circle-size);height:var(--tblr-status-circle-size);border-radius:100rem;background:var(--tblr-status-color)}.status-indicator-circle:nth-child(1){z-index:3}.status-indicator-circle:nth-child(2){z-index:2;opacity:.1}.status-indicator-circle:nth-child(3){z-index:1;opacity:.3}.status-indicator-animated .status-indicator-circle:nth-child(1){animation:2s linear 1s infinite backwards status-pulsate-main}.status-indicator-animated .status-indicator-circle:nth-child(2){animation:2s linear 1s infinite backwards status-pulsate-secondary}.status-indicator-animated .status-indicator-circle:nth-child(3){animation:2s linear 1s infinite backwards status-pulsate-tertiary}.switch-icon{display:inline-block;line-height:1;border:0;padding:0;background:0 0;width:1.25rem;height:1.25rem;vertical-align:bottom;position:relative;cursor:pointer}.switch-icon.disabled{pointer-events:none;opacity:.4}.switch-icon:focus{outline:0}.switch-icon svg{display:block;width:100%;height:100%}.switch-icon .switch-icon-a,.switch-icon .switch-icon-b{display:block;width:100%;height:100%}.switch-icon .switch-icon-a{opacity:1}.switch-icon .switch-icon-b{position:absolute;top:0;left:0;opacity:0}.switch-icon.active .switch-icon-a{opacity:0}.switch-icon.active .switch-icon-b{opacity:1}.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:opacity .5s}@media (prefers-reduced-motion:reduce){.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:opacity .5s,transform 0s .5s}@media (prefers-reduced-motion:reduce){.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-b{transform:scale(1.5)}.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:opacity 0s,transform .5s}@media (prefers-reduced-motion:reduce){.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:none}}.switch-icon-scale.active .switch-icon-b{transform:scale(1)}.switch-icon-flip{perspective:10em}.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-style:preserve-3d;transition:opacity 0s .2s,transform .4s ease-in-out}@media (prefers-reduced-motion:reduce){.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{transition:none}}.switch-icon-flip .switch-icon-a{opacity:1;transform:rotateY(0)}.switch-icon-flip .switch-icon-b{opacity:1;transform:rotateY(-180deg)}.switch-icon-flip.active .switch-icon-a{opacity:1;transform:rotateY(180deg)}.switch-icon-flip.active .switch-icon-b{opacity:1;transform:rotateY(0)}.switch-icon-slide-down,.switch-icon-slide-left,.switch-icon-slide-right,.switch-icon-slide-up{overflow:hidden}.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b{transition:opacity .3s,transform .3s}@media (prefers-reduced-motion:reduce){.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b{transition:none}}.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-up .switch-icon-a{transform:translateY(0)}.switch-icon-slide-down .switch-icon-b,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-up .switch-icon-b{transform:translateY(100%)}.switch-icon-slide-down.active .switch-icon-a,.switch-icon-slide-left.active .switch-icon-a,.switch-icon-slide-right.active .switch-icon-a,.switch-icon-slide-up.active .switch-icon-a{transform:translateY(-100%)}.switch-icon-slide-down.active .switch-icon-b,.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-right.active .switch-icon-b,.switch-icon-slide-up.active .switch-icon-b{transform:translateY(0)}.switch-icon-slide-left .switch-icon-a{transform:translateX(0)}.switch-icon-slide-left .switch-icon-b{transform:translateX(100%)}.switch-icon-slide-left.active .switch-icon-a{transform:translateX(-100%)}.switch-icon-slide-left.active .switch-icon-b{transform:translateX(0)}.switch-icon-slide-right .switch-icon-a{transform:translateX(0)}.switch-icon-slide-right .switch-icon-b{transform:translateX(-100%)}.switch-icon-slide-right.active .switch-icon-a{transform:translateX(100%)}.switch-icon-slide-right.active .switch-icon-b{transform:translateX(0)}.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-down .switch-icon-b{transform:translateY(-100%)}.switch-icon-slide-down.active .switch-icon-a{transform:translateY(100%)}.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}@media not print{.theme-dark .table-primary{--tblr-table-color:#f8fafc;--tblr-table-bg:#134076;--tblr-table-border-color:#2a5383;--tblr-table-striped-bg:#1e497d;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#2a5383;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#244e80;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark .table-secondary{--tblr-table-color:#f8fafc;--tblr-table-bg:#3a3e47;--tblr-table-border-color:#4d5159;--tblr-table-striped-bg:#444750;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#4d5159;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#484c55;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark .table-success{--tblr-table-color:#f8fafc;--tblr-table-bg:#1c6b29;--tblr-table-border-color:#32793e;--tblr-table-striped-bg:#277234;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#32793e;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#2d7639;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark .table-info{--tblr-table-color:#f8fafc;--tblr-table-bg:#285c87;--tblr-table-border-color:#3d6c93;--tblr-table-striped-bg:#32648d;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#3d6c93;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#386890;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark .table-warning{--tblr-table-color:#f8fafc;--tblr-table-bg:#943e04;--tblr-table-border-color:#9e511d;--tblr-table-striped-bg:#994710;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#9e511d;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#9c4c17;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark .table-danger{--tblr-table-color:#f8fafc;--tblr-table-bg:#802222;--tblr-table-border-color:#8c3838;--tblr-table-striped-bg:#862d2d;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#8c3838;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#893232;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}}@media not print{@media (prefers-color-scheme:dark){.theme-dark-auto .table-primary{--tblr-table-color:#f8fafc;--tblr-table-bg:#134076;--tblr-table-border-color:#2a5383;--tblr-table-striped-bg:#1e497d;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#2a5383;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#244e80;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark-auto .table-secondary{--tblr-table-color:#f8fafc;--tblr-table-bg:#3a3e47;--tblr-table-border-color:#4d5159;--tblr-table-striped-bg:#444750;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#4d5159;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#484c55;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark-auto .table-success{--tblr-table-color:#f8fafc;--tblr-table-bg:#1c6b29;--tblr-table-border-color:#32793e;--tblr-table-striped-bg:#277234;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#32793e;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#2d7639;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark-auto .table-info{--tblr-table-color:#f8fafc;--tblr-table-bg:#285c87;--tblr-table-border-color:#3d6c93;--tblr-table-striped-bg:#32648d;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#3d6c93;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#386890;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark-auto .table-warning{--tblr-table-color:#f8fafc;--tblr-table-bg:#943e04;--tblr-table-border-color:#9e511d;--tblr-table-striped-bg:#994710;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#9e511d;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#9c4c17;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.theme-dark-auto .table-danger{--tblr-table-color:#f8fafc;--tblr-table-bg:#802222;--tblr-table-border-color:#8c3838;--tblr-table-striped-bg:#862d2d;--tblr-table-striped-color:#f8fafc;--tblr-table-active-bg:#8c3838;--tblr-table-active-color:#f8fafc;--tblr-table-hover-bg:#893232;--tblr-table-hover-color:#f8fafc;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}}}.markdown>table thead th,.table thead th{color:var(--tblr-muted);background:var(--tblr-gray-50);font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);padding-top:.5rem;padding-bottom:.5rem;white-space:nowrap}@media print{.markdown>table thead th,.table thead th{background:0 0}}.table-responsive .markdown>table,.table-responsive .table{margin-bottom:0}.table-responsive+.card-footer{border-top:0}.table-transparent thead th{background:0 0}.table-nowrap>:not(caption)>*>*{white-space:nowrap}.table-vcenter>:not(caption)>*>*{vertical-align:middle}.table-center>:not(caption)>*>*{text-align:center}.td-truncate{max-width:1px;width:100%}.table-mobile{display:block}.table-mobile thead{display:none}.table-mobile tbody,.table-mobile tr{display:flex;flex-direction:column}.table-mobile td{display:block;padding:.75rem .75rem!important;border:none;color:#1d273b!important}.table-mobile td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);content:attr(data-label);display:block}.table-mobile tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile .btn{display:block}@media (max-width:575.98px){.table-mobile-sm{display:block}.table-mobile-sm thead{display:none}.table-mobile-sm tbody,.table-mobile-sm tr{display:flex;flex-direction:column}.table-mobile-sm td{display:block;padding:.75rem .75rem!important;border:none;color:#1d273b!important}.table-mobile-sm td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);content:attr(data-label);display:block}.table-mobile-sm tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-sm .btn{display:block}}@media (max-width:767.98px){.table-mobile-md{display:block}.table-mobile-md thead{display:none}.table-mobile-md tbody,.table-mobile-md tr{display:flex;flex-direction:column}.table-mobile-md td{display:block;padding:.75rem .75rem!important;border:none;color:#1d273b!important}.table-mobile-md td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);content:attr(data-label);display:block}.table-mobile-md tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-md .btn{display:block}}@media (max-width:991.98px){.table-mobile-lg{display:block}.table-mobile-lg thead{display:none}.table-mobile-lg tbody,.table-mobile-lg tr{display:flex;flex-direction:column}.table-mobile-lg td{display:block;padding:.75rem .75rem!important;border:none;color:#1d273b!important}.table-mobile-lg td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);content:attr(data-label);display:block}.table-mobile-lg tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-lg .btn{display:block}}@media (max-width:1199.98px){.table-mobile-xl{display:block}.table-mobile-xl thead{display:none}.table-mobile-xl tbody,.table-mobile-xl tr{display:flex;flex-direction:column}.table-mobile-xl td{display:block;padding:.75rem .75rem!important;border:none;color:#1d273b!important}.table-mobile-xl td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);content:attr(data-label);display:block}.table-mobile-xl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xl .btn{display:block}}@media (max-width:1399.98px){.table-mobile-xxl{display:block}.table-mobile-xxl thead{display:none}.table-mobile-xxl tbody,.table-mobile-xxl tr{display:flex;flex-direction:column}.table-mobile-xxl td{display:block;padding:.75rem .75rem!important;border:none;color:#1d273b!important}.table-mobile-xxl td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);content:attr(data-label);display:block}.table-mobile-xxl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xxl .btn{display:block}}.table-sort{font:inherit;color:inherit;text-transform:inherit;letter-spacing:inherit;border:0;background:inherit;display:block;width:100%;text-align:inherit;transition:color .3s;margin:-.5rem -.75rem;padding:.5rem .75rem}@media (prefers-reduced-motion:reduce){.table-sort{transition:none}}.table-sort.asc,.table-sort.desc,.table-sort:hover{color:#1d273b}.table-sort.asc:after,.table-sort.desc:after,.table-sort:after{content:"";display:inline-flex;width:1rem;height:1rem;vertical-align:bottom;background:url("data:image/svg+xml,") no-repeat center;opacity:.2}.table-sort.asc:after{background:url("data:image/svg+xml,") no-repeat center;opacity:1}.table-sort.desc:after{background:url("data:image/svg+xml,") no-repeat center;opacity:1}.table-borderless thead th{background:0 0}.toast{background:#fff;border:1px var(--tblr-border-style) var(--tblr-border-color-translucent);box-shadow:rgba(29,39,59,.04) 0 2px 4px 0}.toast .toast-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.toast button[data-bs-dismiss=toast]{outline:0}.toast-primary{--tblr-toast-color:#206bc4}.toast-secondary{--tblr-toast-color:#616876}.toast-success{--tblr-toast-color:#2fb344}.toast-info{--tblr-toast-color:#4299e1}.toast-warning{--tblr-toast-color:#f76707}.toast-danger{--tblr-toast-color:#d63939}.toast-light{--tblr-toast-color:#f8fafc}.toast-dark{--tblr-toast-color:#1d273b}.toast-muted{--tblr-toast-color:#616876}.toast-blue{--tblr-toast-color:#206bc4}.toast-azure{--tblr-toast-color:#4299e1}.toast-indigo{--tblr-toast-color:#4263eb}.toast-purple{--tblr-toast-color:#ae3ec9}.toast-pink{--tblr-toast-color:#d6336c}.toast-red{--tblr-toast-color:#d63939}.toast-orange{--tblr-toast-color:#f76707}.toast-yellow{--tblr-toast-color:#f59f00}.toast-lime{--tblr-toast-color:#74b816}.toast-green{--tblr-toast-color:#2fb344}.toast-teal{--tblr-toast-color:#0ca678}.toast-cyan{--tblr-toast-color:#17a2b8}.toast-facebook{--tblr-toast-color:#1877F2}.toast-twitter{--tblr-toast-color:#1da1f2}.toast-linkedin{--tblr-toast-color:#0a66c2}.toast-google{--tblr-toast-color:#dc4e41}.toast-youtube{--tblr-toast-color:#ff0000}.toast-vimeo{--tblr-toast-color:#1ab7ea}.toast-dribbble{--tblr-toast-color:#ea4c89}.toast-github{--tblr-toast-color:#181717}.toast-instagram{--tblr-toast-color:#e4405f}.toast-pinterest{--tblr-toast-color:#bd081c}.toast-vk{--tblr-toast-color:#6383a8}.toast-rss{--tblr-toast-color:#ffa500}.toast-flickr{--tblr-toast-color:#0063dc}.toast-bitbucket{--tblr-toast-color:#0052cc}.toast-tabler{--tblr-toast-color:#206bc4}.toolbar{display:flex;flex-wrap:nowrap;flex-shrink:0;margin:0 -.5rem}.toolbar>*{margin:0 .5rem}.tracking{--tblr-tracking-height:1.5rem;--tblr-tracking-gap-width:0.125rem;--tblr-tracking-block-border-radius:var(--tblr-border-radius);display:flex;gap:var(--tblr-tracking-gap-width)}.tracking-squares{--tblr-tracking-block-border-radius:var(--tblr-border-radius-sm)}.tracking-squares .tracking-block{height:auto}.tracking-squares .tracking-block:before{content:"";display:block;padding-top:100%}.tracking-block{flex:1;border-radius:var(--tblr-tracking-block-border-radius);height:var(--tblr-tracking-height);min-width:.25rem;background:var(--tblr-border-color)}.hr-text{display:flex;align-items:center;margin:2rem 0;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted);height:1px}.hr-text:after,.hr-text:before{flex:1 1 auto;height:1px;background-color:var(--tblr-border-color)}.hr-text:before{content:"";margin-right:.5rem}.hr-text:after{content:"";margin-left:.5rem}.hr-text>:first-child{padding-right:.5rem;padding-left:0;color:var(--tblr-muted)}.hr-text.hr-text-left:before{content:none}.hr-text.hr-text-left>:first-child{padding-right:.5rem;padding-left:.5rem}.hr-text.hr-text-right:before{content:""}.hr-text.hr-text-right:after{content:none}.hr-text.hr-text-right>:first-child{padding-right:0;padding-left:.5rem}.card>.hr-text{margin:0}.hr-text-spaceless{margin:-.5rem 0}.lead{line-height:1.4}a{-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto}.h1 a,.h2 a,.h3 a,.h4 a,.h5 a,.h6 a,h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}.h1 a:hover,.h2 a:hover,.h3 a:hover,.h4 a:hover,.h5 a:hover,.h6 a:hover,h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover{color:inherit}.h1,h1{font-size:var(--tblr-font-size-h1);line-height:var(--tblr-line-height-h1)}.h2,h2{font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h2)}.h3,h3{font-size:var(--tblr-font-size-h3);line-height:var(--tblr-line-height-h3)}.h4,h4{font-size:var(--tblr-font-size-h4);line-height:var(--tblr-line-height-h4)}.h5,h5{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5)}.h6,h6{font-size:var(--tblr-font-size-h6);line-height:var(--tblr-line-height-h6)}.strong,b,strong{font-weight:var(--tblr-font-weight-bold)}blockquote{padding-left:1rem;border-left:2px var(--tblr-border-style) var(--tblr-border-color)}blockquote p{margin-bottom:1rem}blockquote cite{display:block;text-align:right}blockquote cite:before{content:"— "}ol,ul{padding-left:1.5rem}.hr,hr{margin:2rem 0}dl dd:last-child{margin-bottom:0}pre{padding:1rem;background:var(--tblr-bg-surface-dark);color:var(--tblr-light);border-radius:var(--tblr-border-radius)}pre code{background:0 0}code{background:var(--tblr-code-bg);padding:2px 4px;border-radius:var(--tblr-border-radius)}kbd{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);display:inline-block;box-sizing:border-box;max-width:100%;font-size:var(--tblr-font-size-h5);font-weight:var(--tblr-font-weight-medium);line-height:1;vertical-align:baseline}img{max-width:100%}.list-unstyled{margin-left:0}::-moz-selection{background-color:rgba(var(--tblr-primary-rgb),.16)}::selection{background-color:rgba(var(--tblr-primary-rgb),.16)}[class*=" link-"].disabled,[class^=link-].disabled{color:var(--tblr-disabled-color);pointer-events:none}.subheader{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-muted)}.chart{display:block;min-height:10rem}.chart text{font-family:inherit}.chart-sm{height:2.5rem}.chart-lg{height:15rem}.chart-square{height:5.75rem}.chart-sparkline{position:relative;width:4rem;height:2.5rem;line-height:1;min-height:0!important}.chart-sparkline-sm{height:1.5rem}.chart-sparkline-square{width:2.5rem}.chart-sparkline-wide{width:6rem}.chart-sparkline-label{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:.625rem}.chart-sparkline-label .icon{width:1rem;height:1rem;font-size:1rem}.offcanvas-header{border-bottom:var(--tblr-border-width) var(--tblr-border-style) rgba(97,104,118,.16)}.offcanvas-footer{padding:1.5rem 1.5rem}.offcanvas-title{font-size:1rem;font-weight:var(--tblr-font-weight-medium);line-height:1.5rem}.offcanvas-narrow{width:20rem}.bg-white-overlay{color:#fff;background-color:rgba(248,250,252,.24)}.bg-dark-overlay{color:#fff;background-color:rgba(29,39,59,.24)}.bg-cover{background-repeat:no-repeat;background-size:cover;background-position:center}.bg-primary{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-primary-rgb),var(--tblr-bg-opacity))!important}.bg-primary-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-primary-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-primary-rgb),var(--tblr-bg-opacity))!important}.bg-secondary{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-secondary-rgb),var(--tblr-bg-opacity))!important}.bg-secondary-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-secondary-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-secondary-rgb),var(--tblr-bg-opacity))!important}.bg-success{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-success-rgb),var(--tblr-bg-opacity))!important}.bg-success-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-success-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-success-rgb),var(--tblr-bg-opacity))!important}.bg-info{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-info-rgb),var(--tblr-bg-opacity))!important}.bg-info-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-info-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-info-rgb),var(--tblr-bg-opacity))!important}.bg-warning{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-warning-rgb),var(--tblr-bg-opacity))!important}.bg-warning-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-warning-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-warning-rgb),var(--tblr-bg-opacity))!important}.bg-danger{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-danger-rgb),var(--tblr-bg-opacity))!important}.bg-danger-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-danger-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-danger-rgb),var(--tblr-bg-opacity))!important}.bg-light{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-light-rgb),var(--tblr-bg-opacity))!important}.bg-light-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-light-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-light-rgb),var(--tblr-bg-opacity))!important}.bg-dark{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-dark-rgb),var(--tblr-bg-opacity))!important}.bg-dark-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-dark-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-dark-rgb),var(--tblr-bg-opacity))!important}.bg-muted{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-muted-rgb),var(--tblr-bg-opacity))!important}.bg-muted-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-muted-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-muted-rgb),var(--tblr-bg-opacity))!important}.bg-blue{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-blue-rgb),var(--tblr-bg-opacity))!important}.bg-blue-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-blue-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-blue-rgb),var(--tblr-bg-opacity))!important}.bg-azure{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-azure-rgb),var(--tblr-bg-opacity))!important}.bg-azure-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-azure-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-azure-rgb),var(--tblr-bg-opacity))!important}.bg-indigo{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-indigo-rgb),var(--tblr-bg-opacity))!important}.bg-indigo-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-indigo-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-indigo-rgb),var(--tblr-bg-opacity))!important}.bg-purple{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-purple-rgb),var(--tblr-bg-opacity))!important}.bg-purple-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-purple-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-purple-rgb),var(--tblr-bg-opacity))!important}.bg-pink{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-pink-rgb),var(--tblr-bg-opacity))!important}.bg-pink-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-pink-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-pink-rgb),var(--tblr-bg-opacity))!important}.bg-red{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-red-rgb),var(--tblr-bg-opacity))!important}.bg-red-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-red-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-red-rgb),var(--tblr-bg-opacity))!important}.bg-orange{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-orange-rgb),var(--tblr-bg-opacity))!important}.bg-orange-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-orange-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-orange-rgb),var(--tblr-bg-opacity))!important}.bg-yellow{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-yellow-rgb),var(--tblr-bg-opacity))!important}.bg-yellow-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-yellow-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-yellow-rgb),var(--tblr-bg-opacity))!important}.bg-lime{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-lime-rgb),var(--tblr-bg-opacity))!important}.bg-lime-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-lime-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-lime-rgb),var(--tblr-bg-opacity))!important}.bg-green{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-green-rgb),var(--tblr-bg-opacity))!important}.bg-green-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-green-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-green-rgb),var(--tblr-bg-opacity))!important}.bg-teal{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-teal-rgb),var(--tblr-bg-opacity))!important}.bg-teal-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-teal-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-teal-rgb),var(--tblr-bg-opacity))!important}.bg-cyan{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-cyan-rgb),var(--tblr-bg-opacity))!important}.bg-cyan-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-cyan-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-cyan-rgb),var(--tblr-bg-opacity))!important}.bg-facebook{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-facebook-rgb),var(--tblr-bg-opacity))!important}.bg-facebook-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-facebook-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-facebook-rgb),var(--tblr-bg-opacity))!important}.bg-twitter{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-twitter-rgb),var(--tblr-bg-opacity))!important}.bg-twitter-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-twitter-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-twitter-rgb),var(--tblr-bg-opacity))!important}.bg-linkedin{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-bg-opacity))!important}.bg-linkedin-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-linkedin-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-bg-opacity))!important}.bg-google{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-google-rgb),var(--tblr-bg-opacity))!important}.bg-google-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-google-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-google-rgb),var(--tblr-bg-opacity))!important}.bg-youtube{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-youtube-rgb),var(--tblr-bg-opacity))!important}.bg-youtube-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-youtube-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-youtube-rgb),var(--tblr-bg-opacity))!important}.bg-vimeo{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-bg-opacity))!important}.bg-vimeo-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-vimeo-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-bg-opacity))!important}.bg-dribbble{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-bg-opacity))!important}.bg-dribbble-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-dribbble-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-bg-opacity))!important}.bg-github{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-github-rgb),var(--tblr-bg-opacity))!important}.bg-github-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-github-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-github-rgb),var(--tblr-bg-opacity))!important}.bg-instagram{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-instagram-rgb),var(--tblr-bg-opacity))!important}.bg-instagram-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-instagram-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-instagram-rgb),var(--tblr-bg-opacity))!important}.bg-pinterest{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-bg-opacity))!important}.bg-pinterest-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-pinterest-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-bg-opacity))!important}.bg-vk{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-vk-rgb),var(--tblr-bg-opacity))!important}.bg-vk-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-vk-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-vk-rgb),var(--tblr-bg-opacity))!important}.bg-rss{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-rss-rgb),var(--tblr-bg-opacity))!important}.bg-rss-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-rss-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-rss-rgb),var(--tblr-bg-opacity))!important}.bg-flickr{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-flickr-rgb),var(--tblr-bg-opacity))!important}.bg-flickr-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-flickr-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-flickr-rgb),var(--tblr-bg-opacity))!important}.bg-bitbucket{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-bg-opacity))!important}.bg-bitbucket-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-bitbucket-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-bg-opacity))!important}.bg-tabler{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-tabler-rgb),var(--tblr-bg-opacity))!important}.bg-tabler-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-tabler-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-tabler-rgb),var(--tblr-bg-opacity))!important}.bg-white{--tblr-bg-opacity:1;background-color:rgba(var(--tblr-white-rgb),var(--tblr-bg-opacity))!important}.bg-white-lt{--tblr-bg-opacity:.1;--tblr-text-opacity:1;color:rgba(var(--tblr-white-rgb,var(--tblr-text-opacity)))!important;background-color:rgba(var(--tblr-white-rgb),var(--tblr-bg-opacity))!important}.text-primary{--tblr-text-opacity:1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important}.text-primary-fg{color:var(--tblr-primary-fg)!important}.text-secondary{--tblr-text-opacity:1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important}.text-secondary-fg{color:var(--tblr-secondary-fg)!important}.text-success{--tblr-text-opacity:1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important}.text-success-fg{color:var(--tblr-success-fg)!important}.text-info{--tblr-text-opacity:1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important}.text-info-fg{color:var(--tblr-info-fg)!important}.text-warning{--tblr-text-opacity:1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important}.text-warning-fg{color:var(--tblr-warning-fg)!important}.text-danger{--tblr-text-opacity:1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important}.text-danger-fg{color:var(--tblr-danger-fg)!important}.text-light{--tblr-text-opacity:1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important}.text-light-fg{color:var(--tblr-light-fg)!important}.text-dark{--tblr-text-opacity:1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important}.text-dark-fg{color:var(--tblr-dark-fg)!important}.text-muted{--tblr-text-opacity:1;color:rgba(var(--tblr-muted-rgb),var(--tblr-text-opacity))!important}.text-muted-fg{color:var(--tblr-muted-fg)!important}.text-blue{--tblr-text-opacity:1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important}.text-blue-fg{color:var(--tblr-blue-fg)!important}.text-azure{--tblr-text-opacity:1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important}.text-azure-fg{color:var(--tblr-azure-fg)!important}.text-indigo{--tblr-text-opacity:1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important}.text-indigo-fg{color:var(--tblr-indigo-fg)!important}.text-purple{--tblr-text-opacity:1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important}.text-purple-fg{color:var(--tblr-purple-fg)!important}.text-pink{--tblr-text-opacity:1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important}.text-pink-fg{color:var(--tblr-pink-fg)!important}.text-red{--tblr-text-opacity:1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important}.text-red-fg{color:var(--tblr-red-fg)!important}.text-orange{--tblr-text-opacity:1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important}.text-orange-fg{color:var(--tblr-orange-fg)!important}.text-yellow{--tblr-text-opacity:1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important}.text-yellow-fg{color:var(--tblr-yellow-fg)!important}.text-lime{--tblr-text-opacity:1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important}.text-lime-fg{color:var(--tblr-lime-fg)!important}.text-green{--tblr-text-opacity:1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important}.text-green-fg{color:var(--tblr-green-fg)!important}.text-teal{--tblr-text-opacity:1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important}.text-teal-fg{color:var(--tblr-teal-fg)!important}.text-cyan{--tblr-text-opacity:1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important}.text-cyan-fg{color:var(--tblr-cyan-fg)!important}.text-facebook{--tblr-text-opacity:1;color:rgba(var(--tblr-facebook-rgb),var(--tblr-text-opacity))!important}.text-facebook-fg{color:var(--tblr-facebook-fg)!important}.text-twitter{--tblr-text-opacity:1;color:rgba(var(--tblr-twitter-rgb),var(--tblr-text-opacity))!important}.text-twitter-fg{color:var(--tblr-twitter-fg)!important}.text-linkedin{--tblr-text-opacity:1;color:rgba(var(--tblr-linkedin-rgb),var(--tblr-text-opacity))!important}.text-linkedin-fg{color:var(--tblr-linkedin-fg)!important}.text-google{--tblr-text-opacity:1;color:rgba(var(--tblr-google-rgb),var(--tblr-text-opacity))!important}.text-google-fg{color:var(--tblr-google-fg)!important}.text-youtube{--tblr-text-opacity:1;color:rgba(var(--tblr-youtube-rgb),var(--tblr-text-opacity))!important}.text-youtube-fg{color:var(--tblr-youtube-fg)!important}.text-vimeo{--tblr-text-opacity:1;color:rgba(var(--tblr-vimeo-rgb),var(--tblr-text-opacity))!important}.text-vimeo-fg{color:var(--tblr-vimeo-fg)!important}.text-dribbble{--tblr-text-opacity:1;color:rgba(var(--tblr-dribbble-rgb),var(--tblr-text-opacity))!important}.text-dribbble-fg{color:var(--tblr-dribbble-fg)!important}.text-github{--tblr-text-opacity:1;color:rgba(var(--tblr-github-rgb),var(--tblr-text-opacity))!important}.text-github-fg{color:var(--tblr-github-fg)!important}.text-instagram{--tblr-text-opacity:1;color:rgba(var(--tblr-instagram-rgb),var(--tblr-text-opacity))!important}.text-instagram-fg{color:var(--tblr-instagram-fg)!important}.text-pinterest{--tblr-text-opacity:1;color:rgba(var(--tblr-pinterest-rgb),var(--tblr-text-opacity))!important}.text-pinterest-fg{color:var(--tblr-pinterest-fg)!important}.text-vk{--tblr-text-opacity:1;color:rgba(var(--tblr-vk-rgb),var(--tblr-text-opacity))!important}.text-vk-fg{color:var(--tblr-vk-fg)!important}.text-rss{--tblr-text-opacity:1;color:rgba(var(--tblr-rss-rgb),var(--tblr-text-opacity))!important}.text-rss-fg{color:var(--tblr-rss-fg)!important}.text-flickr{--tblr-text-opacity:1;color:rgba(var(--tblr-flickr-rgb),var(--tblr-text-opacity))!important}.text-flickr-fg{color:var(--tblr-flickr-fg)!important}.text-bitbucket{--tblr-text-opacity:1;color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-text-opacity))!important}.text-bitbucket-fg{color:var(--tblr-bitbucket-fg)!important}.text-tabler{--tblr-text-opacity:1;color:rgba(var(--tblr-tabler-rgb),var(--tblr-text-opacity))!important}.text-tabler-fg{color:var(--tblr-tabler-fg)!important}.bg-gray-50{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-50-rgb),var(--tblr-bg-opacity))!important}.text-gray-50-fg{color:#1d273b!important}.bg-gray-100{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-100-rgb),var(--tblr-bg-opacity))!important}.text-gray-100-fg{color:#1d273b!important}.bg-gray-200{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-200-rgb),var(--tblr-bg-opacity))!important}.text-gray-200-fg{color:#1d273b!important}.bg-gray-300{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-300-rgb),var(--tblr-bg-opacity))!important}.text-gray-300-fg{color:#1d273b!important}.bg-gray-400{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-400-rgb),var(--tblr-bg-opacity))!important}.text-gray-400-fg{color:#f8fafc!important}.bg-gray-500{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-500-rgb),var(--tblr-bg-opacity))!important}.text-gray-500-fg{color:#f8fafc!important}.bg-gray-600{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-600-rgb),var(--tblr-bg-opacity))!important}.text-gray-600-fg{color:#f8fafc!important}.bg-gray-700{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-700-rgb),var(--tblr-bg-opacity))!important}.text-gray-700-fg{color:#f8fafc!important}.bg-gray-800{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-800-rgb),var(--tblr-bg-opacity))!important}.text-gray-800-fg{color:#f8fafc!important}.bg-gray-900{--tblr-bg-opacity:.1;background-color:rgba(var(--tblr-gray-900-rgb),var(--tblr-bg-opacity))!important}.text-gray-900-fg{color:#f8fafc!important}.scrollable{overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.scrollable.hover{overflow-y:hidden}.scrollable.hover>*{margin-top:-1px}.scrollable.hover:active,.scrollable.hover:focus,.scrollable.hover:hover{overflow:visible;overflow-y:auto}.touch .scrollable{overflow-y:auto!important}.scroll-x,.scroll-y{overflow:hidden;-webkit-overflow-scrolling:touch}.scroll-y{overflow-y:auto}.scroll-x{overflow-x:auto}.no-scroll{overflow:hidden}.w-0{width:0!important}.h-0{height:0!important}.w-1{width:.25rem!important}.h-1{height:.25rem!important}.w-2{width:.5rem!important}.h-2{height:.5rem!important}.w-3{width:1rem!important}.h-3{height:1rem!important}.w-4{width:2rem!important}.h-4{height:2rem!important}.w-5{width:4rem!important}.h-5{height:4rem!important}.w-auto{width:auto!important}.h-auto{height:auto!important}.w-px{width:1px!important}.h-px{height:1px!important}.w-full{width:100%!important}.h-full{height:100%!important}.opacity-0{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-30{opacity:.3!important}.opacity-35{opacity:.35!important}.opacity-40{opacity:.4!important}.opacity-45{opacity:.45!important}.opacity-50{opacity:.5!important}.opacity-55{opacity:.55!important}.opacity-60{opacity:.6!important}.opacity-65{opacity:.65!important}.opacity-70{opacity:.7!important}.opacity-75{opacity:.75!important}.opacity-80{opacity:.8!important}.opacity-85{opacity:.85!important}.opacity-90{opacity:.9!important}.opacity-95{opacity:.95!important}.opacity-100{opacity:1!important}.hover-shadow-sm:hover{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.hover-shadow:hover{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.hover-shadow-lg:hover{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.hover-shadow-none:hover{box-shadow:none!important}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto} \ No newline at end of file diff --git a/web/static/favicon.ico b/web/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..70906114ead950c1de21de3b8409e3495c9aef6c GIT binary patch literal 4286 zcmc(jTT4_?6o7aBfas~$oUF8HIs2?{t+mftd+%Xv z9e%U38T~Tn2F5lr#_~|Gixr?yzwyCquJs8?bT9^zPc-BQPs4F=m1TpwA}2j5-wdCt zcfeHpD~U#c#mQl4zq(I%mpfWeXOUKslZB;H{_uyI0OE0(8cSaazGVz=q{DZWJ7C~(HAF)Je%q?0 zNKxgR>Cv&)ReoZ|Hd)xJow} zc}O+i$T7DLLE!g*jZGaBAD@ACetVLCMy>xi=U*=EhMDenQubWGhIxGt=5>d$UiCJq zd^nF0@)6+KC9+aex2=o zZ(~C|2BU8p!CkpUuyHL>9RCua*w6KSvhk-oUPEimF20rv8ZOEkm6Ca*{R+WeGHui6pxN{pa!pHnFKiDdA z3}?wo<@~B#Aiulr9ZfmsW;;~#>HYp%dq5g%Gnd!Z@dL}}kHmgGEgLvLE?s|z&HI0$ zkMgKR@az+w{{x=-;_ddY^80PZWFTzh0dXL7W|hsi1R0MS<;3=EGZs7luY@qCmGyt{x`sX GEB^xA@E2qN literal 0 HcmV?d00001 diff --git a/web/static/img/115.jpg b/web/static/img/115.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87457ac1125310907a7d7614cf21d1a9d81a2ccf GIT binary patch literal 34879 zcmeFaXH*m2_xBw{2m*pA2q+MhD!nQ-5s@yv*9Ztm@0}175kYzt1cDR+5s==C(wlTb z@4a_I2;qs>b^Xe^pZmq%=f%C&vu*~$I+^U5Gy5}p&e`XL`Od}Y#Vp{4f{eTj01poj z@B;S(xR~SillHW-005Mf0PFw&fCxYcAOT##l~{0ZO!004@Ns24+z$Yc@89d+;@)cm02DHG>$nmT?sd6b61XIAN#K&eC4ox<|5p;w zv9f>Z;Nfyl^_7FG!#(MjR;~`t_xO0ZdAa#`dHMLb`5p-f3j+RUR{XsD{GzB{C{O76m*eS|6S&dj{2*N&npZ7L`VOpoQC(G?B+k2%e5Q7PtRrM z@_%KJUOIhA;F7>4flC6H1pZCnzq1W~Q6a(K*~b5F9c}|cJp6xh3PRkB$sGUzZXIs! zgd!I2?!U{)cx?aJ;O1Gb;Qed%gd+3Gm4B7#2L7r1#oycio~r@iU5s8#0Hgp!goHps z0wN#~cX1(`-laY>&?eRlSUOquVK@h8m zgfPE2w}2r3@15XXyLOF~gp}s`bsGNrbocrHc)4f!7 z32&*H03SF}^1qJyOvL!K=m(X0|1Oh&sq>p_#J8zwXzwtyu(Ca57ZiH*SXe|<>Y22R ztem`phNhObj;@}**-LW^%U4#`F0O9w9-dy_0dE7}1-%ariH?bli%&!*;<*0%PJ&Vj+9;SuEM*!bN1!s62M%Iezs-u}Vi(eVlD6#d&T zT&DQ9TmSa#fANa~=hv01SMjd`fBS`Z#RK=kr?^URpO5gSq#Dq~>DB}O*F=<0qdph? zxW*`;zDs55+)sR)NpOyN@3(7zdGk&sUQ`uNt=F8%;7vo#i~HK>b5wCWTHV!)rL zwz{cj@aopKy#2#_9bgd0>uII)nW{AiC>vSCj@|== zCNo?)F6BA>L#{9@vkl4B?mWa*174Pqb=}?!Ow(bDi7`q?v!sjY*{WExGn~6@VZOLS zR^PJfZBGVkmxdH=TvSLUds7bMRdt;Rw#piTiO|@%ksl!sDJfO)qydzwSNfk2vZY-K zAKUclBiIs?s~cvTaG+oZABO#m$Svqn-VF=;f~>l-3_T8Nhmc(W!hC2*fsh7)rtT6d zl@rIw87<8x?>}pj0tg92>)-LJX&Zp}9+q$a3@LsZqD}HW{R2QH_4)@X zujFB7VREd#yX8=;g2F0WrmET#0!lzB&VjptH2NQo&dPk@HhKNNOala!L$8UwrBYSS z+A0QWz6)FGd#px?@wLE=Q$Ljyg)qGn3SrU=lev=9NQp*QN=h-w-d?DR~2b;-cEUE%1^aUVU2S3;9vA$MYf+OPLSv1?J0S2wpYvHNrcMKd@ zqS?SMo3ktI@r-;Tqe-OQM(2tv)t+DZy~BU~VZZxH zmxpWo+QLnlDaoS?0Lc4SCgp;Km2$@0*r=82=^*Z?M|+7}$(U$w9}xUtOOL)G-`9`j zLxx)OnJ=@saZ;o@Qe+5s=I5jRNpC*EkM^9enIU_Hukzk-@{4`4BRQso0il1m-wi3v z>*?Ef@l`3#=&Z1mRD`NV%eG7W40(YI9U19+b#KCBt*Iq(L8S5f0upmiBPzHTvJ8CZ zN`7~@@d6-vknbRqAYVJ`+*buQK%aq}j9KiS?jFBCaW+)poO(Re)k0I43eHHwok&@0 zz&hq(#x`dKmHCRN z$%no{VyOc>0som+iL(880gxS{hh;v;riILgJE@~H`r?(yjL6_>yT&CizRgorg~BO; zto!0vEq_UM%{N4|0Y9j==A0s%c|2U2TVAZICe(e8)iG)R>w==vQT-mIR_tRH)G12} zWcRt#S|%hcT%s>TFB&3uAl4;sTd-K3==9(bc|)BflvbTC#tFP1dODju$(AEXuj85` zaU}6n%&lFecI$kY9-h6T-xpMxNAq!>o!xZ_!Z@%HW)f@~_B0*vHRC%a`b@Y*=8^1= zU%vY_>y+AWaTf)9$&IhqOdSEVOi1`#@0B#on&CbH2JM;R3qajEEU&A3>0y~2 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 R1Nc^oD4=};iYTB*|Jh$9k#Yb4 literal 0 HcmV?d00001 diff --git a/web/static/img/aria2.png b/web/static/img/aria2.png new file mode 100644 index 0000000000000000000000000000000000000000..1de5e3d249a7800a038d4386fdb577e510024adc GIT binary patch literal 16151 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 literal 0 HcmV?d00001 diff --git a/web/static/img/bark.webp b/web/static/img/bark.webp new file mode 100644 index 0000000000000000000000000000000000000000..0d6bb2f41b8aac470fb214d6c380600e7e88d13f GIT binary patch literal 1912 zcmV-;2Z#7lNk&F+2LJ$9MM6+kP&il$000080002x0089x09H^qAnXPJ0PrmUodGK5 z0OkNbNhFX&A)z4>t8_3N1cdXqaJM*yYrpQ@z|$+J{zU&_{g3K^+ivgkSD>#^J;MDb z^AE(|dcVj$m;PD*Y3>2~JN@tSuXlKG+!i+2V}@7@L4sMpxqMtkwm_{D9d})^v>e8 zR?Tcw2G$9a*6`08pAGgZ&qSBe+i6Yq@YhenmX1wc|w%WS}NvOkDzsSuYs zezw>hj#rJmQ#a4^x(+AKr)d$C!!qCVd9Dow+q<02dy!pta*6K*7j^NOn-};!+MRbw zmfD)0jQTo0vx0{WX|@f&0{PrMbVcYn2EueR#N5 zu^0$eO`^u~%c!=@wiK-ZjSI()e3>&>$g9BUi zuh3%%h+bSw4`6rN8Hq~G2?Iy%cmI7aJ2*=kq??9gl3UquFTP{v^3oaLl|R}d%B zpYIHUNhmtA1&yGx(0o5K64j@nqdaN_ps6o)x5O8J=WeZp1$B7k{r;EKe3^uy!g*Qn z|4aj_Gyq=>v1lze(PAF3a8&{t5F(XRW~Rka7F?7>pb%q!Ut05xt!3G|Z@gA-0jc-G z<4-QL-@y)}`!LdF#h%^anLEoAW&XP?fE3zTL|fm62KO(02BIvq%$4DR$K9o5=f_>F zCVAiR??%~{j-KkQSX1RQcPRXJ$7Kb%?Y(|FObs-IA&8%W`fIb|r4k9y3deDz#YEb5 z60QLE@c6C9)N&FAfJUz(?cE&{3k-lA8DkehN+(~fwdfXgE06;+UXCO1Z=MJPwt2!1 zR-8+vMtRL)mr~XlHSk;&u#R0Hf41_-mziV<4H11ZRamtMWRe7&`0KM7a9<^V>-QV@9|#lh?@4{;@_th{a*xM$H}p$r_5I@<>&oYT zB15LQZv^$N;^S!UPs^!jE+W1N1O?K{PL>%)1^6`=N0qGx#b)zCNKO$v^Dxz({E){m z4f)}Rv^;TrpnDkPPrW}fcMiRDmSgn>yRVP(E5pg~5_1`KDd5u^Kw$N(<8(0SgZAU|Ew;xq}KQKF!cQj)gj2=Zn&_0qHuvFuaJ=i~NmXLJUc z*g_RNSykWrKnb;I8w_|HyJY3!Yv7}S*hD?j<+9qI8B+Vt!u!v=z4!nDupBY$d19Xh z!HMGVspLGX_j}%ic5RP~rMkEO#H?TXKPsI?ykMV_&j~+7)y!+7b}A48fr3zF4hAvj zFfj6UN~WhbbS(5~6dQLqm5tTM@Yw|;66OvQdos(IsSMFMfB=tfI1{|F4~@-Y<5T)= zBSDz?Kl_u9xHbl$UCHpv8@hH+-9)E45y$;#*pk;E!T&ebug fixing \ No newline at end of file diff --git a/web/static/img/chanify.png b/web/static/img/chanify.png new file mode 100644 index 0000000000000000000000000000000000000000..71934c7dc1f5b0ddc35a297262c7912463ca8c30 GIT binary patch literal 4395 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
    |p@JW( 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 literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/css.png b/web/static/img/filetree/css.png new file mode 100644 index 0000000000000000000000000000000000000000..f907e44b3330e3ed1763e42746a2943234adb94d GIT binary patch literal 618 zcmV-w0+s!VP)Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_mVt2T;nVFm;isxw{@BfTPn&a8}6o`IF(+`CC5)iPGX?Z0sRU zaP19}aF=HJCAq>O#3rn-jIr@~oFvY0_*BXBt$z%lD^OB!rcK-ei9?d$0DtB>g^?1V zSbuZC>W4DZr~By{%&_)4VlTXqe>i_9mwuqh_KY)Bng<++AUIsSMN)mv=F$koQOE4b zS11DV`2`jqAJ^5b_CzWW5gXxJZxP!-Y=D?LE~#PT2JK*wp58hx-bHLkuWzs>M}N^P zbOjwmoWUg(#5B4RQ%6jL)umy!zl?$useJ20#G>;F&2Um%Ze#%@b~V%5?@gMXkMp%i4xEp(9g=7Wt-Ar6I8tVK ztj6j}31<~RwkwD__tqa?okO^U!v7H(>#{_Zn;uMPfM&&s3IgY>%KRS6ztsI}i+SLw z*6K2Va}ohnt<_XI@9TdFYCA0fJ~}613Ii0=z74E>2M#DQ>!fx25C8xG07*qoM6N<$ Ef};c_DF6Tf literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/directory.png b/web/static/img/filetree/directory.png new file mode 100644 index 0000000000000000000000000000000000000000..784e8fa48234f4f64b6922a6758f254ee0ca08ec GIT binary patch literal 537 zcmV+!0_OdRP)x(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zWhkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/file-lock.png b/web/static/img/filetree/file-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..e909cf84dfde9b1eb04d0b40fd5bff1eb7a1325a GIT binary patch literal 614 zcmV-s0-61ZP)j zK~y-)g_BEbQ$ZBRe=~FQ@KH;ARU~3tL=+blv=v>6OII!wU5YOK5`G1tUG!_X6jv5s zD2lJrjkTz4Xr$)0xyj^qX6|v(ByFOme>lvU8P0FcoSCE8QW+Ql41-k#z5`kR#)Vd^ z6+7pG_g?;GtyW8>r>7qQqk!%QOgZO5k|fe-G`hCFzAm*|O;%S|#d|N6N=0U7X8wXG zV9I+h)>=u^RIIgPt(AJcE^!=7wOSSLy)>ImNs>fnXJS**jF&DRUaYN=JtHFt<2iU42CF4iK6fj=cvWw9;f=*k3B5lr9VxM~cy) zK!A5omiYSq7XUvNYFjmNikvQt3)%gFSMZyG&vPrREhi`xzbg%L1%tBztxR5!yLwOo z0aEKwZ24mo2bsKn5|itOMLPlVKS)Q7*kLyu!DT)FK!7ZSV2v@w{zlPyd%CuqVC$Q` zhqT8N?RM@7-V+VwZk>DhV7PGfMt`d-bcW*NABH6he)nQwQvd(}07*qoM6N<$f;s{S ABLDyZ literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/file.png b/web/static/img/filetree/file.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8b1ca0000bc8fa8d0379926736029f8fabe364 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/film.png b/web/static/img/filetree/film.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ce7bb198a3b268bd634d2b26e9b710f3797d37 GIT binary patch literal 653 zcmV;80&@L{P)WO3(`_cf+b25@DJ#zdQm}8GzWtq2-QnZ8W6mB^kfeK5f%S{ zUW%tGMCwrwic~ZrQcG=4f?5bkV+3dRk8hw6bk~y$KX#b!y*J4EJ~>;dRASqrSu;ZpM>?P}K~6AT zWv6Dmq?v&9LdXC(m%WCO6ma_di$R(v$@ad_>@R41N3N5lSJq9@6CGhX84-$%Xrd_6 z;){?{E|Ytt5$S-&Au>t4wDlIxdkfe-a22LMj``McG};r8@{GsRPm*+8fFey6C)@ifDBXVyTw(N@Xd41b45OFg6x_QA zpwLiigyy~cVoPxW^r~C7ZQpr%>1$*HKmv~AY-qJw4;gUecS--wnqslISSS=^KA&Ic n@BK|Onfz#3R%n{$a)0j^sqv5F(1NTL00000NkvXXu0mjf3S}fX literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/flash.png b/web/static/img/filetree/flash.png new file mode 100644 index 0000000000000000000000000000000000000000..5769120b1b6d38019b505c9167498ea199212cc1 GIT binary patch literal 582 zcmV-M0=fN(P)OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/folder_open.png b/web/static/img/filetree/folder_open.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3548352fc4a82e91ebc7e79907565e40aae457 GIT binary patch literal 583 zcmV-N0=WH&P)tH$n+Bzw$Yklv;`N=nc;V( z;&KN-35T@gWRBGYeR_y$`8BZn{9n>tC)YRdy9cbn)8Q%P55|`*)XQ7AP<#e&a6A$G zs{)EE$ezXf)f=5ALOICxp0jR!e;wEEZgZGsRUZ-h>_^9-(AanOoA53^Oy2?&k5kk} z?afPEzOxMFZ*s5?tr|9&QDTtD0JKnEUBuwz(q0E3;No;>T`j*QjDE}-H4^67sukD9 z^-tZq)fps7^kHQIm*y8axDHaac(>L_z>J-M4kBj1UrI?JsT;`QylT2EJnsJT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/java.png b/web/static/img/filetree/java.png new file mode 100644 index 0000000000000000000000000000000000000000..b7bfcd15fb2f7ce658185bd7ef4729815e2f18b9 GIT binary patch literal 633 zcmV-<0*3vGP)DAD_Iw@kR+3LLZX?3 zyhGkEvUzKYKpu0v_u>?yY~y}#nAbh$p6}dm6adQqK)FzXa=E-qP)ntfS|}9Md_I4Y z%jHh8*{qt$WYlyzt)^0`-M<7XmC7CwTlIP!6`0meW$j(o%*9*fiupyDJZx7&n@&K>z*>QCDhTzTp zTlnzwp?s_A3C!nn*-|JJ`k^?T&hB6^z;e07X0ws&YPAxuvwwlMjasdSU@%xy91e#I zzZYAh^udB=a16G~?^>-EC_Ew4q~Q1a4;7oucH0!-LK+*Y)he3JCK`a7P}Mc?vlj7AM;VkzMEhOwnj`hl1MBj6s4Nlz_+^kH@of;eX>V_G&2` Tt35or00000NkvXXu0mjf&s-qj literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/linux.png b/web/static/img/filetree/linux.png new file mode 100644 index 0000000000000000000000000000000000000000..52699bfee0ce434356c6a9576f32fb6633b01866 GIT binary patch literal 668 zcmV;N0%QG&P)Q{U6)pC|tRy7$(5JQ<@7eB8yk=XcNf-aBIe#;8c_B$^=N z{-Iq&o3%O}V4~G($=zcP(LI|+6dq{?rby~MXwJQ*=!bOvl%?k zYY;jP^@M_k03MHL+-9?_3W5MN=moFW3xmPHU=-4Bw;62MrIhg_lwHEsv)V9U4x>+9cG2kIz8fWo`WyMMfz zdg-)p!<(hFR{VYSDJHEJn09O@#)%q0l?GUg9eS2~vKPUtd+=ak5lWLd-jI=;cjEf# zt$1;~?G!t@s+VLwL=P+Ks;E z!Jkh#NeohG;&02OFD7^EYklCE>?a@fNhGaV ftv%qM$TQzJ6;XjO8erVL00000NkvXXu0mjfw}q7O literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/pdf.png b/web/static/img/filetree/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8095e46fa4965700afe1f9d065d8a37b101676 GIT binary patch literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/php.png b/web/static/img/filetree/php.png new file mode 100644 index 0000000000000000000000000000000000000000..7868a25945cd5e5cb7daaca9591927511ca65c0f GIT binary patch literal 538 zcmV+#0_FXQP)vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/picture.png b/web/static/img/filetree/picture.png new file mode 100644 index 0000000000000000000000000000000000000000..4a158fef7e0da8fd19525f574f2c4966443866cf GIT binary patch literal 606 zcmV-k0-^nhP)Q2rnAt>LM%-F zK|rtwgcU)}7x~z1Hrcs5bH*ZO$!>xO8K#?==bZPQ_ecnV>#P`H`QzGaRhd62G_&rC zTLU$c7_x*nFP_dW#Q+*);mMHE?j)HexK784D4x9l_tfpz2$@1y}9rkF+ zI+J5NMWeZyObc!d+rUc=>D+uOdAOg#%+Ej6h+wn5^xPmVVH*Eu446Y0A_@ zo$rlds-+sL10DbHU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!500006nP)PbXFR5;6x zQ`<|^Q5@e>|3Fq06ckj13SKAzrBX7=2LmNa=VjAGbC_kBmo!b(h0(lh&dtlb&FNfD zmuquN(K1t)x?D|-M01+g{cLIqvEiq)K|Q2K51*IA`CQKDe7`gRw4E?o66yPi8&Nn? z6l%~H1nUQ%T@&i^1O5KKw~aW)k2+%HG368DWXx)cVb)1u?vucz;=oXT3q3jhU%Im| z1?(s=#*a)g@)(;l>H@5fX<;>n14d_9M|`nnP-6AN3z#%q4DzF(Nk5nWM_|14<{lEc zYPuy4KilYl*ag-mA8dVe2Tbuq#03kAEX>O@@Lksg>YW6tl(V+B2dCW}0wgkfx|Qv4 z-D>azy5k)pmaZ6BhrO`cMMsS?2x;x!C{kX=N`E6pB`Ii0bgLj_hNq!8%(hX_#U?!j zKiGk=Hh5$0c^KwfGl^?D=47dOtiAw2KNAm$$b9o7%%}<>OK>*QNXr%9w1k|LfQ{U2 zSbTi2+))I}Pzx-B&9LZXSZvF~o2CeGlzvc4uVc3ME*4%1(7-xD(S|uUCaD1_sK#7S ztY9n_un1WWgXlK28Rs!v7K;_~=D2b`P734*5Qt!^h`~~a5OuM~Hfisl25mar^a_}} zg_v*2Bt^;WEyLcAGWiUsw{`FkNI_Ti5|L(1@j^*TA*!PfgVy)tDpxOv#%F0dOfNa0 zdc|1jYs3&aBQ0Zq#{l)Z8sgGaTq&(WaY+Uil^l#q(oh+BaNO|=WH5X?GktSNWOaL* z*ZNp}GN_(f2a)O)VOE@kDJ~t8MZuVBOvi$ni}tLGC}Zpk**1wJva900hs{igrph=+ z+^OPVd@W&MNyEpqoQ;kge+VO-3U?f3JDTsf%0@_u%bjJIsY%3=wv>=dpyM%#>wcRc z+$m+(U9dwMf67h5I&QPOO-M5_z-8e1J$HL#g&=&d>pz$2H|k=JCX$xdMNxZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/script.png b/web/static/img/filetree/script.png new file mode 100644 index 0000000000000000000000000000000000000000..63fe6ceff5bfcedb9670279d4bb8d25807f6ecee GIT binary patch literal 859 zcmV-h1El5>jf6w4x#gTU%_MMNlkNp$oSbvBp&uHw9M;u0-4@=t5BI zP6Hx#-C_{5RMJ z0_P+Xkumexn8%)S+Y)#l(gR;YJP<6#1-=jjK0LONWPdJQIR8uK1HpvVIxBIQ2ztt+ zqoEx_X9S%QGMe=~(k#sebCL-an)%CR%a7YtUOQUgv+G>~?N~XSWhx=? z@$fx}0MB;$`JWcQ-Re{XV~5|{DvU(#*+NF*g)j^qk#b~G9_O!i*y&mZVZ=a3;Go(K z`DkskYn56Nhu+k@1Ke*uY|x zI&k6j$JfNe_a{GH%=n2rZOz$Z8R9V?Pe36hIk}jo+A-`;dt9vyvBu#Xm@veu&@v`| zzt%mwc_$nd0-sMVx2d)b0!MqGxmfCumx7yB#nIUWvA{!HOMfslMyW1iV&nY>zxwyj z8^JfLN|kT z4m^Q1mhO(_r4w@`V?H=YNkOf(i&bHT3Auc3bryK1_{hDSetLoLN{VLB^78ULiNFy^ zkUqqG$fjVkJj5tfWkOn|P5`HVEp5@-mGnc0wvJGHC=+39MC2TWT#i?t*~fNch*he_ zgtS^8dH$(KlW)EF1b4Fzv~?&0IQaNdg;W5&{t&Bmg9&N1-rBBr_;Rg8ekw^mn;@T# zlS{|Rq+-Nlg18i%UY;i|q1NnSwf>I@85#4U4002ovPDHLkV1mEDi4_0< literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/spinner.gif b/web/static/img/filetree/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..85b99d46b9911ba53a792d716d9f688f3bb3c784 GIT binary patch literal 2530 zcmb8xdrVVT90%}oAH9#>bK6p?cF>G=h0@JhTLdf!(gIdN1QeV+L;)2XD9^zNN@xod zwcvQjRvj8}y3J)yFv=3A2@i*l5Fc|hs2f3R;^QAN{$aL%*eO}IEP(~izxV$0$@lmB zp0hT=YKq8{00}@xHO(cjNl%Njq^=3k8whNA8mRstISPn@&imc_Tf_3@%d4xaj~qF2 z`t<3uXU|@|c=5`WE2E>Mw{G3KfB*i(#Kf~_&tAQH_4e)C>6t?woVxLBCtLOMhuB(t zGPLP@xf$T%5Zyz3iOuKI^?SO*zNFJ?wrL@=YKNznIpw!L(PPjKYQ7%}eBCama_c91pIJ1~(b1Kal`fZSz8V+OJY|r^QHxE6+WMoDB(^~{XdW=!#+uo_ zaF>U{k0Hho~yN%NrSyV`soxiBvd>cj#}5&$KDA)3{S^?ffCPkeDi5Vo>T8sy}Wj_Hf}N$J0Hz& zv|)_<-f+~-Hi-jgzIkG5vY*T|>7-8J0U*@$d8~ScFqA)f4R7yaDBs3j(<2>@V?*ZD zy6{Vy+~KLc_m5He=9(fsy~0c&4a-*{&i)i(02j`@8?In8dBM!Y(Znu4jtn@VMj|y5 zrTNa5ki}vtEiGN(#07>Rk#HaVI5ZB4@@yk%765mBN(yieTXgm{oK}vXn!h0oZG3gj;>>W?MbZnG6Q_cX~h&<^+R)8g9 zSd!4lZEm4K#ma0{aTpMHv%wr`1VF@rrKl5H7Hyn$;=;nh3JVMEcKbqhXnqO(3z}-# zu=v1OV7q%OY`*dVI>Y}97i4s2yl$S zmSto?fO|=u8h;vSPKY2zqaEs;LlhJgv~%aqwzjtUie_4FUNiT>r-& zOO#{4cBb6f^ zov;AUp?UAne>@_GHz5+(221Xlve$OHK)tvvi!~l<%)zr4PhU@ z(CY^us$O5!${6Pje5gy?*WtA2j>{<;$_PvVQNKa&69IX)a|Fw5>C&=WQ6s37gabVh SjHs`-`=fdj^ILtus=om5Wbpz3 literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/txt.png b/web/static/img/filetree/txt.png new file mode 100644 index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MK^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ literal 0 HcmV?d00001 diff --git a/web/static/img/filetree/zip.png b/web/static/img/filetree/zip.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4bbccdf1643f4ff5022fbc59b82546e259317e GIT binary patch literal 386 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
    %HqMX7|yh_e+2vd9oVCpEq`i2IQfsO6CezERH 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 literal 0 HcmV?d00001 diff --git a/web/static/img/icon-imdb.png b/web/static/img/icon-imdb.png new file mode 100644 index 0000000000000000000000000000000000000000..f50d3808e177add04cd8b3397d8736f6d5d4117c GIT binary patch literal 1325 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%0DFHs=y`z_j*G&$*opBz4tFv;n+A zmw9enBpxTHUrVDLKKov}&Lr;W=0C2qtE`#SuLX06@>h{((+x}u2mBy2f{h^h1uKsd zjduFd-(*_i_hhY~f~i_Du|R;Hq##!5(M%_K^nBcX#z#828#~x!q)@-MKU!F@pi3qw zBRuSf!?}*LyF%y_V?s7H?b-w<>kgR}^oyB4&z(+OKr!QV{&tfHd;v`JxdWR|XY9Eg zerQv`9!Q-?bGXc@aO?S>2MDB>Td}`)QM_&2!&8GJ|_eQpvy>5J}cci2>EQ$n%txOhakZ21P16LIH2B9TZ!da~F69c8~Y72>A zd>jmgfr0+4bg{adWBljjh^elS`iwi4uo}V(t}|nGBww>HtBaIGt8HT&K~01OkxCDr z)z0mii`m&<*?5+lvT60_XK2|H(H=zt;FAhCneeWwBhebZcWIdlZg+BgI8%^2W zY=k>NEkcU~eQe_*KJIPY00d#ebe9~96fVEH4e@Y;sbZ3zpMNP9n?5tZIOjQ9b?$YO zi6R(f@Gw0qgJ0Uh$}P`v+&YXjKz$z3nX9?|Ghcc?AtULFDR%nj`MVasz-EmM zqNpauqso&g;b-i=+EweMc)Su@;>7_Ayx7SK;R!OVi@exVeisg3;{c$O^JsDkg&*&R z-w@)L(JmZsvWtfz=$M<5N8pjT(6NL#g zzOU1>w~tp{@L$(;-hACLewq@q3f>l2)j9tey1;|rT*kQf1mbUZfHN9c57_tA3P_fP zGbPrJuXNz?(ylc%ECe6a1D^nRUZudShN???!TsEVknC0DTb&*O2Cp)yd8)JRjs@SS z@!y;mWS;Y^<1xf$6oOR{Af}E8Y}97H5y{6E&G-!rCDDwttoy0&zo>d`fNsfKtGSli zFU;lntp>~#RD?WBi%$`F%q$)qv}E1}UFuknTP~1ISqc=UiJ`K~rfB-8F4Hvn(7YM1& zb^Io*RJfR#k_Z=hKD%A_)c}2Roq_Z-WX=bIv2=xWz9oZZt2)QvBX0SGJ#4R{u1*Ll zu|61&pO4%vsn8Nm=UI59pbF)bazbe5bkstWc%jgGE%6RSrBoqE(TbDkAQ>J#HcoCZZlUI@x^7S~zaWm_f`K74{2fQuEKT0w_?@b zC-Z3uAp7}LLfKs%%s!QS~ zIk5S(T$U(xbC3s%M1I_4qyD+@ke-gJN6sQ{tdNth9eOFxJe1LWCu}3j(dA*2 zh6*kvG^Jh0l;#+i^V%mgKMG548A-Y0K4>oP!2BMeF(~!;x2;EG(CZbkS zV*%XO2L9*hT=GBw{G#>Xzw+B6YGAzvnbc}PaK1gbO$huV?s4$_EVlCTFZFRp)c|(M zmT}>1(4{Zs|6GW^+KM{e!ovwCIdHewnF7{-0U&bRl?8EA=|j SY~tUap|*y>y+(D%g#Q6uFz0aq literal 0 HcmV?d00001 diff --git a/web/static/img/icons/144.png b/web/static/img/icons/144.png new file mode 100644 index 0000000000000000000000000000000000000000..1abdb14bce7247c73810baa2b6925270e6b64da3 GIT binary patch literal 6226 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 literal 0 HcmV?d00001 diff --git a/web/static/img/icons/152.png b/web/static/img/icons/152.png new file mode 100644 index 0000000000000000000000000000000000000000..fca6f4f378750caeda47b9c2b366bc4870b3f8fe GIT binary patch literal 6562 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 IVjcE>0EtBcKL7v# literal 0 HcmV?d00001 diff --git a/web/static/img/icons/172.png b/web/static/img/icons/172.png new file mode 100644 index 0000000000000000000000000000000000000000..f36a9c2a17c0a30343064a97d03855cf476e76a0 GIT binary patch literal 7635 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 A^8f$< literal 0 HcmV?d00001 diff --git a/web/static/img/icons/180.png b/web/static/img/icons/180.png new file mode 100644 index 0000000000000000000000000000000000000000..c56c38017e42626cba759ca49d246b2b2e3f874a GIT binary patch literal 8156 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 literal 0 HcmV?d00001 diff --git a/web/static/img/icons/196.png b/web/static/img/icons/196.png new file mode 100644 index 0000000000000000000000000000000000000000..695d25a2a06e40bde4e6d2c1a9479e58750869de GIT binary patch literal 9100 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 literal 0 HcmV?d00001 diff --git a/web/static/img/icons/196_ALT.png b/web/static/img/icons/196_ALT.png new file mode 100644 index 0000000000000000000000000000000000000000..90079ad054f64a8e38ca21f8022564c768562156 GIT binary patch literal 5328 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

    iF-hQo2sQpcz0TQOPDv9U3w z_HIl`YXGmC#0R(I7r)mfU+eQey{Bn1ylGFA)<*(f4v3R@>db9VGzIOW?5ndUf~G~W z^(C=)jUM6iC9>)$#Z$h5ghg-w@s7!;jZRHP+An2|5bFX z#^TKF)%RQ80py+XcWoPdT4jsC3n;^KNmgES#)T#`!J}X z>j!uhI6dk7Eu_T&EV9F8xn=t{0hj|OF%5v!&;XSS4Z>BO-;r&2d4SD zVWX?}#C{(~9)}O%AMs{uuRK%4P~{)iaa_2)=t{ef5>pIRa zP0fVRm&mg*$#>UfaA!i^%WXsv{(vjmgR;tholoA4=H>1WT^ML14Qfuc^$Jkwos?O< z$78yS-AJx$-L$Tob~d-2YfP6hXwDy8HGTRrsO&cN9*bb3DO zsBN`jIc&E$_1p9BO7i>%QPtgsxWOk!U55=rAmx+j&NPCbfU4H2Mp3e81&tW{^$%?p zs1aBFx3-sPOT#}KDdHy{+1@k5SgaMT&CB>C-m$*s-In_K+L6+&Fp+wlzC z;E{w~Z!vu0-z%1P8@|Eg@Dvsl&;Zw&sc{StHx!B3BxATbYPV~47)aQPVd&nV;Zyy0 z0v`lx-2<@&85go}djJ1ec&V%EzO!nw4`ua^b`Z;)V62k7SH<9#)G#JPUIIg|_X-$; z5;$XHsNjYf4a1ZASN~ywB}bNakryK05XLTvA(2IHzrCa3n;H->?Y(-TFp?8=CpkQk zErdTq@mELCVN8V063GVM*X^2DeLfn@J*qcaQ;z?dST;^h2^0`$ri^>^+Qd*Gtat-6 z6188u-^@Ty&r57*WVq5YCUbyW`g9{L&hGALFX5B64cV19vb`8HUi6%I`Y;NG8eD%U z`6u-4O=liE?nV znJ1|KvEV67F(Muc_krU)dfE=M9R|qMhWQ|8EjbQ%5R9jN$2V8UcC5h*CZrsvL+%)b zrB1`skKg}^w7$k24kWOtaxBOUNSOXm;I=%Te?X7MyIyo^!rnyPd~EiVSntux*F{MO zzICZV@bEO2fuSgq&|i&H{95Wr4pf3{Mi&l zc_SAkig&IdVITig%uH3Q_tTybfcM_p51tm=dE$x=9pB$1c8E5)1(o(r`)O^CK+G~Eg^xFm(#3a090-~n@D5nmc4xn%WF zFy7$;&T==`1XianenkaR3EPY+v_9v(OTX&ZK8$v~qIz0V0i`LSL_SEc!`!F}DfNC^`*x9lM5RL_6(O_|J^DD@ly+f4FbZBQreS zBSV}X9XM@pEWG_=mLcpT5$0LfQdKwRNZs>iSRYMyhRO}j(cj;H%$bw&l6k2E8Zd>H z6@;+^CsLMk@UPF2?OrK(e{3bEgp1?PSGY4&bm}wS?TXj|puP|1ZK`b8!3i3tK33*e zo^lyyGoINaJs~WGp5YW)DeE%`q80j{`xLhJN`3fX^f!nFB~A3f&kH0*X8n@kgjB-k zU%o>Wbx z<@E!*VlTrtDg<+lRTrdJKR*}+03uh1C{b0Db;IwVeE>04_3Y^FW~Ky5*6NX}Kf`^= zmzgg=WR;7|Bw^8O=MKvgDTjzR?5YDnzebo|J-@&)XY2-O6OX+de?0PL{tG=2`Yg=8 zMf=TB$9BdLg>UG9l#X^GR&shZL|GTasZqnM5ak#*$Z8O+<;p0RYP%4AUX%wbD)%X) zaH@Rnn$JLfrKR%Mr0e^Sq9C{zWx}?>dN0~&v8hvJeMrUs`+BK$$!#MW0iNfVOn2sN zZ|r~S6D#8xx*<|`CjRO0hsnbA_sxJypKZQ^{!*UiV^)N-MNVOmni%91)VI<;QN2k2m58+vwNGYp-oOQ-c=q^GUxq zSDvoJ`<>Hr+i7DnMO=zYw|Fvd+k|vJmi7`!@|7;y(%~veqX#lcHA=m}Coo3sS$neZ zNA~xk%x0im){q6drr;xh^D+rHr?ZeZ!L!-agnjaH@gVwM`!$Fth~Hft^JBd*{AYxF z!|v)^>qF+cVPTD_u*cSxg;Q=sQg`iRjbYTUW@E{BZEh#rl+D(Dx3w3CxopU9FH83` z4NPhHaCUBD!o>X23SdP$^;pax`J|2;eK7=!o`{i*R-gV?DH>f2imP)l zgLWs|ZFz8KiUiANf@|(`g8J%ISfhe6B5b(V&hpxY8u06yfv+UuOka?2X$^?!f1tCK zxJe0}ko0$5NDf;~8So|6LjsmDYSNx?n?zhWxR z-`*pb(}00_F~z*Q`eL3ECw+ueMak*Xop<^+!~)U^v>YKUBOPCX@quvPhUSVKu8hZ} z4h!(MZ$tctX^OI5Kt)=|DKDbOOh7DSYu@j%oVcGZk9{~HL zFaNHFq^9pm7AC3NXGIKdVWDb4ns6gi=%Cz7m5@i+4t3+)89;Pxgk+E%a-YhaXYqhb?P%vNK>j$mtExX{J6*Ly}O{1ZTGW4Kya?&Bne~m2kH$r@Q)$q zz5e(iH^|iRhCk(7;~ho96-Fu9fQIZ$X`#2QKNXmk_hDR&0lm>q)aaaF(i+LUfno|v zHfb03${~O+tj!@j-`Yn4&Ll!CbpQNb`yMz2&TJpIib0;u(Qj}Z0{e|}T(CHSFGg}v zLFfoo2!(c-MOE#$FF)xy83U}`NaB9$|FEgkFqs^}C`~Ciz4+jmcolf!N_xDtscSGily-g9h=*C zQ#yPyqz>`TD=k+oDhd1XdY@TTUf}k?PxhyE=$}W!X`8!1KJwo`*#++@hd(VrH*Z2kB7_a|ymDTf<8C7}r+~Wa;jFza+ zxEv@pNq8&nvzgYMJ)9r?%Re*x-t&$DwzHr6tk%bfKOg7+GEWK2(?^iaButSslp14M zg_>R8c+hA1q2w;rm_N=-JXox;Cpvj62;LzH^*G9S-tF{Pn_rZq`5rRr^9u|&hXC@w zB$^4_Lb?f7Wl`Yns$z0aC=DhyWKR60QQxzegt9g>Id9t}`^*Yq+OXe;91l{vbDSBH zg#hNMna3_{nhPKOsxvp(DOTnna$fEV-e3bz#y?pZqg1Vtmmzq=M9}qVWJ8{0ZE8#{ z2s}cGBGa96BKjguz<4bLElGXv!xjZ8EI1NGq5mY;Lz0Gw@yYi4lmIagb0o_-{C?cr#DVlIm5`o!qy~pX863zY-KQ8%g~FuABlLYdWFy5ts=1H90ny&UKN*8!Icj& zFBQRUY#%QteUZv7fbXk=e4Wdx_xMm+&iqQ>=bbF?%Ya?-AOB`@)_~%;F;Z@upb0rl z+(xup&&i;Os8{l^>%#!*jsA1Hw)?mE+SM%LS73>t^1po}BiGp6#+3Axgn##r152(d z+SE3`zDzE5EhN|>`L9k``D+uf#cHH@)Utpq`}Rm<|DoWM%ceUl*6Y|RSp(7LK9&v* zszkl34>T|7{P>Wej&p=ZyUP!%4-RN7FCBb)R@Z*WkcPwRqB%n9(U%UHI=IrKOY?S_ z%wmv=Z79+WiJeoWF4AKKJWwd@aN+mZvx}7bz3jv%Di_C(jsAJA$y&6p3}zfoZTe((1Ww@1gDSLno)6U-mG-3(3CTXem_Z&&1tswRTr%`U~_2NUm1t}elKGxY4`Cng-_Pr%+2l843qA5(;Thd5iBYR@aZ*%!bca&hVvI#EO*@eN~wxza73v z%iDW(@FpR4WphXr;a^wR^%<0`t9UlbO>3KL!WNja>x6TJ>i3?+i|WT{X3B>RkVf~H z^X+8p=DA?sx};H}sSqcz0;0McJthjfiPx;NW)%`eyGwTX!ksT3Ike%7lbR__WbYc( zF`)_`6!YyTydKd~K`(m+>3rJ~mNgGm+)Co+^{0`eZ<_XjKZa zKp7hh2o+W(7=>g(RbM)dKKYLhCq(n59#WL#kFyj{Fcy=G`tX6S~O zddl}uQn#|GPOq}t)65s$k94+&UJj1;_p5IS=f(N-Yl-NsA#=nd47zJXhE9v)&YA`& z1wE?syD>aFp0M*mOc7TNoc0twt+;-gkz==$#BrLWrQhc5IZ*5=8v2=x_ueMmM2*q1 zn#z}s{8Iw`{_A1cUVkRNr+Td7YL|ikl2&6RdN0Km_Xb%QN10|x`D-Ww5$jj$fASQM zy90GthJ+oM+68wKC|Go%k#P!$zG6!}f;u4RCIGG*v9Y&H`ir6b_A*3q2i zTa?=@uFgaohV*ca(%Ao(t2{!)mj(Bzp$7lhU0^f(Oc@c$Ag# zs)r%;K_~fQVA1^^ky2ejBYfq3#C%yhhfxW*`)B#B#B6?PrOGMylaiA-KB>8k&Wgd3 z6>SKqBo+jzF&q9iOts_(k1OK69h#oU3mi~{WAFWafRzcduM?M?4$;L{B$v!80usy^ znWL{nWS}*kVspsfE!C9~1PcG;ue2y#tBXT)ciuo6<~S~Dv?^act0~H3zQIR7yRvu_ zlsI`gs(Ho<7YvwJ6cq-c==wU``toj$zi8!m7ABc}7LJ=S@7BctjSZOb+)av>?5V+y-wLiU(1!R_T??F+1+G)A^_8m?GIAjbj~^S}JD8 zx|42W`O5zx|8!TsR5=|Wk^pMt+FUcJ?2)ub+TxNeYXrKIVQA7p zvwCYp1#NjS;91|dkX2z|1@Yrp!Mw5$Lod67*WIJ0Ur-u6vY@lIA8`_W?>lEzQTw@r zufiu6%n>H^m%Nem702g#&jT@bXn|g7tnUEp1Zt$o8h4j_sO&jjT$3DoSi~c{<1gh_3B+bqkp3V8X{}Ph4m4#H<7Bm3Vz3?`cI-K%a2EcUmcEQ%Zy4XaMsxc zKK9PVPza@(87WCe{t;sK&(;*da4A8;%fQ1Xda1hyGg~zY?lUcW57K08Q;6TWzP?UW zzKA@3^IhM=0^Y@*ogh$xqXnXALWlLgc6B|HyvH+Z{A8$WN&%ppNN>o`HZ!NzQ*oYF z;>$~8-oE$NoSgWi=T{lo*>>D}RVB@CaQ%qSY;e9{>bgmd&y%+1Bl?qAlFmR&LhNCE{EG~|)v%t* zmfV5?Y37(d27Quw)zVXv2-cUVvwfrM8VHLubsYtlrb8)sH)q;oBLa7uY!q?-s6%(a z!s9{zSE@^=y~4_(z=sH&yT@9HQ0-xnji%|`^$Uau@(HVkZNF+*&hUuQ6Z3fSQtU}X ztQ4h8mi-%kT-ll~=pgz9{q!Jhj5!}0ixfYVd-6q4VZne&oqWVpe%1^LNuY;n z%BQ8wto2!6jd!?)M%@S`4@SeY~|&rwE8s z1)CT$we*$na*q2Q#*ioNyvKHsC!cd_Bx?oM%BCfMkRq>0R0r>A+F{EWD#1}XnmeTi z%;I-}!g-rCR)wqde)oht-VwV~TXm5M=RsnlF&oUmuSAi2)k^E^xIR!7&w@=hAq`u? z?5VyAn@yr2TUD?JrsR1R>)I<5H`^X`IhAeDrrOziqBnmCrMhT@-D}?Y1lK?1`T3c6 zL6|=+n}gdQW5Um^+>D#Xc#a=7O@EU_o~G#xY>tUbzN89Y9!Rn3 zDJUXdsz*O~t=)J?XRJEMRJa{FYAFj+R|sR8k}$7=73HylFZ$f3L_JO(p}H~Jr1e-r z*v6*;O2rCBQTyVo`EzMD&FK6Bf00lo-gTgMf&p`43@$x4e5f9FQMZLxGYvI# zLJ*bhubk9nnCM(y#wyg^73dPA8%VszjwG#EyaR=u#@)BA+k)knKsKWF*AO1DbI)Ka z3_^YY{e@R0$usfs@j22X`9ypD+((V8T{+DInJbC;1BC?F8%f*AYVen}q?uJ`g0GeN zK>%a#jk%eF;!&;g8rjNI($&GIQQZ_!-_In`f!)ugRa4n*bYVTpM=Cp{C$yRGUinK- z@b%HA@MvnjHgQDzQC;O!LwMNm@<~8plp{?Rsi}M{J1A;%iqnGOCNy=vPR6g+{R?x{M-D}n*R8znppgD}Ce7DHbpzfFyc!+z#>PI(b(VTVS88H+8u&5hK>XfU~sWadpI9FM3ZOHiRflV~&lk~N^ zYksP~s7tm=gH%nu>z1AAOONsP!lfxD&j#0bo>mMADJFiRlM#U9pc21+QV-tZQn}&G z`!%xh7V8(TJ?cVx{9C!xG04K_eT%qpu-0(YOG&+n$a8Lv%TcKy9tuP)2q`Z&f)hyO zrY_N!5MQ0H;e=V~(i&opw+r&PGtp-c9Ifrw37K3;`@4OnDs&S^5O=pgYjtWK{T=Y0 z@!Kbt`|5$xXK85QDDJhn6WFx-PChS@34omRjw;u_z$nY{4#R(%s02J=Ux?a4k~YT! znZVTjXU;07~@7|@vWS#5)y#B@DWupxB)9GU+Ew0sg9boMS} z&vAM5e(W!FNm{F3XAvmZv%Z>2rA$^(gxD+_;Zrr%gsukZ%|uUrH;&LIkrn~xBAy#>k5i> zAPUQ`^5+ls;NXsndsIeqR;I;s->~tgyn4@E9zDb4x^v<_8=q@HXaYxTl8xkda<*!X zBA*pr$J!y22f}|5ZDdP1$B6_IyhU>xiTu$W<$hZr^iE{7?#sv^YpN58cS2Eqb`b>W zeRtGwLx2LfveuQ%aathasxm<~mi6(B+ZuAgxsYpC_&a@~&gOjn^LGN0h_v`XW+7Pu zraOn9wu`aJvo#KuW$}Zw!A<*ol9&8a!&BQ2@{Zr1XkEXe(%?m{vA(Tv27~QVTnqqG zS(<30^=@{Io1qiWPMP7JnW&Oacd+GP{rVd@_OT(7s6)nt(0HhsvHauT``KR?0~V-= zH-_#i5gbj@f^N>2+fsm16`(br=D8-__6)w<@?Ktqxe7L{G~L*{I;R7w5*q@LqJ|F5 zWCU-RX0Uon6Cd;VO`UYsafaPoLuA_^wz~^<)!L@4YgSBBD$_uq%2&r?J)y+|=&70BY|mz0@7DsD|@OxJ6Ha;GOp@c4-EWcvas07@RiGc^R ztDYDSGMkdTL?*w;?lKWkM)5|~nvV@F9^>H_NF=3JmE~ItWeaK*djRz9Za%m7;p@+Y z<%4ogPfs6Jr6?}xl(!FE`iW>H%3S!bR?6HH9o$MBsa|W#s@7GRo|bPZW%+1bskeCD zl`)_Etvv6*76-0~;)>et z#V^JOqxm)ZK8wkd2*Mzhz!B10Rn54iM=oEv?n1=7TV4qF-uPVUz?n-Ur9`v~MT#ILV zQECIN9x=R5hJ19~M=>l)Mru>E`W^grwB`{9;_Z=xSIH1?D@y^`wGr#e?KF1bf{rQeUHozibax zD__)FBOdv_bD}O-1#|LRuMjJwJrGmoBkJ2X!j5|6!wx9Lo*pt7$Yef{nkC=X=QxXU zl`<@2O3B&^ovm&bf;49$y5q9XhQ$Kk@3bD!LrYor1=W(5b2#?;>y?>!kSLyBTn#aB z{ap2{@rDF@b*=+zvS{d7rdU$WR4|V3(@A{Z&4}b>%aMZIl7ld8`RwV=oX&4TVfBba zvBhMehkRZKjyuV81+|b+^DvBh_ki)Rw?$dHO=r>8>thw_{tnZ(91bHOb$7)B^VbiJ zw)l!nA5sdBL1U&aeKh4Z9wTr~cT1B?_JZatWBTgQnb>FVWbaT!{BXOTd1Ze%1nkQu zKQ354ERJf%s8Ni{g0_)L((nwj^pQkP+*T%m?*FId(7II|4hERB$arZ>#izULnVeJQ zY6Art1KVm{K@Pd&PDNzU*SotAORwMa)oD2@qK$!KTL8kCP@@-9H(-_1y?}l)=tnaz zgQ-6hj(1#ieN96m2}^bDaQ|g0`vYQII{p(lqh9`s?wKf#Q>OBKEDsmDrpKa}xt`6@ zd+_Tk;atmr;Su-oWi$Kx^?MsAtY#@M!qHSFk`{%JGGgwaEZMBAVLv(J1FK+*dNBg) z=01fzRIF+F__n2o!o3v8r%c5OK^&o&M z`Ca{2Lc5ZQ`z5&1@!@g(+Fvr;i43-x?O;CWo#U{7b%ZdSqe*u!z--&mSnCE`OAmf%!zz(XU8W&ZtCRwQ zcHDFA$EZ70{Yilt5E9uUleg{K!I*$r!_&{Ozl*-=F&4qjc}t&LpY^0g;PvXvWc@9> z3xm|5X}km((DzLAfKDZBMGE0qX~)!<@_b8cI8B3Vp|x=ihrIv3W9pv?7nV96(U;E|Nj7>S3kRKPV#ey#;ys8^d z#6Yt=gLNMz=w)~`bA^I0l9ZPm%icl$?v=A#R5YxInm<9{SxDq^nYf*JrnHyW>o9b5 zJ^-)7usqR=-qIy)rd)dE~?{KHUTG z*CeQ)wz|)hCR#czc_Qg*6UIj%^mbF+SgPoi>4ZA_yH;30=@}n0-{eMun~~+Rwv)fV z_@w$dKlR_)`3f!9?)VX6mI$0$Bk}G|FlFht{1N)R7wAhIC0z_PN$IVik&!s0MgNj5D3uD0ZvDy|9|0&QFS<`?B zORg8~YGrdFHG9A695Q8L?A7-UI$ckejdV|MwZEL}p+G$OFMO_3V3#gaoN@d|km>gX zI&OAX`7TZQ2j71R5nLp- zH@Hka4ErJqQFqEyI6qTpWR9O(bv*r+$M=aBwkkGxerU6kCs@8GK>uwKQ=K{$GRDp1 znvVa-)kl&RxNs-zw#(Do@ zVGF@qVF|qKHL;#2&1+qyT-GxdihhPOtvg==>09?deK_GpR+)KEmA1Vd2S#S(-W5Cm zJWkoa(6yxKWG%OAeE+)9;Xc08b|R$J9EzeP&~w{Wp!4U&ckU*{;5&AWt>*$5quKGj zxmduYW?G*ybrT_@uAVg|_Y5IWF^V14nFMCMi*M!C@X#4|AcAw+gJuY&7{m!Q)cPpx z`Gq~?(^RSO9lr3WANQg5{CGR$l{~_U;Js*kHz3uF%^(T+9lV{=mWmxQ0wuihJz!xf zV{|Frj#y4!3o8@_!W&mo4Fq$G-NV~Sn0u8sK!R1p_f3M_MI8UB~(&hI4&VN4>=x7=~YEZY2`CljaW#s?> literal 0 HcmV?d00001 diff --git a/web/static/img/icons/512.png b/web/static/img/icons/512.png new file mode 100644 index 0000000000000000000000000000000000000000..01d65c7ef20bc77b5676a8217d4b6b9839b9c217 GIT binary patch literal 30389 zcmeFZgDX)h z5_rP!&{28;DjTBP0N%W`F;sc0p#kCmUgLr=!t6lz?k)j-X@Fl42rC-{gatff+@j7o3=+ll|)t1r6Ta|G3M zBnRQ$J=$^cra@E|Ig*1cZ!rIPV6{X3-|s57YsLkfM#6j|G9{i@8iQq6&QS-FFqt{{MQst(AK~G1>r?~2_g!5NYPmB_-}te zGbZ={8}6G=z}TWHer4GF+aGBK#-hZ3fz;z}T3% zJZ*pfH%(xQ#Q&S(KdZ0!zq|Oqjru=Z{2$!>1D5|o)c;>QjWU~i|L4FJG12=ZXsxuJ zDlUf`!if-~pq#|?)qh=mvYH%zW{U{6TqU{9qNZLQ^ipa~Ya`U-O{W^~C)0R*aMP0pu z+gRFsP5ly)3sv2g*;ym@!1c^j>-#xA(Cu2_EvxgCiHC;U$%FxA+wDm?bdaa1L=1g> z1U(v(EU!NvRfEdjY=Gm1_!&OG!<_~tljV^7OF0rFgW%qcQ~U#v`FC_F+UvB=^%ibT zvwzB_ott(dXBTcywKobrdbN4`>$OZ@=Y#pP);cfr)dHg}c72&AZc};& zQP8T1MB>jou7mSZ4qtEJ(Fi0a)~)DO@$XJX#5wKUB92>kjDYQ|-_cJ*ob6_&QwWhr z0gmZ%8=15(+>K+9hQarGBz$(n>V^Yhu4f3FuQC3`(w@o^3m|`49P6Qs)ch|hW z2nKtTCoeWsrzGw6HYxBTsbHnyew+P7QN5ds*?_6Wevg4tcXGxdDU&?rS&|NLYzm7 z&WmY|Ar@1rY-!qtVl&~zWX-1#izHN|HS)pvx{~Z`sa-c1w7IX>T^MMPOF_de^=>Oy zyu9~qQN;{jZ*4Pg1Fw2WVyoNkGVRayTkQ_PxV6k{MOr5^@)o#s@#dO1yCNAYPlCeX z4}vz6@`HOA-sr{qvWDAr3juC#vxi(?7d20V3^@)pr|zas5hPb6Rjf*GW1JtA9Iz(i z2O)#SDK$8xGRVKlj1Qh_7~Q2uW7bBI9)Q^dH;xGbApTMOo{qvRJsq}K358B(k0_Kk55sDi zozJacr0ueq6mLh$npU39;klZPicLCY?+cT7lNn|x#nOoixJNf8|9&_@%KTC085ua> zFg|IO3!vjNwMdIQs-De^!TzgAN1*{B^;bMEDJ9sJpB}oSweJ`;uZuk_6p#@gY-^s7 z%d>51qQpaIBBm$~Hr^SA%+H(wmh%04104AJdfQf(v#fEm=sYX--2C=1iR%8g7qBLx z4gDHlAK$A!nKUjhknxuj@1uH`X3&3gwSaD|U#8!qT6n5#0_icH^}IYk>kYd6izQObaW(4tpOIc-Z+Aa>eEIT)!|$dco?o6)A%=&zvir3FEs|F#2y9m2RExT0Q4w$yrGu6mwL z3?JM1mO1)TJ4dbGg<`i~tzYn~Eyru-pLPeXJR0R3Q0sJZk+Tb-VTrfp8j&r9Ce2D{ zSm3o)$E%CGogo&C9)ShCx<2ofjp_CKbUzneY<^>3TJi;FqmtF1-Jri#KZu$Yx4a$~ zib`zy>Ex^{wPiHSK`gcyv>xUFSBgI z+89*9Tc^vYBa6I#b;k8wzP~y(V4_IxAV3P?6}_mv&(+*zo}o6TW)mv~S-LVS=g_!y z(4EuSy_9tU2b^0nL}qOGuzRw5?~YX8T(8N(rcx%ePV{7RnUS0gMFNB73(`OOIS-17 zx9gW<+-R~$h-&#UpKcLLZfp5%881Zk$lJd;PN)TY(SrQf#Y+HNtzu=uPUX=1lxJ18 z6|Rk`-T@eTXw28CURzJzO!BkyjJ0p-(*`!NQAeF;4T`DmbX#pPxzlL_9l;WcJ8jpi zyvqgjxkH~{Oo=Nt=^REKCgiOo*DB$x#BzO-#}g%z<(w~Ddqw~Wy}H=*>XnT2KmDCw z`7lVktFtRi_Ie4)DsvEFV*~Pf_-5+$k}CjggTX;$*qyE=(P+;Z9l9A08Hf~q7^YH+ zppWhHyd*8YIpUnf<+~br!iw@4O-J6wnY88+(ycM}JG^OhX^tzb>V=WRI1h3t^J+h8 zg}SoZEr$FIf_R_%jJPi(elE^n?cCfp8Hr1=p(F@`|Je&TYqDJMKa1ufmRQeD{s8wS zRq}uBT$Zvjs9`^7g~`IlfvNLa=gB2_t%R6{Nr!`-PU4;7L37djiG{ok?M?MDwGP3r zy$`gS?aq(IfZaua_TV@d;?;W=q5ds@q|iE@6)ikvLYluqoq}lA{yXDQG9uAC=h7R< z5i*+my?j7G!z@E>(BZYo;0c{#L{w4;iA=rWhd&V3y{jyPU5Q;)To3e!S0MICuKJ zj(gWqy2E?csgAq#w6qTi{oT_(Q@fe)Ba0if#X5Gbuvud2smxW1W{|Pkk5;<((-ueqv;APhUfVzT zS{co~(!1K}-hWdD-#*SJ3fi#Qss?r`IVKy0I6L(z8>vLSL~iG?qn-j*+ z;Vr|oD3o@#Dhc(s?Jv9ux`#uvoDA2lCFq$t?d|Rkd~Y-9V!ID;N&F1-#MNHZjP@=B z=g|QQZm_C-sH%Vct@palm3~shLjqa^^L7>#I(lA3t%77%Ds%8A2z@?SZU( z06-wY^9i@qb~!xd%8DsPeWBo#ByI^|irJiT;m9=^DYQZ9<(A+f;3=I0UbCk3WaP1m z>-^SfJBrb@>8lj!WSf^TB9lc(!zDRasB`lX?=_HHMjvjE2&Hb*>WjGIBomUnJX=-L zPpkLued{BUKK_LY<@HvlAs%myMP)|bYVLZiQpeHXrbfzzZyS0xv3}aWsAcVX`zvo9!0Bx7S6vi^;>Wlm zt)6DaOhU4xGh)^PBoV%VEt)+IqKi|gvggHkT6gO!ONa^QwD|zwSfkk0b~S6Y!PsWT zTa43%Ks2fV5%Zd&8U%0C?*F=X$mSXd)e`WH~4Z9Z#tQe+ss-z6zXJxYb@75l<)4)FzEkZOA@AKCAF{e`{ ztRLR*&lpgXl2{PZyrQMR*c7nwJM3reRS3{Io-kRLf@17J%6*X{72}XD7>2%DKU(8W z3h9?a_=|}^iTGFj;4PE=LFxCq2KHoGt)MV=Ux2ri`&!4;OuOnCiG}fZBuex@6+dB= z)!7~(SsS&w&DV56$QL4-f7j@k^}c>Q%hT+8q{pDB zYpd;28IZ$idsN6_4^@~ZXM%jyNKWOFj*-}8kMQ*}*lnHe$}XnD=U8JP!_MowXQ&i9 z@Mg=rj;2v>Ah}H-mAKC&6mMwDtsyA;dHNz2o0$5 z`zznSOSiXi>$!2A8>xWws{GiVB$$O+^;+=7RIxpE7v8s7Au%@R z-CDudN|g?cnM2sv0DHkL0B(sV6=d-#G^Wmr&2VRTamZ=Wu(E(GbGq{tjLE<8m+zWwBVSO_e_DEx)^af?sAe` z!4+k7DNSGN@Y)P<%2`(bga+iK-^UDt`wp;4D>4}J*xWa?L7`cGg|$CRGSQ(;fB#%^ zu`~$4chhF4px8DtoHC-I8B|qRf;vbcRE?Z9y1Hm3pPz|vFU!^^Q(J1xXPdgE93S5d zx|3X#wWbW~88#zsI5r=Ex2zA>XL-p_4yWYPh$VD=uQU%0sP-d8A6Co4f^P=4YWGNLyAEI)<7NXz{e7gX zKbbw|JZz7L0`#T} zZ4vQOeNPm(-DV76%L?e^_CCCK_u6Kio5;gCfd5I4Cy zj{IMIaNh8o=I54}h>&Hw&#Lj~JH0?; z6YlhgxaP_`=DV`7RnPu&5+ALDC6Yj~@56aJ-ez-7Wxql12 zVrDFmZ}0et>pf4}(jk!Yvp4)qIPE$$U|Nu!%DGoRu5zUVj7bkWD@I@UIdu+V?srAO zNus3UL7GeJg>`DcJk&*NU&w3}ZV6V}u2$UtG$z!nxW(obJ>4)o)bpZA_Vxhg*7fBb zN}1HCukJ9Df%HB)_T$eXfK}V!{R;c$1j&4y{oQ}qcfNZ1ZJJZ$p5K~eWeacKV<35A zw>4Oxlh3cUF~RnZP4Ag35$>%w3lKU+W4~7)5sX};LtHo7`HWgJx4vqK|0{$&TwqGD z_HCTHLD1gTN+MI5x8!+4UBgsnUKR%g!q8`pB*vB`HN3qy?p#}uI2$P;s^)X~7zfKw zY>OY}tu6!_7ahWnzmgK=XvXCeorvvGTGbF`7ui{}7-7rw-Dmrtc$AuFJ1ls>cFw}v zTIleS3L|Rrw-9|fySL&l+j|-T-cz|sk8e2I!Dx^tDHq8gNO~+s)$gn1Kv!08RpQ8{p=hdETc5 zEqEGN{2vpPEnbR;Y~FdB!WzR$_M5HbvfT7EpA@&}z)BJMur`b5h(&L!47l%twxqjq zgM+MwNER?zJ`5b(W8JIWCKr?OUN?z%$qLH1noYn(pWImKC-tcD0RQgMW6m|0}&(M~P%#c=Pz|P{ymhV4;h>`im`0n&6$ke(>5In#- z2kfu?p2VXsovnZpw=C`N?BY(0Ejv77>%h-ceV^B>g8;?V-ptofc0nP>69=UNRxdx& zbigH1jO(j>Wwk2#vtc3W0s3dd$^k7WlhCte6{}3EkLh_U!ala}A?f%2lL<#oN;^V{ zH63g&eQ|%er88Oc%Tw;so0bo=_g-uSZm5}a>;|H*L|@~EI|`8TG;LRj5wyoE9Cr}> z8TQ6`Q)#aV^?b|jr3Zh-u8(-eb=R5yhnC~d%iMKy0-3f&0rSUXk?GM_+d7AA5NT9r zrri|};ypD*(e#8g(Ld(be($rQ+|6uV+s)29kWd0+*T-5ASNOdD*&is(f7{B9skR$=ouQUAtV+Z7^w03IS^bv8DdBSjv3M#C}3z+LB>PJ|U?C0J& zMvlF++tXU>b842yF>wo)P;Qj8mke{71YBgml;Cf2JcGHLlkavo+#7aqI2ongt=p;;g-b==91ilr&SrlD z1e*g)I^{WDruzG-=G|uG`^Zl!$NS56G|+=~QKYWn=gMsWDGwLUO4^e!`uBzhUnyJI zh}$XL|BmCdr|YOBNX@euI(Y;m)#hxK8W1ZD=%Kt3se!Cm;n1Hw1?j#!>K%wV>XsuD zN!o!d?8j02X=2uQHq8ESU)T561GQ&Z(_LRw0s^au8E*JfLI&#eocrhMe2vc)6#`Vc zlzvb=8O`Zt$L94e9%#8Vzs2pf_l7s+ZPpestPVLi;6dH<b0HizyM=5s*wqJ;&X z6q_THCilbXrqaYXDD0NQ17|WlzBvHy;7+IXya#BLCGS8rv7lAhK?TPT9NGPkBwR6) zyY<+ng!L#Q5W715b5&hz0ksbEHHj(qX=k6YG)*$8$V`&a3J@&Xj)qK>G038l4!Z6Y zPpW%T^2K&#X!2zPvsJwI)eBARh={Yhj^1G2;JpDY>d=p~Ox~Q%mW!QETTP7`JE01W zBpZ!EGzz+G&6UK+p+Tqmg`rM~A^zZAkX$8zL2b>7+s*d+#-yQAduEcM%!rp)jhIJ} ze^T)uSJi@KvQo@5ha>>e3KbN4+fw+L$uwx!f`2iT(yaas6vLnd1LQa_J{;)-m+AG> z&@_j~2d~{qM5aHKJ~O7OJ$l>7!b4v>*oI%;I0f1Jw=zJV2ZPOPJbBDNxWe3% zg0oh8*Zys=McNG)DJ}#k4uDbb@(p4N2=k~D{ zZ^iSd^^*d+2gS4lnHp<)pl(5@K~r2TMW>N}8+-fU4Nf*xo-xO_KDymf&U38!xm}VF zZuJwQAdaY4l@7<5ySXcnGMahxzt^j0b7Pp{e3HLk3!!;eMdg~~ImSj96dFABU2bRL z&Sur$tO9}1EkHb|Y_q6awoJz6IDh!>`7TWIlG&##>cUR{-7COd)B=NSh6}O`s?Gfl zko+LQpH6g3MoR53PL*UYNBG|*rF`0Nv&T2?fgn_${eadUeb7 zwEIEd%~L?$9a2~h`gdn=hJp|dWIUYbY0esoE2fl~o#fuh;)~3#O*`L>UrO&B9F^I; z!OG?o5Bs-K!-w~@ih#iUdsJ1L^QXt#Qu0Ab7!S)8kDNZn;=~N!TRxV(-MFZJvVip~ zJ|g7btVh(RAjRL?7e0*TJ}zHNynjkEIxe5=jnOG$45X5DS=`&-N#^+sa(h6@Ths&y zzlJ4dEj|K*eB6J&ukrCVr+nN3YDIvb_JU10trGq=-kt!P%qyW~#|!~VOZW4P7C4!IKwFu;u&d-UJ_ zdyjCyLD~VoN|3uvdkk%jb${N^l20|wpPXHnXvEIu zJbaHVPlG7uRsr;OAN4e0sp!Q0r7~Jr`y1EF7IQEIgwJpmm(=`pH)V80b1uXqWK0dhyUqZqW)YWe z1hZW*t3#e1pBegFW2%8c&!QjM+-sZAH%3~u(h6#L564loeab028Zg^E7!1;)V&5d- zsb``gIG+%|uxniN1sRw^^p59+W9(l~6=m)R-ffF)5BZ!i@!jU5A!HA&%iKGQ@dN`i zBR>GDxOp1apU4Y+v{9480TCRZ>y+GnAouzMnc|)<(u};U8sy>RX*nLX9OSMu8B{L# zTzJb$ydr<$(2;{Gy>z--z>zbyJaxh3Ob6+nN1?J#Yx2pKaS631qQtvwB5%u*i4P$N>ZaZjEx6QBgd*PT9wlnh^c(K0- zk?e4m3&sz`vI7gB0A}jxf?F>=^vUjbLmmis$1}v@MV6isgED0KJqn&+uS87BnZt01i0KI zuS8^}HpwLF1=Nia?-GAe;Dg32SJ?)-&7jR?`d!yBfjMK?gk)6B?5m^NPDj8-D$DLO z`;-RovF&*60*a}*_l#Y>#^_^>+9bP;u+YE}UKrbFWAa>7Kk}C#=;OBxfPt9j^Q1U8 z18TpyW82NC+hrW}$M2dJlg2JBmVj#u@9==Vo*A%4vsA$E1yjK4a5N=0zF8)jzGr7R z2v;Jz%QZ?V`C7bY>~%~Nd5c%(zvIw5dw(vb>2IpTWPQsQW?5iYYI)MJR0QKzB(pb9 zfBRr7pI_I3LtDZmFcgXB$tve7_Zu+{1KdpTtm6_=1_`8GZi9z$tezgd`Y3Xp3EZy( zY3w<4uX4NG@CHEDSv7iX0KxaMT-e`O^t~_=btaC$nR^3t@{4d?&4^hdXV;J?b1`h4 z+|}n3vTrd0ZjZ8hjWFkhD;^AFp@8}VRlENxyPz+FQb2H7&ALG^)y2D1#49`s)r;D>w2R=Z4+o`z&**ly~c~F5-p^o2a`F}-VmOx2bMRH9>;y+o) zAUrNopzthF<+&l@Kj4W$YN!r;KoS3aOyEB_wRzFLhw)DPflq1S>AlqpjfP{xHT_K) zn=cIc7o~>fVEV@#%H@+7%_)X7W=8oTGcu|?xV zmGA$0VXeR5&}6#`J_oG@55`*^8F3w6j8T_hFxhbC&fOy-g7^GhnTUMlcum@7Hl<7> z+Bgy&d6!g+FPCtW_Nx{TsCpPUQGZbtKbk(}EfgEbe_h}<_(dh*b*hYGneU%1iY3|! zB&5tEW7;T^*P`YCZ%`I}F^tVvvp6Rt`c$##!%FV!$rU1sagzG>5F%EFadNMUpUcnZ zbe{4DN6GdHaXU>6+f6mHfK9q*zhw-?6+6smbmc-Ab~y}oBEsBFZ8IRK%u7{iCa@!X zb;7`0I)U9gF3zOj&@pwm>^AQ}+f+Ns}Lh?AJo*?k)%i&uzq2=2^4tLH2#=g1dC1q2u@8Z;{b1e#?ga5v15> zy|TCb0Sz0rvR6iKNOFU2uvjL*e33{>bGmYNdI>B&&kSRpE1?A;XGnn1=3UMn>Ez-& zivqZ+MkSKMxSLo1&vBk;bk76x$`?x;q=}#8e|N=5(=WROUd`6uTu!y|@U&eYqVCI{ zKc8y_(u|aV8;7y1ViHj0Zt&ihv1D%O{`*$6$;j<$cA@p3;)A=4Ba++2d(iUcWQz9= zFjQ>AQSBYU(T$j}g`3?El|v@ps|mG5oDL!-@hvLulgr6%%Iq zA&>N~10xF&c<^XxkJ{@a!mmYW6LhX$K{1ChYW^J}I@0*hrasbi*F9Eu87|sVwMUE#5{V_pzSrnnKZ^H zZgQ~52f7jy7pWF`;5j%0%4YDKpy|e)bTkG)v~o7CX|!i5&XGgtZ$^h+{WrD z2Fz#r5^y4K?_j$Us1G3n78Fu>m-|I1PkHRH#~%&L$~pt?-xgX9fNZ5aQ$T_(4{}QH zuf35|?Swuu(|6Zs8;IwT8Gxqp?j9t%iH6t;Z`BQO0pwZe>ous0|CVtjDU#9sn`#lw z_x`|%i!iB`$4HONqx6DbMfBWg{?~lRuW&R_nX7BSesen*G`|(#_+E(wSN zwv@4u%-;)*E{Hgbd4(43%Z=>5_W&_|x9tKrkCE`LM;~Z#tb+C$bTiE_N0aXI+3(!F z#W^LW+m-zuq=F|p@1zlq#gK=;rYx>I!``FK(I@7}4{cX}RNw?oY_YPJ6o-%=YTK7x zp%O~-v-LuRSQvyC_E{q=t-1S948Cw~ve$4ywgQ2u8my~R9>a7St#|wkNTpl(91SWu z*LDn>idU?$VUapGoMO&7+VE?z=+K4_)oQ|ZdEl7+Re7Jf-z!$Awp3KDAGwfeV{; z^i|_{JRjDpfXlHgp00woM3w!_Qr!v{rS881O%13*mwhHOJch(q)qq71h*I=D(lRAk zpyln_mKQFxIYKj>)hqpQm|^g!B^nTn7A1T#uqM6dZKDNpSj{@jE_o%xA(~*-xRyE) zFO4o9yx7R+yb%ILuR-_s3K9 z^IuAZ^rt_~Y0P#WQ-N%f6QHZ++|{)lNI0oovJ*fkJ2ss;eE%+6umuW~zPMUpm8FIT z4;d0^5_!(cs0;SEmID|%$;Jl3XX{vwk#yGi5$WsxbrqvZYiUf?{cnn`qRrPAuQHDV z`A>z|ggIy~ip@@nY6&^|hXOL0U1s)+mxYF_JC~K{ZBvQYVx&)}1?Jo%RzHfM7dsh_IM(qQABz3R-965*M*WvAKKqzix3T+CWmxn0=Hfr1WU_sKjHz1D48@k3Uu zCnwbaBphP%dOdI0ZQSBfxykGiDg`ekntQM3ge6*>vXDzoUfBOJ>5@N>cOP+^fZYNy zH6+Hro=E@BIJx-spE+=34W0bvl%WOXJU_;0FtpHnvlL)Ly<4YI`(#X2XeSw8DYqM? zj|oAm(j|KA=BHIj2|q9g zw9P7#*S>r(YfwF9arG}sW3ya3dJrt5xifI$C1v)`aD zsZ4iBn|E0%g)b$J~8rKq>8LQ_T@X_yd&P{?4_&5nr#=(cVveFYGEkJ`xG9 z=4e6b8;%w@H%{7spC!@FQM{pvi%hF_AGXI;WiD}HlRd43X>_}cim_&PeO#FmC(|`t z(Y-y+m*wtyktM+8_qy0o84;~^6S(V<#o6_wq)&zDgFeGmI%Sq?V4yoecynIWj{*4v zylRaoK8xTE8Vb3xhcznc_;NRDH(?M=n|hMjqWO0{tX$I^!lZfUNn9OX=SI8le#2IAW@;C%TcN*I z8p`|%j8P#udNy;R!~LvTCiA=R>(chMO*M~3PYrLviGn^-fi}|{hMyRenn=hxln+qq ze+B0)blOh}a4AMS*I9)v90$_mmsPrOhM=_PEG#UkDNK+9rK-Qb3y2=@29yM9DTNbS zK56*7(_ef@OR){-^%;QL&Z)=U&BS zX>*Blz^=^>G6iiiKSKj)uD?mubMIG#Npl@4Pr3gnCfF3qy7*z+qs^Bgth+a%apA(G zQ%XrSq^h*xE-gi^&EVGk(5B3{)sEhRK9tN`7nwK-A)F)eUzcB<_uVu7tWa55=E0aH z&~nzYX9^@bhq>DTKd5QQR@xsyeSe(xA{YFXTRUJ}Az`BVaNC1>Ro?%6EbEpm*Ky$f zaM9VP)x(q5;@sYV9g(5*@P>U2-HKESNFG@ zvsJ|PEQl%xqka6*Siuj>Pvixamxa|}&Wz1xiCoOar}k`(J!T0)(o-vjb^(BfVf^c1 z8Jrf%D!f`=lhzl(SYOc5b~#bblcMP~gAv*rIsjzM3HS?nN}h5;KXqCuj)2x@F}_u) zeUv#V1V;UQ~YHMd-vkYIam%=pG zeG7T&2gQDE0Qbt`qA80H3H`d%pB1iVGyW;#T4%T`ULzLETgzx7clNaLoNpDq`=QPE z$=8+S^kla$Rn{yIpUu4dd^NWw^K9qdlu&8W0ziw9{M^&WOUyXHL6~=-iuzFe!ARY7 zGWD5#ZFspCl2bMBX^IFEWlNKaUp-~!3mD5!2Nq^KlvY@;8*P3~9G+u~)6 z!@v_C&4BK==$o^w@g$>-4Zkd6Q#Ur3lBd0Iy0t%~{>2K6yIHv1SzxIe<}gSov}XOY z-)F8~7agbT{pd?;==GO8l-}*-F1fi^o04Bq=yBuW#aSTwY|>8$q3%ROy=n5AXAh{D zv20vXxUd^kIOzrs5D|eW7Cuqdb!$tLbC#OC>K1K1h<6F{b(xF4C>vkd18{$Hkwgu(DIxi?^Hzz<~5`i@9>TDx3KU`;(d2^La0HC z9@Bi@>et5SR8AbMdCn&VOc&dz?pPyoR9N(AN^SYF{)Y^&eoCAlccWx`pLUsfigi~G z#|p{t+8X^Uu@fv^4K*i*jiFvC9)N$sHpS+x*L7Gl25U4G6U1*m&REdO^yOYl0U;60 zTQ8$fO>$M9O4=#+JiKYBL+LPJ5sNW=qxeVKx2#L;lo=2%xd?W(39L}4FVTt!bQZ7u zw*Hl!NBJHg5uSg#Z&x+qTBGgeDPx25@3Hqgcp1Vd>_^izB)KP5IBj=r8l%^5el;_t z$lf?NOP)1RY*42!Q22vGc9JREq)*V8Hh&0pz6=}gRQB^~Wz0WM>wDV9Ml%s1)CTEA zb=2@{;#aH86f#1>$7M%fHA6PQO*{%+j@mp}K@cYY)l?RTlXN(3-ASh!{K=C_6+p?; zPZ>1}H^*;Dooq&F~bjYR+O-m;rwa0_AHDj2;@qWz4~4=bgmbqwQQ>(QtXxMWtXjTWP0)bAPUHJVzLhJ3H5z zo|}E&0l14Xf%*&<`~1R@6K3t*j>YgmS6_xUl7HziPqd{_m-S_a#qxI;gRE0A+ZS>M z$8p;hIfau-ZqiWNuRw%+Gg;RvOkpwG`0P|FMc!nbA7y$GI{#phN{&G!Q14>RJ&HntSP5$Q@D;#ExuVUyml&+iA83)~b2DGq*49P|BWK~U=buREG%`2e4JtW$ zmK&Z_7ZRT9QgJKlr8^DcA#g7s4&S&*`b%8p1wd?SE0YABi`f#Ra74YJU_v6a-t)H_ zkKv~Gd6~OgTc(tb`71>Yn@-uPeZx!&j1LJR#x~*?Oq4G2)*X;6_hqE>+~va~7RP;P zTO}>%s4bfmxAYYy&GYL;Z1ZgbM18GHz=+5~4rZ@dr$q1*!yA6D^`O@Zq%>Z~!&CP| za!6(MA9C0ii|y0V_!E*cJcMTDJ}Z})5)!axCA^ThTt}qgq;0{(`mOj>QTKKB)vuk> z4?CvtE-)E2*HU|!^ZfS1d6TfQe@PJMB9m?|B{rGLoMhlU>Ugxy(C+fx+R_h^w&A{q z8UbC!4$JrL$BEPahE|N<-?TRTL@WMxkyZS>(W>5dp51I9;d>L1DyCfe^XR}3QfGI& z593;z=)z{K`dU^OA@7GvnW?#MqEvkNgw#gq3a`$|=U^$sbtxix=*C9xJO7PKxv4%b zJqM$)7yOz23&>Ods(e*?{rVo_P@K8%f;ka7}UIUrpeCn-SQE-_;3C2quI*r&yveWBu%!uX!NcxGxivOg;f?z4+=EA^9U4 zSuXK@g9H~Wwd6~$;5CZSV<^O0!L~}_&3BI?bV@(pM>g+QA*h6uWaVC>uCve=S=d?l zdtIzt$y}XWTAVUYVkNKI5JI4Wb|GT;ue)knuabf3{A}{x&3$SuVTud~8eSrXIv|MX z1{bLQuEhg~J(Tf!B)g$nFEg+RRMkZ;RPK=~aWr}D|28(6C63_JN%!j%zF|ZQook=( zyJf65f#*BNtwPAweDPewp$n?LN#{RE_;2jbzrUOuCIy3SF4FbHKeIBiWYOwh*>U7v z2kwV3Mh!Ho`KKo&4#W+E!g?_gq8VxAc|MtqD#<@ZW=n9vueuv~Q;GwM(FgYtl&$-r z3SMpo#T66v>-WDPz{Z6=5sv%BK7ELpcgcY0XEZS1R~1Y1 zXzSM+84+cWKgC#hd*w0OHPHr34cI}CSpCLuz`=)5cfw+bq=rjzPMB}fh}@I;@AQ-w zdEy7{%9b;=P+f+Lx6)E4JVr3G)b@W9hEo5wt|A@iaUY zpvc1M$oJ8{N%3*R&Ul)&zx>|F%O^kHT}PS(Y630yTjk6k)1uc|`4-i6b0kqNSYA9N z5NS)1t>T|#+1*D36ZwFWH+>o4?C=>(t#olYIc(3;Pdl3r@Wc8&%QxZR^LnFnj1X{= zS5Z~;5_+8wq-PH|_A(PobmLi7w6)$QNNCt zv9nAFt7Cbenws`fWI0F^dysJ|vCZoZ6MxkPimG8vD{)ToopEbnbDvxod8T6WkC(O4 zBQ(K5{}LL5vSkwdF&h7hKuXH0IJ&1wqYv==)i$Cq2x z=+q;Y8b6VfQt)!a5rTvZ2H_)6qp=!z{{Bepbb~Nam~5`Xw^`d$X#ZUH^- znun$*>vy{UkEU+zq|8f-0g>h)E*}H>5`r`{R>IkUs~yV0RIg`&n=q@x=l*zmq2V|o zo5~aBe**gpXDO>ki=npjkWnTx9P37>$ZaQjw+9C2OxkOq!%kx+c(+QnpaLC1)Ys8* zqfsXUqXWUx@VJfTPAfnD^X48I&f9&Kx@o3yjGu=F(%|KgL7@Km^{1pq8WQnEZLMgP z{5^c1UGM6BqOc!MbgSLtz6MG@D<6-uj?&j&PMU7UZ4y*v|F|ofd6)cvvIkVhA*Lxh zWG7F&`TBfa^PqW6n%7+`-Sp`DTvuTUpp&76=l^bw%DlO!8znc1c@UUWA4|;R=f$<# z#3qJfS}5_#H&0HoJ;38_;1HQ}?P>@>$O#7UJ$>_N{=ImYQsx+n87o_@L|{Jof-p-Y zMtj{P>AdIB-`7_CY!|N(`52bbe?8SxKp+v)yZ;5iYmFdTAmW{_x1E|SM7al2KWkUk zif-iLfmqH}6POQ0F7@-SMHn2s%j!|e50)*X4>(_n=PS%=?TrhO_PZ2=XA=gA9Q;~p z|1>MKL=aFJLUtr_@Zhso=3OFA>f-tRyhD3ZSaMih3Hg!&C-#|>(eI&7-nW#U4!X~Oj7KWC5+2>uhDFpiO1cPZp5Y9Sai#DJjLUYq$wizl8+vuQIGUEB9YdjXutK;P~ z_CjXUz{}tBp^O|kb^F)NK3bk;D)z%dGnYg2s4iL-=>EkfmG$e_8mOWpX79q@dKo`l zTA6J0mE<9dR z4nwjo{0$9}-`1szeV@$xaVVXddzqU3tl!?R*0&}CGbN3-7vQ-ZL_VIt5Q=(h*}a&x zcJ8)my_}WGcwtjRZ}x14!;wb#prVp^iJ9?2xg#7(zTo-7GVL+b&wgB`nPYQ)-UE?^VS^2kVTAA3kFJ(H)KME9Pz~6N10hcofn`h($LL{XM73 zF^zwMapoRz9>FSn@~$wqUJ>CS0T+&8{X|8lWnSdIB^!`@8wMMKs3cLdm}H5i<_(rm zM7df{3US?bhsn4sM~lWh*E65#7G!Bdq+)1w=roM~-kfuv6Kq_S`9P_}VE16oc1?lS zk&R4$;P9M|H>#uk&GEpXW9OFGa*GU24vj{VVloFimn-TGZ25g3kHzsJa4Ju1e($Xh zZT@Fkbj|gKB`BOok?Cw`0XVjHyvepfR|w`??T^@3{e6z2h$2Wo49j9sKM*Ysc+}gx z#XmxR+qE31VK`~=rBgej{Agjdab+cu64s`(Cq5;jaZMWYp0>3}d@A`D=}Xln=-j7~ z!Pv&nE;KRC{CtaUhGbp_4S2myagu*FG)L-P2I~u(Igtx&L_v?q%?z-Dr0hMPZqX}5 z1>2^rYUzJ+*nIcKQ72f(T}Ml*kxb@=4j>VnMfgq%uXvi$iXA={1WUa6;=1rahDyaW z{SYPv_Ua@>8B_6dO|OryglE+tmDXBZ6y+i@o{iLQtEe~yL&(ICv}mq&lBzgGpDk^H z8kHEaaOj!eIuTHMz8X@?U0)VO24mpV80+&_e_cZ`!w92ah6l{ntT%;2FCVr>KOAh( z2%HpY$+_B_oF$T;!ivkfvhb%PQX!Jd!0>g7qzz(Eo zTJh4%gb=#phvYo=_H^Pu>-#AGdH;Eq_|YyawYfVZg@tN^F*O2v&vSBuB&i@ z#Kwo&ZY9Kf-v7aApH^*VX%nIme!}j2>RzI@C~m!5d2rH@@nK$^!>_a_Nfus!isP4K ze#(QI62CAnlBQ>=syNKlyN;UlCIr)m8P+7gni1m(wlOJ**2@R#6b2T!`y#3gj3q;a z;r_Fp233K{D6ddKK`Xdv(qWEzI5gkWi}{&zCE2HW|D5LTZsTjVHa4#qJ+SVD5pz42 zig|A;wshf`Xj$WaTpKTAZuN*FEmC6iOxp@sr*kF((zoyb-bb17Fat08i)MnRLd@sx z;3s(}4dvk|+j~7P(#BOR9+Dj7?5~8!*K614TsL2O+|^*>S2`$_onP(7(l=-goB^RD zw60~x2?`%6t-haEPm`p=A(s~ofGB3kI zG#GoiLDV3BlpU!)zGh^z#`HL^(|u+(yj{O2#8!_>ejS!&RV;9#D+U^a%yhH8J%|=kA)1tDX{oLtQ65v!` zm9AAD{~?Yd1K4^PQ%bR0%?ZRLc=24*EO#(JS-bC!nzEkhKuqbQ4u5-s#Y9H4Lu^PH ze-c)_4f+k5XKydXbkfC(|gEMT|zoiD%SkRs1 z&hU`8_A|&(VTkoFJT;+|jWqXb?2i4sG-;fLJ#J^hc`=RCuFCU=+Pj#8OyUv6_5mRf zx9!Ooy~$k^(v(nT=NkfV8Lqp28&{U!;450y@CJC8qaUH_LENspdtX@$^|K$TL3bys zTQ|VEMgBw>hiWvIc*Y{5Z}mfyk}E9yTqRKj`_z+ndFO}mol75nlnu@b=O3ULM2X9E zIHB&?xeA9rVxG;5jZ^{V00U4)$l{f8;^!{7WvI| z*Nxr)rcRn2dw$5bjT9(+^Hn%Z^`yo%4d zUZEkF-$sE4ZB0^Ud!IecKpe4jlZ4-%*dJJ3rdD z`R)kyGU_?iUBW2>=I=)T`Ott8t=gRFV4cLVj6{8_Wq^y@Oi$!27Thn?^=ml)bzga2 zC?ix#lPIWlqfc&=c373z1?$bTB6%hyJ|8SZB$Zy zxGwFQ_XNA{mETo*q2q4lz(Yohry&xYrsmGRhRXa$bZ8*;N7n{x-%4OStM4s6@L3&q z$@1%?Vj@nspFx!s^v9vR1?3bm1su-9&ay>n|3B@W`8!l^+{Z~Flp^~wB>OH~ma&EG z4B7W66S7Xmo^08d>~h6-{+rruKadimvgRb?m73F z`+PpH_v@IKD$B|>JZp7oT0mV}^exj_tf@0UEJ&b*xi{@*)4X_Exb&w&6pQ&J`<9ScD3y?->PkkLX6Tz!I`wygBKH+EU; z`QcSKxg)r!*P%>pihBhp>m zBc@dkwbwO$ezr`4ucUl_LzGe1Op}JXL0kp~^%MXp#Qfmad2aesz}=6 zt<=jafjmV!%mk6$i(=MDRvV}bz+K|KjL_e%c1Ll0fGVWdsMa6Wm=7K^gp8@y9^56* zb}wtsXu^wA%Z&Z9aRZzP;AyJacT zwt$>wdJNOCfl=@pA^NuqaP?14s{BIPQSc_FX{Z66@5!3RM>LIUrV)rwSk$ANwRzgD zHkJ5*&=L=L8EA_Hs3+uLkUvOagfe;14{dU8O*z@}2{S0c;-rqmF!w;IXJ3Z3F=H+8=TqjFV zpzIejM8&X>D95cQNZu~^Ws7E`_&8E2!K^Js;{WW;iBxJv zcI&nvdz-M|XDX<0f9geF3<8}U(S4#i+zhxpZe4_I_&GG#unpw**PWc$PTF&+?jP)0 zCoxBMCHg*S6U&XDk4H4WP}XHF3!m2EA3SD8LUP-P5dj`yLY5W81qsv zOdxETsBrYUaLl`__=`uEq1CVCJygQ3LW(J;2e(-Si)F3Ma{8|;)&d;r-M6@+_Y0K< z$gx@Rk_SmcX*a{Rhwdrx6V}7oC?I9VCJ5cM@A>FafM%Dwejf0PjQ4IZJ2hvwdaI3PR?rW*ov-kTfql}nu zaUdur^XNIT@97W<>sXGic@e zE{?5xK%0n6Z~`(iNrbf(UEfA-Bj(Z?i-u&Y-M$1|BttOxdGs!%T+*>0G%9#yUPd{3 zoeUyBC@fh$59|7Fe;}3L&YX7aDc$A@|b0L znIN#~*lkt?n6Rus;PrS{y1wGDR#~j7Vh%CSEw+Z&F##aIMG}B`6uZ zZ_e&{C|oY}$+9wT3U)N5tzD9EC^RYS!$Zp!h*7>Kyy&FVG}2sSy7(C|&g`*ju6tJt z&(r{gK#`bTNY~{IlZmYwACxxnHF3Z7LE(d3nDT+bu`v$dx7zZ8l(%%I-x@UjRMfci zXyx8k0sV>HA&4wxwE_{tOq%-Uu?Yi0Gnl=GG+>k#)VodJ1Tn_-fu_jLthqv64* zF`b|>x~rdZji&;mVr)o=Udz3o;EjcW{+j^K8n!3RSUn~DJ*GG9?%;Y|`tZ+rLL)r1mPNIxbX}ftVWYgblrV|fV#_jQlJVhna~CGXIMAhwnXtT<8_R%fyvtf>a#NT4LK6(P2;^nOZ=HUkwMD~CcA4HPb!5f6GWI$SQyrnw= z0{#&=89d}}x62vB9YgD$<88Md7om-NMCN#f;hmO^bY*=~X4Ny+DfN4!gC2v`5~qFJ zwnX&4HiG=*nvW-DRpyPrhx+7q0RRM9-&+yGV<^i=hAU7cm~d8*SKeFX7io*|g%wJX zJRR_au`I6k*JKB>Umsl1w2xkdRv@g)z7DmZ(oU|qd1^6fXlPyD^@G#Ux$+ZgaIa{o zc_+cY_eP#(eSNwBJtqul7M)6q8X_WT1N&36Nk3)MO5uE@o`t^pIDHVN0LU)UA82qQ zD4Tkt$g%^G4AYgw7~|_ZwM*p{#O>KP27SUbR9VsL@(6c2`>+wRlH1Ry{WBeWpyK!1 zuk{GfR`}u2{wY4_Em1e*Bm1AZUU{1$;XzXqwYzo`{a1K<^=AQ2wU=3w$s8gbVwKh* zz`LwjZslY=GXsF>i)9Ork=GRFnMO}9T88G3*M}I5@E+l}vzvUJtegVuLt-gIecD^B zS|+;&2UCU504#D?p#eEZZm4vFmd)YYKyRlW;=xLz)QhcCqht*c)YQ@5o@johz||%-Mwm~nVQmuoAyIcIFl^JVpX5{i>Lwu{mb4!_ zA5mEl$UUnrKbWFE;P}#Nxw&-Z6~$oxG7BLEGqRl;C(TJ*r5JWwMm^wKk|rn~&zP>) zQuxjd_QQxA!Fx@E*lY*Rl-)kFL(%fu04IOLkkH-7GS@HzaYjr$`k|aZwN?c=Fne@H zK&On@M%s8u*9yVSV^e7JbKO#PNEaLJ?a#U69Via2caN<}*4U-YlZC?^^%*d?jDQ9x z#kqg!%CjlIZ}BZ^`_|$EdMv9;sPdo}xF1sez+-iT9v+(OeplnJD6!UW8IGCF}t0QI}zZs+UI5l;%BtfL?=oh zLFM&*AQnGxbdkMPnmd=Ss~^Vnca&X#rILAKo^kL6xI(O&F+JGM)gHR$K~npI?qSKs z8Gu`)%#KR9))?As`Eo=0mGG;P>$g>{e%N8MJpww=2)-2a?G+^6MPT1PtaI-HaWgvq zd6E~e+fKXA5*qXAUbHr0cbn4Ay~6?wr_Nj0u|><57N07qYgwacsm1PPDH&khFeylr ziZ1{lJ;*{my)A{}tBnDJb#XG*egh}Z9Jq%L#|e32FfP4a!}q$uR5Xb>SKg^4*3P!`TRPuV^1o5Z5dJO}6b zh$7w6zN~@>?h}vWOT}R5jVyT|N-0hFh2-eH9^!uCUQyQnUG``wh78 z&AUY`-Pelcmj_Ia^*(cPCQ{8Y`^T9&0qCj)19Bl2=~JIn0=|(vbpUwgzQ(2CUan2# zpT25=+T`=rU{->Ec9z^U=t^x#GW~+zBg_MGEW}2H*t}8!AMQEb?PJ)_b&jBR9i-qA~1NA@r;N2d{ZY7;KqM2VyUk^t}p1| zw70Q|`R&NN#-NS%@26A_Ivd~zPYL|PcdUgaPia);ANm?S{7&h?7YU5$T76xdEd~bI z{RS!-=HK~0MnsCQ^E?m!^^zcbdrYx7u7)BiZRaAIF@6E zUZ7#EoI0wRewM;FT_Kz`&|hZ_%`~Vg8m|`#I3dqbNSg&Awt~vpiu}>jXTkaWEgOq~ zTN$tSuU>6X zO-^d4LgM%%b*SFu4FSlH9{(-IpM!?x2d!(G%nE1;>treotc3XY9hp%&bJLR_Q5mt` zKjrz*bIfTT>Dw3Siu=$RpNL5K48fqG27S$;FLCrla1!Wrv^62CXxMpFnp0yX=;>Xd zHj`MD+HFCLI_ueLdkgGT_`%i5qwFt+Z7 z+8j&kdHGSwFTDA=o8}271#6s7c9T_oV`lr^M=Y`*2iYNxFSKtuiV&p15;aGf z!t_3kU!ryVU4tiInwX>Hx?!^F5G&qryqS-_d0+v5|2uc8VSP)>`5U`esJILg9xgY7|j85N91A?N-J3Vpo3FdFLHqwRV>c4*yrGp)6CDAHAEmN!S4~pD{K(o1x&h0ef+`0Ze zPrvPW_q`mH3K{2peyMbERuHVUwqu+3`~hAgOzYEa^O@wO7r%^cntxzZS^ zW#}XBDi;)b`HJKou>Hu_zWKmG>Opy6FyR_C^%%$V1#VO^{NahImA?Tj#XXiY$W8yP z=-n~{4w|2%IWr~Foj||ywTY79cjZ6OeIAy6y&OI*5~(tna;8a0d;Q_e750#&ccIf+ z=lm*!QAsdX+ehxRX%_xH=?yOF=+=xsW)U7FdGKm-Sh#mE7`J z7x9d`o#Bh@3l7l7_#u;uH)f!f8UyW=DW5U{M}XeZ+g;pOS0nbBYde*!0k2P~#ECxP zX2_h|p1T=s`|=Q$LK?Sm5hY)%Kf~d~;Zh#P-+bG`2G1g*(<2C zR)KIDi(DmI9<%=aV+Fe9Kl-I<^#mNnqsm^$mpN)7A&DL!TR=>A5SKi>G^cz^}g9BTvIUOtDPpFR4J8pakl7%O#6 z7_T>XQVJc%(0_@tjEQc$Gk?k$webkVX#Q)nq`8F@uz)0?^36BIh9Lq8os<%p4>N;- z(h88SRdtRuC5yiRm*c;g7M+^0*k?du=3zr7kKq=o9!H7OebvVcO?R;@U{i%{Zyj|g zUABU}R`p8keS3xWyOTBI86;v#Q59D~TrgXdw4ldZIo`dmaT)BrbHO`9~RyR6Ix*zD*mBV7st< zd#3EhppZV7+a3vISn9#vP>08g-v(I9S}H}5<4>M?)M~0hxf)!cw}YQvj$#_uPn?o< z72=I`1VUPJCEPd64;y$XVq_CktIpRr&Llz5g(?<3LyUzh3%Flda>F;eq{ar4X&ulDm9Sy+jRajbc4L? zkl3#8T^hHf?H$+Mf!J>opu+8O2Aebv4V+HyIz;@;s3`E&wOx&MQe7-h zZqJv;7@j#xKu$*VvQHHgdXa~^6p=?4Ma=tq^&t{klR(B?N-3V55T$*{w;O&dFz*Q> zzqJ8(6{MCY^2+SP#F))znTxq0lO!>7^ry^wTeoXg&7hYQc)T-9ulJDZV||}=XFcA{ zmdVyz?Uou~--F^*kRIg$6!3;d0ppWp=nKyc6ODp-?+@h$uIjA1v9lc_;}DkV7i$AR zsfua^DZSa0e$y8ykN?_HN6(SOo|s){Go}jSm;*f1 zXY^G@P;QAv!NcysJ4oShslKu^8CUMW#R^+9hjPgt5S!_EqEMQF?|8c3Twqi0s>>P+ z%q00;{zeJPe(k+QSI2ZOrIK`;4VAPAR%)2Ak~yy4-m~h5@J}Z%wh9*E3U89^{((&d{wjhRI{aVoBZi! zlQ3Iful6xG1YZ#XEOq;s1|7rZ5@h;$;4{Xe4sVQxg6~R)i|Ea>EL>Jr$pq}PaQE6j z6$gwNxXPpa9}LOMmU+FSf=}j&?u##e_->iK<<8I3I3mu-+K#}1@+;`O8I?^Vj;r9hqO#O{kl4^mHcs z9w3wrLWgGZ96aQR&kh<3x`ch>)oH9`@C$R(e%Izg(uhdROKqWzeflNS>lvbvgm%$) zqs6*>jg1Zq6urJwwLQuJE#0@V_{T`*I^(^rqcZWNUDW|QkK=H`Uk|}6vRAzpY}`X* z78(I7jv2u_A+gIbL9{hz#t*;YHvh1`+5!Z0PMjrq^zyp-hIeXG6m}{-VDE*tE}est zNsD!Rs@L{8Pavk<25f=|s<}G*rRG$}v`l}u`)eh44KxeziU$MqdbqemQ~)TjYA-(4 zgdv60N2O&a&n$?LTYi*dw+I9bF>mEY>tkdM!dx&439(0)coIoqG_%)bGUY-V%R_+R z5Sw<~fU-CO3Y|yrbOG(kvi+T}@RYk8+&blA9F!tY?mgq?0CFq`(5wG!a2=|{UKzkg zXvOWFqn_(DzcL{dkDF=l{GuvRHa$X4l3X#cu5Qt7`&o$7XAl!#>TOiuU70VMGhE(q zHMepu#>MpRPvwuYJs2H^WUed4JOtOC!>3;tn)%X#JC%!ZsNN^AcHXh#WKyyOAzo0( z^skD;55HzaWgk1`aA31c0r9c9)_J^mc1XfaTJb${JQv4L16l^@u18&BWKI#fH|-T! zzE;_7$(|NWxx4qb;IN2Kx%4Aezj31*9TT&7II0GeEA-bDE@@opsv2r@YAod$suT3iZalye8`2w z2JdP(*kTsaCt7d08PZZZVG{7N_lC;-XrlatsOxg=>%gUBHCB=rL$C;gK|b5;Ml{KU zVr+qj9own;LjjC|q7Rlk(L3Ry<(8Z}^bgat8;z5{eUwRH?S6I7H!8u=lgUXTB;7Xq9bbeEXQgSakQ2O*nun`)@fE^3 zr!$Tm1Oj8|yYXs^P0@qVnwGsFIp#ibrQi0B`VTn>{SVQ#r#5@%&S^r%E-y%RNwHVS z;EoF>^&U~wB}B^rAYFm1q%_7?y@>?b&OfIolOvjdztL82bE{y3TJk@Ov{L^$EYqS1 zOx%*7HjAk*tBemiNyo<{5SePN0ZxB{)3knI)7 zrjgXlchlV8Bf?i2%{((g%3YWE#RtlW-Yarq7|ZKoSae&#bbA(cky*Jc^7m1o=d=}N zcO>9HxHMw9Udl5+7o+xLNH`keX{PYCZ5{f$tvqZnDb%8k{cx67+*8p6S68POM9os} zX`iYY=mbP=mRy!YHhi;`ngUgYOi$ZhQ=|9s184s{ycD(Y~=RY9@7X?sz{a^j}zh`7-2F7H< z5()1A9dHkLy}*dtl+XWpCwhP}vt@*p?SGny5w#w2)$8%e|7Wfs*Xkkf>7g3O03Mis zXX)=0{JjePE(G9q@pmEoor1qt!QX{&v32-+FZeqJf3JeS3*rCky?_{=S9>hJ$NcFB Q3Gk<*X?VY0-SOrB0DI%F761SM literal 0 HcmV?d00001 diff --git a/web/static/img/icons/512_ALT.png b/web/static/img/icons/512_ALT.png new file mode 100644 index 0000000000000000000000000000000000000000..55d501a83682d355436521a9906b875e77742826 GIT binary patch literal 18368 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 G_xoRJG*N>9 literal 0 HcmV?d00001 diff --git a/web/static/img/indexer.jpg b/web/static/img/indexer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92024a36f27047bf774e9b2b93d3d4de5edc4586 GIT binary patch literal 43399 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 D*#GNT literal 0 HcmV?d00001 diff --git a/web/static/img/indexer.png b/web/static/img/indexer.png new file mode 100644 index 0000000000000000000000000000000000000000..aca1d6bab81a176af216493ddb4c413964f383dd GIT binary patch literal 106659 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

    0HmJ8_@4CKK+cvOfrzrLr?wI>a|R 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%0DuQ?+l8rj_6yIB_qe`g>U~z$G9eD08>5bT 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 literal 0 HcmV?d00001 diff --git a/web/static/img/iyuu.png b/web/static/img/iyuu.png new file mode 100644 index 0000000000000000000000000000000000000000..1904a7de0c9e5b6e80400004c0b40c95c50ec880 GIT binary patch literal 10280 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 literal 0 HcmV?d00001 diff --git a/web/static/img/jackett.png b/web/static/img/jackett.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd3bc3bbae96ca010f549d20d61d757fda09d91 GIT binary patch literal 24159 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 z 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 literal 0 HcmV?d00001 diff --git a/web/static/img/jellyfin.jpg b/web/static/img/jellyfin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8acb0982a15bc43691c4564c3dc5ec80d27b60e GIT binary patch literal 8999 zcmcI}1yohr*Y7@bcXu~(NC81QrIGFir8`7vkVaa%K|#8aZlw_^>6GqJ;BEAOz4wmy zedCR9y!Yneto=K)_F8k*T#LKuyCnciURq8XfIt8M0)BwI6_{)}2?-+=HDzfz1*u;G zm{?mgI~O=80NB~PI;+WuQ)%nyQX#GaFaSJ&2=D?_CT1>*{G$7opjp^! zsDn?kUtbqM4UhrE0V=>0a06@rTfh}y2cPy}%>HXTu3vUafCFe_29}P17vKz9SOM0c zEgQ&n16%+L@M#J1Ex?a0r~%S_?C+ld@OMmIEV=LfflWq}2LSlhySoz>062_9RR=uV~wKse=GkTZ_xL>e<1HG06g^p0EHm{NPP>1z4h{|$9xUMD;SmtgkPtz_L`6kL!^XtH!N$bK#w8#l#Kj}Q$Hpe2CL$pxr=+CB zC8VLFp`at9prp8W0s&1C5fCwukT59lu<jp@{ zfer(EKcW5*0wM$s9u@`^l7M_r_(uW)SU3m_Ji^^9fClnmuwb#kUM!aC|EJ3T84E_$ zuSbDX;osz4mA>a@?@Bbxrq~gv`}5ryYiN0*pkMpHv><23TZ8PU;yoc~-NX?QMsup( zUvf;-ss5!D>%7}o_5<}J0(WFLQXnU1lBvHV`?K*#!GP9(>JfM6**yB@dPh-Hb|ZkyVHd8ove zBo|SZnk{pbG{}E!5SzIKvO?P=sz{ef_NSnehj_(NKR0_U%Iq}iPg%Bz6xR|BQb$9L zbv^_S@vcsl`gk5U{V_&P*B!|`$ZmY$GTKWkVkES0{Jf|vzBm3`g6UKf@5eIYGBPIB z!6ziwa|E9xUX_UjTANn<(5>2>pTY-MkKZ(Fsl#~rW6NFQg(-xsY)7sAz2d}%cGce0 zz}O<}eLTw=>*zg(=BekJg-c3(z6dI;?BSUzZx*s74cAjvq51uG^H#Eqc;7oBd3r<` zO(Zzo#mhg+hmVr7ax^h=#TS+nhThBMXr;$fAjx2u!hLGS+TonPqlQ!4w?zA-=_O6U z(l0NN)6az#MUA67L6PDN8g|~9;u#FLLCwAejewojGQ^^+ zYQFL*a;0J#aO}sBJi3(Vm`LP_CN6*Uyx`TQDQAIer6Oya+^q{4?tX_x!X_~Yf!eDLUa40kJ?F?FXF@c zjUA!Xh~2|uj7ij`C!;D0-KAuiDV%isUU0$jmZ zumA`g1Qre!fPwk7N&~PE7&v$U3zrHT2Tzn5s)B&e$t~s=3$AEL;A#hfhq(iCMg8fD zJ#i$n()svf{Po)l<9AZbX~`bmYKN?}wvy6R2M6)VnP@M!9qWc~YD&mTxo8V0m#nT(`;eG~LNE0_{Xy=z$e}6xI0gfc*|O8aMo;yjT|;ys; z^h>-WcSz@oW#r1Z^B{o6YCxW5QQR$XbZE2J!bHl{nsDHq>(D< zxdc@xqd{v<5v5GSZ&Z-|iMzWnY^|gpWYY$y;1?1Ukt)!lcXHH9QRaCX${jG|nuW=# z&JhVJM$b@#(b|z?tVriD`{~0eUc^5eX<0oSw<@5ar7Qa}a@m9Mcj=9Hq1iunKHrWGV7>Wd&2Ck zJ3tZlT^B*Oo%|_L_!%|t?PHPhE8r6OI~Ven*ba~0QS!1ci}C)aWpBg&pG-}jMj8jo zn8Cz8tB3U%lWp>`kDT}o2%Q~}oIeqF)WKH1S#84}GGy5(e5`M2Qsy_G%2Z|0nUWFD zZ-Cm$k&9qY93@??#UY*gZG9uWB&|T<7&BAsNM55y!zf#6msRV%n~&-)H=e~QQ}7~d zP|r5uRLDou!)8MBa`7V+9w;!?Rnd(Y*SH8}Cp>UGBnMNoy-MA?=@|b}=K|xQpp>FKRo;bR} zU2sZ%b#u^NsNmHt`CTw>x>G%6;J zzverb_lSUo!V`(*4o>m`pRyj;9niLI9oN#NpSGQN+SC`v+Kd&AT`^Of zwNs1ksdTWEp0kxSzfMfv18%1cVHW0|o5uwP*i z{#wPsd>%|-0W2IiC>|9xr>H8f7>)Q}-3oKxt+zh-2Wxzv-Sh-MpD7b3tsWc7%w`P; zN$U+*rJf(@C?muXO>wb$TV~#WGEQy#7Pw{Y2V=ntk&)E4|NVUVe#bES-wj z=GB&@K?8Qh&(!HE2vB(}opzg6tQh{@*zb(?Eb;kH}eX@YK-;iOXPh0&o1*jap7;8`0M zJn6vyH4P!)Zz^nR8cs1BE^bkOT&Rj_Tn??cnu!w}7M^K9rSqQ+7(wKI1J*2UMqFUG zagV7F4HC0~Qdlx)?Obqhpp9I>lWEI@z=_##ZftTZ$45ruIhj!48xzEnDs~Het!WWU zUSOl?6k@DT;UphhpFcnDrEU?Tt#$JE{n0vxfN*|j!tUKJNrn@UHg~{-gP$c_ z!!~lXjBW9A0v}J~at)NwqD>!DF`1#QpGBmo`yllQ_?j&TY;dk|;rZtoC`}Iu(2JG$ z<;f$5yyBkMHw(M1?0KcV(pKt3ImIE|Ss&+T&Egg!k+b&X1}3%WI@3_~HaDZK)S3P^ z?+If{6$*bv^ivvCxnN~#3+mhW{!d0b8u0{o0Dqk-1}#|~xd0i?^l5};Yygz~)=j~v zo+|Hi`#wjcn&yL9!^#k+(}=?Ie9O>M`|?u9o7Lb0G7it>AHCnNd#wd~PPE23l^(~v zoN$ZeN_w!520a$OrrZ@mzXR610K4u7k6{!WqPpVdl59E67ef}ttocsr;>~qfNqwZ} zyKL5O$vSCQs2sXYYehIio@KVQGQSh-B`=Bz@i$vhU`*}e4AowlyNc+fhzplJi&*C| zBy)}0IE`kkaSC!u;@>87jpphjlEIzjc93nqWsfl2Rn^Ck~B7*as z4GT=1Vc=ol;r_ZvfM5gQsw`&WB&rHkiOZ?P@;^N47+d}`%ON7vcR)}h5A-WThzQ3E z0pq;x^VZz%^WsaFuJzX%+W6UahJiN^lHXMd6-&ecPaSc4=AN(mQE&t^J5y6K2Ob2< zyh5<5Lsz<0En`KWG+AnhoqAuc6>m|zvHO$~LrCB!nPzZmbEYg7vVO6c;7Hw6F;0bA zFoshik(zm<%4=Hs?5?u5XDE_E$HI=Du zXd3Lv&pwbC_hD+I`18bb*(?6%I)#`n{T@h<$je6EB4%F3mr{K4c9S8K@$CnRYBM#d_mz8J5!GVx+x#zVMK%2LowgkoJH#oHzHI~2(mjS3GkFL& zxMgu;Ld|p8p}VyWN7E%3JiBxGq5HLng#u?G(rhY~umn_|JZpnPp@+l5xiS1cW1Gs) z9HNg72$=b+6_n6Jq|sC%sN{w(Dc(#QXnd^F7)I%1eCTz(|7MSua}zzDmO?|DM43oaKo=eWFO5;2R zizhMt(~o7lbkh#!w^z>}C(XExxs=6PT_FaNz2dAUe3e*GnMElvVd;ZUsESmvaoi^; z&!+hq*@FD_*J> zOE2nbA9jqe(qtgx>qhDXb3Zb`%$uhU;>b>;vMInL>s?X)7Fs&$IGJ%<HL{UN0ZX_lr2kjOs87piIwfK`Ni<*SQEy@oVRGcRbwu?5l7^#3Q{tbr zi1qxBVYuk(Lf#!Pt?n_}1^e4_F2Lj9xmN1{yTfxtaFqU1d`1u>d@=D^WYPD^0sFTp z{Nm5KUk3Xe-z9#5R--!rVx%ud@&bji3BvoUQBxoNI9jr)dBUh${IGxf@_qS}`;wM( zT9kD2?-u#~X~_R$0B#aY*x)AdD~11k4+Eae!2F$)8Y)JmDr({cZW8{>Dvo1+&ShA) zJ_$0R@Wy%EzU&@qZ-h8r&U?9PJcvP_jbH!%uIf!IkB`_O?1jk)B6Z%+rY9v1?gJ!}USyegsRIR|yiz#z{*Z4b2LXMj2V-yOQhLIkZ z*{R7>jS@Ne^XVvSkMHl^m9WC&sqA1FO-(^c1WK4m_MX>#I5IeyP5v|+7rLh}BZDTw z8$F`@Tq6t(SevlJ#$4ptGe1v?T%@5f*+SNinV~}!6-?`@xs%W=~*v67T06RY2#W)pFu06+jc1_MN!DMhx5)*Zy}_TbR<*||rW z0KBW){;xwZ7)cl=)${Uy(6p<-^5zC2ACVKO0LU7Za#+;-9Kzn}QpF1OnF+G8vQg;_ z7`(M4XKG23v?)I*Z1Z5Rh@M~<5W%E0%1d0oDvru|bDKauMAe_-TmU33o}JUuBSP0V z#suil(Am#TW-jGD#jAXuSi{usqR~#|4B))fIO?bcO5?*;u{_uifH_RJm4ef(5GLa5zqT950mI4+DEJ znKXQiZ*HGPF7rbqG?s(b_p3g~ByoU16uHXh_*_N_9K$BFO$0RBF!wmKEG0Deb zTnzpLM^S$^2UliO+J0*y)cOZ|SH(K$-!#v@GerR*R$VFkFh{^@;3134Kl-L9XdD)b znlxKZz+2)<+5<%zuerJh0@NoG&bYh6PK=hMmo%_bq0Ki3Q(4 zA0f;I=c0eho4&A=!*+NY47@#{*2#=gk(7}c!#ijhUQ&p__WcE|$Y>x0TnUt%v@nq!{gU(9RMWK=Mbb+hZ)WP9yQuee)2hlLH zs183a+y}w5IQ=KS$R{2gvGP?WknX=<;u!qYuN+8*9R&rWYsGy<9YPR^=;E+%#y&&Q;Nsh6NhJ%Xo=iHUfs?7FR{O9-2eap literal 0 HcmV?d00001 diff --git a/web/static/img/jellyfin.png b/web/static/img/jellyfin.png new file mode 100644 index 0000000000000000000000000000000000000000..a46021fa9687d41f3d2d87698c41fb82ca0ac86e GIT binary patch literal 21925 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 literal 0 HcmV?d00001 diff --git a/web/static/img/joyride.svg b/web/static/img/joyride.svg new file mode 100644 index 0000000..49c4fec --- /dev/null +++ b/web/static/img/joyride.svg @@ -0,0 +1 @@ +joyride \ No newline at end of file diff --git a/web/static/img/logo-16x16.png b/web/static/img/logo-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5bf4925d7ee67b35a66ed30aab8b90d29320aa GIT binary patch literal 6584 zcmbVQ2T+sSwoare5SsK(0BJ%BJyfZJfb`;_g%FUM0HF#3(nS%ZNtYrZU5b=Ym7*xU z3euz>x*%2X#Z#Pf-`w}^yqB3j+5g_({?=OGUTe+l#OUj3g2-9P0RR9<>!z9^;g|jA zLqkgV24@jX005NwPO7T_m#-T1MoP1~Wi|PGfzUOsqJ7@hz znft8+K^3b_mG|U#-oFQ7Z(l}Ns~9o~J{4ZNLd)~L_JC4xgGZtR$n^Hc6?OjV`Qu}A zz}no8Mr&&#ARyH$9B#4DHt=KOMXIP6El^E9q->MUfL8fCU{DgAW(kBY0?lt5yrTyg z0Ye0C-x>fsqX6!Dn)rYK)+xQS)Py;08o1q*$g)yYEkR1dh1UEr`-pklP{UB_x37w8BCO4CF=UO4ED6 zm3b=YU`jc_9sjTIhyn5;4F>w`i2!8^?xq(Os4svuqD~hrspr*Ndf9NeMVElCI{yPo zfCgYaU6k@M(3U)YVfYQ~m9xBvCLJeTgKfguda_mYyX zl?1KRN62dhY2xB^XmbjB6U9C-Y4ntS%}wQDycGU`n*aEn3hXOSEs(Khb?28Wk#-HcwX+(D<9r4XW_?e0sa2=KyLROGNs2;#I#Y&7ZFc@G)QNETKgQt0~s!yr)D(!g78wMJB*K9v$@}&v<0Dl--3o)Egg;gu= zkhp2$hq7^(Ih4tUTjxhKYOh${rJjnSD%2dhs1?|v2t{D{muwDpW62fqAjv0Nz1Kd4 zP2O;gf+%=r;^fJUJL50%l}apYNKZwXWlrF&^EKO!`OGjI_{)gV8zm74t*rbwebBs7 z&r6MxWQ4Y4;Gy?9m8>UO9=|fB5V`*4_ibOk&6Tm+B{hsU`82kgWeIf}F#xy)Q*;w= zdG6DHw@oY4|M=wT!${CFzOkth=(NrfI5sd5`-&Stqfwqybn|KPXs)YdK)D}Xp?H&m zz4rMs7dZYhuU!l=IO`ps=M|w`J_nlp7;QU}SJ{&)o7Y+esICgcc&W*GBsOT`Xa{2I z`P7{g1uWAr59Q( z1}RAt%c@t3WrV|ebC*W1mpmxRdu`}#e05C4st{4^{yV6z0CZPzOXX}N0S6b&6Bwyk z>pBPsV6wWMQwSM3TH`$BRn0*5VjYfQdCX3aEW7D7Wb+@s3iF8ei1bJvdhhq%9{%{* zp$^7@PdqDaAhX}{C#y5@z1t?-^R0 z^tvRYl^NJ?*?&imW0i7MYBi#;urRr>a>ZOXW`(`4F8xe$z>od+XZ<{8(?|q{@&{*qQXIK{YFHs$x-&TX?#-@vBGvnn{JL2>S9OXq z+{N7_wGSaaW{8+PWx<3Yw!1G{;3h6>dzxO?UK7ZVwH{~zuVsD2^Re! z(bh9O3LiFfYV7*@U|CM&Ua5Vlzv)@owz*eXP?=YmnT7OkN0a80k6x!Cja>FiMW@Gm zqy~H*yTxva$lb#m<14pVH#w)NUq7ja)Ku2BZ9U(D_9Cm_nnsDl>1cBGTjc=<|=^$I-6;Ad9(4djWM4~W-1z7@KN{y9}F&dWnq)&aB|J# z?MS;ckY*7CxJWw^z@r-jXXmNG9Xjg9j zD77s%IP?eSj~?DF&4-%qTqoS^!ph85{Lgvgxt_5!$X20}mIW7z%k#I%EXdGgTbBdq zH<>fJnx&7OqFtipm-OF>gyz^5&Z`MBu+rY44dBsHx-RP)G&zGU-Tk~fwVQo;AbOov z0L+pAOZdQBshOr8ljo!PP3@lMz#~PDe1=5k8pW0SWkzN4ubm`h5djCiL-jqAaS3rw z(W;ilpL-kR_73+F7lYY9u(K(>4%mDfPJ2b1?hYM@PJn+~D=>}zX|2S%X|-xKyiqnH z1Fnen?JXT09A$XP;q-RIp)l*Vv{q_?v_lo#5bk4t5J$mQA7HuaH?X(7SgBi;1NDB> z7<26^g#c$(XBJ;34w{&dmfk3^-vZTZFqzC?NH$3vlezS7?yE$+9HV$oSvX3mfe=utbE)~ikI=GYvqE!?b$A`C4VbD zE)_OCZwVOw-OGg2Bx4*qE;xZJdu%n`(C;u)?Y%RxTHbbt!?2~YyVk*=uN3r&P0WpQ z%Dn!)tI={{eFlF9#x-Wrux-rUWlU=2^{^XteUU5XWPEjcMo!1ac>B1@sHp~J_NHP4 z-{QM7i)wOo616BT+nSQQkD2z(os%4I9CiETSX=3-bSQH4V=rjsXo9Mf{jTDgSJgJz zG?z0K3wuei!0$z4M-oetIEg~(*IaRmpFc0n;nsSPO55^w{spJS3qvn@WO^9cH{`5+ znvcRa)sEhOPNYs3keov#`~2R!{;CL)86)d;ShSm?S4UjWuEd5td?(xH6%~AV(zwt( zadK)pFs|C>cj3AAU?So)c9w~4I&eCDO7k@rUgG!R_aAaogPZ8Qm%op}%%&^(ZSWpJ z-@nDNeUj#!yWV`VIWcTAH3V@K1x3K0t-Z%OShhQ1mhGF6#OTwE{bMzByV$MU+kI<+LS9e zDP#>S4V-2}?jyh3tS~FR=%&%Y|U)t`TTM2 zI_hK3bdY*b5IooNGT=ENURJh!KP$usVLM2Q?S8qU1OViwTL8y`5NWk?&&-fzUs#kEn@jqKzNB!aI*T_+iuh4&EWYaKAKXY( zfX9=ye*Qs}iVHN_AMp?-TrsX-Z(4W(0F3-UAE1^Y-!1?^Lg{2|jx*QQL7*^hVn}<8 z9a_xK4NE`+0P;$HSR~2?jpMdMJ36^5fOqh1U~VUS1+bZst*ioWY~Gr$vV6rg8} z3UEQm+Jlu8x#j&31OhiS4$1B3=IZW+@KXT)!HXb_e@;Wd+*{l> zVm#5@l44S#D42u{x3sJnOiBVOE_Iz74u#1=pfV7cxF{5cfJz}GrMdt5fC<(-?Hv$? zY8rppBD^Vp@8WP+1O(#i>nr9fE{5@RgurBF2^??;94<;ghi-3jw!eZ}Ya2T(HqCAH=GbPx1gDm zyFJF&OXwdP&}v8=S^*4)610ZOh{9!!;V^`RI07ai0+m5Pp?^YkG4@Ul{{Mi&V4`pt zW0(v=5{iKSE0mBj_DCG^KZ5O12nUR(8i$Xm>(i z^CUDdrl8bp0D$aJOYMfSdBn^!%p-b7jvl3fkDIfz9zAXg&xvK_^eNdQnzY^0g%O?+ z@r>!QfX7M=O)l45uI&K@me5a zk*Dq;#Iyc0N6+k5zkKUt7G5McU~2UB!I{HRnq&5-9mmzQIm{7-S^VSql}hi;U@^Pp zFXmJsROY~eP46jKH-mS3YadMHvNy{gBD(7ZA@^jd=xF(Ryy1~%D7NVhp|d4 zg8Z8OZ$UU&RwPd!EgIB5)qpQSchdJ^+6Rjx$`NIQ#)2>jhY)hnC{uAQUes-jeC_ex zvP&>L;LJ_hdvmVsVT5CAc8T%*TYHoB_?-q6Ng|l1ZL2WuJosY`mfUse!f3#KTA!~Q zIXiIF&}dvyfl4dL5(5rKX|%e?)QCJ$BO*bF(tJxj6Y!zB%WfCR*>E=axreDT$lgW@ z_@~p~JT&;~k1=?kiXV9&5`?PAVK3&SWvTH!h9B6!Y$e!8?eGj<_vG}{?TtEqb=TjY zo0K~0V^;o^yKf}x)Qeu*5k1y9%)%v2=iF)3>3*Wl1!209W}gY}IE%u?3`@lG<2Ze6 z^w3xA7?yiANhKB^CG^k5yIMJRKlrK7){0?cQ;t~TtCE>l)U1TRd@4H~zueO(2ehZX zD!3#6)N%99NbQcWrtU}xCyS}n>5l*2u?<@A(x5t!h;qC;W+yzq&`CK;!;bCy94N)P z@@(yGNCW`1=gu|>5DqgKau!?_MjRsHf=r7v*Tj=6n5%-MVo3)YG>B>3qW7hUADZYV zpkc9vvdzA(5+~PuP205CCiPUR!j{TOf2;MEnADq&0Om%#Av2RxM{MSJ6p)??S3pdbY zpAS9A)m9{Aw+ko{9rndKxBU~h3gu;+W0f~uhgTSYOovH2>MB)>iBD>Yt2V}zTsbbz zre`|(O!5t2V&?O2I%2IDt}MzL(9?y}TM^TMy478jkLjHk6*s~rcAOVfM_JD9(inyV zK0C`9>?V&-*VhUk$DZ}B#Z&jZofwM%urJz20P!=dr5!V79A>AyWz;yCAe9?0UGnr3 zuyc)%TRzbHb$2B|U%h5Gy@aKTCF{BY;A{cg`g;}Fk%)-j;!1Ow7jF^C+W-vlJ-R&K zSaiWNaM#>8(^nofpRX`+Bn3!#Q~+9N+-@aulq@^{S`-I?>N^hWRy<%Ld!k@8img9s zK8X&U?Cd?Yoi4u?GTnLhXJp6h!|gEZ~)<2)AR z^Vy;{(J6xFbfVC2iaOzm!lu~N?`4){w#k-LQ)RY~8->j0-&&4vE07rQP+hhi=-?&D7U z`+3u#q^+t7rQi8jiE}X0x9>VU6{sgvX4*olu$?OTD15Q{dhVx>dq$+Dr?;F^b{&pR zuqrARrnoZhvDBw;+9?*4#$=y&VGcJW%H-=uKZ4pL872I>N_aG7HJGE%zO<9t2CHZf@uCYy_BSL{PL+2U;BwUfp#X`4a zvbY?;;bEW5mg0dBEGabi2%o@X*a!a_pyJIJ3W{B0E3f&Z1R ziEf;Qip#*IF~Gs2ZP0Dz2H88v3UTZmYO<@W_iF;?*0hL1-=B%LBZ9pAS|YRE?tP1) zxigg!h5!{!N1}y@rB`v}M79f)(}2QV6-`yl>dtXp(-pkA(Nx75Ex2k9?-M`A*ezXj zI0m1Ta{2~2d#w!2#SgVsi=BLQWiv_kE7h)x%n|&}4Pvy)zhA>qc}}M_HGpR=dY8i5L;BcJtnR&5qCYK!)HIb%1qJGVRvS_@f z0&VpM1~Sj>On`|qfGl0K0|nS6`&_S%L5ouSExpnYt(J?OSgTSD)z6nNVs@zRYMO{Y z;bZl?-FG3a4USD8==6P)kh#LQpz{#0?!*gp6#+77I( literal 0 HcmV?d00001 diff --git a/web/static/img/logo-32x32.png b/web/static/img/logo-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c96bfa4858bc908feef6e62a94870891e3c405ff GIT binary patch literal 9909 zcmbVx1yodDyZ#`h4BgGpk~4JY&@By8!_YN!BOr}}lpsiV3L@QzG}7HjBc(JF7k{0003Bu3No4xzx=;%T(pPh;#6HG0D!4s z3x#UP*t$78z2ABEzXD`>d9 z(M0`DjNVWIe5K0<^2jBw(C&1klI381YdHB$_eCH>c5VC7ui=aIleUq758F+ZexgVH z{aDWGk1eaEHA$W(ux>oTqrIs)#T5Te%iD=W(k1moma%&E@=_nLvvS{PVuFkWNHGrO zHdt#Pxt}RW;o!tWk`WCm-^YK3CwT)H<)ceALV~O#>8n5MBLrw61u?5Dj{x2Qk&az; zJh1>K$pgzc4|7VmfT4+?@MMjrBdG54fMaFZMhwX!^q?}{=X9tI{(xXv+3q=j06`G6 z%GDe2EE=1MH@8V8$SsVZ^PC zf9CpVC(0&|PmL-`0xD7>e5MFML*9^fQPj^(`($8}o*gSYz1@e}X?Ihufn5w=(jjI* zFFVWHj>?<7PEs>4(PRZ+OU@-JY4!j{k&0oAs8L*Y!+q7Fo$p@68l}czcA#bBe;JR& zeJie$MvtSeal#g@bp5@6e_JuPr}zLlx+PyhC$M;e4yK=5N?fYSj-_@ugO`%ueLj=G zfsLg#r6xwKoJcSwTxl5{hw>KuHJ+%a?5gH%1B4DKh)B{eDT%2xV3#mVR53u_Jyr!T zD}Nx7bC5)?x9n$53N7)Y(3d!jmwnP)KWQ6BmqxMLt{Et$`{IFIMw1Hd@~ok8Pz+l9 zXWjcZ+G>DCifll*^R6By3WuG)!1ABQI71YgMbaM6UF$uo9pDxyLQG zkSlsFqa-E^hQ{Om_HSn^<&@@04bx4Yjcs}vEMK&U0HCMIs)@?3Cxka&*x5+(&iE2*qVvu~^`pURqEa{}->9T;*`?n@K(C(wKPNjgEk359i+fCO9)&`e z(Z}HWge8Z;3il*R$sF}#=B)HSQyVij0dtg_jEGBOgSOgShc>~Kv~i(uvC|&b*L*A+@dN2!6Y=ic9J$OBpLV)WeSJxc)w2r06Bj$w z*Ywc$umNYQORii}+t)@tgmOZ8(H}!xB3;5=-j4Nq_giqsygOGxSTXQqq>iKy8x1XX zEcS|aI#`RFomcC#!;^W~f{1$Ys|m|pr-i3Yrd_5Pb(z1{h8Kp1g};|;kP8pjhG)vX z?V*l=lc(@f+qS^JS3AzV*cbHV_apaX@e^r|3W#6of6+U(KI`^KP%+(q*l5^LjcOZn zn}0j3u(0rLVda*-YSb3x*V?pSd?R+t6aIMxm7DpDqvVwZlZLsqTHiybRVzs5=jT1= zrRK@zF%B5#n`_l=SEgQ6z_WQ&n3b5HTi2=8sa}W%O~Z>$>2$f?b!bv4a+_?=;%%I$RT676zKFXVZt9eos6UQv@!k$4^$e8+#Qb&Z4h z6xkj*IJnQOtKW-Cg)eC#sTyB7zo^|TOonWZOqPs@ zoP$r;%>C=m0qB!dXULZjVysdMciYjjPAD2W7BS8T(iX(=R3{?lst4AC+A|nK@%rf9 zD3cl!T($6>1FsN#Tr5=JOJJmpLU$Z8^aUTIYK97dO3`~K9!I_dJ|2Nrki^sq9udoF zM<)wvi%dk@z|A|Kl(1mg?65E9Z@XPyNnD2Cn7yD4NS^e49b*V5d`;#(`h3Q`Y5ziRMR|jk&e$Cp=l?UYe z)C)LuZ>qtcDr?&hvJW5wu<9<|2)0-id79owy;!l1YWaypTA5n46SCIhbAtxoS~?p8 zp2CZdG2=~CPwSC(2*&Uazi4M1#?U~H4nKUgets5pD zCdSMB%c;wJ%QFGq;y=V+1q@$v`$PS$e^LJkSl`|(Iu=>INNIl+7<^BC-%EcWA1&`h za|P;Pl_afV%%+c{c}LbDR0U7ke7aU#k#~r0fNqI?@Yt7dpERAOMc~pl(mqmjL!*x^ zILoYXRpu!XIi4Y&FRh9MyO2Y`?2>cY@#69PapvQZ$Xz^UId)5LXET+2O30voc~B%52PHV zq>!ld-R}y;d%}Znh>wNO%y_8ipGufe!@H|n4Xx&G6bgIKEpF*GP&PR_NmN2*+cjZT zn4vD9n36AGRmH8z?P+lu3#6#`HQM$b`LVfPsall<@%Y>r#Y6yPrq1}1!I16_NsLcT zYh*rYg{U>?%)TdjtCKiIj~_W5nQ4J;Svhcsj~=NPNwbNvQQqg1P7&A4UC)NlHqkMu zmjM}oeUfQX+ga{)q>MU;U$%Xo{2U-lE}JSFQE)x}Xm{8A!HfWn(JQ zZ-eV66{AdlXo4K7I;~a>D^-#y%h6l3WZjgu%mnVuRqfW2@sf&(^g@ob^J4av{e|6A z_p#G0vSgmE;RXR7@2zBmFXiP1Uq4k?gWoL)F`Ey6XiRTJbqh@07DjZpv~L#;BMi;z z%!Xg0o67p@JpZ7@32wiuy`OncJPu?8g4tb7Yn;Yj-H=MNwX&zi>e<&atT_r!N6dNs`hEwk&BFTkjPDT+QL~!u zQ%?3%{9AS7jyUy24v4Gi?S&-~6;JKM%POs=PjJ1@A10bxy^faQP1d#?24&?3^CB-0 z3tl-ZeAA7Sj&s&Em97%!Y!~-G0=6z@u)k2+i0`;n9ilJL*kO}VmKHPb6-{06Zt%JD z77EnS#ELI2ZmhWP^ui<#Ma_NkuZ!2l3VH>5i7CH}n0U5agzn2+^e-mjq%rfY2*35* z8`%9=1Wu0j3@3DC^#ih4U$!OZ_5^!@COED)vy~5sdwLdd%y0Vn! z_THuWTkK&*X>*}h{oU5(LK}8vY~F?RQSGvNOW^n5ozBD+ZrIf?vRH%(qvl0|hR6 zE|vofPJb?yMbGq9dbR%WnfS?nc97?#wft$h@^G7#TRGp!gHns}Bu9jN9YT9sLd$^DVorE|@)LZz0z|qnj z2J&`vaB>s&7Nh%vSNLK4dm2m!`UB!_FGeTzTOmkaRRaV?xLShvIQco?T)cuH0U=H< zeqIOR^(hcrv>+Eiea02~igqb5e z+{Ne~EdA33N9TWNo!tHk(?h_(-Y{n{7boPmOMd_@;Q!#9JzO3BP;LPSTRK=eS~|JA zJz%;1!8+R@+!1azi2s86pXL9g;32fCs{iQtx3)Ms{-eUpUDor#jlTl&Z_#erKF*e4 zO-na~hb!Dt*7Lzk`rqC-3qxHkVeSZ5Z3M#M??h?*Z8C`a!E4Y{JzFOWgqIu3zX({$ zz}zjx=(r&dv4#k8a0_X3a|!eE2y^kWK?H>%kUycS2n$;)pMQaJadB`9YI6w+^Ff5U zg#Husp=2yz?y&z6YylUxLby7@9vrrHgjrjHot>=dK>vhM7>aN}xIQR;u#V?n=M^7L z+^z^KTZe~*zfRtN7^$i%tmx$C4s(KAD$0n_J%ohQ*49Fpi_gl6PYBM-!4I+G=73xB z@^J|ASwc93c=#a?0|5&QxZvONG6=ZG@5KKtZ}A{+&LhCX&Ckov!3~GNA4qs%9D;B` za}GWW9)2MU7z764vie(I-PQJC2LT$)B8RAr`tZf{L`;3ogS!NAG&d{xy23uK**#hBc<(~evlrJq%#$8A@OT5rE#dk z*@s4QSB)?|Ne02Y`qaQGf>8O(?CxGj0i(+S5u7-@t}%*skZ7`YAv9T#OU-V~Ahoxs zxk3)pC-qFbTEVEG8O%?w&x2pmN4iL^5+v2q@^!HhynXt{Zv@kvkO5CQ<4D5oXy5H{ z>DRBNUtTZT1BP!ulS$`XZF8sch}~yIo2Cf3G@;kEUN+ue{!rnT_q}*=yKTyRQ~6yW zVEbAkm#`iz>U@$}v0`)OWfn)}NP|wUXu2PS|Mk;!LQdFLO`bF!9eM|NxMtxV3IQr4 zAmu!*enZcQnlJS8l?N|3bt8Q*sJHJ_yxQ?P;K<}=E`a8>`t1P%d@r%`BGTP$!6!@N z{sg7f?Xc}$3i%r*>e?q`_p#5sCv zP2i<$N-z2{Zhzb%WX<7*v056fIU5n4w;hpkv~#{oO}&jN-7A%Caw#BjE;Xia7h@l7 zz;1WujxD)8p}zLGC*&uTC)D*><*yBHmr_oV(0#6>roQpJfMyfi z$F3E^uN`oi;quo{XT2aS6LYhh?$wL7B^#06;v)h5&bM8xn6r0dR_No zR)OA@d_nh%$E1Ro*_u~THfr$mF(gR zWIfe)1hOorl6Eb;(vL7VP7#(vEsL`-oxiVKkrvj&{f_%xv$xoctcORu+PW1E_lBqE zD<7jp#I6ZEQAY~mI9*fszGvcMntd+|rpBqsb-^Xh_0P{qD6yhPFEA#edem*qXga0g zz_ME!now2~L0!tv8y_(~?n>*f!J->Q8R?m$R^+YJh6=sTiU~MNT~frM&Q-~$1Fl8) z!9b@laZTKFS#qqgg4Ef+9KB}k)k< zN?JL;Zyi+qjJ6ur>a&`A%&~&hEDx3YGMNXg%8 zWY9%@s~ou4se6$xVwP>dHQ<}8O+`>VZL4ChjVIQ(=g4=Ssyd*a#3` zvyE2#NXPr+X?EGa}B5w&Jn!d!=B6W^^s5M(F9v{Z@INYhBqMPr}sN(0)j zog9H*DmH~q|76V7H6E#{5BNl?ayBSf@(CmRV~X;wAR9bG8(beuj0E8^YEp#(nL9ps zog_(^ujc4gX-pW$7q%QK5Aqwb`FKcrMGT^n#;otN$GMV(a#z>)dxN7XTo2jC>qM}# z^cywPs%s?-*I**-G!;1}28J2tbPe2%5b+$^y{Kyar=H0_bHd!0HZUdNI>C$?kf0dIxj1aRk!ncfj~InrK+&Huu=IZ_C~Um+q@~S4 zMgh&E=oi<82E>Ob)g`>aj5K}{6DH%Qfs38H+?N+zH(|9pgeyU#^9q{uyzFYULt`7F zgClYWdn3ZWrnN=RCbr>eV)F_Aj_2Z&M~LJjU-g@Y2@;ifsI)$&2tAhkQg(@cr0X;5 zd|JEi+@Q0dM`I>g@w%iiNkLvTn=X1O1=_K=*%Zl1;jJ){wO_75;%lwzHCC?r#g;x= zHcT9AxydIfs&U5-TieR9N`l&g32ZF5k3+={#G?fo&;dx_0z+3;vGQzI$CF)fKpuL&GDlvux4LdM_@6*k}xlyPM zJrPT`H7_@8jWzINI_nyFK%@PSW36WEP8h0vvR7jk`Q_T;fxtn1+;GwLOTB>gU5vVq z$yR76Xuy*Kqe;x6WdWU7H)ko>^ga{vOs%O9M60t|_iOs-Mox9FW|#WI_h#2S6|AEb*R{QJ^pDzv5L}{Xf=`>3Of6u!c6*8jml?~-G#Q+0 z^B>rnp0gWeTU9!7YnbT#$az`P7&V6mB)OjZ&>xGvE-kU}#tTyKoJj@FY2sy1H;0A| zP2HUz&!AV)FT)zAWBak&K219y5|2Ns>J_I-p3KXo@;Z;4OMDW-u|G1H8{5m#E-%*T zM0NahXqRv-IguhvOscUY#Hac>?Do^5HxNg{H=@<3lUdK?lkTIKIw?j56=r*GJ9kQ+ zMFw)-p&`||%x4;hrMRpOE@ym$`QeAL;Gy=R&YDAZvL`c+rVQ40-m5s%PKIWybOCqs zPpD(Jqr*yr3&Q3v+ooKeUr6IrP`OQ_pwi6pj#yEN*8Hps9>g-5^8GPTf}u259m7Ds zsc1C)SiVSObTrKghnJxkcqV){TcS7n!LSea;870k8ZwKhwzf_LT3g-CnnyFyhQtqn zk|I$`S9#0+pye8ECFGLxPz>Iic<*4&+PvdPOd%5m`5#XlGKN<-+(Cz+0Ys5gm{pR`i zOjN5&MQ->i@HWt9OGr>cqymv1EV8v?w!FTI+H8uY)L{R)(DoMXFul%Y+X*QD6=aF* z<-WMOybjZJk~STXRlCk&otgJOLvObyxg})DsXuLuubJfa=!mb!~O&N zPT4mW5R8*=R^xwZc{EtP18Vny?y;bHv0pxKocK(sLvYy^JhFR1arupdjXHx_s@Rb1 zIL-On9&KS;%DcEIJ!5)l8au*BUw%r**Ob(B1U{ILSz1QpY7`0H5e%0xGtv_@w*hJP z`ZDz^QGM3J(2X_%b&5rd)7#8kx=r46N>7<~Q^nj*FVIs2hdnWlnadBC@TB?SM%c1* z@m>mb<#OVv!UucyJxvu9o2iK@B_YpLkN>T7@oM7z@tCUSXDC&Dg;DVu^H!rRDh^xn zefO3ld8VesL>G^C;;**!_S!1HS{{msDpL*?E5LfD!$}<>VsLs^8wqqH>4FwGy9l=ZCN0VF|m{an%!I)p1&So|Ne{H%oRF?epCk6O+H^rh0-!!u?!;<+9Yb?=ZQl{q`-E zEIQWaWFbJIIUj?a-m<$SuwJu^1r>N5N{kj;PVR0AG~GKmR~Pa2`TESDI?g#NCG=7C zGo)3glZ>ldNhm8LG7wsyObsNuxf*X@CtIaQuC4J;&ZOfZ&NP|;1F`R9FF1srN|mH% z?yaS!nD`$T2d8i&2SABGAZ}0Edd2*!)&qQ_!@L$AO4;jiUYdm z*8rERXTW}QSL5tedwXiD`iR2J*D8!?DMe~0^-9ebVg!dirMc>x zL~J~3#t93vP^NqMwBw8?KpRkI<4lS>RJoFr&Mm7GF^#W%)VOFkmV@TdD!xxp%aF%h z@CYaPgK<}GTOV?gh<#3N0?qAqy%+*Fwk)fx|vtup1`)Wd@v-V4t$Vq~KujiFht_zgVlcEO6Az@vsig8c?v)n#wR5kfTePR8N3^%4S2%q?&-?n^&p*5ZhtZB&yVV1n&-JTyrnhAO z0^qq=(oN|?bkue`_=cv*YvkKVX7KHDzc+HoAhJiuAUzx{rG+eHaI2|v^K_-SbF*I% z3ph7>{ZtjcfI-TI;$v;t_Zg(+^%RYTYqr_teaq2!x7Pv1RmD)MVP7U!k4oAIW;-Y1 a9_u9nLySIjfA066KZ>$yG9RSPUj7G&!uX8< literal 0 HcmV?d00001 diff --git a/web/static/img/logo-black.png b/web/static/img/logo-black.png new file mode 100644 index 0000000000000000000000000000000000000000..9e6ad0b476ea726d816ae8d1543e446e27856386 GIT binary patch literal 72840 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 literal 0 HcmV?d00001 diff --git a/web/static/img/logo-blue.png b/web/static/img/logo-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..7d2578383eab866a7b6bc495863057f7a9a1f4dc GIT binary patch literal 26453 zcmeFZcRbba|39uIMMfc&WR=aa<=A_ZO*Y3KN5`?Uk|bn@Z0aDH$=;GZJIHpjJ7$Pu z`#le>_wV-p{662`@9&@6?bYjy>v>&|>v28C{V}c+@<2_Vh~O3h4h{~HqJoSj4$cK? z9Gr8$mo5UID0Glo0{^@0qF~^PgF{G${qG!3Qpyb+9J~!XZGE`DstVW=>cnXdfm&E` zdOEoPqj7LV#64ZiEgh`jv=&x2cFv;o>opDZw000tdOdzsE>#z4D_c8-$1p3c$7!(G52kcWo{rw1=56lMeB77_yH-~sXQZ~!AXT)mv(=AInRt_;6t zkg;;LgxR^k?V!%I*cr_&pl)zcdVtciEjYRSnbz6$7n=ZvfjrG!K-`>M*e#t7gjoI= z=i&x)JY5`O39@puagm|BQ99g~Fk(w$T4!>OWuq#{vLrRaO72@n30ia{9A` zD_qtc*v2o0{MXU0+FmYJAWbV*s2j}EO4c19lL5OM7qB$U${Y@bX+xoozYprcZ<1+w zfL+rv>)AO&pdPL)|2$wNV-B|xrRU)Sc+Jhl!7ZT8bsx;b4dxYK172`(oefomLhP)) z{@YMqelRche+&gg24W63|6d0~EWy@Ln3FlMVLK;t8!M2Dvkg7%A2x!ep^i`(urNR! z@4ufbN=rY0L9Oi^fiGM&<)vs9Wu*nUg#-jRcsRLF$yHSaD>}Qv&7Cc+6lFx|0p@Vp z*+IZo++5b?))tl=0+tpQ9QOtJggDFvA>14gh>*1qKOZkYpS8vB=VhRlZdeh(K7XbS z5U3?E$6xXUA^d#i{1*2)1gr$DIPTx)v*Ix4g$Qy8nRD}4S@K)o7ZecuJ)1hr4p2yQ z$A4$VQU$?M#c#<2vEsYWA;`ze#bF`9$HQUHeczIU$I{B&%1VfzTTs9XEB2?71Xi$f z1oR$9DgXAO9yS|9alT)(V*P|3OO5 zR(FM3!#&JlR+2UV@BUXQ1pQCMyPCWIFQoq;9pxEK|BdwjklOz*r2k@zrLDQMjTK;F zLG;+ofUvgc>`*}e_wzda?jO7LdpKYWu`mBvVc^XlJ8tC+Obr99G(FdYDjXbh0!0}~ zZO^gQ)XOQiWk-X_IIHlwoz?qVNlD3xJV|A>pS7&GV;mJkc6A?cs$V!K`5;O;SVgDL z`AxJk7i+NRwc7hKJUAqd=G>yS!C5&v1{KPUe)_}}>?!G9?EALjcXiTyL*zf1lP^ZmOdGIRA7<*C!n zz=QwvcQ~?8_mZ-KpqB9BNOm<2uY$O0D5MW=hUkToM3X;W{csJGf2BR$?*>iWAtqDk z!Lf&*?T*s%iPBI8DY5gSYJszu^ZvJsr9Zm3hGoID01^QHXvKf_8BZ?fILwE<`0Sh6PG+L z2nyOuAk6Eom9p(!`d;7|^3OBuL6qGO`v_OQnvkm(Q9O95?h^Zbi_rWqQpzk{n)Qmj z*hp;HK<8`}F?K7bMA=d?suVb{;16{Kwg0RM*|=%~S-d+=Ywvblzo36aWC7pZ6oHEj z_{HhXdlXN1PYBF?DwB89mSh(y*7}6W)2~Eh4vo~7C4lp|ggl3xR)Sx%Si}CJLX(_0 z-vPyW;g6)Ft`nbk9)e0Ed7Jc-g(1rXzyU}^5uehKTN27aO8C0bhL=9*uyN(Z-wjC& zFsrc@C6hZ|=`KZ>S=vT|WOiz?FVd}^rY(!0ZjPAzL!I0eJgN?*O-F7XVOr`a;tOXd zTr8FQ;L2*bVpD6op8+J0kHVIJ(Z-!o$ny?@-#{2gT8dw8mbUzkB9s-#s2(CjWFZ7I;2-?^72Z)v7AF z<6Wha4AP|4e^?#_JUd6LS2Mb#|98fWmi9D{qMYg~O5MkYjcdz{wzxrDX@*4wjrMpk zVV(h_MCd12S;8{RmM?ZOfAp$ug#v+q+{PlX97s7xJ~1jrphKL$(A}&s?3b86d93>Z z&q9n$O)5qOt1Z7yCw_YVY4`@GX7LxoS!ng;!K&@2;eA|*cQs9$30M3PegWiLKc%)( zrEDW&k2NpN_)hpAo6)_8ho!`{FC{<>RYm>O=X*jb33}Z9^us4kP;CI)|!(w zIHoUQH?vN3_S!Q2-_4Ch!o12X%uGy~TZF3=riG1(APbL}G2E z(&k%PSx3@n8R=_K)#ZMcp#H&XoK$+MR({S0sCQHT z_T1Lcz0axd36-AjnEj=+M83|<(#Fi&0gq}qM?z-j79c1(PT|ZKHp1!O0J8Z7(BDTY zClf;-AG5UUW;{Hpz_2+kEB`&+2O*TNgzI8PO?GMy0z}7DNgEa!x&2+L8R8g8){}C30FbA(9)`otQM zVAL*?c!j%9IsMVmqI$@KOEY8$am5B!Ict2Os}?FAUPOhJdi2OF6Iy;*G$~EsAJ#U$ zh{{?ruG?94w%CXUs4;8M0gZUF0ZJC7$MkFmwAN?J9(@`1Fz~>2(Sj73W#{E5U?B39 zq{pvNG+hZTC`S25W}nRSdi5ryW_3~l(i$*XVN$%d^0=v0{xx50+}!1a7NE!SV{sibwlHuaBQ zbZlicRMu-=XPL*dPWqV@GC3b!SwfB!_i)=Qn1EKii_0@89US_r8hqyj&lwp4=Ah|h z5ZD^Th6#^K+B>joKqaFi#xv8mmbCTc2mRK#UcTD9t_!+MbGR5of4oQgP*SF7KNw^tAJ9R>lN7l-Ir%UHT7k!Rlsg#I9roo@x(yB7{8E8cuZGBRT zto7Yt&{8E3c)nv#AW-hKP&JWo+v^5kVAI=b#2Z%R-POI6CjmMAaKE6Ilal16nuxYo zzvCko4BwyWGCC?lEad6<#=Qb2CkbcYPTbwB31U93qk4r>ZEAI&SStRxbip;{wgYn> zS!m{D`CF)Uz|iG>@P?VYgY_fD;R+JTKjuWP1M3@=i*(;ngKqW}tiDx`Ac2&mp45Kd zM9qIyb2)lL+WT5&^}+)dS!v#p+GTpN+keDDe>=);W!G3Gfn3%V7hUHd-LmSuO;OL*?(rUKSsFJQFUsx4xwGk*5Krl@)7oL9~WFIST> zp*sKctpm0{K513b!z=tzU0_SxZBW$(%`egE zHDJn%5=5Y4eE!*ouLeB+7=m`Z7Q6XJAPUEqE75@K={J#TYOO6)E4J}AKU5V`8YEn8 zvpP_g*PnbkbQy;s!^lKcmyvHeN%ZD#-aJu}Xp+-qDh8j+2$}h6Y@=FPn67Z}LT{n^ z7oe#9{494UT(1Prf{tt}C1vHCpCL?Y&u-<=2vb{W;P2x<8 zM-?V{nE9}&br&IJ=4T8V*%cxC**$MAm|3aeCoRr}@p+He%Fy zL-fkP0b`eOGD5MUp<0PDj`%&OL<+Evpm&Z7o995K=^N5Opj<~aXgt438tX+ALX!_w ztZF3e@t9cO;@>ME(3n`U)*mq!M!?phuQJV)Dgm#5}Sj=qe$03e5_Td}w=9BWvm=XDh#{KcXv22wbV{XgTuCJzqa{O>j$8usx(a=1KGwk(TMKP(R z?fR>7jPwBmW^wqa|MtxB;k!ezpm$&mwbhKa^EiV5RGnUnR_6nVwH5!f`R6ZGv{^>l zmoDHu5t&)bq2$k;>dE@O6EhawN40nJC?0AG)1@urZ(JT!1I|1X9!2q3wX&h2B;&5D z@!6g=a~zZo!41Q;TJd8I>=Y~OOI;g_+DZd}gcdqFpF4_2ja_z%s;IzKUlop>#8 zn0t{uX2g-G9=rh6O2ajk2hIx%6{Dz_N8UNOJq0jsqzQ0ZG(uw)ihZH-4|U{&e{+Gz zoWhXyIxTLJmaydA2+G%XpdqyzA3fRYt^#2~rT39^k7u@Lz$7)mU@Vk>a!XgEc!T8` zP9Bgu%(#rCD^B2_A0=yP_`PO7cz>~wv+a6yKzpwVx&Ihp!AA3Ln{%;iR`MnB7dLKb zTpzM$8gU?u7VSIo3hnx^mM%UmFF>A1%O>;P2M4EE3QanumAw7(H&Vw+UWPe)9Ui?9 z(gi(45a3I!$dxbBP%?D6gcZ^~C**)!#=$Y;^NbcP3F#|2hvgs^$4a-U!dONWRxjY- zw3GNjFpe`@Ytz=0uOPp`9^?vvKm^R~sRPrnwZ8=*@Hh}D@CEC(Y%!`y&-1@_TY6QK ztN$!Iz(~6)I9WLMCJ3%O2I!k#XEday_YObUG8$GxZNA-oEk(MnwNh|VQ`j6pz6_6n z5DpSvSic+I)p27oF|?g zHdikf6{gb8WRZ^YlmWcPiMQBH;ZHsiaqpYD@ryiWDxCaxW|qG6JxhSc1;+4Qz#RHy zcl52E@Gn<&|59-MbJV`PgsA~uMKrHPCz^Lhq-@nd7j}3seV8GKOQjC0&kl?W)$9R) z0ue8kS6+SA+qiRGX~Piff)N<(teW7@Bm%yGq`PB5F;=pOWFlTX?642Y(NApzq#Xx` z8rgJQvp0*gMfGc|Tq=N|JfbTji!V$CzQ<9@YM$h{!N$JCt}}%dCG5GzTlk!;xapQW zoE|MVP9;q|wt%=R=rRE=DnrPYsmkFZX}lSEeJoKKjolAvT|@@!L1zfz+LHIip$f&N+2LMs#ZoOQ{2x0Ok$>w z%-pfa=C@32JiK*w6i>io8D!5HX;5tOvL8+4p9znb}6}_suut1GW_y6F1!&CRhd-Y4TH;4hUVm z)#%f3=W7k!_IPKDNPI;!+p*-A9}O$C<#oGZU3NPk3#FsaBb_`ltPafS0mcF6iQIIs zbpv1d-o81%)F~sQgc-LJhLv*7EK9(2S8rqrg`IIKBf!G8LN&L1qz^k60v8fD_6s{zy2Y|74`$`}sLt!Ff!nGmHdGi%)QoAzg$zoka@`(Sa*?jz|+ytD68U-!6Jj&<}B z;KpJD*``*eTL87C^6g45?g8*wm1g2eJU({a8+Wi#WGN!B`zjUyA#m9fE?##u+Fp8Q z&RKIx`x83#`L^l}%q&Ytu-B~AG8UF71PdU}{T4)=sB`upoPmd{W|3I^jw1F#)YLv# zz%x)SemX=DCRYNM)D^$mh5{fOc12n$zh4aJqLT7=_0e`g+H_PJ0t0MXw)8M zHCqU-zs6>IXsOA0x}SzeR!wxD8XX)Q{iKbW*M)ppfyvE>m#yFfEpigjW63JA({X$OfRxupo*fxZzvE&5G3(F}ar6<-DbsJzbrtHm zP!5LhhmiKUo%r1O#dlgAH0j9Ofk_MV^;fgPrw823ig=o@tDws;I43oF^wIq6q;YJs zd5h~-XX&Q;!CsOQBT9mW>|R{L+(elYs8kYHigZg&jc0c3H!%KeT@#2pZztG zkWD13kyzgDL=#WW^UKh;vp&bVcxP!W+i;?6CO)5(ztR(~eUPGiCm5KzxbAe9IJ7pN z8i&oL75cl;LTB7KeE?@p6+CD^z@a8oQTXmJ$^gEjeG8Y{@FrIXZt*j7$EId}C75u8 zEU@_-L3DaTIsC`@1KeL$=X7~qg3KzlCi~#U1ikL`-!KA8mw9cYpJDTL!dy_m>0zBM zzIm7W&F;W0L|~VA0ta))Z`28V+0K<3?VEQEU0gXr)j)D)d`_R43j(72n#(7=te>SJ zrzxX9bbV6Y1?kZN25$lj=Fb%D^ce|fg!Ca1har1yjUnc= z`FE|>cBOz$Yv(sU@}aRmsX_-jmm`!!p6!^3BI(4!{y8D1zRzo$V?q5!Ic6n(EAJ4} zkiIYU)QA0k3I7g?q#Ox+rSf$h&fE8aA)Xk>U8W@wZ(RO|JX`O>{;5K%lBt`c6%qPi znK);DHtO@Vrg!QgHF6!9V;f9t;mkxTmVYvGI1=8sr1EPuCyC`CR`^xdg*AXtl%8Hb5)OV#9(iEmFc%b}vDG3tB(UVY~JK>cqkSGw2-76SyaOlpL_~J9`Y?3CW_7zrh#ITgV}2 zb{A2x$sm`)>J>*&!zCOXB%L{c508LM=&>(J&JSv0{Y~!I%h5zX777vG0fD+SK(>0r0irFmthpqBYK^8f>~ zU2ttD?7>es_D=jgF#~m@DqGR=MSVhkBJH}yl~xcgK)3!?lLw>SVJo*Wm~N<)`D|j> zvF{&_UnSAZBXc9tvz z4Jk-3JbiXS$C0kK$*T1<3$U~PI}iXyVkcGz*88}g!e5j9xhR&t1)F#y(D1U5_o#Z1 zB49I_dCc~QnOH*soLDByA0fo@_{;?ZMhsy08M?)qlwZk7z@-2P0QG{|Lg4^ zyL0yOsR=wSXPjB$v*)q&0R;a4OJH%z|2syt-#&8H13h;)1cizlU+T%A95a0!eH44J zxI96$UU;|6zrK}ZHf%C{k=|oAarszebp8^i;lvZDhmd<;WPAw(`AwGe<8ZYPCLgqY zgMr`}urdv#BSl{3hdqE${gggn!z7=4nTM8rKJmL~d&^jf-l?4supxGvw1W2&Uv_Yl-^B3iQ8aWqcixN=;BJ2y((cgbVb zqrZC3#>mze^a8c&cMy5~{8rYS7>8wJ<6-r&PeMJcS*bNl+zo@7ofM~8SX-^3^q$3V zo18%fgesyLt72|~C+b6tfjb{APQ5aLSB()_)XzJ|r$=4BM|RQoG-c&ioI+upm_+I@L=E-#RiehND zYgKbtH*_*RXJ6w`2;K0L2!UI>KWY+7xS;He#LQMp=#R`D?A$Yf*o5_y-lU5OG^Gzz zN&9H6SLExxd0wg2WzB2l*rzbWcQL5C_u}mb+ln)`DYN72F>m9W|?|i{@ zN7`~y_C8nVZ8oT{RaC#va*by`)eV(L{==i3eHB0Cw&A{-HJIJv+RKsAU$p?!xD7bq(VKuTS1b8DGxL+e{0<|>9u>e)WpEwdQYE%V#fTdx7lft+s+BXz9&H_rN0| zj_(zAwL*1yq=^P4b6SvF4W78)fvi{X5VJuC=@=95nBW3aEVUrZ>QWf$by>Q^S_sU) zdvbdW(Z0Fr?i10@N;8_hF!n8UpI7Gqx(#>giW5SR>M+4Rszw5!ozr8|=j+iO@hzzX z&x`xLpT_Jj@xFf13KTG~Dh^n}_AL01r=8Z@M{NbQ#Zdc~lW}oG3zjA92I%Iw#JL`C z7C%Di0J*wUfun5>-mNj)O*+l_jm)W`+H<&YmFS0MXzRvb6ciiUa=KprEk_nz8#CS zuqCdZ`9~z3Ad=3YT;H(pbt_d0P2_?FHb-RuB905f@1Xaxyk{tWqSry?XmdMi~OX0-8{k)@k`VX3vPmn8@^w0EE+>GymQQk*!g@d;bIX;YID%G&%KM6 zwyGm^w0d13QxZd+Q!!4pa$P02^{c)2NILVFz?bh6^erq_`De+-DB{F;;u3kDp5RB^ zTtzgakWW6D9WDMziLSD*xy){SVvVPrx+iUsJ3kJB5UM|V=w-a$S%L}ne5`3#>y$8; zynNKYmg|)6rOEcf!2{A@XSUOx;K=OpI3Tw@zDr=AdOb=<|lL1YU$cBBc@7V zNm!kUpBBbUbIJ~BDw#X`9GvBqwIKru!DZE%HMM?|_BO`_2y&usWsS<#u8TD_4sZQ= zMsH}Y#d0wHq!Nr~NnBm-azIlm@5_;{7tN29?|0B1axzd|qDc$8EXT5@pcbIuy%O!b zMrq#N!PoqGvTdp5&AQWUJwr}TDi}%We&!GnF>~z8gQ)gV6wy(SLJ1!xTSQc10{5pl z?Af)qA-7Ve8^?`m4x=x(wiEPrT)wk90tN3|UytD(GN^8tQ9^4>BR{qpGH*XG_> z#kyd=3mOH*Obt!#C9Z(s7R4p2Z9j}hIlqGz&b}=jGFJ>!Jen_CVzXTMBKTaFjXiHx z{#5b$iO1Pu-hL&2J(jk#z;+w)d?9dK)Nyt5+it?`^It|#hYAwIkt(nB@_Dm zcr9ZN{5&?PA{Tn9jui7+v|)2jw&@v1!KrN}p(2F|H-AoY_u&lw%`mWAtlq{FHSON&!=%x80@pcR4xW~_{X1!g^FvQpnQw`7;9QBZ>F;V)kPTN z`)tzMCi}3Ud?$TqpbP}H|_RObAl73Zd`%s&bCZ~$KX)&x0XvWb&#oZn<2}RLkd<=q?>%EB*_ofDzA8;Claa}+^c*zR2|M<4l#410mZsP#9cij?DU<@@#d+@7&g3^qp zj;}UJFM_pZ?{!K?VSdK+0FOlHm(JIvbG??FxG?Cgy>IWq8lnDG{(THdtmv)_`Bvf< zRkcYf=W|g!h;EPAg+zngFEe->HOo?*JpzWz<6SbhlnXM|y>e9&kdkRmJ1spTMAeJQ7VxrkaX zC8azwyEia@$}ZOjj%$(2F@3z&yd-Z&EVRu)Ih1;bcVhiR%xy-e0i9d7)8m#0d{62$ zO%m^$>e7VE5peb}W^F##v}`&OrctVb8YB7d`5C7LN&A+h?I;E0)iI|{-Ds-tbmV>^ zKF2sPjHt6OAHtmFQYCoqQ7^^vPr-%=&WnA+B&u$?Y~>Nnte}SSo%IztqUFBaY+2X1 z+wY79ykB}ty%vh5{@pg2qIV5@meW)xk!!{qDZ5Ditr~&y$(W=&)oVkr^BRUFp85GW zN>xWEEQU!*8>@3^i95OyRV4FeUt@uW6-^VJ&3r0C{}M0E``uW#N2y;i-jdH~0lz1K zjYO;v(j{%MR}>lZyDT2DCrK+g@rvmp`BqO^T0$U+RqO!?zAesCn}Peem&4#;!Mik6 zm@BmcU4mk{G6f4Gc|ct{Kih7|qln~TpB^&3K3!;qZn&su7n^2B9HvW@H7nRw5)WDI)~A3fvi<3+cfFO!#Lr+hByjqNde7#um!iOYH1woRdoO)x<7VosGLJG~jEbqh8&HH$4qUuhq?wY4W zN$@aHFUih4H=P#(IzbSHS1I4+GrN$@sn>*zZtsUGx5`^>WG~_i=zj4FI8v8KbxS4X ziB2q58c9z#vgfBn_vxF43_j*28x=J?{#vAKrrB1<=*9LNU{wB36L-l@w%gX(1DKWG zj$8?}FNSh{4#AE|-+v#?r}x@qTxq)aLT-eFkidwuNLSoq*)-JoIjG!%#VinI{gZ99zC>Y4lf}~&l{r0kKJnZ8b>V;`MI|=L zLUqfV_VgkY+TEs_uhdo0ReU=u$UDD_Cns-kOzTxkD*HyVPH$8V;pY8yj(l|ga zCS0@@9qO5{l)Hx~q^`FU&$K;2z^5mJX|{hg^^9?fsjj0mHPiYV#b-f#Z-(da2QH>0 zD-~L4q(-b|caaV9iPA{1$xZ+?eJuOb^qi$Di78aFR%dCoU(4&GNT5LvmW^1aR^az> z#9>P4rDd+k52>xD^0X_@7Vd9*R09AIV{r0r{`(ic3Z486Cug&=W`d~;+kGZ&L{e)? z4*XvfmOk-?LiU`h<9ZV&V@ibqt@#0~X$#Jo=*6_#bBnG;!9iy?t%h>p-V$3$f# zmwenllk#)TyJ!y$5z$q!7>pI0S_gD(^&Yj9WiZ%l<%%QpG1POW=({JbUAlu+bj{T= z9b56Y^XKUK@BOUnQ130ZDGRJW*RDgr=q|3qzl+rOyn>Eu-GU~(Vp1f;T4}zr5b}F! zd)iOuUQw^g(orMW+a+ioK= zz+ZgZ+K{WkJD%ZAvuihnS?_x-*gTAs&M#QuZBVT8T~nAJe6KULY*Vl(HlE5-l;TUf znxKyr0$}qQtPkS@hA!6bkmEV=s4tf&$y&(4lD-B9B>&K(DD4~S)NQ|=0`tCtn7RZs z&!NTInnTN7QzPNFrs$|k$aa%h*!a{vGQKiR#+T}v{rDvPdnsX&idDwfu|cl=LBxS0 z0b+;-Y4qjyfhWO2v%~HSrHhmbvW-BGaGeAzRh8z62K*RyI-BgbjUUonG(o*|;w#mV zhgvC95Fw3Cntju}2kNqCir(FL7rf&Uy4C`JqhU&K0vdw>rj#rK$%x{VPr;wvVWD!JP9GcB zd6VBKDd6wW%K9$q9t9G4$3DG9XF9MU$DZq$wyFDc_oLE&3rpu(GZ1Buse`fUa-?6c zSM-sV+*~(ZZdYRev2k<99Vt!H`=u2KY!Y8Iw2fwtUa;JDZKo7ErFrB48ei3?E#jN37UZM1% zB|_R;F&Nw2*Xmm|PX4nFWAm==IPUm8DRo{ML3Co)wKLOJ35DV=2X=PMhk}wmC-VI46U{ z{p-d;mx`9Vcs(Av-vlYyWa85iWMIz=Do#hbRO^gwr_EVK52h*|yjvMecWAyTUe&iG zw)K&K0H5ZpJfl#f7~Ift2fB^ROYL2h!|J6aY8YNjumURiA@Ob)-^)ZY*_UtVoSxZK zUM8v?2BW~lrFAC9O-54Mv(5#>ZFdkKN(>6*BszyJL**fn7G=%Ss~is3Bi;N@Xa@Z4 ztmbr!{sOHsG`^W$zG{IGhoNHCw z+WZPODiC+AjU(kD4~RNgn`zmTxP0fk?Ju{dz$@O@i6?4q?*>#spQNcDTv_UM`Q{Y5 z-zRE!=Y;Pm{#wZDaTJHlf(ixMa{bNm?}_^3-r6DGXpc#ebSKCr!Wj>?5rN7P)hUvm z?BZNCZI=r(Gg73ekEF*w3WMD}k8M%I;C?ooke3 z2SClC6hF^k9wk6zDa+?aQ=ZX$pg(@_o5XO{|zyvH9L;+H`qo-tZB9rz1!C{k(}A?BiW?7iGZUb zMok|`z@8y9fsPdU@x)cll67bIxIYHm+nM zOsBrQA0po7Fvqa%_V#%I?yAooHHy%ldZ6a)z;qegkcwRljUZotRTlP;RW|R25kgk8 zuSx8anVWXt%W~gXW14(>7K!SbHxyjy^L%s&>9B)|7S;=T5KK2r*cn@J#vA7}9E`(vtUva7WCA~CGhB)x-r-dUK2*Z@%F9J?n5K*vPca{m$$MwU>>Sz*5W>Dj zh}3I!U?znRe3_0BG37>sp<}0MUf_75S`mwtS4g;eorVR6Oi0(I&UI+)&=4`{KU?r& z9Jaf|Uommei5e_bHB(jyzO5Y0b<8qshMOLyacIZk`*Bo05(tYq`6;Ibgmh``3X&0n|AS0f}%+fPv+h+C5UVFKd;Cx(ai31 zd~a)UWR!%*Z#pCZcn`&K_NV|ZBwacZTaMCTbX3x%T1_BCKQL@6Q&2o{T#Cn~XpwiQ zx(kYx6%=dGR!kNX7GsD0(&jWob5Ek5ge}+6T2p!q{Knvq=L`;bcN4t6v)&gN5R2}7 z)~33tL!qKwnmz&4;urCD#0kdc9gT5e29$<2JyM;iSIHrkq^NhYw>mY_RIB8H zey``Tc}eut_3ytQyWcpI>#AsC6EoIPzr5%ar?j24<+kK{4_7agXsKL)%bsHPfjT5| z(1luUg|jI2ljWoQ_=@~(!Gd9jvFzEPxU^RZV`7>sH(vueqg*%u(lg&?tHhi{bX-+} zz>Kq7+xQkAmgaoFs%srw`;!{zC}6E_m^^DiQSd`ZcQ~fc6V~MM-8TuY&2@}_8Z9oe z-6WU0AE83RCG{~qG{7!>lrO6SO!A&J=|*BCi?<~!TW*?SCdb;^QWhNLLkeHz0$tB4b00V7eS>o&>Yt)Qx4;m^f*=eb!u#ssOpPw=PMG* zleMWl86fGQ19~Ribm}GLzxZAg(I{dLqu$%5DPj0Bw&@BdO=cwa+nD%=1T3IPl+YGZvg0!CrjTZ}yPAez z$d%PA;l8q=kM}Z1he&3~CTwbTr+$R*=<^AFuj!h(mSsJ(wwDt;+ z_~!72qTWJgeunVX`}^M9^a+}o&J@uZ=~qPp*eGr%8nJN@9>O-n-55k%w{_RWz!$#t%|$SBquA>kD#~!$GNuVAOdsgL zWD!l3ocwHuEeiX_%k$9Q0sMD-SRwM8=VM_c9q;*4py-^mCLgZ9S!4vho%g=5nb`rO zAlXz4+S6m8e#{Eh)diyCGpmGMND-W)A8Dtk1o&)bAcaN{keXX77O)f&>zI>U#MrJh zUZ;Pl2MzQghlb&xGg1pp4&1F)J)C>9ny20~Mg$z~e4nb%18+mVV9Os~tHPSiN~0ft zaGwR|*aXM^w}g8r4(dkr5Yt6`Yv8h#e++p|carS`@S{xztsXNfPWYae4S7Q_8!kG7 z0Urj+YXph{Y7!B>|=(OqQ3`leXG0-FK`C{ zUY?SN6bAP1@<}0njA|wJcT4@-UA(83+~cx7_`e!Z+BC|fK}S)ezlp8)!4>gqY|;)Kd_!vAA6EmVm+2SJyv^LT+$U3q zFCwSU8@o}@sGs&zo!*$ErM~rKuqBE?w648Zqujr2l~GOe#*lBJ0}R>PS9AQ6?W#V^ zkyY;&GC(j#F}u9!^M;p>6Odcv`E+?E!OhrXq5BX+?W&u$?)EF#YrK0C-7f%K16mKZ z*27Sx&5iw7D388!Gx2`M1>+sM#r(QOujsvk6mInmJpg4fag*5E*SNn6n5kd%-*V|j zEH5%GfkPOMt)~tm21UN;1h)8`_3ND0v(d$@z-5a8qUs7)vUYl`ZH;0%F33G{vK%@S8_8P# z)fb%;oiu`UFG1VVA5DRh$89|>WabCl!zCFfr(t3?-w8~u)F?r~Te)4)S57_L_zQLG z?S$8K*r=skMbBW!DP~j-2Hb_mb6lwFs>>6aF&aD57FrT0rtwGyNL}+hy46aX4{a47 zz+?$BY|R(M3_gjnfPcS;XtvdGEizy&3C$&%(oN6Fzy2xzs#36U9LF|_VcoZlWVY^= z@kh)VGR5Mn(nPqvh;GD>O?q#{N~8zsq{FecqkNImcjZ-*qW1Hhtl@~kmn3?683kTm zNT6dLjJt)syJtQJRb3@_YS9_b?0XEjR^w0Oejd+|(;CL(GTo&UnACos2jd_A@C`|a zK}tqYv&&?oe1`{0DHb2L@bu#wT@?Pbblsjw!yty(4GVm$-9;OEmY@^#I&*Eo^Qu@K zov!1Lds?-Z+W39-;{x33XgkH+KLogz_W0?Y#Yynmd^M9%6BTLYc57Ea)<96CxE zO=}a{b!}_kYsg@%Ph34h;pZFA>e@s-@sQ38xMwaAt|1IH{k1%XB*0f~O5a^>r$7O} zFg3G|zbswjt9xW=n-adT{HRheiU=cow~dmmW(_j0cB}{1eq37S%@FB>^?F!K$k?F} zT&l;HzlvvF@wjXypCj`mxyxLdBkDQamJ~=>urNv33STRhJwH=oLF%tCB}Y$P>8`uk zdL-e*);K2p>RubS!_r6p+iMy0$X~JB85>ZIg6IU^reHq69K0H9lwq4zYP&8rWtuV>2Y9s(1AZJ80eWU(g`F;ZO3}=Wadw<*+<3^hbZWk-GYwH zAb|Uj^>M^Q9bW6g*qS?dbawyz-!-0(xo(U+)@Wy6ZE5HOpj>G5D4j>_yA;LXd+pIa z+ex$)rI|jJZ9vT?oc%Be-d+m7uWP6=SgsE=>xP!NH<<6TQO^_%s`?#RJH{Tw5tmsu z>XaQQ=)!-+Tez_hg!IEeRIZ8bNm@`yGUdpLC(tP|rrFzK=_(x3nG5&4EV!}rc9&tT z#w6wg1wYYEg$@sSaA^(vMZ^32)#Fh{Hfrnd@6VB;?ym^0iN*;sP-~Lvt_i<4G@tor zBY{gh`3)RZBDiE_@<7jF4XI9bvT+ItI!aCa6$RUxxA+%pHk#w8ZEsGbIUjUlwusrG zMtE%6Z&p70eg0$-HE`&&X+w37NLI_M{B^6=-xWs9!6J^&Wa|Q8a{47TE9h?iuonxN zVF4A3N4b8Ozx%8_S*9!+?&)<+z(EwaUkR%kDQo&9aFt{WNW<`B&A&o$`MAlW*CpjO z6{@;mA7g`>6St9AR9e90eO^TXfQRbQ8qmbu(A7jFqEeGx!1Rll0vOA?Nxvo10g*fHH@#H z@O`YqI0)vyvTz<$njOdH4FvycX5D_k^qB$%XqWee$G1-WMl{`l>nK5(qEy!gB;7k7 ziOJ~1LeO7C^4+#?ZS&UJR!Y806wH;5Cw;iI^fo%x^r#7M;%}ktP+*!M-WvQM_e~Vd%{NjKDyjJq5dpNJGCs2 zy}zPf97>K?&A}|>c-7JY1B#D@V;!B;i5ZJOe}>h3bP<;WzqEcrgJE%~u^G3_3KUY- z^XIpTaA|4%*ty>~cvu7{MHisw$PSDw*A;)cM(h$Vp8$7l*TvdWLm6>B_M-QS>XN_ufaXTqMtI`MHdYN18Ua^0#lB5ViIt@QG zu4hjBlF&7-=9%d)*vlA3Ag^lo>ybmcq-8h8oW>=<69x7`66F362!{Uv*BI5Ty@m4V z&L~mbQ~wLm9-`99v{>Qn)I=***jDY2!vNV;Eygq^wqoDMFi&3=`c>*6=!cd43aK$( z>kr&vov$X86|4-4YGX$I?xLDW9P{(nyF0v58`1~HR!(A6e+bWxq_JNNxV{tJAd$E;^NCOMAS z<~vxiX)W1dR9{%?p_ad|hD`gVgI;Z`pu3>nI{1qj)Uv(nN9^6n(+lbd>8>%Ya_-88 zbrU?4mmhG))T(BkmU=9@m*wl0w6{+INggGMdgr4`BT!Wou{<-Iy{A!O(H0O317MYd z;fT{j-EFJZC*g{5QH7oT7SPy2@t0t$RWyKf$z!Cz61a@_oJkkQP6&?1*}D^sK%))r zwT&uTU;R*hTidI$8$Tx;6Ic`Uw92Hqe6O=aB%!9>7XDa%BS$0sJE#LRrkUU-O}wCn z=8ffO?425{g@JKbUIDJW`_4(W%$NrZ3tCbYCODc3Q=7XH8uL@HSXIRn2Z$;d_#f?m zFBEr8Eo9L9SW^az8@5MvKP{c5D4*X?$tU zfv|J`4^d$NH_}tXfS49nAH;{U`?B}oYMsZKNb)=w%5y8aN+D`&8a+0$F(b7Rl4~8 zq-UT}stY#6H)RI2(z}N>EK&oPPi%7i;oB`xc=~~?Ebd1pq)0Z9d*KT3DR?7rXmE!q zd~9b9C;-@ZV?rC=eE06@(oszZZ>G-Gu-GpS{0GPU0B6}&FSRvpRM+!@brL)!kYvx+ z-~j}m^1VlD<_|Uox3!*jT0JMr z1oL6_&x5Sw@ENDi0#VT^%Ya`U0Sc?p#6Y|bdE&27IQ2Ye!^DZn)gJHb9o3DWu>-u7 zW7B$}7x!uysN+Lx1g+OvV+RRCXtW1%J}IdeT89HyiC~}e)5PrS2frz9R8UMt)~5=i zNk@f3*BZkkE_tVpMwP z1ymFiq=YWL2uM&!=tWe7(22B!62$;gLl2O)C%WH$?#%bi&i=PE`+w$S&N-sGp5pF(97#zv`#vFZx+R@^5k=B{DNYuzy>$XCbl(D+1+);F#Xj&2%vVg)Bw)zf7zG zG0FnmrTfUs2NysKV#*(Td44Oqv}S2|PC$BKSA-`92$&%IG&+-f-grFUhgKiX?tZ<5 zq6`}K;rN^%7#V#X0nd@Ydc|&%>n2RDbE}61g79i~W^)rw-cm36!E7iCb3b;PprG5LVX8IUQ@N2M87xzCGo_PA%y&(~hLRuxhXNZ$YvEXNPm>wf< zoO9c-N**O=Y`H}$F#q6b${}x9N%)LX&FUFqLR|!}RJrscAKabkNIerW^qgD}>Jp*i z02YnD;50TbcVB7XM_zxGQ@Hc6=ti}$EPm-?Y(|3-_EV}z{q$RO?~I!QgIQJZvT zBPRW_d3jp_eo3%sFF%5^T!#a?dWK;6`SbguSG8QTPp0h*1jq^xYTvhC7bUB6S6eBAc3-{tMPeN8wQ3WtJ| zUl$uF?6)nv7SF}KvAm0+QI0g2KbgtG(T&50750jS2o{E&4u>&pj~ zt-EptzQnVCQ2Ap zDjovlC`2XGGX2r~`Jeqxwy}le zEzD~zC#@@dJzG)aag zA7rMiY)-D87G;%9yjoswS@K(l`}O8FbZG%l7DiaXhY|V9c+ogf*0ac_X~3r520~~? zBy^cooI`!u&$*m6s`S>;cn=AmaspIXy&1q?x}Fo~ZUuNA)se|1hpmw8Flc$r7HIfBFJ8yqgBKjI<`PanE=4%F%#n@^Q**6* z3(tCrtRL-3cGs^QYBb&D=CC(xB!245T2j=lPXG>dYUT+Xf2>i^#x3{yrwyB?;)=0J zM?x5PL$^?O2R8x1I9VUzQ>)N;!7ow67LUg${F1R_hYTextfPXr zMLDau=9Y9B9`aPWD3z#RP0CSejNWS($T#`Ka4Xr(lS}T;g2*r{k$p}?I1OR9aH#Fr zo_6#*Uz6OE`U6B_=a;$n@mLk!GDpVFk@)o{2aCWNU~wkW4ue>FK0Kj0Ma<>Q0j`k6 zsPFkJKUETnp8Fr7dJR0rk{JEANv+BQC^#q>MT?hayzp_?w5LoKi<~U8^cmxWmw>%Cl+=Ou`GfQ!t#1k z9%_5z+u0|pp}C2sprEMdbM5dcO%U797JT-$1+uxvyc>5WBo^j)kDP{ezhxok>CbFU zpIXx7rDz0zI|!F07hSUEPiF;3(G%WM19k?)N{Bwc1K+G^n*80h?h=>De8#@Afm|E}sEiiP#(nY1r3vdchWd!2@D3?L>sW$zu zr=?BdCTjUD7WGPA>xu}op#Ec?dQ~(c(n2I4V;B8}8wf(nM-=`!c=VnmIv8(6P^*1~ zTRATg3zb!hYp;yy{`9@u_*8ecwj?~&G(>}Grb7A#-k=4f2H>~6Tk+!=RBvk?I3J_v zySt5*xZCv1F{!{{uUM+$skg1&(=9t@Y1IUe$5#LKq3XO0q`x+qlXn_caETBtvM&1T zet%c*x1osGHgU3C!UAKZpqg4MlxPcfwYyzn^%9#fXC!(+$ta1CSz#+>cKD&v&7{8r zYG%L@dto`w-MEYBSjeD0HIFw+Vdk{IY4`VJIM$TrO&Rsd!XUv*kbK7eny+sijB5t` z3S(HU{6?oc{@Cy?&GGTC;YklUrjDe`Wo{fJb^&C%zUL3$to^{h#7=D0`^SD%_lPXM z*A(s%CCp6SIpN|4>b?K49AJJJZMT6tbzgyJQfb7LMU>*zTKQcCj&0KLYIdUet(u@H zDtASV62n|X?PLV$2E}LVz^oeWJgBd!H2PR$IYvhK)U=)bvHu)XkD;!Ztu4{-u`{Hf z&dYZTSUwEd6NuuhwlUAmy_?fJ5-TzoQUfNW`z_jFYf>V15=m zlQ-o{+YbfTI0Uw*KNG3eB3z*-1RGDI?3O0#Z#eY&Qj=3}nX;dQY)M`$fPUmt}g0GUi$uky|u1i?oPOMT69#|Y>OIwx2>))5Mn))bh zq+_ErueG_DE$oC7Pa}r4OO(fzg!}w_Zq;(KZ?|L>6QZ4%!-Wh=7I%geZDrl@f|<8= zVYRC}z5BY1K<{ixS_9K`=J|Z8H3h2N$>prlyTuLpI!y)-wh!HWzQXZ8DKi{i4oIY= zbwl{?S>#vkxX~Y-^R-(cEZuj_ctbPwF_BYz^CHgUzrLf$Hrr03N&!RWEJ^gDx!%@et`&I}lWV(lF0!$$ z$y`tUt<6sj1TLu%SDhGUt+C?tf}B?Sh)Y@A(;WnUdgd>S)5`nI&c51LD%<-ax`}2F zus0}Axz^Bc@Unm<`KM-J{ZnXYZFMoLr1KxcT0j`*3dRvu^n6Pea^*@WZPOXg6JFpk$M$7Y=sOkKu4M4?``$>%_F1ERTkUT~m6pBm| z+x9=U5KHD$=_EghocPRo@?4D%>s{dBpfx6f)W`jzG_-&6;)Scsvei{;Dc9i7{d2wp zG&3|Ce?GXrOuKO8(4G2bM>?bmgw5N2R@*r~4Np3C|Fd$B-KU1drQ=ywaPAzK_A1Fp z=fm!ncCjEk)%`l#Bmjk(VR5y_zO63Uht`Dwbib9YMcZprLg~0^8Yk`x{Alg6QQlBI zhT?!6FXWrm`n<7q=k2K0D`E>RPnJ*aXjX}87A^SayUXsSrEV=+5yKgxcSO#7KN?>2 zWe86{Z^$%ZMYA5bFfx%VM&!j4Y(&zdB=c?}Bl53L%{QbX5oO3?qJFs$q~`jH=tQ0| z>GEP&va-|wbCxM{AA+vgx@Kl^<=%IvCspg|gPM9?nzWUEe5pV~VKhCgEHb*GmOtF= zK`wkzH2uvu;hJ<-svIP_;_R-iPu8?vr}}+tvA|nMp~twWWGJY&* zK46PqO0%m%VPI&UW2&Qld5w5~i}OW$-d~O#>APzNOt}&-4ZNg;SvC}$2MNUfvMese z>o#Xub!_F*Y0xF@PYvKVndc>Jn`5HBoNR@}4XAp5ad4@=dmqC{T4=SMhA--31YcmW-*6_`D@Lr>MP(M{m{!@xsHYGD zP6Q)z@Eupg?Yp%XVcf~g*CuNZ;vaoE=GzM40e$J&ekSk{*cRhjYXAXNh5muDQEy+D zK^QEzWKg48doCvT>~Ts4myzse43kEV7}`N--`-(pSRl}ceCeaj<+OH@DDgc|Y~X8n z&k{YPfRe*Sfl2mGed{Nk1!xJq$?5BUs-v)pdl8}wqc?Am9)TS7kdG$U!gxCzV7%z| z>>OT;$0bD{VOuG*Zj$dMWExP6TXH7sJS8@v#m{{Gev~N33AtC|ee-uQTugL%$_l{)Ym)6r!#HN*-Inxs9J2DW!3C+}R zR=KgJ85l^JEgQ+xD6+M$rrbR&J9Cb10g0X-keFW5y5+O^VOdl4nGxXVNDMz?xHi6y z$^7a@k6Z^BZS!j?UsJ(ffzZrr_RRP#XJ&8{RDzv(5@+S8x7#dsP(@}&w~#*Yyv~S0 zGj!Y9G$Hrpe65Ww^Q_7du`;lH3^b6tik=2j3-S5|+_OMkX`0j^W`Xh(#8UshE1>}n z*an`E+_y7pTGI8lTb`0HI;;T8-f(k6ow&TIZla-*at-|eZlE&f8GgBa5lGuEJVICV zVt#lZ8zr??cnTtl!9QwxDL>DU2dM@iIo!s9@YJ1U=qfd3Q*M%gl>P`fYW<*yr@ySy zcI>>!PO=@ykfLwj`vQJGAl>1-_Q-M?hHSN@8scq6!vzGOzF+GTB7XJ?W6JkLX_DV5 zo!^2xc$JQ)?{Up?CJaMX+J`Et*=}j{^B;(}2~psqW!l9N%lE&g-DlYXDd`bEYDGm1 z0`TB|$U1>k$caEc2IoKvpJ+f%io;(J~Qb>y8ja^7|#?yTfvX~9j# zYEq<_dcg(f#Zm#S`$<_!?gOn2yZ}W+L$Ku7-)y)-G3F>hS*~C&$OR%>slL;5o{*wP zj)1AY<&3{5WFiF)!VkY13TJs0VRpdP*DdM5d@$=dN zs#3h5O}b;46ThhxAB0{tMDp{yJY44ih63aT$i{)P+hMsa$wguo=?(5QvQ-xIO_P9oWa1fD>~=>go*Qkv*M^F{`&29p8p>|! zp?hdpOHg_zy`m{H^onx**kmY`s1e~CdY~6^!%A@d(8HrcQq!TdF}DZq!dsiuLzB&Y zh;kV8<=&T2R(D@25Wi77;Pysbad{3WCzA#NO0D?rltW#Kq_(Oy1ESZ)@Uf|e&T{>Z z`K%bBxjFZ>$yB}Tw&YDn#tW__!mY`(8`!dDDt-peB4%_!P3)6q1% J15@nN^r~3sAfN)$EEMUzSLwZlA~jr<-b9*6QxK36LJLSokRnxT z=%I%mAwVF33AIYJor( zfWr%*%a?#Z5LVu|z#kH@mcnyTX+O)_=_T-UMV-sQPvB+i2oUHNNKy8g&g+cLnSe6> z3Da>b(x^B04~u}EwA zn--m}fOaIg$?{Vzd4sQISE_Apjfa}*UA=eX8Ur)ON0N7UZNH|~!Z5SwZTN1dzZbgG zZ#rN=8lN$YR8RIgn5p;0uFp0OWWa-)_l=c8Xs0G7YG=26koqah8_8OTsxdbWB`IzW zQ`EGsRc|hb`oBJn>J{m)^+~aD zDt2WDP;%Fc%30;jleaMp*5rnZq^S_tq5JGHor~tR{`>1=MN{EDu_U03Px@wl%Y()G zu;4BRi~zM?rO-;O(MGWn_qGV2WR9U<+zvX!-?NJun?&j>oz(xb-mOeePxsZEd2Djc ztM|{-u(tWi{#q&~t65l*f2G!XzED_F;OVVN$u{C1{WIYHMvatZ7*8I-p{I| z1p<*%UV2N#otM>9v8nC|HGjb*b2`o7&^6MUsGLJe)bxOF{Y_cj4QJ2o@HW zhC2focDe+&zKTr;DBR3D9k>G|$>0R#k6MsJO~Zg85}BEqn=98JzuIR2*_Q!UQCszf zSMuSXSgH7qZjk`;Wh^#^*MJdxZ43!}I2=yKz&oIfi30Rcr5Q>5!Pi6ZPqA^+QKDWZ z1B976#O2sLmxoZZ|zz}*MX9P)dO7;M#R{BrA5>bjwmi($$Dz1)sA#U+zq z3Xq9bqZ#^+Ul#GR(8`vPQ|0;rAO#Xb9veJ8ss%7#RJr**g8}qi_S&^;vuUWK&I-PO z=CLP$_ER|%m9a@hO`7IOG?s|pK){FxMN@Bwe}G!<{odG@{$w+uU<4i0E_NjcWJ7vv zB-xsEXxe2A%*~0bMN@CW+dwTBA2CqOI>j6rcYMTtSfB#rEGA0e%htk2i2mB<(Jdb$ zTDOJ_8&48KZY#z@C>z6(?MgyyM_o<<`mK`qYbkncvKg`FMJUj%xyacGXcS_(Mnv)T zNIS>W)~#0qVxW+Smxd_;i#vylPEJlTRqNGruPHzoR{gbsfJ&9(QJk{ThVwb*A#x?~ z_ScdG&Z(&>cE5#4PF%4o6`d7mj)jThk~*`Mbe7FT4Nu--%&A_J%l+c|H0=dYIC5&u zOS*aez=A2W2W)L;hoU?kDbr>`ba>|!cXv&3l(leLpzTAZAapXXz8T=kxxrtOWY2#R zZ+ab{PR8WE$E_A|?7Uh5hOF3CeRy!fel2%t_Eh6&$}O5*%-zd zL&wP0j!6M^_BZm99BZZ^g?v4VKuk@Yj{Ba(T^@Hr@P!*evxPfM%)O0I2cDDU>hbgi z;A-jU=-||wNx5$UviNnHgGzC*Qil|c>0mT(0eekJ2K}F{< z010*cyJ!l`I4CY9cM?qGw(1qEF@pM*)bXE6x+lbTE+Uy@<%w$mv;>P$ms-9qkk~yS zvaPm!@X=m`Q+(&x&v9<@bp$;i9QiG6adu0vVVqIe;upVk)iUM^S5o=*Fj}@Z>gzO|s`!3&cqdG}rOr?il$CI z1A6@$h+m}FlT704(Je7S2GI3WmX@ubAy8WN-u&y8xjle1yRC)&u#=OM%7FWd9tB@* zaTg1O0Q4@I2{~2tJrF>nVbt;D8DI$bOvWGd8Hpx71(H0~$Y}+Cie<|^o0v7P`WYf- zZf-6dh-F>JO_~s38au#@6bd`c&LFU-L1h4O3>kN=X|@}6F$|SI2o7(X=bYMl-1Gc& zu&1OzT`)H>Hg+<}F7qG-0sImwIRMlFiPNi~VxaT|H;+0t`T=uNj%5V7_nY$e?1DQ! zBB1AS8#2lpwXn?BGn=0@Y3Oa-|NKrA=m39GPy!bmIy%b}S)fq8f(Cg!V2}jzIwMqB z22|GEOiTgd;?0;p_?!hn8G=R|eZa^_Ae4KGrYf9Mfk`7a8jGj42q{9gF8_(CcYK5c zZZ`&^&lJE$*mRO4WM*c@ZPn{ZHsB<^zYaUH1<-ktIk36C9oz<}<4g4fSv+Ktswpqu zae#UU{8eW{VYG1oR3#XY+b94;o9|wvARtFz01tsr`SgsUK_+}1A0-Dc*&A3q#Aeh* z+$GhKu?4`|Bnu@|kW}YI%6tk|NabQiC6IOXQ(FfEusZ&NJb z*yIA>uymMNBW?q*-{CtADd==A0L6*)o&%O~-)YNUjHSsgDCndHFe==8o(yz=#UgK{ z;BqI=@^)?n=nwdMcGatTO)K>Yemah7e!%EXd_TE zB)^eMfaWslZJ|M$PK`jmpPCI4ka5~-8pAo{jr12y?cNe_h96h($tav>h`V0ZSUS)K zxsGnV)}RMK1nQqfjNi=PsJExH>fPvA+zBnY=stf51TY{ckbyp21&BJPU=aT=zNCaEoKe zwT4(6+)N}bcI{L&jnF+E0}rr&vyPH!#KBpVfBGSg0&J-9ev)Z!>TMhc-j)~vFpUJN zkRQ|=Agr?lwMc>cJYczo{NB_=*aav%2`mHBplR2S5mNta4u~ZmAi7FE2}JQ|<^~g} zZT`>jIW2)unE<^3ya>~qiObEHA_)O{0(PpLQipEM;sccD)t1@W zS@UtAe%y0Bqi&GE4O9kD1Oht&eh>B=bxHHy_8;%B1;A~xj`^~BRxjpSxqCbw_zGJycxvb!+Hs{ffl1@vp8KsujJ#~WpP z$}7jwKtN=RpwE=MGm4?CCD|aKhu4l5il#U`<1T@K_;7$C^k#ro8u(F*hF81A7@B)a z$oBuD2>}>x&M`QnnL5nbuFxvno!0fH^v`>A+ z3|xNZZ9$!z^CKfMKUbG0azS=?{5R6YNn11=n*{nW4%K(=GMBxGkV~#4N50swF z$!RuN$K1x9Wt@EmPy^cmt_iD@-cC~|Sp~{dF6R7F5x_U6G0Wl7(`F>3XvP(i z&!t1M9Et9$);-6_q7qyHyf*7Ah@%`YARtJr(XAHM27*BJrhuM+(~4@tW>uJQl*3gWBZNrxqd2=N@V0`l zrjoC|yyQfXpY*gIGn`iqK(|0_iV4d0zZ3%A)H0NpdApbHiC*ub_K9= zky<=pX!zR;g6wz!!P6zu&MkD%XA&T^I@y+j&TpFsg54K5qk4GpGhfehCl|J*#`7yb z44ss%dV^qHzDUN?N|yVVF$^f7@YCdKL}F)rFSWdu3>F%|6l`PvD)a*ENCg&F!&pof zz8f??I~&aTcjkJ49R;U$_{pGaVI(0yxzEKS?w$=-Mq!vTqtAZQln+X>5g#)`{dd8A zvIKt9N@e5gRJIr?&^QFWJLeV<>h0JQG+>AL&H?Al17JlPSa$y`B0_AwXE)&@3jjri zWyj~ZqQc?T4?CjInAmHwzaR@-vg++PI5?1?3OM;q z0V#{>;D$ zD%8Q}@A8Ta@_->Q;xFp-(PKtbz>Wid;MRLl$(rf^AQvl9hm3<-vW;B9X9`+`S;h*? z4M1B@z_d*(9H{zWFlr>0s(7@-;V!ze;&8L zQ3%Vv1j+!LH-B0=QyXHVp%i2qm~k3x=Jo%5c+U?U`2G?oNlP7;f3|7_Sug@SWHIr& zffi7>5;y$t{L{G{kA86|obC!EsJ^~lboFeV405mK${X3<-lj}=0Q$Yp)fdln@u?fj%0?b~lju*;oh#>4;?DE+@hOGX-9G!k!p{dd+W=C% zNmukdqWRQorh>A4`Wu5sDgVacVn#rtK+gy6vs*wWmNtfF2*Z@dSN{{pg$JAP=4F|9 zzc>?V*#+$VnhBoypU!x2X|dc=cM-H$pa5-1{i+K8b7g^vk6(pbDo)cx6EY(d9sjVazt(NrIfwM*@D?qOn6z}|^ikGHFl*aO-BqjxrV z$W8zE{lmX-llyzYH{j(g(}rhvKLlx?{k2fM7EfR|`#sS7n7uf5g3NIRNrkxf5GYN5 z#m)}|GW@wk@=|Uh&AceQt(OSzPYj4`c^f+jgKsdpPIGs*eJ%(i!REOnL{m9~OOxD_ z)HYiio&lm=XvKn67pr^f4h*hEfljIVyM}H3gXkw;6uiOfQ-YI-1?=RDcyA(|*Nk19 zgH^bc9vb0TG;HQV{{#)c7VO+y%BoPDw&aF#L>V^b@4qP|dsV;qi<21Ml?>(3-z zXSTY#W`3>D8S#4OpH{?x71AbIH@xKYB%mcyTG;8?D1q4Z5t{B6I;Jc9Z;^SN+>fKG zS0A>*seW$Tv6*?)xvvM1hZWKQ5w^RND_r zc;yP5!#IvhI$gadYqDJ47GK0~2u>Jym8ncc#xZ}qqm~+bt+!)AT{1tL~v3b{`>CNIF+z{VzkikTaq!OauIC?9TyE!dh&Chg8mE8heIBW zAa9|ot|}_1Y;zy=jN%k@G|cdxQTiXY%jT< zr+%O76)Swgx__<58MR!tCGa6JLwiO}qFGlI~qMRfJ|$3;XqZ*Bhi@#Ei!h?tI> z6B~GrkhTQ&e^#;hA$A-#=EY!B4wtnSu5*;;;+;%21zFj;nd*p$swtPXDq{|girQLk z4h~T_v($}r>3w2hXK7?a*XVw!vsb|Tiy^^Qi4A^*-2r(Pxkk_&=Y0kF0*qaNi$l0<8?2v#MQ?t_Ztq1tj#Z& zbc^_U^c`JHuwWN5^SUvdE!P<2Uldd~scB>_C&I70Q8#h_0#TmEw~DJLIi+6UuNZPUoMIo_DCJ9Zz@u=!q|JGte=*J~`%=Nl>@rjWCPj3PNOp1n8cTi~>B3}Gxg zqwkK`q=$R0qc?bt9Xf-+&dJUdJ< zSMzpTtBfD2G=2d&HJc1;I4%O9+uP;k;Mm>etyvy5#>&brjn>p*Nh`Z;E8MuYNpqv4PVjAN zQ)e`Ai&VMVY$`!9gfN&$ogw#MAbz+hkENIE zL?d#(;mg^UzWc18=I@cqExmt#awWdrf_~qgaGbrRr_)`YolSVq7-Z09rsE&aOP`0w zXYbp4eNFll)g7%9dSPQ-4zI(1fi-vRF&%pqj}7I|;om%?^d(WP6YI6F4;8tE84f$i z+R8U$11|&!$}XX2rcwfK>q4A*6fkJlt?o<-X(>p6ouFjRy^}8k?5o)0ft{aG z_u;GS_jlqIINHh~o^}HY>FDX14-&pLa$loXPE&fTEM~Uh81`e!4IW#zMiC!p+a9 z1!A;{^uCuH@d(N7$VGmal#ByodnPIMZ1TDEiz}}i(?x?i+C_9zIEcDFAM6tBq#hcW>G>GqX2udHd?;$w6(Q)H#s@y536u;`w!COYX0ZAno1?-O@?qa zaF6wk`ljf9QM25k$e;J-YkY&U2!tO`tE;hcvev!`;`GGEuf~8TE8;po@?YfSM5@FW z2IPaJIV3vPT83thIrceEqjn*!TGjX8U*bt`$}NXp4jLsy!zUO((B1=j6{HiIX~s zzqtipgf|c}O1C5;!JN*c6Y-=Z@@sn&lkVBks}CR0KzQ=BPCE9C#1r;4*4(`2WCXPj zmR#KYp#Xg%Av@2gsgJ6$LC{sP&la3(8L@GsH{sm8J4|(sb^oZb|KGityHb%?Ktk@D z6WqJ0UtgwF*>|i*sC!VXbqcA1vzy~@YcEpKS5;T5eENQLpzE-}foUJoQTi3H>Abbh zy|`aYo29Kw-9+<;jvWrG(cn(dxT7I|dsBu5_p&LX>)8NtdSidN-^JVjoorkKIQw90 z%2QAlj}EgZK66XrAd&@T|NDU3q}!kCIqChesK@i4!k>FQ>2c~Ijt(za85sRCnxao- zjt^S@m*0e^mp+$}mo!QfCbs{ga8i7r0MluulDFAeLQae?M6Jhfq_J0`p@L}!jWv2B zqbokc571LE^v1D4mpD62h0U&9F@ijq&V z;#2%J^=w$?l&enwZxNl}fskZzl|5~AVIMn^ZPx@z=4vxXy5otR&6>Uy-kjAH2z2DvS@UIXnV7o6lK(}2Gc)r0k$FB8%7EzTVX2@RVIqeS(y07C8m=Y+c3Ir!uy)=T!I)aRI)RyY8Ky zh4`{)1BH$~iBBGI3JNiZ4b~)ksSF*^+<5!7hPQBNx2Gz19pwM)i?AuQ-7HgiG;HMG z;yiqTTJS0Z?;sfAq}gfqwJ3*OV&8ZQUjg5e*u5lx~Oq{i6KzKEK>fbm_nyv};9V3BL{w_J3FGQvSiC;NM3=M_X9S5MJ*^Q{j3 z+cro#8+&C#T0x4pq@`6KLZ816CFgy?#fxEe%FIu;r$3mlilBV^Pq|5c#gG;u%hL)% zMYkyBN5nTh1BzQc`;oNYvC_EBd_2OT{dQ8(^#cA(`2!9uH0=2n>X^GMOYCEb$$BV~wd>-uSHc(||hRoTz5Y@p^hNlSs;68V!;>!Us zQ9RIL678yqLdUC5UD&xtoA`#9Hn>+|l{``Gxj##zUUxoPu5^};TOV1_IbpDhBd@0< zPxzN=wm=7;nJMLWG&%*eghQ!84~g3can5dAM+j`-zl~GA+rJuJnxz8-mkv{H(l~PU zgoSL|WZWvfw!3xWH&FBJ;dyJ$QaC28e!VLkF|TFDr|UHFJS$;-UOV#wmqMEgt6^48Z0WT?q_ujJqFyR9Lnn%`r=% z0$pk?B!OWfLq^Tt_SsAGP%LvJ*TZeC3pHjL{I*wD8_XzO{82{5j#nx*zN>coKYngv zG>~WMUaH5(FR$dCpBK|U_55LthLM)VLp8I~(2)fp|Gbx%W0c%hk!6tIiJ7eI<;?-u z(`8kyufESg;CJHkRIn?d5h_*d-9x`zPrrhpx^#z8{kWE*Z9wtWFiSw@QG`SBaB_)v zp9~@@A%Iu6YP#$D%fybhfujLvQbm#K^~zfnC3Hd1m9>JHE4q!wwy9;{Qa0NInRRUZ z&-)JL)t6l|<8|``I?{^Dva||apYpM+W)!c#{8sfl+uHGo(`P=V!TDNA0ijiABWXeT z15-^UP26gAw^g+)fBQYz95~!TtszN>H1|_9j863s7Mc20qgpTHfpzk#$!?Ovjnd*J zc)Xwqti)(na4d(b^+ON`haX!7(->k1E}#|mJb6X4uisZI6zP<9d)aH}XQa2K5kZ=T z>ZC8*8(~v}Mjt`;1_+@IcviO?)CsWQRyTc``yIHv?lKLypcC|p!lz#sTE3iZ+sC@= zFdgUo<3T^u*1IdY7Jw?%RjD=eqNFcL%nCL_Y46!#)BGQox0!hhoASrXxMW3T9K|I> zynOXy6gw38tAKX}akF>B2DQ$8v~%RapfJ9nYVC&b9l;(1bq1k7a~fkUd75A!h ziUmdkTm zo{H45U+y=^n~xANzls;$$)yQ61-am~^2v<7Y-Nkrcy*I(c)C80eW5ot)zCE^tjcyw zyQp}F6aMUis5Z+$!Dwfk-KtLX*EqX6nItt{(FiU^`kh&FRLKh2^$Y`#FNY?K0&2WH zccX{ZExQ|O3c<|7N9}Yut&KWK!R*~S$+$%e-O^aEsd>z=AjD%4B_n7lBqMa-!9ejI z9*5HCz{8U`D9l(Xj-`e-wz^;6Aiv(hO=fiW>w;aaOqi}xi~}A+?(&g=Gq;?*g&}n( z;IobJ&cL#tM8-=!^YI!*O zgc2x7>u-@XrI4(+#RbuU$I$rtv-O9oJ~$O+bKM(mpV;3RMvE3{XGtj0DRL^ zq`OJ?gH5{!d<*|-??}>eRPl&>u#xU|t0Tbm5HEQJuyi@)X@iA_CMG$hTp2MhEXGni zY9E^aRFjoW)*X?dT`8umi@u1ux^b5rEd(ziw<$mr3M!>b&j|-|R`4a#(5hvhEWEZX z!g7vc3vnfmqthe3U@aS|ubbD5RYksOQDr3ABrATf8Qp~hyV*Dv4}IzDi2C*15u#$u zPFWOD6RRvux9~hkrsM;s(@aW9_`v3hYIDlW9Z^`$U?4ybCKcVzixFA>ILBr#~)_JIk4e&Y~Zov;|4s|Q)D+Q+lq=%Od_#srmJIdxM zf(@(D&u5!Z(K6dCG1krW+brxbttMeI|^;CimNYrTm z?=@X&mk0csZ6)Yh&()8a1(401B--4Q>=f5$G%}a;p`P3?T1Kx9*QWW173OqRAD9T; zyeuI1^)mH|<~MM44Kgu6LYm26kT22qH+y$#^DeN_;_QO&T8A3@E^UvMLQYx+5NN7P zLukA`1R|NB7!kAapwnzLMK;>|lFk@iD*iI;O8XT|Njk?4_j?z)`}6)W>yIdgWC;cj z)Mb-JvJ>?j*dQ@xPSo5{W!X7AT`A#y$el#q9z|Tn?sP;frqg9V%Zq)L;Y#VkI}dRQ zk32E@T+Dtg0&{WPxtHcQoFaB@nC2dj)YyJZvWByu+#k8fYbdtpLkFo$MJ=_!rHP*h zPMiYPUz2VU{pc3Is5o;i(N{3Vh#8`B8~dwwq%Db`I$Z%DOY?AWzycP80616n)w`X{ z7w_O2Xp`E2NhP)lr8|tfGZ-fFAnIFNA z&5wy`ZK|WZUnN^CPdDR22>R)4?Pek6N0FGjG!{&$PweX_-}IDbBq z0!-2Gz{BE7LVpfVzrgKufz(x*nXD6Nycr?Ytcjn4!?+&riH%ba zpS?zl@jaljc9Z$4itda%d8x88oN1NX`Q+YXpFm5V#(p^`wADa)P>PgCm>|@zfU);qoaLv^@R)V3I_Tagp0-|V6O3@MgP2+ zFDN~5$-@PY6kPuKBZrS>w*C|EL|`ux7H^7`A?Dhd^BR*Of%qAK5bgmU+a%(rcHJNw zV4w|DF!z^}mGwV~{B9uj!1yM0f|iZ$TT_M@gS{aAU<*ZA*|hIWZ<8eheGMPCdcevfY#!=)0kI$<13Jyk_-TmKln~+z8=kD`L#5Z^1EWWB{HfONqI_k-i^eSDFZRVrylED6 z4r0Yl23YRYCW+tnf8xnITzq0^I^!Xv3K6Eh0^hNI@Q2C=>+gx4^?ALSi>X1o_5{ED z5f7WG1M646Py)xSVEswgLc1(g?AX+!cqpYGa`hNlRv5e%%xBZt=$N|xLr^ZSD~M;j zKqtA*oX)a>fuCw^bxhTTcL8?d{HaP9gOn(6u7eDDhJ{bZJJerP))|9zcu()^7#{~{ z`Bx2cPfC{C_(Rq#qZ(6sdud4c?pwA>-4Fqlz#aS=xU_YDv=+TKhc9K5ZzT?mz>ewKaGfxto37znX<0RaC;1yQ*mqf4k3l_#EvsK4}T|tzImZpA)Bz-45)?d7n&!c zWQaM)(nS%DjyisUz#3;U^^J;J2a+7;ZWXT9p(sP%R1UsJ4CE>+lV4F|BD{$wfnYhl`M zMZO1%Z*lCuL}-)gRc}bCI^yCt6RAKM+fRQest=A5Vus(i*^g!jE!d-%)Ur&-|3t8$+5eiGbTZzN9Q${p%Wmpt}X;!G1phx?6r2h zHws>SpHiGz#Pcg0-d4${T)1tsnkV5>6gBnZyGr^mF&~y_9&c%y;?$W&(%PV@f(7Kv zM52VTv@WC>C4uopPb;(HpyO#W3@@A6pX|J9#AP;SsXUh{k4T=;O&MB?-C@1qBJANI zg@2z_5<|zj@(nQ@x~RZRCj3(u+!1ZG|5|7m4Ij(TN*&U5^#8F0|d%=m0xE*kMOHzv>Ai+xn<*^W>fpEjYVMy53f zx9LwHO|Y!T#rmSl-MTVp0*;o5S%<3{nq$!p%n8L#O_gKEbj^JPJqR_!1=9fciu)T#MMm&L5w1XrK#049%6~ z{lAhOEbf6{XokZ2cE(`4a9TntJ3f84j(L8ToYYSq!Ngebj7wCeF2~xD_Wk-=w8&xO zRg?4Ag_uG(LVz#Cl_V`d4Au|d*#C64Mm^)97gTv@MP4fNRLEP zPrqh3Av5izlT^1}d`14=l7VwCUsFV7f-%%PDxV&{89UNZ_;B;Lys4XcOjO-olg>jm z-Klo2MsEQ*J8kR1ks9*B)z+x!&S;0Ju}E@iH~KpbO0w--uU`h$Xvu9>YUD!S8mpY&&=P@6t;pySGpnyqYIh5@hh6FXUOTH= zcsQdm4xMuNC0`RY5*;!9-Q&e$(ZD3)$|K@raxA6aQW&hFxpu9_c%$0JrH|gW!N1+D zrb*z29p%za*0-Qh+ugz&%)`I?0)1rtVWs)cb<%DMW9zF4ermK|jSrQN-qorp97|^l zXfTOfSt$UqNStt~5(}f~JCOfWa}D=EtBI^T{dU<2oM!k`IoYKh&Me?D41`deokB!Y z1%(E~SE$Ba%#$^{IC!3a8IT;%rb~)KikiYk%xB*21beB;hMLR!KL63**qGJucv`fh zot8~@0U>0=X_#KBn!ExV_J-OeWbVm)QI$J?hz~k@?c(#G8q005!LUwR_D`AV=Fty| z*E&a?6kfrE` z^k~7c1&dKh+d>Z8^3_=aLF1tH#%pszw<++rwFaKPvWX-gBtW;MY6AvjW+x7)j|tyj zf+IM;=(W6d9-cljxI3VLd9fpwsXV(I`qQMVL8CT3J={f?b}(LsTwiWiXA2X6hwVBpSSPVuDuy9;feXSfl*| zU941}yvp*+>g0&w@LRR{xf*0kN3@M%q!SW`RYeHjzRHFcDc9=Aqa2n!DB{XCzgB+p zfMGiuN6*u=kS`LpE@PMH&jAnmc2uA?I;cFW_z@!=XY{Owgr3xl%>IpH z4ufIcp#tm;?Z!r2OOF?Q9f8bl)6D@oywg1?q@@HALk`uBFsizE*R5CO`v>tX#{he@ z7;SD?5qo;p29;cObP}_2G5)fTeuNgO7rBJ}2v84J%>jr5exX zX4e|t8P{*6=F0U0RwNAUavyn>= zOGUK(M1mEHqYg(uD>z~z5vk@SI8zbgEZGF|?YI8hW)YsQ!1rXlG?l5T?e2+qxbp{x zD{*rYGF+Vxd5@vUL-}8rW}wlQ*-0d70Gq*W7ziJ;C_5HSiSQER)+Xs2Pw{`%TEteI zP~-@?uLgfnf85wqStFQt7}QzI-XC|b2hr-YXQ(;*-@5>>t~>qEp=?HqvEFA(xqw}C z4+TOB_{Qzo>uF;DCVmanE01U=|5I3~AJ6_ae&;7HI4NT(GdhJtQo!x=lN^YbNja|+ zCMHWc-t-~#6@i`8N!Nr`RoygVZ8Zxl0Cmb5dxqd?PggdErnABn9tE}JZAEd{I!lYC6hi7%2~xyDR(I`!GgCa}87V%IK*f4flt_eX66$Uf^ls^Am!x_3!5A3TLgv1?WJNY9%jxO?5dK?rQ5Z`pYTz-$B z>n+U8W({}>RYjeq(OucS;(J|64!*~5miQnNVF{*!5)yr4 z+6t=^V0bn30kJ8W(INEmvXQ}6boVG_ZSd%T)$H^ia4LJFpXylstH^pMX-fzO_XxOR zXYtcAK-6{meV;1(z8Nxtz8L4)*MC@QE_zR^xcvG$yBM!lM?<2q^J5}D{i1nb6nVvg>hVbSb*RljwTJ7o3)s~Ux5AHw z3)Qb@5BL-zMAP^QcF@dv^8x*Lkn+OEb!(_3Ev>LgT0=9N<)1N`LmeuNiNOigl?I&F zT+H)LK}b<4;JqZl=HsnhECh!FdaMKerdu2w>G6`>WVr_KAB=(Axhe0`HFzJ?bkzi(p{f5&1_0}5@h;;_b-5Vi8XBzknAAB zZ<*tTjh$?GYCidVUo)i1dE|EHiJVKipW}~h`UvLs=Pts?KXQ$SxWvx=13P6Y_Q}%s zpNjTInhV(b++=vY$E|3c^z*$SdA3hPw4mNFr{N0=@XBqX9l9^eTCo(~8Cq?ZXC_q5*qOiSo%>qUxU9@~n*av4R2tXTv=<){Bk;L3H0I=lcJ zt((R;FHIHP?-AeCRZ^$yiwxK}X5*=}+>eNfp}=A?(bk#w{h>S-O2Q*}Y|cn9@sOsz zeozYHOS}#$Yix|gQ(18mezb|9SC=U4Q00pOo<7fp)gIhSYXX-C*+97Zr#n)3qvd-=yq$<0ns#V)_ewiWiAbluWSxQmR) zkonvcfoG;v3~qk>(}F>Q+ zmCeGdigu9DON{^0-=#Hyg`DFJgP3!)*7qq)x6l~L=FdGqXj>9M7?ZepqPq%E7 znhp%#ie0n~{(SpZ*Y7WZeQ%v~X5KGeuY7@1Yke7eIQQBj@42Zcx^ir?7VRU7q1F56 z`J&__vc!d>_a}U7zflM@=gdwvKB&$%fWpM-`O8ZY6W`!EQSVP)*UA?gvaB*e_uRc` zir-M^EqW8oiJ0s;1(_3Z&>Rux1|b7|ZxH*}dq-m4!F?*s8pLySYr>A+LUZt+&`9JD zcH$023}3lxtP&12y185H@-6_xY%R}`cRIz8;Rx=zZC5E|>bqu-M& z4t(`deUNVW_Dy?cvt=S@nw#TAg~d0pJiP#VMJ1$^c|KVj%L@+dkY}R8=fv7ussBX( z6Q-x?Yo%H9#>_jy1_PS2yn*%b6H4?SmYCAaC;m7g8_!=oA-sz5Vr6Ape3vpM5$QdO zjf?XLq>07l(~g?f$O+t!gP3w(B{P<##CEUHb(jdp-@$svI<(uGUJAQA^hjZQmAp(=xToOTD2o<-oZCPc>$v~;o7%~iF-@Pj zadO>()rU10EVjHm%wK0CSW@6w`U{7lHctU22M1?MiQjiG#6Lw)vKyB@>vxL!%&h52 zafBCzZO3I(@+LSR7~-vu>5xg7BcTcXal^Mp-8>Z)+-WvAn$~0&rR5%Hi3W13kgq(y z`Xer6z2y_7FLZqbI|rWz5BFkiSf@*vK!oy~G2&(Ob6 z;=|I96&LB~7_Yb%JI%?lyAH~iUkSWf&bZlj4=oj#Nzn`P+UB#q8aA?RJ$IKe=ZjkH zgyF1!wukJL9jZI;a)E4(IB^_wQLYJ`Sn1>QniW)(A69hfTAY;^;m;}ss4T!eB6raW z)UxA|QQa62K_wk{9feNVne8VL;Pfa?P2GC})$Fr;%Mg+k~29L^XNG8-bp zeCO(=IIX&hmYCfW@rrdP(vcm>mu%i;AF|ge?>^_e8ogQR!Y~K#UKQW4IC_!X?s!Du zm@TazH;x+nN4~Xo=l^5tE!g6GmUZs|0we@Wf@{zO5AGI%y99UF;I0Y5-CcsayA#|) za2sTR!EJzHV1P6Kwf5fY-S0Wq^?ZV-yQ{12`qkYbdMnGduQC$IrY01&2iK_P8I}ai zDM_U98@tR{=QIfjx_{6tJFj|i4WgyAnYnh&T8F2IM}Kjde$1&>tg0P4cyx%o-2|=< z-uq-5)iD&*6R82}dGkbocfH4YOe4g9y=^DYBftG+@;&9ZGb#INyu-MF3;qLkC@OQH z>B#jDH9&Wg3}nW zq=d%9+AdlW##>#8l?i=ToTqcpPz3;pk@JFej_!Ic;W@M&&bbL;`72x^?-xYgo8x$<=C){0lQXiBrc8Ho zu85&bJW1H{c+#6#kO$n1q6v?~(5G}ng2X$sRI}Jvzb6GRpMjD-A_W5MJL!&tea-fwW%8Ee#%g#ishNG%kUQEnzkO8te#Z$hp61p3nDH5jfcWO)ax<|$ebmvH04Vk~BQCfSS zeT@)%0owaa4}6+M2L#Q&#~$xTCrUeW1_Z^oIQ$q&p5%YsL7As0-1FEShzx)qQa)h= zwic?{k=q+eHi2JAvY|Hb`JXv#M*ac!l%sHwwMKW>K zb<> z0uY`>KZ6I%G6`rN!lbR1MZ@QA;|^}NUJxb`;hWAh>6{kZ6IZ>12+6WJp+*`;GrMw$ zrsLtb=u^y;s(Dc(x_a3&@sfc$9l9!9qBR6iUNd}YZgEmG%q~Z%%BnG2UDvF55oJmt zsqVz-4{41MC;gJBG>I6o*~TA>tn$H!Tpi^146;amEPtPgn`d9-GxPl=2jBP*NVv3- zR^8aFzGMm}iqRt;S`x1fYrY{`&?8OadS2{EKd7#e@_$^tub6K(B9E!7CsFM3VNLnX z)Yils$Q`f2>KE!qV>&a(sPdkJc+8?A+L^7T7keyzT2~}cO2m_gE_iH#(J<9aR&gMi zjZ;iPDs>9f7PU_EXE@{m5Tw-t{0!J!f^2#Tbes%cBxK(H9R5NljgJ@{ z|L^3)1w{oF;WrR@_4`jOoQ?538B8x{|BI=Yw>77sr~bWk0aExYlIW@1m1c2W*4@<~ znmx4d>F#zkP3Ie~*iFIyEOW~WW4cV8mG)Fra};$^?+E8 z4CMYeYZ1w9U*U+~KIf{~{L$G3;#HPg1E0D%x*c7fr zol>K#8{UQr%`6A`5G=jnM#a?TOejq+Jw-~2@;bxxZy6553jsaeF_t4A;N7X1iFvos zAYef~N|T&|^GfrQRvyD4FFL6sM+a3{XG#yzesyi_@Sdi$8bMs^(mC|gNzyM0VU|=$ zd(Qyis+PAPiB&?688`8ZMR%42p&sV@V)@PQldbs6N zk>3(~us&1#;U@YlEwjmutuRhlvNqhT0Z?5q+v~2%>Yj-`Il|f}9k)jJdQ5!wlJj*` zOcG`tIwU;@r^!D!QmPMdEx3It6x7;}s?>W`Xa99?%w$MSEdHHf*3h}V4Y{S8^3g09 zCjETtd9nF)l?MKU-w{^?>^^zh})_Ku30=jR!bk^0A2KTb0m7<2q&k zZ`}ZGlSTnH$Z@;?GsIGw$6a9b)k<5HL`rL(A(P&g5aYPB9|a{aHul!pg+TCnWVfKV z(eo!d)Dr-B2t!;HUQUsXt}bh$(JoKHh3fi$xOmne+@A{3>xgsOFv?xmj#VA3)$>bq zPrnx(^e4y9qxj%*)ul%y=1^Y99a^AfksV@X{UJvAbDwHRt`??h$doj#BqPk9Iwzmw zYL+N&RKn)Kw@xEBJM=P9p~7;(P02P-(8gDwEr^7!89!vGTJRCN|elCz@j#L4eG`dQXC23kTH#HhZxb^;E-eez^juL zm|1w$a8FVGBQ&p9+Kt$2{{N-R+L@Fk1dXi@SE}tHdi2Jx1l%GUszb zg01U*3+|gfy;WE%%aw4-{eAb^?ka!S{Zi|+(R9On;cS3LVIAbSq{LY_%u6)pXq7@Ci0s0=UY^)be@`3Pw! zc%tr0e@i8h^r2?#BuG=Re&CLk&F$?ZwMc?eelvS8@e6eF`?2x(aY&ReQWf6aElid- zJo@bRw$%_uG>d9FwbyovVO)%qBEq@Y-%fPNu7Nh5tW>}{?c#86e#TXJ3R@j$Yg6if z>!YozG-+us@^yeDaz|Z9{M_!R05R(=1IHP|Z~Z0iXvbW30;Z8(Hz#*7*=_0xv>#M` zNt2=~$vwGW)33N#!z>`jQMcPc6dBMP8S3*;G&;#z=|ZA}&2=KsttJ=4dJ)NOYfH=E zC&w<1J`%~N_Or)oy)4sVEj5PYfCL~I|FP|U=j$a4lT^ys7dFMCyKlReek>_pOse%M zzuSHb!+rlP252ePs7A(6rK#sL$grs@yurY#F@cPDNUV_Owwa1saR9<3)I5k zFM-YSvx>*x_1;uK1BD+}#Ts+JK26ZotCY{7w=Y{T=W)ii4;*QLl`xFj{P(*lV=l=r(#ck_Sd@3D*T^K z@sSt#-v#ds)&!0F#)MIGtoYn}RwJMlMoh zn~Pw;z2(=Zif$6?O>8T>R*NuAhQ2p?)aaMYh|CCaq}MchyN*by3n*ODLjC%?O;wfd zf1frzom&s4xHS*D^_-9Q&G2$5gxLcIkptqS|X* z&7DYt3ZiYxAW?T~w@{;J`lpl4Cjr1#N(>*{&lUah&6;!VE-UM^XAU=j7$WcdaST5Y z0iMDc&xX2UVBAb0CV}#rw?D$CEVZPFLeA>`}>QW6>Up zJj0zIZck~PiS53x^@f3k>AN}~P+s**wR)Q6Xb+NFnUtq7>}D`x3FQ)7q3vH%qB}8fa{Dqu`vDcUZy&HsFTd(( zf5@?r2?p zozbCn6b3$Z)p38Bn~D~7Cr>&krV?9T*y?nXZz_;q8KAh#AnLYGmFBrzyOf|e>3*I; z?nfpJ46S@F%vg2D@o{^u6{6xuf2l2ZQ*L<)t@`+I)#)V;J#zUoa$LKC1n9bQNj`pt zZ=-MNsTx3TG2Rz#B9%{zqs;f*0*WJlh4ZdEK7w#A=8Oh6C)SJtn5Hq1^k?ZVHvW*x z48#Y3@*=%=UPtF*{g1*S*^X3(jMyl}KZWjjd7+2VRA~Ba0rg#<{uEgEz561S`ldk> ztXeGP<#Y+VBv(zd5K*Vnrvgo+bijc;;HmRMo58v8UFY2@D$(1EUkt>(HQh?gV+&mB zcGGEm-RY^tJlak2_dktQN*R5dEIFFxE0#2*;^H=l>m?I|+}Q zM3-0kr@tj1QIbgpcZaR{^5v^}LtD*$23q-2N^|AOgF}psKmK)=Mf)xywhNVfL$k1m zwWY|VwUg-mi6C@eup+|#bI=Uk65t5;%QkLdk6RVh;3_RDC5Du1~2bOg`|K!)po$KQ`jFY#(RA8ST4 zR>z{Z`7+7fEDf7yx7IUU!MP(Z9IL9$?3ko(m$X3qY!hzhTP^#@s{EWfgSqkwsI)8H zU)BfU@`GbgFQpgCOUX7J03MW;F+8TG&t3EnqP>(w zP{_2~)rRv#@8z%?)2sc=g*J=O;jTr!h+EGMKvqQ<%-^6CdAU&ImE8z2A&c`3Jz>_0 z@J-n*N7C=Om^cRD9bWA5iaNeN=i@GW>$j`(h%)COvECb0;y&bN=4G1pry z`$>5~kYg9bHCe4E1RakTHMhyfAZ!azkZgPl*i+k;L|*0`9bW@$mu0 z&2`pKqojI4oSn>3$Z$-}Z#^W(XP;;OI}JfxJ^#)`#?>YpoPTTk9x|Mmm4~QSqCyf{ zKTtErvT_q7UFfzv*M#d(tWa|{ND-6pXiv1Ts5$^82*f9+nmaO=ZNlet>o`|an?F;J zxO1NKDaw0SxbpX>^HLn!8f|0n*K{cHca!O)e(ae!ZLtP2OD1fWX=I}a#of;RVB6`ipb;EqrSD3ur$YDYrt1S&hdj%=ko=U2h^-7Z|at{L|tFWv~#AM z)o2fenfMsLo2Z#J3aKi_(y2thIF*FdBK&T zH(5(Z1?XSvbcM8VqcP1?JY5LB%U&vD$`md3dsdOpiNJJ_*aPyqI z5Nh2$ga7HYZN_cCkk|x7R${kk3A-}29|eCbI!=(+CAK5kln)htM-j3s={%Jgpd4Xg zaZ0gZ4HVXTR%~6>LX~yOFGU-FQkO@3zGtECCot?F zRRs7JOAgJ5&~G&F0d-R^3KVGG^;INVO*K&ZJCqQ<^Ly^jLk0v~23(K9erFx0D}m0v zWM`1eIF;Y6W;L=tC?9@CM`#^7(+$1{h3iI*O1naa`U81YrgmvM;VFYmh3&er=^ZBNSL zw02ywj_umq1?6se7Yn!oxm?}{inQ1G@&MB&5U~8e-v}@e_AWK7$y^*Dn*lcwQ>?$D zatBJD5jPx%PMg#=xnOsO&fWo&JjJreA7GA#TIfDD)d(wLU*U!k!C0_oZ)5=%`wAAn zKTG#|wF1HDmhYWiZ7(w507p*$Z&@eHO1Ef!1;|xp#ntr8w*9ZdX|XM~RTl9Q;oN$l zA6OWnd2Yh}=d%USYe<5VS#KhW+k^uDA4SLbP5bnLt(jq3e%=J_Ugg~xZr9HvZ<)Ia zlHW_Db9n9Puc$3L)h6GMEEIE$Vs@G9#++FPT162kCA@*6t|k8cw$kol+Gn;;pzy{H zXTUZ{0kt0-igkMgDDM@?n)-7N5$H+`am*km0aU@?#fT$K9#B@i|7nBjG}Kx+_YvWs zzBWK5d35f8xa2R#h+D?Y&z}bFIyyan4$Qd%`u5D}*95!6RWBwOD6Pa)rD9C;Y~QUF zpkJFFQZKcZ`3a>KC^tM%Gtl!HY`bV$S^mJAYQ?_dWTeKRq1*g1dLe9S?lfNr0ZXLF z(au^~nQYy;?mBsv6-VcCp19#n#RKxCO>P>%MR?;ocMy;4)72n5l3T#r zo=9J=vCK8g-Gfo$-SIj8Q74VbZeQJT|8E3=-$+M^krqCp(z_CJ$yv(?)`%H8txiY& zL~`xyG6vP`=@s-E=pBRt_ z;CXY)D+1=mQAzhL_+g*ZeNp-fj^Y)X6h}Yv#K~`?zR;d_v}+2x>VaJO!2`1B5-(RA2I6h8voX7_-a0v``oP!$CS z&cr7to-g`&5KipVNU_S(J1$`M&jCI@p|8g&g@ogdHG#B7C^mr!DKk+C{vc+|y#^dD zn2?}G)7fOH-6yCE(KX1UO~Jrm!Bk*0PyJAzV+7RoV2ixeLE-mRzJ^A9xk<@AK*|C8 zV2nRDZzF#x=>U$=jr~B^vS^AID716sdAwXSDgxeiw6EH}-6v2a9cQmriGB962tp!0 zS~;ntpLNOH=iJ8V)lJGcxn#hMKd!1l%xEPqa245p|HpiWB^TecK*X(%{>j=Ox{(I}1Y9KHI3ZYiLOluILykLhxtB=} ztsv-^H~%UEN(ZmP?9cvqu%&F|yN30!rZrjU^K$oFh8i1i)c<+vm&vh(^>>DvaeIF8 z8_5^X$$CX{R`$n-zWr2_{P-%aq%kD@(&@uwrUsNEgDVe5HhSK#B7@1{N52I*p-^x5 zT4!5V->mA%Bqdq)*7m?%Kpy5@i>GH@AmX_MK9LCW+u%Z)6Y@dW2XH;7XvSh0*2E_0 z$+B5|Nc7&#&|yVl+qATWOj7n2#84pjYRhD<{xV;ZyK*pLG*aG~Wul!r<4Tt9#|oGG zILu_oSDQz1R}Q5S1D}5%0$yQaM(gI=`a?Oq^jr5jlJ7k`J@lb^3ekU(TG?@^un;vQ zx0Ldpz3~##@4wg0?(Lb5y_3Kki+21I@5&mRK24)G#(*g;D1-(7lT!VcHmv2O2xAUOuf=F-53vkn$yoU@ zy9QgJv>P)nlxMtp;wQCOz^!8RA{)LYm{FPtb2{{D~%|;>3oo0UIB6VT;6OQ5PhJX z6BW$cxu*UGzD|sWmZ-z3#uJP0=rETKxY>OS@Wn3dm1NM>2-GH)%)!Ak$9vHV0mf98 zpUE=P3Q^@4TeXvsewC@+EIm?$D_}h;nl% z?`iBD1rTt|sY<2&l|pH}&k}1cF-TtZUsC`7Qtrl)R}%t7DJ|^Mku2$5UV?ek6*wN@Z@q71)=OoWw)JujqZrFyinM zCoT@kXcT?2J*b5r3%U|@W3Fb!vA|xOt6?7Zry62OY^wZ{uKS9Lza1hy;FsQ?#K-%+ zGqqqCvD35pgwRd4*U?Le?n2!Ry|+YFoY`Q&Xs8$H&9}|S+2FM-(zZ_GG=pD4Puou6 zvwYvI%(zoWNHG!do^n{{b)cBy@dC1`lSa6NStVSw1~LExkV1&$|8T#t9fR(^ zSH!nXMg==k`|kO>9r)?r8sG(nP7W4KB!Mcz{R+E2K5mweYwKSr7d}N6bb0MEGC#$L zdE^!QI?2qip6gR}N8GmL$X}1l1{xdZ9q& z%fh^F9Kc=kOr5lfSX@yt{lVj1#{nRypetXfT3{jLRcqTkr-OP;6J>yB$Y}V+R zY^2imu}?bO4$el^e1-)H@a!qS03Wc?{Pdmoa&S<{iN#~|LOSAB!Ve( zrHFfRq{z;gX7;@(+{f|5PnmqnBu-`tSjVsJYk$%eik!U&jStukmghK6^Z`#>f~QA7 zpL*VEc_;;@E3)Cr415!s=>3k*Gh4U{d2IM#=?@pH@91D8znz-8>!@#GRJzMLrk$h2 zat^b7gUDwAL#tjtFXh%f;u_y7xRmqqC|VI<;WU?K;Tr2=Lt5CkzL1;K7Sd)3=WCyZ zyIOG!#=6HgA}F(r1Hy6^Kkuw6&^KRKhj0;CbqADugy3^P_E+fdQ3AA`5Tw3eY@JEx z&Q7ilED8x6{=4Y{*|&r?yq!fkagg<;9%Yv0P>(Bo$#!D>%gIzhSo2c8?|t1;TE90% zmq?bvpYsvC{=@6Hsf?Q!9gD=TkS|<-fFxpJ<%IgPy~&;0=QD&qW8l+y;5$Ga@c37S z^`HDLO4mFJ^bPzGH;LKC|ETOA|3wguzaCGLs{TA+$x_*yt4breV4z9p!K#+&P_CLe zQ9`#`eItX!|EeR4D<*ilMZTHzGeOQZ2g|Eyx|5H?ZuS8@5b@pN*n;(DcLp_v5p0Eo zRa5{FDXpt=nS9U$f2xqMOM*L7^%UyXJb`%cZkgXTAj;coc&0FdefONWqeC4fJeQO4No+X z{?)8$oo>=Vjb_@C)~uU4fgks4jxR|uD|&Kf?eDj=soRv*r5sBdXu80rBR%2X-s%YO zjWB|a&U>MyA&3aL?fq_~)mPn#Kkg6km7)`l8AV2xabxrm4UUEyE6v1})&MJ^&m~`I zhk{7Aawy?102jbGgncGFi>*7h!+oTtQf@w4j<*8w(!_s@T!=0_cHGBt^}S3wNR6x( zMWFfR@`gLjb9;utl7N2Zw~W%rsgXblpK?0viP;7=??j%dw38odpvutGI={xsO@pF-CuT~ac0R+PXog1 zACkHsa0(8AXJ?2uhv@T;OC%^tJMk<%`d&$Sn*Emx&vz)841*)U^_pbHKRS9%BxRYD zPv%l^X5WrJqhD6deN=-0Z>5GYJ4s87JIVp$E8V`8|9G>}Ax;t8pf_3+XCOsnQHota zl!(CVrdSXV6oVDJyxGq(K0#SKoG4sbD6*&pg3ronAXnAi(tcKP83axljlrI?c`0|5 z1?ZDlCRVY}yYJ+FDmYWK-@pZMsKW6L3R%sITUh(SVS#XnkM-EWQWm+ZQAza9|aURJNJc(=lw&c=2 z;29t?grEIXTlm`eUD9sH4hk4$oMLQpY`!LxaE0)^u*PbOw9yr<*)cP(-%F!uRwu`E z2Xul_jzZohA;HMW()B^tWER74nAHaz8md4p!VZu!j$7xnfWxxRd%*lWUBT5|?(~0h8cGqR4!UY{&g)vAii;gG&gz|E{@DC`pFXh%|L^JXrn3dJmOuPrR ztCYxWja=Y%nW04PUUV#%^aNKvCLJHIe@R?DijkRyj01%72bS`=ZQ8fy+>iB^syQ=E zC~!E4vJ@x<85+(p$CeZmdr3R%(3vcwU{%IJXR3`QTtK!1jSuhoVKDkY*S)1KZXz4_ zdSNPil)!B{w}OB)ISQ)BB^HBYMK;auJ4Lfx#L8Wb%_(g}K67oR16~~My1oacq@5Me z(riWsgk>|SEs*8~M15`%KJ1du)DMEAMc{nH=@$2s+C~a`-V1!fFzhAIQ=PV&#dOj@ z6gofii05~kzhg)Jr%N@CC58_ecb%e!`6R{3r#_q0L}*Dql0J*}2Nm1PH}!h| zpR%Tk2n3h%QB7Bb-lrtL;t3ziEv~yOQ)r!EvHvkP^opEwY&km#@1<;9P#P(_bi2IW zC!#@r1foE4n{|AwT?nmYx^(w`)i#0*nT{q0x~AU7 z11d^`Z}A(tg6>R_Mv93!IlC+HS!bp~FnNpCRCouIXa*LL37i5dlUY{h2MW6;FFH0Nt zW)iNmtrXz~fv3%BpNNLhV+vo5u^7CPo>BVxb)Z?po1#6-wINsO95i`YG+aiR67_sN zgV2@y9`!ayp6`vG@Bzk}>T-rAbdPg<|e)!9^)&W~;Jnr8`Qr7fHN$lfIfI-PG2DWkSKt$a}g$V0oQW4#?V1%@Kl9?zYrZq1#*-NWB^~P{es#Tl$_~)T8w96)hOs!`;7#_HVSDm zKQyo&;fYS2L%))rAA3xSj=Oj4UvhzKI3DFD8r6Fk%tpK{Ic{q28u;R+$r;tiv?%!E z{4Eq@ZhHg0B2RM=g5nu#_u09bXBzFph}GTJ6DwfrfVRfZ$0u@(b{z6yZuxN6=d?bC z_MN9v?1Y*gI+MiV;LPZa$dfX;kE@a%dl}PHNJK3tOR=xNlNi zATDG?aF|)i7cxk~{>t``Cf+LS-JAGkam~rS@5EGg%wlKIH)%P`!%JUE)?hX)jU8w? z(A4z}QA!o-7I)POG2SS2S(nUB`2NfTHD^x^;CmbyX+DB8pgtA$zndX+Sg z#KuT~>(|F|tN~`?7jeo|*SUdpD43atmaXSipk}QzgbaTlz@^1=QHFv8Ts!d;ecsMf z)&t!ENbl2X(3Pbo3swD|e4yQwpbbjIY*l~sZz_GDc9?$}X=YEgqlXFT6ldyuvFzM0; z_>e{PzA{5*pa*-x#|9RR^dHG++-Wh+PIwu&k^*V^N_En6M>=$Bk19j{*S^Bhi!!#N zv8s0nwwNMiQjc=z6TG?_3nA{5uQJM>o&$SAF2ik?;tKkK)l*oQ59~hOpYI>G0Uz6I zguC|_{@ACh4;Nw^iZG>?t{7W<@!cu=KYe*{L+gwJY8N@8Vc1!~6USZ#>ayHi9y_eT|n$5JHmoMly5Qk~9Xb z2DAIPm?^J*cfo~A6QtwKU&!}A(FwkI4fK4Rnd?YKhD=ItQTm^V=z|{NU6QA0 zDYE+d6YbqX)?*=%wc%g`tiSm&|Abz#2Yw&oBHE&?o8gN73D1JJ4O<*RXz2(=l^Nq_ z2kaB>=Xj@HtiuS2=%7QOXtgEB)GQ|`3`)7Rw&{-pxL7la#0cu)yjrKrU06AP`f9sV zjPd>0lRnqR4X{OQC40CRmvhX!otd)_|L(Zr$>Q32=C-lV)+!U>r}lw3IP+@3+ta`x zg!zVe%4g%0q^KS=Zym*sd-!&VQ97v9M*OPMzXivTRrt%&l}Rb&_w)hPi*awXZ0@p; zIGwxjqbihSQ8w3>TXQMw3c|ia?-O$h%AqdUT;pr9+`-uU+kuY*fpy(6D4D&UWP4Xu zV0AKzVfaH~As?=jhX+0DeWOC|xqqXc35n9BEbFwtv>Ecap}v&@`9ptxT#EQfIJ9i8 zo8!R5jOD4$zGfu$A!m(L+b9Nhtw-t%L@?;qgY6J!;Of2h?nBYCw9R{mEy@TfY=4+t$g^cuKmI&cfjex3D9rw)a+n&ajNncOknBJh!s3iEI;k5&$0e z44VM}YByVUo{Ut-izKKPtVsI9Z_Ps4T_{LI1<4njulhDP|0w#>UTdlSheQ4br~r5k z>!|s_%s!x!)+UZHJOAO?7_cxzds1^VCuOugT zoGeo3Cu<8C$da=aQwON_Z^uADg!nqvC@p2TX-}>{Axy~V^5&iK@(J#tz*`;vTwN-) zha&h^<2J`$*!JsbqN3Ib_g$O7`JVW4>%04DAf(x}AsYquZS=QtmXQs0s_phLjv;KOo>|Ey;62qK}%189*bxLxp}C@L3ETclDZ z!CywFXF318my7r;z1usDHn$3cdXu>7vc%n%uJ23fy>UI`pApJDOL#*gQq`XF%$BAfS{C@+yg!=nUqIX=) zpLXHMor3k|z-b_bNEe~vZLE?h-t)o1%MVuUanC2wE)UAe&dzTNANB92bOk*PwC$2a zktHG010wet$|)18F`*2#xrMO8SzOXAcEaaH`jkOE((T(*>#mXZhr&x-5PNm!=i+-b zf)gAqz<~w$rxEx^yGekqaFz^!`ls9&e?5vXdR`!d$0@eeoMwa+KcCgPmR1IX zwbs21IFnV1PWRK)Y?(6W5MPO7oE76P^X;afAGs92uQYl5m9piQGO`QNYfqN;eIc|?haF!g9r$+Ux zTRApARuFR7P;;y+5WN1zEhNRUk`P@DN16B4S(_ku%UkSo(aK7_XIT*I7{q~xyDfci z`e8`2N&+#^!5Rw_6r8m`-#U1K05eel*s_Vey`DdVL3dAgKLsJ+wxT!4IQi6vb48h| z56JhAe0QHth78>URd$L6RYSRn2EC6-D~S?40{n$Z8rE0W`{><)yu4;sfp)I%>~@2c z{k^KpOSq5@=g3e?X+kUVRJ)qdp1K16<+4^17gxStL_fkzKHNzv9 zHO-nSiP0UQ#XhEi*9ueytPR00m$pW)<=7Njlu)3ICrND%hT^Km#1J zZ-0IoU;9JSzLt?cG2o&Q8VKN}DCuqv4nVUe4fjndMsXU*PV4zz`e>+RMTA|j0)YY_ zsQ_CeqP~>9P*O*PcZM5^x1n5ho+t&86Hz!i4cWzSnP*}}r2nP(FamN38`Qj(EX!4m z4*X^c4W-C9{u0gp6*HoL)utAy-)gZcRV12IVplLD+u$RAg=ELVm^oSzBxTO?;x1B( z&YN5vka0~Jj^bM-bLIB25iohsWTYnC4T%bph@3uG*?2$~T;mgrReRV7Q!NQ}af{5! z$>DS0m3qL5i~Eur=uIqtJY~trF0rjTAJ7}uZybVy2l#Z5;&ro^1^{@T0e|0HMgws| zFPXaPTVkuLt!qZq;4v}Wh}o$<1oYf#M9kwJ9R1%c0M?(vD<%{*WXuP&y~JOAv|bl7 zd#}y1DpyOLdX@8D1&ZjP4)SyI+a+Y|isKRKW6Thtn`MIOdAmUn0zYXR;iQ@+)=gQ8 zH`6$sOo`o9J>DQE0fOUu3Vq(k5#QeY-QtV~(PDtmecg3Z87|jV?LP;GHvzBOs@PI- z=2loMh(h=hHq-M8aQATD6(%<0+W$gzsid?H<5ZgH9S2C*XNNHoIZ0MyAr-Y4IUP9^ zxEbh#$Vy@yd!sh*n#%x0e>iJ{l^?Oag*iW#1#Gp7}m(%9!W5Iw3@v zjPSM}@20kP*~{^*A-sErXb%S_8!<3_!xXD3_lv+%e-qe z8h%UjfG(Y$2-`G&3pqzDo0E&19BJGdIUZf8#*?`PofHH?l-|u})gsFjUq}_=uXjrn zpJ{^P4^P+h+Wa3p%vPQ8WzPd|-fZZQRYP6p(oR9DG4R}Z^)2T=qrLwq)Lr31KKki- zL(3s$6-YkJgU7X!I6*1m-wSo3*RvWv%!FPInkkmJP5U7=BnAOgzN)t+DrC2tx3U;B z^UHPKbv-WB1`-Bdf&*Uw?oRB?R&A;Lv#T_{Zk5;5cp?5Z%cA2?-bjCtf~>OV551z@ z54qiQ1$J*#O~^vF6E7K zGqg+C+ptHK!X-21XN4Yo%PD-t{Z&UyKLd4Nul&BgDcGv_3-*v*meNYDUCrRXi|+$r ztH}`0=GVp}Mbd`=Bk%|prMY%bocFuFE`zu~%>UA!lcft*sL(%F6Ns6Bnr!y=wy$rN z&Hw-@COT}K(a}}Sm-HeuF8QB+k{s%MykXwI{l+5aQqsd0HKMe+!&DU$}4cmBAXKTSp00N#|-|Y5BudHOh3VhH^K6LyR%YMQgH`b0fG*f)5 zP(vbzv{n^Oh4ZChmV8oQW5W{i+RWHSo*INBE+WkkW*rotBL5=j?@f_-Ok&i!rUf&-W;HOvRy=m*eC z`grI}TI=0k7v7}j^>ReFKY$kSt1wMoLb&DNh(olyw_2Dpe~uDX{A6 z-ymWYbsGHUhP%s+*W=`ML$?v}?QALa?fQNYZB7__nIuK-bp3pM8btF0)X#8fADB8dJa4ew&*QD31O>>h5GsH2- zjPo+DK~{of!hR|E;!6L!X7Co`b8o)Aie9Bz>Q?T(|$zfPfpGQfOT;g7l za=8A6UmV;>dfU(A{WB#0|J~v=rWp*{qf#A2=l-7UBCoFLBVy9~@$E^_wOiZpP^E85 zIpZR2_Y_N2gIogwVv~~iyousO%~(s~+ALQFK2WQ*iN*Numn zfHRi$_IL6@7svbi^q~VHEQHcW`X+x|?Ty3QLDppNmg>N67nC;&Hm@M8%gvs?}39;p~_$xn8$XJ`TYSx5xvE(2Jv%Xqz z&l+7C90drTT*79qsew-$0mG0%T22ze0v_dw`BS3BbShpN6vwvoPs{I!mrxl$bb zIGsN18{i-<36ZlQTj_0UOaAzDc*qb$v+K&EqoJvgkktL1W2b++UG$Cc+`xAVwq#=RA39%S%z+c9MVZ zoIM|*aZv7^m5wIAUK?(A52Fu3AVj^^M4@6cicz>V>avYp?Vg{(2n+WPCIT~D$X)2V zZ2m}YdnBlzXrp689x2ZC^tAG@1_){myfEv6-KW_II`@X;Mas5(48z*ZSTL6ZaDt<5 z{6_w`1GZji@9*Y$!rKRCY9&=iJDA7vrYx^=jk=+KpWzGWQ1d(o;%9pv3B}Ybq1qZd zJW04$*nl=6MBT9~^zzOKS%%}W-#7?~e+Th&0wzlFOj=Je%y}XoDbU29C1)YNeT6j1 zy#u!XXJ4q9U%O8iSo`Y~nR$q}C7y@QQItc>EeI*g=Ypck%jeGck0*^ls(G^Y=Q+&T zWpgXG{U`TC_C0c^a*ud&Qqqh&x43aebn~1?eiGr+Hhr@{{T5M|PYpiBehTDzXqm%d z9DBN+x3Q#a?>u(W-u~TY=`7~S>M4prgP;&@7k28f32?L3`6&EzK9dQ^hWjU`8FhpRw(?*ZlPsk_4NP4)>lBq_3e5eoT9}Yio3fz6nBajr&w`! zcPUcb-JRm@ZUqVyEgiIjyL{7o@BhB{*7~wobB4v5;hdf9Bs=*fIfV0%^y!IU{YM8t z{#iRNB;*9$A%DB??EOw=w>@6C*T}%2_#rg|IuHa>^WEG$tfB+kVYmzH|pc#RJ{d0PC6q`?UjN1T4|K6s+){^bf*T5X{nS|}CY zJfo*YTN69`NcB-q2C;kW8da!8Yt53G*xDOuMFDDCF=OuLw!Ay7!Z&-l9h=!f>MMIh z^ zDPSzQmln^9{d;Eq&&GgsAqgx)k?rrcq87^>@j8BfQ7v3op4e(o`? zK8-xO%r~1Cr}8^(GKJ?t@9gCo$oAa1z2M{e zhQs~cuSWZia{he@{Ed%ldKCXwY(lJKm)Ym0yCiQ@rw0oYzHL5n0e!pn?6+9l)j>i} znNym5EvHSAfkiz_v6HBT==wZyy{ITc-^wCOM#)Y{caOLJ_F;(0dxT(kz9GPMMfuwl zR-+m=F6;|E5atO90B6{5$kP&s6bhIWuF8|AR+?`!^460WX+9@x7Fkmv7AtoJiJu;i zbS&%1QE%^iTR8ZW>GIO>a=Y?eFSR$#viLkVA~dgQe6;{U!EXJLqR2SSV3F&|SPvNN znk~L{G7|Q{jC-Ry%Hg1FRMhNMG=3ZzJ^pbS%HH)xK!h{nR~jp=;q6K8N=vqD5T}Ot z$P72)Ps~Rafpv5Ctsh_;r4F>qpQX1IFl2f;_x0Nb;WCv&Pl1w6ahJ!l4i5aK&oVye z6H33Lxw4PvpPvmn>^@K3uRdx)HrJu6P?NCuaH;KwFGqUcNZvKU6(@)pVtoJ{y3R2H zW5112IpMu9YeN`(|37&Ss8$F%`tMW+`S$zPu9`)1Mo5+s=_<&K$5GCnC?G!56CzOm znD-(K81J>TRQL8ljUkP=Us->Bnh{PAHOqwlTU-2}pT8I=A-IdNcJ|A2xv1R;-+OI> zn69a8sj8zZX0=9Xxb|S^}KP zxpNy!oeSTT0bH5haF?S!if$%T8if7&C#N3vaf#yE2`NVQwl53M2Fco(Lq#&7VtOqiK-|Iv%nbYtUQl4U{D#5`6jSD{}1eyeT z=qI(F_SQuq1$wuGw@^Ty-|31*B{NC4bqaBws6%OiqaQZ)M$_=+cfJ2^YiTu7YoT6E3ICCX{0g&o;g!EF(Tr*pINbt?sl|N&Z|{f-$0A?tHFwkwGfp^P+UDKosx@z=hnHz)e_EW) zNqL;XwkVFI^OnpeBZdZE{@Bi=oF%+W*O}R4Ya!w#YXE)n0g>Jrv&+cAXn>GK?P3s5 z`_fDJnJEerL}rA@ngdJJ?K};~a@zB)aal@;fBg<_&e3c~uBjQ;gi~Pj zv5pz_Bu0P{x&B>s_s~f;^sJU;wOKUTm6eQ^?e}DyR3LBS2H3HdB6dALL;5U;-VY<( z{e%FDfO5qX%-JKtWiBP4JLB~liJS|8G`Gof#bw#xfAa?c!XN1iy4yy?SGS_qnAWm+ zSID3Dy&dUigiM#3xuP{}9_kp8n&|ZE`NHR(QnPrSzq3ICG8016R!{exb>d0=>+#ru zniqtLf=;b+U+>FmyxYN@&2I^R05#lgQ9Qg%DSk_ig)EVEO>0FeBfs)qmdduLc=sOS zznQ5e+kRAPd>u$P-?aaczcE$P$oxRRV|lsIf&kB01&N*bu;XlJZTTbgo)1GJY&Y5f zpyd{|*?6&W?{G+2Iw!0k)XNMhD)_G%S%aKCDJ6=oAmTDXD=jGNiZQ;Fkdu8>-DOMF zl$Nxi0yCAx&YXYBG52$`mV52f)L-668sQ4;{PNGiJNZrB{**IqE0c`Z=Ud@iIC=H? zkfTdD>u2p@9IAR#;^}?tn?jbmC#$WYda~E7B`t&6gF#3+xay%OvJQi&(c}zSx5Kaq zbU#kIT6f>%WVz?#8t>*v!2JZIfI;L^UK40DeFt*v>3g8a?G?#`$WjQC0>)er+}{5b1O&YlN9zfhVP(4m3IzK!biq_T<+1kX6?kuCIR# z1b#d*f{ZUBRNGYE4s}T*8lZ--p2aX;8sLlWQ@F)vfNK%xqe;Lqn7_Hbm$ppuU z%v1Ejv|c>yi~BS#`9%C~_mkX8$NMkvo6@z4(^>1a`^0!XMhqd4k6cQ4mxBFUL6II} zs4H{I!=IYRp4;v6#;XqxZhp9dnrSisnuS-9&g-=sQyLfe;uL6DWo|Kb06&izH_fHB z&z!LA=O*FqG_MgPlX$X;zQ^z^P*TuvvgN}kf-ms#WzDd_^(x5!)&^`cAp+#%L#B9) z3U=OQ1>8Z5Y{ILdCJ;O68b8D~AF2qI_~ms@*y?ZT@P7sDUr9!2KGO>|X%P3(-w?78 zx5Q|#U6<565munFubG#bdP7BcL`rdk^NHxx{-?}pRh&BFF5TRT_Nn)fFWQHr2~EV- zB?rD1{U}C4L~Hp~KKj|fP1=KeOzHaJ4`Tt&M!eUVlOGYEN^daod{O?Gk_l6qe~EM0 zazSko)Rt$-P*vSV+~V}Db&h~WxmvTR2B5Rf#b?L61g|YM#hIZ903rQI3~PPox>uxZ z?t$R0X9x=A*$2|4hqb$9xD~mEnT3CR9_MyqIF}j{EqF7B_LqYfYKz>f**3zg_>o2z zkH2(#tdo3QeisqBm?TZ97eD^!;Hi3>NcDKtY;Knn9v$aQ4g=d0Kgs`rrX9qgxQX=F z?+)33P2BNmV~3w(6<#pV+*-8q^@Ln8223)XJXTgjj!bAC7H4OeKAtDw3# z-T$x)FFbKFg93`?5%c^mQGq_jZ+kEH2T+k~{i&+=N;BsQq89@t*>52$zl6_||e|Q}4P#)_W(bvaE0h!AhmwJoXq(|Ki zquvj@$a#+_z_#d1KNw<(c4uGTW-)e;bfCe9Q=GJad1pIn1LOO`sU}y?9xop}xQM00 zTj)Ma-F;g~^(&v zQ0(kC2J&9V>*hsFi@VXdiNPxJnDBj?%}vk_T{oD(_MaLzpzmfjfqf$qY;{6_1yEuJ z&v|-bS6W}8mmdSirXiNLK72Vz5B<>TNjntaEh06!_Z99i>EVn!m(-Ae|G(lo zUO{YUOANjnM^^T<$|f`G-NYy`#_EnV%vJrv-f7czeX zslG8zFScapbGyl(Vi>5ul@?5d^{3u&fyO9y35qA5AiCclJ>a=Tr}Kp^^G6Z>mbi3C zo0j%G^=ZOlog#|?0dMvQ0g{~3@$F;7^!=>S=u4)c)!qOI%zJ!q+weaMoGu~u-&K

    BgR;i8*~z^ci$4K$RZ`oGqmv60wM5oPNue6h!c8PRpr zA&rV>(7HF?zJ=7JhWppu-c^m$>6ddj+NUmbuxkU1CFZlL8N6y`!F7~n zKnw-=Uo3t!b^yb^iu!;Fn0`3ryz$TQa?lc9?;+a645gMzeD_9R9!^@mm`a|4dgc>- zoIAG+77-R_XF~%~1IDB6tKyL2Ni|oJ1VszsMC^OC2;~$y0So{t5!M6|oomh!)fMK` z*7IgnrH_N(t?%EC-hs|b?FGvumzwd(UNY&n{pvV%JtjL_) zZ(z$me_e=Sg=}kX;rc#`6p$KO;E0o93bS(=B^sIE4u%UlOOKtmKJBYh~UNX7A`M_ZtIX z!s4?{N%lRlRd|u{nv`*XfPkP5u6o4RhLDgmAx9^eh0iF*Y>g-;(c3|D-qSWVIO9yd z$~-VZR63!1XmVv4iUL<~u;Ma1BF?5B2rQCK*qtko1OgRisNn-|NR?%0Mf=v+cB4M1 zg>5e&&%yv#@>pCp-oo;z2Spt$&V>Ri6kzZoFmc&sEz{4_9B4rBMXm5- zB^~ZT@@$l>x@uWgy)$I7N90VHO~gRN@=ALk$M<`n`J&OCj0B@N{^|)HI{4ycQKF%f zOyj6Hv-Us48p1>$?ImyL!h%2~yXkS`BT!9tCn2YY>Et)7~8v-JO{m+jozDYOG4$s`yA|O8x+1LL#jHO~ zTDqcdgQ@;ht{nGI@M~W*D$_i{G&__Lzyf8&4K)BZTwFgID)Fd$6kabKH-iacq-+nJ zYSX8@4aV*c>KTi|y$~Dg-#C8OSU`$Uwc{B$E-JGXTs*j^(nNX6p5HDE*Ff zBr6$YI>6e|bK2A&u_g~=h-Mx?2iR`!E9 z^&deJg;PAW@5B#d@MoSxgP~%-$|ln#;?j%QBi&HqdKJCfn}r7cbiC3}F&T}49F2Ze z_6Ht*O&yYx2z%s<8b`<{Va7}0eX4-ccGHHdkUI8`9KB(MfiyI`+=2y&MR*3l&ogyU zfV=${m#nw8Hle)H6my)C8@+kuS&Mc-sgSjs57)m=b2Vcb2~?K80qGu4IwTpS#1Y7%5-w5?js81KD5WdXaAvr+@-wKduf9?p&kdhsCPqe{aD5 zzLtef0b~E7y9xq+jQ}zJPMk@zn_WDK zKHg6ZH;!z=TMQ(hQjDZ+%1kROzFLH+7j$uJNVn+r?ebu%+wiGeiTc0Fwp~#aYWp8y zflD+D(-=Q`)IZa1yzmphqomy9h9@|38+e;s576ei>x=;e6?gROfzk%43M2E@9lqH2 zA0P=X80YL5xcU=Rj}Anmvjc*aKuk+L6pOiPhH_2ppd4xnDE~`de+=ZyA(_X`8V@KS zSJaodHVIU8Z*Agli^yNjV2a1JTxd=cx_=gNKJivs4)nfDSJwu=T9u%34+v~(o!J$3 z@WDzAOR&vE>VCWT4t;+hKr{2tZ?2o7ydLV=e=pBJud8evFpyh^&>mOtZQz3V7ervY z3)v`pFe1%ql;oE*zf-UfX_iM0y5O#+ifcd$y}2e<2knG#TWTzqZMc=Z6d7Rvn2axC~!K zz5<7I4NX>cS0dck*rp zk!?M*0o!+prZ*qZ^28j%U7>hT=~@GXoE^GNmMZ@EHOQBtrQLG z7T}$oG(ijt8fpIU%8#sBnCeKLb4$_oTzOW~*tcaKGyAa+iZk|>^t%9c5ub@nGt{%2 z+4(S~^)h>#qR?5t5Og4M!U+$`ih2qI+ouklq`a?*C_lb!IYHEA55leSEY|ECzhvg@ zgz4MTC`@b_)kF!h)D&*GDlCM#74!F=E7vPffXICn8Jz8F0jWlK$h|*0d$xorCC%mX zTV;?gebyr9zZLR-UX5VJPy+wnRc!1cwmlEvhY~@Fl7Xq4f(!&=?ZH>#ElNTKUZV-) z%G+cQuca%>;MWzUOB)k~HR7Mm57FrmXzLK*`ijcIz@;Z@>IyL(3tRv74n}M|>BHy7 z#ssdbYCLK$1Q4+aMOqzEf9qyz7Y?>EL-#(pP|e+LeoG#G`7)Y2Q1k7la)9Uq6|kMr zJ-ZVIBXxOehM5<(n8;ssGB4zI6VKmu8U77|+I%R0M3ibfJRz9+A;=)peb?|>G;5pn z^p`)bxvl?*^FKCdk2~-mmEhSTuH>^e%vrb-3^M3qMhetE_mtD3D)jH}M`3WkNE5zT zST98)C9An7C1S}(m&H4|CQGP%r%aawO$vvCVB*cvbR8&ygT8op@_8Jxfe!k-&mV~h z7*f^6ncg9;+`q3E@RE9UJeo&mKTis~!EQk?paji>6!`=9Q(E^jP0t@KphhoOf9pP+ z=ByZo^7igf0Dbe6RF0jXsBS*T#4C#t%FJKkgGjk`-z+$z;EfzNl@0D6kf8t<7#7*n zIZ#gh!Tdw>!t&b}!Jl9Lu^DAh<_#9HP(t9}UQVS2^Jmz1@)GmXk)1i$egMSNsw`7AEjTv!L8VD$XXTxwxtkn=qOJNO8%KU3U1;}IP ziBxw#K6~KALJ`Rd$TowOWWui}7gFK!QKem^kE!}rTx<(4>p4t zRtx`VqW@geB`g8+e^GWVA~}Gh%yC5z*8t8U_2T_HVs^zJ;A}Q*R%cAr6{zyZ9p759 zlNXyffVu!-#)k{l>%OJn*cuEqSPk5q=)BwbP_t7=L6)NYnhbfW^Gpf6d-~AN)O)Wo z2Y0lCh>=X8%}k5rfb&K;YfUNo4Yz7NV*bYL8pgv@jvKbdvIf%fm$JiWIA z4Rr!d?)fQi86A64y>Ta@Eq*eFl3(pfzdJd%ME!q@n*48v81nv~$LPx3A(!woWI4mH z`ZT1wiLtkJJY8VPip1q(hiy!Bk>pzTS-xA?@CDigHIg(4f$wIkDPnj4-YTJm$AEj& zA;iDv^@++FZjU4`KB` zQuy+#$!L|1&I_3|zgY~y9l^&=`8+F4N~$Mkv#!$v)r1ggQHsS(gu!Vy?V}!`n*L7U zj34XMGbC(wztjZvAA6vMqFZg3VtTm1t)z3$4_IEjmkJW)x5jxWTET+!=Yz5^u}V%Y z^#yIO;&1C!&BcL;{<4ry1B33Wth`+GO)Gdn$@V7a2S+;hNXG@e58wUm!djp#(Jqe6f>;#@N&ZEhtS0#9Y603#{Z+LI5?Ew z{P(EQAuhxoEyTY0I26(lZ66SfKnFNjLQ_}52Z zeUqZzzw)PJWRzQ2uI%7K5n!Zx z?mP}`nQ%sOYaxFQ{vg`;4^LdBR}E>eWa{>A#hc|MAItGkn}^daeio;O{2Y^D)rEzd zuekD;P`a)t-@YVX*DbBm-U_J(sr6}R7)*fos*XvAL|?IhuL4^A@mNZ3KoYsd zo5^>%P4GWID&abJ6Lod`cRl}p!(Xa{`sbiILI4X6q@V3gpzu+>$QmBm7TBOO%>D9< z)Yd+mrpC+ejJuIO-ls)lnm&ugkB70p^;m^%fW`YqXd>{*TjvzzPnvK;vg6>SW+RG(`0g*sl#D(=bpc`H2- zAta@e+O<#6H?lr7$!^)Rw4ykAKhFM&{ijOc^`z}jvjAiSmWzPJY6NQQSCu<+(%4&! z(*t+i^qxFoywDd&CAA)JZkH?y&KUzKD0rfUPNa++4nx4}rIvhm$r-;oKABig1*1$v z#m;xe591aI&;1zRX2$NRd9~Yi+T%EFFICUB#y_v+an8mT^r3SeEFF6_ot|*aK`JfqUOq>$o8ELl-bK&-*GcG{`+xHWWSa*NUVmhHPomlrIGjNLTQ*0sfDg(P_A9E?AgN}K72{? zPN^b_OMNFI-Zlc6hT1Uf^sKR<%CH&SSv#z$fe8}GYHPg;&Ga`I$qP=GA!&SY; zDbsU6eqxE+cW*Z=^a2B+{Oiwaqb)C^;M7kxzGR?eq$IGZ586K1^BIY!x&2CasOfOf zfrei;cUrcp)%kR*^o94!gT>D)_Rk%lZ)+D`;@vmn%Bo4^Uq_@ zTsQkK?`2dJ8u_=zJ_d!;?QO})6OO|GfZYYY-srhq(vRm^b;eA%Kr7zptoXaCrp={s&`W9$5E?Y30}v!gLw}F43_J!KKv}3n)EOw z>azmIzHr0fDH^O?P{XFvtE$KjakJo`t0s=2EQcED-j8ROafdw?FmyI}91fnUX=RVj zKI&@26X$%D#_y#PUy{4tyf9$2CoLZc4?LAhK9{8PBt?apImV-h?fh__18QDn2w zBKrwuQ*u&&&sH!iGOt82gO7c_y(W+Ms6~+f>pm5k#kJH|RuY0Zl|Me?3`^_5Bb0tt9MqNM{Zq*8(AX4_44 zTw0nz>cBuqcSLhGB;kf7mfAUeYVzK_FBtu7`hy@ji=g_`Wd+UzKBJt5=Y` zQdCI5s-uUcaGFxWOP`S9@)KKr4FSCs%vK0LN#RS0D=%Br_uiQMf&o^ImI|%icAdfNou^Du z72>WfQ?TDGJwbsfT=n?hm=#GL+!G>2@{&YqEaMr1-FL z;emBUq6E(@!>(`+j_~_p^ofo9vR@Hh;Hz5|Nw?PKiaS{gu6LntGAvw~zMR%_i&Om%$Z^JU3&J#?c&uQRjGzSg}6e zq~iOZ?4z^+5v|ov4BvZ349L={YGVrP&u{OLD46BfX)_xSv<1Bc#X-K&*YAbfP;9rytx6s4BOrT z#EMrvyJpnbD5Abhl$gVkXNAb*v!`CWTj3^0OF{rz6F<_xswfU-h$>5~;;N+#+e8<` zi;lF52B90b0~bl;hxfRQUTV&%Vl1?L+0unvrq{;%L#jioVo`a14MNh7TbI!I=Amy1 zwGVz7DcKL<%;|kv=$^uMn|h~fPBoiLXfy!#MR6uModcGttn#}6i1DX2b+&o;qr86R zT>x|*)9R8dV`zi~R{3(M#C?5*&36Z#vq>s@%$OzDTl7&Vlgrfl-cl4vW%8>KzB>z#ni>T8A9F5>w(D%qGo`d_Ez1eE z#)Z!gXB%-_17UDq)otx7J6T!4oT&ZmGPnl|TkEL#)~oqCSBIQ9?tABbdPJil+F6|P3kt4sEk9?QX86&#Y|4`l5P&RO;nXr6e;aoCEGM?)EVwH zcFgf=amYS%84oaWj$2L79^Ug|#WC$@t(t$%cg~<#4(pNx93{SMF@#zVTdAF*5^PaU z#pdkUGR4GdXi2*L>?_iwPKyX2uIsz((mZHu$m8m48Q=}xk^lA^hZ7_7x4rspKObg7 z!v=0Fd%;EzWwUht9Cw0;lP*c=&^Zk&c8suFcPobbfM-UiN9bfV&y(lRhgy=~TqGCR z;c|S6;p7Y@68ab8hJ*?(arj=E3$1##(Z0{w!SYL8mPO4#S0FS; zSU#xHE-&dkxT5Sh?2eD$fiqWs1D_GF;+8t`WpKZr{KPIXJdB!I*5$>zbOf1LcbATY z9L^;Udzt1&yH=#RPN3z`)>?l;W6wtZucDLRiZr~(^Q7lyv-4(He}45<1CHi-={yTZ$7 z?@FZ7-D0ngo5YL+va><&!dc%GhNP`$xkSYneopd~PZd{7soCmIV8XC=D4o+VD(c9% zp`uTPH!fC$Y0nRpzIU`|{_IjGsb*2FDnGmx@@)?8p~B#UZO+DrZ=ov(*~QA3b<3G2 zC4oy-SrX}Q&oOsegEse!u`)SHKqgDDT0cASoheB<@3w!`8Da@FIwyn@<34_i7nK74 zT(g&7KU%%Yf+?9?D#3g}U9B1N<)$fC)80p%B^*dsPVX5H_ zHgd!tw)DeW>?%m3cA;Ty{dJfe3KCJQTKFwdR91s--(Q9~Ps`M&I~#q6o4LV7h=IQ&w=*|FR}7#W82k0y<%#h1zoOzxQ#?EDU` zx%VY~#oz8yb!0<*a*35Xr)!eIPf{cciI_U@6A^9}*=xkv4l7mai;B?bN5{z?Ze93^ zsw8kYk-if6Y;gH8HxI);n1Qeq3JTQr@2O7(t2ten+|+}$2^Ou^@dfZRNMySVIDJ=q zYnQGjJi5I^IcSY4lPt2M{u`_Mcf=|-b_JMGgcpE~vV{c&(@nh?C8CYn#p zn;iK=x0(4ANv)i=6#3*m+*h5eg}bBiW?eLq(#tvPSR2RFQLCdy;uR%NT!5_P^HAtO>pKqiy$yJs`uV-WGx{cgb@oncS@4@N9|^{X7Q;B`mWP-0^^6Xa_bLO4qPP0kwFE~oh?`Af;pBH*~K|dITQgo1Lscn z0arFPM<%atw!>4U>4+W zuB@=O?T}IX^ym1L+@;YnmcGn(8b)UEkx9=YpE4)rI6v`demQX|eqlL|=Zkd81+uS? zBF*`9e96&};40s7p&5!pP8X67XvtuL74zrI?{Sf==z~&}&ZWyd{{=9b-jApzq*b<; z#r~ELZzxk%NV@q*TjcSKG-Ro%CDXIY70}6+DJP`;0!=UGyW`9P>rqnVr5MdRWsmvI zH&hQ*>|Gn%OV8zN_=|Kdt~?+i2e=tem_8~Y&1_AL2ZB7aj6qEw5?=H1-AUN_YV#ST z&qTOw;@Prh&JyQ<&G^c=G+oOVH^uY=?m|R)8#+XKkwHI01nT#LDT+UvF6^A9|J+-~ zA!ySXa(>m;u5TP7TB;w5$7UJK3TX&XH+4{$hY9Xs)_f=v{hC-7)$$rj@h(xpq7;>i~e8~$3Rl<;$Txc#R>{5ahMEUr=LK#zr2 zQ*~Ip@FATYBr%n5w1(?kPLyxUM?|K0E%@pGAig7b6}S|*i(@+96O3oJw0EvII;Cp> z(PmMAhu<@LE!;=IF1OPcwMD#l-fcaU9uW=3yU7T<^q4it~dTN z?r%K@YULN)eyJ$xGgBLSE1|pi$q>F^dSbzN#~ziFT+BLu(6=thiJvgT?8`u=$lDIhNT$q_yxOqsq(n5Zw z8Og0wGOI{^iOGXZb#str5IM2n@!whNN!94`MQr$Uo@}BDE63OBQ2nc-qeAb-ur=wh zvI$J--tBeayZdp$!>+1Yn-Z(4&f~wOagW1aP7WssDcZC&?Z=#HI@j6=LXGB@H%As>NJcxm_zK{fHfOO-T?&ePb8sK;} z#1T(MZTp!d-2@fe=fHB+u(O^m!hW3>3TU;1KoRZM8zV{9d0+q*zE?Y-?;dnIv^?De z1VZ_s=#e%{#j-@diK3OGHj+5^wqJq)(J(dD<>ypgYDej$+4%4VhFUKK9azLe2XE>( zhK@203c}F-{2>Jo&#M-D=W@vBcrt_pY=?zJ0KlxM2OyUQrfA*|YbSsp_IHJNm|36!_z=?8&s*@o zYLA~Fu$}EPGje0U)PrlaFF@njP(02XC)vM=Zc^YWRp)R3nt^ptTM~;gN>23gP0e0U z)=5=g8{ba!vD-G)T;&FnbYVsjTAyV?vtg}J&Z793CSl7CTG$|W6nhj!i{ob%pE98a z!N?v2KoVqwo86GEC`Npqkon93ua|tTzvuvCFYEW9>S|-J_W=sge5R(&d6W2YPzj7p zinN(IM8>7E_U0zJBN<9rt;Q?LHh7)xr-ifjSq(X(+4foGr>ry3IK7S-GmB_}lyyaj zC#fQ((@S#7=PW&4@{8SapCn`v`yS%S3u@KLj;!M*S`iK#MPo8Q{=#fxXoh0y#rCS( zB;ZTqs0mDESooB4)L*Cs_rY3zg>5sFj%GCoce+aS}Uu^>Bb%PKM6- zU|#~I$-Lv<08fZhD>1D3spR?+r&sh``2kv(^ya}g$LXgS`|(btB+WlqfU;30zEmL> zDPo@$>^p<7aZbPT5zXjLsVm*qx-^bz+;K;c^&@m6MKbP^ z=}NbwP`?P-`W${Zt_qHe?&`rjd!s=8DHz^eeGNSs$>}uMColSzS|Vzp)c}gsuHqfq z8x*e%e&^uL@g7jZc7~O8+}%^bAP`t~b2=DBohcYk3>n_a=j8iFlJxReApU*;DV@H2 zdTM6I)Ffzac!1cCmv?JaIro*dYnvG8YqtUq@mno=xHK&#;8_OwlgCODYzY}CnN`{o zPF;JlAX|$D&9R2P$=7_Vj#h10Qm_4}R`miZiBOT~;&EmQoRS&iv;HRr{7-%b0yeUu zfyv(&*54Z0Nr9GckWbcfY=_GA53kNaKlMif&X$rN>s_;}_h;HayOl?A@Zs!XbVm=^ zbJ}V3o@HMGz>0wr0ZVrx(*d%Ji)(hBYE!;efsd~V83|MW<%d3o2K*++6a+Lf8qtYo zbYV20?Kf^Rp@MdS$5SWARj_4q2p5kp9~>BcU{ew*5{Cv$c0zc+F~-+mF(a3s z-d&{Dd(>cQ3eppQd0C3){RP&uwx^0$>Td+8x}ridN%i5S#`ylPMadG2xJ;&7xdf z4OeNrXl%CJw8FTGvT)PIIe0^AvOrKkngPT+-`+)@?RWdo3sK!SwKb3$YxmFnOr25E zxW)zv19zrKsY42*->PXIih|=ePxGl8G6x-dJ313kXDr1)C7z$SVy$kEy7l*eN&<~#TG{8*@I!}9^mS6L$3zTMzZ^83_OhicymYrs5C znL>X}(IEEQ_|qfo6Vu0qGSo{~4g!a;j{n_?Wru z5`DXZP^!2z9YxQt-+?Dl%GMWT=9=@&`t}mMBYU$Qgg^!b2;E$X0DYGT2|Hu#n6Z5Q z=Pzywz8b4Jhj%RAZ{g%6_pXDYSNd6r!&-(&T?$QpW%l7_=M>!ViGDD>6smzh^dd%X z8CiM}Kb&P=3?N5Yci4ionPwJ*Cpa2EP$Jg`CAWCsPio=YHsc}5jdpDny0zcX<_Mo> zd~tdZyH8f2daev-id>_3x5O^kd^Z?h5+pI5llMdAZo~uJ7w{^;to_Fa(jz6m7TAi+ zm)jVlPSR6r=iI0b`hME4M~@TQW|=W_6~6K@HsD4j08(7o<6(dX&>4gbDD)T_IpRtq zekf1BuuwwJMVN&d{Ur8$o`b&Q@cQBd1ditA2l;}VWVbW?c}JJ@$|f91>VP_n9qdT~ zIq8df6E(_auG6BiRZpqpuy0z}@Vn>d1IROj`kS6Oz;?HT4<)dDjh7eW;yym`HC|(; zV7tPuF9lp$t9J073`O;Hc0^kos>=y=!f|Gj|9w+G?RZrc4Jcf77#&4Khz zWg^_bC$4I2%V^Rzg55FpwNK!m9pHQ{ticw93(Ny&;Z-cd*A5ggi$rza5LC63a%+5`6_Phpf;jyi)Ggy( zJw1xw+C1wMbsO7GMrUMt61#b{jZj1Hsv{y`C$WO&d#YNi1Bwpa1MvOxP>H*eZ)UUn z5wIy3Mm_MC`-)WNMqX+kNg@3c{BL1ayCdjdA~Fbtoa;A4EG>V}ueM^09W+v>ASKpA z`nnWX>m9!vqnnQ8aaB(~&yZ+=o#+mx_w1@lpV^At@zPj`tsuKXsdpioPh#!8k^uU$ z>bfyk47}d>dAuPonBC;Y^9Hq%!lCv-trWDlJx2wdt~l z>K=$N8;qhFI=mJjz3zy<5&+w!>*G2;cEgfQK^?VHcM}n%1h_wC2Ac{z?Sxeqeph}` zMIhmwbp&c~$I`*VI>wTH+MFu=U*J4tCkMQ|*acGg7Le*s*}N`(IE z7SH1^Lic12MS-j&;5~c_(_)#3X_@a!svIAj);UVaLivWv_3^iVz%0#zy90QE?OGqw zkw3!C=Ubh5gHA?#!R(?w4q_wu9Zoe$A^@F6sAKw>Web{Fx1!+Y;~Yyd7*{V0gv~CN zO1u&)Qy#HICi(tr)f{*}pw*tb=#Q6`!?4x|BP5{h#)j})UFUD4lT`_e)I_w8f>%`L z3sfU|1Z~uIi=9-Hs@V!s+bo0t*KUU+p)=e>c2ew3rGo0kuSAw_Wy@Nd5s4}9uCmQ9 z6HjQKDKbfjeu(*yaeRCqIqYbMg#hJ8ENppxkV^}tD%f$0;rv$UhAQrURyY7r(jA_U z$CCeh1j|7tXH$$X7Tl}H!lEGqQ+5*>Bco7?mAPj52w zRJ_Kc)l9w;4VK^~lOJBJe2lI#f+&IQ4%@mRYS3c3z~rm}cc6MBn#o|V^T9aE+YxrG zZ2ZQr=bI63F_Gx;RTvN5t%GO7wak8NGjpG5jSf{;W{D|are1FXUfDl)W}#ephcAn3 zXS|Cfbe%CgS!5W;rr1lymk~-N#>*RSqv}Ki>V%uiIIy2SA63t6(2^#PCR7FK*U7tcz$Y=`bvQT=VX1c?=&7Y$;tbNi+=83ufxS=jyP zy2{pV3$L~h{|=Hc;=& zw9>w;+=lb^LV^7m*%fEj`L{dZ!#8RtCAyMD*f6Q~iMy1XaqFaS6LP7bblcZoMXBj< z)GvqYG(lSz{xZ98VD$O{`c=(w3KKZTl;ejl!cwR&qgf7v34aQ2n!s?Fu!4@RZ&3B0 zA31-W9@=NhYBYTt^`^UFkR!4;Fc%xb*7#y%=sa^!YCT6L<-i4KYT<;QHGlSrhcY&p z_sPp4$=_*c4EN-Foa2;Y|8wb+LvZDE#}~KG`+Q&m^d*4(VL>@cJ3w7$=+Jm=?;nPZ zv*lv|;)S(QckQcFM$uDrWpB%D{v2*=O^|yRUG6B+*a3 zkiKmx*u@SqYNmxKb*eVqj-;OGh9nHVec`eY-?0POaf(GGQDl->coOBYyNZjYzkx(e z8@Xx4*#`*coLH_;YFgO(0)HTGzSaxvo_81{U7fHn zojn*ExXAC#<5Ne3k9GY?YM?F-Tx9Td2-`O)yvuK9HoTcTd({2yHK-R6#I|yUGWBGj zhw9iWKE0bZdwJLW+PB#D=zn4Ae+vE#3v``VPCET;84C1$o$bK^9LK$~=0mX)Fgq;N zF8EA-*xR}i;F|?SnFR7#H>@n`e_}okKCBNM!h5RqNGJT^ z{YC8ioB>CNhAKQ`EfiCTNKV!I<+>n9J=an@o? z=H^gQzF1FtkF6r?WzQ8D6%&&`kZwnlEc|2+J>e3;o7e7{uXXK5(004$5^|B%hT#}H z#-y}+VhR>AI(1|NOh%d75JcYM{|8j%7|sDK2P+7nQG71#n{j@+t3`kU zd~yX4w`l9s<|$QH8}=yg^cG67=Py`y$$KK%U3cNszCgVjFc@4bG+r<8B#D@0Y|9cB z?IiPo1{}}%KOh|QtX|lAH|fZ6KtuQ0i~17=JfuN%>V_A(m$)zg|D)@jpCf(4Zr_fr ziET`5Ol)&v+qTV#IkBCIF%vr-O>Enlq+@6IxAu9f_BnNS|M2_)T@S8%t#y4?l&i?V z*ZiwRI!pniFFz~&ETZ-5FW|pv^RHrRj^JtKct1i%3)y0{Y^AZ-%U2 zQC=MtSu{oZ8JV)mHyTGqxOKtUQtw&WCo2my?>*N!U`xJ>5p$n37V3SMuW6Lcv8oX! z>hk{7wSMYzLR{>MF_|q z^*t41=2v|qVf(Dvv;`0FETIc-1Ua9uzE6o@xC~<03+(bVQ?_}&;bxk zTObHv6$eZrpE<4mm}4u6A?^00x$|-Ou`{NCkC-B+>aLwzYf8B5%Md5__lo~S2M<#) zY7fDon6_iPqD@Uh!}$I#Q?(E=4CCCA_n{Qc0p>e8gK_>mY=V}O@gv8b<0DDw6F6$K z72n$#BT#+ix2$)a{J0GO{0UyAkk`PJ7(IHuShO7p8K$^Y&Hu>|)vL!JU+Ok#IZKkB z`k?ILY<-HJAxUW#a+F8CF5*HgYwul!v_QUrM zk4T8qao}mk$E=Qz8BSOm$1x?wL1;|n7ByR$!>Ndyz6$pM*K1Y*h!MXRQT zw7Tkm$5C?Hek^Otx8KZkk-9GbYVC>(^ceYZ+4N0juNE?t4)9ioNFA{ldZoc|a+rtvSO#FK zO^z(|6Ym3I=byT@yVM@XcyFCY2mz*%$EQjZ6Fx{gLoNi!Bmr@-Xce$3kv47$q8HN- ztQoQutYgInupu%ScQL`)2hKQ)s+oq`DjXAt9JhMT2hgf+1qTA_s9J+D05lf#T3Ai( zs%z4o0PyH79CYO7{lKcjdeo-&)F*doqJu8CbUM{8Qj{uLz#StKl_;jH+NT7w%Y$+4 zOfvh@XLUEe+R*c57OPAEi^X@O3!utu2!4q1>3$jXgFj?!##bCXPymvko3C#pz(7>M z_3mRYxMqo$&c#$Fw%Z4l;{=;SRUi?Ua>@@&@=NhG;<ef#jO)2FD%mZ7#^M1u?7 zSWiV}$VEGtI=VKn-0MQ=*z@cO=mRwltjru(@shfk_?m?9RTn?~P-s9=wwIEG5~;_< zUN3uVWyEqIme}x>lE4GbqEqY8c17GIhavzhbRy61c$Hf{XpS-sEoVELa3#Xrbqe=X z&~&WNB%V}|h1^LE-Ps))tBH?rbQYS*0~_>-ftSKX5eFrS?_a?Ss9uJN%7JgV|LH+} zga}C1|H#7dtL4`v)*Q8E=&^Zwh3?=M+nxQt?&O8dIfR9UMd7^gK6b9H8;=s*8W+d% zsb}=OF8#JieQjq6z8h29tCEIv zn%L&%Mn{`X%ttfF_7Gy{MpatQSB`4y+qXknpfJ)|sq@s{n_EDz*S0eXCySbvws*Y> zjp~+F;{vMB>f*B5hU1?CtZ$LLaqZ+>OK`gNDRG4K%)w>CSlzr)@Yu`!CAKGjnt0%) zcrkd@XJYy(2(Ft%$Q z5bxT%r$FHTM?*xyysPI$Ap z7NiI=Av>l3-+JdbV53>0>ZiZ!)w0X_rTN=OSz;IXFjIuqL)iSri1K)wugOZ@68le8 zYfvOFD!I|kmqc@hWnDYJSRT5eY>+7+`?d2F+c*e;9`(2LS~!;t>$r71p%XdW98Zt9 zT_x$(J0PKfjSkNUb{)VCAR;`Y^Jf?-9FG!O17kirc%sx@bMTR|(*C4UQDQM7ZgRib zp{d*dK`AmA7x7KQbIJXV*Dxp=9$gEk$$QWYJP$W5S3XAv&{7fgSI*ED5-bo&xeHr; zU%kEK_;bGX3ILG4t)4>wNZP1p(M?$er2Zt;p&PtJcu9Ju2s+6_q3aBmGkV5Fw8|vWounI4?=1c#;33+L%J&YG7y#ed zmXiJiuNR36_nuT#g(Kh0Jm^PvH(`~1IbOJ0JgU6uyY_-+U>dO*6e-9Sr3~2a&0}0D z__+N9TUxgZNOW)qhjoj9jMcB$1?T>lTO}B1rUSYxt4JEl9@hkTfnIe@*^M;eE3P@mlMH^J- z%GyW8*;4YqkYighZE16aVQb1C&;)0>Li`X!d__&6-Lcz#fynod)aEXDIRF9xSH9k9o73+Khx^9s7D>>S!L47K~xk(*|O14dl9H% za`6-fe;W%%-Nej8ZjD8=KXM}|CMPE%!mSF+%;Q3^?=XRu*a_b;t4hXQ0TUi{B=qO{ zlN}?-(6t^iQ72T?rT?O^%A=y>pFS?J2(F*LF9-#mieL3ReXL1C0Qk9G#@iZ)EpbAK zX}1d;sZh=U?9N^h8N)7&r&PA5yB9eiv8?#e_WMUNA?dI7P`nNf! z9XbDea9Ak0;Xamvom|R{AhvC~8GdKZrI0*wjE}!frb>kasd^i;Txvdfid)SaCL56x z)Mxi9TRc?~Rv%#kbZ8gGoNFc~1$FTPcp(wc1boqrp3cD2<+jE6YfL&Dw^KX1h#<4TjsKnB!P`zdVj0y?$S2eHUeK~qwOUk%AvBpj_4x{Xxuh3N7wzEw< z^(>;Eb~mwbp06>3Pym0N9yy-MjL0H)2$?Hf{zBl%%Po`TE>rSwZYJfsVSCkPzo=ge z>2!8Smkk~0nsA9~wa0i*1nir3NKx;#Bf`X134w@OBR)S`o%Tq3q>Bs^g%xk}=#OTM zRv-Z6tp!fweIj!m!PuUd)7@e0P5=5#G|E*@;i}k`jLimZNjo(z zlpCLPwc-yK&tMDsA3y0(eb5Ei{wwg?o}M{GmrQD9od&D$Xw-~-SO{(>=^pO|qB`pw zhA{tsp)6L|;1!OcJ$ddxvc@?-=qq#Q0Z45_8Vn4K9)i2$LKL5Ir3M`zFkiYH-AR&I zK=E4xvi^0#iE*n3tI!z);GiE%T6zq}86{#omM5W3Ri}`V+JTh#GlFF^eERMFCzz2F z#dy?o4=FJHbw|b7{>>NwT+*f9!aWSrQu;Nuw5Eb{g13^vQpZego{oQ{a#A<%~eAl|MBoXi>`rHe8 z10!H`a`>1OxdteJ*n=`;wP7tVR%RVTKN0P8Ogg)f9QQb8e_XST+|Zq_>?(h}#e!+= zNnD?OE`eUR{A^1XAyrs%IG5nFvqf+O&&OF<`i z0d?vt?Rna;T3yd5fMBHQ^^jO*s`!{oy|MK+RvyAT9Qq|wu=|P+hn7mV+&n#dES@M7 z(s@O@J5VA$Hqp`GL5s6m!)cpMrfDO&OV@ZI-%3CQmhE(`t9L?(CR3&RH7SX#mOlmt zm|v8*o`8BXcqcpLN}$y@?yb*+i4&(l!7^rYicC@Q$xffjZRxRpjlgn!A|6u*pmk4s&9H^qRf-NHE7RV$L za)tEE_a*>bv&I$(wH+e}bSAd29N|tM7JGAE;D4zNYuXMg-KkkIn=inJM$s9%KQ1T=jbJBvP|&&RdQ$2m=*v z7(o?+Wo=O2qma(4lE=FSPDOVb(&62p3&%Ul(?E(No7NE1v+u-M{fKlpq56ifKkz{f z@?TALB$p-CO76@VZvH0=0O1nnd4eN}G)>{KdR`h5Yh4g^1TrFwxg;$yc~5MIn05%n z-!B2CbQEbV9Da2WBhY{uW*Y%!SYMn~5jgc6sR8=+5u#%)oo6*@SGTq9IPpCCSQ zZ$EEzTsT4#%_nW6&HFDvui=Z#avUiIsKKjJVfkKSL)e~s!5=oC6Dl$M-2ldM&Ga+$>d%^pF8Qi&P z*GGyS0H9^$@pVejjuv2iOR;GNE(dC$Eb#s@S10s-5eRm0@8kVQ$!2%U_JOknW%nuH zX&Ue)fdh6hg9Pvcrmm=!-htKPdB8vlG4i^qhUZ_gRd2s&Z+;rRaeE4j9zHuPd9?3# zOf)(q8^QR66loZ@L3>K+h-~@mw@XTRl-#Z3($ci37PX0hyZ?$MAy|+_9i=4^-u4|5 z!MedUwrS$V%f6p6c6YOD{#Mbyzoz;K^3nGq<5`uD9F8+TpS>jP(e2#PLp23}SgbQJ z-L#;W0_|@JZl1|94-vTNdWUnd(}NcEU~S#`!-vxmH)167lp+dEtsubjlU$%FM-4-0 zwBQw00Bzoke2tIbH&*eV%4oInaOzolXH?PoasF_Rp%`ovVu;(@QXX)!Oq^%ygYJQC z@C?Bc28=`M#XY_<7TsZ6*86T2x%{)KhfPjAW~VXB5UJ}+vH$rdB?k;UcPPgsfNTY? zk=%X>L&vn(TZo9e4;ktDTCBWH13k^=SH$h*#`5?&x+@vs_MG2J5?7jP+I5#Li#J9^ zZkU(A3~Rg*esGrF(?fiV&&$Mg5GGJd`!FvaDk>pC71^2{SCz}o?#@qOm#-YCIf2(m zr%>o4S_E7OGC($7AtOh!lXIL5f(?s8r0-3JB1mtvP_=O&J{zIa@usg#!S!!a)j*`4 zA57%nxfzlRbI7qat&(nuc{}5AM9B#bdaVxv121^_`#@|=h}>-5s`$7I>#f`d*&6l8 z65X_c7(DH79}I9r!lE#5Vbkc{pje|`3>2pg-&jr;Vp4wIso@%5*t(3|S+RmTmD_ht z!YV|wop_a1>MP$cA*WE^x2kuR7t1;k(W?o@DyU z@VyNvZ!^{}fn*puw}|-P?t20l!8MV$qJ{7o+=LV&*N?d0PqP?rZYc+^SY8! zo$;QrYLwA~vJgd*u{Kb7(Qk%J3)(1DTpsTPUI#nx_^xWL*kUG zk9y`8PX1212|Az5|3HyD;$m5Oc~5E10t{kvr|IIdBWqhZ+h_663l?KKt#%OyeddAx zN7P;sq@mCK?GNU<9(!D2BtqkslsfEipnxfzO7P?C32slbsE9mH^Rd0&knm@%5hOt0 zgWAED#Ltw4@%R0VXKvI{?z$O?r2<><;q&R(G3qYxF~!7!5yo8z{>X#NB;C<}a3rv{ zU7Z$faKBcK{6em>YrNLDPCDrGLhr=DX?r2cqWU+g%Xb>Q91XRQrsR7iQI}5Kk_XA- ze*^#9{2reejsBh}ZPJt6CQ_c*=FEidXGj;S6$8HBQ<&in~ zcu|HjbKLue;{VRS4F?eL@`hQTriL1c=6Rw$`xZV3Z_yhvAR{sT!tN-YEbd~~vpISlq=j7hm`1=_%lC54yc*qr5n9l9G}_05eW{ zIt$1s-z^At@OOnF-X24VDG|3@uoYa%bKf}kc(cr&a4;Yp6|cl>flJ1ckd zx-2o=^N>JCSBfK@L(Am?#1`~8=O(-!#S0G^`Tt`8Gbc$Z8ogbB&q=4LIS8EU&a8Ym z9W`1~nR#VCBI&5uQ6bhk4_}dhp>;4(gj|X+`<3;Mc@=H<&BBk4UFQy9AjH;9dClqX zVMr*F^OA6PPRAdE_A3Bs7-ndiVm*A z`2tV1D1k(8go7n%bPj~+{x1e|;#%SK;%~}thjL+D=oNZTknQ(A*?hAx;o1hxSU#p_%d$K~`x3nH_gOJqNesC`7Ecm5j^7WTzgqmQY2b+U-EW>bm$1KduXlkNtLrwZQivU` zCopI_$b89I+=j03opj+iLnCrf(_0)xt~?V!mnBqJh_@x-cQC)N{_SSkRO;9Bg#mjT z!d3_ST?}l7!MG_Xp9?l4iz#wFFi2{D)2Zk>gr_%|Zt<#p_wQ3|FHQ0w*ybgAhk4j> zA#I6A+$uzOG;?Rw`^JEEPopwH9SIx|bLpg81y|kJ5*=cN$L2EM&Q?6`f4&cXLIPGm zLGLVpU_0h5_Ka}??Y@zh#_-HZRj%73~cYGrfzc-&Z zkk#mI(7J&H64S9~g#HDkC1w$ws_bXWE<^CDXbN-i6=QV<9 z^xGLwD3n+rms3HDDH}FSExh7nBcBbg8MnbWWJK*}e^_@`)I3_(?Y;LPVRV(tQo9ip zz#nwg6Lv^#T6MRA#M^>uCZyBl{~n0tkc~0hG>e!1^R6iOY*sfe@}ia)Sp~!~%^v@J za-%xwL^FLNIN9)o*86GowEejW#vIo5FF`8QynM*5G~AFTM}l(~ACjGi5iebn^J7AR}-ii=oyl$gw~C z6)}~B0l8AGXa`hh8;-q*M6#8JUQW|lqa_lx&J%qkmxU!39j81%C-=a}qA_RXx6+(= zG$;JRct7vt|H|$CU_Ip^1UJEG>}wivZpRvyl7*BW|LY6JQtHd^x)Ea$hpycY&AO32 z#{2hOmot`#deH7;4>s!LWcM+}*TLtR9Nr35g#jc+&6 z4eHv*oMLg@uB+6~=pLTpTEE|b0od{a-H8I@y{}cu0Kn90dE-ElakdU8M{~dmjV#C4 zbb{<4f-~wodD{505*Dup; z-dZA|@K_caDd6W_4mfD&eZ?OLo5R~|YaIWFCQdp3mADJ2fc{=~&WuGpu6U=guHE&b zxSSvM*n13?bUtsis1_bKbDV&|K;Pr=F|(O-Hovg-eQVyxuik;|-+nFsj2e14dpr_b z7aZS(4>KeUlO!0-$zED9dRp@WO}Y(LKJk3sfb-{ChE2o_3W|E>qN+w3Bch|>E(?$ot>AdB~U=68NDMTM_P*sfPFZF)<2R0#< zEc4{Q{+9K79t1*4c733s*=4Awa$?Mj^ssdAW@jU`{miA&?YlTp!D30#URt&)>$M%bqpVHKt2SCYWosl4?Bw(a`eFAws4%PoLwvmXvU?#mQHHxRlaJs|pQs=AIn zHT%^`Bqv!#B*#6;_otM`*E%izDQS1}ReQStLT^Tcj~(apR6+v|GlQk`F1)zjSPmGlE=ah?0GY z5Pqjuz~{lTwaEv!^8-I&6$mNdhDrDrNkZJk=Z?otX@$Kq`!W7b65Dltq9<~}?|GFl zreZT9DxVh~@RU>UPYAfa3cSKx8KR#E6EX6dVMd6B&~V`VSDMN|dK|D~Q&ys~q7}vB z0r$QT8UJfH&roAobbr5n(7kv2vzcZ8h~FkmcS^SVz9^S*VhDgcQH$gg#U*i0c97~B zeBw6>DQ}0yA~)@bFZ{UsA4ch3c@&T|qW_q=rPn78%q+TA|KgTCw>$hmZ%2O_a;dQU zuB8wa_4{e>=T}DK2<&M;Uy^vdKJSgX91~X07?WzwAM4CBtajOqp55 zi5Ol>{fta%PQ9Nt{x42+x8uFf%LR~t+}>v7O9l01hwq}IdwK25t*Aw~WfCb*nS=%r zc`bc^8- z%h%C~kjZ5gQq3=u;T-M5=2Y}BN=n*<%*(F3go4!?-ZnFNoY4e*@Pa0@^n30Ne!O0x zw3RSchAhV;{@8Ql;FQ)a6UWJS7tOOofdK4tg+gc}ca50%WGw+WVD3|myth%FjteLT z{|z6z09{c8gyj<_Y~?V;Few983+)e`;QWhycS{q~5QRVU!Gfiy!)Dy)6I?;raZoPz zf$b4vT<%G{v-QB|^i~e+x{JP5sF9`SV)vuN3dENk*rXlQe-t)yY38;+TUW|28<|*A zN;Vz+1c>K}G3RG{kFBJoCnX-;r-xQ98>QRI+J60Aqt>O8RHdR;+v^D-lnI4~Fb!Dm z)=1|Qo=VYqT=E0_8KXIS>kFvV`%TZluOpvR9)gmBLzo7WK@o@(}=+;Lq;H9%ZFfqS2TZ&EG zF2ZNZn!ZWLJBxN`OqVwxQCx`&vC<^|dK6DP-)KTD*MkH~`qJJze2%}a#~tot@#-BM z3g28dlCdC$)mB{H=Yofft8CNWjds1x4yB@36q&L}x@#NP)AwQfYh?Es{jW996Vd1c zr}p-yr!)*21>Krn!IDdob%K~aa4D1+k34M+D8U6Tt`6W&m{+%V68!gsz&DFVQq+cwcQ9&J2 zIg?UddOovnzh|)qirEJ5`YxJS&?J^EmGQsbwlKpKHcx#!|Mh=flpy@{C;-LO_U18? z=I7%dXa##vdeKQ@GOM3sXG5K|lN;RH-VX_5&l-oStV1gdf0{LU^!l$K3f}I>96M8G z8k$Ia{z-cT??=Zp9;h1dzOf&bpZvbEs@%T%c#(ElRSJDoJ_gw^B;>!ShM!Ke+UPrt zm`;3q`TNX&atp;{82s~bzTIo<9^5Rz)8hvhcte)_C4G0Si~2Xq|cm~ebd)3kp1mYM3nivh5M((|;a*I>pk3f!Kca>S;$_%@Ln?>O^2 zJTJXO%AyQfUGBFvVg!HC#{~EZ`1r8f7N_H-AFLuBIY9W%>z66WIgVn6Wisba0cw$l z9{kEyvQW-}P5j{UTyEAwvcs3~BT`pj5bFezQ+X+IL={ zihB+(JT&^d( zK$+ey2uA5v!Jl@%tbGG)^yfT1ZiL{C4TIwytu5tQMp2~$rWL_3&c%x1fzsn1o0=!1 z02S^)atse2(%k;w>A?I#kZ{kZO{Nf~G_TOvuCax+GT!uI8FjxU(;o@kD#H|RI57^5 z$)14I!*$SWueco1{Dx-a1mzu)?6Zt25+u{lnVwi1#xK=U;WTtnbfN5X9Qb^J@0eG> zd1Z{417cwsNMIG$dE=-8cik}O|H0OP1`GOhin^9 z>*~&lr^v_ZSgLHG>2U@FfZzpr zK2O;yjHDlA8$BN%CIg2YK9e}U2>00;UK1_YD2?FWixlBzj_b7+|TKaqHt;%sz zePZ$Bg9sJZ1V6d(5>5(8g$bt*Ez5P#=C~womSTe}p2QW`0!`kP6St))AGaSvov#1udjU3nA2?#N>5f)`|n%mvpT1JpPZ% z>Q`eYH)s)4CLi`xSAAN$3!AiDmVL}b-MDYI&~oNbwX^!ppnrT?efOjCK_}=w*G|3f zBp0jVU({DQF+NeGx!9+Sn#F&x+Z&|r|ISJ}4|*E%g8<|l1^1;`m$A}5nI<7v?_n;*lC(z={E}e7Ym54gaM$kOqoS`#6=0sN6ia!? z(I+_T5DKQGAkp+68HcQJ7SC0r`FHL~5FVu01sh=a(IptxCS-LCGJ53Xe#oY`Wd~ps0xfd4K3!cii#_ljuH@cB>^^bm;t$OITjb~SH%H+$9y09y2bBF`HvIOP4< za?7-^vX>2S`;G#FIhYMGu^R1SZ52G(>M>kIg>&6T80&gN+_!>mSPyNOnMp;5efmPK zG}42`;|w9wz7yNP?`1M2XB!Ln?-1!s>rU&4&?M84)E_PV8g3Mq_;SA)^o9Z0d8zT* zeVJ$jIpMPnHhNd_2Nxf;t(KkoT}sQKDdj$Tw#fA16!1LkkB}`12tRM(r5;rEJY)$R zO~M+R9yE`G$U{IKzjk={1kK&`oGfAe9x#vp2E8};LV%Y=UIRv7C4x_~f{T9H9xz^M zEw@g!_k^S+QM90YBMc0{9d594Z7wGsxiC#oe2lOJVF4P<&f{F&hmb0g-@|uQw@e84!oQ9G;e$i5V>lQku>D- zH+6JJtlC=a?DZ!?4*1l7Z9Hu$X~bmLhJZ<=fpa%bxWI?rPbhZs0kgeP0@MVI(%85@ z_XyP+i+22EH4a^MT6)4Vk@)`Tm>cfNnO5Ay?%;U46TZ*opjTlC0P|XVgn1)`0tY>- z_>6UjDusY>$PmXE()~d5VeSp$SO?4RKK2rOM$8q*&9r?Z|413QN8;i~pW|+26IN-9 z^xKJQ%`Dx$K-+!RWZ^%Q&_jVk644nUAUx%ss$0=DvoIN{oz^Z8K9k8MmdC4dU?!&%%bHNwEPL}N!&iMYN=u|E zb0}Ly{)zW$54@NiM&%4K+bF}xSsCpIx2`L}g-EB**)XsqoG*Yph=@KnmdnO^!TSZ$ zW(8WTB6f|&Wa$q!qmnQIbMfAJ?YfA$@Z;tu-oK7>D?o6Lu!Qcaj-~`8Yme0W8&T-2 zJgBdb4zbjAt5u+`=f~G&j;}k z`^Vp_FKi0|i6kQ2l4j+HcUh{~^F4cb7dv{!NsU4Ru8yhHsl*RW`ObPKyjZm!#-1px z$rak4Z=Jt4;*qAQLt7QUPbwKOGlZ0+zcj=nlQ3_~jT}0YLC5f7%EgmN z)>`P=xR^jYbRIq~I5gkx{4dK)X!3D#^vhgYvzDLp1uq(J$DdNRJW83)W2#-ASO(0@$VhxN&3Ag5lLxX-8rpI_?=*M6!E zRcC;~gaUz|9*Z(=d=v-)O)+V{u|hW5SE|>%{J9ma>k89*Xn|4On^%9%1eh6E>C8V4 zU6^?9BdcySoWBK~>LJgH&Rn0`Wb3%+KI$Br4k^V~yYgNs5G)5>@qCRp`|R%>-k+XX z`&zJ<25l>U>go2g#RYHP zQa4ooy8kKdk}bI`QB3IqFWXaqwGO7&(kh|70iwwNdzt_b7kQALauk3y;HT|K74~40*xv({ln|G5 z;>SIpa0ym$Kcna*Diboew!S?q-q1I7R3_ya?45=Deubu8z3$@Uc>ra9bWe2IrQ2O@$c~t>lqQ{u*EuHH;C{I1?8Az$i9OW-FE%DeY*wHcV2* zQp_zdQh`o4Nt-u#6bMfYxCRG<30ZW2kE80Aj1v??Mq}teuJ;79k<2mAbh3#%75JJ$ zM9nrHNU={%o!knuA@8OQhiTP%Xa7A^wl!uqs>1yd6^bPvQeXxjcH-_z(C1&$ovV)! zH8=mZ{QB9!0Z8ewEXFx7uiI^&Ob2F!?5aj$?=?bl*d`cC{&p8A>`qzNnUdr@cWw!r zETnpn0JV{6_`HIWN_XS^3NK{+lKy3L30v-8So3@UGR)G{`Oh3-A0`r?(4!ufz*zVf zSLBAt)RMnBH-(C~$o8@1H_1(gTZhK8}bK1dl79D0*WQKo+I-*wR2cF-X10auwzWo^rqE`s?Y!8!F`*+m3i>rPKzcIDArfr{rko^-QQ z_|{~WfOBp@pG}3+h*jY2pgVqDZ~kB7Cmr`oeXUXb=8u3BMDF$)nGf!oE7@=77x4|K z5HtUuLx_%5MQ~mUeDES8l?h*}M5*rIIO)~BZA*$X(%L#Z?F4_{hqTUL^=fQL3PVS> zvHe)bB4GkWz=VH;SD&bdxgTfJvPV|qkb=8Svj8oapRqsFuVBKc!X>xy=dT}P?T!An zH&AH71GuC?3`TZCZtJiepsUX%VB@Pz%BkNw~YRok)(XYBQH#B9jtCSlBQF4tzv z1}z#xUz8deFWy*Y$T-j^{FHAz+3&6jeA5bd97E{)Gavr8nxfW+q;*nst$Z+(kQg?) zAzji{f7A9eq>5=G-MHrAlQ^aB<>zGyh=XefS{V--pw+j$+rDQf6iR=@bPP$iEI!D1e;O z^7R{%hp*$yfx%(1Sb1IvNdR)uCH0MrOGG+orr1*G$fqf(xVX_c@u~0>amN}Rwpd{P z%6|-nY4D!E1+Jq8yKD_#JllBQksWY3=_pG%0q(DeQR#Nn*Hn(JzWv65k_2 zW2UHXh-XMF@<(^u$Q8|D09fQwOUxUMc|Bj9prlg7C)ENpHkGKBQ=qbsOqYri%G*m} zD10MEhWalEknw#uIV7#qyWvoG`=!0WET8V+844&XlQP3pA;Elcdxg%o?{BKQAE}Rv zpKj47iF!nq7XE%_`Mcg8vv}LU$XS)8N*(%T)`AIB4GJsBPCrs|=(XdX8wW-o$6Ey@ zokg5BbRVrL+&bw|JVjiwS}4ElRF>i7(ce7LG7!wh$xuiN2@iEOp5Q_Z|M`3HB$7nA zPcy+vFxzM1MvmoBpXm7!P6OGeTeI(H%~xN|fb~l>3*>{^7q#WZ1lakIju~=$bc18f zq@dDg@>y?7x1ed4T|@IG+OxhH*rO;fuQH;(e3;@yYb{ z-V~^UMZ?nlkHYbzAB>#OwpwJykCvqY1lc@L16S>>(zXo7RbtQ+&Gj5~(+y#KLO&b( zjCxG|=2MB(*^g4RGHXsgmW0_k^=<@K_TFz99Cy?&0uR38WzRc)^}_~_NksP!k1G81 zmOLif73XW2PG~LD0sY})9^Dh_w%-r%j09bw&zD($!ZPh&|2BHzp4#U-`RUjdJZ_Ji z0TVM|XK<`f^=YTrEp1b>`6wymZIz3whY=z4k(D>`$ zdGj8>PSpF4pPZ;7$@j2zjC(!@_rgiZm&&O$NVR$NS`BhJ7mx({@EP~94h@%Z;(wgv!(I0f z+B7!a#_3oX;Y8z)F&2ytxVqj}r>79fn^cxy@H_d=uho%wKY{yjQ>Xul|1I^5!W{y` zw^bHTEqoppG)%f`o0g=wJt7+WX;2~C<7g{601MEf8*M%)bzNy>3mgNNT9O%F*H;)7eC`>cd!6Z&S>U`6{3QQ-a6t7ePDtfZ+4* z{5P_sv1=Wtc@`#TddFHNu~r>ZH`dXjq7GFg2oiq5f-D$c=Sn)qFr1$y^;8p?bm`J1 zxIY-|wKehebvXc~LSib`du}W$+n=k0%0=AY{Ye(1m|iNgWM*r}=?`d$CE}ZgAL%3l z@qhpRmWIb_vs7qQSRkvL!g~#vRuVj|fjResQmyU(w%#E^qLop|&EkIUKDlVPn_*>N zJ`BnZ4Dn%+gZA%TqYV!-;}LPEQDc+fS*Hu@#RgW!4~4{TfaNoxxY8$e&JUO?P#)0%Vw|Z*_JJ0clCT)-XyA8b43eD@W$tiDO6KY~QS=+d69h41K z2ImHRltlzoRHeb&<=ANhPI>dgNO_GG58y+KHDjh~MkV?pslAX>%8!w2932jga}s zYFFUe47f%dG$fd-8^ikk=ZxJ|ZKKaTzy6{Zvy~TFYxNL1^^a=mJjE`1BA;Xkwdaga zT}{M_h_MCQRVs3s`v)myN|>Up zCj6)Eoo|Zi(6N;uQ3*{jOVE4gf6Jav-xZw5fJ2QKz5F@k&N+Je8C*XH_mYT{p?p6l zLN7vy{+o|vd;og>fx<$M#l6Y_bKT-a zE?@P7oA@h;zE?RY;>A8Dz->dmqVvt-7NEjPrLFY3#%h zPD4c$@^+fSb*Ybwrx>v^dL~u*GLdgD?yoG=r)cwiF%ku(lJ{??x)ewy$upcNIG0>( zr2)=qQC`~fUW@;4|cb=|9d^icU)i3jZzLQ;OXU+I42iYy)HzGF4L$%%7}pm=kF zxsZ^6S`V~mo~F1@CX-MzI+NwDH=d#TfW(Lxvmo&gkN$k<`a|m3kUl=`s&&|~6s;WR z3Q%nC)c8jXoiQoNqe{RKPlt56uuxb5U#4H;X*l+zRwI`zIPq-w!0QrU`pe8YgGiGy z5K5}fezgTB_Lc5ibBjVjn{Y51#wirMGfg?!a2T7Q_(2b}k^ljdtOH$i`2_Ip5YPi(+a$iaN~CA z@?%{7I7ifv!+#m!Z;na(OIJze>t4Mq~aDf6Kc{7H3$B0X}sZ+pB_Th55Rgo3Ren>N-KV0&)lk{nJRML1lkPbhz4 zXE*WgeXE61uVdSXcXay4>3@zxL9x*qOSZui^knNz9dIDym{B9(sCw`X7q~@uC)~J9 zW1ZZR1@af%^E@z!+?-aaK3MK`V@T&J7;t5}|2j>~2~+QLCTTAizct2RU*<74!Y49w7cxB&r`pt`jS$GLQ6(ChC&V8_Bax6oKzAF- z0h`_>EgAAHxa5=~$DxUcM_<~a`)$q*0`Pm|8NK{>?(i_jbttRi@*b1K#=e<@C1d0q zuFurX78rzGi}8Uk@U$`y2)_EDY%Ot{exXK&%@txueqW=t#uqxNk#VnblhDigT}u}; z_05m+|K>R`K#Rx?m3@-lKFqVd=yfeau+bMDaQD-yuHac=-)_}pf4`HHhWwHagG7?N zBt-#$P?DW9&2ObEUYvY6ocQt{`tdQU$O8#*>^kya_=UthpBim0rt;nSL-(-gOz*7S zu_{qOp1s`O{o1y=P;pe9>a#;rtk{r7f*N~iGNnRYpv7zRm6g#iSPO6nzM9 zHfI3)*IyWrn<_7y;xA#xfyeyQti3KQ%5Y%waSILbG)%}cs7^k+n=V+j^%^b1D{8k7 zPBS$!1^;~LMg(}DB-26wbb_Q}{Hf@79k!z1pe_e|VPy#0d}qo~&}uS+w44c9O~U*5 z=E6e%xeR*zG+D=?QP}rP%R%1n5joelo3ip7c`4;v_y5si>oE6lNNhFL$HBIZ<))b1 zX~y776i_Q+T9NRsUjiSaKM#t(UFMV1C#>WwKUnw0!-ArS@;z|bbK>Krrc@VoStj^g_f#{B`=eFrcyOo7EYohP_b_N zOclflU6L$dW=fdqm0=N+Ylg&175^eX)WC$e?!D9&{Rg%EZGF;O-G0J`s*#&R<4Y z4G8x4q%6R-K)(N9Y@GvhW#PJRS8Ur>$F}XHW7}58wr$&XI!-z^JLuT9ao4_8x9Z$e zd;Ws8W=(wad!J{FT+QlzwQ17~ND`}L{d{)pv}ro))H@ekPdKg-?q-)MX%Gvi9pcA( zFsReti>tX|+K~#KM4Djs97R_V$zf47hBVR}2RRtiEm9`E7-E4AWjV{Y6Wf%#8&5j1 zZJ`C0$imsNRU~|jso>LhV=Cb{?*59poMr`W35xZ97L-VzlaLH(uR~DnAm4}pFF%UX zP1#^b$nRb8&%H$O$1J<@zyzLlpTPiSP%LGLiIccOe?{fXd}u0pZt-r9FdCu2$dYpN zxYz&%Y23qq#_sE)fvKCio;Mc0=MRDp{#0{KHKt8rwzF$8;d~iJs(GEso01=@Z&@z- z=`U5P55e#nnb`x4Wv&y6?8o6HXxkFwRn>x3*RqCi|IFq#+z>-MNB`L0ZOfL*cNQAZuwGeqyDNCI# z!q2l`cDwu9KS(xq5fli#b+`e3`sNrsm?U*h#&Xl=%z;I)OS3Pyj}auUQ$gAcgnwpO zrDyeb9$mC9_M2Ysdu1^Fe7580$eM19_L+98v zP{(J>+?xNs|2Vxf=U<^G@;ZP(1Dyz?Skgw?KSgyFVOgWCb_~gf=}fbLbZ~&Z@C!qS z$@4!&X5g_P!1CVwow(F5ZU05ZD6~3-&CsR^%6LT)k~934cG)OG!-s08**FURGJ;NB@Kp?uty55iy8T!atD& z8aQVO&&%e9baMyJCn|DCL4)XHD(o3r&9gXY!v?2k-vsqNHFPs;w)>^krel~Z^6k()RTzXNQrTN|BYvAn^U|!+rs%^U0reog+r+8Tyn>}l3OCL_+#4@RQr9rT& zVwRNgX}CxE^G&lN<*~(7;@f4G4?#os7c-!M%3F|V_f=&vrS7MCfcZ&xWc7!{8~C&D zs4qwLk5G+S$F4Q@bc2|U>yn3#;QN#rOI;+tm>h0|b!aPF+%x6UG$n#PPD|mLDJaQ;BL-DlyQhX!6ZNcGQWy&2jX9p(?IQ?=YQv& zzK0a|fKdxb0Q%yRUmQLjDPzWg8t2HR%Tz<#? z{3o!wGf<~@06?CHbg-2}s7X%M=UAzTiC@&qQolWVmFGQ&7fJ{HFS}a@ukeHmvoh7Y zKAU>-z0&*HwF<9+PBE`$F|o=Jnc=spYUx+PG1&D;LA=`k;gJa7~zAMijem$nv4`I zwUA4+9)Q8idd&<;{+O!6!jTjvUVf{w8nzXwV)2z9T{P2pp<7LK(X2b{Q3*NO%;k0D zoD_o%GWums-<|vbecG%rDoNsU?^jYmbWVrA8oZJ=?baP&VI`D2Bzq7=(o@Kmkx52c zI~0!j+ADNL8iECo!=zlS-V*bsE%oKhB};A0Od<=FcVXfvG52&O=4upSDqp14NCUFX}n)e4^?av zn1C<82nk4<(>2$c&OJ^%I66$f8aA0l#mT>%w*C>TVQMLsH=dC96QHdJ=A|jUD1SU1 z=?WK|g`&?<{^h>$PjD#wipsbjuYLmrph;&l1q)J#Ow?WgnO&)q(Xh&rGU`;D4aK9g z#smJ}reG^10R8Y-i=ef+G>Y5_`NZX|>SImk(_D6$kYFLH0EF|h6eYz-t+2^4@gnl+ zjWnqeF=o-o&6kn6uD+J{opn2ENo7|qo zC$IboB7Zfi&RE#Ju~I_-u50ueDig@WwK9Ho9}~i`kfqjJ9WAUKtPc!F$eNQOg&ag2 z>8^3}9dU6#l;OdE?7;7E6EU45QRb12*xANNiC6trJKr(&ohAv%(6M9+G}QcUk9fYK z)a(AqcS~dH#}dApQIMEmsQzS?w3&C%KKWi#j9ysqLu4-Jb~m9DsN9`@!)hW;KB^*` zEwSPBBU7%@tjmzKW)D}LV<@dp{g{x#3CbTUmn&upBEM~@z0;mhBi)DN`%(8Ta_9c; zi_a(H+4!!{A2e;lc~j5*)3jMLTpHLs&zv3S$(kyXr?dP1sH^T;i0E|`zvOe^h4dwX zFTRhXrzee&!QyGb6s;w@(P@zv5>s7L;|aA`?#Y?2iD~ z;wg(iY%#g`C;oFuOm2p))4m1*K7K>R_w8z()|~`T6yKZ!_177njR~xCwDz&|Mq~mH z?1KFLc&sSHaKJ}KxxvY&aH}!ccxVr!GT^ZB zSx||YZs_8EAE!MpUr5&wfQy&u>=T8p6J1>7$lblcVd^ub6$wb@e4Poty8zYEct5FG z&+AV`L$A1(+%P(VQyt_|A$$#R?iF&$IAs@#^kvVfev&p2Ktpecnb(>u0}oO*2eMZw z<^u1Fm@$`@yR48SRG(Ko z!5vyv=^TM~+>em!qjQM-L+ugZHOr5WuRQEOY?Pxhm=$v{7Td zQKl-#^fOVqpk8G(0n*yC_!loP&N)7yel+Eusq@atKv&~Vd~&)iEX19fW_S$Lm6sH9 zZ7$Yj|DWUQ9q)O`G&3}7r~u_OgUkkKC3b-VErJepT**Bpn$^leux^pdMMda*IfnECv||(AKMBL9F~9B5j!;y7hDgpx4od>tm>Rs3Qx0?gPW!|w87#HY?T6E zOD>xDO_aAW2kPX-=dj6FC2I$SA^}`lkxd*Pk7J~WgnWNr7-n7Y@lbsh8}*sH-caEdV#rTsR|%XS0i5a)Em;I+)8|3m(JL_ z1reo^K*e@*JoR^FI-ykcA@fA6(UH87vOv0V7vSL^kt+CUL(wg_)w-0;3aO9fsp_v* z@gV)f9Dm(^$MN8Hd=FGQ2ZKZUTI-+B=J5G%uo}8w$@;Z5W0CtZe$`6)cv{zF`zjmF zzeie2>3GthjZ&k#4i_Nh8~#4SGH>>MObF|GF>nJ+_f2Z&TcGEi+bB=!M90X1S;DQTpn$XlDRpvfbw!1V`##eU56k^rHJ{NcF0Wza&t*{}K zu$Gq`(io0% zA%<@f9a4}mq`*StCqqoG1?g$-7x61A&GWG5xJsEyMLWxO<4|i|!mYMAgYP)RvC)QA zip<^Km$>FAd82f{m{*G8TPb8*Qh7>ODm!c|UuJgk@}BAbI5pnX-qUYCP=Lorr2(+I z?e^tG=hU@_?yi*0Tk?pJ@9QIa>Y#9n4btwbqT6|ib8HyBr-yJK7t zY9ODJrZ8PP;cNIskHP{|(^>}xFIo{S)mB^MfO8E-qLJc9l?YKR7PTM|8~Y#u3byUP zlW_JvQDJ3h{2;xEsxArQQKnc#R7yi+4C)y!VlM7HlfidJMXPKeME^Ed#g1=O!Mr@G z2(O7bx2=s(7MfvAdP-FnUMxwy_ZdvI6`Z}*i3XV4zoXY+clN`~RLXISf|R;!g(PMD z3k`Mn)^oGD2%PeJ0daJ%eJ^}~0(~!xwB0WpBr$G$zDeHHyu%U0T_G_;2G$?7kYT6Z z=W2-aNBGhR6cg5gL?NWSE-E0`U0=?C{x*8>as&!=GqUUP;;?3i8Q1r>H+zeH%ES$A zC2q`)&v5jA-gn$G=M#|SL(M7G^&Z{Mh=CikVq-jw*!RcZ@8%`!#H9aBW0=~)7-=AO zf(Sy+*4sQ``3akIEc4&BM@Mr6X${Ub@3h~xBZa<3r{j~K=9K{<=EReZ^RE{Fk++mo zT+SaK?_!^lIeqhBt0^QqWg-LQ?L=|6$V=oULOMZn<4+`psLLTJQ_js)JPs<;0mH5# z&0GF7qBDV0>Jec6a&QqeX3l0vQu)V@&dTT==_({do;eYFY3J}Gtg5-IE{lu&;DoG; zs%_x1BF{3!83Mv)Rdfa{R93h+k_+d~Fy(f|OTqWEyj0Sd$xn&B=j5>>abxsB!c06y z95Y1UDmC*@BF(;>d8#n)*7So1a#4wT3r8PnL2me&r|7|sQ(&-1XlV?rUJ!d|XyTmfgkPG3~6#<8ECMU>jp;DTu@ zf5kfMUVg*4I$Gq`+7f{Nx4H=sS>{mjn!!t+=iM?Y`Dcihkk??fV$G%7Jk9xoq4UM( zAPIFuxgVFk|3IvgNEzmv92Z+e4qc&pJXxzhK$b5{B3mrlfx1GLg-{lHZ7Rdv`EwoT zA+ypf5hh00JoULh6LcT5r}maGFA)k812lPA?5+cseKkbv!jPaJ9}pgg|0hs`#@}=F z)aJGQcAZ9XEyEgz*GB#$yDvxS1de2!fb9GkDkCdv_xkxhSaqyfKv1Q&FV^&zv_gi| z4fV6ozXY$Jav{CRu+XBt2;$uJf89Xpen%B0qw+Kk&}tQQd@n`>iLFOw#4+Zwg|>OD zl)RRp9%5PH$w`HgkK$1Zz-7DiPr)x2?sA~{%;oqOUyo3gYSPcIOCWg?bRvqN;(!Lw zxd6~8xUX#P@1wC}Us^(V=Lu)Cw|n;?nFk5RJUoeNsvI}M-IF3J+#6Zb?|iMzpbZWUZ?B#dN9DppxQA=0W_IwMWOSd zl)f(+E_Fm9c~!|H@pn12ignqOg1E$SSkKY6?#xQNvHabl#)Ow?i4Vg7gyV$q{UO@(~s1xhSCQ5U!+M% zY~T0WBct8#bVb`KqY+faJf?rWaBm}XTrh7f_@1VQs9|@RcHU}z$qSPolO$^tN+~0n zoLIU&(2P|#r2L=9GImPoAVU!T5!zfFb@^(T0@J= zAa9c2BMf#z(<3L#u&0bXhd0H#6e>^^(p1&e6TE=A;#f)-nDaGQt-?m(M0=i@?0`#) z#GK31Y|df#!SmQILK^F4;f|cT$RrDSICEQ(fVn7pS-Eot3ZbOzCA3k~nOV6qKJmLa zi?{wdI7V=Q&oR-p0vCr|_lyS`hk&rqoz?)U3n CJ78kZ^3UJ%f|e$~ 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 ZU_-O}TW_|ifb1YhLR40yP)O(V{{if(RyF_t literal 0 HcmV?d00001 diff --git a/web/static/img/logo.png b/web/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bc771faf79d0e937813733595fede2ab560c6878 GIT binary patch literal 78179 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

    j^1}Fh?w7@-UVW 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 \ No newline at end of file diff --git a/web/static/img/mobile_application.svg b/web/static/img/mobile_application.svg new file mode 100644 index 0000000..35e80ff --- /dev/null +++ b/web/static/img/mobile_application.svg @@ -0,0 +1 @@ +Mobile_application \ No newline at end of file diff --git a/web/static/img/movie.jpg b/web/static/img/movie.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26e992e56e9f3ee5e6a98e1718595d53792a53ee GIT binary patch literal 33140 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

    Q>+xUMKIFmUyQ|ogNIg=(JN2Ax*7CwVQ0q1> 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 literal 0 HcmV?d00001 diff --git a/web/static/img/music.png b/web/static/img/music.png new file mode 100644 index 0000000000000000000000000000000000000000..35dafe0de44a9cca1aa1718f428fde5042272102 GIT binary patch literal 133799 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ξ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 literal 0 HcmV?d00001 diff --git a/web/static/img/plex.png b/web/static/img/plex.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f3665115b2f4a6979cd611c88603919e248c69 GIT binary patch literal 1771 zcmV;P)Jt^Vg;ygY?M@d`l zHrmO^rqQ6el80LU&%Ma1ju*P7YyxY*xS`ikHtGQk18Y3DY{Nmgp0UB23?CD5^rmpV zBwB-EF!Uva=5iQ+xZuY*hTT{&zX^;VcmKsO7>8w>m>c0ZSj{jM?!YOGpRQsU`(+!q zA^7ofhSn?FvW>yB%NP<7d_(btVa!A@qZrRKOj*|8U%YHL&kO@Lf*HkNmSK0ykS5;3 zjJq=oWBG}G5n=qwkT6Ckn8xW7!y#XcPGE+A8AhBg%$yiKGfX&L`0T`tVZfE^XW<1; z46V#B`gP#i3Bw+1j80&B8N-M-NV71FGKR!K`V^+BS+)^dMpF$sW!tb-bOwrg8BP|W zN*RmpSA?m`z0p)LI2$p1ZMasAa;C%TF^22vW=vlbW~7pwKhfw{Ae^-}V)@!gR9=11 zajuRK)IObV#PW5q0sXV}P=hEQT^GC*^P_bEQLMc$)`=TH{Rig6+Ht*XlTrLR$0**t zE8Aiej)DjtRem;W3W8^A+9`q z_a1ZNg*YcV-yt6!RUX7;jMGoxW>c58**JBuJpC;$PFr8mhK9KEv_W5<)^EV_^ozWV z!C#*4K||vwdqYFj@7T-J))z2i$SY4zz>IMrE@L>iV8-|=t~@p=+rEM2Y0<~Pa|1pO zCQ)w#GsYh1ZQ?!@QN68pDKBGy2Z#lhr!9zJR-THBQ&?~NE-zyo^tO45H}WTOEe zW&JK_1*x!1!GAW9{(LF_8DaW!-tbv{al;4b=bO>rnc=_p zM1Obfpry@0-W^i@d%*N}x#9cx;tEpwnF{oCG5BYj(9frVXAH?JNZIE^!Lz>PX=&{9 z+URHQ@y|_c@M~%0^Go?>(BgB1%eEK<|14w>qLcFzC5>sne{B{_eg(XT)#T1!jR z$mIKl>M@3b+iPZ|tef*Usu&7hgsxR-SnQuH7-6a+uWTc>3NKQFPT59m6`g@${6-?Cd8eF>17O=!!!%h3B!OlOugWVp&qivsTt}i!^kh& zlr6!3d}he%#3vU{83vqA^n(|MI%X`t!&tvE?2h^3)Qr0`3>o8e8lx`^b;?H3PxV`d zI_ApzUaaRCYRg2?vwD#s6U7;VvkZ02vKIYVFK3u-Hw;O`ylgUy40SM;pZddbpjR{0 z-B`FAjURXQzZhn2917-W{9!OpXn~>Dk3&!9SHJ5GqeVJP7-oL7MjA=S^^9Hc-%5sB z_adu0Ug$~)SmTCXN7<;ioXQG@8JdGAwWB1jzPN3)laWoML31UK{{bkAkIK=-+rIz+ N002ovPDHLkV1hA!V6y-K literal 0 HcmV?d00001 diff --git a/web/static/img/posting_photo.svg b/web/static/img/posting_photo.svg new file mode 100644 index 0000000..47cb4fc --- /dev/null +++ b/web/static/img/posting_photo.svg @@ -0,0 +1 @@ +posting photo \ No newline at end of file diff --git a/web/static/img/printing_invoices.svg b/web/static/img/printing_invoices.svg new file mode 100644 index 0000000..3c7a0b6 --- /dev/null +++ b/web/static/img/printing_invoices.svg @@ -0,0 +1 @@ +printing invoices \ No newline at end of file diff --git a/web/static/img/prowlarr.png b/web/static/img/prowlarr.png new file mode 100644 index 0000000000000000000000000000000000000000..d4bb74e220c79bcaa9a61cada6b152eb9315a8ad GIT binary patch literal 26425 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

    R|c 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 time \ No newline at end of file diff --git a/web/static/img/serverchan.png b/web/static/img/serverchan.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5f715cac8236e8ed47f364adbb297ddfbe0166 GIT binary patch literal 56446 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 bFCXR({17quF9Jxv0)hTh)>f)kun74d>rKtS literal 0 HcmV?d00001 diff --git a/web/static/img/sign_in.svg b/web/static/img/sign_in.svg new file mode 100644 index 0000000..465016d --- /dev/null +++ b/web/static/img/sign_in.svg @@ -0,0 +1 @@ +sign_in \ No newline at end of file diff --git a/web/static/img/slack.png b/web/static/img/slack.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a743f701c6726a624d4b7fb58d3b17b1489f8c GIT binary patch literal 87775 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 z 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 a&Px)M#iJW&w_BzAz6sLe0`2^@`~L?cO~qpX literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-1170-2532.png b/web/static/img/splash/apple-splash-1170-2532.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6efef87155bc7ecb612661bfb84e94a5821943 GIT binary patch literal 42687 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 literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-1242-2208.png b/web/static/img/splash/apple-splash-1242-2208.png new file mode 100644 index 0000000000000000000000000000000000000000..3d049a64c3688d425603ef79571f0ed972d6c053 GIT binary patch literal 42487 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�DL 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 R!}!egi2HAqzn=f|{{dMs6Pf@3 literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-1242-2688.png b/web/static/img/splash/apple-splash-1242-2688.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8c7e9350e7d803793cc250f82b50b24dcfc2db GIT binary patch literal 47199 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

    -6H)4S*qaO7cPZ|i#&&>Dk#i~K%=-co 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

    fAikrq6yU>qP>WHp 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 EU$ijp=>Px# literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-1536-2048.png b/web/static/img/splash/apple-splash-1536-2048.png new file mode 100644 index 0000000000000000000000000000000000000000..1587a65056fabb5adf5b1439a3276e10e5985c0a GIT binary patch literal 40989 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 YsTkd>8%ImQnUS%+V)qB;((T9p2SPGn761SM literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-1620-2160.png b/web/static/img/splash/apple-splash-1620-2160.png new file mode 100644 index 0000000000000000000000000000000000000000..1b15e503ec7d00389a3d3093702fd62ef3135461 GIT binary patch literal 54680 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 Zw70c!>YQe|9X`Lwr(1S>QoT7U^LJ!Dlz#vK literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-1668-2224.png b/web/static/img/splash/apple-splash-1668-2224.png new file mode 100644 index 0000000000000000000000000000000000000000..5b736f2dbc89014afc7f186cd3bf10bdb882ea6e GIT binary patch literal 55120 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 literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-1792-828.png b/web/static/img/splash/apple-splash-1792-828.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7bc6996f80a489c98a18a62fe8d44a3dd17e3d GIT binary patch literal 32833 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 literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-2048-2732.png b/web/static/img/splash/apple-splash-2048-2732.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e2e9dc466403f5ea71023c1bd8264f6f8350b6 GIT binary patch literal 74726 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%0A^_CKCp>5h1$dY@0!3W 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Ν4MSmRtc!=t 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 literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-2388-1668.png b/web/static/img/splash/apple-splash-2388-1668.png new file mode 100644 index 0000000000000000000000000000000000000000..30a9508e2ef8386dadb5da9cf81216ce316eb493 GIT binary patch literal 78505 zcmeFa`#;qA{{}p5yIZ>*w5_5NTWdoJl@MaLR+d64i5MLWvCikiFzu>rh|Mv^;S(8U zLXqPbQwcF)HA!QPiNRnRV~jDzn3?-BmbuIqYUZ+rW+ zz4eA~w||R5p*Gn3_UjoG>YH;Y)YmuGegVJ9E&uy#`0-89Z!V!I)VlAHf2&Y=`KqW@ z2QS+E`pdbf{7*7T#shKOhiD7yLI;c94CljZ&#ci&N3BwKJyWdRRXzUn=;hdr9j`up z_q68w1Ei z#~+6`DL()9hfSjzpC5gBY4ZZ4TQyLqe~Tju^>0H#q5kcgDAd330QE0C_!k}^SovRg z@Gm?-;^1F+@Gm?-;^1F+@Gm@oF!&c9{0k3|a_}!a_!k}^aqurZ`2PtWn2Mzvkpq~0 zaiqY$j5ZZD9%jDN0eN6*RW_-N{7&N0v{cWJY23AK;e!k&6gYLvP9#zba3g~6+1@FHp$0g+{AGu(O1=^u@>WNW>Nw4tVZz1|r%E?cb}Q*O0BX7NQ*a(vYQ zH^Pi*nA+=Ta66+RBO+b%_UL4k$<9Ja8@S%?DV%mMjFCHbPX z*TT8KJEq1a;~C9n|Ce8)8k|?AFxQn{cN?}Cr%fgoYnygd)u+5Vneo7KGVKIC$l%Qh zy5E^M9AR=Yy$u_4pve7=H@o_cuvyzW+G6|0L|N#LPhqA7^9e0=8r?DENBD`{K%BT< zG0s=i-~?t4aWXtnwC8r!5I=SeYSR}hbD)oLk;7zRj1eo^mL&)?uM#9TG3^~EFn2l8 z7J9;9msG9s23@U;5Q_q|+Z!*MO*W?W7u>xKHE_;qo^;s!g;=sQ4#R(YQlGLU3dC|f z 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 literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-2436-1125.png b/web/static/img/splash/apple-splash-2436-1125.png new file mode 100644 index 0000000000000000000000000000000000000000..3105315e6afcc495a05a4ac4ca16d9bdbe488510 GIT binary patch literal 71524 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�$jbViKK1GQyAOZd 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 AHUIzs literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-2778-1284.png b/web/static/img/splash/apple-splash-2778-1284.png new file mode 100644 index 0000000000000000000000000000000000000000..d20382b6ab651a84d29f2ed0105a67cba566ff23 GIT binary patch literal 91328 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 =K1R&i#v9N-5Qx-WUP7Z_ESPP-~ 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 Qdcy|$vre|u(^umD2j^dJ3;+NC literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-750-1334.png b/web/static/img/splash/apple-splash-750-1334.png new file mode 100644 index 0000000000000000000000000000000000000000..45246624cb592f84f1503a222d4282b74ade5f4b GIT binary patch literal 23190 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 QA9VMYr>mdKI;Vst09P5zEdT%j literal 0 HcmV?d00001 diff --git a/web/static/img/startup.jpg b/web/static/img/startup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..407008355678783f9dea1cb2fa74ed46f3140359 GIT binary patch literal 91379 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⪼vO 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 )@I@*~lcys+tdcGnY#USkGO$UbA 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

    ZNH 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 g)MjyhTLF6VKwSQg=%)r_$k3^p+`s#l_h($ literal 0 HcmV?d00001 diff --git a/web/static/img/transmission.png b/web/static/img/transmission.png new file mode 100644 index 0000000000000000000000000000000000000000..13a5fbd26b043dd42be18085accf1db9ea5790df GIT binary patch literal 171952 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 ZtaPmcW9>51vIO7^Q^Q}eR0G%Oe**_E(>VYD literal 0 HcmV?d00001 diff --git a/web/static/img/tv.png b/web/static/img/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..2e6ad6060edcbb11d4690e466bd5ed0b05e63efc GIT binary patch literal 132096 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 literal 0 HcmV?d00001 diff --git a/web/static/img/users.png b/web/static/img/users.png new file mode 100644 index 0000000000000000000000000000000000000000..5a48e1ca8f7eaf0466429c97d2a774e796e04846 GIT binary patch literal 133729 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

    53t6)cF0*swl0= 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 z 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%0AJg4O~^ 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 literal 0 HcmV?d00001 diff --git a/web/static/img/wechat.png b/web/static/img/wechat.png new file mode 100644 index 0000000000000000000000000000000000000000..aba9f9c422d966ab68c5df7c15dc16aa6cc3b7cf GIT binary patch literal 10823 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 a21u``O$uB;fj@tObno8RF4J;&`hNgr5+>vT literal 0 HcmV?d00001 diff --git a/web/static/img/work_together.svg b/web/static/img/work_together.svg new file mode 100644 index 0000000..f0b2195 --- /dev/null +++ b/web/static/img/work_together.svg @@ -0,0 +1 @@ +work_together \ No newline at end of file diff --git a/web/static/js/FileSaver.min.js b/web/static/js/FileSaver.min.js new file mode 100644 index 0000000..6d493b2 --- /dev/null +++ b/web/static/js/FileSaver.min.js @@ -0,0 +1,3 @@ +(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)}); + +//# sourceMappingURL=FileSaver.min.js.map \ No newline at end of file diff --git a/web/static/js/ace.js b/web/static/js/ace.js new file mode 100644 index 0000000..5760e29 --- /dev/null +++ b/web/static/js/ace.js @@ -0,0 +1,17 @@ +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;un.length)t=n.length;t-=e.length;var r=n.indexOf(e,t);return r!==-1&&r===t}),String.prototype.repeat||r(String.prototype,"repeat",function(e){var t="",n=this;while(e>0){e&1&&(t+=n);if(e>>=1)n+=n}return t}),String.prototype.includes||r(String.prototype,"includes",function(e,t){return this.indexOf(e,t)!=-1}),Object.assign||(Object.assign=function(e){if(e===undefined||e===null)throw new TypeError("Cannot convert undefined or null to object");var t=Object(e);for(var n=1;n>>0,r=arguments[1],i=r>>0,s=i<0?Math.max(n+i,0):Math.min(i,n),o=arguments[2],u=o===undefined?n:o>>0,a=u<0?Math.max(n+u,0):Math.min(u,n);while(s0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n=0?parseFloat((s.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((s.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=s.match(/ Gecko\/\d+/),t.isOpera=typeof opera=="object"&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(s.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(s.split(" Chrome/")[1])||undefined,t.isEdge=parseFloat(s.split(" Edge/")[1])||undefined,t.isAIR=s.indexOf("AdobeAIR")>=0,t.isAndroid=s.indexOf("Android")>=0,t.isChromeOS=s.indexOf(" CrOS ")>=0,t.isIOS=/iPad|iPhone|iPod/.test(s)&&!window.MSStream,t.isIOS&&(t.isMac=!0),t.isMobile=t.isIOS||t.isAndroid}),ace.define("ace/lib/dom",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";function u(){var e=o;o=null,e&&e.forEach(function(e){a(e[0],e[1])})}function a(e,n,r){if(typeof document=="undefined")return;if(o)if(r)u();else if(r===!1)return o.push([e,n]);if(s)return;var i=r;if(!r||!r.getRootNode)i=document;else{i=r.getRootNode();if(!i||i==r)i=document}var a=i.ownerDocument||i;if(n&&t.hasCssString(n,i))return null;n&&(e+="\n/*# sourceURL=ace/css/"+n+" */");var f=t.createElement("style");f.appendChild(a.createTextNode(e)),n&&(f.id=n),i==a&&(i=t.getDocumentHead(a)),i.insertBefore(f,i.firstChild)}var r=e("./useragent"),i="http://www.w3.org/1999/xhtml";t.buildDom=function l(e,t,n){if(typeof e=="string"&&e){var r=document.createTextNode(e);return t&&t.appendChild(r),r}if(!Array.isArray(e))return e&&e.appendChild&&t&&t.appendChild(e),e;if(typeof e[0]!="string"||!e[0]){var i=[];for(var s=0;s=1.5:!0,r.isChromeOS&&(t.HI_DPI=!1);if(typeof document!="undefined"){var f=document.createElement("div");t.HI_DPI&&f.style.transform!==undefined&&(t.HAS_CSS_TRANSFORMS=!0),!r.isEdge&&typeof f.style.animationName!="undefined"&&(t.HAS_CSS_ANIMATION=!0),f=null}t.HAS_CSS_TRANSFORMS?t.translate=function(e,t,n){e.style.transform="translate("+Math.round(t)+"px, "+Math.round(n)+"px)"}:t.translate=function(e,t,n){e.style.top=Math.round(n)+"px",e.style.left=Math.round(t)+"px"}}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t};var f=function(t,n){return t=="ace/theme/textmate"?n(null,e("./theme/textmate")):console.error("loader is not configured")};t.setLoader=function(e){f=e},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){f(n,function(e,r){t._emit("load.module",{name:n,module:r});var i=t.$loading[n];t.$loading[n]=null,i.forEach(function(e){e&&e(r)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a),l()};var l=function(){!a.basePath&&!a.workerPath&&!a.modePath&&!a.themePath&&!Object.keys(a.$moduleUrls).length&&(console.error("Unable to infer path to ace from script src,","use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes","or with webpack use ace/webpack-resolver"),l=function(){})};t.version="1.15.0"}),ace.define("ace/loader_build",["require","exports","module","ace/lib/fixoldbrowsers","ace/config"],function(e,t,n){"use strict";function s(t){if(!i||!i.document)return;r.set("packaged",t||e.packaged||n.packaged||i.define&&define.packaged);var s={},u="",a=document.currentScript||document._currentScript,f=a&&a.ownerDocument||document,l=f.getElementsByTagName("script");for(var c=0;c1?(u++,u>4&&(u=1)):u=1;if(i.isIE){var o=Math.abs(e.clientX-a)>5||Math.abs(e.clientY-f)>5;if(!l||o)u=1;l&&clearTimeout(l),l=setTimeout(function(){l=null},n[u-1]||600),u==1&&(a=e.clientX,f=e.clientY)}e._clicks=u,r[s]("mousedown",e);if(u>4)u=0;else if(u>1)return r[s](h[u],e)}var u=0,a,f,l,h={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){c(e,"mousedown",p,o)})};var p=function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[p(e)]},t.addCommandKeyListener=function(e,n,r){if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;c(e,"keydown",function(e){o=e.keyCode},r),c(e,"keypress",function(e){return d(n,e,o)},r)}else{var u=null;c(e,"keydown",function(e){s[e.keyCode]=(s[e.keyCode]||0)+1;var t=d(n,e,e.keyCode);return u=e.defaultPrevented,t},r),c(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)},r),c(e,"keyup",function(e){s[e.keyCode]=null},r),s||(v(),c(window,"focus",v))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var m=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+m++,i=function(s){s.data==r&&(t.stopPropagation(s),h(n,"message",i),e())};c(n,"message",i),n.postMessage(r,"*")}}t.$idleBlocked=!1,t.onIdle=function(e,n){return setTimeout(function r(){t.$idleBlocked?setTimeout(r,100):e()},n)},t.$idleBlockId=null,t.blockIdle=function(e){t.$idleBlockId&&clearTimeout(t.$idleBlockId),t.$idleBlocked=!0,t.$idleBlockId=setTimeout(function(){t.$idleBlocked=!1},e||100)},t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowDate.now()-50?!0:r=!1},cancel:function(){r=Date.now()}}}),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang","ace/clipboard","ace/lib/keys"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/dom"),o=e("../lib/lang"),u=e("../clipboard"),a=i.isChrome<18,f=i.isIE,l=i.isChrome>63,c=400,h=e("../lib/keys"),p=h.KEY_MODS,d=i.isIOS,v=d?/\s/:/\n/,m=i.isMobile,g=function(e,t){function X(){x=!0,n.blur(),n.focus(),x=!1}function $(e){e.keyCode==27&&n.value.lengthC&&T[s]=="\n")o=h.end;else if(rC&&T.slice(0,s).split("\n").length>2)o=h.down;else if(s>C&&T[s-1]==" ")o=h.right,u=p.option;else if(s>C||s==C&&C!=N&&r==s)o=h.right;r!==s&&(u|=p.shift);if(o){var a=t.onCommandKey({},u,o);if(!a&&t.commands){o=h.keyCodeToString(o);var f=t.commands.findKeyCommand(u,o);f&&t.execCommand(f)}N=r,C=s,O("")}};document.addEventListener("selectionchange",s),t.on("destroy",function(){document.removeEventListener("selectionchange",s)})}var n=s.createElement("textarea");n.className="ace_text-input",n.setAttribute("wrap","off"),n.setAttribute("autocorrect","off"),n.setAttribute("autocapitalize","off"),n.setAttribute("spellcheck",!1),n.style.opacity="0",e.insertBefore(n,e.firstChild);var g=!1,y=!1,b=!1,w=!1,E="";m||(n.style.fontSize="1px");var S=!1,x=!1,T="",N=0,C=0,k=0;try{var L=document.activeElement===n}catch(A){}this.setAriaOptions=function(e){e.activeDescendant?(n.setAttribute("aria-haspopup","true"),n.setAttribute("aria-autocomplete","list"),n.setAttribute("aria-activedescendant",e.activeDescendant)):(n.setAttribute("aria-haspopup","false"),n.setAttribute("aria-autocomplete","both"),n.removeAttribute("aria-activedescendant")),e.role&&n.setAttribute("role",e.role)},this.setAriaOptions({role:"textbox"}),r.addListener(n,"blur",function(e){if(x)return;t.onBlur(e),L=!1},t),r.addListener(n,"focus",function(e){if(x)return;L=!0;if(i.isEdge)try{if(!document.hasFocus())return}catch(e){}t.onFocus(e),i.isEdge?setTimeout(O):O()},t),this.$focusScroll=!1,this.focus=function(){if(E||l||this.$focusScroll=="browser")return n.focus({preventScroll:!0});var e=n.style.top;n.style.position="fixed",n.style.top="0px";try{var t=n.getBoundingClientRect().top!=0}catch(r){return}var i=[];if(t){var s=n.parentElement;while(s&&s.nodeType==1)i.push(s),s.setAttribute("ace_nocontext",!0),!s.parentElement&&s.getRootNode?s=s.getRootNode().host:s=s.parentElement}n.focus({preventScroll:!0}),t&&i.forEach(function(e){e.removeAttribute("ace_nocontext")}),setTimeout(function(){n.style.position="",n.style.top=="0px"&&(n.style.top=e)},0)},this.blur=function(){n.blur()},this.isFocused=function(){return L},t.on("beforeEndOperation",function(){var e=t.curOp,r=e&&e.command&&e.command.name;if(r=="insertstring")return;var i=r&&(e.docChanged||e.selectionChanged);b&&i&&(T=n.value="",W()),O()});var O=d?function(e){if(!L||g&&!e||w)return;e||(e="");var r="\n ab"+e+"cde fg\n";r!=n.value&&(n.value=T=r);var i=4,s=4+(e.length||(t.selection.isEmpty()?0:1));(N!=i||C!=s)&&n.setSelectionRange(i,s),N=i,C=s}:function(){if(b||w)return;if(!L&&!P)return;b=!0;var e=0,r=0,i="";if(t.session){var s=t.selection,o=s.getRange(),u=s.cursor.row;e=o.start.column,r=o.end.column,i=t.session.getLine(u);if(o.start.row!=u){var a=t.session.getLine(u-1);e=o.start.rowu+1?f.length:r,r+=i.length+1,i=i+"\n"+f}else m&&u>0&&(i="\n"+i,r+=1,e+=1);i.length>c&&(e=T.length&&e.value===T&&T&&e.selectionEnd!==C},_=function(e){if(b)return;g?g=!1:M(n)?(t.selectAll(),O()):m&&n.selectionStart!=N&&O()},D=null;this.setInputHandler=function(e){D=e},this.getInputHandler=function(){return D};var P=!1,H=function(e,r){P&&(P=!1);if(y)return O(),e&&t.onPaste(e),y=!1,"";var s=n.selectionStart,o=n.selectionEnd,u=N,a=T.length-C,f=e,l=e.length-s,c=e.length-o,h=0;while(u>0&&T[h]==e[h])h++,u--;f=f.slice(h),h=1;while(a>0&&T.length-h>N-1&&T[T.length-h]==e[e.length-h])h++,a--;l-=h-1,c-=h-1;var p=f.length-h+1;p<0&&(u=-p,p=0),f=f.slice(0,p);if(!r&&!f&&!l&&!u&&!a&&!c)return"";w=!0;var d=!1;return i.isAndroid&&f==". "&&(f=" ",d=!0),f&&!u&&!a&&!l&&!c||S?t.onTextInput(f):t.onTextInput(f,{extendLeft:u,extendRight:a,restoreStart:l,restoreEnd:c}),w=!1,T=e,N=s,C=o,k=c,d?"\n":f},B=function(e){if(b)return z();if(e&&e.inputType){if(e.inputType=="historyUndo")return t.execCommand("undo");if(e.inputType=="historyRedo")return t.execCommand("redo")}var r=n.value,i=H(r,!0);(r.length>c+100||v.test(i)||m&&N<1&&N==C)&&O()},j=function(e,t,n){var r=e.clipboardData||window.clipboardData;if(!r||a)return;var i=f||n?"Text":"text/plain";try{return t?r.setData(i,t)!==!1:r.getData(i)}catch(e){if(!n)return j(e,t,!0)}},F=function(e,i){var s=t.getCopyText();if(!s)return r.preventDefault(e);j(e,s)?(d&&(O(s),g=s,setTimeout(function(){g=!1},10)),i?t.onCut():t.onCopy(),r.preventDefault(e)):(g=!0,n.value=s,n.select(),setTimeout(function(){g=!1,O(),i?t.onCut():t.onCopy()}))},I=function(e){F(e,!0)},q=function(e){F(e,!1)},R=function(e){var s=j(e);if(u.pasteCancelled())return;typeof s=="string"?(s&&t.onPaste(s,e),i.isIE&&setTimeout(O),r.preventDefault(e)):(n.value="",y=!0)};r.addCommandKeyListener(n,t.onCommandKey.bind(t),t),r.addListener(n,"select",_,t),r.addListener(n,"input",B,t),r.addListener(n,"cut",I,t),r.addListener(n,"copy",q,t),r.addListener(n,"paste",R,t),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:q(e);break;case 86:R(e);break;case 88:I(e)}},t);var U=function(e){if(b||!t.onCompositionStart||t.$readOnly)return;b={};if(S)return;e.data&&(b.useTextareaForIME=!1),setTimeout(z,0),t._signal("compositionStart"),t.on("mousedown",X);var r=t.getSelectionRange();r.end.row=r.start.row,r.end.column=r.start.column,b.markerRange=r,b.selectionStart=N,t.onCompositionStart(b),b.useTextareaForIME?(T=n.value="",N=0,C=0):(n.msGetInputContext&&(b.context=n.msGetInputContext()),n.getInputContext&&(b.context=n.getInputContext()))},z=function(){if(!b||!t.onCompositionUpdate||t.$readOnly)return;if(S)return X();if(b.useTextareaForIME)t.onCompositionUpdate(n.value);else{var e=n.value;H(e),b.markerRange&&(b.context&&(b.markerRange.start.column=b.selectionStart=b.context.compositionStartOffset),b.markerRange.end.column=b.markerRange.start.column+C-b.selectionStart+k)}},W=function(e){if(!t.onCompositionEnd||t.$readOnly)return;b=!1,t.onCompositionEnd(),t.off("mousedown",X),e&&B()},V=o.delayedCall(z,50).schedule.bind(null,null);r.addListener(n,"compositionstart",U,t),r.addListener(n,"compositionupdate",z,t),r.addListener(n,"keyup",$,t),r.addListener(n,"keydown",V,t),r.addListener(n,"compositionend",W,t),this.getElement=function(){return n},this.setCommandMode=function(e){S=e,n.readOnly=!1},this.setReadOnly=function(e){S||(n.readOnly=e)},this.setCopyWithEmptySelection=function(e){},this.onContextMenu=function(e){P=!0,O(),t._emit("nativecontextmenu",{target:t,domEvent:e}),this.moveToMouse(e,!0)},this.moveToMouse=function(e,o){E||(E=n.style.cssText),n.style.cssText=(o?"z-index:100000;":"")+(i.isIE?"opacity:0.1;":"")+"text-indent: -"+(N+C)*t.renderer.characterWidth*.5+"px;";var u=t.container.getBoundingClientRect(),a=s.computedStyle(t.container),f=u.top+(parseInt(a.borderTopWidth)||0),l=u.left+(parseInt(u.borderLeftWidth)||0),c=u.bottom-f-n.clientHeight-2,h=function(e){s.translate(n,e.clientX-l-2,Math.min(e.clientY-f-2,c))};h(e);if(e.type!="mousedown")return;t.renderer.$isMousePressed=!0,clearTimeout(J),i.isWin&&r.capture(t.container,h,K)},this.onContextMenuClose=K;var J,Q=function(e){t.textInput.onContextMenu(e),K()};r.addListener(n,"mouseup",Q,t),r.addListener(n,"mousedown",function(e){e.preventDefault(),K()},t),r.addListener(t.renderer.scroller,"contextmenu",Q,t),r.addListener(n,"contextmenu",Q,t),d&&G(e,t,n),this.destroy=function(){n.parentElement&&n.parentElement.removeChild(n)}};t.TextInput=g,t.$setUserAgentForTests=function(e,t){m=e,d=t}}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/useragent"],function(e,t,n){"use strict";function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e));var n=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else if(e.start.row==e.end.row-1&&!e.start.column&&!e.end.column)var n=t.column-4;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/useragent"),i=0,s=550;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var i=this.editor,s=e.getButton();if(s!==0){var o=i.getSelectionRange(),u=o.isEmpty();(u||s==1)&&i.selection.moveToPosition(n),s==2&&(i.textInput.onContextMenu(e.domEvent),r.isMozilla||e.preventDefault());return}this.mousedownEvent.time=Date.now();if(t&&!i.isFocused()){i.focus();if(this.$focusTimeout&&!this.$clickSelection&&!i.inMultiSelectMode){this.setState("focusWait"),this.captureMouse(e);return}}return this.captureMouse(e),this.startSelect(n,e.domEvent._clicks>1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;if(!this.mousedownEvent)return;this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>i||t-this.mousedownEvent.time>this.$focusTimeout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=this.editor;this.$lastScroll||(this.$lastScroll={t:0,vx:0,vy:0,allowed:0});var n=this.$lastScroll,r=e.domEvent.timeStamp,i=r-n.t,o=i?e.wheelX/i:n.vx,u=i?e.wheelY/i:n.vy;i=1&&t.renderer.isScrollableBy(e.wheelX*e.speed,0)&&(f=!0),a<=1&&t.renderer.isScrollableBy(0,e.wheelY*e.speed)&&(f=!0);if(f)n.allowed=r;else if(r-n.allowedt.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
    "),i.setHtml(f);var p=s.className;p&&i.setClassName(p.trim()),i.show(),t._signal("showGutterTooltip",i),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var d=u.domEvent.target,v=d.getBoundingClientRect(),m=i.getElement().style;m.left=v.right+"px",m.top=v.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t._signal("hideGutterTooltip",i),t.off("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)},t),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.moveCursorToPosition(e),S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.selection.fromOrientedRange(m),t.isFocused()&&!w&&t.$resetCursorStyle(),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("div");n.style.cssText="top:-100px;position:absolute;z-index:2147483647;opacity:0.5",n.textContent="\u00a0";var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.on("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",t.container.appendChild(n),i.setDragImage&&i.setDragImage(n,0,0),setTimeout(function(){t.container.removeChild(n)}),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.$resetCursorStyle()}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e),t),i.addListener(c,"dragend",this.onDragEnd.bind(e),t),i.addListener(c,"dragenter",this.onDragEnter.bind(e),t),i.addListener(c,"dragover",this.onDragOver.bind(e),t),i.addListener(c,"dragleave",this.onDragLeave.bind(e),t),i.addListener(c,"drop",this.onDrop.bind(e),t);var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.$resetCursorStyle(),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/mouse/touch_handler",["require","exports","module","ace/mouse/mouse_event","ace/lib/event","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./mouse_event").MouseEvent,i=e("../lib/event"),s=e("../lib/dom");t.addTouchListeners=function(e,t){function b(){var e=window.navigator&&window.navigator.clipboard,r=!1,i=function(){var n=t.getCopyText(),i=t.session.getUndoManager().hasUndo();y.replaceChild(s.buildDom(r?["span",!n&&["span",{"class":"ace_mobile-button",action:"selectall"},"Select All"],n&&["span",{"class":"ace_mobile-button",action:"copy"},"Copy"],n&&["span",{"class":"ace_mobile-button",action:"cut"},"Cut"],e&&["span",{"class":"ace_mobile-button",action:"paste"},"Paste"],i&&["span",{"class":"ace_mobile-button",action:"undo"},"Undo"],["span",{"class":"ace_mobile-button",action:"find"},"Find"],["span",{"class":"ace_mobile-button",action:"openCommandPallete"},"Palette"]]:["span"]),y.firstChild)},o=function(n){var s=n.target.getAttribute("action");if(s=="more"||!r)return r=!r,i();if(s=="paste")e.readText().then(function(e){t.execCommand(s,e)});else if(s){if(s=="cut"||s=="copy")e?e.writeText(t.getCopyText()):document.execCommand("copy");t.execCommand(s)}y.firstChild.style.display="none",r=!1,s!="openCommandPallete"&&t.focus()};y=s.buildDom(["div",{"class":"ace_mobile-menu",ontouchstart:function(e){n="menu",e.stopPropagation(),e.preventDefault(),t.textInput.focus()},ontouchend:function(e){e.stopPropagation(),e.preventDefault(),o(e)},onclick:o},["span"],["span",{"class":"ace_mobile-button",action:"more"},"..."]],t.container)}function w(){y||b();var e=t.selection.cursor,n=t.renderer.textToScreenCoordinates(e.row,e.column),r=t.renderer.textToScreenCoordinates(0,0).pageX,i=t.renderer.scrollLeft,s=t.container.getBoundingClientRect();y.style.top=n.pageY-s.top-3+"px",n.pageX-s.left=2?t.selection.getLineRange(p.row):t.session.getBracketRange(p);e&&!e.isEmpty()?t.selection.setRange(e):t.selection.selectWord(),n="wait"}function T(){h+=60,c=setInterval(function(){h--<=0&&(clearInterval(c),c=null),Math.abs(v)<.01&&(v=0),Math.abs(m)<.01&&(m=0),h<20&&(v=.9*v),h<20&&(m=.9*m);var e=t.session.getScrollTop();t.renderer.scrollBy(10*v,10*m),e==t.session.getScrollTop()&&(h=0)},10)}var n="scroll",o,u,a,f,l,c,h=0,p,d=0,v=0,m=0,g,y;i.addListener(e,"contextmenu",function(e){if(!g)return;var n=t.textInput.getElement();n.focus()},t),i.addListener(e,"touchstart",function(e){var i=e.touches;if(l||i.length>1){clearTimeout(l),l=null,a=-1,n="zoom";return}g=t.$mouseHandler.isMousePressed=!0;var s=t.renderer.layerConfig.lineHeight,c=t.renderer.layerConfig.lineHeight,y=e.timeStamp;f=y;var b=i[0],w=b.clientX,E=b.clientY;Math.abs(o-w)+Math.abs(u-E)>s&&(a=-1),o=e.clientX=w,u=e.clientY=E,v=m=0;var T=new r(e,t);p=T.getDocumentPosition();if(y-a<500&&i.length==1&&!h)d++,e.preventDefault(),e.button=0,x();else{d=0;var N=t.selection.cursor,C=t.selection.isEmpty()?N:t.selection.anchor,k=t.renderer.$cursorLayer.getPixelPosition(N,!0),L=t.renderer.$cursorLayer.getPixelPosition(C,!0),A=t.renderer.scroller.getBoundingClientRect(),O=t.renderer.layerConfig.offset,M=t.renderer.scrollLeft,_=function(e,t){return e/=c,t=t/s-.75,e*e+t*t};if(e.clientXP?"cursor":"anchor"),P<3.5?n="anchor":D<3.5?n="cursor":n="scroll",l=setTimeout(S,450)}a=y},t),i.addListener(e,"touchend",function(e){g=t.$mouseHandler.isMousePressed=!1,c&&clearInterval(c),n=="zoom"?(n="",h=0):l?(t.selection.moveToPosition(p),h=0,w()):n=="scroll"?(T(),E()):w(),clearTimeout(l),l=null},t),i.addListener(e,"touchmove",function(e){l&&(clearTimeout(l),l=null);var i=e.touches;if(i.length>1||n=="zoom")return;var s=i[0],a=o-s.clientX,c=u-s.clientY;if(n=="wait"){if(!(a*a+c*c>4))return e.preventDefault();n="cursor"}o=s.clientX,u=s.clientY,e.clientX=s.clientX,e.clientY=s.clientY;var h=e.timeStamp,p=h-f;f=h;if(n=="scroll"){var d=new r(e,t);d.speed=1,d.wheelX=a,d.wheelY=c,10*Math.abs(a)0)if(g==16){for(w=b;w-1){for(w=b;w=0;C--){if(r[C]!=N)break;t[C]=s}}}function I(e,t,n){if(o=e){u=i+1;while(u=e)u++;for(a=i,l=u-1;a=t.length||(o=n[r-1])!=b&&o!=w||(c=t[r+1])!=b&&c!=w)return E;return u&&(c=w),c==o?c:E;case k:o=r>0?n[r-1]:S;if(o==b&&r+10&&n[r-1]==b)return b;if(u)return E;p=r+1,h=t.length;while(p=1425&&d<=2303||d==64286;o=t[p];if(v&&(o==y||o==T))return y}if(r<1||(o=t[r-1])==S)return E;return n[r-1];case S:return u=!1,f=!0,s;case x:return l=!0,E;case O:case M:case D:case P:case _:u=!1;case H:return E}}function R(e){var t=e.charCodeAt(0),n=t>>8;return n==0?t>191?g:B[t]:n==5?/[\u0591-\u05f4]/.test(e)?y:g:n==6?/[\u0610-\u061a\u064b-\u065f\u06d6-\u06e4\u06e7-\u06ed]/.test(e)?A:/[\u0660-\u0669\u066b-\u066c]/.test(e)?w:t==1642?L:/[\u06f0-\u06f9]/.test(e)?b:T:n==32&&t<=8287?j[t&255]:n==254?t>=65136?T:E:E}function U(e){return e>="\u064b"&&e<="\u0655"}var r=["\u0621","\u0641"],i=["\u063a","\u064a"],s=0,o=0,u=!1,a=!1,f=!1,l=!1,c=!1,h=!1,p=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],d=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],v=0,m=1,g=0,y=1,b=2,w=3,E=4,S=5,x=6,T=7,N=8,C=9,k=10,L=11,A=12,O=13,M=14,_=15,D=16,P=17,H=18,B=[H,H,H,H,H,H,H,H,H,x,S,x,N,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,S,S,S,x,N,E,E,L,L,L,E,E,E,E,E,k,C,k,C,C,b,b,b,b,b,b,b,b,b,b,C,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,E,E,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,g,E,E,E,E,H,H,H,H,H,H,S,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,H,C,E,L,L,L,L,E,E,E,E,g,E,E,H,E,E,L,L,b,b,E,g,E,E,E,b,g,E,E,E,E,E],j=[N,N,N,N,N,N,N,N,N,N,N,H,H,H,g,y,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N,S,O,M,_,D,P,C,L,L,L,L,L,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,C,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,N];t.L=g,t.R=y,t.EN=b,t.ON_R=3,t.AN=4,t.R_H=5,t.B=6,t.RLE=7,t.DOT="\u00b7",t.doBidiReorder=function(e,n,r){if(e.length<2)return{};var i=e.split(""),o=new Array(i.length),u=new Array(i.length),a=[];s=r?m:v,F(i,a,i.length,n);for(var f=0;fT&&n[f]0&&i[f-1]==="\u0644"&&/\u0622|\u0623|\u0625|\u0627/.test(i[f])&&(a[f-1]=a[f]=t.R_H,f++);i[i.length-1]===t.DOT&&(a[i.length-1]=t.B),i[0]==="\u202b"&&(a[0]=t.RLE);for(var f=0;f=0&&(e=this.session.$docRowCache[n])}return e},this.getSplitIndex=function(){var e=0,t=this.session.$screenRowCache;if(t.length){var n,r=this.session.$getRowCacheIndex(t,this.currentRow);while(this.currentRow-e>0){n=this.session.$getRowCacheIndex(t,this.currentRow-e-1);if(n!==r)break;r=n,e++}}else e=this.currentRow;return e},this.updateRowLine=function(e,t){e===undefined&&(e=this.getDocumentRow());var n=e===this.session.getLength()-1,s=n?this.EOF:this.EOL;this.wrapIndent=0,this.line=this.session.getLine(e),this.isRtlDir=this.$isRtl||this.line.charAt(0)===this.RLE;if(this.session.$useWrapMode){var o=this.session.$wrapData[e];o&&(t===undefined&&(t=this.getSplitIndex()),t>0&&o.length?(this.wrapIndent=o.indent,this.wrapOffset=this.wrapIndent*this.charWidths[r.L],this.line=tt?this.session.getOverwrite()?e:e-1:t,i=r.getVisualFromLogicalIdx(n,this.bidiMap),s=this.bidiMap.bidiLevels,o=0;!this.session.getOverwrite()&&e<=t&&s[i]%2!==0&&i++;for(var u=0;ut&&s[i]%2===0&&(o+=this.charWidths[s[i]]),this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset),this.isRtlDir&&(o+=this.rtlLineOffset),o},this.getSelections=function(e,t){var n=this.bidiMap,r=n.bidiLevels,i,s=[],o=0,u=Math.min(e,t)-this.wrapIndent,a=Math.max(e,t)-this.wrapIndent,f=!1,l=!1,c=0;this.wrapIndent&&(o+=this.isRtlDir?-1*this.wrapOffset:this.wrapOffset);for(var h,p=0;p=u&&hn+s/2){n+=s;if(r===i.length-1){s=0;break}s=this.charWidths[i[++r]]}return r>0&&i[r-1]%2!==0&&i[r]%2===0?(e0&&i[r-1]%2===0&&i[r]%2!==0?t=1+(e>n?this.bidiMap.logicalFromVisual[r]:this.bidiMap.logicalFromVisual[r-1]):this.isRtlDir&&r===i.length-1&&s===0&&i[r-1]%2===0||!this.isRtlDir&&r===0&&i[r]%2!==0?t=1+this.bidiMap.logicalFromVisual[r]:(r>0&&i[r-1]%2!==0&&s!==0&&r--,t=this.bidiMap.logicalFromVisual[r]),t===0&&this.isRtlDir&&t++,t+this.wrapIndent}}).call(o.prototype),t.BidiHandler=o}),ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.cursor=this.lead=this.doc.createAnchor(0,0),this.anchor=this.doc.createAnchor(0,0),this.$silent=!1;var t=this;this.cursor.on("change",function(e){t.$cursorChanged=!0,t.$silent||t._emit("changeCursor"),!t.$isEmpty&&!t.$silent&&t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.anchor.on("change",function(){t.$anchorChanged=!0,!t.$isEmpty&&!t.$silent&&t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return!this.$isEmpty&&this.anchor.row!=this.cursor.row},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.$isEmpty=!1,this.anchor.setPosition(e,t)},this.getAnchor=this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.$isEmpty?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){this.$setSelection(0,0,Number.MAX_VALUE,Number.MAX_VALUE)},this.setRange=this.setSelectionRange=function(e,t){var n=t?e.end:e.start,r=t?e.start:e.end;this.$setSelection(n.row,n.column,r.row,r.column)},this.$setSelection=function(e,t,n,r){if(this.$silent)return;var i=this.$isEmpty,s=this.inMultiSelectMode;this.$silent=!0,this.$cursorChanged=this.$anchorChanged=!1,this.anchor.setPosition(e,t),this.cursor.setPosition(n,r),this.$isEmpty=!o.comparePoints(this.anchor,this.cursor),this.$silent=!1,this.$cursorChanged&&this._emit("changeCursor"),(this.$cursorChanged||this.$anchorChanged||i!=this.$isEmpty||s)&&this._emit("changeSelection")},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.wouldMoveIntoSoftTab=function(e,t,n){var r=e.column,i=e.column+t;return n<0&&(r=e.column-t,i=e.column),this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(r,i).split(" ").length-1==t},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.wouldMoveIntoSoftTab(e,n,-1)&&!this.session.getNavigateWithinSoftTabs()?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var i=this.session.getFoldAt(e,t,1);if(i){this.moveCursorTo(i.end.row,i.end.column);return}this.session.nonTokenRe.exec(r)&&(t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t));if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}this.session.tokenRe.exec(s)&&(t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t=0,n,r=/\s/,i=this.session.tokenRe;i.lastIndex=0;if(this.session.tokenRe.exec(e))t=this.session.tokenRe.lastIndex;else{while((n=e[t])&&r.test(n))t++;if(t<1){i.lastIndex=0;while((n=e[t])&&!i.test(n)){i.lastIndex=0,t++;if(r.test(n)){if(t>2){t--;break}while((n=e[t])&&r.test(n))t++;if(t>2)break}}}}return i.lastIndex=0,t},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column),r;t===0&&(e!==0&&(this.session.$bidiHandler.isBidiRow(n.row,this.lead.row)?(r=this.session.$bidiHandler.getPosLeft(n.column),n.column=Math.round(r/this.session.$bidiHandler.charWidths[0])):r=n.column*this.session.$bidiHandler.charWidths[0]),this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);if(e!=0&&this.session.lineWidgets&&this.session.lineWidgets[this.lead.row]){var i=this.session.lineWidgets[this.lead.row];e<0?e-=i.rowsAbove||0:e>0&&(e+=i.rowCount-(i.rowsAbove||0))}var s=this.session.screenToDocumentPosition(n.row+e,n.column,r);e!==0&&t===0&&s.row===this.lead.row&&s.column===this.lead.column,this.moveCursorTo(s.row,s.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0;var i=this.session.getLine(e);/[\uDC00-\uDFFF]/.test(i.charAt(t))&&i.charAt(t-1)&&(this.lead.row==e&&this.lead.column==t+1?t-=1:t+=1),this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach()},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList&&e.length>1){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}},this.getCurrentTokenRange=function(){var e=this.$rowTokens[this.$tokenIndex],t=this.getCurrentTokenColumn();return new r(this.$row,t,this.$row,t+e.value.length)}}).call(i.prototype),t.TokenIterator=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","rparen","paren","punctuation.operator"],a=["text","paren.rparen","rparen","paren","punctuation.operator","comment"],f,l={},c={'"':'"',"'":"'"},h=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},p=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},d=function(e){this.add("braces","insertion",function(t,n,r,i,s){var u=r.getCursorPosition(),a=i.doc.getLine(u.row);if(s=="{"){h(r);var l=r.getSelectionRange(),c=i.doc.getTextRange(l);if(c!==""&&c!=="{"&&r.getWrapBehavioursEnabled())return p(l,c,"{","}");if(d.isSaneInsertion(r,i))return/[\]\}\)]/.test(a[u.column])||r.inMultiSelectMode||e&&e.braces?(d.recordAutoInsert(r,i,"}"),{text:"{}",selection:[1,1]}):(d.recordMaybeInsert(r,i,"{"),{text:"{",selection:[1,1]})}else if(s=="}"){h(r);var v=a.substring(u.column,u.column+1);if(v=="}"){var m=i.$findOpeningBracket("}",{column:u.column+1,row:u.row});if(m!==null&&d.isAutoInsertedClosing(u,a,s))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(s=="\n"||s=="\r\n"){h(r);var g="";d.isMaybeInsertedClosing(u,a)&&(g=o.stringRepeat("}",f.maybeInsertedBrackets),d.clearMaybeInsertedClosing());var v=a.substring(u.column,u.column+1);if(v==="}"){var y=i.findMatchingBracket({row:u.row,column:u.column+1},"}");if(!y)return null;var b=this.$getIndent(i.getLine(y.row))}else{if(!g){d.clearMaybeInsertedClosing();return}var b=this.$getIndent(a)}var w=b+i.getTabString();return{text:"\n"+w+"\n"+b+g,selection:[1,w.length,1,w.length]}}d.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"(",")");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){h(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return p(s,o,"[","]");if(d.isSaneInsertion(n,r))return d.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){h(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&d.isAutoInsertedClosing(u,a,i))return d.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){h(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){var s=r.$mode.$quotes||c;if(i.length==1&&s[i]){if(this.lineCommentStart&&this.lineCommentStart.indexOf(i)!=-1)return;h(n);var o=i,u=n.getSelectionRange(),a=r.doc.getTextRange(u);if(a!==""&&(a.length!=1||!s[a])&&n.getWrapBehavioursEnabled())return p(u,a,o,o);if(!a){var f=n.getCursorPosition(),l=r.doc.getLine(f.row),d=l.substring(f.column-1,f.column),v=l.substring(f.column,f.column+1),m=r.getTokenAt(f.row,f.column),g=r.getTokenAt(f.row,f.column+1);if(d=="\\"&&m&&/escape/.test(m.type))return null;var y=m&&/string|escape/.test(m.type),b=!g||/string|escape/.test(g.type),w;if(v==o)w=y!==b,w&&/string\.end/.test(g.type)&&(w=!1);else{if(y&&!b)return null;if(y&&b)return null;var E=r.$mode.tokenRe;E.lastIndex=0;var S=E.test(d);E.lastIndex=0;var x=E.test(d);if(S||x)return null;if(v&&!/[\s;,.})\]\\]/.test(v))return null;var T=l[f.column-2];if(!(d!=o||T!=o&&!E.test(T)))return null;w=!0}return{text:w?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.$mode.$quotes||c,o=r.doc.getTextRange(i);if(!i.isMultiLine()&&s.hasOwnProperty(o)){h(n);var u=r.doc.getLine(i.start.row),a=u.substring(i.start.column+1,i.start.column+2);if(a==o)return i.end.column++,i}})};d.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){if(/[)}\]]/.test(e.session.getLine(n.row)[n.column]))return!0;var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},d.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},d.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},d.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},d.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},d.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},d.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},d.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(d,i),t.CstyleBehaviour=d}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){"use strict";var r=[48,9,8,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,18,116,2,1,3,3,9,0,2,2,2,0,2,19,2,82,2,138,2,4,3,155,12,37,3,0,8,38,10,44,2,0,2,1,2,1,2,0,9,26,6,2,30,10,7,61,2,9,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,6,45,211,57,3,18,2,5,3,11,3,9,2,1,7,6,2,2,2,7,3,1,3,21,2,6,2,0,4,3,3,8,3,1,3,3,9,0,5,1,2,4,3,11,16,2,2,5,5,1,3,21,2,6,2,1,2,1,2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,3,9,2,2,2,2,3,0,16,3,3,9,18,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,3,2,9,1,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,5,4,4,2,2,3,3,0,7,0,15,9,18,2,2,7,2,2,2,22,2,9,2,4,4,7,2,2,2,3,8,1,2,1,7,3,3,9,19,1,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,8,0,2,3,3,9,19,1,2,7,2,2,2,22,2,15,4,7,2,2,2,3,10,0,9,3,3,9,11,5,3,1,2,17,4,23,2,8,2,0,3,6,4,0,5,5,2,0,2,7,19,1,14,57,6,14,2,9,40,1,2,0,3,1,2,0,3,0,7,3,2,6,2,2,2,0,2,0,3,1,2,12,2,2,3,4,2,0,2,5,3,9,3,1,35,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,5,5,7,2,35,10,0,58,73,7,77,3,37,11,42,2,0,4,328,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,5,0,33,15,17,84,13,619,3,16,2,25,6,74,22,12,2,6,12,20,12,19,13,12,2,2,2,1,13,51,3,29,4,0,5,1,3,9,34,2,3,9,7,87,9,42,6,69,11,28,4,11,5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,89,75,5,9,18,8,13,42,4,11,71,55,9,9,4,48,83,2,2,30,14,230,23,280,3,5,3,37,3,5,3,7,2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,67,1,20,0,29,0,14,0,17,4,60,12,5,0,4,11,18,0,5,0,3,9,2,0,4,4,7,0,2,0,2,0,2,3,2,10,3,3,6,4,5,0,53,1,2684,46,2,46,2,132,7,6,15,37,11,53,10,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,2,31,48,0,470,1,36,5,2,4,6,1,5,85,3,1,3,2,2,89,2,3,6,40,4,93,18,23,57,15,513,6581,75,20939,53,1164,68,45,3,268,4,27,21,31,3,13,13,1,2,24,9,69,11,1,38,8,3,102,3,1,111,44,25,51,13,68,12,9,7,23,4,0,5,45,3,35,13,28,4,64,15,10,39,54,10,13,3,9,7,22,4,1,5,66,25,2,227,42,2,1,3,9,7,11171,13,22,5,48,8453,301,3,61,3,105,39,6,13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,6,13,1,25,2,33,4,2,134,20,9,8,25,5,0,2,25,12,88,4,5,3,5,3,5,3,2],i=0,s=[];for(var o=0;o2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),u==Infinity&&(u=E,s=!1,o=!1),l&&u%f!=0&&(u=Math.floor(u/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new f(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,a=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new l(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new f(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new l(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);a.start.row==c&&(a.start.column+=h),a.end.row==c&&(a.end.column+=h),t.selection.fromOrientedRange(a)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)if(e[t]){var n=e[t],i=n.prototype.$id,s=r.$modes[i];s||(r.$modes[i]=s=new n),r.$modes[t]||(r.$modes[t]=s),this.$embeds.push(t),this.$modes[t]=s}var o=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.off("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e||"")},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4?this.$splitAndapplyLargeDelta(e,2e4):(i(this.$lines,e,t),this._signal("change",e))},this.$safeApplyDelta=function(e){var t=this.$lines.length;(e.action=="remove"&&e.start.row20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,r==-1&&(r=t),s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens},this.cleanup=function(){this.running=!1,this.lines=[],this.states=[],this.currentLine=0,this.removeAllListeners()}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow,a={};for(var f=o;f<=u;f++){var l=this.cache[f];l==null&&(l=r.getMatchOffsets(n.getLine(f),this.regExp),l.length>this.MAX_RANGES&&(l=l.slice(0,this.MAX_RANGES)),l=l.map(function(e){return new s(f,e.offset,f,e.offset+e.length)}),this.cache[f]=l.length?l:"");for(var c=l.length;c--;){var h=l[c].toScreenRange(n),p=h.toString();if(a[p])continue;a[p]=!0,t.drawSingleLineMarker(e,h,this.clazz,i)}}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row=r)break}if(e.action=="insert"){var f=i-r,l=-t.column+n.column;for(;or)break;a.start.row==r&&a.start.column>=t.column&&(a.start.column==t.column&&this.$bias<=0||(a.start.column+=l,a.start.row+=f));if(a.end.row==r&&a.end.column>=t.column){if(a.end.column==t.column&&this.$bias<0)continue;a.end.column==t.column&&l>0&&oa.start.column&&a.end.column==s[o+1].start.column&&(a.end.column-=l),a.end.column+=l,a.end.row+=f}}}else{var f=r-i,l=t.column-n.column;for(;oi)break;if(a.end.rowt.column)a.end.column=t.column,a.end.row=t.row}else a.end.column+=l,a.end.row+=f;else a.end.row>i&&(a.end.row+=f);if(a.start.rowt.column)a.start.column=t.column,a.start.row=t.row}else a.start.column+=l,a.start.row+=f;else a.start.row>i&&(a.start.row+=f)}}if(f!=0&&o=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column,c=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(c&&h==c)return c.addSubFold(o);c&&!c.range.isStart(u,a)&&this.removeFold(c),h&&!h.range.isEnd(f,l)&&this.removeFold(h);var p=this.getFoldsInRange(o.range);p.length>0&&(this.removeFolds(p),o.collapseChildren||p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;if(e==null)n=new r(0,0,this.getLength(),0),t==null&&(t=!0);else if(typeof e=="number")n=new r(e,0,e,this.getLine(e).length);else if("row"in e)n=r.fromPoints(e,e);else{if(Array.isArray(e))return i=[],e.forEach(function(e){i=i.concat(this.unfold(e))},this),i;n=e}i=this.getFoldsInRangeList(n);var s=i;while(i.length==1&&r.comparePoints(i[0].start,n.start)<0&&r.comparePoints(i[0].end,n.end)>0)this.expandFolds(i),i=this.getFoldsInRangeList(n);t!=0?this.removeFolds(i):this.expandFolds(i);if(s.length)return s},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(tl)break}while(s&&a.test(s.type)&&!/^comment.start/.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return f.end.row=i.getCurrentTokenRow(),f.end.column=i.getCurrentTokenColumn(),/^comment.end/.test(s.type)||(f.end.column+=s.value.length-2),f}},this.foldAll=function(e,t,n,r){n==undefined&&(n=1e5);var i=this.foldWidgets;if(!i)return;t=t||this.getLength(),e=e||0;for(var s=e;s=e&&(s=o.end.row,o.collapseChildren=n,this.addFold("...",o))}},this.foldToLevel=function(e){this.foldAll();while(e-->0)this.unfold(null,!1)},this.foldAllComments=function(){var e=this;this.foldAll(null,null,null,function(t){var n=e.getTokens(t);for(var r=0;r=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s)return t.children||t.all?this.removeFold(s):this.expandFold(s),s;var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range))return this.removeFold(s),s}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.getMatchingBracketRanges=function(e,t){var n=this.getLine(e.row),r=/([\(\[\{])|([\)\]\}])/,s=!t&&n.charAt(e.column-1),o=s&&s.match(r);o||(s=(t===undefined||t)&&n.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(r));if(!o)return null;var u=new i(e.row,e.column-1,e.row,e.column),a=o[1]?this.$findClosingBracket(o[1],e):this.$findOpeningBracket(o[2],e);if(!a)return[u];var f=new i(a.row,a.column,a.row,a.column+1);return[u,f]},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{","<":">",">":"<"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a"?r=!0:t.type.indexOf("tag-name")!==-1&&(n=!0));while(t&&!n);return t},this.$findClosingTag=function(e,t){var n,r=t.value,s=t.value,o=0,u=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+1);t=e.stepForward();var a=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+t.value.length),f=!1;do{n=t,t=e.stepForward();if(t){if(t.value===">"&&!f){var l=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+1);f=!0}if(t.type.indexOf("tag-name")!==-1){r=t.value;if(s===r)if(n.value==="<")o++;else if(n.value==="")return;var p=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+1)}}}else if(s===r&&t.value==="/>"){o--;if(o<0)var c=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+2),h=c,p=h,l=new i(a.end.row,a.end.column,a.end.row,a.end.column+1)}}}while(t&&o>=0);if(u&&l&&c&&p&&a&&h)return{openTag:new i(u.start.row,u.start.column,l.end.row,l.end.column),closeTag:new i(c.start.row,c.start.column,p.end.row,p.end.column),openTagName:a,closeTagName:h}},this.$findOpeningTag=function(e,t){var n=e.getCurrentToken(),r=t.value,s=0,o=e.getCurrentTokenRow(),u=e.getCurrentTokenColumn(),a=u+2,f=new i(o,u,o,a);e.stepForward();var l=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+t.value.length);t=e.stepForward();if(!t||t.value!==">")return;var c=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+1);e.stepBackward(),e.stepBackward();do{t=n,o=e.getCurrentTokenRow(),u=e.getCurrentTokenColumn(),a=u+t.value.length,n=e.stepBackward();if(t)if(t.type.indexOf("tag-name")!==-1){if(r===t.value)if(n.value==="<"){s++;if(s>0){var h=new i(o,u,o,a),p=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+1);do t=e.stepForward();while(t&&t.value!==">");var d=new i(e.getCurrentTokenRow(),e.getCurrentTokenColumn(),e.getCurrentTokenRow(),e.getCurrentTokenColumn()+1)}}else n.value===""){var v=0,m=n;while(m){if(m.type.indexOf("tag-name")!==-1&&m.value===r){s--;break}if(m.value==="<")break;m=e.stepBackward(),v++}for(var g=0;g=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,u),this.setDocument=function(e){this.doc&&this.doc.off("change",this.$onChange),this.doc=e,e.on("change",this.$onChange,!0),this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;e.addSession(this),this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.mergeUndoDeltas=!1},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}else this.$syncInformUndoManager=function(){}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},hasUndo:function(){},hasRedo:function(){},reset:function(){},add:function(){},addSelection:function(){},startNewGroup:function(){},addSession:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.setNavigateWithinSoftTabs=function(e){this.setOption("navigateWithinSoftTabs",e)},this.getNavigateWithinSoftTabs=function(){return this.$navigateWithinSoftTabs},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=e.length-1;n!=-1;n--){var r=e[n];r.action=="insert"||r.action=="remove"?this.doc.revertDelta(r):r.folds&&this.addFolds(r.folds)}!t&&this.$undoSelect&&(e.selectionBefore?this.selection.fromJSON(e.selectionBefore):this.selection.setRange(this.$getUndoSelection(e,!0))),this.$fromUndo=!1},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;for(var n=0;ne.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,f=s.start,o=f.row-a.row,u=f.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new l(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new l(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$bidiHandler.markAsDirty(),this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),o=this.$wrapData,u=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,o){var u;if(e!=null){u=this.$getDisplayTokens(e,a.length),u[0]=n;for(var f=1;fr-b){var w=f+r-b;if(e[w-1]>=c&&e[w]>=c){y(w);continue}if(e[w]==n||e[w]==s){for(w;w!=f-1;w--)if(e[w]==n)break;if(w>f){y(w);continue}w=f+r;for(w;w>2)),f-1);while(w>E&&e[w]E&&e[w]E&&e[w]==a)w--}else while(w>E&&e[w]E){y(++w);continue}w=f+r,e[w]==t&&w--,y(w-b)}return o},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(a):u>=4352&&v(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&v(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){var t=1;return this.lineWidgets&&(t+=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0),!this.$useWrapMode||!this.$wrapData[e]?t:this.$wrapData[e].length+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var u=f[l],i=this.$docRowCache[l],h=e>f[c-1];else var h=!c;var p=this.getLength()-1,d=this.getNextFoldLine(i),v=d?d.start.row:Infinity;while(u<=e){a=this.getRowLength(i);if(u+a>e||i>=p)break;u+=a,i++,i>v&&(i=d.end.row+1,d=this.getNextFoldLine(i,d),v=d?d.start.row:Infinity),h&&(this.$docRowCache.push(i),this.$screenRowCache.push(u))}if(d&&d.start.row<=i)r=this.getFoldDisplayLine(d),i=d.start.row;else{if(u+a<=e||i>p)return{row:p,column:this.getLine(p).length};r=this.getLine(i),d=null}var m=0,g=Math.floor(e-u);if(this.$useWrapMode){var y=this.$wrapData[i];y&&(o=y[g],g>0&&y.length&&(m=y.indent,s=y[g-1]||y[y.length-1],r=r.substring(s)))}return n!==undefined&&this.$bidiHandler.isBidiRow(u+g,i,g)&&(t=this.$bidiHandler.offsetToCol(n)),s+=this.$getStringScreenWidth(r,t-m)[1],this.$useWrapMode&&s>=o&&(s=o-1),d?d.idxToPosition(s):{row:i,column:s}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return this.lineWidgets&&this.lineWidgets[u]&&this.lineWidgets[u].rowsAbove&&(r+=this.lineWidgets[u].rowsAbove),{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.destroyed||(this.bgTokenizer.setDocument(null),this.bgTokenizer.cleanup(),this.destroyed=!0),this.$stopWorker(),this.removeAllListeners(),this.doc&&this.doc.off("change",this.$onChange),this.selection.detach()},this.isFullWidth=v}.call(d.prototype),e("./edit_session/folding").Folding.call(d.prototype),e("./edit_session/bracket_match").BracketMatch.call(d.prototype),o.defineOptions(d.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0)))},initialValue:"auto"},indentedSoftWrap:{set:function(){this.$useWrapMode&&(this.$useWrapMode=!1,this.setUseWrapMode(!0))},initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){e=parseInt(e),e>0&&this.$tabSize!==e&&(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},navigateWithinSoftTabs:{initialValue:!1},foldStyle:{set:function(e){this.setFoldStyle(e)},handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId},handlesSet:!0}}),t.EditSession=d}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";function u(e,t){function n(e){return/\w/.test(e)||t.regExp?"\\b":""}return n(e[0])+e+n(e[e.length-1])}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i,o){return r=new s(e,n,i,o),n==o&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start)?(r=null,!1):!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==S)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=u;n--)if(c(n,Number.MAX_VALUE,e))return;if(t.wrap==0)return;for(n=a,u=o.row;n>=u;n--)if(c(n,Number.MAX_VALUE,e))return};else var f=function(e){var n=o.row;if(c(n,o.column,e))return;for(n+=1;n<=a;n++)if(c(n,0,e))return;if(t.wrap==0)return;for(n=u,a=o.row;n<=a;n++)if(c(n,0,e))return};if(t.$isMultiLine)var l=n.length,c=function(t,i,s){var o=r?t-l+1:t;if(o<0||o+l>e.getLength())return;var u=e.getLine(o),a=u.search(n[0]);if(!r&&ai)return;if(s(o,a,o+l-1,c))return!0};else if(r)var c=function(t,r,i){var s=e.getLine(t),o=[],u,a=0;n.lastIndex=0;while(u=n.exec(s)){var f=u[0].length;a=u.index;if(!f){if(a>=s.length)break;n.lastIndex=a+=1}if(u.index+f>r)break;o.push(u.index,f)}for(var l=o.length-1;l>=0;l-=2){var c=o[l-1],f=o[l];if(i(t,c,t,c+f))return!0}};else var c=function(t,r,i){var s=e.getLine(t),o,u;n.lastIndex=r;while(u=n.exec(s)){var a=u[0].length;o=u.index;if(i(t,o,t,o+a))return!0;if(!a){n.lastIndex=o+=1;if(o>=s.length)return!1}}};return{forEach:f}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||(e.isDefault?-100:0)}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.args?e.command.exec(e.editor,e.args,e.event,!1):e.command.exec(e.editor,{},e.event,!0)})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;if(this.$checkCommandState!=0&&e.isAvailable&&!e.isAvailable(t))return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.off("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",description:"Show settings menu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",description:"Go to next error",bindKey:o("Alt-E","F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",description:"Go to previous error",bindKey:o("Alt-Shift-E","Shift-F4"),exec:function(e){i.loadModule("./ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",description:"Select all",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",description:"Center selection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",description:"Go to line...",bindKey:o("Ctrl-L","Command-L"),exec:function(e,t){typeof t=="number"&&!isNaN(t)&&e.gotoLine(t),e.prompt({$type:"gotoLine"})},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",description:"Toggle fold widget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",description:"Toggle parent fold widget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",description:"Fold all",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldAllComments",description:"Fold all comments",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAllComments()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",description:"Fold other",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",description:"Unfold all",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",description:"Find next",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",description:"Find previous",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",description:"Select or find next",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",description:"Select or find previous",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",description:"Find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",description:"Overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",description:"Select to start",bindKey:o("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",description:"Go to start",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",description:"Select up",bindKey:o("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",description:"Go line up",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",description:"Select to end",bindKey:o("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",description:"Go to end",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",description:"Select down",bindKey:o("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",description:"Go line down",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",description:"Select word left",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",description:"Go to word left",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",description:"Select to line start",bindKey:o("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",description:"Go to line start",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",description:"Select left",bindKey:o("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",description:"Go to left",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",description:"Select word right",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",description:"Go to word right",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",description:"Select to line end",bindKey:o("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",description:"Go to line end",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",description:"Select right",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",description:"Go to right",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",description:"Select page down",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",description:"Page down",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",description:"Go to page down",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",description:"Select page up",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",description:"Page up",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",description:"Go to page up",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",description:"Scroll up",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",description:"Scroll down",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",description:"Select line start",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",description:"Select line end",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",description:"Toggle recording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",description:"Replay macro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",description:"Jump to matching",bindKey:o("Ctrl-\\|Ctrl-P","Command-\\"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",description:"Select to matching",bindKey:o("Ctrl-Shift-\\|Ctrl-Shift-P","Command-Shift-\\"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",description:"Expand to matching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",description:"Pass keys to browser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",description:"Copy",exec:function(e){},readOnly:!0},{name:"cut",description:"Cut",exec:function(e){var t=e.$copyWithEmptySelection&&e.selection.isEmpty(),n=t?e.selection.getLineRange():e.selection.getRange();e._emit("cut",n),n.isEmpty()||e.session.remove(n),e.clearSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",description:"Paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",description:"Remove line",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",description:"Duplicate selection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",description:"Sort lines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",description:"Toggle comment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",description:"Toggle block comment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",description:"Modify number up",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",description:"Modify number down",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",description:"Replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",description:"Undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",description:"Redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",description:"Copy lines up",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",description:"Move lines up",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",description:"Copy lines down",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",description:"Move lines down",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",description:"Delete",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",description:"Backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",description:"Cut or delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",description:"Remove to line start",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",description:"Remove to line end",bindKey:o("Alt-Delete","Ctrl-K|Command-Delete"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestarthard",description:"Remove to line start hard",bindKey:o("Ctrl-Shift-Backspace",null),exec:function(e){var t=e.selection.getRange();t.start.column=0,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineendhard",description:"Remove to line end hard",bindKey:o("Ctrl-Shift-Delete",null),exec:function(e){var t=e.selection.getRange();t.end.column=Number.MAX_VALUE,e.session.remove(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",description:"Remove word left",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",description:"Remove word right",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",description:"Outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",description:"Indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",description:"Block outdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",description:"Block indent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",description:"Insert string",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",description:"Insert text",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",description:"Split line",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",description:"Transpose letters",bindKey:o("Alt-Shift-X","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",description:"To uppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",description:"To lowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"autoindent",description:"Auto Indent",bindKey:o(null,null),exec:function(e){e.autoIndent()},multiSelectAction:"forEachLine",scrollIntoView:"animate"},{name:"expandtoline",description:"Expand to line",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"openlink",bindKey:o("Ctrl+F3","F3"),exec:function(e){e.openLink()}},{name:"joinlines",description:"Join lines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",description:"Invert selection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;ot[n].column&&n++,s.unshift(n,0),t.splice.apply(t,s),this.$updateRows()}},this.$updateRows=function(){var e=this.session.lineWidgets;if(!e)return;var t=!0;e.forEach(function(e,n){if(e){t=!1,e.row=n;while(e.$oldWidget)e.$oldWidget.row=n,e=e.$oldWidget}}),t&&(this.session.lineWidgets=null)},this.$registerLineWidget=function(e){this.session.lineWidgets||(this.session.lineWidgets=new Array(this.session.getLength()));var t=this.session.lineWidgets[e.row];return t&&(e.$oldWidget=t,t.el&&t.el.parentNode&&(t.el.parentNode.removeChild(t.el),t._inDocument=!1)),this.session.lineWidgets[e.row]=e,e},this.addLineWidget=function(e){this.$registerLineWidget(e),e.session=this.session;if(!this.editor)return e;var t=this.editor.renderer;e.html&&!e.el&&(e.el=r.createElement("div"),e.el.innerHTML=e.html),e.text&&!e.el&&(e.el=r.createElement("div"),e.el.textContent=e.text),e.el&&(r.addCssClass(e.el,"ace_lineWidgetContainer"),e.className&&r.addCssClass(e.el,e.className),e.el.style.position="absolute",e.el.style.zIndex=5,t.container.appendChild(e.el),e._inDocument=!0,e.coverGutter||(e.el.style.zIndex=3),e.pixelHeight==null&&(e.pixelHeight=e.el.offsetHeight)),e.rowCount==null&&(e.rowCount=e.pixelHeight/t.layerConfig.lineHeight);var n=this.session.getFoldAt(e.row,0);e.$fold=n;if(n){var i=this.session.lineWidgets;e.row==n.end.row&&!i[n.start.row]?i[n.start.row]=e:e.hidden=!0}return this.session._emit("changeFold",{data:{start:{row:e.row}}}),this.$updateRows(),this.renderWidgets(null,t),this.onWidgetChanged(e),e},this.removeLineWidget=function(e){e._inDocument=!1,e.session=null,e.el&&e.el.parentNode&&e.el.parentNode.removeChild(e.el);if(e.editor&&e.editor.destroy)try{e.editor.destroy()}catch(t){}if(this.session.lineWidgets){var n=this.session.lineWidgets[e.row];if(n==e)this.session.lineWidgets[e.row]=e.$oldWidget,e.$oldWidget&&this.onWidgetChanged(e.$oldWidget);else while(n){if(n.$oldWidget==e){n.$oldWidget=e.$oldWidget;break}n=n.$oldWidget}}this.session._emit("changeFold",{data:{start:{row:e.row}}}),this.$updateRows()},this.getWidgetsAtRow=function(e){var t=this.session.lineWidgets,n=t&&t[e],r=[];while(n)r.push(n),n=n.$oldWidget;return r},this.onWidgetChanged=function(e){this.session._changedWidgets.push(e),this.editor&&this.editor.renderer.updateFull()},this.measureWidgets=function(e,t){var n=this.session._changedWidgets,r=t.layerConfig;if(!n||!n.length)return;var i=Infinity;for(var s=0;s0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(i.prototype),t.LineWidgets=i}),ace.define("ace/editor",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator","ace/line_widgets","ace/clipboard"],function(e,t,n){"use strict";var r=this&&this.__values||function(e){var t=typeof Symbol=="function"&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&typeof e.length=="number")return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},i=e("./lib/oop"),s=e("./lib/dom"),o=e("./lib/lang"),u=e("./lib/useragent"),a=e("./keyboard/textinput").TextInput,f=e("./mouse/mouse_handler").MouseHandler,l=e("./mouse/fold_handler").FoldHandler,c=e("./keyboard/keybinding").KeyBinding,h=e("./edit_session").EditSession,p=e("./search").Search,d=e("./range").Range,v=e("./lib/event_emitter").EventEmitter,m=e("./commands/command_manager").CommandManager,g=e("./commands/default_commands").commands,y=e("./config"),b=e("./token_iterator").TokenIterator,w=e("./line_widgets").LineWidgets,E=e("./clipboard"),S=function(e,t,n){this.$toDestroy=[];var r=e.getContainerElement();this.container=r,this.renderer=e,this.id="editor"+ ++S.$uid,this.commands=new m(u.isMac?"mac":"win",g),typeof document=="object"&&(this.textInput=new a(e.getTextAreaContainer(),this),this.renderer.textarea=this.textInput.getElement(),this.$mouseHandler=new f(this),new l(this)),this.keyBinding=new c(this),this.$search=(new p).set({wrap:!0}),this.$historyTracker=this.$historyTracker.bind(this),this.commands.on("exec",this.$historyTracker),this.$initOperationListeners(),this._$emitInputEvent=o.delayedCall(function(){this._signal("input",{}),this.session&&!this.session.destroyed&&this.session.bgTokenizer.scheduleStart()}.bind(this)),this.on("change",function(e,t){t._$emitInputEvent.schedule(31)}),this.setSession(t||n&&n.session||new h("")),y.resetOptions(this),n&&this.setOptions(n),y._signal("editor",this)};S.$uid=0,function(){i.implement(this,v),this.$initOperationListeners=function(){this.commands.on("exec",this.startOperation.bind(this),!0),this.commands.on("afterExec",this.endOperation.bind(this),!0),this.$opResetTimer=o.delayedCall(this.endOperation.bind(this,!0)),this.on("change",function(){this.curOp||(this.startOperation(),this.curOp.selectionBefore=this.$lastSel),this.curOp.docChanged=!0}.bind(this),!0),this.on("changeSelection",function(){this.curOp||(this.startOperation(),this.curOp.selectionBefore=this.$lastSel),this.curOp.selectionChanged=!0}.bind(this),!0)},this.curOp=null,this.prevOp={},this.startOperation=function(e){if(this.curOp){if(!e||this.curOp.command)return;this.prevOp=this.curOp}e||(this.previousCommand=null,e={}),this.$opResetTimer.schedule(),this.curOp=this.session.curOp={command:e.command||{},args:e.args,scrollTop:this.renderer.scrollTop},this.curOp.selectionBefore=this.selection.toJSON()},this.endOperation=function(e){if(this.curOp&&this.session){if(e&&e.returnValue===!1||!this.session)return this.curOp=null;if(e==1&&this.curOp.command&&this.curOp.command.name=="mouse")return;this._signal("beforeEndOperation");if(!this.curOp)return;var t=this.curOp.command,n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}var s=this.selection.toJSON();this.curOp.selectionAfter=s,this.$lastSel=this.selection.toJSON(),this.session.getUndoManager().addSelection(s),this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"&&e!="ace"){this.$keybindingId=e;var n=this;y.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.onCursorChange(),this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this}),e&&!e.destroyed&&e.bgTokenizer.scheduleStart()},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||s.computedStyle(this.container).fontSize},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||t.destroyed)return;t.$bracketHighlight&&(t.$bracketHighlight.markerIds.forEach(function(e){t.removeMarker(e)}),t.$bracketHighlight=null);var n=e.getCursorPosition(),r=e.getKeyboardHandler(),i=r&&r.$getDirectionForHighlight&&r.$getDirectionForHighlight(e),s=t.getMatchingBracketRanges(n,i);if(!s){var o=new b(t,n.row,n.column),u=o.getCurrentToken();if(u&&/\b(?:tag-open|tag-name)/.test(u.type)){var a=t.getMatchingTags(n);a&&(s=[a.openTagName,a.closeTagName])}}!s&&t.$mode.getMatching&&(s=t.$mode.getMatching(e.session));if(!s){e.getHighlightIndentGuides()&&e.renderer.$textLayer.$highlightIndentGuide();return}var f="ace_bracket";Array.isArray(s)?s.length==1&&(f="ace_error_bracket"):s=[s],s.length==2&&(d.comparePoints(s[0].end,s[1].start)==0?s=[d.fromPoints(s[0].start,s[1].end)]:d.comparePoints(s[0].start,s[1].end)==0&&(s=[d.fromPoints(s[1].start,s[0].end)])),t.$bracketHighlight={ranges:s,markerIds:s.map(function(e){return t.addMarker(e,f,"text")})},e.getHighlightIndentGuides()&&e.renderer.$textLayer.$highlightIndentGuide()},50)},this.focus=function(){this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(e){if(this.$isFocused)return;this.$isFocused=!0,this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus",e)},this.onBlur=function(e){if(!this.$isFocused)return;this.$isFocused=!1,this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur",e)},this.$cursorChange=function(){this.renderer.updateCursor(),this.$highlightBrackets(),this.$updateHighlightActiveLine()},this.onDocumentChange=function(e){var t=this.session.$useWrapMode,n=e.start.row==e.end.row?e.end.row:Infinity;this.renderer.updateLines(e.start.row,n,t),this._signal("change",e),this.$cursorChange()},this.onTokenizerUpdate=function(e){var t=e.data;this.renderer.updateLines(t.first,t.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.$cursorChange(),this._signal("changeSelection")},this.$updateHighlightActiveLine=function(){var e=this.getSession(),t;if(this.$highlightActiveLine){if(this.$selectionStyle!="line"||!this.selection.isMultiLine())t=this.getCursorPosition();this.renderer.theme&&this.renderer.theme.$selectionColorConflict&&!this.selection.isEmpty()&&(t=!1),this.renderer.$maxLines&&this.session.getLength()===1&&!(this.renderer.$minLines>1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new d(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column,r=t.end.column,i=e.getLine(t.start.row),s=i.substring(n,r);if(s.length>5e3||!/[\w\d]/.test(s))return;var o=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:s}),u=i.substring(n-1,r+1);if(!o.test(u))return;return o},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText(),t=this.session.doc.getNewLineCharacter(),n=!1;if(!e&&this.$copyWithEmptySelection){n=!0;var r=this.selection.getAllRanges();for(var i=0;iu.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e);n.insert(i,e),s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new d(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new d(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(this.$enableAutoIndent){if(n.getDocument().isNewLine(e)){var h=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},h)}c&&r.autoOutdent(l,n,i.row)}},this.autoIndent=function(){var e=this.session,t=e.getMode(),n,r;if(this.selection.isEmpty())n=0,r=e.doc.getLength()-1;else{var i=this.getSelectionRange();n=i.start.row,r=i.end.row}var s="",o="",u="",a,f,l,c=e.getTabString();for(var h=n;h<=r;h++)h>0&&(s=e.getState(h-1),o=e.getLine(h-1),u=t.getNextLineIndent(s,o,c)),a=e.getLine(h),f=t.$getIndent(a),u!==f&&(f.length>0&&(l=new d(h,0,h,f.length),e.remove(l)),u.length>0&&e.insert({row:h,column:0},u)),t.autoOutdent(s,e,h)},this.onTextInput=function(e,t){if(!t)return this.keyBinding.onTextInput(e);this.startOperation({command:{name:"insertstring"}});var n=this.applyComposition.bind(this,e,t);this.selection.rangeCount?this.forEachSelection(n):n(),this.endOperation()},this.applyComposition=function(e,t){if(t.extendLeft||t.extendRight){var n=this.selection.getRange();n.start.column-=t.extendLeft,n.end.column+=t.extendRight,n.start.column<0&&(n.start.row--,n.start.column+=this.session.getLine(n.start.row).length+1),this.selection.setRange(n),!e&&!n.isEmpty()&&this.remove()}(e||!this.selection.isEmpty())&&this.insert(e,!0);if(t.restoreStart||t.restoreEnd){var n=this.selection.getRange();n.start.column-=t.restoreStart,n.end.column-=t.restoreEnd,this.selection.setRange(n)}},this.onCommandKey=function(e,t,n){return this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setHighlightIndentGuides=function(e){this.renderer.setHighlightIndentGuides(e)},this.getHighlightIndentGuides=function(){return this.renderer.getHighlightIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.selection.isEmpty()&&this.selection.selectLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.setGhostText=function(e,t){this.session.widgetManager||(this.session.widgetManager=new w(this.session),this.session.widgetManager.attach(this)),this.renderer.setGhostText(e,t)},this.removeGhostText=function(){if(!this.session.widgetManager)return;this.renderer.removeGhostText()},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var i=new d(0,0,0,0);for(var r=e.first;r<=e.last;r++){var s=t.getLine(r);i.start.row=r,i.end.row=r,i.end.column=s.length,t.replace(i,n[r-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new d(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n=u&&s<=a&&(n=t,f.selection.clearSelection(),f.moveCursorTo(e,u+r),f.selection.selectTo(e,a+r)),u=a});var l=this.$toggleWordPairs,c;for(var h=0;h=a&&u<=f&&p.match(/((?:https?|ftp):\/\/[\S]+)/)){l=p.replace(/[\s:.,'";}\]]+$/,"");break}a=f}}catch(d){n={error:d}}finally{try{h&&!h.done&&(i=c.return)&&i.call(c)}finally{if(n)throw n.error}}return l},this.openLink=function(){var e=this.selection.getCursor(),t=this.findLinkAt(e.row,e.column);return t&&window.open(t,"_blank"),t!=null},this.removeLines=function(){var e=this.$getSelectedRows();this.session.removeFullLines(e.first,e.last),this.clearSelection()},this.duplicateSelection=function(){var e=this.selection,t=this.session,n=e.getRange(),r=e.isBackwards();if(n.isEmpty()){var i=n.start.row;t.duplicateLines(i,i)}else{var s=r?n.start:n.end,o=t.insert(s,t.getTextRange(n),!1);n.start=s,n.end=o,e.setSelectionRange(n,r)}},this.moveLinesDown=function(){this.$moveLines(1,!1)},this.moveLinesUp=function(){this.$moveLines(-1,!1)},this.moveText=function(e,t,n){return this.session.moveText(e,t,n)},this.copyLinesUp=function(){this.$moveLines(-1,!0)},this.copyLinesDown=function(){this.$moveLines(1,!0)},this.$moveLines=function(e,t){var n,r,i=this.selection;if(!i.inMultiSelectMode||this.inVirtualSelectionMode){var s=i.toOrientedRange();n=this.$getSelectedRows(s),r=this.session.$moveLines(n.first,n.last,t?0:e),t&&e==-1&&(r=0),s.moveBy(r,0),i.fromOrientedRange(s)}else{var o=i.rangeList.ranges;i.rangeList.detach(this.session),this.inVirtualSelectionMode=!0;var u=0,a=0,f=o.length;for(var l=0;lp+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(e)},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection());var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.selection.selectAll()},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new b(this.session,n.row,n.column),i=r.getCurrentToken(),s=0;i&&i.type.indexOf("tag-name")!==-1&&(i=r.stepBackward());var o=i||r.stepForward();if(!o)return;var u,a=!1,f={},l=n.column-o.start,c,h={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(o.value.match(/[{}()\[\]]/g))for(;l1?f[o.value]++:i.value==="=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&i.mixin(t,e);var r=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(r)||this.$search.$options.needle,e||(r=this.session.getWordRange(r.start.row,r.start.column),e=this.session.getTextRange(r)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:r});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?r.start=r.end:r.end=r.start,this.selection.setRange(r)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.session.unfold(e),this.selection.setSelectionRange(e);var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.session.getUndoManager().undo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.session.getUndoManager().redo(this.session),this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.$toDestroy&&(this.$toDestroy.forEach(function(e){e.destroy()}),this.$toDestroy=null),this.$mouseHandler&&this.$mouseHandler.destroy(),this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy(),this._$emitInputEvent&&this._$emitInputEvent.cancel(),this.removeAllListeners()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",s.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))},this.prompt=function(e,t,n){var r=this;y.loadModule("./ext/prompt",function(i){i.prompt(r,e,t,n)})}}.call(S.prototype),y.defineOptions(S.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.$resetCursorStyle()},initialValue:!1},copyWithEmptySelection:{set:function(e){this.textInput.setCopyWithEmptySelection(e)},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},enableAutoIndent:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.$keybindingId},handlesSet:!0},value:{set:function(e){this.session.setValue(e)},get:function(){return this.getValue()},handlesSet:!0,hidden:!0},session:{set:function(e){this.setSession(e)},get:function(){return this.session},handlesSet:!0,hidden:!0},showLineNumbers:{set:function(e){this.renderer.$gutterLayer.setShowLineNumbers(e),this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER),e&&this.$relativeLineNumbers?x.attach(this):x.detach(this)},initialValue:!0},relativeLineNumbers:{set:function(e){this.$showLineNumbers&&e?x.attach(this):x.detach(this)}},placeholder:{set:function(e){this.$updatePlaceholder||(this.$updatePlaceholder=function(){var e=this.session&&(this.renderer.$composition||this.getValue());if(e&&this.renderer.placeholderNode)this.renderer.off("afterRender",this.$updatePlaceholder),s.removeCssClass(this.container,"ace_hasPlaceholder"),this.renderer.placeholderNode.remove(),this.renderer.placeholderNode=null;else if(!e&&!this.renderer.placeholderNode){this.renderer.on("afterRender",this.$updatePlaceholder),s.addCssClass(this.container,"ace_hasPlaceholder");var t=s.createElement("div");t.className="ace_placeholder",t.textContent=this.$placeholder||"",this.renderer.placeholderNode=t,this.renderer.content.appendChild(this.renderer.placeholderNode)}else!e&&this.renderer.placeholderNode&&(this.renderer.placeholderNode.textContent=this.$placeholder||"")}.bind(this),this.on("input",this.$updatePlaceholder)),this.$updatePlaceholder()}},customScrollbar:"renderer",hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",displayIndentGuides:"renderer",highlightIndentGuides:"renderer",showGutter:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",hasCssTransforms:"renderer",maxPixelHeight:"renderer",useTextareaForIME:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimeout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",navigateWithinSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"});var x={getText:function(e,t){return(Math.abs(e.selection.lead.row-t)||t+1+(t<9?"\u00b7":""))+""},getWidth:function(e,t,n){return Math.max(t.toString().length,(n.lastRow+1).toString().length,2)*n.characterWidth},update:function(e,t){t.renderer.$loop.schedule(t.renderer.CHANGE_GUTTER)},attach:function(e){e.renderer.$gutterLayer.$renderer=this,e.on("changeSelection",this.update),this.update(null,e)},detach:function(e){e.renderer.$gutterLayer.$renderer==this&&(e.renderer.$gutterLayer.$renderer=null),e.off("changeSelection",this.update),this.update(null,e)}};t.Editor=S}),ace.define("ace/undomanager",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){for(var n=t;n--;){var r=e[n];if(r&&!r[0].ignore){while(n0){a.row+=i,a.column+=a.row==r.row?s:0;continue}!t&&l<=0&&(a.row=n.row,a.column=n.column,l===0&&(a.bias=1))}}function f(e){return{row:e.row,column:e.column}}function l(e){return{start:f(e.start),end:f(e.end),action:e.action,lines:e.lines.slice()}}function c(e){e=e||this;if(Array.isArray(e))return e.map(c).join("\n");var t="";e.action?(t=e.action=="insert"?"+":"-",t+="["+e.lines+"]"):e.value&&(Array.isArray(e.value)?t=e.value.map(h).join("\n"):t=h(e.value)),e.start&&(t+=h(e));if(e.id||e.rev)t+=" ("+(e.id||e.rev)+")";return t}function h(e){return e.start.row+":"+e.start.column+"=>"+e.end.row+":"+e.end.column}function p(e,t){var n=e.action=="insert",r=t.action=="insert";if(n&&r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}else if(!n&&r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.start,e.start)<=0))return null;m(e,t,1)}else if(!n&&!r)if(o(t.start,e.start)>=0)m(t,e,1);else{if(!(o(t.end,e.start)<=0))return null;m(e,t,-1)}return[t,e]}function d(e,t){for(var n=e.length;n--;)for(var r=0;r=0?m(e,t,-1):o(e.start,t.start)<=0?m(t,e,1):(m(e,s.fromPoints(t.start,e.start),-1),m(t,e,1));else if(!n&&r)o(t.start,e.end)>=0?m(t,e,-1):o(t.start,e.start)<=0?m(e,t,1):(m(t,s.fromPoints(e.start,t.start),-1),m(e,t,1));else if(!n&&!r)if(o(t.start,e.end)>=0)m(t,e,-1);else{if(!(o(t.end,e.start)<=0)){var i,u;return o(e.start,t.start)<0&&(i=e,e=y(e,t.start)),o(e.end,t.end)>0&&(u=y(e,t.end)),g(t.end,e.start,e.end,-1),u&&!i&&(e.lines=u.lines,e.start=u.start,e.end=u.end,u=e),[t,i,u].filter(Boolean)}m(e,t,-1)}return[t,e]}function m(e,t,n){g(e.start,t.start,t.end,n),g(e.end,t.start,t.end,n)}function g(e,t,n,r){e.row==(r==1?t:n).row&&(e.column+=r*(n.column-t.column)),e.row+=r*(n.row-t.row)}function y(e,t){var n=e.lines,r=e.end;e.end=f(t);var i=e.end.row-e.start.row,s=n.splice(i,n.length),o=i?t.column:t.column-e.start.column;n.push(s[0].substring(0,o)),s[0]=s[0].substr(o);var u={start:f(t),end:r,lines:s,action:e.action};return u}function b(e,t){t=l(t);for(var n=e.length;n--;){var r=e[n];for(var i=0;ithis.$undoDepth-1&&this.$undoStack.splice(0,r-this.$undoDepth+1),this.$undoStack.push(this.lastDeltas),e.id=this.$rev=++this.$maxRev}if(e.action=="remove"||e.action=="insert")this.$lastDelta=e;this.lastDeltas.push(e)},this.addSelection=function(e,t){this.selections.push({value:e,rev:t||this.$rev})},this.startNewGroup=function(){return this.lastDeltas=null,this.$rev},this.markIgnored=function(e,t){t==null&&(t=this.$rev+1);var n=this.$undoStack;for(var r=n.length;r--;){var i=n[r][0];if(i.id<=e)break;i.id0},this.canRedo=function(){return this.$redoStack.length>0},this.bookmark=function(e){e==undefined&&(e=this.$rev),this.mark=e},this.isAtBookmark=function(){return this.$rev===this.mark},this.toJSON=function(){},this.fromJSON=function(){},this.hasUndo=this.canUndo,this.hasRedo=this.canRedo,this.isClean=this.isAtBookmark,this.markClean=this.bookmark,this.$prettyPrint=function(e){return e?c(e):c(this.$undoStack)+"\n---\n"+c(this.$redoStack)}}).call(r.prototype);var s=e("./range").Range,o=s.comparePoints,u=s.comparePoints;t.UndoManager=r}),ace.define("ace/layer/lines",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e,t){this.element=e,this.canvasHeight=t||5e5,this.element.style.height=this.canvasHeight*2+"px",this.cells=[],this.cellCache=[],this.$offsetCoefficient=0};(function(){this.moveContainer=function(e){r.translate(this.element,0,-(e.firstRowScreen*e.lineHeight%this.canvasHeight)-e.offset*this.$offsetCoefficient)},this.pageChanged=function(e,t){return Math.floor(e.firstRowScreen*e.lineHeight/this.canvasHeight)!==Math.floor(t.firstRowScreen*t.lineHeight/this.canvasHeight)},this.computeLineTop=function(e,t,n){var r=t.firstRowScreen*t.lineHeight,i=Math.floor(r/this.canvasHeight),s=n.documentToScreenRow(e,0)*t.lineHeight;return s-i*this.canvasHeight},this.computeLineHeight=function(e,t,n){return t.lineHeight*n.getRowLineCount(e)},this.getLength=function(){return this.cells.length},this.get=function(e){return this.cells[e]},this.shift=function(){this.$cacheCell(this.cells.shift())},this.pop=function(){this.$cacheCell(this.cells.pop())},this.push=function(e){if(Array.isArray(e)){this.cells.push.apply(this.cells,e);var t=r.createFragment(this.element);for(var n=0;ns&&(a=i.end.row+1,i=t.getNextFoldLine(a,i),s=i?i.start.row:Infinity);if(a>r){while(this.$lines.getLength()>u+1)this.$lines.pop();break}o=this.$lines.get(++u),o?o.row=a:(o=this.$lines.createCell(a,e,this.session,f),this.$lines.push(o)),this.$renderCell(o,e,i,a),a++}this._signal("afterRender"),this.$updateGutterWidth(e)},this.$updateGutterWidth=function(e){var t=this.session,n=t.gutterRenderer||this.$renderer,r=t.$firstLineNumber,i=this.$lines.last()?this.$lines.last().text:"";if(this.$fixedWidth||t.$useWrapMode)i=t.getLength()+r-1;var s=n?n.getWidth(t,i,e):i.toString().length*e.characterWidth,o=this.$padding||this.$computePadding();s+=o.left+o.right,s!==this.gutterWidth&&!isNaN(s)&&(this.gutterWidth=s,this.element.parentNode.style.width=this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._signal("changeGutterWidth",s))},this.$updateCursorRow=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.getCursor();if(this.$cursorRow===e.row)return;this.$cursorRow=e.row},this.updateLineHighlight=function(){if(!this.$highlightGutterLine)return;var e=this.session.selection.cursor.row;this.$cursorRow=e;if(this.$cursorCell&&this.$cursorCell.row==e)return;this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ",""));var t=this.$lines.cells;this.$cursorCell=null;for(var n=0;n=this.$cursorRow){if(r.row>this.$cursorRow){var i=this.session.getFoldLine(this.$cursorRow);if(!(n>0&&i&&i.start.row==t[n-1].row))break;r=t[n-1]}r.element.className="ace_gutter-active-line "+r.element.className,this.$cursorCell=r;break}}},this.scrollLines=function(e){var t=this.config;this.config=e,this.$updateCursorRow();if(this.$lines.pageChanged(t,e))return this.update(e);this.$lines.moveContainer(e);var n=Math.min(e.lastRow+e.gutterOffset,this.session.getLength()-1),r=this.oldLastRow;this.oldLastRow=n;if(!t||r0;i--)this.$lines.shift();if(r>n)for(var i=this.session.getFoldedRowCount(n+1,r);i>0;i--)this.$lines.pop();e.firstRowr&&this.$lines.push(this.$renderLines(e,r+1,n)),this.updateLineHighlight(),this._signal("afterRender"),this.$updateGutterWidth(e)},this.$renderLines=function(e,t,n){var r=[],i=t,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>n)break;var u=this.$lines.createCell(i,e,this.session,f);this.$renderCell(u,e,s,i),r.push(u),i++}return r},this.$renderCell=function(e,t,n,i){var s=e.element,o=this.session,u=s.childNodes[0],a=s.childNodes[1],f=o.$firstLineNumber,l=o.$breakpoints,c=o.$decorations,h=o.gutterRenderer||this.$renderer,p=this.$showFoldWidgets&&o.foldWidgets,d=n?n.start.row:Number.MAX_VALUE,v="ace_gutter-cell ";this.$highlightGutterLine&&(i==this.$cursorRow||n&&i=d&&this.$cursorRow<=n.end.row)&&(v+="ace_gutter-active-line ",this.$cursorCell!=e&&(this.$cursorCell&&(this.$cursorCell.element.className=this.$cursorCell.element.className.replace("ace_gutter-active-line ","")),this.$cursorCell=e)),l[i]&&(v+=l[i]),c[i]&&(v+=c[i]),this.$annotations[i]&&(v+=this.$annotations[i].className),s.className!=v&&(s.className=v);if(p){var m=p[i];m==null&&(m=p[i]=o.getFoldWidget(i))}if(m){var v="ace_fold-widget ace_"+m;m=="start"&&i==d&&in.right-t.right)return"foldWidgets"}}).call(a.prototype),t.Gutter=a}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.elt=function(e,t){var n=this.i!=-1&&this.element.childNodes[this.i];n?this.i++:(n=document.createElement("div"),this.element.appendChild(n),this.i=-1),n.style.cssText=t,n.className=e},this.update=function(e){if(!e)return;this.config=e,this.i=0;var t;for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}if(this.i!=-1)while(this.ip,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"";if(this.session.$bidiHandler.isBidiRow(t.start.row)){var f=t.clone();f.end.row=f.start.row,f.end.column=this.session.getLine(f.start.row).length,this.drawBidiSingleLineMarker(e,f,n+" ace_br1 ace_start",r,null,i)}else this.elt(n+" ace_br1 ace_start","height:"+o+"px;"+"right:0;"+"top:"+u+"px;left:"+a+"px;"+(i||""));if(this.session.$bidiHandler.isBidiRow(t.end.row)){var f=t.clone();f.start.row=f.end.row,f.start.column=0,this.drawBidiSingleLineMarker(e,f,n+" ace_br12",r,null,i)}else{u=this.$getTop(t.end.row,r);var l=t.end.column*r.characterWidth;this.elt(n+" ace_br12","height:"+o+"px;"+"width:"+l+"px;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))}o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var c=(t.start.column?1:0)|(t.end.column?0:8);this.elt(n+(c?" ace_br"+c:""),"height:"+o+"px;"+"right:0;"+"top:"+u+"px;"+"left:"+s+"px;"+(i||""))},this.drawSingleLineMarker=function(e,t,n,r,i,s){if(this.session.$bidiHandler.isBidiRow(t.start.row))return this.drawBidiSingleLineMarker(e,t,n,r,i,s);var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;this.elt(n,"height:"+o+"px;"+"width:"+u+"px;"+"top:"+a+"px;"+"left:"+f+"px;"+(s||""))},this.drawBidiSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=this.$getTop(t.start.row,r),a=this.$padding,f=this.session.$bidiHandler.getSelections(t.start.column,t.end.column);f.forEach(function(e){this.elt(n,"height:"+o+"px;"+"width:"+(e.width+(i||0))+"px;"+"top:"+u+"px;"+"left:"+(a+e.left)+"px;"+(s||""))},this)},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;this.elt(n,"height:"+o+"px;"+"top:"+s+"px;"+"left:0;right:0;"+(i||""))}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/layer/lines","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("./lines").Lines,u=e("../lib/event_emitter").EventEmitter,a=function(e){this.dom=i,this.element=this.dom.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this),this.$lines=new o(this.element)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.MAX_LINE_LENGTH=1e4,this.MAX_CHUNK_LENGTH=250,this.$updateEolChar=function(){var e=this.session.doc,t=e.getNewLineCharacter()=="\n"&&e.getNewLineMode()!="windows",n=t?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=n)return this.EOL_CHAR=n,!0},this.setPadding=function(e){this.$padding=e,this.element.style.margin="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.showSpaces=!1,this.showTabs=!1,this.showEOL=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,typeof e=="string"?(this.showSpaces=/tab/i.test(e),this.showTabs=/space/i.test(e),this.showEOL=/eol/i.test(e)):this.showSpaces=this.showTabs=this.showEOL=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$highlightIndentGuides=!0,this.setHighlightIndentGuides=function(e){return this.$highlightIndentGuides===e?!1:(this.$highlightIndentGuides=e,e)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;nl&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),l=a?a.start.row:Infinity);if(u>i)break;var c=s[o++];if(c){this.dom.removeChildren(c),this.$renderLine(c,u,u==l?a:!1),f&&(c.style.top=this.$lines.computeLineTop(u,e,this.session)+"px");var h=e.lineHeight*this.session.getRowLength(u)+"px";c.style.height!=h&&(f=!0,c.style.height=h)}u++}if(f)while(o0;i--)this.$lines.shift();if(t.lastRow>e.lastRow)for(var i=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);i>0;i--)this.$lines.pop();e.firstRowt.lastRow&&this.$lines.push(this.$renderLinesFragment(e,t.lastRow+1,e.lastRow)),this.$highlightIndentGuide()},this.$renderLinesFragment=function(e,t,n){var r=[],s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=this.$lines.createCell(s,e,this.session),f=a.element;this.dom.removeChildren(f),i.setStyle(f.style,"height",this.$lines.computeLineHeight(s,e,this.session)+"px"),i.setStyle(f.style,"top",this.$lines.computeLineTop(s,e,this.session)+"px"),this.$renderLine(f,s,s==u?o:!1),this.$useLineGroups()?f.className="ace_line_group":(f.className="ace_line",f.setAttribute("role","option")),r.push(a),s++}return r},this.update=function(e){this.$lines.moveContainer(e),this.config=e;var t=e.firstRow,n=e.lastRow,r=this.$lines;while(r.getLength())r.pop();r.push(this.$renderLinesFragment(e,t,n))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderTokenInChunks=function(e,t,n,r){var i;for(var s=0;s=n)return t;if(t[0]==" "){r-=r%this.tabSize;var i=r/this.tabSize;for(var s=0;ss[o].start.row?this.$highlightIndentGuideMarker.dir=-1:this.$highlightIndentGuideMarker.dir=1;break}}if(!this.$highlightIndentGuideMarker.end&&e[t.row]!==""&&t.column===e[t.row].length){this.$highlightIndentGuideMarker.dir=1;for(var o=t.row+1;o0)for(var i=0;i=this.$highlightIndentGuideMarker.start+1){if(r.row>=this.$highlightIndentGuideMarker.end)break;this.$setIndentGuideActive(r,t)}}else for(var n=e.length-1;n>=0;n--){var r=e[n];if(this.$highlightIndentGuideMarker.end&&r.row=o)u=this.$renderTokenInChunks(a,u,l,c.substring(0,o-r)),c=c.substring(o-r),r=o,a=this.$createLineElement(),e.appendChild(a),a.appendChild(this.dom.createTextNode(s.stringRepeat("\u00a0",n.indent),this.element)),i++,u=0,o=n[i]||Number.MAX_VALUE;c.length!=0&&(r+=c.length,u=this.$renderTokenInChunks(a,u,l,c))}}n[n.length-1]>this.MAX_LINE_LENGTH&&this.$renderOverflowMessage(a,u,null,"",!0)},this.$renderSimpleLine=function(e,t){var n=0;for(var r=0;rthis.MAX_LINE_LENGTH){this.$renderOverflowMessage(e,n,i,s);return}n=this.$renderTokenInChunks(e,n,i,s)}},this.$renderOverflowMessage=function(e,t,n,r,i){n&&this.$renderTokenInChunks(e,t,n,r.slice(0,this.MAX_LINE_LENGTH-t));var s=this.dom.createElement("span");s.className="ace_inline_button ace_keyword ace_toggle_wrap",s.textContent=i?"":"",e.appendChild(s)},this.$renderLine=function(e,t,n){!n&&n!=0&&(n=this.session.getFoldLine(t));if(n)var r=this.$getFoldLineTokens(t,n);else var r=this.session.getTokens(t);var i=e;if(r.length){var s=this.session.getRowSplitData(t);if(s&&s.length){this.$renderWrappedLine(e,r,s);var i=e.lastChild}else{var i=e;this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i)),this.$renderSimpleLine(i,r)}}else this.$useLineGroups()&&(i=this.$createLineElement(),e.appendChild(i));if(this.showEOL&&i){n&&(t=n.end.row);var o=this.dom.createElement("span");o.className="ace_invisible ace_invisible_eol",o.textContent=t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,i.appendChild(o)}},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=this.$updateOpacity.bind(this)};(function(){this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)r.setStyle(t[n].style,"opacity",e?"":"0")},this.$startCssAnimation=function(){var e=this.cursors;for(var t=e.length;t--;)e[t].style.animationDuration=this.blinkInterval+"ms";this.$isAnimating=!0,setTimeout(function(){this.$isAnimating&&r.addCssClass(this.element,"ace_animate-blinking")}.bind(this))},this.$stopCssAnimation=function(){this.$isAnimating=!1,r.removeCssClass(this.element,"ace_animate-blinking")},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.$stopCssAnimation(),this.smoothBlinking&&(this.$isSmoothBlinking=!1,r.removeCssClass(this.element,"ace_smooth-blinking")),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible){this.$stopCssAnimation();return}this.smoothBlinking&&(this.$isSmoothBlinking=!0,setTimeout(function(){this.$isSmoothBlinking&&r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this)));if(r.HAS_CSS_ANIMATION)this.$startCssAnimation();else{var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e.row)?this.session.$bidiHandler.getPosLeft(n.column):n.column*this.config.characterWidth),i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.isCursorInView=function(e,t){return e.top>=0&&e.tope.height+e.offset||o.top<0)&&n>1)continue;var u=this.cursors[i++]||this.addCursor(),a=u.style;this.drawCursor?this.drawCursor(u,o,e,t[n],this.session):this.isCursorInView(o,e)?(r.setStyle(a,"display","block"),r.translate(u,o.left,o.top),r.setStyle(a,"width",Math.round(e.characterWidth)+"px"),r.setStyle(a,"height",e.lineHeight+"px")):r.setStyle(a,"display","none")}while(this.cursors.length>i)this.removeCursor();var f=this.session.getOverwrite();this.$setOverwrite(f),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=32768,a=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.inner.textContent="\u00a0",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var f=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};r.inherits(f,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){this.scrollTop=this.element.scrollTop;if(this.coeff!=1){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>u?(this.coeff=u/e,e=u):this.coeff!=1&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(f.prototype);var l=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(l,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(l.prototype),t.ScrollBar=f,t.ScrollBarV=f,t.ScrollBarH=l,t.VScrollBar=f,t.HScrollBar=l}),ace.define("ace/scrollbar_custom",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter;i.importCssString(".ace_editor>.ace_sb-v div, .ace_editor>.ace_sb-h div{\n position: absolute;\n background: rgba(128, 128, 128, 0.6);\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n border: 1px solid #bbb;\n border-radius: 2px;\n z-index: 8;\n}\n.ace_editor>.ace_sb-v, .ace_editor>.ace_sb-h {\n position: absolute;\n z-index: 6;\n background: none;\n overflow: hidden!important;\n}\n.ace_editor>.ace_sb-v {\n z-index: 6;\n right: 0;\n top: 0;\n width: 12px;\n}\n.ace_editor>.ace_sb-v div {\n z-index: 8;\n right: 0;\n width: 100%;\n}\n.ace_editor>.ace_sb-h {\n bottom: 0;\n left: 0;\n height: 12px;\n}\n.ace_editor>.ace_sb-h div {\n bottom: 0;\n height: 100%;\n}\n.ace_editor>.ace_sb_grabbed {\n z-index: 8;\n background: #000;\n}","ace_scrollbar.css",!1);var u=function(e){this.element=i.createElement("div"),this.element.className="ace_sb"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="",this.element.appendChild(this.inner),this.VScrollWidth=12,this.HScrollHeight=12,e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addMultiMouseDownListener(this.element,[500,300,300],this,"onMouseDown")};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(u.prototype);var a=function(e,t){u.call(this,e),this.scrollTop=0,this.scrollHeight=0,this.parent=e,this.width=this.VScrollWidth,this.renderer=t,this.inner.style.width=this.element.style.width=(this.width||15)+"px",this.$minWidth=0};r.inherits(a,u),function(){this.classSuffix="-v",r.implement(this,o),this.onMouseDown=function(e,t){if(e!=="mousedown")return;if(s.getButton(t)!==0||t.detail===2)return;if(t.target===this.inner){var n=this,r=t.clientY,i=function(e){r=e.clientY},o=function(){clearInterval(l)},u=t.clientY,a=this.thumbTop,f=function(){if(r===undefined)return;var e=n.scrollTopFromThumbTop(a+r-u);if(e===n.scrollTop)return;n._emit("scroll",{data:e})};s.capture(this.inner,i,o);var l=setInterval(f,20);return s.preventDefault(t)}var c=t.clientY-this.element.getBoundingClientRect().top-this.thumbHeight/2;return this._emit("scroll",{data:this.scrollTopFromThumbTop(c)}),s.preventDefault(t)},this.getHeight=function(){return this.height},this.scrollTopFromThumbTop=function(e){var t=e*(this.pageHeight-this.viewHeight)/(this.slideHeight-this.thumbHeight);return t>>=0,t<0?t=0:t>this.pageHeight-this.viewHeight&&(t=this.pageHeight-this.viewHeight),t},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.height=Math.max(0,e),this.slideHeight=this.height,this.viewHeight=this.height,this.setScrollHeight(this.pageHeight,!0)},this.setInnerHeight=this.setScrollHeight=function(e,t){if(this.pageHeight===e&&!t)return;this.pageHeight=e,this.thumbHeight=this.slideHeight*this.viewHeight/this.pageHeight,this.thumbHeight>this.slideHeight&&(this.thumbHeight=this.slideHeight),this.thumbHeight<15&&(this.thumbHeight=15),this.inner.style.height=this.thumbHeight+"px",this.scrollTop>this.pageHeight-this.viewHeight&&(this.scrollTop=this.pageHeight-this.viewHeight,this.scrollTop<0&&(this.scrollTop=0),this._emit("scroll",{data:this.scrollTop}))},this.setScrollTop=function(e){this.scrollTop=e,e<0&&(e=0),this.thumbTop=e*(this.slideHeight-this.thumbHeight)/(this.pageHeight-this.viewHeight),this.inner.style.top=this.thumbTop+"px"}}.call(a.prototype);var f=function(e,t){u.call(this,e),this.scrollLeft=0,this.scrollWidth=0,this.height=this.HScrollHeight,this.inner.style.height=this.element.style.height=(this.height||12)+"px",this.renderer=t};r.inherits(f,u),function(){this.classSuffix="-h",r.implement(this,o),this.onMouseDown=function(e,t){if(e!=="mousedown")return;if(s.getButton(t)!==0||t.detail===2)return;if(t.target===this.inner){var n=this,r=t.clientX,i=function(e){r=e.clientX},o=function(){clearInterval(l)},u=t.clientX,a=this.thumbLeft,f=function(){if(r===undefined)return;var e=n.scrollLeftFromThumbLeft(a+r-u);if(e===n.scrollLeft)return;n._emit("scroll",{data:e})};s.capture(this.inner,i,o);var l=setInterval(f,20);return s.preventDefault(t)}var c=t.clientX-this.element.getBoundingClientRect().left-this.thumbWidth/2;return this._emit("scroll",{data:this.scrollLeftFromThumbLeft(c)}),s.preventDefault(t)},this.getHeight=function(){return this.isVisible?this.height:0},this.scrollLeftFromThumbLeft=function(e){var t=e*(this.pageWidth-this.viewWidth)/(this.slideWidth-this.thumbWidth);return t>>=0,t<0?t=0:t>this.pageWidth-this.viewWidth&&(t=this.pageWidth-this.viewWidth),t},this.setWidth=function(e){this.width=Math.max(0,e),this.element.style.width=this.width+"px",this.slideWidth=this.width,this.viewWidth=this.width,this.setScrollWidth(this.pageWidth,!0)},this.setInnerWidth=this.setScrollWidth=function(e,t){if(this.pageWidth===e&&!t)return;this.pageWidth=e,this.thumbWidth=this.slideWidth*this.viewWidth/this.pageWidth,this.thumbWidth>this.slideWidth&&(this.thumbWidth=this.slideWidth),this.thumbWidth<15&&(this.thumbWidth=15),this.inner.style.width=this.thumbWidth+"px",this.scrollLeft>this.pageWidth-this.viewWidth&&(this.scrollLeft=this.pageWidth-this.viewWidth,this.scrollLeft<0&&(this.scrollLeft=0),this._emit("scroll",{data:this.scrollLeft}))},this.setScrollLeft=function(e){this.scrollLeft=e,e<0&&(e=0),this.thumbLeft=e*(this.slideWidth-this.thumbWidth)/(this.pageWidth-this.viewWidth),this.inner.style.left=this.thumbLeft+"px"}}.call(f.prototype),t.ScrollBar=a,t.ScrollBarV=a,t.ScrollBarH=f,t.VScrollBar=a,t.HScrollBar=f}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.$recursionLimit=2,this.window=t||window;var n=this;this._flush=function(e){n.pending=!1;var t=n.changes;t&&(r.blockIdle(100),n.changes=0,n.onRender(t));if(n.changes){if(n.$recursionLimit--<0)return;n.schedule()}else n.$recursionLimit=2}};(function(){this.schedule=function(e){this.changes=this.changes|e,this.changes&&!this.pending&&(r.nextFrame(this._flush),this.pending=!0)},this.clear=function(e){var t=this.changes;return this.changes=0,t}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/event"),u=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,f=250,l=typeof ResizeObserver=="function",c=200,h=t.FontMetrics=function(e,t){this.charCount=t||f,this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),this.$measureNode.textContent=s.stringRepeat("X",this.charCount),this.$characterSize={width:0,height:0},l?this.$addObserver():this.checkForSizeChanges()};(function(){r.implement(this,a),this.$characterSize={width:0,height:0},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",u.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(e){e===undefined&&(e=this.$measureSizes());if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$addObserver=function(){var e=this;this.$observer=new window.ResizeObserver(function(t){e.checkForSizeChanges()}),this.$observer.observe(this.$measureNode)},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer||this.$observer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=o.onIdle(function t(){e.checkForSizeChanges(),o.onIdle(t,500)},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(e){e=e||this.$measureNode;var t=e.getBoundingClientRect(),n={height:t.height,width:t.width/this.charCount};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.textContent=s.stringRepeat(e,this.charCount);var t=this.$main.getBoundingClientRect();return t.width/this.charCount},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$observer&&this.$observer.disconnect(),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)},this.$getZoom=function e(t){return!t||!t.parentElement?1:(window.getComputedStyle(t).zoom||1)*e(t.parentElement)},this.$initTransformMeasureNodes=function(){var e=function(e,t){return["div",{style:"position: absolute;top:"+e+"px;left:"+t+"px;"}]};this.els=i.buildDom([e(0,0),e(c,0),e(0,c),e(c,c)],this.el)},this.transformCoordinates=function(e,t){function r(e,t,n){var r=e[1]*t[0]-e[0]*t[1];return[(-t[1]*n[0]+t[0]*n[1])/r,(+e[1]*n[0]-e[0]*n[1])/r]}function i(e,t){return[e[0]-t[0],e[1]-t[1]]}function s(e,t){return[e[0]+t[0],e[1]+t[1]]}function o(e,t){return[e*t[0],e*t[1]]}function u(e){var t=e.getBoundingClientRect();return[t.left,t.top]}if(e){var n=this.$getZoom(this.el);e=o(1/n,e)}this.els||this.$initTransformMeasureNodes();var a=u(this.els[0]),f=u(this.els[1]),l=u(this.els[2]),h=u(this.els[3]),p=r(i(h,f),i(h,l),i(s(f,l),s(h,a))),d=o(1+p[0],i(f,a)),v=o(1+p[1],i(l,a));if(t){var m=t,g=p[0]*m[0]/c+p[1]*m[1]/c+1,y=s(o(m[0],d),o(m[1],v));return s(o(1/g/c,y),a)}var b=i(e,a),w=r(i(d,o(p[0],b)),i(v,o(p[1],b)),b);return o(c,w)}}).call(h.prototype)}),ace.define("ace/css/editor.css",["require","exports","module"],function(e,t,n){n.exports='/*\nstyles = []\nfor (var i = 1; i < 16; i++) {\n styles.push(".ace_br" + i + "{" + (\n ["top-left", "top-right", "bottom-right", "bottom-left"]\n ).map(function(x, j) {\n return i & (1< .ace_line, .ace_text-layer > .ace_line_group {\n contain: style size layout;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n}\n\n.ace_hidpi .ace_text-layer,\n.ace_hidpi .ace_gutter-layer,\n.ace_hidpi .ace_content,\n.ace_hidpi .ace_gutter {\n contain: strict;\n will-change: transform;\n}\n.ace_hidpi .ace_text-layer > .ace_line, \n.ace_hidpi .ace_text-layer > .ace_line_group {\n contain: strict;\n}\n\n.ace_cjk {\n display: inline-block;\n text-align: center;\n}\n\n.ace_cursor-layer {\n z-index: 4;\n}\n\n.ace_cursor {\n z-index: 4;\n position: absolute;\n box-sizing: border-box;\n border-left: 2px solid;\n /* workaround for smooth cursor repaintng whole screen in chrome */\n transform: translatez(0);\n}\n\n.ace_multiselect .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_slim-cursors .ace_cursor {\n border-left-width: 1px;\n}\n\n.ace_overwrite-cursors .ace_cursor {\n border-left-width: 0;\n border-bottom: 1px solid;\n}\n\n.ace_hidden-cursors .ace_cursor {\n opacity: 0.2;\n}\n\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\n opacity: 0;\n}\n\n.ace_smooth-blinking .ace_cursor {\n transition: opacity 0.18s;\n}\n\n.ace_animate-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: step-end;\n animation-name: blink-ace-animate;\n animation-iteration-count: infinite;\n}\n\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\n animation-duration: 1000ms;\n animation-timing-function: ease-in-out;\n animation-name: blink-ace-animate-smooth;\n}\n \n@keyframes blink-ace-animate {\n from, to { opacity: 1; }\n 60% { opacity: 0; }\n}\n\n@keyframes blink-ace-animate-smooth {\n from, to { opacity: 1; }\n 45% { opacity: 1; }\n 60% { opacity: 0; }\n 85% { opacity: 0; }\n}\n\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\n position: absolute;\n z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n position: absolute;\n z-index: 5;\n}\n\n.ace_marker-layer .ace_bracket {\n position: absolute;\n z-index: 6;\n}\n\n.ace_marker-layer .ace_error_bracket {\n position: absolute;\n border-bottom: 1px solid #DE5555;\n border-radius: 0;\n}\n\n.ace_marker-layer .ace_active-line {\n position: absolute;\n z-index: 2;\n}\n\n.ace_marker-layer .ace_selected-word {\n position: absolute;\n z-index: 4;\n box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n box-sizing: border-box;\n\n display: inline-block;\n height: 11px;\n margin-top: -2px;\n vertical-align: middle;\n\n background-image:\n url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),\n url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");\n background-repeat: no-repeat, repeat-x;\n background-position: center center, top left;\n color: transparent;\n\n border: 1px solid black;\n border-radius: 2px;\n\n cursor: pointer;\n pointer-events: auto;\n}\n\n.ace_dark .ace_fold {\n}\n\n.ace_fold:hover{\n background-image:\n url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),\n url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");\n}\n\n.ace_tooltip {\n background-color: #FFF;\n background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\n border: 1px solid gray;\n border-radius: 1px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n color: black;\n max-width: 100%;\n padding: 3px 4px;\n position: fixed;\n z-index: 999999;\n box-sizing: border-box;\n cursor: default;\n white-space: pre;\n word-wrap: break-word;\n line-height: normal;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n pointer-events: none;\n}\n\n.ace_folding-enabled > .ace_gutter-cell {\n padding-right: 13px;\n}\n\n.ace_fold-widget {\n box-sizing: border-box;\n\n margin: 0 -12px 0 1px;\n display: none;\n width: 11px;\n vertical-align: top;\n\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");\n background-repeat: no-repeat;\n background-position: center;\n\n border-radius: 3px;\n \n border: 1px solid transparent;\n cursor: pointer;\n}\n\n.ace_folding-enabled .ace_fold-widget {\n display: inline-block; \n}\n\n.ace_fold-widget.ace_end {\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");\n}\n\n.ace_fold-widget.ace_closed {\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");\n}\n\n.ace_fold-widget:hover {\n border: 1px solid rgba(0, 0, 0, 0.3);\n background-color: rgba(255, 255, 255, 0.2);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n}\n\n.ace_fold-widget:active {\n border: 1px solid rgba(0, 0, 0, 0.4);\n background-color: rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n/**\n * Dark version for fold widgets\n */\n.ace_dark .ace_fold-widget {\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");\n}\n.ace_dark .ace_fold-widget.ace_end {\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");\n}\n.ace_dark .ace_fold-widget.ace_closed {\n background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");\n}\n.ace_dark .ace_fold-widget:hover {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n background-color: rgba(255, 255, 255, 0.1);\n}\n.ace_dark .ace_fold-widget:active {\n box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\n}\n\n.ace_inline_button {\n border: 1px solid lightgray;\n display: inline-block;\n margin: -1px 8px;\n padding: 0 5px;\n pointer-events: auto;\n cursor: pointer;\n}\n.ace_inline_button:hover {\n border-color: gray;\n background: rgba(200,200,200,0.2);\n display: inline-block;\n pointer-events: auto;\n}\n\n.ace_fold-widget.ace_invalid {\n background-color: #FFB4B4;\n border-color: #DE5555;\n}\n\n.ace_fade-fold-widgets .ace_fold-widget {\n transition: opacity 0.4s ease 0.05s;\n opacity: 0;\n}\n\n.ace_fade-fold-widgets:hover .ace_fold-widget {\n transition: opacity 0.05s ease 0.05s;\n opacity:1;\n}\n\n.ace_underline {\n text-decoration: underline;\n}\n\n.ace_bold {\n font-weight: bold;\n}\n\n.ace_nobold .ace_bold {\n font-weight: normal;\n}\n\n.ace_italic {\n font-style: italic;\n}\n\n\n.ace_error-marker {\n background-color: rgba(255, 0, 0,0.2);\n position: absolute;\n z-index: 9;\n}\n\n.ace_highlight-marker {\n background-color: rgba(255, 255, 0,0.2);\n position: absolute;\n z-index: 8;\n}\n\n.ace_mobile-menu {\n position: absolute;\n line-height: 1.5;\n border-radius: 4px;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n user-select: none;\n background: white;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #dcdcdc;\n color: black;\n}\n.ace_dark > .ace_mobile-menu {\n background: #333;\n color: #ccc;\n box-shadow: 1px 3px 2px grey;\n border: 1px solid #444;\n\n}\n.ace_mobile-button {\n padding: 2px;\n cursor: pointer;\n overflow: hidden;\n}\n.ace_mobile-button:hover {\n background-color: #eee;\n opacity:1;\n}\n.ace_mobile-button:active {\n background-color: #ddd;\n}\n\n.ace_placeholder {\n font-family: arial;\n transform: scale(0.9);\n transform-origin: left;\n white-space: pre;\n opacity: 0.7;\n margin: 0 10px;\n}\n\n.ace_ghost_text {\n opacity: 0.5;\n font-style: italic;\n}'}),ace.define("ace/layer/decorators",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event_emitter").EventEmitter,o=function(e,t){this.canvas=r.createElement("canvas"),this.renderer=t,this.pixelRatio=1,this.maxHeight=t.layerConfig.maxHeight,this.lineHeight=t.layerConfig.lineHeight,this.canvasHeight=e.parent.scrollHeight,this.heightRatio=this.canvasHeight/this.maxHeight,this.canvasWidth=e.width,this.minDecorationHeight=2*this.pixelRatio|0,this.halfMinDecorationHeight=this.minDecorationHeight/2|0,this.canvas.width=this.canvasWidth,this.canvas.height=this.canvasHeight,this.canvas.style.top="0px",this.canvas.style.right="0px",this.canvas.style.zIndex="7px",this.canvas.style.position="absolute",this.colors={},this.colors.dark={error:"rgba(255, 18, 18, 1)",warning:"rgba(18, 136, 18, 1)",info:"rgba(18, 18, 136, 1)"},this.colors.light={error:"rgb(255,51,51)",warning:"rgb(32,133,72)",info:"rgb(35,68,138)"},e.element.appendChild(this.canvas)};(function(){i.implement(this,s),this.$updateDecorators=function(e){function i(e,t){return e.priorityt.priority?1:0}var t=this.renderer.theme.isDark===!0?this.colors.dark:this.colors.light;if(e){this.maxHeight=e.maxHeight,this.lineHeight=e.lineHeight,this.canvasHeight=e.height;var n=(e.lastRow+1)*this.lineHeight;nthis.canvasHeight&&(v=this.canvasHeight-this.halfMinDecorationHeight),h=Math.round(v-this.halfMinDecorationHeight),p=Math.round(v+this.halfMinDecorationHeight)}r.fillStyle=t[s[a].type]||null,r.fillRect(0,c,this.canvasWidth,p-h)}}var m=this.renderer.session.selection.getCursor();if(m){var l=this.compensateFoldRows(m.row,u),c=Math.round((m.row-l)*this.lineHeight*this.heightRatio);r.fillStyle="rgba(0, 0, 0, 0.5)",r.fillRect(0,c,this.canvasWidth,2)}},this.compensateFoldRows=function(e,t){var n=0;if(t&&t.length>0)for(var r=0;rt[r].start.row&&e=t[r].end.row&&(n+=t[r].end.row-t[r].start.row);return n}}).call(o.prototype),t.Decorator=o}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/scrollbar_custom","ace/scrollbar_custom","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter","ace/css/editor.css","ace/layer/decorators","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./layer/gutter").Gutter,u=e("./layer/marker").Marker,a=e("./layer/text").Text,f=e("./layer/cursor").Cursor,l=e("./scrollbar").HScrollBar,c=e("./scrollbar").VScrollBar,h=e("./scrollbar_custom").HScrollBar,p=e("./scrollbar_custom").VScrollBar,d=e("./renderloop").RenderLoop,v=e("./layer/font_metrics").FontMetrics,m=e("./lib/event_emitter").EventEmitter,g=e("./css/editor.css"),y=e("./layer/decorators").Decorator,b=e("./lib/useragent"),w=b.isIE;i.importCssString(g,"ace_editor.css",!1);var E=function(e,t){var n=this;this.container=e||i.createElement("div"),i.addCssClass(this.container,"ace_editor"),i.HI_DPI&&i.addCssClass(this.container,"ace_hidpi"),this.setTheme(t),s.get("useStrictCSP")==null&&s.set("useStrictCSP",!1),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new o(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new u(this.content);var r=this.$textLayer=new a(this.content);this.canvas=r.element,this.$markerFront=new u(this.content),this.$cursorLayer=new f(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new c(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.on("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.on("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new v(this.container,this.$textLayer.MAX_CHUNK_LENGTH),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.on("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.margin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$keepTextAreaAtCursor=!b.isIOS,this.$loop=new d(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._signal("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,m),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin(),i.setStyle(this.scroller.style,"line-height",this.lineHeight+"px")},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.$customScrollbar&&this.$updateCustomScrollbar(!0)},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var s=0,o=this.$size,u={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};r&&(e||o.height!=r)&&(o.height=r,s|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.setHeight(o.scrollerHeight),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",s|=this.CHANGE_SCROLL);if(n&&(e||o.width!=n)){s|=this.CHANGE_SIZE,o.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,i.setStyle(this.scrollBarH.element.style,"left",t+"px"),i.setStyle(this.scroller.style,"left",t+this.margin.left+"px"),o.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()-this.margin.h),i.setStyle(this.$gutter.style,"left",this.margin.left+"px");var a=this.scrollBarV.getWidth()+"px";i.setStyle(this.scrollBarH.element.style,"right",a),i.setStyle(this.scroller.style,"right",a),i.setStyle(this.scroller.style,"bottom",this.scrollBarH.getHeight()),this.scrollBarH.setWidth(o.scrollerWidth);if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}return o.$dirty=!n||!r,s&&this._signal("resize",u),s},this.onGutterResize=function(e){var t=this.$showGutter?e:0;t!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,t,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):this.$computeLayerConfig()},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.getHighlightIndentGuides=function(){return this.getOption("highlightIndentGuides")},this.setHighlightIndentGuides=function(e){this.setOption("highlightIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=Math.round(this.characterWidth*this.$printMarginColumn+this.$padding)+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$isMousePressed)return;var e=this.textarea.style,t=this.$composition;if(!this.$keepTextAreaAtCursor&&!t){i.translate(this.textarea,-100,0);return}var n=this.$cursorLayer.$pixelPos;if(!n)return;t&&t.markerRange&&(n=this.$cursorLayer.getPixelPosition(t.markerRange.start,!0));var r=this.layerConfig,s=n.top,o=n.left;s-=r.offset;var u=t&&t.useTextareaForIME?this.lineHeight:w?0:1;if(s<0||s>r.height-u){i.translate(this.textarea,0,0);return}var a=1,f=this.$size.height-u;if(!t)s+=this.lineHeight;else if(t.useTextareaForIME){var l=this.textarea.value;a=this.characterWidth*this.session.$getStringScreenWidth(l)[0]}else s+=this.lineHeight+2;o-=this.scrollLeft,o>this.$size.scrollerWidth-a&&(o=this.$size.scrollerWidth-a),o+=this.gutterWidth+this.margin.left,i.setStyle(e,"height",u+"px"),i.setStyle(e,"width",a+"px"),i.translate(this.textarea,Math.min(o,this.$size.scrollerWidth-a),Math.min(s,f))},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.setMargin=function(e,t,n,r){var i=this.margin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,this.$updateCachedSize(!0,this.gutterWidth,this.$size.width,this.$size.height),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender",e),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig()|this.$loop.clear();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig()|this.$loop.clear())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),i.translate(this.content,-this.scrollLeft,-n.offset);var s=n.width+2*this.$padding+"px",o=n.minHeight+"px";i.setStyle(this.content.style,"width",s),i.setStyle(this.content.style,"height",o)}e&this.CHANGE_H_SCROLL&&(i.translate(this.content,-this.scrollLeft,-n.offset),this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$customScrollbar&&this.$scrollDecorator.$updateDecorators(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender",e);return}if(e&this.CHANGE_SCROLL){this.$changedLines=null,e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&(e&this.CHANGE_GUTTER||e&this.CHANGE_LINES?this.$gutterLayer.update(n):this.$gutterLayer.scrollLines(n)),this.$customScrollbar&&this.$scrollDecorator.$updateDecorators(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this._signal("afterRender",e);return}e&this.CHANGE_TEXT?(this.$changedLines=null,this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$customScrollbar&&this.$scrollDecorator.$updateDecorators(n)):e&this.CHANGE_LINES?((this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n),this.$customScrollbar&&this.$scrollDecorator.$updateDecorators(n)):e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER?(this.$showGutter&&this.$gutterLayer.update(n),this.$customScrollbar&&this.$scrollDecorator.$updateDecorators(n)):e&this.CHANGE_CURSOR&&(this.$highlightGutterLine&&this.$gutterLayer.updateLineHighlight(n),this.$customScrollbar&&this.$scrollDecorator.$updateDecorators(n)),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender",e)},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&n>this.$maxPixelHeight&&(n=this.$maxPixelHeight);var r=n<=2*this.lineHeight,i=!r&&e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||i!=this.$vScroll){i!=this.$vScroll&&(this.$vScroll=i,this.scrollBarV.setVisible(i));var s=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,s,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=t.scrollerHeight+this.lineHeight,l=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=l;var c=this.scrollMargin;this.session.setScrollTop(Math.max(-c.top,Math.min(this.scrollTop,i-t.scrollerHeight+c.bottom))),this.session.setScrollLeft(Math.max(-c.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+c.right)));var h=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+l<0||this.scrollTop>c.top),p=a!==h;p&&(this.$vScroll=h,this.scrollBarV.setVisible(h));var d=this.scrollTop%this.lineHeight,v=Math.ceil(f/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-d)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),f=t.scrollerHeight+e.getRowLength(g)*w+b,d=this.scrollTop-y*w;var S=0;if(this.layerConfig.width!=s||u)S=this.CHANGE_H_SCROLL;if(u||p)S|=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:f,maxHeight:i,offset:d,gutterOffset:w?Math.max(0,Math.ceil((d+t.height-t.scrollerHeight)/w)):0,height:this.$size.scrollerHeight},this.session.$bidiHandler&&this.session.$bidiHandler.setContentWidth(s-this.$padding),S},this.$updateLines=function(){if(!this.$changedLines)return;var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(tthis.$textLayer.MAX_LINE_LENGTH&&(e=this.$textLayer.MAX_LINE_LENGTH+30),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t,n){if(this.$size.scrollerHeight===0)return;var r=this.$cursorLayer.getPixelPosition(e),i=r.left,s=r.top,o=n&&n.top||0,u=n&&n.bottom||0;this.$scrollAnimation&&(this.$stopAnimation=!0);var a=this.$scrollAnimation?this.session.getScrollTop():this.scrollTop;a+o>s?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-u=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),u=this.$blockCursor?Math.floor(s):Math.round(s);return{row:o,column:u,side:s-u>0?1:-1,offsetX:i}},this.screenToTextCoordinates=function(e,t){var n;if(this.$hasCssTransforms){n={top:0,left:0};var r=this.$fontMetrics.transformCoordinates([e,t]);e=r[1]-this.gutterWidth-this.margin.left,t=r[0]}else n=this.scroller.getBoundingClientRect();var i=e+this.scrollLeft-n.left-this.$padding,s=i/this.characterWidth,o=this.$blockCursor?Math.floor(s):Math.round(s),u=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(u,Math.max(o,0),i)},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+(this.session.$bidiHandler.isBidiRow(r.row,e)?this.session.$bidiHandler.getPosLeft(r.column):Math.round(r.column*this.characterWidth)),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition=e,e.cssText||(e.cssText=this.textarea.style.cssText),e.useTextareaForIME==undefined&&(e.useTextareaForIME=this.$useTextareaForIME),this.$useTextareaForIME?(i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor(),this.$cursorLayer.element.style.display="none"):e.markerId=this.session.addMarker(e.markerRange,"ace_composition_marker","text")},this.setCompositionText=function(e){var t=this.session.selection.cursor;this.addToken(e,"composition_placeholder",t.row,t.column),this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;this.$composition.markerId&&this.session.removeMarker(this.$composition.markerId),i.removeCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText=this.$composition.cssText;var e=this.session.selection.cursor;this.removeExtraToken(e.row,e.column),this.$composition=null,this.$cursorLayer.element.style.display=""},this.setGhostText=function(e,t){var n=this.session.selection.cursor,r=t||{row:n.row,column:n.column};this.removeGhostText();var i=e.split("\n");this.addToken(i[0],"ghost_text",r.row,r.column),this.$ghostText={text:e,position:{row:r.row,column:r.column}},i.length>1&&(this.$ghostTextWidget={text:i.slice(1).join("\n"),row:r.row,column:r.column,className:"ace_ghost_text"},this.session.widgetManager.addLineWidget(this.$ghostTextWidget))},this.removeGhostText=function(){if(!this.$ghostText)return;var e=this.$ghostText.position;this.removeExtraToken(e.row,e.column),this.$ghostTextWidget&&(this.session.widgetManager.removeLineWidget(this.$ghostTextWidget),this.$ghostTextWidget=null),this.$ghostText=null},this.addToken=function(e,t,n,r){var i=this.session;i.bgTokenizer.lines[n]=null;var s={type:t,value:e},o=i.getTokens(n);if(r==null)o.push(s);else{var u=0;for(var a=0;a50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})}}).call(f.prototype);var l=function(e,t,n){var r=null,i=!1,u=Object.create(s),a=[],l=new f({messageBuffer:a,terminate:function(){},postMessage:function(e){a.push(e);if(!r)return;i?setTimeout(c):c()}});l.setEmitSync=function(e){i=e};var c=function(){var e=a.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};return u.postMessage=function(e){l.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.length)c()}),l};t.UIWorkerClient=l,t.WorkerClient=f,t.createWorker=a}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate,!0),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.off("change",this.$onUpdate),this.session.selection.off("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1?e.multiSelect.joinSelections():e.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Alt-L",mac:"Ctrl-Alt-L"},readOnly:!0},{name:"splitSelectionIntoLines",description:"Split into lines",exec:function(e){e.multiSelect.splitIntoLines()},readOnly:!0},{name:"alignCursors",description:"Align cursors",exec:function(e){e.alignCursors()},bindKey:{win:"Ctrl-Alt-A",mac:"Ctrl-Alt-A"},scrollIntoView:"cursor"},{name:"findAll",description:"Find all",exec:function(e){e.findAll()},bindKey:{win:"Ctrl-Alt-K",mac:"Ctrl-Alt-G"},scrollIntoView:"cursor",readOnly:!0}],t.multiSelectCommands=[{name:"singleSelection",description:"Single selection",bindKey:"esc",exec:function(e){e.exitMultiSelectMode()},scrollIntoView:"cursor",readOnly:!0,isAvailable:function(e){return e&&e.inMultiSelectMode}}];var r=e("../keyboard/hash_handler").HashHandler;t.keyboardHandler=new r(t.multiSelectCommands)}),ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"],function(e,t,n){function h(e,t,n){return c.$options.wrap=!0,c.$options.needle=t,c.$options.backwards=n==-1,c.find(e)}function v(e,t){return e.row==t.row&&e.column==t.column}function m(e){if(e.$multiselectOnSessionChange)return;e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),e.$multiselectOnSessionChange=t.onSessionChange.bind(e),e.$checkMultiselectChange=e.$checkMultiselectChange.bind(e),e.$multiselectOnSessionChange(e),e.on("changeSession",e.$multiselectOnSessionChange),e.on("mousedown",o),e.commands.addCommands(f.defaultCommands),g(e)}function g(e){function r(t){n&&(e.renderer.setMouseCursor(""),n=!1)}if(!e.textInput)return;var t=e.textInput.getElement(),n=!1;u.addListener(t,"keydown",function(t){var i=t.keyCode==18&&!(t.ctrlKey||t.shiftKey||t.metaKey);e.$blockSelectEnabled&&i?n||(e.renderer.setMouseCursor("crosshair"),n=!0):n&&r()},e),u.addListener(t,"keyup",r,e),u.addListener(t,"blur",r,e)}var r=e("./range_list").RangeList,i=e("./range").Range,s=e("./selection").Selection,o=e("./mouse/multi_select_handler").onMouseDown,u=e("./lib/event"),a=e("./lib/lang"),f=e("./commands/multi_select_commands");t.commands=f.defaultCommands.concat(f.multiSelectCommands);var l=e("./search").Search,c=new l,p=e("./edit_session").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(p.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(e,t){if(!e)return;if(!this.inMultiSelectMode&&this.rangeCount===0){var n=this.toOrientedRange();this.rangeList.add(n),this.rangeList.add(e);if(this.rangeList.ranges.length!=2)return this.rangeList.removeAll(),t||this.fromOrientedRange(e);this.rangeList.removeAll(),this.rangeList.add(n),this.$onAddRange(n)}e.cursor||(e.cursor=e.end);var r=this.rangeList.add(e);return this.$onAddRange(e),r.length&&this.$onRemoveRange(r),this.rangeCount>1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length&&this.$onRemoveRange(e)},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){var e=this.ranges.length?this.ranges:[this.getRange()],t=[];for(var n=0;n1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.cursor),s=this.session.documentToScreenPosition(this.anchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)g--;if(g>0){var y=0;while(r[y].isEmpty())y++}for(var b=g;b>=y;b--)r[b].isEmpty()&&r.splice(b,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges(),u.ranges[0]&&u.fromOrientedRange(u.ranges[0]);var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var p=e.getLine(l).length;return new r(f,u,l,p)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
    "),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString("\n .error_widget_wrapper {\n background: inherit;\n color: inherit;\n border:none\n }\n .error_widget {\n border-top: solid 2px;\n border-bottom: solid 2px;\n margin: 5px 0;\n padding: 10px 40px;\n white-space: pre-wrap;\n }\n .error_widget.ace_error, .error_widget_arrow.ace_error{\n border-color: #ff5a5a\n }\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\n border-color: #F1D817\n }\n .error_widget.ace_info, .error_widget_arrow.ace_info{\n border-color: #5a5a5a\n }\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\n border-color: #5aaa5a\n }\n .error_widget_arrow {\n position: absolute;\n border: solid 5px;\n border-top-color: transparent!important;\n border-right-color: transparent!important;\n border-left-color: transparent!important;\n top: -5px;\n }\n","error_marker.css",!1)}),ace.define("ace/ace",["require","exports","module","ace/lib/dom","ace/lib/event","ace/range","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config","ace/loader_build"],function(e,t,n){"use strict";e("./loader_build")(t);var r=e("./lib/dom"),i=e("./lib/event"),s=e("./range").Range,o=e("./editor").Editor,u=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,f=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.edit=function(e,n){if(typeof e=="string"){var s=e;e=document.getElementById(s);if(!e)throw new Error("ace.edit can't find div #"+s)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var u="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;u=a.value,e=r.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(u=e.textContent,e.innerHTML="");var l=t.createEditSession(u),c=new o(new f(e),l,n),h={document:l,editor:c,onResize:c.resize.bind(c,null)};return a&&(h.textarea=a),i.addListener(window,"resize",h.onResize),c.on("destroy",function(){i.removeListener(window,"resize",h.onResize),h.editor.container.env=null}),c.container.env=c.env=h,c},t.createEditSession=function(e,t){var n=new u(e,t);return n.setUndoManager(new a),n},t.Range=s,t.Editor=o,t.EditSession=u,t.UndoManager=a,t.VirtualRenderer=f,t.version=t.config.version}); (function() { + ace.require(["ace/ace"], function(a) { + if (a) { + a.config.init(true); + a.define = ace.define; + } + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + window.ace["default"] = window.ace; + if (typeof module == "object" && typeof exports == "object" && module) { + module.exports = window.ace; + } + }); + })(); + \ No newline at end of file diff --git a/web/static/js/demo-theme.min.js b/web/static/js/demo-theme.min.js new file mode 100644 index 0000000..89ed4fb --- /dev/null +++ b/web/static/js/demo-theme.min.js @@ -0,0 +1,9 @@ +/*! +* Tabler v1.0.0-beta16 (https://tabler.io) +* @version 1.0.0-beta16 +* @link https://tabler.io +* Copyright 2018-2022 The Tabler Authors +* Copyright 2018-2022 codecalm.net Paweł Kuna +* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE) +*/ +!function(e){"function"==typeof define&&define.amd?define(e):e()}((function(){"use strict";var e,t="tablerTheme",n=new Proxy(new URLSearchParams(window.location.search),{get:function(e,t){return e.get(t)}});if(n.theme)localStorage.setItem(t,n.theme),e=n.theme;else{var o=localStorage.getItem(t);e=o||"light"}document.body.classList.remove("theme-dark","theme-light"),document.body.classList.add("theme-".concat(e))})); \ No newline at end of file diff --git a/web/static/js/demo.min.js b/web/static/js/demo.min.js new file mode 100644 index 0000000..3630fea --- /dev/null +++ b/web/static/js/demo.min.js @@ -0,0 +1,9 @@ +/*! +* Tabler v1.0.0-beta16 (https://tabler.io) +* @version 1.0.0-beta16 +* @link https://tabler.io +* Copyright 2018-2022 The Tabler Authors +* Copyright 2018-2022 codecalm.net Paweł Kuna +* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE) +*/ +!function(t){"function"==typeof define&&define.amd?define(t):t()}((function(){"use strict";function t(t,r){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null==r)return;var n,o,a=[],l=!0,i=!1;try{for(r=r.call(t);!(l=(n=r.next()).done)&&(a.push(n.value),!e||a.length!==e);l=!0);}catch(t){i=!0,o=t}finally{try{l||null==r.return||r.return()}finally{if(i)throw o}}return a}(t,r)||function(t,r){if(!t)return;if("string"==typeof t)return e(t,r);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return e(t,r)}(t,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r'+a+""}).then(function(a){return''+a+""}).then(function(a){return"data:image/svg+xml;charset=utf-8,"+a})}function m(){function a(){var a="application/font-woff",b="image/jpeg";return{woff:a,woff2:a,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:b,jpeg:b,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml"}}function b(a){var b=/\.([^\.\/]*?)$/g.exec(a);return b?b[1]:""}function c(c){var d=b(c).toLowerCase();return a()[d]||""}function d(a){return a.search(/^(data:)/)!==-1}function e(a){return new Promise(function(b){for(var c=window.atob(a.toDataURL().split(",")[1]),d=c.length,e=new Uint8Array(d),f=0;f1?t-1:0),n=1;n'),this.element.appendChild(e));var l=e.getElementsByTagName("span")[0];return l&&(null!=l.textContent?l.textContent=this.options.dictFallbackMessage:null!=l.innerText&&(l.innerText=this.options.dictFallbackMessage)),this.element.appendChild(this.getFallbackForm())},resize:function(e,t,i,n){var r={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},a=e.width/e.height;null==t&&null==i?(t=r.srcWidth,i=r.srcHeight):null==t?t=i*a:null==i&&(i=t/a);var o=(t=Math.min(t,r.srcWidth))/(i=Math.min(i,r.srcHeight));if(r.srcWidth>t||r.srcHeight>i)if("crop"===n)a>o?(r.srcHeight=e.height,r.srcWidth=r.srcHeight*o):(r.srcWidth=e.width,r.srcHeight=r.srcWidth/o);else{if("contain"!==n)throw new Error("Unknown resizeMethod '".concat(n,"'"));a>o?i=t/a:t=i*a}return r.srcX=(e.width-r.srcWidth)/2,r.srcY=(e.height-r.srcHeight)/2,r.trgWidth=t,r.trgHeight=i,r},transformFile:function(e,t){return(this.options.resizeWidth||this.options.resizeHeight)&&e.type.match(/image.*/)?this.resizeImage(e,this.options.resizeWidth,this.options.resizeHeight,this.options.resizeMethod,t):t(e)},previewTemplate:e('

    '),drop:function(e){return this.element.classList.remove("dz-drag-hover")},dragstart:function(e){},dragend:function(e){return this.element.classList.remove("dz-drag-hover")},dragenter:function(e){return this.element.classList.add("dz-drag-hover")},dragover:function(e){return this.element.classList.add("dz-drag-hover")},dragleave:function(e){return this.element.classList.remove("dz-drag-hover")},paste:function(e){},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){if(this.element===this.previewsContainer&&this.element.classList.add("dz-started"),this.previewsContainer&&!this.options.disablePreviews){var t=this;e.previewElement=f.createElement(this.options.previewTemplate.trim()),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement);var i=!0,n=!1,r=void 0;try{for(var a,o=e.previewElement.querySelectorAll("[data-dz-name]")[Symbol.iterator]();!(i=(a=o.next()).done);i=!0){var l=a.value;l.textContent=e.name}}catch(e){n=!0,r=e}finally{try{i||null==o.return||o.return()}finally{if(n)throw r}}var s=!0,u=!1,c=void 0;try{for(var d,h=e.previewElement.querySelectorAll("[data-dz-size]")[Symbol.iterator]();!(s=(d=h.next()).done);s=!0)(l=d.value).innerHTML=this.filesize(e.size)}catch(e){u=!0,c=e}finally{try{s||null==h.return||h.return()}finally{if(u)throw c}}this.options.addRemoveLinks&&(e._removeLink=f.createElement(''.concat(this.options.dictRemoveFile,"")),e.previewElement.appendChild(e._removeLink));var p=function(i){var n=t;if(i.preventDefault(),i.stopPropagation(),e.status===f.UPLOADING)return f.confirm(t.options.dictCancelUploadConfirmation,(function(){return n.removeFile(e)}));var r=t;return t.options.dictRemoveFileConfirmation?f.confirm(t.options.dictRemoveFileConfirmation,(function(){return r.removeFile(e)})):t.removeFile(e)},m=!0,v=!1,y=void 0;try{for(var g,b=e.previewElement.querySelectorAll("[data-dz-remove]")[Symbol.iterator]();!(m=(g=b.next()).done);m=!0){g.value.addEventListener("click",p)}}catch(e){v=!0,y=e}finally{try{m||null==b.return||b.return()}finally{if(v)throw y}}}},removedfile:function(e){return null!=e.previewElement&&null!=e.previewElement.parentNode&&e.previewElement.parentNode.removeChild(e.previewElement),this._updateMaxFilesReachedClass()},thumbnail:function(e,t){if(e.previewElement){e.previewElement.classList.remove("dz-file-preview");var i=!0,n=!1,r=void 0;try{for(var a,o=e.previewElement.querySelectorAll("[data-dz-thumbnail]")[Symbol.iterator]();!(i=(a=o.next()).done);i=!0){var l=a.value;l.alt=e.name,l.src=t}}catch(e){n=!0,r=e}finally{try{i||null==o.return||o.return()}finally{if(n)throw r}}return setTimeout((function(){return e.previewElement.classList.add("dz-image-preview")}),1)}},error:function(e,t){if(e.previewElement){e.previewElement.classList.add("dz-error"),"string"!=typeof t&&t.error&&(t=t.error);var i=!0,n=!1,r=void 0;try{for(var a,o=e.previewElement.querySelectorAll("[data-dz-errormessage]")[Symbol.iterator]();!(i=(a=o.next()).done);i=!0){a.value.textContent=t}}catch(e){n=!0,r=e}finally{try{i||null==o.return||o.return()}finally{if(n)throw r}}}},errormultiple:function(){},processing:function(e){if(e.previewElement&&(e.previewElement.classList.add("dz-processing"),e._removeLink))return e._removeLink.innerHTML=this.options.dictCancelUpload},processingmultiple:function(){},uploadprogress:function(e,t,i){var n=!0,r=!1,a=void 0;if(e.previewElement)try{for(var o,l=e.previewElement.querySelectorAll("[data-dz-uploadprogress]")[Symbol.iterator]();!(n=(o=l.next()).done);n=!0){var s=o.value;"PROGRESS"===s.nodeName?s.value=t:s.style.width="".concat(t,"%")}}catch(e){r=!0,a=e}finally{try{n||null==l.return||l.return()}finally{if(r)throw a}}},totaluploadprogress:function(){},sending:function(){},sendingmultiple:function(){},success:function(e){if(e.previewElement)return e.previewElement.classList.add("dz-success")},successmultiple:function(){},canceled:function(e){return this.emit("error",e,this.options.dictUploadCanceled)},canceledmultiple:function(){},complete:function(e){if(e._removeLink&&(e._removeLink.innerHTML=this.options.dictRemoveFile),e.previewElement)return e.previewElement.classList.add("dz-complete")},completemultiple:function(){},maxfilesexceeded:function(){},maxfilesreached:function(){},queuecomplete:function(){},addedfiles:function(){}},f=function(n){"use strict";function o(n,r){var l,c,d,h;if(i(this,o),(l=s(this,(c=o,a(c)).call(this))).element=n,l.clickableElements=[],l.listeners=[],l.files=[],"string"==typeof l.element&&(l.element=document.querySelector(l.element)),!l.element||null==l.element.nodeType)throw new Error("Invalid dropzone element.");if(l.element.dropzone)throw new Error("Dropzone already attached.");o.instances.push(t(l)),l.element.dropzone=t(l);var f=null!=(h=o.optionsForElement(l.element))?h:{};if(l.options=e(u)(!0,{},p,f,null!=r?r:{}),l.options.previewTemplate=l.options.previewTemplate.replace(/\n*/g,""),l.options.forceFallback||!o.isBrowserSupported())return s(l,l.options.fallback.call(t(l)));if(null==l.options.url&&(l.options.url=l.element.getAttribute("action")),!l.options.url)throw new Error("No URL provided.");if(l.options.acceptedFiles&&l.options.acceptedMimeTypes)throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");if(l.options.uploadMultiple&&l.options.chunking)throw new Error("You cannot set both: uploadMultiple and chunking.");if(l.options.binaryBody&&l.options.uploadMultiple)throw new Error("You cannot set both: binaryBody and uploadMultiple.");return l.options.acceptedMimeTypes&&(l.options.acceptedFiles=l.options.acceptedMimeTypes,delete l.options.acceptedMimeTypes),null!=l.options.renameFilename&&(l.options.renameFile=function(e){return l.options.renameFilename.call(t(l),e.name,e)}),"string"==typeof l.options.method&&(l.options.method=l.options.method.toUpperCase()),(d=l.getExistingFallback())&&d.parentNode&&d.parentNode.removeChild(d),!1!==l.options.previewsContainer&&(l.options.previewsContainer?l.previewsContainer=o.getElement(l.options.previewsContainer,"previewsContainer"):l.previewsContainer=l.element),l.options.clickable&&(!0===l.options.clickable?l.clickableElements=[l.element]:l.clickableElements=o.getElements(l.options.clickable,"clickable")),l.init(),l}return l(o,n),r(o,[{key:"getAcceptedFiles",value:function(){return this.files.filter((function(e){return e.accepted})).map((function(e){return e}))}},{key:"getRejectedFiles",value:function(){return this.files.filter((function(e){return!e.accepted})).map((function(e){return e}))}},{key:"getFilesWithStatus",value:function(e){return this.files.filter((function(t){return t.status===e})).map((function(e){return e}))}},{key:"getQueuedFiles",value:function(){return this.getFilesWithStatus(o.QUEUED)}},{key:"getUploadingFiles",value:function(){return this.getFilesWithStatus(o.UPLOADING)}},{key:"getAddedFiles",value:function(){return this.getFilesWithStatus(o.ADDED)}},{key:"getActiveFiles",value:function(){return this.files.filter((function(e){return e.status===o.UPLOADING||e.status===o.QUEUED})).map((function(e){return e}))}},{key:"init",value:function(){var e=this,t=this,i=this,n=this,r=this,a=this,l=this,s=this,u=this,c=this,d=this;if("form"===this.element.tagName&&this.element.setAttribute("enctype","multipart/form-data"),this.element.classList.contains("dropzone")&&!this.element.querySelector(".dz-message")&&this.element.appendChild(o.createElement('
    "))),this.clickableElements.length){var h=this,p=function(){var e=h;h.hiddenFileInput&&h.hiddenFileInput.parentNode.removeChild(h.hiddenFileInput),h.hiddenFileInput=document.createElement("input"),h.hiddenFileInput.setAttribute("type","file"),(null===h.options.maxFiles||h.options.maxFiles>1)&&h.hiddenFileInput.setAttribute("multiple","multiple"),h.hiddenFileInput.className="dz-hidden-input",null!==h.options.acceptedFiles&&h.hiddenFileInput.setAttribute("accept",h.options.acceptedFiles),null!==h.options.capture&&h.hiddenFileInput.setAttribute("capture",h.options.capture),h.hiddenFileInput.setAttribute("tabindex","-1"),h.hiddenFileInput.style.visibility="hidden",h.hiddenFileInput.style.position="absolute",h.hiddenFileInput.style.top="0",h.hiddenFileInput.style.left="0",h.hiddenFileInput.style.height="0",h.hiddenFileInput.style.width="0",o.getElement(h.options.hiddenInputContainer,"hiddenInputContainer").appendChild(h.hiddenFileInput),h.hiddenFileInput.addEventListener("change",(function(){var t=e.hiddenFileInput.files,i=!0,n=!1,r=void 0;if(t.length)try{for(var a,o=t[Symbol.iterator]();!(i=(a=o.next()).done);i=!0){var l=a.value;e.addFile(l)}}catch(e){n=!0,r=e}finally{try{i||null==o.return||o.return()}finally{if(n)throw r}}e.emit("addedfiles",t),p()}))};p()}this.URL=null!==window.URL?window.URL:window.webkitURL;var f=!0,m=!1,v=void 0;try{for(var y,g=this.events[Symbol.iterator]();!(f=(y=g.next()).done);f=!0){var b=y.value;this.on(b,this.options[b])}}catch(e){m=!0,v=e}finally{try{f||null==g.return||g.return()}finally{if(m)throw v}}this.on("uploadprogress",(function(){return e.updateTotalUploadProgress()})),this.on("removedfile",(function(){return t.updateTotalUploadProgress()})),this.on("canceled",(function(e){return i.emit("complete",e)})),this.on("complete",(function(e){var t=n;if(0===n.getAddedFiles().length&&0===n.getUploadingFiles().length&&0===n.getQueuedFiles().length)return setTimeout((function(){return t.emit("queuecomplete")}),0)}));var k=function(e){if(function(e){if(e.dataTransfer.types)for(var t=0;t")),i+='');var n=o.createElement(i);return"FORM"!==this.element.tagName?(t=o.createElement('
    '))).appendChild(n):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=t?t:n}},{key:"getExistingFallback",value:function(){var e=function(e){var t=!0,i=!1,n=void 0;try{for(var r,a=e[Symbol.iterator]();!(t=(r=a.next()).done);t=!0){var o=r.value;if(/(^| )fallback($| )/.test(o.className))return o}}catch(e){i=!0,n=e}finally{try{t||null==a.return||a.return()}finally{if(i)throw n}}},t=!0,i=!1,n=void 0;try{for(var r,a=["div","form"][Symbol.iterator]();!(t=(r=a.next()).done);t=!0){var o,l=r.value;if(o=e(this.element.getElementsByTagName(l)))return o}}catch(e){i=!0,n=e}finally{try{t||null==a.return||a.return()}finally{if(i)throw n}}}},{key:"setupEventListeners",value:function(){return this.listeners.map((function(e){return function(){var t=[];for(var i in e.events){var n=e.events[i];t.push(e.element.addEventListener(i,n,!1))}return t}()}))}},{key:"removeEventListeners",value:function(){return this.listeners.map((function(e){return function(){var t=[];for(var i in e.events){var n=e.events[i];t.push(e.element.removeEventListener(i,n,!1))}return t}()}))}},{key:"disable",value:function(){var e=this;return this.clickableElements.forEach((function(e){return e.classList.remove("dz-clickable")})),this.removeEventListeners(),this.disabled=!0,this.files.map((function(t){return e.cancelUpload(t)}))}},{key:"enable",value:function(){return delete this.disabled,this.clickableElements.forEach((function(e){return e.classList.add("dz-clickable")})),this.setupEventListeners()}},{key:"filesize",value:function(e){var t=0,i="b";if(e>0){for(var n=["tb","gb","mb","kb","b"],r=0;r=Math.pow(this.options.filesizeBase,4-r)/10){t=e/Math.pow(this.options.filesizeBase,4-r),i=a;break}}t=Math.round(10*t)/10}return"".concat(t," ").concat(this.options.dictFileSizeUnits[i])}},{key:"_updateMaxFilesReachedClass",value:function(){return null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(this.getAcceptedFiles().length===this.options.maxFiles&&this.emit("maxfilesreached",this.files),this.element.classList.add("dz-max-files-reached")):this.element.classList.remove("dz-max-files-reached")}},{key:"drop",value:function(e){if(e.dataTransfer){this.emit("drop",e);for(var t=[],i=0;i0){var n=!0,r=!1,o=void 0;try{for(var l,s=i[Symbol.iterator]();!(n=(l=s.next()).done);n=!0){var u=l.value,c=e;u.isFile?u.file((function(e){if(!c.options.ignoreHiddenFiles||"."!==e.name.substring(0,1))return e.fullPath="".concat(t,"/").concat(e.name),c.addFile(e)})):u.isDirectory&&e._addFilesFromDirectory(u,"".concat(t,"/").concat(u.name))}}catch(e){r=!0,o=e}finally{try{n||null==s.return||s.return()}finally{if(r)throw o}}a()}return null}),r)};return a()}},{key:"accept",value:function(e,t){this.options.maxFilesize&&e.size>1048576*this.options.maxFilesize?t(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):o.isValidFile(e,this.options.acceptedFiles)?null!=this.options.maxFiles&&this.getAcceptedFiles().length>=this.options.maxFiles?(t(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}",this.options.maxFiles)),this.emit("maxfilesexceeded",e)):this.options.accept.call(this,e,t):t(this.options.dictInvalidFileType)}},{key:"addFile",value:function(e){var t=this;e.upload={uuid:o.uuidv4(),progress:0,total:e.size,bytesSent:0,filename:this._renameFile(e)},this.files.push(e),e.status=o.ADDED,this.emit("addedfile",e),this._enqueueThumbnail(e),this.accept(e,(function(i){i?(e.accepted=!1,t._errorProcessing([e],i)):(e.accepted=!0,t.options.autoQueue&&t.enqueueFile(e)),t._updateMaxFilesReachedClass()}))}},{key:"enqueueFiles",value:function(e){var t=!0,i=!1,n=void 0;try{for(var r,a=e[Symbol.iterator]();!(t=(r=a.next()).done);t=!0){var o=r.value;this.enqueueFile(o)}}catch(e){i=!0,n=e}finally{try{t||null==a.return||a.return()}finally{if(i)throw n}}return null}},{key:"enqueueFile",value:function(e){if(e.status!==o.ADDED||!0!==e.accepted)throw new Error("This file can't be queued because it has already been processed or was rejected.");var t=this;if(e.status=o.QUEUED,this.options.autoProcessQueue)return setTimeout((function(){return t.processQueue()}),0)}},{key:"_enqueueThumbnail",value:function(e){if(this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1048576*this.options.maxThumbnailFilesize){var t=this;return this._thumbnailQueue.push(e),setTimeout((function(){return t._processThumbnailQueue()}),0)}}},{key:"_processThumbnailQueue",value:function(){var e=this;if(!this._processingThumbnail&&0!==this._thumbnailQueue.length){this._processingThumbnail=!0;var t=this._thumbnailQueue.shift();return this.createThumbnail(t,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,!0,(function(i){return e.emit("thumbnail",t,i),e._processingThumbnail=!1,e._processThumbnailQueue()}))}}},{key:"removeFile",value:function(e){if(e.status===o.UPLOADING&&this.cancelUpload(e),this.files=m(this.files,e),this.emit("removedfile",e),0===this.files.length)return this.emit("reset")}},{key:"removeAllFiles",value:function(e){null==e&&(e=!1);var t=!0,i=!1,n=void 0;try{for(var r,a=this.files.slice()[Symbol.iterator]();!(t=(r=a.next()).done);t=!0){var l=r.value;(l.status!==o.UPLOADING||e)&&this.removeFile(l)}}catch(e){i=!0,n=e}finally{try{t||null==a.return||a.return()}finally{if(i)throw n}}return null}},{key:"resizeImage",value:function(e,t,i,n,r){var a=this;return this.createThumbnail(e,t,i,n,!0,(function(t,i){if(null==i)return r(e);var n=a.options.resizeMimeType;null==n&&(n=e.type);var l=i.toDataURL(n,a.options.resizeQuality);return"image/jpeg"!==n&&"image/jpg"!==n||(l=g.restore(e.dataURL,l)),r(o.dataURItoBlob(l))}))}},{key:"createThumbnail",value:function(e,t,i,n,r,a){var o=this,l=new FileReader;l.onload=function(){e.dataURL=l.result,"image/svg+xml"!==e.type?o.createThumbnailFromUrl(e,t,i,n,r,a):null!=a&&a(l.result)},l.readAsDataURL(e)}},{key:"displayExistingFile",value:function(e,t,i,n,r){var a=void 0===r||r;if(this.emit("addedfile",e),this.emit("complete",e),a){var o=this;e.dataURL=t,this.createThumbnailFromUrl(e,this.options.thumbnailWidth,this.options.thumbnailHeight,this.options.thumbnailMethod,this.options.fixOrientation,(function(t){o.emit("thumbnail",e,t),i&&i()}),n)}else this.emit("thumbnail",e,t),i&&i()}},{key:"createThumbnailFromUrl",value:function(e,t,i,n,r,a,o){var l=this,s=document.createElement("img");return o&&(s.crossOrigin=o),r="from-image"!=getComputedStyle(document.body).imageOrientation&&r,s.onload=function(){var o=l,u=function(e){return e(1)};return"undefined"!=typeof EXIF&&null!==EXIF&&r&&(u=function(e){return EXIF.getData(s,(function(){return e(EXIF.getTag(this,"Orientation"))}))}),u((function(r){e.width=s.width,e.height=s.height;var l=o.options.resize.call(o,e,t,i,n),u=document.createElement("canvas"),c=u.getContext("2d");switch(u.width=l.trgWidth,u.height=l.trgHeight,r>4&&(u.width=l.trgHeight,u.height=l.trgWidth),r){case 2:c.translate(u.width,0),c.scale(-1,1);break;case 3:c.translate(u.width,u.height),c.rotate(Math.PI);break;case 4:c.translate(0,u.height),c.scale(1,-1);break;case 5:c.rotate(.5*Math.PI),c.scale(1,-1);break;case 6:c.rotate(.5*Math.PI),c.translate(0,-u.width);break;case 7:c.rotate(.5*Math.PI),c.translate(u.height,-u.width),c.scale(-1,1);break;case 8:c.rotate(-.5*Math.PI),c.translate(-u.height,0)}y(c,s,null!=l.srcX?l.srcX:0,null!=l.srcY?l.srcY:0,l.srcWidth,l.srcHeight,null!=l.trgX?l.trgX:0,null!=l.trgY?l.trgY:0,l.trgWidth,l.trgHeight);var d=u.toDataURL("image/png");if(null!=a)return a(d,u)}))},null!=a&&(s.onerror=a),s.src=e.dataURL}},{key:"processQueue",value:function(){var e=this.options.parallelUploads,t=this.getUploadingFiles().length,i=t;if(!(t>=e)){var n=this.getQueuedFiles();if(n.length>0){if(this.options.uploadMultiple)return this.processFiles(n.slice(0,e-t));for(;i1?t-1:0),n=1;nt.options.chunkSize),e[0].upload.totalChunkCount=Math.ceil(n.size/t.options.chunkSize)}if(e[0].upload.chunked){var r=t,a=t,l=e[0];n=i[0];l.upload.chunks=[];var s=function(){for(var t=0;void 0!==l.upload.chunks[t];)t++;if(!(t>=l.upload.totalChunkCount)){0;var i=t*r.options.chunkSize,a=Math.min(i+r.options.chunkSize,n.size),s={name:r._getParamName(0),data:n.webkitSlice?n.webkitSlice(i,a):n.slice(i,a),filename:l.upload.filename,chunkIndex:t};l.upload.chunks[t]={file:l,index:t,dataBlock:s,status:o.UPLOADING,progress:0,retries:0},r._uploadData(e,[s])}};if(l.upload.finishedChunkUpload=function(t,i){var n=a,r=!0;t.status=o.SUCCESS,t.dataBlock=null,t.response=t.xhr.responseText,t.responseHeaders=t.xhr.getAllResponseHeaders(),t.xhr=null;for(var u=0;u=o;l?a++:a--)r[a]=t.charCodeAt(a);return new Blob([n],{type:i})};var m=function(e,t){return e.filter((function(e){return e!==t})).map((function(e){return e}))},v=function(e){return e.replace(/[\-_](\w)/g,(function(e){return e.charAt(1).toUpperCase()}))};f.createElement=function(e){var t=document.createElement("div");return t.innerHTML=e,t.childNodes[0]},f.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},f.getElement=function(e,t){var i;if("string"==typeof e?i=document.querySelector(e):null!=e.nodeType&&(i=e),null==i)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector or a plain HTML element."));return i},f.getElements=function(e,t){var i,n;if(e instanceof Array){n=[];try{var r=!0,a=!1,o=void 0;try{for(var l=e[Symbol.iterator]();!(r=(s=l.next()).done);r=!0)i=s.value,n.push(this.getElement(i,t))}catch(e){a=!0,o=e}finally{try{r||null==l.return||l.return()}finally{if(a)throw o}}}catch(e){n=null}}else if("string"==typeof e){n=[];r=!0,a=!1,o=void 0;try{var s;for(l=document.querySelectorAll(e)[Symbol.iterator]();!(r=(s=l.next()).done);r=!0)i=s.value,n.push(i)}catch(e){a=!0,o=e}finally{try{r||null==l.return||l.return()}finally{if(a)throw o}}}else null!=e.nodeType&&(n=[e]);if(null==n||!n.length)throw new Error("Invalid `".concat(t,"` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));return n},f.confirm=function(e,t,i){return window.confirm(e)?t():null!=i?i():void 0},f.isValidFile=function(e,t){if(!t)return!0;t=t.split(",");var i=e.type,n=i.replace(/\/.*$/,""),r=!0,a=!1,o=void 0;try{for(var l,s=t[Symbol.iterator]();!(r=(l=s.next()).done);r=!0){var u=l.value;if("."===(u=u.trim()).charAt(0)){if(-1!==e.name.toLowerCase().indexOf(u.toLowerCase(),e.name.length-u.length))return!0}else if(/\/\*$/.test(u)){if(n===u.replace(/\/.*$/,""))return!0}else if(i===u)return!0}}catch(e){a=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(a)throw o}}return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(e){return this.each((function(){return new f(this,e)}))}),f.ADDED="added",f.QUEUED="queued",f.ACCEPTED=f.QUEUED,f.UPLOADING="uploading",f.PROCESSING=f.UPLOADING,f.CANCELED="canceled",f.ERROR="error",f.SUCCESS="success";var y=function(e,t,i,n,r,a,o,l,s,u){var c=function(e){e.naturalWidth;var t=e.naturalHeight,i=document.createElement("canvas");i.width=1,i.height=t;var n=i.getContext("2d");n.drawImage(e,0,0);for(var r=n.getImageData(1,0,1,t).data,a=0,o=t,l=t;l>a;)0===r[4*(l-1)+3]?o=l:a=l,l=o+a>>1;var s=l/t;return 0===s?1:s}(t);return e.drawImage(t,i,n,r,a,o,l,s,u/c)},g=function(){"use strict";function e(){i(this,e)}return r(e,null,[{key:"initClass",value:function(){this.KEY_STR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}},{key:"encode64",value:function(e){for(var t="",i=void 0,n=void 0,r="",a=void 0,o=void 0,l=void 0,s="",u=0;a=(i=e[u++])>>2,o=(3&i)<<4|(n=e[u++])>>4,l=(15&n)<<2|(r=e[u++])>>6,s=63&r,isNaN(n)?l=s=64:isNaN(r)&&(s=64),t=t+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(o)+this.KEY_STR.charAt(l)+this.KEY_STR.charAt(s),i=n=r="",a=o=l=s="",ue.length)break}return i}},{key:"decode64",value:function(e){var t=void 0,i=void 0,n="",r=void 0,a=void 0,o="",l=0,s=[];for(/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.warn("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\nExpect errors in decoding."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");t=this.KEY_STR.indexOf(e.charAt(l++))<<2|(r=this.KEY_STR.indexOf(e.charAt(l++)))>>4,i=(15&r)<<4|(a=this.KEY_STR.indexOf(e.charAt(l++)))>>2,n=(3&a)<<6|(o=this.KEY_STR.indexOf(e.charAt(l++))),s.push(t),64!==a&&s.push(i),64!==o&&s.push(n),t=i=n="",r=a=o="",l18);a&&(n.weChat=!0);e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,r);var o="sans-serif",a="12px sans-serif";var s,l,u=function(t){var e={};if("undefined"==typeof JSON)return e;for(var n=0;n=0)o=r*t.length;else for(var c=0;c>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,a),a,o);if(s)return s(t,n,i),!0}return!1}function Jt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Qt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,te=[],ee=r.browser.firefox&&+r.browser.version.split(".")[0]<39;function ne(t,e,n,i){return n=n||{},i?ie(t,e,n):ee&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):ie(t,e,n),n}function ie(t,e,n){if(r.domSupported&&t.getBoundingClientRect){var i=e.clientX,o=e.clientY;if(Jt(t)){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=o-a.top)}if($t(te,t,i,o))return n.zrX=te[0],void(n.zrY=te[1])}n.zrX=n.zrY=0}function re(t){return t||window.event}function oe(t,e,n){if(null!=(e=re(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&ne(t,r,e,n)}else{ne(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&Qt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ae(t,e,n,i){t.addEventListener(e,n,i)}var se=function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0};function le(t){return 2===t.which||3===t.which}var ue=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o1&&r&&r.length>1){var a=he(r)/he(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}},pe="silent";function de(){se(this.event)}var fe=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Xt),ge=function(t,e){this.x=t,this.y=e},ye=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],ve=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o._hovered=new ge(0,0),o.storage=e,o.painter=n,o.painterRoot=r,i=i||new fe,o.proxy=null,o.setHandlerProxy(i),o._draggingMgr=new Ut(o),o}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(E(ye,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=xe(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new ge(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new ge(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:de}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},e.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new ge(t,e),o=i.length-1;o>=0;o--){var a=void 0;if(i[o]!==n&&!i[o].ignore&&(a=me(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),a!==pe)){r.target=i[o];break}}return r},e.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new ue);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r;var o=new ge;o.target=i.target,this.dispatchToElement(o,r,i.event)}},e}(Xt);function me(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}var s=i.__hostTarget;i=s||i.parent}return!r||pe}return!1}function xe(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){ve.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=xe(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Et(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));function _e(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r=0;)r++;return r-e}function be(t,e,n,i,r){for(i===e&&i++;i>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function we(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function Se(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function Me(t,e){var n,i,r=7,o=0;t.length;var a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=Se(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=we(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!==(y=s-we(t[u],a,0,s,s-1,e))){for(s-=y,d=(c-=y)+1,p=(h-=y)+1,l=0;l=7||y>=7);if(v)break;f<0&&(f=0),f+=2}(r=f)<1&&(r=1);if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=_e(t,n,i,e))s&&(l=s),be(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var Te=!1;function Ce(){Te||(Te=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function De(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var Ae=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=De}return t.prototype.traverse=function(t,e){for(var n=0;n0&&(u.__clipPaths=[]),isNaN(u.z)&&(Ce(),u.z=0),isNaN(u.z2)&&(Ce(),u.z2=0),isNaN(u.zlevel)&&(Ce(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),ke=r.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},Le={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Le.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Le.bounceIn(2*t):.5*Le.bounceOut(2*t-1)+.5}},Pe=Math.pow,Oe=Math.sqrt,Re=1e-8,Ne=1e-4,Ee=Oe(3),ze=1/3,Ve=wt(),Be=wt(),Fe=wt();function Ge(t){return t>-1e-8&&tRe||t<-1e-8}function He(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function Ye(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function Ue(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(Ge(h)&&Ge(c)){if(Ge(s))o[0]=0;else(M=-l/s)>=0&&M<=1&&(o[d++]=M)}else{var f=c*c-4*h*p;if(Ge(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=Oe(f),m=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-Pe(-m,ze):Pe(m,ze))+(x=x<0?-Pe(-x,ze):Pe(x,ze))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var _=(2*h*s-3*a*c)/(2*Oe(h*h*h)),b=Math.acos(_)/3,w=Oe(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+Ee*Math.sin(b)))/(3*a),(-s+w*(S-Ee*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function Xe(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Ge(a)){if(We(o))(h=-s/o)>=0&&h<=1&&(r[l++]=h)}else{var u=o*o-4*a*s;if(Ge(u))r[0]=-o/(2*a);else if(u>0){var h,c=Oe(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function Ze(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function je(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;Ve[0]=l,Ve[1]=u;for(var m=0;m<1;m+=.05)Be[0]=He(t,n,r,a,m),Be[1]=He(e,i,o,s,m),(f=Vt(Ve,Be))=0&&f=0&&y=1?1:Ue(0,i,o,1,t,s)&&He(0,r,a,1,s[0])}}}var on=function(){function t(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||xt,this.ondestroy=t.ondestroy||xt,this.onrestart=t.onrestart||xt,t.easing&&this.setEasing(t.easing)}return t.prototype.step=function(t,e){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),!this._paused){var n=this._life,i=t-this._startTime-this._pausedTime,r=i/n;r<0&&(r=0),r=Math.min(r,1);var o=this.easingFunc,a=o?o(r):r;if(this.onframe(a),1===r){if(!this.loop)return!0;var s=i%n;this._startTime=t-s,this._pausedTime=0,this.onrestart()}return!1}this._pausedTime+=e},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t.prototype.setEasing=function(t){this.easing=t,this.easingFunc=U(t)?t:Le[t]||rn(t)},t}(),an=function(t){this.value=t},sn=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new an(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),ln=function(){function t(t){this._list=new sn,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new an(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),un={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function hn(t){return(t=Math.round(t))<0?0:t>255?255:t}function cn(t){return t<0?0:t>1?1:t}function pn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?hn(parseFloat(e)/100*255):hn(parseInt(e,10))}function dn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?cn(parseFloat(e)/100):cn(parseFloat(e))}function fn(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function gn(t,e,n){return t+(e-t)*n}function yn(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function vn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var mn=new ln(20),xn=null;function _n(t,e){xn&&vn(xn,e),xn=mn.put(t,xn||e.slice())}function bn(t,e){if(t){e=e||[];var n=mn.get(t);if(n)return vn(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in un)return vn(e,un[i]),_n(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(yn(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),_n(t,e),e):void yn(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(yn(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),_n(t,e),e):void yn(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?yn(e,+u[0],+u[1],+u[2],1):yn(e,0,0,0,1);h=dn(u.pop());case"rgb":return 3!==u.length?void yn(e,0,0,0,1):(yn(e,pn(u[0]),pn(u[1]),pn(u[2]),h),_n(t,e),e);case"hsla":return 4!==u.length?void yn(e,0,0,0,1):(u[3]=dn(u[3]),wn(u,e),_n(t,e),e);case"hsl":return 3!==u.length?void yn(e,0,0,0,1):(wn(u,e),_n(t,e),e);default:return}}yn(e,0,0,0,1)}}function wn(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=dn(t[1]),r=dn(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return yn(e=e||[],hn(255*fn(a,o,n+1/3)),hn(255*fn(a,o,n)),hn(255*fn(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Sn(t,e){var n=bn(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return kn(n,4===n.length?"rgba":"rgb")}}function Mn(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=hn(gn(a[0],s[0],l)),n[1]=hn(gn(a[1],s[1],l)),n[2]=hn(gn(a[2],s[2],l)),n[3]=cn(gn(a[3],s[3],l)),n}}var In=Mn;function Tn(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=bn(e[r]),s=bn(e[o]),l=i-r,u=kn([hn(gn(a[0],s[0],l)),hn(gn(a[1],s[1],l)),hn(gn(a[2],s[2],l)),cn(gn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var Cn=Tn;function Dn(t,e,n,i){var r=bn(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=dn(n)),null!=i&&(r[2]=dn(i)),kn(wn(r),"rgba")}function An(t,e){var n=bn(t);if(n&&null!=e)return n[3]=cn(e),kn(n,"rgba")}function kn(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function Ln(t,e){var n=bn(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var Pn=Object.freeze({__proto__:null,parse:bn,lift:Sn,toHex:function(t){var e=bn(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:Mn,fastMapToColor:In,lerp:Tn,mapToColor:Cn,modifyHSL:Dn,modifyAlpha:An,stringify:kn,lum:Ln,random:function(){return kn([Math.round(255*Math.random()),Math.round(255*Math.random()),Math.round(255*Math.random())],"rgb")}}),On=Math.round;function Rn(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=bn(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}var Nn=1e-4;function En(t){return t-1e-4}function zn(t){return On(1e3*t)/1e3}function Vn(t){return On(1e4*t)/1e4}var Bn={left:"start",right:"end",center:"middle",middle:"middle"};function Fn(t){return t&&!!t.image}function Gn(t){return"linear"===t.type}function Wn(t){return"radial"===t.type}function Hn(t){return"url(#"+t+")"}function Yn(t){var e=t.getGlobalScale(),n=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(n)/Math.log(10)),1)}function Un(t){var e=t.x||0,n=t.y||0,i=(t.rotation||0)*_t,r=rt(t.scaleX,1),o=rt(t.scaleY,1),a=t.skewX||0,s=t.skewY||0,l=[];return(e||n)&&l.push("translate("+e+"px,"+n+"px)"),i&&l.push("rotate("+i+")"),1===r&&1===o||l.push("scale("+r+","+o+")"),(a||s)&&l.push("skew("+On(a*_t)+"deg, "+On(s*_t)+"deg)"),l.join(" ")}var Xn=r.hasGlobalWindow&&U(window.btoa)?function(t){return window.btoa(unescape(t))}:"undefined"!=typeof Buffer?function(t){return Buffer.from(t).toString("base64")}:function(t){return null},Zn=Array.prototype.slice;function jn(t,e,n){return(e-t)*n+t}function qn(t,e,n,i){for(var r=e.length,o=0;oi?e:t,o=Math.min(n,i),a=r[o-1]||{color:[0,0,0,0],offset:0},s=o;sa)i.length=a;else for(var s=o;s=1},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e,n){this._needsSort=!0;var i=this.keyframes,r=i.length,o=!1,a=6,s=e;if(N(e)){var l=function(t){return N(t&&t[0])?2:1}(e);a=l,(1===l&&!j(e[0])||2===l&&!j(e[0][0]))&&(o=!0)}else if(j(e)&&!nt(e))a=0;else if(X(e))if(isNaN(+e)){var u=bn(e);u&&(s=u,a=3)}else a=0;else if(Q(e)){var h=A({},s);h.colorStops=z(e.colorStops,(function(t){return{offset:t.offset,color:bn(t.color)}})),Gn(e)?a=4:Wn(e)&&(a=5),s=h}0===r?this.valType=a:a===this.valType&&6!==a||(o=!0),this.discrete=this.discrete||o;var c={time:t,value:s,rawValue:e,percent:0};return n&&(c.easing=n,c.easingFunc=U(n)?n:Le[n]||rn(n)),i.push(c),c},t.prototype.prepare=function(t,e){var n=this.keyframes;this._needsSort&&n.sort((function(t,e){return t.time-e.time}));for(var i=this.valType,r=n.length,o=n[r-1],a=this.discrete,s=ii(i),l=ni(i),u=0;u=0&&!(l[n].percent<=e);n--);n=d(n,u-2)}else{for(n=p;ne);n++);n=d(n-1,u-2)}r=l[n+1],i=l[n]}if(i&&r){this._lastFr=n,this._lastFrP=e;var f=r.percent-i.percent,g=0===f?1:d((e-i.percent)/f,1);r.easingFunc&&(g=r.easingFunc(g));var y=o?this._additiveValue:c?ri:t[h];if(!ii(s)&&!c||y||(y=this._additiveValue=[]),this.discrete)t[h]=g<1?i.rawValue:r.rawValue;else if(ii(s))1===s?qn(y,i[a],r[a],g):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a0&&s.addKeyframe(0,ti(l),i),this._trackKeys.push(a)}s.addKeyframe(t,ti(e[a]),i)}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var e=t.length,n=0;n0)){this._started=1;for(var e=this,n=[],i=this._maxTime||0,r=0;r1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(this._maxTime,r.getAdditiveTrack())}}}},t}();function si(){return(new Date).getTime()}var li,ui,hi=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._head=n,n?n.prev=e:this._tail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=si()-this._pausedTime,n=e-this._time,i=this._head;i;){var r=i.next;i.step(e,n)?(i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,ke((function e(){t._running&&(ke(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=si(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=si(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=si()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._head;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._head=this._tail=null},e.prototype.isFinished=function(){return null==this._head},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new ai(t,e.loop);return this.addAnimator(n),n},e}(Xt),ci=r.domSupported,pi=(ui={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:li=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:z(li,(function(t){var e=t.replace("mouse","pointer");return ui.hasOwnProperty(e)?e:t}))}),di=["mousemove","mouseup"],fi=["pointermove","pointerup"],gi=!1;function yi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function vi(t){t&&(t.zrByTouch=!0)}function mi(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var xi=function(t,e){this.stopPropagation=xt,this.stopImmediatePropagation=xt,this.preventDefault=xt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},_i={mousedown:function(t){t=oe(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=oe(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=oe(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){mi(this,(t=oe(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){gi=!0,t=oe(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){gi||(t=oe(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){vi(t=oe(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),_i.mousemove.call(this,t),_i.mousedown.call(this,t)},touchmove:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"change"),_i.mousemove.call(this,t)},touchend:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"end"),_i.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&_i.click.call(this,t)},pointerdown:function(t){_i.mousedown.call(this,t)},pointermove:function(t){yi(t)||_i.mousemove.call(this,t)},pointerup:function(t){_i.mouseup.call(this,t)},pointerout:function(t){yi(t)||_i.mouseout.call(this,t)}};E(["click","dblclick","contextmenu"],(function(t){_i[t]=function(e){e=oe(this.dom,e),this.trigger(t,e)}}));var bi={pointermove:function(t){yi(t)||bi.mousemove.call(this,t)},pointerup:function(t){bi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function wi(t,e){var n=e.domHandlers;r.pointerEventsSupported?E(pi.pointer,(function(i){Mi(e,i,(function(e){n[i].call(t,e)}))})):(r.touchEventsSupported&&E(pi.touch,(function(i){Mi(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),E(pi.mouse,(function(i){Mi(e,i,(function(r){r=re(r),e.touching||n[i].call(t,r)}))})))}function Si(t,e){function n(n){Mi(e,n,(function(i){i=re(i),mi(t,i.target)||(i=function(t,e){return oe(t.dom,new xi(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}r.pointerEventsSupported?E(fi,n):r.touchEventsSupported||E(di,n)}function Mi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ae(t.domTarget,e,n,i)}function Ii(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],e.removeEventListener(n,i,r));t.mounted={}}var Ti=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Ci=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new Ti(e,_i),ci&&(i._globalHandlerScope=new Ti(document,bi)),wi(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){Ii(this._localHandlerScope),ci&&Ii(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,ci&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?Si(this,e):Ii(e)}},e}(Xt),Di=1;r.hasGlobalWindow&&(Di=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Ai=Di,ki="#333",Li="#ccc";function Pi(){return[1,0,0,1,0,0]}function Oi(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function Ri(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Ni(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function Ei(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function zi(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function Vi(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Bi(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Fi(t){var e=[1,0,0,1,0,0];return Ri(e,t),e}var Gi=Object.freeze({__proto__:null,create:Pi,identity:Oi,copy:Ri,mul:Ni,translate:Ei,rotate:zi,scale:Vi,invert:Bi,clone:Fi}),Wi=Oi,Hi=5e-5;function Yi(t){return t>Hi||t<-5e-5}var Ui=[],Xi=[],Zi=[1,0,0,1,0,0],ji=Math.abs,qi=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return Yi(this.rotation)||Yi(this.x)||Yi(this.y)||Yi(this.scaleX-1)||Yi(this.scaleY-1)||Yi(this.skewX)||Yi(this.skewY)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):Wi(n),t&&(e?Ni(n,t,n):Ri(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&Wi(n)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(Ui);var n=Ui[0]<0?-1:1,i=Ui[1]<0?-1:1,r=((Ui[0]-n)*e+n)/Ui[0]||0,o=((Ui[1]-i)*e+i)/Ui[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],Bi(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(Ni(Xi,t.invTransform,e),e=Xi);var n=this.originX,i=this.originY;(n||i)&&(Zi[4]=n,Zi[5]=i,Ni(Xi,e,Zi),Xi[4]-=n,Xi[5]-=i,e=Xi),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Ft(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Ft(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&ji(t[0]-1)>1e-10&&ji(t[3]-1)>1e-10?Math.sqrt(ji(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){$i(this,t)},t.getLocalTransform=function(t,e){e=e||[];var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.anchorX,s=t.anchorY,l=t.rotation||0,u=t.x,h=t.y,c=t.skewX?Math.tan(t.skewX):0,p=t.skewY?Math.tan(-t.skewY):0;if(n||i||a||s){var d=n+a,f=i+s;e[4]=-d*r-c*f*o,e[5]=-f*o-p*d*r}else e[4]=e[5]=0;return e[0]=r,e[3]=o,e[1]=p*r,e[2]=c*o,l&&zi(e,e,l),e[4]+=n+u,e[5]+=i+h,e},t.initDefaultProps=function(){var e=t.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),t}(),Ki=["x","y","originX","originY","anchorX","anchorY","rotation","scaleX","scaleY","skewX","skewY"];function $i(t,e){for(var n=0;nf&&(f=x,gf&&(f=_,v=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}er.x=ir.x=n.x,er.y=rr.y=n.y,nr.x=rr.x=n.x+n.width,nr.y=ir.y=n.y+n.height,er.transform(i),rr.transform(i),nr.transform(i),ir.transform(i),e.x=Qi(er.x,nr.x,ir.x,rr.x),e.y=Qi(er.y,nr.y,ir.y,rr.y);var l=tr(er.x,nr.x,ir.x,rr.x),u=tr(er.y,nr.y,ir.y,rr.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),lr={};function ur(t,e){var n=lr[e=e||a];n||(n=lr[e]=new ln(500));var i=n.get(t);return null==i&&(i=h.measureText(t,e).width,n.put(t,i)),i}function hr(t,e,n,i){var r=ur(t,e),o=fr(e),a=pr(0,r,n),s=dr(0,o,i);return new sr(a,s,r,o)}function cr(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return hr(r[0],e,n,i);for(var o=new sr(0,0,0,0),a=0;a=0?parseFloat(t)/100*e:parseFloat(t):t}function yr(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=gr(i[0],n.width),u+=gr(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var vr="__zr_normal__",mr=Ki.concat(["ignore"]),xr=V(Ki,(function(t,e){return t[e]=!0,t}),{ignore:!1}),_r={},br=new sr(0,0,0,0),wr=function(){function t(t){this.id=M(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=br;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(_r,n,u):yr(_r,n,u),r.x=_r.x,r.y=_r.y,o=_r.align,a=_r.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=gr(h[0],u.width),p=gr(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Li:ki},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&bn(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,kn(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},A(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(q(t))for(var n=G(t),i=0;i0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(vr,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===vr;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(P(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}I("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=P(i,t),o=P(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p0||r.force&&!a.length){var w,S=void 0,M=void 0,I=void 0;if(s){M={},p&&(S={});for(_=0;_=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,e){var n=P(this._children,t);return n>=0&&this.replaceAt(e,n),this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=P(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function Er(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return X(t)?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function zr(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Vr(t){return t.sort((function(t,e){return t-e})),t}function Br(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return Fr(t)}function Fr(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function Gr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Wr(t,e,n){if(!t[e])return 0;var i=V(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===i)return 0;for(var r=Math.pow(10,n),o=z(t,(function(t){return(isNaN(t)?0:t)/i*r*100})),a=100*r,s=z(o,(function(t){return Math.floor(t)})),l=V(s,(function(t,e){return t+e}),0),u=z(o,(function(t,e){return t-s[e]}));lh&&(h=u[p],c=p);++s[c],u[c]=0,++l}return s[e]/r}function Hr(t,e){var n=Math.max(Br(t),Br(e)),i=t+e;return n>20?i:zr(i,n)}var Yr=9007199254740991;function Ur(t){var e=2*Math.PI;return(t%e+e)%e}function Xr(t){return t>-1e-4&&t=10&&e++,e}function $r(t,e){var n=Kr(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function Jr(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function Qr(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i=0||r&&P(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var Ho=Wo([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),Yo=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return Ho(this,t,e)},t}(),Uo=new ln(50);function Xo(t){if("string"==typeof t){var e=Uo.get(t);return e&&e.image}return t}function Zo(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=Uo.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!qo(e=o.image)&&o.pending.push(a):((e=h.loadImage(t,jo,jo)).__zrImageSrc=t,Uo.put(t,e.__cachedImgObj={image:e,pending:[a]})),e}return t}return e}function jo(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e=a;l++)s-=a;var u=ur(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function Qo(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=ur(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?ta(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=ur(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function ta(t,e,n,i){for(var r=0,o=0,a=t.length;o0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=sa(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y=33&&e<=383}(t)||!!oa[t]}function sa(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;cn:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var la="__zr_style_"+Math.round(10*Math.random()),ua={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},ha={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};ua[la]=!0;var ca=["z","z2","invisible"],pa=["invisible"],da=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=G(e),i=0;i1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ba[0]=xa(r)*n+t,ba[1]=ma(r)*i+e,wa[0]=xa(o)*n+t,wa[1]=ma(o)*i+e,u(s,ba,wa),h(l,ba,wa),(r%=_a)<0&&(r+=_a),(o%=_a)<0&&(o+=_a),r>o&&!a?o+=_a:rr&&(Sa[0]=xa(d)*n+t,Sa[1]=ma(d)*i+e,u(s,Sa,s),h(l,Sa,l))}var La={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Pa=[],Oa=[],Ra=[],Na=[],Ea=[],za=[],Va=Math.min,Ba=Math.max,Fa=Math.cos,Ga=Math.sin,Wa=Math.abs,Ha=Math.PI,Ya=2*Ha,Ua="undefined"!=typeof Float32Array,Xa=[];function Za(t){return Math.round(t/Ha*1e8)/1e8%2*Ha}function ja(t,e){var n=Za(t[0]);n<0&&(n+=Ya);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=Ya?r=n+Ya:e&&n-r>=Ya?r=n-Ya:!e&&n>r?r=n+(Ya-Za(n-r)):e&&n0&&(this._ux=Wa(n/Ai/t)||0,this._uy=Wa(n/Ai/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(La.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Wa(t-this._xi),i=Wa(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(La.L,t,e),this._ctx&&r&&this._ctx.lineTo(t,e),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(La.C,t,e,n,i,r,o),this._ctx&&this._ctx.bezierCurveTo(t,e,n,i,r,o),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(La.Q,t,e,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,e,n,i),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),Xa[0]=i,Xa[1]=r,ja(Xa,o),i=Xa[0];var a=(r=Xa[1])-i;return this.addData(La.A,t,e,n,n,i,a,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Fa(r)*n+t,this._yi=Ga(r)*n+e,this},t.prototype.arcTo=function(t,e,n,i,r){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},t.prototype.rect=function(t,e,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,e,n,i),this.addData(La.R,t,e,n,i),this},t.prototype.closePath=function(){this._drawPendingPt(),this.addData(La.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&t.closePath(),this._xi=e,this._yi=n,this},t.prototype.fill=function(t){t&&t.fill(),this.toStatic()},t.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},t.prototype.len=function(){return this._len},t.prototype.setData=function(t){var e=t.length;this.data&&this.data.length===e||!Ua||(this.data=new Float32Array(e));for(var n=0;nu.length&&(this._expandData(),u=this.data);for(var h=0;h0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){Ra[0]=Ra[1]=Ea[0]=Ea[1]=Number.MAX_VALUE,Na[0]=Na[1]=za[0]=za[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;tn||Wa(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=x);break;case La.C:var v=t[c++],m=t[c++],x=(g=t[c++],t[c++]),_=t[c++],b=t[c++];f=qe(r,o,v,m,g,x,_,b,10),r=_,o=b;break;case La.Q:f=en(r,o,v=t[c++],m=t[c++],g=t[c++],x=t[c++],10),r=g,o=x;break;case La.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1;t[c++];d&&(a=Fa(T)*M+w,s=Ga(T)*I+S),f=Ba(M,I)*Va(Ya,Math.abs(C)),r=Fa(D)*M+w,o=Ga(D)*I+S;break;case La.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case La.Z:var A=a-r;y=s-o;f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,x=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var _=0;_0&&(t.lineTo(h,c),x=0),b){case La.M:n=r=p[_++],i=o=p[_++],t.moveTo(r,o);break;case La.L:a=p[_++],s=p[_++];var S=Wa(a-r),M=Wa(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,x=0}else{var T=S*S+M*M;T>x&&(h=a,c=s,x=T)}break;case La.C:var C=p[_++],D=p[_++],A=p[_++],k=p[_++],L=p[_++],P=p[_++];if(y){if(v+(j=l[m++])>u){Ze(r,C,A,L,I=(u-v)/j,Pa),Ze(o,D,k,P,I,Oa),t.bezierCurveTo(Pa[1],Oa[1],Pa[2],Oa[2],Pa[3],Oa[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case La.Q:C=p[_++],D=p[_++],A=p[_++],k=p[_++];if(y){if(v+(j=l[m++])>u){Qe(r,C,A,I=(u-v)/j,Pa),Qe(o,D,k,I,Oa),t.quadraticCurveTo(Pa[1],Oa[1],Pa[2],Oa[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case La.A:var O=p[_++],R=p[_++],N=p[_++],E=p[_++],z=p[_++],V=p[_++],B=p[_++],F=!p[_++],G=N>E?N:E,W=Wa(N-E)>.001,H=z+V,Y=!1;if(y)v+(j=l[m++])>u&&(H=z+V*(u-v)/j,Y=!0),v+=j;if(W&&t.ellipse?t.ellipse(O,R,N,E,B,z,H,F):t.arc(O,R,G,z,H,F),Y)break t;w&&(n=Fa(z)*N+O,i=Ga(z)*E+R),r=Fa(H)*N+O,o=Ga(H)*E+R;break;case La.R:n=r=p[_],i=o=p[_+1],a=p[_++],s=p[_++];var U=p[_++],X=p[_++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+Va(Z,U),s),(Z-=U)>0&&t.lineTo(a+U,s+Va(Z,X)),(Z-=X)>0&&t.lineTo(a+Ba(U-Z,0),s+X),(Z-=U)>0&&t.lineTo(a,s+Ba(X-Z,0));break t}v+=j}t.rect(a,s,U,X);break;case La.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j;t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=La,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function Ka(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0;if(a>e+s&&a>i+s||at+s&&o>n+s||oe+c&&h>i+c&&h>o+c&&h>s+c||ht+c&&u>n+c&&u>r+c&&u>a+c||ue+u&&l>i+u&&l>o+u||lt+u&&s>n+u&&s>r+u||sn||h+ur&&(r+=es);var p=Math.atan2(l,s);return p<0&&(p+=es),p>=i&&p<=r||p+es>=i&&p+es<=r}function is(t,e,n,i,r,o){if(o>e&&o>i||or?s:0}var rs=qa.CMD,os=2*Math.PI;var as=[-1,-1,-1],ss=[-1,-1];function ls(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u1&&(h=void 0,h=ss[0],ss[0]=ss[1],ss[1]=h),f=He(e,i,o,s,ss[0]),d>1&&(g=He(e,i,o,s,ss[1]))),2===d?ve&&s>i&&s>o||s=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(Ge(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=Oe(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,as);if(0===l)return 0;var u=Je(e,i,o);if(u>=0&&u<=1){for(var h=0,c=Ke(e,i,o,u),p=0;pn||s<-n)return 0;var l=Math.sqrt(n*n-s*s);as[0]=-l,as[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=os-1e-4){i=0,r=os;var h=o?1:-1;return a>=as[0]+t&&a<=as[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=os,r+=os);for(var p=0,d=0;d<2;d++){var f=as[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1;g<0&&(g=os+g),(g>=i&&g<=r||g+os>=i&&g+os<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function cs(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y1&&(n||(c+=is(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case rs.M:p=f=u[y++],d=g=u[y++];break;case rs.L:if(n){if(Ka(p,d,u[y],u[y+1],e,i,r))return!0}else c+=is(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.C:if(n){if($a(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ls(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.Q:if(n){if(Ja(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=us(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case rs.A:var x=u[y++],_=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+x,a=Math.sin(S)*w+_,m?(f=o,g=a):c+=is(p,d,o,a,i,r);var T=(i-x)*w/b+x;if(n){if(ns(x,_,w,S,S+M,I,e,T,r))return!0}else c+=hs(x,_,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+x,d=Math.sin(S+M)*w+_;break;case rs.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(Ka(f,g,o,g,e,i,r)||Ka(o,g,o,a,e,i,r)||Ka(o,a,f,a,e,i,r)||Ka(f,a,f,g,e,i,r))return!0}else c+=is(o,g,o,a,i,r),c+=is(f,a,f,g,i,r);break;case rs.Z:if(n){if(Ka(p,d,f,g,e,i,r))return!0}else c+=is(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=is(p,d,f,g,i,r)||0),0!==c}var ps=k({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},ua),ds={style:k({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},ha.style)},fs=Ki.concat(["invisible","culling","z","z2","zlevel","parent"]),gs=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s.5?ki:e>.2?"#eee":Li}if(t)return Li}return ki},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(X(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===Ln(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=-5},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new qa(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return cs(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return cs(t,0,!1,e,n)}(o,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:A(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(4&this.__dirty)},e.prototype.createStyle=function(t){return yt(ps,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=A({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=A({},i.shape),A(s,n.shape)):(s=A({},r?this.shape:i.shape),A(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=A({},this.shape);for(var u={},h=G(s),c=0;c0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return yt(ys,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=cr(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(da);vs.prototype.type="tspan";var ms=k({x:0,y:0},ua),xs={style:k({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},ha.style)};var _s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return yt(ms,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return xs},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new sr(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(da);_s.prototype.type="image";var bs=Math.round;function ws(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(bs(2*i)===bs(2*r)&&(t.x1=t.x2=Ms(i,s,!0)),bs(2*o)===bs(2*a)&&(t.y1=t.y2=Ms(o,s,!0)),t):t}}function Ss(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=Ms(i,s,!0),t.y=Ms(r,s,!0),t.width=Math.max(Ms(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(Ms(r+a,s,!1)-t.y,0===a?0:1),t):t}}function Ms(t,e,n){if(!e)return t;var i=bs(2*t);return(i+bs(e))%2==0?i/2:(i+(n?1:-1))/2}var Is=function(){this.x=0,this.y=0,this.width=0,this.height=0},Ts={},Cs=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Is},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=Ss(Ts,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(gs);Cs.prototype.type="rect";var Ds={fill:"#000"},As={style:k({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},ha.style)},ks=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Ds,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;ed&&h){var f=Math.floor(d/l);n=n.slice(0,f)}if(t&&a&&null!=c)for(var g=Jo(c,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),y=0;y0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,D=0;Dl&&ra(n,t.substring(l,u),e,s),ra(n,i[2],e,s,i[1]),l=Ko.lastIndex}lo){b>0?(m.tokens=m.tokens.slice(0,b),y(m,_,x),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=ur(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&qo(k=Xo(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-_:null;null!=L&&L=0&&"right"===(C=x[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=x[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},e.prototype._placeToken=function(t,e,n,i,r,o,s){var l=e.rich[t.styleName]||{};l.text=t.text;var u=t.verticalAlign,h=i+n/2;"top"===u?h=i+t.height/2:"bottom"===u&&(h=i+n-t.height/2),!t.isLineHolder&&Ws(l)&&this._renderBackground(l,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,h-t.height/2,t.width,t.height);var c=!!l.backgroundColor,p=t.textPadding;p&&(r=Fs(r,o,p),h-=t.height/2-p[0]-t.innerHeight/2);var d=this._getOrCreateChild(vs),f=d.createStyle();d.useStyle(f);var g=this._defaultStyle,y=!1,v=0,m=Bs("fill"in l?l.fill:"fill"in e?e.fill:(y=!0,g.fill)),x=Vs("stroke"in l?l.stroke:"stroke"in e?e.stroke:c||s||g.autoStroke&&!y?null:(v=2,g.stroke)),_=l.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=h,_&&(f.shadowBlur=l.textShadowBlur||e.textShadowBlur||0,f.shadowColor=l.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=l.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=l.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=o,f.textBaseline="middle",f.font=t.font||a,f.opacity=ot(l.opacity,e.opacity,1),Ns(f,l),x&&(f.lineWidth=ot(l.lineWidth,e.lineWidth,v),f.lineDash=rt(l.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=x),m&&(f.fill=m);var b=t.contentWidth,w=t.contentHeight;d.setBoundingRect(new sr(pr(f.x,b,f.textAlign),dr(f.y,w,f.textBaseline),b,w))},e.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(Cs)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=rt(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(_s)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=rt(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=ot(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";return Es(t)&&(e=[t.fontStyle,t.fontWeight,Rs(t.fontSize),t.fontFamily||"sans-serif"].join(" ")),e&&ut(e)||t.textFont||t.font},e}(da),Ls={left:!0,right:1,center:1},Ps={top:1,bottom:1,middle:1},Os=["fontStyle","fontWeight","fontSize","fontFamily"];function Rs(t){return"string"!=typeof t||-1===t.indexOf("px")&&-1===t.indexOf("rem")&&-1===t.indexOf("em")?isNaN(+t)?"12px":t+"px":t}function Ns(t,e){for(var n=0;n=0,o=!1;if(t instanceof gs){var a=Zs(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(il(s)||il(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=A({},i),(u=A({},u)).fill=s):!il(u.fill)&&il(s)?(o=!0,i=A({},i),(u=A({},u)).fill=ol(s)):!il(u.stroke)&&il(l)&&(o||(i=A({},i),u=A({},u)),u.stroke=ol(l)),i.style=u}}if(i&&null==i.z2){o||(i=A({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:$s)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=P(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function Ol(t,e,n){Bl(t,!0),fl(t,vl),Nl(t,e,n)}function Rl(t,e,n,i){i?function(t){Bl(t,!1)}(t):Ol(t,e,n)}function Nl(t,e,n){var i=Hs(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var El=["emphasis","blur","select"],zl={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function Vl(t,e,n,i){n=n||"itemStyle";for(var r=0;r1&&(a*=jl(f),s*=jl(f));var g=(r===o?-1:1)*jl((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+Kl(c)*y-ql(c)*v,x=(e+i)/2+ql(c)*y+Kl(c)*v,_=tu([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=tu(b,w);if(Ql(b,w)<=-1&&(S=$l),Ql(b,w)>=1&&(S=0),S<0){var M=Math.round(S/$l*1e6)/1e6;S=2*$l+M%2*$l}h.addData(u,m,x,a,s,_,S,c,o)}var nu=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,iu=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var ru=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(gs);function ou(t){return null!=t.setData}function au(t,e){var n=function(t){var e=new qa;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=qa.CMD,l=t.match(nu);if(!l)return e;for(var u=0;uk*k+L*L&&(M=T,I=C),{cx:M,cy:I,x0:-h,y0:-c,x1:M*(r/b-1),y1:I*(r/b-1)}}function Iu(t,e){var n,i=bu(e.r,0),r=bu(e.r0||0,0),o=i>0;if(o||r>0){if(o||(i=r,r=0),r>i){var a=i;i=r,r=a}var s=e.startAngle,l=e.endAngle;if(!isNaN(s)&&!isNaN(l)){var u=e.cx,h=e.cy,c=!!e.clockwise,p=xu(l-s),d=p>fu&&p%fu;if(d>Su&&(p=d),i>Su)if(p>fu-Su)t.moveTo(u+i*yu(s),h+i*gu(s)),t.arc(u,h,i,s,l,!c),r>Su&&(t.moveTo(u+r*yu(l),h+r*gu(l)),t.arc(u,h,r,l,s,c));else{var f=void 0,g=void 0,y=void 0,v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=void 0,I=void 0,T=void 0,C=void 0,D=void 0,A=void 0,k=i*yu(s),L=i*gu(s),P=r*yu(l),O=r*gu(l),R=p>Su;if(R){var N=e.cornerRadius;N&&(f=(n=function(t){var e;if(Y(t)){var n=t.length;if(!n)return t;e=1===n?[t[0],t[0],0,0]:2===n?[t[0],t[0],t[1],t[1]]:3===n?t.concat(t[2]):t}else e=[t,t,t,t];return e}(N))[0],g=n[1],y=n[2],v=n[3]);var E=xu(i-r)/2;if(m=wu(E,y),x=wu(E,v),_=wu(E,f),b=wu(E,g),M=w=bu(m,x),I=S=bu(_,b),(w>Su||S>Su)&&(T=i*yu(l),C=i*gu(l),D=r*yu(s),A=r*gu(s),pSu){var U=wu(y,M),X=wu(v,M),Z=Mu(D,A,k,L,i,U,c),j=Mu(T,C,P,O,i,X,c);t.moveTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),M0&&t.arc(u+Z.cx,h+Z.cy,U,mu(Z.y0,Z.x0),mu(Z.y1,Z.x1),!c),t.arc(u,h,i,mu(Z.cy+Z.y1,Z.cx+Z.x1),mu(j.cy+j.y1,j.cx+j.x1),!c),X>0&&t.arc(u+j.cx,h+j.cy,X,mu(j.y1,j.x1),mu(j.y0,j.x0),!c))}else t.moveTo(u+k,h+L),t.arc(u,h,i,s,l,!c);else t.moveTo(u+k,h+L);if(r>Su&&R)if(I>Su){U=wu(f,I),Z=Mu(P,O,T,C,r,-(X=wu(g,I)),c),j=Mu(k,L,D,A,r,-U,c);t.lineTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),I0&&t.arc(u+Z.cx,h+Z.cy,X,mu(Z.y0,Z.x0),mu(Z.y1,Z.x1),!c),t.arc(u,h,r,mu(Z.cy+Z.y1,Z.cx+Z.x1),mu(j.cy+j.y1,j.cx+j.x1),c),U>0&&t.arc(u+j.cx,h+j.cy,U,mu(j.y1,j.x1),mu(j.y0,j.x0),!c))}else t.lineTo(u+P,h+O),t.arc(u,h,r,l,s,c);else t.lineTo(u+P,h+O)}else t.moveTo(u,h);t.closePath()}}}var Tu=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0},Cu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Tu},e.prototype.buildPath=function(t,e){Iu(t,e)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(gs);Cu.prototype.type="sector";var Du=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Au=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Du},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},e}(gs);function ku(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;pqu[1]){if(a=!1,r)return a;var u=Math.abs(qu[0]-ju[1]),h=Math.abs(ju[0]-qu[1]);Math.min(u,h)>i.len()&&(u0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function rh(t,e,n,i,r,o){ih("update",t,e,n,i,r,o)}function oh(t,e,n,i,r,o){ih("enter",t,e,n,i,r,o)}function ah(t){if(!t.__zr)return!0;for(var e=0;eMath.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function Dh(t){return!t.isGroup}function Ah(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){Dh(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(Dh(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),rh(t,i,n,Hs(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=A({},t.shape)),e}}function kh(t,e){return z(t,(function(t){var n=t[0];n=ch(n,e.x),n=ph(n,e.x+e.width);var i=t[1];return i=ch(i,e.y),[n,i=ph(i,e.y+e.height)]}))}function Lh(t,e){var n=ch(t.x,e.x),i=ph(t.x+t.width,e.x+e.width),r=ch(t.y,e.y),o=ph(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function Ph(t,e,n){var i=A({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),k(r,n),new _s(i)):xh(t.replace("path://",""),i,n,"center")}function Oh(t,e,n,i,r){for(var o=0,a=r[r.length-1];o=-1e-6)return!1;var f=t-r,g=e-o,y=Nh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=Nh(f,g,c,p)/d;return!(v<0||v>1)}function Nh(t,e,n,i){return t*i-n*e}function Eh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=X(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&E(G(l),(function(t){mt(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=Hs(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:k({content:i,formatterParams:s},r)}}function zh(t,e){var n;t.isGroup&&(n=e(t)),n||t.traverse(e)}function Vh(t,e){if(t)if(Y(t))for(var n=0;n-1?vc:xc;function Sc(t,e){t=t.toUpperCase(),bc[t]=new dc(e),_c[t]=e}function Mc(t){return bc[t]}Sc(mc,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),Sc(vc,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}});var Ic=1e3,Tc=6e4,Cc=36e5,Dc=864e5,Ac=31536e6,kc={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},Lc="{yyyy}-{MM}-{dd}",Pc={year:"{yyyy}",month:"{yyyy}-{MM}",day:Lc,hour:"{yyyy}-{MM}-{dd} "+kc.hour,minute:"{yyyy}-{MM}-{dd} "+kc.minute,second:"{yyyy}-{MM}-{dd} "+kc.second,millisecond:kc.none},Oc=["year","month","day","hour","minute","second","millisecond"],Rc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function Nc(t,e){return"0000".substr(0,e-(t+="").length)+t}function Ec(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function zc(t){return t===Ec(t)}function Vc(t,e,n,i){var r=jr(t),o=r[Gc(n)](),a=r[Wc(n)]()+1,s=Math.floor((a-1)/3)+1,l=r[Hc(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[Yc(n)](),c=(h-1)%12+1,p=r[Uc(n)](),d=r[Xc(n)](),f=r[Zc(n)](),g=(i instanceof dc?i:Mc(i||wc)||bc.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),x=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[a-1]).replace(/{MMM}/g,v[a-1]).replace(/{MM}/g,Nc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,Nc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,x[u]).replace(/{e}/g,u+"").replace(/{HH}/g,Nc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,Nc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,Nc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,Nc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,Nc(f,3)).replace(/{S}/g,f+"")}function Bc(t,e){var n=jr(t),i=n[Wc(e)]()+1,r=n[Hc(e)](),o=n[Yc(e)](),a=n[Uc(e)](),s=n[Xc(e)](),l=0===n[Zc(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function Fc(t,e,n){var i=j(t)?jr(t):t;switch(e=e||Bc(t,n)){case"year":return i[Gc(n)]();case"half-year":return i[Wc(n)]()>=6?1:0;case"quarter":return Math.floor((i[Wc(n)]()+1)/4);case"month":return i[Wc(n)]();case"day":return i[Hc(n)]();case"half-day":return i[Yc(n)]()/24;case"hour":return i[Yc(n)]();case"minute":return i[Uc(n)]();case"second":return i[Xc(n)]();case"millisecond":return i[Zc(n)]()}}function Gc(t){return t?"getUTCFullYear":"getFullYear"}function Wc(t){return t?"getUTCMonth":"getMonth"}function Hc(t){return t?"getUTCDate":"getDate"}function Yc(t){return t?"getUTCHours":"getHours"}function Uc(t){return t?"getUTCMinutes":"getMinutes"}function Xc(t){return t?"getUTCSeconds":"getSeconds"}function Zc(t){return t?"getUTCMilliseconds":"getMilliseconds"}function jc(t){return t?"setUTCFullYear":"setFullYear"}function qc(t){return t?"setUTCMonth":"setMonth"}function Kc(t){return t?"setUTCDate":"setDate"}function $c(t){return t?"setUTCHours":"setHours"}function Jc(t){return t?"setUTCMinutes":"setMinutes"}function Qc(t){return t?"setUTCSeconds":"setSeconds"}function tp(t){return t?"setUTCMilliseconds":"setMilliseconds"}function ep(t){if(!eo(t))return X(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function np(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var ip=st,rp=/([&<>"'])/g,op={"&":"&","<":"<",">":">",'"':""","'":"'"};function ap(t){return null==t?"":(t+"").replace(rp,(function(t,e){return op[e]}))}function sp(t,e,n){function i(t){return t&&ut(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?jr(t):t;if(!isNaN(+s))return Vc(s,"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return Z(t)?i(t):j(t)&&r(t)?t+"":"-";var l=to(t);return r(l)?ep(l):Z(t)?i(t):"boolean"==typeof t?t+"":"-"}var lp=["a","b","c","d","e","f","g"],up=function(t,e){return"{"+t+(null==e?"":e)+"}"};function hp(t,e,n){Y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o':'':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|} ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function pp(t,e){return e=e||"transparent",X(t)?t:q(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function dp(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var fp=E,gp=["left","right","top","bottom","width","height"],yp=[["width","left","right"],["height","top","bottom"]];function vp(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var mp=vp;H(vp,"vertical"),H(vp,"horizontal");function xp(t,e,n){n=ip(n||0);var i=e.width,r=e.height,o=Er(t.left,i),a=Er(t.top,r),s=Er(t.right,i),l=Er(t.bottom,r),u=Er(t.width,i),h=Er(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new sr(o+n[3],a+n[0],u,h);return f.margin=n,f}function _p(t,e,n,i,r,o){var a,s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if((o=o||t).x=t.x,o.y=t.y,!s&&!l)return!1;if("raw"===u)a="group"===t.type?new sr(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(a=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(a=a.clone()).applyTransform(h)}var c=xp(k({width:a.width,height:a.height},e),n,i),p=s?c.x-a.x:0,d=l?c.y-a.y:0;return"raw"===u?(o.x=p,o.y=d):(o.x+=p,o.y+=d),o===t&&t.markRedraw(),!0}function bp(t){var e=t.layoutMode||t.constructor.layoutMode;return q(e)?e:e?{type:e}:null}function wp(t,e,n){var i=n&&n.ignoreSize;!Y(i)&&(i=[i,i]);var r=a(yp[0],0),o=a(yp[1],1);function a(n,r){var o={},a=0,u={},h=0;if(fp(n,(function(e){u[e]=t[e]})),fp(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c=0;a--)o=C(o,n[a],!0);e.defaultOption=o}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Ao(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.prototype.getZLevelKey=function(){return""},e.prototype.setZLevel=function(t){this.option.zlevel=t},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(dc);zo(Tp,dc),Go(Tp),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=No(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=No(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Tp),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return E(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return E(t,(function(t){P(e,t)>=0&&n.push(t)})),n}(a.originalDeps=e(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),E(s,(function(t){P(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);P(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(E(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),E(c.successor,p?f:d)}E(u,(function(){var t="";throw new Error(t)}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(Tp,(function(t){var e=[];E(Tp.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=z(e,(function(t){return No(t).main})),"dataset"!==t&&P(e,"dataset")<=0&&e.unshift("dataset");return e}));var Cp="";"undefined"!=typeof navigator&&(Cp=navigator.platform||"");var Dp="rgba(0, 0, 0, 0.2)",Ap={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Dp,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Dp,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Dp,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Dp,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Dp,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Dp,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Cp.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},kp=ft(["tooltip","label","itemName","itemId","itemGroupId","seriesName"]),Lp="original",Pp="arrayRows",Op="objectRows",Rp="keyedColumns",Np="typedArray",Ep="unknown",zp="column",Vp="row",Bp=1,Fp=2,Gp=3,Wp=So();function Hp(t,e,n){var i={},r=Up(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=Wp(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;E(t=t.slice(),(function(e,n){var r=q(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;ie)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var id=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new dc(i),this._locale=new dc(r),this._optionManager=o},e.prototype.setOption=function(t,e,n){var i=ad(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,ad(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);0,this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):$p(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&E(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=ft(),s=e&&e.replaceMergeMainTypeMap;Wp(this).datasetMap=ft(),E(t,(function(t,e){null!=t&&(Tp.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?T(t):C(n[e],t,!0))})),s&&s.each((function(t,e){Tp.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),Tp.topologicalTravel(o,Tp.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=jp.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,ho(t[e])),a=i.get(e),l=a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=yo(a,o,l);(function(t,e,n){E(t,(function(t){var i=t.newOption;q(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Tp),n[e]=null,i.set(e,null),r.set(e,0);var h,c=[],p=[],d=0;E(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=Tp.getClass(e,t.keyInfo.subType,!o);if(!a)return;if("tooltip"===e){if(h)return void 0;h=!0}if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=A({componentIndex:n},t.keyInfo);A(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(c.push(i.option),p.push(i),d++):(c.push(void 0),p.push(void 0))}),this),n[e]=c,i.set(e,p),r.set(e,d),"series"===e&&qp(this)}),this),this._seriesIndices||qp(this)},e.prototype.getOption=function(){var t=T(this.option);return E(t,(function(e,n){if(Tp.hasClass(n)){for(var i=ho(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!bo(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var fd=E,gd=q,yd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function vd(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=yd.length;n=0;g--){var y=t[g];if(s||(p=y.data.rawIndexOf(y.stackedByDimension,c)),p>=0){var v=y.data.getByRawIndex(y.stackResultDimension,p);if("all"===l||"positive"===l&&v>0||"negative"===l&&v<0||"samesign"===l&&d>=0&&v>0||"samesign"===l&&d<=0&&v<0){d=Hr(d,v),f=v;break}}}return i[0]=d,i[1]=f,i}))}))}var Nd,Ed,zd,Vd,Bd,Fd=function(t){this.data=t.data||(t.sourceFormat===Rp?{}:[]),this.sourceFormat=t.sourceFormat||Ep,this.seriesLayoutBy=t.seriesLayoutBy||zp,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;nu&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return af(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function uf(t){var e,n;return q(t)?t.type&&(n=t):e=t,{text:e,frag:n}}function hf(t){return new cf(t)}var cf=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p1&&i>0?s:a}};return o;function a(){return e=t?null:oe},gte:function(t,e){return t>=e}},vf=function(){function t(t,e){if(!j(e)){var n="";0,ao(n)}this._opFn=yf[t],this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){return j(t)?this._opFn(t,this._rvalFloat):this._opFn(to(t),this._rvalFloat)},t}(),mf=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=j(t)?t:to(t),i=j(e)?e:to(e),r=isNaN(n),o=isNaN(i);if(r&&(n=this._incomparable),o&&(i=this._incomparable),r&&o){var a=X(t),s=X(e);a&&(n=s?t:0),s&&(i=a?e:0)}return ni?-this._resultLT:0},t}(),xf=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=to(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function _f(t,e){return"eq"===t||"ne"===t?new xf("eq"===t,e):mt(yf,t)?new vf(t,e):null}var bf=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return df(t,e)},t}();function wf(t){var e=t.sourceFormat;if(!Df(e)){var n="";0,ao(n)}return t.data}function Sf(t){var e=t.sourceFormat,n=t.data;if(!Df(e)){var i="";0,ao(i)}if(e===Pp){for(var r=[],o=0,a=n.length;o65535?Lf:Pf}function zf(t,e,n,i,r){var o=Nf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;ug[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=z(o,(function(t){return t.property})),u=0;uy[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e=0&&e=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&nt))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r=u&&x<=h||isNaN(x))&&(a[s++]=d),d++}p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g=u&&x<=h||isNaN(x))&&(_>=v&&_<=m||isNaN(_))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g=u&&x<=h||isNaN(x))&&(a[s++]=b)}else for(g=0;gt[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return sy[1]&&(y[1]=g)}}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(Ef(this._rawCount))(Math.min(2*(Math.ceil(s/u)+2),s));c[l++]=h;for(var p=1;pn&&(n=i,r=I)}M>0&&M<_-x&&(c[l++]=Math.min(S,r),r=Math.max(S,r)),c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(Ef(this._rawCount))(Math.ceil(u/s)),p=0,d=0;du-d&&(s=u-d,a.length=s);for(var f=0;fh[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();ra&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return df(t[i],this._dimensions[i])}Af={arrayRows:t,objectRows:function(t,e,n,i){return df(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return df(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),Bf=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(Gf(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=$(a=o.get("data",!0))?Np:Lp,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=rt(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=rt(h.sourceHeader,c.sourceHeader),f=rt(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[Wd(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else{t=[Wd(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var o="";1!==t.length&&Wf(o)}var a,s=[],l=[];return E(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||Wf(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=ho(t),r=i.length,o="";r||ao(o);for(var a=0,s=r;a1||n>0&&!t.noHeader;return E(t.blocks,(function(t){var n=qf(t);n>=e&&(e=n+ +(i&&(!n||Zf(t)&&!t.noHeader)))})),e}return 0}function Kf(t,e,n,i){var r,o=e.noHeader,a=(r=qf(e),{html:Yf[r],richText:Uf[r]}),s=[],l=e.blocks||[];lt(!l||Y(l)),l=l||[];var u=t.orderMode;if(e.sortBlocks&&u){l=l.slice();var h={valueAsc:"asc",valueDesc:"desc"};if(mt(h,u)){var c=new mf(h[u],null);l.sort((function(t,e){return c.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===u&&l.reverse()}E(l,(function(n,r){var o=e.valueFormatter,l=jf(n)(o?A(A({},t),{valueFormatter:o}):t,n,r>0?a.html:0,i);null!=l&&s.push(l)}));var p="richText"===t.renderMode?s.join(a.richText):Qf(s.join(""),o?n:a.html);if(o)return p;var d=sp(e.header,"ordinal",t.useUTC),f=Hf(i,t.renderMode).nameStyle;return"richText"===t.renderMode?tg(t,d,f)+a.richText+p:Qf('
    '+ap(d)+"
    "+p,n)}function $f(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=t.useUTC,h=e.valueFormatter||t.valueFormatter||function(t){return z(t=Y(t)?t:[t],(function(t,e){return sp(t,Y(d)?d[e]:d,u)}))};if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":sp(l,"ordinal",u),d=e.valueType,f=a?[]:h(e.value),g=!s||!o,y=!s&&o,v=Hf(i,r),m=v.nameStyle,x=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":tg(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(Y(e)?e.join(" "):e,o)}(t,f,g,y,x)):Qf((s?"":c)+(o?"":function(t,e,n){return''+ap(t)+""}(p,!s,m))+(a?"":function(t,e,n,i){var r=n?"10px":"20px",o=e?"float:right;margin-left:"+r:"";return t=Y(t)?t:[t],''+z(t,(function(t){return ap(t)})).join("  ")+""}(f,g,y,x)),n)}}function Jf(t,e,n,i,r,o){if(t)return jf(t)({useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e,valueFormatter:t.valueFormatter},t,0,o)}function Qf(t,e){return'
    '+t+'
    '}function tg(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function eg(t,e){return pp(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function ng(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var ig=function(){function t(){this.richTextStyles={},this._nextStyleNameId=no()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=cp({color:e,type:t,renderMode:n,markerId:i});return X(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};Y(e)?E(e,(function(t){return A(n,t)})):A(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function rg(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=Y(c),d=eg(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=V(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(Xf("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?E(i,(function(t){h(af(o,n,t),t)})):E(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=af(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=_o(o),v=y&&o.name||"",m=l.getName(a),x=s?v:m;return Xf("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[Xf("nameValue",{markerType:"item",markerColor:d,name:x,noName:!ut(x),value:e,valueType:n})].concat(i||[])})}var og=So();function ag(t,e){return t.getName(e)||t.getId(e)}var sg=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=hf({count:ug,reset:hg}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(og(this).sourceManager=new Bf(this)).prepareSource();var i=this.getInitialData(t,n);pg(i,this),this.dataTask.context.data=i,og(this).dataBeforeProcessed=i,lg(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=bp(this),i=n?Sp(t):{},r=this.subType;Tp.hasClass(r)&&(r+="Series"),C(t,e.getTheme().get(this.subType)),C(t,this.getDefaultOption()),co(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&wp(t,i,n)},e.prototype.mergeOption=function(t,e){t=C(this.option,t,!0),this.fillDataTextStyle(t.data);var n=bp(this);n&&wp(this.option,t,n);var i=og(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);pg(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,og(this).dataBeforeProcessed=r,lg(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!$(t))for(var e=["show"],n=0;nthis.getShallow("animationThreshold")&&(e=!1),!!e},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=td.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n){var i=this.option.selectedMode,r=this.getData(e);if("series"===i||"all"===n)return this.option.selectedMap={},void(this._selectedDataIndicesMap={});for(var o=0;o=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(e);return("all"===n||n[ag(i,t)])&&!i.getItemModel(t).get(["select","disabled"])},e.prototype.isUniversalTransitionEnabled=function(){if(this.__universalTransitionEnabled)return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},e.prototype._innerSelect=function(t,e){var n,i,r=this.option,o=r.selectedMode,a=e.length;if(o&&a)if("series"===o)r.selectedMap="all";else if("multiple"===o){q(r.selectedMap)||(r.selectedMap={});for(var s=r.selectedMap,l=0;l0&&this._innerSelect(t,e)}},e.registerClass=function(t){return Tp.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(Tp);function lg(t){var e=t.name;_o(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return E(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function ug(t){return t.model.getRawData().count()}function hg(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),cg}function cg(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function pg(t,e){E(gt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,H(dg,e))}))}function dg(t,e){var n=fg(t);return n&&n.setOutputEnd((e||this).count()),e}function fg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}R(sg,lf),R(sg,td),zo(sg,Tp);var gg=function(){function t(){this.group=new Cr,this.uid=gc("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.toggleBlurSeries=function(t,e,n){},t.prototype.eachRendered=function(t){var e=this.group;e&&e.traverse(t)},t}();function yg(){var t=So();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Eo(gg),Go(gg);var vg=So(),mg=yg(),xg=function(){function t(){this.group=new Cr,this.uid=gc("viewChart"),this.renderTask=hf({plan:wg,reset:Sg}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){0},t.prototype.highlight=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&bg(r,i,"emphasis")},t.prototype.downplay=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&bg(r,i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.eachRendered=function(t){Vh(this.group,t)},t.markUpdateMethod=function(t,e){vg(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function _g(t,e,n){t&&Fl(t)&&("emphasis"===e?_l:bl)(t,n)}function bg(t,e,n){var i=wo(t,e),r=e&&null!=e.highlightKey?function(t){var e=Xs[t];return null==e&&Us<=32&&(e=Xs[t]=Us++),e}(e.highlightKey):null;null!=i?E(ho(i),(function(e){_g(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){_g(t,n,r)}))}function wg(t){return mg(t.model)}function Sg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&vg(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),Mg[l]}Eo(xg),Go(xg);var Mg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Ig="\0__throttleOriginMethod",Tg="\0__throttleRate",Cg="\0__throttleType";function Dg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function Ag(t,e,n,i){var r=t[e];if(r){var o=r[Ig]||r,a=r[Cg];if(r[Tg]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Dg(o,n,"debounce"===i))[Ig]=o,r[Cg]=i,r[Tg]=n}return r}}function kg(t,e){var n=t[e];n&&n[Ig]&&(n.clear&&n.clear(),t[e]=n[Ig])}var Lg=So(),Pg={itemStyle:Wo(hc,!0),lineStyle:Wo(sc,!0)},Og={lineStyle:"stroke",itemStyle:"fill"};function Rg(t,e){var n=t.visualStyleMapper||Pg[e];return n||(console.warn("Unkown style type '"+e+"'."),Pg.itemStyle)}function Ng(t,e){var n=t.visualDrawType||Og[e];return n||(console.warn("Unkown style type '"+e+"'."),"fill")}var Eg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=Rg(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=Ng(t,i),l=o[s],u=U(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||U(o.fill)?c:o.fill,o.stroke="auto"===o.stroke||U(o.stroke)?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=A({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},zg=new dc,Vg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=Rg(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){zg.option=n[i];var a=r(zg);A(t.ensureUniqueItemVisual(e,"style"),a),zg.option.decal&&(t.setItemVisual(e,"decal",zg.option.decal),zg.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},Bg={performRawSeries:!0,overallReset:function(t){var e=ft();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),Lg(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=Lg(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=Ng(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},Fg=Math.PI;var Gg=function(){function t(t,e,n,i){this._stageTaskMap=ft(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=ft();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;E(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),o="";lt(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}E(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=ft(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||hf({plan:Xg,reset:Zg,count:Kg}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||hf({reset:Wg});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ft(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,hf({reset:Hg,onDirty:Ug})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}lt(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,E(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return U(t)&&(t={overallReset:t,seriesType:$g(t)}),t.uid=gc("stageHandler"),e&&(t.visualType=e),t},t}();function Wg(t){t.overallReset(t.ecModel,t.api,t.payload)}function Hg(t){return t.overallProgress&&Yg}function Yg(){this.agent.dirty(),this.getDownstream().dirty()}function Ug(){this.agent&&this.agent.dirty()}function Xg(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function Zg(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=ho(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?z(e,(function(t,e){return qg(e)})):jg}var jg=qg(0);function qg(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),hy=["symbol","symbolSize","symbolRotate","symbolOffset"],cy=hy.concat(["symbolKeepAspect"]),py={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){for(var i={},r={},o=!1,a=0;a=0&&Ry(l)?l:.5,t.createRadialGradient(a,s,0,a,s,l)}(t,e,n):function(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),i=Ry(i)?i:0,r=Ry(r)?r:1,o=Ry(o)?o:0,a=Ry(a)?a:0,t.createLinearGradient(i,o,r,a)}(t,e,n),r=e.colorStops,o=0;o0&&(e=i.lineDash,n=i.lineWidth,e&&"solid"!==e&&n>0?"dashed"===e?[4*n,2*n]:"dotted"===e?[n]:j(e)?[e]:Y(e)?e:null:null),o=i.lineDashOffset;if(r){var a=i.strokeNoScale&&t.getLineScale?t.getLineScale():1;a&&1!==a&&(r=z(r,(function(t){return t/a})),o/=a)}return[r,o]}var By=new qa(!0);function Fy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function Gy(t){return"string"==typeof t&&"none"!==t}function Wy(t){var e=t.fill;return null!=e&&"none"!==e}function Hy(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function Yy(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function Uy(t,e,n){var i=Zo(e.image,e.__image,n);if(qo(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r&&r.setTransform){var o=new DOMMatrix;o.translateSelf(e.x||0,e.y||0),o.rotateSelf(0,0,(e.rotation||0)*_t),o.scaleSelf(e.scaleX||1,e.scaleY||1),r.setTransform(o)}return r}}var Xy=["shadowBlur","shadowOffsetX","shadowOffsetY"],Zy=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function jy(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){$y(t,r),o=!0;var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?ua.opacity:a}(i||e.blend!==n.blend)&&(o||($y(t,r),o=!0),t.globalCompositeOperation=e.blend||ua.blend);for(var s=0;s0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.isSSR=function(){return this._ssr},e.prototype.setOption=function(t,e,n){if(!this.__flagInMainProcess)if(this._disposed)Hv(this.id);else{var i,r,o;if(q(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var a=new pd(this._api),s=this._theme,l=this._model=new id;l.scheduler=this._scheduler,l.ssr=this._ssr,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},Zv);var u={seriesTransition:o,optionChanged:!0};if(n)this.__pendingUpdate={silent:i,updateParams:u},this.__flagInMainProcess=!1,this.getZr().wakeUp();else{try{_v(this),Sv.update.call(this,null,u)}catch(t){throw this.__pendingUpdate=null,this.__flagInMainProcess=!1,t}this._ssr||this._zr.flush(),this.__pendingUpdate=null,this.__flagInMainProcess=!1,Cv.call(this,i),Dv.call(this,i)}}},e.prototype.setTheme=function(){oo()},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||cv&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},e.prototype.renderToCanvas=function(t){t=t||{};var e=this._zr.painter;return e.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.renderToSVGString=function(t){t=t||{};var e=this._zr.painter;return e.renderToString({useViewBox:t.useViewBox})},e.prototype.getSvgDataURL=function(){if(r.svgSupported){var t=this._zr;return E(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;E(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.renderToCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return E(i,(function(t){t.group.ignore=!1})),o}Hv(this.id)},e.prototype.getConnectedDataURL=function(t){if(!this._disposed){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(Jv[n]){var a=o,s=o,l=-1/0,u=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();E($v,(function(o,h){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.renderToCanvas(T(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),s=i(d.top,s),l=r(d.right,l),u=r(d.bottom,u),c.push({dom:p,left:d.left,top:d.top})}}));var d=(l*=p)-(a*=p),f=(u*=p)-(s*=p),g=h.createCanvas(),y=Lr(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return E(c,(function(t){var e=t.left-a,n=t.top-s;v+=''+t.dom+""})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Cs({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),E(c,(function(t){var e=new _s({style:{x:t.left*p-a,y:t.top*p-s,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}Hv(this.id)},e.prototype.convertToPixel=function(t,e){return Mv(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return Mv(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return E(Io(this._model,t),(function(t,i){i.indexOf("Models")>=0&&E(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}else 0}),this)}),this),!!n;Hv(this.id)},e.prototype.getVisual=function(t,e){var n=Io(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?fy(r,o,e):gy(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;E(Wv,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target,a="globalout"===t;if(a?n={}:o&&xy(o,(function(t){var e=Hs(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=A({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),E(Uv,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),E(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(my("map","selectchanged",e,i,t),my("pie","selectchanged",e,i,t)):"select"===t.fromAction?(my("map","selected",e,i,t),my("pie","selected",e,i,t)):"unselect"===t.fromAction&&(my("map","unselected",e,i,t),my("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?Hv(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)Hv(this.id);else{this._disposed=!0,this.getDom()&&ko(this.getDom(),em,"");var t=this,e=t._api,n=t._model;E(t._componentsViews,(function(t){t.dispose(n,e)})),E(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete $v[t.id]}},e.prototype.resize=function(t){if(!this.__flagInMainProcess)if(this._disposed)Hv(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__pendingUpdate&&(null==i&&(i=this.__pendingUpdate.silent),n=!0,this.__pendingUpdate=null),this.__flagInMainProcess=!0;try{n&&_v(this),Sv.update.call(this,{type:"resize",animation:A({duration:0},t&&t.animation)})}catch(t){throw this.__flagInMainProcess=!1,t}this.__flagInMainProcess=!1,Cv.call(this,i),Dv.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)Hv(this.id);else if(q(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Kv[t]){var n=Kv[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?Hv(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=A({},t);return e.type=Uv[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)Hv(this.id);else if(q(e)||(e={silent:!!e}),Yv[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;Tv.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&r.browser.weChat&&this._throttledZrFlush(),Cv.call(this,n),Dv.call(this,n)}},e.prototype.updateLabelLayout=function(){lv.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed)Hv(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))}function e(t){for(var e=[],n=t.currentStates,i=0;i0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;n.eachRendered((function(t){if(t.states&&t.states.emphasis){if(ah(t))return;if(t instanceof gs&&function(t){var e=Zs(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(t),t.__dirty){var n=t.prevStates;n&&t.useStates(n)}if(r){t.stateTransition=a;var i=t.getTextContent(),o=t.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}t.__dirty&&e(t)}}))}_v=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),bv(t,!0),bv(t,!1),e.plan()},bv=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;le.get("hoverLayerThreshold")&&!r.node&&!r.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.eachRendered((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,e),lv.trigger("series:afterupdate",e,n,l)},Ev=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},zv=function(t){t.__needsUpdateStatus&&(t.getZr().storage.traverse((function(t){ah(t)||e(t)})),t.__needsUpdateStatus=!1)},Rv=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){_l(e,n),Ev(t)},i.prototype.leaveEmphasis=function(e,n){bl(e,n),Ev(t)},i.prototype.enterBlur=function(e){wl(e),Ev(t)},i.prototype.leaveBlur=function(e){Sl(e),Ev(t)},i.prototype.enterSelect=function(e){Ml(e),Ev(t)},i.prototype.leaveSelect=function(e){Il(e),Ev(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(ld))(t)},Nv=function(t){function e(t,e){for(var n=0;n=0)){gm.push(n);var o=Gg.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function vm(t,e){Kv[t]=e}function mm(t,e,n){var i=hv("registerMap");i&&i(t,e,n)}var xm=function(t){var e=(t=T(t)).type,n="";e||ao(n);var i=e.split(":");2!==i.length&&ao(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,Tf.set(e,t)};fm(pv,Eg),fm(dv,Vg),fm(dv,Bg),fm(pv,py),fm(dv,dy),fm(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=rv(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=rv(r,e)}}))})),am(Od),sm(900,(function(t){var e=ft();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(Rd)})),vm("default",(function(t,e){k(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Cr,i=new Cs({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new ks({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new Cs({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new Hu({shape:{startAngle:-Fg/2,endAngle:-Fg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*Fg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*Fg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),cm({type:Js,event:Js,update:Js},xt),cm({type:Qs,event:Qs,update:Qs},xt),cm({type:tl,event:tl,update:tl},xt),cm({type:el,event:el,update:el},xt),cm({type:nl,event:nl,update:nl},xt),om("light",iy),om("dark",ly);var _m=[],bm={registerPreprocessor:am,registerProcessor:sm,registerPostInit:lm,registerPostUpdate:um,registerUpdateLifecycle:hm,registerAction:cm,registerCoordinateSystem:pm,registerLayout:dm,registerVisual:fm,registerTransform:xm,registerLoading:vm,registerMap:mm,registerImpl:function(t,e){uv[t]=e},PRIORITY:fv,ComponentModel:Tp,ComponentView:gg,SeriesModel:sg,ChartView:xg,registerComponentModel:function(t){Tp.registerClass(t)},registerComponentView:function(t){gg.registerClass(t)},registerSeriesModel:function(t){sg.registerClass(t)},registerChartView:function(t){xg.registerClass(t)},registerSubTypeDefaulter:function(t,e){Tp.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){Pr(t,e)}};function wm(t){Y(t)?E(t,(function(t){wm(t)})):P(_m,t)>=0||(_m.push(t),U(t)&&(t={install:t}),t.install(bm))}function Sm(t){return null==t?0:t.length||1}function Mm(t){return t}var Im=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||Mm,this._newKeyGetter=i||Mm,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p1)for(var a=0;a30}var zm,Vm,Bm,Fm,Gm,Wm,Hm,Ym=q,Um=z,Xm="undefined"==typeof Int32Array?Array:Int32Array,Zm=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],jm=["_approximateExtent"],qm=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;Om(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===Lp&&!n.pure)for(var o=[],a=t;a0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(Y(r=this.getVisual(e))?r=r.slice():Ym(r)&&(r=A({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,Ym(e)?A(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){Ym(t)?A(this._layout,t):this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?A(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;Ys(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){E(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:Um(this.dimensions,this._getDimInfo,this),this.hostModel)),Gm(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];U(n)&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(at(arguments)))})},t.internalField=(zm=function(t){var e=t._invertedIndicesMap;E(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new Xm(o.categories.length);for(var s=0;s1&&(s+="__ec__"+u),i[e]=s}})),t}();function Km(t,e){Gd(t)||(t=Hd(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=ft(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return E(e,(function(t){var e;q(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&Em(a),l=i===t.dimensionsDefine,u=l?Nm(t):Rm(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=ft(h),p=new Of(a),d=0;d0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new Pm({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function $m(t,e,n){var i=e.data;if(n||i.hasOwnProperty(t)){for(var r=0;i.hasOwnProperty(t+r);)r++;t+=r}return e.set(t,!0),t}var Jm=function(t){this.coordSysDims=[],this.axisMap=ft(),this.categoryAxisMap=ft(),this.coordSysName=t};var Qm={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Co).models[0],o=t.getReferringComponents("yAxis",Co).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),tx(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),tx(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Co).models[0];e.coordSysDims=["single"],n.set("single",r),tx(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Co).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),tx(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),tx(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();E(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),tx(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function tx(t){return"category"===t.get("type")}function ex(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!Om(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(E(i,(function(t,e){X(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;E(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function nx(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function ix(t,e){return nx(t,e)?t.getCalculationInfo("stackResultDimension"):e}function rx(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=Hd(t)):o=(i=r.getSource()).sourceFormat===Lp;var a=function(t){var e=t.get("coordinateSystem"),n=new Jm(e),i=Qm[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=hd.get(i);return e&&e.coordSysDims&&(n=z(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Dm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=U(l)?l:l?H(Hp,s,e):null,h=Km(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&E(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=ex(e,{schema:h,store:p}),f=new qm(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===Lp){return!Y(fo(function(t){var e=0;for(;ee[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Go(ox);var ax=0,sx=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++ax}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&z(i,lx);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if(!X(t)&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=ft(this.categories))},t}();function lx(t){return q(t)&&null!=t.value?t.value:t+""}function ux(t){return"interval"===t.type||"log"===t.type}function hx(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=$r(o/e,!0);null!=n&&ai&&(a=r.interval=i);var s=r.intervalPrecision=px(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),dx(t,0,e),dx(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[zr(Math.ceil(t[0]/a)*a,s),zr(Math.floor(t[1]/a)*a,s)],t),r}function cx(t){var e=Math.pow(10,Kr(t)),n=t/e;return n?2===n?n=3:3===n?n=5:n*=2:n=1,zr(n*e)}function px(t){return Br(t)+2}function dx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function fx(t,e){return t>=e[0]&&t<=e[1]}function gx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function yx(t,e){return t*(e[1]-e[0])+e[0]}var vx=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new sx({})),Y(i)&&(i=new sx({categories:z(i,(function(t){return q(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return null==t?NaN:X(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return fx(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return gx(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(yx(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r=0&&t=0&&t=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.calcNiceTicks=function(){},e.prototype.calcNiceExtent=function(){},e.type="ordinal",e}(ox);ox.registerClass(vx);var mx=zr,xx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return fx(t,this._extent)},e.prototype.normalize=function(t){return gx(t,this._extent)},e.prototype.scale=function(t){return yx(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=px(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:mx(s+e,r)}):o.push({value:n[1]})),o},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;ri[0]&&h0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return E(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=Er(t.get("barWidth"),i),d=Er(t.get("barMaxWidth"),i),f=Er(t.get("barMinWidth")||(Ox(t)?.5:1),i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:Tx(r),stackId:Ix(t)})})),Ax(n)}function Ax(t){var e={};E(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=G(i).length;o=Math.max(35-4*a,15)+"%"}var s=Er(o,r),l=Er(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),E(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&ei&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;E(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;E(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function kx(t,e){var n=Cx(t,e),i=Dx(n);E(n,(function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),r=Ix(t),o=i[Tx(n)][r],a=o.offset,s=o.width;e.setLayout({bandWidth:o.bandWidth,offset:a,size:s})}))}function Lx(t){return{seriesType:t,plan:yg(),reset:function(t){if(Px(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.getDimensionIndex(e.mapDimension(r.dim)),a=e.getDimensionIndex(e.mapDimension(i.dim)),s=t.get("showBackground",!0),l=e.mapDimension(r.dim),u=e.getCalculationInfo("stackResultDimension"),h=nx(e,l)&&!!e.getCalculationInfo("stackedOnSeries"),c=r.isHorizontal(),p=function(t,e){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}(0,r),d=Ox(t),f=t.get("barMinHeight")||0,g=u&&e.getDimensionIndex(u),y=e.getLayout("size"),v=e.getLayout("offset");return{progress:function(t,e){for(var i,r=t.count,l=d&&Sx(3*r),u=d&&s&&Sx(3*r),m=d&&Sx(r),x=n.master.getRect(),_=c?x.width:x.height,b=e.getStore(),w=0;null!=(i=t.next());){var S=b.get(h?g:o,i),M=b.get(a,i),I=p,T=void 0;h&&(T=+S-b.get(o,i));var C=void 0,D=void 0,A=void 0,k=void 0;if(c){var L=n.dataToPoint([S,M]);if(h)I=n.dataToPoint([T,M])[0];C=I,D=L[1]+v,A=L[0]-I,k=y,Math.abs(A)0)for(var s=0;s=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(Y(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return Vc(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(){var t=this._interval,e=this._extent,n=[];if(!t)return n;n.push({value:e[0],level:0});var i=this.getSetting("useUTC"),r=function(t,e,n,i){var r=1e4,o=Rc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}0;var x=B(z(u,(function(t){return B(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),_=[],b=x.length-1;for(d=0;dn&&(this._approxInterval=n);var o=Nx.length,a=Math.min(function(t,e,n,i){for(;n>>1;t[r][1]16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function zx(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function Vx(t){return(t/=Cc)>12?12:t>6?6:t>3.5?4:t>2?2:1}function Bx(t,e){return(t/=e?Tc:Ic)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function Fx(t){return $r(t,!0)}function Gx(t,e,n){var i=new Date(t);switch(Ec(e)){case"year":case"month":i[qc(n)](0);case"day":i[Kc(n)](1);case"hour":i[$c(n)](0);case"minute":i[Jc(n)](0);case"second":i[Qc(n)](0),i[tp(n)](0)}return i.getTime()}ox.registerClass(Rx);var Wx=ox.prototype,Hx=xx.prototype,Yx=zr,Ux=Math.floor,Xx=Math.ceil,Zx=Math.pow,jx=Math.log,qx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new xx,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return z(Hx.getTicks.call(this,t),(function(t){var e=t.value,r=zr(Zx(this.base,e));return r=e===n[0]&&this._fixMin?$x(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?$x(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=this.base;t=jx(t)/jx(n),e=jx(e)/jx(n),Hx.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Wx.getExtent.call(this);e[0]=Zx(t,e[0]),e[1]=Zx(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=$x(e[0],n[0])),this._fixMax&&(e[1]=$x(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=jx(t[0])/jx(e),t[1]=jx(t[1])/jx(e),Wx.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.calcNiceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=qr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[zr(Xx(e[0]/i)*i),zr(Ux(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.calcNiceExtent=function(t){Hx.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return fx(t=jx(t)/jx(this.base),this._extent)},e.prototype.normalize=function(t){return gx(t=jx(t)/jx(this.base),this._extent)},e.prototype.scale=function(t){return t=yx(t,this._extent),Zx(this.base,t)},e.type="log",e}(ox),Kx=qx.prototype;function $x(t,e){return Yx(t,Br(e))}Kx.getMinorTicks=Hx.getMinorTicks,Kx.getLabel=Hx.getLabel,ox.registerClass(qx);var Jx=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[t_[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=Qx[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),Qx={min:"_determinedMin",max:"_determinedMax"},t_={min:"_dataMin",max:"_dataMax"};function e_(t,e,n){var i=t.rawExtentInfo;return i||(i=new Jx(t,e,n),t.rawExtentInfo=i,i)}function n_(t,e){return null==e?null:nt(e)?NaN:t.parse(e)}function i_(t,e){var n=t.type,i=e_(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=Cx("bar",a),l=!1;if(E(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=Dx(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=function(t,e,n){if(t&&e){var i=t[Tx(e)];return null!=i&&null!=n?i[Ix(n)]:i}}(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;E(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;E(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function r_(t,e){var n=e,i=i_(t,n),r=i.extent,o=n.get("splitNumber");t instanceof qx&&(t.base=n.get("logBase"));var a=t.type,s=n.get("interval"),l="interval"===a||"time"===a;t.setExtent(r[0],r[1]),t.calcNiceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:l?n.get("minInterval"):null,maxInterval:l?n.get("maxInterval"):null}),null!=s&&t.setInterval&&t.setInterval(s)}function o_(t,e){if(e=e||t.get("type"))switch(e){case"category":return new vx({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new Rx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(ox.getClass(e)||xx)}}function a_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):X(i)?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):U(i)?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(s_(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function s_(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function l_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new sr(t.x,t.y,o,a)}function u_(t){var e=t.get("interval");return null==e?"auto":e}function h_(t){return"category"===t.type&&0===u_(t.getLabelModel())}function c_(t,e){var n={};return E(t.mapDimensionsAll(e),(function(e){n[ix(t,e)]=!0})),G(n)}var p_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var d_={isDimensionStacked:nx,enableDataStack:ex,getStackedDimension:ix};var f_=Object.freeze({__proto__:null,createList:function(t){return rx(null,t)},getLayoutRect:xp,dataStack:d_,createScale:function(t,e){var n=e;e instanceof dc||(n=new dc(e));var i=o_(n);return i.setExtent(t[0],t[1]),r_(i,n),i},mixinAxisModelCommonMethods:function(t){R(t,p_)},getECData:Hs,createTextStyle:function(t,e){return Uh(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return Km(t,e).dimensions},createSymbol:Ly,enableHoverEmphasis:Ol});function g_(t,e){return Math.abs(t-e)<1e-8}function y_(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;on&&(t=r,n=a)}if(t)return function(t){for(var e=0,n=0,i=0,r=t.length,o=t[r-1][0],a=t[r-1][1],s=0;s>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function C_(t,e){return z(B((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;return null==n&&(n=1024),E(e.features,(function(t){var e=t.geometry,i=e.encodeOffsets,r=e.coordinates;if(i)switch(e.type){case"LineString":e.coordinates=T_(r,i,n);break;case"Polygon":case"MultiLineString":I_(r,i,n);break;case"MultiPolygon":E(r,(function(t,e){return I_(t,i[e],n)}))}})),e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];switch(i.type){case"Polygon":var o=i.coordinates;r.push(new b_(o[0],o.slice(1)));break;case"MultiPolygon":E(i.coordinates,(function(t){t[0]&&r.push(new b_(t[0],t.slice(1)))}));break;case"LineString":r.push(new w_([i.coordinates]));break;case"MultiLineString":r.push(new w_(i.coordinates))}var a=new S_(n[e||"name"],r,n.cp);return a.properties=n,a}))}var D_=Object.freeze({__proto__:null,linearMap:Nr,round:zr,asc:Vr,getPrecision:Br,getPrecisionSafe:Fr,getPixelPrecision:Gr,getPercentWithPrecision:Wr,MAX_SAFE_INTEGER:Yr,remRadian:Ur,isRadianAroundZero:Xr,parseDate:jr,quantity:qr,quantityExponent:Kr,nice:$r,quantile:Jr,reformIntervals:Qr,isNumeric:eo,numericToNumber:to}),A_=Object.freeze({__proto__:null,parse:jr,format:Vc}),k_=Object.freeze({__proto__:null,extendShape:fh,extendPath:yh,makePath:xh,makeImage:_h,mergePath:wh,resizePath:Sh,createIcon:Ph,updateProps:rh,initProps:oh,getTransform:Ih,clipPointsByRect:kh,clipRectByRect:Lh,registerShape:vh,getShapeClass:mh,Group:Cr,Image:_s,Text:ks,Circle:hu,Ellipse:pu,Sector:Cu,Ring:Au,Polygon:Pu,Polyline:Ru,Rect:Cs,Line:zu,BezierCurve:Gu,Arc:Hu,IncrementalDisplayable:th,CompoundPath:Yu,LinearGradient:Xu,RadialGradient:Zu,BoundingRect:sr}),L_=Object.freeze({__proto__:null,addCommas:ep,toCamelCase:np,normalizeCssArray:ip,encodeHTML:ap,formatTpl:hp,getTooltipMarker:cp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=jr(e),r=n?"getUTC":"get",o=i[r+"FullYear"](),a=i[r+"Month"]()+1,s=i[r+"Date"](),l=i[r+"Hours"](),u=i[r+"Minutes"](),h=i[r+"Seconds"](),c=i[r+"Milliseconds"]();return t=t.replace("MM",Nc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",Nc(o%100+"",2)).replace("dd",Nc(s,2)).replace("d",s).replace("hh",Nc(l,2)).replace("h",l).replace("mm",Nc(u,2)).replace("m",u).replace("ss",Nc(h,2)).replace("s",h).replace("SSS",Nc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:$o,getTextRect:function(t,e,n,i,r,o,a,s){return new ks({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),P_=Object.freeze({__proto__:null,map:z,each:E,indexOf:P,inherits:O,reduce:V,filter:B,bind:W,curry:H,isArray:Y,isString:X,isObject:q,isFunction:U,extend:A,defaults:k,clone:T,merge:C}),O_=So();function R_(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=E_(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=a_(t);return{labels:z(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function N_(t,e){return"category"===t.type?function(t,e){var n,i,r=z_(t,"ticks"),o=u_(e),a=V_(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);if(U(o))n=G_(t,o,!0);else if("auto"===o){var s=E_(t,t.getLabelModel());i=s.labelCategoryInterval,n=z(s.labels,(function(t){return t.tickValue}))}else n=F_(t,i=o,!0);return B_(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:z(t.scale.getTicks(),(function(t){return t.value}))}}function E_(t,e){var n,i,r=z_(t,"labels"),o=u_(e),a=V_(r,o);return a||(U(o)?n=G_(t,o):(i="auto"===o?function(t){var e=O_(t).autoInterval;return null!=e?e:O_(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=F_(t,i)),B_(r,o,{labels:n,labelCategoryInterval:i}))}function z_(t,e){return O_(t)[e]||(O_(t)[e]=[])}function V_(t,e){for(var n=0;n1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=h_(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function G_(t,e,n){var i=t.scale,r=a_(t),o=[];return E(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var W_=[0,1],H_=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return Gr(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Y_(n=n.slice(),i.count()),Nr(t,W_,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Y_(n=n.slice(),i.count());var r=Nr(t,n,W_,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=z(N_(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;E(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop());i&&c(o.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=zr(t),e=zr(e),h?t>e:t0&&t<100||(t=5),z(this.scale.getMinorTicks(t),(function(t){return z(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return R_(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=a_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=cr(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var x=Math.max(0,Math.floor(Math.min(v,m))),_=O_(t.model),b=t.getExtent(),w=_.lastAutoInterval,S=_.lastTickCount;return null!=w&&null!=S&&Math.abs(w-x)<=1&&Math.abs(S-a)<=1&&w>x&&_.axisExtent0===b[0]&&_.axisExtent1===b[1]?x=w:(_.lastTickCount=a,_.lastAutoInterval=x,_.axisExtent0=b[0],_.axisExtent1=b[1]),x}(this)},t}();function Y_(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}var U_=2*Math.PI,X_=qa.CMD,Z_=["top","right","bottom","left"];function j_(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function q_(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%U_<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=ts(r),r=ts(p)}else i=ts(i),r=ts(r);i>r&&(r+=U_);var d=Math.atan2(s,a);if(d<0&&(d+=U_),d>=i&&d<=r||d+U_>=i&&d+U_<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),x=(y-a)*(y-a)+(v-s)*(v-s);return m0){e=e/180*Math.PI,eb.fromArray(t[0]),nb.fromArray(t[1]),ib.fromArray(t[2]),Ji.sub(rb,eb,nb),Ji.sub(ob,ib,nb);var n=rb.len(),i=ob.len();if(!(n<.001||i<.001)){rb.scale(1/n),ob.scale(1/i);var r=rb.dot(ob);if(Math.cos(e)1&&Ji.copy(lb,ib),lb.toArray(t[1])}}}}function hb(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,eb.fromArray(t[0]),nb.fromArray(t[1]),ib.fromArray(t[2]),Ji.sub(rb,nb,eb),Ji.sub(ob,ib,nb);var i=rb.len(),r=ob.len();if(!(i<.001||r<.001))if(rb.scale(1/i),ob.scale(1/r),rb.dot(e)=a)Ji.copy(lb,ib);else{lb.scaleAndAdd(ob,o/Math.tan(Math.PI/2-s));var l=ib.x!==nb.x?(lb.x-nb.x)/(ib.x-nb.x):(lb.y-nb.y)/(ib.y-nb.y);if(isNaN(l))return;l<0?Ji.copy(lb,nb):l>1&&Ji.copy(lb,ib)}lb.toArray(t[1])}}}function cb(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function pb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Et(i[0],i[1]),o=Et(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Bt([],i[1],i[0],a/r),l=Bt([],i[1],i[2],a/o),u=Bt([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h0&&o&&_(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),x(f,g,1),x(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function x(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){_(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function _(n,i,r){0!==n&&(u=!0);for(var o=i;o0)for(l=0;l0;l--){_(-(o[l-1]*c),l,a)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i0?_(n,0,i+1):_(-n,a-i-1,a),(t-=n)<=0)return}}function vb(t,e,n,i){return yb(t,"y","height",e,n,i)}function mb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new sr(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r=0&&n.attr(d.oldLayoutSelect),P(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),rh(n,s,e,a)}else if(n.attr(s),!Jh(n).valueAnimation){var h=rt(n.style.opacity,1);n.style.opacity=0,oh(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};Ib(c,s,Tb),Ib(c,n.states.select,Tb)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};Ib(p,s,Tb),Ib(p,n.states.emphasis,Tb)}tc(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=Mb(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),rh(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,oh(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),Db=So();var Ab=Math.sin,kb=Math.cos,Lb=Math.PI,Pb=2*Math.PI,Ob=180/Lb,Rb=function(){function t(){}return t.prototype.reset=function(t){this._start=!0,this._d=[],this._str="",this._p=Math.pow(10,t||4)},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=a-o,u=!s,h=Math.abs(l),c=En(h-Pb)||(u?l>=Pb:-l>=Pb),p=l>0?l%Pb:l%Pb+Pb,d=!1;d=!!c||!En(h)&&p>=Lb==!!u;var f=t+n*kb(o),g=e+i*Ab(o);this._start&&this._add("M",f,g);var y=Math.round(r*Ob);if(c){var v=1/this._p,m=(u?1:-1)*(Pb-v);this._add("A",n,i,y,1,+u,t+n*kb(o+m),e+i*Ab(o+m)),v>.01&&this._add("A",n,i,y,0,+u,f,g)}else{var x=t+n*kb(a),_=e+i*Ab(a);this._add("A",n,i,y,+d,+u,x,_)}},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("l",n,0),this._add("l",0,i),this._add("l",-n,0),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){for(var u=[],h=this._p,c=1;c"}(r,e.attrs)+(e.text||"")+(i?""+n+z(i,(function(e){return t(e)})).join(n)+n:"")+("")}(t)}function Ub(t){return{zrId:t,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssClassIdx:0,cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function Xb(t,e,n,i){return Hb("svg","root",{width:t,height:e,xmlns:Fb,"xmlns:xlink":Gb,version:"1.1",baseProfile:"full",viewBox:!!i&&"0 0 "+t+" "+e},n)}var Zb={cubicIn:"0.32,0,0.67,0",cubicOut:"0.33,1,0.68,1",cubicInOut:"0.65,0,0.35,1",quadraticIn:"0.11,0,0.5,0",quadraticOut:"0.5,1,0.89,1",quadraticInOut:"0.45,0,0.55,1",quarticIn:"0.5,0,0.75,0",quarticOut:"0.25,1,0.5,1",quarticInOut:"0.76,0,0.24,1",quinticIn:"0.64,0,0.78,0",quinticOut:"0.22,1,0.36,1",quinticInOut:"0.83,0,0.17,1",sinusoidalIn:"0.12,0,0.39,0",sinusoidalOut:"0.61,1,0.88,1",sinusoidalInOut:"0.37,0,0.63,1",exponentialIn:"0.7,0,0.84,0",exponentialOut:"0.16,1,0.3,1",exponentialInOut:"0.87,0,0.13,1",circularIn:"0.55,0,1,0.45",circularOut:"0,0.55,0.45,1",circularInOut:"0.85,0,0.15,1"},jb="transform-origin";function qb(t,e,n){var i=A({},t.shape);A(i,e),t.buildPath(n,i);var r=new Rb;return r.reset(Yn(t)),n.rebuildPath(r,1),r.generateStr(),r.getStr()}function Kb(t,e){var n=e.originX,i=e.originY;(n||i)&&(t[jb]=n+"px "+i+"px")}var $b={fill:"fill",opacity:"opacity",lineWidth:"stroke-width",lineDashOffset:"stroke-dashoffset"};function Jb(t,e){var n=e.zrId+"-ani-"+e.cssAnimIdx++;return e.cssAnims[n]=t,n}function Qb(t){return X(t)?Zb[t]?"cubic-bezier("+Zb[t]+")":rn(t)?t:"":""}function tw(t,e,n,i){var r=t.animators,o=r.length,a=[];if(t instanceof Yu){if(y=function(t,e,n){var i,r,o=t.shape.paths,a={};if(E(o,(function(t){var e=Ub(n.zrId);e.animation=!0,tw(t,{},e,!0);var o=e.cssAnims,s=e.cssNodes,l=G(o),u=l.length;if(u){var h=o[r=l[u-1]];for(var c in h){var p=h[c];a[c]=a[c]||{d:""},a[c].d+=p.d||""}for(var d in s){var f=s[d].animation;f.indexOf(r)>=0&&(i=f)}}})),i){e.d=!1;var s=Jb(a,n);return i.replace(r,s)}}(t,e,n))a.push(y);else if(!o)return}else if(!o)return;for(var s={},l=0;l0})).length)return Jb(h,n)+" "+r[0]+" both"}for(var g in s){var y;(y=f(s[g]))&&a.push(y)}if(a.length){var v=n.zrId+"-cls-"+n.cssClassIdx++;n.cssNodes["."+v]={animation:a.join(",")},e.class=v}}var ew=Math.round;function nw(t){return t&&X(t.src)}function iw(t){return t&&U(t.toDataURL)}function rw(t,e,n,i){Bb((function(r,o){var a="fill"===r||"stroke"===r;a&&function(t){return t&&("linear"===t.type||"radial"===t.type)}(o)?function(t,e,n,i){var r,o=t[n],a={gradientUnits:o.global?"userSpaceOnUse":"objectBoundingBox"};if(Gn(o))r="linearGradient",a.x1=o.x,a.y1=o.y,a.x2=o.x2,a.y2=o.y2;else{if(!Wn(o))return void 0;r="radialGradient",a.cx=rt(o.x,.5),a.cy=rt(o.y,.5),a.r=rt(o.r,.5)}for(var s=o.colorStops,l=[],u=0,h=s.length;ul?Dw(t,null==n[c+1]?null:n[c+1].elm,n,s,c):Aw(t,e,a,l))}(n,i,r):Mw(r)?(Mw(t.text)&&bw(n,""),Dw(n,null,r,0,r.length-1)):Mw(i)?Aw(n,i,0,i.length-1):Mw(t.text)&&bw(n,""):t.text!==e.text&&(Mw(i)&&Aw(n,i,0,i.length-1),bw(n,e.text)))}var Pw=0,Ow=function(){function t(t,e,n){if(this.type="svg",this.refreshHover=Rw("refreshHover"),this.configLayer=Rw("configLayer"),this.storage=e,this._opts=n=A({},n),this.root=t,this._id="zr"+Pw++,this._oldVNode=Xb(n.width,n.height),t&&!n.ssr){var i=this._viewport=document.createElement("div");i.style.cssText="position:relative;overflow:hidden";var r=this._svgDom=this._oldVNode.elm=Wb("svg");kw(null,this._oldVNode),i.appendChild(r),t.appendChild(i)}this.resize(n.width,n.height)}return t.prototype.getType=function(){return this.type},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.refresh=function(){if(this.root){var t=this.renderToVNode({willUpdate:!0});t.attrs.style="position:absolute;left:0;top:0;user-select:none",function(t,e){if(Tw(t,e))Lw(t,e);else{var n=t.elm,i=xw(n);Cw(e),null!==i&&(yw(i,e.elm,_w(n)),Aw(i,[t],0,0))}}(this._oldVNode,t),this._oldVNode=t}},t.prototype.renderOneToVNode=function(t){return dw(t,Ub(this._id))},t.prototype.renderToVNode=function(t){t=t||{};var e=this.storage.getDisplayList(!0),n=this._backgroundColor,i=this._width,r=this._height,o=Ub(this._id);o.animation=t.animation,o.willUpdate=t.willUpdate,o.compress=t.compress;var a=[];if(n&&"none"!==n){var s=Rn(n),l=s.color,u=s.opacity;this._bgVNode=Hb("rect","bg",{width:i,height:r,x:"0",y:"0",id:"0",fill:l,"fill-opacity":u}),a.push(this._bgVNode)}else this._bgVNode=null;var h=t.compress?null:this._mainVNode=Hb("g","main",{},[]);this._paintList(e,o,h?h.children:a),h&&a.push(h);var c=z(G(o.defs),(function(t){return o.defs[t]}));if(c.length&&a.push(Hb("defs","defs",{},c)),t.animation){var p=function(t,e,n){var i=(n=n||{}).newline?"\n":"",r=" {"+i,o=i+"}",a=z(G(t),(function(e){return e+r+z(G(t[e]),(function(n){return n+":"+t[e][n]+";"})).join(i)+o})).join(i),s=z(G(e),(function(t){return"@keyframes "+t+r+z(G(e[t]),(function(n){return n+r+z(G(e[t][n]),(function(i){var r=e[t][n][i];return"d"===i&&(r='path("'+r+'")'),i+":"+r+";"})).join(i)+o})).join(i)+o})).join(i);return a||s?[""].join(i):""}(o.cssNodes,o.cssAnims,{newline:!0});if(p){var d=Hb("style","stl",{},[],p);a.push(d)}}return Xb(i,r,a,t.useViewBox)},t.prototype.renderToString=function(t){return t=t||{},Yb(this.renderToVNode({animation:rt(t.cssAnimation,!0),willUpdate:!1,compress:!0,useViewBox:rt(t.useViewBox,!0)}),{newline:!0})},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t;var e=this._bgVNode;if(e&&e.elm){var n=Rn(t),i=n.color,r=n.opacity;e.elm.setAttribute("fill",i),r<1&&e.elm.setAttribute("fill-opacity",r)}},t.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},t.prototype._paintList=function(t,e,n){for(var i,r,o=t.length,a=[],s=0,l=0,u=0;u=0&&(!c||!r||c[f]!==r[f]);f--);for(var g=d-1;g>f;g--)i=a[--s-1];for(var y=f+1;y=a)}}for(var h=this.__startIndex;h15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var _=d.dpr,b=0;b0&&t>i[0]){for(s=0;st);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.__painter=this}},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i0?Bw:0),this._needsManuallyCompositing),u.__builtin__||I("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,E(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?C(n[t],e,!0):n[t]=e;for(var i=0;i-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"},triggerLineEvent:!1},e}(sg);function Ww(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=af(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a=0&&i.push(e[o])}return i.join(" ")}var Yw=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=Ly(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=Uw,this._symbolType=t,this.add(o)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){_l(this.childAt(0))},e.prototype.downplay=function(){bl(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t,e){var n=this.childAt(0);n.draggable=t,n.cursor=!e&&t?"move":n.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var o=t.getItemVisual(n,"symbol")||"circle",a=t.hostModel,s=e.getSymbolSize(t,n),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(o,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):rh(p,c,a,n),hh(p)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,oh(p,c,a,n)}}u&&this.childAt(0).stopAnimation("leave")},e.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f=this.childAt(0),g=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,c=i.labelStatesModels,p=i.hoverScale,d=i.cursorStyle,h=i.emphasisDisabled),!i||t.hasItemOption){var y=i&&i.itemModel?i.itemModel:t.getItemModel(e),v=y.getModel("emphasis");o=v.getModel("itemStyle").getItemStyle(),s=y.getModel(["select","itemStyle"]).getItemStyle(),a=y.getModel(["blur","itemStyle"]).getItemStyle(),l=v.get("focus"),u=v.get("blurScope"),h=v.get("disabled"),c=Yh(y),p=v.getShallow("scale"),d=y.getShallow("cursor")}var m=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(m||0)*Math.PI/180||0);var x=Oy(t.getItemVisual(e,"symbolOffset"),n);x&&(f.x=x[0],f.y=x[1]),d&&f.attr("cursor",d);var _=t.getItemVisual(e,"style"),b=_.fill;if(f instanceof _s){var w=f.style;f.useStyle(A({image:w.image,x:w.x,y:w.y,width:w.width,height:w.height},_))}else f.__isEmptyBrush?f.useStyle(A({},_)):f.useStyle(_),f.style.decal=null,f.setColor(b,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var S=t.getItemVisual(e,"liftZ"),M=this._z2;null!=S?null==M&&(this._z2=f.z2,f.z2+=S):null!=M&&(f.z2=M,this._z2=null);var I=r&&r.useNameLabel;Hh(f,c,{labelFetcher:g,labelDataIndex:e,defaultText:function(e){return I?t.getName(e):Ww(t,e)},inheritColor:b,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var T=f.ensureState("emphasis");if(T.style=o,f.ensureState("select").style=s,f.ensureState("blur").style=a,p){var C=Math.max(j(p)?p:1.1,3/this._sizeY);T.scaleX=this._sizeX*C,T.scaleY=this._sizeY*C}this.setSymbolScale(1),Rl(this,l,u,h)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e,n){var i=this.childAt(0),r=Hs(this).dataIndex,o=n&&n.animation;if(this.silent=i.silent=!0,n&&n.fadeLabel){var a=i.getTextContent();a&&sh(a,{style:{opacity:0}},e,{dataIndex:r,removeOpt:o,cb:function(){i.removeTextContent()}})}else i.removeTextContent();sh(i,{style:{opacity:0},scaleX:0,scaleY:0},e,{dataIndex:r,cb:t,removeOpt:o})},e.getSymbolSize=function(t,e){return Py(t.getItemVisual(e,"symbolSize"))},e}(Cr);function Uw(t,e){this.parent.drift(t,e)}function Xw(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Zw(t){return null==t||q(t)||(t={isIgnore:t}),t||{}}function jw(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),emphasisDisabled:n.get("disabled"),hoverScale:n.get("scale"),labelStatesModels:Yh(e),cursorStyle:e.get("cursor")}}var qw=function(){function t(t){this.group=new Cr,this._SymbolCtor=t||Yw}return t.prototype.updateData=function(t,e){this._progressiveEls=null,e=Zw(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=jw(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(Xw(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(Xw(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):rh(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}),i)})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=jw(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[],n=Zw(n);for(var r=t.start;r0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=z(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return nx(e,c[0])&&(p=!0,c[0]=d),nx(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function $w(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var Jw=Math.min,Qw=Math.max;function tS(t,e){return isNaN(t)||isNaN(e)}function eS(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y=r||g<0)break;if(tS(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var x=v-u,_=m-h;if(x*x+_*_<.5){g+=o;continue}if(a>0){for(var b=g+o,w=e[2*b],S=e[2*b+1];w===v&&S===m&&y=i||tS(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;if("x"===s){var E=T>0?1:-1;d=v-E*(R=Math.abs(k))*a,f=m,D=v+E*(N=Math.abs(L))*a,A=m}else if("y"===s){var z=C>0?1:-1;d=v,f=m-z*(R=Math.abs(P))*a,D=v,A=m+z*(N=Math.abs(O))*a}else R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=Jw(D=v+T*a*I,Qw(w,v)),A=Jw(A,Qw(S,m)),D=Qw(D,Jw(w,v)),f=m-(C=(A=Qw(A,Jw(S,m)))-m)*R/N,d=Jw(d=v-(T=D-v)*R/N,Qw(u,v)),f=Jw(f,Qw(h,m)),D=v+(T=v-(d=Qw(d,Jw(u,v))))*N/R,A=m+(C=m-(f=Qw(f,Jw(h,m))))*N/R}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var nS=function(){this.smooth=0,this.smoothConstraint=!0},iS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new nS},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&tS(n[2*r-2],n[2*r-1]);r--);for(;i=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?Ue(n,u,c,d,t,s):Ue(i,h,p,f,t,s);if(v>0)for(var m=0;m=0){y=a?He(i,h,p,f,x):He(n,u,c,d,x);return a?[t,y]:[y,t]}}n=d,i=f}}},e}(gs),rS=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(nS),oS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new rS},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&tS(n[2*o-2],n[2*o-1]);o--);for(;r=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=z(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:Tn((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;se){i?r.push(a(i,l,e)):n&&r.push(a(n,l,0),a(n,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-10,g=p[d-1].coord+10,y=g-f;if(y<.001)return"transparent";E(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new Xu(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function yS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;ai)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return E(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function vS(t,e){return[t[2*e],t[2*e+1]]}function mS(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1);Hs(d).seriesIndex=t.seriesIndex,Rl(d,L,P,O);var R=dS(t.get("smooth")),N=t.get("smoothMonotone");if(d.setShape({smooth:R,smoothMonotone:N,connectNulls:w}),f){var E=a.getCalculationInfo("stackedOnSeries"),z=0;f.useStyle(k(l.getAreaStyle(),{fill:C,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),E&&(z=dS(E.get("smooth"))),f.setShape({smooth:R,stackedOnSmooth:z,smoothMonotone:N,connectNulls:w}),Vl(f,t,"areaStyle"),Hs(f).seriesIndex=t.seriesIndex,Rl(f,L,P,O)}var V=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=V)})),this._polyline.onHoverStateChange=V,this._data=a,this._coordSys=r,this._stackedOnPoints=_,this._points=u,this._step=T,this._valueOrigin=m,t.get("triggerLineEvent")&&(this.packEventData(t,d),f&&this.packEventData(t,f))},e.prototype.packEventData=function(t,e){Hs(e).eventData={componentType:"series",componentSubType:"line",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:"line"}},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel"),c=t.get("z");(s=new Yw(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else xg.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else xg.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;gl(this._polyline,t),e&&gl(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new iS({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new oS({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");U(l)&&(l=l(null));var u=s.get("animationDelay")||0,h=U(u)?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var x=U(u)?u(o):l*m+h,_=s.getSymbolPath(),b=_.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:x}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:x}),_.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(mS(t)){var r=t.getData(),o=this._polyline,a=r.getLayout("points");if(!a)return o.removeTextContent(),void(this._endLabel=null);var s=this._endLabel;s||((s=this._endLabel=new ks({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var l=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(a);l>=0&&(Hh(o,Yh(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:l,defaultText:function(t,e,n){return null!=n?Hw(r,n):Ww(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,x=(g?d:0)*(y?-1:1),_=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=vS(u,S[0]);s.attr({x:T[0]+x,y:T[1]+_}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+x,y:T[1]+_});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=Po(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=vS(u,A);r&&(I=h.getRawValue(A)),s.attr({x:T[0]+x,y:T[1]+_})}r&&Jh(s).setLabelText(I)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,o,a){var s=this._polyline,l=this._polygon,u=t.hostModel,h=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=Kw(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],x=0;x3e3||l&&pS(p,f)>3e3)return s.stopAnimation(),s.setShape({points:d}),void(l&&(l.stopAnimation(),l.setShape({points:d,stackedOnPoints:f})));s.shape.__points=h.current,s.shape.points=c;var g={shape:{points:d}};h.current!==c&&(g.shape.__points=h.next),s.stopAnimation(),rh(s,g,u),l&&(l.setShape({points:c,stackedOnPoints:p}),l.stopAnimation(),rh(l,{shape:{stackedOnPoints:f}},u),s.shape.points!==l.shape.points&&(l.shape.points=s.shape.points));for(var y=[],v=h.status,m=0;me&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(isFinite(p)&&p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;X(r)?d=wS[r]:U(r)&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,SS))}}}}}var IS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e&&e.clampData){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(sg);sg.registerClass(IS);var TS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(){return rx(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=yc(IS.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),e}(IS),CS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},DS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new CS},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=2*Math.PI,p=h?u-lo)return!0;o=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){uh(e,t,Hs(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(xg),RS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=LS(e.x,t.x),s=PS(e.x+e.width,r),l=LS(e.y,t.y),u=PS(e.y+e.height,o),h=sr?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=PS(e.r,t.r),o=LS(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return a}},NS={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new Cs({shape:A({},i),z2:1});(u.__dataIndex=n,u.name="item",o)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?DS:Cu,h=new u({shape:i,z2:1});h.name="item";var c,p,d=WS(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===DS}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return yr(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,x=Math.sin,_=s+u*m(f),b=l+u*x(f),w="left",S="top";switch(r){case"startArc":_=s+(h-o)*m(y),b=l+(h-o)*x(y),w="center",S="top";break;case"insideStartArc":_=s+(h+o)*m(y),b=l+(h+o)*x(y),w="center",S="bottom";break;case"startAngle":_=s+d*m(f)+AS(f,o+v,!1),b=l+d*x(f)+kS(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":_=s+d*m(f)+AS(f,-o+v,!1),b=l+d*x(f)+kS(f,-o+v,!1),w="left",S="middle";break;case"middle":_=s+d*m(y),b=l+d*x(y),w="center",S="middle";break;case"endArc":_=s+(u+o)*m(y),b=l+(u+o)*x(y),w="center",S="bottom";break;case"insideEndArc":_=s+(u-o)*m(y),b=l+(u-o)*x(y),w="center",S="top";break;case"endAngle":_=s+d*m(g)+AS(g,o+v,!0),b=l+d*x(g)+kS(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":_=s+d*m(g)+AS(g,-o+v,!0),b=l+d*x(g)+kS(g,-o+v,!0),w="right",S="middle";break;default:return yr(t,e,n)}return(t=t||{}).x=_,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?0:i.startAngle,g[f]=i[f],(s?rh:oh)(h,{shape:g},o)}return h}};function ES(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?rh:oh)(n,{shape:l},e,r,null),(a?rh:oh)(n,{shape:u},e?t.baseAxis.model:null,r)}function zS(t,e){for(var n=0;n0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function WS(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function HS(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u);var h=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",c=Yh(i);Hh(t,c,{labelFetcher:o,labelDataIndex:n,defaultText:Ww(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h});var p=t.getTextContent();if(s&&p){var d=i.get(["label","position"]);t.textConfig.inside="middle"===d||null,function(t,e,n,i){if(j(i))t.setTextConfig({rotation:i});else if(Y(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}}(t,"outside"===d?h:d,WS(a),i.get(["label","rotate"]))}Qh(p,c,o.getRawValue(n),(function(t){return Hw(e,t)}));var f=i.getModel(["emphasis"]);Rl(t,f.get("focus"),f.get("blurScope"),f.get("disabled")),Vl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",E(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var YS=function(){},US=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new YS},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.baseDimIdx,r=1-this.baseDimIdx,o=[],a=[],s=this.barWidth,l=0;l=s[0]&&e<=s[0]+l[0]&&n>=s[1]&&n<=s[1]+l[1])return a[h]}return-1}(this,t.offsetX,t.offsetY);Hs(this).dataIndex=e>=0?e:null}),30,!1);function jS(t,e,n){if(uS(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var qS=2*Math.PI,KS=Math.PI/180;function $S(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function JS(t,e){var n=$S(t,e),i=t.get("center"),r=t.get("radius");Y(r)||(r=[0,r]),Y(i)||(i=[i,i]);var o=Er(n.width,e.getWidth()),a=Er(n.height,e.getHeight()),s=Math.min(o,a);return{cx:Er(i[0],o)+n.x,cy:Er(i[1],a)+n.y,r0:Er(r[0],s/2),r:Er(r[1],s/2)}}function QS(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=$S(t,n),o=JS(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*KS,c=t.get("minAngle")*KS,p=0;e.each(i,(function(t){!isNaN(t)&&p++}));var d=e.getSum(i),f=Math.PI/(d||p)*2,g=t.get("clockwise"),y=t.get("roseType"),v=t.get("stillShowZeroSum"),m=e.getDataExtent(i);m[0]=0;var x=qS,_=0,b=h,w=g?1:-1;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:g,cx:a,cy:s,r0:u,r:y?NaN:l});else{(i="area"!==y?0===d&&v?f:t*f:qS/p)n?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function rM(t){return"center"===t.position}function oM(t){var e,n,i=t.getData(),r=[],o=!1,a=(t.get("minShowLabelAngle")||0)*eM,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function d(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),f=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),x=y.get("alignTo"),_=Er(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=Er(S,u);var M=w.get("length2");if(M=Er(M,u),Math.abs(c.endAngle-c.startAngle)0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(j(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G){F=k<0?-A+B:-A}else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var U=(p.style.margin||0)+2.1;Y.y-=U/2,Y.height+=U,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Ji(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u=n.r0}},e.type="pie",e}(xg);function uM(t,e,n){e=Y(e)&&{coordDimensions:e}||A({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=Km(i,e).dimensions,o=new qm(r,t);return o.initData(i,n),o}var hM=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),cM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return uM(this,{coordDimensions:["value"],encodeDefaulter:H(Yp,this)})},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=[];return n.each(n.mapDimension("value"),(function(t){r.push(t)})),i.percent=Wr(r,e,n.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(sg);var pM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return rx(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:""},e.type="series.scatter",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},e}(sg),dM=function(){},fM=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.getDefaultShape=function(){return new dM},e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.buildPath=function(t,e){var n,i=e.points,r=e.size,o=this.symbolProxy,a=o.shape,s=t.getContext?t.getContext():t,l=s&&r[0]<4,u=this.softClipShape;if(l)this._ctx=s;else{for(this._ctx=null,n=this._off;n=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape,n=e.points,i=e.size,r=i[0],o=i[1],a=1/0,s=1/0,l=-1/0,u=-1/0,h=0;h=0&&(l.dataIndex=n+(t.startIndex||0))}))},t.prototype.remove=function(){this._clear()},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),yM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},e.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var r=bS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new gM:new qw,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type="scatter",e}(xg),vM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(Tp),mM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Co).models[0]},e.type="cartesian2dAxis",e}(Tp);R(mM,p_);var xM={show:!0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},_M=C({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},xM),bM=C({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},xM),wM={category:_M,value:bM,time:C({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},bM),log:k({logBase:10},bM)},SM={value:1,category:1,time:1,log:1};function MM(t,e,i,r){E(SM,(function(o,a){var s=C(C({},wM[a],!0),r,!0),l=function(t){function i(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e+"Axis."+a,n}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=bp(this),i=n?Sp(t):{};C(t,e.getTheme().get(a+"Axis")),C(t,this.getDefaultOption()),t.type=IM(t),n&&wp(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=sx.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",IM)}function IM(t){return t.type||(t.data?"category":"value")}var TM=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return z(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),B(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),CM=["x","y"];function DM(t){return"interval"===t.type||"time"===t.type}var AM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=CM,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(DM(t)&&DM(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=Bi([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.containZone=function(t,e){var n=this.dataToPoint(t),i=this.dataToPoint(e),r=this.getArea(),o=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]);return r.intersect(o)},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Ft(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},e.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Ft(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,o=Math.max(e[0],e[1])-i;return new sr(n,i,r,o)},e}(TM),kM=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(H_);function LM(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),it(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function PM(t){return"cartesian2d"===t.get("coordinateSystem")}function OM(t){var e={xAxisModel:null,yAxisModel:null};return E(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Co).models[0];e[i]=o})),e}var RM=Math.log;function NM(t,e,n){var i=xx.prototype,r=i.getTicks.call(n),o=i.getTicks.call(n,!0),a=r.length-1,s=i.getInterval.call(n),l=i_(t,e),u=l.extent,h=l.fixMin,c=l.fixMax;if("log"===t.type){var p=RM(t.base);u=[RM(u[0])/p,RM(u[1])/p]}t.setExtent(u[0],u[1]),t.calcNiceExtent({splitNumber:a,fixMin:h,fixMax:c});var d=i.getExtent.call(t);h&&(u[0]=d[0]),c&&(u[1]=d[1]);var f=i.getInterval.call(t),g=u[0],y=u[1];if(h&&c)f=(y-g)/a;else if(h)for(y=u[0]+f*a;yu[0]&&isFinite(g)&&isFinite(u[0]);)f=cx(f),g=u[1]-f*a;else{t.getTicks().length-1>a&&(f=cx(f));var v=f*a;(g=zr((y=Math.ceil(u[1]/f)*f)-v))<0&&u[0]>=0?(g=0,y=zr(v)):y>0&&u[1]<=0&&(y=0,g=-zr(v))}var m=(r[0].value-o[0].value)/s,x=(r[a].value-o[a].value)/s;i.setExtent.call(t,g+f*m,y+f*x),i.setInterval.call(t,f),(m||x)&&i.setNiceExtent.call(t,g+f,y-f)}var EM=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=CM,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;function i(t){var e,n=G(t),i=n.length;if(i){for(var r=[],o=i-1;o>=0;o--){var a=t[+n[o]],s=a.model,l=a.scale;ux(l)&&s.get("alignTicks")&&null==s.get("interval")?r.push(a):(r_(l,s),ux(l)&&(e=a))}r.length&&(e||r_((e=r.pop()).scale,e.model),E(r,(function(t){NM(t.scale,t.model,e.scale)})))}}this._updateScale(t,this.model),i(n.x),i(n.y);var r={};E(n.x,(function(t){VM(n,"y",t,r)})),E(n.y,(function(t){VM(n,"x",t,r)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=xp(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){E(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(E(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof vx?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=a_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h0&&i>0||n<0&&i<0)}(t)}var FM=Math.PI,GM=function(){function t(t,e){this.group=new Cr,this.opt=e,this.axisModel=t,k(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Cr({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!WM[t]},t.prototype.add=function(t){WM[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=Ur(e-t);return Xr(o)?(r=n>0?"top":"bottom",i="center"):Xr(o-FM)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),WM={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0];a&&(Ft(s,s,a),Ft(l,l,a));var u=A({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),h=new zu({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});h.anid="line",n.add(h);var c=e.get(["axisLine","symbol"]);if(null!=c){var p=e.get(["axisLine","symbolSize"]);X(c)&&(c=[c,c]),(X(p)||j(p))&&(p=[p,p]);var d=Oy(e.get(["axisLine","symbolOffset"])||0,p),f=p[0],g=p[1];E([{rotate:t.rotation+Math.PI/2,offset:d[0],r:0},{rotate:t.rotation-Math.PI/2,offset:d[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==c[i]&&null!=c[i]){var r=Ly(c[i],-f/2,-g/2,f,g,u.stroke,!0),o=e.r+e.offset;r.attr({rotation:e.rotate,x:s[0]+o*Math.cos(t.rotation),y:s[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=XM(r.getTicksCoords(),e.transform,l,k(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;hc[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,UM(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*FM/180),UM(s)?o=GM.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=Ur(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;Xr(a-FM/2)?(o=l?"bottom":"top",r="center"):Xr(a-1.5*FM)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*FM&&a>FM/2?l?"left":"right":l?"right":"left");return{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=it(t.nameTruncateMaxWidth,y.maxWidth,a),x=new ks({x:d[0],y:d[1],rotation:o.rotation,silent:GM.isLabelSilent(e),style:Uh(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(Eh({el:x,componentModel:e,itemName:r}),x.__fullText=r,x.anid="name",e.get("triggerEvent")){var _=GM.makeAxisEventDataBase(e);_.targetType="axisName",_.name=r,Hs(x).eventData=_}i.add(x),x.updateTransform(),n.add(x),x.decomposeTransform()}}};function HM(t){t&&(t.ignore=!0)}function YM(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Oi([]);return zi(r,r,-t.rotation),n.applyTransform(Ni([],r,t.getLocalTransform())),i.applyTransform(Ni([],r,e.getLocalTransform())),n.intersect(i)}}function UM(t){return"middle"===t||"center"===t}function XM(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l=0||t===e}function qM(t){var e=KM(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=$M(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=k({color:c.color},a));var d=C(T(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,showName:s,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(X(l)){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else U(l)&&(d.name=l(d.name,d));var g=new dc(d,null,this.ecModel);return R(g,p_.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:C({lineStyle:{color:"#bbb"}},xI.axisLine),axisLabel:_I(xI.axisLabel,!1),axisTick:_I(xI.axisTick,!1),splitLine:_I(xI.splitLine,!0),splitArea:_I(xI.splitArea,!0),indicator:[]},e}(Tp),wI=["axisLine","axisTickLabel","axisName"],SI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var e=t.coordinateSystem;E(z(e.getIndicatorAxes(),(function(t){var n=t.model.get("showName")?t.name:"";return new GM(t.model,{axisName:n,position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){E(wI,t.add,t),this.group.add(t.getGroup())}),this)},e.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=Y(h)?h:[h],d=Y(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,x=0;x3?1.4:r>1?1.2:1.1;LI(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);LI(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){DI(this._zr,"globalPan")||LI(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},e}(Xt);function LI(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(se(i.event),PI(t,e,n,i,r))}function PI(t,e,n,i,r){r.isAvailableBehavior=W(OI,null,n,i),t.trigger(e,r)}function OI(t,e,n){var i=n[t];return!t||i&&(!X(i)||e.event[i+"Key"])}function RI(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function NI(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var EI,zI={axisPointer:1,tooltip:1,brush:1};function VI(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!zI.hasOwnProperty(i.mainType)&&r&&r.model!==n}function BI(t){X(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var FI={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},GI=G(FI),WI={"alignment-baseline":"textBaseline","stop-color":"stopColor"},HI=G(WI),YI=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=BI(t);this._defsUsePending=[];var i=new Cr;this._root=i;var r=[],o=n.getAttribute("viewBox")||"",a=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(s)&&(s=null),KI(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=oT(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Cr).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new Cs({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=EI[s];if(u&&mt(EI,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=UI[s];if(p&&mt(UI,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new vs({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});jI(e,n),KI(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(EI={g:function(t,e){var n=new Cr;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Cs;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new hu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new zu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new pu;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=qI(i));var r=new Pu({shape:{points:n||[]},silent:!0});return jI(e,r),KI(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=qI(i));var r=new Ru({shape:{points:n||[]},silent:!0});return jI(e,r),KI(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new _s;return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Cr;return jI(e,a),KI(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Cr;return jI(e,a),KI(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=su(t.getAttribute("d")||"");return jI(e,n),KI(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),UI={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new Xu(e,n,i,r);return XI(t,o),ZI(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Zu(e,n,i);return XI(t,r),ZI(t,r),r}};function XI(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function ZI(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};rT(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function jI(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),k(e.__inheritedStyle,t.__inheritedStyle))}function qI(t){for(var e=tT(t),n=[],i=0;i0;o-=2){var a=i[o],s=i[o-1],l=tT(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":Ei(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":Vi(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":zi(r,r,-parseFloat(l[0])*nT);break;case"skewX":Ni(r,[1,0,Math.tan(parseFloat(l[0])*nT),1,0,0],r);break;case"skewY":Ni(r,[1,Math.tan(parseFloat(l[0])*nT),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),rT(t,a,s),i||function(t,e,n){for(var i=0;i0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=ft(),n=ft(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=t.geo.projection,l=s&&s.stream;function u(t,e){return e&&(t=e(t)),t&&[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]}function h(t){for(var e=[],n=!l&&s&&s.project,i=0;i=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;Hh(e,Yh(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(TT(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function PT(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):Hs(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function OT(t,e,n,i,r){t.data||Eh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function RT(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return Rl(e,a,o.get("blurScope"),o.get("disabled")),t.isGeo&&function(t,e,n){var i=Hs(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}function NT(t,e,n){var i,r=[];function o(){i=[]}function a(){i.length&&(r.push(i),i=[])}var s=e({polygonStart:o,polygonEnd:a,lineStart:o,lineEnd:a,point:function(t,e){isFinite(t)&&isFinite(e)&&i.push([t,e])},sphere:function(){}});return!n&&s.polygonStart(),E(t,(function(t){s.lineStart();for(var e=0;e-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},e.type="series.map",e.dependencies=["geo"],e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},e}(sg);function VT(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),E(e,(function(t,e){for(var n,i,r,o=(n=z(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},E(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h1?(d.width=p,d.height=p/x):(d.height=p,d.width=p*x),d.y=c[1]-d.height/2,d.x=c[0]-d.width/2;else{var b=t.getBoxLayoutParams();b.aspect=x,d=xp(b,{width:v,height:m})}this.setViewRect(d.x,d.y,d.width,d.height),this.setCenter(t.get("center"),e),this.setZoom(t.get("zoom"))}R(UT,GT);var jT=new(function(){function t(){this.dimensions=YT}return t.prototype.create=function(t,e){var n=[];function i(t){return{nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale"),projection:t.get("projection")}}t.eachComponent("geo",(function(t,r){var o=t.get("map"),a=new UT(o+r,o,A({nameMap:t.get("nameMap")},i(t)));a.zoomLimit=t.get("scaleLimit"),n.push(a),t.coordinateSystem=a,a.model=t,a.resize=ZT,a.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var r={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}})),E(r,(function(t,r){var o=z(t,(function(t){return t.get("nameMap")})),a=new UT(r,r,A({nameMap:D(o)},i(t[0])));a.zoomLimit=it.apply(null,z(t,(function(t){return t.get("scaleLimit")}))),n.push(a),a.resize=ZT,a.resize(t[0],e),E(t,(function(t){t.coordinateSystem=a,function(t,e){E(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(a,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=ft(),a=0;a=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=oC(s),o=aC(o),s&&o;){r=oC(r),a=aC(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(lC(sC(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!oC(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!aC(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function nC(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function iC(t){return arguments.length?t:uC}function rC(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function oC(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function aC(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function sC(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function lC(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function uC(t,e){return t.parentNode===e.parentNode?1:2}var hC=function(){this.parentPoint=[],this.childPoints=[]},cC=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new hC},e.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Er(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;pm.x)||(_-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),C=y.getTextContent();C&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-_:T,origin:"center"}),C.setStyle("verticalAlign","middle"))}var D=s.get(["emphasis","focus"]),A="relative"===D?gt(a.getAncestorsIndices(),a.getDescendantIndices()):"ancestor"===D?a.getAncestorsIndices():"descendant"===D?a.getDescendantIndices():null;A&&(Hs(n).focus=A),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new Gu({shape:mC(h,c,p,r,r)})),rh(g,{shape:mC(h,c,p,o,a)},t));else if("polyline"===u)if("orthogonal"===h){if(e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;me&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e=0){var i=n.getData().tree.root,r=t.targetNode;if(X(r)&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function LC(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function PC(t,e){return P(LC(t),e)>=0}function OC(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var RC=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return n(e,t),e.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new dc(n,this,this.ecModel),r=AC.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))}));var o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},e.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return Xf("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=OC(i,this),n.collapsed=!i.isExpand,n},e.type="series.tree",e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},e}(sg);function NC(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function EC(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=iC((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=iC());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;sh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),NC(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=rC(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),NC(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),NC(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function zC(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();A(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var VC=["treemapZoomToNode","treemapRender","treemapMove"];function BC(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=ed(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var FC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventUsingHoverLayer=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};GC(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new dc({itemStyle:r},this,e),a=z((i=t.levels=function(t,e){var n,i,r=ho(e.get("color")),o=ho(e.get(["aria","decal","decals"]));if(!r)return;E(t=t||[],(function(t){var e=new dc(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});n||(a.color=r.slice());!i&&o&&(a.decal=o.slice());return t}(i,e))||[],(function(t){return new dc(t,o,e)}),this),s=AC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return Xf("nameValue",{name:i.getName(t),value:r})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=OC(i,this),n.treePathInfo=n.treeAncestors,n},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},A(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=ft(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BC(this)},e.type="series.treemap",e.layoutMode="box",e.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],overflow:"truncate",verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(sg);function GC(t){var e=0;E(t.children,(function(t){GC(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var WC=function(){function t(t){this.group=new Cr,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=a.getModel("textStyle"),l={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,l,s),this._renderContent(t,l,a,s,i),_p(o,l.pos,l.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=xo(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r){for(var o,a,s,l,u,h,c,p,d,f=0,g=e.emptyItemWidth,y=t.get(["breadcrumb","height"]),v=(o=e.pos,a=e.box,l=a.width,u=a.height,h=Er(o.left,l),c=Er(o.top,u),p=Er(o.right,l),d=Er(o.bottom,u),(isNaN(h)||isNaN(parseFloat(o.left)))&&(h=0),(isNaN(p)||isNaN(parseFloat(o.right)))&&(p=l),(isNaN(c)||isNaN(parseFloat(o.top)))&&(c=0),(isNaN(d)||isNaN(parseFloat(o.bottom)))&&(d=u),s=ip(s||0),{width:Math.max(p-h-s[1]-s[3],0),height:Math.max(d-c-s[0]-s[2],0)}),m=e.totalWidth,x=e.renderList,_=x.length-1;_>=0;_--){var b=x[_],w=b.node,S=b.width,M=b.text;m>v.width&&(m-=S-g,S=g,M=null);var I=new Pu({shape:{points:HC(f,0,S,y,_===x.length-1,0===_)},style:k(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new ks({style:{text:M,fill:i.getTextColor(),font:i.getFont()}}),textConfig:{position:"inside"},z2:1e5,onclick:H(r,w)});I.disableLabelAnimation=!0,this.group.add(I),YC(I,t,w),f+=S+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function HC(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function YC(t,e,n){Hs(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&OC(n,e)}}var UC=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var e=t.originX,n=t.originY;if("animating"!==this._state){var i=this.seriesModel.getData().tree.root;if(!i)return;var r=i.getLayout();if(!r)return;var o=new sr(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo,s=[1,0,0,1,0,0];Ei(s,s,[-(e-=a.x),-(n-=a.y)]),Vi(s,s,[t.scale,t.scale]),Ei(s,s,[e,n]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},e.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&dp(a,s)}}}}}),this)},e.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new WC(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(PC(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},e.type="treemap",e}(xg);var tD=E,eD=q,nD=-1,iD=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=T(e);this.type=i,this.mappingMethod=n,this._normalizeData=dD[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(rD(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,E(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(tD(e,(function(t,e){n[t]=e})),!Y(i)){var r=[];q(i)?tD(i,(function(t,e){var i=n[e];r[null!=i?i:nD]=t})):r[-1]=i,i=pD(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):rD(r,!0):(lt("linear"!==n||r.dataExtent),rD(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return W(this._normalizeData,this)},t.listVisualTypes=function(){return G(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){q(t)?E(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=Y(e)?[]:q(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&tD(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(Y(t))t=t.slice();else{if(!eD(t))return[];var e=[];tD(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;ou[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new iD(c);return gD(p).drColorMappingBy=h,p}(0,r,o,0,u,d);E(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=A({},e);if(r){var s=r.type,l="color"===s&&gD(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);vD(t,o,n,i)}}))}else s=mD(u),h.fill=s}}function mD(t){var e=xD(t,"color");if(e){var n=xD(t,"colorAlpha"),i=xD(t,"colorSaturation");return i&&(e=Dn(e,null,null,i)),n&&(e=An(e,n)),e}}function xD(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function _D(t,e){var n=t.get(e);return Y(n)&&n.length?{name:e,range:n}:null}var bD=Math.max,wD=Math.min,SD=it,MD=E,ID=["itemStyle","borderWidth"],TD=["itemStyle","gapWidth"],CD=["upperLabel","show"],DD=["upperLabel","height"],AD={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=xp(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=Er(SD(s.width,l[0]),r),h=Er(SD(s.height,l[1]),o),c=i&&i.type,p=kC(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=LC(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;var l=i*r,u=l*t.option.zoomToNodeRatio;for(;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;pYr&&(u=Yr),a=o}ua[1]&&(a[1]=e)}))):a=[NaN,NaN];return{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*ei&&(i=a));var l=t.area*t.area,u=e*e*n;return l?bD(u*i/l,l/(u*r)):1/0}function PD(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;ci&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a0&&(m[0]=-m[0],m[1]=-m[1]);var _=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0].8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*_+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*_,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=x[0],i.y=x[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*_+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*_,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},e}(Cr),gA=function(){function t(t){this.group=new Cr,this._LineCtor=t||fA}return t.prototype.updateData=function(t){var e=this;this._progressiveEls=null;var n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=yA(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=yA(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[];for(var i=t.start;i=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function TA(t,e){var n=[],i=Qe,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[Mt(l[0]),Mt(l[1])],l[2]&&l.__original.push(Mt(l[2])));var c=l.__original;if(null!=l[2]){if(St(r[0],c[0]),St(r[1],c[2]),St(r[2],c[1]),u&&"none"!==u){var p=KD(t.node1),d=IA(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}if(h&&"none"!==h){p=KD(t.node2),d=IA(r,c[1],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]}St(l[0],r[0]),St(l[1],r[2]),St(l[2],r[1])}else{if(St(o[0],c[0]),St(o[1],c[1]),Dt(a,o[1],o[0]),Rt(a,a),u&&"none"!==u){p=KD(t.node1);Ct(o[0],o[0],a,p*e)}if(h&&"none"!==h){p=KD(t.node2);Ct(o[1],o[1],a,-p*e)}St(l[0],o[0]),St(l[1],o[1])}}))}function CA(t){return"view"===t.type}var DA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){var n=new qw,i=new gA,r=this.group;this._controller=new kI(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(CA(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):rh(s,l,t)}TA(t.getGraph(),qD(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p),u.graph.eachNode((function(t){var e=t.dataIndex,n=t.getGraphicEl(),r=t.getModel();if(n){n.off("drag").off("dragend");var o=r.get("draggable");o&&n.on("drag",(function(){c&&(c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(e),u.setItemLayout(e,[n.x,n.y]))})).on("dragend",(function(){c&&c.setUnfixed(e)})),n.setDraggable(o&&!!c,!!r.get("cursor")),"adjacency"===r.get(["emphasis","focus"])&&(Hs(n).focus=t.getAdjacentDataIndices())}})),u.graph.eachEdge((function(t){var e=t.getGraphicEl(),n=t.getModel().get(["emphasis","focus"]);e&&"adjacency"===n&&(Hs(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var d="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),f=u.getLayout("cx"),g=u.getLayout("cy");u.eachItemGraphicEl((function(t,e){var n=u.getItemModel(e).get(["label","rotate"])||0,i=t.getSymbolPath();if(d){var r=u.getItemLayout(e),o=Math.atan2(r[1]-g,r[0]-f);o<0&&(o=2*Math.PI+o);var a=r[0]=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof LA||(e=this._nodesMap[AA(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o=0&&n.node2.dataIndex>=0}));for(r=0,o=i.length;r=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function RA(t,e,n,i,r){for(var o=new kA(i),a=0;a "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=rx(t,n);else{var g=hd.get(f),y=g&&g.dimensions||[];P(y,"value")<0&&y.concat(["value"]);var v=Km(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new qm(v,n)).initData(t)}var m=new qm(["value"],n);return m.initData(l,s),r&&r(d,m),_C({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}R(LA,OA("hostGraph","data")),R(PA,OA("hostGraph","edgeData"));var NA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new hM(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),co(e,"edgeLabel",["show"])},e.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){FD(n=this)&&(n.__curvenessList=[],n.__edgeMap={},GD(n));var a=RA(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=dc.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return E(a.edges,(function(t){!function(t,e,n,i){if(FD(n)){var r=WD(t,e,n),o=n.__edgeMap,a=o[HD(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),Xf("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return rg({series:this,dataIndex:t,multipleSeries:e})},e.prototype._updateCategoriesData=function(){var t=z(this.option.categories||[],(function(t){return null!=t.value?t:A({value:0},t)})),e=new qm(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},e.type="series.graph",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(sg),EA={type:"graphRoam",event:"graphRoam",update:"none"};var zA=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},VA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="pointer",n}return n(e,t),e.prototype.getDefaultShape=function(){return new zA},e.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},e}(gs);function BA(t,e){var n=null==t?"":t+"";return e&&(X(e)?n=e.replace("{value}",n):U(e)&&(n=e(t))),n}var FA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:Er(n[0],e.getWidth()),cy:Er(n[1],e.getHeight()),r:Er(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,e,n,i,r){var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?DS:Cu,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=[s,l];ja(f,!a);for(var g=(l=f[1])-(s=f[0]),y=s,v=0;c&&v=t&&(0===e?0:i[e-1][0]).8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0}))}if(m.get("show")&&k!==_){P=(P=m.get("distance"))?P+l:l;for(var N=0;N<=b;N++){u=Math.cos(M),h=Math.sin(M);var E=new zu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&E.setStyle({stroke:i((k+N/b)/_)}),c.add(E),M+=T}M-=T}else M+=I}},e.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),x=+t.get("max"),_=[m,x],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=Er(o.get("width"),r.r),s=Er(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=Er(u[0],r.r),c=Er(u[1],r.r),p=o.get("keepAspect");return(i=l?Ly(l,h-a/2,c-s,a,s,null,p):new VA({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?DS:Cu,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=x-y.get(v,t)%x),c}(g||d)&&(y.diff(h).add((function(e){var n=y.get(v,e);if(d){var i=w(e,o);oh(i,{rotation:-((isNaN(+n)?b[0]:Nr(n,_,b,!0))+Math.PI/2)},t),u.add(i),y.setItemGraphicEl(e,i)}if(g){var r=S(e,o),a=f.get("clip");oh(r,{shape:{endAngle:Nr(n,_,b,a)}},t),u.add(r),Ys(t.seriesIndex,y.dataType,e,r),p[e]=r}})).update((function(e,n){var i=y.get(v,e);if(d){var r=h.getItemGraphicEl(n),a=r?r.rotation:o,s=w(e,a);s.rotation=a,rh(s,{rotation:-((isNaN(+i)?b[0]:Nr(i,_,b,!0))+Math.PI/2)},t),u.add(s),y.setItemGraphicEl(e,s)}if(g){var l=c[n],m=S(e,l?l.shape.endAngle:o),x=f.get("clip");rh(m,{shape:{endAngle:Nr(i,_,b,x)}},t),u.add(m),Ys(t.seriesIndex,y.dataType,e,m),p[e]=m}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis"),r=n.get("focus"),o=n.get("blurScope"),a=n.get("disabled");if(d){var s=y.getItemGraphicEl(t),l=y.getItemVisual(t,"style"),u=l.fill;if(s instanceof _s){var h=s.style;s.useStyle(A({image:h.image,x:h.x,y:h.y,width:h.width,height:h.height},l))}else s.useStyle(l),"pointer"!==s.type&&s.setColor(u);s.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===s.style.fill&&s.setStyle("fill",i(Nr(y.get(v,t),_,[0,1],!0))),s.z2EmphasisLift=0,Vl(s,e),Rl(s,r,o,a)}if(g){var c=p[t];c.useStyle(y.getItemVisual(t,"style")),c.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),c.z2EmphasisLift=0,Vl(c,e),Rl(c,r,o,a)}})),this._progressEls=p)},e.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=Ly(r,e.cx-i/2+Er(o[0],e.r),e.cy-i/2+Er(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},e.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Cr,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new ks({silent:!0}),p[t]=new ks({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Cr,y=i(Nr(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),x=r.cx+Er(m[0],r.r),_=r.cy+Er(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:Uh(v,{x:x,y:_,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+Er(w[0],r.r),M=r.cy+Er(w[1],r.r),I=Er(b.get("width"),r.r),T=Er(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:Uh(b,{x:S,y:M,text:BA(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),Qh(D,{normal:b},o,(function(t){return BA(t,A)})),d&&tc(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return BA(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},e.type="gauge",e}(xg),GA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="itemStyle",n}return n(e,t),e.prototype.getInitialData=function(t,e){return uM(this,["value"])},e.type="series.gauge",e.defaultOption={z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},e}(sg);var WA=["itemStyle","opacity"],HA=function(t){function e(e,n){var i=t.call(this)||this,r=i,o=new Ru,a=new ks;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return n(e,t),e.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(WA);l=null==l?1:l,n||hh(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,oh(i,{style:{opacity:l}},r,e)):rh(i,{style:{opacity:l},shape:{points:a.points}},r,e),Vl(i,o),this._updateLabel(t,e),Rl(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;Hh(r,Yh(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new Ji(h[0][0],h[0][1]):null},rh(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),db(n,fb(a),{stroke:u})},e}(Pu),YA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreLabelLineUpdate=!0,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new HA(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){uh(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type="funnel",e}(xg),UA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new hM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.getInitialData=function(t,e){return uM(this,{coordDimensions:["value"],encodeDefaulter:H(Yp,this)})},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},e.type="series.funnel",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(sg);function XA(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&ok(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function ok(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var ak=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var e=this.option;t&&C(e,t,!0),this._initDimensions()},e.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},e.prototype.setAxisExpand=function(t){E(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];E(B(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},e.type="parallel",e.dependencies=["parallelAxis"],e.layoutMode="box",e.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},e}(Tp),sk=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return n(e,t),e.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},e}(H_);function lk(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=hk(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=hk(s,[0,a]),r=o=hk(s,[r,o]),i=0}e[0]=hk(e[0],n),e[1]=hk(e[1],n);var l=uk(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=hk(e[i],c),u=uk(e,i),null!=r&&(u.sign!==l.sign||u.spano&&(e[1-i]=e[i]+u.sign*o),e}function uk(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function hk(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var ck=E,pk=Math.min,dk=Math.max,fk=Math.floor,gk=Math.ceil,yk=zr,vk=Math.PI,mk=function(){function t(t,e,n){this.type="parallel",this._axesMap=ft(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;ck(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new sk(t,o_(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();ck(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),r_(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=xk(e.get("axisExpandWidth"),l),c=xk(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=xk(d[1]-d[0],l),d[1]=d[0]+t):(t=xk(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||fk(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[fk(yk(d[0]/h,1))+1,gk(yk(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),ck(n,(function(e,n){var o=(i.axisExpandable?bk:_k)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:vk/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];zi(h,h,u),Ei(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];E(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;ur*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?lk(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[dk(0,o[1]*s/p-p/2)])[1]=pk(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function xk(t,e){return pk(dk(t,e[0]),e[1])}function _k(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function bk(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t=0;n--)Vr(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i6}(t)||o){if(a&&!o){"single"===s.brushMode&&Wk(t);var l=T(s);l.brushType=oL(l.brushType,a),l.panelId=a===Mk?null:a.panelId,o=t._creatingCover=Rk(t,l),t._covers.push(o)}if(o){var u=lL[oL(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(eL(t,o,t._track)),i&&(Nk(t,o),u.updateCommon(t,o)),Ek(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&Fk(t,e,n)&&Wk(t)&&(r={isEnd:i,removeOnClick:!0});return r}function oL(t,e){return"auto"===t?e.defaultBrushType:t}var aL={mousedown:function(t){if(this._dragging)sL(this,t);else if(!t.target||!t.target.draggable){nL(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=Fk(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=Fk(t,e,n);if(!t._dragging)for(var a=0;a=0&&(o[r[a].depth]=new dc(r[a],this,e));if(i&&n)return RA(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))})).data},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return Xf("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return Xf("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},e.type="series.sankey",e.defaultOption={z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},e}(sg);function SL(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){E(t,(function(t){var e=OL(t.outEdges,PL),n=OL(t.inEdges,PL),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;mc-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s0;o--)TL(s,l*=.99,a),IL(s,r,n,i,a),RL(s,l,a),IL(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";E(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),E(t,(function(t){var e=0,n=0;E(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),E(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==B(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function ML(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function IL(t,e,n,i,r){var o="vertical"===r?"x":"y";E(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0){a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a;for(p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}}))}function TL(t,e,n){E(t.slice().reverse(),(function(t){E(t,(function(t){if(t.outEdges.length){var i=OL(t.outEdges,CL,n)/OL(t.outEdges,PL);if(isNaN(i)){var r=t.outEdges.length;i=r?OL(t.outEdges,DL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-LL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-LL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function CL(t,e){return LL(t.node2,e)*t.getValue()}function DL(t,e){return LL(t.node2,e)}function AL(t,e){return LL(t.node1,e)*t.getValue()}function kL(t,e){return LL(t.node1,e)}function LL(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function PL(t){return t.getValue()}function OL(t,e,n){for(var i=0,r=t.length,o=-1;++oi&&(i=e)})),E(e,(function(e){var r=new iD({type:"color",mappingMethod:"linear",dataExtent:[n,i],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),o=e.getModel().get(["itemStyle","color"]);null!=o?(e.setVisual("color",o),e.setVisual("style",{fill:o})):(e.setVisual("color",r),e.setVisual("style",{fill:r}))}))}}))}var EL=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];E(g,(function(t,e){var n;Y(t)?(n=t.slice(),t.unshift(e)):Y(t.value)?((n=A({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Dm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Dm(f),dimsDef:v.slice()}];return uM(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:H(Hp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),zL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],n.visualDrawType="stroke",n}return n(e,t),e.type="series.boxplot",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},e}(sg);R(zL,EL,!0);var VL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=GL(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(hh(n),WL(s,n,i,t)):n=GL(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},e.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},e.type="boxplot",e}(xg),BL=function(){},FL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return n(e,t),e.prototype.getDefaultShape=function(){return new BL},e.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();ig){var _=[v,x];i.push(_)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}};var jL=["color","borderColor"],qL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,e,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&QL(s,a))return;var l=JL(a,n,!0);oh(l,{shape:{points:a.ends}},t,n),tP(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&QL(s,h)?i.remove(u):(u?(rh(u,{shape:{points:h.ends}},t,a),hh(u)):u=JL(h),tP(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},e.prototype._renderLarge=function(t){this._clear(),rP(t,this.group);var e=t.get("clip",!0)?lS(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=JL(i.getItemLayout(n));tP(o,i,n,r),o.incremental=!0,this.group.add(o),this._progressiveEls.push(o)}},e.prototype._incrementalRenderLarge=function(t,e){rP(e,this.group,this._progressiveEls,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type="candlestick",e}(xg),KL=function(){},$L=function(t){function e(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new KL},e.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(gs);function JL(t,e,n){var i=t.ends;return new $L({shape:{points:n?eP(i,t):i},z2:100})}function QL(t,e){for(var n=!0,i=0;i0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]),o=n.getModel("itemStyle").getItemStyle(jL);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var aP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],n}return n(e,t),e.prototype.getShadowDim=function(){return"open"},e.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type="series.candlestick",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},e}(sg);function sP(t){t&&Y(t.series)&&E(t.series,(function(t){q(t)&&"k"===t.type&&(t.type="candlestick")}))}R(aP,EL,!0);var lP=["itemStyle","borderColor"],uP=["itemStyle","borderColor0"],hP=["itemStyle","color"],cP=["itemStyle","color0"],pP={seriesType:"candlestick",plan:yg(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?hP:cP)}function i(t,e){return e.get(t>0?lP:uP)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,A(e.ensureUniqueItemVisual(r,"style"),s)}}}}},dP={seriesType:"candlestick",plan:yg(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=Er(rt(t.get("barMaxWidth"),r),r),a=Er(rt(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?Er(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=z(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(t,n){var i,r,a=Sx(4*t.count),c=0,p=[],d=[],f=n.getStore();for(;null!=(r=t.next());){var g=f.get(o,r),y=f.get(s,r),v=f.get(l,r),m=f.get(u,r),x=f.get(h,r);isNaN(g)||isNaN(m)||isNaN(x)?(a[c++]=NaN,c+=3):(a[c++]=fP(f,r,y,v,l),p[0]=g,p[1]=m,i=e.dataToPoint(p,null,d),a[c++]=i?i[0]:NaN,a[c++]=i?i[1]:NaN,p[1]=x,i=e.dataToPoint(p,null,d),a[c++]=i?i[1]:NaN)}n.setLayout("largePoints",a)}:function(t,n){var r,a=n.getStore();for(;null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=S(y,c),x=S(v,c),_=S(f,c),b=S(g,c),w=[];M(w,x,0),M(w,m,1),w.push(T(b),T(x),T(_),T(m)),n.setItemLayout(r,{sign:fP(a,r,p,d,l),initBaseline:p>d?x[1]:m[1],ends:w,brushRect:I(f,g,c)})}function S(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function M(t,e,n){var r=e.slice(),o=e.slice();r[0]=Mh(r[0]+i/2,1,!1),o[0]=Mh(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function I(t,e,n){var r=S(t,n),o=S(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function T(t){return t[0]=Mh(t[0],1),t}}}}};function fP(t,e,n,i,r){return n>i?-1:n0?t.get(r,e-1)<=i?1:-1:1}function gP(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var yP=function(t){function e(e,n){var i=t.call(this)||this,r=new Yw(e,n),o=new Cr;return i.add(r),i.add(o),i.updateData(e,n),i}return n(e,t),e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o0&&(o=this._getLineLength(i)/s*1e3),o!==this._period||a!==this._loop){i.stopAnimation();var u=void 0;u=U(l)?l(n):l,i.__t>0&&(u=-o*i.__t),this._animateSymbol(i,o,u,a)}this._period=o,this._loop=a}},e.prototype._animateSymbol=function(t,e,n,i){if(e>0){t.__t=0;var r=this,o=t.animate("",i).when(e,{__t:1}).delay(n).during((function(){r._updateSymbolPosition(t)}));i||o.done((function(){r.remove(t)})),o.start()}},e.prototype._getLineLength=function(t){return Et(t.__p1,t.__cp1)+Et(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},e.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},e.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t,o=[t.x,t.y],a=o.slice(),s=Ke,l=$e;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=l(e[0],i[0],n[0],r),h=l(e[1],i[1],n[1],r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;oe);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=u[0]-l[0],c=u[1]-l[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},e}(xP),wP=function(){this.polyline=!1,this.curveness=0,this.segs=[]},SP=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new wP},e.prototype.buildPath=function(t,e){var n,i=e.segs,r=e.curveness;if(e.polyline)for(n=this._off;n0){t.moveTo(i[n++],i[n++]);for(var a=1;a0){var c=(s+u)/2-(l-h)*r,p=(l+h)/2-(u-s)*r;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}this.incremental&&(this._off=n,this.notClear=!0)},e.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s0)for(var u=i[s++],h=i[s++],c=1;c0){if(Ja(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(Ka(u,h,p,d,o,t,e))return a;a++}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,i=1/0,r=-1/0,o=-1/0,a=0;a0&&(o.dataIndex=n+t.__startIndex)}))},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),IP={seriesType:"lines",plan:yg(),reset:function(t){var e=t.coordinateSystem;if(e){var n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h0&&(l||s.configLayer(o,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(a/10+.9,1),0)})),r.updateData(i);var u=t.get("clip",!0)&&lS(t.coordinateSystem,!1,t);u?this.group.setClipPath(u):this.group.removeClipPath(),this._lastZlevel=o,this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateLineDraw(i,t).incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},e.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},e.prototype.updateTransform=function(t,e,n){var i=t.getData(),r=t.pipelineContext;if(!this._finished||r.large||r.progressiveRender)return{update:!0};var o=IP.reset(t,e,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},e.prototype._updateLineDraw=function(t,e){var n=this._lineDraw,i=this._showEffect(e),r=!!e.get("polyline"),o=e.pipelineContext.large;return n&&i===this._hasEffet&&r===this._isPolyline&&o===this._isLargeDraw||(n&&n.remove(),n=this._lineDraw=o?new MP:new gA(r?i?bP:_P:i?xP:fA),this._hasEffet=i,this._isPolyline=r,this._isLargeDraw=o),this.group.add(n.group),n},e.prototype._showEffect=function(t){return!!t.get(["effect","show"])},e.prototype._clearLayer=function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},e.prototype.remove=function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.type="lines",e}(xg),CP="undefined"==typeof Uint32Array?Array:Uint32Array,DP="undefined"==typeof Float64Array?Array:Float64Array;function AP(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=z(e,(function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),D([e,t[0],t[1]])})))}var kP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.init=function(e){e.data=e.data||[],AP(e);var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count)),t.prototype.init.apply(this,arguments)},e.prototype.mergeOption=function(e){if(AP(e),e.data){var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count))}t.prototype.mergeOption.apply(this,arguments)},e.prototype.appendData=function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=gt(this._flatCoords,e.flatCoords),this._flatCoordsOffset=gt(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},e.prototype._getCoordsFromItemModel=function(t){var e=this.getData().getItemModel(t),n=e.option instanceof Array?e.option:e.getShallow("coords");return n},e.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},e.prototype.getLineCoords=function(t,e){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[2*t],i=this._flatCoordsOffset[2*t+1],r=0;r ")})},e.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},e.prototype.getZLevelKey=function(){var t=this.getModel("effect"),e=t.get("trailLength");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get("show")&&e>0?e+"":""},e.type="series.lines",e.dependencies=["grid","polar","geo","calendar"],e.defaultOption={coordinateSystem:"geo",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},e}(sg);function LP(t){return t instanceof Array||(t=[t,t]),t}var PP={seriesType:"lines",reset:function(t){var e=LP(t.get("symbol")),n=LP(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=LP(n.getShallow("symbol",!0)),r=LP(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}};var OP=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=h.createCanvas();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d0){var I=o(v)?s:l;v>0&&(v=v*S+w),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=h.createCanvas()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function RP(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var NP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this._progressiveEls=null,this.group.removeAll();var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):RP(r)&&this._renderOnGeo(r,t,i,n)},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(RP(r)?this.render(e,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0)))},e.prototype.eachRendered=function(t){Vh(this._progressiveEls||this.group,t)},e.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem,h=uS(u,"cartesian2d");if(h){var c=u.getAxis("x"),p=u.getAxis("y");0,o=c.getBandWidth()+.5,a=p.getBandWidth()+.5,s=c.scale.getExtent(),l=p.scale.getExtent()}for(var d=this.group,f=t.getData(),g=t.getModel(["emphasis","itemStyle"]).getItemStyle(),y=t.getModel(["blur","itemStyle"]).getItemStyle(),v=t.getModel(["select","itemStyle"]).getItemStyle(),m=t.get(["itemStyle","borderRadius"]),x=Yh(t),_=t.getModel("emphasis"),b=_.get("focus"),w=_.get("blurScope"),S=_.get("disabled"),M=h?[f.mapDimension("x"),f.mapDimension("y"),f.mapDimension("value")]:[f.mapDimension("time"),f.mapDimension("value")],I=n;Is[1]||Al[1])continue;var k=u.dataToPoint([D,A]);T=new Cs({shape:{x:k[0]-o/2,y:k[1]-a/2,width:o,height:a},style:C})}else{if(isNaN(f.get(M[1],I)))continue;T=new Cs({z2:1,shape:u.dataToRect([f.get(M[0],I)]).contentShape,style:C})}if(f.hasItemOption){var L=f.getItemModel(I),P=L.getModel("emphasis");g=P.getModel("itemStyle").getItemStyle(),y=L.getModel(["blur","itemStyle"]).getItemStyle(),v=L.getModel(["select","itemStyle"]).getItemStyle(),m=L.get(["itemStyle","borderRadius"]),b=P.get("focus"),w=P.get("blurScope"),S=P.get("disabled"),x=Yh(L)}T.shape.r=m;var O=t.getRawValue(I),R="-";O&&null!=O[2]&&(R=O[2]+""),Hh(T,x,{labelFetcher:t,labelDataIndex:I,defaultOpacity:C.opacity,defaultText:R}),T.ensureState("emphasis").style=g,T.ensureState("blur").style=y,T.ensureState("select").style=v,Rl(T,b,w,S),T.incremental=r,r&&(T.states.emphasis.hoverLayer=!0),d.add(T),f.setItemGraphicEl(I,T),this._progressiveEls&&this._progressiveEls.push(T)}},e.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new OP;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=z(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i0?1:-1}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");h=Y(f)?f.slice():null==f?["100%","100%"]:[f,f];h[p.index]=Er(h[p.index],d),h[c.index]=Er(h[c.index],i?d:Math.abs(o)),u.symbolSize=h,(u.symbolScale=[h[0]/s,h[1]/s])[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(zP)||0;o&&(BP.attr({scaleX:e[0],scaleY:e[1],rotation:n}),BP.updateTransform(),o/=BP.getLineScale(),o*=e[i.valueDim.index]);r.valueLineWidth=o||0}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=Oy(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=it(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=Er(m,e[d.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=eo(i),M=S?i:iO((v+w)/b);b=g+2*(_=(v-M*g)/2/(x?M:Math.max(M-1,1))),w=x?0:2*_,S||"fixed"===i||(M=u?iO((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=_}var I=f*(y/2),T=c.pathPosition=[];T[p.index]=n[p.wh]/2,T[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(T[0]+=o[0],T[1]+=o[1]);var C=c.bundlePosition=[];C[p.index]=n[p.xy],C[d.index]=n[d.xy];var D=c.barRectShape=A({},n);D[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(T[d.index]+I)),D[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function WP(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function HP(t){var e=t.symbolPatternSize,n=Ly(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function YP(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(tO(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function UP(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?eO(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=HP(n),r.add(o),eO(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function XP(t,e,n){var i=A({},e.barRectShape),r=t.__pictorialBarRect;r?eO(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new Cs({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function ZP(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=A({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)rh(r,{shape:o},s,l);else{o[a.wh]=0,r=new Cs({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],Bh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function jP(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=qP,n.isAnimationEnabled=KP,n}function qP(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function KP(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function $P(t,e,n,i){var r=new Cr,o=new Cr;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?YP(r,e,n):UP(r,0,n),XP(r,n,i),ZP(r,e,n,i),r.__pictorialShapeStr=QP(t,n),r.__pictorialSymbolMeta=n,r}function JP(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];tO(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),E(o,(function(t){sh(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function QP(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function tO(t,e,n){E(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function eO(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&Bh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function nO(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");tO(t,(function(t){if(t instanceof _s){var e=t.style;t.useStyle(A({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)];Hh(t.__pictorialBarRect,Yh(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:Ww(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),Rl(t,h,c,o.get("disabled"))}function iO(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var rO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return n(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=yc(IS.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),e}(IS);var oO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Im(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;go&&(o=s),i.push(s)}for(var u=0;uo&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;fMath.PI/2?"right":"left"):S&&"center"!==S?"left"===S?(m=r.r0+w,a>Math.PI/2&&(S="right")):"right"===S&&(m=r.r-w,a>Math.PI/2&&(S="left")):(m=o===2*Math.PI&&0===r.r0?0:(r.r+r.r0)/2,S="center"),g.style.align=S,g.style.verticalAlign=f(p,"verticalAlign")||"middle",g.x=m*s+r.cx,g.y=m*l+r.cy;var M=f(p,"rotate"),I=0;"radial"===M?(I=-a)<-Math.PI/2&&(I+=Math.PI):"tangential"===M?(I=Math.PI/2-a)>Math.PI/2?I-=Math.PI:I<-Math.PI/2&&(I+=Math.PI):j(M)&&(I=M*Math.PI/180),g.rotation=I})),h.dirtyStyle()},e}(Cu),hO="sunburstRootToNode",cO="sunburstHighlight";var pO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this;this.seriesModel=t,this.api=n,this.ecModel=e;var o=t.getData(),a=o.tree.root,s=t.getViewRoot(),l=this.group,u=t.get("renderLabelForZeroData"),h=[];s.eachNode((function(t){h.push(t)}));var c=this._oldChildren||[];!function(i,r){if(0===i.length&&0===r.length)return;function s(t){return t.getId()}function h(s,h){!function(i,r){u||!i||i.getValue()||(i=null);if(i!==a&&r!==a)if(r&&r.piece)i?(r.piece.updateData(!1,i,t,e,n),o.setItemGraphicEl(i.dataIndex,r.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(r);else if(i){var s=new uO(i,t,e,n);l.add(s),o.setItemGraphicEl(i.dataIndex,s)}}(null==s?null:i[s],null==h?null:r[h])}new Im(r,i,s,s).add(h).update(h).remove(H(h,null)).execute()}(h,c),function(i,o){o.depth>0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new uO(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},e.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");if(a)dp(a,o.get("target",!0)||"_blank")}n=!0}}))}))},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:hO,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="sunburst",e}(xg),dO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreStyleOnData=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};fO(n);var i=this._levelModels=z(t.levels||[],(function(t){return new dc(t,this,e)}),this),r=AC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=OC(i,this),n},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){BC(this)},e.type="series.sunburst",e.defaultOption={z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},e}(sg);function fO(t){var e=0;E(t.children,(function(t){fO(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var gO=Math.PI/180;function yO(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");Y(i)||(i=[0,i]),Y(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=Er(e[0],r),l=Er(e[1],o),u=Er(i[0],a/2),h=Er(i[1],a/2),c=-t.get("startAngle")*gO,p=t.get("minAngle")*gO,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&vO(f,y);var v=0;E(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),x=Math.PI/(m||v)*2,_=f.depth>0,b=f.height-(_?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?x:r*x;o1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&X(o)&&(o=Sn(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),A(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var xO={color:"fill",borderColor:"stroke"},_O={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},bO=So(),wO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},e.prototype.getInitialData=function(t,e){return rx(null,this)},e.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=bO(i).info),r},e.type="series.custom",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,clip:!1},e}(sg);function SO(t,e){return e=e||[0,0],z(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function MO(t,e){return e=e||[0,0],z([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function IO(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function TO(t,e){return e=e||[0,0],z(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function CO(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||mt(t,"text")))}function DO(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},mt(a,"text")&&(o.text=a.text),mt(a,"rich")&&(o.rich=a.rich),mt(a,"textFill")&&(o.fill=a.textFill),mt(a,"textStroke")&&(o.stroke=a.textStroke),mt(a,"fontFamily")&&(o.fontFamily=a.fontFamily),mt(a,"fontSize")&&(o.fontSize=a.fontSize),mt(a,"fontStyle")&&(o.fontStyle=a.fontStyle),mt(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=mt(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),mt(a,"textPosition")&&(i.position=a.textPosition),mt(a,"textOffset")&&(i.offset=a.textOffset),mt(a,"textRotation")&&(i.rotation=a.textRotation),mt(a,"textDistance")&&(i.distance=a.textDistance)}return AO(o,t),E(o.rich,(function(t){AO(t,t)})),{textConfig:i,textContent:r}}function AO(t,e){e&&(e.font=e.textFont||e.font,mt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),mt(e,"textAlign")&&(t.align=e.textAlign),mt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),mt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),mt(e,"textWidth")&&(t.width=e.textWidth),mt(e,"textHeight")&&(t.height=e.textHeight),mt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),mt(e,"textPadding")&&(t.padding=e.textPadding),mt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),mt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),mt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),mt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),mt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),mt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),mt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function kO(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";LO(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,E(e.rich,(function(t){LO(t,t)})),i}function LO(t,e){e&&(mt(e,"fill")&&(t.textFill=e.fill),mt(e,"stroke")&&(t.textStroke=e.fill),mt(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),mt(e,"font")&&(t.font=e.font),mt(e,"fontStyle")&&(t.fontStyle=e.fontStyle),mt(e,"fontWeight")&&(t.fontWeight=e.fontWeight),mt(e,"fontSize")&&(t.fontSize=e.fontSize),mt(e,"fontFamily")&&(t.fontFamily=e.fontFamily),mt(e,"align")&&(t.textAlign=e.align),mt(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),mt(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),mt(e,"width")&&(t.textWidth=e.width),mt(e,"height")&&(t.textHeight=e.height),mt(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),mt(e,"padding")&&(t.textPadding=e.padding),mt(e,"borderColor")&&(t.textBorderColor=e.borderColor),mt(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),mt(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),mt(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),mt(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),mt(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),mt(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),mt(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),mt(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),mt(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),mt(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var PO={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]},OO=G(PO),RO=(V(Ki,(function(t,e){return t[e]=1,t}),{}),Ki.join(", "),["","style","shape","extra"]),NO=So();function EO(t,e,n,i,r){var o=t+"Animation",a=nh(t,i,r)||{},s=NO(e).userDuring;return a.duration>0&&(a.during=s?W(HO,{el:e,userDuring:s}):null,a.setToFinal=!0,a.scope=t),A(a,n[o]),a}function zO(t,e,n,i){var r=(i=i||{}).dataIndex,o=i.isInit,a=i.clearStyle,s=n.isAnimationEnabled(),l=NO(t),u=e.style;l.userDuring=e.during;var h={},c={};if(function(t,e,n){for(var i=0;i=0)){var c=t.getAnimationStyleProps(),p=c?c.style:null;if(p){!r&&(r=i.style={});var d=G(n);for(u=0;u0&&t.animateFrom(p,d)}else!function(t,e,n,i,r){if(r){var o=EO("update",t,e,i,n);o.duration>0&&t.animateFrom(r,o)}}(t,e,r||0,n,h);VO(t,e),u?t.dirty():t.markRedraw()}function VO(t,e){for(var n=NO(t).leaveToProps,i=0;i=0){!o&&(o=i[t]={});var p=G(a);for(h=0;hi[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:W(TO,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function sR(t){return t instanceof gs}function lR(t){return t instanceof da}var uR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._data,o=t.getData(),a=this.group,s=fR(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){yR(n,null,e,s(e,i),t,a,o)})).remove((function(e){var n=r.getItemGraphicEl(e);BO(n,bO(n).option,t)})).update((function(e,l){var u=r.getItemGraphicEl(l);yR(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?lS(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=fR(e,o,n,i),s=this._progressiveEls=[];function l(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var u=t.start;u=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){0;null==i&&(i=s);var r=m(i,$O).getItemStyle(),o=x(i,$O),a=Uh(o,null,null,!0,!0);a.text=o.getShallow("show")?ot(t.getFormattedLabel(i,$O),t.getFormattedLabel(i,JO),Ww(e,i)):null;var l=Xh(o,null,!0);return b(n,r),r=kO(r,a,l),n&&_(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),mt(xO,t)){var i=e.getItemVisual(n,"style");return i?i[xO[t]]:null}if(mt(_O,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type){return function(t){var e=[],n=t.axis,i="axis0";if("category"===n.type){for(var r=n.getBandWidth(),o=0;o=c;p--){BO(e.childAt(p),bO(e).option,r)}}(t,c,n,i,r),a>=0?o.replaceAt(c,a):o.add(c),c}function mR(t,e,n){var i,r=bO(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&((i=a)&&(mt(i,"pathData")||mt(i,"d")))&&IR(a)!==r.customPathData||"image"===o&&mt(s,"image")&&s.image!==r.customImagePath}function xR(t,e,n){var i=e?_R(t,e):t,r=e?bR(t,i,$O):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?_R(s,e):s:null;if(r&&(n.isLegacy||CO(r,o,!!a,!!l))){n.isLegacy=!0;var u=DO(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function _R(t,e){return e?t?t[e]:null:t}function bR(t,e,n){var i=e&&e.style;return null==i&&n===$O&&t&&(i=t.styleEmphasis),i}function wR(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function SR(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;vR(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function MR(t){var e=this.context,n=e.oldChildren[t];BO(n,bO(n).option,e.seriesModel)}function IR(t){return t&&(t.pathData||t.d)}var TR=So(),CR=T,DR=W,AR=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=H(kR,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Cr,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);RR(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=KM(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=TR(t).pointerEl=new Bh[r.type](CR(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=TR(t).labelEl=new ks(CR(e.label));t.add(r),PR(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=TR(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=TR(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),PR(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=Ph(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){se(t.event)},onmousedown:DR(this._onHandleDragMove,this,0,0),drift:DR(this._onHandleDragMove,this),ondragend:DR(this._onHandleDragEnd,this)}),i.add(r)),RR(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");Y(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,Ag(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){kR(this._axisPointerModel,!e&&this._moveAnimation,this._handle,OR(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(OR(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(OR(i)),TR(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),kg(this,"_doDispatchAxisPointer")},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function kR(t,e,n,i){LR(TR(n).lastProp,i)||(TR(n).lastProp=i,e?rh(n,i,t):(n.stopAnimation(),n.attr(i)))}function LR(t,e){if(q(t)&&q(e)){var n=!0;return E(e,(function(e,i){n=n&&LR(t[i],e)})),!!n}return t===e}function PR(t,e){t[e.get(["label","show"])?"show":"hide"]()}function OR(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function RR(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function NR(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function ER(t,e,n,i,r){var o=zR(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=ip(a.get("padding")||0),l=a.getFont(),u=cr(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:Uh(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function zR(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:s_(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};E(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),X(a)?o=a.replace("{value}",o):U(a)&&(o=a(s))}return o}function VR(t,e,n){var i=[1,0,0,1,0,0];return zi(i,i,n.rotation),Ei(i,i,n.position),Th([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function BR(t,e,n,i,r,o){var a=GM.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),ER(e,i,r,o,{position:VR(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function FR(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function GR(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function WR(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var HR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=YR(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=NR(i),c=UR[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}BR(e,t,LM(a.model,n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=LM(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=VR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=YR(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},e}(AR);function YR(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var UR={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:FR([e,n[0]],[e,n[1]],XR(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:GR([e-i/2,n[0]],[i,r],XR(t))}}};function XR(t){return"x"===t.dim?0:1}var ZR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="axisPointer",e.defaultOption={show:"auto",z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(Tp),jR=So(),qR=E;function KR(t,e,n){if(!r.node){var i=e.getZr();jR(i).records||(jR(i).records={}),function(t,e){if(jR(t).initialized)return;function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);qR(jR(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}jR(t).initialized=!0,n("click",H(JR,"click")),n("mousemove",H(JR,"mousemove")),n("globalout",$R)}(i,e),(jR(i).records[t]||(jR(i).records[t]={})).handler=n}}function $R(t,e,n){t.handler("leave",null,n)}function JR(t,e,n,i){e.handler(t,n,i)}function QR(t,e){if(!r.node){var n=e.getZr();(jR(n).records||{})[t]&&(jR(n).records[t]=null)}}var tN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";KR("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},e.prototype.remove=function(t,e){QR("axisPointer",e)},e.prototype.dispose=function(t,e){QR("axisPointer",e)},e.type="axisPointer",e}(gg);function eN(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=wo(o,t);if(null==a||a<0||Y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(z(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var nN=So();function iN(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||W(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){lN(r)&&(r=eN({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=lN(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||lN(r),p={},d={},f={list:[],map:{}},g={showPointer:H(oN,d),showTooltip:H(aN,f)};E(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);E(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&rN(t,a,g,!1,p)}}))}));var y={};return E(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&E(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,sN(e),sN(t)))),y[t.key]=o}}))})),E(y,(function(t,e){rN(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];E(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(lN(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=nN(i)[r]||{},a=nN(i)[r]={};E(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&E(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];E(o,(function(t,e){!a[e]&&l.push(t)})),E(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function rN(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return E(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f=0&&s<0)&&(a=f,s=d,r=u,o.length=0),E(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&A(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function oN(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function aN(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=JM(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function sN(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function lN(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function uN(t){tI.registerAxisPointerClass("CartesianAxisPointer",HR),t.registerComponentModel(ZR),t.registerComponentView(tN),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!Y(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=ZM(t,e)})),t.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},iN)}var hN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis;"angle"===o.dim&&(this.animationThreshold=Math.PI/18);var a=o.polar,s=a.getOtherAxis(o).getExtent(),l=o.dataToCoord(e),u=i.get("type");if(u&&"none"!==u){var h=NR(i),c=cN[u](o,a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}var p=function(t,e,n,i,r){var o=e.axis,a=o.dataToCoord(t),s=i.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,u,h,c=i.getRadiusAxis().getExtent();if("radius"===o.dim){var p=[1,0,0,1,0,0];zi(p,p,s),Ei(p,p,[i.cx,i.cy]),l=Th([a,-r],p);var d=e.getModel("axisLabel").get("rotate")||0,f=GM.innerTextLayout(s,d*Math.PI/180,-1);u=f.textAlign,h=f.textVerticalAlign}else{var g=c[1];l=i.coordToPoint([g+r,a]);var y=i.cx,v=i.cy;u=Math.abs(l[0]-y)/g<.3?"center":l[0]>y?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));ER(t,n,i,r,p)},e}(AR);var cN={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:FR(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:WR(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:WR(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},pN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},e.type="polar",e.dependencies=["radiusAxis","angleAxis"],e.defaultOption={z:0,center:["50%","50%"],radius:"80%"},e}(Tp),dN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Co).models[0]},e.type="polarAxis",e}(Tp);R(dN,p_);var fN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="angleAxis",e}(dN),gN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="radiusAxis",e}(dN),yN=function(t){function e(e,n){return t.call(this,"radius",e,n)||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e}(H_);yN.prototype.dataToRadius=H_.prototype.dataToCoord,yN.prototype.radiusToData=H_.prototype.coordToData;var vN=So(),mN=function(t){function e(e,n){return t.call(this,"angle",e,n||[0,360])||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=cr(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=vN(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},e}(H_);mN.prototype.dataToAngle=H_.prototype.dataToCoord,mN.prototype.angleToData=H_.prototype.coordToData;var xN=["radius","angle"],_N=function(){function t(t){this.dimensions=xN,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new yN,this._angleAxis=new mN,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=la;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i-1e-4,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return bN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return bN(e)===this?this.pointToData(n):null},t}();function bN(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function wN(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();E(c_(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),E(c_(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),r_(i.scale,i.model),r_(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function SN(t,e){if(t.type=e.get("type"),t.scale=o_(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var n=e.get("startAngle");t.setExtent(n,n+(t.inverse?-360:360))}e.axis=t,t.model=e}var MN={dimensions:xN,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new _N(i+"");r.update=wN;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");SN(o,s),SN(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=Er(i[0],r),t.cy=Er(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:Y(l)||(l=[0,l]);var u=[Er(l[0],s),Er(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Co).models[0];0,t.coordinateSystem=e.coordinateSystem}})),n}},IN=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function TN(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function CN(t){return t.getRadiusAxis().inverse?0:1}function DN(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var AN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=z(n.getViewLabels(),(function(t){t=T(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));DN(s),DN(o),E(IN,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||kN[e](this.group,t,i,o,a,r,s)}),this)}},e.type="angleAxis",e}(tI),kN={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=CN(n),u=l?0:1;(a=0===o[u]?new hu({shape:{cx:n.cx,cy:n.cy,r:o[l]},style:s.getLineStyle(),z2:1,silent:!0}):new Au({shape:{cx:n.cx,cy:n.cy,r:o[l],r0:o[u]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[CN(n)],u=z(i,(function(t){return new zu({shape:TN(n,[l,l+s],t.coord)})}));t.add(wh(u,{style:k(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[CN(n)],h=[],c=0;cf?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];q(m)&&m.textStyle&&(a=new dc(m.textStyle,l,l.ecModel))}var x=new ks({silent:GM.isLabelSilent(e),style:Uh(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(x),h){var _=GM.makeAxisEventDataBase(e);_.targetType="axisLabel",_.value=i.rawLabel,Hs(x).eventData=_}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h=0?"p":"n",T=_;m&&(i[s][M]||(i[s][M]={p:_,n:_}),T=i[s][M][I]);var C=void 0,D=void 0,A=void 0,k=void 0;if("radius"===c.dim){var L=c.dataToCoord(S)-_,P=o.dataToCoord(M);Math.abs(L)=k})}}}))}var VN={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},BN={splitNumber:5},FN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="polar",e}(gg);function GN(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]];r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a];r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),it(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var WN=["axisLine","axisTickLabel","axisName"],HN=["splitArea","splitLine"],YN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="SingleAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Cr;var s=GN(e),l=new GM(e,s);E(WN,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),E(HN,(function(t){e.get([t,"show"])&&UN[t](this,this.group,this._axisGroup,e)}),this),Ah(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},e.prototype.remove=function(){iI(this)},e.type="singleAxis",e}(tI),UN={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=[],c=0,p=r.getTicksCoords({tickModel:o}),d=[],f=[],g=0;g=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return KN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return KN(e)===this?this.pointToData(n):null},t}();function KN(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var $N={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new qN(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Co).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:jN},JN=["x","y"],QN=["width","height"],tE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=iE(a,1-nE(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=NR(i),c=eE[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}BR(e,t,GN(n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=GN(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=VR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=nE(r),s=iE(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=iE(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},e}(AR),eE={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:FR([e,n[0]],[e,n[1]],nE(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:GR([e-i/2,n[0]],[i,r],nE(t))}}};function nE(t){return t.isHorizontal()?0:1}function iE(t,e){var n=t.getRect();return[n[JN[e]],n[JN[e]]+n[QN[e]]]}var rE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="single",e}(gg);var oE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n,i){var r=Sp(e);t.prototype.init.apply(this,arguments),aE(e,r)},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),aE(this.option,e)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type="calendar",e.defaultOption={z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},e}(Tp);function aE(t,e){var n,i=t.cellSize;1===(n=Y(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=z([0,1],(function(t){return function(t,e){return null!=t[yp[e][0]]||null!=t[yp[e][1]]&&null!=t[yp[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));wp(t,e,{type:"box",ignoreSize:r})}var sE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient(),s=e.getLocaleModel();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,s,a,i),this._renderWeekText(t,s,o,a,i)},e.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new Cs({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},e.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},e.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},e.prototype._drawSplitline=function(t,e,n){var i=new Ru({z2:20,shape:{points:t},style:e});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},e.prototype._formatterLabel=function(t,e){return X(t)&&t?(n=t,E(e,(function(t,e){n=n.replace("{"+e+"}",i?ap(t):t)})),n):U(t)?t(e):e.nameMap;var n,i},e.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},e.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new ks({z2:30,style:Uh(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},e.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderMonthText=function(t,e,n,i){var r=t.getModel("monthLabel");if(r.get("show")){var o=r.get("nameMap"),a=r.get("margin"),s=r.get("position"),l=r.get("align"),u=[this._tlpoints,this._blpoints];o&&!X(o)||(o&&(e=Mc(o)||e),o=e.get(["time","monthAbbr"])||[]);var h="start"===s?0:1,c="horizontal"===n?0:1;a="start"===s?-a:a;for(var p="center"===l,d=0;d=i.start.time&&n.timea.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/lE)-Math.floor(n[0].time/lE)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&ei.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function hE(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}function cE(t,e){var n;return E(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var pE=["transition","enterFrom","leaveTo"],dE=pE.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function fE(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var i=n?pE:dE,r=0;r=0;l--){var p,d,f;if(f=null!=(d=xo((p=n[l]).id,null))?r.get(d):null){var g=f.parent,y=(c=vE(g),{}),v=_p(f,p,g===i?{width:o,height:a}:{width:c.width,height:c.height},null,{hv:p.hv,boundingMode:p.bounding},y);if(!vE(f).isNew&&v){for(var m=p.transition,x={},_=0;_=0)?x[b]=w:f[b]=w}rh(f,x,t,0)}else f.attr(y)}}},e.prototype._clear=function(){var t=this,e=this._elMap;e.each((function(n){bE(n,vE(n).option,e,t._lastGraphicModel)})),this._elMap=ft()},e.prototype.dispose=function(){this._clear()},e.type="graphic",e}(gg);function xE(t){var e=mt(yE,t)?yE[t]:mh(t);var n=new e({});return vE(n).type=t,n}function _E(t,e,n,i){var r=xE(n);return e.add(r),i.set(t,r),vE(r).id=t,vE(r).isNew=!0,r}function bE(t,e,n,i){t&&t.parent&&("group"===t.type&&t.traverse((function(t){bE(t,e,n,i)})),BO(t,e,i),n.removeKey(vE(t).id))}function wE(t,e,n,i){t.isGroup||E([["cursor",da.prototype.cursor],["zlevel",i||0],["z",n||0],["z2",0]],(function(n){var i=n[0];mt(e,i)?t[i]=rt(e[i],n[1]):null==t[i]&&(t[i]=n[1])})),E(G(e),(function(n){if(0===n.indexOf("on")){var i=e[n];t[n]=U(i)?i:null}})),mt(e,"draggable")&&(t.draggable=e.draggable),null!=e.name&&(t.name=e.name),null!=e.id&&(t.id=e.id)}var SE=["x","y","radius","angle","single"],ME=["cartesian2d","polar","singleAxis"];function IE(t){return t+"Axis"}function TE(t,e){var n,i=ft(),r=[],o=ft();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}function CE(t){var e=t.ecModel,n={infoList:[],infoMap:ft()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(IE(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var DE=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),AE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._autoThrottle=!0,n._noTarget=!0,n._rangePropMode=["percent","percent"],n}return n(e,t),e.prototype.init=function(t,e,n){var i=kE(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var e=kE(t);C(this.option,t,!0),C(this.settledOption,e,!0),this._doInit(e)},e.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ft();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},e.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return E(SE,(function(n){var i=this.getReferringComponents(IE(n),Do);if(i.specified){e=!0;var r=new DE;E(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},e.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single");function o(e,n){var r=e[0];if(r){var o=new DE;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Co).models[0];a&&E(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Co).models[0]&&o.add(t.componentIndex)}))}}}i&&E(SE,(function(e){if(i){var r=n.findComponents({mainType:IE(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new DE;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");E([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(IE(e),n))}),this),t},e.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){E(n.indexList,(function(n){t.call(e,i,n)}))}))},e.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(IE(t),e)},e.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var e=this.option;E(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i=0}(e)){var n=IE(this._dimName),i=e.getReferringComponents(n,Co).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return T(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];RE(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(Nr(h,o,n))):(e=!0,h=Nr(c=null==c?n[u]:i.parse(c),n,o)),s[u]=c,a[u]=h})),NE(s),NE(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";lk(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=Nr(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];RE(n,(function(t){!function(t,e,n){e&&E(c_(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=e_(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&RE(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=z(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;lo[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else RE(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));RE(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;RE(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=Nr(n[0]+o,n,[0,100],!0):null!=r&&(o=Nr(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=Gr(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}();var zE={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(IE(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new EE(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=ft();return E(n,(function(t){E(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}};var VE=!1;function BE(t){VE||(VE=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,zE),function(t){t.registerAction("dataZoom",(function(t,e){E(TE(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function FE(t){t.registerComponentModel(LE),t.registerComponentView(OE),BE(t)}var GE=function(){},WE={};function HE(t,e){WE[t]=e}function YE(t){return WE[t]}var UE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;E(this.option.feature,(function(t,n){var i=YE(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),C(t,i.defaultOption))}))},e.type="toolbox",e.layoutMode={type:"box",ignoreSize:!0},e.defaultOption={show:!0,z:6,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},e}(Tp);function XE(t,e){var n=ip(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new Cs({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var ZE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a="vertical"===t.get("orient"),s=t.get("feature")||{},l=this._features||(this._features={}),u=[];E(s,(function(t,e){u.push(e)})),new Im(this._featureNames||[],u).add(h).update(h).remove(H(h,null)).execute(),this._featureNames=u,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=xp(i,o,r);mp(e.get("orient"),t,e.get("itemGap"),a.width,a.height),_p(t,i,o,r)}(r,t,n),r.add(XE(r.getBoundingRect(),t)),a||r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.ensureState("emphasis");if(l&&!U(l)&&e){var u=l.style||(l.style={}),h=cr(e,ks.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+10;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function h(h,c){var p,d=u[h],f=u[c],g=s[d],y=new dc(g,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===d&&(g.title=i.newTitle),d&&!f){if(function(t){return 0===t.indexOf("my")}(d))p={onclick:y.option.onclick,featureName:d};else{var v=YE(d);if(!v)return;p=new v}l[d]=p}else if(!(p=l[f]))return;p.uid=gc("toolbox-feature"),p.model=y,p.ecModel=e,p.api=n;var m=p instanceof GE;d||!f?!y.get("show")||m&&p.unusable?m&&p.remove&&p.remove(e,n):(!function(i,s,l){var u,h,c=i.getModel("iconStyle"),p=i.getModel(["emphasis","iconStyle"]),d=s instanceof GE&&s.getIcons?s.getIcons():i.get("icon"),f=i.get("title")||{};X(d)?(u={})[l]=d:u=d;X(f)?(h={})[l]=f:h=f;var g=i.iconPaths={};E(u,(function(l,u){var d=Ph(l,{},{x:-o/2,y:-o/2,width:o,height:o});d.setStyle(c.getItemStyle()),d.ensureState("emphasis").style=p.getItemStyle();var f=new ks({style:{text:h[u],align:p.get("textAlign"),borderRadius:p.get("textBorderRadius"),padding:p.get("textPadding"),fill:null},ignore:!0});d.setTextContent(f),Eh({el:d,componentModel:t,itemName:u,formatterParamsExtra:{title:h[u]}}),d.__title=h[u],d.on("mouseover",(function(){var e=p.getItemStyle(),i=a?null==t.get("right")&&"right"!==t.get("left")?"right":"left":null==t.get("bottom")&&"bottom"!==t.get("top")?"bottom":"top";f.setStyle({fill:p.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:p.get("textBackgroundColor")}),d.setTextConfig({position:p.get("textPosition")||i}),f.ignore=!t.get("showTitle"),n.enterEmphasis(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",u])&&n.leaveEmphasis(this),f.hide()})),("emphasis"===i.get(["iconStatus",u])?_l:bl)(d),r.add(d),d.on("click",W(s.onclick,s,e,n,u)),g[u]=d}))}(y,p,d),y.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?_l:bl)(i[t])},p instanceof GE&&p.render&&p.render(y,e,n,i)):m&&p.dispose&&p.dispose(e,n)}},e.prototype.updateView=function(t,e,n,i){E(this._features,(function(t){t instanceof GE&&t.updateView&&t.updateView(t.model,e,n,i)}))},e.prototype.remove=function(t,e){E(this._features,(function(n){n instanceof GE&&n.remove&&n.remove(t,e)})),this.group.removeAll()},e.prototype.dispose=function(t,e){E(this._features,(function(n){n instanceof GE&&n.dispose&&n.dispose(t,e)}))},e.type="toolbox",e}(gg);var jE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o="svg"===e.getZr().painter.getType(),a=o?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")}),l=r.browser;if(U(MouseEvent)&&(l.newEdge||!l.ie&&!l.edge)){var u=document.createElement("a");u.download=i+"."+a,u.target="_blank",u.href=s;var h=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});u.dispatchEvent(h)}else if(window.navigator.msSaveOrOpenBlob||o){var c=s.split(","),p=c[0].indexOf("base64")>-1,d=o?decodeURIComponent(c[1]):c[1];p&&(d=window.atob(d));var f=i+"."+a;if(window.navigator.msSaveOrOpenBlob){for(var g=d.length,y=new Uint8Array(g);g--;)y[g]=d.charCodeAt(g);var v=new Blob([y]);window.navigator.msSaveOrOpenBlob(v,f)}else{var m=document.createElement("iframe");document.body.appendChild(m);var x=m.contentWindow,_=x.document;_.open("image/svg+xml","replace"),_.write(d),_.close(),x.focus(),_.execCommand("SaveAs",!0,f),document.body.removeChild(m)}}else{var b=n.get("lang"),w='',S=window.open();S.document.write(w),S.document.title=i}},e.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},e}(GE),qE="__ec_magicType_stack__",KE=[["line","bar"],["stack"]],$E=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return E(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},e.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},e.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if(JE[n]){var o,a={series:[]};E(KE,(function(t){P(t,n)>=0&&E(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=JE[n](e,r,t,i);o&&(k(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Co).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=C({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},e}(GE),JE={line:function(t,e,n,i){if("bar"===t)return C({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return C({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===qE;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),C({id:e,stack:r?"":qE},i.get(["option","stack"])||{},!0)}};cm({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var QE=new Array(60).join("-"),tz="\t";function ez(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var nz=new RegExp("[\t]+","g");function iz(t,e){var n=t.split(new RegExp("\n*"+QE+"\n*","g")),i={series:[]};return E(n,(function(t,n){if(function(t){if(t.slice(0,t.indexOf("\n")).indexOf(tz)>=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=z(ez(e.shift()).split(nz),(function(t){return{name:t,data:[]}})),r=0;r=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=vz[t.brushType](0,n,e);t.__rangeOffset={offset:xz[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){E(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&E(i.coordSyses,(function(i){var r=vz[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){E(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=vz[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?xz[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=bz(n),o=bz(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return z(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:hL(i),isTargetByCursor:pL(i,t,n.coordSysModel),getLinearBrushOtherExtent:cL(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&P(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=dz(e,t),r=0;rt[1]&&t.reverse(),t}function dz(t,e){return Io(t,e,{includeMainTypes:hz})}var fz={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=ft(),a={},s={};(n||i||r)&&(E(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),E(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),E(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];E(r.getCartesians(),(function(t,e){(P(n,t.getAxis("x").model)>=0||P(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:yz.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){E(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:yz.geo})}))}},gz=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],yz={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(Ih(t)),e}},vz={lineX:H(mz,0),lineY:H(mz,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[pz([r[0],o[0]]),pz([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:z(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function mz(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=pz(z([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var xz={lineX:H(_z,0),lineY:H(_z,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return z(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function _z(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function bz(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var wz,Sz,Mz=E,Iz=uo+"toolbox-dataZoom_",Tz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new Ok(n.getZr()),this._brushController.on("brush",W(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new cz(Dz(t),e,{include:["grid"]}).makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(a).enableBrush(!(!o||!a.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return lz(t).length}(e)>1?"emphasis":"normal")}(t,e)},e.prototype.onclick=function(t,e,n){Cz[n].call(this)},e.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new cz(Dz(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=lz(t);az(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=lk(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},e.prototype._dispatchZoomAction=function(t){var e=[];Mz(t,(function(t,n){e.push(T(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},e.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},e}(GE),Cz={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=lz(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return az(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function Dz(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}wz="dataZoom",Sz=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=Io(t,Dz(i));return Mz(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),Mz(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:Iz+e+o};a[n]=o,r.push(a)}},lt(null==jp.get(wz)&&Sz),jp.set(wz,Sz);var Az=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="tooltip",e.dependencies=["axisPointer"],e.defaultOption={z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},e}(Tp);function kz(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function Lz(t){if(r.domSupported)for(var e=document.documentElement.style,n=0,i=t.length;n-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'
    '}(n,i,r)),X(t))o.innerHTML=t+a;else if(t){o.innerHTML="",Y(t)||(t=[t]);for(var s=0;s=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},e.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api,i=t.get("triggerOn");if(null!=this._lastX&&null!=this._lastY&&"none"!==i&&"click"!==i){var r=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&r.manuallyShowTip(t,e,n,{x:r._lastX,y:r._lastY,dataByCoordSys:r._lastDataByCoordSys})}))}},e.prototype.manuallyShowTip=function(t,e,n,i){if(i.from!==this.uid&&!r.node&&n.getDom()){var o=jz(i,n);this._ticket="";var a=i.dataByCoordSys,s=function(t,e,n){var i=To(t).queryOptionMap,r=i.keys()[0];if(!r||"series"===r)return;var o,a=Ao(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}).models[0];if(!a)return;if(n.getViewOfComponentModel(a).group.traverse((function(e){var n=Hs(e).tooltipConfig;if(n&&n.name===t.name)return o=e,!0})),o)return{componentMainType:r,componentIndex:a.componentIndex,el:o}}(i,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:i.position,positionDefault:"bottom"},o)}else if(i.tooltip&&null!=i.x&&null!=i.y){var u=Uz;u.x=i.x,u.y=i.y,u.update(),Hs(u).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:u},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:a,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var h=eN(i,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:i.position,positionDefault:"bottom"},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},o))}},e.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(jz(i,n))},e.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s)if("axis"===Zz([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},e.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;this._lastDataByCoordSys=null,xy(n,(function(t){return null!=Hs(t).dataIndex?(r=t,!0):null!=Hs(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},e.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=W(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},e.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=Zz([e.tooltipOption],i),a=this._renderMode,s=[],l=Xf("section",{blocks:[],noHeader:!0}),u=[],h=new ig;E(t,(function(t){E(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value;if(e&&null!=r){var o=zR(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),c=Xf("section",{header:o,noHeader:!ut(o),sortBlocks:!0,blocks:[]});l.blocks.push(c),E(t.seriesDataIndices,(function(l){var p=n.getSeriesByIndex(l.seriesIndex),d=l.dataIndexInside,f=p.getDataParams(d);if(!(f.dataIndex<0)){f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=s_(e.axis,{value:r}),f.axisValueLabel=o,f.marker=h.makeTooltipMarker("item",pp(f.color),a);var g=uf(p.formatTooltip(d,!0,null)),y=g.frag;if(y){var v=Zz([p],i).get("valueFormatter");c.blocks.push(v?A({valueFormatter:v},y):y)}g.text&&u.push(g.text),s.push(f)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=Jf(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"
    ",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},e.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=Hs(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=Zz([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new ig;g.marker=y.makeTooltipMarker("item",pp(g.color),c);var v=uf(s.formatTooltip(l,!1,u)),m=d.get("order"),x=d.get("valueFormatter"),_=v.frag,b=_?Jf(x?A({valueFormatter:x},_):_,y,c,m,i.get("useUTC"),d.get("textStyle")):v.text,w="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,b,g,w,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,e,n){var i=Hs(e),r=i.tooltipConfig.option||{};if(X(r)){r={content:r,formatter:r}}var o=[r],a=this._ecModel.getComponent(i.componentMainType,i.componentIndex);a&&o.push(a),o.push({formatter:r.content});var s=t.positionDefault,l=Zz(o,this._tooltipModel,s?{position:s}:null),u=l.get("content"),h=Math.random()+"",c=new ig;this._showOrMove(l,(function(){var n=T(l.get("formatterParams")||{});this._showTooltipContent(l,u,n,h,t.offsetX,t.offsetY,t.position,e,c)})),n({type:"showTip",from:this.uid})},e.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent;u.setEnterable(t.get("enterable"));var h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(X(h)){var d=t.ecModel.get("useUTC"),f=Y(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=Vc(f.axisValue,c,d)),c=hp(c,n,!0)}else if(U(h)){var g=W((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},e.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||Y(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:Y(e)?void 0:{color:i||e.color||e.borderColor}},e.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),U(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),Y(e))n=Er(e[0],s),i=Er(e[1],l);else if(q(e)){var d=e;d.width=u[0],d.height=u[1];var f=xp(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(X(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else{g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];null!=o&&(t+l+o+2>i?t-=l+o:t+=o);null!=a&&(e+u+a>r?e-=u+a:e+=a);return[t,e]}(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=qz(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=qz(c)?u[1]/2:"bottom"===c?u[1]:0),kz(t)){g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&E(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&E(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&E(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&E(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},e.prototype.dispose=function(t,e){!r.node&&e.getDom()&&(kg(this,"_updatePosition"),this._tooltipContent.dispose(),QR("itemTooltip",e))},e.type="tooltip",e}(gg);function Zz(t,e,n){var i,r=e.ecModel;n?(i=new dc(n,r,r),i=new dc(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof dc&&(a=a.get("tooltip",!0)),X(a)&&(a={formatter:a}),a&&(i=new dc(a,i,r)))}return i}function jz(t,e){return t.dispatchAction||W(e.dispatchAction,e)}function qz(t){return"center"===t||"middle"===t}var Kz=["rect","polygon","keep","clear"];function $z(t,e){var n=ho(t?t.brush:[]);if(n.length){var i=[];E(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;Y(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};E(t,(function(t){e[t]=1})),t.length=0,E(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,Kz)}}var Jz=E;function Qz(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function tV(t,e,n){var i={};return Jz(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);Jz(t[e],(function(t,i){if(iD.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new iD(r),"opacity"===i&&((r=T(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new iD(r))}}))})),i}function eV(t,e,n){var i;E(n,(function(t){e.hasOwnProperty(t)&&Qz(e[t])&&(i=!0)})),i&&E(n,(function(n){e.hasOwnProperty(n)&&Qz(e[n])?t[n]=T(e[n]):delete t[n]}))}var nV={lineX:iV(0),lineY:iV(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&y_(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(y_(i,r,o)||y_(i,r+a,o)||y_(i,r,o+s)||y_(i,r+a,o+s)||sr.create(t).contain(l[0],l[1])||Oh(r,o,r+a,o,i)||Oh(r,o,r,o+s,i)||Oh(r+a,o,r+a,o+s,i)||Oh(r,o+s,r+a,o+s,i))||void 0}}};function iV(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return rV(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]e[0][1]&&(e[0][1]=o[0]),o[1]e[1][1]&&(e[1][1]=o[1])}return e&&dV(e)}};function dV(t){return new sr(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var fV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Ok(e.getZr())).on("brush",W(this._onBrush,this)).mount()},e.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},e.prototype.updateTransform=function(t,e,n,i){lV(e),this._updateController(t,e,n,i)},e.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},e.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},e.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:T(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:T(n),$from:e})},e.type="brush",e}(gg),gV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.areas=[],n.brushOption={},n}return n(e,t),e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&eV(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},e.prototype.setAreas=function(t){t&&(this.areas=z(t,(function(t){return yV(this.option,t)}),this))},e.prototype.setBrushOption=function(t){this.brushOption=yV(this.option,t),this.brushType=this.brushOption.brushType},e.type="brush",e.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],e.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},e}(Tp);function yV(t,e){return C({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new dc(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var vV=["rect","polygon","lineX","lineY","keep","clear"],mV=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,E(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},e.prototype.updateView=function(t,e,n){this.render(t,e,n)},e.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return E(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},e.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},e.getDefaultOption=function(t){return{show:!0,type:vV.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},e}(GE);var xV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.type="title",e.defaultOption={z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},e}(Tp),_V=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=rt(t.get("textBaseline"),t.get("textVerticalAlign")),l=new ks({style:Uh(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new ks({style:Uh(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){dp(p,"_"+t.get("target"))})),d&&c.on("click",(function(){dp(d,"_"+t.get("subtarget"))})),Hs(l).eventData=Hs(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=xp(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var b=new Cs({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type="title",e}(gg);var bV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode="box",n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],E(n,(function(e,n){var i,o=xo(fo(e),"");q(e)?(i=T(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new qm([{name:"value",type:o}],this)).initData(t,r)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},e.type="timeline",e.defaultOption={z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},e}(Tp),wV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline.slider",e.defaultOption=yc(bV.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),e}(bV);R(wV,lf.prototype);var SV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline",e}(gg),MV=function(t){function e(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return n(e,t),e.prototype.getLabelModel=function(){return this.model.getModel("label")},e.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},e}(H_),IV=Math.PI,TV=So(),CV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.api=e},e.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return Xf("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},E(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return xp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:IV/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*IV/180;var x=d.get("position",!0),_=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===x||"bottom"===x?(_&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(_&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},e.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;Ei(o,o,[-a,-s]),zi(o,o,-IV/2),Ei(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;null==f||X(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f);function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},e.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new vx({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new Rx({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new xx}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.calcNiceTicks();var a=new MV("value",r,t.axisExtent,i);return a.model=e,a},e.prototype._createGroup=function(t){var e=this[t]=new Cr;return this.group.add(e),e},e.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new zu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:A({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new zu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:k({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},e.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],E(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:W(r._changeTimeline,r,t.value)},p=DV(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),Ol(p);var d=Hs(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},e.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],E(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new ks({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:W(r._changeTimeline,r,a),silent:!1,style:Uh(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=Uh(u),p.ensureState("progress").style=Uh(h),e.add(p),Ol(p),TV(p).dataIndex=a,r._tickLabels.push(p)}))}},e.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=gr(rt(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=Ph(t.get(["controlStyle",e]),i||{},new sr(n[0],n[1],n[2],n[3]));r&&o.setStyle(r);return o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),Ol(c)}}h(t.nextBtnPosition,"next",W(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",W(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",W(this._handlePlayClick,this,!l),!0)},e.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=W(s._handlePointerDrag,s),t.ondragend=W(s._handlePointerDragend,s),AV(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){AV(t,s._progressLine,o,n,i)}};this._currentPointer=DV(a,a,this._mainGroup,{},this._currentPointer,l)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=Vr(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var FV={min:H(BV,"min"),max:H(BV,"max"),average:H(BV,"average"),median:H(BV,"median")};function GV(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!Y(e.coord)&&i){var r=i.dimensions,o=WV(e,n,i,t);if((e=T(e)).type&&FV[e.type]&&o.baseAxis&&o.valueAxis){var a=P(r,o.baseAxis.dim),s=P(r,o.valueAxis.dim),l=FV[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)FV[u[h]]&&(u[h]=UV(n,n.mapDimension(r[h]),u[h]));e.coord=u}}return e}function WV(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function HV(t,e){return!(t&&t.containData&&e.coord&&!VV(e))||t.containData(e.coord)}function YV(t,e){return t?function(t,n,i,r){return df(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return df(t.value,e[r])}}function UV(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var XV=So(),ZV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this.markerGroupMap=ft()},e.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){XV(t).keep=!1})),e.eachSeries((function(t){var r=EV.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!XV(t).keep&&i.group.remove(t.group)}))},e.prototype.markKeep=function(t){XV(t).keep=!0},e.prototype.toggleBlurSeries=function(t,e){var n=this;E(t,(function(t){var i=EV.getMarkerModelFromSeries(t,n.type);i&&i.getData().eachItemGraphicEl((function(t){t&&(e?wl(t):Sl(t))}))}))},e.type="marker",e}(gg);function jV(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=Er(a.get("x"),n.getWidth()),l=Er(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var qV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markPoint");e&&(jV(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new qw),u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new qm(i,n),o=z(n.get("data"),H(GV,e));t&&(o=B(o,H(HV,t)));var a=YV(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),jV(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(U(i)||U(r)||U(o)||U(s)){var h=e.getRawValue(t),c=e.getDataParams(t);U(i)&&(i=i(h,c)),U(r)&&(r=r(h,c)),U(o)&&(o=o(h,c)),U(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=gy(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){Hs(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markPoint",e}(ZV);var KV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markLine",e.defaultOption={z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},e}(EV),$V=So(),JV=function(t,e,n,i){var r,o=t.getData();if(Y(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=it(i.yAxis,i.xAxis);else{var u=WV(i,o,e,t);s=u.valueAxis,l=UV(o,ix(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=T(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&j(l)&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[GV(t,r[0]),GV(t,r[1]),A({},r[2])];return g[2].type=g[2].type||null,C(g[2],g[0]),C(g[2],g[1]),g};function QV(t){return!isNaN(t)&&!isFinite(t)}function tB(t,e,n,i){var r=1-t,o=i.dimensions[t];return QV(e[r])&&QV(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function eB(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(tB(1,n,i,t)||tB(0,n,i,t)))return!0}return HV(t,e[0])&&HV(t,e[1])}function nB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get("x"),r.getWidth()),u=Er(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(uS(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions;QV(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):QV(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var iB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=$V(e).from,o=$V(e).to;r.each((function(e){nB(r,e,!0,t,n),nB(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new gA);this.group.add(l.group);var u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new qm(i,n),o=new qm(i,n),a=new qm([],n),s=z(n.get("data"),H(JV,e,t,n));t&&(s=B(s,H(eB,t)));var l=YV(!!t,i);return r.initData(z(s,(function(t){return t[0]})),null,l),o.initData(z(s,(function(t){return t[1]})),null,l),a.initData(z(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;$V(e).from=h,$V(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);nB(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=gy(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:rt(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:rt(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:rt(o.get("symbolSize"),f[r?0:1]),symbol:rt(o.get("symbol",!0),d[r?0:1]),style:s})}Y(d)||(d=[d,d]),Y(f)||(f=[f,f]),Y(g)||(g=[g,g]),Y(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t){Hs(t).dataModel=e,t.traverse((function(t){Hs(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markLine",e}(ZV);var rB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markArea",e.defaultOption={z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},e}(EV),oB=So(),aB=function(t,e,n,i){var r=GV(t,i[0]),o=GV(t,i[1]),a=r.coord,s=o.coord;a[0]=it(a[0],-1/0),a[1]=it(a[1],-1/0),s[0]=it(s[0],1/0),s[1]=it(s[1],1/0);var l=D([{},r,o]);return l.coord=[r.coord,o.coord],l.x0=r.x,l.y0=r.y,l.x1=o.x,l.y1=o.y,l};function sB(t){return!isNaN(t)&&!isFinite(t)}function lB(t,e,n,i){var r=1-t;return sB(e[r])&&sB(n[r])}function uB(t,e){var n=e.coord[0],i=e.coord[1],r={coord:n,x:e.x0,y:e.y0},o={coord:i,x:e.x1,y:e.y1};return uS(t,"cartesian2d")?!(!n||!i||!lB(1,n,i)&&!lB(0,n,i))||function(t,e,n){return!(t&&t.containZone&&e.coord&&n.coord&&!VV(e)&&!VV(n))||t.containZone(e.coord,n.coord)}(t,r,o):HV(t,r)||HV(t,o)}function hB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get(n[0]),r.getWidth()),u=Er(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[d=t.get(n[0],e),f=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if(uS(a,"cartesian2d")){var c=a.getAxis("x"),p=a.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);sB(d)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):sB(f)&&(o[1]=p.toGlobalCoord(p.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var cB=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],pB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=EV.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=z(cB,(function(r){return hB(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Cr});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r,o=["x0","y0","x1","y1"];if(t){var a=z(t&&t.dimensions,(function(t){var n=e.getData();return A(A({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=z(o,(function(t,e){return{name:t,type:a[e%2].type}})),i=new qm(r,n)}else i=new qm(r=[{name:"value",type:"float"}],n);var s=z(n.get("data"),H(aB,e,t,n));t&&(s=B(s,H(uB,t)));var l=t?function(t,e,n,i){return df(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return df(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=z(cB,(function(n){return hB(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];Vr(c),Vr(p);var d=!!(l[0]>c[1]||l[1]p[1]||h[1]=0},e.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},e.type="legend.plain",e.dependencies=["series"],e.defaultOption={z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(Tp),fB=H,gB=E,yB=Cr,vB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._contentGroup=new yB),this.group.add(this._selectorGroup=new yB),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=xp(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=xp(k({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=XE(p,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=ft(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),gB(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new yB;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a)){if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style");this._createItem(p,a,o,r,e,t,f,y,g,u,i).on("click",fB(mB,a,null,i,h)).on("mouseover",fB(_B,p.name,null,i,h)).on("mouseout",fB(bB,p.name,null,i,h)),l.set(a,!0)}else n.eachRawSeries((function(n){if(!l.get(a)&&n.legendVisualProvider){var s=n.legendVisualProvider;if(!s.containName(a))return;var c=s.indexOfName(a),p=s.getItemVisual(c,"style"),d=s.getItemVisual(c,"legendIcon"),f=bn(p.fill);f&&0===f[3]&&(f[3]=.2,p=A(A({},p),{fill:kn(f,"rgba")})),this._createItem(n,a,o,r,e,t,{},p,d,u,i).on("click",fB(mB,null,a,i,h)).on("mouseover",fB(_B,null,a,i,h)).on("mouseout",fB(bB,null,a,i,h)),l.set(a,!0)}}),this);0}}),this),r&&this._createSelector(r,e,i,o,a)},e.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();gB(t,(function(t){var i=t.type,r=new ks({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),Hh(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Ol(r)}))},e.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u,h){var c=t.visualDrawType,p=r.get("itemWidth"),d=r.get("itemHeight"),f=r.isSelected(e),g=i.get("symbolRotate"),y=i.get("symbolKeepAspect"),v=i.get("icon"),m=function(t,e,n,i,r,o,a){function s(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),gB(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var l=e.getModel("itemStyle"),u=l.getItemStyle(),h=0===t.lastIndexOf("empty",0)?"fill":"stroke",c=l.getShallow("decal");u.decal=c&&"inherit"!==c?rv(c,a):i.decal,"inherit"===u.fill&&(u.fill=i[r]);"inherit"===u.stroke&&(u.stroke=i[h]);"inherit"===u.opacity&&(u.opacity=("fill"===r?i:n).opacity);s(u,i);var p=e.getModel("lineStyle"),d=p.getLineStyle();if(s(d,n),"auto"===u.fill&&(u.fill=i.fill),"auto"===u.stroke&&(u.stroke=i.fill),"auto"===d.stroke&&(d.stroke=i.fill),!o){var f=e.get("inactiveBorderWidth"),g=u[h];u.lineWidth="auto"===f?i.lineWidth>0&&g?2:0:u.lineWidth,u.fill=e.get("inactiveColor"),u.stroke=e.get("inactiveBorderColor"),d.stroke=p.get("inactiveColor"),d.lineWidth=p.get("inactiveWidth")}return{itemStyle:u,lineStyle:d}}(l=v||l||"roundRect",i,a,s,c,f,h),x=new yB,_=i.getModel("textStyle");if(!U(t.getLegendIcon)||v&&"inherit"!==v){var b="inherit"===v&&t.getData().getVisual("symbol")?"inherit"===g?t.getData().getVisual("symbolRotate"):g:0;x.add(function(t){var e=t.icon||"roundRect",n=Ly(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2);return n}({itemWidth:p,itemHeight:d,icon:l,iconRotate:b,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}))}else x.add(t.getLegendIcon({itemWidth:p,itemHeight:d,icon:l,iconRotate:g,itemStyle:m.itemStyle,lineStyle:m.lineStyle,symbolKeepAspect:y}));var w="left"===o?p+5:-5,S=o,M=r.get("formatter"),I=e;X(M)&&M?I=M.replace("{name}",null!=e?e:""):U(M)&&(I=M(e));var T=i.get("inactiveColor");x.add(new ks({style:Uh(_,{text:I,x:w,y:d/2,fill:f?_.getTextColor():T,align:S,verticalAlign:"middle"})}));var C=new Cs({shape:x.getBoundingRect(),invisible:!0}),D=i.getModel("tooltip");return D.get("show")&&Eh({el:C,componentModel:r,itemName:e,itemTooltipOption:D.option}),x.add(C),x.eachChild((function(t){t.silent=!0})),C.silent=!u,this.getContentGroup().add(x),Ol(x),x.__legendDataIndex=n,x},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();mp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){mp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type="legend.plain",e}(gg);function mB(t,e,n,i){bB(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),_B(t,e,n,i)}function xB(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;in[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=rt(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v);y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var x={x:0,y:0};x[r]=Math.max(n[r]-p[r]-v,0),x[o]=m[o],u.setClipPath(new Cs({shape:x})),u.__rectSize=x[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var _=this._getPageInfo(t);return null!=_.pageIndex&&rh(l,{x:_.contentPosition[0],y:_.contentPosition[1]},d?t:null),this._updatePageInfoView(t,_),m},e.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},e.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;E(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",X(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},e.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=DB[r],a=AB[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!x(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&x(y,v.s)||!(g.i=e&&t.s<=e+i}},e.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},e.type="legend.scroll",e}(vB);function LB(t){wm(MB),t.registerComponentModel(IB),t.registerComponentView(kB),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var PB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.inside",e.defaultOption=yc(AE.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(AE),OB=So();function RB(t,e,n){OB(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}function NB(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function EB(t,e){t.isDisposed()||t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function zB(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}function VB(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=OB(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=ft());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){E(CE(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:H(zB,e),dispatchAction:H(EB,t),dataZoomInfoMap:null,controller:null},i=n.controller=new kI(t.getZr());return E(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=ft())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),Ag(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else NB(i,t)}))}))}var BB=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return n(e,t),e.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),RB(i,e,{pan:W(FB.pan,this),zoom:W(FB.zoom,this),scrollMove:W(FB.scrollMove,this)}))},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){!function(t,e){for(var n=OB(t).coordSysRecordMap,i=n.keys(),r=0;r0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return lk(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:GB((function(t,e,n,i,r,o){var a=WB[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:GB((function(t,e,n,i,r,o){return WB[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function GB(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return lk(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var WB={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function HB(t){BE(t),t.registerComponentModel(PB),t.registerComponentView(BB),VB(t)}var YB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.slider",e.layoutMode="box",e.defaultOption=yc(AE.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),e}(AE),UB=Cs,XB="horizontal",ZB="vertical",jB=["line","bar","candlestick","scatter"],qB={easing:"cubicOut",duration:100,delay:0},KB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._displayables={},n}return n(e,t),e.prototype.init=function(t,e){this.api=e,this._onBrush=W(this._onBrush,this),this._onBrushEnd=W(this._onBrushEnd,this)},e.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),Ag(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){kg(this,"_dispatchZoomAction");var t=this.api.getZr();t.off("mousemove",this._onBrush),t.off("mouseup",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Cr;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===XB?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Sp(t.option);E(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=xp(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===ZB&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==XB||r?n===XB&&r?{scaleY:a?1:-1,scaleX:-1}:n!==ZB||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new UB({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new UB({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:W(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=this._shadowSize||[],i=t.series,r=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=this._shadowPolygonPts,s=this._shadowPolylinePts;if(r!==this._shadowData||o!==this._shadowDim||e[0]!==n[0]||e[1]!==n[1]){var l=r.getDataExtent(o),u=.3*(l[1]-l[0]);l=[l[0]-u,l[1]+u];var h,c=[0,e[1]],p=[0,e[0]],d=[[e[0],0],[0,0]],f=[],g=p[1]/(r.count()-1),y=0,v=Math.round(r.count()/e[0]);r.each([o],(function(t,e){if(v>0&&e%v)y+=g;else{var n=null==t||isNaN(t)||""===t,i=n?0:Nr(t,l,c,!0);n&&!h&&e?(d.push([d[d.length-1][0],0]),f.push([f[f.length-1][0],0])):!n&&h&&(d.push([y,0]),f.push([y,0])),d.push([y,i]),f.push([y,i]),y+=g,h=n}})),a=this._shadowPolygonPts=d,s=this._shadowPolylinePts=f}this._shadowData=r,this._shadowDim=o,this._shadowSize=[e[0],e[1]];for(var m=this.dataZoomModel,x=0;x<3;x++){var _=b(1===x);this._displayables.sliderGroup.add(_),this._displayables.dataShadowSegs.push(_)}}}function b(t){var e=m.getModel(t?"selectedDataBackground":"dataBackground"),n=new Cr,i=new Pu({shape:{points:a},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new Ru({shape:{points:s},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){E(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&P(jB,t.get("type"))<0)){var a,s=i.getComponent(IE(r),o).axis,l={x:"y",y:"x",radius:"angle",angle:"radius"}[r],u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},e.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new UB({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new UB({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),E([0,1],(function(e){var o=a.get("handleIcon");!Dy[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=Ly(o,-1,0,2,2,null,!0);s.attr({cursor:$B(this._orient),draggable:!0,drift:W(this._onDragMove,this,e),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=Er(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),Ol(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new ks({silent:!0,invisible:!0,style:Uh(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=Er(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new Cs({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=Ly(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new Cs({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:$B(this._orient),drift:W(this._onDragMove,this,"all"),ondragstart:W(this._showDataInfo,this,!0),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Nr(t[0],[0,100],e,!0),Nr(t[1],[0,100],e,!0)]},e.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];lk(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Nr(o.minSpan,a,r,!0):null,null!=o.maxSpan?Nr(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=Vr([Nr(i[0],r,a,!0),Nr(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},e.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=Vr(n.slice()),r=this._size;E([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;le[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new Ji(e,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=Vr([Nr(n.x,i,r,!0),Nr(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(se(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new UB({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},e.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?qB:null,start:e[0],end:e[1]})},e.prototype._findCoordRect=function(){var t,e=CE(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},e.type="dataZoom.slider",e}(PE);function $B(t){return"vertical"===t?"ns-resize":"ew-resize"}function JB(t){t.registerComponentModel(YB),t.registerComponentView(KB),BE(t)}var QB=function(t,e,n){var i=T((tF[t]||{})[e]);return n&&Y(i)?i[i.length-1]:i},tF={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},eF=iD.mapVisual,nF=iD.eachVisual,iF=Y,rF=E,oF=Vr,aF=Nr,sF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.stateList=["inRange","outOfRange"],n.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],n.layoutMode={type:"box",ignoreSize:!0},n.dataBound=[-1/0,1/0],n.targetVisuals={},n.controllerVisuals={},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&eV(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var e=this.stateList;t=W(t,this),this.controllerVisuals=tV(this.option.controller,e,t),this.targetVisuals=tV(this.option.target,e,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=ho(t),e},e.prototype.eachTargetSeries=function(t,e){E(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},e.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},e.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],Y(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return X(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):U(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,e=oF([t.min,t.max]);this._dataExtent=e},e.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});C(i,n),C(r,n);var o=this.isCategory();function a(n){iF(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},rF(i,(function(t,e){if(iD.isValidType(e)){var n=QB(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";rF(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&T(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&T(n)||(o?s[0]:[s[0],s[0]])),l.symbol=eF(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;nF(u,(function(t){t>h&&(h=t)})),l.symbolSize=eF(u,(function(t){return aF(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type="visualMap",e.dependencies=["series"],e.defaultOption={show:!0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},e}(Tp),lF=[20,140],uF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},e.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=lF[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=lF[1])},e.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):Y(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},e.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),e=Vr((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=n[1]||t<=e[1])?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},e.prototype.getVisualMeta=function(t){var e=hF(this,"outOfRange",this.getExtent()),n=hF(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;at[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},e.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},e.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Cr("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},e.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();yF([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=gF(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=Th(n.handleLabelPoints[l],Ih(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},e.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=gF(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=Th(l.indicatorLabelPoint,Ih(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var x={x:d,y:p,style:{fill:h}},_={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(x,b),y.animateTo(_,b)}else u.attr(x),y.attr(_);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;Sr[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||bF(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function TF(t,e,n,i){for(var r=e.targetVisuals[i],o=iD.prepareVisualTypes(r),a={color:gy(t.getData(),"color")},s=0,l=o.length;s0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(SF,MF),E(IF,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(DF))}function PF(t){t.registerComponentModel(uF),t.registerComponentView(xF),LF(t)}var OF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._pieceList=[],n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],RF[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=T(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=z(this._pieceList,(function(t){return t=T(t),"inRange"!==e&&(t.visual=null),t})))}))},e.prototype.completeVisualOption=function(){var e=this.option,n={},i=iD.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}E(e.pieces,(function(t){E(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),E(n,(function(t,n){var i=!1;E(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&E(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=QB(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,E(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;E(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},e.prototype.getItemSymbol=function(){return this.get("itemSymbol")},e.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},e.prototype.setSelected=function(t){this.option.selected=T(t)},e.prototype.getValueState=function(t){var e=iD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){iD.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},e.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},e.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return E(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},e.type="visualMap.piecewise",e.defaultOption=yc(sF.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),e}(sF),RF={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function NF(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var EF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=it(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),E(l.viewPieceList,(function(i){var l=i.piece,u=new Cr;u.onclick=W(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new ks({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),mp(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:fF(i.findTargetDataIndices(e),i)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return dF(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},e.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Cr,a=this.visualMapModel.textStyleModel;o.add(new ks({style:Uh(a,{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e})})),t.add(o)}},e.prototype._getViewData=function(){var t=this.visualMapModel,e=z(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},e.prototype._createItemSymbol=function(t,e,n){t.add(Ly(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},e.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=n.selectedMode;if(i){var r=T(n.selected),o=e.getSelectedMapKey(t);"single"===i||!0===i?(r[o]=!0,E(r,(function(t,e){r[e]=e===o}))):r[o]=!r[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:r})}},e.type="visualMap.piecewise",e}(cF);function zF(t){t.registerComponentModel(OF),t.registerComponentView(EF),LF(t)}var VF={label:{enabled:!0},decal:{show:!1}},BF=So(),FF={};function GF(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=T(VF);C(i.label,t.getLocaleModel().get("aria"),!1),C(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=ft();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),BF(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if(U(e.enableAriaDecal))e.enableAriaDecal();else{var n=e.getData();if(e.isColorBySeries()){var i=ed(e.ecModel,e.name,FF,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=BF(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=ed(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}function u(t,e){var n=t?A(A({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),o=n.getModel("label");if(o.option=k(o.option,i),!o.get("enabled"))return;var a=e.getZr().dom;if(o.get("description"))return void a.setAttribute("aria-label",o.get("description"));var s,l=t.getSeriesCount(),u=o.get(["data","maxCount"])||10,h=o.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();if(p){var d=o.get(["general","withTitle"]);s=r(d,{title:p})}else s=o.get(["general","withoutTitle"]);var f=[],g=l>1?o.get(["series","multiple","prefix"]):o.get(["series","single","prefix"]);s+=r(g,{seriesCount:l}),t.eachSeries((function(e,n){if(n1?o.get(["series","multiple",a]):o.get(["series","single",a]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(x=e.subType,t.getLocaleModel().get(["series","typeNames"])[x]||"自定义图")});var s=e.getData();if(s.count()>u)i+=r(o.get(["data","partialData"]),{displayCnt:u});else i+=o.get(["data","allData"]);for(var h=o.get(["data","separator","middle"]),p=o.get(["data","separator","end"]),d=[],g=0;g":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},YF=function(){function t(t){if(null==(this._condVal=X(t)?new RegExp(t):et(t)?t:null)){var e="";0,ao(e)}}return t.prototype.evaluate=function(t){var e=typeof t;return X(e)?this._condVal.test(t):!!j(e)&&this._condVal.test(t+"")},t}(),UF=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),XF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e2&&l.push(e),e=[t,n]}function f(t,n,i,r){oG(t,i)&&oG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=nM:C2&&l.push(e),l}function sG(t,e,n,i,r,o,a,s,l,u){if(oG(t,n)&&oG(e,i)&&oG(r,a)&&oG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,x=g*g+y*y,_=v*v+m*m;if(x=0&&_-w*w=0)l.push(a,s);else{var S=[],M=[];Ze(t,n,r,a,.5,S),Ze(e,i,o,s,.5,M),sG(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),sG(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function lG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u0)for(u=0;uMath.abs(u),c=lG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d1?null:new Ji(d*l+t,d*u+e)}function pG(t,e,n){var i=new Ji;Ji.sub(i,n,e),i.normalize();var r=new Ji;return Ji.sub(r,t,e),r.dot(i)}function dG(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function fG(t){var e=t.points,n=[],i=[];Ma(e,n,i);var r=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new Ji,h=new Ji;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;or,a=lG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p0)for(var b=i/n,w=-i/2;w<=i/2;w+=b){var S=Math.sin(w),M=Math.cos(w),I=0;for(x=0;x0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function LG(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=z(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return z(o,(function(o,a){return{cp:o,z:kG(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function PG(t){return vG(t.path,t.count)}function OG(t){return Y(t[0])}function RG(t,e){for(var n=[],i=t.length,r=0;r=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var NG={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);OG(t)&&(s=t,l=e),OG(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?RG(l,s):RG(c?e:t,[c?t:e]),d=0,f=0;f1e4))for(var i=n.getIndices(),r=function(t){for(var e=t.dimensions,n=0;n0&&i.group.traverse((function(t){t instanceof gs&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function UG(t){var e=t.getModel("universalTransition").get("seriesKey");return e||t.id}function XG(t){return Y(t)?t.sort().join(","):t}function ZG(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function jG(t,e){for(var n=0;n=0&&r.push({data:e.oldData[n],divide:ZG(e.oldData[n]),dim:t.dimension})})),E(ho(t.to),(function(t){var e=jG(n.updatedSeries,t);if(e>=0){var i=n.updatedSeries[e].getData();o.push({data:i,divide:ZG(i),dim:t.dimension})}})),r.length>0&&o.length>0&&YG(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=ft(),i=ft(),r=ft();return E(t.oldSeries,(function(e,n){var o=t.oldData[n],a=UG(e),s=XG(a);i.set(s,o),Y(a)&&E(a,(function(t){r.set(t,{data:o,key:s})}))})),E(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.getData(),o=UG(t),a=XG(o),s=i.get(a);if(s)n.set(a,{oldSeries:[{divide:ZG(s),data:s}],newSeries:[{divide:ZG(e),data:e}]});else if(Y(o)){var l=[];E(o,(function(t){var e=i.get(t);e&&l.push({divide:ZG(e),data:e})})),l.length&&n.set(a,{oldSeries:l,newSeries:[{data:e,divide:ZG(e)}]})}else{var u=r.get(o);if(u){var h=n.get(u.key);h||(h={oldSeries:[{data:u.data,divide:ZG(u.data)}],newSeries:[]},n.set(u.key,h)),h.newSeries.push({data:e,divide:ZG(e)})}}}})),n}(i,n);E(o.keys(),(function(t){var n=o.get(t);YG(n.oldSeries,n.newSeries,e)}))}E(n.updatedSeries,(function(t){t.__universalTransitionEnabled&&(t.__universalTransitionEnabled=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldData=[],u=0;u3)for(n=[n],i=3;i0?g(v.type,v.props,v.key,null,v.__v):v)){if(v.__=n,v.__b=n.__b+1,null===(h=D[p])||h&&v.key==h.key&&v.type===h.type)D[p]=void 0;else for(f=0;f3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),L(v(oe,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}(ne.prototype=new y).__e=function(e){var t=this,n=te(t.__v),r=t.o.get(e);return r[0]++,function(o){var i=function(){t.props.revealOrder?(r.push(o),re(t,e,r)):o()};n?n(i):i()}},ne.prototype.render=function(e){this.u=null,this.o=new Map;var t=R(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},ne.prototype.componentDidUpdate=ne.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){re(e,n,t)}))};var ae="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,se=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,le=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var ue=i.event;function ce(){}function de(){return this.cancelBubble}function pe(){return this.defaultPrevented}i.event=function(e){return ue&&(e=ue(e)),e.persist=ce,e.isPropagationStopped=de,e.isDefaultPrevented=pe,e.nativeEvent=e};var fe={configurable:!0,get:function(){return this.class}},he=i.vnode;i.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var i=n[o];"value"===o&&"defaultValue"in n&&null==i||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===i?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!le(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():se.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===i&&(i=void 0),r[o]=i)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=R(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=R(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(fe.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",fe)),e.$$typeof=ae,he&&he(e)};var ve=i.__r;i.__r=function(e){ve&&ve(e)},"object"==typeof performance&&"function"==typeof performance.now&&performance.now.bind(performance);var ge="undefined"!=typeof globalThis?globalThis:window;ge.FullCalendarVDom?console.warn("FullCalendar VDOM already loaded"):ge.FullCalendarVDom={Component:y,createElement:v,render:L,createRef:function(){return{current:null}},Fragment:m,createContext:function(e){var t=function(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(b)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}(e),n=t.Provider;return t.Provider=function(){var e=this,t=!this.getChildContext,r=n.apply(this,arguments);if(t){var o=[];this.shouldComponentUpdate=function(t){e.props.value!==t.value&&o.forEach((function(e){e.context=t.value,e.forceUpdate()}))},this.sub=function(e){o.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){o.splice(o.indexOf(e),1),t&&t.call(e)}}}return r},t},createPortal:function(e,t){return v(ie,{__v:e,i:t})},flushSync:function(e){e();var t=i.debounceRendering,n=[];function r(e){n.push(e)}i.debounceRendering=r,L(v(me,{}),document.createElement("div"));for(;n.length;)n.shift()();i.debounceRendering=t},unmountComponentAtNode:function(e){L(null,e)}};var me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return v("div",{})},t.prototype.componentDidMount=function(){this.setState({})},t}(y);var ye=function(){function e(e,t){this.context=e,this.internalEventSource=t}return e.prototype.remove=function(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"format",{get:function(){return this.internalEventSource.meta.format},enumerable:!1,configurable:!0}),e}();function Ee(e){e.parentNode&&e.parentNode.removeChild(e)}function Se(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(be(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function be(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function De(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o=0;i-=1){var a=e[i][r];if("object"==typeof a&&a)o.unshift(a);else if(void 0!==a){n[r]=a;break}}o.length&&(n[r]=Et(o))}for(i=e.length-1;i>=0;i-=1){var s=e[i];for(var l in s)l in n||(n[l]=s[l])}return n}function St(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function bt(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Dt(e){for(var t={},n=0,r=e;n10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",jt(t,!0)))),r}function Bt(e){return e.toISOString().replace(/T.*$/,"")}function zt(e){return Ze(e.getUTCHours(),2)+":"+Ze(e.getUTCMinutes(),2)+":"+Ze(e.getUTCSeconds(),2)}function jt(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=Math.round(r%60);return t?n+Ze(o,2)+":"+Ze(i,2):"GMT"+n+o+(i?":"+Ze(i,2):"")}function Gt(e,t,n){if(e===t)return!0;var r,o=e.length;if(o!==t.length)return!1;for(r=0;r1)||"numeric"!==o.year&&"2-digit"!==o.year||"numeric"!==o.month&&"2-digit"!==o.month||"numeric"!==o.day&&"2-digit"!==o.day||(s=1);var l=this.format(e,n),u=this.format(t,n);if(l===u)return l;var c=nn(function(e,t){var n={};for(var r in e)(!(r in Xt)||Xt[r]<=t)&&(n[r]=e[r]);return n}(o,s),i,n),d=c(e),p=c(t),f=function(e,t,n,r){var o=0;for(;o=Ut(t)&&(r=tt(r,1))}return e.start&&(n=lt(e.start),r&&r<=n&&(r=tt(n,1))),{start:n,end:r}}function Vn(e){var t=Wn(e);return ot(t.start,t.end)>1}function Fn(e,t,n,r){return"year"===r?Nt(n.diffWholeYears(e,t),"year"):"month"===r?Nt(n.diffWholeMonths(e,t),"month"):it(e,t)}function Bn(e,t){var n,r,o=[],i=t.start;for(e.sort(zn),n=0;ni&&o.push({start:i,end:r.start}),r.end>i&&(i=r.end);return it.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Zn(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t=(n||t.end),isToday:t&&Zn(t,r.start)}}function lr(e){var t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function ur(e){return e.instance?e.instance.instanceId:e.def.defId+":"+e.range.start.toISOString()}function cr(e,t){var n=e.eventRange,r=n.def,o=n.instance,i=r.url;if(i)return{href:i};var a=t.emitter,s=t.options.eventInteractive;return null==s&&null==(s=r.interactive)&&(s=Boolean(a.hasHandlers("eventClick"))),s?Oe((function(e){a.trigger("eventClick",{el:e.target,event:new xr(t,r,o),jsEvent:e,view:t.viewApi})})):{}}var dr={start:yn,end:yn,allDay:Boolean};function pr(e,t,n){var o=function(e,t){var n=mn(e,dr),o=n.refined,i=n.extra,a=o.start?t.createMarkerMeta(o.start):null,s=o.end?t.createMarkerMeta(o.end):null,l=o.allDay;null==l&&(l=a&&a.isTimeUnspecified&&(!s||s.isTimeUnspecified));return r({range:{start:a?a.marker:null,end:s?s.marker:null},allDay:l},i)}(e,t),i=o.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return o}function fr(e,t){return Gn(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)}function hr(e,t,n){return r(r({},vr(e,t,n)),{timeZone:t.timeZone})}function vr(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function gr(e,t,n){var r=On({editable:!1},n),o=Ln(r.refined,r.extra,"",e.allDay,!0,n);return{def:o,ui:er(o,t),instance:mt(o.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function mr(e,t,n){n.emitter.trigger("select",r(r({},yr(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function yr(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.dateSpanTransforms;a=0;r-=1){var o=n[r].parseMeta(e);if(o)return{sourceDefId:r,meta:o}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Le(),sourceDefId:s.sourceDefId,meta:s.meta,ui:kn(i,t),extendedProps:a}}return null}function _r(e){return r(r(r({},_n),wr),e.pluginHooks.eventSourceRefiners)}function Tr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}var kr=function(){function e(){}return e.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},e.prototype.dispatch=function(e){return this.currentDataManager.dispatch(e)},Object.defineProperty(e.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),e.prototype.batchRendering=function(e){e()},e.prototype.updateSize=function(){this.trigger("_resize",!0)},e.prototype.setOption=function(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})},e.prototype.getOption=function(e){return this.currentDataManager.currentCalendarOptionsInput[e]},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},e.prototype.on=function(e,t){var n=this.currentDataManager;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn("Unknown listener name '"+e+"'")},e.prototype.off=function(e,t){this.currentDataManager.emitter.off(e,t)},e.prototype.trigger=function(e){for(var t,n=[],r=1;r=1?Math.min(o,i):o}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=nt(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Ft(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?ht(dt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?ht(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-pt(ft(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(ft(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?pt(ft(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(ft(e))*60):new Date(e.valueOf()-(t||0))},e}(),Ur=[],Wr={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},Vr=r(r({},Wr),{buttonHints:{prev:"Previous $0",next:"Next $0",today:function(e,t){return"day"===t?"Today":"This "+e}},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:function(e){return"Show "+e+" more event"+(1===e?"":"s")}});function Fr(e){for(var t=e.length>0?e[0].code:"en",n=Ur.concat(e),r={en:Vr},o=0,i=n;o0;o-=1){var i=r.slice(0,o).join("-");if(t[i])return t[i]}return null}(n,t)||Vr;return zr(e,n,r)}(e,t):zr(e.code,[e.code],e)}function zr(e,t,n){var r=Et([Wr,n],["buttonText"]);delete r.code;var o=r.week;return delete r.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function jr(e){var t=Br(e.locale||"en",Fr([]).map);return new Lr(r(r({timeZone:cn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}var Gr,qr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function Yr(e,t){return En(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return r(r({},qr),e)}))}(e),null,t)}function Zr(e,t){return e.left>=t.left&&e.left=t.top&&e.top
    ",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);var t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),Gr}var eo={defs:{},instances:{}},to=function(){function e(){this.getKeysForEventDefs=qt(this._getKeysForEventDefs),this.splitDateSelection=qt(this._splitDateSpan),this.splitEventStore=qt(this._splitEventStore),this.splitIndividualUi=qt(this._splitIndividualUi),this.splitEventDrag=qt(this._splitInteraction),this.splitEventResize=qt(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),o=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),l=this.splitEventResize(e.eventResize),u={};for(var c in this.eventUiBuilders=bt(n,(function(e,n){return t.eventUiBuilders[n]||qt(no)})),n){var d=n[c],p=a[c]||eo,f=this.eventUiBuilders[c];u[c]={businessHours:d.businessHours||e.businessHours,dateSelection:o[c]||null,eventStore:p,eventUiBases:f(e.eventUiBases[""],d.ui,i[c]),eventSelection:p.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:l[c]||null}}return u},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);nn:!!t&&e>=t.end)}}function oo(e,t){var n=["fc-day","fc-day-"+Qe[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}var io=ln({year:"numeric",month:"long",day:"numeric"}),ao=ln({week:"long"});function so(e,t,n,o){void 0===n&&(n="day"),void 0===o&&(o=!0);var i=e.dateEnv,a=e.options,s=e.calendarApi,l=i.format(t,"week"===n?ao:io);if(a.navLinks){var u=i.toDate(t),c=function(e){var r="day"===n?a.navLinkDayClick:"week"===n?a.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return r({title:Xe(a.navLinkHint,[l,u],l),"data-navlink":""},o?He(c):{onClick:c})}return{"aria-label":l}}var lo,uo=null;function co(){return null===uo&&(uo=function(){var e=document.createElement("div");we(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
    ",document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Ee(e),t}()),uo}function po(){return lo||(lo=function(){var e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);var t=fo(e);return document.body.removeChild(e),t}()),lo}function fo(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function ho(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,o=parseInt(n.borderRightWidth,10)||0,i=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=fo(e),l=s.y-r-o,u={borderLeft:r,borderRight:o,borderTop:i,borderBottom:a,scrollbarBottom:s.x-i-a,scrollbarLeft:0,scrollbarRight:0};return co()&&"rtl"===n.direction?u.scrollbarLeft=l:u.scrollbarRight=l,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function vo(e,t,n){void 0===t&&(t=!1);var r=n?e.getBoundingClientRect():go(e),o=ho(e,t),i={left:r.left+o.borderLeft+o.scrollbarLeft,right:r.right-o.borderRight-o.scrollbarRight,top:r.top+o.borderTop,bottom:r.bottom-o.borderBottom-o.scrollbarBottom};return t&&(i.left+=o.paddingLeft,i.right-=o.paddingRight,i.top+=o.paddingTop,i.bottom-=o.paddingBottom),i}function go(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function mo(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function yo(e,t,n){var r=!1,o=function(){r||(r=!0,t.apply(this,arguments))},i=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(o,i);a&&"function"==typeof a.then&&a.then(o,i)}var Eo=function(){function e(){this.handlers={},this.thisContext=null}return e.prototype.setThisContext=function(e){this.thisContext=e},e.prototype.setOptions=function(e){this.options=e},e.prototype.on=function(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)},e.prototype.off=function(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}(this.handlers,e,t)},e.prototype.trigger=function(e){for(var t=[],n=1;n=n[t]&&e=n[t]&&e0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()0},e.prototype.canScrollRight=function(){return this.getScrollLeft()=c.end?new Date(c.end.valueOf()-1):u),o=this.buildCurrentRangeInfo(e,t),i=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.range),o.unit,i),s=a=this.trimHiddenDays(a),d.showNonCurrentDates||(s=jn(s,o.range)),s=jn(s=this.adjustActiveRange(s),r),l=qn(o.range,r),{validRange:r,currentRange:o.range,currentRangeUnit:o.unit,isRangeAllDay:i,activeRange:s,renderRange:a,slotMinTime:d.slotMinTime,slotMaxTime:d.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(o.duration)}},e.prototype.buildValidRange=function(){var e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.props,o=null,i=null,a=null;return r.duration?(o=r.duration,i=r.durationUnit,a=this.buildRangeFromDuration(e,t,o,i)):(n=this.props.dayCount)?(i="day",a=this.buildRangeFromDayCount(e,t,n)):(a=this.buildCustomVisibleRange(e))?i=r.dateEnv.greatestWholeUnit(a.start,a.end).unit:(i=Vt(o=this.getFallbackDuration()).unit,a=this.buildRangeFromDuration(e,t,o,i)),{duration:o,unit:i,range:a}},e.prototype.getFallbackDuration=function(){return Nt({day:1})},e.prototype.adjustActiveRange=function(e){var t=this.props,n=t.dateEnv,r=t.usesMinMaxTime,o=t.slotMinTime,i=t.slotMaxTime,a=e.start,s=e.end;return r&&(Lt(o)<0&&(a=lt(a),a=n.add(a,o)),Lt(i)>1&&(s=tt(s=lt(s),-1),s=n.add(s,i))),{start:a,end:s}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var o,i,a,s=this.props,l=s.dateEnv,u=s.dateAlignment;if(!u){var c=this.props.dateIncrement;u=c&&Ut(c)e.fetchRange.end}(e,t,n)})),t,!1,n)}function pi(e,t,n,r,o){var i={};for(var a in e){var s=e[a];t[a]?i[a]=fi(s,n,r,o):i[a]=s}return i}function fi(e,t,n,o){var i=o.options,a=o.calendarApi,s=o.pluginHooks.eventSourceDefs[e.sourceDefId],l=Le();return s.fetch({eventSource:e,range:t,isRefetch:n,context:o},(function(n){var r=n.rawEvents;i.eventSourceSuccess&&(r=i.eventSourceSuccess.call(a,r,n.xhr)||r),e.success&&(r=e.success.call(a,r,n.xhr)||r),o.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(function(n){console.warn(n.message,n),i.eventSourceFailure&&i.eventSourceFailure.call(a,n),e.failure&&e.failure(n),o.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),r(r({},e),{isFetching:!0,latestFetchId:l})}function hi(e,t){return St(e,(function(e){return vi(e,t)}))}function vi(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function gi(e,t,n,r,o){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,o,i){if(t&&n===t.latestFetchId){var a=En(function(e,t,n){var r=n.options.eventDataTransform,o=t?t.eventDataTransform:null;o&&(e=mi(e,o));r&&(e=mi(e,r));return e}(o,t,i),t,i);return r&&(a=xt(a,r,i)),Cn(yi(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,o);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=xt(t,n,r));return Cn(e,t)}(e,t.eventStore,r?r.activeRange:null,o);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Cn(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?xt(e,r.activeRange,o):e;case"REMOVE_EVENTS":return function(e,t){var n=e.defs,r=e.instances,o={},i={};for(var a in n)t.defs[a]||(o[a]=n[a]);for(var s in r)!t.instances[s]&&o[r[s].defId]&&(i[s]=r[s]);return{defs:o,instances:i}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return yi(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return wn(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function mi(e,t){var n;if(t){n=[];for(var r=0,o=e;r=200&&a.status<400){var e=!1,t=void 0;try{t=JSON.parse(a.responseText),e=!0}catch(e){}e?r(t,a):o("Failure parsing JSON",a)}else o("Request failed",a)},a.onerror=function(){o("Request failed",a)},a.send(i)}function Ti(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function ki(e,t){for(var n=Ct(t.getCurrentData().eventSources),r=[],o=0,i=e;o1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}var Ni=function(){function e(e){var t=this;this.computeOptionsData=qt(this._computeOptionsData),this.computeCurrentViewData=qt(this._computeCurrentViewData),this.organizeRawLocales=qt(Fr),this.buildLocale=qt(Br),this.buildPluginHooks=jo(),this.buildDateEnv=qt(Hi),this.buildTheme=qt(Oi),this.parseToolbars=qt(Ci),this.buildViewSpecs=qt(oi),this.buildDateProfileGenerator=Yt(Ai),this.buildViewApi=qt(Li),this.buildViewUiProps=Yt(Vi),this.buildEventUiBySource=qt(Ui,wt),this.buildEventUiBases=qt(Wi),this.parseContextBusinessHours=Yt(Bi),this.buildTitle=qt(Pi),this.emitter=new Eo,this.actionRunner=new Ii(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=function(){return t.data},this.dispatch=function(e){t.actionRunner.request(e)},this.props=e,this.actionRunner.pause();var n={},o=this.computeOptionsData(e.optionOverrides,n,e.calendarApi),i=o.calendarOptions.initialView||o.pluginHooks.initialView,a=this.computeCurrentViewData(i,o,e.optionOverrides,n);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(a.options);var s,l,u,c=(s=o.calendarOptions,l=o.dateEnv,null!=(u=s.initialDate)?l.createMarker(u):Tr(s.now,l)),d=a.dateProfileGenerator.build(c);Zn(d.activeRange,c)||(c=d.currentRange.start);for(var p={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f=0,h=o.pluginHooks.contextInit;fs.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:a.end}},i)),r?(n.push.apply(n,o([{index:e.index,thickness:e.thickness,span:$i(s,a)}],i)),r):(n.push(e),0)},e.prototype.insertEntryAt=function(e,t){var n=this.entriesByLevel,r=this.levelCoords;-1===t.lateral?(Ji(r,t.level,t.levelCoord),Ji(n,t.level,[e])):Ji(n[t.level],t.lateral,e),this.stackCnts[Zi(e)]=t.stackCnt},e.prototype.findInsertion=function(e){for(var t=this,n=t.levelCoords,r=t.entriesByLevel,o=t.strictOrder,i=t.stackCnts,a=n.length,s=0,l=-1,u=-1,c=null,d=0,p=0;p=s+e.thickness)break;for(var h=r[p],v=void 0,g=Qi(h,e.span.start,Yi),m=g[0]+g[1];(v=h[m])&&v.span.starts&&(s=y,c=v,l=p,u=m),y===s&&(d=Math.max(d,i[Zi(v)]+1)),m+=1}}var E=0;if(c)for(E=l+1;En(e[o-1]))return[o,0];for(;ra))return[i,1];r=i+1}}return[r,0]}var ea=function(){function e(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}return e.prototype.destroy=function(){},e}();function ta(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}function na(e){var t;return(t={})[e.component.uid]=e,t}var ra={},oa=function(){function e(e,t){this.emitter=new Eo}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}(),ia={},aa={startTime:Nt,duration:Nt,create:Boolean,sourceId:String};function sa(e){var t=mn(e,aa),n=t.refined,r=t.extra;return{startTime:n.startTime||null,duration:n.duration||null,create:null==n.create||n.create,sourceId:n.sourceId,leftoverProps:r}}var la=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props.widgetGroups.map((function(t){return e.renderWidgetGroup(t)}));return _o.apply(void 0,o(["div",{className:"fc-toolbar-chunk"}],t))},t.prototype.renderWidgetGroup=function(e){for(var t=this.props,n=this.context.theme,r=[],i=!0,a=0,s=e;a1){var m=i&&n.getClass("buttonGroup")||"";return _o.apply(void 0,o(["div",{className:m}],r))}return r[0]},t}(Uo),ua=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.model,o=n.extraClassName,i=!1,a=r.sectionWidgets,s=a.center;return a.left?(i=!0,e=a.left):e=a.start,a.right?(i=!0,t=a.right):t=a.end,_o("div",{className:[o||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",s||[]),this.renderSection("end",t||[]))},t.prototype.renderSection=function(e,t){var n=this.props;return _o(la,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})},t}(Uo),ca=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={availableWidth:null},t.handleEl=function(e){t.el=e,Fo(t.props.elRef,e),t.updateAvailableWidth()},t.handleResize=function(){t.updateAvailableWidth()},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=e.aspectRatio,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],o="",i="";return n?null!==t.availableWidth?o=t.availableWidth/n:i=1/n*100+"%":o=e.height||"",_o("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:o,paddingBottom:i}},e.children)},t.prototype.componentDidMount=function(){this.context.addResizeHandler(this.handleResize)},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleResize)},t.prototype.updateAvailableWidth=function(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})},t}(Uo),da=function(e){function t(t){var n=e.call(this,t)||this;return n.handleSegClick=function(e,t){var r=n.component,o=r.context,i=Jn(t);if(i&&r.isValidSegDownEl(e.target)){var a=Se(e.target,".fc-event-forced-url"),s=a?a.querySelector("a[href]").href:"";o.emitter.trigger("eventClick",{el:t,event:new xr(r.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:o.viewApi}),s&&!e.defaultPrevented&&(window.location.href=s)}},n.destroy=Ie(t.el,"click",".fc-event",n.handleSegClick),n}return n(t,e),t}(ea),pa=function(e){function t(t){var n,r,o,i,a,s=e.call(this,t)||this;return s.handleEventElRemove=function(e){e===s.currentSegEl&&s.handleSegLeave(null,s.currentSegEl)},s.handleSegEnter=function(e,t){Jn(t)&&(s.currentSegEl=t,s.triggerEvent("eventMouseEnter",e,t))},s.handleSegLeave=function(e,t){s.currentSegEl&&(s.currentSegEl=null,s.triggerEvent("eventMouseLeave",e,t))},s.removeHoverListeners=(n=t.el,r=".fc-event",o=s.handleSegEnter,i=s.handleSegLeave,Ie(n,"mouseover",r,(function(e,t){if(t!==a){a=t,o(e,t);var n=function(e){a=null,i(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),s}return n(t,e),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(e,t,n){var r=this.component,o=r.context,i=Jn(n);t&&!r.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new xr(o,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:o.viewApi})},t}(ea),fa=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildViewContext=qt(Ao),t.buildViewPropTransformers=qt(va),t.buildToolbarProps=qt(ha),t.headerRef=ko(),t.footerRef=ko(),t.interactionsStore={},t.state={viewLabelId:xe()},t.registerInteractiveComponent=function(e,n){var r=ta(e,n),o=[da,pa].concat(t.props.pluginHooks.componentInteractions).map((function(e){return new e(r)}));t.interactionsStore[e.uid]=o,ra[e.uid]=r},t.unregisterInteractiveComponent=function(e){var n=t.interactionsStore[e.uid];if(n){for(var r=0,o=n;r10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}var ya="fc-col-header-cell";function Ea(e){return e.text}var Sa=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.dateEnv,n=e.options,o=e.theme,i=e.viewApi,a=this.props,s=a.date,l=a.dateProfile,u=ro(s,a.todayRange,null,l),c=[ya].concat(oo(u,o)),d=t.format(s,a.dayHeaderFormat),p=!u.isDisabled&&a.colCnt>1?so(this.context,s):{},f=r(r(r({date:t.toDate(s),view:i},a.extraHookProps),{text:d}),u);return _o(Yo,{hookProps:f,classNames:n.dayHeaderClassNames,content:n.dayHeaderContent,defaultContent:Ea,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},(function(e,t,n,o){return _o("th",r({ref:e,role:"columnheader",className:c.concat(t).join(" "),"data-date":u.isDisabled?void 0:Bt(s),colSpan:a.colSpan},a.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},!u.isDisabled&&_o("a",r({ref:n,className:["fc-col-header-cell-cushion",a.isSticky?"fc-sticky":""].join(" ")},p),o)))}))},t}(Uo),ba=ln({weekday:"long"}),Da=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.theme,i=t.viewApi,a=t.options,s=tt(new Date(2592e5),e.dow),l={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},u=[ya].concat(oo(l,o),e.extraClassNames||[]),c=n.format(s,e.dayHeaderFormat),d=r(r(r(r({date:s},l),{view:i}),e.extraHookProps),{text:c});return _o(Yo,{hookProps:d,classNames:a.dayHeaderClassNames,content:a.dayHeaderContent,defaultContent:Ea,didMount:a.dayHeaderDidMount,willUnmount:a.dayHeaderWillUnmount},(function(t,o,i,a){return _o("th",r({ref:t,role:"columnheader",className:u.concat(o).join(" "),colSpan:e.colSpan},e.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},_o("a",{"aria-label":n.format(s,ba),className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:i},a)))}))},t}(Uo),Ca=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.initialNowDate=Tr(n.options.now,n.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return e.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var e=this.props,t=this.context,n=nt(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),o=t.dateEnv.add(r,Nt(1,e.unit)),i=o.valueOf()-n.valueOf();return i=Math.min(864e5,i),{currentState:{nowDate:r,todayRange:wa(r)},nextState:{nowDate:o,todayRange:wa(o)},waitMs:i}},t.prototype.setTimeout=function(){var e=this,t=this.computeTiming(),n=t.nextState,r=t.waitMs;this.timeoutId=setTimeout((function(){e.setState(n,(function(){e.setTimeout()}))}),r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=Oo,t}(Ro);function wa(e){var t=lt(e);return{start:t,end:tt(t,1)}}var Ra=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.createDayHeaderFormatter=qt(_a),t}return n(t,e),t.prototype.render=function(){var e=this.context,t=this.props,n=t.dates,r=t.dateProfile,o=t.datesRepDistinctDays,i=t.renderIntro,a=this.createDayHeaderFormatter(e.options.dayHeaderFormat,o,n.length);return _o(Ca,{unit:"day"},(function(e,t){return _o("tr",{role:"row"},i&&i("day"),n.map((function(e){return o?_o(Sa,{key:e.toISOString(),date:e,dateProfile:r,todayRange:t,colCnt:n.length,dayHeaderFormat:a}):_o(Da,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:a})})))}))},t}(Uo);function _a(e,t,n){return e||ma(t,n)}var Ta=function(){function e(e,t){for(var n=e.start,r=e.end,o=[],i=[],a=-1;n=t.length?t[t.length-1]+1:t[n]},e}(),ka=function(){function e(e,t){var n,r,o,i=e.dates;if(t){for(r=i[0].getUTCDay(),n=1;nt)return!0}return!1},t.prototype.needsYScrolling=function(){if(Wa.test(this.props.overflowY))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),n=e.children,r=0;rt)return!0}return!1},t.prototype.getXScrollbarWidth=function(){return Wa.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},t.prototype.getYScrollbarWidth=function(){return Wa.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},t}(Uo),Fa=function(){function e(e){var t=this;this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=function(e,n){var r=t,o=r.depths,i=r.currentMap,a=!1,s=!1;null!==e?(a=n in i,i[n]=e,o[n]=(o[n]||0)+1,s=!0):(o[n]-=1,o[n]||(delete i[n],delete t.callbackMap[n],a=!0)),t.masterCallback&&(a&&t.masterCallback(null,String(n)),s&&t.masterCallback(e,String(n)))}}return e.prototype.createRef=function(e){var t=this,n=this.callbackMap[e];return n||(n=this.callbackMap[e]=function(n){t.handleValue(n,String(e))}),n},e.prototype.collect=function(e,t,n){return kt(this.currentMap,e,t,n)},e.prototype.getAll=function(){return Ct(this.currentMap)},e}();function Ba(e){for(var t=0,n=0,r=De(e,".fc-scrollgrid-shrink");n=0&&e=0&&tt.eventRange.range.end?e:t}var Cs=function(e){function t(t,n){void 0===n&&(n={});var o=e.call(this)||this;return o.isRendering=!1,o.isRendered=!1,o.currentClassNames=[],o.customContentRenderId=0,o.handleAction=function(e){switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":o.renderRunner.tryDrain()}},o.handleData=function(e){o.currentData=e,o.renderRunner.request(e.calendarOptions.rerenderDelay)},o.handleRenderRequest=function(){if(o.isRendering){o.isRendered=!0;var e=o.currentData;Po((function(){To(_o(ga,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(function(t,n,i,a){return o.setClassNames(t),o.setHeight(n),_o(Zo.Provider,{value:o.customContentRenderId},_o(fa,r({isHeightAuto:i,forPrint:a},e)))})),o.el)}))}else o.isRendered&&(o.isRendered=!1,No(o.el),o.setClassNames([]),o.setHeight(""))},o.el=t,o.renderRunner=new Mi(o.handleRenderRequest),new Ni({optionOverrides:n,calendarApi:o,onAction:o.handleAction,onData:o.handleData}),o}return n(t,e),Object.defineProperty(t.prototype,"view",{get:function(){return this.currentData.viewApi},enumerable:!1,configurable:!0}),t.prototype.render=function(){var e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()},t.prototype.destroy=function(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())},t.prototype.updateSize=function(){var t=this;Po((function(){e.prototype.updateSize.call(t)}))},t.prototype.batchRendering=function(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")},t.prototype.pauseRendering=function(){this.renderRunner.pause("pauseRendering")},t.prototype.resumeRendering=function(){this.renderRunner.resume("pauseRendering",!0)},t.prototype.resetOptions=function(e,t){this.currentDataManager.resetOptions(e,t)},t.prototype.setClassNames=function(e){if(!Gt(e,this.currentClassNames)){for(var t=this.el.classList,n=0,r=this.currentClassNames;n0&&(this.everMovedDown=!0),i<0?this.everMovedLeft=!0:i>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Ns()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e=0&&u>=0&&c>=0&&d>=0&&(c<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"top",distance:c}),d<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"bottom",distance:d}),l<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>l)&&(r={scrollCache:a,name:"left",distance:l}),u<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"right",distance:u}))}return r},e.prototype.buildCaches=function(e){return this.queryScrollEls(e).map((function(e){return e===window?new Ps(!1):new Is(e,!1)}))},e.prototype.queryScrollEls=function(e){for(var t=[],n=0,r=this.scrollQuery;n=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,Fe(document.body),ze(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var o=r.pointer=new Ts(t);return o.emitter.on("pointerdown",r.onPointerDown),o.emitter.on("pointermove",r.onPointerMove),o.emitter.on("pointerup",r.onPointerUp),n&&(o.selector=n),r.mirror=new xs,r.autoScroller=new Hs,r}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy(),this.onPointerUp({})},t.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},t.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},t.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},t.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},t.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},t.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},t.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},t.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},t.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},t}(oa),As=function(){function e(e){this.origRect=go(e),this.scrollCaches=mo(e).map((function(e){return new Is(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e=0&&c=0&&do.layer)&&(v.componentId=i,v.context=a.context,v.rect.left+=l,v.rect.right+=l,v.rect.top+=u,v.rect.bottom+=u,o=v)}}}return o},e}();function Us(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&fr(e.dateSpan,t.dateSpan)}function Ws(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.datePointTransforms;ar.start)return{endDelta:s};return null}(a,e,r.subjectEl.classList.contains("fc-event-resizer-start"),s.range)));l&&(u=Sr(i,o.getCurrentData().eventUiBases,l,o),d.mutatedEvents=u,Ia(d,e.dateProfile,o)||(c=!0,l=null,u=null,d.mutatedEvents=null)),u?o.dispatch({type:"SET_EVENT_RESIZE",state:d}):o.dispatch({type:"UNSET_EVENT_RESIZE"}),c?Ue():We(),t||(l&&Us(a,e)&&(l=null),n.validMutation=l,n.mutatedRelevantEvents=u)},n.handleDragEnd=function(e){var t=n.component.context,o=n.eventRange.def,i=n.eventRange.instance,a=new xr(t,o,i),s=n.relevantEvents,l=n.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:n.draggingSegEl,event:a,jsEvent:e.origEvent,view:t.viewApi}),n.validMutation){var u=new xr(t,l.defs[o.defId],i?l.instances[i.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:l});var c={oldEvent:a,event:u,relatedEvents:Ir(l,t,i),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",r(r({},c),{el:n.draggingSegEl,startDelta:n.validMutation.startDelta||Nt(0),endDelta:n.validMutation.endDelta||Nt(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");n.draggingSeg=null,n.relevantEvents=null,n.validMutation=null};var o=t.component,i=n.dragging=new Os(t.el);i.pointer.selector=".fc-event-resizer",i.touchScrollAllowed=!1,i.autoScroller.isEnabled=o.context.options.dragScroll;var a=n.hitDragging=new Ls(n.dragging,na(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.querySegEl=function(e){return Se(e.subjectEl,".fc-event")},t}(ea);var js=function(){function e(e){var t=this;this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=function(e){e.jsEvent&&(t.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=function(e){var n=t.context.options.unselectCancel,r=_e(e.origEvent);t.matchesCancel=!!Se(r,n),t.matchesEvent=!!Se(r,Bs.SELECTOR)},this.onDocumentPointerUp=function(e){var n=t.context,r=t.documentPointer,o=n.getCurrentData();if(!r.wasTouchScroll){if(o.dateSelection&&!t.isRecentPointerDateSelect){var i=n.options.unselectAuto;!i||i&&t.matchesCancel||n.calendarApi.unselect(e)}o.eventSelection&&!t.matchesEvent&&n.dispatch({type:"UNSELECT_EVENT"})}t.isRecentPointerDateSelect=!1};var n=this.documentPointer=new Ts(document);n.shouldIgnoreMove=!0,n.shouldWatchScroll=!1,n.emitter.on("pointerdown",this.onDocumentPointerDown),n.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}return e.prototype.destroy=function(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()},e}(),Gs={fixedMirrorParent:yn},qs={dateClick:yn,eventDragStart:yn,eventDragStop:yn,eventDrop:yn,eventResizeStart:yn,eventResizeStop:yn,eventResize:yn,drop:yn,eventReceive:yn,eventLeave:yn},Ys=function(){function e(e,t){var n=this;this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){n.dragMeta=n.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,t,o){var i=n.hitDragging.dragging,a=null,s=null,l=!1,u={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:n.dragMeta.create};e&&(a=e.context,n.canDropElOnCalendar(o.subjectEl,a)&&(s=function(e,t,n){for(var o=r({},t.leftoverProps),i=0,a=n.pluginHooks.externalDefTransforms;i1,S=y.span.start===s;d+=y.levelCoord-c,c=y.levelCoord+y.thickness,E?(d+=y.thickness,S&&v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:y.levelCoord,marginTop:0})):S&&(v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:y.levelCoord,marginTop:d}),d=0)}o.push(u),i.push(v),a.push(d)}return{singleColPlacements:o,multiColPlacements:i,leftoverMargins:a}}(s.toRects(),e,a),h=f.singleColPlacements,v=f.multiColPlacements,g=f.leftoverMargins,m=[],y=[],E=0,S=u;E1,showWeekNumbers:t.showWeekNumbers,todayRange:h,dateProfile:n,cells:i,renderIntro:t.renderRowIntro,businessHourSegs:s[f],eventSelection:t.eventSelection,bgEventSegs:l[f].filter(yl),fgEventSegs:u[f],dateSelectionSegs:c[f],eventDrag:d[f],eventResize:p[f],dayMaxEvents:o,dayMaxEventRows:r,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:t.forPrint})})))))})))},t.prototype.prepareHits=function(){this.rowPositions=new So(this.rootEl,this.rowRefs.collect().map((function(e){return e.getCellEls()[0]})),!1,!0),this.colPositions=new So(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},t.prototype.queryHit=function(e,t){var n=this.colPositions,o=this.rowPositions,i=n.leftToIndex(e),a=o.topToIndex(t);if(null!=a&&null!=i){var s=this.props.cells[a][i];return{dateProfile:this.props.dateProfile,dateSpan:r({range:this.getCellRange(a,i),allDay:!0},s.extraDateSpan),dayEl:this.getCellEl(a,i),rect:{left:n.lefts[i],right:n.rights[i],top:o.tops[a],bottom:o.bottoms[a]},layer:0}}return null},t.prototype.getCellEl=function(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]},t.prototype.getCellRange=function(e,t){var n=this.props.cells[e][t].date;return{start:n,end:tt(n,1)}},t}(Bo);function yl(e){return e.eventRange.def.allDay}var El=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(xa),Sl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new El,t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return _o(ml,r({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))},t}(Bo),bl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayTableModel=qt(Dl),t.headerRef=ko(),t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,r=t.dateProfileGenerator,o=this.props,i=this.buildDayTableModel(o.dateProfile,r),a=n.dayHeaders&&_o(Ra,{ref:this.headerRef,dateProfile:o.dateProfile,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt}),s=function(t){return _o(Sl,{ref:e.tableRef,dateProfile:o.dateProfile,dayTableModel:i,businessHours:o.businessHours,dateSelection:o.dateSelection,eventStore:o.eventStore,eventUiBases:o.eventUiBases,eventSelection:o.eventSelection,eventDrag:o.eventDrag,eventResize:o.eventResize,nextDayThreshold:n.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.weekNumbers,expandRows:!o.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:o.forPrint})};return n.dayMinWidth?this.renderHScrollLayout(a,s,i.colCnt,n.dayMinWidth):this.renderSimpleLayout(a,s)},t}(Js);function Dl(e,t){var n=new Ta(e.renderRange,t);return new ka(n,/year|month|week/.test(e.currentRangeUnit))}var Cl=zo({initialView:"dayGridWeek",views:{dayGrid:{component:bl,dateProfileGeneratorClass:function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.buildRenderRange=function(t,n,r){var o,i=this.props.dateEnv,a=e.prototype.buildRenderRange.call(this,t,n,r),s=a.start,l=a.end;(/^(year|month)$/.test(n)&&(s=i.startOfWeek(s),(o=i.startOfWeek(l)).valueOf()!==l.valueOf()&&(l=et(o,1))),this.props.monthMode&&this.props.fixedWeekCount)&&(l=et(l,6-Math.ceil(rt(s,l))));return{start:s,end:l}},t}(ai)},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),wl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(e){return e.allDay?Kn(e)?["timed","allDay"]:["allDay"]:["timed"]},t}(to),Rl=ln({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function _l(e){var t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return _o(Oo.Consumer,null,(function(n){if(!e.isLabeled)return _o("td",{className:t.join(" "),"data-time":e.isoTimeStr});var r=n.dateEnv,o=n.options,i=n.viewApi,a=null==o.slotLabelFormat?Rl:Array.isArray(o.slotLabelFormat)?ln(o.slotLabelFormat[0]):ln(o.slotLabelFormat),s={level:0,time:e.time,date:r.toDate(e.date),view:i,text:r.format(e.date,a)};return _o(Yo,{hookProps:s,classNames:o.slotLabelClassNames,content:o.slotLabelContent,defaultContent:Tl,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(n,r,o,i){return _o("td",{ref:n,className:t.concat(r).join(" "),"data-time":e.isoTimeStr},_o("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},_o("div",{className:"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",ref:o},i)))}))}))}function Tl(e){return e.text}var kl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return this.props.slatMetas.map((function(e){return _o("tr",{key:e.key},_o(_l,r({},e)))}))},t}(Uo),xl=ln({week:"short"}),Ml=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allDaySplitter=new wl,t.headerElRef=ko(),t.rootElRef=ko(),t.scrollerElRef=ko(),t.state={slatCoords:null},t.handleScrollTopRequest=function(e){var n=t.scrollerElRef.current;n&&(n.scrollTop=e)},t.renderHeadAxis=function(e,n){void 0===n&&(n="");var o=t.context.options,i=t.props.dateProfile.renderRange,a=1===ot(i.start,i.end)?so(t.context,i.start,"week"):{};return o.weekNumbers&&"day"===e?_o(fs,{date:i.start,defaultFormat:xl},(function(e,t,o,i){return _o("th",{ref:e,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(t).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:n}},_o("a",r({ref:o,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner"},a),i)))})):_o("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},_o("div",{className:"fc-timegrid-axis-frame",style:{height:n}}))},t.renderTableRowAxis=function(e){var n=t.context,r=n.options,o=n.viewApi,i={text:r.allDayText,view:o};return _o(Yo,{hookProps:i,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:Il,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(t,n,r,o){return _o("td",{ref:t,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(null==e?" fc-timegrid-axis-frame-liquid":""),style:{height:e}},_o("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t,n){var r=this.context,o=this.props,i=[],a=Qa(r.options);return e&&i.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(i.push({type:"body",key:"all-day",chunk:{content:t}}),i.push({type:"body",key:"all-day-divider",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),i.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),_o(ti,{viewSpec:r.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(ts,{liquid:!o.isHeightAuto&&!o.forPrint,collapsibleWidth:o.forPrint,cols:[{width:"shrink"}],sections:i}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r,o,i,a){var s=this,l=this.context.pluginHooks.scrollGridImpl;if(!l)throw new Error("No ScrollGrid implementation");var u=this.context,c=this.props,d=!c.forPrint&&Qa(u.options),p=!c.forPrint&&es(u.options),f=[];e&&f.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderHeadAxis("day",e.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(f.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderTableRowAxis(e.rowSyncHeights[0]))}},{key:"cols",content:t}]}),f.push({key:"all-day-divider",type:"body",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));var h=u.options.nowIndicator;return f.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:function(e){return _o("div",{className:"fc-timegrid-axis-chunk"},_o("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,_o("tbody",null,_o(kl,{slatMetas:i}))),_o("div",{className:"fc-timegrid-now-indicator-container"},_o(Ca,{unit:h?"minute":"day"},(function(e){var t=h&&a&&a.safeComputeTop(e);return"number"==typeof t?_o(is,{isAxis:!0,date:e},(function(e,n,r,o){return _o("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(n).join(" "),style:{top:t}},o)})):null}))))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&f.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:Ja},{key:"cols",content:Ja}]}),_o(ti,{viewSpec:u.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(l,{liquid:!c.isHeightAuto&&!c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:f}))}))},t.prototype.getAllDayMaxEventProps=function(){var e=this.context.options,t=e.dayMaxEvents,n=e.dayMaxEventRows;return!0!==t&&!0!==n||(t=void 0,n=5),{dayMaxEvents:t,dayMaxEventRows:n}},t}(Bo);function Il(e){return e.text}var Pl=function(){function e(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}return e.prototype.safeComputeTop=function(e){var t=this.dateProfile;if(Zn(t.currentRange,e)){var n=lt(e),r=e.valueOf()-n.valueOf();if(r>=Ut(t.slotMinTime)&&r0,E=Boolean(l)&&l.span.end-l.span.start=0;t-=1)if(null!==(r=Wt(n=Nt(ru[t]),e))&&r>1)return n;return e}(r),u=[];Ut(a)0?e.renderSegList(s,i):e.renderEmptyMessage()))}))},t.prototype.renderEmptyMessage=function(){var e=this.context,t=e.options,n=e.viewApi,r={text:t.noEventsText,view:n};return _o(Yo,{hookProps:r,classNames:t.noEventsClassNames,content:t.noEventsContent,defaultContent:hu,didMount:t.noEventsDidMount,willUnmount:t.noEventsWillUnmount},(function(e,t,n,r){return _o("div",{className:["fc-list-empty"].concat(t).join(" "),ref:e},_o("div",{className:"fc-list-empty-cushion",ref:n},r))}))},t.prototype.renderSegList=function(e,t){var n=this.context,o=n.theme,i=n.options,a=this.state,s=a.timeHeaderId,l=a.eventHeaderId,u=a.dateHeaderIdRoot,c=function(e){var t,n,r=[];for(t=0;t=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,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"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + + + \ No newline at end of file diff --git a/web/templates/500.html b/web/templates/500.html new file mode 100644 index 0000000..51234de --- /dev/null +++ b/web/templates/500.html @@ -0,0 +1,43 @@ + +{% import 'macro/svg.html' as SVG %} + + + + + + + + + + + + 500 - NAStool + + + + + +
    +
    +
    +
    500
    +

    出错啦!

    +

    + 系统出错了,请检查运行日志看看吧... +

    + +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/web/templates/discovery/mediainfo.html b/web/templates/discovery/mediainfo.html new file mode 100644 index 0000000..cb2e4a1 --- /dev/null +++ b/web/templates/discovery/mediainfo.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/templates/discovery/person.html b/web/templates/discovery/person.html new file mode 100644 index 0000000..022fc99 --- /dev/null +++ b/web/templates/discovery/person.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/templates/discovery/ranking.html b/web/templates/discovery/ranking.html new file mode 100644 index 0000000..d838170 --- /dev/null +++ b/web/templates/discovery/ranking.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/templates/discovery/recommend.html b/web/templates/discovery/recommend.html new file mode 100644 index 0000000..a9eae03 --- /dev/null +++ b/web/templates/discovery/recommend.html @@ -0,0 +1,184 @@ +{% import 'macro/oops.html' as OOPS %} +{% import 'macro/form.html' as FORM %} +
    + + +
    + +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/download/downloading.html b/web/templates/download/downloading.html new file mode 100644 index 0000000..8151b59 --- /dev/null +++ b/web/templates/download/downloading.html @@ -0,0 +1,206 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} +
    + + +
    +{% if DownloadCount > 0 %} +
    +
    +
    + {% for Torrent in Torrents %} +
    +
    +
    + {% if Torrent.image %} +
    + +
    + {% endif %} +
    +

    + {{ Torrent.title }} +

    +
    + {{ Torrent.speed }} +
    + {% if not Torrent.noprogress %} +
    +
    +
    + {{ Torrent.progress }}% +
    +
    +
    +
    + +
    +
    +
    +
    +
    + {% endif %} +
    +
    + +
    + +
    +
    +
    + {% endfor %} +
    +
    +
    +{% else %} +{{ OOPS.nodatafound('没有下载任务', '当前下载器中没有正在下载的任务。') }} +{% endif %} + \ No newline at end of file diff --git a/web/templates/download/torrent_remove.html b/web/templates/download/torrent_remove.html new file mode 100644 index 0000000..b8eb182 --- /dev/null +++ b/web/templates/download/torrent_remove.html @@ -0,0 +1,679 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} +
    + + +
    + +{% if Count > 0 %} +
    +
    +
    + {% for Id, Attr in TorrentRemoveTasks.items() %} +
    + +
    +
    +
    +
    下载器
    +
    + {{ DownloaderConfig[Attr.downloader].name}} +
    +
    +
    +
    管理限制
    +
    + {% if Attr.onlynastool %} + 只管理NAStool添加 + {% endif %} + {% if Attr.samedata %} + 处理辅种 + {% endif %} +
    +
    +
    +
    刷新间隔
    +
    + {{ Attr.interval }} 分钟 +
    +
    +
    +
    动作
    +
    + {% if Attr.action == 1 %} + 暂停任务 + {% elif Attr.action == 2 %} + 删除任务 + {% elif Attr.action == 3 %} + 删除任务及文件 + {% endif %} +
    +
    +
    +
    分享率
    +
    + {% if Attr.config.ratio %} + {{ Attr.config.ratio }} + + {% endif %} +
    +
    +
    +
    做种时间
    +
    + {% if Attr.config.seeding_time %} + {{ Attr.config.seeding_time }} 小时 + + {% endif %} +
    +
    +
    +
    平均做种速度
    +
    + {% if Attr.config.upload_avs %} + {{ Attr.config.upload_avs }} KB/s - + {% endif %} +
    +
    +
    +
    大小
    +
    + {% if Attr.config.size %} + {{ Attr.config.size[0] }}-{{ Attr.config.size[-1] }} GB + {% endif %} +
    +
    +
    +
    保存路径关键词
    +
    + {% if Attr.config.savepath_key %} + {{ Attr.config.savepath_key }} + {% endif %} +
    +
    +
    +
    tracker关键词
    +
    + {% if Attr.config.tracker_key %} + {{ Attr.config.tracker_key }} + {% endif %} +
    +
    + {% if Attr.downloader == "Qb" %} +
    +
    分类
    +
    + {% if Attr.config.qb_category %} + {% for Category in Attr.config.qb_category %} + {{ Category }} + {% endfor %} + {% endif %} +
    +
    +
    +
    种子状态
    +
    + {% if Attr.config.qb_state %} + {% for State in Attr.config.qb_state %} + {{ State }} + {% endfor %} + {% endif %} +
    +
    + {% elif Attr.downloader == "Tr" %} +
    +
    错误信息关键词
    +
    + {% if Attr.config.tr_error_key %} + {{ Attr.config.tr_error_key }} + {% endif %} +
    +
    +
    +
    种子状态
    +
    + {% if Attr.config.tr_state %} + {% for State in Attr.config.tr_state %} + {{ State }} + {% endfor %} + {% endif %} +
    +
    + {% endif %} +
    +
    状态
    +
    + {% if Attr.enabled %} + 正在运行 + {% else %} + 已停用 + {% endif %} +
    +
    +
    +
    标签
    +
    + {% if Attr.config.tags %} + {% for Tag in Attr.config.tags %} + {{ Tag }} + {% endfor %} + {% endif %} +
    +
    +
    +
    +
    + {% endfor %} +
    +
    +
    +{% else %} +{{ OOPS.nodatafound('没有任务', '当前没有正在运行的自动删种任务。') }} +{% endif %} + + + \ No newline at end of file diff --git a/web/templates/download/userdownloader.html b/web/templates/download/userdownloader.html new file mode 100644 index 0000000..7d20e49 --- /dev/null +++ b/web/templates/download/userdownloader.html @@ -0,0 +1,267 @@ +{% import 'macro/svg.html' as SVG %} + + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ Count }} 条记录 +
    +
    +
    +
    + + + + + + + + + + + {% if Downloaders %} + {% for Downloader in Downloaders %} + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    名称类型地址
    {{ Downloader.name or '' }}{{ Downloader.type or '' }}{{ Downloader.host }}:{{ Downloader.port }} + +
    没有数据
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/index.html b/web/templates/index.html new file mode 100644 index 0000000..4aaced9 --- /dev/null +++ b/web/templates/index.html @@ -0,0 +1,349 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} +
    + + +
    +{% if ServerSucess %} +
    +
    +
    +
    +
    +
    +
    +
    电影
    +
    +
    +
    {{ MediaCount.MovieCount }}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    电视剧/动漫
    +
    +
    +
    {{ MediaCount.SeriesCount }}
    +
    + + {{ MediaCount.EpisodeCount }} + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    音乐
    +
    +
    +
    {{ MediaCount.SongCount }}
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    活跃用户
    +
    +
    +
    {{ UserCount }}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    存储空间共 {{ TotalSpace }}

    +
    +
    +
    +
    +
    + + 已使用 + {{ UsedSapce }} +
    +
    + + 空闲 + {{ FreeSpace }} +
    +
    +
    +
    +
    +
    +
    +
    +
    + {% for Activity in Activitys %} +
    +
    +
    + + {% if Activity.type == "LG" %} + {{ SVG.user() }} + {% else %} + {{ SVG.player_play() }} + {% endif %} + +
    +
    +
    + {{ Activity.event }} +
    +
    {{ Activity.date }}
    +
    +
    +
    +
    +
    +
    + {% endfor %} +
    +
    +
    +
    +
    +
    +
    +
    +
    +{% else %} +{{ OOPS.systemerror('媒体服务器连接失败!', '当前无法连接媒体服务器获取数据,请确认Emby/Jellyfin/Plex配置是否正确。') }} +{% endif %} + + + \ No newline at end of file diff --git a/web/templates/login.html b/web/templates/login.html new file mode 100644 index 0000000..4fbe726 --- /dev/null +++ b/web/templates/login.html @@ -0,0 +1,58 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/head.html' as HEAD %} + + + + {{ HEAD.meta_link() }} + 登录 - NAStool + + + + + +
    +
    +
    + +
    +
    + +
    + +
    + + {{ SVG.user() }} + + +
    + +
    + + {{ SVG.keyboard() }} + + +
    +
    {{ err_msg }}
    +
    + +
    + +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/web/templates/macro/form.html b/web/templates/macro/form.html new file mode 100644 index 0000000..606595a --- /dev/null +++ b/web/templates/macro/form.html @@ -0,0 +1,112 @@ + +{% macro gen_form_config_elements(Type, Config, Fields) %} + {% for FieldId, FieldAttr in Fields.items() %} + {% if loop.index%2 == 1 %} +
    + {% endif %} +
    +
    + {% if FieldAttr.type == "switch" %} + + {% else %} + + {% if FieldAttr.type == "select" %} + + {% else %} + + {% endif %} + {% endif %} +
    +
    + {% if loop.last or loop.index%2 == 0 %} +
    + {% endif %} + {% endfor %} +{% endmacro %} + + +{% macro gen_form_empty_elements(Fields) %} + {% for FieldId, FieldAttr in Fields.items() %} + {% if loop.index%2 == 1 %} +
    + {% endif %} +
    +
    + {% if FieldAttr.type == "switch" %} + + {% else %} + + {% if FieldAttr.type == "select" %} + + {% else %} + + {% endif %} + {% endif %} +
    +
    + {% if loop.last or loop.index%2 == 0 %} +
    + {% endif %} + {% endfor %} +{% endmacro %} + + +{% macro gen_recommend_filter_dropdown(Fields, Params) %} + {% if Fields %} + {% for FieldId, FieldAttr in Fields.items() %} + {% if FieldAttr.type == "dropdown" %} + + {% endif %} + {% endfor %} + {% endif %} +{% endmacro %} diff --git a/web/templates/macro/head.html b/web/templates/macro/head.html new file mode 100644 index 0000000..17839c8 --- /dev/null +++ b/web/templates/macro/head.html @@ -0,0 +1,64 @@ + +{% macro meta_link() %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% endmacro %} + diff --git a/web/templates/macro/oops.html b/web/templates/macro/oops.html new file mode 100644 index 0000000..ffe739d --- /dev/null +++ b/web/templates/macro/oops.html @@ -0,0 +1,62 @@ + +{% macro nodatafound(title, text) %} +
    +
    +
    +
    +
    +

    {{ title }}

    +

    + {{ text }} +

    +
    +
    +
    +{% endmacro %} + + +{% macro empty(title, text) %} +
    +
    +
    +
    +
    +

    {{ title }}

    +

    + {{ text }} +

    +
    +
    +
    +{% endmacro %} + + +{% macro systemerror(title, text) %} +
    +
    +
    +
    +
    +

    {{ title }}

    +

    + {{ text }} +

    +
    +
    +
    +{% endmacro %} + + +{% macro loading() %} +
    +
    +
    +
    +
    +

    + 页面正在加载,请稍候... +

    +
    +
    +
    +{% endmacro %} diff --git a/web/templates/macro/svg.html b/web/templates/macro/svg.html new file mode 100644 index 0000000..18413d3 --- /dev/null +++ b/web/templates/macro/svg.html @@ -0,0 +1,1081 @@ + + +{% macro plus(class) %} + + + + + + +{% endmacro %} + + + +{% macro history(class) %} + + + + + + +{% endmacro %} + + + +{% macro arrow_left(class) %} + + + + + + + +{% endmacro %} + + + +{% macro refresh(class) %} + + + + + + +{% endmacro %} + + + +{% macro refresh_dot(class) %} + + + + + + + +{% endmacro %} + + + +{% macro user(class) %} + + + + + + +{% endmacro %} + + + +{% macro player_play(class) %} + + + + + +{% endmacro %} + + + +{% macro dots_vertical(class) %} + + + + + + + +{% endmacro %} + + + +{% macro bolt(class) %} + + + + +{% endmacro %} + + + +{% macro menu_2(class) %} + + + + + + + +{% endmacro %} + + + +{% macro eye(class) %} + + + + + + +{% endmacro %} + + + +{% macro edit(class) %} + + + + + + + +{% endmacro %} + + + +{% macro x(class) %} + + + + + + +{% endmacro %} + + + +{% macro arrow_back_up(class) %} + + + + + +{% endmacro %} + + + +{% macro keyboard(class) %} + + + + + + + + + + + + +{% endmacro %} + + + +{% macro rss(class) %} + + + + + + + +{% endmacro %} + + + +{% macro search(class) %} + + + + + + +{% endmacro %} + + + +{% macro adjustments(class) %} + + + + + + + + + + + + +{% endmacro %} + + + +{% macro home(class) %} + + + + + + + +{% endmacro %} + + + +{% macro trash(class) %} + + + + + + + + + +{% endmacro %} + + + +{% macro star(class) %} + + + + +{% endmacro %} + + + +{% macro server_2(class) %} + + + + + + + + + + +{% endmacro %} + + + +{% macro movie(class) %} + + + + + + + + + + + + +{% endmacro %} + + + +{% macro device_tv(class) %} + + + + + + +{% endmacro %} + + + +{% macro chevron_left(class) %} + + + + + +{% endmacro %} + + + +{% macro chevron_right(class) %} + + + + + +{% endmacro %} + + + +{% macro folders(class) %} + + + + + + +{% endmacro %} + + + +{% macro transform(class) %} + + + + + + + + + + +{% endmacro %} + + + +{% macro link(class) %} + + + + + + +{% endmacro %} + + + +{% macro file_info(class) %} + + + + + + + + +{% endmacro %} + + + +{% macro eraser(class) %} + + + + + + +{% endmacro %} + + + +{% macro cpu(class) %} + + + + + + + + + + + + + + +{% endmacro %} + + + +{% macro download(class) %} + + + + + + + +{% endmacro %} + + + +{% macro circle_check(class) %} + + + + + +{% endmacro %} + + + +{% macro circle_x(class) %} + + + + + + +{% endmacro %} + + + +{% macro text_recognition(class) %} + + + + + + + + + + +{% endmacro %} + + + +{% macro check(class) %} + + + + + +{% endmacro %} + + + +{% macro video(class) %} + + + + + + +{% endmacro %} + + + +{% macro info_circle(class) %} + + + + + + + +{% endmacro %} + + + +{% macro dots(class) %} + + + + + + + +{% endmacro %} + + + +{% macro slideshow(class) %} + + + + + + + + + + + +{% endmacro %} + + + +{% macro tex(class) %} + + + + + + + + + + +{% endmacro %} + + + +{% macro log_select(class) %} + + +{% endmacro %} + + + +{% macro info_square_rounded(class) %} + + + + + + + +{% endmacro %} + + + +{% macro photo(class) %} + + + + + + + + +{% endmacro %} + + + +{% macro player_stop(class) %} + + + + + +{% endmacro %} + + + +{% macro transfer_in(class) %} + + + + + + + +{% endmacro %} + + + +{% macro transfer_out(class) %} + + + + + + + +{% endmacro %} + + + +{% macro settings(class) %} + + + + + + +{% endmacro %} + + + +{% macro circle_minus(class) %} + + + + + + +{% endmacro %} + + + +{% macro folder_plus(class) %} + + + + + + + +{% endmacro %} + + + +{% macro reload(class) %} + + + + + + +{% endmacro %} + + + +{% macro share(class) %} + + + + + + + + + +{% endmacro %} + + + +{% macro apps(class) %} + + + + + + + + + +{% endmacro %} + + + +{% macro arrow_big_down(class) %} + + + + + +{% endmacro %} + + + +{% macro activity_heartbeat(class) %} + + + + + +{% endmacro %} + + + +{% macro world_upload(class) %} + + + + + + + + + + +{% endmacro %} + + + +{% macro world_download(class) %} + + + + + + + + + + +{% endmacro %} + + + +{% macro arrow_big_up_lines(class) %} + + + + + + + +{% endmacro %} + + + +{% macro cloud_upload(class) %} + + + + + + + +{% endmacro %} + + + +{% macro message(class) %} + + + + + + + +{% endmacro %} + + + +{% macro arrow_narrow_up(class) %} + + + + + + + +{% endmacro %} + + + +{% macro arrow_narrow_down(class) %} + + + + + + + +{% endmacro %} + + + +{% macro activity(class) %} + + + + + +{% endmacro %} + + + +{% macro checkbox(class) %} + + + + + + +{% endmacro %} + + + +{% macro layout_2(class) %} + + + + + + + + +{% endmacro %} + + + +{% macro brand_github(class) %} + + + + + +{% endmacro %} + + + +{% macro moon(class) %} + + + + + +{% endmacro %} + + + +{% macro sun(class) %} + + + + + + +{% endmacro %} + + + +{% macro bell(class) %} + + + + + + +{% endmacro %} + + + +{% macro alert_triangle(class) %} + + + + + +{% endmacro %} + + + +{% macro heart(class) %} + + + + + +{% endmacro %} + + + +{% macro send(class) %} + + + + + + +{% endmacro %} + + + +{% macro circle_letter_d(class) %} + + + + + + +{% endmacro %} + + + +{% macro square_letter_t(class) %} + + + + + + + +{% endmacro %} + + + +{% macro code_dots(class) %} + + + + + + + + + +{% endmacro %} + + + +{% macro forbid(class) %} + + + + + + +{% endmacro %} + + + +{% macro filter(class) %} + + + + + +{% endmacro %} \ No newline at end of file diff --git a/web/templates/navigation.html b/web/templates/navigation.html new file mode 100644 index 0000000..a76c9a1 --- /dev/null +++ b/web/templates/navigation.html @@ -0,0 +1,2468 @@ + +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} +{% import 'macro/head.html' as HEAD %} + + + {{ HEAD.meta_link() }} + NAStool + + + + + + + + + + + + + +
    + + + + + + +
    + +
    +
    +
    +

    消息中心

    + +
    +
    +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/templates/rename/history.html b/web/templates/rename/history.html new file mode 100644 index 0000000..b330bc7 --- /dev/null +++ b/web/templates/rename/history.html @@ -0,0 +1,282 @@ +{% import 'macro/svg.html' as SVG %} + + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ TotalCount }} 条记录 +
    +
    + 搜索: +
    + +
    +
    +
    +
    +
    + + + + {% if TotalCount > 0 %} + + {% endif %} + + + + + + + + {% if TotalCount > 0 %} + {% for History in Historys %} + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    + + 媒体信息文件信息时间
    + + +
    + + {% if History.TYPE == "电影" %} + {{ SVG.movie() }} + {% else %} + {{ SVG.device_tv() }} + {% endif %} + +
    +
    + {% if History.TMDBID %} + + {{ History.TITLE }} ({{ History.YEAR }}) + + {% if History.SEASON_EPISODE %} +
    + {{ History.SEASON_EPISODE }} + {% endif %} + {% else %} + {{ History.TITLE }} ({{ History.YEAR }}) + {% if History.SEASON_EPISODE %} + {{ History.SEASON_EPISODE }} + {% endif %} + {% endif %} +
    + {% if History.CATEGORY %} +
    类别:{{ History.CATEGORY }}
    + {% endif %} +
    +
    +
    + +
    + {% if History.DEST_PATH or History.DEST_FILENAME %} + => + {% endif %} + {% if History.DEST_PATH %} + + {{ History.DEST_FILENAME or '' }} + + {% else %} + {{ History.DEST_FILENAME or '' }} + {% endif %} +
    +
    +
    + {{ History.DATE }} +
    来自:{{ History.SOURCE or '' }}
    +
    转移方式:{{ History.SYNC_MODE }}
    +
    +
    + +
    没有数据
    +
    + {% if TotalCount > 0 %} + + {% endif %} +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/web/templates/rename/mediafile.html b/web/templates/rename/mediafile.html new file mode 100644 index 0000000..269c3df --- /dev/null +++ b/web/templates/rename/mediafile.html @@ -0,0 +1,430 @@ +{% import 'macro/svg.html' as SVG %} +
    +
    +
    + +
    +
    +
    +

    目录

    +
    + + {{ SVG.folders() }} + + +
    + + {{ SVG.arrow_back_up() }} + 上级目录 + +
    +
    +
    + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/web/templates/rename/tmdbcache.html b/web/templates/rename/tmdbcache.html new file mode 100644 index 0000000..8a76db2 --- /dev/null +++ b/web/templates/rename/tmdbcache.html @@ -0,0 +1,266 @@ +{% import 'macro/svg.html' as SVG %} + + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ TotalCount }} 条记录 +
    +
    + 搜索: +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + {% if TotalCount > 0 %} + {% for TmdbCache in TmdbCaches %} + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    索引标题TMDB
    +
    + + {% if TmdbCache[1].media_type == "电影" %} + {{ SVG.movie() }} + {% else %} + {{ SVG.device_tv() }} + {% endif %} + +
    +
    {{ TmdbCache[2] }}
    +
    +
    +
    +
    {{ TmdbCache[1].title }}
    +
    +
    {{ TmdbCache[1].id }} + {% if TmdbCache[1].media_type == "电影" %} + + {{ SVG.link() }} + + {% else %} + + {{ SVG.link() }} + + {% endif %} +
    +
    + {% if TmdbCache[1].poster_path %} + + {% endif %} + + +
    没有数据
    +
    + {% if TotalCount > 0 %} + + {% endif %} +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/templates/rename/unidentification.html b/web/templates/rename/unidentification.html new file mode 100644 index 0000000..eb3061c --- /dev/null +++ b/web/templates/rename/unidentification.html @@ -0,0 +1,162 @@ +{% import 'macro/svg.html' as SVG %} + + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ TotalCount }} 条记录 +
    +
    + +
    +
    + + + + {% if TotalCount > 0 %} + + {% endif %} + + + + + + + {% if TotalCount > 0 %} + {% for Path in Items %} + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    + + 文件名转移方式
    + + + {{ Path.name }} + {% if Path.to %} +
    + => {{ Path.to }} +
    + {% endif %} +
    +
    + {{ Path.sync_mode }} +
    +
    + +
    没有数据
    +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/web/templates/rss/movie_rss.html b/web/templates/rss/movie_rss.html new file mode 100644 index 0000000..b1cf1e4 --- /dev/null +++ b/web/templates/rss/movie_rss.html @@ -0,0 +1,126 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} + +{% if Count > 0 %} + + +{% else %} +{{ OOPS.nodatafound('没有订阅', '当前没有正在订阅的电影。') }} +{% endif %} diff --git a/web/templates/rss/rss_calendar.html b/web/templates/rss/rss_calendar.html new file mode 100644 index 0000000..ce98e53 --- /dev/null +++ b/web/templates/rss/rss_calendar.html @@ -0,0 +1,113 @@ +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/templates/rss/rss_history.html b/web/templates/rss/rss_history.html new file mode 100644 index 0000000..ae3763f --- /dev/null +++ b/web/templates/rss/rss_history.html @@ -0,0 +1,127 @@ +{% import 'macro/svg.html' as SVG %} + + + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ Count }} 条记录 +
    +
    +
    +
    + + + + + + + + + + + + {% if Count > 0 %} + {% for Item in Items %} + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    标题简介完成时间
    + + +
    {{ Item.NAME }} ({{ Item.YEAR }}) {{ Item.SEASON or '' }}
    + {{ Item.TMDBID }} + {% if Item.TOTAL %} +
    共 {{ Item.TOTAL - (Item.START or 0) }} 集 +
    + {% endif %} +
    + {{ Item.DESC }} + + {{ Item.FINISH_TIME }} + + +
    没有完成的订阅
    +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/web/templates/rss/rss_parser.html b/web/templates/rss/rss_parser.html new file mode 100644 index 0000000..f3e2c87 --- /dev/null +++ b/web/templates/rss/rss_parser.html @@ -0,0 +1,221 @@ +{% import 'macro/svg.html' as SVG %} + + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ Count }} 条记录 +
    +
    +
    +
    + + + + + + + + + + + {% if RssParsers %} + {% for RssParser in RssParsers %} + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    名称类型附加参数
    {{ RssParser.name or '' }}{{ RssParser.type or '' }}{{ RssParser.params or '' }} + +
    没有数据
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/rss/tv_rss.html b/web/templates/rss/tv_rss.html new file mode 100644 index 0000000..0a4d6c5 --- /dev/null +++ b/web/templates/rss/tv_rss.html @@ -0,0 +1,137 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} + +{% if Count > 0 %} + + +{% else %} +{{ OOPS.nodatafound('没有订阅', '当前没有正在订阅的电视剧。') }} +{% endif %} diff --git a/web/templates/rss/user_rss.html b/web/templates/rss/user_rss.html new file mode 100644 index 0000000..05a2ed6 --- /dev/null +++ b/web/templates/rss/user_rss.html @@ -0,0 +1,960 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} + +{% if Count > 0 %} +
    +
    +
    + {% for Task in Tasks %} +
    +
    + +
    + {% if Task.state == 'Y' %} + + {% else %} + + {% endif %} +
    +
    + +

    {{ Task.name }}

    +
    + + {% if Task.uses == 'D' and Task.recognization == "Y" %} + TMDB + + {% else %} + + {% endif %} + + +
    +
    +
    +
    +
    地址
    +
    +
    + {{ Task.address|split('?', 0) }} +
    +
    +
    +
    +
    解析器
    +
    + {{ Task.parser_name }} +
    +
    +
    +
    刷新间隔
    +
    + {{ Task.interval }} 分钟 +
    +
    +
    +
    动作
    +
    + {{ Task.uses_text }} +
    +
    +
    +
    包含
    +
    + {% if Task.include %} + {{ Task.include }} + {% endif %} +
    +
    +
    +
    排除
    +
    + {% if Task.exclude %} + {{ Task.exclude }} + {% endif %} +
    +
    +
    +
    过滤规则
    +
    + {% if Task.filter_name %} + {{ Task.filter_name }} + {% endif %} +
    +
    +
    +
    保存路径
    +
    {{ Task.save_path or '自动' }}
    +
    +
    +
    状态
    +
    + {% if Task.state == 'Y' %} + 正在运行 + {% else %} + 已停用 + {% endif %} +
    +
    +
    +
    已处理数量
    +
    + {% if Task.uses == 'D' %} + + {{ Task.counter or 0 }} + + {% else %} + {{ Task.counter or 0 }} + {% endif %} +
    +
    +
    +
    最后更新时间
    +
    + {{ Task.update_time or '' }} +
    +
    + {% if Task.uses == 'D' %} +
    +
    下载设置
    +
    + {% if Task.download_setting|string in DownloadSettings %} + {{ DownloadSettings[Task.download_setting|string] }} + {% else %} + 默认 + {% endif %} +
    +
    + {% endif %} +
    +
    +
    + {% endfor %} +
    +
    +
    +{% else %} +{{ OOPS.nodatafound('没有订阅任务', '当前没有自定义订阅任何内容。') }} +{% endif %} + + + + \ No newline at end of file diff --git a/web/templates/search.html b/web/templates/search.html new file mode 100644 index 0000000..93097e3 --- /dev/null +++ b/web/templates/search.html @@ -0,0 +1,489 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} +
    + + +
    + +{% if Count > 0 and Results|length > 0 %} +
    +
    +
    + {% for Title, Item in Results.items() %} +
    + + + {% if Item.exist %} +
    + {{ SVG.check() }} +
    + {% endif %} +
    +
    +
    + + {% if Item.poster %} + + {% endif %} + + {% if Item.filter.season %} +
    +
    + {% for filter_season in Item.filter.season %} + + {% endfor %} +
    + {% endif %} +
    站点
    +
    + {% for filter_site in Item.filter.site %} + + {% endfor %} +
    +
    促销
    +
    + {% for filter_free in Item.filter.free %} + + {% endfor %} +
    + {% if Item.filter.video %} +
    视频编码
    +
    + {% for filter_video in Item.filter.video %} + + {% endfor %} +
    + {% endif %} +
    + +
    +
    +
    + +
    +
    +

    + {{ Title }} +

    +
    +
    + +
    +
    + {% if Item.tmdbid and Item.tmdbid!= '0' %} +
    +
    + {{ SVG.video() }} + {{ Item.type }} +
    +
    + {{ SVG.star() }} + {{ Item.vote or '暂无评分' }} +
    +
    + {{ SVG.info_circle() }} + {{ Item.tmdbid }} +
    +
    + {% endif %} +
    +
    + + {% if Item.overview %} +
    + {{ Item.overview}} +
    + {% endif %} + + {% for SE_key, SE_dict in Item.torrent_dict %} + {% if SE_key != 'MOV' %} + +
    +

    + {{ SE_key }} +

    +
    +
    + {% endif %} +
    +
    + {% for group_key, group in SE_dict.items() %} +
    +

    + +

    +
    +
    +
    + + {% for unique_key, unique in group.group_torrents.items() %} + {% for torrent in unique.torrent_list %} +
    +
    + +
    + {{ torrent.torrent_name }} +
    + {{ torrent.description or '' }} +
    +
    + {{ torrent.site }} + {% if torrent.video_encode %} + {{ torrent.video_encode }} + {% endif %} + {% if torrent.reseffect %} + {{ torrent.reseffect }} + {% endif %} + {% if torrent.size %} + {{ torrent.size }} + {% endif %} + {% if torrent.releasegroup %} + {{ torrent.releasegroup }} + {% endif %} + {% if torrent.uploadvalue != 1.0 %} + {{ (torrent.uploadvalue * 100) | int }}%UL + {% endif %} + {% if torrent.downloadvalue != 1.0 %} + {% if torrent.downloadvalue == 0.0 %} + FREE + {% else %} + {{ (torrent.downloadvalue * 100) | int }}%DL + {% endif %} + {% endif %} + {% if torrent.seeders %} + {{ torrent.seeders }}{{ UPCHAR }} + {% endif %} +
    +
    + +
    + +
    +
    +
    + {% endfor %} + {% endfor %} +
    +
    +
    +
    + {% endfor %} +
    +
    + {% endfor %} +
    +
    +
    +
    + {% endfor %} +
    +
    +
    +{% else %} +{{ OOPS.empty('没有搜索结果', '输入想看的电影、电视剧名称,点击搜索试试看吧。') }} +{% endif %} + +{% for Title, Item in Results.items() %} + +{% endfor %} + + diff --git a/web/templates/service.html b/web/templates/service.html new file mode 100644 index 0000000..4c2374a --- /dev/null +++ b/web/templates/service.html @@ -0,0 +1,403 @@ +
    + + +
    + +{% if Count > 0 %} +
    +
    +
    + {% for Scheduler in SchedulerTasks %} + + {% endfor %} +
    +
    +
    +{% else %} +
    +
    +
    +
    +
    +

    没有服务

    +

    + 没有开启任何后台服务。 +

    +
    +
    +
    +{% endif %} + + + + + \ No newline at end of file diff --git a/web/templates/setting/basic.html b/web/templates/setting/basic.html new file mode 100644 index 0000000..842e4fc --- /dev/null +++ b/web/templates/setting/basic.html @@ -0,0 +1,1132 @@ +{% import 'macro/svg.html' as SVG %} +
    + + +
    + +
    +
    +
    +
    +
    +
    +

    系统

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

    媒体

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

    服务

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

    安全

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

    实验室

    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + + + diff --git a/web/templates/setting/customwords.html b/web/templates/setting/customwords.html new file mode 100644 index 0000000..22722ae --- /dev/null +++ b/web/templates/setting/customwords.html @@ -0,0 +1,915 @@ +{% import 'macro/svg.html' as SVG %} + + + +
    +
    +
    + {% for Group in Groups %} +
    +
    + +
    8 %}style="display: none;"{% + endif %}> + + + + {% if Group.words %} + + {% endif %} + + + + + + + + + + + + + {% if Group.words %} + {% for Word in Group.words %} + + + + + + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    + + 被替换词替换词偏移集数前定位词后定位词状态备注
    + + {{ Word.replaced }}{{ Word.replace }} + {% if Word.offset %} + {{ Word.offset + }} + {% endif %} + {{ Word.front }}{{ Word.back }} + {% if Word.regex == 1 %} + RegEx + {% endif %} + + {% if Word.season != -2 %} + {% if Word.season == -1 %} + 全部季 + {% else %} + 第{{ + Word.season }}季 + {% endif %} + {% endif %} + {% if Word.help %} + ? + {% endif %} + + +
    未配置
    +
    +
    +
    + {% endfor %} +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/web/templates/setting/directorysync.html b/web/templates/setting/directorysync.html new file mode 100644 index 0000000..4f261ad --- /dev/null +++ b/web/templates/setting/directorysync.html @@ -0,0 +1,272 @@ +{% import 'macro/svg.html' as SVG %} +
    + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ SyncCount }} 条记录 +
    +
    +
    +
    + + + + + + + + + + + + + {% if SyncPaths %} + {% for SyncPath in SyncPaths %} + + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    源目录目的目录同步方式识别重命名状态
    {{ SyncPath.from or '' }} + {{ SyncPath.to or '' }} + {% if SyncPath.unknown and SyncPath.rename %} +
    + 未识别:{{ SyncPath.unknown }} +
    + {% endif %} +
    + {{ SyncPath.syncmod_name }} + + + + + + +
    未配置
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/setting/douban.html b/web/templates/setting/douban.html new file mode 100644 index 0000000..e9c8242 --- /dev/null +++ b/web/templates/setting/douban.html @@ -0,0 +1,218 @@ +{% import 'macro/svg.html' as SVG %} +
    + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/setting/download_setting.html b/web/templates/setting/download_setting.html new file mode 100644 index 0000000..a63bc89 --- /dev/null +++ b/web/templates/setting/download_setting.html @@ -0,0 +1,409 @@ +{% import 'macro/svg.html' as SVG %} + + +
    +
    +
    + {% for Id, Attr in DownloadSetting.items() %} +
    +
    + +

    {{ Attr.name }}

    +
    + {% if DefaultDownloadSetting == Id %} + + {% else %} + + {% endif %} + + + +
    +
    +
    +
    +
    下载器
    +
    + {{ Attr.downloader or '默认' }} +
    +
    +
    +
    分类
    +
    + {% if Attr.category %} + {{ Attr.category }} + {% endif %} +
    +
    +
    +
    标签
    +
    + {% if Attr.tags %} + {% for Tag in Attr.tags.split(";") %} + {{ Tag }} + {% endfor %} + {% endif %} +
    +
    +
    +
    布局
    +
    + {% if Attr.content_layout == 0 %} + 全局 + {% endif %} + {% if Attr.content_layout == 1 %} + 原始 + {% endif %} + {% if Attr.content_layout == 2 %} + 创建子文件夹 + {% endif %} + {% if Attr.content_layout == 3 %} + 不建子文件夹 + {% endif %} +
    +
    +
    +
    动作
    +
    + {% if Attr.is_paused %} + 添加后暂停 + {% else %} + 添加后开始 + {% endif %} +
    +
    +
    +
    上传速度限制
    +
    + {% if Attr.upload_limit %} + {{ Attr.upload_limit|string + ' KB/s' or '' }} + {% endif %} +
    +
    +
    +
    下载速度限制
    +
    + {% if Attr.download_limit %} + {{ Attr.download_limit|string + ' KB/s' or ''}} + {% endif %} +
    +
    +
    +
    分享率限制
    +
    + {{ Attr.ratio_limit or '' }} +
    +
    +
    +
    做种时间限制
    +
    + {% if Attr.seeding_time_limit %} + {{ Attr.seeding_time_limit|string + ' 分钟' or '' }} + {% endif %} +
    +
    +
    +
    +
    + {% endfor %} +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/setting/downloader.html b/web/templates/setting/downloader.html new file mode 100644 index 0000000..97fd595 --- /dev/null +++ b/web/templates/setting/downloader.html @@ -0,0 +1,464 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/form.html' as FORM %} + + +
    +
    +
    + {% for Type, Downloader in DownloaderConf.items() %} + +
    + + +
    +
    +
    {{ Downloader.name }}
    +
    {% if Config.pt.pt_client == Type %} + 默认使用{% endif %}
    +
    +
    + {% endfor %} +
    +
    +
    +{% for Type, Downloader in DownloaderConf.items() %} + +{% endfor %} + + + + \ No newline at end of file diff --git a/web/templates/setting/filterrule.html b/web/templates/setting/filterrule.html new file mode 100644 index 0000000..b310c07 --- /dev/null +++ b/web/templates/setting/filterrule.html @@ -0,0 +1,560 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} + + +{% if Count > 0 %} + +{% else %} + {{ OOPS.empty('没有规则', '没有配置任何规则,请点击“新增规则组“按钮。') }} +{% endif %} + + + + + + \ No newline at end of file diff --git a/web/templates/setting/indexer.html b/web/templates/setting/indexer.html new file mode 100644 index 0000000..c038b3a --- /dev/null +++ b/web/templates/setting/indexer.html @@ -0,0 +1,192 @@ +{% import 'macro/form.html' as FORM %} +
    + + +
    + + +{% for Type, Indexer in IndexerConf.items() %} + +{% endfor %} + + \ No newline at end of file diff --git a/web/templates/setting/library.html b/web/templates/setting/library.html new file mode 100644 index 0000000..39bc91c --- /dev/null +++ b/web/templates/setting/library.html @@ -0,0 +1,238 @@ +{% import 'macro/svg.html' as SVG %} +
    + + +
    + +
    +
    +
    +
    +
    + +
    + + + + + + + + + {% if Config.media.movie_path %} + {% for path in Config.media.movie_path %} + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    目录
    + + {{ path }} + + + {{ SVG.x() }} + +
    未配置
    +
    +
    +
    +
    +
    +
    +

    电视剧

    + + {{ SVG.plus() }} + +
    +
    + + + + + + + + + {% if Config.media.tv_path %} + {% for path in Config.media.tv_path %} + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    目录
    + + {{ path }} + + + {{ SVG.x() }} + +
    未配置
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + {% if Config.media.anime_path %} + {% for path in Config.media.anime_path %} + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    目录
    + + {{ path }} + + + {{ SVG.x() }} + +
    未配置
    +
    +
    +
    +
    +
    +
    +

    未识别

    + + {{ SVG.plus() }} + +
    +
    + + + + + + + + + {% if Config.media.unknown_path %} + {% for path in Config.media.unknown_path %} + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    目录
    + + {{ path }} + + + {{ SVG.x() }} + +
    未配置
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/setting/mediaserver.html b/web/templates/setting/mediaserver.html new file mode 100644 index 0000000..6234503 --- /dev/null +++ b/web/templates/setting/mediaserver.html @@ -0,0 +1,100 @@ +{% import 'macro/form.html' as FORM %} +
    + + +
    + +
    +
    +
    + {% for Type, MediaServer in MediaServerConf.items() %} + +
    + + +
    +
    +
    {{ MediaServer.name }}
    +
    {% if Config.media.media_server == Type %} + 正在使用{% endif %}
    +
    +
    + {% endfor %} +
    +
    +
    +{% for Type, MediaServer in MediaServerConf.items() %} + +{% endfor %} + \ No newline at end of file diff --git a/web/templates/setting/notification.html b/web/templates/setting/notification.html new file mode 100644 index 0000000..33f14b8 --- /dev/null +++ b/web/templates/setting/notification.html @@ -0,0 +1,476 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/form.html' as FORM %} + + +
    +
    +
    +
    +
    +
    +
    + 共 {{ ClientCount }} 条记录 +
    +
    +
    +
    + + + + + + + + + + + + + {% if MessageClients %} + {% for Id, Attr in MessageClients.items() %} + + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    类型名称推送内容交互启用
    + + {{ Attr.name }} + + {% for swid in Attr.switchs %} + {{ Switchs[swid].name }} + {% endfor %} + + + {% if Channels[Attr.type].search_type %} + + {% endif %} + + + + +
    未配置
    +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/web/templates/setting/subtitle.html b/web/templates/setting/subtitle.html new file mode 100644 index 0000000..7399749 --- /dev/null +++ b/web/templates/setting/subtitle.html @@ -0,0 +1,163 @@ +
    + + +
    + + + + + \ No newline at end of file diff --git a/web/templates/setting/users.html b/web/templates/setting/users.html new file mode 100644 index 0000000..b17bd8f --- /dev/null +++ b/web/templates/setting/users.html @@ -0,0 +1,193 @@ +{% import 'macro/svg.html' as SVG %} +
    + + +
    + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ UserCount }} 条记录 +
    +
    +
    +
    + + + + + + + + + + {% if Users %} + {% for User in Users %} + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    用户名权限
    {{ User.name or '' }} +
    + {% for pri in User.pris %} + {{ pri }} + {% endfor %} +
    +
    + + {{ SVG.x() }} + +
    没有数据
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/web/templates/site/brushtask.html b/web/templates/site/brushtask.html new file mode 100644 index 0000000..efdf44a --- /dev/null +++ b/web/templates/site/brushtask.html @@ -0,0 +1,1110 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} + +{% if Count > 0 %} +
    +
    +
    + {% for Task in Tasks %} +
    + +
    +
    +
    +
    站点
    +
    +
    + +

    {{ Task.site }}

    +
    +
    +
    +
    +
    促销
    +
    + {% if Task.free %}{{ Task.free }} + {% else %} + 全部 + {% endif %} +
    +
    +
    +
    选种规则
    +
    + {% if Task.rss_rule|brush_rule_string|safe %} + {{ Task.rss_rule|brush_rule_string|safe }} + {% else %} + 无限制 + {% endif %} +
    +
    +
    +
    删种规则
    +
    + {% if Task.remove_rule|brush_rule_string|safe %} + {{ Task.remove_rule|brush_rule_string|safe }} + {% else %} + 未启用 + {% endif %} +
    +
    +
    +
    保种体积
    +
    + {% if Task.seed_size %}{{ Task.seed_size }} GB{% else %}无限制{% endif %}
    +
    +
    +
    刷新间隔
    +
    {{ Task.interval }} 分钟
    +
    +
    +
    下载器
    +
    {{ Task.downloader_name or "" }}
    +
    +
    +
    消息推送
    +
    + {% if Task.sendmessage == 'Y' %} + + {% else %} + + {% endif %} +
    +
    +
    +
    强制做种
    +
    + {% if Task.forceupload == 'Y' %} + + {% else %} + + {% endif %} +
    +
    +
    +
    转移到媒体库
    +
    + {% if Task.transfer == 'Y' %} + + {% else %} + + {% endif %} +
    +
    +
    +
    已下载种子数
    +
    {{ Task.download_count }}
    +
    +
    +
    已删除种子数
    +
    {{ Task.remove_count }}
    +
    +
    +
    下载量
    +
    {{ Task.download_size }}
    +
    +
    +
    上传量
    +
    {{ Task.upload_size }}
    +
    +
    +
    最后更新时间
    +
    + {{ Task.lst_mod_date }} +
    +
    +
    +
    状态
    +
    + {% if Task.state == 'Y' %} + 正在运行 + {% else %} + 已停用 + {% endif %} +
    +
    +
    +
    +
    + {% endfor %} +
    +
    +
    +{% else %} +{{ OOPS.nodatafound('没有任务', '当前没有正在运行的刷流任务。') }} +{% endif %} + + + \ No newline at end of file diff --git a/web/templates/site/resources.html b/web/templates/site/resources.html new file mode 100644 index 0000000..39c264b --- /dev/null +++ b/web/templates/site/resources.html @@ -0,0 +1,290 @@ +{% import 'macro/svg.html' as SVG %} + +
    +
    +
    +
    +
    +
    +
    +
    + 共 {{ TotalCount }} 条记录 +
    +
    + 搜索: +
    + +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + {% if TotalCount > 0 %} + {% for Result in Results %} + + + + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    + + 标题 + + + + + + + + + +
    + + + + + + + + + + +
    + {{ Result.title }} + {% if Result.uploadvolumefactor != 1.0 %} + {{ (Result.uploadvolumefactor * 100) | int }}%UL + {% endif %} + {% if Result.downloadvolumefactor != 1.0 %} + {% if Result.downloadvolumefactor == 0.0 %} + FREE + {% else %} + {{ (Result.downloadvolumefactor * 100) | int }}%DL + {% endif %} + {% endif %} + + {{ SVG.text_recognition() }} + +
    +
    + {% if Result.imdbid %} + + {% endif %} + {{ Result.description }} +
    + +
    {{ Result.date_elapsed }} + {{ Result.size|str_filesize }} + {{ Result.seeders }}{{ Result.peers }}{{ Result.grabs }} + + {{ SVG.download() }} + +
    没有数据
    +
    + {% if TotalCount > 0 and not KeyWord %} + + {% endif %} +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/web/templates/site/site.html b/web/templates/site/site.html new file mode 100644 index 0000000..b0f5230 --- /dev/null +++ b/web/templates/site/site.html @@ -0,0 +1,906 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} + +{% if Sites %} +
    +
    +
    + {% for Site in Sites %} + + {% endfor %} +
    +
    +
    +{% else %} +{{ OOPS.nodatafound('没有站点', '没有添加任何站点,请点击”新增站点“按钮。') }} +{% endif %} + + + + + + \ No newline at end of file diff --git a/web/templates/site/sitelist.html b/web/templates/site/sitelist.html new file mode 100644 index 0000000..1c0fa20 --- /dev/null +++ b/web/templates/site/sitelist.html @@ -0,0 +1,47 @@ +{% import 'macro/oops.html' as OOPS %} +
    + + +
    + +{% if Count > 0 %} +
    +
    +
    + {% for Site in Sites %} + +
    +
    +
    + +
    +
    +
    {{ Site.name }}
    +
    {{ Site.domain }}
    +
    +
    +
    +
    + {% endfor %} +
    +
    +
    +{% else %} +{{ OOPS.nodatafound('没有站点', '没有找到任何站点,请正确维护站点信息。') }} +{% endif %} + \ No newline at end of file diff --git a/web/templates/site/statistics.html b/web/templates/site/statistics.html new file mode 100644 index 0000000..a4da53c --- /dev/null +++ b/web/templates/site/statistics.html @@ -0,0 +1,1067 @@ +{% import 'macro/svg.html' as SVG %} +{% import 'macro/oops.html' as OOPS %} +
    + +
    +{% if SiteNames %} +
    +
    +
    +
    +
    +
    +
    +
    + + {{ SVG.world_upload() }} + +
    +
    +
    +
    总上传量
    +
    +
    +
    {{ TotalUpload | filesizeformat(true) }}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + {{ SVG.world_download() }} + +
    +
    +
    +
    总下载量
    +
    +
    +
    {{ TotalDownload | filesizeformat(true) }}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + {{ SVG.arrow_big_up_lines() }} + +
    +
    +
    +
    总做种数
    +
    +
    +
    {{ TotalSeeding }}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + {{ SVG.cloud_upload() }} + +
    +
    +
    +
    总做种体积
    +
    +
    +
    {{ TotalSeedingSize | filesizeformat(true) }}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    今日上传量 共{{ CurrentUpload | filesizeformat(true) }}

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    今日下载量 共{{ CurrentDownload | filesizeformat(true) }}

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    历史数据

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

    站点数据

    + {% if SiteUserStatistics | count > 0 %} + + {% endif %} +
    + 共 {{ SiteUserStatistics | count }} 条记录 +
    + 0 %}onclick="navmenu('statistics?refresh_force=1')"{% endif %}> + {{ SVG.refresh() }} + +
    +
    +
    + + + + + + + + + + + + + + + + + {% if SiteUserStatistics | count > 0 %} + {% for item in SiteUserStatistics %} + + + + + + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
    + + 等级 + + + + + + + + + +
    +
    + {% if SiteErr.get(item.site) %} + + {% else %} + + {% endif %} + +
    +
    {{ item.site }} + {% if item.msg_unread > 0 %} + {{ SVG.message() }} + {% endif %} +
    +
    {{ item.username }}
    +
    +
    +
    + {{ item.user_level }} + +
    + {{ SVG.arrow_narrow_up() }} + {{ item.upload | filesizeformat(true) }} +
    +
    + {{ SVG.arrow_narrow_down() }} + {{ item.download | filesizeformat(true) }} +
    +
    + {% if item.ratio == 0.0 or item.ratio > 10000 %}Infinity{% else %} + {{ '%.2f' | format(item.ratio) }}{% endif %} + {{ item.seeding }}{{ item.seeding_size | filesizeformat(true) }}{{ item.bonus }} + {{ item.join_at | string | truncate(10, True, '') }} + + {{ item.update_at }} + + + {{ SVG.activity() }} + +
    没有数据
    +
    +
    +
    +
    +
    +
    + + + + + + +{% else %} +{{ OOPS.nodatafound('没有数据', '没有生成站点统计数据,请确认是否正确配置站点信息。') }} +{% endif %} \ No newline at end of file diff --git a/web/templates/test.html b/web/templates/test.html new file mode 100644 index 0000000..bbe24b9 --- /dev/null +++ b/web/templates/test.html @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + 组件开发效果预览 + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + \ No newline at end of file diff --git a/windows/nas-tools.ico b/windows/nas-tools.ico new file mode 100644 index 0000000000000000000000000000000000000000..bca7b40af6c0d10d0cdf225480584e687ebc6ddc GIT binary patch literal 67646 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 + + + {% if not head %} + + {% else %} + {{ hear | safe }} + {% endif %} + + +{{ body | safe }} +{% for diagram in diagrams %} +
    +

    {{ diagram.title }}

    +
    {{ diagram.text }}
    +
    + {{ diagram.svg }} +
    +
    +{% endfor %} + + diff --git a/windows/rely/upx.exe b/windows/rely/upx.exe new file mode 100644 index 0000000000000000000000000000000000000000..436082b92729609eaec9da89564ca90102c76d5a GIT binary patch literal 412672 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 h9`+FQ8!8=_4Ca-C#82m!j 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 G{JvPsif((DxsS&y%xkir|-`)a*H@1P9Vf%hs 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 LIzasYmE(T_2prx} literal 0 HcmV?d00001 diff --git a/windows/trayicon.py b/windows/trayicon.py new file mode 100644 index 0000000..063fd9c --- /dev/null +++ b/windows/trayicon.py @@ -0,0 +1,69 @@ +import os +import sys +import webbrowser + +import wx +import wx.adv + + +class Balloon(wx.adv.TaskBarIcon): + ICON = os.path.dirname(__file__).replace("windows", "") + "nas-tools.ico" + + def __init__(self, homepage, log_path): + wx.adv.TaskBarIcon.__init__(self) + self.SetIcon(wx.Icon(self.ICON)) + self.Bind(wx.adv.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarLeftDClick) + self.homepage = homepage + self.log_path = log_path + + # Menu数据 + def setMenuItemData(self): + return ("Log", self.Onlog), ("Close", self.OnClose) + + # 创建菜单 + def CreatePopupMenu(self): + menu = wx.Menu() + for itemName, itemHandler in self.setMenuItemData(): + if not itemName: # itemName为空就添加分隔符 + menu.AppendSeparator() + continue + menuItem = wx.MenuItem(None, wx.ID_ANY, text=itemName, kind=wx.ITEM_NORMAL) # 创建菜单项 + menu.Append(menuItem) # 将菜单项添加到菜单 + self.Bind(wx.EVT_MENU, itemHandler, menuItem) + return menu + + def OnTaskBarLeftDClick(self, event): + webbrowser.open(self.homepage) + + def Onlog(self, event): + os.startfile(self.log_path) + + @staticmethod + def OnClose(event): + exe_name = os.path.basename(sys.executable) + os.system('taskkill /F /IM ' + exe_name) + + +class TrayIcon(wx.Frame): + def __init__(self, homepage, log_path): + app = wx.App() + wx.Frame.__init__(self, None) + self.taskBarIcon = Balloon(homepage, log_path) + webbrowser.open(homepage) + self.Hide() + app.MainLoop() + + +class NullWriter: + softspace = 0 + encoding = 'UTF-8' + + def write(*args): + pass + + def flush(*args): + pass + + # Some packages are checking if stdout/stderr is available (e.g., youtube-dl). For details, see #1883. + def isatty(self): + return False

    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� zBxu|}SK!sw_Fdp#^`F-+VPTrEC8rD)Pun5p77&&nj9b?5+b!7)HLXpt4_|X?;SWVl ze$w5uEioaNASg6ic#vC2uCjK;tA6jKP7L_0hS+}2sB=54`oW!{qjg>sYQ-1TFWnP>C21E#_QgYMl$oMV8qm=o5F3HI6SO zJWSvyLZ?%Rk!k%O`2tq8lLkbl#?5+~y(&^erDldO@>}a^-g~y=7!=9gNRvj(ji6C# z!yj@=Lj$nXpHs*0wj7&u;qA_8tql62jOe>ghy{P{hO!z=fgEvt$OCL0yv0<>kO0qN(scv9P?h2=K4BbnB4#;J+>baS%=PB#cKL7v z4;<6i2yWSCSk1C7Ymg_+B;Ipys=1=66lLP=B|Gb-I*YfLfwkKxC^<_X2_b>{BUNKiE0)<@fVHVYp_45zN;hFN+s&i~9m3f?zhCPUqNEe*Yk{9l83 zLfj@TRXh4j?LJj@Y=VS4@CT9=NGn2)2C$kZE*7dDn)=>+&SH?8^ZT&pm8Po@@cCV# zPD6ycm3&bVv^+`CSGsj5F6gvr5KMFN7~G|XTtMMG#)aBZoQ(~wX+6li%uQ$6PCwp0 ztaxCk4FKWYD~Qa3A{$1ZE__U_wnKs5fu+aOV?B{TxwStg3BNNxG)ZAPc65pHg}EQ- zqWkZ~s)-=Vgr(AmqUxsyL*_|ao$yB<+t7z)0)%2M7ygOz;^*X?6gf~ij#?@+BEWk( zI-yj$ZmsZ@fhFt)xP!3*iRxC=^z3fVttq6LS~L)9&*h(%sRCK;y>>+I^+JnNiepaP zzZhE?e_#%%#S045a?S#-jg8zF8nDoRpHgyMmlHFZf{+poZWz&Q&Up zbA3-q*Wj4{-YQeqR}Q*z0MvqkGajfR9QiBfu7fUP+Lmh7i~4hK)jtRjzV@$`-GQF2 z+XHNOBk!*$)^;0zn^15jHm{%W%aT>-LT&ELELR_0Ixk!oIV}c_OiMdv<0yf$ty~;| zH7ni=KFw`l?H+E9pe#9Dv}9V9zmMg~eZ4!`O>xYDpUYUoYAjrom6Q&w4$4&7{E?Wb zHSooHHMG4d5Ad%Np|R7#>`z!JKObX(UJZ%L>l%Rp$~<7o8 zwzIIAuXr9!)UCEu%OkDD`jc-V<>+Al0G{PcZ~x^6$~e5QP3-_}AM!{$K{_Xm?$gFa z-V3!99koaK>H+EzmzzK*4<82d&LMyuX_S~A`3K~(D7A~};*L?*1V z^Vv0*sUUiJ9fmd@gTcOvh4FZ2*U=$g!A^rJxebGn`J^;{_G>A4Q2F)$aV;JiL(Z`{ z)u{3++>Zs;HgshIVpq99ddV_=XRlLq^_F+U;yCeOM^A*y$4`6w#G7b!W)J#q``k4I zS5!$BB}WroI?3Z|!}Jw-q+^-5*$8U$O!20wozS|j+Jpf?8Ri|MHQ8j{YkKdgNpOL?ofLDAa&*^BBPff_2~zFly75J5m&O_{pi=7hV+ zR*ES1tID=H$h!jUP$hJi$=FZt4Bez>a@P@!)`OmG3A>PE(cYa_06?rHccua+&6iX) zOMlZFHla}5v@!fa5bGZ1dojm^yd4^EQMV2wgS7u`#^vd5G83!>ZsxU0z|FWR{HTq0K&GuvgeVlD-9ndr(e3M5L6U3 z71Vfbuui1^rhi6hsI3Q-1$5Pw5Uy=4)pX>_0_z`);Far55_`w6izZ)82x;;Y@1=KO zJ@kwq-LVi`O6J@BcBlt)>h9f6aEryetWad!%UTP`@x!rS7~Ab&j3>SbM4nF#YN(Dn?Ne}{C0SG0n;jGu_x zKSBFX&-lX1>;#s?9*~X^qOg1^z5yDcbn z1UQ!&7?^yE?9XIT7;heh$N)6Q=}DvNvtLyN6bU;ARr6>q?J%{b-}w9lrZ_CF`X6%m zrXxgF$h&?KKJP^V{4Kiy7iOeVlnfv0tYBGt9O$6&Ix3^Z-R$mtt(Vug$tKpIx>piG zkAF4ZPdx9e2|aa8fGHu^iIv21E>a zBA=<+BU?hexhiy=s<9??4+sj?|7t8!XnR{FQj873f2bnTFU1%!DoT$>qv6whQM|F> z5rkibePY?m;SPq$iPKbX;>lO9`6zOd{gCgpfUL;UcuBo>d3Cv>C9~!16O0cE;Zkl_ z=S>%Ua>4&03&blNy2EZ|+BCx~h5h1p-g<3|%Kq-i1AC76vPhyj`0|q8gU4AA?75C5}Gj5o9ARa?=#^$4vs6@z#7qj5HNRgda%x3GL7g8hJ`#9yBC^q|5g*M(F3~fZ1)PY8l1E^=z`-m5^TJ<#& zMEji+*G+nL`lR!ITJe5^Rb(j@>y0R4Ux7wg3L@?rKmT+>;;iC*d4@8vXrJ!JsD!CV z8?s&u2)4R74RTa*5mV~Z3^W99XfBX}3(2sIzO-@1Wp-~%bv_LBuw$s z%#8zO<{rRI3C|T{H0=YulsvO zCbR@?Bgxb0@en3qy7-Bv4#!$5%{AJy?lBNeiLC#$m$obr_a;=bA{blLBKGQrcZwAw zu)tkR@57z1WBwycO}Rzz5oxBFJnL*}UJ;>S)|{whBtBkZA-M9nPWq~IEOcxrlwBU|wZ1`H%#oei8KP=TT05}k08UZgaNd%Ljyn2$wHD8j4!!K9xBTkwB?uM7%K6|f~ z2obskY8vUo-@iJICU^A)YKonFj@ek*rQD z0YaU{F?1$1VCE zHHRp&m*roankT_dqSpdPS8UH&ufk61md1L}Gl?Y%|K-Q}FutgO|91xE>Y=0Ts26E9 zrNlbS9N*@FfG)@Mv4N0vbQu|ZR+RO_J{a9{cqIFxdXv3KKu9r+p+@zhdgtwtg~@Jv z{HByFZ()Px(pVwKQ91*H#SPE1wH=|>2-@7J>;CMRp(-^o?LgQrxf!;B8=Zq)opksr46F=Ct;a<|0xMP;eVuq&0vw1%Q_;^Z?Cf93hwt z@Z_+~d|0?*>bZ97UXJOFWi-kqv`%zxrkd|0lo zP~f7Nt*G7M*va%%N62U3ss%EAE?#-%sG1ll*---ku<3RULZq;X{^Cqk4yQqvphBA% z9e%lJtz*(b-a2109s)-pTK1SZbq0rEdn=jKaP|UR=c3M7I8rZT<9?Gmf#$OEWVt-> zafi*g&vAHh*R699H@|EiIqz=XyG1sZG}C+0(Tw<+-~iwTEAV*PlA9mc@6m+ubHzCO zEx4auoY#4nnrH#te9EFqZ5$~@f+cP-_|X>> z!D~=Q6dlx#uC_B?aju=viS5L5{Y+0%((l*Jtd|t!r(7{nB;b=rsJGGZFUa%>M%~p3 znb{r0iR2A#OS8UM?QSzc3s*?NkWx0-iH7#Amm7rNnw0oYB-_x4!Mx^AA6Y8EX+>kL ziPh1ugl!iv?#~AK<(hWlJQ>DJuXpEt6pO3mSATQMEE2@{xsQAV46W#!d_P5OJq_{I zQ`Z-7yD)zaXyi>H{&|jF9>eZGSot-|S+R+bsac3`zuEyms23t1oqyLHaHoU7dL@$V zcbk>$W}f7&+p-YabMBFW=PK}O@JI!%U}Y^feT>LMjiRabeq-RIKIC(=_x-&NM(R4r zs|?C!dd6>Bb-TP+HQNbyWhw-6fIX33rR;ad)xe<;tDIxHm$~$3y}pbS6o2tQa-bMX zvICX4qaPi+z+P?@=r{iRevR0@O_|u!#3Hy28j94zD z887$Lu|)8^2w#<#qhU3W*qT%@ez5=etz+;MI*rLyk7UVRs;ErB-+U><+s%SrR;z05 zI7Q2i4VlsAXZ4ng6QBO0)-xcj5U<|m1-;}?5tLei z%PcdVE_vGK-WIAV=Uj!Feu0l5*qioYZ*3r4LZm+-2+ikHeSJHhdL?-FbKOm0WhXHw zXl2o}mC&CMtBF8%N2f+a9VkeO?szw?i=yBOX)2oTa+(Fgb@Cc?wULI2AnmRTip{gu zHUFFJp`IwHeedtkVlmmZZ(*!gk*AAl_I+3f@j-FL!ax@*IB-S9+#M{Lg7@y(Z6C$| zoG6YJ_-ry0u-jPxPFgSNm5CFl7LSy^#=VRJf_vKXt~AFd!|1UI6|yt=9+xzh#l|1I zt0P~NsczqI>r?MY)?GBET_QB&?6fthfM-o6WwYg_Bw)C(BD<^B64!x+fO8}=*t@Jl zJ>hEju#|@=AI!S!*iuzW_)ez2PPSh99Xo!%mMQ`D5{d;M8d;@_%pV+xMZFu*lvsfX z6gH=tC;zOO{Z-t$nILCgKQN&yqRr==gR*bA+5WEO?$dfYi~JKG0^fK*)c*mKu4>k0 zBsEDma=eSmY48{z(eaUEI82}NOhf5W3Z zw!$`qa%kn4k$J7?+VlHjMIptdWhZxFEOJrTK3WgQ7a{Kc?-Hot93#TT)u zTqgXPAV&fLzaV)~H*RAZLWm(7@4+jRK!utOYbp^|&Px0z4b#XNZ&Hf-Y-~nH6Q~W0 zR8z>+YbWbFZ7zKjiDXn*r(dLC{B8&IhDA+fhd{vIVDyo9q}`6uU#?ks!}Cq8GL@3X zJJ_fh)B)=G)`@$jS!kHJj7dhp;-ahvepC?w)m7irZEv<)J@-(U%zKt6?eN_GSwc^D z)*uYygR;lfNHq@{uEO18;6%iVLaFF%C4tM^PW|SqDFnIqw`(2;3pNRIloFp!9mZT) zF-esb*ljEc%1gAm+CE??d2kR)pOhu%cYEPE&uQL$Y3#uF@KF}O*4{lJ%FaKM7(4&!2LVf zV;$8>O7Ug-bJ%Q<W6bFWK15Ds!pfGG0e}p}@M)U&Mg8Ga&YC&0t zM`WPf((RN^)gwe!d}cEq-{bJBMYAs$htTAJ*^>GC5^CN@9|QtBm|}W$$k#hn0(F4p zO^ulWB}xuE1R!Ul;nB@T0Yqr%>Tzc3#RR1xXrO2lu$r9%eZ=QS3us5Y-=&K0%mb{& zL70q)OyYl69wgPk&ZC_?iF<0F0qeyeW`*T8;uqJ>8Ej|x40Z=DDG-tVx-QD^y)_Z7 zvpFsHpBNIP04WfLqsI68P&krT?;aAJ@PiF)Ml$mT&<@C`Q_)t;2irPgy>j_4|Ey)b zIUKE;>~<%)nVUhuC1EFlo|`9iT+n3K`NZfIn`oORb(6gYX9(kFs`GH^%7{1&PZRu9 z>{l(n(Z!Ejl)GqTc zh{K>*Pfi_jk71X?qyPCxw|Spxs3A2+u}qSq<}XP}>?fNFyL>75fg?0GMPDtw(Ahl+ zsEo#NRy+dP&rLr)lsyv)scXSq$J3Hb_L9X>RT8G*)YW~ik&OJnU<6V6nX&w5`BWdWFrvK zK>EmurB(!55-Q8BxD{vPQ3AgN0&(9uZB<*_N?9X1?3KQO%Sh?Snoikw1LYLR)F^s4 z*hCnJnQ{wANM~Q!ktRJC(3C@w@Rig!D0!t^;j;y<$Lm`*;`xJ#Ef}g*ExLSzGJf&1 z&da%;iik|Gq}Gac%yXdfnki-KA9V{hES1$n%uP*L>CzDn4TJG?&kl9h{sH560a?YsfWOvay^a^^i8xc)g>f7QV+3=s_5o=StN} z7^d<2mIs8Ll_W{X`K*IDnAo%xR6O@H;|wJqyFrtjjC{&P$dlF>J~C2mqm4EMGUdnK zERNv#A)7Gqd1p5WYiKEaz z6G+2h5e!YyZ6f|QBH$(i(OeQhhn9y<<{XdyAhoX;PAs-UWn=3n3i)>{_qF|mUVOUSe z5Pxjgs$%)y3_D_(-Vj)wZcjcsWA>`ac&dq0ZNpV+`v|xMw+VfAQ?1krt>2Tq`FI5w zZnS9QE>FIhHW8g{HB{jJ!Iot{dk)A@r`3YddKMiI+)1}e-s+%bi37))2MHqdM1@1c z2UEoj$xOyq(GTTTpsDm01eNf_9i}Okr?V>#_GPiU+X|b^7e_Z@ z&(@8DK&c!eBb9d2$(K!S`FoCA;I@#G5O)9bs_+Jthj=*%UH}fJ5MOt%Ha?kA!8_cqtGT5ay&doigZ22Q5+z#x*%KM zsGn)*9XcVht<)E-3keFPd(W~LOjEsdc0C_g5*O6qpcoSs!?+x-46g#zUF78oY4ugk zPB5scNq669&f5ARILOIOWR2a`*>eH;fEJPLq zKv1r3&hY^U4(`j~BZmk$FiWDT%;w64Awu(9&$66>gR$25?jUcI=Z#xR;?4~*p25ZT zdlWw646@DlHL@CQ1Gt)`jF`N+%%~1kR~I z3P}-ciAbx{E*y8!qGwk7>%Dta0DzG?(^XB-wq`ULwfSTrIKg30K9h>KRnGTj$!CE5 z_&H*x@Rg}Ha`A3<3eiH?LJ+=Tz|9pp%^SVlitvXbO}(7;dhQgS?DiwlJCH~*WT8*_ ze)m(V69Hb{t?}uJn9L=4z?jLxD;SzC7jWe}-+KD&Ll_)+WEP=po`5J(zPgKJ4w$g1eaB-t` z-fz~^)(7ZMXU^+}@B-!`hYK1u zW>*er+ClKI0=vQ8%|zTUp4qljv*|RBvaV6zSZ)b@EYjyR&E;qwcF@?y;3dy0kOq&S z2Due%3ym5rzGPb4h0Izlp^*RP9`~tu8leq-Ycci;jGe6~0lY zJ}jc@6%+L5+~CRI)b#hLL9)Ju4d&yli&p*8O9y zg>^wv7K0^QBWe#;0_%CM?liav8hoZ+^0h0_m`PqYp#t58J3Pb;jDBfY z(t9dQaaocLQ1>TNnFB~U`yrX(&CZt49+G&|iSEk27PTSNs}~^1w|cctgY3g(NmjJY zDSI6c{WE!HJzUQ5+`?v}p6~GE^?*kckX0{vgpm}M!pKgt#mjNVyg3dG??i}PsOEs> z!ML#CD2w$~6=5^l$nvadbmeKS3+w&+V3&ZnHfb2d*m z#`^{rCS(%9HGUyWn_``~kC8e=yC(sbc0pFV!~-{td#!|1zu55&A(0kGP+2!DQ`0Xf zikwLVyVZs>yCN_j8cjq>-GO=fyeUYJCP_lza4gVf-G=@~)u2nku>&a9O}#4>PKOE^ zg`CJ$D-OcRPqk=`hGA@P=vs)9M)F6S&2XWzoMG@>@Y*fWhN@{%q<2eCS=2ENP0gzoHv|d?XwGI6S^s($JvdAg%O#65b#Z- z4F9rSX$b%Bg>pSiHg?QoP_^K}%5&l02O>4*@UkQ)IQ$wMWmIks;H_`@%XQa@4@3%U z)u?6~310aT+Sd;-1V=f$8@0cWKzAj?13{MpsKgz{Iq1dRy(nCV zR7u_i9KGC2^-E5LLv4g+mc9?S=~v1uXV+IJg`gnDU>_&?bQR8~_GBX)=XQkq zjfc!$Ve|mEh;8};v0N}~vduW8#_Q^&tKf7T?-}8Bd4hS>6c09@DqGQfhsE@GkEhts z1hRJYo<(Za-n_l`aP`=G z&WZ#+0vePqOry|Kat4pv_^hNAMLCqFo)Z$*>n>i z$z`V`48i1y9|?3SGihw+Now{Ik5_<;9s z#*H%obEt6+v_;4@h{J5ZKi|L8G^r$$=|8PC08>hiPn?Npf*UO`7K}{cl={7&ix-v* zUVKY7(b3#GJNQFnoR%niaVom@^F7BFGs`$k*h<)HZ4|<8slLD z-d}*vCzQvXB}?uFdcCVXlM_%&h2ft9}A9{VLJXrSR4q4=1jsFE#EHQ8A*lX zH7K}l7a+jEB81K$OTtZA4K(M78(!10ceAn54uPMYz#|C_eYXyeGFb0y_%fjkSQX~9 zF*?;2OdU2vg}H%-gv`zFl)KeM5rlq>!&-JJIJ?BgO&a+~bz$|DBT+djJ@3C4L`)ww ztI6c38$=3>N`^wU9OkVNZSGNvU5!w};G2uurdiB}!84SB|8F)az#$8Hp~@eeP$Bys zNv!;z9QzgWi=`>20pE7Oh<;&6C1SS7NDLkM#*vtxD~CQhvbb{WmgQAElE)}$@VPM$ zC41N#b^kl4s1TEs$ahg_P|^_aF`8)MDnj%6?O1>yQB;W)>9C1XKk6C4$@F>cB(V(6 z-3fH#v%149``R{RWyQS5BcYC!6;d;ASuafte#|xEX?AmI%P(J(CzRYCb-9NAcwadx z$eRFnro7K9@cB|q2?^CPM+6oKwy=*38Ra^f-Kk5m;LYPu&F$t%oaUg~&doS`?zOF= zhsUn~(5BEI@h|FT3od7R)Uiis4%Us&1?o2p{Q06SUcDky!Gn(ZGV@TGICMFD*m-Y9-y(SZES-htg#_dxb#HopNcGG9IQgu&d(8EaX%Dk5>P= zOyI8&I*i-hulaz*eSH4Pk<|m^`_)!gov?}+Q}gsT)$CJi-Mn#M_IQb#XIAbP2lAH` ziKPH{I}!8){NZj-+WjVAYB`{~+xd`)93PC;fE^b=IXKYrNJ2cKubWw#E*<+0ZT$K) z%-?j|a;I=QT%q7(GksAZCrTYWk)KN}NsAnnDo(#JHogxEs2e>ME2of)M8*FtX2+?# zY-OieJRh!g!WtOiY(|wrt3vEL*kzb85=O2uqV{&^DPBBGed+^rOi`c?euPO=h_%vj zO{-IQlE-L)&lb0|NWh^@z4S*ZnD7BRV(A`4ED7f%^T1 z&XgK`IW^X$I!ME#?UBRVSY_3}A$Fb#oO7R}C18Mv4MfP413iv?X(Pps)pLHNmsqx_ zbJ025IqNN%G+R$}~d%e1?jb2r1c;iktEq zoJqIOZz(2N%b@v+er&&Pm=;~2V}ox?pOS>RAUH#g>u8Qs0l?OmdWCs_K+O>;2rFsm zS4uztKB^fW#EpuRw>JcbIPG zlQcSB91{2nJYB{V^PYMj-d_+v&{~sv*EX9(PD7YKZx@N^aISGgek@y6 zrtS&!jQw8$zbFr^GbX^(`^#0$&-ZiBdK;MHw2A%KD0zUg>2cV+=E-u=72Jib@Ty6s zdMY_OD0!~IkA@;~8M2&XinO%vH_}Tdu@rTbthEsj?hBjoR!%m=)xkb|2~-78E>6@a zMK_4|N)RT@W{WA2f?tA=+ooQ7QI)cdHQ-E}sK&*Y-z|s6_eFo5R2NT4?cyO4JEJX$ zeq-V39ecj$;`{|FR(L|Qn{6Ka6N#BxzshIAI5pywvn(IbbD}K)O9~}k5k;Rp;?kgY zi~O6QM?`mv8X4W3#Qck=h(tn_DUC+wrRKU~gTB>t_9w-Na$$APV#V}E15fXXXtN2H z8ssq(_tnF6DF6FtVU?AB5FjBn83W}A22+AP8BwlU`K|u)ma$K0^>dYn+nU2-oiFyr zBY+=iLybwo0e|^>U1w0;1pIfLov*@z5I&?Tr^nsrC5KYM`dF}`f=pl*%6o~gzDM1G z=!gR0sM1@~2S{K{$s&f$@E^G+-uxQLTqA7xfn0$QG5*#PZDScMXzDr$cA9)7TD z5(-j>HOJ;vko&;ss??o*C_LP4cK?WhS7q4H?|`KSd2=Jd@ab%TczJ+=FDU5~v=NRhlQLk3+ z49pBHx6R~mu5gu`LsMl4TJr(wo0M;^=wbYyu?8z1gTdIGyfJ6v8X;stmSGf^&ZDdb z#)*zAY4k%@_~sJ0SSz&~Z?gk5q82ciQukSEXt;@B6jq>7;Kw7fty2nE!EpjHs|{}c zd6CXXqRDr4BG6p8gPD9_c(M?u#TI-8t{IKQ1FVjpPT@z#3kkClcqQEQT}f8Ap4Y}9Yf zw(b&B(DhER=PLl;8<@B{3(IfZWNkmCs^ux&UtXsT^Y&23#j_c&dY7}m3Ug5z zY=JZa%$UlmaoiRk0XpAq$lmjBf;yZM!qi)bw*u>>+^7c1FCFXmX*Lc8&Y~%a>Eh!J zm3>$L<;La%`L!*eQ~6#Sr_l4r5_*ADy795N;)2t_$|k)&G~_#)?({ zFq?GdE#*Jf?pgUSVp)>9`qi#aPF{U!;s+#8S+Q8K#Bh)_D*g34zV`sHscD0omBFAS+A84E$j2iWhtW4-MdGL- z@Bbd#(YC|xdd8E={;$*!!Aw(mwX?23UNhgR%o*FKZi6Wz%FC((#96V&?Y+%xohh4a z*FLs_ta+A38o6;cbDSsSH(#vM$fXT(0tvwJElk0L;=hP0(uNLHcz;8)nPSA{s$+Fw z?^bQ!?`G0fk%#NKIRVUKuISC@)n}n{F5R(?_o1 z)t$=4*nnm|`C_>;u}CoOPB_K}e_{m+M(Z0l&tBnFHWFZXS3-mp?nzPL#Q5G1R1?Or z;F+2zm25;W#4KB2&bM;0{i7ULs3+o#hU9%ap~u0TXOH+h88|uEdlj!@3T3eRqj&CJ zVLz0Nd<}&Sz>pN9vog}GcD`Gb%8Sdv&=@EUrS)aZU4BxJJd1lIwagF-?5m;Ej?;y`dF?|7K^$UDOyx2s3zMZ7Q05m|$zZdzH ziu12QLZXZe-YSK7{@B+^9~?2_{oeE^96sM!b{+}failH?Q$-us;Bo@*v4}j6Xqkqq z%B|Q@xjjH%L-GRpNif+M{+unEW1d9H!3x>^BtBbE?3aAlr{ z1ecVFH!`hor|^C-`8XRTv#@7Vhuy9=Hd3Y?O zlPoH3LJr+*nF6zWkLM#bI{pCK*x`wQlu~+R;8;snoX&!a-&Z{Ldxr=w3fY3!!gu`s z#g6!TOp=7PUCGG3{kFKrBcA7M%0Fz=(g{q?{d)GceT3;=i;(|^bz|BQ43ENAn^9S#PLNgkSm^xu*8VKL5g+!f;1*EKmQcRDe z=5M%0A!&H61u!p!?9MJ6J8cIe?TL}S#7!$@S6=+G=cb~L$rODb65Q=L#f&?BV}jsH z)Ca;TYuj5rrLAT3E%ng%pJJ4%!ksu|+kBJ1slu!&rnUE(WmL?a{kh8Pr9@F^lbs8Q zKD6A_u#&dJdMlXriow;T3RI6{5up^FVYb>W+^HwA5ACr4%h?DJUW2mVmwAi~=+W|C zf*1sNf?1@MSg{u9uv+EeYRsXF?QLLLmN6`}u8k0P3#?1{FEc9g4Hl6HyDhTD3QE&Z zvA<@kDD}#l{f#;TrwPu^V%wAIzgQ&eBS@%=>#1sbj_}sl`5aZ)VIe$K>^PX~1{K3= z6FeJ$bK=5{QPt($+Jr@8T7NqsGW9k(q)a;lE4HK@Fm1Q9l0d2+pSQ_!K@RFU1|L$Wuh?C)p??4{2LKPIilnb{R)mkN>q&EjOxHC>#~r|OOtxqJqA zxt-? zo%wo)RMI^i9}AGEbzqM2VgoU9LH84HLmS*8RhAN6X`B6#El!3@@E*h;#@!$Wo0%#B zF%S9*7L2*B`SYW|D{66J>aFUwR6r5*`xFRIpv8RWj)`HiC=UyOPg^h9yP$jj5 zAk0K2V?dgtLp0tkeiNAKDcBOMYivyfKbIyyk{Utn69|vQ>8qe~eHL}VY-n0@6>R<- zV$a+*doIczX4NE~eQPyzpyb9hkZdy{c;e+twHqen>}xFpP3x{*R17qnUjrcGb3}xp z@q~OoQ>qD&%Du>ioY`AP;%ZEr<}}BW&Q}h}Y<{eHQM?51c|@v#4I$xdjUnO0H!X$tOlV^D6|KvZ~bnANvJI z*|EyWw=cybE$PildPDa6lg~DX^fGwIxlh*kp=9@tM9 z%Jw{uha}-)CV=FEd`3P{kaVDHALQyy#=wM=>V0`zpw))M4H8@4zh5fB542M-_!$Ja z8>Wy?iqrv^)lqZ=dP^LGLW5wmYPh_!Iy^n5qBaP@zS*2pmn+ami57)_FA>??V2|Id zd&_F6J+BYlD{{K|GBQ83ZRByhKqSJ?+XM)YhqO2YSN|vK`!8-B^GXi|{?iFO9$}9s zIE#fZ$o`ARKh!42*rZEv_2~+IHwUyrgdYiGk+~C;X+OU|kbS11_K=jGaVi>IEVXS+ z>yrdX@!ih%ryWQ+AAIRyTyXvx0-@~LK z=ib9n9QOtCE{2n)SGYGBo;&i^`m&L&1e%I>HCz_`-dKvEWA*1CxB#GPfN&|%FB`SM zJlW-S3)*eJ4AGMRQ=YwOzmwuDR&1E^wYi;x9Uqe1TVC%zc!7HSSHCf%v)IEUnXx1Y z;J;d|EvzIalT??8pWY2?x34HV+|5`ejkw(y=uX9_GZrrvMCMf?f1^!Tlzd?LEEHDu zv%^n^%*(xKHcfn*#Xq*si1D6it_e?_N3_^9ynD3**JS8h(ae=(Z9{H+qKV-6p$3fO z`C;tlXVRTgxv#kOX;uOiNXRc>=!Pc}ispCGw*5k>t>uLt=hT&5ty zuC^vF^xk*(G^=|QF-a`pl z^sR+;!2-Ut24}mc)y=SYGLR2tZ>;$|i?E99XOEdMX*sMiyUHIusd*|umWzlS>XfYL5{0sudCzaK!$WY z;OcuTOiF&6-=9O-L4QpuzEoOZ1X{o}EVo*roKqB@c2?1wj)Zz?Ebgo`ihFu{Z3&6k zM6jLFV2{{}fbk4wf=8L)s6E0HU#4gCIft<#BM(WwnX{_?bJW^=SszlX{GK5fDRA1& zZ^2zkKTQsA62YwTpTEC&8;Of8#-gck}S^;7yWxxa8m?nDY5dcFficPBpl2 za1GNNi~9MUZ4lSJWQDlKbA5eX9b-P;cv=$c?@Q|T@V z16ZG>W$LjTM4t(hDxf>%5$j9gHV$4-yLMPb3GZNeEL-QH>ph&^;0M{`K~XLeJj^%v zBT|hPz~xW`?qD`xnvWpYRA->cdUoiM;(ED54*1SLVvWc(ktu|{MgwW9QHacpD}gH( z1YU1njP6gUynX{pkm>9KePxvxUxG`2%$Nk+_D-?H?nGZ^rzDlxT7&8P?pb%RM4S@3 zc*f{K4mRKP;Cb!s;SHhv5y0tG|@ebCBL=?*EZlKs9xMXkZZ1PD#=e zB{_2M>i)x+MIZYwn<&<0PgdzSCq|F0NKLs(yUIjPGb!PiL9Pv!Gt-mve43kP+v`U_ z+GJhavDCJY1IpwOrKk+-5$d;^Bhd1fqbJ~rWQIruHzwmvrYR^;S5a=50m1>{vxc`7@XErcY z+;#T6W=AG=d+oi$`@zXnp!`*CHFjJ2i`9b%uEEl@_xC~JAxS`iCCDeq9E`PGsPfW( zo_NV}DeJxD34yzcgi(}AUx?ZcCTlAC)4-x@a%?4g*3G-~v;Zk``mb}BFqU`8Y=kZ@ z8Thuo$t@l3h|quQSB{rrsZXBGR3&M>M6LNFaA)h=j5vw) za$ZY&BQ`3q5p#@JumAppx$C}Pdt9_oe&aRDT(4?(#h&6U^fM^pmjc#jBDIk0x@{$T z=cU2s8TR6ysnMGrey?YD33GZ@G2S&pi|S}5N7^J5q=D}H;gBaQTBYSjJ-@+>NsDyy zw==Wx?`6KZ&6?UgZfwU&sCa|W8q{{=lNsM5Jpj5BsB)z*6utonqI>0|VDviBwl5Ix zqU86s+LlF+FmTjoeme&8v-K3Qez<|vx^--65g&~*yV zq@8&ygO6Yv{xg;-mhMN3c;IAJ9u-E0*4wr6QO|;gxldMtq+1k*=p%KZR6-MdBw2bJ z!UAAd-4kQ`yISTR3=Lhx_X)h6Q+D$F7%s?;&=7r-N`Kz<%D&~@Qkgisl14(3uwuS{ zM;OzN4!+6A@yNlvF}dbM>_|m-JCnIW`-?gH)80O=JHwZN$f*es_!LZPgHlAp{8`8Z z(VrNE(GoilvKcFsqJ(194lKY~^+>ak{+H!SIHE{N`OKbFA8U)OXCVsDIrcq0Hv%8> zH5HJQR_RF|Xi|HOKJq%F0oedCJt5>^Y1pMILKcg?5ow@cXjJ-TTFx5*`Dabs48xt)VzMf8-PruK-*V1xpFP|@^ zp_!X4c|?<#=9x*`>`DN$h9){}{x;L!uEnMH#nAQ|z5Dz}ASF^=>Q`2AR^btQ6b$Kp z`R6E%-%|ot@)X9I#9K$941vpB-}RvMy643f>^D{pnzV22;`zD{2-;~T_KkgoK!&N` z8`L}u7xkW*U&j7hzZh4jZS)zDd!xK}H03DKJM`z-8cN_i(yk@3ZAST>8I{J-YdY6% z(&jo{P$8*g)izUfBlQxubPRi<`J7$~V+DDZ`=sOXV7RF2UcC=Z@{porVLe^JU z*j9kBPLJx*g)p>&tyaHM`3gvGQ%u&XmK>@#3~pu24V`apJ{E54hS`oFH?bFqN89)J z0!Lx7t30fJAR`D`gOh948SP%`lbQCXk?~e}e@IMabJjZPDuo=>w%xo z5rW5x#O^uR+taq>0Q>%eXAJXyrN@&!#sSXOdA4qM40_bJ#nQn47;sSTIxa0oYmNQnDI>^s&J`v z-Z@DEP#WEG z+7aa0^&rHTI7PNT6&P*AEgF>$fON(KBd%Jx`9Ytae)wSZ2+f+c zsTLqGIqSG4tT3?rPkPaYv!U#i=HsJMTK*ViV+L~H$o$*mly}{MhAgIY#(a{ zPMtSpcrxzW!r?Ph&$hUM%Q;OYV|aDSPTT2zEQEbqxxp16Q{x?!68Hjw;w6+-K1BQ5 zjNleX3@fLgiG_0#gPsSdH?#~Y`4W_*jg|^yfaAI0IbT>`O+x(Ch_wR;7F+Uy6+XAN zwnXY`IhY}dj9G-L0(7cd8Z!nsyMIUN^?))+P*>iccTF0-Ce;NXag`{mbi zVH$QN?oGGc=<*4_ltb6Y6h@6vY9g!+dle!K;-TseZbhr{QzyrUW1shu=?p0G?lIqf zxfBv~-WoIb(h_FV$xP^6gzIDPaXDk*1Tiv4!3DXEPs@8p2)6*V+cV8toULm?4|vZBRS(Y`U~+l zu_@>wBDq(|R!k>2WNM9_(q3#j)Z4~IHM#{1 zt#W}V**0}g+pPgpVp6Wb0fpA0pUYI@#I#hP!yPM|)M(vV9!j5HBeBCBf&@QasF{G) z@Wknr&!q}@;vPXqS_Grtbb{+V4f80%pc#fz5Nkmb76wzrg&zp2gj%&)7ZjuAO4dI# zx)U*|gzhdMsSK;~6f9x69WKPYqI+(0d!IpL?m^y>uJYm=YS?$%-SL?-fML`AIg&@N ztD_PyX$%NP9-;4U;Y<9j?yA29-96)p;19P(bMO_Qqjrc<^+YRJbbu6{H(B%G~-~|2~bRRnjtZY5IejX1?$9ji3UCirEa?6ehy}S;(h9C%xyZ(GU3NE-+Dq z>ik)uhN4_>Bl54!E#9`{209P;(;r2>T3((SnY%9~!cZ@UBR`&n&+!mKA_H%<4dKx~ z5wsvU1!#X_Kx|=PLK5_Uz!|v&Q6UdPibZzb``58icJ=oYdag?6n-IuKm&0FKIDH$Q zKSXqb*gz3AJ4gC100-Z_a9(CAzXHX=zDn7A?-*~HjPZ~e%x_l68anTmRTIxK`L6a4 zxV`FSfh!M z(>$)cpb+09ZqNW#JcG~wBy$ZmVcSK!inV{bp>C;wzPd=YUyi!QtoGj#p9gj(iqpEm zhn)Zv&g$Z7mbDdGZ9ijQS1dp_mr|XY|J>l!_z=!8&kP(7O`$QZ(&J?S$KcU)B1a?q zcjXXa0MJY#Xr}#$3M`Mtw+M+g`u(gAnofq}$Xg=FN~0$*)Ym~F(Otku$yVAZ{r>%xp*|C*t|`rp+1%S%HTrisB7%p4IeC zp0yTU82c_7l&-E@axhEoylDxW2Y}*f4tZmE%s-1XRT2Y>8*T zfU`<0FWMlpE8{8XD)leI7koswgpKrxDN+8w?LZY)e0_{Hm&r}oLK;2*S6e#TQmlS+)Bh%55 z_DrK@2sRxH8=0WPv_-|zKpRJ81!$W8(2S$gM7>ZAhe_j@YTkEJl1GCyyQv~cKG93@ z0v<;MuKB2!YYyk_yT@!#Dm!ME))LOd`zlSjH`INmhn|a1Ik=mEMh-$SpwVELxDJ55 zVCOJ12A`K&a|`{fNJ~SjleyqQ_sKR3$671hjrFU=4eDu)D1&K^3SDL!NAX1I+R0yN zM8msPCr()6$z@jzrpHd-Mf^n&x0zA}^>)1{n#;xu2R;6d60D3zTsHJ4kKFZyliNf= zttA`}(nseJ5%D90WM99?R*8SaQM49{agPXI5Rw zz0?JZ4?7?kt`N~%50{+cv0(1vw*9zT23rPpU6>0dk<=gce=0NGaH}sA1Y1<1>i(%K z1k$He_ki>5DB7MYK^cJ6D7TRl2BtyQqPnIt0DIMS8VG#jrx*?{+$hhpkjSae*2CJ% zNAJB~ogZLgK&vex?!b zC0g6 zJ3vp7Wf##09*Vww-linlXTP=;R1#75C@h%GQ1bhIkmpU7P8QZXS4t*pS`u6hXw-Gr ztB}a8XXmUxa1l$KXZTMjXPrx@5N>)WMV#p`Pu&HR6F%m)AVqO3pINiA4q?BB#i>(w z!z7BC^<>#g1Wky1r}ed+Rgb7zy zk-SmO8$b9kC3B{vZ1V(ZMjsxzULJPqF%bu91!8j>%3Z%su0 z92Aw4x{y)CH5@Y@s&Af+NC9-_3P@%sTdA;bGzk?t`%p;uR= z+ALHHKJhNJA^`%pK>g2YZP))fPabbcU86WhZ?xu&X~^O9 zYaL^333`l|oQ^Ky0`9Y24Y1`ioZVQqG*|3t?oB3gPP;`Nh+TKcK>PXuLRt0>+e8cO zvQ|-8ch1&SgzZ+ub0n;oYPPDjMLSgqni637$t&)#19d49u-oaj>#3X6{!*?%Z=HgAGqSaEba>C2*LPC!4qArm6l@~h- zao3MjFxFfeey}GujzIvsQf;>cQ)LqTPl&GdNfHR3etkf@$Mm$%y81Br;wXXakO9di z@kmT(hy}ohPTqi9^8N37;|ybs5^!p$c-qpP(82`x;$(Xer)ylBRF1)vDOTDy0-C{Z z0OZ^YZCIGiQxM-1LuW8@Ju0)PM-pCJZkPWeR$3}#P1X>40x-rt4QT!w&g*9e6tr7* zUSkM?9JJMHopr8s{fPh z#?8>o1Om_;oY*6(psMz;nY0j+^Yj{RMCwvc=3guRoFZ{_cnok6qLCs>%VKb+} zeM;pj>Y6W|7$qykg;qD2pYq^3fvCdZ34(sN7qG`^1yiFR!|u^B`8-Rb)a#ywe zspxw!t5FxRttweVZ1I58uTVsH406AdbQb9kJq=~Zw3Z9{Ee}GEht>;zqoknoe5_AI zn^^^l7K*y(tcu4hkyM+GuJq7u);2;D0FWq9hN>o5@78Q-6_9t(Nm0LKX1XDn8;h-^ zo=MACz5f7yahCo&@oON*o^?(uFio`44$Cy=dz0=lB>MoB(y>PRX|XrC`L_5zEOv+(+_$CtEf2s>uO7 zn8X}F)(r)~SPD#IyqBDJ#tGrd;3Fu6G5OJ_4&ecJ`gN`oa*D0<8$S@+#AwmxMRrC= zD_C>Xo76-R_jR{hE~wNjYkDkCN@SleL>+gyJa_FOpW_7jTVo3RZEY;|ix(ma7vbZ@ zt46Q+`~->aB_vc4o{e$M*~S_b9ks-7bcE(PF$shkIPzYvgo8Wu+$|VZ5020X1{Q|Xgn;XkZ6Ek(ox@9$ z3*FA?QR#QknIaQrNS13UHKP=Ak3xJmi&phVV$TP`^1UbfpD&O^BDB^B@@T1?5byEE zDS@I@mZbY;6~r1O!(vt4NdVc89@d$9iRvq(N~hA3!b~`WLS6|ZyH=H^Hn3RStc;<( z4l@8_?-`|T=jn4|&bz2ft3Kiyszm#UJ!liTAaK%-x<>61nFZ6&!)3qjMAS#--s)~3 z{dK**MCP*aCii-6@q1&C7@tI(OBb{bO&x=ay!M=ApG zTDRn(C$&^lceco^SGnQbDx1Q2Lnd{OBBx`y|uVq2>5W;kPnpX2o2uFZdxI7!^}dZ~i; z!Ukc0{fo>iAMCV1V=3ZxEx9&)#lQxpCsHsGbG8H10YRHr)#hYu0$%XCa zd9Bu>^J>s-Ky}j_$Bw#?Sv3QYc)s91w8K2==0bV~8NAny%kk)wk*vu7aX5o32jQ$s zuTXSYb$)Vsi;-?B^4+{msW5;K#pKkPgI)5Cao7pb7JCH3a6b9MXr6%dYzxuWOv@Oy zf`L-h>E6o+6q}i>TEDs{Yd!~vhM62S6|*elKoI3<25%T^S!i&Vky@TYsQt|rf0k@s ze-f|_*+vS@I1}Khi+MhK2usx>Vl_6MT;_X|Cu?`#6AP-+NWxnBUa7*+wtjWe&6~`u zQ}5rUcJoQ$Z$F|ZZ0Bf$849n;QfhM@zT$}E2$ODjd_@$*J$d^sZ;IU??|-T_@s9qx zBfIq0`l=KqBZ`B07!1LQPK+Ubl}JQczAt6{PH}zaK?U7bka$nDm$VCXWE%@0F%e(h zw}MuRtd-mB6xw^CynZt@J(u5W{y2N+IOsYY!{N1ok8E#Sqi5I+9`z^OmgiJCK)rj} zy_xcD{yC~kO%?M4H7jkRLdUPzgYi5pJa)Hvp8K^7rhuj0v<>zS<%Ef5yd)b<1U7(k zNKxfiv9DQfCuw4{bt$;0om5B``gKP5EL-hiuG-(P>t)$i&9q1Yk^DiHzaWU7zuGD* z2O;*eq`{Opf=uQO4>qDoNKWmg?JfKje+8f!x?QcnJeu=mEvf7%xHWi?y`z=qxVxpvpTzUWvNLfW$$n(&iTh>HKI=XScFP_Z z*YFOOCn!C!hW$&o+bMd&+94N}^2QsVRsG$k+Yk`a#LoI>2k(PD*%QQc;PuS&E)L0V zC_3YqelwUNx@({_rvdWB6h3lt2HW#mb00|kPspMrCp!sx`HVyN_gl6x0sBpS7oMLN z#Eq8hl;dK&@bvl{0#`1h3VKtC_?o`;li<08JqJHkvMc`l`kbre$Zi_b(p*%CGA6bs zWs`BgP52}X+PSDa@w3mXgCAKp$aK^UhoD(_&uzC&rV$M|^IJM--sk}{VxptV#aq>#r zw-7bjOY#`XPVCk#yu?ULWcSEnT7B+DQEdrS9xR*$r@#&WpO3FVECxUc&{l_nPOE7urY%On z`G661G{6K9j=#(gO-q9}Lr<}zM*Pjwvf8{kv%wYW!!arrqvq0SFgWI)3n8{~?;I6?|57&P?ZISQrd!BP z#V<7hkD{CRunkb@e}AF|CXABXRjbM(;Ue#SpouEW8yvBjnBi>C;~nzq;~<-gMc_~_ zlc>qlG~}Bu`aLFgjkI(m(2nEE3atoOY0EZsXA~4S#kogW3Jgab^gn+|l}GPWsA4SH zB?yq5>|4()8Ai$6w?SYb3JD@EZ=FrApn7W9#OA!Uw^#_NEf9vi;{-hlzKCA=kyO~O{3h5D*+F#?$>MUV0lTmeCs zwrUtn`S+)CJ}@}83!~ARYgYM$2J@^KQl_w3MI)>>EU|sa_-H2^xsH5DC9ZY-YFBCc z$08JQVNH<7)OK6GZ#WqLqJ%<8UG8a+x~UY%M0mVt5t%)RsoP+>%|N;0y>* ztk%|NT)J`&6ak;6ws3PssDGAKRN7AHNvC&*KKEJ|>K+~c#pT90F}fj6DV;6R+4%Ph zlf^2yv77cu3S6{8lZZ5L<4uBR^TyGAeEhT{=>31}---hS56WG;uP<5mdd3Da zc#TFI7}fgv-3BGBp62hX`+Q7Wos^$C;_RkuM${)wtBZgi+@WO~elvF8+wxwk{or`F z;rRNGJYby}*EA2%*Ou!+%hXvVrdyPJ^+hZ=NjwlgZgmInmtcCd-XR5P11R2W>=fV9 zC-R=>+F!)-jH2w!!xnh%frGekb3zt9?Ws&;Q6P5GlLxvshqOi+Sr%O}v33xLj_!ww zb<*2W zKr?Q~c)XA!rUw4Xny4m4l1x-u#6RW37)F)JM{CC>&5*!gTxVnu#yZT{h%>fG%A6+* zOAujzG|V=Ui@&D}1Ga9yE@SK37iXnN*mrl9ouSADsUuvb|8dOeM&R1=EbK5jW^j5I z9);TCWPf1QLg1G7)}l*NI+G_?wCe;L-1afoFr{lXC+8vGWVGmocLrmqg8Flndk|m!QaWC;zxO|refsSUd_%%t*6p9+r+X8%g|dbfA3_R) zeS%&K2#AQ-9!v}31^uc1rx{s=4;6>TpiGxwG_$nL!t%eiVThLl8i$HpXcH~(%Ssa= zfBn6dz_)t}dE%m^_Z1(HZ5L5PO+I6L6-3=@|D&re<-RaDz|*&YMC?3IOH7uSFXAcE zk;qQ-E(?_{JGT*p;@yO_wszJPLay!3gHrFEt@Y|04Pr(AsrMdx>OLB(x+rG@3@A;d zP$A}-0ix-kf2xPRck;}?xH%FSo96c&)vB>ZC!I(lw0WPdk_Q;@6pR?C4G7E4BveMb zB(_ORG~3JipqD*R|IPpgHOPMdB|mdmg}Nzx=gy0y7QU!Q1@^^OT8z#)cU-G~P`loF zQw>bG)n)oleyiAXz0R~~@{eB^kS`116m^cgvwafgZ4Fi{i(J+m6yIkGKuR|G$VnIM zSaY~l%nF*UGKYLN6C)4jnDo4U1$B5c*Cx#^a*2HnMr|Qn;|(UuY?73!daOr+hPGX7 zsJef-RV{t7!|avWS2vE_S3RR=I}m}UM9J>Sa}k2koYP?V@;}`pT+U@1S#)Nf&Q$um zgZSaxhA8+MVD`X+IxzHw^3+cRh-va2%b)ZVKOb!tvz3Yz{iLBo4q~`67KV^xub1X` z0f0jqb@awrmaH2A%?|oo{tJL>^4S#*kh}&iV%lS$k%E@y zhML%32?n^FMnb(`SV`m-EKvO$v)g_@>?S;U=hb{`_C@glP<>0M@X78Oc0uvW+1A%4 zr8vIo8kcV(F~M+y*e6tGnzepnqp9B5FI>#L=5OSXeZAWj@My&q_Ql0dpmsaN%C4Y| zch%AW5{*Q`vGpK&Ft5v$L1<6CZwcb2|DMN+!~1khy9Iqlojeyg7O!RJ6h~rHH6yJ- zWl|D5SVl^-vQ0S@sc#TwXlDrPA9;ZzONP!-kf(q})jGc><3INYX~ds;Yb~H6|6FgN z(ZtPntz)kUxw&bQ$2QlB$aX7OCc8pWypc=Xo4JjDEJZ+Jt#UGKYoqrO=v12mC&Q*J zcnov?Ivw;IG!X7_rTier_xGCISBI?%z{s3b>Bb^TV}s7}zzsZ3GT&YnYf|DeUY^A^ zdXWm@V!i$0KkPzpw%dDQO9|n|UPWkoPSY3=(0&rfGqQ5(`EJNZRCZhI!85uIty=)d z<073R=s%mtScM5hF_n79ue-P9W%!DjcHWUFD$_#_s?QiR7fxTL5~K|WBXf4Iq`WaF zX>WnUr?>PA=;qxAX=a;a99A5Qc9=v8>}%k?jy#~o47H6O%aqX=Fa^xmi~<94GJ@@D zK%PWIJ{PGOdQfG&7V%oHXQ{}MZKH4jAv98$jg`WY)$d?*!fbuCi7l9@0Y6W!3H*>M z9wvVV10R6aE#P3#3$9(=Akt0Od3Eh5|Lq~tav8S#Y*-U~Z3Gj4ml_Gg)l<7Hv}Fun zmKLd=(#unMGZ_KPmjJ=`GxahYf$aW`$EjA2(2`=vy-@)6CiqruYiq4N& z1aURCd+#7hNQJw;^bTv^c%mq(2?eRBi%>wS5~ogZ`Q9 zu@ABPGDE}LJNn_hRXFQDwCPhPJiNe9aaYcA^@rxUN*FNtt1vIk)`FT3L%zQ(mW2Tb0LdE8A6 zv{z`d((2ctuQqZw*P?A{6yJruZ%w(rEgxh4E<;aUz-6Gc?j5EmZ}k0stS6U!`!{!{ zqsc{eFc{h;-YF3{e=o;?x0lIzyqTcd4ZX-+((J&LOvBMJ>&p)k-VWf$6dqD3@=I zjeV01*NT2S*}g2;f-)-$yuNk6#1(Vjz!h<1S?1a3JE(EwKh(#ST&^V=;+YXoTlst zD9h%a`>a9;Lz97qCcz*hn%8TC6evNkCYv%HIa&vDE^Hqq>cn`IuLr*J=azQaa~^`+xxuKVV7>J5Zi@j;sN^vpf&Rww&z~56`hOlXR~Bf|T(Z zQ-Co6BzNEn1xwan8`=asaDWPd7!HzLrr1HF*DnL;p!oBg3}HJ<==4I`I10b3u8>m( z;a$Dzh)vjpEE7FOd%<3Vq%$SIS{I#*bSK$O~tpDz^Nmr%4 zcS;cZYXoy!U*&AZ+f7cCInI^D3;L0OZ!u?}>b3~Ui?m{P{T?S&TJu$a+uz9~HunM< z?h91=L0_Es}FURuna{9Nf%dFhRD6Z5bfRLa3sH5dzPx!B{Y|GG4EyKpmIs0UHHkiW@Fa?jcN5Y<<~<=YjPHk?pRS&u&z*h0E?l*mE?brADwE zAlAjyac5^$=MX2nXBAB#QpuQ0Sw;+g^K1p$R6xXgkSdsTYV%vfV0g+%f41SL{7*@* z3Vk+Gx~X;h=*VV1F9{^04@C{0vQmpOf__Nx+HlI6CmK)UvbLQ=lud;jme|E*3;4F_ zU_TkaFR}o9kwRYlT?nZ`;4Yv#c)hIT=z%7P!XY^o6HAuA6K_@iU-U1(-WBG#LKk}A zcy)0_2EuhkOH}T?92P&N5?Vn z2Q6LrSqY=<$+(GIfC(PDTnJzQvJX0hyO&XGNOhmY{T9{1c8Nj~RUGa01#bD2>VE#3 z`YgbUv47XL5+yZlx%?3j3Z$2I50Rs)HFnf-|K68w>N6R!)Cw`z782VRY@Et@4-2vz(KQ z{6ar1`zx&2$~c@>a0yFbaf%p~@xwD`Pw~@{y(@Ez+ah!BcC<&cbeUq@$`MU?o^HP- zOX-Qjiz7eg;&nf>TV23o^9WPRb!X z^E+bAZ}CKsyXo{gX4HBKG7j^3hZn202=JiDfaWGz%9QRd(Ipgd3>QeQ$LF-yp)GYd z%=|V*+MJ&amIX36)+l1JDKMzOHj_5p|4vRoY1MoEzDwBej|mfB789T5^N*^1$4Y@v z#2uYY%q5xoh3Du>a-vXQ0Zw{cmBO;PZRt4rX$j}7}B!RPy;J2WRO(Z zcJdj9O{dfU?c75QrKwySv#@*37u~JIQ-s6HI5ooP5f?J z+MhQq_M-}qJG1`gVV;JAY8%r~EQaB+PBBjOGlUwuH|*hVz^8C4$WWx8Q0I1OogVsq zS#w!B_nF1sM-;?a)DuI?ZR-joyd4W?=-X1u&t;u?WcLhVZo%-}74_7FRn*#Ix|4HM zkaEdyD8f6$%{YvrGMd%~h+|@@%#5h(W;O4x&OHljxbU8U3TF7yUzti=%VT*)RW8R6 z!6wi5qq;vYVJHvS%1}m3A z4P!VRVU2i|6Cw%+N>*39DH)f1ghb2IxllP~I0#LZDLCZ%VjdHA7$;4>+4hX0W}uMT z*+gP*)ry%l6}hYHb8Hi*Q(VSk##^pe<09WyTe2RHmC0tuQO-)+ki{ES7t}H&sbl-} zRvSAUCL9x5903p(QrP|=Z(Mz2Xt$Wx+W^N?MbJ5b0C4a%7}9nQ1bKWLQS!U*OwwoM zIRHIC!oMXyOZq&r7-ux)PmKPw-V-5|J9H*KAvR#~{t?niLGln$!F$4oZ;=DZfUtCu z3yVZ(Xv7_aIxzIqXb}PY6PFOxA1*&BFkW8eLfhGY!<9tVf@XnbRPWJ(+54J0V5!h_ z%vh&uW&l)zrg_ejiyD!fS#NgS?eGfFr8tAl0$|RUDry>j-(&NawrqomBIIr%M|XN0 z`~-|2Ww;qm%Yr`KUY)lbK*KZ?M{$3jfph~C8C;|eC0>3aNj1enkQ5v#cF|-l>r1J7 z$Z1@n)znRQDH|1gBWo>%yt^~cJpvUeaT==v2zy*295HztRUB{^XHXWOR~%qvzWHM$ z!#~*b<-8qo=`F%FHzcs}JuTkt&a>fkk63%Syqpye`|r$0cUJOA&M-SmdCg7TC78EA z$=`C8Ecx}+X$ioSP5)H={&5V@6w$>3E@@fnaj`+vD$R$s0Tc3=JL1KY+F3t!X>Lx= zkV4Q9ss{XB?_3?WkRXIk_z5rek{22h{+SJfma)}|gn-MEuAvCErj}-xuK0(bi)G1V z=}nJcL2)ECQJd)w&fW+he-lXALmP)*#FI3&nMJ|$!W`kR6GIzgW3|52Zu`MTUQN@8 zDiZE)&K9O7&NXLlNb$_7XG32_(juR)wxiNpp z{XseB!3g%98z%PquWQPOO1x`0UXXpFvKcu#G5kQdZVLu5a})C~C&@3Pe7s~r)#STP zKLfMO{2XlCr7|HEpm&P%C@E~hiL6aGW5UV>h}MIcTq-!1thD(X}Rl2&$D_X&TF2ekpxzGuvI{DlaYGk|+@37=>^_`C$YU0MG zU5d%&Jrx*#C@E^GjftruUHx1mx9EYARq`5QYzi%yBCQ$?5{m}yM?_GnKN0&2Y?&gH z^NqBiQxOB&cw9t7Z@opZD90%6-qm2}E|ywvFgC_+K#32mb|!dEWyPdoXCxvKkB8}u zV$2He+TG!?)t3xppj(O#GlkS}ttG|>cpK2%EHqd_3}F57#B67}&*h}`M2zGM?GJB7 ze+ag0wgpg3O}PzatA~gY2T_^cC#h$wNqn(WGQd)3B;6OvyBKWOvW*A!rAC{CGV%F5 z`~a%VPAq)S%h1eB6jD^h>>L`ei{pNbfXh9Rrhvtwm64k*J-SU{f@Rdm&> zRL;~RazM96*g( zDwWNcJ4;1BIH3HC`PeBqLr|{B=+`5f;|E_G%7)WDn0uBSPE$q&g)iM)9}P#J2V-$; zs@N;Vfj&A#MPs*-7IpYS777qkV$>)a{hq|(6XeYzC2zrnnr=GnBR%lJTZn;ymuzuz ztQzXX6L_qJ`(7+U^cO0<%wA<8q^nlYf9CAbb5M`wSsn&3G5u5^-Eg3kJSxE0G~nb>D49>nP=5vbvu(M=Hoc+47)r!m-5kzg$__%2~T9Z>><)sUS9DU zNp+o#5_-Xnq;MQriPk3!@91 zTkuCujrYRJl{RH)vN)5xZzW~kkTtQlhpzM(9{xG}R>{jSmuYc^G$C zJuE)lvIZ<rR8My&hd)3QSsXt*?L7+^qH_|@QNR#0 zpXQuN(}Yadr>fT$shUnZ^VIv(-?<(~4Ash{e63mSS6|?tbNWkbIPTb#=3`xsJbjR+ zguZ1XJHZ^WDxVbQ*3LUyV&+JQ*@@ZmvY~OzGB=gPZVtsEib3)fQ|ZL#jvu3_Xb3x} z^}Zix>@xPZcQ{pT^L_bDep*XfzUd9|M0%G@4V+F*P7wUdfJ!j#@C872Z~1tG->jAt z)&;wyGaHw^FI{n0OOLhyg_3n{Q#dtcuCB9l!$vN05VjpF_eK-WhX2R{%I$Ez>s)GG zf%TTxcTLpAeqCqF3pt3=XFZ69uf-VM^!Z=ZG#MZ(-`PuwMjM>S;vsBSDPK1j5hhx4 zA-4hm#qedQV;GD7H@+Y;ZxS25$gHw}Q+Y9WSt_*_Jg(=Tv2`#1Rn zB;sPN<+Zp}s)kQnq#0%-k(ZdF=`HXeuWXB~UGcIB{>~eOXFB#v8=}GZ z8yCve5nsH=t$roOB?UD}Fov>?5c(z#ergJ>vy&muJjJR}CYez^@8z3GR-bBwY+qXjHSoe_&s4dfN{5@T%m(H!IYk^h{Ny$$EN! zBYgFAwzcIOhx%^sEdIz80@-Rpx*sot+Lok`x9=rCaBba(dF=8CJ3qBjw;_uFPVsi? zTjri=dLU&^bPL=4iI(xt-Hod-0iOvR@n9O13i_{9oQ61DIjbuZ&q82?6l1}zyv86r zuEVqXH}IkaoxUJ4ADb8TpB_Rjx0%K0(pS6bvyfX8l@Q~1k*f55Cf=nRg6dDn!~s~N z-oLqK<-85sssev_FKrRgnY<87m@78K<=ndby1)kTjO;hm8XrJp7@w7TXPksxBZU zHRZFUAtSWMmNpbDgc3vp+B&T@3JRAR0TZaNMp(vYnT(UmZZ~BZ8mA~NmpB_i1&{ha zgCHA$>*?Th_ZR|vZ04+8m-fHz6qi4m!~_zj7_p&;GB??%SWKwedUxgzWrUQANsJrW z&>1QCNp>zfhx=O}d-v{c&ab+zY0yktlW5#@QyzM%gyyASJ0yuFyXc1_VOXPi_SJbA z9{j&anDw(n1;$+-IIHkbuJgOu!bgfrBIGP*t3W$8d>vT)?(r!aa;sI=z@ngiR3;S< zYAxd6nw=Z2!Lkz5QgCyPb@tn+eg7ZI<=i~iIsFJiYb&`n=3xz9MeV;Ked!tWc=aG@ zol+F!3r4O=OA$GoTLUVSKk2<-y&cVbHeNXHHNdu7w0HF>=LfYDEQ_NHOlN0-)AmV2Vl$1I*tTTCNNtg{ISD&XCK zdBjgO4;_Mii<}2-IrpMJ{q(-4F_I=mX}TiG@G$x z?bp|=gpmE>Z0)?hgV0Fi77qm`{QUMlN%Nc}vC5LRu&B6FJRKT45;|$r(LFWu{|g?+ zJCobYL$Z&aHa!*EL$WARqGOmIp_{a-E1wHNN!XjLEmy1!ggqMB7KO#6McHU#dD{(* zn1H~a@I)R`TwL&2BWWj^<}W9@;Rv|Z50?RUB|@2Bl)(R^4o*wV-S&x8s+LO``^eeI z5b+eDOWH>7EMf7k@C}qS+b;f1-26&BEnY*yzSecbi-m_n=gtl+UeO-j{mZBht3!EgNRO`7wpTJmsGV| zoH3o@no42Eip?$_sC}4JfA%#}+Z7gnlBo@v+>xB8Vh;vy6YX)CrOr#JZ3|(<6&s>D zf6w1gnQhCM7!aa8ptLdJ6>9VzZ!GGtzhy!~)}1N=AZm5n!!rkKo-5ZAdn*EkTgY%h zGyr!hW{WgTMa@PJYr+)*l%SKv!Pt}P-4hH~v)&>fnNaiahn9kq2QfMngF3qOs zFt*fZBRVZ#b@Gb~4qHg%H|pO`VHt9Wyv9_(w*K1BirqyySalA6Ya9`{OZO4VY5U&? z`ZXv^G_mywrkch}zrl5%GOMd)g0xO^5-GSN z1u2hx=1y|>xw4fSqtoh0H=UP`wYm?N;4eX)NWeR2AF1|Dkx5ZO$J;V58C9)+)05VL-KGW$d@p%&?GS2SpY5pDoadnp$v}It>#_mx~$ugbRRM2(mCe_ zVu<_v5YK0jB@o)OH$df%)N|2JMneXMwAe%oc55e@rxrLur$n4eKkL~1Ty{dH0@|?U zs2%;G|Cp??y|b~EsMhOo>F1{-CZHpa{U%JM!y+S`k7;`hv0wesL|YF=8Ve9ylf-CO z!Yo`D95k87ooHAB2O-iDV4H`zLoG!j@s=v+&Y4Znp(j`HcH6fwpLG(Yg{d2|)L3N--L;fWmM;SPgZEvLar>6*m-?rcI^_u1-EboTUB zLYK%Avp_cvHz5c5R54Etu#1@`!6`M>NyF?TJUn6=)Di6M4&F^a=bS`9T z34i*8ep8rxUi>2V4X<@Yn)P8K>N&Vtv0a+{_gmxGmbsbgZWa8NsBRx{zUCc>yyQC0 zU8p|d5vsRuF@^K=f?5^lC{txJ zR;Iamw}!V|V^Kob3b%v{ZZl%j3Tv%G<;&n(f}lm!4pBE9Pd;}wZ+L|i)YcWHGqmUT z9Su5KhFkp|e;%`>*V8@6Oeoq&+-V=7z2b8Is6Td)VStYSTLaD2vcmJ6(2(ucsj*jXb{gqbbvW5 z(&mG7&um~urJ);XN139Y!tJW+^#l~YUD1PbhNQu(-f~d+Ame~2oKHGtJHkCIw$D$Qjb4)^ZLiUzqY1izZ4d&26|PB%Lxxznc4CV4Mk(HMQX<}-a$7QSNy4%m zud_o|pss{{cYd|GRZEj^SSJogD{F-n zot(&-<~9VXj51Q|Co5(AwSpul zx*qca=+LyXZu1|dnM5^((7s3ySwrp2go(89F|CquFaEOp$Rx{E$;6gy-p*Q(~~!kua8`3J?UM z*h|azabS__Bl>Eoc`*|?D0hXs(S&$CS{R;dI+T^)n1Bu;EKV6o*x+#4fc8_%X&#nj zYWE=F)=mzpa0<~&XxlHS(~AK+QXb4;vc%&5R`B8WfR_xkYZ64l!?zLC&LRI+?!w=< zT9N3ocQ77mNeaJ}9KRuH-NuxV~fzpZA^OSwX(;%EOw+4IaYdX5y;$3Eg5- zir{$}nYG*7O11*AR}c?biaP~7BfnQgm0Z{{PJ%FkS5?xIw054z)?-}$kwe)uE$b#y z1%;t6WsUNAnf|uL#eX^-JfHh8XI+)E;hH8=vt;WmddmA3o0Apc(eivl=$xM6#G;%5 zx$lKuE{o4Q<9A9ZV%!*d$-r7J&vd_`=>`mFTbK5N3 zZ&lX#4H4Yn*mTN#WzE5*PdW0Dy$}4ctP&RbUf+q!AQD~^C|y73CY!TD5SRq6{yFJZ zgsX9^#JvUsbpKT9OWiDvub@R*TIn~~W5-|UgU%JH$%X%B%PZ4>ImOMMwc_Wb)&UfFm3V}-Lq;~g>}q&F;O^2uv5 z2xuq)+{1$cp>>R_6aU($_`^Kv{_v{d8gqc^D7lcO`hsFROCNHZ5sP{kDl|dzs zF?#FJ#erZodkqoWvpn~N%tAKx@H*?2B622uy`#=!(S2jGw&coLn_+5(g{S zp5kkWs%|gFUWky*z=->*20erh0V*f8mn#+vZf*az+>`w-okG^LOWhz{pi^~wC0%-n zXv@07YOCm1Dm3>)%DyvHvn^%~_7P0$DWQ}@J#;O(XzV_y|GT2YRg<`;*lyoqIII^7 z?^A;+FbgLbJ(KQNCKx7IGm(4wshcfnkOboysha_lr5Nv|$xG4AHjD4!Uh1F)EaQ`) zh2wtRZGly78(3}6fBf#-DGTfmShV@?;sVh_MXfk(18Nnb5~9qij_*gOO$v)3ZBu%U zJ(~|(DBs|R#}P70(N4O8z||-w9LIS!Mp&Iqh?hIaT)kQQaUPBRb#3X zJ>4{M@6F@yW;9@2B~(hc{{#3B(kgk}`pA`4_Fbtac6oT>$cV~FRh5oNvH#S7xH%~v z!ch)V_r7}Ho1&8*KN*jGWGn+xYdDJl>Itw1Uv!C7!I)WA`O7RhLA#>kiHe*H-7|1e z@6TE&Iy%fkr@C7@*w$}8u0XbG8V3VY58woNg8wVK2`*Lgpwa4b9A%5~cgVDa7cI-| z)QEd^BY-2$gB)LteI)FT(mK3;(q=nTA+-bUeNAG`E`Ht*s3V(6?WK^;B$< z#}!(QAPD`YIMxi0VRT=ucsexNGEL}Rd(`qT#s%PdPJL^7xufjSx$_Q$z$O6_uSOOd z5?F&l;=ttU;W^;J&TL@U!BRMz$|upih^6m+kaq^t_*pc09WAw1!?}w!*bNWfb;7=d z`;SzoC9?$Y_xEPzEKQE8&IKmip~}@u(>)mx8rEC+_79X%fZ*UvUeuQM`?ltQ3;yEe z^~jiZFNcy; zTS=z}{%}v^gTALC{1}Y(zqrC=tezmaB``@u~F6_wVoNB z!^u^MS(HbZZ!W)5NqeiD;;Q1$lCrKx2**I!Z!^QpH@JrwKu`AU#|=i%*xei)8^L`c znDZJ3-^1ba@Y<#zvRaMmn2Jg>W>y6+uX*n)C-@=Yo0tH8Ja@Gr`aOl&M{yLAQ0f8u!^l^E%a` zm_yO1#U=bBJqOgS;#Tt;ALG+Jd$q6D3GKMd>n@(VsB+Ew58$KRte$~;urW5v87F$b zJErQBvN{XpAiK?JNYk-)y>WcQOJzF%)}8^$0@ObnH$!Fen>vlOY)LLfBebRrV7!Gu z8Oz~iF{X!C&!Z1L&rO!x;d;@+XrJncN2zu<0fQ5_tW7m|Im+)Y8#>q>{7Q%)bB=1l zld%w=S3c1c{s=m?QS_ZEJ>_dO^<_+Q$6hpSV7^jP-@nl2-4G&T%?kY7A+rc=xquw( z^-@{`>7@Hx!g(gOXOI1uw&C;u34Ac9ZBvb{zh&JWy2oKZC-|%cgYx)%)hXhWvQjeT z`8Y{3s@jF|(LcxdkZ9H2Tdm1;lDT#r5L4kwA`(9T@kidvUe3h{h#KXAF9jUei-}?k zpWb2}{FzEC#z-mr@WTN;z@1u0vgex03}58$g?uF#F_3}bHqycZd<^FYwybKX#0;6$ z%a{w!T3MnKqHa13tLE+J`)iZg>L_O4Kc9*nmUyWsWon48Vr{NgCZ(b}QqhAOTOVio z@COPL2g1^Fc{w4Ra``dJ%@%WMg?$uMn|;T9gxf8@I(RhSVqQ1)(E4idt$=dYqqjH~ zX1JijxX!utQ8$7hWexX!?ax?c&)Md5S<9(GqFZ|g3NK>^9OOeBi+=BFHxE@Ze=`N| zo)3JUPiy>4XsGfZ3tq|Tk2>%8`Po72J!;52Rk&#q1m8_x8*w&uKI0XZ$UKqHYLs;f zW2^k4lr)*3y(l3aj$oztFS9udwQrv-k3VfFIb21*S;~pM zB~z0|CE!m8v%)L9XgEx`=s&dErgj8D0j}B|Af%M^EX?6ZKMU{mvvU`Eu7)$bc74om z%iG30k8d8>bULG!P!_oUt)ZTiFpj1x*@%^T>M_ykeU+9-Bevu7#)T?&(bceH`i5$a zIN7zDUbjqn@g1X3m!;QLXU3g(L?Kzj4N_Pdh%?~KxYt+9(?kF$Xf(N7!60B^bRD$S z{ZV#}*{yZw%jN>5s@fCe=7P#aM^aq9f(@EJfJh3$?DN#>9Ov9D)Xm?eU0;mRE<~$i z=p-EJETyKG1mu!>%LVK=#HG`|LR`GysEA0EMkb+L*pU1OW@Tk(+8J7wH zPblQI4MRd3P0E@AQXsF^ja|keL(7;WL5SZ2+NpNqCIGtg1MfuL3SM7v#?R2Bx`}s| zB)g)6wJrvSD=i1hM=WT_ zqx;n6RhHbQ;VURM9)>UHlgq{R{73v!WoAA0!Nk#(bSER_CI6Ti)lQ|+(&(xhtk zTcKEa@?RI#K z$DN@})xJ|>xB>Q~)nMz(T!v!4=Fjf(YooGr2HcDx9$4-l-UZFN02v5?1czqwU;rDI z3pn*^X1sA_zXY;^tjdy`K)gTbZ3ts}o?>UqU?deotk?COH%iPpHb3q9EScOlw#XCf zmn1f|x}AQ7xg<1FY~+WvS*@C6EQHpSb79#Ij;uSzU17bW8JPkYV_u0^e3C!nK8QYZ3|bk0jE@Pe`fjTexidHSYKH`7lQ4fF}NniXO;)BEAoAL>JVShY~BleQ)9M5&%<|wBGr&@-Q zTu0J+>KDzJqWJJnf`W)rKrC)P*=oeVxctBkrY%)_o+21r4l8;jt}-}<$gs=wt5shC$;>XXpLzhqy@$xlAy@%?v{ z_E1j?cwGweT|;^Fw;W992!T=@Vk&R$Y&w2%#i9Czr9h0twY`) zILJ|;Cpj`mo7eZQ40o6bguq)H;^?B&2HYRoC3~z2Tm-uY?dagbUo{|BH)!e$r_U1~ z)%c8wNOiM@H`${aJGslropR}_B=#hsHo}5cOM!}#iFLV8P_=BtV?0VWs7qX!4nEXY z9dktZo_*L!&yg(-3#-3gsc$?_H;QB-C?3<`_IQE^;8u8nX12!^ncFQiEddq-U1O`pZ4BKwB|ZtMrh#L{Z8OYf`Rk{}Cg2Mx*;)$GKz#|7@TR>9%V{T- z8Nz7)Xu3hY4jWbhc-&GXiBhKH7RFA{Im#hnfs-U?_fJQPO+G!pIpbbhz1LiW>X$H< zz$PU=;H20e&?5I9)Y7zsji3oOXX+!$Q7>k{`)k+6xe`vZP3a=ubfu?1vh`uoqD2=u zx{-AsSv^&D9`}+pF9WMQdZLI_>IK1$T4utpmJkW#0g1Lez%YU-kouOafYRWdr-1?`|l9Cv1lm*rbPhn{q8#=!pW({;L}{B zdSG)bFq57>8!Qfs#|%@4H3du&MHKh!j%7#ahS7m0-|y&fGp z!iFo+eK@oaP@DovaZ>g46L`gvq0gn3TPFX}7(oD7I8GrjNRO6!lpa$UtvP9-izxB% zg^#6qrNPcbn>2aJa7e{1K%XO7#n(pUSI*f4@L~bV!@5ao)$|G=p3d8RU!=X|LL?nJ zpcBGl8Knnm(U`OFpuBUeka(aJZoP)Z*VTF0#Y39U_V);kFbZ4h)t=~ue#bQz>H3OK z|FyApcOcBd%Md&JNmgD;y{z*3P5dk{95@$cRZ-AIAHN3Th1B;7uRy&6l@je<<8CS! zxOaEH&t9Y|b~&--FOd|CE=DM$MqY7Boyk!U#_3TgVUA#&l)>yap12SLtk{9RS2^~d zK}??XvF-E*fr)-Fp1#1WwIDFv-fgn1zHa}OyHjAMN^0M?JENo$C1;6rTvpQevZ#F< zCLHpHEz)9p!WV!?Z+%)bK3Gg5Kgyy(jBZjgJ!d2~x%YS|+F*&K;{8$V-%d8ISRL+6 z8A4dTpJiudkdNCp%l5GIUL?{RR}ci`F|@mu$)wIH69I1IU{`OS!*my?d;B$&nHc&| zSOetGBtghJ=e%&5vs@6R3B_p`W(*u7vk}R^P7AQmaM}K9(J$<{IMNt`dnMhDfo%ey ztcek!C@f9sJ)BWsVCDtokxW(G^OCTj!kQLlazxnIJcKsKcj@~c;t^uDG#p zCeP{Xxpuiwg>H)@a{*x4OgEP)K1dWIr4gpc8^?1@W%N=8!V&?RS%3Or0|6GTU+v-> zSr|YbmB4MGM?@QsIMcA5h1vqms+J(0#8n&;tAZs!bNhiv9b&_U9-XzR6W!GBdVuBy!d`4sgP z&S1Jo15td-#X_vYTqR7a__>ncE+h9+8wK)#RiiJdRkeCQ2cVFXq+m-k+)hU{&3AK& zVNP5zL|uV%@QHw(ux^GzSWy?UNib?S(mw(9qlD#kLR%jBEC*bHx3QIM0B*F_f%?9%`W>?jx8OMFq&a$$$ zzp+G*?fStMq{`$a-{#6W17OZWa>fS5w)MIzcIyB>(>Fp-P3>dI$hjS9qu@dI#3NKP z1aeoK$FS;I1#TyQG+A66O4d(}G4TiO3Qzt*rC%wM;`+iP9l}HFQ-a$78RR$tO40ql zc0xBs{cY|~yEQzkeY~v6ibx&>JpS`;J6{>P<8+e_wZRZcghZ&Ts3L%n$0+mpQfH)v zRfknn&eM*!IIVL8>l!X+4YG>Ey1G?{J2&@r7tKGN#^$U;ql5|~7BXUBRQ(1}!cCFp zcb)u%sXxRn8%=Hk!e-0Af|m-kf@M@~4i)y>ott9X>{Ofg~nL@rNSLf5Ds z5hCRm2u=XmXuYoNKbm05t}3TuuySQEO8xVFDH0)!@U#C-`mQQa&PY-^_&-+xeO{$_ z+TW$k=Pv_g*XuoNWL5`JVe6;v1r@&5#|HVAWBlWd(~aVM&;jm*w)qQx-*wiQ!@b*s zzYK!VMWj?(8X@3{`1OOn2WGtqEE@GCL=%Yr0kg)4Gd*q9P%#$U_syhQO3B^daGc(P z`yJOsN3Ki)R_q#t5-#AfWU7>-TWp0+UJU9CP2}v-*ikg4n#bz*m9Bc1*>Pe+TKRcP9dQG?#m6*k@GM6*C775%%IMSNzWd}fdv=%-Z+WD4 zefR>mid~=m1=v(eY^09x(GWD%CAwiJm9tq%nL6=k$9UNc(nx#Pjj{YO3w*3^ zzd)kL@TY+UR-~?Chd?I+wkQ$K2y=`vsHrbnhZ=qpY<9PS*=m}vi>ce#`xiIst>;%j zV8gUsy~+??vpjD;VetZ7lC7%p{w(H7F$pXP&^2|>emit;n1ANj`Jl4b!5thP0c$tm z&GsCgUGoDvwYmHXbllB|x7GjxQdjFimJnNkD7sv!T&gFgfpt>dI&eA0g?dpVbs+fL zDsF!H@Y7F&XEW`2EW-~l?E>MiEauWWXTocCNhDqyz%o+CaSfj~`S-(7DxOYrl`R9D zH3-e4Xl2flFi5j&9MxGz`ukVUn~0PqO}uDk--rgJH(sz6g9aGiLcw#1)f8~CU=;@u z61Nj~JKdJ~xd?ZtaRpCAMj!*zyi94}d5Yk*c9p8YsLB8=7ijBs!|sW?AC6&GMpD z|2|dbnESEXr2WcjuRAL|bA&X}2N|2&iieLb2!7>c(8NhifSFR8z|#X$9>Q)>67pv* z1Gy?sVyjMMCCh-7nd)W*eP5$hj4V0c_VedZcH%MkG0crN9e@R#QH5w zX=RgNx4p{`LC6K#iWw?=BK)FK4WEgrzUdbyvb}r7V|GN0{pCit6(g`C+(Ea1sKTa= z&3$_TX?70ATW8iRCA1kQv8wh;UMxn}PWjZM8b=(n=-JCNGP*0$~)f^UVRG0)Ra5J_{8>x@pv%C zjogo`SAEG?XkLKY*k2`)Q=Fd{nT1BtBz~;uY$*0}DT#o!o#@DAjoQ{?_!6Io4n`BV zb7l6|_aMC>3tS8lD^@9p+~~2ph=|8u?0?hzq5y9wY(N7!W15WpbJhUx!)qr|ujbNp zsQ+1~=shO8AjbI=Gjr_(%%pqY0owZ6QHad?7Zk*)0gmz4-ETlw<2kajKjeDZaA$hW z&_)qvKpPIgVR@^>MW(cMGTas&I{6l@+mQ(AK>q~%u3}WY`Ir+~))t4wUgM9Nk4mhW z7-7E!Z)5#c)9%;CfiO@IU|tFZDdR#8Il5GR#jpo5t2-tzdnP=kY04~T_1V1O*2wr* z#FghkXCe3x_f7r`*l7&;cLCuBq>Q~@vdV+)>W~5CLLh@VbuM%y$6vY=PgkddcUN?Z zKpqwHolDZ+^JUk~3qN$=@Z8L~01s|l1Ci;Z*)200gd4yt{eQpJ5`FytMWnDCraml{ z%hiS5by@WW*&pHWP)97t>44}Us$jNsP)5lH9D_3cTavxXtW@sFtTV4nQaw`+&6nw`F4|GRX84Wf<&Iu*d8|i|rU39Sl zpGxoO6Of9c(o#r=-;Yo2fo}x~%f^{Wi6(+y?~daOL(eotNPXf(2**eTl?GA3@&+^K zk#Cl|%x^ly`+vxi`;A%Z&W<5;Gxq`;S5Co6F|S`ERFJqFGZ`*NFlV%(kZ355;rSt8 z4Z~Y)FV_ZbD>P|r`%t0#2TUn=7!zz9Rt!j5MclGWkQqu-F5APC{jN0z&fhNvCKVRomW{%s7}_l*cJ)07h!W@% zMm(sL7XN>E^QKWIsh#nHspF^fVDeDfGfD{U=^i>_{+jcI<_ygGrwE=L52f*+THeZ zZgL)pp7V1I+sgK{{E-59&h^8w7_7wL$o^is{ieJOSS(*4uZI)Agb1G*xbuq|Nqqw? z2iMGz{gusVv10zJX~#Lw3^S% zd^y>>PHn*H@|)=dhx>rexnS`@Z)9DuEgGHG-JihD1By4&2Yn4M=HBOUj^V(D>0xXD z-Gm!E1a4kZSyI8S*g2`2ai@d(FN?hhLv#Y3400jf{NqQn6AxaTW*U6lENjx~II`9E zv~Jsm5lFgbvJN*rc9TRYC_0Nwj6GjJ{%qT{C0dFi3a;?ileR{2K;XQk;pBU^2s_Mo zq*!)U@ED7n7@)s9O5y9Z*x8{BzC6oj-CE5sskaOgDZ3psg%dosFsXo)-j3H9H75B9 zsB**AiUPZ-&b_UwD{d=sj8O{xdo(-7+o0XB10u|B9+D%OrjZUjvq;}->{LUn{~$!3 zHEfpfE6g$v0kS1X)?WtiJ}9i@5DtrrFXE=V8v@dQsw3lm%sq}LsWyI$ZL4?m5j8=~ zn}rwHkt5uY53N|3xq`wTvu|CxM2f2HEB@EA5&WAIYER_;_X$_P@Ys z1LR&NC_%JOcwh5%})cD6)iEJph^CsN8~`8{C6DkFy!0T z)i`o^+N}#jpOa{%dux^p+91(ubm^Mg3+6?-Qeim9Pofz`K1f|VUd0RdosobCd>Nmk zs?U=Vwx-HU_8|g%_s9ug^R)~knUl%ZVCnG8#!W~HDHiyc;#=02c`_f#as^tBPue!z16 zvl={K=Bj4egie0fnoVGv5Jd_ql8QqVK8}3npXE{q{EYB>1Xz}f8sc`*aGeAVm|Z6Q ztrDJ3fcdZp9VT2o5uD9Q2}gBk6=FqC9NX7Or`*WH%SJZZ3|C@bACEM&;8uqz++jQvF9Uy&1CQrEPhv*##=;*A z<{iD2yiTWDl9KB=G{SbUWgc4BO-<5qD8plhgeK&goO~SLSF6o6YPrI(iM0?WR$^l0 z(rr7-lsm(K4cIOSV}2JK{8M8+&v{H#Q-L)IH9gkUhYbALp-A}wI(U+X`>NC?!-IQu zM}9aXo2u7fJGKG!K+Nw%D8$jDH*d@EY#{BV$R5OFwl9-X7$UrYptQ+%NpWV|G_@Km zVii8AlG>m@4z|dHgdfH(OL9}HXjkaW?s>O-0c0?(n_m7zA&Ul>og63htFzIsTnY*m z2H(NYr0E9pWp7HFz8E`1#*{O0E#s55+HbHa+?7%s8~9k6$&RUXrc5fiw*4aLB^Ab$j%O zFG}Nd1SAa3#Ic!~FSGS-k(mblxBu5Kw9zqIoKyPO@dg@f8Skx2%=VqHOS{|774aLF z-}M(?(BwAEp|*@BcVk*q3t1}p{8>e8e5zr!#K)z!=`~EhJ!&9jyjnLLU7XPgFmTm= zm(~~orzAMzXll;=&s|o%w?u+oT`|A`wr%!^YI}j%uP=~bUOCslq!R}S49E1mHYm^i z;mGG>mspO#_i_8xzABfl9!88?wSZ7UNz}?iI`Bw3smaTCO_j>_d!Z_j-TXH(txu?Q z*D2bm@bFUCqY3Vy>Q-jJEf4_5wsvy*Wa~eK6#WsJqoo5;(L49B*ORP|8ksbLS$6H{ zJ*~wL?iQ|j#&=-D!41K*u-;I%g%jEAs(h^xq{|ti&H2> zSfe5ufQ)r6&W!InPGzRu$YqfK5)$^-G#y3}67WuCf(5ZB zuH(~|yMFT-@%tJ(DL%_=i`^L#!&ej;>-%}EJcY|J$tPS!W9FEc=c`3hZLq|0ysHU8=?OlAvb+rHyOhXC2e0$MK<66d(($vV5nJV3x^2z`hHDi2XlY40UgD@ zjXzS83X%C?=kyc?I8=UxxOM=Z=1k&AirP~Ro#j8enMf}3k65}|nz)>4w$?EOsxtsO zgb7JsE?8A4c5@mWVDbifS^&dxcla0`7l$EGSGqU%$ps{@67E=& zJCbqSgk79BGLS+UizsFQH%YCg`hm;&rM)e=Vucx=y)`JO(k2#UvzDO|qUSXs;+%-w zy=1(}9|A21eHdwO8uj`sxFoPyD=zW>P2Fuj?lK_K`!Zrioo6+hd~sl2 z4`KNu%mO?gx)VgWt2b8o*~z<6uUdc!H#z!y2*>n(?M0t-w5qi*_ZLp^rtftn`faBF zxuEv1c{mc6;rCV4k`2B!q2~c}#mEStzIpq;wMEU#M{n_nJ_u*E`yA|J)G~@b46*F` zN}~S){{D;HY3S5;(fXq4PB?H?~?+H+o*HK5XWshOe)t#U00Db^aQ z+gX50X|OPkch2`T64^I)PyzZ7!8!N0X-UC!viq&%~kw2D+`9<8{u&z%Sb*L0p2nYNb+ zvrR#$eZfS=J@FJgHpVp%&jfx7DAlw5k9&J=S@oXjz|Uc95%4w;wT@PqAJMz?9Bv+? zlUwW6aPKAJt3yB-e#8nXvhWp;dyl+Gdy$bdOR(+~O_#Imr;0Qw zuX)(H_7L{vrlYyl;^GiXmX00$K&6$|APE za}WArIft&|k|S>K6vh&SY3au3SQ-z3CRugzPRt>Ae|Ofu&d9X57fiP$B>Y{dQa7X$ z{~RV-gUM=3o&151M8QGRdiTqpFme}35E2ZfTUTI5P_$E<-783Q!9o3^olQP&u52v( z*-vO?l0fZ(`aXfKW;eHuO6*vJshX!Rni3!Jc3c~HIM;wa68ssK_qG22i1n|_!1e3M z5u`N}tT4Ch0%+Gjs`3XT#>g%XUs*%WUr_ErU`)CDDAjJL-$t>e zB3eF;3yDo`{f;6d-LyI!L|~a34kJ}^0I`8KawzuSwUNTL;nQb*{r?6z2!lIN%aU2B z+Jt0dehXPjL`Yn4@y-+3pI`_&J|uTZUm8vu4!13tc(WzGNQUgk2qos+bZkWu~R ztb?Vi7h{s$M}GZt8$5Yxn82BTI2N>YHW&-ok6zZ}k^dEN3X+Q&*Du?%;g+3jf-6-^ z+!?=B8K+N%x5Wn>?zJ*XkW^13KO@SnCFq4M*FqE7l>$}uSmfPEei`F|^v1`gL)<~{ z8{s9rFJfTTSx=7RP^Sb- z49lNBo3yzME!El&^qfH)?z}&d=5ooC%>>A*Sz-SMLa;@^RlOw~?+HHPHL$JJf%+&x z6%GSqw*UN<0n~j^Le)%5;QoRh79yIr0kmM#h63ip%hH9mcN)FG3{>T=fdz*r94~y-8$m$H=V&yz#95$a5OCD!6Goq=qaqUf z+XPl_TbMykjv|eaamKeOO|s@KsC4Z*TFcKuTB8>PBK}tq=TH~UAZ-gl0ES#Q6L=YW z%yfVH3m7&YktcwCnJ+brJBQb;Txm1p+W$a1V(Z2W#4_)Q|H7rE5*N#C{wyic9Y7UI zB$hP6z53P5&!Mp5X&1|wURnr^4D8UQbnmqHQ6P##HCGP!^60qr1K8)+VGL)oM@MP# zCj@LS)3CI-%KEa%sJqBXXikI=Lhy^FjlA;#I8PfSD1_MiP?$6-k)?v5uNwrLm|AkT zSVF$ZdAm^BP1x^RlUwKIX>(<8lt?#xL?nY(rem$FZgJYJR~-ym&aca1$vHG#|B$vK z21; z_~T%v?%X)BiapMFE{hsvWl-4#xYQ>7F?N9{YYJM`WJRai1HJiX(dYuh>_v{0!Mn8-+{4)n7&MF&AnAvK)KhZ#g0aQB zi0;6&0i4oD!B9d0#k)@DYwMD$i9wH4@DcBl6M1d8HzI{s2nTK%_#qfg&wh&QX-3yw1FLb%SOSud<7z z=gxW-tq7_KNURdv2y71X%ZWA=dY!+2?e%`QFri+d)2N~i2CWnctngPCX(WJ#CRjE; z;|!jjX&GwkHLgj$3Zv9mYuF)^4W?1L1#Dx-Vcyo;;obCLj(qX{C6^*11k9DJ1Hb>%-G6}BwLVE3tFD;o0OtuYcW}g>q&yr`=%vts6m$dk?{dV_z(9}tBjaDm5#(m(}m9sZRaq78yYP_nKuj$4QXIj3APn#Q@bb}pZmFd9IgnQd$5MGw9igELp=`?z2_UKO)>vPUIB@e zSF2s=8R%e>ll;IVc>*LL6MI}z=k6F|P#100( zqoau--g8xXtE}((hTi1O$ZIl;pd6S3sRNwbFIVnR1nvgRYr z|9OjjYFh#*E(S!7ya2Ka2RNG`Znrv%PCnXbJizesIJBh$s)h&&$6sS-`tu#+K1`a~ z>!O*bmY3SW-n=h&^@O{) z8jof4rHsQq4qlqan5dqWI^6z-tIrPx9Jm%kuU|J|wZAxzW%v97chCT-MH5;ztEpqc zf-V2HOjqPjAh+AGymx5F+V37=X zxe=d5ZxLlXy{Lt$qLEeEW$bd26~u1aZdGlGV-j5pdB%|0kFJ}08@svUO9Hvf}^MerXA7@icwRs4- z0P1B;0%yj^!9SaGyu(Uq^VNnAy4xQ!2soksne^S{t2@3F<$-#^K-N=U%IDSDjta0m z=wDNw4@Wi0h)5E`M@lgwaIu9n&Df%9nRG_CDD93g$Xcb8PBkvS{b?Iw8vdg!eogxz zPo#NJ%>z`ZD2vwxGZwRebL$8CRn@%owtJ?oK*;i9ilzI5`u(do+!{?cptb8TX$H&Q zG#~>0xOiNF0Tf-!LH3@rHE|)IQRyB=Deh0ia?i@n{%6Yo`b6d|mY;Csw%93)6Yk7v3mO27-V3UN;d154vo zuKr^O4nSXH7SX*%wENYU2ol>14jk84u)&dr((_8yzGk?TiZHSz9>3FZs#GU>MeaB4 z0`BDK;y}GGHm)CeM-$I6;M6c)y4Ih*%+0o1JXnczjn=5AFI5gG496B!fDdp#94@f8 zc=K7Ig0aZP2dOiiQVua}8YQRt#CNStgFAh3G^bKyDQBi#Hcj_L2SvvjZ ze((W>@biNpow?mXXW;>V+HYOL6(cPCfdYk39OJ~EFPte8?k`GHn8&sb?bPoYd~}h& zW9>$>4KFgnA6I4Lle~aBUl6)gy1~(j>Pg*$egz@H;H2cUVA_i-bTtuVh-HOLCzBdAdT6Z^!u=N6F{13GlrZs*p<_p80VbW{M(;00WLs4E1iS3*i`_T}g3<(Dy={BJtwv6k< z`F@im0~@2)gUwY%F2ElH3}@{}75_b(ZQzQEdQWG!PQ)jzNCi?Hk8ES$9bNJqvUi*)6Ql@I- z^WPfvAGhM7%YCo*CL_HKn{yfTu!8?iEY9kXG}nw!s~-00fNvZam7mF!sU`GCy3Cbg z^S6Xw-u@`8(i-OWRA4kvMTF%o<-K6yP>q7Fe>IAc%X7DjyA2`j^@<8BvR|5_NyYe? zWI@v_eFA04%Cp9&C zIgcCTFzjq8CNqDiBREzu#5&)eso^e}+j6i1v@T}sUcL?%gj0~vk~!N8tENLfe~a;h zlzFahIK2caw!Uz+W583D9aW@PRK*PhKp=f3FkBD7s70ke*JNPpfsj(d_jkLO@PDJ9 zJ26@hbUlCG6w^!NYOQOvx(xsib$`h@D3D{!3uW0zg zp_CzGY~S)>Z=y1R00F!OG&91kTA-{-gr!T{Fl#FNRQnPV;vR!f!gso+IJ?4pzIIA6 zOF+9PAjBaw1WP#%_Y19M?Neo2SOU4=dPPN}A|h1pN_BllbR>B8JIs;T zLaX*UZj?3Il0Q&OQ%C8NSW5qyVt!bL)JJ{CR|^z;Zv!AMJIMNiLhk+Bllt@i>&D9W z^%wbBb*jF>;Ow6sBY{D0i9@2LL;A9^qxZjwOWSr!!g{bW0walRH(*)`M;{kWB5K>nW!yB?};nb z89_!81J}&ZzbudVtUev81oY1)YrIT2=_9t;gETHXTJr~Y+11ltX`dDdo>^_$)P&fd z#CM=PIv_abTo8=f8@-ytcL}DI%khZag@-#ZQV}!BxMSrwsnDGn8pkL3bJM+wlE=&G zf+LJ^{C|~1dyf6O9#2WNHg|}3P{dr4UyYU|s$en~TlR-Hc_IQ(A*nBhCJdBqeJ40T z;h9&PcO#{DrcW=c6+l=MdCjA59#NKo=wFN z@?6I}VzJ+*c)Ku$pD(${SgZXu3haYaH15yW=JVvj^@~>M4~Mtriwoz&HT}P1;NhT4 za2NC(|DXaTY47~P+!*GL8zY=l1J+Ll5z2{*skU z%jhatx2zA#pWAN9k8hYr0Ux}@-aIF_p*#i{=MZ;-%NChYgIQ-gT?1LkK3bn6>Ush? z*;P$_Ii3DlUN{LnGXrQMHYD$@2q@YWlC^8=Z*RhM5;?{Q#M6(Mn3=zL*6L^Z{L(0V zH-K&upF_A3r@9Ls- zH&e2i(jF^&$bFkq>!=<7r{h$mUK&}+gb=6q%`&@`DVmG~Tap3}m0=?yIt%c4wtmd6 z(O%@+k3}b7y`U~#g2Iowtb~k-=A+<|CuKN{Wh>)A96#h_-kmxh>5-YLL_;u@Gc@!K zPH_D($~R04h$;bM(7X+*zymi5z_A}MLXQ>ctJjjYs|&OP?nxS=%H#o5#a&G}eezT& z`uBj$2+aZ-JN=oSqtbqO8=wQ zJ(})nLL0!qX1niwLgumN$Q`PV!67w{D_TDh1ryM2Tcx zXaqf!sO`-YEcC2YDxJaA&pIvue)pHJZ*!;kIKF40&9$jaSt6hb?YP^2^k^;;-QRiz zl+q25V;SN$z}?|?IZx!(kq*X_E?a3c3Rwaz1x+bzStln|?v%1HPo0~Y1nq(IY_DBE z;wkYE6MqU+zAJ|$xyO&0`ZAW)$t2lp*gFDi|li(B=#`?SGh z+w5yzKo*uA5OBKcXk_xbPoOCJ&fI>n!x0<2FIboKK<6-xW=-qQaZ;X-jyaZCY*NyM z#U|X;j$9{pXZAM=9e%bvj778ON91WPlGX(qvq7uqI@~NAf)eSZn#UTDe>=g{I)V|r z4_l9^ds_ncM~6%Vu}f~(d#bEzfY+K$Z~dJ!f+HI>E^SdzlHkWM9xsTB$WJsKj1Ca% zh~0zCnx!NWOb){aVU#X6of>GOJgKQ4e>T8khz(&$%xm`3$4dsG;~AWQ!%R*8 z6P$`mdYNdH$CR@wg!Q_AC=Ls92U_34#~&B7SAYc5EG#aA$7^Q#)*UFjAwC2AV`9Qp!*UT#iYeefaH}MSJ0SPvVbANm}7ueJA?Y)`74J2bd{#phJcyM~YgYOs=xeNH`2{o@HP@^}4Nmtkr75zos2WhEW#fR( zslur+18#af%$h#S(UQVS<)l$#YXmhO!|p7k*njbneukrxd})oz>hjHL zc#)jrf_q$ZnE$rwCV{d~$M||D*bCq%PVD1+JeL`g%d@eUJr*KlN$5oZ{@^M(jZ)Uu z_c?#@(1w*nyB3g$IF?E9CVNPP%JKGF3gAJA7kQ3;@+_HqnzHuKuxAQSgAj%8fP=?O zSyxB)D72_qiPtp;io^;DWEuou@@8(FWW)w#n8Mm?WE>>liHx8e8K#nFVLJ^HrhE}H zJ^ebxpJ;)gG2nf+r1olx*B;?A(?{lyx%kCV1~a2c?>tCIrqK-_0L0!1okYNxK^ z5U8X;{XH3mxE69(afaXDQe~Bwv8^M4crvBWzAkrw&Q+Yd6fH`tv&rOrgw)dLf9)c z+++Nf5VFZ{wa~Zw3&dw71oNA%dr{Ofn)kr_=x9}yZtuhGy|lUH=vOTKRf5y-vq%TJ zQ1{gCp~R=4uJB3FkW(%uS?wnfBCqR={EC-*3L4eX4Wk;V+j=i8o3VdK_7cmP)?=@M z{qgG?tfchgg@1bPvG^aYN+sR`4#Q%@kGMhB#v4@)!~TsC$BW;$2%+(x&B^s|oPaln zXNMN|;Hw^WpP2YnWU|)a5Y5x(qOVJ%g@&{Vjv1oHW!7nPZ4@`TrR$$UbEaEwz%oVi zN`+OYcl;%x;o-XX`8)($joj{pcdm@ol(|~%VUZq4_>L<{*<6ui@WcoqEP+}a^e}F) zN8pNp>v>o^0JLr*o-LTpPWcGsgzzdWi_qT+WlGaxcwx&)lX|`Lf1N8vzs6G_eOrgh@5$@{cY(avmEztG_nGWXknEBauzyrI_%> zy?wAsJWy73_6f=>>EF=AF+)K7@_w$X)(y(Nn^HU9qz_k%Nn4vBK;N+j5SNSb887m{ zEZ_K1yWe>(F5l68qlE&N0G$L7>C~r39Q3 z&AgQ**jf`No+n2nSyJA~$O>`osu{A#^3YRcm@bLJBK05#TW?tbt>9Wm3G#h}E5QY? zy#NR5`4mpKsKZLJhRNY{6_RH{H0%>+ej35?vYl;uJUvX+K)Y^{QLsBFy^%C>OL&G| z>R=aAn8AReLldkkw!f(1)~PX(A87iw2OPs&myHU?2t-U{Sj{+P7@}D9G7iiVN!n9* zu}gd_TT&Sc*ivI$duALc@??}%GZk18CV@!ke(%SG<59zzk7=YLsZo77wnNdc1c9>unh4rSgGVRXi?MPA_htvN2 z#LT0A*UFoK5#rNgoL@J5)_rU&it1}KMK1|W7vKPr{sx$T=arf=1*5Jsji>3IWB~Fc z;Dwid_qlCU2P_Os1kn8y^tM?w;8(rQYaK@dZPN%Sq=Rl}`OPA0lTf zP8UY|Eyf^Bzb$q7NelBAtd_sl1*VP$DI>m0G{Feg`xAb83TElP%~oKyRQ8^9q4>u6 z#@4pxONxV`C;=e2G_cQg?Y8Fm0DXzIBh4+!^dP09L(2N8hF!)h8hV9mU7E(aoOuNv zdp@>PToHZXIXEN;fnfFtTjlQ|J(B$7P-oxhPr?e>s>Be6jh^`ufn~?OH4pW~?^AK_C-SdWy)&C90{7Y6$tM zE)FL!+lIx|^d+acfF0@0oC_53t|7P7fR~(+BXRU&nQhW9ZqYB1mntO&9}mO8ID`&@ zClO&V;Zt0>ijh<~eX9i0a|O8@zxj15pDfMOQtNelQ0`?fPmDv7D~)BA zJgUMttZmuI#2AxGU%Yk%tlUCJLyYDyfkfq>JBjIWmK5Bxgpr&dfzxpBXta|pA0nHa z^trr$d}`vONF2W(TPMmDBiAXv_YEAaO;Zu0m8d(e**tG zX4uI9joBlNc;-RF)+=9hHjuM-XOZs5g7ynp4YtPFyf!8zNSu$EeF+@5M)eZdNz%R0 zqL~8mBXjGez*cXNIxIhGJt_sKwrM({uwIlHmZn~moBI%ydUE1Sv&&ZBhKPY=8y=tzW6v9%nK zNR@TZ`XN2^rvTT~yiJ9XSJyi~B>J;N2MtboCcWN)P$OLE1(; z1Xj9XS`I8|19#hCPL${5Nk;Q!M%`~<*6>Vb5vUEBeDU@CBs{y9^{YSQVm>o{#=Y0+ zG&Jf&ywo-K*Ge&X*GC8fnRdKBZS3Hy7^~x^ILddkIPbLo;Dida`&xhfn37yTpaZwa zM&ui#5KlJ}1jm>jifLiR6_g3(`37miQHK?TA{wUcplN9rXsvzf5?mkmWDZL&K8+of zJcqKR3km7Mfns4^O|AEO1nu9d$8+N=1ww8r{NGz_LO|~y32BmQK52ta3?~DJ>8aqB z|IKg+Tp8D=uoZvgWbcj&D)xY23N_bnhe#(OqUwIcKDKTtjM7Tb*wNCe%0*tyGThLh zqP6e&dU=Bm=aI2dy!?F3s29FI^s)>Jw(f*SWi-r~V<>=N$!P-fjuy*hF!QL#@U<7q z8OLKm1-e61hX9ox*E&q|N2g9AbFE5a<8g0bq6+Hv&n&R^<#o2J;UBAzqip|e`IQfq zB2Z6T)&!p5XYBZMPVXnvY?+7%-34OxGs;KL5D;XiVL-5n7i({Ht}yig;pNP=_)%(oC~%DRO#fo~-*?Ap9m2KAsvx`HV?Sl%v^t zJW?vdWu8@>Dqs&bHhT+PMQ@Jx9>d~$7Wl=FNRi=YK_dw34RI-#YeI%TI<+=TN$e`~ z5IZKoyr37T1K4r?|2%{^A6_(_x(9G*#~5SwCgP&Yp!AXMn+LrvQI|xZL`&p9_$OV8 zZx2M)zV^1VZEtPDf|x)1#bpUituVHEcA@FC86(}yPk<iuZJeJEPJmy#K4yP;H>8zi}7|1-!!0tf-&&0}L`bpoLI z62`#>ho*P^#O8eNGf{$wb>nVqOqZZeX<3oq2A@UQ5xevY>@0|P$)?Xe2{YQN0kOxZ zKh$AEhSz^F5!;30v{plxTIqKJvLBE7F+ZIyrV#5MUoi61!SoBR3Sq;0C18s2y* zTxsm(lnPGC!||xoxE{P#b?eNOdHr#GbogSHBP7m4;Z(qrv7N!C)8hV)Nu53lp5)NP zA+Zoa_uIxi@1<|E;PKO=N8t?mS9_+@d^nr~#tJ3bO7M_zYWa9uetOZBz||kXZ?#Ln z);jc4vS-LEb@!WEL4tD_;Pcr_fKkYgpF)VM;3v6_-^R)vyN(|qQjJ93xtsWEfp38c zT;MWUJ4@llvax^E*f|*K2^VP_gO_Xb649(t5k-Lw!W0rkv$5!9)z4g&;*I`+4E~R; zUa`TaH=kpzaoXNWOex1Gp0eY-i+%wUUOA7x4*I}QvgI7$w&NMzRq(?XqjahrsChSk zA-V>KB>c>95)k`nh`yDpV!Uui-bE~h$=n_i5%P4_0x=V>Saz=i+Zk*B8wQ|A)qiyo z9x%VcKRd=i5h+vHVNnPu3cR<9B}5mHeNqOus%uRkaL!t**{{jxF0N4rcB)f@pJZ$F z9(qE9MePiEBxSGdqYwi@2y21mH5^$Zi%k8jR_4`@6gq6XLy-QpYo$oj0#Cjv7hS5Y z`}1Gem7DC*A5-E?aclj5k?m1@6F!{XD>VB+zg)S|(Fb!ETT9ePJ}q!>Yk#lgjMuA4 zMm3W%m75RDuGlFn(Z=DYw?Ad2%2dpVD;Y+x(k zt9Fl4Jz(pX_3u7AGRCpE5J}5TACo0raZw9hA%6U+KRowhLDZP3(c=o5N&)1^U^*)D z%a+%|&nE?pBh0s6ytgJY2?H^b>$3tCT7CtjD-^#;x`Z>32~fHSp_NXp+>2Uexwc!P@a*KOuX+Fy~^Na84c!cSgos3 zuLa=+k4|-end0Ot6HOv8QD94ks?EG_9`DDNP#+S^Pjxgz&hM+CuCOiw!`L&zZ}PHP zfwok6BwVj(#1HJv(3rgM&ndrWz1P%A2E>HGwu$p>FskEVr4l}9=v(g6b*P20 zSiQ_!1JjxZK(@cfimWZvZ?fbEIg^QPM`H?(D^YaHe1FU0Xl6s0_s+0&PPp`6dS7KVH74{+{#g1qAQo8KB zL=;{nD$a%)>wih!B1gJ-y@31LCC8>b2RZE=vxyEt3 zvcADc+QREEk;;jvl0_asN+RNjY?;@qPWsE4$mH^?yxQ`ZgYk(?0B}r7Qk*C3$5E!^ zYLH48tL~o?_VBop|CmT+HixOCq(Pr41~1>hk0a+jn>hDn6OT@Iz;nYmK5vK6f-lGp zdQ8DA;LZ5Of0@+B-2%#Zb3@dpPZ1vuspA3EU27*Y*7j)xT^S;ft#EUzdB2M|q~y?5 z!>1;TO=iv38B$uJ8tBUv4Zl5V%O2Ns$`EgE4B5ouN=e5Cn?hva{NQ;hTdIa0>H*)i zfS7D2YF-Q9ye~A7(D8z&?i;nr+nR~csw;*O!(==pR)Of{;P8sDE(h$M(aw;N5#86< zu=<%U;qyS$_NE<$45ceCsv{(kKeiS&z2d;t6sjU|MVXT$lJbmfoh&Vbefs`pcqe?U zZ$t?%1A~Cp|G}pk5gL4qR~jzlR-hx)gLYp+i55#pg4|!`-RaFFMH7v^gXEf@JIHHL zi9eaHD}EGRUbn%e?sel|>=O|Q+2N?xz-IW2{>+qQu$tX8qPSeHO3BFh^MLt|f1E#X zHs#*$DpPQ$WAY7T$=|YVeqKUEuO?AZNF-YHj+2C}Ooh=!pH@sm4gU4QP z?BpTdOm@TR3Ss6*K6J{P4(*|AG-_zLYj2Nszo5j{=Z$&Z0QHq{Q4&GQ8snsSorz`% zXJ2!nxajk<)Wa;?va1*{iD@UA_x(VqQJE4%&|f)qwejE$deO)V@M_gnqip-LvMOCE104;%g^h}HvJtKq zj!i8v;ykhAv^d{ZP2ma*HCiB@#zgP6FrDfojJ&~0>CgUXOe2g)i318js+szVp5yAw z^#Bj2O2vhwqlPx~S@+w-8 zFKlCIvF}aT%C?l_>fRjBs!}L($_R&F*Y>SXp}E#2ah>C>zK`8pMve~>gh#fiGDu4n zHJ_WyFm&mk^i8T|e27b2FRhPN@H_C=Lxs;|c*HWCV0dd(QoP7@>hRSxkwM<>HrUFZ zxMrn0Q=zXSfnh&^?~(K`$IC=@!X0}wWB}bSvTbh~;+kM8aIdFK9hRh}Lo7Y(_(Nc* zXjGop-Id$gp|Q*r>Q)IZqImFXf=Z7d1?NF|hw?|WhRj(%$_SlEykkutRWBY+SO%Rw z!77g>J2sFpE$^ciC6f>Yl-}w>-b(bjOJi1ELJZJ)4!Z2NSx2pVJ`h%pyLN=BR;Q&= zm+UICK`d22aa?>8szjnPeAjyt_tD0*!9~}KY;CRCM00$gk7q=&Fnp8rre7?h%D4Z% zk4tdpx6s2(_YjSI2OrD9$@)TGp_~7^3@m?)oNRSkH8Yo=LUi=~NF$d6QP{t81nHIPt`u; zgQMdpu1a}w-M2k<;Cv3yx;JmtBVf?bPbnU0s_gd}YePDk2Y<<$e=>utU~o z{zIxg7QR)VNHD!uMc#LMSrR~gT$$CDk5rJAqoLKM3WQ(@V2(8iC^Rl{!N{ijOz zO$(RD*nkZ!uy;232MMjK=?qcVU8}qaPQ;;_brgRCKr zJq-!qe|$m)SgnYMd8c5qw$xYD780Mq$YTp&`=6B8!>l8AhBU|}b|YR+N4h=;(mOUg zKm6vq&`;4U!Bk2@2^0nP=2QT_`HEKuv_p2#6A2gZkMNAce3(^P_Ebom!LG{H3ANwI z{GF{J2F>1>|D8C*o`p%=y+?Is>z5!XA=oVnDVQ@J9{p0gxLo}R`n3;{%Z}MN#PNC; z9-eyq#g$*jN`^7pBxxo|f(FS7B4jNWF8{!~GN8%sJ=NN{Ry2uXDpImxJFi76&fnw* z8wg-1^YgJjOtC|SC(AhejDKy9jTi|Dbv>}^2d<^KpZR{-M4-Q0C5Re(X`tr%SK4y% z54=n1bz>$vJJ4!p(zX!ZwYX+en0cb0M0YCsJGa!>)M}aXSZdauJ=9*2N$OsWP8FC} zXbg_pq3Zj=SI`vv6zoqR2@D%+80wXlIB=;$f0b~Ypcel_N8axzi@~GQOF_zr_o6L;U-fopWdTM15v95iMmH|C0e(aQUcD9Y+YV2M_ zmZ-+fdW4t>RybYkJWoEE(IS$G|BuS@Bd&`fNB{?kp<2`kTLzdt2-$>$@O$fij$J#& zPG$1shsY<8Y=tCX^n<@CdW+*toh4_dy`#$I3otKHr`&h2@EO#L&&3)H6Yj1O@6(qNl|I9Zl z1uET;gaO$cn1KKYA&l;O2t-(O;he~Fi#^fw(8oI=U?;hA!HqsmNQE5%NYh-}Q<`TZ zJcYdrnxASr<`yC{8FhZ&G`gnJ!swp#31(o1?|nJYGCXO|*T7=3ARq^|-$-Di+!lpN zvMW_MK zkHs7PzbfiIMBE4}RnsL39I?qe zG|`Cw5dT7x)D+;JH7_4aVEyWQxGpvarpGAleC-d>c1Jp2T@Ib);2NJg*{5hF-7CkI z(xapUV!h;8UJ;ZZzc zNmIgS=la*{?NIB8LY2v3d*DiN2L|4d+o(quusGsQv01O3aX4^KonkGrzPJFW_V>NYX?;~M6nVlA7YG>TN%7hq_pm9Mhm#)l?3NJh0ipE{7;n>Zv7`pU=xD z7V?8sMd!mY=-+AVNS2DtZ&r6V*Bl`m8$V3G-e$Yc@TJ>ujW|-jlw8bfd5m6;%V1o$ z{Gjw2dUHNWm1VRB>$bUr$rj+Kwps7f9I7Yya6laR6=NxvaoogpttH0Y5@;=C``c`GLMiVAE&*8$;3wGFnT=1s~d4|c5 zKWH*f*);_2kzCaZsZ7!_i&5AoC5LRcLM^;8&h7o~#jm!g*E)1!Ku%|n=2%dVp?S_9 z_QU!#9x%OYbDsM987uXd>Ac1g359Nde1OcATnxV!fH0K+>4RVb8>7z2<)@9psZN!X z%PzhhS=W*qt+;4@nbZfF0^EXf9 zU%E1S<>^mH4RQe9$JeZ7+)ar@Wu3DiD`qrkC>5%*zw#vaSDF0B2gL`lpP*XGxxTr1 z7zsouQk4_UgYxBfghzOs1Oy-9Xux$tcP?}I`Pzo=UVzn8uyPzP-gxJLYQ06Wf>cS%1$!-g&6E7BFK+T$R z+85ja&y)xSM0#LF3eu;BwnUkKW^cJ33lSffxeY_$J;uObeSY`wi^i4bhZk09yfJp4 zU0_cH(qlg2y!02b3&}wXjOuuf`yk?dpY9eC=o%0D*%78~o<#CknmcQzEsOJ22ql%T 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 v*Uc<*d-{P+lWUg*z* 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 literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-2688-1242.png b/web/static/img/splash/apple-splash-2688-1242.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5961b18672f926bf6ae8ac4bf23fe6da2d31a5 GIT binary patch literal 64517 zcmeFZdpwlu`!+o5TPv*+t#*Xaj+T80+0AOJBqAZ3k$tim`>~yAWnqbpL_-|zFh@AG+|f1lN-wM>lrzV7Qfuk$?4<2bIl zdBN0Z%O;6UC=_bT*)u0CP^eAUQKc?H4mNr2)=S_57us$kIu2^R`l~5l)csB~Aj}G;7a`AEtl67|T@bop<$E>98ll62p z*k^s@yxMuc6K+>M&x8lKT?{w1bP4xzIqJF(Z78cBstXtJaSL*i4fXN%4b%-a*eAHI zF1$v*t-4QE@RlGigMG)48_L?8zaV=88{j5;L`6&4<*=rXtoBir!&;hZ8d^%S>S~9N zs;cRz9@bD+JFKgwrF%qM_WPfGaJK+gcU_B^x2gM$qA!AQS7 zf{)+dm-P+&K20!Ts-aGPs)tq7kVg`{(beVe_xS|}cnfas>Z0oA?dId=8x#odJ^c53 z{jOqzuz^>x|1X#R`^W$71~9ef&;Nao|K(VGeEz;gV9==$c#Q88^1pm{pktoMHw>cW49EUOMrEqln?)7KS?3;gB3{DRv_ zryw_jed=oJuwLrQY8sY@b#&F$;IE>Zj;@;8x3`|hx_Y{Y{g1b5S{~NaJ)*9wuKwTN z3L)d_6y)^3eY2~Jt~)ls#|a+T)5pofP1VoWW1sBb)2Mp_>x~V78^h={{_FS8o;YzK z0PF7Q4L=C9Fgh-K_S6Zj!$-BWl+{%Z3x<3CyzW`wz#u1I7q_z~4fet0sCat1>S}7c zJ0I0>KB}y)sivju?5^pid{kZSsIrdxQEivQ8ZJ8OTI&D#{gYUiU?c?o^ZTyJ;f-eUNB=Wz2>g4yhT8ImsL(NtJVc15lwORsft zLqc)HHbFW@q23h#lobBM_kZ|lY#sjoT6V*~^uK@i-LKb$zP-FIzH#pRH@B|)LHhek zXW2LFzPxHc={^;ACGN~t*J?p z-S}2^V=a*>v+8?0bOJA4wel=X)9k>uHvNaKQ#VgK8YHU;es){Q>o+ z`Q$hL0&lnVKtQ>DCdSUe!Pd?JzToGY*;XI2>{Zg5-HK98;ETIPj-`Tdt*d&fiCnGP z##*%$lbA-eJ7-Q7UDYL>Uc9OWZ!zD|oZUgcswth+P&@LfpHbS!FvCv=CK=3s-K>h~ z>Fp(($Qi9Y`2i&>eawZCo{15ZG{5zC8(-Ndb$WFbccqLqd}?`Q7`F2DW>-p#xLb$SHCKzNSW`ylO~T>Yd_uQPbm6h?}NLpCT!7YDVNqb zRhVVr?_W?*SoON<^2ZeVw{eZfje_9YM*R>zJsw?e`&kFF*Fn4scy9~iHV<&B6@2#Xc-DT{S zVV-Z*WJIZ-$?o;$Clh!Y1TJ$mlR=_nVm6~ttBK!uFdgGw@28eZD#}_`)lbyunYKeqxu||}o8Tng}c~?R?3n_d~K959L zETZ~-8=T3v!JQx)AB2F}OIF>nkZ{^3Dk?b4-zmz+Eh@?_%roc0d*ZE_<9i(s?O5R0 z>ykb^>B#9k9}pW^g$buGpgA=3N-1v^EiGbXMA?NxEeCuf`rgTH+;;QiZPRSyI_CmQ zn`hm-c1a|hX1pt4ahcRy^Zc&oU8ggv|9VE#?7oWL#$TeXjgnXA$ybZ@j3`^-GTXjg z#y%@ZA^24$48-5Z$IZnhI4YRanX{c`TWp?ht&nAr@xbKZ_GA0btj}M59ATfri8Pc* zY9&RCR93T-9IApQo)KZUP|tsR&iuW}XT>&goC_}GU$VYWgh~8lWo=5{WK1t4qm>>Bu%4@?Q!nxA5(}hU^impK9lxb)VaJ=gjIt{u+_VtwA4_ zNJt9bi$dK#^Nj`_czCx_jo5s@DJv$X{&;3dNlC!;_ zb_IsY&*gKp3Cl*j&LAzl>0&^5`+_?mRDc9HanCqwQ;dDNz3tV`?rwD z@`;x|WH}c+Xnb-p#}b~=qaB_R`9gPX|6xHp);VKt7Dr*M(N+>*%TXgcy@0$GB!TOa zj^Z0~ToqD{Cj-j^%5CzjBonSttQ;ILy8g~%AL-jCEOM-JKV9pxD7f9^#$u(N&9mh! z5@s7PRetoghID;ognqe!>kW_*YCn)Y^TdMgyw~yNz2_<9H`E$ug|tC{$Ti?+-}*ej{nEmG;Zd&BeCC5T>5~8CJPc z=o0+o$HuxCnCj-KfJRq!NPZoVeN&9(L}!1`@G7MRNSEI6=XpAa45&YS56AZs-I>7d}gTdA^l-d9D2Mv?W&Qz@jx zhCQWS*Cr;i>LLwg;7YNLu8@{(Cl+Ju_mcB16qF zMe<#e47z4S6T_8JsDa1da@I?XZpsJO_B!X0;d{##Ib~%%Iwb|+lbww&4WBl1>|s_X z3VXe^h)uf|VDl1)bIqQ-VoGz(l2$S1;P1}xvC#Xp$ z$#-~a#zXNumG6B63ie{y=#}J%+Z%5T44u~{TFA<~J-DHgo~ueo*)=Y(`8W}fasErU^^Q}SZK3+RN47l{PByrm%?Z?l++ z0rz8|8G3P`t|_fDg1a_!MgJy!<#T`KREuLM%cIxZJ;S_mEU|xR^^F0xVy&d#SFgD0 z^@G+ah&J7*weU#sSe7lzfQhe!Z1cwaCkZdM6iWgbU8u`hxmtS_JEa{TCfeKE-_EL&()PyP4IA4j11AJnFuU8LXK4avhq59q8mRZL>O}K>I#JUnGcLS$hrBX5{B;>{P!punKi7>X+3z?- zRKcd}u}AllBUV>8i={`+4saI5Z1Y;K>Kp1D=RFf!E>shK-u1x&_bBRf2G?+5M0AKi z8|?NNQjHuL;7{;ZrqH}bqnE8gDAZh?Ahxcj*^6&zR7*8E2w=;QoNJ}nbZ)ccOs>3{ zG<9)FgLT>`!%8{DIL5i!=FpB!4+8{6rYkei6cicRqiN%>^`g85Hz(l+qN7Ha+Tn8>}P#xfJ`od>Os zL+OSPxQ+qvaIv-K*%0*=(Id|Qp6J3}WWP&pHRKMIPo?V-crnD-+O{?&1Cfb<`3U|S zBm8(A)x#wU5KwKUWlihaC}HI{nH8p}ryo>Kg>RE1X}0x1drpucS&$#YI#zWx{j_UoD|L|eeIi1W3u}hrr8~gEwK!%$_|D| z+*pG&Apnb|cFk(pG1k`Ha|d?|#}@T^^ZFCR>GPLuo<)t<%B*hZGeqd} z4mtZ4$KKQ#y{+gnpkkrgkt=FaN%gfOSJk8v>&Hf}^mrEwMUOxrpCfALd;2n(+U&GE zOg>sFA+B~LR5SHd(bc8c@&In|&+BVWV5`}!YpLk@H*2_Vudbd3>RkH-bJ>6}7bB)x zZ>Ww!MF!_&Vvt>hQr&z*mV{Id=Yq1TD!)jVwVs0FQuOL@J7n$S6sz1Fn_^6~lAB#2 zI7)v%1RX+KuHIjn9R0&)Cl@~tcRwxa1sI=rI=bc+Z6-Kk4R%`KlBX~_S&KPjqJW_64(-N5@Svur?vZ1uqSpovnHJfJl&#+-Wy>%qxC- zQCGF`Yu$v!Z2kv+&~)d#xRL3>+KIXtaiR67>)mGra7t&#v3+-pvkH4nw1~|Bm7NQ$ za$meqBI$;$_S8?W^j(A8J{1@fS#7Cs-#9DM(C+;dpsCVZZC5*IL{Dd$Q_)f)aNB3y zGq_4ha~{LDlv-IzEib1~ib{(ryXiqjne$im(@o?c3P>i|MZM>P&o1phLT*JbNm5z+ z39AkKcK%ln+R9(+{I{f;WF^Wtiq@*#dR$hIjPbZ&jDH;4y1vo%fiVP^Hw9x*Qe9F} zu{w)0K;XPm=S;C}v4zTxfEee!XVx20deZ)iG)#JYNVhEE@zq@j5>&eNxYv8v`RtB) zS6wNQxXd*dJeZ~r2{Atl;YWEB~Zms6u{WGlaXy4Lq?-Ikc-iDA8 zoT_8*&|v>eP&mmHrz6qqe(Q^5Tlu0`^$ZvPmCPgX>!Y#N%s!*dwXbXr9Y`K=4PZn= zQ~SNEiu@4}6S3K~C^ga$=NG=ZurLbP%#5UOm2cft2k4|}YO&5a!$xUGK>6{4+u!hU z7U$SyCTj%-Lz7twrwFQZD>c*~hr<%6VQyX?I9z_$tnh}~`K#)r^Bx_&uIi)~cdcJ( zzrOVL<=;eerug+{Yva+P0}%-)Vvb!nwBxRmc+*=HYPeW1PuJ}RYj|HR6)q`_i;0OP z=H;s>D?frLORr=;v-|+Pn5{DL9E9KPgfTyFk*e@tS6yM+o_5f^1Li{1Ns#OtUG-C6 z+YL@RhK{_AiMQ4&)z&Ue%YzK(Q>q7PMV$mM4+UIVJwLH%X26vvtjhD~=v7H*E4vqN z-Iv{XH^+6WuHU~<*Jr+U625yO^i2*fa_sYL9WWUEFaZc=4+T!uuh>$o&UzHq9p6iC zifvRov%aQ=a8tFSp%?&TH1CRzbVBSH?~0nZa0G>i&+UR`V}G7f#SB#ixOrjo%W2+w z>=PXvsXrR5^dzG>ME(kyPhIO-S@}@>rv{nZv<~&=XMz9WdfNG|>*+zd#HR6p@_?MO z*F82i-oOE@mT1Upf9h6G1?bi|0Xg+0Agq91Xl+`jj%QzLaMF=tg|A_#G^S{UP>!2-y)~^L>+6GcEHCWv#o02J{B$6>bwqORu?b8jW%_4; zgL$^|g}eXGPG#l@p>j;nYxkNwwaR_@QYr6+lFy6$Aso|T0$M-?tK5le#TH6Cb5jDI z)jLEZty;qA%=u9D-AVFe@Fg{|9@+4zrbe}G6N+}km)@9)*I}FwpN59;+1<>L@aU1b zVe^ur#fsG!>S{Ob>(e4^#7wj`doD;f*gML{#fO#C5;(6Sj6zlG3Q}g7)9=S_H@X{V zjUK0jc)P5PH@aX6%QeMa&|sZbA*!Yc>k}0dm5%F?IFaA#Qqh`p>ZA%U%jf^KimJ;b_>|trO3?7DkV|WSHv(FDyIY z2Js8;PVaSm@7fOQ3NZ_)2155qU@vrOXXQ>boTp*{wrEO-Zm7kSb~9L&gT6&w*NQ8X z2t0aoGea;aF9NlT9)j#KT?3tic*CS8Aupq|)A6&`{6#`oYd3{rse~Ea$mBcFzN!)? z`BWfhn8;Sk-S{`Wyl!U-xC-#T@zai+Acadg_lUd1pjqA}CicmS=&Kj?+)}|ZH^nv! z7V~*ZK*j}~>4UU0j}J+h$qBj#sL^d#^`%5aTYi&CXvhok2=wB%XEj5Lr%>DhPK0pR zAV-KV2}L6b;iyWw_U{uDF$7jCzh)3O=pQUf!lTYI|r8nkG;6jB0;q4O&Q7Df9dN9^Y0BBv>>%`r^!lu%og zetJ+JvSc1OCTGe~hrr9qBatYS$(C76X}_eIT;@oqI;rPv%N8duFZL9E-nu2-fOIxH ze{=*8crA^W#~&w0bvh!|SW*yLe_Rxg1v17e7f_WFq$B-m|L!zjbl8H8AyIMH<~rxS z#KtG0C6sK7oblh(U>%)8JG}@e(oC~!+n&*6L{_4$DvM~|#r>p^%0;@7G$qn40*fVh z;PN}@=bysj>qbqKEoWkm*yj>B8fdOE?dz-%Et1(~5E<;o>1-T>9^wzd)aW6R1qDxj z;|)vo-Ey@-x+zT)3+46{jDw@yQM|WLSeSpXo2RE|frY{)g{s2BElm(YQ=T-k=z!B6Pkz#l5H)Y74HiqcI5DLP+6|yOCNvu!Ql& zOtm;Hd+=rYl1%nTk?i`R%_dBU@!fJPg&p}vcNbj_8p%3GTdAZ* zcz7_?J^=ygSTBMILBpkx5{=7WmjRb~*)YVL(V~ad3tJ7%u{=bKPYD173f03^Jl08k zJpc$Nb>Zl_VX?$;23B^gF-Tuxi&5qz-b=9kALcD(ONRvo26}jTMMQYycQ8!li{?Z1 zrOloeIcxH7$bzwnuH~=Z=?f`m1O^io4xc5`>b;nhR=d&W$jg%%d04~uN7ZF;kfh81) zC1LWrXIR|YsTRsB08!<|f%FBKMF|n$mHjlO&Ez_IgXCVeYCduj^?YH6pB&fb$N*jkD}+?XSLgsjRB1G5}c} zSgp2amlP+$DW9Ho!?4Zs*?%-oEdupIY5_{@>u`%}xZh3Ip@+@x&~!0^B8VyuNBM8h zK`(6AugB%)VF-UQLhSNP^Jy{(^~sH$6Fnnpk)z2;-aZVVMIo_cLtFJ|t8WI$tDRG$ z4m*JfB?}rYzvMI79a$Dm{u$L(uR~XtSA0B7hr+n2&=UVb^eVOm-i7#q9;AR!kXzT^ zl-*eUxg}5Wmit=Gt8!YOmsWpX%eUIQ_O~w7dDAaL{NX;ORqUA`ku31duIPKfN!+!lR{+Spx<0_VRa6843$KxF_DNv^ zAV4dCKX0InCJIx7bW=?rpV}=6bHa9PiLI@&u)yQaK0>jd;Ro*m%06=EqkJlf2#HwC|Dmb&g@|%At~yih!L-TWaSVn2|c<)-4-q zd&H3V{<3RrK@uW-=>1znZV-MOq%8DG4<4nhv{uc6QdWx-gi&FgZCHlG{ONtw1l)L0{qmoKcfV zV7SFeHZ`E!N4fcy=eI(Z8s2g!#dvbD{4}Mc z>h-I_!pPO0m33^|B^9D13r1+3dw+(t(zT~5a(}A)%ZXO<`U9%y&gQlh0QXeKU z`<;?-wCe+ClY8w;>;W~UqyTwW2Mgxl=%^R56qIH8!tw(PXinv+MNTG$nE@J-kbJ#N z&>{pbWO4veIuePeq3&XF%ny?-K%a$#uvaMfqCrLw0(aHK6Hkvdx?XEgxP9h;bku4i zCg1VUc=Yf!)AbD)Ox`^r@&3@tC$88u ztFG>JCMM6?Yr>fRj2L$4@u6Fji(xxXfq-VT$cdD0c3i8Y2lX-7dJNN|-rnB9%E++A zw{_=Wc^Iapz1~OC5Q<@j)i5^iy=xEa;t#$k)vD$8b7HEbqfr3N9qVd6+P+j0Xt>pO z!fG)v@CEr>{zF5}J^bAX#4g1NfKh9})v}7aChF=}>Zj}bu9e$Azt>c5ua#;Xdko0a zWQ4vp$pT?VeWx7o9C2CQGMX@RMT6cYeZaSLM~oMlRRzs20M0vRkM4PED3#z*l#@LA zn^))TR~5%z!?1mv_KiK-Y`ewMR-^=2V-v?hH!^NTBW+tS`g9qOj{4aIj0zUzXz7x`V!zNEI2I z*SYn@RVcCERd;O}6vP@fm2JBrY?v1@TQRdFPma`jdFk(cR>t}97>EOa{`0JQZ9p@1 zcy6gEpXl?*Ah6Kl7i|evK-N7|xoBD8T3M4=r%=D`Lzgakzl0uY8B2A#LF(9i>beDPu`r@BLq#RJugrx{f<WY!gpofozZkicf%$Nk}LL1@+S>t6QAoz?UI9mr9B$G*6K#X~u(djuK|_9c`iQ zGG8MG@!9=Q$Y34R#0?i?0*R{FS#3KgW$r~$b9PW>)l*yCH9YFpX+H+?r_nV)dH=n0 zb!;kAl27EbY0|<*{&{c!3KLvQAR?&E?t*|?*Cna!+B6YRV6V{iJY{=BH&!ojbUbH! zS3r5e1xMQ#+7b!ga)F)k6p2O7>hK@SbZ_0=Fr>4Z@lT6j&!?UD$eb@jiw9K>0>lPf zWCd*juCxRf60!t4-!{(_&~`%o*!*%|$<2RNjeKD;+2Lz-G4;j5g(W2`!_n-uNy3_? zeJ(V()`I$4)dm|S($HEZWtW(QqGCKmut)2o3hqn2Ypf6LqsKEbKkL(r5k^C-&1D7^{pLVA~>BO-TAJfenLZX zV~|$-|daombF3bnt*ho zp4M#jq3&8<#fAJm=#r4>ck}&Nv_tMCF$vbSVtY_X%RwMAm}XVWneRY!b_h08`Q*l{ zn(2SaL&{Z81&v_j>cF*N6-;$iadBmFagCKJx3d-rusJ6Z zuN?OXPHdF*EU)B8AVR?RSrReddH`Gn8MjqaZf#CjX?Gs$%o$^b_D64K!M?V$bMV!? zhV4ln6)ky04dA*_VX-C!;&-v$AfC{}VCe$D=q60lJshk2JOR35^NVTT!4VXIiV}(Y zBzt~%*{gr&foZn+j)TdKUQ*Mzs3z^z#U!40c3_@RAMg<0%4eAs#6flkkU~~@(3b(B zmS?$Z*Yr%TVkr&p?q6X3eyUyd98^spPN9&}EpBqy z4N$pArjUgF5PBJ@k5Y-JGuvR5a7*lm%~k;HaULExAZIGOy^E0osw2VTMmM@nmxW&6 z|C&mBXzHH&u{g1)qHr~iFjtA-!%=}EH2iXbyxpzSY?re_)Xe~gC8@Av=;d>|9ovI(j?#P!P!|xsfuGo0IzOynq6go zf2Cd}!sVjHrR{B(pOLqqsF}Xm+6hk!go9T)Z$cVVsR}xJzYT?w-HV8VTh||xOI9Ho zcU>#D%7aD~kx56F>%qHm+13WwvmDC@#!oGBET>bng>XX`x_y%-7a@JnmsZw}0X+u6 zf+_8wM@@Gm!9cXr@(}8uF0xV!3z2G)7*0XiXVJYSx)rl-#jKV_4O0kA0@uTQJj)t| zdUxVF*z(IRJ+a6EiJ@u2IO}+U&HJfiTgGQWJO(>#Del?q6qVYz!Iu>ft;nqgc4ZHVmpjhX9nXjqZ<* z5MpnKmZo3&ZMTP}G&`K)TS}XSB!i)LdzI)lyK_r{1#VW<>#vMJM!;aLMAJ3Xb65Z6 z*AYr@pBTBiqx-7U)~Ypz=o*o>`a~?~2h`Th2%#~&0mxjair@i3*ozEHB_&lrV8Np$ z9rE{yM5H2;fn4E4X4rh3Dl7+YjcIn0YtCZWV;Zv*h^SI+35W(FldMO`7@YkY4jNHl zpcg350=af>;pjXxpIT{^8&pw_O=D*IfVw_)Ta8N0^`pO5;=%pV4$xVw8)jtS15yR9 zYu{HBzT0T2l??S1K&MY|n425t-8>7L)=Kl-OSu5e?Ulwi#~jy6EBDRS1+GggUL>3o zq-#+2ZpBqM_0Q}vsEJaEMq}=|QL`~b*h7&cSxvBephykQzSbKYxuQurKM{<2Ik-55 z85kT)@_$q0VH(B8MKzeM){ztaO;9M`%Lra>fNE!EQ>akao;JW!}kPao3KOb{Oa!ss`DB z8|_i;=L_t71Q7K3z1M*7HO=prNjP2fIUaE3o3_yD)TwPZ-+>r1v(q!TDP9!4I!Rm2 zC*N|@geh@DrsP+BQ1W7(6jDq)+7Z4tKV7G!`gNI~H#pQPnM&5ib;l9i=T=rg&IN^? zqFf0Ea9WxYNg$D5)qe=hW+QZ&2@Rl|tEYbDMvJKe#4Lv%GX*?Pz!K(mft~`jQ1hWl z_Qn3*A3|%xzue4*oMcFj_j+TSw~|fxVnm(kKtsbbCb1oWR5F6V{f^v_JtI)YbFJ?0 z5;G;~;`>vR*@F??(;wQ8XQnq#+={U;xbTPnelBQlqk8!R)sY%WU~_1f`EzBB=cfa< z0+KHdi{;a^$$CIlfboD03eOUh{YsjQX?AisV+J+ws)bDT18S+1Y_O+WWcm1B0@DDe zq<<&paxfq5khQoUDBe(h zvTN1;j5=tpDI*L)@b7*GNMg{F&_PbYWcTyGOi9yv2m1&6X+uL^T6SwSep)23@*$np zlj3!L$-OkJL+^lYM1PKW!;4F~*s#SYWRboJb!UEex^41QJ=Ib!`Ru{unB#aL1O;}g z2{2HT=!_4_Bni3+hQ1vvWVNfC2fo_4^ z(Q`yZ_*z=(XUtyFkrIxDatXw}TryCih3ougJ_l8hc^_Sv`0jpZDGlLT8QyO+z9gSj z8p3{fSY$KmO`gCO=X(n16ZO=9oSv(lNj@(~z#Gij(W)v6JFj*wlt<>+9I`f!u{ZQD zp6Y9%T52LznOh>hKoJ^}n(L8Ug6RxMudZvzuKXn<428f?2bj`4 z2;S+)**5u?-abrbDFARb+b%C8Lh~VXSz$YFenHLk0Y7jw-hCb)QDm!3=ohL!1(kBx z7I9VxY>lAcHa-RRA9nk$_|2PHW0GEyl3q3K^mffLoaNGe4vC{V; z^|e+7v-97fhN!v+qi{Zk7l zPP{AubrV4uf-Gt3o=mSvqI>W1WT58iVUB@!{whfwahTt*tR`%ht`joF@BlU^M?CIF zu!ITFU-yZv>xCjZAe4X&v1(%328Vh22M5!eMF;G1frtnwwuLsK*!Bpq8Q=T^&`Aip zk7Oq3DG?$N8Vn%90a`V?L#FmZ#1kMXePHQ;$N`BtFQl@c4xJ_R3?y9@X_W63q(L9_ z)h;O9!F&}HIV;Nl3&&q3bK|2&4h`Lb$=WHHtPEhBfxZQ^Ur9w(b#-{_Ag-F;(!Ysw zJj>$wJ!4K}warIRP7v-kI_>1v$b^nDFa+;TYUpUZqUK$ymlskBJT6vChOm%I#8j-d z*PYYT16Yhz69?TFfCj1gWp~GqsF$TsSiXdC3q#9_8up zkhWW$+Mxr4qP~QvQ6|!=B>(~rh1~1WL4Pthi>V3<0|o0XIL_?)LFGk@FReraN5TZd z#e9%f;L#A&aQvx7&UUbRZ()XceAy4sS+t5zfkj&T7^;6W3LHefzDV(yn|P}RP>&TJ z3?^Vt&-taI?4gzW+@`Gdx5uNx{0nTAJ*e$R`lf*FYtHWI1*UIG2yh{(MVADOF|TC^ z#7X>QZy-^{2UA^G4yKOEQW|3k3JOSVrr9gHsJU>1mF48jw$F+@a^n%*l7gkgIGI%z zZQ1q9{>7K!lzh{*=<}4qyW8U7r*ry%bAHhG7sb>H5J{_Db%s+kjk$Ko*_iW_3m?!m9M8=Mrgx}ASNWYSSnja38nHc3An;e(sK;!=`3f#-e+K8XdG@DD|U7_~&4Gl$sMf{vKNDrond1}KN z?-g2HI4%={wScq-Ri*-c8@-OGvgh>mR<|NH4QHK+fu^`#5UGceNcC07v3zdx9@sme ztXQlr5E=CSXoIjo(6-oL1@pJ%N-1>{_y;@a0^_`Xj*Rk1-_h-U6`- zI~WTJLmIHwv>6t-T7Y;R*}fhX+J!G#dpAYKgT4?V9&P<$0wN=g$0p2UDTP~MLQIhf zk+e`qd13Y8T>NIqhEKB;?s+zi`!s>o6;8R|ItAu8aFe;V3so?w%;2qFZ~5MpVz1vPvGaG@ERySjHvdZTMKo6Xlo^W&+7 zRGRJ+AYsZlNa~o|uoLXMBrv)Q7zePzC(79Ag?RgbuRg!a+G-c@i%6%kfGDudKn;O8 zOG>1YGBgYHH*`vaK+81|wQ=kv?b48?B>;9yVBVpBjg1~bOe5JPMe9)7uLGwrk6NdW zZGC4Lppa5AHLJ&@a9fhfx52i^7g)cs8;@;0klbjmbx~obn3!bz<^-3STx`U0^8~n2 z@-(N5!zs4E5Ch8xAbB)D9cz3|lL@MzD5lxvS#cLq^5ThFs-UR=xl5tIt{A|UfO{rX z|LC;G29)0)D)v>K-o@ZB{j$YSING^ju5yUYLbhZ+2?4p?m(+LPzf}j4dCci3rvm?# z@%iKiZ3!@$Q>>K03}T;U`EhE|Ngc>;AS69-)L!p&G=J0s-OXE;mnjdWe`p!PQ^8OX z0f@^yH*_O?V?OM4#8@vG= z0y@`6U%w7jrP9&+)rC6W7$;ptwO5d?U+%g#p@(O4`LpO{K9F~{;xcgK zKam^fpHSZo^aPMw`CVF{tbyMG=)e8a5ayV4v5KJblUnmh|x7vPOsxDD80QIua# z3yBKeA`$GWZSlf>^r``x=fQsqUXZHGu!D}Shfiur3##ZIGE(r zz&ZfWVvKlc<&tkc1}PLoMesAHwLC4l8sc{Mp^YMLt7@tC7~9CtHC$vys^yR*Y}ZmF%|3MN={7yooAV=d53)>R zEXRI!?&ygW&P{Z|01B*!C8TRbri#!!VH+w7B&Hi^?atN|9^tmTU`$(o#dP`A5l8+SPCm#6g`w(MG%gdvncs06)hh7Aa zK;skiR~}ZRc6iSHzmB9TB%8asIAxUC=4AF2?8=`Li#$Xk;53f!1tf34Eo;+Ep7L4S z$*{O_25r59S}ycI-V*=#^L#7XfYdA!@mNh5J(ow5T5p;Gor&VNPu#hlR#P6RDzYIC zzdmZ;owBtrIY7qD=$foYz1f1~2KeK zQUoE2&+0F|>xkfTyPZI5M4Zr-n0!oJIsD`|q(VRloF84~h_TbU$JFPX#1a3QhbgH{ zB=856-@3DVSpP!ab3F}=9fl4D)zVu!sHs&u8PbOs%$TXokm+D;ul)?oQ^_+fuMR(&v2PS7~Y>hV~$uSBHaSD z()P3?YDw<*FzL>-c@KUm{yc!C+VszoRGtI9b4KTV(V(wm=zP}9_TlV{sgPS$1w9I6 z*ZwFr#nUI4qbs!t23^E&+|8SU=%dp8>xEV0J$_O8?emTa?t8$&?Rueq5~-b;AB00RI5?B#x)A)axU`f;4-&FRqWVG?D;a zLxRA7eLd~3T5QyC(rN~?a;BvSq!$~d1CV0ReB7STy7m6pKAlhvabak+!O6wR=B=QY z$FmLDy4wu>E^dxiGr=US@D_qbnq=-{GU-7}sjUY7YzOS~d+~9vpMdN%-#(erOgbR} z>m+$kuz9spf)rR{goV~>X4+8EU(ejsQ(cj>hW@Y41@j)Ri`*);+6K+9N=hQudw|Vm zu6*2|#P1>VWI#6-@uI)ka^TEIN9%1=t;O!uk(o=ahKu(3-Fj6hndT`o!^JN{L%hAn z!)^I+1aLoUc=C>k9AVXr_n95p4S2u6Twy01=7d8VK=B>8adKa1^EM%Z;T+nA|u%S8sMO8O>$lbGjv^1U2^$LAEIiTm4IB z^(A^`KaJevCh9V$CQM_sl=2eDD~*t=#mClZ-{s8cSdN|1=ZuR%Z@suyld*o`sv)hv zpWm5{#)(HmpYko656i&-@vU*_d#zIhPBDf?$r|%M=G$*P%`W*;T%CEQomyZa~p1PJXIl7%6)8IrkoWOze>$M#Hu%tL^~8N#)- z%4?|ZmtC`~4URmP3~xVSI)9Btm zi1?-RZQAN`Hm?%R;ScmvA2$38<)?V&Tl&5(4tBT`)yrJ$=2|sklLL8h2{n%xaMQ?Z zF^>EmLR3>Uo5GBu%?+=yl~gpRS+?b?U6@);XcRFO3o|m@W&Wx)e<`JzF;ij-`BF!a zF9!~|n+F+CTSQMxP5+?%e2_9pSe{5)i*w}l0Dla=d3L|yaysPJRd@Y;I9WS7?6`q5@-Ym7@7@XSN z`f>ZsXtOOsGVZ<;)OxH90Qh|T`c2Vl!qF%9J#3|Z-5x%^2Btj(wfNaAlz$PNwrFU5 zq|14;4mSmAoEFI>>uE9_bP2P1M0HF>cx5nlXaTK^WA~F%in3i_WECG=8(|p+cI1`W8PJ)B$I~L${xoxhcB3O07c^JfYz(My5=Z#FWFM_X% zwCTnbXujlxm}HKt)}Ex(oHLG_%?)kbhIR~yVju&47 zWQk_?rmWGo&Mr~GZvF-H!|QM!AX9*W$|Im0GX0;A;rI_&)jT!ROy!acd7S_pTUv%b zeKG}45S*f#x9O#{Kp#^h^cb`-=!fC|+}UysAn7k6&)E3nt*cI2OKc{XmSLo0ZOa&3a7n5frte*oj~OPYURJf8Z1CV0BjG;L1EJj2zCVz95J@~ zfh+HFwo8f*5L$CC%5MS|nAqq63$t{kn_Dx~5uN?nbk7~FnIO>#Q6AzS|!ih zPviKs>Fa{f4(7NT20oY7dC@VHHxS?R?e#&i0O?IXqMr`l zv{vU#FoYGB+slzQB|9yotUItxm6~*8IA!dUqd~gt{D+%A(l~o$B00BjBFB%fYEHvx zB0RPC8iCj7k&d4%pK7JdL3^ZSmzTyovK>fJe~M{_=#7&PgfIR=yR;kt^n0_LnAkLK zD6Ah&?r=-uWI!o_M@s_^1X)Dk+Tkl2teQI_BZ_3PNorI}eH?Xd9f$)(VEPBes1XjL z;nJa8v_>wqHK6%l<5e+z*b<=U%+cLxA8KasAP^(wUu-phHi8*;G0(QywH^F5$!Eb) zLliAIy1e!4g4Oc7Ch}j~Rb^`C?=V;YQo02aeW<$h7O*^D#Zoy?+@dA}&Gb2)8gS~T zaxlFWfSq5*ViuV8wA0}*bKbpN#J79D$qnc#z;UM>E3*#P&JCN12-OZ!*5HT$zGx36 zRtSGS#}YofVLly4U8B&JgFzV5_jh*j^dGU^5D6dqfnV;Y27^(AKn>=6m~7xR$)o3U zjQW6g=%`%k8oCE8L9xa2u3Q}0-Ix>{e29jl!{wJ<&x@~R2@X>P=|=T&XIU$x z5b!JkRn?T%4_5AFI0&lGjR^$H^cwG1wFofF=5^=FCt>xM-%xP0sD}E!>9@!s68Kz- zEQ|Tua#0QaGSea93{#H?4<^{<86i_}1V4N{FbVv{ns$gQ?aU&k*f{GoknbfGcU#@S z5XD?J_ceqpR&GDbt!D4fQL8fa+FW}j!<^6LSE5&$gb_4iiC2$IV4!#ZepB{L_QhuR z892ck5)zX6IhJtKTrT3WV&6LGQSN~zrOdH6y<)LN^V-TKhW!iYx$V!`U&I3 zGBZ0@+`H}Wwml+ogAcFVw7NHPLP$Dz{6Ka`7bEB>X*RZgk|kO4f>zcw5da6P&a4{z zHYRo6{B&lGd(p0)lUw$vzasb_3$S=x>vYc4^!4Su4bg_Szn%V5JhHF}xkR~vkI$aU zkV|>}WyMdQR_8YD-WdCM;lxHkS$(&&?~bADrwGA6bWmAq@hZCfKSyde$jKkH-L9nH z+Gg-m_K@Zjqfs>H`5|K!Vs=(BtARX)UmN_gl=$*QuSJN}O4!sR-L?0PwXwqb_kx$O zMyK3dE;eZwxvO5TcwU^hPNtWA<+9x2w!_Y!-<(aZPZZbEQ9g21Svkg~*M>PmIC=J( zr>B>BiO z$xB{ZA9-%P5=Q0fZ&x0D9BOH9j9i$HICpE)-MdmsO=k)htZ_##UD}!Q*wc3S=&`M@ zdogBtAt&#hG`GBT%L&gsJIAJ-Y12GkB)nZDF4t=s&09?~L-R|L($70xu6HVhdA+jm z&Og&gr1AZkrZZ+;p`yWC&NnwJdwue?Ex5+0VA(xVVWWqCUFUg2*3}~`Y0nYwdVeE# zwEsZ3Ollu>B+(6#w2`qd@TaG!=ovs0{vKvEi?JJyW}^ru!m`tz%1=CM{as&;T9qdpvSx$wpM6B#8-iG3CI zr9+%h&WGTF=6TmA+12wO2u30@1B>G3R9Y!-x+#KJJG->nNB89N8_+CW>(k+NT|7 z?@EWQmTS{Ezkl3t_N=YO$|6@AOF;h8~oI)mR7m`AP%j)E(EH+@{O4 zzrL=C2IA9;{#~4RqJ#AHNBvgf4z?cmV{*2sMB0O^+G!?IY^t`1GOk_Y-8kEwb;r+$ z7&utbOk104TG;8uwUU$mHrv;uj{i$Q!mMnF#<1t2agV}B3q<0SD-?5|SGdhAU2LiP z$e3T^Rhpcx?e$0x;vLPNn3_6SQ0u39_O2!EFH3WCRugvfl&XE-K>N%24bF!Ql-)*u zH*YXO??bEVY3x^Sb4m)^!2b2rzB?@~v-MB!Z%Hd@SzT%H(FQ^n>FVYt{?**;i^*{vDc@_pdDyGAMZO)69L4Tq`*$a|42cfmW>Sdh`Q0VDi!_x$DTO<_q#w#?bPdX*IqAKED@JjbuN z4LuA_tEhNXFl70szf{`8yOAHi{?Z_WbG>F9aQgJaC1xL?NoHfnYn)c`YZcqV(J9AW zot>ZJj*r-2rNXP;27%+3ht!e42AbZQHJVV?VbCk_);JE%eB6%ZZmE${Jh6knl%(yw<(B&5<5y236P?A^+hav`KkInjs^!UI zC2S@t@s~TWrM|h#Q&}TevIDRJQ^US zO=uBYXM9dGUfj-<$h|{Ab4TPI8~z`;t&he)SLiAanvbR#V( zoeD|}0#bvt4hTAQHyosd0S6emyBmgvxm%9kUH6~MVy(kjizV~!ckd^D@oXRF!0_yq zd6xEgWec>}T6|3N^%S0L-L3CBlEzbQss>ZX(|dQh1{u=xSExfk5D^D^CraGBujnhj zb&I@?C3Isq!G6*kS4w{u8q3n|BXJsxe~CN(EB$vF{NJ{kpUl@MKK#h2YU8gAPvq9~ zJ}&pHGE8qgpMCRNa%C!d+~HBm$Pv4r7F3ApW}?&B&hi|Z&!AX%aO^(fJ3nrbmRDvs zOj$YH1J+m5A#968Ucc6qKjtC1d-R4&#~}>sfsi9T+Cz(BPjdNw|9ZCMU9e>=pa8kn zWZL>0nUn7C(1chRWodpr_&&qRf4H$qBUpEbiHb=2e0&Yvc&3&oQsTtX5w2tCGfAD3 z_9-nv7F&KAjYPtbKp7r*K7n?sJ9lxKoV$3W7)j^4ht>H=|9Cvvbj5xs@+EX&iRATU z%|^M1^yj@XbA@n>%j5rE`;~Qa`=YECpG)-fN}$F1vKc6^5ZzX+ls{hyUI+&&8~82- zG`2Y}Z44RvE+}+>eMruiv49cm-ZOM{oqg|;SyCz>?7&NM@S&l+J|3RzH?%P{;e)x` z9D3Vz*g;VBu$cQfUymTq4L|VfEjyX0=MfbSQww6BY;WuUBE}+H-FvndC$aNBv$RA& z7ruc>{FrSkO9~ReT-!&{lV8edMicJXNY0t3=B2G}Gu1g_bRH#UvmwZrv?7j1C9mD{ zM0Tx}m80wnstz*2zK|BH9K-~@QQAJW)_9#BY&JO35^}aUB!bj z`Y%VJ_@tel*t!I@juRBpDqzagNMFXrwM9}tG8_M16Vg^up_Z_pzx1yjIX765pb4vi z#b@UB2B&Npfm|pTA3A^mUAbafNhQ*S|L3RW$Q4Y^!-wL(^3nV+!1=Sq{p>cVzzqy# zeS0Y5hI7bC_oHhsnfGw*!B0n{QPqo`5uKedfY}^Jrc|{0D1~;K_NdFa?%qvI7YSJZ zrMsnYOI&t2F=LERrZO+EBNtSesKQ&P=CMG>b&N#)mN{J4jEf_;s86&Z^O9zhc+4hI z`n_mMDZ~GKK}V*4Q23L|hY!s&&793Fs1iP^k67LdnTMHXtMM*i2Q|HSVWxh_o18|6 z$dXrjiO39enTb();fIYR(Jq`|f#LoYn9b`d(^L~b2-;KQTc{9;h1mYvzdnRs(zmlH9#Sw@J5bU^NHGh?}=|JMN`nw2lv8mZ-ytpHf_p zH_}AX#ZG>4xTJ@FwH4Ko@YruY~J*!(6F*)Dr9x{nZiBmoyJ6qw9 z7pH4?`S8ziPKJ1He0*>&M!*er`lzl9%h>XHv*+zxLfyyQ^jOYKhP zcU=D!rzTo6wlWHV{9xbNU5vVUnf2fL!`9SEE_Vo+%V#rc!*8=aQZSHQgbvI|N;=rx z!!ZbciQm7DXf=N{<*^4XtlO^YunEH&-)?hhr`u^&DvV+fdNEfesLF-pRCZ-~p!fj6 z(g8!ZapH-)?^YGc_}UNmTzwQC@C9GiYrDa~*yo^kef>pWaX{mXUB*OZ_}y-jXyP%_pZEX#RXy~?t?6P>N4aEDcyf>k+I z$T#JgifT1(Go|rtAKQ1KFe-m}D&7VM-vjKyl`B02+meN{6v4)ghmBobFMQVq*pwov zXqL*i0%KF-y-qkD@B2(_c*+3b4*lB3{yp>_WqRPK>X0$~oAQjWy@8UFQqI_%{p;5S zKk|Wq*|k>ko$2?S$B)774#B^_4CQ>wrnon6`6_$FVNgC)ilg`I(Au-DZu3VZjKa&` ztQpT6Pcy=rM}~c$yA3lm;0`p^rK5V9XLr0L#B0UHYYhw}koI=8$;n2%PV5vg`3DpV zgh5}1)-*NacK2LiH+RX%H#jgUQ0}96 z)=cQI33EM_Q@D~$bDca-Sx}%!`{5jvR8wB_ug}#p>8GlBDgj3zW}>%uV6t~*@ARzU z3yU&$`wG7F{ifHIW8h53k}X(khevj9Mw}6HXcucQ5uS#3&_Wsr|8q1aGj}az|X7^m)eV-k$5T zyh5ZMKgG@Ka#&*36yXG&btE$1J`YrNPHWr8XVNB5Vp-t}Za&~GR*dD3j8LD0tyA(? z@iybjmxeZi%aMwB?Fu-&)c*c>-_1Ig)p?hpDL)evI$lQsn$6S36h3jB+j+xpG`+YU z9PgbeKSe=ao^iFEzmc2;)ZM{CGXet)U-eSVPrcwmG{jaBVnVDOY!X}|BDq!Hr?&6o zm6kq^yk6gA%Cr+DZ1V&+WPFC^Dr`JFQ`y?jS7yC@wV{NgF_R+tG=Dmjf6XGYS4;xW z+>VN5v+(?ncDf8U{k+hDd*E~%`ZejbHH`eKS7IVHtPQ{@Bu>m@Pe7_USANFdc-Zz> zE|jQjBrnT?$Dnwzz?ZRbSkJwOr(wfm?U9md{R!;Wbz&Cj&rf2rR+CS13mWbB;2T*M z^xxm%J)aC*tKKiuA}ilYND$&{IN9`^!p+KTKN_GzMbS#k&JZ{<3b3EB;a$kX7eYb+ zPI3CPvNRz4WEO;R@M4pt9b%0O<17~n_2apa$X{gWz2jpsP%oC*4t+(!(3Im17CQbG z%&Hh})Io`MEgNHpKvxC51Sse$Trd@3>|~Sc7tVCPV>~)WKD}bv_Se*zI#eNAEM$5m zudzUtrc*egp)*BwCy-6K1hBUV4Niq#3RMhIa}hUcj}Gl3iO$JlA*SmI?D~F3iBX7y zD^APglPQ1yz((EaWFY#&{r*={miZ;i#*1BYkV^*fZ+*2e*q}FR{B2a_+I^x*i!#t3 zV*#5@Ii5uie%JDFEyju}*^Da6!aHi|pY*xmypQ|6nIWo4l8&SCgyQrugG@+djnpKT zw$jjZP73@>EKm0p|39r~ah=8GYu>+3_BRuoC%kQ(9@k{7Is{Si{O!Fv3XkZ*!w^}V zoXrAsD8is@p&!0+EZ!X@&_rYR-1fPM8R3IwD;2N31h(kU0_kqEMb+Onx;%uj5fOKGk({ z{2_7D*3MBX-n~QsQ&7KZvXtswGLTG~Uw@u(a*`d&;A=G)-KgkqnT+syXRYTUgZC2( z-8e2}%W&RTK}%(KcimQwrA^T^8hvGgpIA zOE+Wl*thN;jRZuLahaQ?gM*xfrV2mRtSH=)8hnQwpSxt*K8JF^R+ZN}OCBi4=CRYY zKNMd-_7?lbssIw5fMws&{Ji|r)4W_Kzm)+`nTvIUN7+mFeQZHZ94+H|_^ByNx_9^Z zEFv*KRm!?)k!K8PzbYXv&Z=y#2cH9f$0phAGfryE*Z3_A@vGzks)SwHC+$;A%pjkP z=g%sL68$6FpGUp#4>(Y}odauIRZGP%80XXb2PFS%Ud@T&@w!|86_$ZE$qn0e7!0Q4 zwtF_a9cIztO@KlF-eI*^l2hY>8>rbtrj`#0#A|E7HwwjNh1T0%8&_!THmEc0-Cf`s zEYPbo8#_p&H!@-<nZRu3jWV%B9T>FX{TCT8{k)Oo%byY=I!7YrM{}REB~Kf6}z))-^Pi zWd`@`Ukt^-9*(GazyIZ}Yg3Q?nMiL43kntL)fN{t#8`^ub|;%YD#hn52KAg}pQ!Bg zP~j9e?2$B8F(Z*2qmV-%7oW7T)+cpyf8|)aH5x0NIIdg-7*1+4XlM<7&V;EIV%FS) z{(VD-;>XoG)?&+er$yCBz3PqI`9Go-3ci0Iud=MgEDWx^mk$kYF$y#LoVwlxn&t62 zcLNK|{WM*1(LsDvQci|xrJkO4L>q0s!$yYRg#+CM%cYEGo9**|o%*&lNVMDMl_@XU zCjDGM$g1~fjwq}%Fwz_v9jrzNsU>IQ%NC81fuy5EMC-QN(N0XG_0ZXln1@IQh(dAdEU)Z`M(MfjT%nHwnO=W6<@*IK8cUHdLo3x_AzGCYBvmFej(@Tx(Q|7QKy8e zD$iGq7I>-`sr5&jY+^U7>0ayTtWH1Vx$Xjmyx`OU+@%T#PFJ6%}6YjVEp>ew*X zRF$Uhx~Z3Qw$zJbesq9P($rj2$_O~`STd=s@X+nDf2A#%tCjhE- z=Dj(%ORt!DUr0WZ_ar5 z4&{xB+O>R&k7s#$pB-kdCoIO{GO&uxcc7m~objYDG5Q|;UQtqe_=v~X{y1vQu}*~Q zrjm;)6zaJ?ECiDOe7rn;hZ(7$s>J%iEFxgaAE#1wo0RVR$B+GcXerf{n_db~0DMwD zZY04EqIn-t04jDqsZ$$U+=D3QU0n{??oN(LBX*K4r853BST@8;bW>wB*fu$vIVP-q zF5ljU==xJ-<=bRi;ex7f=n@l>01R4hvx0oaLWU&`4a#2O;*;1KOeuK&qKrIQ=Oq++ z+QeoOu)m@c8QERJ{e~`(JzvizS(`$L^oEC68rEG^P%aTp5lf}qEbvi{6hKH{I6G^I z4G;|%0bl+D^h`7UR;A#DT)PO(2sEg5Ed6&6=e>@5eoDEq#1-76VF~R9Tk_y1YD-YK zoI#^R75c+jv~O^-+C}rY?pP(2*V8rD$f;+|Eo=4Iqx5rkW(di}!KumFP7J@qQdiu? zR@55q;7jxU-D5nHz&*?xzIyBsd0FO{`pn#~UsrxHKU{Sacdg%#yxzS1HMrq)Cec~c zD!iDsuyH^37W!dK2XIz;?T1r#R&IPe>AV9mEPK_uZyWbgGcL2?D4i-qP3^fL)jmo) z4?+>EUe)*s4$m{XW()!EVaeq8>KnqNpnz(p#*6(g@6HMHw|2Y&(@UolL?#Uy%p;k$ zCDBT(A{;j)n|mA_HUJz_!o9R$WspzEQj#9TL_vw=;^Ikfbk<`>=9u07r!BvZW+IjLuxFN= za9izF6*G^GNdVMNBfMc|rIAcB>}BWZ?Mm)t!Ms@+O$RzI*x0 zMiT|JPW8A!2}ZlucHx7`feNJW$*o_=%p7GtBN&w_?Km38kYG{K7o^CA2DT0wQoi|n_qI3k~k2(&ajB~HQS+^I1|wX6h(atau(U_M#E z`p$W8u5$6Rh-A{-PM&b|KM6l|eN)mwe4$(NdH{q_s2-H|<_Fzt`8RA}WcUr``R8%y zhGU1#2d*0gUg;SEF6(KPhH~FWPOpl&j<(<~PK{-!J3bt_Zz6`KPQC*ifBGLXqZd>m zF|0qnecPBIkv?_5nEhVZNQ-tMneZIjXJ-4~`UG+vG%8&#RSTZ7_Cs}=H|;z+ln1EO z-0>ISEj>mz?#!1KDz(UQ`c0)EzJsE2AqwZ4g{*L7nh*3!za#Cet%pt-19pC*oVafOn8^eU$L_z) z>O=j)pKkSL^2;2iOBAxvn9GEa(7R0x;2xY?YeAv0S!nCuv0KAhDk_qgw2i6 zZl8;h92-M;azc_vb9o}Ez9D=8nd}oirebr>fPBtlSQcd1XRi(r*IU1(BF)T`D&9-E z(0T4*6V=lMK@;=zzPLnf;L*wuD@t3!h#`GRIll2w1Ddep?HlXgy6O&KLw5(Mrb?pP z36C*V9aS2cs@iX6NwO6W>ck$TP`AxEKwI!&G27T_DG3zyU>lzBBrf`C+d(! zmQ-eE4}L>w$3?{^Crdg%AzWeiO%9l!ziOHFpcB?Nv2pW5^ZUW6d}OxcQUUVWd(+I* ziN3yk8{J;hhmq)>QFQEs8MK)~of zLRTNd?)y0DBVXh8R_tuR{L{0$vZU!gXAR?qLFHQ;^l4LmBEG0WFkk$W1|~=b$hyki ziAw`gOC6LxJdZg^3Yr@Z@D?K(fAiSN?6Qn$!T+xlyh5P>AyU0{?ax@OA_L8*++vTZH=a6xb(-?a zi<2rq09H0+bT>GWYCZpp$z~?W`W}O!BlkjmiZP2c!prD&Oh?_9iMiH862kzctt1u z`qPMf(L9Y$uw|0<#px40+eg);u`B>KXd;p6o)L>0$KR>nkz@>)M@&d*nDw(1VDeFb^5KrelO^Q|f_29FOndo4Vc zwUhbl!?1y(kG|vWCaa&dADCkRq;8yH60GaH=j8{g=;%+9GP1o|iavH`W(-ZFfu>Z8 zd5_gSL|@N8Wrva7z_*NLt&`G%0Z{;}Pno4iayF*#B_IR@!~QvSSy5P`pd@>p!Harn z?|TZ$JS5Uy3(6{T;_oEYJnb%Sc7a&9b+3?#CSvIb#9%HSo(D9RB2g9@-m@1!1H9!k zx%KP(7CPO{>We|c+Z6>fQc28zZS(rU z;dr(!r-a1Zf;D6LNLf{=iQ7dIKz<3Ysq?-^Eu>ePc7zb8h(=j_rt%YQY|G)k1^q1T_`v#7YN1FT;MP z=x}tdVeQ`-A~G{2=%Q@MfX2XX`-?z-dK*lQZQNyT0C3fU9s71~-i+mK1^)PvFJjOI zNSX|a@YfUCJ7aaN4AF^(6j2MH$oCrUXpgzoYXN8lqe>GX`1|!?`xFn*%42ojDLG>u z{DQrwW755X05}HPj>WT@qJpmwct`qV)y@e@k%&=V@RDP=vi`q4-MA0Xf-1vTnD3{> z-fIWtYa-;tG0R11ZnM4ea_ib!pJl$3>GrT(ZFDx>#Uqn zdTj)RDuhAu`$sp|XHY047wMKURoG2*#Nb`6_mI44@oEucJA)K9o;;eB=4tGLQNln1 zw49+ZdPx*fe9&wvP*Ld#%yBl-b(yEZ0ROgS)j+RtG$~!<;QGE;U zCNc4JJxZ0Ih^OPFfp2@VJMB0_iHz+lYb!&a-Vu4Z%eVM%`hP9YmEllRc0s46KA|+ zGkcdl%}9Q29d{4q>KN@ggSd;us=mi7j$@0G*bNJp&;0MX9REi>%YjXzS}8?(^Mgfg zB-p85b;gL&u6#m5&4*FUu=#3OeNH&)r^GTapp?%B5WFNpX5;#}=$ib-xzY<9_I1-jvSUFx}M``=AdZ?8KWP z6By2oIvHMcq1L8o9XyBvyCinA{ww)=W%71X&LC^5#e%T{pcP^*K5}G;_MFS!MJCrg zVft0f-K%?=L;2oWwC>gMYW^6fR>HawKQlA7$=7LM1s?&qe7G+Je>3iBk>y$xT)Sj% z$Tu^0ti0S$N%X}w-CH#_aHxz)e|dzUe*+PK`h6NiD2wvc?-SOF^Ce%cp?-S}+q8@f z)v|qIv5uJJSoykZ>DkIMc!xlmvcNi$YN{@Ywtehz^&tL}X#+soR%ozikYu<254V6#=a zR#O}>b207stdO>BSQ<1S@X7tuV03o}otPhgFX`n&_2B(Y8Zx=a0{^v%Xp8z=FvNEa z_OpRX8S;%+jsn!}k<_v^DhJzN@k#{*!a}~VgRT>d7yxMl0KbA{d^em$JFh4rmr!O{FtTn!CY!N?V2^tv9=3iuBv3%a}(pCOltWr1oBXhVno z3AzsjvWtS^KsppBti%j62y$?i#R|5@Opf60J}Ppv1k6aDtaW^GKkzjI)M2Lw0PYcZ z@sWHRls-sK)N?sG3s7_+*yZJ@iB7=$zpHYOE}u>C?cdap!J}W|I*=S$Jo%3TBp!(b z0+sz!y!od^+$m`Zcd%NW884Cr2OTTPh`}*JEnF@doLJ_2gsRY@0n_q~o2lPxtXcZZrJad*w?g|6n!>*4eqL zpPVgJyR=TAin)f~LL!YS&2A}FT}wCn3{-!BJb>E(A0hbq@;8DUk?X;i0JG*pW4~2i z;f^09i?~k}LM>SozkE_HrbnX{CM;AQa6Ay5mAN0w&83zY;YJbBnhH8c$MbaVhbt=W zF6%%>CrGO{K0dAuHOf`Za|UA}+FQdvHMav$43K)C8bU*vV|E=Rl2Z)aY1Gt*qtj{g zxRrsNNx~DV@Ze709l$6Aj1S-G)$ca#F>#w*AyPSz*WJuQ974u zsjN&Q8r|o-=e7dWFBHkYwjTCRPWDcIg;>6Ea`O;V4h3$~YHxhUuGh5NV9PC52RDN;&-1CGd{AF)+pw`xuD^Kc&G{dGQ2aCb~ zgEMgb4nh1~bsF`vuRv9Q<%($6-)?Rj?DKAeqO$UQ=0VzHMg>Sk{8m`lgI@LzAC5be zZ$FKYSog?$=fzN&J9Z4xcubV*lVk&Z<;0of7j5spwayO?eTjl2*rP1=TuXQNN`%4& zEP7)T9Fpt0?CsXpR#OCT;7et{V32sFLA?S7pbicS_YVsB)J=NXSTxY`-QaQ9ND+3r zMIM0q!Va?>aj{U$`le`&-*&u|8k-KMN%(faOhx24SyP``8o@lieDM~jc@!Q1FmlXu z{U({CmmEY(QE?PIWK1R!s`%%@u3RL|E>kM}`RVQFTi4}ey3@I0)s5&r?e5Y`Gmh{M z0v(fH(#rdLmAWrzy6#LB*{%WZO<75diHB$74umB+cxcVdo5i5V_lC@l4?mHGa8fq? zBS^5W6lbm-(0XAC97}j^1~v7JZTW-oRbh(nCa6LhE|7uWa>&thK9UU}j;U2DLHmz5 z0(0157J9&fqd7LcXWQ#}UrK7>?2VelzWd9Uu^~h>&dY0OJQ;jN{_O>hIVnqXxdak9 zm=90C@)%UwYT%=bUz-7oQyE3yyFU+e<+k z`;<>1@d>#@d`1b0%CldS`W zDRsh1YNjglw!dFTM>}KMGSfhir8+}&4iee6v9mp&!9wtUVc3*iOV4QSfHXr?4iZ0U z^I6#asbL!Zk540Ywn)49-Dc$Lx0ljABciEIL{FM z8*ZSU_UWiBG}RO4<2xm-&7mSXx%FED3~^Jm*9laBFSISfv*ClL{4H%G9fVPqc<(eU zEhESBTh*B!2G1b&(9eoK3x!>(lAOI@g^wFA-`yiXVc+91{;FEMb#>?DT9ZbY&5e++ z5hn}e`e5h-m%J;^I0LtFDDB`dV4ih&mGB<`1V8Qvw1L_*A*)YqO$`uUzIo=MGzW6bkNc9y0sOn1zMA0Cv?zG+PM(YdR1%(6v7znnO--B5lvm&g%$?@!j;ToPgwF`;Qc3DP%jg&RwGS$>lEA{+-}kQm^!m{TB0*rp`X4#*13@_hd$;jyHb)*Qyd2arl=3TPDEW zsv+6_NHFvJAB{5NJB*X7gdH~H%t9A_cmizcF4S|LE}jviPgtS|xK@ zUvCY9iLfDUVeEE2n-@=txw*JpH8oRE3xiB_s+x~MnVF(jYE%%slBR~)&r-H<3%aM1 zpI@HY&=B*IL-_Z}Jq@Y+TPz(byMlt{?|(oU1sk;Kd)sB^0Z7jw#hmz^z)WK+#?=x~}vArx3>5JznVPLUr z9o9Z$=bTEHxGCHu(R7ZSY^oiGF~4Sld8}r6%7IW`p*XW1wQ#WP_LT17G<8Uf<+o~uOnk{^{$K+5;wwuA z!)udPDxyGdE?kQ?7kNP%$|h3MKyVl!wQ`$Y>&Tc%U)y4qy@YkGr;n zj#e%u?bG}eo{e0WKeoVzmcSgLC@k-REZkD>e)=%rK&?tU)>s9Ey|AOIhvT@G^TWy1 zq;#t&W1UwJ3ZS0H9>wt~*f%Z5z7nIm@A}0|of{QPD^Gu?)ntjMVYY8i$c9uE0<;#2 znKRjId|Rs?=SO>n#1Af%qz#cL>b59fmcWyFF4 z?BNEzzT`XV5TFPMy-n@xT;6}a`v!Is{IfM`5G`vRPYcal1bclF?;U14UnOuGLhW@z z00&}!tgmNycc$Ise1C6zKC9*IEERCt@PxYte@>~jAWiqfOyj~iFJo}?$iG_`ico0t zANF!%)zw47=nsFLXo91-_GVao@rlPK5b%V{9D&(%$#a82{sdB8_l$^T% z*=7XL@&M+Qu$jNQdgO52Th7O>GuJ7Av{LmpliCX^nLabNfYa69{{FtnNour`oE9`e zzPL8GwiK0=4o5V-#{!kDi%U}{bd6-Ww(FsVv9a)1o(*M)Rv~(YDvu_$`t};M=s<8SS*V&P)$q* z0ZcnDA6Y>1;c2o1_Q|)LoK)977bQlqA9-c$9FJn$L_^G;u?>4{AoWVEz=yuABpp}D z1~?ax=F|D-z7sHd+ieDY`$g6yUCjOXOPPEQK+XWorKFUISunQ|m%jCb1H|{_8PP)Y z(BLF!XR~BM08*tA{DOP;a2hB8x~$0mEChT3l+?gbp~0Rvv^KZ*vsX|7QZ}}+vbqkm zm>>fOe;IuL9;~6SQsVW$`-1C#m6+Pxym_4&m3|Jn4XjVPg98QoGpX)8QZ+w!$Ps9` zvIEgvrQEp}vawlJs!ak!X=w?M=04kEvekZdcbAOhU9SgorXK|V?4f8U!*y?BD`gmj zUu)oEp8~KOo{_jWu1VrFT!n3FPyc}|zy#otE^*&`^D766C z7bRtfY&DPSxDH@Kez#w5Rrti0x;>@Sv2&?y+4tr@zD0Z=Pv!0=%T-GRV~oQQEiNt- zk3N`DWlT*?+1s}CME*pdw+%P`pN~!zvLu?E{i*+q3vlIN`_PGa zw1C(gKhKiB(pH$23?wFhpg;}Q$Co4L=)G|QEWQ!z!ng#OyrM z=AB2f!Ot~gL5C~t<&)&3&|$VCN=Im@hD4Rg#5g`{Un7J7qLs{GWE4AIeUf9r^w ze}TX&AWj3}HIU4H7Ib-`heLooHQyp1@|8Lya?cDsY5Dlc4|;-w8@KIMpe$eFo69kJ&4iWA_{vJ&>OEvl8NL5zZyGR=X4c(ayd*1H$kwhUN0g8;76Ah z)QYkSds5&v2V+gP|3{$GWxI*rXB8{{Vlo+Kh8IdqAD;|#;@IU4LL$j8- zg$)-4fik;+pw=?4Pn^nObEX3~a$Jv3c=akP&Glz-H;)6*U>E@nF_6gvaf9yGoo68A zgok^C^dfu#^4X;E3=;2!o(0WLZwa?jOPJLgYJg0Mzq-<15@XB)YFIUO^U_etaB=!nV4h=a#U z`VD_Ele@mSWI47`p}SSEb?iP#7Cm%$l!?>P`s5@?V_u(zD;~@9NGUgI91kZ~tThDF zn8yG+sRjh8i@WrWl{%$S<6nqVgqmIn*v54xu!xZob(TD}jop%whatd>9StUVR=Yb< zW>mG^oqLAz6u5&3u_#(Gzc4Gpqi3RIH?Au{U^wb+!RBYN^LziWDEB>l&|b{J@wxc2 zq$aieo6!E1p;m=}qbDo7xosBQ7DWS3NQy~GNl497c>Wwh0fp)vFpf0^00t{3<4x;W zp_GtE*Nu8L%C(L4;BGj-_s`EAvAShqcnxike~*WJyUDajz3fYltv)>K z3DbAIwQDd08TY+z^UDI6?%`i}@ogYYL~DFn0z~(dj<&vJQC^^;4-8mal8Ai32#B6r zK~H?}7REezjZ4OD_<^$}FRSWF%Ej=b8MhjA^>z(F_hvRF{$TDASdW98A|@FzF_*St z%&0`oV8Iw*K4O89pn5!Ack9;e@ByUJrUrb$l!*nkBaH`g;h)Ck4)dLEvTZ3$i&%qB zhQQ7>@IHlnspMv!F_DtCO2@uUw2UO*z84Xm&AxyA@}q}6_`6fSpe^*;%pX}>W-l#T zExfY)NH2k4;uGQFX?4W7l{sj>u?PH2#fAhWuW_*}c63JW`oh8z#odF`rA2_7Bjh1x zKow-aM&np}j07S&jt-a6?$2h+>6`oB)g!=nEVVFi;rV(B+l+3^*Dw8A(7-`)v)w1y znLlq3zuR0nmVzh*cyP%1mecR;zcYOXc@=VhGBnuCCbRd;+QiPo^d;4Y!B!$|p!U7- zUS7E`Pw%I!1^e^ZcvEy1UOuqA^b%!qjw)R8U`Oq8|DicoPB@bhv2o;~B=mx>e!XRm z{;Z+@GHZw56$-V~gR>~Z6OgN;{{R`YL8JG`uFya^R#26MMuT&^4t^T`)e=aDjT(>p zB7Qfl!ft^8>y;j{SA+Xl)(^gcZWVaZRp9x_$5;~Zp93$y;z>$6s?v_{dfW;SW^;MS zUCzzDDo~wsvUWa~r?AxPWdfnJ%owO-eUsiU?fXb6*a}HJfygVrr1-Efdm+aUbbzdM zckU8nX0D-2i83wa|D5Hwfpt~5iAw?Om1$fKhA@~QK`lkxZ2L<|-TI4^Zq8+Vuteun zuF2VzI_vrk<`V@*0}B$ItE)6;7jK7_0Dy>K2Mp^QLz8C%3QD4M-W&PR4Y=dV+`_8m zx>EHDJs}4f=N@3T{1Mk4N%N>Iv-C|9;;sx%z;ogx|Ca)mkVuYAw=4OBChm(~i`-Wv z63LDP8S5Txwyk2}5Mg~S;T!H8O8oBMkG>Hk)5VP6FIhTGRp>pYijHSRM+u!9nMv~^sUp{`UVj!AoHWxPN zS}g0IzW{P}djFPLOD=1F8EcU8{@8R3g3p2KTY^ij`7L-1e;eJ32V5oG_HgfeUg=v# z;bQH@sUZ`x6rj&l)f^3d`i-53;9pIO);&7fDPon&;Ce#$_sB3!j^q($D&9UGI<}6Y z73s^K`L#3w3{${usL{fBqklkX6N#KGa#=eePN{sI>nt&GJrk@)uxw-P)r-x2<*8>! z@&*8KueZXS5Cezy?juSQFAp=>^pRJ6Yvr5j&ZJ&ZT%28eoL!AaL8aRHBS&W{P6hg< zO-r|0d`ya*h`NiocNSM`u^&@4pxyd8j5JWFmO|_+2QsvvDtP64^(XP+W;P*~g1!{K z*FUg7&-hFaEcBcmG)CnN+^D|4aaR8B-vmvXh^*-}wR#yhZ=xfy1ppNzB4-i;rdzr9NgTZCAQ;SM zxt**!m_xrW5Uqmw=yB}%9HOPCO#ux*L@9zUfCKhGxdg7sZ$sl`a``SGfAtJkTIf@R z%yzRLS!cMoHlC&C7xzn;G+_tn|JSIN>+wY31*iA?TX9SsSA{{~-<)-2qvlBhjN zw2S_|=>r7>3y(?lW?e)fBWTHNbLd1Y`>KGoL)QtZv+o0j69XIikdc1}@P?)ycSi$N zhK-F)6t-bHP&Z^oRF!KwkdJ-q)(9XREfr!|luPyPqUMe!h2YlIA>XLG#R-2Qfzbll zA^ToVF&BwkfP#_k7JBd|T5vBfxS~Puf31!SXdHo0$`8oFq8LSxiPfp>pzi~=1&W(O zf@SN-yn=kE@gf&gNTk8&sJOhIxs5idSK60|f%W4CaGwOXUWHF9(p~dmq!ciq6OeGK zr~&Qw!wtS2SupW_4jgY8$A0+k2D<)e5U5ANs0rX%rBJXns>yvBkLdKbDR~cU)Cdjz zZ?3l4m6XBR)T;IcP$;xt`Z1pIH!TN}TRnoR_QRhpmwwv$FJXA4B?7<=k{7=wSXnW zHBqy5i6R4C%uH7N^N@D7$~#q6cZxtdsrb(hijBlt$SyvD`;B-pCO?qi|?4?c(tISrE)inTWf^=Z!J)7Owp z+_ZrqsFN*)MvI<9V0r8%<0*XF6ktbh+!p8|LJ8Ctprd&b5FCnQA=@y-wDcvwL2C5( zWIo~Ep%d}$`waeo`xD!6D_OajqOlEIM_a%?=l|IWW~l7$u~E>A7&$7y!M)D-P3FS( z6&cN+5bU7F1XHXF^-Eo*-^PZ|DXC`&i%ChfTB#O|$E@ zqVl6#+S;!a6l5-eskb(NXHHx(f7om0JCmfurbY!u1(bz5C`^-7>R@S{A+Z;ZV=xS@9 zSddJ(1B=7B^P0Z_%CpT!B9u82%*=OFmlgZg=1<}Sh1w=tfoP`}X{^+UPT3k5vNLq) z7HF*G)fn*Fk}E_?sXxvypizKG-QE6+rIAAax6-d)q)BeZ5I6$9U%)=W9~k+n9h>0^ zxq}XqH4_W2p6(Jxyp`NsL~=lI~3i;)IksDO6w$fUAMUhkJB?{`acl8kRab6TD|Cge0z0yc&J#X_E~ zCL3^{zEo7yxAM_{8pJwSJ4TScbn9ec(*4vOkKiD1yVn{_*RZJ1Yz{+w2bIxi>*@I? zwTx;Dej?1{Gs9qAPK6Io!QgbTq2VkX4`5l9Wwg!wFHESf;@ZVXcrq-_An}$P4=+pl zD|EO27RXmrfz7(!bJA^NfHLNG7W;F+(KtF9fPpfHG8Z+kMmQ_mL45po?|_A1W!X7Q zUKxoj0Gr)+=^XuBCE~Z(Ui^+l2vG4*6ZrtAnFE(R4*rGw&rp@|)Gn36hWf8x#RkX3 z48J2+4{e9spPcs1%gJIWQ2cc5ppj(+@Xl9b)@f!0710Ow{L!9LZj`J4+)r%Tm!+}^ z2NtrwcrjDW|32-;GPXvEq3(P?&f10)wQ&Gc{FCaXOCYU-LHoDxgSeYD-0IZth01{C zt@B$tUr@h!O~%F)X932x2K2|v;+_223mV$`yT8}erviqUQz|$AnA<5Y-g*#v!Oif~ zGpY44R~HE)vVjTVpL7d7?O1j`U!{=skKYt)Q1&H`= zfCG823{=n;jFuaC+rZIJy1+Tb{XM&$tltJ`OkqGQ4d_(Ct)&Pc} z6cO3;FN@x8yoxo839E8EhpVPk1|D_jSSXP&g6z=KWC@Ib_aejw4NgJYqkZ&x8`uv$ znt2ZI6BH6xj%Dg`N6ir_;-O0X9~g8LePp@;0(vH}(GcSY$4qv=rBvV`y zr=9ok)h-;_Ui8fXW3q<_CelnxSzAJ(Yayd>Y+;c5Ub_nzn7ww3&9g#YUt6<>n{d&7fEhE-a)Gi@Iem>UA;w9ogxU3JS8_s?Tt~2Y-&@ z+vfKkJo*3Sz@pZkee95->*$Zig5O)uJO=r2-mBk$;2Q~xH7&Or`9)cl^|HU9a}*e_ zE!#M7HS4Qm0V$Qh7a%p5asp7rpVk?EJyt4VSjCIuamT_u_R$t|YQ;j#BR57H*+L|R z++#^JHDM*~2s2`K@0hh%hjlTQy;@3IVPN?up}4FQKbR)a=ATxH{0=;lJq=(O{O_U>mmltjOWRtuorq)9^`aaIGb>SeaKJ_Xe%6`acaNTVFpWin9dy-16=O5O7ycMA)rpxV3 z(P05#Hm}3q?pgYO$E_q=jluJ@TZfH}jVyB3tvV14_5mbKsn5psgqM-m@tXPlAE;l4 z+#w3Fv!jtdJ{v<7R-aE2;A-u#CxaDH8lrT$=i8Dpwm&}u>xXU%;dm%dqfF1pO8kQH zfHyTPVafQm&4 zCB4w^eydY&Yywm(5C0{=ge=;A8_W3&YHdVFu3+wZ#?h)-1l{TuAt?>c-75HstF&7 zrWj^>V@&oHKj@-GF`(lS=b-bR%f3?%MUsqs)Q`KE4vkW-p#C2k>fMjKqM{-NyQ>!b z^zM01U%9cP38>QO>cc-?f|hx9+RlMX?w8-4&O*E6k{hSzdygR;#lUgAQ5;E!LWH7d z;ND*c&{@W-JU(1+Cd{k8Z+(O+&GZ`iW*a1$N=N2yrglA0`gG+O4@U4{V7QCPapQ?N z2a$o15rHGS!vW5fb7qp?AeuCv(d`B3&j>NWF`nLe_&nij)ARz9`R$= zb1bk0wBn??b6`A%s_E&o+<9vyo*D|VIorZq``yz6NTje*`&&Bp*>dwH0f;I;`<{sE z_eot%OhCSe_q4{X6mH{j@EaBH_$afP_N6$FLijEx_`;F6i-a}2&p^kfqC)Mhq>XdO z!-8Ys$}N^=D^R3Z-6%%=M-|Yjfo9GXA>D`YneDgM%ml*8C21H>Y&+kh_ObG@ks;J^B+_*KTKcUi6$qGR5i;A-QX%=BVZu% zrc*3b3f8&)=SEgo+5LUYgh(rxy49@23=OZ&J_a2JgHrJmd`jPTlqwF5&lpFSdJ8p0 zD6y?Fsv;N}*|Yuv{yp=Jb3wt#4Z!TPn_RwH<0&I_&5hm~8Lo{Q_-B)p~Ii?3ZouZ+73Y6PBUV4XDs)pLz+8&i{s0ExybyLdCMGOoKty~g6!9M7oY*hZhku7K@g>=+WF;LnUz{!6pdLwn}vZG&z* zX!`IPs8E2}OHWJbRm}oOh6&*oNfRz^L$Bf;P(z6>T(C9&My&_M!;-*()#D)b`zcue$t>gpQ- z61O;KYk;$44x=XkvYZ$NXb2S$kk>&GD#;fUW1Z%nm=cIe0ix;XHY^El4%bwIR^U+V-bhH7SJ;rG(?63CjU(mSV`u;*lOPf|`x#4mrdn%2^a8T3Fu z*4@D09X5`>ket5P?`1g{RB{+Z_AsZO}`Lp`#9!{w^?0Fu(nEu61Do9;8p@00XoxGUC6RUkm61(TUMQ%_g zm&PV1XHnu}MLg4%SR5zLdL=818V4sY$K0>li@OD$`5iyb9%5kA?T@7@E<3O2pxbYL z8YD*AuZNT#ZPkRlvbL2)x!W;?PjQ&`v3Tk9 zMSNmnA_cY4E$jJUVvOxi5ol901EX%h+kXqi3n0R*2jP)G{`my>!2husxt*LQO)IN; zU!U_!%D-2Pk{f=c@~6wl zsi?%UT^|iVE`ZjQuJMQ1}vjw z9bpYcHg4KMfsu^{zMr+0KuZH?j{E+WY0`d8uT@_18$ip_|7r$a8dhdFiUzYH^jRXb z`EYBZx4?|ChM2#91B9`spW8FmZWnR7H9B+j5ExSKs?uE0f_LUqqrmm{)SYsKODEAF z8uSY}wZ`{(-NO=TsQRk%F$J+nUZxId~CAq?Aeb(9+c9-0p zFD9oH8t;a~@M2J9Q4XMZrc!Jb%$BdHM(m>{#H1Q(>qhK-tvL_~!Pu4WCfs5ezt4p6 z-@c$sa5$3gbBr?ymax;%V~YF8CUa7nAk^(}wwXzIt^Hu8`czi7Bv!lnZos?doJ_WoKhEYPmI}%{(i?{v2q1ZeregE{_PN6qXsw0C2%eU&&{=fFK}z7iZ9C>}#o#M@JhA zs#^cARmRaAF8Ij9E|O3D(~E+%#d6wI!xIg-O8I2+dXpj8`aA- z%be?%REj0>LUf=$)6vn1r=m8*XFwt?K{;$UPw`A9 zFzpvlGms2lrr){_QX`X=`8da`0>SY%cfZs8SH6LH0+lMD3h;mBHDqLHfPG0YJ`P5< zo5=K>?(B?^lRGHaK5H9^`bz4wp<_k6DxcA+PcsuTZ{A}c%^kQjF9YzXM$^XnM%)Wy zlgpqFE_#*YvbWfBd;psHM>d}FBEu3Qak2UNKY~Bw+z`J0a}!sxU7P~dJzuv+(4VFx z{{x-(8vIv=IH&WYk#B!D4nm3?_^nhpk~PYk++bRuxIcG6W97%uY;y9+IRG1;EL%#{ zkDG|}PElmY3r}z9HuXs>Tx_d5CbIeu=MvP)sJ3Ey0<=wxO4LPK3~`x zZ?>ZS?>{k7m=Lk>=6z)v9{py-VpAIOGuB*JWUoi2;`+pXvmAb&v#5@}y|8@n-b{NY z)M;_q9WJ3Ct6?Sz4-neb4mZ_coq$KNYA&W40wm3N{H<+^)&LfJVPRu_TECCPVEn1y zy_nIWA09TaR;=)l!VU{?Z1_+C111`7_;>+O+0fr&sn2Rv`5p_k$i0ZVga-~gEdoM< z8?qd@tzYiuP>97c^>Xc-Q#|3SDWi5DQup54aTmn*_R4VyjT3OUa4%=lf2^pW>p@}A zy>+~tEUs$W1v~lcmw0EN^OYTcVAKU;koSkxe^EWUf*=jy(WPSQ08Vquw8 z^HC7+Q9R&h*XwC{+xLvVH$VBHf7!K_?9>kRW0Y=*FZFb(dQ&RpuBqt*D^j9?M`9Sq zuh;`W6ix9D*vW4(GIWq(fJR5K{mQLt&Fk=GO5)mQEk$29^2ZwN#g8Y!Ucg&q_PR%+ zckur9XC2PlWD(FuY6ZugLV#p@plSg1?pehwLlqqa{Vd*1q8h-C@ssmDBI^1&T62_~ zBHo_MS&j^d3X6>Vl`X^PpM&l+I&GP7*|fl}%sXrSuq>!lQs}3p=Yn(;qo-f8mAWK*dub{-^ufVn zX_F26`u+VeEoKD;MX1e_K)e+f*DqPg!njvdMLl9Muo>nLA}sT4)}85F4K;r)*rseaQ10_P<@e7LGFiA;2r2-fjINl1JE zd5;CrD%%v2f_MGkF2f7fh^Uhuxt`9W*=;NjjY}Jhvud)?LFM^~{T%TK*BfTwez)1) zZ3HOD1QOpYf-Y0&|6zW5^VP^`8A2W6<1V|Yv(DH@fAajVn&hP2s0ocI^2BE?vyW0R zb#GUj=G^%tLsFGaGiSCQoIh{@uNsPQYD!;1&cIh*s@b8EGG_O_vBxw^7bd@n-uHS(=+z`ZwJ2v+y@1`m3S*$QR?4A?NnRT9bPjggWo{bMYZYIsNh9` z7Al$w*lCD)dvATsEOuC|Hcg_Pt6%C0FbU@}hD!RMa@dXe*A|nf@9%3*y*#t-L%N zo|PH7lT1hEcYo8s9Kc|YM@X%PdwDQ0t`5dU-oyN{5*?#3p z@Yw|L+Q5+3uo>$eDYwqH8G7vLw^g!`$^M`+g1UZ zNN+3a{JnODz?yAsjeP0E9zE@IZT~tcTaTfn7Y-j@4k@c7hWkC=@kFVx=Uru?*7?4^ z8PjSGP(UKFe)oIv|IVCkO#NQCv;D-Z;4o&3E61U}xpG4W_98W;+$JZW&FTb$aGfy! z3Jg(a9Wf-h#u;yr)JBGfJ1r?v<6U1xuUT1PUUDNpFAtJ`3#(mQ%X_w|J&FlB=St(_ zf9SL7-^$o7Rz03pbD5^(xmKZ@<9qud1v|I0Sxe2gYtBr!pGiyb?)|FeRJ;?f1^gY} z-GQq7KZOi%0PO7qzHKdxX*K6TQ3a=9|#M8d_N>W$ZVxdQ}U@- zGs6bHu=C+!GxS;S6H}7Y+l;+y?G3v#`n16?IYFI+o7Q!_Gcp#IlCMmAIWg!L z@<#{tJRbLYlp_*nL4EyJhZ1lejh8@!!7T{&*|k_2aY++FBO~qtoFaQ3Rr+av>X&%N zY-3`>?(K`#$NSy{g75suDX99Sx$Q+X1XO=5Cj9bSJ%Uq#FDxl0O$-x?FJ}{kVycl8 zi(kJ+?r!=`JlS}OHeKH*Z4RVx#vN5m+h9i;q0VdkIiBV2JTV>S1Q2m;J$IY75%w5%Wd5}F^Oa7?|>s&y<0;b>! zS}Q!UY}eEl-7d*cX&U=HKdV4Er*J56q7sq;Of-q#fym35bKUdt=aB&;0UUssa{*qt zasxOudB#E@A)*lTe`>cDZ&5>RMKP;*CQ7BLXxXtixgba%AB0$94h#IvX2V$lGw!wP z2NpHYBDm~}X?zI%uxDzwBXH>eCLYRTLD#%Kq3Mm3ms38j<|eJl==d#BHviw(R+BJt zgp<-rM^0N(v50cjnx!G;F(c09bhu=aQ$E!b4tUiTG%{22X zzVO36iDLnromDN->XgfTk0^Vk@;$imu^80~6msHsehSx%g*Y!yee1uvKWTtBPxdv% z;kZJ2X+TkOqg?N{?m>?Xv?`}LeDw#nVqkKdl2ZPK-?A@0OH1UlZ=Umh6HHftP!mxz z?zokJR_g!7_USg4_Q=E)twlE43MQpnmUPgtt_)akrtk)$$SMceJMWSF(Fn}Is`-yb=efBFwgz}5w zrwo-b3j>J3-rjUcIu8vG%sXEs)7;0`F@V7ngM20JC;V;@{Wv(O>Pk7l@>X?dIc5Lq5E^9FDpe&G@UivAG_YLcw_w zKiXO8>&0pCp=mYHd9m)uo-Mg{5ikQNwh_tB+28jC+}Gy!rGO6)9C21^21+##NTX# zGeW@rFDWPpvgRY_XM7E`4%omFjiu6Dm6Xv9Fql}mM-b^+4O6lx^(_5chnX`MMnMZj zCf{(_Bb;*|C~zC6yO*b)P@|*4}cHOoKAADeAxh6yAdoVbCu+Y zQml7AO`Nl_;fCK&ze(GD<7yV^pwxC}_wZm}pVX35(2r{%r{db0A+HnvkY^D0q`l*- zzaYfiG;D0hTf&k!yJR_J+fB~E9^QN^8mv6?=Td(Rs()a@QgU%eqP_~87l&SF28|&H zQETGcZz(AZNgq(jAQL&6tWcA@4!k7bD45h9atpR$S14|&Wmz6lt2s$(PV(w#$Mf&* zIAg{QGN#B;`_(r*r6!P(3G6MSYso$UtN;Q5{`wUCPQ0I*51}G>9`O=`{`OThr(Iy< zc1}E5AySj?Sf0T1BYCK)&ve_z>wW<@lCD1X`OeNAQ5Ex}J3`A2D4L9yc}wHcrCkd= zH8C9>j|S|Q%lf%5M<0!HYz^c{g;^|sX+bVUoaQ>LhBV?RnwvMbA}ktmv*JW=i%FH5 z7x9LuSnX%j5&p%%@c*4K%JLo9O@RTy+k=Vl6S*h$16um;FQ55eF24mHH3=mCC`Ol&GFL?EB%|E@IJf;xl`+>*4|y~9 zK0Z*A6lTl8ttQkn0PW{{j*h6lJ~f{9ek7qK7i4Z!4_!Gt)J9Y+=2rWWm7H2sTd}Mos|TF z6II7?UKGWRPuZ^EC*NMUW@c?|>wnE3=wFuB#hoTV3n-5)I=Ss5k%S_ zShP3l;uZ8uy+*H3b`Pl)Ti^U2N-gV>gm~Ka>4W|oKdYpg-O#L1MBY{p)aQ}Itc&=A z5`dJ5$Mc0ek^6*{x340)I}Q)(4`>v)E(wnA?NtLq9u!lSwU-2_e<252dImZ=QrfRj zJfZRVuO7E1tF~6G>iuC8|MW&ZBd^)a=eJ5-hTE4am{L-X*vuY!vlcW@o0%AqKC%S; zP`S%KPct?t*SC^5tNtyO2^387vKv6#&8u07^JJdZXUx`-q3}R=ky=jvaXczuhdQt^8r=f z2PNEo&d6=DptrMH;{3GbBtYes_y=E4!0~Pfx%Kb`Ai0B$d%O(k0RT#(I&q zPZWwoypWNa0dS~qvU-di7zaGLnTe*xPJWwj`Q+o3WM6V&Ssut4~iSch|~7M8P{unGc}%{ z9ezyz4%e^j=goiOU3X_;Oc%3`t4Jrt_@05z}46 z^h`!$s8y776($2*vpcgO1q5oGtMdL(Pe*o6O7-$OH<7KRZu@bQHY;Gp6Y9Hhlw6N~ zCP4O3eZw>ATt0wuRP>m1L7Z8^U^H}wkzdDnAWem&c)KfCUbYOYKAUG6EsV{#XN^hw z=IL@vP7q4N=j>&P3(bQys$J|bwQa&^xm5#9=(@*TS5mU5c6 zt6@szAFazu2+}Js+6%_E+ymm8PVeH@$~k_Uxyn?AGV?wE06e-|mL|f0fM6(^`wjq} z%jvE-+KPZZ4XZMqQlB!|u%57SZEi0??$87rKqutCQo~7}|2v=?8E3t0B@g2fxbd^;>hTkR6I(P0wvC6j4PF6KJX31Z zF%}IQFrX82E&7s@0?;vcSCRp@ujq2=oOyLEX0 z-+KhlTZUs%nLt2h+mGo-NxejCe84Zc(Sa!_9mcb?>bXp{=cbhBaCjX(G`(&h|K{k$ z_vNoZc(Mi+^QA2KoH80m3!K*u-j1AgCT|Ak?3Td!eNs-7u}Oj$7H~lp6evO`GAAcu z0CPXQZ*Q)z5a{!Ybn(&EKq;jZzUY(UQE>xoPu^ZWDYE}nF=60jOjCTOtB0vkLc+6X z)}?UT<45p5m)xT(qa8cg*@mtA&x7ysKEc??Q)IF6E+J@0UWS6ONbKDggTilQjO4uZ zw=aW)?lBpe542D*HWUDSaT0^U@7zO=13@ddpCq=R255757zH)nPfriF^kJ+T4IQ=PR+h|;!>ZuY-G`~o-cijkjSuwIllvE2ll1-14mJj>i%CnE z7@AV%x=5N-RJ|BjtHof{!{NK7#TJoSGKB==z_9(YRs?#1W8hdq6+k9#TAhbhWpqwzM)0$s*0Y>SiTXzZ_D(dV#-oc4nb)%A@E-hLSWx zWvrLi7@l<5z)-LK_F{Lyd%Tt z1nNVpu`BJ3RCuw2FjxOtm(n?(S+q+MqFmJX`g9TR!Iu9WB~~nW(Mc^6x?y^?!Jm1+d zz-2HN8ZX4%YI~9QwuhLMR3wK6@ZJqgP5X;nR5H7vG|z5Bjr&E}PMdT`x-J=jtvVr} zX;|~26;aL7+wpuM&-C2x{P@0LLiy#Bb|7`4rWO)|r@?a?qLtkzZ{JjfGdXm$1W0pjfm$RSszT)0 zPeEgyGEyHD-OK!iwp7#p?4S`Xml=7)V1BX_kikGuL`8{PaBNPbhgOFAtA39F05+i? zJ;2T@sw_%#8<%p{Pa?6-^%aL$Fr~~@(fcm0WcZiGk&#hR_7ff6Ns&C`13A)ROfI>D zy5!sE7UpbE9{YYr)Ar~Z37X3P8{Mrhy7%V)k!x_YStAYCgb-JYCuwu>WRoY5e=gUG z`Jz=F4cp#56pFLvRsqkc(_!QGgR9AY-`Cf3h8@Ryv)eS=1e3{cSWM1s_S-HDWG57t zW^v-)a*usZgAa)sU}{IgIQ6y?^<{?=RkN0`kJUm&yu9=UU&zYx^T}9v>8ZKbAK#tY zKX?nc29n+Fb=nulu2pfu!n>p;>zXneF7n4-`{UdDFVcI>%PHAmU z1vT*u7SN{$oodb-jitTbK5-bkEQSS62sPdZ0F$tU0%(LZ_kG1%Zx6D0E)975eEHSC*l3+88c^W3kOZn&C}TLE07cq ze8gq`gW-0~8V>-~>2Kv!m`aLC5i)C!03#W;XthDJa`*`};yN~qIgG`-o$UPn9Gu;E zK|7@8vgQEJXX)&R6{dIDOrk8--uqwfbv&(ie#8o1b2wc}TAoTuR-B;q!F>r- zV;^Uc6dxcm1iDigs~hZLAGwI7xy~+QUs!gXNv^94?>8%C<&+a#;@3@ zD3#8<>)ij@ngH{(Afa;}AWZj!{qF>iax&a2hr}mtqS2Ay^h-hORGZ|YM8|G!9l{`J#5&0#~XA5 z*fzaxa;JiBax96oY&kH%ubqqt)N%C?hSs~-buh5-FwWB(1(A3tnv|3_NC?EN&myXU zg3TSYsPlRDo5sC`i;4ZD10var$K`U#sToD%0obZkgTh*7khvw^HLT4xd!bzPA}T+j zYz?w0PyAC5EfvLTLD%|NOw3#NLjgGa;;(2ui8YrN#R{6U-)bYOnYDH+R|hPWBvss{ z?FrB<4!AUH1qJ0f)9w$&<>c%~Ud!Y^?6|W%WUr;GOIYxjsAf`IkBZ9}xUT2lKIXvn zr%*(6Mt5DLt61YnZJ(tBC7dx=%hCgkd-zvNwnqu1`L_%E$H|F}j&FN(tx@Mz93%;x z+(ViE589D#^P_c!7zOM-30u=)HUkRhXC4~4&r-EI)xHG3gS>I;oT z2Lb3tjk-YcS0KQu-%}J%}dcl$VEP zRV}J#YqnwRNhJWcqWWYyML+kpEMWQX~!SLRU`c=lz7* zq<(Qbn_03uYVw+wuo-k`fJy8gSaIF_)ELiQ zC@KRwjMNO=ch)vVBrXdDMrMVt2R$0$=}UqeDMRgpY+hE&v2D*|A6j1-Z{D6=*f)hG zx@4s7uA0l@VB%D;I#axk_{+Pz?2!=f45^2+ZW5-UyPMJ$YZHMKoVYh0aZ!9tfiD|@ zmN~gd-U$9_e^+uN65L`x1Ln7Yzy1{=rhCmrqD7BTmuz1vYJU;w#n?Y?l` zu3+qY_n{DSsUj_wg0^`#teI}lHFmSJeRtwD`aZl&UGmTer7dP^Y=|ZL3+v5rKg{2n zd6w&rd3I%ul#8lk^QdX(vV)A8N>{=|RGpJDwf7-6gJ(RF)^;JqcT>cH7Uy#1#K$JU z1|&r}R|)#@s;CWrb+&E;+1yg`bQT1CXs&lHW(`TOg6|aG;dn=m0Zhr;GIS`jk>cW$wsdqCL$MXq(!dV?kSSrZ~p}OB(@>FAG`wn#YBz2}- z{Z${x_=ZfRj=%}Nhy94)N!a1?tv1m5@vc6Bl+5KEEFTo;KyCMA0@~VTy_Y_tz5*N- zTnB27jsS{u1SL7h-@?%92H@P3MUitpklE+`+|}9&=&))G68kww(lXUIo>eCHkCNJk zsDL(EIfxd)bZ|~X=kUjxYcIJ`@;6752F!rJ#bEtArxgK=WI2ew3wcIq?Ae}mZzk=@ zEjTD37(Qs0%S;1BywqG$T+{gKZ|v#jsZ+myOkKR{9(13T3!NI{j_sE^+4)-5t`}}Y z*Hl$Lu-U3o?-kH8NcEak3Z1UcK0dj6&UpTfx<2n#J`z|vPGozx0Ee44Rn2+)Ji1>3 zwi_+;?;twUV}@e_jOTE!*l}BPM{{VzfjX(2t1S%EEw`$l*>p7qtZTcEVT8D~)ucAf z=rR(UG}WYri$!YgY%hf0-^T@gcX0MUU4Ub!&IB_Y*I~h9l`;+5SR7XgL~;hhv`^4H z5CZ~(gMV7kHG=zTbMYWS{G!|0qMDwu=W?rACj;0?ih zdgxRq$Es_LC5IhWnTUlnpJs1*B*jBI=LQ)$8?Lw3X@z@*g@?BSw!5*-R_Dq&=P5Qo)yaPlu?8DiN&J{4P4o@*2K|Ac-tzmw2|Nh{% zRf?hEKEX{;%hqUP?}PgSV(!d4H($eyp}|*B|5zEJ5~82udxwR`$FaYC&gL#d!CF_N z@)#<|8q$9ufbVEGWY;GJCOlBFWDT{JU%Mbk`y#XGc$E5hzajN5TdvEjYJHGFVWwzBIOd?36oktq z+F>gXfKm=aZaS)&j9uJqz9<@y?W#3I=4o~o7DpPpm#b%mYLz4p8Jf)ZBXBa`v~USpq@^Qt?r-fxKdmj^WGp)p7&wYNUE04<_xbaYbvd41t~-w4`Ep#W zqPDd3niyd>?sJ&3e*rxn+z+Dlunkvp9$j4kedPxran6m=ntj?OSI?n(7RI{OCed_9 zzH69}G~FGvXt(GUSF0M9*-aU?9pavIhR=L+J{XdKO)B?Bg6;aA6Wq-9$8n6HZf|r(WIP;gZc(pPf z-rba8_m;M{p_ZOp^ID(XYay_kx3MYGEQ!0#5{3yf5P)&>ZcdD6=d=MW_Vkk1wtr!x zqNTMCn`gy*ZJpQXRO~@>VBCdm57-ETocom*c*topN?4?PLrxpF2Y(2XUz$T*CgL5J z3m-mgHO*17;UcbR@s!14sE5Sb!hvXz;~Xu&r3QSM_n5*JPK|1R^njg?lA-vCrsE1- z{qqh1zH_{fw9D1M_RkvX>lYq`b1U_8p$dE5Ly$>W1(YB-75a%#1+LNPC$FTkSQrxr&xPjA~5gJ>$FbQaQddSy#Xl9L}bVKG&z0xBu~ z>+t*O7#Rg6V`f57=vEoG?evx=J*Qb%h23mS&A4)j?qP$OYeq`Orrn-u+_~^Xm@RY| zWfu0BqLmtSp>CTM+`E$QiTaA7DIAR6@&y-+oo263o=h+O$%X&s(w|bWv{I7|7|~mh zsMc85&~oKmjU}ewb}8xXlArrc#OnTefDe*7v99mOxNv*f4`pex-I3-S4P}wy=A)%; z)MsU4?O*rg`hp>Vcpw&xFPxEXWVbr`nt)z~Qp|$AF?_t|o;$`Xt4?8ZPb^^fbQ-f2 z*UXz37#!<%EkKTWMsmTY=ji?`<05?ERRnGjmczx&W^`)yUN6B=I7C>HI-J`c;rI?Q zAuxmuXETv4D<+C)tRwAHd?!dPF6*ca=Jo!8ixPUxVQMOJ!=820ac&wj@j^AV&=eXf zNYaf@prpJ(r#mP|h69mEuL^VzlVV)aE)~J*udoV_Xo+fc^b-6?xz|3*>EUnG=k%M1 z#0iY^<_~0aeQ$#M#g*M?tEq18E9=}&4M^32nB~hmOzrxPwsCOg6TYX+$EDfx1uU565FU)Np#nExO5v7gj7!8}|4*1~@kJSH z-4?;ID;iXg?J)b9?@um@DJ3qROGN<|vbOPewD(CFT&vIJ`f)B_ zaF6{4i1oM{mheQ_jKL0{Ie)?H0Uju<1CY3KNTMrOWbR(MCuRvXj;P)=7({_UXx5XP zmypmnzF9N+@QW(Sz-QXt$c>VP#d+h`J<(@jpJ%@H8+XC{`Q5vjW@5ADnFal2ONW6@ zL>>@qhKh9{$_qVA`gyWq+uqR}AZIf+3aJUXuA|W51)s_z#EhlxoX0E>%#r>v0Ch8hB_p zRO9_R8QB42A`SNVweY$j1O7aq-Qs$`dol_=NobOyjR%23I%4biC?gBP+#ELEa{GMP zhc4jabUn~t+h;8bU(u&8@*f=ZLkdl5%KVXrn5Hj?Ka6B$HDysH-^k1=SIX@RIL|e& z@-SZJX}02uB3n6ElLfd1-oa0IAY?XJgU09R@CmICd=hxwueTHm)P}Yh=Y1a(jmUlf zr$U(TD;gV3BEB2L)*k|@2Rl0#x9kLCan`sU0r2XLrEF=bDI=h&Xi)p*EG1Qr7!JfV zTAyoP2mHmkW-FfU8YA$56;7K0JVRbM7`U(GD99*1IC@M&v}(sA5t4b*rvjvssN;)B zbU0u?g()ds0tec2P~l}LKO`PPSmC9T(&;dGJ~%}A64?139)>kAl^we_u*L`^3bd^UBtthFhr698RSs>v& zMzF3<{H!&X@3ggBOMv_or!T-R01~6&>Y5abfAX&Wj;1_56!l1o_Z9x?G@vC$(!BpU zIu-mKVZ;__mO3*xXUoNF>W7g;d2-*LIqLm0Tz^yQInI&OtB+QMwD4?5KWJ;e6dZIL z^5%3dMoA@&-wD4W3Qa;CMXdKv%GJ&FbZlOui_+ubl9Tgta{9+NFP@7HB^X>Idfk^? zGiY1i*?Z>>QO%;M-j~z)YMNciP)bT4cvhp)=87rq?jd&IaWyxk~ z#|R9X0o5&BaFdWd3YLr+PGhJ-Da26}Ky8*l^5eWJvq){9wB;Hc9Atn8m#yRZa)=#| zcf5Nbx7lG2k)mKV0#+KBNpq+`&lMDmf7R`W1(;WeY5*3Km4>2$Yxcr9h&=+>6+{Dm zO*LC{a6bO#Fg&DwTO3*#QmyE#Xxr#}!TQX^s*By_We!TO$Qs2Ps=!Lvh(MmjXAk zl@q4i1p#$^5oEkN4U7gT#C*Io!Q$T3lmWH!RIoxwJsxNW{Jkh@vyR$NPtTjgzo&=K z50VZi^P{fDwtx;^W)-D zAxnCTi@%FtZukSYwi^`PP7ZmS>!0tD0k{sz>( z8v4GITgCS=p|K>H+_C&<0Oh4Q%)cAwwzqu?i>`(lv%TF)87>AH`5;;RJATT=vjwWW zRm%&c+xNjgDHg0rofy+2 zu!3*-6x;{jy2X?1cT()>5jgz^&c$bGrzp$+`$uP1r2i6Z{`bSj`2R0|^RM0ef4?Pk z_K&9Ke?K`R^Z(7aS~>2^(K9I0(uk)|M(8hoVk7Zw}bfKf1RAfe@ElrG5B{K zoE(9F*TKJIaC#a1TND4?3#S*tzh~pWHSyn?_-{@8w_o_T68>8W|E+}oR>FTP;lGve c|3@p~h0-~-ov>B>Q+A)2u#`~76Lq)$3;$VXGynhq literal 0 HcmV?d00001 diff --git a/web/static/img/splash/apple-splash-2732-2048.png b/web/static/img/splash/apple-splash-2732-2048.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c390df4f2d93ee35e5a77922e058aa7851ebcd GIT binary patch literal 97166 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 z%0D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 literal 0 HcmV?d00001 diff --git a/web/static/img/no-image.png b/web/static/img/no-image.png new file mode 100644 index 0000000000000000000000000000000000000000..bdae7452fa154263d7706a2831255946b9cd781a GIT binary patch literal 59699 zcmeFYWmuM7w>FA^bP7nfG?LQYEosmK(kV5tRyE5ck?E?w+TE2rywn%$I<> ztdy&OtDv?nBx!qMXPx*y(IAb#>}#CRyNEgu+1*>w5d&o4Q6Cu4Qa`1db=0NypKqt3 z4ti&nFp;>vzLQU#TPj#a!%|8^d+F(U=0q_a+$>T4q3pdL(W5ItaXv-%x%t-Z_kkd~68bvs zwDHgG$l?Zo;^+cs)L{qJ z^}wf_g|h9Bw1eks<4wsIZp8bciZKrq6l>70SIcf9^h$zJoDcaRpsyN?WLP1-_rf?{iANiKHQYPQGz~SxpIrTM&`*Hy14N;oLlkRd=E|Y zlc4*<&DQ13MHtwD+$CK$1p_dLg1&LnVUM|PwBMcu_4GO84d3nh+5UXJnJZeRp&2~A zNnjU|gl4Gio)bE&qP$t164pAkT(=Gp5ruu+yYPMBGZw}5(l)Ew`W!bLH0_4uLHo@_ z-A!IUJo%-p(_d}&_s3it9hU3BaThkQ6$P5B3-(t*7WOR{ zJoHTrY=W3bap?bFB0_&3&_cj^KR<@ z7km7FHt@f)f7R*#JH^7SyZ<+Gx`ryr9*(>Q$?{ru zG?~wG9vlI49Fykppgff7a(0FW-~tcj9(O-uRL_xrAC3$}4G3pbflCbT=WZgeqWm}H zT;2=qFnY{CPylw;s9Yv8PPqOoR*X#ash8ZX9~G7|bG{Op5P#N4#Vhqnx&1UuqN9t>c}@U{7*TOr-T5&9 zDOiHb(v z?$LI~f7Zo|n9-FW_&rz*;h!ffe{c>hz#Z-+PV*@jhXDl(EsO*1D0fRhfB{4YNM852 zK2AoDcdC@{GJ1Z2J)lvrQ&;+F%BK}E*+K~lpq!7b?a$59Hl^^kg$O%gF_pt%vdndo zVw*q(87d|K!}PRuGz1m4nS3Sz*}8e2dg}x=Xn#;{lOcWFRq=XpP*rT4Ljv}R2!VfX zpHyqmJ-2C%Klrz=al4aOWNkR*gSY+4#W4jkEig?!`s!=Zm#v7f#cH`UxqT*Fw#j-3 zdu@p44uM!N>I{37)87}-s$siZBsetj_y1kY(GNMR&2Kn`HJ@AHmJ)3WIKIPW1Cz-> z76M!QIfJBIdql3g^-A-qh-{>ntMfThbnDe3|ChQTJu(K^TX5HCFY0qn*P2*T99mdp z6HKDkmHSa=_>>u+tO8{Q0p;1cbtdVwpqTV!7mu#ZP$z~{uW9M;Txp$fR7%XwRse=cJRZT7wejXOvP!hIf-Jrf$KMgN2%k zAn2vlQN@BH@<@5jB-~?#xPN}X^6%CYBgHA*0<8^kYVEVGL}+`tJDo$4E#kirKK%gO zyzLNWea;rg;_8Pg8Q(vJ6E9=$m?iXC;Mx8IlBbzY;#GP-&q%kE@tB{I(noR+q+sIR z2FoSxT5)sJSR<9zLW+|C_Yc;C-r@8vLu+hIyl^Nm0m$&1^!AX~)noT_^d(Ss#!aF{ zKPQ+*m0+Y1{Cz>(yFq~rE`~c*R;z587a^!cz=-DD(;Ut8lehFB3{RjlSv1@)ka
    tgc-@sBK1fX5u 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 Rc>sV;Q$zP**#qm>{{#O@{uBTJ literal 0 HcmV?d00001 diff --git a/web/static/img/opensubtitles.png b/web/static/img/opensubtitles.png new file mode 100644 index 0000000000000000000000000000000000000000..94c39a33b2ac064bb7bd5a36ef15d3f9e268bb0f GIT binary patch literal 15435 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
    dHQwuE`ttI=M;zy7;F>8|>gY%PL^@7&Cvs@x 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 literal 0 HcmV?d00001 diff --git a/web/static/img/person.png b/web/static/img/person.png new file mode 100644 index 0000000000000000000000000000000000000000..6efad30b8fd3114532f82055df9e5ba5d4f21f25 GIT binary patch literal 18781 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 F=>PP5atZ(d literal 0 HcmV?d00001 diff --git a/web/static/img/emby.png b/web/static/img/emby.png new file mode 100644 index 0000000000000000000000000000000000000000..6720f33df9ec974c0374ef44c7fbb8c0fbaf0143 GIT binary patch literal 33980 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