diff --git a/plugin.video.alfa/channels/hdfull.py b/plugin.video.alfa/channels/hdfull.py index 8140ecf7..7b369752 100644 --- a/plugin.video.alfa/channels/hdfull.py +++ b/plugin.video.alfa/channels/hdfull.py @@ -533,17 +533,17 @@ def findvideos(item): key = scrapertools.find_single_match(data_js, 'JSON.parse\(atob.*?substrings\((.*?)\)') data_js = httptools.downloadpage("%s/js/providers.js" % host).data - try: - from lib import alfaresolver - provs = alfaresolver.hdfull_providers(data_js) - if provs == '': return [] - except: - return [] + decoded = jhexdecode(data_js) + providers_pattern = 'p\[(\d+)\]= {"t":"([^"]+)","d":".*?","e":.function.*?,"l":.function.*?return "([^"]+)".*?};' + providers = scrapertools.find_multiple_matches (decoded, providers_pattern) + provs = {} + for provider, e, l in providers: + provs[provider]=[e,l] data = agrupa_datos(httptools.downloadpage(item.url).data) data_obf = scrapertools.find_single_match(data, "var ad\s*=\s*'([^']+)'") - data_decrypt = jsontools.load(obfs(base64.b64decode(data_obf), 126 - int(key))) + data_decrypt = jsontools.load(obfs(base64.b64decode(data_obf), 126 - int(key))) infolabels = {} year = scrapertools.find_single_match(data, 'Año:\s*.*?(\d{4})') infolabels["year"] = year @@ -552,7 +552,7 @@ def findvideos(item): if match['provider'] in provs: try: embed = provs[match['provider']][0] - url = eval(provs[match['provider']][1].replace('_code_', "match['code']")) + url = provs[match['provider']][1]+match['code'] matches.append([match['lang'], match['quality'], url, embed]) except: pass @@ -691,7 +691,6 @@ def get_status(status, type, id): ## -------------------------------------------------------------------------------- ## -------------------------------------------------------------------------------- - def jhexdecode(t): r = re.sub(r'_\d+x\w+x(\d+)', 'var_' + r'\1', t) r = re.sub(r'_\d+x\w+', 'var_0', r) diff --git a/plugin.video.alfa/core/httptools.py b/plugin.video.alfa/core/httptools.py index 03d8fd29..d846c118 100644 --- a/plugin.video.alfa/core/httptools.py +++ b/plugin.video.alfa/core/httptools.py @@ -99,7 +99,7 @@ load_cookies() def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=True, cookies=True, replace_headers=False, - add_referer=False, only_headers=False, bypass_cloudflare=True, count_retries=0, random_headers=False, ignore_response_code=False): + add_referer=False, only_headers=False, bypass_cloudflare=True, count_retries=0, random_headers=False, ignore_response_code=False, alfa_s=False): """ Abre una url y retorna los datos obtenidos @@ -164,22 +164,23 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr if timeout is None and HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT is not None: timeout = HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT if timeout == 0: timeout = None - logger.info("----------------------------------------------") - logger.info("downloadpage Alfa: %s" %__version) - logger.info("----------------------------------------------") - logger.info("Timeout: %s" % timeout) - logger.info("URL: " + url) - logger.info("Dominio: " + urlparse.urlparse(url)[1]) - if post: - logger.info("Peticion: POST") - else: - logger.info("Peticion: GET") - logger.info("Usar Cookies: %s" % cookies) - logger.info("Descargar Pagina: %s" % (not only_headers)) - logger.info("Fichero de Cookies: " + ficherocookies) - logger.info("Headers:") - for header in request_headers: - logger.info("- %s: %s" % (header, request_headers[header])) + if not alfa_s: + logger.info("----------------------------------------------") + logger.info("downloadpage Alfa: %s" %__version) + logger.info("----------------------------------------------") + logger.info("Timeout: %s" % timeout) + logger.info("URL: " + url) + logger.info("Dominio: " + urlparse.urlparse(url)[1]) + if post: + logger.info("Peticion: POST") + else: + logger.info("Peticion: GET") + logger.info("Usar Cookies: %s" % cookies) + logger.info("Descargar Pagina: %s" % (not only_headers)) + logger.info("Fichero de Cookies: " + ficherocookies) + logger.info("Headers:") + for header in request_headers: + logger.info("- %s: %s" % (header, request_headers[header])) # Handlers handlers = [urllib2.HTTPHandler(debuglevel=False)] @@ -192,7 +193,8 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr opener = urllib2.build_opener(*handlers) - logger.info("Realizando Peticion") + if not alfa_s: + logger.info("Realizando Peticion") # Contador inicio = time.time() @@ -243,15 +245,17 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr response["time"] = time.time() - inicio response["url"] = handle.geturl() - logger.info("Terminado en %.2f segundos" % (response["time"])) - logger.info("Response sucess: %s" % (response["sucess"])) - logger.info("Response code: %s" % (response["code"])) - logger.info("Response error: %s" % (response["error"])) - logger.info("Response data length: %s" % (len(response["data"]))) - logger.info("Response headers:") + if not alfa_s: + logger.info("Terminado en %.2f segundos" % (response["time"])) + logger.info("Response sucess: %s" % (response["sucess"])) + logger.info("Response code: %s" % (response["code"])) + logger.info("Response error: %s" % (response["error"])) + logger.info("Response data length: %s" % (len(response["data"]))) + logger.info("Response headers:") server_cloudflare = "" for header in response["headers"]: - logger.info("- %s: %s" % (header, response["headers"][header])) + if not alfa_s: + logger.info("- %s: %s" % (header, response["headers"][header])) if "cloudflare" in response["headers"][header]: server_cloudflare = "cloudflare" @@ -266,22 +270,27 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr if cookies: save_cookies() - logger.info("Encoding: %s" % (response["headers"].get('content-encoding'))) + if not alfa_s: + logger.info("Encoding: %s" % (response["headers"].get('content-encoding'))) if response["headers"].get('content-encoding') == 'gzip': - logger.info("Descomprimiendo...") + if not alfa_s: + logger.info("Descomprimiendo...") data_alt = response["data"] try: response["data"] = gzip.GzipFile(fileobj=StringIO(response["data"])).read() - logger.info("Descomprimido") + if not alfa_s: + logger.info("Descomprimido") except: - logger.info("No se ha podido descomprimir con gzip. Intentando con zlib") + if not alfa_s: + logger.info("No se ha podido descomprimir con gzip. Intentando con zlib") response["data"] = data_alt try: import zlib response["data"] = zlib.decompressobj(16 + zlib.MAX_WBITS).decompress(response["data"]) except: - logger.info("No se ha podido descomprimir con zlib") + if not alfa_s: + logger.info("No se ha podido descomprimir con zlib") response["data"] = data_alt # Anti Cloudflare @@ -289,11 +298,14 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr cf = Cloudflare(response) if cf.is_cloudflare: count_retries += 1 - logger.info("cloudflare detectado, esperando %s segundos..." % cf.wait_time) + if not alfa_s: + logger.info("cloudflare detectado, esperando %s segundos..." % cf.wait_time) auth_url = cf.get_url() - logger.info("Autorizando... intento %d url: %s" % (count_retries, auth_url)) + if not alfa_s: + logger.info("Autorizando... intento %d url: %s" % (count_retries, auth_url)) if downloadpage(auth_url, headers=request_headers, replace_headers=True, count_retries=count_retries).sucess: - logger.info("Autorización correcta, descargando página") + if not alfa_s: + logger.info("Autorización correcta, descargando página") resp = downloadpage(url=response["url"], post=post, headers=headers, timeout=timeout, follow_redirects=follow_redirects, cookies=cookies, replace_headers=replace_headers, add_referer=add_referer) @@ -305,7 +317,8 @@ def downloadpage(url, post=None, headers=None, timeout=None, follow_redirects=Tr response["time"] = resp.time response["url"] = resp.url else: - logger.info("No se ha podido autorizar") + if not alfa_s: + logger.info("No se ha podido autorizar") return type('HTTPResponse', (), response) diff --git a/plugin.video.alfa/core/scraper.py b/plugin.video.alfa/core/scraper.py index ea229982..7f02a470 100755 --- a/plugin.video.alfa/core/scraper.py +++ b/plugin.video.alfa/core/scraper.py @@ -151,7 +151,7 @@ def cuadro_completar(item): 'default': mediatype_default, 'enabled': True, 'visible': True, - 'lvalues': [config.get_localized_string(60244), config.get_localized_string(60245)] + 'lvalues': [config.get_localized_string(60244), config.get_localized_string(70136)] }] for i, c in enumerate(controls): diff --git a/plugin.video.alfa/core/tmdb.py b/plugin.video.alfa/core/tmdb.py index 72c709e5..a72bea42 100644 --- a/plugin.video.alfa/core/tmdb.py +++ b/plugin.video.alfa/core/tmdb.py @@ -455,7 +455,7 @@ def find_and_set_infoLabels(item): title = item.contentTitle else: tipo_busqueda = "tv" - tipo_contenido = config.get_localized_string(70529) + tipo_contenido = config.get_localized_string(60245) title = item.contentSerieName # Si el titulo incluye el (año) se lo quitamos @@ -478,7 +478,7 @@ def find_and_set_infoLabels(item): if len(results) > 1: from platformcode import platformtools tmdb_result = platformtools.show_video_info(results, item=item, - caption="[%s]: Selecciona la %s correcta" % (title, tipo_contenido)) + caption=config.get_localized_string(60247) %(title, tipo_contenido)) elif len(results) > 0: tmdb_result = results[0] diff --git a/plugin.video.alfa/lib/alfaresolver.py b/plugin.video.alfa/lib/alfaresolver.py index e2605efc..34e59d85 100644 --- a/plugin.video.alfa/lib/alfaresolver.py +++ b/plugin.video.alfa/lib/alfaresolver.py @@ -1 +1 @@ -import base64; exec(base64.b64decode('aW1wb3J0IG1hcnNoYWwKZXhlYyhtYXJzaGFsLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoJ1l3QUFBQUFBQUFBQUdRQUFBRUFBQUFCejl3QUFBR1FBQUdRQkFHd0FBRm9BQUdRQUFHUUJBR3dCQUZvQkFHUUFBR1FCQUd3Q0FGb0NBR1FBQUdRQkFHd0RBRm9EQUdRQUFHUUNBR3dFQUcwRkFGb0ZBQUZrQUFCa0F3QnNCQUJ0QmdCYUJnQUJaQUFBWkFFQWJBY0FXZ2NBWkFRQVpRZ0FaZ0VBWkFVQWhBQUFnd0FBV1ZvSkFHUUdBSVFBQUZvS0FHUUhBSVFBQUZvTEFHUUlBSVFBQUZvTUFHUUpBSVFBQUZvTkFHUUtBSVFBQUZvT0FHY0FBR1FMQUdRTUFHUU5BR1FPQUdRUEFHUVFBR1FSQUdRU0FHUVRBR1FVQUdRUEFHUVZBR1FQQUdRTUFHUVdBR1FYQUdRVEFHUVlBR1FaQUdRYUFHUVBBR1FZQUdRYkFHUWNBR2NZQUdjQ0FGb1BBR1FCQUZNb0hRQUFBR24vLy8vL1RpZ0JBQUFBZEFZQUFBQnNiMmRuWlhJb0FRQUFBSFFHQUFBQVkyOXVabWxuZEFZQUFBQnNNV3d4TVd4akFBQUFBQUFBQUFBQ0FBQUFRZ0FBQUhNdkFBQUFaUUFBV2dFQVpBQUFoQUFBV2dJQVpBRUFoQUFBV2dNQVpBSUFaQU1BaEFFQVdnUUFaQVFBaEFBQVdnVUFVbE1vQlFBQUFHTUNBQUFBQndBQUFBVUFBQUJEQUFBQWM4VURBQUI4QVFCOEFBQmZBQUJrQVFCOEFBQmZBUUJuQUFCOEFBQmZBZ0I4QUFCcUF3Q0RBQUJjQWdCOEFBQmZCQUI4QUFCZkJRQjhBQUJxQkFCeXdRTjBCZ0JxQndCa0FnQjhBQUJxQVFBV2d3RUFhZ2dBZkFBQWFnQUFnd0VBZlFJQWVOUUFkQWtBZkFJQWd3RUFSRjNHQUZ3Q0FIMERBSDBFQUh3RUFHUURBQmxrQXdBZ1pBUUFhd0lBY3A0QWZBQUFhZ29BZkFRQVpBTUFHWU1CQUc0SEFId0VBR1FEQUJsOUJRQjhBQUJxQ3dCMERBQjhCQUJrQlFBWlpBWUFnd0lBZkFVQWd3SUFmUVlBWkFjQWZBWUFhd2NBY3ZvQWZBQUFhZ0FBYWcwQWZBUUFaQWdBR1dRSEFId0dBQmRrQndBWGd3SUFmQUFBWHdBQWNXc0FaQWtBZkFZQWF3Y0FjaTBCZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FKQUh3R0FCZGtDUUFYZ3dJQWZBQUFYd0FBY1dzQVpBQUFVM0ZyQUZkMEJnQnFCd0JrQ2dCOEFBQnFBUUFXZ3dFQWFnZ0FmQUFBYWdBQWd3RUFmUUlBZU5RQWRBa0FmQUlBZ3dFQVJGM0dBRndDQUgwREFIMEVBSHdFQUdRREFCbGtBd0FnWkFRQWF3SUFjcGNCZkFBQWFnb0FmQVFBWkFNQUdZTUJBRzRIQUh3RUFHUURBQmw5QlFCOEFBQnFDd0IwREFCOEJBQmtCUUFaWkFZQWd3SUFmQVVBZ3dJQWZRWUFaQWNBZkFZQWF3Y0Fjdk1CZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FMQUh3R0FCZGtDd0FYZ3dJQWZBQUFYd0FBY1dRQlpBa0FmQVlBYXdjQWNpWUNmQUFBYWdBQWFnMEFmQVFBWkFnQUdXUU1BSHdHQUJka0RBQVhnd0lBZkFBQVh3QUFjV1FCWkFBQVUzRmtBVmQwQmdCcUJ3QmtEUUI4QUFCcUFRQVdnd0VBYWdnQWZBQUFhZ0FBZ3dFQWZRSUFlS01BZEFrQWZBSUFnd0VBUkYyVkFGd0NBSDBEQUgwRUFId0FBR29MQUhRTUFId0VBR1FGQUJsa0JnQ0RBZ0JrQVFDREFnQjlCZ0JrQndCOEJnQnJCd0J5dXdKOEFBQnFBQUJxRFFCOEJBQmtDQUFaWkFjQWZBWUFGMlFIQUJlREFnQjhBQUJmQUFCeFhRSmtDUUI4QmdCckJ3Qnk3Z0o4QUFCcUFBQnFEUUI4QkFCa0NBQVpaQWtBZkFZQUYyUUpBQmVEQWdCOEFBQmZBQUJ4WFFKa0FBQlRjVjBDVjNRR0FHb0hBR1FPQUh3QUFHb0JBQmFEQVFCcUNBQjhBQUJxQUFDREFRQjlBZ0I0cGdCMENRQjhBZ0NEQVFCRVhaVUFYQUlBZlFNQWZRUUFmQUFBYWdzQWRBd0FmQVFBWkFVQUdXUUdBSU1DQUdRQkFJTUNBSDBHQUdRSEFId0dBR3NIQUhLREEzd0FBR29BQUdvTkFId0VBR1FJQUJsa0N3QjhCZ0FYWkFzQUY0TUNBSHdBQUY4QUFIRWxBMlFKQUh3R0FHc0hBSEsyQTN3QUFHb0FBR29OQUh3RUFHUUlBQmxrREFCOEJnQVhaQXdBRjRNQ0FId0FBRjhBQUhFbEEyUUFBRk54SlFOWGJnQUFaQUFBVXlnUEFBQUFUblFBQUFBQWN4NEFBQUFvSlhOY0tDY29XMTRuWFNvcEp5eGNjeW9uS0Z0ZUoxMHFLU2RjS1NscEFnQUFBSE1DQUFBQVhIaHBBUUFBQUdrUUFBQUFkQUVBQUFBbmFRQUFBQUIwQVFBQUFDSnpJZ0FBQUNnbGMxd29YRnduS0M0cVB5bGNYQ2NzWEhNcVhGd25LQzRxUHlsY1hDZGNLU2x6QWdBQUFGd25jd0lBQUFCY0luTVJBQUFBS0NWelhDZ25LRnRlSjEwcUtTZGNLU2x6RXdBQUFDZ2xjMXdvWEZ3bktDNHFQeWxjWENkY0tTa29EZ0FBQUhRRUFBQUFaR0YwWVhRSEFBQUFablZ1WTJsdmJuUUZBQUFBYkdsemRHRjBCZ0FBQUd3eE1Xd3hNWFFHQUFBQWJHd3hiR3d4ZEFNQUFBQnRjMmQwQWdBQUFISmxkQWNBQUFCamIyMXdhV3hsZEFjQUFBQm1hVzVrWVd4c2RBa0FBQUJsYm5WdFpYSmhkR1YwQlFBQUFIVnVhR1Y0ZEFZQUFBQnNNV3d4TVRGMEF3QUFBR2x1ZEhRSEFBQUFjbVZ3YkdGalpTZ0hBQUFBZEFRQUFBQnpaV3htVWdZQUFBQjBCZ0FBQUd4c2JERXhNWFFCQUFBQWFYUUZBQUFBYldGMFkyaDBBUUFBQUhoMEJRQUFBSFpoYkc5eUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQ0FBQUFGOWZhVzVwZEY5ZktnQUFBSE5PQUFBQUFBRUpBZ2tCQ1FJWUF3a0NJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVI4Q0RBRW5BUXdCSndNSUF5SUJHUUVmQWd3Qkp3RU1BU2NEWXdFQUFBQUhBQUFBQlFBQUFFTUFBQUJ6QUFJQUFIUUFBR29CQUdRQkFId0FBR29DQUlNQ0FIMEJBSHdCQUhNbEFIUURBR1FDQUdZQ0FGTjhBUUJxQkFCa0F3Q0RBUUI5QWdCOEFRQnFCQUJrQkFDREFRQnFCUUJrQlFDREFRQjhBQUJmQmdCNE53QjBCd0I4QUFCcUJnQ0RBUUJFWFNZQVhBSUFmUU1BZlFRQWZBUUFhZ2dBZ3dBQVpBTUFaQVlBSVh3QUFHb0dBSHdEQUR4eFh3QlhmQUFBYWdZQVpBY0FHV1FFQUNCa0NBQnJBZ0J5MlFCNE5nQjBCd0I4QUFCcUJnQ0RBUUJFWFNJQVhBSUFmUU1BZlFRQWZBQUFhZ2tBZkFRQWd3RUFmQUFBYWdZQWZBTUFQSEd3QUZkdUFBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEFBQnFBUUJrQ1FCOEFnQVdmQUFBYWdJQVpBb0FkQUFBYWdzQWd3SUJmUUVBZkFFQWN5d0JkQU1BWkFJQVpnSUFVM1FNQUh3QkFHb0VBR1FEQUlNQkFHUUhBSU1DQUgwRkFId0FBR29DQUdvS0FId0JBR29FQUdRSEFJTUJBR1FDQUlNQ0FId0FBRjhDQUhnd0FIUU5BSHdGQUlNQkFFUmRJZ0I5QmdCOEFBQnFCZ0JxRGdCOEFBQnFCZ0JxRHdCa0J3Q0RBUUNEQVFBQmNYSUJWM1FBQUdvQkFHUUxBSHdBQUdvQ0FJTUNBSDBCQUh3QkFITzlBWFFEQUdRQ0FHWUNBRk44QVFCcUJBQmtBd0NEQVFCcUNBQ0RBQUI4QUFCZkVBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEVRQmtBZ0JtQWdCVEtBd0FBQUJPY3hvQUFBQjJZWElnS0Z4M0tpbGNjeW85WEhNcVhGc29MaW8vS1Z4ZE8xSURBQUFBYVFFQUFBQnBBZ0FBQUhRQkFBQUFMR24vLy8vL2FRQUFBQUJ6QWdBQUFGeDRjeVVBQUFCY0tHWjFibU4wYVc5dVhDZ3VLajk5WENnbGN5eGNjeW9vVzE1Y0tWMHFLVndwWENrN2RBVUFBQUJtYkdGbmMzTnVBQUFBZG1GeUlDaGNkeW9wWEhNcVBWeHpLbVoxYm1OMGFXOXVYSE1xWENoY2N5cGJYaXhkS2l4Y2N5cGJYbHdwWFNwY0tWeHpLbHg3TGlvL1hIMWNjeXBsYkhObFhIdGNjeXBjZHlwY2N5bzlYSE1xWEhjcU8xeHpLbHg5WEhNcWNtVjBkWEp1SUZ4M0tqdGNjeXBjZlRzb0VnQUFBRklNQUFBQWRBWUFBQUJ6WldGeVkyaFNCZ0FBQUhRRkFBQUFSbUZzYzJWMEJRQUFBR2R5YjNWd2RBVUFBQUJ6Y0d4cGRGSUlBQUFBVWc4QUFBQjBCUUFBQUhOMGNtbHdVaEFBQUFCU0V3QUFBSFFHQUFBQVJFOVVRVXhNVWhJQUFBQjBCUUFBQUhKaGJtZGxkQVlBQUFCaGNIQmxibVIwQXdBQUFIQnZjRklIQUFBQWRBUUFBQUJVY25WbEtBY0FBQUJTRkFBQUFIUUJBQUFBYlhRR0FBQUFibTl0WW5KbFVoWUFBQUIwQVFBQUFIWjBCZ0FBQUc1MWJXVnliMUlZQUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejVTQ1FBQUFHMEFBQUJ6TUFBQUFBQUVGUUVHQUFvQ0R3RWJBUndBSGdJWEFSd0FIUUloQmlJQkJnQUtBaGdDSVFJVEFDQUZGUUVHQUFvQ0dBSWhBbElEQUFBQVl3TUFBQUFMQUFBQUNBQUFBRU1BQUFCenZBRUFBSFFBQUh3QUFHb0JBSHdCQUJtREFRQjlBd0IwQWdCcUF3QjhBd0NEQVFCOUF3QmtBUUI5QkFCNFJBQjBCQUIwQlFCOEF3Q0RBUUNEQVFCRVhUQUFmUVVBZkFRQVpBSUFaQU1BZEFZQWRBY0FmQU1BZkFVQUdZTUJBSU1CQUdRRUFCOFhaQVVBSHhjM2ZRUUFjVHNBVjNRSUFIUUpBR29LQUh3RUFJTUJBR1FHQUlNQ0FIMERBSHdDQUdRQkFHc0NBSEtYQUh3REFGTjBCQUJrQndDREFRQjlCZ0JrQ0FCOUJ3QmtBUUI5Q0FCNFlBQjBCQUJrQndDREFRQkVYVklBZlFVQWZBY0FmQVlBZkFVQUdSZDBCd0I4QWdCOEJRQjBCUUI4QWdDREFRQVdHWU1CQUJka0J3QVdmUWNBZkFZQWZBVUFHWDBKQUh3R0FId0hBQmw4QmdCOEJRQThmQWtBZkFZQWZBY0FQSEc4QUZka0NBQjlDZ0JrQ0FCOUJ3QjRqZ0IwQkFCMEJRQjhBd0NEQVFDREFRQkVYWG9BZlFVQWZBb0FaQWtBRjJRSEFCWjlDZ0I4QndCOEJnQjhDZ0FaRjJRSEFCWjlCd0I4QmdCOENnQVpmUWtBZkFZQWZBY0FHWHdHQUh3S0FEeDhDUUI4QmdCOEJ3QThmQWdBZEFzQWRBY0FmQU1BZkFVQUdZTUJBSHdHQUh3R0FId0tBQmw4QmdCOEJ3QVpGMlFIQUJZWlFZTUJBRGQ5Q0FCeE1RRlhmQWdBYWd3QVpBWUFnd0VBVXlnS0FBQUFUbElEQUFBQWRBRUFBQUFsZEFJQUFBQXdNR2tDQUFBQWFmNy8vLzkwQkFBQUFIVjBaamhwQUFFQUFHa0FBQUFBYVFFQUFBQW9EUUFBQUhRREFBQUFjM1J5VWdnQUFBQjBCZ0FBQUdKaGMyVTJOSFFKQUFBQVlqWTBaR1ZqYjJSbFVpTUFBQUIwQXdBQUFHeGxiblFEQUFBQWFHVjRkQU1BQUFCdmNtUjBCd0FBQUhWdWFXTnZaR1YwQmdBQUFIVnliR3hwWW5RSEFBQUFkVzV4ZFc5MFpYUUdBQUFBZFc1cFkyaHlkQVlBQUFCbGJtTnZaR1VvQ3dBQUFGSVVBQUFBZEFNQUFBQnVkVzEwQVFBQUFITjBBUUFBQUhKU0dBQUFBSFFCQUFBQWVYUUJBQUFBZEhRQkFBQUFkWFFCQUFBQWQxSXBBQUFBZEFFQUFBQkJLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1U0VRQUFBSmtBQUFCek5BQUFBQUFCRXdJUEFnWUJHUUV1QWhnQkRBQUVBZ3dCQmdBR0FSTUJLZ0VLQVE0QkRnSUdBQVlCR1FFT0FSSUJDZ0VPQVFvQk5nSmpBZ0FBQUFJQUFBQUVBQUFBUXdBQUFITVdBQUFBZEFBQWFnRUFaQUVBWkFJQWhBQUFmQUVBZ3dNQVV5Z0RBQUFBVG5NVEFBQUFYRng0VzJFdFpqQXRPVjFiWVMxbU1DMDVYV01CQUFBQUFRQUFBQUlBQUFCVEFBQUFjeGNBQUFCOEFBQnFBQUNEQUFCa0FRQWZhZ0VBWkFJQWd3RUFVeWdEQUFBQVRta0NBQUFBVWpJQUFBQW9BZ0FBQUZJZkFBQUFkQVlBQUFCa1pXTnZaR1VvQVFBQUFGSW5BQUFBS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NTBDQUFBQUR4c1lXMWlaR0UrdkFBQUFITUFBQUFBS0FJQUFBQlNEQUFBQUhRREFBQUFjM1ZpS0FJQUFBQlNGQUFBQUhRREFBQUFkSGgwS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NVNFQUFBQUxzQUFBQnpBZ0FBQUFBQktBWUFBQUIwQ0FBQUFGOWZibUZ0WlY5ZmRBb0FBQUJmWDIxdlpIVnNaVjlmVWhvQUFBQlNDUUFBQUZJUkFBQUFVaEFBQUFBb0FBQUFBQ2dBQUFBQUtBQUFBQUJ6Q0FBQUFEeHpkSEpwYm1jK1VnSUFBQUFvQUFBQWN3Z0FBQUFHQWdsRENTd01JbU1CQUFBQUNRQUFBQVFBQUFCREFBQUFjL1lBQUFCMEFBQnFBUUNEQUFCekVBQjhBQUJUWkFFQVpBQUFiQUlBZlFFQVpBRUFaQUFBYkFNQWZRSUFaQUVBWkFBQWJBUUFmUU1BZkFFQWFnVUFnd0FBYWdZQVpBSUFnd0VBZlFRQWRBY0FhZ2dBWkFNQWd3RUFmUVVBZEFrQWZBQUFnd0VBWkFRQWF3UUFjdklBZkFRQVpBVUFhd01BYzRJQWZBVUFaQVlBYXdNQWN2SUFmQUlBYWdvQVpBUUFkQWtBZkFBQWd3RUFnd0lBZlFZQWRBc0FmQUFBZ3dFQWZRY0FmQWNBZkFZQUdYMElBSGdxQUh3SEFId0dBQmw4Q0FCckFnQnkzQUI4QWdCcURBQjhBd0JxRFFDREFRQjhCd0I4QmdBOGNiTUFWMlFIQUdvT0FId0hBSU1CQUgwQUFISHlBRzRBQUh3QUFGTW9DQUFBQUU1cC8vLy8vM1FHQUFBQVlYVjBhRzl5Y3hRQUFBQkRiMjUwWVdsdVpYSXVVR3gxWjJsdVRtRnRaV2tBQUFBQWN3b0FBQUJCYkdaaElFRmtaRzl1Y3hFQUFBQndiSFZuYVc0dWRtbGtaVzh1WVd4bVlWSURBQUFBS0E4QUFBQlNBUUFBQUhRSEFBQUFhWE5mZUdKdFkzUUpBQUFBZUdKdFkyRmtaRzl1ZEFZQUFBQnlZVzVrYjIxMEJnQUFBSE4wY21sdVozUUZBQUFBUVdSa2IyNTBEQUFBQUdkbGRFRmtaRzl1U1c1bWIzUUVBQUFBZUdKdFkzUU1BQUFBWjJWMFNXNW1iMHhoWW1Wc1VqRUFBQUIwQndBQUFISmhibVJwYm5SMEJBQUFBR3hwYzNSMEJnQUFBR05vYjJsalpYUUhBQUFBYkdWMGRHVnljM1FFQUFBQWFtOXBiaWdKQUFBQWRBTUFBQUIxY214U1NRQUFBRkpLQUFBQVVrc0FBQUJTUndBQUFIUUtBQUFBWVdSa2IyNWZibUZ0WlhRR0FBQUFZMmhoYm1kbGRBZ0FBQUIwWlcxd1gzVnliSFFEQUFBQWIyeGtLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1MEFnQUFBR0YyeEFBQUFITWdBQUFBQUFFTUFRUUJEQUVNQVF3Q0ZRRVBBUklCR0FFWUFRd0JDZ0VUQVJvQkZRRmpBQUFBQUFNQUFBQUlBQUFBUXdBQUFITnZBQUFBWkFFQWRBQUFhd2NBY2hBQWRBRUFVM1FDQUdvREFHUUNBSU1CQUgwQUFIaEpBSFFFQUVSZFFRQjlBUUI4QUFCMEJRQnFCZ0JrQXdCcUJ3Qm5BQUI4QVFCRVhSSUFmUUlBZEFnQWZBSUFnd0VBWGdJQWNVSUFnd0VBZ3dFQWF3SUFjaVlBZEFrQVUzRW1BRmQwQVFCVEtBUUFBQUJPY3c4QUFBQmhiR1poY21WemIyeDJaWEl1Y0hsekZBQUFBRU52Ym5SaGFXNWxjaTVRYkhWbmFXNU9ZVzFsVWdNQUFBQW9DZ0FBQUhRSUFBQUFYMTltYVd4bFgxOVNIZ0FBQUZKT0FBQUFVazhBQUFCMEFnQUFBR3d4VWk4QUFBQlNNQUFBQUZKVUFBQUFkQU1BQUFCamFISlNKZ0FBQUNnREFBQUFkQUVBQUFCaFVoZ0FBQUJTUEFBQUFDZ0FBQUFBS0FBQUFBQnpDQUFBQUR4emRISnBibWMrZEFZQUFBQnNiREZzTVRIWkFBQUFjdzRBQUFBQUFRd0FCQUlQQVEwQk53QUlBV01CQUFBQUJBQUFBQU1BQUFCREFBQUFjOHdBQUFCMEFBQnFBUUJrQVFDREFRQnFBZ0I4QUFDREFRQjlBUUIwQXdCOEFRQ0RBUUJrQWdCckJBQnlXd0IwQkFCOEFRQmtBZ0FaWkFJQUdXUURBSU1DQUgwQ0FIUUVBSHdCQUdRQ0FCbGtCQUFaWkFNQWd3SUFmUU1BYm1jQWRBQUFhZ0VBWkFVQWd3RUFhZ0lBZkFBQWd3RUFmUUVBZEFNQWZBRUFnd0VBWkFJQWF3UUFjcllBZEFRQWZBRUFaQUlBR1dRQ0FCbGtCZ0NEQWdCOUFnQjBCQUI4QVFCa0FnQVpaQVFBR1dRR0FJTUNBSDBEQUc0TUFHUUNBSDBDQUdRQ0FIMERBSHdDQUh3REFHWUNBRk1vQndBQUFFNXpKd0FBQURCNEtGc3dMVGxoTFdaQkxVWmRLeWxjY3lvc1hITXFNSGdvV3pBdE9XRXRaa0V0UmwwcktXa0FBQUFBYVJBQUFBQnBBUUFBQUhNVUFBQUFYSE1xS0Z4a0t5bGNjeW9zWEhNcUtGeGtLeWxwQ2dBQUFDZ0ZBQUFBVWd3QUFBQlNEUUFBQUZJT0FBQUFVakVBQUFCU0VnQUFBQ2dFQUFBQVVrUUFBQUJTRlFBQUFIUUZBQUFBWkdWelpHVlNPUUFBQUNnQUFBQUFLQUFBQUFCekNBQUFBRHh6ZEhKcGJtYytkQVlBQUFCc01XeHNNV3prQUFBQWN4WUFBQUFBQVJnQkVnRVhBUm9DR0FFU0FSY0JHZ0lHQVFZQll3SUFBQUFQQUFBQUJnQUFBRU1BQUFCelV3SUFBSFFBQUlNQUFITU5BSHdBQUZOMEFRQnFBZ0JrQVFDREFRQnFBd0I4QVFDREFRQjlBZ0I4QWdCelBBQjBCQUJxQlFCOEFRQ0RBUUFCZkFBQVUzUUdBSHdDQUdRQ0FCbURBUUI5QXdCOEF3QnFCd0J6WmdCMEJBQnFCUUI4QVFDREFRQUJmQUFBVTNRQkFHb0NBR1FEQUhRQkFHb0lBSU1DQUdvREFId0FBSU1CQUdRQ0FCbDlCQUI4QkFCa0FBQmtBQUJrQkFDRkF3QVpmUVVBZEFFQWFna0FaQVVBWkFZQWZBTUFhZ29BZ3dNQWZBTUFYd29BZURVQVpBY0FaQWdBWkFrQVpBb0FaQXNBWndVQVJGMGVBSDBHQUh3REFHb0tBR29MQUh3R0FHUU1BSU1DQUh3REFGOEtBSEhNQUZkMEFRQnFBZ0JrRFFDREFRQnFBd0I4QXdCcUNnQ0RBUUI5QWdCOEFnQnlLQUYwREFCOEFnQmtBZ0FaZ3dFQVhBSUFmUWNBZlFnQWJrWUFkQUVBYWdJQVpBNEFnd0VBYWdNQWZBTUFhZ29BZ3dFQWZRSUFmQUlBY21JQmRBd0FmQUlBWkFJQUdZTUJBRndDQUgwSEFIMElBRzRNQUdRQ0FIMEhBR1FDQUgwSUFId0hBR1FDQUdzQ0FIS0VBWHdGQUh3SUFCOXVFd0I4QlFCOEJ3QWdmQVVBZkFjQWZBZ0FGeDhYZlFrQWRBMEFmQWtBZ3dFQWZRb0FkQUVBYWdJQVpBOEFnd0VBYWdNQWZBTUFhZ29BZ3dFQWZRSUFmQUlBY2pjQ2VHMEFmQUlBUkYxaUFGd0VBSDBMQUgwTUFIME5BSDBPQUh3TkFHUVFBR3NDQUhMT0FYd0xBSHdPQUdzQ0FITE9BWHdLQUhRT0FId01BSU1CQUJsOENnQjBEZ0I4Q3dDREFRQVpBbndLQUhRT0FId0xBSU1CQUR4OENnQjBEZ0I4REFDREFRQThjYzRCY2M0QlYyNEFBSFFCQUdvSkFId0VBR1FSQUdvUEFId0tBSU1CQUh3QUFJTURBRk1vRWdBQUFFNXpLQUFBQUNoMllYSWdYSGNyWEhNcVBWeHpLbHhiTGlvL1hGMDdYQ2htZFc1amRHbHZibHdvTGlvL0tRcHBBQUFBQUhNTkFBQUFXekF0T1dFdGVsMTdOREFzZlduLy8vLy9jd2dBQUFCY2N5cGNLMXh6S25RQkFBQUFLM01KQUFBQWMzQnNKeXNuYVdObGN3a0FBQUJ6SnlzbmNHeHBZMlZ6Q1FBQUFITndKeXNuYkdsalpYTUpBQUFBYzNCc2FTY3JKMk5sY3drQUFBQnpjR3hwWXljckoyVjBCZ0FBQUhOd2JHbGpaWE1UQUFBQVhDNXpjR3hwWTJWY0tDaGJYaWxkS3lsY0tYTVhBQUFBWEZzbmMzQnNhV05sSjF4ZFhDZ29XMTRwWFNzcFhDbHpUQUFBQUZ4M0sxeGJLRnhrS3lsY1hWeHpLajFjY3lwY2R5dGNMbk53YkdsalpWeHpLbHdvS0Z4a0t5bGNjeW9zWEhNcUtGeGtLeWxjY3lvc1hITXFYSGNyWEZzb1hHUXJLVnhkWEhNcVhDbDBBUUFBQURGU0F3QUFBQ2dRQUFBQVVsOEFBQUJTREFBQUFGSU5BQUFBVWc0QUFBQlNBQUFBQUhRRUFBQUFhVzVtYjFJQ0FBQUFVZ29BQUFCMENnQUFBRWxIVGs5U1JVTkJVMFZTUXdBQUFGSUdBQUFBVWhNQUFBQlNZUUFBQUZKUkFBQUFVaElBQUFCU1ZBQUFBQ2dQQUFBQVVsVUFBQUJTQmdBQUFGSVZBQUFBZEFNQUFBQnVaWFIwQmdBQUFHeHNiREZzTVhRR0FBQUFiR3d4TVRFeGRBTUFBQUJ5WlhCU1lBQUFBRkk1QUFBQVVoZ0FBQUJTT3dBQUFIUURBQUFBZFc1dmRBTUFBQUJrYjNOMEF3QUFBSFJoYlhRREFBQUFabWx1S0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NTBFQUFBQUdSbFkyOWtaVjkyYVdSbGIxOTFjbXowQUFBQWN6NEFBQUFBQXdrQUJBUVlBUVlCRFFFRUFoQUJDUUVOQVFRSUlnRVRBeHNESEFFY0F4c0JCZ0VaQWhzQkJnRVpBZ1lBQmdFc0JBd0NHd0VHQVJrQkdBRS9BMk1CQUFBQUN3QUFBQVlBQUFCREFBQUFjenNCQUFCMEFBQ0RBQUJ6RFFCa0FRQlRkQUVBYWdJQVpBSUFnd0VBYWdNQWZBQUFnd0VBZlFFQWZBRUFjendBZEFRQWFnVUFmQUFBZ3dFQUFXUUJBRk4wQmdCOEFRQmtBd0FaZ3dFQWZRSUFmQUlBYWdjQWMyWUFkQVFBYWdVQWZBQUFnd0VBQVdRQkFGTjBBUUJxQ0FCa0JBQmtCUUNFQUFCOEFnQnFDUUNEQXdCOEFnQmZDUUIwQVFCcUFnQmtCZ0NEQVFCcUF3QjhBZ0JxQ1FDREFRQjlBd0IwQ2dCOEF3Q0RBUUI5QkFCMEFRQnFBZ0JrQndCa0NBQjBBUUJxQ3dDREFRRnFBd0I4QWdCcUNRQ0RBUUI5QlFCMENnQjhCUUNEQVFCOUJnQnBBQUI5QndCNFV3QjhCZ0JFWFVzQWZRZ0FmQWdBZkFRQWF3WUFjZ1FCZkFRQWZBZ0FHVzREQUdRQkFIMEpBSFFCQUdvSUFHUUpBR1FLQUh3R0FId0lBQm1EQXdCOUNnQjhDUUI4Q2dCbkFnQjhCd0I4Q0FBOGNlZ0FWM3dIQUZNb0N3QUFBRTVTQXdBQUFITW9BQUFBS0haaGNpQmNkeXRjY3lvOVhITXFYRnN1S2o5Y1hUdGNLR1oxYm1OMGFXOXVYQ2d1S2o4cENta0FBQUFBY3hJQUFBQndYRnN3ZUNoYllTMW1NQzA1WFNzcFhGMWpBUUFBQUFFQUFBQUZBQUFBVXdBQUFITWtBQUFBWkFFQWRBQUFkQUVBZkFBQWFnSUFaQUlBZ3dFQVpBTUFnd0lBZ3dFQUYyUUVBQmRUS0FVQUFBQk9jd0lBQUFCd1cya0JBQUFBYVJBQUFBQjBBUUFBQUYwb0F3QUFBRkl1QUFBQVVoSUFBQUJTSHdBQUFDZ0JBQUFBVWljQUFBQW9BQUFBQUNnQUFBQUFjd2dBQUFBOGMzUnlhVzVuUGxKQ0FBQUFSZ0VBQUhNQUFBQUFjeUVBQUFCd1hGc29YR1FyS1Z4ZFhGc25kQ2RjWFZ4ektqMWNjeW9uS0Z0ZUoxMHFLU2R6SndBQUFIQmNXeWhjWkNzcFhGMWNXeWRzSjF4ZFhITXFQUzRxUDNKbGRIVnliaUFvVzE0N1hTb3BPMUljQUFBQWN3NEFBQUFvWHpCNFcyRXRaakF0T1YwcktYUUdBQUFBWDJOdlpHVmZLQXdBQUFCU1h3QUFBRklNQUFBQVVnMEFBQUJTRGdBQUFGSUFBQUFBVW1VQUFBQlNBZ0FBQUZJS0FBQUFVa01BQUFCU0JnQUFBSFFFQUFBQVpHbGpkRklpQUFBQUtBc0FBQUJTQmdBQUFGSVZBQUFBVW1jQUFBQjBBZ0FBQUhCMGRBTUFBQUJrY0hSMEFnQUFBSEJzZEFNQUFBQmtjR3gwQVFBQUFIQlNPUUFBQUZJOUFBQUFkQUVBQUFCc0tBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwRUFBQUFHaGtablZzYkY5d2NtOTJhV1JsY25Nd0FRQUFjeW9BQUFBQUF3a0FCQVFZQVFZQkRRRUVBaEFCQ1FFTkFRUUhIZ0liQVF3Q0pBRU1BZ1lCRFFFY0FSa0JGQUpwWXdBQUFHbEhBQUFBYVhnQUFBQnBNUUFBQUdsYUFBQUFhVElBQUFCcGJBQUFBR2wxQUFBQWFVd0FBQUJwYmdBQUFHbHdBQUFBYVZZQUFBQnBkZ0FBQUdsdEFBQUFhVVlBQUFCcGN3QUFBR2xGQUFBQWFUMEFBQUFvRUFBQUFGSU1BQUFBZEFNQUFBQnplWE5TTHdBQUFGSTFBQUFBZEF3QUFBQndiR0YwWm05eWJXTnZaR1ZTQUFBQUFGSUJBQUFBVWs0QUFBQjBCZ0FBQUc5aWFtVmpkRklDQUFBQVVsb0FBQUJTWHdBQUFGSmhBQUFBVW04QUFBQlNlUUFBQUZKY0FBQUFLQUFBQUFBb0FBQUFBQ2dBQUFBQWN3Z0FBQUE4YzNSeWFXNW5QblFJQUFBQVBHMXZaSFZzWlQ0REFBQUFjeFFBQUFBd0FSQUJFQUVNSWhhY0NSVUpDd2tRQ1R3Skp3PT0nKSkp')) \ No newline at end of file +import base64; exec(base64.b64decode('aW1wb3J0IG1hcnNoYWwKZXhlYyhtYXJzaGFsLmxvYWRzKGJhc2U2NC5iNjRkZWNvZGUoJ1l3QUFBQUFBQUFBQUdRQUFBRUFBQUFCejRRQUFBR1FBQUdRQkFHd0FBRm9BQUdRQUFHUUJBR3dCQUZvQkFHUUFBR1FCQUd3Q0FGb0NBR1FBQUdRQkFHd0RBRm9EQUdRQUFHUUNBR3dFQUcwRkFGb0ZBRzBHQUZvR0FBRmtBd0JsQndCbUFRQmtCQUNFQUFDREFBQlpXZ2dBWkFVQWhBQUFXZ2tBWkFZQWhBQUFXZ29BWkFjQWhBQUFXZ3NBWkFnQWhBQUFXZ3dBWkFrQWhBQUFXZzBBWndBQVpBb0FaQXNBWkF3QVpBMEFaQTRBWkE4QVpCQUFaQkVBWkJJQVpCTUFaQTRBWkJRQVpBNEFaQXNBWkJVQVpCWUFaQklBWkJjQVpCZ0FaQmtBWkE0QVpCY0FaQm9BWkJzQVp4Z0Fad0lBV2c0QVpBRUFVeWdjQUFBQWFmLy8vLzlPS0FJQUFBQjBCZ0FBQUd4dloyZGxjblFHQUFBQVkyOXVabWxuZEFZQUFBQnNiREV4YkRGakFBQUFBQUFBQUFBQ0FBQUFRZ0FBQUhNdkFBQUFaUUFBV2dFQVpBQUFoQUFBV2dJQVpBRUFoQUFBV2dNQVpBSUFaQU1BaEFFQVdnUUFaQVFBaEFBQVdnVUFVbE1vQlFBQUFHTUNBQUFBQndBQUFBVUFBQUJEQUFBQWM4VURBQUI4QVFCOEFBQmZBQUJrQVFCOEFBQmZBUUJuQUFCOEFBQmZBZ0I4QUFCcUF3Q0RBQUJjQWdCOEFBQmZCQUI4QUFCZkJRQjhBQUJxQkFCeXdRTjBCZ0JxQndCa0FnQjhBQUJxQVFBV2d3RUFhZ2dBZkFBQWFnQUFnd0VBZlFJQWVOUUFkQWtBZkFJQWd3RUFSRjNHQUZ3Q0FIMERBSDBFQUh3RUFHUURBQmxrQXdBZ1pBUUFhd0lBY3A0QWZBQUFhZ29BZkFRQVpBTUFHWU1CQUc0SEFId0VBR1FEQUJsOUJRQjhBQUJxQ3dCMERBQjhCQUJrQlFBWlpBWUFnd0lBZkFVQWd3SUFmUVlBWkFjQWZBWUFhd2NBY3ZvQWZBQUFhZ0FBYWcwQWZBUUFaQWdBR1dRSEFId0dBQmRrQndBWGd3SUFmQUFBWHdBQWNXc0FaQWtBZkFZQWF3Y0FjaTBCZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FKQUh3R0FCZGtDUUFYZ3dJQWZBQUFYd0FBY1dzQVpBQUFVM0ZyQUZkMEJnQnFCd0JrQ2dCOEFBQnFBUUFXZ3dFQWFnZ0FmQUFBYWdBQWd3RUFmUUlBZU5RQWRBa0FmQUlBZ3dFQVJGM0dBRndDQUgwREFIMEVBSHdFQUdRREFCbGtBd0FnWkFRQWF3SUFjcGNCZkFBQWFnb0FmQVFBWkFNQUdZTUJBRzRIQUh3RUFHUURBQmw5QlFCOEFBQnFDd0IwREFCOEJBQmtCUUFaWkFZQWd3SUFmQVVBZ3dJQWZRWUFaQWNBZkFZQWF3Y0Fjdk1CZkFBQWFnQUFhZzBBZkFRQVpBZ0FHV1FMQUh3R0FCZGtDd0FYZ3dJQWZBQUFYd0FBY1dRQlpBa0FmQVlBYXdjQWNpWUNmQUFBYWdBQWFnMEFmQVFBWkFnQUdXUU1BSHdHQUJka0RBQVhnd0lBZkFBQVh3QUFjV1FCWkFBQVUzRmtBVmQwQmdCcUJ3QmtEUUI4QUFCcUFRQVdnd0VBYWdnQWZBQUFhZ0FBZ3dFQWZRSUFlS01BZEFrQWZBSUFnd0VBUkYyVkFGd0NBSDBEQUgwRUFId0FBR29MQUhRTUFId0VBR1FGQUJsa0JnQ0RBZ0JrQVFDREFnQjlCZ0JrQndCOEJnQnJCd0J5dXdKOEFBQnFBQUJxRFFCOEJBQmtDQUFaWkFjQWZBWUFGMlFIQUJlREFnQjhBQUJmQUFCeFhRSmtDUUI4QmdCckJ3Qnk3Z0o4QUFCcUFBQnFEUUI4QkFCa0NBQVpaQWtBZkFZQUYyUUpBQmVEQWdCOEFBQmZBQUJ4WFFKa0FBQlRjVjBDVjNRR0FHb0hBR1FPQUh3QUFHb0JBQmFEQVFCcUNBQjhBQUJxQUFDREFRQjlBZ0I0cGdCMENRQjhBZ0NEQVFCRVhaVUFYQUlBZlFNQWZRUUFmQUFBYWdzQWRBd0FmQVFBWkFVQUdXUUdBSU1DQUdRQkFJTUNBSDBHQUdRSEFId0dBR3NIQUhLREEzd0FBR29BQUdvTkFId0VBR1FJQUJsa0N3QjhCZ0FYWkFzQUY0TUNBSHdBQUY4QUFIRWxBMlFKQUh3R0FHc0hBSEsyQTN3QUFHb0FBR29OQUh3RUFHUUlBQmxrREFCOEJnQVhaQXdBRjRNQ0FId0FBRjhBQUhFbEEyUUFBRk54SlFOWGJnQUFaQUFBVXlnUEFBQUFUblFBQUFBQWN4NEFBQUFvSlhOY0tDY29XMTRuWFNvcEp5eGNjeW9uS0Z0ZUoxMHFLU2RjS1NscEFnQUFBSE1DQUFBQVhIaHBBUUFBQUdrUUFBQUFkQUVBQUFBbmFRQUFBQUIwQVFBQUFDSnpJZ0FBQUNnbGMxd29YRnduS0M0cVB5bGNYQ2NzWEhNcVhGd25LQzRxUHlsY1hDZGNLU2x6QWdBQUFGd25jd0lBQUFCY0luTVJBQUFBS0NWelhDZ25LRnRlSjEwcUtTZGNLU2x6RXdBQUFDZ2xjMXdvWEZ3bktDNHFQeWxjWENkY0tTa29EZ0FBQUhRRUFBQUFaR0YwWVhRSEFBQUFablZ1WTJsdmJuUUZBQUFBYkdsemRHRjBCZ0FBQUd3eGJHd3hNWFFHQUFBQWJERnNNVEV4ZEFNQUFBQnRjMmQwQWdBQUFISmxkQWNBQUFCamIyMXdhV3hsZEFjQUFBQm1hVzVrWVd4c2RBa0FBQUJsYm5WdFpYSmhkR1YwQlFBQUFIVnVhR1Y0ZEFZQUFBQnNNV3d4TVd4MEF3QUFBR2x1ZEhRSEFBQUFjbVZ3YkdGalpTZ0hBQUFBZEFRQUFBQnpaV3htVWdZQUFBQjBCZ0FBQUd4c01URXhNWFFCQUFBQWFYUUZBQUFBYldGMFkyaDBBUUFBQUhoMEJRQUFBSFpoYkc5eUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQ0FBQUFGOWZhVzVwZEY5ZktRQUFBSE5PQUFBQUFBRUpBZ2tCQ1FJWUF3a0NJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVRFQkh3SU1BU2NCREFFbkF3Z0RJZ0VaQVI4Q0RBRW5BUXdCSndNSUF5SUJHUUVmQWd3Qkp3RU1BU2NEWXdFQUFBQUhBQUFBQlFBQUFFTUFBQUJ6QUFJQUFIUUFBR29CQUdRQkFId0FBR29DQUlNQ0FIMEJBSHdCQUhNbEFIUURBR1FDQUdZQ0FGTjhBUUJxQkFCa0F3Q0RBUUI5QWdCOEFRQnFCQUJrQkFDREFRQnFCUUJrQlFDREFRQjhBQUJmQmdCNE53QjBCd0I4QUFCcUJnQ0RBUUJFWFNZQVhBSUFmUU1BZlFRQWZBUUFhZ2dBZ3dBQVpBTUFaQVlBSVh3QUFHb0dBSHdEQUR4eFh3QlhmQUFBYWdZQVpBY0FHV1FFQUNCa0NBQnJBZ0J5MlFCNE5nQjBCd0I4QUFCcUJnQ0RBUUJFWFNJQVhBSUFmUU1BZlFRQWZBQUFhZ2tBZkFRQWd3RUFmQUFBYWdZQWZBTUFQSEd3QUZkdUFBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEFBQnFBUUJrQ1FCOEFnQVdmQUFBYWdJQVpBb0FkQUFBYWdzQWd3SUJmUUVBZkFFQWN5d0JkQU1BWkFJQVpnSUFVM1FNQUh3QkFHb0VBR1FEQUlNQkFHUUhBSU1DQUgwRkFId0FBR29DQUdvS0FId0JBR29FQUdRSEFJTUJBR1FDQUlNQ0FId0FBRjhDQUhnd0FIUU5BSHdGQUlNQkFFUmRJZ0I5QmdCOEFBQnFCZ0JxRGdCOEFBQnFCZ0JxRHdCa0J3Q0RBUUNEQVFBQmNYSUJWM1FBQUdvQkFHUUxBSHdBQUdvQ0FJTUNBSDBCQUh3QkFITzlBWFFEQUdRQ0FHWUNBRk44QVFCcUJBQmtBd0NEQVFCcUNBQ0RBQUI4QUFCZkVBQjhBQUJxQWdCcUNnQjhBUUJxQkFCa0J3Q0RBUUJrQWdDREFnQjhBQUJmQWdCMEVRQmtBZ0JtQWdCVEtBd0FBQUJPY3hvQUFBQjJZWElnS0Z4M0tpbGNjeW85WEhNcVhGc29MaW8vS1Z4ZE8xSURBQUFBYVFFQUFBQnBBZ0FBQUhRQkFBQUFMR24vLy8vL2FRQUFBQUJ6QWdBQUFGeDRjeVVBQUFCY0tHWjFibU4wYVc5dVhDZ3VLajk5WENnbGN5eGNjeW9vVzE1Y0tWMHFLVndwWENrN2RBVUFBQUJtYkdGbmMzTnVBQUFBZG1GeUlDaGNkeW9wWEhNcVBWeHpLbVoxYm1OMGFXOXVYSE1xWENoY2N5cGJYaXhkS2l4Y2N5cGJYbHdwWFNwY0tWeHpLbHg3TGlvL1hIMWNjeXBsYkhObFhIdGNjeXBjZHlwY2N5bzlYSE1xWEhjcU8xeHpLbHg5WEhNcWNtVjBkWEp1SUZ4M0tqdGNjeXBjZlRzb0VnQUFBRklNQUFBQWRBWUFBQUJ6WldGeVkyaFNCZ0FBQUhRRkFBQUFSbUZzYzJWMEJRQUFBR2R5YjNWd2RBVUFBQUJ6Y0d4cGRGSUlBQUFBVWc4QUFBQjBCUUFBQUhOMGNtbHdVaEFBQUFCU0V3QUFBSFFHQUFBQVJFOVVRVXhNVWhJQUFBQjBCUUFBQUhKaGJtZGxkQVlBQUFCaGNIQmxibVIwQXdBQUFIQnZjRklIQUFBQWRBUUFBQUJVY25WbEtBY0FBQUJTRkFBQUFIUUJBQUFBYlhRR0FBQUFibTl0WW5KbFVoWUFBQUIwQVFBQUFIWjBCZ0FBQUc1MWJXVnliMUlZQUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejVTQ1FBQUFHd0FBQUJ6TUFBQUFBQUVGUUVHQUFvQ0R3RWJBUndBSGdJWEFSd0FIUUloQmlJQkJnQUtBaGdDSVFJVEFDQUZGUUVHQUFvQ0dBSWhBbElEQUFBQVl3TUFBQUFMQUFBQUNBQUFBRU1BQUFCenZBRUFBSFFBQUh3QUFHb0JBSHdCQUJtREFRQjlBd0IwQWdCcUF3QjhBd0NEQVFCOUF3QmtBUUI5QkFCNFJBQjBCQUIwQlFCOEF3Q0RBUUNEQVFCRVhUQUFmUVVBZkFRQVpBSUFaQU1BZEFZQWRBY0FmQU1BZkFVQUdZTUJBSU1CQUdRRUFCOFhaQVVBSHhjM2ZRUUFjVHNBVjNRSUFIUUpBR29LQUh3RUFJTUJBR1FHQUlNQ0FIMERBSHdDQUdRQkFHc0NBSEtYQUh3REFGTjBCQUJrQndDREFRQjlCZ0JrQ0FCOUJ3QmtBUUI5Q0FCNFlBQjBCQUJrQndDREFRQkVYVklBZlFVQWZBY0FmQVlBZkFVQUdSZDBCd0I4QWdCOEJRQjBCUUI4QWdDREFRQVdHWU1CQUJka0J3QVdmUWNBZkFZQWZBVUFHWDBKQUh3R0FId0hBQmw4QmdCOEJRQThmQWtBZkFZQWZBY0FQSEc4QUZka0NBQjlDZ0JrQ0FCOUJ3QjRqZ0IwQkFCMEJRQjhBd0NEQVFDREFRQkVYWG9BZlFVQWZBb0FaQWtBRjJRSEFCWjlDZ0I4QndCOEJnQjhDZ0FaRjJRSEFCWjlCd0I4QmdCOENnQVpmUWtBZkFZQWZBY0FHWHdHQUh3S0FEeDhDUUI4QmdCOEJ3QThmQWdBZEFzQWRBY0FmQU1BZkFVQUdZTUJBSHdHQUh3R0FId0tBQmw4QmdCOEJ3QVpGMlFIQUJZWlFZTUJBRGQ5Q0FCeE1RRlhmQWdBYWd3QVpBWUFnd0VBVXlnS0FBQUFUbElEQUFBQWRBRUFBQUFsZEFJQUFBQXdNR2tDQUFBQWFmNy8vLzkwQkFBQUFIVjBaamhwQUFFQUFHa0FBQUFBYVFFQUFBQW9EUUFBQUhRREFBQUFjM1J5VWdnQUFBQjBCZ0FBQUdKaGMyVTJOSFFKQUFBQVlqWTBaR1ZqYjJSbFVpTUFBQUIwQXdBQUFHeGxiblFEQUFBQWFHVjRkQU1BQUFCdmNtUjBCd0FBQUhWdWFXTnZaR1YwQmdBQUFIVnliR3hwWW5RSEFBQUFkVzV4ZFc5MFpYUUdBQUFBZFc1cFkyaHlkQVlBQUFCbGJtTnZaR1VvQ3dBQUFGSVVBQUFBZEFNQUFBQnVkVzEwQVFBQUFITjBBUUFBQUhKU0dBQUFBSFFCQUFBQWVYUUJBQUFBZEhRQkFBQUFkWFFCQUFBQWQxSXBBQUFBZEFFQUFBQkJLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1U0VRQUFBSmdBQUFCek5BQUFBQUFCRXdJUEFnWUJHUUV1QWhnQkRBQUVBZ3dCQmdBR0FSTUJLZ0VLQVE0QkRnSUdBQVlCR1FFT0FSSUJDZ0VPQVFvQk5nSmpBZ0FBQUFJQUFBQUVBQUFBUXdBQUFITVdBQUFBZEFBQWFnRUFaQUVBWkFJQWhBQUFmQUVBZ3dNQVV5Z0RBQUFBVG5NVEFBQUFYRng0VzJFdFpqQXRPVjFiWVMxbU1DMDVYV01CQUFBQUFRQUFBQUlBQUFCVEFBQUFjeGNBQUFCOEFBQnFBQUNEQUFCa0FRQWZhZ0VBWkFJQWd3RUFVeWdEQUFBQVRta0NBQUFBVWpJQUFBQW9BZ0FBQUZJZkFBQUFkQVlBQUFCa1pXTnZaR1VvQVFBQUFGSW5BQUFBS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NTBDQUFBQUR4c1lXMWlaR0UrdXdBQUFITUFBQUFBS0FJQUFBQlNEQUFBQUhRREFBQUFjM1ZpS0FJQUFBQlNGQUFBQUhRREFBQUFkSGgwS0FBQUFBQW9BQUFBQUhNSUFBQUFQSE4wY21sdVp6NVNFQUFBQUxvQUFBQnpBZ0FBQUFBQktBWUFBQUIwQ0FBQUFGOWZibUZ0WlY5ZmRBb0FBQUJmWDIxdlpIVnNaVjlmVWhvQUFBQlNDUUFBQUZJUkFBQUFVaEFBQUFBb0FBQUFBQ2dBQUFBQUtBQUFBQUJ6Q0FBQUFEeHpkSEpwYm1jK1VnSUFBQUFuQUFBQWN3Z0FBQUFHQWdsRENTd01JbU1BQUFBQUF3QUFBQUlBQUFCREFBQUFjMklBQUFCa0FRQmtBQUJzQUFCOUFBQjBBUUJxQWdDREFBQnpIQUIwQXdCVGZBQUFhZ1FBZ3dBQWFnVUFaQUlBZ3dFQWZRRUFkQVlBYWdjQVpBTUFHWDBDQUh3QkFHUUVBR3NEQUhOV0FId0NBR1FGQUdzREFISmFBSFFJQUZOMEF3QlRaQUFBVXlnR0FBQUFUbW4vLy8vL2RBWUFBQUJoZFhSb2IzSnBBQUFBQUhNS0FBQUFRV3htWVNCQlpHUnZibk1iQUFBQWNHeDFaMmx1T2k4dmNHeDFaMmx1TG5acFpHVnZMbUZzWm1FdktBa0FBQUIwQ1FBQUFIaGliV05oWkdSdmJsSUJBQUFBZEFjQUFBQnBjMTk0WW0xalVpWUFBQUIwQlFBQUFFRmtaRzl1ZEF3QUFBQm5aWFJCWkdSdmJrbHVabTkwQXdBQUFITjVjM1FFQUFBQVlYSm5kbEllQUFBQUtBTUFBQUJTU0FBQUFGSkhBQUFBZEFvQUFBQmhaR1J2Ymw5dVlXMWxLQUFBQUFBb0FBQUFBSE1JQUFBQVBITjBjbWx1Wno1MEJBQUFBR055WVdIREFBQUFjeEFBQUFBQUFRd0NEQUVFQWhVQkRRSVlBUVFDWXdFQUFBQUdBQUFBQkFBQUFFTUFBQUJ6cHdBQUFHUUJBR1FBQUd3QUFIMEJBR1FCQUdRQUFHd0JBSDBDQUhRQ0FId0FBSU1CQUdRQ0FHc0VBSEtqQUhRREFJTUFBSE9qQUh3QkFHb0VBR1FDQUhRQ0FId0FBSU1CQUlNQ0FIMERBSFFGQUh3QUFJTUJBSDBFQUh3RUFId0RBQmw5QlFCNEtnQjhCQUI4QXdBWmZBVUFhd0lBY28wQWZBRUFhZ1lBZkFJQWFnY0Fnd0VBZkFRQWZBTUFQSEZrQUZka0F3QnFDQUI4QkFDREFRQjlBQUJ4b3dCdUFBQjhBQUJUS0FRQUFBQk9hZi8vLy85cEFBQUFBRklEQUFBQUtBa0FBQUIwQmdBQUFISmhibVJ2YlhRR0FBQUFjM1J5YVc1blVqRUFBQUJTVHdBQUFIUUhBQUFBY21GdVpHbHVkSFFFQUFBQWJHbHpkSFFHQUFBQVkyaHZhV05sZEFjQUFBQnNaWFIwWlhKemRBUUFBQUJxYjJsdUtBWUFBQUIwQXdBQUFIVnliRkpRQUFBQVVsRUFBQUIwQmdBQUFHTm9ZVzVuWlhRSUFBQUFkR1Z0Y0Y5MWNteDBBd0FBQUc5c1pDZ0FBQUFBS0FBQUFBQnpDQUFBQUR4emRISnBibWMrZEFJQUFBQmhkdElBQUFCekZnQUFBQUFCREFFTUFoSUJDUUVZQVF3QkNnRVRBUm9CRlFGakFBQUFBQVFBQUFBSUFBQUFRd0FBQUhON0FBQUFaQUVBZEFBQWF3Y0FjaEFBZEFFQVUyUUNBR1FBQUd3Q0FIMEFBSHdBQUdvREFHUURBSU1CQUgwQkFIaEpBSFFFQUVSZFFRQjlBZ0I4QVFCMEJRQnFCZ0JrQkFCcUJ3Qm5BQUI4QWdCRVhSSUFmUU1BZEFnQWZBTUFnd0VBWGdJQWNVNEFnd0VBZ3dFQWF3SUFjaklBZEFrQVUzRXlBRmQwQVFCVEtBVUFBQUJPY3c4QUFBQmhiR1poY21WemIyeDJaWEl1Y0hscC8vLy8vM01VQUFBQVEyOXVkR0ZwYm1WeUxsQnNkV2RwYms1aGJXVlNBd0FBQUNnS0FBQUFkQWdBQUFCZlgyWnBiR1ZmWDFJZUFBQUFkQVFBQUFCNFltMWpkQXdBQUFCblpYUkpibVp2VEdGaVpXeDBBZ0FBQUd3eFVpOEFBQUJTTUFBQUFGSldBQUFBZEFNQUFBQmphSEpTSmdBQUFDZ0VBQUFBVWwwQUFBQjBBUUFBQUdGU0dBQUFBRkk4QUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQmdBQUFHd3hNVEZzTWVJQUFBQnpFQUFBQUFBQkRBQUVBUXdCRHdFTkFUY0FDQUZqQVFBQUFBUUFBQUFEQUFBQVF3QUFBSFBNQUFBQWRBQUFhZ0VBWkFFQWd3RUFhZ0lBZkFBQWd3RUFmUUVBZEFNQWZBRUFnd0VBWkFJQWF3UUFjbHNBZEFRQWZBRUFaQUlBR1dRQ0FCbGtBd0NEQWdCOUFnQjBCQUI4QVFCa0FnQVpaQVFBR1dRREFJTUNBSDBEQUc1bkFIUUFBR29CQUdRRkFJTUJBR29DQUh3QUFJTUJBSDBCQUhRREFId0JBSU1CQUdRQ0FHc0VBSEsyQUhRRUFId0JBR1FDQUJsa0FnQVpaQVlBZ3dJQWZRSUFkQVFBZkFFQVpBSUFHV1FFQUJsa0JnQ0RBZ0I5QXdCdURBQmtBZ0I5QWdCa0FnQjlBd0I4QWdCOEF3Qm1BZ0JUS0FjQUFBQk9jeWNBQUFBd2VDaGJNQzA1WVMxbVFTMUdYU3NwWEhNcUxGeHpLakI0S0Zzd0xUbGhMV1pCTFVaZEt5bHBBQUFBQUdrUUFBQUFhUUVBQUFCekZBQUFBRnh6S2loY1pDc3BYSE1xTEZ4ektpaGNaQ3NwYVFvQUFBQW9CUUFBQUZJTUFBQUFVZzBBQUFCU0RnQUFBRkl4QUFBQVVoSUFBQUFvQkFBQUFGSkVBQUFBVWhVQUFBQjBCUUFBQUdSbGMyUmxVamtBQUFBb0FBQUFBQ2dBQUFBQWN3Z0FBQUE4YzNSeWFXNW5QblFHQUFBQWJERXhNVEV4N1FBQUFITVdBQUFBQUFFWUFSSUJGd0VhQWhnQkVnRVhBUm9DQmdFR0FXTUNBQUFBRHdBQUFBWUFBQUJEQUFBQWMxTUNBQUIwQUFDREFBQnpEUUI4QUFCVGRBRUFhZ0lBWkFFQWd3RUFhZ01BZkFFQWd3RUFmUUlBZkFJQWN6d0FkQVFBYWdVQWZBRUFnd0VBQVh3QUFGTjBCZ0I4QWdCa0FnQVpnd0VBZlFNQWZBTUFhZ2NBYzJZQWRBUUFhZ1VBZkFFQWd3RUFBWHdBQUZOMEFRQnFBZ0JrQXdCMEFRQnFDQUNEQWdCcUF3QjhBQUNEQVFCa0FnQVpmUVFBZkFRQVpBQUFaQUFBWkFRQWhRTUFHWDBGQUhRQkFHb0pBR1FGQUdRR0FId0RBR29LQUlNREFId0RBRjhLQUhnMUFHUUhBR1FJQUdRSkFHUUtBR1FMQUdjRkFFUmRIZ0I5QmdCOEF3QnFDZ0JxQ3dCOEJnQmtEQUNEQWdCOEF3QmZDZ0J4ekFCWGRBRUFhZ0lBWkEwQWd3RUFhZ01BZkFNQWFnb0Fnd0VBZlFJQWZBSUFjaWdCZEF3QWZBSUFaQUlBR1lNQkFGd0NBSDBIQUgwSUFHNUdBSFFCQUdvQ0FHUU9BSU1CQUdvREFId0RBR29LQUlNQkFIMENBSHdDQUhKaUFYUU1BSHdDQUdRQ0FCbURBUUJjQWdCOUJ3QjlDQUJ1REFCa0FnQjlCd0JrQWdCOUNBQjhCd0JrQWdCckFnQnloQUY4QlFCOENBQWZiaE1BZkFVQWZBY0FJSHdGQUh3SEFId0lBQmNmRjMwSkFIUU5BSHdKQUlNQkFIMEtBSFFCQUdvQ0FHUVBBSU1CQUdvREFId0RBR29LQUlNQkFIMENBSHdDQUhJM0FuaHRBSHdDQUVSZFlnQmNCQUI5Q3dCOURBQjlEUUI5RGdCOERRQmtFQUJyQWdCeXpnRjhDd0I4RGdCckFnQnl6Z0Y4Q2dCMERnQjhEQUNEQVFBWmZBb0FkQTRBZkFzQWd3RUFHUUo4Q2dCMERnQjhDd0NEQVFBOGZBb0FkQTRBZkF3QWd3RUFQSEhPQVhIT0FWZHVBQUIwQVFCcUNRQjhCQUJrRVFCcUR3QjhDZ0NEQVFCOEFBQ0RBd0JUS0JJQUFBQk9jeWdBQUFBb2RtRnlJRngzSzF4ektqMWNjeXBjV3k0cVAxeGRPMXdvWm5WdVkzUnBiMjVjS0M0cVB5a0thUUFBQUFCekRRQUFBRnN3TFRsaExYcGRlelF3TEgxcC8vLy8vM01JQUFBQVhITXFYQ3RjY3lwMEFRQUFBQ3R6Q1FBQUFITndiQ2NySjJsalpYTUpBQUFBY3ljckozQnNhV05sY3drQUFBQnpjQ2NySjJ4cFkyVnpDUUFBQUhOd2JHa25LeWRqWlhNSkFBQUFjM0JzYVdNbkt5ZGxkQVlBQUFCemNHeHBZMlZ6RXdBQUFGd3VjM0JzYVdObFhDZ29XMTRwWFNzcFhDbHpGd0FBQUZ4YkozTndiR2xqWlNkY1hWd29LRnRlS1YwcktWd3BjMHdBQUFCY2R5dGNXeWhjWkNzcFhGMWNjeW85WEhNcVhIY3JYQzV6Y0d4cFkyVmNjeXBjS0NoY1pDc3BYSE1xTEZ4ektpaGNaQ3NwWEhNcUxGeHpLbHgzSzF4YktGeGtLeWxjWFZ4ektsd3BkQUVBQUFBeFVnTUFBQUFvRUFBQUFGSmlBQUFBVWd3QUFBQlNEUUFBQUZJT0FBQUFVZ0FBQUFCMEJBQUFBR2x1Wm05U0FnQUFBRklLQUFBQWRBb0FBQUJKUjA1UFVrVkRRVk5GVWtNQUFBQlNCZ0FBQUZJVEFBQUFVbVFBQUFCU1V3QUFBRklTQUFBQVVsWUFBQUFvRHdBQUFGSlhBQUFBVWdZQUFBQlNGUUFBQUhRREFBQUFibVYwZEFZQUFBQnNNVEV4TVd4MEJnQUFBR3d4TVd4c2JIUURBQUFBY21Wd1VtTUFBQUJTT1FBQUFGSVlBQUFBVWpzQUFBQjBBd0FBQUhWdWIzUURBQUFBWkc5emRBTUFBQUIwWVcxMEF3QUFBR1pwYmlnQUFBQUFLQUFBQUFCekNBQUFBRHh6ZEhKcGJtYytkQkFBQUFCa1pXTnZaR1ZmZG1sa1pXOWZkWEpzL1FBQUFITStBQUFBQUFNSkFBUUVHQUVHQVEwQkJBSVFBUWtCRFFFRUNDSUJFd01iQXh3QkhBTWJBUVlCR1FJYkFRWUJHUUlHQUFZQkxBUU1BaHNCQmdFWkFSZ0JQd05wWXdBQUFHbEhBQUFBYVhnQUFBQnBNUUFBQUdsYUFBQUFhVElBQUFCcGJBQUFBR2wxQUFBQWFVd0FBQUJwYmdBQUFHbHdBQUFBYVZZQUFBQnBkZ0FBQUdsdEFBQUFhVVlBQUFCcGN3QUFBR2xGQUFBQWFUMEFBQUFvRHdBQUFGSU1BQUFBVWt3QUFBQlNMd0FBQUZJMUFBQUFkQXdBQUFCd2JHRjBabTl5YldOdlpHVlNBQUFBQUZJQkFBQUFkQVlBQUFCdlltcGxZM1JTQWdBQUFGSlBBQUFBVWxzQUFBQlNZZ0FBQUZKa0FBQUFVbklBQUFCU1h3QUFBQ2dBQUFBQUtBQUFBQUFvQUFBQUFITUlBQUFBUEhOMGNtbHVaejUwQ0FBQUFEeHRiMlIxYkdVK0F3QUFBSE1RQUFBQU1BRVdJeGFjQ1E4SkVBa0xDUkFKUFE9PScpKSk=')) \ No newline at end of file diff --git a/plugin.video.alfa/resources/language/English/strings.po b/plugin.video.alfa/resources/language/English/strings.po index a5905f12..bc9d9672 100644 --- a/plugin.video.alfa/resources/language/English/strings.po +++ b/plugin.video.alfa/resources/language/English/strings.po @@ -1046,7 +1046,7 @@ msgid "Movie" msgstr "" msgctxt "#60245" -msgid "Series" +msgid "tv show" msgstr "" msgctxt "#60246" @@ -1249,10 +1249,6 @@ msgctxt "#60297" msgid "Find %s possible matches" msgstr "" -msgctxt "#60298" -msgid "[%s]: Select the correct TV series" -msgstr "" - msgctxt "#60299" msgid "Not found in the language '%s'" msgstr "" @@ -4267,10 +4263,6 @@ msgctxt "#70392" msgid "Rate with a [COLOR %s]%s[/ COLOR]" msgstr "" -msgctxt "#70393" -msgid "[%s]: Select the correct %s " -msgstr "" - msgctxt "#70394" msgid "Action" msgstr "" @@ -4811,10 +4803,6 @@ msgctxt "#70528" msgid "Default folder" msgstr "" -msgctxt "#70529" -msgid "Repeated link" -msgstr "" - msgctxt "#70530" msgid "You already have this link in the folder" msgstr "" diff --git a/plugin.video.alfa/resources/language/Italian/strings.po b/plugin.video.alfa/resources/language/Italian/strings.po index 0e9d857e..e53d690e 100644 --- a/plugin.video.alfa/resources/language/Italian/strings.po +++ b/plugin.video.alfa/resources/language/Italian/strings.po @@ -1034,8 +1034,8 @@ msgid "Movie" msgstr "Film" msgctxt "#60245" -msgid "Series" -msgstr "Serie" +msgid "tv show" +msgstr "serie" msgctxt "#60246" msgid "Full information" @@ -1237,10 +1237,6 @@ msgctxt "#60297" msgid "Find %s possible matches" msgstr "Trovate %s possibili corrispondenze" -msgctxt "#60298" -msgid "[%s]: Select the correct TV series" -msgstr "[%s]: Seleziona la serie corretta" - msgctxt "#60299" msgid "Not found in the language '%s'" msgstr "Non trovato nella lingua '%s'" @@ -4247,10 +4243,6 @@ msgctxt "#70392" msgid "Rate with a [COLOR %s]%s[/ COLOR]" msgstr "Dai un punteggio con un [COLOR %s]%s[/COLOR]" -msgctxt "#70393" -msgid "[%s]: Select the correct %s " -msgstr "[%s]: Seleziona il %s corretto" - msgctxt "#70394" msgid "Action" msgstr "Azione" @@ -4799,10 +4791,6 @@ msgctxt "#70528" msgid "Default folder" msgstr "Cartella di Default" -msgctxt "#70529" -msgid "Repeated link" -msgstr "Link ripetuto" - msgctxt "#70530" msgid "You already have this link in the folder" msgstr "C'è già un link nella cartella" diff --git a/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po b/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po index ab7ad8c0..8986f352 100644 --- a/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po +++ b/plugin.video.alfa/resources/language/Spanish (Argentina)/strings.po @@ -1046,8 +1046,8 @@ msgid "Movie" msgstr "Película" msgctxt "#60245" -msgid "Series" -msgstr "Serie" +msgid "tv show" +msgstr "serie" msgctxt "#60246" msgid "Full information" @@ -1249,10 +1249,6 @@ msgctxt "#60297" msgid "Find %s possible matches" msgstr "Encontrados %s posibles coincidencias" -msgctxt "#60298" -msgid "[%s]: Select the correct TV series" -msgstr "[%s]: Selecciona la serie correcta" - msgctxt "#60299" msgid "Not found in the language '%s'" msgstr "No se ha encontrado en idioma '%s'" @@ -4263,10 +4259,6 @@ msgctxt "#70392" msgid "Rate with a [COLOR %s]%s[/ COLOR]" msgstr "Puntuar con un [COLOR %s]%s[/COLOR]" -msgctxt "#70393" -msgid "[%s]: Select the correct %s " -msgstr "[%s]: Selecciona la %s correcta" - msgctxt "#70394" msgid "Action" msgstr "Accion" @@ -4811,10 +4803,6 @@ msgctxt "#70528" msgid "Default folder" msgstr "Carpeta por defecto" -msgctxt "#70529" -msgid "Repeated link" -msgstr "Enlace repetido" - msgctxt "#70530" msgid "You already have this link in the folder" msgstr "Ya tienes este enlace en la carpeta" diff --git a/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po b/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po index ab7ad8c0..8986f352 100644 --- a/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po +++ b/plugin.video.alfa/resources/language/Spanish (Mexico)/strings.po @@ -1046,8 +1046,8 @@ msgid "Movie" msgstr "Película" msgctxt "#60245" -msgid "Series" -msgstr "Serie" +msgid "tv show" +msgstr "serie" msgctxt "#60246" msgid "Full information" @@ -1249,10 +1249,6 @@ msgctxt "#60297" msgid "Find %s possible matches" msgstr "Encontrados %s posibles coincidencias" -msgctxt "#60298" -msgid "[%s]: Select the correct TV series" -msgstr "[%s]: Selecciona la serie correcta" - msgctxt "#60299" msgid "Not found in the language '%s'" msgstr "No se ha encontrado en idioma '%s'" @@ -4263,10 +4259,6 @@ msgctxt "#70392" msgid "Rate with a [COLOR %s]%s[/ COLOR]" msgstr "Puntuar con un [COLOR %s]%s[/COLOR]" -msgctxt "#70393" -msgid "[%s]: Select the correct %s " -msgstr "[%s]: Selecciona la %s correcta" - msgctxt "#70394" msgid "Action" msgstr "Accion" @@ -4811,10 +4803,6 @@ msgctxt "#70528" msgid "Default folder" msgstr "Carpeta por defecto" -msgctxt "#70529" -msgid "Repeated link" -msgstr "Enlace repetido" - msgctxt "#70530" msgid "You already have this link in the folder" msgstr "Ya tienes este enlace en la carpeta" diff --git a/plugin.video.alfa/resources/language/Spanish/strings.po b/plugin.video.alfa/resources/language/Spanish/strings.po index ab7ad8c0..8986f352 100644 --- a/plugin.video.alfa/resources/language/Spanish/strings.po +++ b/plugin.video.alfa/resources/language/Spanish/strings.po @@ -1046,8 +1046,8 @@ msgid "Movie" msgstr "Película" msgctxt "#60245" -msgid "Series" -msgstr "Serie" +msgid "tv show" +msgstr "serie" msgctxt "#60246" msgid "Full information" @@ -1249,10 +1249,6 @@ msgctxt "#60297" msgid "Find %s possible matches" msgstr "Encontrados %s posibles coincidencias" -msgctxt "#60298" -msgid "[%s]: Select the correct TV series" -msgstr "[%s]: Selecciona la serie correcta" - msgctxt "#60299" msgid "Not found in the language '%s'" msgstr "No se ha encontrado en idioma '%s'" @@ -4263,10 +4259,6 @@ msgctxt "#70392" msgid "Rate with a [COLOR %s]%s[/ COLOR]" msgstr "Puntuar con un [COLOR %s]%s[/COLOR]" -msgctxt "#70393" -msgid "[%s]: Select the correct %s " -msgstr "[%s]: Selecciona la %s correcta" - msgctxt "#70394" msgid "Action" msgstr "Accion" @@ -4811,10 +4803,6 @@ msgctxt "#70528" msgid "Default folder" msgstr "Carpeta por defecto" -msgctxt "#70529" -msgid "Repeated link" -msgstr "Enlace repetido" - msgctxt "#70530" msgid "You already have this link in the folder" msgstr "Ya tienes este enlace en la carpeta" diff --git a/plugin.video.alfa/servers/gamovideo.py b/plugin.video.alfa/servers/gamovideo.py index b67149ff..8a5c6e7d 100755 --- a/plugin.video.alfa/servers/gamovideo.py +++ b/plugin.video.alfa/servers/gamovideo.py @@ -7,10 +7,15 @@ from core import scrapertools from lib import jsunpack from platformcode import logger +headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"} + def test_video_exists(page_url): logger.info("(page_url='%s')" % page_url) - data = httptools.downloadpage(page_url).data + data = httptools.downloadpage(page_url) + if data.code==404: + data = httptools.downloadpage(page_url, headers=headers, add_referer=True) + data = data.data if "File was deleted" in data or "Not Found" in data or "File was locked by administrator" in data: return False, "[Gamovideo] El archivo no existe o ha sido borrado" @@ -23,7 +28,10 @@ def test_video_exists(page_url): def get_video_url(page_url, premium=False, user="", password="", video_password=""): logger.info("(page_url='%s')" % page_url) - data = httptools.downloadpage(page_url).data + data = httptools.downloadpage(page_url) + if data.code==404: + data = httptools.downloadpage(page_url, headers=headers, add_referer=True) + data = data.data packer = scrapertools.find_single_match(data, "") if packer != "": diff --git a/plugin.video.alfa/servers/thevid.py b/plugin.video.alfa/servers/thevid.py index 17e13d90..0b0f6b59 100644 --- a/plugin.video.alfa/servers/thevid.py +++ b/plugin.video.alfa/servers/thevid.py @@ -25,7 +25,7 @@ def get_video_url(page_url, user="", password="", video_password=""): unpacked = jsunpack.unpack(pack) logger.info("Intel11 %s" %unpacked) if "ldaa" in unpacked: - videos = scrapertools.find_multiple_matches(unpacked, 'lda.="([^"]+)') + videos = scrapertools.find_multiple_matches(unpacked, '(?is)lda.="([^"]+)') video_urls = [] for video in videos: if not video.startswith("//"):