├── .gitignore ├── .idea ├── .gitignore ├── TTnews.iml ├── codeStyles │ └── codeStyleConfig.xml ├── inspectionProfiles │ └── profiles_settings.xml ├── jsLibraryMappings.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── README.md ├── clear_collection.py ├── get_a_bogus.js ├── get_hot.py ├── get_news.py ├── get_signature.js ├── package-lock.json ├── package.json └── test.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | local_settings.py 60 | db.sqlite3 61 | db.sqlite3-journal 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # IPython 80 | profile_default/ 81 | ipython_config.py 82 | 83 | # pyenv 84 | .python-version 85 | 86 | # pipenv 87 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 88 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 89 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 90 | # install all needed dependencies. 91 | #Pipfile.lock 92 | 93 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 94 | __pypackages__/ 95 | 96 | # Celery stuff 97 | celerybeat-schedule 98 | celerybeat.pid 99 | 100 | # SageMath parsed files 101 | *.sage.py 102 | 103 | # Environments 104 | .env 105 | .venv 106 | env/ 107 | venv/ 108 | ENV/ 109 | env.bak/ 110 | venv.bak/ 111 | 112 | # Spyder project settings 113 | .spyderproject 114 | .spyproject 115 | 116 | # Rope project settings 117 | .ropeproject 118 | 119 | # mkdocs documentation 120 | /site 121 | 122 | # mypy 123 | .mypy_cache/ 124 | .dmypy.json 125 | dmypy.json 126 | 127 | # Pyre type checker 128 | .pyre/ 129 | 130 | # Node.js modules 131 | node_modules/ 132 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # 默认忽略的文件 2 | /shelf/ 3 | /workspace.xml 4 | # 基于编辑器的 HTTP 客户端请求 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/TTnews.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-TTnews 2 | python爬虫文件,爬取今日头条首页各频道新闻信息(文章与视频),用于 [Vue3-TT-news-user](https://github.com/HZhertz-JXjrtyx/Vue3-TT-news-user) 添加新闻数据。 3 | 图片与视频资源会下载到本地文件夹,新闻信息会存储到mongoDB数据库。 4 | 5 | 需要安装node.js环境以及 ffmpeg 并进行相关环境配置, 6 | 今日头条的请求需要携带 _signature 参数,此参数可以通过运行 get_signature.js 脚本文件获得, 7 | 获取的视频信息中音频与视频资源是分开的,需要通过 ffmpeg 合并音频与视频 8 | -------------------------------------------------------------------------------- /clear_collection.py: -------------------------------------------------------------------------------- 1 | from pymongo import MongoClient 2 | 3 | # 连接到MongoDB数据库 4 | client = MongoClient('mongodb://localhost:27017/') 5 | db = client['TT_news'] 6 | 7 | # !!!清空数据库,运行此文件清空数据库 8 | db['articles'].delete_many({}) 9 | db['hot_list'].delete_many({}) 10 | db['users'].delete_many({}) 11 | db['videos'].delete_many({}) 12 | 13 | # db['administrators'].delete_many({}) 14 | db['comments'].delete_many({}) 15 | db['messages'].delete_many({}) 16 | 17 | 18 | -------------------------------------------------------------------------------- /get_hot.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | import re 4 | from bs4 import BeautifulSoup 5 | from pymongo import errors 6 | from urllib.parse import unquote 7 | from get_news import get_article_info, get_author_info, add_author, get_video_info, get_signature, take_article, take_video, articles_collection, videos_collection 8 | from get_news import HEADERS_, hot_list_collection 9 | 10 | 11 | # 获得作者主页url 12 | def get_author_url(url, type): 13 | print('----从article/video详情页网页结构中获取作者主页url信息,article/video Url:', url) 14 | res = requests.get(url, headers=HEADERS_) 15 | soup = BeautifulSoup(res.text, 'html.parser') 16 | if type == 'article': 17 | div = soup.find('div', class_='media-info') 18 | if type == 'video': 19 | div = soup.find('div', class_='author-card-wrapper') 20 | first_a = div.find('a') 21 | href = first_a['href'] 22 | if not href.startswith("https://www.toutiao.com"): 23 | href = "https://www.toutiao.com" + href 24 | print('href:', href) 25 | return href 26 | 27 | 28 | # 得到热点事件url 29 | def take_hot_event_url(url): 30 | print('----从热点trending页获取页面结构信息,trending页url:', url) 31 | res = requests.get(url, headers=HEADERS_) 32 | soup = BeautifulSoup(res.text, 'html.parser') 33 | encoded_str = soup.find('script', {'id': 'RENDER_DATA'}).string 34 | render_data = json.loads(unquote(encoded_str)) 35 | topic_feed_list = render_data['data']['topicFeedList'] 36 | title_list = [] 37 | for item in topic_feed_list: 38 | title_list.append(item['title']) 39 | print(title_list) 40 | if '事件详情' in title_list: 41 | print('有事件详情') 42 | block_title = soup.find('div', class_='block-title', string='事件详情') 43 | href = block_title.find_next('div', class_='block-content').find('a')['href'] 44 | return href 45 | elif '官方通报' in title_list: 46 | print('有官方通报') 47 | block_title = soup.find('div', class_='block-title', string='官方通报') 48 | href = block_title.find_next('div', class_='block-content').find('a')['href'] 49 | return href 50 | else: 51 | return 'other' 52 | 53 | 54 | # 得到热点事件信息 55 | def take_hot_event(item): 56 | if item['Url'].startswith("https://www.toutiao.com/trending/"): 57 | url = take_hot_event_url(item['Url']) 58 | else: 59 | url = item['Url'] 60 | print('----得到热点信息url:', url) 61 | if url.startswith("https://www.toutiao.com/article/"): 62 | news_type = 'article' 63 | article_id = re.findall(r'\d+', url)[0] 64 | print(article_id) 65 | article_info = get_article_info(url) 66 | author_url = get_author_url(url, news_type) 67 | author_info = get_author_info(author_url) 68 | # 如果作者信息不在数据库,则添加作者 69 | add_author(author_info) 70 | return { 71 | 'ClusterId': item['ClusterId'], 72 | 'Title': item['Title'], 73 | 'LabelUrl': item['LabelUrl'], 74 | 'Label': item['Label'], 75 | 'Url': url, 76 | 'HotValue': item['HotValue'], 77 | 'ImageUrl': item['Image']['url'], 78 | 'LabelDesc': item.get('LabelDesc', ''), 79 | 'Type': news_type, 80 | 'ArticleId': article_id, 81 | 'AuthorInfo': { 82 | 'user_id': author_info['user_id'], 83 | 'source_id': author_info['source_id'], 84 | } 85 | } 86 | elif url.startswith("https://www.toutiao.com/video/"): 87 | news_type = 'video' 88 | video_id = re.findall(r'\d+', url)[0] 89 | print(video_id) 90 | video_info = get_video_info(url) 91 | if not video_info: 92 | return 93 | author_url = get_author_url(url, news_type) 94 | author_info = get_author_info(author_url) 95 | # 如果作者信息不在数据库,则添加作者 96 | add_author(author_info) 97 | return { 98 | 'ClusterId': item['ClusterId'], 99 | 'Title': item['Title'], 100 | 'LabelUrl': item['LabelUrl'], 101 | 'Label': item['Label'], 102 | 'Url': url, 103 | 'HotValue': item['HotValue'], 104 | 'ImageUrl': item['Image']['url'], 105 | 'LabelDesc': item.get('LabelDesc', ''), 106 | 'Type': news_type, 107 | 'VideoId': video_id, 108 | 'AuthorInfo': { 109 | 'user_id': author_info['user_id'], 110 | 'source_id': author_info['source_id'], 111 | } 112 | } 113 | else: 114 | return None 115 | 116 | 117 | # 获取热点列表 118 | def get_hot_event(): 119 | # 清理数据库 120 | hot_list_collection.delete_many({}) 121 | signature_dict = get_signature() 122 | signature = signature_dict['hot_event_sig'] 123 | url = f"https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc&_signature={signature}" 124 | print('###热点列表请求URL:', url) 125 | hot_event_list = [] 126 | article_list = [] 127 | video_list = [] 128 | response = requests.get(url) 129 | data = response.json() 130 | data_list = data["data"] 131 | size = len(data_list) 132 | print(f"获取到{size}条热点列表数据") 133 | for item in data_list: 134 | print('<----newItem:', item) 135 | hot_event_data = take_hot_event(item) 136 | if hot_event_data: 137 | print(hot_event_data['Url'], hot_event_data['Type']) 138 | if hot_event_data['Type'] == 'article': 139 | take_article( 140 | article_list, 141 | { 142 | 'group_id': hot_event_data['ArticleId'], 143 | 'user_info': { 144 | 'user_id': hot_event_data['AuthorInfo']['source_id'] 145 | } 146 | }, 147 | { 148 | 'name': 'hot', 149 | 'channel_id': '3189398996', 150 | 'signature': 'hot_sig' 151 | }, None) 152 | if hot_event_data['Type'] == 'video': 153 | take_video( 154 | video_list, 155 | { 156 | 'group_id': hot_event_data['VideoId'], 157 | 'user_info': { 158 | 'user_id': hot_event_data['AuthorInfo']['source_id'] 159 | } 160 | }, 161 | { 162 | 'name': 'hot', 163 | 'channel_id': '3189398996', 164 | 'signature': 'hot_sig' 165 | }, 'avatar_hide|image_large|video') 166 | hot_event_list.append(hot_event_data) 167 | 168 | print(f"---->第{len(hot_event_list)}条{hot_event_data['Type']}热点数据:{hot_event_data}") 169 | # 将获取到的数据更新到数据库 170 | try: 171 | result = hot_list_collection.insert_many(hot_event_list, ordered=False) 172 | inserted_count = len(result.inserted_ids) 173 | print(f"Successfully inserted {inserted_count} hot_event documents to hot_list.") 174 | if article_list: 175 | result_all = articles_collection.insert_many(article_list, ordered=False) 176 | inserted_count_all = len(result_all.inserted_ids) 177 | print(f"Successfully inserted {inserted_count_all} hot_event documents to articles.") 178 | if video_list: 179 | result_video = videos_collection.insert_many(video_list, ordered=False) 180 | inserted_count_video = len(result_video.inserted_ids) 181 | print(f"Successfully inserted {inserted_count_video} video documents to videos from hot_event.") 182 | print('\n') 183 | except errors.BulkWriteError as e: 184 | # 处理错误 185 | print(e.details) 186 | 187 | 188 | # 获取热点列表 189 | get_hot_event() 190 | -------------------------------------------------------------------------------- /get_news.py: -------------------------------------------------------------------------------- 1 | import json 2 | import string 3 | import subprocess 4 | import re 5 | import ast 6 | import requests 7 | import time 8 | import random 9 | import os 10 | from bs4 import BeautifulSoup 11 | from pymongo import MongoClient, errors 12 | from urllib.parse import unquote, urlparse 13 | 14 | # 连接到MongoDB服务器 15 | client = MongoClient('mongodb://localhost:27017/') 16 | # 选择数据库 17 | db = client['TT_news'] 18 | 19 | articles_collection = db['articles'] 20 | videos_collection = db['videos'] 21 | users_collection = db['users'] 22 | hot_list_collection = db['hot_list'] 23 | 24 | # 设置请求头信息 25 | HEADERS = { 26 | "Cookie": 'tt_webid=7371011174069339682', 27 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" 28 | 29 | } 30 | HEADERS_ = { 31 | "Cookie": "ttwid=1%7CVlTXsez7Wqm6gwsoCgv0sNYytHBxfbI9jx04k1SL1K8%7C1716185670%7Ca230be9a075fc3821931d2e075a6c05b96c0fedd549d7eca4913ba5b97345385", 32 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" 33 | } 34 | 35 | # 频道信息 36 | CHANNEL = { 37 | 'finance': { 38 | 'name': 'finance', 39 | 'channel_id': '3189399007', 40 | 'signature': 'finance_sig', 41 | 'a_bogus': 'finance-a_bogus' 42 | }, 43 | 'technology': { 44 | 'name': 'technology', 45 | 'channel_id': '3189398999', 46 | 'signature': 'technology_sig', 47 | 'a_bogus': 'technology-a_bogus' 48 | }, 49 | 'hot': { 50 | 'name': 'hot', 51 | 'channel_id': '3189398996', 52 | 'signature': 'hot_sig', 53 | 'a_bogus': 'hot-a_bogus' 54 | }, 55 | 'international': { 56 | 'name': 'international', 57 | 'channel_id': '3189398968', 58 | 'signature': 'international_sig', 59 | 'a_bogus': 'international-a_bogus' 60 | }, 61 | 'military': { 62 | 'name': 'military', 63 | 'channel_id': '3189398960', 64 | 'signature': 'military_sig', 65 | 'a_bogus': 'military-a_bogus' 66 | }, 67 | 'sports': { 68 | 'name': 'sports', 69 | 'channel_id': '3189398957', 70 | 'signature': 'sports_sig', 71 | 'a_bogus': 'sports-a_bogus' 72 | }, 73 | 'entertainment': { 74 | 'name': 'entertainment', 75 | 'channel_id': '3189398972', 76 | 'signature': 'entertainment_sig', 77 | 'a_bogus': 'entertainment-a_bogus' 78 | }, 79 | 'digital': { 80 | 'name': 'digital', 81 | 'channel_id': '3189398981', 82 | 'signature': 'digital_sig', 83 | 'a_bogus': 'digital-a_bogus' 84 | }, 85 | 'history': { 86 | 'name': 'history', 87 | 'channel_id': '3189398965', 88 | 'signature': 'history_sig', 89 | 'a_bogus': 'history-a_bogus' 90 | }, 91 | 'food': { 92 | 'name': 'food', 93 | 'channel_id': '3189399002', 94 | 'signature': 'food_sig', 95 | 'a_bogus': 'food-a_bogus' 96 | }, 97 | 'games': { 98 | 'name': 'games', 99 | 'channel_id': '3189398995', 100 | 'signature': 'games_sig', 101 | 'a_bogus': 'games-a_bogus' 102 | }, 103 | 'travel': { 104 | 'name': 'travel', 105 | 'channel_id': '3189398983', 106 | 'signature': 'travel_sig', 107 | 'a_bogus': 'travel-a_bogus' 108 | }, 109 | 'health': { 110 | 'name': 'health', 111 | 'channel_id': '3189398959', 112 | 'signature': 'health_sig', 113 | 'a_bogus': 'health-a_bogus' 114 | }, 115 | 'fashion': { 116 | 'name': 'fashion', 117 | 'channel_id': '3189398984', 118 | 'signature': 'fashion_sig', 119 | 'a_bogus': 'fashion-a_bogus' 120 | }, 121 | 'parenting': { 122 | 'name': 'parenting', 123 | 'channel_id': '3189399004', 124 | 'signature': 'parenting_sig', 125 | 'a_bogus': 'parenting-a_bogus' 126 | }, 127 | 'video': { 128 | 'name': 'video', 129 | 'channel_id': '3431225546', 130 | 'signature': 'video_sig', 131 | 'a_bogus': 'video-a_bogus' 132 | }, 133 | } 134 | 135 | 136 | # 运行js脚本获得_signature参数 137 | def get_signature(): 138 | output = subprocess.check_output(['node', 'get_signature.js']) 139 | signature = output.decode('utf-8').strip() 140 | signature_str = re.sub(r'(\w+)(?=:)', r"'\1'", signature) 141 | signature_dict = ast.literal_eval(signature_str) 142 | return signature_dict 143 | 144 | 145 | # 运行js脚本获得a_bogus参数 146 | def get_a_bogus(): 147 | output = subprocess.check_output(['node', 'get_a_bogus.js']) 148 | print(output) 149 | a_boguses = output.decode('utf-8').strip() 150 | print(a_boguses) 151 | a_boguses_str = re.sub(r'(\w+)(?=:)', r"'\1'", a_boguses) 152 | a_boguses_dict = ast.literal_eval(a_boguses_str) 153 | return a_boguses_dict 154 | 155 | 156 | def get_image_list(html_content): 157 | soup = BeautifulSoup(html_content, 'html.parser') 158 | image_list = [img['src'] for img in soup.find_all('img') if 'src' in img.attrs] 159 | return image_list 160 | 161 | 162 | # 获得article信息 163 | def get_article_info(url): 164 | print('----从article详情页id为RENDER_DATA的script标签中获取信息,articleUrl:', url) 165 | res = requests.get(url, headers=HEADERS_) 166 | if res.history: 167 | print('注意: 请求的URL已重定向到', res.url) 168 | return 169 | soup = BeautifulSoup(res.text, 'html.parser') 170 | encoded_str = soup.find('script', {'id': 'RENDER_DATA'}).string 171 | render_data = json.loads(unquote(encoded_str)) 172 | try: 173 | seo_info = render_data['data']['seoTDK'] 174 | except KeyError: 175 | return 176 | print('title:', seo_info['title']) 177 | content = render_data['data']['content'] 178 | image_list = get_image_list(content) 179 | # print(image_list) 180 | return { 181 | 'content': content, 182 | 'title': seo_info['title'], 183 | 'description': seo_info['description'], 184 | 'keywords': seo_info['keywords'], 185 | 'publish_time': int(seo_info['publishTimestamp']) * 1000, 186 | 'type': 'article', 187 | # 'image_list': render_data['data'].get('imageList', []) 188 | 'image_list': image_list 189 | } 190 | 191 | 192 | # 获得作者信息 193 | def get_author_info(author_url): 194 | print('----从author详情页id为RENDER_DATA的script标签中获取信息,authorUrl:', author_url) 195 | res = requests.get(author_url, headers=HEADERS_) 196 | soup = BeautifulSoup(res.text, 'html.parser') 197 | encoded_str = soup.find('script', {'id': 'RENDER_DATA'}).string 198 | render_data = json.loads(unquote(encoded_str)) 199 | media_info = render_data['data']['profileUserInfo'] 200 | if not media_info.get('mediaId'): 201 | return 202 | print('avatar_url', media_info['avatarUrl']) 203 | avatar_url = '' 204 | save_path = 'D:\\work\\TTnews\\Vue3-TT-news-api\\public\\user_avatar' 205 | filename = download_image(media_info['avatarUrl'], save_path) 206 | if filename is not None: 207 | avatar_url = 'http://127.0.0.1:3007/user_avatar/' + filename 208 | if media_info['userVerified']: 209 | print('media_info', media_info) 210 | verified_content = media_info['userAuthInfo']['auth_info'] 211 | else: 212 | verified_content = '' 213 | print('author:', media_info['name']) 214 | 215 | user_id = int(media_info['mediaId']) 216 | 217 | while True: 218 | user_name = ''.join(random.choices(string.ascii_letters, k=8)) 219 | if not users_collection.find_one({'user_name': user_name}): 220 | break 221 | return { 222 | 'user_id': user_id, 223 | 'source_id': media_info['userId'], 224 | 'user_name': user_name, 225 | 'user_nickname': media_info['name'], 226 | 'user_avatar': avatar_url, 227 | 'user_gender': 0, 228 | 'user_intro': media_info['description'], 229 | 'user_verified': media_info['userVerified'], 230 | 'verified_content': verified_content, 231 | 'user_password': '$2a$10$NESWQAk4mCgU1WqNLtX0Gu6w1tSrFDEQY68LxHi2A1.m/R.vIe4/u', 232 | 'user_email': '', 233 | 'user_phone': '', 234 | 'user_state': 0, 235 | 'browse': {'article': [], 'video': []}, 236 | 'like': {'article': [], 'video': [], 'comment': []}, 237 | 'collect': {'article': [], 'video': []}, 238 | 'fans': [], 239 | 'followers': [], 240 | 'comment': [], 241 | 'message': [], 242 | 'works_count': 1, 243 | 'fans_count': 0, 244 | 'followers_count': 0, 245 | 'comment_count': 0, 246 | 'likes_count': 0, 247 | 'channel': { 248 | 'selected': [0, 1, 2, 3, 4, 5, 6, 7], 249 | 'unselected': [8, 9, 10, 11, 12, 13, 14, 15], 250 | }, 251 | 252 | } 253 | 254 | 255 | # 获得video信息 256 | def get_video_info(url): 257 | print('----从video详情页id为RENDER_DATA的script标签中获取信息,videoUrl:', url) 258 | res = requests.get(url, headers=HEADERS_) 259 | soup = BeautifulSoup(res.text, 'html.parser') 260 | encoded_str = soup.find('script', {'id': 'RENDER_DATA'}).string 261 | render_data = json.loads(unquote(encoded_str)) 262 | try: 263 | seo_info = render_data['data']['seoTDK'] 264 | except KeyError: 265 | return 266 | if render_data['data']['initialVideo']['videoPlayInfo']['video_duration'] < 2400: 267 | if 'video_list' in render_data['data']['initialVideo']['videoPlayInfo']: 268 | src = { 269 | 'video_src': render_data['data']['initialVideo']['videoPlayInfo']['video_list'][0]['main_url'] 270 | } 271 | video_style = 'audio' 272 | elif 'dynamic_video' in render_data['data']['initialVideo']['videoPlayInfo']: 273 | src = { 274 | 'video_src': render_data['data']['initialVideo']['videoPlayInfo']['dynamic_video']['dynamic_video_list'][0]['main_url'], 275 | 'audio_src': render_data['data']['initialVideo']['videoPlayInfo']['dynamic_video']['dynamic_audio_list'][0]['main_url'] 276 | } 277 | video_style = 'noaudio' 278 | print('videoTitle:', seo_info['title']) 279 | print('videoStyle:', video_style) 280 | return { 281 | 'video_id': render_data['data']['initialVideo']['group_id'], 282 | 'title': seo_info['title'], 283 | 'description': seo_info['description'], 284 | 'keywords': seo_info['keywords'], 285 | 'publish_time': render_data['data']['initialVideo']['publishTime'] * 1000, 286 | 'duration': render_data['data']['initialVideo']['videoPlayInfo']['video_duration'], 287 | 'src': src, 288 | 'image_url': render_data['data']['initialVideo']['coverUrl'], 289 | 'type': 'video', 290 | 'video_style': video_style 291 | } 292 | else: 293 | return 294 | 295 | 296 | # 如果作者信息不在数据库,则添加作者 297 | def add_author(author_info): 298 | if not users_collection.find_one({'user_id': author_info['user_id']}): 299 | users_collection.insert_one(author_info) 300 | print('新增作者') 301 | else: 302 | users_collection.update_one({'user_id': author_info['user_id']}, {'$inc': {'works_count': 1}}) 303 | print('已有作者,作品数量+1') 304 | 305 | 306 | # 下载图片 307 | def download_image(url, save_dir): 308 | response = requests.get(url, stream=True) 309 | if response.status_code == 200: 310 | # 解析URL以获取文件名 311 | a = urlparse(url) 312 | filename = os.path.basename(a.path) 313 | # 检查并更改文件扩展名 314 | file_ext = filename.split('.')[-1] 315 | if file_ext.lower() == 'image': 316 | file_ext = 'jpg' 317 | # 创建唯一的文件名 318 | filename = ''.join(random.choices(string.ascii_letters + string.digits, k=16)) + '.' + file_ext 319 | # 创建完整的保存路径 320 | save_path = os.path.join(save_dir, filename) 321 | with open(save_path, 'wb') as f: 322 | f.write(response.content) 323 | return filename 324 | else: 325 | print(f"Failed to download image from {url}") 326 | return None 327 | 328 | 329 | # 得到article信息 330 | def take_article(news_list, item, channel_item, ui_style): 331 | author_url = f"https://www.toutiao.com/c/user/token/{item['user_info']['user_id']}/" 332 | author_info = get_author_info(author_url) 333 | if not author_info: 334 | print('no media_id') 335 | return 336 | # 添加作者 337 | add_author(author_info) 338 | 339 | article_id = item['group_id'] 340 | article_url = f"https://www.toutiao.com/article/{article_id}/" 341 | 342 | article_info = get_article_info(article_url) 343 | if not article_info: 344 | print('no seo_info or redirection') 345 | return 346 | content = article_info['content'] 347 | image_list = [] 348 | save_path = 'D:\\work\\TTnews\\Vue3-TT-news-api\\public\\article_images' 349 | if not article_info['image_list'] == []: 350 | for element in article_info['image_list']: 351 | filename = download_image(element, save_path) 352 | if filename is not None: 353 | new_url = 'http://127.0.0.1:3007/article_images/' + filename 354 | image_list.append(new_url) 355 | content = content.replace(element, new_url) 356 | article_info['content'] = content 357 | article_info['image_list'] = image_list 358 | 359 | style = '' 360 | if ui_style: 361 | style = ui_style.split('|')[1] 362 | else: 363 | if len(image_list) >= 3: 364 | style = 'image_list' 365 | elif len(image_list) > 0: 366 | style = 'image_right' 367 | else: 368 | style = 'image_none' 369 | 370 | news_data = { 371 | 'channel_id': channel_item['channel_id'], 372 | 'type': 'article', 373 | 'article_id': item['group_id'], 374 | 'title': article_info['title'], 375 | 'description': article_info['description'], 376 | 'content': article_info['content'], 377 | 'image_list': image_list, 378 | 'cover_list': image_list, 379 | 'publish_time': article_info['publish_time'], 380 | 'keywords': article_info['keywords'], 381 | 'ui_style': style, 382 | 'user_id': author_info['user_id'], 383 | 'view_count': 0, 384 | 'collect_count': 0, 385 | 'comment_count': 0, 386 | 'like_count': 0 387 | } 388 | 389 | news_list.append(news_data) 390 | print(f"---->第{len(news_list)}条article数据:{news_data}") 391 | print('@———————————————————————————————————————————————————————————————————————————————————————————————') 392 | 393 | 394 | def take_video(video_list, item, channel_item, ui_style): 395 | author_url = f"https://www.toutiao.com/c/user/token/{item['user_info']['user_id']}/" 396 | author_info = get_author_info(author_url) 397 | if not author_info: 398 | print('no media_id') 399 | return 400 | # 添加作者 401 | add_author(author_info) 402 | 403 | video_id = item['group_id'] 404 | video_url = f"https://www.toutiao.com/video/{video_id}/" 405 | video_info = get_video_info(video_url) 406 | if not video_info: 407 | print('The video is too long') 408 | return 409 | style = ui_style.split('|', 1)[1] 410 | image_src = '' 411 | save_path = 'D:\\work\\TTnews\\Vue3-TT-news-api\\public\\video_images' 412 | filename = download_image(video_info['image_url'], save_path) 413 | if filename is not None: 414 | image_src = 'http://127.0.0.1:3007/video_images/' + filename 415 | 416 | # 设置保存位置 417 | video_save_path = 'D:\\work\\TTnews\\Vue3-TT-news-api\\public\\videos' 418 | # 设置 ffmpeg 可执行文件的绝对路径 419 | ffmpeg_path = 'D:\\develop\\ffmpeg-6.0-full_build\\bin\\ffmpeg.exe' 420 | # 输入文件的路径 421 | video_file = f'{video_save_path}\\video.mp4' 422 | audio_file = f'{video_save_path}\\audio.mp3' 423 | if video_info['video_style'] == 'audio': 424 | # 保存视频,无需合并 425 | video_src = video_info['src']['video_src'] 426 | video_content = requests.get(video_src).content 427 | print('保存视频,无需合并', video_info["video_id"]) 428 | with open(f'{video_save_path}/{video_info["video_id"]}.mp4', 'wb') as f: 429 | f.write(video_content) 430 | # 更新 video_info 431 | # video_info['src']['src'] = f'http://127.0.0.1:3007/videos/{video_info["video_id"]}.mp4' 432 | video_info['video_src'] = f'http://127.0.0.1:3007/videos/{video_info["video_id"]}.mp4' 433 | elif video_info['video_style'] == 'noaudio': 434 | # 需要合并视频和音频 435 | video_src = video_info['src']['video_src'] 436 | audio_src = video_info['src']['audio_src'] 437 | video_content = requests.get(video_src).content 438 | print('需要合并视频和音频', video_info["video_id"]) 439 | with open(video_file, 'wb') as f: 440 | f.write(video_content) 441 | audio_content = requests.get(audio_src).content 442 | with open(audio_file, 'wb') as f: 443 | f.write(audio_content) 444 | # 调用 ffmpeg 命令合并视频和音频 445 | cmd = f'{ffmpeg_path} -i {video_file} -i {audio_file} -c:v copy -c:a aac {video_save_path}\\{video_info["video_id"]}.mp4' 446 | subprocess.call(cmd, shell=True) 447 | # 删除临时文件 448 | os.remove(video_file) 449 | os.remove(audio_file) 450 | # 更新 video_info 451 | video_info['video_src'] = f'http://127.0.0.1:3007/videos/{video_info["video_id"]}.mp4' 452 | 453 | video_data = { 454 | 'channel_id': channel_item['channel_id'], 455 | 'type': 'video', 456 | 'video_id': video_id, 457 | 'title': video_info['title'], 458 | 'description': video_info['description'], 459 | 'duration': video_info['duration'], 460 | 'video_src': video_info['video_src'], 461 | 'cover_src': image_src, 462 | 'publish_time': video_info['publish_time'], 463 | 'keywords': video_info['keywords'], 464 | 'ui_style': style, 465 | 'user_id': author_info['user_id'], 466 | 'play_count': 0, 467 | 'collect_count': 0, 468 | 'comment_count': 0, 469 | 'like_count': 0, 470 | } 471 | 472 | video_list.append(video_data) 473 | print(f"---->第{len(video_list)}条video数据:{video_data}") 474 | print('@———————————————————————————————————————————————————————————————————————————————————————————————') 475 | 476 | 477 | # 获取新闻信息 478 | def get_news(channel_item): 479 | # signature_dict = get_signature() 480 | # signature = signature_dict[channel_item['signature']] 481 | 482 | a_bogus_dict = get_a_bogus() 483 | a_bogus = a_bogus_dict[channel_item['a_bogus']] 484 | print(a_bogus) 485 | 486 | # ms_token = 'dO4H_z33ACz0jVjSN8DffZDcFXs2VNYzV31Hxjt4MaOXiykfDomnkQpXXArnHDxJOfG09fWgDOMXW2-NIkk5PvRR0IqXOSNWBJtIOIEIhU39WyVcD-G5W7Fyz6KywUoMAw%3D%3D' 487 | url = f"https://www.toutiao.com/api/pc/list/feed?channel_id={channel_item['channel_id']}&min_behot_time=0&offset=0&category=pc_profile_channel&client_extra_params=%7B%22short_video_item%22%3A" \ 488 | f"%22filter%22%7D&aid=24&app_name=toutiao_web&a_bogus={a_bogus} " 489 | print(f"@@@{channel_item['name']}新闻请求URL:{url}") 490 | article_list = [] 491 | video_list = [] 492 | # 一次获取14~16条数据 493 | for i in range(1): 494 | print(url, HEADERS) 495 | response = requests.get(url, headers=HEADERS) 496 | print(response) 497 | print(response.text) 498 | data = response.json() 499 | data_list = data["data"] 500 | if channel_item['name'] == 'hot': 501 | data_list = data["data"][3:] 502 | size = len(data_list) 503 | print(f"第{i + 1}次获取到{size}条{channel_item['name']}数据,请求到的数据:{data_list}") 504 | 505 | for item in data_list: 506 | print('<----newItem:', item) 507 | if 'card_label' in item and item['card_label'] == '小视频': 508 | print('小视频') 509 | elif 'log_pb' in item and 'author_id' in item['log_pb']: 510 | if 'article_type' in item['log_pb'] and item['log_pb']['article_type'] == 'weitoutiao': 511 | print('微头条') 512 | elif 'ui_style' in item['log_pb']: 513 | if item['log_pb']['ui_style'] == 'avatar_hide|image_none': 514 | print('类型:文章image_none') 515 | ui_style = item['log_pb']['ui_style'] 516 | take_article(article_list, item, channel_item, ui_style) 517 | elif item['log_pb']['ui_style'] == 'avatar_hide|image_right': 518 | print('类型:文章image_right') 519 | ui_style = item['log_pb']['ui_style'] 520 | take_article(article_list, item, channel_item, ui_style) 521 | elif item['log_pb']['ui_style'] == 'avatar_hide|image_list': 522 | print('类型:文章image_list') 523 | ui_style = item['log_pb']['ui_style'] 524 | take_article(article_list, item, channel_item, ui_style) 525 | elif item['log_pb']['ui_style'] == 'avatar_hide|image_right|video': 526 | print('类型:视频image_right|video') 527 | ui_style = item['log_pb']['ui_style'] 528 | take_video(video_list, item, channel_item, ui_style) 529 | elif item['log_pb']['ui_style'] == 'avatar_hide|image_large|video': 530 | print('类型:视频image_large|video') 531 | ui_style = item['log_pb']['ui_style'] 532 | take_video(video_list, item, channel_item, ui_style) 533 | else: 534 | print('other') 535 | else: 536 | print('other') 537 | else: 538 | print('other') 539 | 540 | # 每次获取后间隔2~4秒 541 | time.sleep(random.uniform(2, 4)) 542 | # 将获取到的数据更新到数据库 543 | try: 544 | if article_list: 545 | result_all = articles_collection.insert_many(article_list, ordered=False) 546 | inserted_count_all = len(result_all.inserted_ids) 547 | print(f"Successfully inserted {inserted_count_all} {channel_item['name']} documents to articles.") 548 | if video_list: 549 | result_video = videos_collection.insert_many(video_list, ordered=False) 550 | inserted_count_video = len(result_video.inserted_ids) 551 | print(f"Successfully inserted {inserted_count_video} video documents to videos from {channel_item['name']} channel.") 552 | print('\n') 553 | except errors.BulkWriteError as e: 554 | # 处理错误 555 | print(f"Bulk write error: {e.details}") 556 | 557 | 558 | # # 获取财经新闻 559 | # get_news(CHANNEL['finance']) 560 | # # 获取科技新闻 561 | # get_news(CHANNEL['technology']) 562 | # # 获取热点新闻 563 | # get_news(CHANNEL['hot']) 564 | # # 获取国际新闻 565 | # get_news(CHANNEL['international']) 566 | # # 获取军事新闻 567 | # get_news(CHANNEL['military']) 568 | # # 获取体育新 569 | # get_news(CHANNEL['sports']) 570 | # # 获取娱乐新闻 571 | # get_news(CHANNEL['entertainment']) 572 | # # 获取数码新闻 573 | # get_news(CHANNEL['digital']) 574 | # # 获取历史新闻 575 | # get_news(CHANNEL['history']) 576 | # # 获取美食新闻 577 | # get_news(CHANNEL['food']) 578 | # # 获取游戏新闻 579 | # get_news(CHANNEL['games']) 580 | # # 获取旅游新闻 581 | # get_news(CHANNEL['travel']) 582 | # # 获取养生新闻 583 | # get_news(CHANNEL['health']) 584 | # # 获取时尚新闻 585 | # get_news(CHANNEL['fashion']) 586 | # # 获取育儿新闻 587 | # get_news(CHANNEL['parenting']) 588 | # 589 | # # 获取视频 590 | # get_news(CHANNEL['video']) 591 | -------------------------------------------------------------------------------- /get_signature.js: -------------------------------------------------------------------------------- 1 | const jsdom = require('jsdom') 2 | const { JSDOM } = jsdom 3 | const dom = new JSDOM(`

