├── README.md ├── community_college_list.txt ├── dropbox.py ├── selenium ├── chrome.py └── tor.py ├── url_redirector ├── index.js └── redirect.json └── ygkkk ├── CFwarp.sh └── endip.sh /README.md: -------------------------------------------------------------------------------- 1 | uy9822 2 | ====== 3 | 4 | first_repo 5 | -------------------------------------------------------------------------------- /community_college_list.txt: -------------------------------------------------------------------------------- 1 | Alamo Community College District 2 | Austin Community College 3 | Bergen Community College 4 | Bunker Hill Community College 5 | Butler County Community College 6 | Cape Cod Community College 7 | Central Piedmont Community College 8 | Chattanooga State Community College 9 | Clinton Community College 10 | Coast Community College District 11 | Colorado Community College System 12 | Community College of Philadelphia 13 | Contra Costa Community College District 14 | Cuyahoga Community College 15 | Delaware County Community College 16 | Des Moines Area Community College 17 | Eastern Shore Community College 18 | Fayetteville Technical Community College 19 | Front Range Community College 20 | Glendale Community College 21 | Grossmont-Cuyamaca Community College District 22 | Guilford Technical Community College 23 | Harford Community College 24 | Henry Ford Community College 25 | Highline Community College 26 | Hillsborough Community College 27 | Houston Community College System 28 | Howard Community College 29 | Iowa Valley Community College District 30 | Ivy Tech Community College of Indiana 31 | Jackson Community College 32 | Kankakee Community College 33 | Lansing Community College 34 | Lincoln Land Community College 35 | Loraine County Community College 36 | Los Angeles Community College District 37 | Los Rios Community College District 38 | Monroe Community College 39 | Moraine Valley Community College 40 | Mt. San Antonio Community College 41 | Nassau Community College 42 | Northampton Community College 43 | Oakland Community College 44 | Oklahoma City Community College 45 | Palomar Community College 46 | Pima Community College 47 | Portland Community College 48 | Prince George's Community College 49 | Rio Hondo Community College 50 | Roxbury Community College 51 | Salem Community College 52 | San Bernardino Community College District 53 | San Mateo County Community College District 54 | Santa Monica Community College District 55 | Sinclair Community College 56 | South Texas Community College 57 | Southern State Community College 58 | Southwest Tennessee Community College 59 | St. Charles Community College 60 | Suffolk County Community College 61 | Tidewater Community College 62 | Truckee Meadows Community College 63 | Ventura County Community College District 64 | Wallace Community College Selma -------------------------------------------------------------------------------- /dropbox.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # 3 | # Copyright (c) Dropbox, Inc. 4 | # 5 | # dropbox 6 | # Dropbox frontend script 7 | # This file is part of nautilus-dropbox 2015.10.28. 8 | # 9 | # nautilus-dropbox is free software: you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation, either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # nautilus-dropbox is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with nautilus-dropbox. If not, see . 21 | # 22 | from __future__ import with_statement 23 | 24 | import errno 25 | import locale 26 | import optparse 27 | import os 28 | import platform 29 | import shutil 30 | import socket 31 | import StringIO 32 | import subprocess 33 | import sys 34 | import tarfile 35 | import tempfile 36 | import thread 37 | import threading 38 | import time 39 | import traceback 40 | import urllib2 41 | 42 | from contextlib import closing, contextmanager 43 | from posixpath import abspath, commonprefix, curdir, join, pardir, sep 44 | 45 | try: 46 | import gpgme 47 | except ImportError: 48 | gpgme = None 49 | 50 | 51 | INFO = u"Dropbox is the easiest way to share and store your files online. Want to learn more? Head to" 52 | LINK = u"https://www.dropbox.com/" 53 | WARNING = u"In order to use Dropbox, you must download the proprietary daemon." 54 | GPG_WARNING = u"Note: python-gpgme is not installed, we will not be able to verify binary signatures." 55 | ERROR_CONNECTING = u"Trouble connecting to Dropbox servers. Maybe your internet connection is down, or you need to set your http_proxy environment variable." 56 | ERROR_SIGNATURE = u"Downloaded binary does not match Dropbox signature, aborting install." 57 | 58 | DOWNLOAD_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s" 59 | SIGNATURE_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s&signature=1" 60 | 61 | DOWNLOADING = u"Downloading Dropbox... %d%%" 62 | UNPACKING = u"Unpacking Dropbox... %d%%" 63 | 64 | PARENT_DIR = os.path.expanduser("~") 65 | DROPBOXD_PATH = "%s/.dropbox-dist/dropboxd" % PARENT_DIR 66 | DESKTOP_FILE = u"/usr/share/applications/dropbox.desktop" 67 | 68 | enc = locale.getpreferredencoding() 69 | 70 | # Available from https://linux.dropbox.com/fedora/rpm-public-key.asc 71 | DROPBOX_PUBLIC_KEY = """ 72 | -----BEGIN PGP PUBLIC KEY BLOCK----- 73 | Version: SKS 1.1.0 74 | 75 | mQENBEt0ibEBCACv4hZRPqwtpU6z8+BB5YZU1a3yjEvg2W68+a6hEwxtCa2U++4dzQ+7EqaU 76 | q5ybQnwtbDdpFpsOi9x31J+PCpufPUfIG694/0rlEpmzl2GWzY8NqfdBFGGm/SPSSwvKbeNc 77 | FMRLu5neo7W9kwvfMbGjHmvUbzBUVpCVKD0OEEf1q/Ii0Qcekx9CMoLvWq7ZwNHEbNnij7ec 78 | nvwNlE2MxNsOSJj+hwZGK+tM19kuYGSKw4b5mR8IyThlgiSLIfpSBh1n2KX+TDdk9GR+57TY 79 | vlRu6nTPu98P05IlrrCP+KF0hYZYOaMvQs9Rmc09tc/eoQlN0kkaBWw9Rv/dvLVc0aUXABEB 80 | AAG0MURyb3Bib3ggQXV0b21hdGljIFNpZ25pbmcgS2V5IDxsaW51eEBkcm9wYm94LmNvbT6J 81 | ATYEEwECACAFAkt0ibECGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRD8kYszUESRLi/z 82 | B/wMscEa15rS+0mIpsORknD7kawKwyda+LHdtZc0hD/73QGFINR2P23UTol/R4nyAFEuYNsF 83 | 0C4IAD6y4pL49eZ72IktPrr4H27Q9eXhNZfJhD7BvQMBx75L0F5gSQwuC7GdYNlwSlCD0AAh 84 | Qbi70VBwzeIgITBkMQcJIhLvllYo/AKD7Gv9huy4RLaIoSeofp+2Q0zUHNPl/7zymOqu+5Ox 85 | e1ltuJT/kd/8hU+N5WNxJTSaOK0sF1/wWFM6rWd6XQUP03VyNosAevX5tBo++iD1WY2/lFVU 86 | JkvAvge2WFk3c6tAwZT/tKxspFy4M/tNbDKeyvr685XKJw9ei6GcOGHD 87 | =5rWG 88 | -----END PGP PUBLIC KEY BLOCK----- 89 | """ 90 | 91 | # Futures 92 | 93 | def methodcaller(name, *args, **kwargs): 94 | def caller(obj): 95 | return getattr(obj, name)(*args, **kwargs) 96 | return caller 97 | 98 | def relpath(path, start=curdir): 99 | """Return a relative version of a path""" 100 | 101 | if not path: 102 | raise ValueError("no path specified") 103 | 104 | if type(start) is unicode: 105 | start_list = unicode_abspath(start).split(sep) 106 | else: 107 | start_list = abspath(start).split(sep) 108 | 109 | if type(path) is unicode: 110 | path_list = unicode_abspath(path).split(sep) 111 | else: 112 | path_list = abspath(path).split(sep) 113 | 114 | # Work out how much of the filepath is shared by start and path. 115 | i = len(commonprefix([start_list, path_list])) 116 | 117 | rel_list = [pardir] * (len(start_list)-i) + path_list[i:] 118 | if not rel_list: 119 | return curdir 120 | return join(*rel_list) 121 | 122 | # End Futures 123 | 124 | 125 | def console_print(st=u"", f=sys.stdout, linebreak=True): 126 | global enc 127 | assert type(st) is unicode 128 | f.write(st.encode(enc)) 129 | if linebreak: f.write(os.linesep) 130 | 131 | def console_flush(f=sys.stdout): 132 | f.flush() 133 | 134 | def yes_no_question(question): 135 | while True: 136 | console_print(question, linebreak=False) 137 | console_print(u" [y/n] ", linebreak=False) 138 | console_flush() 139 | text = raw_input() 140 | if text.lower().startswith("y"): 141 | return True 142 | elif text.lower().startswith("n"): 143 | return False 144 | else: 145 | console_print(u"Sorry, I didn't understand that. Please type yes or no.") 146 | 147 | def plat(): 148 | if sys.platform.lower().startswith('linux'): 149 | arch = platform.machine() 150 | if (arch[0] == 'i' and 151 | arch[1].isdigit() and 152 | arch[2:4] == '86'): 153 | plat = "x86" 154 | elif arch == 'x86_64': 155 | plat = arch 156 | else: 157 | FatalVisibleError("Platform not supported") 158 | return "lnx.%s" % plat 159 | else: 160 | FatalVisibleError("Platform not supported") 161 | 162 | def is_dropbox_running(): 163 | pidfile = os.path.expanduser("~/.dropbox/dropbox.pid") 164 | 165 | try: 166 | with open(pidfile, "r") as f: 167 | pid = int(f.read()) 168 | with open("/proc/%d/cmdline" % pid, "r") as f: 169 | cmdline = f.read().lower() 170 | except: 171 | cmdline = "" 172 | 173 | return "dropbox" in cmdline 174 | 175 | def unicode_abspath(path): 176 | global enc 177 | assert type(path) is unicode 178 | # shouldn't pass unicode to this craphead, it appends with os.getcwd() which is always a str 179 | return os.path.abspath(path.encode(sys.getfilesystemencoding())).decode(sys.getfilesystemencoding()) 180 | 181 | @contextmanager 182 | def gpgme_context(keys): 183 | gpg_conf_contents = '' 184 | _gpghome = tempfile.mkdtemp(prefix='tmp.gpghome') 185 | 186 | try: 187 | os.environ['GNUPGHOME'] = _gpghome 188 | fp = open(os.path.join(_gpghome, 'gpg.conf'), 'wb') 189 | fp.write(gpg_conf_contents) 190 | fp.close() 191 | ctx = gpgme.Context() 192 | 193 | loaded = [] 194 | for key_file in keys: 195 | result = ctx.import_(key_file) 196 | key = ctx.get_key(result.imports[0][0]) 197 | loaded.append(key) 198 | 199 | ctx.signers = loaded 200 | 201 | yield ctx 202 | finally: 203 | del os.environ['GNUPGHOME'] 204 | shutil.rmtree(_gpghome, ignore_errors=True) 205 | 206 | class SignatureVerifyError(Exception): 207 | pass 208 | 209 | def verify_signature(key_file, sig_file, plain_file): 210 | with gpgme_context([key_file]) as ctx: 211 | sigs = ctx.verify(sig_file, plain_file, None) 212 | return sigs[0].status == None 213 | 214 | def download_file_chunk(url, buf): 215 | opener = urllib2.build_opener() 216 | opener.addheaders = [('User-Agent', "DropboxLinuxDownloader/2015.10.28")] 217 | sock = opener.open(url) 218 | 219 | size = int(sock.info()['content-length']) 220 | bufsize = max(size / 200, 4096) 221 | progress = 0 222 | 223 | with closing(sock) as f: 224 | yield (0, True) 225 | while True: 226 | try: 227 | chunk = f.read(bufsize) 228 | progress += len(chunk) 229 | buf.write(chunk) 230 | yield (float(progress)/size, True) 231 | if progress == size: 232 | break 233 | except OSError, e: 234 | if hasattr(e, 'errno') and e.errno == errno.EAGAIN: 235 | # nothing left to read 236 | yield (float(progress)/size, False) 237 | else: 238 | raise 239 | 240 | class DownloadState(object): 241 | def __init__(self): 242 | self.local_file = StringIO.StringIO() 243 | 244 | def copy_data(self): 245 | return download_file_chunk(DOWNLOAD_LOCATION_FMT % plat(), self.local_file) 246 | 247 | def unpack(self): 248 | # download signature 249 | signature = StringIO.StringIO() 250 | for _ in download_file_chunk(SIGNATURE_LOCATION_FMT % plat(), signature): 251 | pass 252 | signature.seek(0) 253 | self.local_file.seek(0) 254 | 255 | if gpgme: 256 | if not verify_signature(StringIO.StringIO(DROPBOX_PUBLIC_KEY), signature, self.local_file): 257 | raise SignatureVerifyError() 258 | 259 | self.local_file.seek(0) 260 | archive = tarfile.open(fileobj=self.local_file, mode='r:gz') 261 | total_members = len(archive.getmembers()) 262 | for i, member in enumerate(archive.getmembers()): 263 | archive.extract(member, PARENT_DIR) 264 | yield member.name, i, total_members 265 | archive.close() 266 | 267 | def cancel(self): 268 | if not self.local_file.closed: 269 | self.local_file.close() 270 | 271 | def load_serialized_images(): 272 | global box_logo_pixbuf, window_icon 273 | import gtk 274 | box_logo_pixbuf = gtk.gdk.pixbuf_new_from_data('\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9ef\x00\\\x9ej\x00\\\x9e\x04\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eZ\x00[\x9er\x00\\\x9e\x14\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e8\x00Y\x9c\xc2\x00X\x9b\xff\x00X\x9b\xff\x00[\x9d\xaa\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x02\x00\\\x9e\x8e\x00Y\x9b\xff\x00Y\x9b\xff\x00Y\x9b\xd5\x00\\\x9eM\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x12\x00[\x9d\x8b\x00U\x99\xfa\x0fe\xa5\xff]\xa2\xd3\xffM\x95\xc9\xff\x00X\x9b\xff\x00Y\x9c\xc9\x00\\\x9e\x1e\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0f\x00[\x9d\xb1\x00V\x99\xff4\x85\xc1\xffZ\xa3\xda\xff\x17m\xab\xff\x00V\x99\xff\x00Z\x9d\xa2\x00\\\x9e \x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\\\x00W\x9a\xde\x00Y\x9c\xff:\x87\xbf\xff\x83\xbf\xeb\xff\x98\xce\xf6\xff\x9b\xd0\xf6\xffa\xa3\xd3\xff\x05]\x9e\xff\x00X\x9b\xda\x00\\\x9e/\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00Z\x9c\xc5\x01Y\x9b\xff?\x90\xca\xff|\xc1\xf4\xff\x82\xc4\xf6\xff}\xbf\xf0\xffD\x90\xc8\xff\x05]\x9e\xff\x00V\x9a\xed\x00\\\x9es\x00\\\x9e\x07\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e4\x00Z\x9c\xba\x00V\x99\xff\x1dq\xae\xffd\xaa\xdd\xff\x8e\xc9\xf5\xff\x8e\xc7\xf3\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\xa1\xd2\xf6\xffw\xb3\xde\xff\x0fd\xa3\xff\x00V\x9a\xed\x00\\\x9eL\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e4\x00X\x9b\xdd\x05^\x9f\xffM\x9d\xd6\xffy\xc1\xf6\xffw\xbe\xf2\xffz\xbe\xf1\xff\x80\xc1\xf2\xff\x89\xc8\xf6\xffq\xb3\xe3\xff*z\xb5\xff\x00W\x9a\xff\x00X\x9b\xcd\x00\\\x9eG\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0e\x00[\x9d\x86\x00V\x99\xfa\x0cc\xa4\xffK\x96\xce\xff\x81\xc2\xf2\xff\x89\xc7\xf5\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\xa4\xd3\xf6\xff\x85\xbb\xe4\xff\x18k\xa8\xff\x00U\x99\xfc\x00\\\x9en\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eS\x00W\x9a\xf1\x0bb\xa3\xffT\xa3\xdd\xffv\xc0\xf7\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x8a\xc7\xf4\xff\x8f\xc9\xf4\xff`\xa3\xd5\xff\x15i\xa8\xff\x00U\x98\xff\x00[\x9d\x9c\x00\\\x9e\x1a\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eU\x00X\x9b\xd9\x00Z\x9c\xff1\x83\xbf\xffp\xb6\xea\xff\x84\xc5\xf6\xff\x80\xc2\xf2\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\xa6\xd3\xf5\xff\x96\xc7\xeb\xff*y\xb2\xff\x00T\x98\xff\x00\\\x9e\x90\x00\\\x9e\x02\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eu\x00V\x99\xfe\x14k\xac\xff\\\xac\xe6\xffr\xbd\xf6\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8b\xc5\xf1\xff\x95\xcc\xf6\xff\x8c\xc5\xee\xffH\x90\xc5\xff\x04]\x9e\xff\x00V\x9a\xe7\x00\\\x9ej\x00\\\x9e\x03\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e.\x00Z\x9c\xb3\x00V\x99\xff\x17m\xad\xffV\xa3\xdc\xff{\xc2\xf6\xff|\xbf\xf3\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa6\xd3\xf4\xff\xa4\xd1\xf1\xff@\x88\xbd\xff\x00U\x99\xff\x00[\x9d\xb0\x00\\\x9e\x0c\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x02\x00[\x9d\x97\x00V\x98\xff\x1fv\xb6\xffa\xb1\xed\xffl\xbb\xf4\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x93\xcb\xf2\xff\x9e\xd1\xf6\xff|\xb7\xe1\xff(w\xb2\xff\x00U\x99\xff\x00Y\x9c\xc6\x00\\\x9e?\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00[\x9e\x86\x00V\x99\xf6\ta\xa2\xff=\x8f\xcc\xffm\xb9\xf1\xffu\xbf\xf5\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa8\xd3\xf3\xff\xae\xd8\xf4\xffX\x99\xc9\xff\x00X\x9b\xff\x00Y\x9c\xc2\x00\\\x9e\x1b\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\r\x00[\x9d\xab\x00W\x99\xff,\x82\xc1\xffe\xb5\xf2\xffh\xb7\xf3\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x9f\xd1\xf5\xff\xa0\xcf\xf3\xffe\xa3\xd1\xff\x12f\xa5\xff\x00U\x98\xff\x00[\x9d\x9b\x00\\\x9e\x16\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eN\x00Y\x9b\xd3\x00Y\x9c\xff\'}\xbc\xff]\xad\xe8\xffp\xbe\xf6\xffn\xba\xf2\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa9\xd4\xf2\xff\xb5\xdb\xf6\xffq\xaa\xd4\xff\x04[\x9e\xff\x00X\x9b\xdc\x00\\\x9e>\x00\\\x9e0\x00Z\x9c\xc9\x00Z\x9b\xff8\x8d\xcd\xffe\xb7\xf5\xffc\xb4\xf2\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9d\xce\xf2\xff\xa9\xd5\xf6\xff\x99\xc9\xec\xffI\x8e\xc1\xff\x03[\x9d\xff\x00V\x9a\xe1\x00\\\x9ea\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e(\x00[\x9d\xab\x00V\x98\xff\x13j\xab\xffK\x9e\xdc\xffi\xb9\xf6\xffj\xb8\xf3\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xb9\xdc\xf6\xff\x80\xb5\xda\xff\rb\xa2\xff\x00W\x9a\xff\x00Y\x9b\xfe\x04]\x9f\xff>\x94\xd4\xffd\xb6\xf6\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa6\xd2\xf3\xff\xb0\xd9\xf6\xff\x87\xbb\xe0\xff\'u\xaf\xff\x00T\x98\xff\x00Y\x9c\xbd\x00\\\x9e7\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9e~\x00W\x99\xf2\x05^\x9f\xff3\x89\xc9\xff^\xb1\xf0\xffe\xb7\xf5\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xad\xd4\xf1\xff\xbb\xdd\xf6\xff\x96\xc3\xe4\xff\x18i\xa7\xff\x01]\xa2\xffH\x9e\xde\xffa\xb6\xf6\xff^\xb1\xf1\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xb0\xd8\xf5\xff\xad\xd5\xf1\xfff\xa2\xce\xff\rb\xa2\xff\x00U\x99\xfb\x00\\\x9e\x92\x00\\\x9e\x11\x00\\\x9e\x9b\x02\\\x9e\xff\x1ct\xb5\xffM\xa3\xe3\xffb\xb7\xf6\xff`\xb3\xf2\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xad\xd4\xf1\xff\xae\xd5\xf1\xff\xb7\xdb\xf4\xff\xaa\xcf\xe8\xffm\xb3\xe6\xffX\xb2\xf4\xffX\xae\xf1\xff^\xb1\xf1\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xae\xd5\xf2\xff\xba\xdd\xf7\xff\x9b\xc7\xe6\xff<\x83\xb8\xff\x06^\x9f\xff\x00[\x9d\xb6\x00Z\x9c\xdd\x0cd\xa6\xffR\xa9\xe9\xffb\xb7\xf8\xff\\\xb1\xf1\xff_\xb2\xf1\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xaa\xd2\xf0\xff\xb2\xd7\xf1\xff\xce\xe5\xf6\xff\xe9\xf5\xfd\xff\xd0\xeb\xfe\xff\xa1\xd2\xf7\xffg\xb6\xf2\xffW\xad\xf0\xff_\xb2\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xae\xd4\xf1\xff\xbf\xe0\xf7\xff\xac\xd2\xee\xff\x1eo\xaa\xff\x00X\x9b\xeb\x00\\\x9eR\x00Y\x9b\xf6\x0ce\xa6\xffH\x9e\xde\xffb\xb6\xf6\xff_\xb2\xf1\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa5\xd2\xf1\xff\xa8\xd2\xf0\xff\xbe\xdd\xf4\xff\xdd\xee\xfa\xff\xe9\xf3\xfc\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xce\xe8\xfb\xff\xc3\xe2\xfa\xff\x89\xc6\xf5\xff]\xb1\xf1\xff]\xb1\xf0\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xba\xdd\xf6\xff\x93\xc1\xe3\xff\x1fo\xaa\xff\x00W\x9b\xff\x00\\\x9eo\x00\\\x9e\x00\x00\\\x9e;\x00Y\x9b\xdf\x03\\\x9e\xff;\x90\xd0\xffd\xb6\xf5\xffb\xb4\xf2\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa0\xcf\xf1\xff\xa1\xcf\xf0\xff\xae\xd6\xf2\xff\xcf\xe6\xf8\xff\xe4\xf2\xfb\xff\xe5\xf2\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xcb\xe7\xfb\xff\xd1\xe9\xfb\xff\xb3\xda\xf9\xffx\xbe\xf3\xff^\xb1\xf0\xfff\xb6\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaa\xd4\xf2\xff\xb7\xdb\xf6\xffx\xaf\xd6\xff\x0b`\xa1\xff\x00V\x9a\xed\x00\\\x9eR\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00Z\x9c\xbe\x00X\x99\xff-\x83\xc2\xffe\xb6\xf3\xfff\xb6\xf3\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9b\xcc\xf0\xff\xa1\xcf\xf1\xff\xbf\xde\xf6\xff\xdc\xee\xfa\xff\xe3\xf1\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xd2\xe8\xfb\xff\xd0\xe9\xfb\xff\xa2\xd2\xf7\xffm\xb9\xf1\xffe\xb5\xf0\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa9\xd4\xf2\xff\xb1\xd9\xf5\xff[\x9b\xc9\xff\x00X\x9b\xff\x00Y\x9c\xd3\x00\\\x9e-\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x06\x00[\x9d\x96\x00V\x99\xff"x\xb8\xffa\xb1\xee\xffk\xba\xf4\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x96\xca\xf1\xff\x97\xca\xf0\xff\xac\xd5\xf3\xff\xd0\xe7\xf9\xff\xe0\xef\xfb\xff\xdf\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xd0\xea\xfb\xff\xd8\xec\xfb\xff\xc8\xe5\xfa\xff\x8f\xc9\xf4\xffi\xb7\xf0\xffo\xb9\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa8\xd4\xf4\xff\xa6\xd2\xf1\xffE\x8c\xbf\xff\x00U\x99\xff\x00Z\x9d\xaf\x00\\\x9e\x12\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9en\x00V\x98\xfe\x14k\xac\xffY\xaa\xe5\xffp\xbd\xf6\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x8e\xc7\xf0\xff\x9a\xcc\xf1\xff\xbd\xde\xf7\xff\xd8\xec\xfb\xff\xdc\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd6\xec\xfb\xff\xda\xed\xfb\xff\xb6\xdc\xf8\xff\x80\xc1\xf2\xffo\xb9\xf0\xffy\xbd\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa7\xd4\xf5\xff\x95\xc7\xea\xff+y\xb2\xff\x00T\x98\xff\x00[\x9e\x88\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eQ\x00W\x9a\xee\x08a\xa2\xffL\x9d\xd8\xfft\xbf\xf6\xffq\xbb\xf2\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x88\xc4\xf1\xff\x8d\xc6\xf0\xff\xaa\xd5\xf4\xff\xcd\xe7\xfa\xff\xd8\xed\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xdd\xef\xfc\xff\xd7\xeb\xfb\xff\xa6\xd4\xf5\xff{\xbe\xf1\xffy\xbd\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\xa6\xd4\xf6\xff~\xb6\xdf\xff\x15h\xa7\xff\x00U\x99\xf9\x00\\\x9ek\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e-\x00Y\x9c\xd2\x01Y\x9c\xff<\x8e\xca\xffu\xbe\xf4\xffv\xbe\xf2\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x82\xc1\xf1\xff\x83\xc1\xf0\xff\x97\xcb\xf3\xff\xbe\xe0\xf8\xff\xd4\xeb\xfb\xff\xd5\xeb\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xdc\xee\xfb\xff\xe3\xf0\xfc\xff\xcd\xe7\xf9\xff\x98\xcc\xf3\xff|\xbf\xf0\xff\x82\xc2\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x96\xcb\xf2\xff\xa1\xd2\xf5\xffc\xa3\xd2\xff\x06]\x9f\xff\x00W\x9b\xe5\x00\\\x9eC\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x12\x00[\x9d\xaf\x00V\x98\xff.\x81\xbe\xffv\xbd\xf2\xff|\xc0\xf4\xff|\xbf\xf1\xff{\xbf\xf0\xff\x83\xc2\xf1\xff\xaa\xd5\xf6\xff\xcc\xe6\xfb\xff\xd1\xea\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xe2\xf1\xfb\xff\xe3\xf2\xfb\xff\xbe\xdf\xf7\xff\x8b\xc6\xf1\xff\x84\xc2\xf0\xff\x8c\xc5\xf1\xff\x94\xcb\xf3\xff\x9b\xcf\xf4\xffK\x92\xc6\xff\x00W\x9a\xff\x00Y\x9c\xc7\x00\\\x9e#\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x8c\x00V\x98\xfd u\xb3\xffn\xb4\xe8\xff~\xc0\xf3\xff\x94\xca\xf4\xff\xbe\xe0\xf9\xff\xcf\xe8\xfb\xff\xcd\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe1\xf0\xfb\xff\xe8\xf3\xfb\xff\xdb\xed\xfa\xff\xac\xd5\xf4\xff\x8f\xc7\xf2\xff\x89\xc3\xed\xff6\x83\xbb\xff\x00U\x99\xff\x00[\x9d\xa9\x00\\\x9e\n\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x07\x00\\\x9e\xf1\x00Q\x95\xff\x18p\xb0\xff\x98\xcd\xf5\xff\xd4\xeb\xfd\xff\xce\xe8\xfb\xff\xcb\xe6\xfb\xff\xcc\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe6\xf3\xfb\xff\xf2\xf8\xfd\xff\xc9\xe5\xf9\xff1\x81\xba\xff\x00O\x94\xff\x00\\\x9e\xff\x00\\\x9e\'\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e}\x00V\x99\xfc\x1ap\xae\xffc\xad\xe4\xffM\xa8\xef\xff\x83\xc2\xf3\xff\xc6\xe4\xfb\xff\xd1\xe9\xfc\xff\xcc\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe7\xf4\xfc\xff\xe7\xf3\xfb\xff\xb6\xd8\xf4\xff{\xbc\xee\xff\x7f\xbd\xe9\xff/}\xb7\xff\x00U\x99\xff\x00[\x9d\x9d\x00\\\x9e\x06\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00[\x9d\xa2\x00U\x98\xff\'{\xb9\xffs\xbb\xef\xff{\xc0\xf4\xff@\xa1\xed\xff3\x99\xeb\xffW\xac\xee\xff\xa7\xd4\xf7\xff\xd3\xe9\xfc\xff\xd1\xeb\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xe0\xf0\xfb\xff\xea\xf5\xfc\xff\xcc\xe5\xf8\xff~\xbe\xee\xffX\xaa\xe9\xffc\xb0\xe9\xff\x92\xca\xf3\xff\x9a\xcd\xf3\xffC\x8d\xc2\xff\x00U\x99\xff\x00Z\x9c\xbd\x00\\\x9e\x1c\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e%\x00Z\x9c\xc9\x00X\x9b\xff6\x8a\xc6\xffs\xbd\xf3\xffw\xbe\xf3\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xff>\x9f\xeb\xffE\xa2\xeb\xff}\xbf\xf1\xff\xc3\xe3\xfa\xff\xd8\xed\xfc\xff\xd4\xeb\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xdb\xed\xfb\xff\xe4\xf1\xfc\xff\xda\xed\xfb\xff\x97\xca\xf2\xffV\xa9\xea\xffS\xa7\xe9\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x97\xcc\xf2\xff\xa1\xd1\xf5\xff\\\x9e\xcf\xff\x03[\x9d\xff\x00X\x9b\xdf\x00\\\x9e<\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eH\x00X\x9a\xe8\x06_\xa0\xffH\x99\xd5\xffs\xbf\xf6\xffq\xbb\xf2\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffH\xa4\xec\xffG\xa4\xeb\xff\\\xad\xed\xff\x9e\xcf\xf5\xff\xd4\xea\xfb\xff\xda\xee\xfc\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xdd\xef\xfc\xff\xe1\xf0\xfc\xff\xac\xd5\xf5\xff\\\xad\xec\xffB\xa0\xe9\xffQ\xa7\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x9a\xcc\xf1\xff\xa6\xd4\xf6\xffy\xb2\xdd\xff\x11f\xa5\xff\x00V\x99\xf6\x00\\\x9ed\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ef\x00V\x99\xfc\x11h\xa9\xffV\xa7\xe2\xffp\xbd\xf6\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffR\xa9\xec\xffS\xa9\xeb\xffx\xbb\xef\xff\xba\xdd\xf7\xff\xdd\xef\xfc\xff\xdc\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd5\xeb\xfb\xff\xdf\xf0\xfc\xff\xc1\xe1\xf9\xffk\xb5\xef\xff8\x9b\xe9\xff@\xa0\xe9\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa8\xd5\xf5\xff\x91\xc4\xe8\xff\'u\xb0\xff\x00T\x98\xff\x00\\\x9e\x83\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x04\x00[\x9d\x90\x00W\x98\xff\x1fv\xb6\xff_\xaf\xec\xffk\xba\xf5\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xff\\\xad\xeb\xffc\xb1\xeb\xff\x99\xcc\xf2\xff\xd4\xe9\xfa\xff\xe2\xf0\xfc\xff\xdf\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd9\xed\xfc\xff\xd4\xea\xfb\xff\x87\xc4\xf3\xff6\x9b\xea\xff/\x98\xe9\xff>\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa9\xd4\xf4\xff\xa5\xd1\xf0\xffB\x89\xbd\xff\x00U\x99\xff\x00[\x9d\xab\x00\\\x9e\x10\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x19\x00Z\x9d\xb9\x00W\x99\xff*\x81\xc0\xffc\xb5\xf2\xfff\xb6\xf3\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xffe\xb2\xec\xfff\xb2\xeb\xff}\xbd\xed\xff\xb8\xda\xf5\xff\xe1\xf0\xfb\xff\xe4\xf2\xfc\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe3\xf2\xfb\xff\xc8\xe6\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xd2\xe8\xfb\xff\xd8\xee\xfc\xff\xa5\xd2\xf7\xffG\xa2\xed\xff!\x90\xe9\xff0\x98\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa9\xd4\xf2\xff\xb0\xd9\xf5\xffX\x99\xc8\xff\x00W\x9b\xff\x00Y\x9c\xd1\x00\\\x9e,\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e9\x00Y\x9b\xdc\x03\\\x9d\xff9\x8f\xce\xffd\xb6\xf5\xffb\xb4\xf2\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffp\xb7\xeb\xfft\xb7\xeb\xff\x97\xc9\xf0\xff\xcf\xe7\xf8\xff\xe7\xf4\xfc\xff\xe4\xf2\xfb\xff\xe3\xf0\xfb\xff\xe9\xf4\xfb\xff\xd6\xec\xfc\xff\xc5\xe3\xfb\xff\xca\xe6\xfb\xff\xd7\xec\xfc\xff\xbb\xdd\xf9\xff]\xaf\xf0\xff\x1b\x8d\xe9\xff\x1f\x8e\xe9\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaa\xd4\xf2\xff\xb7\xdb\xf6\xffv\xae\xd6\xff\n`\xa0\xff\x00W\x9a\xed\x00\\\x9eQ\x00\\\x9e\x00\x00\\\x9eP\x00Y\x9b\xf5\x0cd\xa6\xffF\x9c\xdc\xffb\xb6\xf6\xff_\xb2\xf1\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xffy\xba\xeb\xff\x83\xbf\xec\xff\xb0\xd6\xf2\xff\xe1\xf0\xfa\xff\xf5\xfa\xfe\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xf1\xf8\xfe\xff\xd2\xe9\xfb\xffz\xbd\xf4\xff \x90\xeb\xff\x10\x87\xe9\xff \x8e\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xba\xdd\xf6\xff\x93\xc1\xe3\xff\x1eo\xaa\xff\x00X\x9b\xff\x00\\\x9ep\x00Z\x9c\xd6\x0bc\xa4\xffQ\xa7\xe7\xffb\xb8\xf9\xff\\\xb1\xf1\xff_\xb2\xf1\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xff~\xbd\xec\xff\x82\xbe\xec\xff\x84\xbf\xeb\xff\xa1\xce\xef\xff\xdf\xee\xf9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xce\xe7\xfb\xffJ\xa5\xee\xff\x08\x83\xe9\xff\x12\x89\xea\xff\x1b\x8d\xea\xff!\x8f\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xae\xd5\xf1\xff\xbf\xe0\xf7\xff\xab\xd2\xed\xff\x1en\xaa\xff\x00X\x9b\xeb\x00[\x9d\x90\x02\\\x9e\xff\x1bs\xb4\xffM\xa2\xe2\xffb\xb7\xf6\xff`\xb3\xf2\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xff\x7f\xbd\xec\xff\x89\xc1\xed\xff\x92\xc6\xed\xff\x93\xc7\xed\xff\x95\xc7\xec\xff\xc0\xde\xf3\xff\x7f\xbf\xf4\xff\x0f\x87\xe9\xff\r\x87\xe9\xff\x1c\x8e\xea\xff\x1d\x8e\xea\xff\x1d\x8e\xea\xff \x8f\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xad\xd5\xf2\xff\xba\xdd\xf6\xff\x9b\xc7\xe7\xff=\x84\xb9\xff\x05]\x9f\xff\x00[\x9d\xb1\x00\\\x9e\x03\x00\\\x9ey\x00X\x9a\xf3\x05^\x9f\xff6\x8c\xcc\xff`\xb3\xf2\xffe\xb7\xf5\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffr\xb8\xec\xff|\xbb\xec\xff\x87\xc1\xed\xff\x8e\xc4\xed\xff\x92\xc6\xed\xff\x94\xc7\xed\xff\x9d\xcb\xed\xff\xb7\xd9\xf3\xffP\xaa\xf0\xff\x18\x8c\xea\xff\x13\x89\xea\xff\x1b\x8e\xea\xff \x90\xea\xff$\x92\xea\xff$\x91\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaf\xd7\xf4\xff\xb1\xd8\xf4\xffn\xa8\xd2\xff\x0ec\xa2\xff\x00U\x99\xfd\x00\\\x9e\x91\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e)\x00Z\x9c\xb2\x00V\x99\xff\x18o\xb0\xffR\xa4\xe2\xffj\xb9\xf6\xffg\xb7\xf2\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xffe\xb2\xec\xffm\xb5\xec\xffz\xbb\xed\xff\x84\xc0\xed\xff\x89\xc2\xed\xff\x8d\xc4\xed\xff\x8f\xc4\xec\xff\x9c\xcc\xee\xff\xc5\xe1\xf5\xff\xca\xe4\xf7\xffi\xb7\xf2\xffS\xac\xf0\xff(\x94\xeb\xff\x16\x8b\xea\xff \x90\xea\xff$\x92\xea\xff*\x95\xea\xff,\x96\xea\xff-\x97\xea\xff2\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa5\xd1\xf2\xff\xb1\xd9\xf6\xff\x94\xc4\xe7\xff2}\xb5\xff\x00U\x99\xff\x00Y\x9c\xc6\x00\\\x9e;\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e[\x00X\x9a\xe1\x04]\x9e\xff3\x87\xc5\xffd\xb4\xef\xffo\xbd\xf5\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xffZ\xad\xec\xff`\xaf\xec\xffj\xb5\xec\xffx\xba\xed\xff\x80\xbe\xed\xff\x83\xc0\xed\xff\x89\xc2\xed\xff\x8a\xc2\xec\xff\x9b\xcb\xef\xff\xc4\xe0\xf6\xff\xd0\xe7\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xff[\xb0\xf1\xff^\xb1\xf1\xff2\x9a\xec\xff\x1b\x8d\xea\xff#\x92\xea\xff)\x95\xea\xff/\x98\xea\xff4\x9a\xea\xff6\x9b\xea\xff9\x9c\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa6\xd3\xf5\xff\xa4\xd1\xf2\xff^\x9e\xcc\xff\x0b`\xa1\xff\x00V\x99\xef\x00\\\x9er\x00\\\x9e\x04\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x17\x00[\x9d\xa0\x00V\x98\xff\x12i\xaa\xffM\x9e\xd9\xffr\xbe\xf5\xffs\xbc\xf3\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffT\xa9\xec\xff\\\xad\xec\xffi\xb4\xed\xffs\xba\xed\xffy\xbb\xed\xff\x7f\xbe\xed\xff\x83\xc0\xed\xff\x85\xc0\xec\xff\x9e\xcd\xf0\xff\xc3\xe1\xf7\xff\xcb\xe4\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xffa\xb3\xf1\xfff\xb5\xf1\xffA\xa2\xed\xff \x90\xea\xff(\x94\xea\xff.\x98\xea\xff4\x9a\xea\xff;\x9d\xea\xff?\x9f\xea\xffA\xa0\xea\xffE\xa2\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x9c\xce\xf3\xff\xa5\xd4\xf6\xff~\xb6\xdf\xff%t\xaf\xff\x00U\x99\xff\x00Z\x9c\xb6\x00\\\x9e&\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eI\x00X\x9b\xd3\x00X\x9b\xff)}\xbb\xffg\xb2\xea\xff|\xc2\xf6\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffH\xa4\xec\xffO\xa7\xec\xff[\xae\xec\xffh\xb3\xed\xffn\xb7\xed\xffs\xba\xed\xffy\xbb\xed\xff~\xbd\xed\xff\x80\xbf\xec\xff\xa1\xcf\xf1\xff\xc3\xe1\xf7\xff\xc6\xe3\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffe\xb5\xf1\xffm\xb9\xf1\xffQ\xaa\xee\xff)\x94\xea\xff,\x97\xea\xff4\x9a\xea\xff:\x9d\xea\xffA\xa0\xea\xffG\xa3\xea\xffJ\xa5\xea\xffM\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x9d\xd0\xf6\xff\x93\xc7\xed\xffF\x8d\xc2\xff\x02Z\x9d\xff\x00W\x9a\xe4\x00\\\x9e`\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\n\x00\\\x9e\x81\x00V\x99\xf6\x0cc\xa4\xffM\x9a\xd3\xffz\xbf\xf3\xffD\xa3\xee\xff;\x9e\xec\xffB\xa2\xec\xffM\xa6\xec\xff[\xae\xed\xffd\xb2\xed\xffh\xb4\xed\xffm\xb6\xed\xffs\xba\xed\xffw\xba\xed\xff~\xbd\xed\xff\xa5\xd2\xf3\xff\xc1\xe0\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffs\xbb\xf1\xffa\xb2\xef\xff3\x9a\xeb\xff0\x98\xea\xff:\x9d\xea\xffA\xa0\xea\xffG\xa3\xea\xffM\xa6\xea\xffR\xa8\xea\xffV\xa9\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xeb\xff\x94\xcc\xf5\xffn\xad\xda\xff\x18k\xa9\xff\x00T\x98\xff\x00[\x9d\x9b\x00\\\x9e\x18\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e/\x00Y\x9c\xbd\x00W\x99\xff%z\xb7\xffB\xa0\xea\xff;\x9e\xec\xffK\xa6\xed\xffY\xad\xed\xff_\xaf\xed\xffc\xb2\xed\xffh\xb4\xed\xffm\xb6\xed\xffp\xb8\xec\xff}\xbd\xee\xff\xa8\xd4\xf4\xff\xbe\xdf\xf8\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xffx\xbe\xf1\xffq\xb9\xf0\xff@\xa0\xeb\xff5\x9b\xea\xffA\xa0\xea\xffG\xa3\xea\xffM\xa6\xea\xffS\xa9\xea\xffZ\xab\xea\xff]\xae\xea\xff]\xac\xea\xffk\xb3\xeb\xff:\x87\xbf\xff\x00X\x9a\xff\x00X\x9b\xd1\x00\\\x9eD\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x03\x00[\x9d\xb6\x00[\x9e\xffi\xb2\xe8\xffq\xbc\xf4\xffT\xaa\xed\xffV\xaa\xed\xff^\xaf\xed\xffc\xb2\xed\xffh\xb4\xed\xffj\xb5\xec\xffz\xbd\xee\xff\xa9\xd5\xf5\xff\xb9\xdd\xf8\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff~\xbf\xf1\xff|\xbe\xf0\xffM\xa6\xeb\xff;\x9d\xea\xffG\xa3\xea\xffM\xa6\xea\xffS\xa9\xea\xffW\xaa\xea\xff]\xae\xea\xff\x84\xc1\xee\xff\x9c\xc9\xea\xff\ta\xa1\xff\x00Y\x9b\xcd\x00\\\x9e\x0e\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00[\x9d\x8c\x04_\xa1\xff~\xbc\xea\xff\x9c\xd2\xfa\xff\x8a\xc7\xf5\xffg\xb4\xef\xffY\xad\xec\xffa\xb1\xed\xffd\xb2\xec\xff|\xbe\xef\xff\xa9\xd4\xf6\xff\xb3\xda\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x83\xc2\xf1\xff\x88\xc4\xf1\xff^\xae\xed\xffB\xa0\xea\xffK\xa5\xea\xffN\xa6\xea\xffd\xb0\xeb\xff\x97\xca\xef\xff\xb7\xda\xf3\xff\xa9\xd0\xeb\xff\x0ef\xa4\xff\x00Z\x9c\xa7\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00[\x9d\x92\x04_\xa1\xff\x82\xbf\xee\xff\x98\xd0\xfb\xff\x99\xce\xf7\xff\x9a\xce\xf7\xff\x81\xc1\xf2\xffd\xb2\xed\xff~\xbf\xf0\xff\xa8\xd5\xf7\xff\xae\xd8\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x89\xc5\xf1\xff\x91\xc9\xf1\xffo\xb7\xed\xffN\xa6\xea\xffu\xb9\xed\xff\xa3\xd0\xf0\xff\xaf\xd6\xf1\xff\xb5\xda\xf4\xff\xaf\xd5\xef\xff\x0ef\xa4\xff\x00Z\x9c\xaa\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9em\x01[\x9d\xffT\x9c\xd1\xff\x98\xd0\xfb\xff\x9b\xd1\xfa\xff\x99\xce\xf7\xff\x9f\xd2\xf7\xff\x9a\xcf\xf6\xff\xa4\xd4\xf7\xff\xa9\xd6\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x96\xcb\xf1\xff\x93\xc8\xf0\xff\xa3\xd0\xf1\xff\xa7\xd3\xf1\xff\xb3\xd9\xf5\xff\xae\xd4\xf0\xffZ\x98\xc7\xff\x03\\\x9d\xff\x00[\x9d{\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x16\x00[\x9d\xcd\x00W\x99\xff*z\xb6\xff\x85\xc0\xec\xff\xa3\xd6\xfd\xff\x9d\xd1\xf8\xff\xa0\xd3\xf7\xff\xa4\xd4\xf7\xff\xa8\xd5\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x94\xca\xf1\xff\x9c\xcd\xf1\xff\xa3\xd1\xf2\xff\xb1\xd9\xf6\xff\x87\xba\xdf\xff!p\xac\xff\x00T\x99\xff\x00[\x9e\xb9\x00\\\x9e\x13\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00\\\x9e\x81\x00V\x99\xf5\na\xa2\xff\\\x9f\xd2\xff\xa0\xd3\xf9\xff\xa6\xd7\xfb\xff\xa4\xd4\xf7\xff\xa8\xd5\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x94\xca\xf1\xff\xa3\xd2\xf5\xff\x9e\xcd\xf0\xffQ\x95\xc6\xff\x03[\x9d\xff\x00W\x9a\xe9\x00\\\x9ei\x00\\\x9e\x01\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e.\x00Z\x9c\xb6\x00U\x99\xff(x\xb3\xff\x81\xbc\xe6\xff\xae\xdb\xfc\xff\xab\xd7\xf9\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x92\xca\xf3\xff\x9c\xd0\xf5\xffr\xae\xda\xff\x1dn\xab\xff\x00U\x99\xff\x00[\x9d\x9f\x00\\\x9e\x1d\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ed\x00V\x99\xe9\x03[\x9e\xffL\x92\xc6\xff\xa1\xd0\xf3\xff\xb6\xde\xfc\xff\xb2\xda\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x82\xc2\xf2\xff\x90\xca\xf6\xff\x82\xbe\xe9\xff8\x84\xbc\xff\x00X\x9b\xff\x00W\x9b\xd9\x00\\\x9eO\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00[\x9d\x9f\x00T\x98\xff\x18j\xa8\xfft\xaf\xd9\xff\xb8\xde\xfa\xff\xbb\xdf\xfa\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff\x80\xc2\xf4\xff\x85\xc4\xf3\xffR\x9a\xcf\xff\rc\xa3\xff\x00U\x99\xf9\x00[\x9e\x88\x00\\\x9e\x0f\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eG\x00X\x9b\xd0\x00V\x9a\xff=\x85\xbb\xff\xa3\xce\xee\xff\xc6\xe5\xfd\xff\xbf\xdf\xf8\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffo\xba\xf2\xff|\xc2\xf6\xffj\xb0\xe4\xff%w\xb4\xff\x00U\x99\xff\x00Z\x9c\xbc\x00\\\x9e3\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9e{\x00T\x99\xf5\rb\xa2\xffk\xa5\xd0\xff\xbe\xdf\xf7\xff\xcb\xe6\xfb\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffn\xbc\xf5\xffm\xb8\xf0\xff=\x8d\xc8\xff\x06^\x9f\xff\x00W\x99\xe9\x00\\\x9ed\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e0\x00Y\x9c\xbc\x00T\x98\xff*v\xb0\xff\x95\xc2\xe2\xff\xd0\xea\xfc\xff\xcd\xe6\xf9\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xffa\xb4\xf3\xffj\xb9\xf5\xffN\x9f\xda\xff\x15k\xab\xff\x00V\x98\xff\x00Z\x9d\xa7\x00\\\x9e \x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ec\x00V\x9a\xe4\x01Y\x9c\xffS\x93\xc2\xff\xbf\xdd\xf2\xff\xd9\xee\xfc\xff\xc9\xe3\xf7\xffe\xb5\xf2\xff^\xb4\xf6\xffZ\xad\xeb\xff(}\xbc\xff\x00Y\x9b\xff\x00X\x9b\xd7\x00\\\x9eO\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x18\x00[\x9d\x9a\x00S\x98\xff\x1cl\xa8\xff\x8d\xb9\xda\xff\xd1\xe9\xfb\xffk\xba\xf5\xff;\x92\xd3\xff\x0cd\xa5\xff\x00V\x99\xf7\x00[\x9d\x85\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eA\x00X\x9b\xd2\x00V\x9a\xff?\x87\xbb\xff&z\xb8\xff\x00W\x99\xff\x00Y\x9c\xc3\x00\\\x9e1\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00\\\x9e\x81\x00V\x9a\xf0\x00X\x9a\xf2\x00\\\x9eu\x00\\\x9e\x03\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0f\x00[\x9et\x00\\\x9ex\x00\\\x9e\x0b\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00', gtk.gdk.COLORSPACE_RGB, True, 8, 64, 64, 256) 275 | window_icon = gtk.gdk.pixbuf_new_from_data('\x00\\\x9e\x00\x00\\\x9e\x00\x00^\xa0\x00\x00V\x99\x00\x00L\x91g\x00N\x93q\x00X\x9c\x00\x00^\x9f\x00\x00]\x9f\x00\x00Y\x9c\x00\x00P\x94o\x00M\x92i\x00V\x99\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00^\xa0\x00\x00T\x97\x00\x00F\x8c_1\x81\xba\xff+|\xb6\xff\x00F\x8e?\x00\\\x9e\x00\x00\\\x9e\x00\x00J\x8e;$y\xb6\xff-\x7f\xbc\xff\x00E\x8cb\x00R\x97\x00\x00^\xa0\x00\x00\\\x9e\x00\x00[\x9d\x00\x00I\x8c*\x05X\x9b\xc0P\x9b\xd5\xff\xa7\xdd\xff\xff\xbb\xe5\xff\xff@\x86\xbb\xff\x00>\x89D\x00D\x89B\'{\xbb\xff\x89\xcf\xff\xff\xa2\xdb\xff\xffg\xa6\xd5\xff\x07Y\x9b\xc3\x00C\x8c,\x00[\x9d\x00\x05\\\x9e\x971\x84\xc5\xffk\xbb\xf6\xff\x8e\xd0\xff\xff\x86\xc3\xf0\xff\xa2\xd2\xf5\xff\xc4\xe7\xff\xffP\x90\xc0\xff\x15u\xbf\xfff\xbf\xff\xffx\xc1\xf6\xff\x80\xc0\xf0\xff\xb0\xdf\xff\xff\xa9\xd7\xf6\xff\\\x97\xc5\xff\x0b]\x9e\x98\x08[\x9e\xdcX\xb0\xf0\xff\x84\xd0\xff\xffx\xbc\xf0\xff\x83\xc2\xf0\xff\x88\xc3\xee\xff\xb1\xd7\xf3\xff\xf9\xff\xff\xff\xca\xec\xff\xffm\xba\xf3\xffX\xae\xee\xff{\xbe\xf0\xff\x91\xc7\xf0\xff\xd2\xf2\xff\xff\xa6\xd4\xf0\xff\x11]\x9e\xde\x00T\x96\x00\x00N\x91\x9eD\x98\xd5\xff\x84\xc9\xfc\xff\x85\xc3\xf1\xff\xb7\xdb\xf6\xff\xe9\xf4\xfc\xff\xe9\xf5\xfd\xff\xdb\xee\xfd\xff\xdf\xef\xfc\xff\xa8\xd5\xf6\xff|\xbf\xf1\xff\xa3\xd6\xfc\xffl\xaa\xd6\xff\x00J\x91\xa1\x00Q\x96\x00\x00^\xa0\x00\x00T\x97\x00\x008\x7f\x9eC\x94\xd1\xff\xde\xf6\xff\xff\xf5\xfc\xff\xff\xe0\xef\xfb\xff\xe0\xf0\xfb\xff\xc8\xe5\xfb\xff\xcf\xe7\xfb\xff\xff\xff\xff\xff\xfe\xff\xff\xffV\x9d\xd2\xff\x002\x80\xa2\x00Q\x96\x00\x00_\xa0\x00\x00W\x99\x00\x00I\x8cq9\x89\xc3\xf1Y\xb0\xf2\xffR\xaa\xef\xff\xbc\xde\xf7\xff\xf9\xfc\xfe\xff\xe3\xf2\xfb\xff\xd3\xea\xfc\xff\xf5\xfb\xff\xff\xb7\xdb\xf7\xffd\xb1\xed\xff\x86\xc3\xf2\xffR\x93\xc4\xf3\x00D\x8du\x00T\x99\x00\x06Z\x9d\xb3I\xa0\xe0\xff\x8a\xd2\xff\xffe\xb5\xf2\xff/\x97\xe8\xffK\xa4\xe9\xff\x9c\xcd\xf0\xff\xf6\xf9\xfc\xff\xd6\xec\xfc\xffX\xab\xf0\xff\x15\x8a\xe6\xff9\x9b\xe6\xff\x8c\xc6\xf1\xff\xd1\xf0\xff\xff\x8b\xbe\xe1\xff\x0e\\\x9d\xb6\x07]\x9f\xc1D\x98\xd9\xff\x85\xcd\xff\xffm\xbc\xf9\xff;\x9d\xe9\xff^\xae\xec\xffl\xb3\xe8\xff\xb7\xd9\xf2\xffC\xa2\xef\xff\x00s\xe5\xff3\x99\xea\xffL\xa3\xe7\xff\x96\xce\xf9\xff\xc7\xeb\xff\xff\x81\xb3\xd9\xff\x10_\x9f\xc4\x00X\x9a\x00\x00H\x8bU\x1eq\xad\xeeR\xa8\xe8\xffA\xa4\xf1\xff`\xae\xea\xff\xa9\xd3\xf2\xff\xc8\xe4\xf8\xffh\xb7\xf2\xff@\xa2\xed\xff,\x95\xe8\xffQ\xaa\xef\xff|\xba\xe9\xff*u\xae\xf1\x00A\x8bX\x00V\x9a\x00\x00\\\x9e\x00\x00]\x9f\x00\x00>\x84\x0c"v\xb3\xff\x9b\xdb\xff\xff\x97\xcf\xf8\xff\xce\xe6\xf8\xff\xc5\xe1\xf7\xffe\xb5\xf1\xfft\xbc\xf0\xffu\xbe\xf5\xff\xa9\xde\xff\xff0{\xb0\xff\x00:\x85\x0f\x00]\x9f\x00\x00]\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00Y\x9c\x00\x02S\x97zH\x89\xbf\xff\xb8\xe3\xfd\xff\xe8\xfb\xff\xff\xc2\xdf\xf7\xff`\xb3\xf1\xff\x82\xcb\xff\xff\xa1\xd3\xf7\xffJ\x88\xb8\xff\x00S\x96r\x00Z\x9d\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00]\x9f\x00\x00[\x9d\x00\x00C\x8b*\x08W\x9b\xc5\x8c\xb9\xda\xff\xea\xfd\xff\xff\x80\xcb\xff\xffG\x97\xd4\xff\x03W\x99\xbc\x00E\x8d"\x00[\x9e\x00\x00]\x9f\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00_\xa0\x00\x00Q\x96\x00\x00C\x8di>\x88\xbd\xff,\x7f\xbb\xff\x00G\x8c`\x00T\x98\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00_\xa0\x00\x00R\x98\x00\x00I\x92r\x00P\x92n\x00V\x99\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00', gtk.gdk.COLORSPACE_RGB, True, 8, 16, 16, 64) 276 | 277 | GUI_AVAILABLE = os.environ.get("DISPLAY", '') 278 | 279 | if GUI_AVAILABLE: 280 | def download(): 281 | import pygtk 282 | pygtk.require("2.0") 283 | import gtk 284 | import gobject 285 | import pango 286 | import webbrowser 287 | 288 | gtk.gdk.threads_init() 289 | 290 | load_serialized_images() 291 | 292 | global FatalVisibleError 293 | def FatalVisibleError(s): 294 | error = gtk.MessageDialog(parent = None, 295 | flags = gtk.DIALOG_MODAL, 296 | type = gtk.MESSAGE_ERROR, 297 | buttons = gtk.BUTTONS_OK, 298 | message_format = s) 299 | error.set_title("Error") 300 | error.run() 301 | gtk.main_quit() 302 | sys.exit(-1) 303 | 304 | class GeneratorTask(object): 305 | def __init__(self, generator, loop_callback, on_done=None, on_exception=None): 306 | self.generator = generator 307 | self.loop_callback = loop_callback 308 | self.on_done = on_done 309 | self.on_exception = on_exception 310 | 311 | def _run(self, *args, **kwargs): 312 | self._stopped = False 313 | try: 314 | for ret in self.generator(*args, **kwargs): 315 | if ret is None: 316 | ret = () 317 | if not isinstance(ret, tuple): 318 | ret = (ret,) 319 | gobject.idle_add(self.loop_callback, *ret) 320 | 321 | if self._stopped: 322 | thread.exit() 323 | except Exception, ex: 324 | print ex 325 | if self.on_exception is not None: 326 | gobject.idle_add(self.on_exception, ex) 327 | else: 328 | if self.on_done is not None: 329 | gobject.idle_add(self.on_done) 330 | 331 | def start(self, *args, **kwargs): 332 | t = threading.Thread(target=self._run, args=args, kwargs=kwargs) 333 | t.setDaemon(True) 334 | t.start() 335 | 336 | def stop(self): 337 | self._stopped = True 338 | 339 | class DownloadDialog(gtk.Dialog): 340 | def handle_delete_event(self, wid, ev, data=None): 341 | self.handle_cancel(wid) 342 | 343 | def handle_dont_show_toggle(self, button, data=None): 344 | reroll_autostart(not button.get_active()) 345 | 346 | def handle_cancel(self, button): 347 | if self.task: 348 | self.task.stop() 349 | if self.download: 350 | self.download.cancel() 351 | gtk.main_quit() 352 | self.user_cancelled = True 353 | 354 | def handle_ok(self, button): 355 | # begin download 356 | self.ok.hide() 357 | self.download = DownloadState() 358 | 359 | self.label.hide() 360 | if self.dont_show_again_align is not None: 361 | self.dont_show_again_align.hide() 362 | self.progress.show() 363 | 364 | def download_progress(progress, status): 365 | if not status: 366 | self.task.stop() 367 | self.update_progress(DOWNLOADING, progress) 368 | 369 | def finished(): 370 | self.update_progress(DOWNLOADING, 1.0) 371 | self.unpack_dropbox() 372 | 373 | def error(ex): 374 | FatalVisibleError(ERROR_CONNECTING) 375 | 376 | self.update_progress(DOWNLOADING, 0) 377 | self.task = GeneratorTask(self.download.copy_data, 378 | download_progress, 379 | finished, error).start() 380 | 381 | def update_progress(self, text, fraction): 382 | self.progress.set_text(text % int(fraction*100)) 383 | self.progress.set_fraction(fraction) 384 | 385 | def unpack_dropbox(self): 386 | def unpack_progress(name, i, total): 387 | self.update_progress(UNPACKING, float(i)/total) 388 | 389 | def finished(): 390 | self.update_progress(UNPACKING, 1.0) 391 | gtk.main_quit() 392 | 393 | def error(ex): 394 | if isinstance(ex, SignatureVerifyError): 395 | FatalVisibleError(ERROR_SIGNATURE) 396 | else: 397 | FatalVisibleError(ERROR_CONNECTING) 398 | 399 | self.task = GeneratorTask(self.download.unpack, 400 | unpack_progress, 401 | finished, error).start() 402 | 403 | def mouse_down(self, widget, event): 404 | if self.hovering: 405 | self.clicked_link = True 406 | 407 | def mouse_up(self, widget, event): 408 | if self.clicked_link: 409 | webbrowser.open(LINK) 410 | self.clicked_link = False 411 | 412 | def label_motion(self, widget, event): 413 | offx, offy = self.label.get_layout_offsets() 414 | layout = self.label.get_layout() 415 | index = layout.xy_to_index(int((offx+event.x)*pango.SCALE), 416 | int((offy+event.y)*pango.SCALE))[0] 417 | link_index = layout.get_text().find(LINK) 418 | if index >= link_index and index < link_index+len(LINK): 419 | self.hovering = True 420 | self.label_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) 421 | else: 422 | self.hovering = False 423 | self.label_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.ARROW)) 424 | 425 | 426 | def __init__(self): 427 | super(DownloadDialog, self).__init__(parent = None, 428 | title = "Dropbox Installation") 429 | 430 | self.download = None 431 | self.hovering = False 432 | self.clicked_link = False 433 | self.user_cancelled = False 434 | self.task = None 435 | 436 | self.ok = ok = gtk.Button(stock=gtk.STOCK_OK) 437 | ok.connect('clicked', self.handle_ok) 438 | self.action_area.add(ok) 439 | ok.show() 440 | 441 | cancel = gtk.Button(stock=gtk.STOCK_CANCEL) 442 | cancel.connect('clicked', self.handle_cancel) 443 | self.action_area.add(cancel) 444 | cancel.show() 445 | 446 | self.connect('delete_event', self.handle_delete_event) 447 | 448 | self.box_logo = gtk.image_new_from_pixbuf(box_logo_pixbuf) 449 | self.box_logo.show() 450 | 451 | self.set_icon(window_icon) 452 | 453 | self.progress = gtk.ProgressBar() 454 | self.progress.set_property('width-request', 300) 455 | 456 | self.label = gtk.Label() 457 | GPG_WARNING_MSG = (u"\n\n" + GPG_WARNING) if not gpgme else u"" 458 | self.label.set_markup('%s %s\n\n%s%s' % (INFO, LINK, WARNING, GPG_WARNING_MSG)) 459 | self.label.set_line_wrap(True) 460 | self.label.set_property('width-request', 300) 461 | self.label.show() 462 | 463 | self.label_box = gtk.EventBox() 464 | self.label_box.add(self.label) 465 | self.label_box.connect("button-release-event", self.mouse_up) 466 | self.label_box.connect("button-press-event", self.mouse_down) 467 | self.label_box.connect("motion-notify-event", self.label_motion) 468 | 469 | self.label_box.show() 470 | def on_realize(widget): 471 | self.label_box.add_events(gtk.gdk.POINTER_MOTION_MASK) 472 | self.label_box.connect("realize", on_realize) 473 | 474 | self.hbox = gtk.HBox(spacing=10) 475 | self.hbox.set_property('border-width',10) 476 | self.hbox.pack_start(self.box_logo, False, False) 477 | self.hbox.pack_start(self.label_box, False, False) 478 | self.hbox.pack_start(self.progress, False, False) 479 | self.hbox.show() 480 | 481 | self.vbox.add(self.hbox) 482 | 483 | self.dont_show_again_align = None 484 | 485 | try: 486 | if can_reroll_autostart(): 487 | dont_show_again = gtk.CheckButton("_Don't show this again") 488 | dont_show_again.connect('toggled', self.handle_dont_show_toggle) 489 | dont_show_again.show() 490 | 491 | self.dont_show_again_align = gtk.Alignment(xalign=1.0, yalign=0.0, xscale=0.0, yscale=0.0) 492 | self.dont_show_again_align.add(dont_show_again) 493 | self.dont_show_again_align.show() 494 | 495 | hbox = gtk.HBox() 496 | hbox.set_property('border-width', 10) 497 | hbox.pack_start(self.dont_show_again_align, True, True) 498 | hbox.show() 499 | 500 | self.vbox.add(hbox) 501 | 502 | self.set_resizable(False) 503 | except: 504 | traceback.print_exc() 505 | 506 | self.ok.grab_focus() 507 | 508 | dialog = DownloadDialog() 509 | dialog.show() 510 | gtk.main() 511 | if dialog.user_cancelled: 512 | raise Exception("user cancelled download!!!") 513 | else: 514 | def download(): 515 | global FatalVisibleError 516 | def FatalVisibleError(s): 517 | console_print(u"\nError: %s" % s, f=sys.stderr) 518 | sys.exit(-1) 519 | 520 | 521 | ESC = "\x1b" 522 | save = ESC+"7" 523 | unsave = ESC+"8" 524 | erase_to_start = ESC+"[1K" 525 | write = sys.stdout.write 526 | flush = sys.stdout.flush 527 | 528 | last_progress = [None, None] 529 | def setprogress(text, frac): 530 | if last_progress == [text, frac]: 531 | return 532 | if sys.stdout.isatty(): 533 | write(erase_to_start) 534 | write(unsave) 535 | console_print(text % int(100*frac), linebreak=not sys.stdout.isatty()) 536 | if sys.stdout.isatty(): 537 | flush() 538 | last_progress[0], last_progress[1] = text, frac 539 | 540 | console_print() 541 | if sys.stdout.isatty(): 542 | write(save) 543 | flush() 544 | console_print(u"%s %s\n" % (INFO, LINK)) 545 | GPG_WARNING_MSG = (u"\n%s" % GPG_WARNING) if not gpgme else u"" 546 | 547 | if not yes_no_question("%s%s" % (WARNING, GPG_WARNING_MSG)): 548 | return 549 | 550 | download = DownloadState() 551 | 552 | try: 553 | for progress, status in download.copy_data(): 554 | if not status: 555 | break 556 | setprogress(DOWNLOADING, progress) 557 | except Exception: 558 | FatalVisibleError(ERROR_CONNECTING) 559 | else: 560 | setprogress(DOWNLOADING, 1.0) 561 | console_print() 562 | write(save) 563 | 564 | try: 565 | for name, i, total in download.unpack(): 566 | setprogress(UNPACKING, float(i)/total) 567 | except SignatureVerifyError: 568 | FatalVisibleError(ERROR_SIGNATURE) 569 | except Exception: 570 | FatalVisibleError(ERROR_CONNECTING) 571 | else: 572 | setprogress(UNPACKING, 1.0) 573 | 574 | console_print() 575 | 576 | class CommandTicker(threading.Thread): 577 | def __init__(self): 578 | threading.Thread.__init__(self) 579 | self.stop_event = threading.Event() 580 | 581 | def stop(self): 582 | self.stop_event.set() 583 | 584 | def run(self): 585 | ticks = ['[. ]', '[.. ]', '[...]', '[ ..]', '[ .]', '[ ]'] 586 | i = 0 587 | first = True 588 | while True: 589 | self.stop_event.wait(0.25) 590 | if self.stop_event.isSet(): break 591 | if i == len(ticks): 592 | first = False 593 | i = 0 594 | if not first: 595 | sys.stderr.write("\r%s\r" % ticks[i]) 596 | sys.stderr.flush() 597 | i += 1 598 | sys.stderr.flush() 599 | 600 | 601 | class DropboxCommand(object): 602 | class CouldntConnectError(Exception): pass 603 | class BadConnectionError(Exception): pass 604 | class EOFError(Exception): pass 605 | class CommandError(Exception): pass 606 | 607 | def __init__(self, timeout=5): 608 | self.s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 609 | self.s.settimeout(timeout) 610 | try: 611 | self.s.connect(os.path.expanduser(u'~/.dropbox/command_socket')) 612 | except socket.error: 613 | raise DropboxCommand.CouldntConnectError() 614 | self.f = self.s.makefile("r+", 4096) 615 | 616 | def close(self): 617 | self.f.close() 618 | self.s.close() 619 | 620 | def __readline(self): 621 | try: 622 | toret = self.f.readline().decode('utf8').rstrip(u"\n") 623 | except socket.error: 624 | raise DropboxCommand.BadConnectionError() 625 | if toret == '': 626 | raise DropboxCommand.EOFError() 627 | else: 628 | return toret 629 | 630 | # atttribute doesn't exist, i know what you want 631 | def send_command(self, name, args): 632 | self.f.write(name.encode('utf8')) 633 | self.f.write(u"\n".encode('utf8')) 634 | self.f.writelines((u"\t".join([k] + (list(v) 635 | if hasattr(v, '__iter__') else 636 | [v])) + u"\n").encode('utf8') 637 | for k,v in args.iteritems()) 638 | self.f.write(u"done\n".encode('utf8')) 639 | 640 | self.f.flush() 641 | 642 | # Start a ticker 643 | ticker_thread = CommandTicker() 644 | ticker_thread.start() 645 | 646 | # This is the potentially long-running call. 647 | try: 648 | ok = self.__readline() == u"ok" 649 | except KeyboardInterrupt: 650 | raise DropboxCommand.BadConnectionError("Keyboard interruption detected") 651 | finally: 652 | # Tell the ticker to stop. 653 | ticker_thread.stop() 654 | ticker_thread.join() 655 | 656 | if ok: 657 | toret = {} 658 | for i in range(21): 659 | if i == 20: 660 | raise Exception(u"close this connection!") 661 | 662 | line = self.__readline() 663 | if line == u"done": 664 | break 665 | 666 | argval = line.split(u"\t") 667 | toret[argval[0]] = argval[1:] 668 | 669 | return toret 670 | else: 671 | problems = [] 672 | for i in range(21): 673 | if i == 20: 674 | raise Exception(u"close this connection!") 675 | 676 | line = self.__readline() 677 | if line == u"done": 678 | break 679 | 680 | problems.append(line) 681 | 682 | raise DropboxCommand.CommandError(u"\n".join(problems)) 683 | 684 | # this is the hotness, auto marshalling 685 | def __getattr__(self, name): 686 | try: 687 | return super(DropboxCommand, self).__getattr__(name) 688 | except: 689 | def __spec_command(**kw): 690 | return self.send_command(unicode(name), kw) 691 | self.__setattr__(name, __spec_command) 692 | return __spec_command 693 | 694 | commands = {} 695 | aliases = {} 696 | 697 | def command(meth): 698 | global commands, aliases 699 | assert meth.__doc__, "All commands need properly formatted docstrings (even %r!!)" % meth 700 | if hasattr(meth, 'im_func'): # bound method, if we ever have one 701 | meth = meth.im_func 702 | commands[meth.func_name] = meth 703 | meth_aliases = [unicode(alias) for alias in aliases.iterkeys() if aliases[alias].func_name == meth.func_name] 704 | if meth_aliases: 705 | meth.__doc__ += u"\nAliases: %s" % ",".join(meth_aliases) 706 | return meth 707 | 708 | def alias(name): 709 | def decorator(meth): 710 | global commands, aliases 711 | assert name not in commands, "This alias is the name of a command." 712 | aliases[name] = meth 713 | return meth 714 | return decorator 715 | 716 | def requires_dropbox_running(meth): 717 | def newmeth(*n, **kw): 718 | if is_dropbox_running(): 719 | return meth(*n, **kw) 720 | else: 721 | console_print(u"Dropbox isn't running!") 722 | newmeth.func_name = meth.func_name 723 | newmeth.__doc__ = meth.__doc__ 724 | return newmeth 725 | 726 | def start_dropbox(): 727 | db_path = os.path.expanduser(u"~/.dropbox-dist/dropboxd").encode(sys.getfilesystemencoding()) 728 | if os.access(db_path, os.X_OK): 729 | f = open("/dev/null", "w") 730 | # we don't reap the child because we're gonna die anyway, let init do it 731 | subprocess.Popen([db_path], preexec_fn=os.setsid, cwd=os.path.expanduser("~"), 732 | stderr=sys.stderr, stdout=f, close_fds=True) 733 | 734 | # in seconds 735 | interval = 0.5 736 | wait_for = 60 737 | for i in xrange(int(wait_for / interval)): 738 | if is_dropbox_running(): 739 | return True 740 | # back off from connect for a while 741 | time.sleep(interval) 742 | 743 | return False 744 | else: 745 | return False 746 | 747 | # Extracted and modified from os.cmd.Cmd 748 | def columnize(list, display_list=None, display_width=None): 749 | if not list: 750 | console_print(u"") 751 | return 752 | 753 | non_unicode = [i for i in range(len(list)) if not (isinstance(list[i], unicode))] 754 | if non_unicode: 755 | raise TypeError, ("list[i] not a string for i in %s" % 756 | ", ".join(map(unicode, non_unicode))) 757 | 758 | if not display_width: 759 | d = os.popen('stty size', 'r').read().split() 760 | if d: 761 | display_width = int(d[1]) 762 | else: 763 | for item in list: 764 | console_print(item) 765 | return 766 | 767 | if not display_list: 768 | display_list = list 769 | 770 | size = len(list) 771 | if size == 1: 772 | console_print(display_list[0]) 773 | return 774 | 775 | for nrows in range(1, len(list)): 776 | ncols = (size+nrows-1) // nrows 777 | colwidths = [] 778 | totwidth = -2 779 | for col in range(ncols): 780 | colwidth = 0 781 | for row in range(nrows): 782 | i = row + nrows*col 783 | if i >= size: 784 | break 785 | x = list[i] 786 | colwidth = max(colwidth, len(x)) 787 | colwidths.append(colwidth) 788 | totwidth += colwidth + 2 789 | if totwidth > display_width: 790 | break 791 | if totwidth <= display_width: 792 | break 793 | else: 794 | nrows = len(list) 795 | ncols = 1 796 | colwidths = [0] 797 | lines = [] 798 | for row in range(nrows): 799 | texts = [] 800 | display_texts = [] 801 | for col in range(ncols): 802 | i = row + nrows*col 803 | if i >= size: 804 | x = "" 805 | y = "" 806 | else: 807 | x = list[i] 808 | y = display_list[i] 809 | texts.append(x) 810 | display_texts.append(y) 811 | while texts and not texts[-1]: 812 | del texts[-1] 813 | original_texts = texts[:] 814 | for col in range(len(texts)): 815 | texts[col] = texts[col].ljust(colwidths[col]) 816 | texts[col] = texts[col].replace(original_texts[col], display_texts[col]) 817 | line = u" ".join(texts) 818 | lines.append(line) 819 | for line in lines: 820 | console_print(line) 821 | 822 | @command 823 | @requires_dropbox_running 824 | @alias('stat') 825 | def filestatus(args): 826 | u"""get current sync status of one or more files 827 | dropbox filestatus [-l] [-a] [FILE]... 828 | 829 | Prints the current status of each FILE. 830 | 831 | options: 832 | -l --list prints out information in a format similar to ls. works best when your console supports color :) 833 | -a --all do not ignore entries starting with . 834 | """ 835 | global enc 836 | 837 | oparser = optparse.OptionParser() 838 | oparser.add_option("-l", "--list", action="store_true", dest="list") 839 | oparser.add_option("-a", "--all", action="store_true", dest="all") 840 | (options, args) = oparser.parse_args(args) 841 | 842 | try: 843 | with closing(DropboxCommand()) as dc: 844 | if options.list: 845 | # Listing. 846 | 847 | # Separate directories from files. 848 | if len(args) == 0: 849 | dirs, nondirs = [u"."], [] 850 | else: 851 | dirs, nondirs = [], [] 852 | 853 | for a in args: 854 | try: 855 | (dirs if os.path.isdir(a) else nondirs).append(a.decode(enc)) 856 | except UnicodeDecodeError: 857 | continue 858 | 859 | if len(dirs) == 0 and len(nondirs) == 0: 860 | #TODO: why? 861 | sys.exit(1) 862 | 863 | dirs.sort(key=methodcaller('lower')) 864 | nondirs.sort(key=methodcaller('lower')) 865 | 866 | # Gets a string representation for a path. 867 | def path_to_string(file_path): 868 | if not os.path.exists(file_path): 869 | path = u"%s (File doesn't exist!)" % os.path.basename(file_path) 870 | return (path, path) 871 | try: 872 | status = dc.icon_overlay_file_status(path=file_path).get(u'status', [None])[0] 873 | except DropboxCommand.CommandError, e: 874 | path = u"%s (%s)" % (os.path.basename(file_path), e) 875 | return (path, path) 876 | 877 | env_term = os.environ.get('TERM','') 878 | supports_color = (sys.stderr.isatty() and ( 879 | env_term.startswith('vt') or 880 | env_term.startswith('linux') or 881 | 'xterm' in env_term or 882 | 'color' in env_term 883 | ) 884 | ) 885 | 886 | # TODO: Test when you don't support color. 887 | if not supports_color: 888 | path = os.path.basename(file_path) 889 | return (path, path) 890 | 891 | if status == u"up to date": 892 | init, cleanup = "\x1b[32;1m", "\x1b[0m" 893 | elif status == u"syncing": 894 | init, cleanup = "\x1b[36;1m", "\x1b[0m" 895 | elif status == u"unsyncable": 896 | init, cleanup = "\x1b[41;1m", "\x1b[0m" 897 | elif status == u"selsync": 898 | init, cleanup = "\x1b[37;1m", "\x1b[0m" 899 | else: 900 | init, cleanup = '', '' 901 | 902 | path = os.path.basename(file_path) 903 | return (path, u"%s%s%s" % (init, path, cleanup)) 904 | 905 | # Prints a directory. 906 | def print_directory(name): 907 | clean_paths = [] 908 | formatted_paths = [] 909 | for subname in sorted(os.listdir(name), key=methodcaller('lower')): 910 | if type(subname) != unicode: 911 | continue 912 | 913 | if not options.all and subname[0] == u'.': 914 | continue 915 | 916 | try: 917 | clean, formatted = path_to_string(unicode_abspath(os.path.join(name, subname))) 918 | clean_paths.append(clean) 919 | formatted_paths.append(formatted) 920 | except (UnicodeEncodeError, UnicodeDecodeError): 921 | continue 922 | 923 | columnize(clean_paths, formatted_paths) 924 | 925 | try: 926 | if len(dirs) == 1 and len(nondirs) == 0: 927 | print_directory(dirs[0]) 928 | else: 929 | nondir_formatted_paths = [] 930 | nondir_clean_paths = [] 931 | for name in nondirs: 932 | try: 933 | clean, formatted = path_to_string(unicode_abspath(name)) 934 | nondir_clean_paths.append(clean) 935 | nondir_formatted_paths.append(formatted) 936 | except (UnicodeEncodeError, UnicodeDecodeError): 937 | continue 938 | 939 | if nondir_clean_paths: 940 | columnize(nondir_clean_paths, nondir_formatted_paths) 941 | 942 | if len(nondirs) == 0: 943 | console_print(dirs[0] + u":") 944 | print_directory(dirs[0]) 945 | dirs = dirs[1:] 946 | 947 | for name in dirs: 948 | console_print() 949 | console_print(name + u":") 950 | print_directory(name) 951 | 952 | except DropboxCommand.EOFError: 953 | console_print(u"Dropbox daemon stopped.") 954 | except DropboxCommand.BadConnectionError: 955 | console_print(u"Dropbox isn't responding!") 956 | else: 957 | if len(args) == 0: 958 | args = [name for name in sorted(os.listdir(u"."), key=methodcaller('lower')) if type(name) == unicode] 959 | if len(args) == 0: 960 | # Bail early if there's nothing to list to avoid crashing on indent below 961 | console_print(u"") 962 | return 963 | indent = max(len(st)+1 for st in args) 964 | for file in args: 965 | 966 | try: 967 | if type(file) is not unicode: 968 | file = file.decode(enc) 969 | fp = unicode_abspath(file) 970 | except (UnicodeEncodeError, UnicodeDecodeError): 971 | continue 972 | if not os.path.exists(fp): 973 | console_print(u"%-*s %s" % \ 974 | (indent, file+':', "File doesn't exist")) 975 | continue 976 | 977 | try: 978 | status = dc.icon_overlay_file_status(path=fp).get(u'status', [u'unknown'])[0] 979 | console_print(u"%-*s %s" % (indent, file+':', status)) 980 | except DropboxCommand.CommandError, e: 981 | console_print(u"%-*s %s" % (indent, file+':', e)) 982 | except DropboxCommand.CouldntConnectError, e: 983 | console_print(u"Dropbox isn't running!") 984 | 985 | @command 986 | @requires_dropbox_running 987 | def ls(args): 988 | u"""list directory contents with current sync status 989 | dropbox ls [FILE]... 990 | 991 | This is an alias for filestatus -l 992 | """ 993 | return filestatus(["-l"] + args) 994 | 995 | @command 996 | @requires_dropbox_running 997 | def sharelink(args): 998 | u"""get a shared link for a file in your dropbox 999 | dropbox sharelink FILE 1000 | 1001 | Prints out a shared link for FILE. 1002 | """ 1003 | if len(args) != 1: 1004 | console_print(sharelink.__doc__, linebreak=False) 1005 | return 1006 | 1007 | try: 1008 | with closing(DropboxCommand()) as dc: 1009 | try: 1010 | path = unicode_abspath(args[0].decode(sys.getfilesystemencoding())) 1011 | link = dc.get_shared_link(path=path).get('link', [u'No link'])[0] 1012 | console_print(link) 1013 | except DropboxCommand.CommandError, e: 1014 | console_print(u"Couldn't get shared link: " + str(e)) 1015 | except DropboxCommand.BadConnectionError, e: 1016 | console_print(u"Dropbox isn't responding!") 1017 | except DropboxCommand.EOFError: 1018 | console_print(u"Dropbox daemon stopped.") 1019 | except DropboxCommand.CouldntConnectError, e: 1020 | console_print(u"Dropbox isn't running!") 1021 | 1022 | @command 1023 | @requires_dropbox_running 1024 | def proxy(args): 1025 | u"""set proxy settings for Dropbox 1026 | dropbox proxy MODE [TYPE] [HOST] [PORT] [USERNAME] [PASSWORD] 1027 | 1028 | Set proxy settings for Dropbox. 1029 | 1030 | MODE - one of "none", "auto", "manual" 1031 | TYPE - one of "http", "socks4", "socks5" (only valid with "manual" mode) 1032 | HOST - proxy hostname (only valid with "manual" mode) 1033 | PORT - proxy port (only valid with "manual" mode) 1034 | USERNAME - (optional) proxy username (only valid with "manual" mode) 1035 | PASSWORD - (optional) proxy password (only valid with "manual" mode) 1036 | """ 1037 | mode = None 1038 | type_ = None 1039 | if len(args) >= 1: 1040 | mode = args[0].decode(sys.getfilesystemencoding()).lower() 1041 | if len(args) >= 2: 1042 | type_ = args[1].decode(sys.getfilesystemencoding()).lower() 1043 | 1044 | if (len(args) == 0 or 1045 | mode not in [u'none', u'auto', u'manual'] or 1046 | (mode == 'manual' and len(args) not in (4, 6)) or 1047 | (mode != 'manual' and len(args) != 1) or 1048 | (mode == 'manual' and type_ not in [u'http', u'socks4', u'socks5'])): 1049 | # Print help 1050 | console_print(proxy.__doc__, linebreak=False) 1051 | return 1052 | 1053 | ARGS = ['mode', 'type', 'host', 'port', 'username', 'password'] 1054 | 1055 | # Load the args into a dictionary 1056 | kwargs = dict(zip(ARGS, [a.decode(sys.getfilesystemencoding()) for a in args])) 1057 | 1058 | # Re-set these two because they were coerced to lower case 1059 | kwargs['mode'] = mode 1060 | if type_: 1061 | kwargs['type'] = type_ 1062 | 1063 | try: 1064 | with closing(DropboxCommand()) as dc: 1065 | try: 1066 | dc.set_proxy_settings(**kwargs) 1067 | console_print(u'set') 1068 | except DropboxCommand.CommandError, e: 1069 | console_print(u"Couldn't set proxy: " + str(e)) 1070 | except DropboxCommand.BadConnectionError, e: 1071 | console_print(u"Dropbox isn't responding!") 1072 | except DropboxCommand.EOFError: 1073 | console_print(u"Dropbox daemon stopped.") 1074 | except DropboxCommand.CouldntConnectError, e: 1075 | console_print(u"Dropbox isn't running!") 1076 | 1077 | @command 1078 | @requires_dropbox_running 1079 | def throttle(args): 1080 | u"""set bandwidth limits for Dropbox 1081 | dropbox throttle DOWNLOAD UPLOAD 1082 | 1083 | Set bandwidth limits for file sync. 1084 | 1085 | DOWNLOAD - either "unlimited" or a manual limit in KB/s 1086 | UPLOAD - one of "unlimited", "auto", or a manual limit in KB/s 1087 | """ 1088 | if len(args) != 2: 1089 | console_print(throttle.__doc__, linebreak=False) 1090 | return 1091 | 1092 | downlimit = args[0].decode(sys.getfilesystemencoding()).lower() 1093 | uplimit = args[1].decode(sys.getfilesystemencoding()).lower() 1094 | 1095 | download_limit = None 1096 | download_mode = None 1097 | if downlimit == u'unlimited': 1098 | download_mode = downlimit 1099 | else: 1100 | try: 1101 | download_limit = int(downlimit) 1102 | download_mode = u'manual' 1103 | except ValueError: 1104 | console_print(throttle.__doc__, linebreak=False) 1105 | return 1106 | 1107 | upload_limit = None 1108 | upload_mode = None 1109 | if uplimit in [u'unlimited', u'auto']: 1110 | upload_mode = uplimit 1111 | else: 1112 | try: 1113 | upload_limit = int(uplimit) 1114 | upload_mode = u'manual' 1115 | except ValueError: 1116 | console_print(throttle.__doc__, linebreak=False) 1117 | return 1118 | 1119 | kwargs = { 1120 | u'download_mode': download_mode, 1121 | u'upload_mode': upload_mode, 1122 | } 1123 | if download_limit: 1124 | kwargs[u'download_limit'] = unicode(download_limit) 1125 | if upload_limit: 1126 | kwargs[u'upload_limit'] = unicode(upload_limit) 1127 | 1128 | try: 1129 | with closing(DropboxCommand()) as dc: 1130 | try: 1131 | dc.set_bandwidth_limits(**kwargs) 1132 | console_print(u'set') 1133 | except DropboxCommand.CommandError, e: 1134 | console_print(u"Couldn't set bandwidth limits: " + str(e)) 1135 | except DropboxCommand.BadConnectionError, e: 1136 | console_print(u"Dropbox isn't responding!") 1137 | except DropboxCommand.EOFError: 1138 | console_print(u"Dropbox daemon stopped.") 1139 | except DropboxCommand.CouldntConnectError, e: 1140 | console_print(u"Dropbox isn't running!") 1141 | 1142 | @command 1143 | @requires_dropbox_running 1144 | def status(args): 1145 | u"""get current status of the dropboxd 1146 | dropbox status 1147 | 1148 | Prints out the current status of the Dropbox daemon. 1149 | """ 1150 | if len(args) != 0: 1151 | console_print(status.__doc__,linebreak=False) 1152 | return 1153 | 1154 | try: 1155 | with closing(DropboxCommand()) as dc: 1156 | try: 1157 | lines = dc.get_dropbox_status()[u'status'] 1158 | if len(lines) == 0: 1159 | console_print(u'Idle') 1160 | else: 1161 | for line in lines: 1162 | console_print(line) 1163 | except KeyError: 1164 | console_print(u"Couldn't get status: daemon isn't responding") 1165 | except DropboxCommand.CommandError, e: 1166 | console_print(u"Couldn't get status: " + str(e)) 1167 | except DropboxCommand.BadConnectionError, e: 1168 | console_print(u"Dropbox isn't responding!") 1169 | except DropboxCommand.EOFError: 1170 | console_print(u"Dropbox daemon stopped.") 1171 | except DropboxCommand.CouldntConnectError, e: 1172 | console_print(u"Dropbox isn't running!") 1173 | 1174 | @command 1175 | def running(argv): 1176 | u"""return whether dropbox is running 1177 | dropbox running 1178 | 1179 | Returns 1 if running 0 if not running. 1180 | """ 1181 | return int(is_dropbox_running()) 1182 | 1183 | @command 1184 | @requires_dropbox_running 1185 | def stop(args): 1186 | u"""stop dropboxd 1187 | dropbox stop 1188 | 1189 | Stops the dropbox daemon. 1190 | """ 1191 | try: 1192 | with closing(DropboxCommand()) as dc: 1193 | try: 1194 | dc.tray_action_hard_exit() 1195 | except DropboxCommand.BadConnectionError: 1196 | console_print(u"Dropbox isn't responding!") 1197 | except DropboxCommand.EOFError: 1198 | console_print(u"Dropbox daemon stopped.") 1199 | except DropboxCommand.CouldntConnectError: 1200 | console_print(u"Dropbox isn't running!") 1201 | 1202 | #returns true if link is necessary 1203 | def grab_link_url_if_necessary(): 1204 | try: 1205 | with closing(DropboxCommand()) as dc: 1206 | try: 1207 | link_url = dc.needs_link().get(u"link_url", None) 1208 | if link_url is not None: 1209 | console_print(u"To link this computer to a dropbox account, visit the following url:\n%s" % link_url[0]) 1210 | return True 1211 | else: 1212 | return False 1213 | except DropboxCommand.CommandError: 1214 | pass 1215 | except DropboxCommand.BadConnectionError: 1216 | console_print(u"Dropbox isn't responding!") 1217 | except DropboxCommand.EOFError: 1218 | console_print(u"Dropbox daemon stopped.") 1219 | except DropboxCommand.CouldntConnectError: 1220 | console_print(u"Dropbox isn't running!") 1221 | 1222 | @command 1223 | @requires_dropbox_running 1224 | def lansync(argv): 1225 | u"""enables or disables LAN sync 1226 | dropbox lansync [y/n] 1227 | 1228 | options: 1229 | y dropbox will use LAN sync (default) 1230 | n dropbox will not use LAN sync 1231 | """ 1232 | if len(argv) != 1: 1233 | console_print(lansync.__doc__, linebreak=False) 1234 | return 1235 | 1236 | s = argv[0].lower() 1237 | if s.startswith('y') or s.startswith('-y'): 1238 | should_lansync = True 1239 | elif s.startswith('n') or s.startswith('-n'): 1240 | should_lansync = False 1241 | else: 1242 | should_lansync = None 1243 | 1244 | if should_lansync is None: 1245 | console_print(lansync.__doc__,linebreak=False) 1246 | else: 1247 | with closing(DropboxCommand()) as dc: 1248 | dc.set_lan_sync(lansync='enabled' if should_lansync else 'disabled') 1249 | 1250 | 1251 | @command 1252 | @requires_dropbox_running 1253 | def exclude(args): 1254 | u"""ignores/excludes a directory from syncing 1255 | dropbox exclude [list] 1256 | dropbox exclude add [DIRECTORY] [DIRECTORY] ... 1257 | dropbox exclude remove [DIRECTORY] [DIRECTORY] ... 1258 | 1259 | "list" prints a list of directories currently excluded from syncing. 1260 | "add" adds one or more directories to the exclusion list, then resynchronizes Dropbox. 1261 | "remove" removes one or more directories from the exclusion list, then resynchronizes Dropbox. 1262 | With no arguments, executes "list". 1263 | Any specified path must be within Dropbox. 1264 | """ 1265 | if len(args) == 0: 1266 | try: 1267 | with closing(DropboxCommand()) as dc: 1268 | try: 1269 | lines = [relpath(path) for path in dc.get_ignore_set()[u'ignore_set']] 1270 | lines.sort() 1271 | if len(lines) == 0: 1272 | console_print(u'No directories are being ignored.') 1273 | else: 1274 | console_print(u'Excluded: ') 1275 | for line in lines: 1276 | console_print(unicode(line)) 1277 | except KeyError: 1278 | console_print(u"Couldn't get ignore set: daemon isn't responding") 1279 | except DropboxCommand.CommandError, e: 1280 | if e.args[0].startswith(u"No command exists by that name"): 1281 | console_print(u"This version of the client does not support this command.") 1282 | else: 1283 | console_print(u"Couldn't get ignore set: " + str(e)) 1284 | except DropboxCommand.BadConnectionError, e: 1285 | console_print(u"Dropbox isn't responding!") 1286 | except DropboxCommand.EOFError: 1287 | console_print(u"Dropbox daemon stopped.") 1288 | except DropboxCommand.CouldntConnectError, e: 1289 | console_print(u"Dropbox isn't running!") 1290 | elif len(args) == 1 and args[0] == u"list": 1291 | exclude([]) 1292 | elif len(args) >= 2: 1293 | sub_command = args[0] 1294 | paths = args[1:] 1295 | absolute_paths = [unicode_abspath(path.decode(sys.getfilesystemencoding())) for path in paths] 1296 | if sub_command == u"add": 1297 | try: 1298 | with closing(DropboxCommand(timeout=None)) as dc: 1299 | try: 1300 | result = dc.ignore_set_add(paths=absolute_paths) 1301 | if result[u"ignored"]: 1302 | console_print(u"Excluded: ") 1303 | lines = [relpath(path) for path in result[u"ignored"]] 1304 | for line in lines: 1305 | console_print(unicode(line)) 1306 | except KeyError: 1307 | console_print(u"Couldn't add ignore path: daemon isn't responding") 1308 | except DropboxCommand.CommandError, e: 1309 | if e.args[0].startswith(u"No command exists by that name"): 1310 | console_print(u"This version of the client does not support this command.") 1311 | else: 1312 | console_print(u"Couldn't get ignore set: " + str(e)) 1313 | except DropboxCommand.BadConnectionError, e: 1314 | console_print(u"Dropbox isn't responding! [%s]" % e) 1315 | except DropboxCommand.EOFError: 1316 | console_print(u"Dropbox daemon stopped.") 1317 | except DropboxCommand.CouldntConnectError, e: 1318 | console_print(u"Dropbox isn't running!") 1319 | elif sub_command == u"remove": 1320 | try: 1321 | with closing(DropboxCommand(timeout=None)) as dc: 1322 | try: 1323 | result = dc.ignore_set_remove(paths=absolute_paths) 1324 | if result[u"removed"]: 1325 | console_print(u"No longer excluded: ") 1326 | lines = [relpath(path) for path in result[u"removed"]] 1327 | for line in lines: 1328 | console_print(unicode(line)) 1329 | except KeyError: 1330 | console_print(u"Couldn't remove ignore path: daemon isn't responding") 1331 | except DropboxCommand.CommandError, e: 1332 | if e.args[0].startswith(u"No command exists by that name"): 1333 | console_print(u"This version of the client does not support this command.") 1334 | else: 1335 | console_print(u"Couldn't get ignore set: " + str(e)) 1336 | except DropboxCommand.BadConnectionError, e: 1337 | console_print(u"Dropbox isn't responding! [%s]" % e) 1338 | except DropboxCommand.EOFError: 1339 | console_print(u"Dropbox daemon stopped.") 1340 | except DropboxCommand.CouldntConnectError, e: 1341 | console_print(u"Dropbox isn't running!") 1342 | else: 1343 | console_print(exclude.__doc__, linebreak=False) 1344 | return 1345 | else: 1346 | console_print(exclude.__doc__, linebreak=False) 1347 | return 1348 | 1349 | @command 1350 | def start(argv): 1351 | u"""start dropboxd 1352 | dropbox start [-i] 1353 | 1354 | Starts the dropbox daemon, dropboxd. If dropboxd is already running, this will do nothing. 1355 | 1356 | options: 1357 | -i --install auto install dropboxd if not available on the system 1358 | """ 1359 | 1360 | should_install = "-i" in argv or "--install" in argv 1361 | 1362 | # first check if dropbox is already running 1363 | if is_dropbox_running(): 1364 | if not grab_link_url_if_necessary(): 1365 | console_print(u"Dropbox is already running!") 1366 | return 1367 | 1368 | console_print(u"Starting Dropbox...", linebreak=False) 1369 | console_flush() 1370 | if not start_dropbox(): 1371 | if not should_install: 1372 | console_print() 1373 | console_print(u"The Dropbox daemon is not installed!") 1374 | console_print(u"Run \"dropbox start -i\" to install the daemon") 1375 | return 1376 | 1377 | # install dropbox!!! 1378 | try: 1379 | download() 1380 | except: 1381 | traceback.print_exc() 1382 | else: 1383 | if GUI_AVAILABLE: 1384 | start_dropbox() 1385 | console_print(u"Done!") 1386 | else: 1387 | if start_dropbox(): 1388 | if not grab_link_url_if_necessary(): 1389 | console_print(u"Done!") 1390 | else: 1391 | if not grab_link_url_if_necessary(): 1392 | console_print(u"Done!") 1393 | 1394 | 1395 | def can_reroll_autostart(): 1396 | return u".config" in os.listdir(os.path.expanduser(u'~')) 1397 | 1398 | def reroll_autostart(should_autostart): 1399 | home_dir = os.path.expanduser(u'~') 1400 | contents = os.listdir(home_dir) 1401 | 1402 | # UBUNTU 1403 | if u".config" in contents: 1404 | autostart_dir = os.path.join(home_dir, u".config", u"autostart") 1405 | autostart_link = os.path.join(autostart_dir, u"dropbox.desktop") 1406 | if should_autostart: 1407 | if os.path.exists(DESKTOP_FILE): 1408 | if not os.path.exists(autostart_dir): 1409 | os.makedirs(autostart_dir) 1410 | shutil.copyfile(DESKTOP_FILE, autostart_link) 1411 | elif os.path.exists(autostart_link): 1412 | os.remove(autostart_link) 1413 | 1414 | 1415 | 1416 | @command 1417 | def autostart(argv): 1418 | u"""automatically start dropbox at login 1419 | dropbox autostart [y/n] 1420 | 1421 | options: 1422 | n dropbox will not start automatically at login 1423 | y dropbox will start automatically at login (default) 1424 | 1425 | Note: May only work on current Ubuntu distributions. 1426 | """ 1427 | if len(argv) != 1: 1428 | console_print(''.join(autostart.__doc__.split('\n', 1)[1:]).decode('ascii')) 1429 | return 1430 | 1431 | s = argv[0].lower() 1432 | if s.startswith('y') or s.startswith('-y'): 1433 | should_autostart = True 1434 | elif s.startswith('n') or s.startswith('-n'): 1435 | should_autostart = False 1436 | else: 1437 | should_autostart = None 1438 | 1439 | if should_autostart is None: 1440 | console_print(autostart.__doc__,linebreak=False) 1441 | else: 1442 | reroll_autostart(should_autostart) 1443 | 1444 | @command 1445 | def help(argv): 1446 | u"""provide help 1447 | dropbox help [COMMAND] 1448 | 1449 | With no arguments, print a list of commands and a short description of each. With a command, print descriptive help on how to use the command. 1450 | """ 1451 | if not argv: 1452 | return usage(argv) 1453 | for command in commands: 1454 | if command == argv[0]: 1455 | console_print(commands[command].__doc__.split('\n', 1)[1].decode('ascii')) 1456 | return 1457 | for alias in aliases: 1458 | if alias == argv[0]: 1459 | console_print(aliases[alias].__doc__.split('\n', 1)[1].decode('ascii')) 1460 | return 1461 | console_print(u"unknown command '%s'" % argv[0], f=sys.stderr) 1462 | 1463 | def usage(argv): 1464 | console_print(u"Dropbox command-line interface\n") 1465 | console_print(u"commands:\n") 1466 | console_print(u"Note: use dropbox help to view usage for a specific command.\n") 1467 | out = [] 1468 | for command in commands: 1469 | out.append((command, commands[command].__doc__.splitlines()[0])) 1470 | spacing = max(len(o[0])+3 for o in out) 1471 | for o in out: 1472 | console_print(" %-*s%s" % (spacing, o[0], o[1])) 1473 | console_print() 1474 | 1475 | def main(argv): 1476 | global commands 1477 | 1478 | # now we need to find out if one of the commands are in the 1479 | # argv list, and if so split the list at the point to 1480 | # separate the argv list at that point 1481 | cut = None 1482 | for i in range(len(argv)): 1483 | if argv[i] in commands or argv[i] in aliases: 1484 | cut = i 1485 | break 1486 | 1487 | if cut == None: 1488 | usage(argv) 1489 | os._exit(0) 1490 | return 1491 | 1492 | # lol no options for now 1493 | globaloptionparser = optparse.OptionParser() 1494 | globaloptionparser.parse_args(argv[0:i]) 1495 | 1496 | # now dispatch and run 1497 | result = None 1498 | if argv[i] in commands: 1499 | result = commands[argv[i]](argv[i+1:]) 1500 | elif argv[i] in aliases: 1501 | result = aliases[argv[i]](argv[i+1:]) 1502 | 1503 | # flush, in case output is rerouted to a file. 1504 | console_flush() 1505 | 1506 | # done 1507 | return result 1508 | 1509 | if __name__ == "__main__": 1510 | ret = main(sys.argv) 1511 | if ret is not None: 1512 | sys.exit(ret) 1513 | -------------------------------------------------------------------------------- /selenium/chrome.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | # https://jiayi.space/post/zai-ubuntufu-wu-qi-shang-shi-yong-chrome-headless 3 | from selenium import webdriver 4 | 5 | chrome_options = webdriver.ChromeOptions() 6 | chrome_options.add_argument('--headless') 7 | chrome_options.add_argument('--disable-gpu') 8 | chrome_options.add_argument('--no-sandbox') 9 | chrome_options.add_argument('--disable-extensions') 10 | #chrome_options.add_argument('--proxy-server=socks5://127.0.0.1:9050') 11 | chrome_options.add_argument("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3383.0 Safari/537.36") 12 | 13 | client = webdriver.Chrome(chrome_options=chrome_options, executable_path='/root/chromedriver') 14 | client.get("http://checkip.dns.he.net/") 15 | #client.get("https://httpbin.org/get?show_env=1") 16 | #client.get("https://www.multcloud.com/share/0c7716c2-1f7b-42b3-9e53-e5caecfb502a") 17 | 18 | content = client.page_source.encode('utf-8') 19 | print content 20 | #client.get_screenshot_as_file('01.png') 21 | client.quit() 22 | -------------------------------------------------------------------------------- /selenium/tor.py: -------------------------------------------------------------------------------- 1 | import os 2 | import socket 3 | import socks 4 | import requests 5 | 6 | socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9050) 7 | socket.socket = socks.socksocket 8 | print(requests.get('http://api.ipify.org?format=json').text) 9 | 10 | #https://zhuanlan.zhihu.com/p/24261906 11 | os.system("""(echo authenticate '"mypassword"'; echo signal newnym; echo quit) | nc localhost 9051""") 12 | 13 | socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9050) 14 | socket.socket = socks.socksocket 15 | print(requests.get('http://api.ipify.org?format=json').text) 16 | -------------------------------------------------------------------------------- /url_redirector/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: yumu 3 | * @Date: 2020-03-26 4 | * @Email: yumusb@foxmail.com 5 | * @Last Modified by: yumu 6 | * @Last Modified time: 2020-03-26 7 | */ 8 | 9 | addEventListener('fetch', event => { 10 | event.respondWith(fetchAndApply(event.request)); 11 | }) 12 | async function fetchAndApply(request) { 13 | let requestURL = new URL(request.url) 14 | let path = requestURL.pathname.slice(1)//获取访问的URL地址,取得的是第一个/之后的内容,如果访问 33.al/a 获取到a (默认忽略掉参数,也就是?之后的内容) 15 | var url = "https://raw.githubusercontent.com/yumin9822/uy9822/master/url_redirector/redirect.json" // 远程数据,存放JSON文件 16 | init = { 17 | method: "GET" 18 | }; 19 | const response = await fetch(url, init);//请求上面给定的远程JSON 20 | var json = JSON.parse(await response.text());//解析JSON 21 | if (json.hasOwnProperty(path)) { 22 | url = json[path] //如果访问的URL有数据,就取这个URL的值 23 | } else { 24 | url = 'https://www.baidu.com' //如果没有给定的URL,就给出一个默认的。 25 | } 26 | return Response.redirect(url, 301) //直接跳转,不返回页面。 27 | } 28 | -------------------------------------------------------------------------------- /url_redirector/redirect.json: -------------------------------------------------------------------------------- 1 | { 2 | "kms": "http://kms.03k.org", 3 | "123": "https://vip.123pan.cn/1743020/public/", 4 | "oracle": "https://cnrpbteujz9p.compat.objectstorage.ap-seoul-1.oraclecloud.com/pub/", 5 | "9822": "http://vps.ehsrr.com/dropbox/vps/script/", 6 | "ubuntu20": "http://vps.ehsrr.com/dropbox/vps/script/ubuntu20.sh" 7 | } 8 | -------------------------------------------------------------------------------- /ygkkk/endip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | case "$(uname -m)" in 4 | x86_64 | x64 | amd64 ) 5 | cpu=amd64 6 | ;; 7 | i386 | i686 ) 8 | cpu=386 9 | ;; 10 | armv8 | armv8l | arm64 | aarch64 ) 11 | cpu=arm64 12 | ;; 13 | armv7l ) 14 | cpu=arm 15 | ;; 16 | * ) 17 | echo "当前架构为$(uname -m),暂不支持" 18 | exit 19 | ;; 20 | esac 21 | 22 | cfwarpreg(){ 23 | curl -sSL https://gitlab.com/rwkgyg/CFwarp/-/raw/main//point/acwarp.sh -o acwarp.sh && chmod +x acwarp.sh && ./acwarp.sh 24 | } 25 | 26 | warpendipv4v6(){ 27 | echo "1.IPV4优选对端IP" 28 | echo "2.IPV6优选对端IP" 29 | echo "0.退出" 30 | read -p "请选择: " menu 31 | if [ "$menu" == "1" ];then 32 | cfwarpIP && endipv4 && endipresult 33 | elif [ "$menu" == "2" ];then 34 | cfwarpIP && endipv6 && endipresult 35 | else 36 | exit 37 | fi 38 | } 39 | 40 | cfwarpIP(){ 41 | echo "下载warp优选程序" 42 | if [[ -n $cpu ]]; then 43 | curl -L -o warpendpoint -# --retry 2 https://proxy.freecdn.ml?url=https://gitlab.com/rwkgyg/CFwarp/raw/main/point/$cpu 44 | fi 45 | } 46 | 47 | endipv4(){ 48 | n=0 49 | iplist=100 50 | while true 51 | do 52 | temp[$n]=$(echo 162.159.192.$(($RANDOM%256))) 53 | n=$[$n+1] 54 | if [ $n -ge $iplist ] 55 | then 56 | break 57 | fi 58 | temp[$n]=$(echo 162.159.193.$(($RANDOM%256))) 59 | n=$[$n+1] 60 | if [ $n -ge $iplist ] 61 | then 62 | break 63 | fi 64 | temp[$n]=$(echo 162.159.195.$(($RANDOM%256))) 65 | n=$[$n+1] 66 | if [ $n -ge $iplist ] 67 | then 68 | break 69 | fi 70 | temp[$n]=$(echo 188.114.96.$(($RANDOM%256))) 71 | n=$[$n+1] 72 | if [ $n -ge $iplist ] 73 | then 74 | break 75 | fi 76 | temp[$n]=$(echo 188.114.97.$(($RANDOM%256))) 77 | n=$[$n+1] 78 | if [ $n -ge $iplist ] 79 | then 80 | break 81 | fi 82 | temp[$n]=$(echo 188.114.98.$(($RANDOM%256))) 83 | n=$[$n+1] 84 | if [ $n -ge $iplist ] 85 | then 86 | break 87 | fi 88 | temp[$n]=$(echo 188.114.99.$(($RANDOM%256))) 89 | n=$[$n+1] 90 | if [ $n -ge $iplist ] 91 | then 92 | break 93 | fi 94 | done 95 | while true 96 | do 97 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 98 | then 99 | break 100 | else 101 | temp[$n]=$(echo 162.159.192.$(($RANDOM%256))) 102 | n=$[$n+1] 103 | fi 104 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 105 | then 106 | break 107 | else 108 | temp[$n]=$(echo 162.159.193.$(($RANDOM%256))) 109 | n=$[$n+1] 110 | fi 111 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 112 | then 113 | break 114 | else 115 | temp[$n]=$(echo 162.159.195.$(($RANDOM%256))) 116 | n=$[$n+1] 117 | fi 118 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 119 | then 120 | break 121 | else 122 | temp[$n]=$(echo 188.114.96.$(($RANDOM%256))) 123 | n=$[$n+1] 124 | fi 125 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 126 | then 127 | break 128 | else 129 | temp[$n]=$(echo 188.114.97.$(($RANDOM%256))) 130 | n=$[$n+1] 131 | fi 132 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 133 | then 134 | break 135 | else 136 | temp[$n]=$(echo 188.114.98.$(($RANDOM%256))) 137 | n=$[$n+1] 138 | fi 139 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 140 | then 141 | break 142 | else 143 | temp[$n]=$(echo 188.114.99.$(($RANDOM%256))) 144 | n=$[$n+1] 145 | fi 146 | done 147 | } 148 | 149 | endipv6(){ 150 | n=0 151 | iplist=100 152 | while true 153 | do 154 | temp[$n]=$(echo [2606:4700:d0::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))]) 155 | n=$[$n+1] 156 | if [ $n -ge $iplist ] 157 | then 158 | break 159 | fi 160 | temp[$n]=$(echo [2606:4700:d1::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))]) 161 | n=$[$n+1] 162 | if [ $n -ge $iplist ] 163 | then 164 | break 165 | fi 166 | done 167 | while true 168 | do 169 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 170 | then 171 | break 172 | else 173 | temp[$n]=$(echo [2606:4700:d0::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))]) 174 | n=$[$n+1] 175 | fi 176 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] 177 | then 178 | break 179 | else 180 | temp[$n]=$(echo [2606:4700:d1::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))]) 181 | n=$[$n+1] 182 | fi 183 | done 184 | } 185 | 186 | endipresult(){ 187 | echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u > ip.txt 188 | ulimit -n 102400 189 | chmod +x warpendpoint 190 | ./warpendpoint 191 | clear 192 | cat result.csv | awk -F, '$3!="timeout ms" {print} ' | sort -t, -nk2 -nk3 | uniq | head -11 | awk -F, '{print "端点 "$1" 丢包率 "$2" 平均延迟 "$3}' 193 | rm -rf ip.txt warpendpoint 194 | exit 195 | } 196 | 197 | echo "------------------------------------------------------" 198 | echo "甬哥Github项目 :github.com/yonggekkk" 199 | echo "甬哥blogger博客 :ygkkk.blogspot.com" 200 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk" 201 | echo "脚本支持WARP优选IP、WARP配置文件生成,感谢CF网友开发" 202 | echo "------------------------------------------------------" 203 | echo 204 | echo "1.WARP-V4V6优选对端IP" 205 | echo "2.注册生成WARP-Wireguard配置文件、二维码" 206 | echo "0.退出" 207 | read -p "请选择: " menu 208 | if [ "$menu" == "1" ];then 209 | warpendipv4v6 210 | elif [ "$menu" == "2" ];then 211 | cfwarpreg 212 | else 213 | exit 214 | fi 215 | --------------------------------------------------------------------------------