Hello world

`) 4 | 5 | window = global 6 | 7 | var document = dom.window.document 8 | var params = { 9 | location: { 10 | href: 'https://www.toutiao.com/?wid=1657855126033', 11 | protocol: 'https:' 12 | 13 | }, 14 | navigator: { 15 | userAgent: 16 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' 17 | } 18 | } 19 | 20 | Object.assign(window, params) 21 | 22 | // function setCookie(name, value, seconds) { 23 | // seconds = seconds || 0; 24 | // var expires = ""; 25 | // if (seconds != 0 ) { 26 | // expires = "; expires=" + (new Date((new Date).getTime() + 18E5)).toGMTString() + "; path=/;"; 27 | // } 28 | // document.cookie = name + "=" + encodeURIComponent(value) + expires + "; path=/"; 29 | // console.log(name + "=" + encodeURIComponent(value) + expires + "; path=/") 30 | // } 31 | // 32 | // cookies = "tt_webid=7225229386634774053; local_city_cache=%E4%B8%8A%E6%B5%B7; csrftoken=8d3a1168e86f605dc4d167394bda631c; _ga=GA1.1.1793597699.1682254819; s_v_web_id=verify_lgtf31y2_9Tm3WQCu_IsAB_4yFN_9Rk0_2g4bVyrIgynV; msToken=Hb0gCsRgUJxzyxfzHXu29O58JOc2cdm8OW2-wLa52Dm6M485B-q3QSFwGlUai9AQV1fPVEMVc_wLGa-nbIr5Qk_ZgR935C2OzzoAAnrLkI4=; tt_scid=XzuypENPTFJtLvhoERklm2DRhWkuKaE2wLpstL1JsJgobD2ZrgC.Jyxc4UMjF8Lz7c34; _ga_QEHZPBE5HH=GS1.1.1682254818.1.1.1682257391.0.0.0; ttwid=1%7CnF-AUQSZHLpOP_dqUG_ccaY9FpQXdXCvh7AK8usRfd4%7C1682257393%7Cb16b8df91e2f612c0a877ecb292bf68f6f04ba15926d9fde56deefb2d66a7491"; 33 | // 34 | // // 格式化 cookies ---> json 35 | // for(let cookie of cookies.split(";")){ 36 | // tmp = cookie.split("="); 37 | // setCookie(tmp[0], tmp[1], 1800); 38 | // } 39 | 40 | var glb 41 | ;((glb = 'undefined' == typeof window ? global : window)._$jsvmprt = function ( 42 | b, 43 | e, 44 | f 45 | ) { 46 | function a() { 47 | if ('undefined' == typeof Reflect || !Reflect.construct) return !1 48 | if (Reflect.construct.sham) return !1 49 | if ('function' == typeof Proxy) return !0 50 | try { 51 | return ( 52 | Date.prototype.toString.call( 53 | Reflect.construct(Date, [], function () {}) 54 | ), 55 | !0 56 | ) 57 | } catch (b) { 58 | return !1 59 | } 60 | } 61 | function d(b, e, f) { 62 | return (d = a() 63 | ? Reflect.construct 64 | : function (b, e, f) { 65 | var a = [null] 66 | a.push.apply(a, e) 67 | var d = new (Function.bind.apply(b, a))() 68 | return f && c(d, f.prototype), d 69 | }).apply(null, arguments) 70 | } 71 | function c(b, e) { 72 | return (c = 73 | Object.setPrototypeOf || 74 | function (b, e) { 75 | return (b.__proto__ = e), b 76 | })(b, e) 77 | } 78 | function n(b) { 79 | return ( 80 | (function (b) { 81 | if (Array.isArray(b)) { 82 | for (var e = 0, f = new Array(b.length); e < b.length; e++) 83 | f[e] = b[e] 84 | return f 85 | } 86 | })(b) || 87 | (function (b) { 88 | if ( 89 | Symbol.iterator in Object(b) || 90 | '[object Arguments]' === Object.prototype.toString.call(b) 91 | ) 92 | return Array.from(b) 93 | })(b) || 94 | (function () { 95 | throw new TypeError('Invalid attempt to spread non-iterable instance') 96 | })() 97 | ) 98 | } 99 | for ( 100 | var i = [], 101 | r = 0, 102 | t = [], 103 | o = 0, 104 | l = function (b, e) { 105 | var f = b[e++], 106 | a = b[e], 107 | d = parseInt('' + f + a, 16) 108 | if (d >> 7 == 0) return [1, d] 109 | if (d >> 6 == 2) { 110 | var c = parseInt('' + b[++e] + b[++e], 16) 111 | return (d &= 63), [2, (c = (d <<= 8) + c)] 112 | } 113 | if (d >> 6 == 3) { 114 | var n = parseInt('' + b[++e] + b[++e], 16), 115 | i = parseInt('' + b[++e] + b[++e], 16) 116 | return (d &= 63), [3, (i = (d <<= 16) + (n <<= 8) + i)] 117 | } 118 | }, 119 | u = function (b, e) { 120 | var f = parseInt('' + b[e] + b[e + 1], 16) 121 | return (f = f > 127 ? -256 + f : f) 122 | }, 123 | s = function (b, e) { 124 | var f = parseInt('' + b[e] + b[e + 1] + b[e + 2] + b[e + 3], 16) 125 | return (f = f > 32767 ? -65536 + f : f) 126 | }, 127 | p = function (b, e) { 128 | var f = parseInt( 129 | '' + 130 | b[e] + 131 | b[e + 1] + 132 | b[e + 2] + 133 | b[e + 3] + 134 | b[e + 4] + 135 | b[e + 5] + 136 | b[e + 6] + 137 | b[e + 7], 138 | 16 139 | ) 140 | return (f = f > 2147483647 ? 0 + f : f) 141 | }, 142 | y = function (b, e) { 143 | return parseInt('' + b[e] + b[e + 1], 16) 144 | }, 145 | v = function (b, e) { 146 | return parseInt('' + b[e] + b[e + 1] + b[e + 2] + b[e + 3], 16) 147 | }, 148 | g = g || this || window, 149 | h = 150 | Object.keys || 151 | function (b) { 152 | var e = {}, 153 | f = 0 154 | for (var a in b) e[f++] = a 155 | return (e.length = f), e 156 | }, 157 | m = (b.length, 0), 158 | I = '', 159 | C = m; 160 | C < m + 16; 161 | C++ 162 | ) { 163 | var q = '' + b[C++] + b[C] 164 | ;(q = parseInt(q, 16)), (I += String.fromCharCode(q)) 165 | } 166 | if ('HNOJ@?RC' != I) throw new Error('error magic number ' + I) 167 | m += 16 168 | parseInt('' + b[m] + b[m + 1], 16) 169 | ;(m += 8), (r = 0) 170 | for (var w = 0; w < 4; w++) { 171 | var S = m + 2 * w, 172 | R = '' + b[S++] + b[S], 173 | x = parseInt(R, 16) 174 | r += (3 & x) << (2 * w) 175 | } 176 | ;(m += 16), (m += 8) 177 | var z = parseInt( 178 | '' + 179 | b[m] + 180 | b[m + 1] + 181 | b[m + 2] + 182 | b[m + 3] + 183 | b[m + 4] + 184 | b[m + 5] + 185 | b[m + 6] + 186 | b[m + 7], 187 | 16 188 | ), 189 | O = z, 190 | E = (m += 8), 191 | j = v(b, (m += z)) 192 | j[1] 193 | ;(m += 4), 194 | (i = { 195 | p: [], 196 | q: [] 197 | }) 198 | for (var A = 0; A < j; A++) { 199 | for ( 200 | var D = l(b, m), T = (m += 2 * D[0]), $ = i.p.length, P = 0; 201 | P < D[1]; 202 | P++ 203 | ) { 204 | var U = l(b, T) 205 | i.p.push(U[1]), (T += 2 * U[0]) 206 | } 207 | ;(m = T), i.q.push([$, i.p.length]) 208 | } 209 | var _ = { 210 | 5: 1, 211 | 6: 1, 212 | 70: 1, 213 | 22: 1, 214 | 23: 1, 215 | 37: 1, 216 | 73: 1 217 | }, 218 | k = { 219 | 72: 1 220 | }, 221 | M = { 222 | 74: 1 223 | }, 224 | H = { 225 | 11: 1, 226 | 12: 1, 227 | 24: 1, 228 | 26: 1, 229 | 27: 1, 230 | 31: 1 231 | }, 232 | J = { 233 | 10: 1 234 | }, 235 | N = { 236 | 2: 1, 237 | 29: 1, 238 | 30: 1, 239 | 20: 1 240 | }, 241 | B = [], 242 | W = [] 243 | function F(b, e, f) { 244 | for (var a = e; a < e + f; ) { 245 | var d = y(b, a) 246 | ;(B[a] = d), (a += 2) 247 | k[d] 248 | ? ((W[a] = u(b, a)), (a += 2)) 249 | : _[d] 250 | ? ((W[a] = s(b, a)), (a += 4)) 251 | : M[d] 252 | ? ((W[a] = p(b, a)), (a += 8)) 253 | : H[d] 254 | ? ((W[a] = y(b, a)), (a += 2)) 255 | : J[d] 256 | ? ((W[a] = v(b, a)), (a += 4)) 257 | : N[d] && ((W[a] = v(b, a)), (a += 4)) 258 | } 259 | } 260 | return K(b, E, O / 2, [], e, f) 261 | function G(b, e, f, a, c, l, m, I) { 262 | null == l && (l = this) 263 | var C, 264 | q, 265 | w, 266 | S = [], 267 | R = 0 268 | m && (C = m) 269 | var x, 270 | z, 271 | O = e, 272 | E = O + 2 * f 273 | if (!I) 274 | for (; O < E; ) { 275 | var j = parseInt('' + b[O] + b[O + 1], 16) 276 | O += 2 277 | var A = 3 & (x = (13 * j) % 241) 278 | if (((x >>= 2), A < 1)) { 279 | A = 3 & x 280 | if (((x >>= 2), A > 2)) 281 | (A = x) > 10 282 | ? (S[++R] = void 0) 283 | : A > 1 284 | ? ((C = S[R--]), (S[R] = S[R] >= C)) 285 | : A > -1 && (S[++R] = null) 286 | else if (A > 1) { 287 | if ((A = x) > 11) throw S[R--] 288 | if (A > 7) { 289 | for ( 290 | C = S[R--], z = v(b, O), A = '', P = i.q[z][0]; 291 | P < i.q[z][1]; 292 | P++ 293 | ) 294 | A += String.fromCharCode(r ^ i.p[P]) 295 | ;(O += 4), (S[R--][A] = C) 296 | } else A > 5 && (S[R] = h(S[R])) 297 | } else if (A > 0) { 298 | ;(A = x) > 8 299 | ? ((C = S[R--]), (S[R] = typeof C)) 300 | : A > 6 301 | ? (S[R] = --S[R]) 302 | : A > 4 303 | ? (S[(R -= 1)] = S[R][S[R + 1]]) 304 | : A > 2 && 305 | ((q = S[R--]), 306 | (A = S[R]).x === G 307 | ? A.y >= 1 308 | ? (S[R] = K(b, A.c, A.l, [q], A.z, w, null, 1)) 309 | : ((S[R] = K(b, A.c, A.l, [q], A.z, w, null, 0)), A.y++) 310 | : (S[R] = A(q))) 311 | } else { 312 | if ((A = x) > 14) 313 | (z = s(b, O)), 314 | ((U = function e() { 315 | var f = arguments 316 | return e.y > 0 317 | ? K(b, e.c, e.l, f, e.z, this, null, 0) 318 | : (e.y++, K(b, e.c, e.l, f, e.z, this, null, 0)) 319 | }).c = O + 4), 320 | (U.l = z - 2), 321 | (U.x = G), 322 | (U.y = 0), 323 | (U.z = c), 324 | (S[R] = U), 325 | (O += 2 * z - 2) 326 | else if (A > 12) 327 | (q = S[R--]), 328 | (w = S[R--]), 329 | (A = S[R--]).x === G 330 | ? A.y >= 1 331 | ? (S[++R] = K(b, A.c, A.l, q, A.z, w, null, 1)) 332 | : ((S[++R] = K(b, A.c, A.l, q, A.z, w, null, 0)), A.y++) 333 | : (S[++R] = A.apply(w, q)) 334 | else if (A > 5) (C = S[R--]), (S[R] = S[R] != C) 335 | else if (A > 3) (C = S[R--]), (S[R] = S[R] * C) 336 | else if (A > -1) return [1, S[R--]] 337 | } 338 | } else if (A < 2) { 339 | A = 3 & x 340 | if (((x >>= 2), A < 1)) { 341 | if ((A = x) > 9); 342 | else if (A > 7) (C = S[R--]), (S[R] = S[R] & C) 343 | else if (A > 5) 344 | (z = y(b, O)), 345 | (O += 2), 346 | (S[(R -= z)] = 347 | 0 === z ? new S[R]() : d(S[R], n(S.slice(R + 1, R + z + 1)))) 348 | else if (A > 3) { 349 | z = s(b, O) 350 | try { 351 | if ( 352 | ((t[o][2] = 1), 353 | 1 == (C = G(b, O + 4, z - 3, [], c, l, null, 0))[0]) 354 | ) 355 | return C 356 | } catch (m) { 357 | if ( 358 | t[o] && 359 | t[o][1] && 360 | 1 == (C = G(b, t[o][1][0], t[o][1][1], [], c, l, m, 0))[0] 361 | ) 362 | return C 363 | } finally { 364 | if ( 365 | t[o] && 366 | t[o][0] && 367 | 1 == (C = G(b, t[o][0][0], t[o][0][1], [], c, l, null, 0))[0] 368 | ) 369 | return C 370 | ;(t[o] = 0), o-- 371 | } 372 | O += 2 * z - 2 373 | } 374 | } else if (A < 2) { 375 | if ((A = x) > 12) (S[++R] = u(b, O)), (O += 2) 376 | else if (A > 10) (C = S[R--]), (S[R] = S[R] << C) 377 | else if (A > 8) { 378 | for (z = v(b, O), A = '', P = i.q[z][0]; P < i.q[z][1]; P++) 379 | A += String.fromCharCode(r ^ i.p[P]) 380 | ;(O += 4), (S[R] = S[R][A]) 381 | } else A > 6 && ((q = S[R--]), (C = delete S[R--][q])) 382 | } else if (A < 3) { 383 | ;(A = x) < 2 384 | ? (S[++R] = C) 385 | : A < 4 386 | ? ((C = S[R--]), (S[R] = S[R] <= C)) 387 | : A < 11 388 | ? ((C = S[(R -= 2)][S[R + 1]] = S[R + 2]), R--) 389 | : A < 13 && ((C = S[R]), (S[++R] = C)) 390 | } else { 391 | if ((A = x) > 12) S[++R] = l 392 | else if (A > 5) (C = S[R--]), (S[R] = S[R] !== C) 393 | else if (A > 3) (C = S[R--]), (S[R] = S[R] / C) 394 | else if (A > 1) { 395 | if ((z = s(b, O)) < 0) { 396 | ;(I = 1), F(b, e, 2 * f), (O += 2 * z - 2) 397 | break 398 | } 399 | O += 2 * z - 2 400 | } else A > -1 && (S[R] = !S[R]) 401 | } 402 | } else if (A < 3) { 403 | A = 3 & x 404 | if (((x >>= 2), A > 2)) 405 | (A = x) > 7 406 | ? ((C = S[R--]), (S[R] = S[R] | C)) 407 | : A > 5 408 | ? ((z = y(b, O)), (O += 2), (S[++R] = c['$' + z])) 409 | : A > 3 && 410 | ((z = s(b, O)), 411 | t[o][0] && !t[o][2] 412 | ? (t[o][1] = [O + 4, z - 3]) 413 | : (t[o++] = [0, [O + 4, z - 3], 0]), 414 | (O += 2 * z - 2)) 415 | else if (A > 1) { 416 | if ((A = x) < 2) { 417 | for (z = v(b, O), C = '', P = i.q[z][0]; P < i.q[z][1]; P++) 418 | C += String.fromCharCode(r ^ i.p[P]) 419 | ;(S[++R] = C), (O += 4) 420 | } else if (A < 4) 421 | if (S[R--]) O += 4 422 | else { 423 | if ((z = s(b, O)) < 0) { 424 | ;(I = 1), F(b, e, 2 * f), (O += 2 * z - 2) 425 | break 426 | } 427 | O += 2 * z - 2 428 | } 429 | else 430 | A < 6 431 | ? ((C = S[R--]), (S[R] = S[R] % C)) 432 | : A < 8 433 | ? ((C = S[R--]), (S[R] = S[R] instanceof C)) 434 | : A < 15 && (S[++R] = !1) 435 | } else if (A > 0) { 436 | ;(A = x) < 1 437 | ? (S[++R] = g) 438 | : A < 3 439 | ? ((C = S[R--]), (S[R] = S[R] + C)) 440 | : A < 5 441 | ? ((C = S[R--]), (S[R] = S[R] == C)) 442 | : A < 14 && 443 | ((C = S[R - 1]), (q = S[R]), (S[++R] = C), (S[++R] = q)) 444 | } else { 445 | ;(A = x) < 2 446 | ? ((C = S[R--]), (S[R] = S[R] > C)) 447 | : A < 9 448 | ? ((z = v(b, O)), 449 | (O += 4), 450 | (q = R + 1), 451 | (S[(R -= z - 1)] = z ? S.slice(R, q) : [])) 452 | : A < 11 453 | ? ((z = y(b, O)), (O += 2), (C = S[R--]), (c[z] = C)) 454 | : A < 13 455 | ? ((C = S[R--]), (S[R] = S[R] >> C)) 456 | : A < 15 && ((S[++R] = s(b, O)), (O += 4)) 457 | } 458 | } else { 459 | A = 3 & x 460 | if (((x >>= 2), A > 2)) 461 | (A = x) > 13 462 | ? ((S[++R] = p(b, O)), (O += 8)) 463 | : A > 11 464 | ? ((C = S[R--]), (S[R] = S[R] >>> C)) 465 | : A > 9 466 | ? (S[++R] = !0) 467 | : A > 7 468 | ? ((z = y(b, O)), (O += 2), (S[R] = S[R][z])) 469 | : A > 0 && ((C = S[R--]), (S[R] = S[R] < C)) 470 | else if (A > 1) { 471 | ;(A = x) > 10 472 | ? ((z = s(b, O)), 473 | (t[++o] = [[O + 4, z - 3], 0, 0]), 474 | (O += 2 * z - 2)) 475 | : A > 8 476 | ? ((C = S[R--]), (S[R] = S[R] ^ C)) 477 | : A > 6 && (C = S[R--]) 478 | } else if (A > 0) { 479 | if ((A = x) < 3) { 480 | var D = 0, 481 | T = S[R].length, 482 | $ = S[R] 483 | S[++R] = function () { 484 | var b = D < T 485 | if (b) { 486 | var e = $[D++] 487 | S[++R] = e 488 | } 489 | S[++R] = b 490 | } 491 | } else 492 | A < 5 493 | ? ((z = y(b, O)), (O += 2), (C = c[z]), (S[++R] = C)) 494 | : A < 7 495 | ? (S[R] = ++S[R]) 496 | : A < 9 && ((C = S[R--]), (S[R] = S[R] in C)) 497 | } else { 498 | if ((A = x) > 13) (C = S[R]), (S[R] = S[R - 1]), (S[R - 1] = C) 499 | else if (A > 4) (C = S[R--]), (S[R] = S[R] === C) 500 | else if (A > 2) (C = S[R--]), (S[R] = S[R] - C) 501 | else if (A > 0) { 502 | for (z = v(b, O), A = '', P = i.q[z][0]; P < i.q[z][1]; P++) 503 | A += String.fromCharCode(r ^ i.p[P]) 504 | ;(A = +A), (O += 4), (S[++R] = A) 505 | } 506 | } 507 | } 508 | } 509 | if (I) 510 | for (; O < E; ) { 511 | j = B[O] 512 | O += 2 513 | A = 3 & (x = (13 * j) % 241) 514 | if (((x >>= 2), A < 1)) { 515 | var U 516 | A = 3 & x 517 | if (((x >>= 2), A < 1)) { 518 | if ((A = x) > 14) 519 | (z = W[O]), 520 | ((U = function e() { 521 | var f = arguments 522 | return e.y > 0 523 | ? K(b, e.c, e.l, f, e.z, this, null, 0) 524 | : (e.y++, K(b, e.c, e.l, f, e.z, this, null, 0)) 525 | }).c = O + 4), 526 | (U.l = z - 2), 527 | (U.x = G), 528 | (U.y = 0), 529 | (U.z = c), 530 | (S[R] = U), 531 | (O += 2 * z - 2) 532 | else if (A > 12) 533 | (q = S[R--]), 534 | (w = S[R--]), 535 | (A = S[R--]).x === G 536 | ? A.y >= 1 537 | ? (S[++R] = K(b, A.c, A.l, q, A.z, w, null, 1)) 538 | : ((S[++R] = K(b, A.c, A.l, q, A.z, w, null, 0)), A.y++) 539 | : (S[++R] = A.apply(w, q)) 540 | else if (A > 5) (C = S[R--]), (S[R] = S[R] != C) 541 | else if (A > 3) (C = S[R--]), (S[R] = S[R] * C) 542 | else if (A > -1) return [1, S[R--]] 543 | } else if (A < 2) { 544 | ;(A = x) < 4 545 | ? ((q = S[R--]), 546 | (A = S[R]).x === G 547 | ? A.y >= 1 548 | ? (S[R] = K(b, A.c, A.l, [q], A.z, w, null, 1)) 549 | : ((S[R] = K(b, A.c, A.l, [q], A.z, w, null, 0)), A.y++) 550 | : (S[R] = A(q))) 551 | : A < 6 552 | ? (S[(R -= 1)] = S[R][S[R + 1]]) 553 | : A < 8 554 | ? (S[R] = --S[R]) 555 | : A < 10 && ((C = S[R--]), (S[R] = typeof C)) 556 | } else if (A < 3) { 557 | if ((A = x) > 11) throw S[R--] 558 | if (A > 7) { 559 | for ( 560 | C = S[R--], z = W[O], A = '', P = i.q[z][0]; 561 | P < i.q[z][1]; 562 | P++ 563 | ) 564 | A += String.fromCharCode(r ^ i.p[P]) 565 | ;(O += 4), (S[R--][A] = C) 566 | } else A > 5 && (S[R] = h(S[R])) 567 | } else { 568 | ;(A = x) < 1 569 | ? (S[++R] = null) 570 | : A < 3 571 | ? ((C = S[R--]), (S[R] = S[R] >= C)) 572 | : A < 12 && (S[++R] = void 0) 573 | } 574 | } else if (A < 2) { 575 | A = 3 & x 576 | if (((x >>= 2), A > 2)) 577 | (A = x) > 12 578 | ? (S[++R] = l) 579 | : A > 5 580 | ? ((C = S[R--]), (S[R] = S[R] !== C)) 581 | : A > 3 582 | ? ((C = S[R--]), (S[R] = S[R] / C)) 583 | : A > 1 584 | ? (O += 2 * (z = W[O]) - 2) 585 | : A > -1 && (S[R] = !S[R]) 586 | else if (A > 1) { 587 | ;(A = x) < 2 588 | ? (S[++R] = C) 589 | : A < 4 590 | ? ((C = S[R--]), (S[R] = S[R] <= C)) 591 | : A < 11 592 | ? ((C = S[(R -= 2)][S[R + 1]] = S[R + 2]), R--) 593 | : A < 13 && ((C = S[R]), (S[++R] = C)) 594 | } else if (A > 0) { 595 | if ((A = x) < 8) (q = S[R--]), (C = delete S[R--][q]) 596 | else if (A < 10) { 597 | for (z = W[O], A = '', P = i.q[z][0]; P < i.q[z][1]; P++) 598 | A += String.fromCharCode(r ^ i.p[P]) 599 | ;(O += 4), (S[R] = S[R][A]) 600 | } else 601 | A < 12 602 | ? ((C = S[R--]), (S[R] = S[R] << C)) 603 | : A < 14 && ((S[++R] = W[O]), (O += 2)) 604 | } else { 605 | if ((A = x) < 5) { 606 | z = W[O] 607 | try { 608 | if ( 609 | ((t[o][2] = 1), 610 | 1 == (C = G(b, O + 4, z - 3, [], c, l, null, 0))[0]) 611 | ) 612 | return C 613 | } catch (m) { 614 | if ( 615 | t[o] && 616 | t[o][1] && 617 | 1 == (C = G(b, t[o][1][0], t[o][1][1], [], c, l, m, 0))[0] 618 | ) 619 | return C 620 | } finally { 621 | if ( 622 | t[o] && 623 | t[o][0] && 624 | 1 == (C = G(b, t[o][0][0], t[o][0][1], [], c, l, null, 0))[0] 625 | ) 626 | return C 627 | ;(t[o] = 0), o-- 628 | } 629 | O += 2 * z - 2 630 | } else 631 | A < 7 632 | ? ((z = W[O]), 633 | (O += 2), 634 | (S[(R -= z)] = 635 | 0 === z 636 | ? new S[R]() 637 | : d(S[R], n(S.slice(R + 1, R + z + 1))))) 638 | : A < 9 && ((C = S[R--]), (S[R] = S[R] & C)) 639 | } 640 | } else if (A < 3) { 641 | A = 3 & x 642 | if (((x >>= 2), A < 1)) 643 | (A = x) < 2 644 | ? ((C = S[R--]), (S[R] = S[R] > C)) 645 | : A < 9 646 | ? ((z = W[O]), 647 | (O += 4), 648 | (q = R + 1), 649 | (S[(R -= z - 1)] = z ? S.slice(R, q) : [])) 650 | : A < 11 651 | ? ((z = W[O]), (O += 2), (C = S[R--]), (c[z] = C)) 652 | : A < 13 653 | ? ((C = S[R--]), (S[R] = S[R] >> C)) 654 | : A < 15 && ((S[++R] = W[O]), (O += 4)) 655 | else if (A < 2) { 656 | ;(A = x) < 1 657 | ? (S[++R] = g) 658 | : A < 3 659 | ? ((C = S[R--]), (S[R] = S[R] + C)) 660 | : A < 5 661 | ? ((C = S[R--]), (S[R] = S[R] == C)) 662 | : A < 14 && 663 | ((C = S[R - 1]), (q = S[R]), (S[++R] = C), (S[++R] = q)) 664 | } else if (A < 3) { 665 | if ((A = x) < 2) { 666 | for (z = W[O], C = '', P = i.q[z][0]; P < i.q[z][1]; P++) 667 | C += String.fromCharCode(r ^ i.p[P]) 668 | ;(S[++R] = C), (O += 4) 669 | } else 670 | A < 4 671 | ? S[R--] 672 | ? (O += 4) 673 | : (O += 2 * (z = W[O]) - 2) 674 | : A < 6 675 | ? ((C = S[R--]), (S[R] = S[R] % C)) 676 | : A < 8 677 | ? ((C = S[R--]), (S[R] = S[R] instanceof C)) 678 | : A < 15 && (S[++R] = !1) 679 | } else { 680 | ;(A = x) > 7 681 | ? ((C = S[R--]), (S[R] = S[R] | C)) 682 | : A > 5 683 | ? ((z = W[O]), (O += 2), (S[++R] = c['$' + z])) 684 | : A > 3 && 685 | ((z = W[O]), 686 | t[o][0] && !t[o][2] 687 | ? (t[o][1] = [O + 4, z - 3]) 688 | : (t[o++] = [0, [O + 4, z - 3], 0]), 689 | (O += 2 * z - 2)) 690 | } 691 | } else { 692 | A = 3 & x 693 | if (((x >>= 2), A > 2)) 694 | (A = x) > 13 695 | ? ((S[++R] = W[O]), (O += 8)) 696 | : A > 11 697 | ? ((C = S[R--]), (S[R] = S[R] >>> C)) 698 | : A > 9 699 | ? (S[++R] = !0) 700 | : A > 7 701 | ? ((z = W[O]), (O += 2), (S[R] = S[R][z])) 702 | : A > 0 && ((C = S[R--]), (S[R] = S[R] < C)) 703 | else if (A > 1) { 704 | ;(A = x) > 10 705 | ? ((z = W[O]), 706 | (t[++o] = [[O + 4, z - 3], 0, 0]), 707 | (O += 2 * z - 2)) 708 | : A > 8 709 | ? ((C = S[R--]), (S[R] = S[R] ^ C)) 710 | : A > 6 && (C = S[R--]) 711 | } else if (A > 0) { 712 | if ((A = x) > 7) (C = S[R--]), (S[R] = S[R] in C) 713 | else if (A > 5) S[R] = ++S[R] 714 | else if (A > 3) (z = W[O]), (O += 2), (C = c[z]), (S[++R] = C) 715 | else if (A > 1) { 716 | ;(D = 0), (T = S[R].length), ($ = S[R]) 717 | S[++R] = function () { 718 | var b = D < T 719 | if (b) { 720 | var e = $[D++] 721 | S[++R] = e 722 | } 723 | S[++R] = b 724 | } 725 | } 726 | } else { 727 | if ((A = x) < 2) { 728 | for (z = W[O], A = '', P = i.q[z][0]; P < i.q[z][1]; P++) 729 | A += String.fromCharCode(r ^ i.p[P]) 730 | ;(A = +A), (O += 4), (S[++R] = A) 731 | } else 732 | A < 4 733 | ? ((C = S[R--]), (S[R] = S[R] - C)) 734 | : A < 6 735 | ? ((C = S[R--]), (S[R] = S[R] === C)) 736 | : A < 15 && ((C = S[R]), (S[R] = S[R - 1]), (S[R - 1] = C)) 737 | } 738 | } 739 | } 740 | return [0, null] 741 | } 742 | function K(b, e, f, a, d, c, n, i) { 743 | var r, t 744 | null == c && (c = this), d && !d.d && ((d.d = 0), (d.$0 = d), (d[1] = {})) 745 | var o = {}, 746 | l = (o.d = d ? d.d + 1 : 0) 747 | for (o['$' + l] = o, t = 0; t < l; t++) o[(r = '$' + t)] = d[r] 748 | for (t = 0, l = o.length = a.length; t < l; t++) o[t] = a[t] 749 | return ( 750 | i && !B[e] && F(b, e, 2 * f), 751 | B[e] ? G(b, e, f, 0, o, c, null, 1)[1] : G(b, e, f, 0, o, c, null, 0)[1] 752 | ) 753 | } 754 | }), 755 | (glb = 'undefined' == typeof window ? global : window)._$jsvmprt( 756 | '484e4f4a403f5243000d2d1aea78184c36c3d671000000000000ab44020000250074211b000b02430200013e2217000e1c211b000b03430200024017000e18011b000b02041c16004c211b000b04430200033e2217000b1c1b000b041e00041700181b000b04260200050a000118010a0002101c16001e180022011700051c131f0018011800131e00061a001d000727041c00261102000025552002000825000d1b000b081e00090101001f0702000a25000e211b000b094302000240001f0802000b25005b131e000c02000d02000e1a02221e000f24131e00100a000110220117003c1c0200002500131800221e0011240a0000100200123e00131e001301220117001a1c211b000b0a43020002402217000b1c1b000b0a1e001404001f090200152500131b000b0b1a00221e0016240a000010001f0a020017250039211800430200023e22011700081c1800263e17000702000000211800430200183e170012180017000902001916000602001a001800001f0b02001b25005218010117000802001c1f010200001f0618001f0e180e480039170033180618011b000b0c221e001d241b000b0c221e001e240a00001018011e001f2a0a00011019281f06180e2e1f0e16ffcb1806001f0c0200202500df0200021f0621134318063e22011700121c13221e0011240a00001002002140220117001c1c1b000b051e00221e0011221e002324130a00011002002140220117000d1c211b000b084318063e22011700201c1b000b08221e0011240a000010221e0024240200250a00011048003a220117000d1c211b000b0d4318063e22011700151c1b000b0d221e0011240a00001002002640220117000d1c211b000b0e4318063e17000520001b020b07260a00001001170028211b000b0f4318063e22011700151c1b000b0f221e0011240a00001002002740170005200012001f0d0200282500a3211801430200294017000400180002002a281f061801221e002b24131e000c02002c0200001a020a0001101f0748001f12181218071e001f3a17006618071812191f081808221e002d2448000a00011002002e3e17001a1808221e002f24480118081e001f0a0002101f0816ffd81808221e00242418060a00011048003e1700191808221e002f2418061e001f18081e001f0a0002100018122d1f1216ff95001f0e02003025007146000306000a271f22020000000500600200001f06131e003117001c131e0031221e00322418000a0001101f061806170006180600131e003317001c131e0033221e00322418000a0001101f0618061700061806001b020b0e2618001b000b081e00340a0002101f0618060007001f0f02003525009c460003060006271f2205008f131e0031170015131e0031221e003624180018010a0002101c131e0033170015131e0033221e003624180018010a0002101c49016d48182a483c2a483c2a4903e82a1f061b000b081800020037281d00341b000b08180002002a28180128020038281b000b0b1b000b0b1a00221e0016240a0000101806281a01221e0039240a0000102802003a281d003407001f1002003b25004c460003060006271f1e05003f131e0031170013131e0031221e003c2418000a0001101c131e0033170013131e0033221e003c2418000a0001101c1b000b081800020037281d003407001f1102003d2500a31b000b101a001f061b000b05221e003e24180602003f131e00061a002202000025000c1b030b00201d0040001d00410a0003101c1b000b11221e00422402004318060a0002101c13221700081c131e00442217000b1c131e00441e00451700091800201d00401b020b08260a00001017003013221700221c131e0046131e00472948643922011700101c131e0048131e0049294864391700091800201d0040001f1302004a25002b211343020002402217001f1c1b000b051e00221e0011221e002324131e004b0a00011002004c3e001f1402004d2500611b020b07260a0000100117005202004e1b000b0d420122011700111c1b000b0d1e004e1b000b12410122011700091c02004f134222011700091c020050134222011700091c0200511342220117000f1c020052134202005313423a0012001f150200542501661b000b0d1e005517000520000200561b000b05421700431b000b05221e0056241b000b0d0a0001101f101810221e0024240200550a00011048003b22011700151c1810221e0024240200570a00011048003b170005200013221700081c131e00582217000b1c131e00581e00592217000e1c131e00581e00591e005a17002a460003060006271f9605001e131e00581e0059221e005a240a0000101b000b063e17000520000702005b02005c02005d02005e02005f0200600200610200620200630200640200650a000b1f060200660200670200680a00031f07180708031fc918c921041700181fc8180718c8191fca1318ca19170005200016ffe7180608031fc918c9210417001b1fc8180618c8191fca131e006918ca19170005200016ffe4131e006908031fc918c921041700341fc818c8221e006a24131e000c02006b0200001a020a0001102217000f1c131e006918c81902006c19170005200016ffcb12001f1602006d2500c71b020b08260a0000101700291b000b13221e006e2402000f0a0001101f06180602000025000c1b030b00201d006f001d00701b020b09260a00001017005b46000306002c271f1a181a1e00711b000b14020072193e2217000e1c131e00311e001f48003e1700091800201d006f050029131e0031221e0036240200730200000a0002101c131e0031221e003c240200730a0001101c071b020b07260a000010170024131e007401221700121c131e007522011700081c131e00761700091800201d006f001f170200772500b11b020b07260a000010011700a21b000b08221e0078240200790a0001101f0618061e007a221e0011240a000010221e007b24131e000c02007c02007d1a020200000a000210221e00242402007e0a00011048003a220117003b1c1b000b0d1e0011221e0011240a000010221e007b24131e000c02007c02007d1a020200000a000210221e00242402007e0a00011048003a22011700181c1b000b0d1e004e221e0011240a00001002007f400012001f18020080250075131e000c0200810200001a021f0613221700081c131e00822217000b1c131e00821e008317004c131e00821e00831f071807221e0024240200840a00011048003e22011700151c1807221e0024240200850a00011048003e22011700111c1806221e000f2418070a000110170005200012001f190200862500961b020b1a1e008717000b1b020b1a1e00870046000306000a271f1e020000000500731b000b08221e0078240200790a0001101f0c180c221e0088240200890a0001101f0d180d221e008a2402008b0a0001101f0e180d221e008c24180e02008d190a0001101f0f180d221e008c24180e02008e190a0001101f10180f02008f281810281f111b020b1a18111d008718110007001f1b0200902501270200001f061b020b1a1e009117000f1b020b1a1e00911f061600fb48051f0e0a00001f0f1b000b0d1e004e1f10181022011700071c0a00001f1148001f121812180e3a1700b7460003060006271f3f0500a318111812191f130a00001f1448001f16181618131e001f3a1700371813221e00922418160a00011017001f1814221e0093241813221e00922418160a0001101e00940a0001101c18162d1f1616ffc418131e0095020000281f1518131e0096170011181518131e009602000028281f15181518131e009702000028281f1518151814221e0098240200000a000110281f15180f221e00932418150a0001101c0718122d1f1216ff47180f221e0098240200990a0001101f061b020b1a18061d00911806221e009a2448004904000a000210001f1c02009b2504631b000b0d1e009c221e009d240a0000101f061b000b0d1e009e221e009d240a0000101f0748001f0848011f0948021f0a48031f0b48041f0c48051f0d180d1f0e02009f1f0f0200a01f100200a11f110200a21f120200a31f130200a41f140200a51f150200a61f161806221e0024240200a70a00011048003b22011700151c1806221e0024240200a80a00011048003b17000a180c1f0e1600f71806221e002424180f0a00011048003b17000a18081f0e1600dd1806221e00242418110a00011048003b17000a18091f0e1600c31806221e00242418120a00011048003b22011700151c1806221e0024240200a90a00011048003b22011700151c1806221e0024240200aa0a00011048003b17000a180a1f0e16007b1806221e00242418130a00011048003b22011700141c1806221e00242418140a00011048003b22011700141c1806221e00242418150a00011048003b22011700151c1806221e0024240200ab0a00011048003b22011700151c1806221e0024240200ac0a00011048003b17000a180b1f0e160007180d1f0e1807221e00242418100a00011048003b221700091c180e18084017000820001601521807221e00242418120a00011048003b22011700141c1807221e00242418110a00011048003b22011700151c1807221e0024240200ad0a00011048003b221700091c180e180a40221700091c180e18094017000820001600f91807221e00242418160a00011048003b22011700141c1807221e00242418140a00011048003b22011700141c1807221e00242418150a00011048003b22011700141c1807221e00242418130a00011048003b221700091c180e180c40221700091c180e180b40170008200016008b1807221e00242418100a00011048003a221700141c1807221e00242418120a00011048003a221700141c1807221e00242418160a00011048003a221700141c1807221e00242418130a00011048003a221700141c1807221e00242418140a00011048003a221700141c1807221e00242418150a00011048003a1f001800180e180d3e40170005200048001f1748011f1848021f1948041f1a48051f1b181b1f1c1806221e0024240200ae0a00011048003b17000a18191f1c1600861806221e0024240200af0a00011048003b22011700151c1806221e0024240200b00a00011048003b17000a18181f1c1600541806221e0024240200b10a00011048003b17000a18171f1c1600391806221e0024240200b20a00011048003b22011700151c1806221e0024240200b30a00011048003b17000a181a1f1c160007181b1f1c1b020b1c260a000010221e009d240a0000101f1d1b020b1b260a000010221e009d240a0000101f1e181c18173f221700091c181c18183f2217002d1c131e005822011700231c1b000b0d1e00b4221e0011240a000010221e0024240200b50a00011048003b1700052000181c18173f221700091c181c18183f221700151c181d221e0024240200580a00011048003b1700052000181c181a3e2217000a1c181e0200003f170005200012001f1d0200b62500da261f0646000306000f271f121b000b081e00b71f060500191b000b08221e00b8240200b90a0001104800191f06071806263e170004001b000b08221e0078240200ba0a0001101f070200bb1b000b15264927101b000b0c221e001e240a0000102a480a0a000210280200bb281b000b0b1a00221e0016240a000010281f0818000200bc180828281f00180718001d00bd1318080200002500311b030b011800041c460003060006271f0c05001c1b030b06221e00be241b030b070a0001101c131b030b080907000d1806221e00bf2418070a0001101c001f1e0200c02500be18001e001f1f0618064802331f07180117003018001806480129191f0818074804291f07180818074803293a22011700091c1808180739170005260018081f0748001f09180918063a17004a180018091b000b16221e00c12418001809194900ff2f18001809194808354900ff2f18001809194810354900ff2f18001809194818354900ff2f0a0004100d18092d1f0916ffb41800221e0098240200000a0001101f0a1801170013180a221e002f24480018070a00021000180a001f200200c225007f18001e001f1f0618064802341f07180648032f48004017000818072d1f07180117001a1b000b1718074801281a011f081808180718060d16000d1b000b1718071a011f0848001f09180918063a17002c1808180948023423191800221e00c32418090a000110180948032f48033333300d18092d1f0916ffd21808001f210200c425000a18001400c52f001f220200c6250030180248053518014802333118014803351802480433312818001801311805180348032f180431191802312831001f230200c725001818001e001f48043a17000a180048041d001f1800001f240200c82500d618001e001f1f0618064801291f0718001807191f0948001f0a1b000b0c221e001d244806483418062b280a0001104800301f0d180d4800391700981b020b22180a1b020b1f28041f0a180a48023548032f1f0b48001f0c180c18073a17003d1800180c480128191f081800180c1b020b221800180c191b020b2326180a18081809180c180b18010a00061028040d271f09180c2d1f0c16ffc118004800191f08180018071b020b2218001807191b020b2326180a180818091807180b18010a00061028040d271f09180d2e1f0d16ff661800001f250200c92500d818001e001f1f0618064801291f0718004800191f081b000b0c221e001d244806483418062b280a0001101f0d1b020b22180d1b020b1f2a041f0a180a480040170093180a48023548032f1f0b18071f0c180c48003917003d1800180c480129191f091800180c1b020b221800180c191b020b2326180a18081809180c180b18010a00061029040d271f08180c2e1f0c16ffc118001807191f09180048001b020b2218004800191b020b2326180a180818094800180b18010a00061029040d271f081b020b22180a1b020b1f29041f0a16ff6b1800001f260200ca2501ac131e000c0200cb0200001a02221e000f2418000a0001101700061800000a00001f0618001e001f1f0748001f0848001f09180818073a1701641800221e00c32418080a0001101f0a180a4900803a170018180618091800221e002d2418080a0001100d16012a180a4908003a17002a180618091b000b16221e00c1244900c0180a48063430490080180a483f2f300a0002100d1600fa180a4a0000d8003a220117000c1c180a4a0000dfff39170036180618091b000b16221e00c1244900e0180a480c3430490080180a480634483f2f30490080180a483f2f300a0003100d1600ae180848012818073a1700991800221e00c32418084801280a0001101f0b180a4a0000dc003a2217000c1c4a0000dc00180b3c2217000c1c180b4a0000dfff3c170062180a4903ff2f480a33180b4903ff2f304a00010000281f0c180618091b000b16221e00c1244900f0180c481234483f2f30490080180c480c34483f2f30490080180c480634483f2f30490080180c483f2f300a0004100d18082d1f0816000d1b000b180200cc1a014718082d1f0818092d1f0916fe9a1806221e0098240200000a000110001f270200cd25024e1b000b1718011a011f0648001f0748001f0818001e001f1f09180718013a221700091c180818093a1702051800221e00c3241808222d1f080a0001101f0a180a4804341f0c180c480040170061180c480140170059180c480240170051180c480340170049180c480440170041180c480540170039180c480640170031180c480740170029180c480c4017002b180c480d40170023180c480e40170055180c480f401700a216016816017d18061807180a0d160173180818093a17002818061807180a481f2f4806331800221e00c3241808222d1f080a000110483f2f300d16000d1b000b180200ce1a0147160139180848012818093a17004018061807180a480f2f480c331800221e00c3241808222d1f080a000110483f2f480633301800221e00c3241808222d1f080a000110483f2f300d16000d1b000b180200ce1a01471600e4180848022818093a1700b4180a48072f4812331800221e00c3241808222d1f080a000110483f2f480c33301800221e00c3241808222d1f080a000110483f2f480633301800221e00c3241808222d1f080a000110483f2f304a00010000291f0b4800180b3c2217000c1c180b4a000fffff3c17002f18061807222d1f07180b480a344903ff2f4a0000d800300d18061807180b4903ff2f4a0000dc00300d16001b1b000b180200cf180b221e00112448100a000110281a014716000d1b000b180200ce1a014716001b1b000b180200d0180a221e00112448100a000110281a014718072d1f0716fdef180718013a17000a180618071d001f1b000b161e00c11b000b16180610001f280200d12502aa0a00001f061b000b174a000080001a011f0748001f0848001f0918001e001f1f0a180818013a221700091c1809180a3a1702431800221e00c3241809222d1f090a0001101f0b180b4804341f0e180e480040170061180e480140170059180e480240170051180e480340170049180e480440170041180e480540170039180e480640170031180e480740170029180e480c4017002b180e480d40170023180e480e40170055180e480f401700a216016816017d18071808180b0d1601731809180a3a17002818071808180b481f2f4806331800221e00c3241809222d1f090a000110483f2f300d16000d1b000b180200ce1a01471601391809480128180a3a17004018071808180b480f2f480c331800221e00c3241809222d1f090a000110483f2f480633301800221e00c3241809222d1f090a000110483f2f300d16000d1b000b180200ce1a01471600e41809480228180a3a1700b4180b48072f4812331800221e00c3241809222d1f090a000110483f2f480c33301800221e00c3241809222d1f090a000110483f2f480633301800221e00c3241809222d1f090a000110483f2f304a00010000291f0c4800180c3c2217000c1c180c4a000fffff3c17002f18071808222d1f08180c480a344903ff2f4a0000d800300d18071808180c4903ff2f4a0000dc00300d16001b1b000b180200cf180c221e00112448100a000110281a014716000d1b000b180200ce1a014716001b1b000b180200d0180b221e00112448100a000110281a01471808497fff4801293b17003518084801281f0d1807180d1d001f180618061e001f1b000b161e00c11b000b161807100d1801180d291f0148004801291f0818082d1f0816fdb11808480039170020180718081d001f180618061e001f1b000b161e00c11b000b161807100d1806221e0098240200000a000110001f290200d22500b418011b000b063e22011700081c1801263e22011700091c180148003a17000a18001e001f1f01180148003e17000702000000131e000c0200cb0200001a02221e000f2418000a000110220117001c1c131e000c0200d30200001a02221e000f2418000a00011001170021180118001e001f3e1700061800001800221e00d424480018010a0002100018014a0000ffff3a1700131b020b2826180018010a0002101600101b020b2926180018010a000210001f2a0200d525006b18001b000b063e22011700081c1800263e220117000c1c18001e001f48003e1700061800001b020b271800041f001b020b271801041f011b020b20261b020b25261b020b21261800200a0002101b020b241b020b21261801120a000210040a000210120a000210001f2b0200d625006718001b000b063e22011700081c1800263e220117000c1c18001e001f48003e1700061800001b020b271801041f011b020b2a1b020b20261b020b26261b020b21261800120a0002101b020b241b020b21261801120a000210040a000210200a00021004001f2c0200d725019d0200d81f0602002a1f0718021700080200001f07180117000718011f060200001f0848001f0a18001e001f180a4803283b1700b31800221e00c324180a222d1f0a0a0001104900ff2f4810331800221e00c324180a222d1f0a0a0001104900ff2f480833301800221e00c324180a222d1f0a0a0001104900ff2f301f0918081806221e002d2418094a00fc00002f4812340a000110281f0818081806221e002d2418094a0003f0002f480c340a000110281f0818081806221e002d241809490fc02f4806340a000110281f0818081806221e002d241809483f2f0a000110281f0816ff4518001e001f180a294800391700a81800221e00c324180a222d1f0a0a0001104900ff2f48103318001e001f180a3917001a1800221e00c324180a0a0001104900ff2f4808331600054800301f0918081806221e002d2418094a00fc00002f4812340a000110281f0818081806221e002d2418094a0003f0002f480c340a000110281f08180818001e001f180a3917001a1806221e002d241809490fc02f4806340a0001101600051807281f0818081807281f081808001f2d0200d92500120200da221e00242418000a000110001f2e0200db2501100200001f0648001f07180718001e001f4803293a1700f61b020b2e1800221e002d2418074800280a000110041f081b020b2e1800221e002d2418074801280a000110041f091b020b2e1800221e002d2418074802280a000110041f0a1b020b2e1800221e002d2418074803280a000110041f0b18061b000b16221e00c12418084802331809480435300a000110281f061800221e002d2418074802280a00011002002a3f17002718061b000b16221e00c12418094804334900f02f180a480235480f2f300a000110281f061800221e002d2418074803280a00011002002a3f17002118061b000b16221e00c124180a4806334900c02f180b300a000110281f0618074804281f0716ff021806001f2f0200dc25004a1800483f2f1f001b000b16221e00c12418001800481a3a1700084841160025180048343a17000848471600181800483e3a17000b48004804291600084800481129280a000110001f310200dd2500331b020b311f06180618004818340418061800481234042818061800480c340428180618004806340428180618000428001f320200de2500981b020b121e00df0200e0281f061b020b1e26180602000025007818001e001f48083a17000400460003060006271f7405005f1b020b2c261b020b2f1800221e009a2448080a000110041800221e009a24480048080a0002100a0002101f0c180c0200e13e1700131b020b38262018000a0002101c160019180c0200e23e1700101b020b38261218000a0002101c07000a0002101c001f370200e325004e1b020b1218001d00e4460003060006271f1e050038131e0031170016131e0031221e0036240200e518010a0002101c131e0033170016131e0033221e0036240200e518010a0002101c07001f380200e62500a90200001f06460003060006271f2305003f131e0031170015131e0031221e0032240200e50a0001101f0618060122011700081c131e0033170015131e0033221e0032240200e50a0001101f06071806170055460003060006271f430500491b020b2c261b020b2f1806221e009a2448080a000110041806221e009a24480048080a0002100a0002101f2318230200e13e170008200016000e18230200e23e17000512000712001f390200e7250103121f061b020b121e00e4203e170009201f061600201b020b121e00e4123e170009121f0616000e1b020b39260a0000101f06131e00061a0022121d00e822121d00e922121d00822218061d00ea22121d00eb22121d004022121d00ec22121d00ed22121d005522121d006f22121d00ee220200ef25000520001f4018401d000f1f0718071b020b0d260a0000101d00eb18071e00eb011700671b020b131807041c1b020b171807041c18071b020b14260a0000101d00ec18071b020b15260a0000101d00ed18071b020b16260a0000101d005518071b020b18260a0000101d00ee18071b020b19260a0000101d008218071b020b1d260a0000101d00e91807001f3a0200f025005c1b000b05221e00f12418000a0001101f0648001f0718061e001f4801291f08180848003b1700321800180618081919170008480116000548001f09180918061e001f180829480129331807301f0718082e1f0816ffcc1807001f3b0200f225003848001f06180618011e001f3a17002618004a0001003f2a1801221e00c32418060a000110284800351f0018062d1f0616ffd51800001f3c0200f325003848001f06180618011e001f3a17002618001801221e00c32418060a000110314a0001003f2a4800351f0018062d1f0616ffd51800001f3d0200f42500a348001f06180618011e001f3a1700911801221e00c32418060a0001101f0718074a0000d8003b2217000c1c18074a0000dbff3c2217000c1c180618011e001f3a1700451801221e00c32418064801280a0001101f0818084a0000fc002f4a0000dc003d17002218074903ff2f480a3318084903ff2f284a00010000281f0718064801281f0618004a0001003f2a1807284800351f0018062d1f0616ff6a1800001f3e0200f5250077180022011700071c0200001f061806221e007b24131e000c0200f60200001a020200000a0002101f061806221e0024240200e00a0001104800480129401700211806221e00d42448001806221e0024240200e00a0001100a00021016000518061f061806170008180616000602008f1f061806001f3f0200f72500b1180022011700071c0200001f061806221e006a24131e000c0200f80200001a020a0001101f0718071700161807480019221e00d42448010a0001101600060200001f0618061700141806221e002b240200f90a000110160004261f08131e00061a001f09180817004548001f0a180a18081e001f3a17003618091808180a19221e002b2402002a0a0001104800191808180a19221e002b2402002a0a0001104801190d180a2d1f0a16ffc51809001f400200fa25009118000122011700171c1b000b19221e00fb2418000a0001100200fc3e17000a131e00061a00001b000b05221e00f12418000a000110221e00fd240a0000101f06131e00061a001f0748001f10181018061e001f3a170037180117001a180718061810191800180618101919020000280d1600131807180618101918001806181019190d18102d1f1016ffc41807001f410200fe2500781b000b17221e00ff2418000a0001101700131800221e0100241b020b420a0001100018001b000b05411700491b000b05221e00f12418000a000110221e00fd240a0000101f0c180c221e010124020000250017180018011b020b421b030b00180119040d180000131e00061a000a000210001800001f4202010225007d18000122011700171c1b000b19221e00fb2418000a0001100200fc3e170007020000001b000b05221e00f12418000a000110221e00fd240a0000101f060200001f0748001f10181018061e001f3a170029180718061810190a000102002a281800180618101919280200f928281f0718102d1f1016ffd21807001f430201032500cb1b000b08221e0078240200790a0001101f07180748301d0104180748101d01051807221e0088240201060a0001101f0818080201071d01081808221e01092402010a4802480c0a0003101c180848021d010b180848011d010c180802010d1d010e1808221e010f24480848084808480048020a0005101c1808221e0110240a0000101c1807221e007a240a0000101f0648001f09180948203a17002c18004a0001003f2a1806221e00c324180018061e001f2c0a000110284800351f0018092d1f0916ffd21800001f4402011125002046000306000c271f0c48004801290005000d1b020b44140112040007001f45020113250011110201131d00951118001d0114001f4602011525001a460003060008271f0c200005000b131e003101010007001f4702011625001a460003060008271f0c200005000b131e003301010007001f4802011725001a460003060008271f0c200005000b131e007401010007001f490201182500301b020b0b1b020b49260a000010041b020b0b1b020b48260a00001004281b020b0b1b020b47260a0000100428001f4a020119250023131e011a1f0618061e01040200bb2818061e0105280200bb2818061e011b28001f4b02011c250019131e011a1f0618061e011d0200bb2818061e011e28001f4c02011f2500711b000b1a0200002500640201201b000b0d421700511b000b0d221e0120240a000010221e0121240200002500311b040b001800020122190200bb28180002012319280200bb28180002012419280200bb2818000201251928041c000a0001101c16000a1800020000041c001a01001f4d02012625007d0201271f0648001f07211b000b0d180619430200024017000f1b000b0d1806191f0716001c211b000b0d180619430200024017000c1b000b0d1806191f07460003060009271f50121f080500181b000b08221e0128240201290a0001101c201f080702012a13421f0918070200bb281808280200bb28180928001f4e02012b2500671b000b0b1a001f061806221e012c2448010a0001101c1806221e012d2448050a0001101c48001806221e012e240a000010291f071806221e012d24480b0a0001101c48001806221e012e240a000010291f081b000b0c221e012f24180718080a000210001f4f0201302501dd0201310201320201330a00031f06131e00061a001f07131e00061a001f081b000b081e00b70117000702001a001806031f1b181b21041700711f1a1b000b08221e0078240201340a0001101f1c181c0201351d0136181c1e01370201381d0139181c1e0137181a1d013a1b000b081e00b7221e00bf24181c0a0001101c1807181a181c1e013b0d1808181a181c1e013c0d1b000b081e00b7221e00be24181c0a0001101c16ff8e02013d02013e02013f02014002014102014202014302014402014502014602014702014802014902014a02014b02014c02014d02014e02014f0201500201510201520201530201540201550201560201570201580201590a001d1f0948001f0b271f0a271f0c48001f1a181a18091e001f3a1700b31806031f1c181c210417009f1f1b1b000b08221e0078240201340a0001101f1d181d0201351d0136181d1e01370201381d0139181d1e01371809181a1902015a28181b281d013a1b000b081e00b7221e00bf24181d0a0001101c181d1e013b1807181b1940220117000f1c181d1e013c1808181b19401f1e1b000b081e00b7221e00be24181d0a0001101c181e170018181a481e3a17000d4801181a33180a301f0a16000616ff60181a2d1f1a16ff48180a221e00112448100a000110001f5002015b25002146000306000c271f0c180c1e01140005000e1b000b1b02015c1a011c07001f5102015d2500141b000b1c221e0011240a0000101e001f001f5202015e2501e81b020b07260a000010220117000d1c1b020b09260a00001022011700231c1b000b0d1e009c221e009d240a000010221e00242402015f0a00011048003917000702000000131e016022011700081c131e016122011700081c131e01621f061b000b1a02000025017d46000306000d271f6a1800020000041c0501691b030b0617015a1b030b06131e00061a0022131e00061a00220201631d01640a00011d01651a011f06020000250004001f07131e000c0201660200001a021f08131e000c02016702007d1a021f091806221e0168240200000a0001101c1b000b1d2602000025000d1b040b00020000041c004901f40a0002101c1806221e0169240a0000101f0a180a1b000b1a41170038180a221e0121240200002500131b040b06221e016a2418000a000110000a000110221e012124020000250004000a0001101c1600301806221e01692402000025001c1b040b06221e016a2418001b040b071b040b070a0003101c0018070a0002101c18060200002500601800221700091c18001e016b2217000c1c18001e016b1e016b1700431b040b08221e016c2418001e016b1e016b0a0001101f0618061700271806480019221e006a241b040b090a0001101f07180717000e1b040b001806480019041c001d016d16000a1800020000041c07001a01001f5302016e25005d02016f221e007b24131e000c02017002007d1a0202000025003e1b000b0c221e001e240a00001048102a4800301f0618000201713d170008180616000b180648032f4808301f071807221e00112448100a000110000a000210001f5402017225005518001e001f48223e1700481b020b3c2648001800221e002f24480048200a0002100a0002101f061806221e0011240a000010221e002f24480048020a0002101800221e002f24482048220a0002103e0012001f5502017325005d1b020b0f020174041f0618062217000b1c1b020b551806041700061806001b020b54260a0000101f0618061b020b3c26480018060a00021028221e002f24480048220a0002101f061b020b102602017418060a0002101c1806001f56020175250033180001170007020000001b020b0c4804041f0618061b020b2d261b020b2b26180018060a0002100201760a00021028001f5702017725015d180117003a48001f0b48001f0c180c18001e001f3a1700271800180c191e01781700141800180c191801180b222d1f0b191d0179180c2d1f0c16ffd40200001f061800221e017a2402000025001b1b03220b061b020b0b18001e01790402017b28281d017c000a0001101c18061b020b0a260a000010281f061b020b54260a0000101f071b000b0c221e001d241807221e00c32448030a00011048082b0a0001101807221e00c32448030a00011048082c281f081807221e002f24480448041808280a0002101f091b020b2d1b020b2b26180618090a000210180728041f061b020b12221e017d02017e1b000b1e180604280200f928281d017d271f0a1b020b1e26180a02000025004d180002017f1948003d2217000a1c1800020180191700351b020b121b020b57180002018019041d01811b020b121800020180191d01821b020b10260201831800020180190a0002101c000a0002101c001f5802018425049a1b000b0d221700051c13221700081c1b000b080117000400131e00061a00220201851d01862248041d01872218001e01851d0179131e00061a00220201881d01862248031d0187221b020b0a1d0189131e00061a002202018a1d01862248031d0187221b020b4a1d0189131e00061a00220200791d01862248031d0187221b020b451d0189131e00061a002202018b1d01862248031d0187221b020b0a1d0189131e00061a002202009e1d01862248001d0187131e00061a002202018c1d01862248001d0187131e00061a002202018d1d01862248001d0187131e00061a002202018e1d01862248001d0187131e00061a00220200571d01862248001d0187131e00061a002202018f1d01862248031d0187221b020b4b1d0189131e00061a00220201901d01862248031d0187221b020b4c1d0189131e00061a00220201911d01862248011d0187131e00061a00220201921d01862248011d0187131e00061a00220201931d01862248011d0187131e00061a00220201941d01862248001d0187131e00061a00220201951d01862248031d0187221b020b4d1d01892248011d0178131e00061a00220201961d01862248031d0187221b020b4e1d0189131e00061a00220201971d01862248031d0187221b020b4f1d0189131e00061a00220201981d01862248031d0187221b020b0a1d0189131e00061a00220201991d01862248031d0187221b020b1b1d0189131e00061a002202019a1d01862248031d0187221b020b501d0189131e00061a002202019b1d01862248031d0187221b020b1c1d0189131e00061a002202019c1d01862248031d0187221b020b0a1d0189131e00061a002202009c1d01862248001d0187131e00061a002202019d1d01862248031d0187221b020b0f1d0189220201831d019e131e00061a002202019f1d01862248031d0187221b020b511d0189131e00061a00220201a01d01862248031d0187221b020b521d0189131e00061a00220201a11d01862248031d0187221b020b531d01892248011d0178131e00061a00220200821d01862248011d0187131e00061a00220201a21d01862248041d0187221b020b061e01a31d0179131e00061a00220201a41d01862248031d0187221b020b561d0189131e00061a00220201a51d01862248031d0187221b020b0a1d0189131e00061a00220201a61d01862248041d01870a00221f060a00001f07180608031f11181121041700db1f1018061810191e01871f12181248004017001e1812480140170033181248024017004018124803401700501600a918061810191b020b0b1b000b0d18061810191e018619041d017916008c18061810191318061810191e0186191d017916007718061810191b000b0818061810191e0186191d017916005f18061810191e01781700321b000b1a1700281807221e00932418061810191e0189221e00232418061810191e019e0a0001100a0001101c160025180618101918061810191e0189221e0023242618061810191e019e0a0002101d017916ff241b000b1a1700361b000b1a221e01a72418070a000110221e0121240200002500141b020b58261b030b0618000a0002101c000a0001101c16000b1b020b581806041c001f590201a82500441b000b082217000b1c1b000b081e01a901170004001b020b5b08031f0d180d210417001f1f0c1b000b08221e01a924180c1b020b5b180c190a0002101c16ffe0001f5d0201aa25008418001e001f4900c8391700131800221e01ab24480048640a0002101c18001e001f48003917004e180018001e001f480129191f0c18011e01ac180c1e01ac2948003c220117002a1c0201ad1801422217000f1c18011e0171180c1e01713d2217000f1c18011e01ad180c1e01ad3d170004001800221e00932418010a0001101c001f610201ae25006048001f0618001e01af22011700091c18001e01b022011700091c18001e01b122011700091c18001e01b217000748011f061b020b61261b020b60131e00061a002218061d0171221b000b0b221e01b3240a0000101d01ac0a0002101c001f620201b425006d18001f0618001e00941f0718001e01b52217000a1c18070201b63e17001318001e01b74800191f061b02201d01b8131e00061a002218061e01b91d01712218061e01ba1d01ad221b000b0b221e01b3240a0000101d01ac1f081b020b61261b020b5e18080a0002101c001f630201bb25006d18001f0618001e00941f0718001e01b52217000a1c18070201bc3e17001318001e01b74800191f061b02201d01b8131e00061a002218061e01b91d01712218061e01ba1d01ad221b000b0b221e01b3240a0000101d01ac1f081b020b61261b020b5f18080a0002101c001f640201bd2500191800221e0101241b020b650a00011018001e001f2b001f670201be25006818001e001f48013c1700064800001b020b671800041f061800221e01002402000025000b18001b030b0629000a0001101f071b000b0c221e01bf241807221e0100241b020b660a000110221e0101241b020b650a00011018001e001f4801292b0a000110001f680201c02500d548001f0648001f0718001e001f1801391700ba0a00001f0848001f09180918001e001f4801293a17008418001809480128191f0a18001809191f0b180a1e01ac180b1e01ac291f0c180c17005918021700171808221e0093244801180c2b0a0001101c1600401808221e0093241b000b0c221e01bf241b020b66180a1e0171180b1e017129041b020b66180a1e01ad180b1e01ad2904280a000110180c2b0a0001101c18092d1f0916ff741b020b671808041f061b020b681808041f07180748003d1700081401c11f07180618070a0002001f690201c2250119121f06460003060006271f2105002b1b000b082217000b1c1b000b081e01281700171b000b08221e0128240201290a0001101c201f06071b020b69261b020b5e48010a0002101f071b020b69261b020b604805200a0003101f0848011f09180601221700081c1b020b5c17000a18094840301f091b020b5e1e001f48003e17000d18094802301f09160015180748001948323917000a18094810301f091b020b5f1e001f48003e17000a18094804301f091b020b601e001f48003e17000d18094808301f0916001618084800191401c33917000a18094820301f091809221e00112448200a0001101f0a180a1e001f48013e17000e0201c4180a281f0a160016180a1e001f48023e17000b02001a180a281f0a180a001f6a0201c525002d0200001f06460003060006271f0e0500191b020b0e260201c61b000b081e00340a0002101f06071806001f6b0201c72500531b000b19221e00fb24131e00061a002218001d000e221b000b1f1b000b19221e00fb2418011e00b70a000110041d01c82218021d01860a0001101f061b020b2d261806020176200a0003101f071807001f6c0201c9250434211801430200023e2217000c1c21180043020001402217000a1c18001e01ca0117000d1b020b460201cb1a014748001f0648001f074a0000fff11f081b000b0b1a00221e0016240a0000104903e82b4800351f091b020b061e01cc012217003e1c1b020b3d261b020b3d2648001809020000280a0002101b000b0e1e0083221e002f241b000b0e1e01cd1e001f4802280a0001100a00021018082c1f071809180718082a31480035221e00112448020a0001101f0a180a1f0b180a1e001f48203917001b180a221e002f24180a1e001f4820290a0001101f0b16003c180a1e001f48203a1700310200001f7048001f7118714820180a1e001f293a170013187002001a281f7018712d1f7116ffe51870180b281f0b0201ce1f0c0201cf1f0d0201d01f0e180e180d28180c28180b281f061b000b1526180648020a0002101f061b020b3d2648001806020000280a0002101f0f1b020b3a260a0000101f1018100200e818020201d13e17000712160004200d0200001f11180117000a18011f1116011e1b020b5a1e01d2221e002324110201d318000a0003101c18001e00b72217001a1c1b000b19221e00fb2418001e00b70a0001100200fc4017006f48001fc318001e01d41700331b020b3e2648001b000b19221e00fb241b020b412618001e00b718001e01d40a0002100a0001100a0002101fc31600271b020b3e2648001b000b19221e00fb241b020b4218001e00b7040a0001100a0002101fc30201d518c3280200f9281f111b020b4018001e01ca041fc218001e01d617001a1b000b05221e01d72418c218001e01d60a00021016000518c21fc218111b020b4318c204281f1118110201d8281b020b3f18001e01ca04280200f9281f1118110201d9280201da281f111b020b5a1e01d2221e002324110201db18110a0003101c1b020b3b1810041f121b020b061e01cc012217000d1c1b020b45260a0000101f131b020b061e01cc012217001e1c1b020b121e018122011700111c1b020b571b020b0f02018304041f141b020b331806041b020b3318061401dc2b48003504281b020b33181318063104281b020b331b020b3d26180f1b020b061e01cc012217000b1c1b000b0d1e009c221e0011240a0000100a00021018082c4810331b020b3d26180f1811020000280a00021018082c3004281b020b3318124808331b020b061e01dd4804333018063104281b020b32180704281f151b020b334800041c181417000a18151814281f151b020b6a260a00001022011700071c0201de1f160200bb1b020b6d281b020b061e01df281f1718171816281f1718171b020b6e181528281f171b020b3e26480018170a000210221e00112448100a0001101f181818221e009a2418181e001f48022918181e001f0a0002101f1918171819281f170200001f1a1b020b6b260a0000101f1b181b17001f1b020b6c26181b180018110a0003101f1a18170201e028181a281f171817001f6f0201e1250072131e00061a001f06180108031f081808210417005a1f0718011807191f0918001809191f0a21180a430200023e22011700081c180a263e170006121f0a180a26402217001a1c21180a430200033e220117000c1c21180a430200013e170006201f0a18061809180a0d16ffa51806001f700201e225004b0201e30201e402009e0201e502019402018c0201e60201270201e70200b40201e80201e90201ea0201eb0201ec0201ed0201ee0a00111f061b020b70261b000b0d18060a000210001f710201ef2500450201f00200490200470201f10201f20201f30201930201f40201f50201f60201f70201610201f80201f90201fa0201fb0a00101f061b020b70261318060a000210001f720201fc2500270201fd0201fe0200090201ff0202000a00051f061b020b70261b000b0818060a000210001f730202012500551b000b08221e0078240200790a0001101f06261f07460003060006271f100500281806221e0088240200890a00011022011700121c1806221e0088240202020a0001101f0707180701170006261f071807001f740202032500671800221e008a240202040a00011022011700121c1800221e008a240202050a00011022011700121c1800221e008a240202060a0001101f0618061700271800221e008c2418061e02070a0001101f07180748003e17000748021f071807001600052600001f750202082501b61b020b1a1e020917000b1b020b1a1e0209001b020b74260a0000101f0618060117000a131e00061a0000131e00061a00221806221e020a240a00001022011700071c0a00001d020b221806221e020c240a0000101e020d1d020d221806221e008c2418061e020e0a0001101d020f221806221e008c2418061e02100a0001101d0211221806221e008c2418061e02120a0001101d0213221b020b751806041d0203221806221e008c2418061e02140a0001101d0215221806221e008c2418061e02160a0001101d0217221806221e008c2418061e02180a0001101d0219221806221e008c2418061e021a0a0001101d021b221806221e008c2418061e021c0a0001101d021d221806221e008c2418061e021e0a0001101d021f221806221e008c2418061e02200a0001101d0221221806221e008c2418061e02220a0001101d0223221806221e008c2418061e02240a0001101d0225221806221e008c2418061e02260a0001101d0227221806221e008c2418061e02280a0001101d0229221806221e008c2418061e022a0a0001101d022b221806221e008c2418061e022c0a0001101d00961f071b020b1a18071d02091807001f7602022d250065131e00061a00221b020b71260a0000101d022e221b020b72260a0000101d022f221b020b73260a0000101d0069221b020b76260a0000101d0089221b020b1b260a0000101d0230221b020b1c260a0000101d004e1f061b020b1a18061d02311806001f77020232250075131e00061a001f061b020b1a1e023117000f1b020b1a1e02311f0616000e1b020b77260a0000101f0618061b000b0b221e01b3240a0000101d02331b020b0c4804041f0718071b020b2d261b020b2b261b000b19221e00fb2418060a00011018070a0002100201760a000210281f081808001f7802023425003b48001f0618061b020b121e02351e001f3a1700251b020b121e0235180619221e000f2418000a000110170005200018062d1f0616ffd112001f790202362503ac131e02371e00221f0618061e006e1f0718061e02381f0818061e02391f0918061e023a1f0a18061e023b170007001600091806201d023b1806020000250076111e023c01170065111e023d221e009324131e00061a00220202381d023e221b041d023f0a0001101c131e000c02024002000e1a02221e000f2418000a00011017002a111801221e0011240a000010221e009d240a000010221e002b240202410a0001104800191d02421b030b08111b0410001d02381806020000250012111b041d02431b030b0a111b0410001d023a1806020000250040110a00001d023d111e023d221e009324131e00061a002202006e1d023e221b041d023f0a0001101c1118001d02441118011d02451b030b07111b0410001d006e02024602007002024702024802024902024a02024b0a00071f0b180602000025026f11201d023c1b020b79111e024504170255111e0245221e00242402024c0a00011048004801293917000c1b030b09111b0410001118001d024d111e024e1f06111e02461f07111e00701f08111e02471f09111e02481f0a111e02491f0b111e024a1f0c111e024b1f0d111e024f1f0e111e02501f0f131e00061a001f1048001f2a182a1b030b0b1e001f3a17002118101b030b0b182a19111e02511b030b0b182a19190d182a2d1f2a16ffd8131e00061a00221b020b82261b030b00111e02450a0002101d01ca1f11111e02440202523d17003c111e02420202533e220117000c1c111e02420202543e17001a1b020b80261811111e0242111e024d0a0003101c16000c1b030b09111b0410001b020b851b030b000417001c1b030b00221e02552418111b000b060201d10a0003101600151b020b6f2618111b000b060201d10a0003101f121b020b8326111e024518120a0002101f13111e023d221700131c111e023d48001902023e1902006e3f1700052600111e023d1f1448001fa418a418141e001f3a17003618a448003e170010181418a4191e023f480118130d11181418a41902023e191911181418a4191e023f101c18a42d1fa416ffc5111e024317000e111e023a11111e0243101c1102023d091b020b121e025617001e11221e0238241b020b061e02571b020b78260a0000100a0002101c1118061d024e1118071d02461118081d00701118091d024711180a1d024811180b1d024911180c1d024a11180d1d024b11180e1d024f11180f1d025048001f9018901b030b0b1e001f3a170021111e02511b030b0b18901918101b030b0b189019190d18902d1f9016ffd81b030b09111b0410001d0239001f7a0202582503f60202592503c31801220117000a1c131e00061a001f011b020b7b2217000b1c18001b000b20411f060200001f0702025a1f08180617001418001e01ca1f0718001e025b1f0816002418001f0718011e025b17001418011e025b221e025c240a00001016000518081f08180802025a402217000a1c180802025240220117000c1c1b020b79180704011700111b030b0626180018010a00021000131e00061a00221b020b82261b030b0018070a0002101d01ca1f0918080202523d1701fc1b020b7f26180018010a000210221e002b240202410a000110480019221e009d240a0000101f5018500202533e220117000a1c18500202543e1701af18061700c81800221e025d240a000010221e025e240a000010221e0121240200002500881b020b80261b040b091b040b5018000a0003101c1b020b851b030b000417001e1b030b00221e0255241b040b091b000b060201d10a0003101600171b020b6f261b040b091b000b060201d10a0003101f061b020b83261b040b0718060a0002101f071b020b81261b040b00180718000a0003101f081b030b062618081b040b010a000210000200002500161b000b1a0200002500091b050b0047001a01000a000210001600e21b020b80261809185018011e00b70a0003101c1b020b851b030b000417001c1b030b00221e02552418091b000b060201d10a0003101600151b020b6f2618091b000b060201d10a0003101fa21b020b8326180718a20a0002101fa31b020b121e025617006f18010117002a131e00061a0022131e00061a00221b020b061e02571b020b78260a0000100d1d025f1f0116004218011e025f011700231801131e00061a00221b020b061e02571b020b78260a0000100d1d025f16001918011e025f1b020b061e02571b020b78260a0000100d1b030b062618a318010a000210001600111b030b0626180018010a00021000160112180802025a3e1700fb1b020b851b030b000417001c1b030b00221e02552418091b000b060201d10a0003101600151b020b6f2618091b000b060201d10a0003101f4e1b020b83261807184e0a0002101f4f18061700271b020b81261800184f1b000b060a0003101f501b030b0626185018010a000210001600871b020b121e025617006f18010117002a131e00061a0022131e00061a00221b020b061e02571b020b78260a0000100d1d025f1f0116004218011e025f011700231801131e00061a00221b020b061e02571b020b78260a0000100d1d025f16001918011e025f1b020b061e02571b020b78260a0000100d1b030b0626184f18010a000210001600111b030b0626180018010a00021000001f071b020b7e260a0000100117000400131e02601700070016000813201d0260131e02611f061318071d0261001f7d020262250008131e0261001f7e02026325010d0200001f061b020b7b2217000b1c18001b000b204117002218001e025f221e0041240202640a0001101f07180717000718071f061806001801221700091c18011e025f1700c61b020b7c2217000e1c18011e025f1b000b214117002218011e025f221e0041240202640a0001101f17181717000718171f0618060018011e025f1b000b174117004448001f47184718011e025f1e001f3a17003218011e025f184719480019221e009d240a0000100202643d17000f18011e025f1847194801190018472d1f4716ffc618011e025f1b000b054117003618011e025f08031f8f188f21041700231f8e188e221e009d240a0000100202643e17000c18011e025f188e190016ffdc180600001f7f0202652500ba1802263e220117000a1c18020200003e1700061800001802221e0011240a0000101f0218010202533e1700771800201d01d41802221e002b240200f90a0001101f0c131e00061a001f0d180c17004a48001f0e180e180c1e001f3a17003b180d180c180e19221e002b2402002a0a0001104800191b000b22180c180e19221e002b2402002a0a000110480119040d180e2d1f0e16ffc01800180d1d00b716001718001b000b19221e02662418020a0001101d00b71800001f8002026725009318001e025f1f061b020b121e025617001f1806221e0268241b020b061e02571b020b78260a0000100a0002101c1b000b201801131e00061a002218001e025b1d025b2218061d025f2218021d00b72218001e02691d02692218001e026a1d026a2218001e026b1d026b2218001e01eb1d01eb2218001e026c1d026c2218001e026d1d026d2218001e026e1d026e1a02001f8102026f25012518011f061b020b121e02701e001f48003917008048001f0818081b020b121e02701e001f3a17006c1b020b121e02701808194800191f091809221e000f2418010a0001101700451801221e007b2418091b020b121e02701808194801190a0002101f061b020b5a1e01d2221e0023241800020271020272180128020273281806280a0003101c16000b18082d1f0816ff8a1b000b2218060418063d17000c1b000b1f1806041f061806221e0024240200e00a0001101f071807480039221700151c1806221e0274240202750a00011018073917004d1806221e00d424480018074801280a0002101f201806221e00d424180748012818061e001f0a0002101f2118201821221e002b240202750a000110221e0098240202760a000110281f061806001f8202027725002d18001800221e0024240200e00a00011048004801294017000c02027818012816000902027918012828001f8302027a2500141b020b7a1800041c1b020b7d1800041c001f8402027b25000b18001b020b8741001f8502027c250019111b000b19221e0266241b020b860a0001101d027d001f8702027e2500c01b020b061e01cc17000526001b020b85110417000a111e027d1600071b020b121f061b000b05221e01d724180618000a0002101c1b020b8a1806041c18061e027a1700201b020b8b18061e027f041c1b020b8c18061e0280041c1b020b8411041c18061e02561700131b000b1d261b020b7748000a0002101c1b020b5d260a0000101c1b020b121e028101221700091c18061e01841700271b020b12201d02811b020b37260a0000101c1b000b1d261b020b59480018060a0003101c001f8902028225006618001e018548003e220117001c1c1b000b0c221e001d2418001e01850a00011018001e01853f17000d1b020b460202831a014718001e027a17002a18001e027f1e001f48003e220117000d1c18001e027f1e00930117000d1b020b460202841a0147001f8a02028525003f48001f06180618001e001f3a17002f180018061917001f1b020b121e0235221e0093241b000b2318001806191a010a0001101c18062d1f0616ffcc001f8b02028625004f18001b000b064017004448001f06180618001e001f3a1700351b020b121e0270221e0093241b000b2318001806194800191a0118001806194801190a00020a0001101c18062d1f0616ffc6001f8c020287250011131e028822011700071c020000001f8d0202892500561b020b0f1b020b061e028a0422011700071c0200001f061b020b111b020b061e028a041c180602028b3d17000b0200001f0616001518060200003d17000c1b000b081e02691f0618061700091318061d0288001f8e211b000b051e01d743020003401700c71b000b05221e003e241b000b050201d7131e00061a00220201d72500941800263e220117000b1c18001b000b063e17000d1b000b0702028c1a01471b000b051800041f0648011f0718071b031e001f3a17005b1b031807191f08180826402217000b1c18081b000b0640170039180808031f141814210417002c1f091b000b051e00221e028d221e002324180818090a00021017000d1806180918081809190d16ffd318072d1f0716ffa01806001f8f188f1d028e22201d028f22201d02900a0003101c1b000b051e00f1011701141b000b050200002501021b000b051e00221e028d1f06131e00061a0022261d0011221e0291240200110a000110011f0702001102029202029302028d02029402029102000d0a00071f0818081e001f1f090200002500b42118004302000340221700161c211800430200014022011700081c1800263e17000d1b000b070202951a01470a00001f06180008031f121812210417002a1f071b030b06221e002324180018070a0002101700111806221e00932418070a0001101c16ffd51b030b0717004548001f0818081b030b093a1700371b030b06221e00232418001b030b081808190a0002101700161806221e0093241b030b081808190a0001101c18082d1f0816ffc518060000260a0000101d00f1131e00061a00220202961d01a32248021d01dd22121d01cc220202881d028a220202971d01df220202981d02571f06131e00061a0022121d02992248001d018522121d018422121d025622121d027a220a00001d027f220a00001d0235220a00001d0280220a00001d02702202029a1d017d2202029b1d00df2202029c1d029d1f12131e00061a001f1a14029e1f1f48001f3002000025001e1b021b020b351d029f1b0218001d02a01b020b32180048023404001f34271f3302000025002a1b021b020b361d029f1b020b30481c331800480435301f061b0218001d02a01b020b32180604001f350200002500271b021b020b341d029f1b020b321b020b30481a33180048063530041b020b3118000428001f36131e00061a0022020000250049121f061b020b85110417000f111e027d1e02991f0616000c1b020b121e02991f061806221700201c1b000b11221e0042240202a11800280202a2280202a318010a0003101c001d01d21f5a131e00061a002218631d02a42218631d01b62218621d02a52218641d01bc2218641d02a61f5b121f5c0a00001f5e0a00001f5f0a00001f600200002500091800180128001f65020000250009180018002a001f660202a71f6d0202a81f6e1b000b202217000d1c1b000b201b000b05411f7b1b000b212217000d1c1b000b211b000b05411f7c1b000b19221e00fb2418120a0001101f86186f1f8818871e002218891d027e18871e002218881d025518871e0022188d1d02871806122217000b1c180d260a0000101d01cc188e260a0000101c180018871d027c1800188d1d0287180018891d027e180018881d02551b000b05221e003e2418000202a9131e00061a0022201d028e0a0003101c000a0002101c0002aa00066d606867617609776c6667646b6c67660864776c61766b6d6c03636f6607677a726d707671064d60686761760e607b7667665d63617063756e6770046b714b470c666d61776f676c764f6d6667096b71446b7067646d7a086b7151636463706b06506765477a720b616d6c7176707761766d70016b04766771760b4a564f4e476e676f676c7608766d5176706b6c6521596d60686761762251636463706b50676f6d76674c6d766b646b6163766b6d6c5f0671636463706b107277716a4c6d766b646b6163766b6d6c0c656776566b6f677176636f7207656776566b6f670865677654636e776707606d6d6e67636c013301320c70636c666d6f5176706b6c653e32333031363734353a3b636061666764656a6b68696e6f6c6d72737071767774757a7b78434041464744454a4b48494e4f4c4d52535051565754555a5b5805646e6d6d700670636c666d6f066e676c65766a09666d6f4667766761760f596d606867617622556b6c666d755f0972706d766d767b72670461636e6e076b6c66677a4d6408466d61776f676c7612596d6068676176224c63746b6563766d705f10596d6068676176224a6b71766d707b5f0a65677644706d6f517670067176706b6c65013f0571726e6b76045939245f06616a637043760122097177607176706b6c6509656776416d6d696b670e716771716b6d6c51766d70636567076567764b76676f0c6e6d61636e51766d7063656706616d6d696b6709716776416d6d696b67077167764b76676f313f3922677a726b7067713f4f6d6c2e2230322251677222303233322232323832323832322257564139227263766a3f2d390a3922677a726b7067713f0b766d454f565176706b6c650939227263766a3f2d390966676e416d6d696b670a70676f6d74674b76676f0e66676077656567704667766761760e6667646b6c6752706d726770767b026b6608666760776565677003656776036e6d6502276107616d6c716d6e6707646b70676077650a6d77766770556b66766a0a6b6c6c6770556b66766a0b6d777667704a676b656a760b6b6c6c67704a676b656a760a6c6d66674667766761760772706d6167717110596d60686761762272706d616771715f0d726a636c766d6f46677667617607726e77656b6c71085d726a636c766d6f0b61636e6e526a636c766d6f0b5d5d6c6b656a766f637067054377666b6d1841636c74637150676c6667706b6c65416d6c76677a7630460f75676066706b7467704667766761760975676066706b746770136567764d756c52706d726770767b4c636f6771096e636c65776365677106616a706d6f670770776c766b6f6707616d6c6c676176145d5d75676066706b7467705d6774636e77637667135d5d71676e676c6b776f5d6774636e776376671b5d5d75676066706b7467705d7161706b72765d64776c61766b6d6c175d5d75676066706b7467705d7161706b72765d64776c61155d5d75676066706b7467705d7161706b72765d646c135d5d647a66706b7467705d6774636e77637667125d5d66706b7467705d776c75706372726766155d5d75676066706b7467705d776c75706372726766115d5d66706b7467705d6774636e77637667145d5d71676e676c6b776f5d776c75706372726766145d5d647a66706b7467705d776c75706372726766095d71676e676c6b776f0c61636e6e51676e676c6b776f165d51676e676c6b776f5d4b46475d5067616d7066677008666d61776f676c76056f6376616a0a5e2659632f785f66615d066163616a675d0f6b6c616d656c6b766d466776676176046d72676c096b6c616d656c6b766d076d6c6770706d7004616d66671253574d56435d475a4147474647465d47505010716d6f6749677b4a677067407b766766096b6c66677a676646400c526d6b6c7667704774676c760e4f51526d6b6c7667704774676c760a6a6d6d694667766761760d617067637667476e676f676c760661636c74637109766d4663766357504e077067726e636167035e712801650a6c63766b7467616d666714596d606867617622526e77656b6c437070637b5f0e6e6d6163766b6d6c4667766761764a5c6a767672713d385e2d5e2d2a59322f3b5f79332e317f2a5e2c59322f3b5f79332e317f2b79317f7e59632f64322f3b5f79332e367f2a3859632f64322f3b5f79332e367f2b79357f2b086e6d6163766b6d6c046a70676404646b6e67106a767672382d2d6e6d61636e6a6d717606656776457277074552574b4c444d0a656776416d6c76677a7605756760656e0c656776477a76676c716b6d6c19554740454e5d66676077655d70676c66677067705d6b6c646d0c656776526370636f6776677015574c4f43514947465d54474c464d505d554740454e17574c4f43514947465d50474c46475047505d554740454e012d0a656776526e77656b6c7106524e57454b4c046b76676f047277716a04767b7267046c636f6707746770716b6d6c08646b6e676c636f6704686d6b6c02212105716e6b61670c616d6c716b7176416a67616909777167704365676c760b766d4e6d7567704163716708726e6376646d706f07756b6c666d757103756b6c07636c66706d6b66056e6b6c777a066b726a6d6c67046b726366046b726d66036f6361096f63616b6c766d716a0c6f63615d726d75677072612b0461706d71037a33330561706b6d7105647a6b6d7104726b696708646b7067646d7a2d066d726770632d05226d72702d07616a706d6f672d0876706b66676c762d046f716b670674676c666d7006456d6d656e670568716d6c7204606d667b14656776476e676f676c7671407b5663654c636f67046a676366067161706b7276015d0961636e6e606361693f037170610b70676f6d7467416a6b6e660b637272676c66416a6b6e660e766d406b6c63707b5176706b6c650c64706d6f416a6370416d66670d766d576b6c763130437070637b0a616a6370416d66674376056b6c7631300a36303b363b3435303b37026f7a04646b7a6912676c61707b7276576b6c763130437070637b12666761707b7276576b6c763130437070637b0a7776643a476c616d66670e5c595e7a32322f5e7a35645f2826104f636e646d706f6766227176706b6c65157776643a4667616d6667516a6d70765176706b6c651f576c646b6c6b716a6766225756442f3a226d617667762271677377676c616729416a63706361766770226d7776716b66672274636e6b6622576c6b616d66672270636c65673822327a15406366225756442f3a22676c616d666b6c6522327a147776643a4667616d66674e6d6c655176706b6c650a7776643a4667616d66670e5c595e7a32322f5e7a64645f282606717760717670057a7a76676307666761707b72760e6063716734365176636c666370664046696672656a3658497153403a322d4f64747531345a4b33503037295557436e476b354c4e606d735b564d5277786f4468486c707b7a3b4a5445616351764167106063716734365d616a63704b6c66677a40434041464744454a4b48494e4f4c4d52535051565754555a5b58636061666764656a6b68696e6f6c6d72737071767774757a7b7832333031363734353a3b292d146063716734365176636c666370664667616d6667096063716734365d616a066034365d313208656776526370636f08726370636f57706e013d026d6c036d64640971677651756b76616a0e5d726370636f51756b76616a4d6c0f5d607b7667665d726370636f5d71751265677651756b76616a44706d6f4163616a670f666776676176436c6d6f636e6b67710a666b70676176516b656c0a616d6c716b7176676c760671756b76616a03666d6f046c6d666707726a636c766d6f046a6d6d690b76677176446763767770670e637171676f606e67506771776e760469677b710b7166606f5d717663606e67047166606f107166606f5d717663606e675d726d6c7b076567765263766a222a6a767672385e2d5e2d7e6a76767271385e2d5e2d7e5e2d5e2d2b3d595c5e2d5f2808656776537767707b0e593d5f2a5e75293f2c28243d2b280124076d6068516d7076097176706b6c656b647b02797f04716d70760868716d6c516d7076076b71437070637b036f637206706766776167076d6068305176701261636c7463715d646b6c65677072706b6c7605756b66766a066a676b656a760230660a3336727a227167706b6404646d6c7608646b6e6e56677a7604c09f9a8e138e22c0acbf0a716a63666d75406e77700b716a6d754d64647167765a046e6b6f6709716a6d75416d6e6d7003637061067176706d69670965677641636c7463710a313531373b303a37373b0f416d6c646b65477a616772766b6d6c076f677171636567116a6371516771716b6d6c51766d706365670f6a63714e6d61636e51766d706365670c6a63714b6c66677a676646400c65677643606b6e6b766b67710d6567765067716d6e77766b6d6c0671617067676c0a616d6e6d70466772766a126567764374636b6e5067716d6e77766b6d6c0a6374636b6e556b66766a0b6374636b6e4a676b656a760e6567764063767667707b4b6c646d0a6567764063767667707b04766a676c08616a6370656b6c650c616a6370656b6c65566b6f670f666b71616a6370656b6c65566b6f67056e6774676e0c656776566d77616a4b6c646d0e6f637a566d77616a526d6b6c76710b6170676376674774676c760a566d77616a4774676c760c6d6c766d77616a71766370760b656776566b6f67786d6c670771677646637667087167764f6d6c766a11656776566b6f67786d6c674d6464716776036f6b6c08656776446d6c7671096f6d6c6d71726361670a71636c712f7167706b64057167706b64047172636c0d6f6f6f6f6f6f6f6f6f6f6e6e6b096b6c6c67704a564f4e0571767b6e67043530727a08646d6c76516b78670a646d6c7644636f6b6e7b0b6d6464716776556b66766a0c6d64647167764a676b656a760c5670676077616a6776224f5109556b6c65666b6c657107517b6e6463676c085167656d6722574b0a416d6c7176636c766b630b516b6f51776c2f477a7640084f5622477a7670630545776e6b6f0a4e67676e6375636667670556776c6563064f676b707b6d0654706b6c666309416d70666b63575241094372637063686b7663074b706b715752410852636e63766b6c6d0a416d6e6d6c6c63224f5608526e637b606b6e6e08486d6967706f636c09526370616a6f676c760a4f51224d77766e6d6d690956752241676c224f56064d52564b4f4306447776777063064354474c4b500c43706b636e224a67607067750a5163746d7b67224e47560941637176676e6e63700a4f5b504b43462252504d012e0e656776517b6c76637a4770706d701041706763766722556760516d616967760f6567764c63766b74674e676c65766a086567765076614b720b746b746d60706d757167701150564152676770416d6c6c6761766b6d6c146f6d7850564152676770416d6c6c6761766b6d6c17756760696b7650564152676770416d6c6c6761766b6d6c1c7176776c387176776c2c6e2c656d6d656e672c616d6f38333b3132300477706e710a6b6167516770746770713e2a59322f3b5f79332e317f2a5e2c59322f3b5f79332e317f2b79317f7e59632f64322f3b5f79332e367f2a3859632f64322f3b5f79332e367f2b79357f2b355c2a333b305e2c33343a5e2c7e33343b5e2c3037365e2c7e33325e2c7e3335305e2c2a3359342f3b5f7e305e667e315932335f2b2b1161706763766746637663416a636c6c676e0b6170676376674d64646770137167764e6d61636e46677161706b72766b6d6c0961636c666b6663766704677a67610e6d6c6b616761636c666b666376670477776b66207a7a7a7a7a7a7a7a7a7a7a7a367a7a7a7b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a04597a7b5f017a0d616a676169416e6b676c764b660b656776416e6b676c764b66057676616b660d676c61707b7276516761466b6640434041464744454a4b48494e4f4c4d52535051565754555a5b58636061666764656a6b68696e6f6c6d72737071767774757a7b7832333031363734353a3b2f2c0e637171676f606e67526370636f710172017007646d704763616a025c5c01340c647252706d646b6e6757706e033d733f087067765d616d66670264720e5d607b7667665d7167615d666b660c5d7063755d7167615d666b660776765d71616b660366647203636b66016c0164097176637076566b6f6701760963606b6e6b766b67710a766b6f677176636f7233136a63706675637067416d6c61777070676c617b0c6667746b61674f676f6d707b086e636c65776365670a7067716d6e77766b6d6c0f6374636b6e5067716d6e77766b6d6c0971617067676c566d720a71617067676c4e676476106667746b6167526b7a676e5063766b6d0a72706d66776176517760076063767667707b09766d77616a4b6c646d08766b6f67786d6c670a766b6f677176636f7230076572774b6c646d0b6871446d6c76714e6b71760b726e77656b6c714e6b71760a766b6f677176636f72310a67746770416d6d696b67016f0b717b6c76637a4770706d700c6c63766b74674e676c65766a057076614b52096472546770716b6d6c0b5d5d746770716b6d6c5d5d08616e6b676c764b660a766b6f677176636f72360b677a76676c66446b676e6603636e6e107176637076516b6f726b646b67665760106366664774676c764e6b7176676c677009636666566d4e6b71760671726e6b61670166017b136a636c666e6749677b606d6370664774676c7606636e7649677b076176706e49677b076f67766349677b08716a6b647649677b036c6d75136a636c666e67526d716b766b6d6c4774676c760e616a636c656766566d77616a677109766d77616a6f6d746707766d77616a6771023b3007616e6b676c765a07616e6b676c765b106a636c666e67416e6b61694774676c760a766d77616a71766370760861636e614f67636c1561636e615176636c666370664667746b63766b6d6c04717370760961636e61517267676604322c323315656776516b6f726e6b646b67665760506771776e7603322c3702323209656776566771764b660b5d5d63615d766771766b660f65676c6770637667566771764e6d6501600c656776516b656c63767770670377706e2c6c6d6c6167226f77717622606722636c226d606867617622756b766a22632277706e2272706d726770767b230b666d6f4c6d7654636e6b660872706d766d616d6e043232323208323232323232333302333207646d707067636e056667607765056c6d6c61670b606d667b54636e307176700a606d667b5d6a63716a3f05737767707b066371716b656c097263766a6c636f673f0976765d7567606b663f062477776b663f086c6d6c61675176700a36303b363b3435303b34096467546770716b6d6c033232320b7277716a546770716b6d6c01280a65677654636e77672633106c63746b6563766d70516b656c636e710b637272416d66674c636f67076372724c636f670772706d6677617608617277416e637171056d716172770974676c666d705177600a666d4c6d76567063616907746b60706376670b61706766676c766b636e710771766d706365671b706773776771764f67666b6349677b517b7176676f43616167717109606e7767766d6d766a0d756b6c666d75516b656c636e71054b6f6365670771617067676c5a0771617067676c5b0f6b71516761777067416d6c76677a7607766d6d6e6063700b6e6d6163766b6d6c6063700d4361766b74675a4d606867617608677a7667706c636e0b726d71764f6771716365671b756760696b7650677377677176436c6b6f63766b6d6c4470636f670d406e7767766d6d766a57574b46086c677671616372670f666d61776f676c76516b656c636e710c616a637063617667705167760a616d6f7263764f6d6667066e637b677071066b6f636567710e656776556760656e41636c74637112677a7267706b6f676c76636e2f756760656e0d6f637a436c6b716d76706d727b1e475a565d76677a767770675d646b6e7667705d636c6b716d76706d726b6125554740494b565d475a565d76677a767770675d646b6e7667705d636c6b716d76706d726b61224f4d585d475a565d76677a767770675d646b6e7667705d636c6b716d76706d726b611e4f435a5d56475a565750475d4f435a5d434c4b514d56504d525b5d475a560c756760656e516b656c636e7105554740454e16656776517772726d70766766477a76676c716b6d6c7113717772726d70766766477a76676c716b6d6c7114656776416d6c76677a76437676706b607776677109636c766b636e6b637109404e57475d404b565108606e7767406b76710a464752564a5d404b565109666772766a406b76710a455047474c5d404b565109657067676c406b7671204f435a5d414d4f404b4c47465d56475a565750475d4b4f4345475d574c4b56511c6f637a416d6f606b6c676656677a767770674b6f636567576c6b7671194f435a5d415740475d4f43525d56475a565750475d514b5847156f637a417760674f637256677a76777067516b78671c4f435a5d445043454f474c565d574c4b444d504f5d544741564d5051196f637a447063656f676c76576c6b646d706f546761766d7071154f435a5d50474c4647504057444447505d514b5847136f637a50676c666770607764646770516b7867174f435a5d56475a565750475d4b4f4345475d574c4b5651146f637a56677a767770674b6f636567576c6b7671104f435a5d56475a565750475d514b58470e6f637a56677a76777067516b7867134f435a5d5443505b4b4c455d544741564d5051116f637a5463707b6b6c65546761766d7071124f435a5d54475056475a5d435656504b4051106f637a54677076677a437676706b60711e4f435a5d54475056475a5d56475a565750475d4b4f4345475d574c4b56511a6f637a54677076677a56677a767770674b6f636567576c6b76711a4f435a5d54475056475a5d574c4b444d504f5d544741564d5051176f637a54677076677a576c6b646d706f546761766d707118514a43464b4c455d4e434c45574345475d544750514b4d4c16716a63666b6c654e636c6577636567546770716b6d6c0c5156474c414b4e5d404b56510b7176676c616b6e406b767107544750514b4d4c066563766a6770096c63746b6563766d7006756b6c666d7503657277075147414b4c444d0a6567765167614b6c646d09766b6f677176636f720d6b71476c63606e67665263766a145d676c63606e675263766a4e6b7176506765677a0c6b6c766770616772765a4a500e5a4f4e4a7676725067737767717610716776506773776771764a67636667700471676c66106d746770706b66674f6b6f67567b72670f5d63615d6b6c766770616772766766055d71676c66155d607b7667665d6b6c766770616772765d6e6b71760464776c6109637065776f676c76710e5c616d6c76676c762f767b72672601390e5d607b7667665d616d6c76676c76115d6d746770706b66674f6b6f67567b72670d5d607b7667665d6f67766a6d660a5d607b7667665d77706e076d6c63606d7076066d6c6e6d6366096d6c6e6d6366676c660b6d6c6e6d636671766370760a6d6c72706d6570677171096d6c766b6f676d77760b5d716b656c63767770673f0b5d607b7667665d606d667b126d6c706763667b7176637667616a636c65670c706771726d6c7167567b726707766b6f676d77760677726e6d636604524d5156216372726e6b6163766b6d6c2d7a2f7575752f646d706f2f77706e676c616d666766106372726e6b6163766b6d6c2d68716d6c04716b656c0371666b0d7167614b6c646d4a67636667700e6b6c76677061677276446776616a0975706372446776616a03454756066f67766a6d660b766d57727267704163716705616e6d6c670476677a76076a676366677071165d5d63615d6b6c7667706167727667665d646776616a05646776616a0d717772726d707671446776616a145d656776446776616a416d6c76676c76567b72670c616d6c76676c762f767b72670b7772666376674c6d6c61670572637071670f60776b6e664c677550677377677176037167760870676467707067700e7067646770706770526d6e6b617b046f6d6667056163616a67087067666b70676176096b6c766765706b767b0e656776506775706b76676657706e105d77706e506775706b766750776e67710b706775706b766757706e22084d504b454b4c38220b08504755504b56474638220b6e6371764b6c66677a4d640125032730350860776b6e6657706e0c245d716b656c63767770673f0c3d5d716b656c63767770673f096b6c76677061677276196b714b6c7176636c61674d64407b76676643617063756e67700d407b76676643617063756e6770076d72766b6d6c71046b6c6b760e676c63606e675263766a4e6b71760f77706e506775706b766750776e6771045d6664720f74636e6b666376674d72766b6d6c711e6d72766b6d6c22636b662a4b6c76676567702b226b71226c676766676623276d72766b6d6c22676c63606e675263766a4e6b71762a437070637b2b226b71226c6767666766231065676c5263766a4e6b7176506765677a1265676c57706e506775706b7667506765677a0a656776506764677067700c5d5d63615d70676467706770106667636e506764677067704163616a670a7067646770677049677b0a5d5d63615d606e636c692a41636c6c6d7622616d6c7467707622776c6667646b6c6766226d70226c776e6e22766d226d60686761760e6a63714d756c52706d726770767b0574636e77670875706b7663606e670c616d6c646b65777063606e671472706d726770767b4b71476c776f677063606e670e766d4e6d61636e675176706b6c650774636e77674d640d6b7152706d766d767b72674d64204d60686761762c69677b712261636e6e6766226d6c226c6d6c2f6d606867617606302c33332c320640365834756d0c5a2f4f717166692f4b6c646d03606d67296a76767271382d2d7a7a60652c716c717166692c616d6f2d7567607166692d74332d6567764b6c646d236a76767271382d2d7a7a60652c716c717166692c616d6f2d7567607166692d74332d72236a76767271382d2d7a7a60652c716c717166692c616d6f2d7567607166692d74332d7605776057706e0a3034373636313735343b02373302363a03276122022f3c0d616d6e6d703821603333376630096f6d7771676f6d74670769677b666d756c096f6d777167666d756c0232300232330a5d5d67714f6d66776e67', 757 | [ 758 | , 759 | , 760 | void 0, 761 | 'undefined' != typeof module ? module : void 0, 762 | 'undefined' != typeof define ? define : void 0, 763 | 'undefined' != typeof Object ? Object : void 0, 764 | void 0, 765 | 'undefined' != typeof TypeError ? TypeError : void 0, 766 | 'undefined' != typeof document ? document : void 0, 767 | 'undefined' != typeof InstallTrigger ? InstallTrigger : void 0, 768 | 'undefined' != typeof safari ? safari : void 0, 769 | 'undefined' != typeof Date ? Date : void 0, 770 | 'undefined' != typeof Math ? Math : void 0, 771 | 'undefined' != typeof navigator ? navigator : void 0, 772 | 'undefined' != typeof location ? location : void 0, 773 | 'undefined' != typeof history ? history : void 0, 774 | 'undefined' != typeof Image ? Image : void 0, 775 | 'undefined' != typeof console ? console : void 0, 776 | 'undefined' != typeof PluginArray ? PluginArray : void 0, 777 | 'undefined' != typeof indexedDB ? indexedDB : void 0, 778 | 'undefined' != typeof DOMException ? DOMException : void 0, 779 | 'undefined' != typeof parseInt ? parseInt : void 0, 780 | 'undefined' != typeof String ? String : void 0, 781 | 'undefined' != typeof Array ? Array : void 0, 782 | 'undefined' != typeof Error ? Error : void 0, 783 | 'undefined' != typeof JSON ? JSON : void 0, 784 | 'undefined' != typeof Promise ? Promise : void 0, 785 | 'undefined' != typeof WebSocket ? WebSocket : void 0, 786 | 'undefined' != typeof eval ? eval : void 0, 787 | 'undefined' != typeof setTimeout ? setTimeout : void 0, 788 | 'undefined' != typeof encodeURIComponent ? encodeURIComponent : void 0, 789 | 'undefined' != typeof encodeURI ? encodeURI : void 0, 790 | 'undefined' != typeof Request ? Request : void 0, 791 | 'undefined' != typeof Headers ? Headers : void 0, 792 | 'undefined' != typeof decodeURIComponent ? decodeURIComponent : void 0, 793 | 'undefined' != typeof RegExp ? RegExp : void 0 794 | ] 795 | ) 796 | 797 | const cids = { 798 | // 财经 799 | finance: '3189399007', 800 | // 科技 801 | technology: '3189398999', 802 | //热点 803 | hot: '3189398996', 804 | // 国际 805 | international: '3189398968', 806 | // 军事 807 | military: '3189398960', 808 | // 体育 809 | sports: '3189398957', 810 | // 娱乐 811 | entertainment: '3189398972', 812 | // 数码 813 | digital: '3189398981', 814 | // 历史 815 | history: '3189398965', 816 | // 美食 817 | food: '3189399002', 818 | // 游戏 819 | games: '3189398995', 820 | // 旅游 821 | travel: '3189398983', 822 | // 养生 823 | health: '3189398959', 824 | // 时尚 825 | fashion: '3189398984', 826 | // 育儿 827 | parenting: '3189399004', 828 | // 视频 829 | video: '3431225546' 830 | }; 831 | 832 | 833 | const sigs = {}; 834 | 835 | // 遍历 _cid 836 | for (const [key, value] of Object.entries(cids)) { 837 | // 生成 _sig 838 | sigs[key+'_sig'] = window.byted_acrawler.sign({ 839 | url: `https://www.toutiao.com/api/pc/list/feed?channel_id=${value}&min_behot_time=0&offset=0&category=pc_profile_channel&client_extra_params=%7B%22short_video_item%22:%22filter%22%7D&aid=24&app_name=toutiao_web` 840 | }); 841 | } 842 | 843 | sigs['hot_event_sig'] = window.byted_acrawler.sign({ 844 | url: 'https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc' 845 | }) 846 | 847 | // 打印 _sig 848 | console.log(sigs) 849 | 850 | 851 | 852 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TTnews", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "TTnews", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "canvas": "^2.11.2", 12 | "jsdom": "^21.1.1" 13 | } 14 | }, 15 | "node_modules/@mapbox/node-pre-gyp": { 16 | "version": "1.0.10", 17 | "resolved": "https://registry.npmmirror.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", 18 | "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", 19 | "dependencies": { 20 | "detect-libc": "^2.0.0", 21 | "https-proxy-agent": "^5.0.0", 22 | "make-dir": "^3.1.0", 23 | "node-fetch": "^2.6.7", 24 | "nopt": "^5.0.0", 25 | "npmlog": "^5.0.1", 26 | "rimraf": "^3.0.2", 27 | "semver": "^7.3.5", 28 | "tar": "^6.1.11" 29 | }, 30 | "bin": { 31 | "node-pre-gyp": "bin/node-pre-gyp" 32 | } 33 | }, 34 | "node_modules/@tootallnate/once": { 35 | "version": "2.0.0", 36 | "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz", 37 | "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", 38 | "engines": { 39 | "node": ">= 10" 40 | } 41 | }, 42 | "node_modules/abab": { 43 | "version": "2.0.6", 44 | "resolved": "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz", 45 | "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" 46 | }, 47 | "node_modules/abbrev": { 48 | "version": "1.1.1", 49 | "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", 50 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 51 | }, 52 | "node_modules/acorn": { 53 | "version": "8.8.2", 54 | "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz", 55 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 56 | "bin": { 57 | "acorn": "bin/acorn" 58 | }, 59 | "engines": { 60 | "node": ">=0.4.0" 61 | } 62 | }, 63 | "node_modules/acorn-globals": { 64 | "version": "7.0.1", 65 | "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz", 66 | "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", 67 | "dependencies": { 68 | "acorn": "^8.1.0", 69 | "acorn-walk": "^8.0.2" 70 | } 71 | }, 72 | "node_modules/acorn-walk": { 73 | "version": "8.2.0", 74 | "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", 75 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 76 | "engines": { 77 | "node": ">=0.4.0" 78 | } 79 | }, 80 | "node_modules/agent-base": { 81 | "version": "6.0.2", 82 | "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", 83 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 84 | "dependencies": { 85 | "debug": "4" 86 | }, 87 | "engines": { 88 | "node": ">= 6.0.0" 89 | } 90 | }, 91 | "node_modules/ansi-regex": { 92 | "version": "5.0.1", 93 | "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", 94 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 95 | "engines": { 96 | "node": ">=8" 97 | } 98 | }, 99 | "node_modules/aproba": { 100 | "version": "2.0.0", 101 | "resolved": "https://registry.npmmirror.com/aproba/-/aproba-2.0.0.tgz", 102 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" 103 | }, 104 | "node_modules/are-we-there-yet": { 105 | "version": "2.0.0", 106 | "resolved": "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", 107 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", 108 | "dependencies": { 109 | "delegates": "^1.0.0", 110 | "readable-stream": "^3.6.0" 111 | }, 112 | "engines": { 113 | "node": ">=10" 114 | } 115 | }, 116 | "node_modules/asynckit": { 117 | "version": "0.4.0", 118 | "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", 119 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 120 | }, 121 | "node_modules/balanced-match": { 122 | "version": "1.0.2", 123 | "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", 124 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 125 | }, 126 | "node_modules/brace-expansion": { 127 | "version": "1.1.11", 128 | "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", 129 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 130 | "dependencies": { 131 | "balanced-match": "^1.0.0", 132 | "concat-map": "0.0.1" 133 | } 134 | }, 135 | "node_modules/canvas": { 136 | "version": "2.11.2", 137 | "resolved": "https://registry.npmmirror.com/canvas/-/canvas-2.11.2.tgz", 138 | "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", 139 | "hasInstallScript": true, 140 | "dependencies": { 141 | "@mapbox/node-pre-gyp": "^1.0.0", 142 | "nan": "^2.17.0", 143 | "simple-get": "^3.0.3" 144 | }, 145 | "engines": { 146 | "node": ">=6" 147 | } 148 | }, 149 | "node_modules/chownr": { 150 | "version": "2.0.0", 151 | "resolved": "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz", 152 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 153 | "engines": { 154 | "node": ">=10" 155 | } 156 | }, 157 | "node_modules/color-support": { 158 | "version": "1.1.3", 159 | "resolved": "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz", 160 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 161 | "bin": { 162 | "color-support": "bin.js" 163 | } 164 | }, 165 | "node_modules/combined-stream": { 166 | "version": "1.0.8", 167 | "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", 168 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 169 | "dependencies": { 170 | "delayed-stream": "~1.0.0" 171 | }, 172 | "engines": { 173 | "node": ">= 0.8" 174 | } 175 | }, 176 | "node_modules/concat-map": { 177 | "version": "0.0.1", 178 | "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", 179 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 180 | }, 181 | "node_modules/console-control-strings": { 182 | "version": "1.1.0", 183 | "resolved": "https://registry.npmmirror.com/console-control-strings/-/console-control-strings-1.1.0.tgz", 184 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" 185 | }, 186 | "node_modules/cssstyle": { 187 | "version": "3.0.0", 188 | "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-3.0.0.tgz", 189 | "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", 190 | "dependencies": { 191 | "rrweb-cssom": "^0.6.0" 192 | }, 193 | "engines": { 194 | "node": ">=14" 195 | } 196 | }, 197 | "node_modules/data-urls": { 198 | "version": "4.0.0", 199 | "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-4.0.0.tgz", 200 | "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", 201 | "dependencies": { 202 | "abab": "^2.0.6", 203 | "whatwg-mimetype": "^3.0.0", 204 | "whatwg-url": "^12.0.0" 205 | }, 206 | "engines": { 207 | "node": ">=14" 208 | } 209 | }, 210 | "node_modules/debug": { 211 | "version": "4.3.4", 212 | "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", 213 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 214 | "dependencies": { 215 | "ms": "2.1.2" 216 | }, 217 | "engines": { 218 | "node": ">=6.0" 219 | }, 220 | "peerDependenciesMeta": { 221 | "supports-color": { 222 | "optional": true 223 | } 224 | } 225 | }, 226 | "node_modules/decimal.js": { 227 | "version": "10.4.3", 228 | "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz", 229 | "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" 230 | }, 231 | "node_modules/decompress-response": { 232 | "version": "4.2.1", 233 | "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-4.2.1.tgz", 234 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 235 | "dependencies": { 236 | "mimic-response": "^2.0.0" 237 | }, 238 | "engines": { 239 | "node": ">=8" 240 | } 241 | }, 242 | "node_modules/deep-is": { 243 | "version": "0.1.4", 244 | "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", 245 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" 246 | }, 247 | "node_modules/delayed-stream": { 248 | "version": "1.0.0", 249 | "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", 250 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 251 | "engines": { 252 | "node": ">=0.4.0" 253 | } 254 | }, 255 | "node_modules/delegates": { 256 | "version": "1.0.0", 257 | "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz", 258 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 259 | }, 260 | "node_modules/detect-libc": { 261 | "version": "2.0.1", 262 | "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.1.tgz", 263 | "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", 264 | "engines": { 265 | "node": ">=8" 266 | } 267 | }, 268 | "node_modules/domexception": { 269 | "version": "4.0.0", 270 | "resolved": "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz", 271 | "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", 272 | "dependencies": { 273 | "webidl-conversions": "^7.0.0" 274 | }, 275 | "engines": { 276 | "node": ">=12" 277 | } 278 | }, 279 | "node_modules/emoji-regex": { 280 | "version": "8.0.0", 281 | "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", 282 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 283 | }, 284 | "node_modules/entities": { 285 | "version": "4.5.0", 286 | "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", 287 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 288 | "engines": { 289 | "node": ">=0.12" 290 | } 291 | }, 292 | "node_modules/escodegen": { 293 | "version": "2.0.0", 294 | "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.0.0.tgz", 295 | "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", 296 | "dependencies": { 297 | "esprima": "^4.0.1", 298 | "estraverse": "^5.2.0", 299 | "esutils": "^2.0.2", 300 | "optionator": "^0.8.1" 301 | }, 302 | "bin": { 303 | "escodegen": "bin/escodegen.js", 304 | "esgenerate": "bin/esgenerate.js" 305 | }, 306 | "engines": { 307 | "node": ">=6.0" 308 | }, 309 | "optionalDependencies": { 310 | "source-map": "~0.6.1" 311 | } 312 | }, 313 | "node_modules/esprima": { 314 | "version": "4.0.1", 315 | "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", 316 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 317 | "bin": { 318 | "esparse": "bin/esparse.js", 319 | "esvalidate": "bin/esvalidate.js" 320 | }, 321 | "engines": { 322 | "node": ">=4" 323 | } 324 | }, 325 | "node_modules/estraverse": { 326 | "version": "5.3.0", 327 | "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", 328 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 329 | "engines": { 330 | "node": ">=4.0" 331 | } 332 | }, 333 | "node_modules/esutils": { 334 | "version": "2.0.3", 335 | "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", 336 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 337 | "engines": { 338 | "node": ">=0.10.0" 339 | } 340 | }, 341 | "node_modules/fast-levenshtein": { 342 | "version": "2.0.6", 343 | "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 344 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" 345 | }, 346 | "node_modules/form-data": { 347 | "version": "4.0.0", 348 | "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", 349 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 350 | "dependencies": { 351 | "asynckit": "^0.4.0", 352 | "combined-stream": "^1.0.8", 353 | "mime-types": "^2.1.12" 354 | }, 355 | "engines": { 356 | "node": ">= 6" 357 | } 358 | }, 359 | "node_modules/fs-minipass": { 360 | "version": "2.1.0", 361 | "resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz", 362 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 363 | "dependencies": { 364 | "minipass": "^3.0.0" 365 | }, 366 | "engines": { 367 | "node": ">= 8" 368 | } 369 | }, 370 | "node_modules/fs-minipass/node_modules/minipass": { 371 | "version": "3.3.6", 372 | "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", 373 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 374 | "dependencies": { 375 | "yallist": "^4.0.0" 376 | }, 377 | "engines": { 378 | "node": ">=8" 379 | } 380 | }, 381 | "node_modules/fs.realpath": { 382 | "version": "1.0.0", 383 | "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", 384 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 385 | }, 386 | "node_modules/gauge": { 387 | "version": "3.0.2", 388 | "resolved": "https://registry.npmmirror.com/gauge/-/gauge-3.0.2.tgz", 389 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", 390 | "dependencies": { 391 | "aproba": "^1.0.3 || ^2.0.0", 392 | "color-support": "^1.1.2", 393 | "console-control-strings": "^1.0.0", 394 | "has-unicode": "^2.0.1", 395 | "object-assign": "^4.1.1", 396 | "signal-exit": "^3.0.0", 397 | "string-width": "^4.2.3", 398 | "strip-ansi": "^6.0.1", 399 | "wide-align": "^1.1.2" 400 | }, 401 | "engines": { 402 | "node": ">=10" 403 | } 404 | }, 405 | "node_modules/glob": { 406 | "version": "7.2.3", 407 | "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", 408 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 409 | "dependencies": { 410 | "fs.realpath": "^1.0.0", 411 | "inflight": "^1.0.4", 412 | "inherits": "2", 413 | "minimatch": "^3.1.1", 414 | "once": "^1.3.0", 415 | "path-is-absolute": "^1.0.0" 416 | }, 417 | "engines": { 418 | "node": "*" 419 | } 420 | }, 421 | "node_modules/has-unicode": { 422 | "version": "2.0.1", 423 | "resolved": "https://registry.npmmirror.com/has-unicode/-/has-unicode-2.0.1.tgz", 424 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" 425 | }, 426 | "node_modules/html-encoding-sniffer": { 427 | "version": "3.0.0", 428 | "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", 429 | "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", 430 | "dependencies": { 431 | "whatwg-encoding": "^2.0.0" 432 | }, 433 | "engines": { 434 | "node": ">=12" 435 | } 436 | }, 437 | "node_modules/http-proxy-agent": { 438 | "version": "5.0.0", 439 | "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", 440 | "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", 441 | "dependencies": { 442 | "@tootallnate/once": "2", 443 | "agent-base": "6", 444 | "debug": "4" 445 | }, 446 | "engines": { 447 | "node": ">= 6" 448 | } 449 | }, 450 | "node_modules/https-proxy-agent": { 451 | "version": "5.0.1", 452 | "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 453 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 454 | "dependencies": { 455 | "agent-base": "6", 456 | "debug": "4" 457 | }, 458 | "engines": { 459 | "node": ">= 6" 460 | } 461 | }, 462 | "node_modules/iconv-lite": { 463 | "version": "0.6.3", 464 | "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", 465 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 466 | "dependencies": { 467 | "safer-buffer": ">= 2.1.2 < 3.0.0" 468 | }, 469 | "engines": { 470 | "node": ">=0.10.0" 471 | } 472 | }, 473 | "node_modules/inflight": { 474 | "version": "1.0.6", 475 | "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", 476 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 477 | "dependencies": { 478 | "once": "^1.3.0", 479 | "wrappy": "1" 480 | } 481 | }, 482 | "node_modules/inherits": { 483 | "version": "2.0.4", 484 | "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", 485 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 486 | }, 487 | "node_modules/is-fullwidth-code-point": { 488 | "version": "3.0.0", 489 | "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 490 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 491 | "engines": { 492 | "node": ">=8" 493 | } 494 | }, 495 | "node_modules/is-potential-custom-element-name": { 496 | "version": "1.0.1", 497 | "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 498 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" 499 | }, 500 | "node_modules/jsdom": { 501 | "version": "21.1.1", 502 | "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-21.1.1.tgz", 503 | "integrity": "sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==", 504 | "dependencies": { 505 | "abab": "^2.0.6", 506 | "acorn": "^8.8.2", 507 | "acorn-globals": "^7.0.0", 508 | "cssstyle": "^3.0.0", 509 | "data-urls": "^4.0.0", 510 | "decimal.js": "^10.4.3", 511 | "domexception": "^4.0.0", 512 | "escodegen": "^2.0.0", 513 | "form-data": "^4.0.0", 514 | "html-encoding-sniffer": "^3.0.0", 515 | "http-proxy-agent": "^5.0.0", 516 | "https-proxy-agent": "^5.0.1", 517 | "is-potential-custom-element-name": "^1.0.1", 518 | "nwsapi": "^2.2.2", 519 | "parse5": "^7.1.2", 520 | "rrweb-cssom": "^0.6.0", 521 | "saxes": "^6.0.0", 522 | "symbol-tree": "^3.2.4", 523 | "tough-cookie": "^4.1.2", 524 | "w3c-xmlserializer": "^4.0.0", 525 | "webidl-conversions": "^7.0.0", 526 | "whatwg-encoding": "^2.0.0", 527 | "whatwg-mimetype": "^3.0.0", 528 | "whatwg-url": "^12.0.1", 529 | "ws": "^8.13.0", 530 | "xml-name-validator": "^4.0.0" 531 | }, 532 | "engines": { 533 | "node": ">=14" 534 | }, 535 | "peerDependencies": { 536 | "canvas": "^2.5.0" 537 | }, 538 | "peerDependenciesMeta": { 539 | "canvas": { 540 | "optional": true 541 | } 542 | } 543 | }, 544 | "node_modules/levn": { 545 | "version": "0.3.0", 546 | "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz", 547 | "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", 548 | "dependencies": { 549 | "prelude-ls": "~1.1.2", 550 | "type-check": "~0.3.2" 551 | }, 552 | "engines": { 553 | "node": ">= 0.8.0" 554 | } 555 | }, 556 | "node_modules/lru-cache": { 557 | "version": "6.0.0", 558 | "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", 559 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 560 | "dependencies": { 561 | "yallist": "^4.0.0" 562 | }, 563 | "engines": { 564 | "node": ">=10" 565 | } 566 | }, 567 | "node_modules/make-dir": { 568 | "version": "3.1.0", 569 | "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz", 570 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 571 | "dependencies": { 572 | "semver": "^6.0.0" 573 | }, 574 | "engines": { 575 | "node": ">=8" 576 | } 577 | }, 578 | "node_modules/make-dir/node_modules/semver": { 579 | "version": "6.3.0", 580 | "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", 581 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 582 | "bin": { 583 | "semver": "bin/semver.js" 584 | } 585 | }, 586 | "node_modules/mime-db": { 587 | "version": "1.52.0", 588 | "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", 589 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 590 | "engines": { 591 | "node": ">= 0.6" 592 | } 593 | }, 594 | "node_modules/mime-types": { 595 | "version": "2.1.35", 596 | "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", 597 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 598 | "dependencies": { 599 | "mime-db": "1.52.0" 600 | }, 601 | "engines": { 602 | "node": ">= 0.6" 603 | } 604 | }, 605 | "node_modules/mimic-response": { 606 | "version": "2.1.0", 607 | "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-2.1.0.tgz", 608 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", 609 | "engines": { 610 | "node": ">=8" 611 | } 612 | }, 613 | "node_modules/minimatch": { 614 | "version": "3.1.2", 615 | "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", 616 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 617 | "dependencies": { 618 | "brace-expansion": "^1.1.7" 619 | }, 620 | "engines": { 621 | "node": "*" 622 | } 623 | }, 624 | "node_modules/minipass": { 625 | "version": "4.2.8", 626 | "resolved": "https://registry.npmmirror.com/minipass/-/minipass-4.2.8.tgz", 627 | "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", 628 | "engines": { 629 | "node": ">=8" 630 | } 631 | }, 632 | "node_modules/minizlib": { 633 | "version": "2.1.2", 634 | "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz", 635 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 636 | "dependencies": { 637 | "minipass": "^3.0.0", 638 | "yallist": "^4.0.0" 639 | }, 640 | "engines": { 641 | "node": ">= 8" 642 | } 643 | }, 644 | "node_modules/minizlib/node_modules/minipass": { 645 | "version": "3.3.6", 646 | "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", 647 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 648 | "dependencies": { 649 | "yallist": "^4.0.0" 650 | }, 651 | "engines": { 652 | "node": ">=8" 653 | } 654 | }, 655 | "node_modules/mkdirp": { 656 | "version": "1.0.4", 657 | "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", 658 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 659 | "bin": { 660 | "mkdirp": "bin/cmd.js" 661 | }, 662 | "engines": { 663 | "node": ">=10" 664 | } 665 | }, 666 | "node_modules/ms": { 667 | "version": "2.1.2", 668 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", 669 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 670 | }, 671 | "node_modules/nan": { 672 | "version": "2.17.0", 673 | "resolved": "https://registry.npmmirror.com/nan/-/nan-2.17.0.tgz", 674 | "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" 675 | }, 676 | "node_modules/node-fetch": { 677 | "version": "2.6.9", 678 | "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.9.tgz", 679 | "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", 680 | "dependencies": { 681 | "whatwg-url": "^5.0.0" 682 | }, 683 | "engines": { 684 | "node": "4.x || >=6.0.0" 685 | }, 686 | "peerDependencies": { 687 | "encoding": "^0.1.0" 688 | }, 689 | "peerDependenciesMeta": { 690 | "encoding": { 691 | "optional": true 692 | } 693 | } 694 | }, 695 | "node_modules/node-fetch/node_modules/tr46": { 696 | "version": "0.0.3", 697 | "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", 698 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 699 | }, 700 | "node_modules/node-fetch/node_modules/webidl-conversions": { 701 | "version": "3.0.1", 702 | "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 703 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 704 | }, 705 | "node_modules/node-fetch/node_modules/whatwg-url": { 706 | "version": "5.0.0", 707 | "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", 708 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 709 | "dependencies": { 710 | "tr46": "~0.0.3", 711 | "webidl-conversions": "^3.0.0" 712 | } 713 | }, 714 | "node_modules/nopt": { 715 | "version": "5.0.0", 716 | "resolved": "https://registry.npmmirror.com/nopt/-/nopt-5.0.0.tgz", 717 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 718 | "dependencies": { 719 | "abbrev": "1" 720 | }, 721 | "bin": { 722 | "nopt": "bin/nopt.js" 723 | }, 724 | "engines": { 725 | "node": ">=6" 726 | } 727 | }, 728 | "node_modules/npmlog": { 729 | "version": "5.0.1", 730 | "resolved": "https://registry.npmmirror.com/npmlog/-/npmlog-5.0.1.tgz", 731 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", 732 | "dependencies": { 733 | "are-we-there-yet": "^2.0.0", 734 | "console-control-strings": "^1.1.0", 735 | "gauge": "^3.0.0", 736 | "set-blocking": "^2.0.0" 737 | } 738 | }, 739 | "node_modules/nwsapi": { 740 | "version": "2.2.4", 741 | "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.4.tgz", 742 | "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==" 743 | }, 744 | "node_modules/object-assign": { 745 | "version": "4.1.1", 746 | "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", 747 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 748 | "engines": { 749 | "node": ">=0.10.0" 750 | } 751 | }, 752 | "node_modules/once": { 753 | "version": "1.4.0", 754 | "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", 755 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 756 | "dependencies": { 757 | "wrappy": "1" 758 | } 759 | }, 760 | "node_modules/optionator": { 761 | "version": "0.8.3", 762 | "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz", 763 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 764 | "dependencies": { 765 | "deep-is": "~0.1.3", 766 | "fast-levenshtein": "~2.0.6", 767 | "levn": "~0.3.0", 768 | "prelude-ls": "~1.1.2", 769 | "type-check": "~0.3.2", 770 | "word-wrap": "~1.2.3" 771 | }, 772 | "engines": { 773 | "node": ">= 0.8.0" 774 | } 775 | }, 776 | "node_modules/parse5": { 777 | "version": "7.1.2", 778 | "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz", 779 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", 780 | "dependencies": { 781 | "entities": "^4.4.0" 782 | } 783 | }, 784 | "node_modules/path-is-absolute": { 785 | "version": "1.0.1", 786 | "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 787 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 788 | "engines": { 789 | "node": ">=0.10.0" 790 | } 791 | }, 792 | "node_modules/prelude-ls": { 793 | "version": "1.1.2", 794 | "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz", 795 | "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", 796 | "engines": { 797 | "node": ">= 0.8.0" 798 | } 799 | }, 800 | "node_modules/psl": { 801 | "version": "1.9.0", 802 | "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz", 803 | "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" 804 | }, 805 | "node_modules/punycode": { 806 | "version": "2.3.0", 807 | "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", 808 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 809 | "engines": { 810 | "node": ">=6" 811 | } 812 | }, 813 | "node_modules/querystringify": { 814 | "version": "2.2.0", 815 | "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz", 816 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" 817 | }, 818 | "node_modules/readable-stream": { 819 | "version": "3.6.2", 820 | "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", 821 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 822 | "dependencies": { 823 | "inherits": "^2.0.3", 824 | "string_decoder": "^1.1.1", 825 | "util-deprecate": "^1.0.1" 826 | }, 827 | "engines": { 828 | "node": ">= 6" 829 | } 830 | }, 831 | "node_modules/requires-port": { 832 | "version": "1.0.0", 833 | "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", 834 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" 835 | }, 836 | "node_modules/rimraf": { 837 | "version": "3.0.2", 838 | "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", 839 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 840 | "dependencies": { 841 | "glob": "^7.1.3" 842 | }, 843 | "bin": { 844 | "rimraf": "bin.js" 845 | } 846 | }, 847 | "node_modules/rrweb-cssom": { 848 | "version": "0.6.0", 849 | "resolved": "https://registry.npmmirror.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", 850 | "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" 851 | }, 852 | "node_modules/safe-buffer": { 853 | "version": "5.2.1", 854 | "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", 855 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 856 | }, 857 | "node_modules/safer-buffer": { 858 | "version": "2.1.2", 859 | "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", 860 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 861 | }, 862 | "node_modules/saxes": { 863 | "version": "6.0.0", 864 | "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz", 865 | "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", 866 | "dependencies": { 867 | "xmlchars": "^2.2.0" 868 | }, 869 | "engines": { 870 | "node": ">=v12.22.7" 871 | } 872 | }, 873 | "node_modules/semver": { 874 | "version": "7.5.0", 875 | "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.0.tgz", 876 | "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", 877 | "dependencies": { 878 | "lru-cache": "^6.0.0" 879 | }, 880 | "bin": { 881 | "semver": "bin/semver.js" 882 | }, 883 | "engines": { 884 | "node": ">=10" 885 | } 886 | }, 887 | "node_modules/set-blocking": { 888 | "version": "2.0.0", 889 | "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", 890 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 891 | }, 892 | "node_modules/signal-exit": { 893 | "version": "3.0.7", 894 | "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", 895 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 896 | }, 897 | "node_modules/simple-concat": { 898 | "version": "1.0.1", 899 | "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", 900 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 901 | }, 902 | "node_modules/simple-get": { 903 | "version": "3.1.1", 904 | "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-3.1.1.tgz", 905 | "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", 906 | "dependencies": { 907 | "decompress-response": "^4.2.0", 908 | "once": "^1.3.1", 909 | "simple-concat": "^1.0.0" 910 | } 911 | }, 912 | "node_modules/source-map": { 913 | "version": "0.6.1", 914 | "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", 915 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 916 | "optional": true, 917 | "engines": { 918 | "node": ">=0.10.0" 919 | } 920 | }, 921 | "node_modules/string_decoder": { 922 | "version": "1.3.0", 923 | "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", 924 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 925 | "dependencies": { 926 | "safe-buffer": "~5.2.0" 927 | } 928 | }, 929 | "node_modules/string-width": { 930 | "version": "4.2.3", 931 | "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", 932 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 933 | "dependencies": { 934 | "emoji-regex": "^8.0.0", 935 | "is-fullwidth-code-point": "^3.0.0", 936 | "strip-ansi": "^6.0.1" 937 | }, 938 | "engines": { 939 | "node": ">=8" 940 | } 941 | }, 942 | "node_modules/strip-ansi": { 943 | "version": "6.0.1", 944 | "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", 945 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 946 | "dependencies": { 947 | "ansi-regex": "^5.0.1" 948 | }, 949 | "engines": { 950 | "node": ">=8" 951 | } 952 | }, 953 | "node_modules/symbol-tree": { 954 | "version": "3.2.4", 955 | "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", 956 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" 957 | }, 958 | "node_modules/tar": { 959 | "version": "6.1.13", 960 | "resolved": "https://registry.npmmirror.com/tar/-/tar-6.1.13.tgz", 961 | "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", 962 | "dependencies": { 963 | "chownr": "^2.0.0", 964 | "fs-minipass": "^2.0.0", 965 | "minipass": "^4.0.0", 966 | "minizlib": "^2.1.1", 967 | "mkdirp": "^1.0.3", 968 | "yallist": "^4.0.0" 969 | }, 970 | "engines": { 971 | "node": ">=10" 972 | } 973 | }, 974 | "node_modules/tough-cookie": { 975 | "version": "4.1.2", 976 | "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.2.tgz", 977 | "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", 978 | "dependencies": { 979 | "psl": "^1.1.33", 980 | "punycode": "^2.1.1", 981 | "universalify": "^0.2.0", 982 | "url-parse": "^1.5.3" 983 | }, 984 | "engines": { 985 | "node": ">=6" 986 | } 987 | }, 988 | "node_modules/tr46": { 989 | "version": "4.1.1", 990 | "resolved": "https://registry.npmmirror.com/tr46/-/tr46-4.1.1.tgz", 991 | "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", 992 | "dependencies": { 993 | "punycode": "^2.3.0" 994 | }, 995 | "engines": { 996 | "node": ">=14" 997 | } 998 | }, 999 | "node_modules/type-check": { 1000 | "version": "0.3.2", 1001 | "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", 1002 | "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", 1003 | "dependencies": { 1004 | "prelude-ls": "~1.1.2" 1005 | }, 1006 | "engines": { 1007 | "node": ">= 0.8.0" 1008 | } 1009 | }, 1010 | "node_modules/universalify": { 1011 | "version": "0.2.0", 1012 | "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz", 1013 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", 1014 | "engines": { 1015 | "node": ">= 4.0.0" 1016 | } 1017 | }, 1018 | "node_modules/url-parse": { 1019 | "version": "1.5.10", 1020 | "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz", 1021 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 1022 | "dependencies": { 1023 | "querystringify": "^2.1.1", 1024 | "requires-port": "^1.0.0" 1025 | } 1026 | }, 1027 | "node_modules/util-deprecate": { 1028 | "version": "1.0.2", 1029 | "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", 1030 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1031 | }, 1032 | "node_modules/w3c-xmlserializer": { 1033 | "version": "4.0.0", 1034 | "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", 1035 | "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", 1036 | "dependencies": { 1037 | "xml-name-validator": "^4.0.0" 1038 | }, 1039 | "engines": { 1040 | "node": ">=14" 1041 | } 1042 | }, 1043 | "node_modules/webidl-conversions": { 1044 | "version": "7.0.0", 1045 | "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1046 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1047 | "engines": { 1048 | "node": ">=12" 1049 | } 1050 | }, 1051 | "node_modules/whatwg-encoding": { 1052 | "version": "2.0.0", 1053 | "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", 1054 | "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", 1055 | "dependencies": { 1056 | "iconv-lite": "0.6.3" 1057 | }, 1058 | "engines": { 1059 | "node": ">=12" 1060 | } 1061 | }, 1062 | "node_modules/whatwg-mimetype": { 1063 | "version": "3.0.0", 1064 | "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", 1065 | "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", 1066 | "engines": { 1067 | "node": ">=12" 1068 | } 1069 | }, 1070 | "node_modules/whatwg-url": { 1071 | "version": "12.0.1", 1072 | "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-12.0.1.tgz", 1073 | "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", 1074 | "dependencies": { 1075 | "tr46": "^4.1.1", 1076 | "webidl-conversions": "^7.0.0" 1077 | }, 1078 | "engines": { 1079 | "node": ">=14" 1080 | } 1081 | }, 1082 | "node_modules/wide-align": { 1083 | "version": "1.1.5", 1084 | "resolved": "https://registry.npmmirror.com/wide-align/-/wide-align-1.1.5.tgz", 1085 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 1086 | "dependencies": { 1087 | "string-width": "^1.0.2 || 2 || 3 || 4" 1088 | } 1089 | }, 1090 | "node_modules/word-wrap": { 1091 | "version": "1.2.3", 1092 | "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", 1093 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1094 | "engines": { 1095 | "node": ">=0.10.0" 1096 | } 1097 | }, 1098 | "node_modules/wrappy": { 1099 | "version": "1.0.2", 1100 | "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", 1101 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1102 | }, 1103 | "node_modules/ws": { 1104 | "version": "8.13.0", 1105 | "resolved": "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz", 1106 | "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", 1107 | "engines": { 1108 | "node": ">=10.0.0" 1109 | }, 1110 | "peerDependencies": { 1111 | "bufferutil": "^4.0.1", 1112 | "utf-8-validate": ">=5.0.2" 1113 | }, 1114 | "peerDependenciesMeta": { 1115 | "bufferutil": { 1116 | "optional": true 1117 | }, 1118 | "utf-8-validate": { 1119 | "optional": true 1120 | } 1121 | } 1122 | }, 1123 | "node_modules/xml-name-validator": { 1124 | "version": "4.0.0", 1125 | "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", 1126 | "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", 1127 | "engines": { 1128 | "node": ">=12" 1129 | } 1130 | }, 1131 | "node_modules/xmlchars": { 1132 | "version": "2.2.0", 1133 | "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz", 1134 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" 1135 | }, 1136 | "node_modules/yallist": { 1137 | "version": "4.0.0", 1138 | "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", 1139 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1140 | } 1141 | } 1142 | } 1143 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TTnews", 3 | "version": "1.0.0", 4 | "dependencies": { 5 | "canvas": "^2.11.2", 6 | "jsdom": "^21.1.1" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import json 2 | import requests 3 | from bs4 import BeautifulSoup 4 | from urllib.parse import unquote 5 | 6 | # 传入url,查看从id为RENDER_DATA的script标签中获取的数据结构 7 | HEADERS_ = { 8 | "Cookie": "ttwid=1%7Ctl1VFtYWJj3stLmKsWVg-ZfD7GpsUkBe18GanjhfZKY%7C1702479662%7C58d34dfbb056ede9cc6f0e57640c23c4a61f7f0ce0b15ba2da3c28423967a8c7", 9 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" 10 | } 11 | 12 | url = "https://www.toutiao.com/c/user/token/MS4wLjABAAAAquxMiIRojSXeDqoE1oo6MnwTCAfdPSN1rvvHrjzEHls/" 13 | 14 | res = requests.get(url, headers=HEADERS_) 15 | soup = BeautifulSoup(res.text, 'html.parser') 16 | encoded_str = soup.find('script', {'id': 'RENDER_DATA'}).string 17 | render_data = json.loads(unquote(encoded_str)) 18 | 19 | print(render_data) 20 | --------------------------------------------------------------------------------