From 3dc48e2f05d50413085a9f282f08836e4596f8db Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 09:23:39 -0300 Subject: [PATCH 01/14] =?UTF-8?q?fix:=20altera=C3=A7=C3=A3o=20em=20bibliot?= =?UTF-8?q?eca=20main=20e=20cria=C3=A7=C3=A3o=20de=20imagem=20container?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 34 ++++++++++++++++++++++++++++ Dockerfile | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ README.Docker.md | 22 ++++++++++++++++++ compose.yaml | 58 +++++++++++++++++++++++++++++++++++++++++++++++ main.py | 3 ++- requirements.txt | 2 +- src/sumytest.py | 2 +- 7 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 README.Docker.md create mode 100644 compose.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..03a268b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,34 @@ +# Include any files or directories that you don't want to be copied to your +# container here (e.g., local build artifacts, temporary files, etc.). +# +# For more help, visit the .dockerignore file reference guide at +# https://docs.docker.com/go/build-context-dockerignore/ + +**/.DS_Store +**/__pycache__ +**/.venv +**/.classpath +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/bin +**/charts +**/docker-compose* +**/compose.y*ml +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bfb56fb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,59 @@ +# syntax=docker/dockerfile:1 + +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Dockerfile reference guide at +# https://docs.docker.com/go/dockerfile-reference/ + +# Want to help us make this template better? Share your feedback here: https://forms.gle/ybq9Krt8jtBL3iCk7 + +#ARG PYTHON_VERSION=3.13.2 +ARG PYTHON_VERSION=3.12 +FROM python:${PYTHON_VERSION}-slim as base + +# Prevents Python from writing pyc files. +ENV PYTHONDONTWRITEBYTECODE=1 + +# Keeps Python from buffering stdout and stderr to avoid situations where +# the application crashes without emitting any logs due to buffering. +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app + +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt + +RUN apt-get update && \ + apt-get install -y libenchant-2-2 libenchant-2-dev && \ + apt-get clean + +RUN python -m spacy download en_core_web_sm +#RUN python -m spacy download pt_core_news_sm + +# Instalar MongoDB 7.0 no Debian 12 (bookworm) +RUN apt-get update && \ + apt-get install -y gnupg curl && \ + curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc \ + | gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor && \ + echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] http://repo.mongodb.org/apt/debian bookworm/mongodb-org/7.0 main" \ + > /etc/apt/sources.list.d/mongodb-org-7.0.list && \ + apt-get update && \ + apt-get install -y mongodb-org && \ + rm -rf /var/lib/apt/lists/* + + + + +# cria usuário não privilegiado +RUN useradd -m appuser +RUN mkdir -p /data/db && chown -R appuser:appuser /data/db +USER appuser + +# Copy the source code into the container. +COPY . . + +# Expose the port that the application listens on. +EXPOSE 8080 + +# Run the application. +#CMD python run.py & mongod --bind_ip_all +CMD ["sh", "-c", "mongod --dbpath /data/db --bind_ip_all & python run.py"] \ No newline at end of file diff --git a/README.Docker.md b/README.Docker.md new file mode 100644 index 0000000..5eaea0d --- /dev/null +++ b/README.Docker.md @@ -0,0 +1,22 @@ +### Building and running your application + +When you're ready, start your application by running: +`docker compose up --build`. + +Your application will be available at http://localhost:8080. + +### Deploying your application to the cloud + +First, build your image, e.g.: `docker build -t myapp .`. +If your cloud uses a different CPU architecture than your development +machine (e.g., you are on a Mac M1 and your cloud provider is amd64), +you'll want to build the image for that platform, e.g.: +`docker build --platform=linux/amd64 -t myapp .`. + +Then, push it to your registry, e.g. `docker push myregistry.com/myapp`. + +Consult Docker's [getting started](https://docs.docker.com/go/get-started-sharing/) +docs for more detail on building and pushing. + +### References +* [Docker's Python guide](https://docs.docker.com/language/python/) \ No newline at end of file diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..c47ffbf --- /dev/null +++ b/compose.yaml @@ -0,0 +1,58 @@ +# Comments are provided throughout this file to help you get started. +# If you need more help, visit the Docker Compose reference guide at +# https://docs.docker.com/go/compose-spec-reference/ + +# Here the instructions define your application as a service called "server". +# This service is built from the Dockerfile in the current directory. +# You can add other services your application may depend on here, such as a +# database or a cache. For examples, see the Awesome Compose repository: +# https://github.com/docker/awesome-compose +services: + server: + build: + context: . + depends_on: + - mongo + ports: + - 8080:8080 + environment: + - MONGO_URL=mongodb://mongo:27017/meu_banco + mongo: + image: mongo:6 + restart: always + ports: + - "27017:27017" + +# The commented out section below is an example of how to define a PostgreSQL +# database that your application can use. `depends_on` tells Docker Compose to +# start the database before your application. The `db-data` volume persists the +# database data between container restarts. The `db-password` secret is used +# to set the database password. You must create `db/password.txt` and add +# a password of your choosing to it before running `docker compose up`. +# depends_on: +# db: +# condition: service_healthy +# db: +# image: postgres +# restart: always +# user: postgres +# secrets: +# - db-password +# volumes: +# - db-data:/var/lib/postgresql/data +# environment: +# - POSTGRES_DB=example +# - POSTGRES_PASSWORD_FILE=/run/secrets/db-password +# expose: +# - 5432 +# healthcheck: +# test: [ "CMD", "pg_isready" ] +# interval: 10s +# timeout: 5s +# retries: 5 +# volumes: +# db-data: +# secrets: +# db-password: +# file: db/password.txt + diff --git a/main.py b/main.py index efac9f6..591ca28 100644 --- a/main.py +++ b/main.py @@ -8,7 +8,8 @@ from src.database_connectivity import * from datetime import datetime from flask import Flask, render_template, request, send_from_directory, Response, send_file, jsonify -from werkzeug import secure_filename +#from werkzeug import secure_filename +from werkzeug.utils import secure_filename app = Flask(__name__) diff --git a/requirements.txt b/requirements.txt index f1233a3..9e31deb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ flask -sklearn +scikit-learn pymongo numpy scipy diff --git a/src/sumytest.py b/src/sumytest.py index 739481f..a352692 100644 --- a/src/sumytest.py +++ b/src/sumytest.py @@ -8,7 +8,7 @@ import unicodedata import spacy from spacy.lang.en import English -nlp = spacy.load('en') +nlp = spacy.load('en_core_web_sm') import nltk from nltk import word_tokenize from nltk import sent_tokenize From 2720aef35ce44dd4074e38158d3b37f61dc207e5 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 10:41:44 -0300 Subject: [PATCH 02/14] =?UTF-8?q?fix:=20ajuste=20na=20conex=C3=A3o=20com?= =?UTF-8?q?=20banco=20de=20dados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compose.yaml | 57 +++------- main.py | 212 ++++++++++++++++++++++++++--------- requirements.txt | 2 + src/database_connectivity.py | 3 +- 4 files changed, 180 insertions(+), 94 deletions(-) diff --git a/compose.yaml b/compose.yaml index c47ffbf..7c199bd 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,12 +1,3 @@ -# Comments are provided throughout this file to help you get started. -# If you need more help, visit the Docker Compose reference guide at -# https://docs.docker.com/go/compose-spec-reference/ - -# Here the instructions define your application as a service called "server". -# This service is built from the Dockerfile in the current directory. -# You can add other services your application may depend on here, such as a -# database or a cache. For examples, see the Awesome Compose repository: -# https://github.com/docker/awesome-compose services: server: build: @@ -23,36 +14,20 @@ services: ports: - "27017:27017" -# The commented out section below is an example of how to define a PostgreSQL -# database that your application can use. `depends_on` tells Docker Compose to -# start the database before your application. The `db-data` volume persists the -# database data between container restarts. The `db-password` secret is used -# to set the database password. You must create `db/password.txt` and add -# a password of your choosing to it before running `docker compose up`. -# depends_on: -# db: -# condition: service_healthy -# db: -# image: postgres -# restart: always -# user: postgres -# secrets: -# - db-password -# volumes: -# - db-data:/var/lib/postgresql/data -# environment: -# - POSTGRES_DB=example -# - POSTGRES_PASSWORD_FILE=/run/secrets/db-password -# expose: -# - 5432 -# healthcheck: -# test: [ "CMD", "pg_isready" ] -# interval: 10s -# timeout: 5s -# retries: 5 -# volumes: -# db-data: -# secrets: -# db-password: -# file: db/password.txt + processor: + build: + context: . + command: ["python", "processor.py"] + depends_on: + - mongo + environment: + - MONGO_URL=mongodb://mongo:27017/meu_banco + summary-processor: + build: + context: . + command: ["python", "summary_processor.py"] + depends_on: + - mongo + environment: + - MONGO_URL=mongodb://mongo:27017/meu_banco \ No newline at end of file diff --git a/main.py b/main.py index 591ca28..14f9b15 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,8 @@ import json import os import re -import pprint +#import pprint +import traceback import zipfile from collections import defaultdict from src.database_connectivity import * @@ -81,35 +82,85 @@ def get_data(): print ("get_data is being called") try: + form = request.form.to_dict() + print("DEBUG form recebido:", form) + print("CWD:", os.getcwd()) + json_obj = {} - json_obj['model_name'] = request.form['model'] - json_obj["topic_name"] = [request.form['topic']] + # Campos obrigatórios + model_name = form.get('model') + topic1 = form.get('topic') + + if not model_name: + return jsonify({"error": True, "message": "Campo 'model' é obrigatório"}), 400 + if not topic1: + return jsonify({"error": True, "message": "Campo 'topic' é obrigatório"}), 400 + + json_obj['model_name'] = model_name + json_obj["topic_name"] = [topic1] json_obj["subtopics"] = [] - if request.form['topic2']: - json_obj["topic_name"].append(request.form['topic2']) - if request.form['topic3']: - json_obj["topic_name"].append(request.form['topic3']) - num_subtopics = int(request.form['youcantseeme']) + # Campos opcionais: topic2 e topic3 + topic2 = form.get('topic2') + if topic2: + json_obj["topic_name"].append(topic2) + + topic3 = form.get('topic3') + if topic3: + json_obj["topic_name"].append(topic3) + + # Quantidade de subtopics + raw_num = form.get('youcantseeme', '0') + try: + num_subtopics = int(raw_num) + except ValueError: + return jsonify({"error": True, "message": "Campo 'youcantseeme' deve ser um inteiro"}), 400 + + # Monta lista de subtopics for i in range(num_subtopics): - subtopic_i = {} - if request.form["subtopic"+str(i)]: - subtopic_i["subtopic_name"] = request.form["subtopic"+str(i)] - subtopic_i["keywords"] = [re.sub('[^A-Za-z0-9 ]+', '', x.strip()) for x in request.form["keywords"+str(i)].split(',')] + sub_name = form.get(f"subtopic{i}") + keywords_raw = form.get(f"keywords{i}") + + if sub_name and keywords_raw: + subtopic_i = { + "subtopic_name": sub_name, + "keywords": [ + re.sub(r'[^A-Za-z0-9 ]+', '', x.strip()) + for x in keywords_raw.split(',') + if x.strip() + ] + } json_obj["subtopics"].append(subtopic_i) - print (os.getcwd()) - model_name = json_obj["model_name"] - output_model_file_name = "model_"+json_obj["topic_name"][0].replace(" ","_")+"_"+datetime.now().strftime('%Y-%m-%d_%H_%M_%S')+".pkl" + print("JSON de entrada montado:", json_obj) + + # Gera nome do arquivo do modelo + output_model_file_name = "model_" + json_obj["topic_name"][0].replace(" ", "_") + \ + "_" + datetime.now().strftime('%Y-%m-%d_%H_%M_%S') + ".pkl" timestamp = datetime.now() - collection.insert({"input": json_obj, "model_name": model_name, "output_model_file": output_model_file_name , "timestamp" : timestamp, "status": "Queued"}) - print ("all working done") + # IMPORTANTE: garantir que 'collection' está definido antes + # Exemplo: + # from pymongo import MongoClient + # client = MongoClient("mongodb://mongo:27017/") + # db = client["seu_banco"] + # collection = db["sua_colecao"] + + result = collection.insert_one({ + "input": json_obj, + "model_name": model_name, + "output_model_file": output_model_file_name, + "timestamp": timestamp, + "status": "Queued" + }) + + print("all working done, inserted id:", result.inserted_id) - return Response(json.dumps({'success':True}),200,{'contentType' : 'application/json'}) + return Response(json.dumps({'success': True}), 200, {'contentType': 'application/json'}) except: + traceback.print_exc() return json.dumps({'error': False}), 500, {'contentType': 'application/json'} @@ -128,42 +179,103 @@ def get_models(): models = [] cursor = collection.find({"status": "Done"}) for document in cursor: - models.append([document["model_name"], document["output_model_file"], document['timestamp'].strftime('%Y-%m-%d %H:%M:%S')]) + ts = document.get('timestamp') + ts_str = ts.strftime('%Y-%m-%d %H:%M:%S') if ts else None - model_json = json.dumps(models) - return model_json + models.append({ + "label": document["model_name"], + # É ISSO que o /create_summary vai receber em request.form['model'] + "value": f'{document["model_name"]}, {document["output_model_file"]}', + "file": document["output_model_file"], + "timestamp": ts_str + }) @app.route('/create_summary',methods = ['POST']) def upload_file(): try: - try: - model = request.form.get('model') - model_name = " ".join(model.split(",")[:-1]).strip() - model_file_name = model.split(",")[-1].strip()#storing the model name with the model's creation date - file = request.files['file']#storing the zipped files - filename = secure_filename(file.filename)#storing the name of the zipped folder - - except Exception as e: - print (e) - if filename.endswith('.zip'): - if not os.path.isdir('Data'): - os.mkdir('Data') - summary_filename = "summary_json_"+ datetime.now().strftime("%Y-%m-%d_%H-%M-%S") +".json" - folder_name = "text_files_"+datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - file_path = os.path.join(os.getcwd(),"Data",folder_name) - os.mkdir(file_path) - file.save(filename) - upload_input_files(filename, file_path) - timestamp = datetime.now() - summary_collection.insert({"file_path": file_path, "summary_filename": summary_filename, "model_name": model_name, "model_file_name": model_file_name , "status": "Queued", "timestamp": timestamp}) - - return Response(json.dumps({'success': True}), 200, {'contentType': 'application/json'}) - else: - return Response(json.dumps({'error': False}),400 , {'contentType': 'application/json'}) - except: + # --------- MODEL ---------- + raw_model = request.form.get('model', '').strip() + if not raw_model: + print('Campo "model" veio vazio ou não foi enviado') + return Response( + json.dumps({'error': True, 'message': 'Campo "model" é obrigatório.'}), + 400, + {'contentType': 'application/json'} + ) + + parts = [p.strip() for p in raw_model.split(',') if p.strip()] + if len(parts) < 2: + print('Formato de "model" inválido:', raw_model) + return Response( + json.dumps({'error': True, 'message': 'Formato de "model" inválido. Use: "nome do modelo, arquivo.pkl".'}), + 400, + {'contentType': 'application/json'} + ) + + model_name = " ".join(parts[:-1]) + model_file_name = parts[-1] + + # --------- ARQUIVO ---------- + if 'file' not in request.files: + print('Nenhum arquivo "file" enviado no form') + return Response( + json.dumps({'error': True, 'message': 'Nenhum arquivo enviado.'}), + 400, + {'contentType': 'application/json'} + ) + + file = request.files['file'] + filename = secure_filename(file.filename or '') + + if not filename: + print('Filename vazio') + return Response( + json.dumps({'error': True, 'message': 'Nome de arquivo inválido.'}), + 400, + {'contentType': 'application/json'} + ) + + if not filename.endswith('.zip'): + print('Arquivo não é zip:', filename) + return Response( + json.dumps({'error': True, 'message': 'Apenas arquivos .zip são aceitos.'}), + 400, + {'contentType': 'application/json'} + ) + + # --------- PROCESSA ZIP ---------- + if not os.path.isdir('Data'): + os.mkdir('Data') + + summary_filename = "summary_json_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".json" + folder_name = "text_files_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + file_path = os.path.join(os.getcwd(), "Data", folder_name) + os.mkdir(file_path) + + file.save(filename) + upload_input_files(filename, file_path) - return Response(json.dumps({'error': False}), 500, {'contentType': 'application/json'}) + timestamp = datetime.now() + summary_collection.insert({ + "file_path": file_path, + "summary_filename": summary_filename, + "model_name": model_name, + "model_file_name": model_file_name, + "status": "Queued", + "timestamp": timestamp + }) + return Response(json.dumps({'success': True}), 200, {'contentType': 'application/json'}) + + except Exception as e: + import traceback + print('Erro em /create_summary:', e) + traceback.print_exc() + return Response( + json.dumps({'error': True, 'message': str(e)}), + 500, + {'contentType': 'application/json'} + ) @app.route('/summary_status') def get_summary_status(): @@ -209,8 +321,4 @@ def upload_input_files(filename, file_path): print (e) for name in dirs: os.rmdir(os.path.join(root, name)) - os.remove(filename) - - -# if __name__ == '__main__': -# app.run(debug=True, port=8080, host='0.0.0.0', use_reloader=False) + os.remove(filename) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 9e31deb..3fc11e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,5 @@ BeautifulSoup4 gensim unidecode sumy +lxml +lxml_html_clean \ No newline at end of file diff --git a/src/database_connectivity.py b/src/database_connectivity.py index af00069..9e1822a 100644 --- a/src/database_connectivity.py +++ b/src/database_connectivity.py @@ -3,12 +3,13 @@ import os try: + MONGO_URL = os.environ.get("MONGO_URL", "mongodb://mongo:27017/meu_banco") if os.system("grep mongod") != 256: pass else: os.system("service mongod start") - client = MongoClient() + client = MongoClient(MONGO_URL) db = client.classifier_database collection = db.model_jobs summary_collection = db.summary_jobs From 93756362c304bc3ba81f9c45010d822cc02bafff Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 12:28:42 -0300 Subject: [PATCH 03/14] fix: ajustes no processor, summary e sumytest --- Dockerfile | 3 + compose.yaml | 3 + processor.py | 9 +- src/database_connectivity.py | 3 +- src/lsi_model.py | 48 ++++++++ src/process.py | 5 +- src/sumytest.py | 205 +++++++++++++++++++++++++++++++---- summary_processor.py | 10 +- 8 files changed, 256 insertions(+), 30 deletions(-) create mode 100644 src/lsi_model.py diff --git a/Dockerfile b/Dockerfile index bfb56fb..33adce1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,6 +20,9 @@ ENV PYTHONUNBUFFERED=1 WORKDIR /app COPY requirements.txt ./ + +RUN pip install --upgrade pip + RUN pip install --no-cache-dir -r requirements.txt RUN apt-get update && \ diff --git a/compose.yaml b/compose.yaml index 7c199bd..9ef31f7 100644 --- a/compose.yaml +++ b/compose.yaml @@ -20,6 +20,7 @@ services: command: ["python", "processor.py"] depends_on: - mongo + - server environment: - MONGO_URL=mongodb://mongo:27017/meu_banco @@ -29,5 +30,7 @@ services: command: ["python", "summary_processor.py"] depends_on: - mongo + - server + - processor environment: - MONGO_URL=mongodb://mongo:27017/meu_banco \ No newline at end of file diff --git a/processor.py b/processor.py index 79d294a..60d0fb6 100644 --- a/processor.py +++ b/processor.py @@ -51,14 +51,17 @@ def run_job(job): def processNextJob(): print('fetching job') - job = getJob()#job is a group of jobs that have the 'Queued' status in the database - jobs_len = job.count() + #job = getJob() #job is a group of jobs that have the 'Queued' status in the database + job_cursor = getJob() # ainda é um Cursor + jobs = list(job_cursor) # transforma em lista + #jobs_len = job.count() + jobs_len = len(jobs) if jobs_len == 0:#excecuted once there are no more 'Queued' jobs in the database print('no more jobs to process') return jobs_len else: - run_job(job) + run_job(jobs) return jobs_len diff --git a/src/database_connectivity.py b/src/database_connectivity.py index 9e1822a..8bee1f1 100644 --- a/src/database_connectivity.py +++ b/src/database_connectivity.py @@ -8,7 +8,8 @@ if os.system("grep mongod") != 256: pass else: - os.system("service mongod start") + # os.system("service mongod start") + print("Falha no acesso ao mongo DB") client = MongoClient(MONGO_URL) db = client.classifier_database collection = db.model_jobs diff --git a/src/lsi_model.py b/src/lsi_model.py new file mode 100644 index 0000000..e3ef917 --- /dev/null +++ b/src/lsi_model.py @@ -0,0 +1,48 @@ +import re +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.decomposition import TruncatedSVD +from sklearn.preprocessing import Normalizer +from sklearn.pipeline import make_pipeline +from sklearn.metrics.pairwise import cosine_similarity + +def clean_text(text): + return " ".join(re.findall(r"\b\w+\b", text.lower())) + +class LSIModel: + def __init__(self, num_topics=100, language="english"): + self.num_topics = num_topics + self.language = language + + # pipeline TF-IDF → SVD → Normalização (igual ao gensim) + self.vectorizer = TfidfVectorizer(stop_words=language) + self.svd = TruncatedSVD(n_components=num_topics) + self.pipeline = make_pipeline(self.svd, Normalizer(copy=False)) + + self.lsi_matrix = None + self.documents = None + + def fit(self, documents): + cleaned = [clean_text(d) for d in documents] + self.documents = cleaned + + tfidf = self.vectorizer.fit_transform(cleaned) + self.lsi_matrix = self.pipeline.fit_transform(tfidf) + + def transform(self, text): + clean_t = clean_text(text) + vec = self.vectorizer.transform([clean_t]) + return self.pipeline.transform(vec)[0] + + def similarity(self, query): + q_vec = self.transform(query) + sims = cosine_similarity([q_vec], self.lsi_matrix)[0] + return sims + + def most_similar(self, query, topn=5): + scores = self.similarity(query) + ranked = sorted( + enumerate(scores), + key=lambda x: x[1], + reverse=True + ) + return ranked[:topn] \ No newline at end of file diff --git a/src/process.py b/src/process.py index 18cac5d..e58642f 100644 --- a/src/process.py +++ b/src/process.py @@ -12,9 +12,10 @@ from src import spell_check from src.sumytest import * -geolocator = Nominatim() +#geolocator = Nominatim() +geolocator = Nominatim(user_agent="summary-processor") -nlp = spacy.load('en') +nlp = spacy.load('en_core_web_sm') a, b = None, None entity_types_non_loc = ['PERSON', "ORG", "PRODUCT", "EVENT", "WORK_OF_ART", "LANGUAGE", "NORP"] entity_types_loc = ["LOC", "GPE"] diff --git a/src/sumytest.py b/src/sumytest.py index a352692..505c989 100644 --- a/src/sumytest.py +++ b/src/sumytest.py @@ -1,17 +1,14 @@ from __future__ import absolute_import from __future__ import division, print_function, unicode_literals + from unidecode import unidecode -import sys, traceback -import unicodedata -import codecs -import requests + +import sys, traceback, unicodedata, codecs, requests import unicodedata import spacy from spacy.lang.en import English nlp = spacy.load('en_core_web_sm') -import nltk -from nltk import word_tokenize -from nltk import sent_tokenize + from sumy.parsers.html import HtmlParser from sumy.parsers.plaintext import PlaintextParser from sumy.nlp.tokenizers import Tokenizer @@ -21,23 +18,88 @@ from sumy.utils import get_stop_words from sumy.summarizers.luhn import LuhnSummarizer from sumy.summarizers.edmundson import EdmundsonSummarizer + +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import cosine_similarity + +import numpy as np + +from src.lsi_model import LSIModel + +import pickle + import logging -import nltk, re, pprint +import nltk, re, os from nltk import word_tokenize from nltk import sent_tokenize -from gensim.summarization import keywords -from gensim.summarization import summarize -from gensim import corpora, models, similarities -from collections import defaultdict -from nltk.tokenize import sent_tokenize -import os + + +#from gensim.summarization import keywords +#from gensim.summarization import summarize +#from gensim import corpora, models, similarities +from collections import defaultdict, Counter import tempfile -from pprint import pprint sentencess=[] compare=[] LANGUAGE = "english" +###### PARTE UM DO AJUSTE +def save_corpus(path, corpus): + with open(path, "wb") as f: + pickle.dump(corpus, f) + +def load_corpus(path): + with open(path, "rb") as f: + return pickle.load(f) + +def query_with_cosine(query_vec, docs_matrix, topn=10): + # query_vec: (1, dim) | docs_matrix: (n_docs, dim) + sims = cosine_similarity(query_vec, docs_matrix)[0] # (n_docs,) + top_idx = np.argsort(-sims)[:topn] + return list(zip(top_idx, sims[top_idx])) + +def tokenize(text): + return re.findall(r'\b\w+\b', text.lower()) + +###### REMOÇÃO DO GENSIM +def get_keywords(text: str, topn: int = 10, language: str = LANGUAGE): + """ + Extrai palavras-chave usando TF-IDF em um único documento. + Retorna lista de strings (keywords). + """ + if not text or not text.strip(): + return [] + + vectorizer = TfidfVectorizer(stop_words=language) + tfidf = vectorizer.fit_transform([text]) + scores = tfidf.toarray()[0] + terms = np.array(vectorizer.get_feature_names_out()) + + if len(terms) == 0: + return [] + + topn = min(topn, len(terms)) + top_idx = np.argsort(-scores)[:topn] + return terms[top_idx].tolist() + +def keywords(text, words=10, split=True, language: str = LANGUAGE): + kws = get_keywords(text, topn=words, language=language) + return kws if split else "\n".join(kws) + +#def build_model(texts): +# vectorizer = TfidfVectorizer(stop_words='english') +# tfidf_matrix = vectorizer.fit_transform(texts) +# return vectorizer, tfidf_matrix + +#def build_index(matrix): +# """ +# matrix: ndarray (n_docs, dim) +# retorna matriz normalizada igual ao MatrixSimilarity +# """ +# norms = np.linalg.norm(matrix, axis=1, keepdims=True) +# return matrix / (norms + 1e-10) +''' def get_summary(textss , truereq, numofsent): output_sentences = [] hold='' @@ -57,6 +119,7 @@ def get_summary(textss , truereq, numofsent): summalen=len(documents)#storing the number of sentences stoplist = set('for a of the and to in'.split()) + for sentence in summarizer(parser.document,numofsent): hold=str(sentence) ttt=nltk.word_tokenize(hold) @@ -80,16 +143,16 @@ def get_summary(textss , truereq, numofsent): for text in texts]#storing an array of words that occur more than once - dictionary = corpora.Dictionary(texts)#storing a map of words + dictionary = tokenize(texts)#storing a map of words dictionary.save(os.path.join(TEMP_FOLDER, 'deerwester.dict')) new_doc = str(textss.encode('utf-8'))#storing the utf-8 version of textss (original) new_vec = dictionary.doc2bow(new_doc.lower().split())#converting the utf-8 econded textss into a bag-of-words format = list of (token_id, token_count) 2-tuples. Each word is assumed to be a tokenized and normalized string (either unicode or utf8-encoded). corpus = [dictionary.doc2bow(text) for text in texts]#applying doc2bow to texts(list of words that occur more than once) save into an array - corpora.MmCorpus.serialize(os.path.join(TEMP_FOLDER, 'deerwester.mm'), corpus) - dictionary = corpora.Dictionary.load( os.path.join(TEMP_FOLDER, 'deerwester.dict')) - corpus = corpora.MmCorpus(os.path.join(TEMP_FOLDER, 'deerwester.mm')) - lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2) + save_corpus(os.path.join(TEMP_FOLDER, 'deerwester.mm'), corpus) + dictionary = tokenize.load( os.path.join(TEMP_FOLDER, 'deerwester.dict')) + corpus = load_corpus(os.path.join(TEMP_FOLDER, 'deerwester.mm')) + lsi = LSIModel(corpus, id2word=dictionary, num_topics=2) doc = str(textss.encode('utf-8')) vec_bow = dictionary.doc2bow(doc.lower().split()) vec_lsi = lsi[vec_bow]#converting the query to LSI space @@ -134,3 +197,105 @@ def get_summary(textss , truereq, numofsent): del sentencess[indexes] del compare[indexes] return output_sentences +''' + +def get_summary(textss, truereq, numofsent): + """ + textss : texto completo + truereq : número de sentenças que você realmente quer no resultado final + numofsent: número de sentenças que o Sumy vai gerar como candidatos + """ + if not textss or not textss.strip(): + return [] + + # 1) Keywords do texto inteiro + # (ajuste 'words' se quiser mais/menos keywords) + kw_list = keywords(textss, words=20, split=True) + kw_set = set(kw_list) + + # 2) Candidatos iniciais com Sumy (LSA) + parser = PlaintextParser.from_string(textss, Tokenizer(LANGUAGE)) + stemmer = Stemmer(LANGUAGE) + summarizer = Summarizer(stemmer) + summarizer.stop_words = get_stop_words(LANGUAGE) + + # Sentenças originais + documents = sent_tokenize(textss) + summalen = len(documents) + + candidate_sentences = [] + candidate_scores = [] + + for sentence in summarizer(parser.document, numofsent): + s_text = str(sentence) + tokens = [t.lower() for t in word_tokenize(s_text)] + score = sum(1 for t in tokens if t in kw_set) + candidate_sentences.append(s_text) + candidate_scores.append(score) + + # 3) Complementar com sentenças mais similares ao texto completo via TF-IDF + # (sem LSI, sem MatrixSimilarity) + if summalen > 0: + # TF-IDF por sentença + vectorizer = TfidfVectorizer(stop_words="english") + tfidf_matrix = vectorizer.fit_transform(documents) # (n_docs, dim) + + # Vetor do documento completo + full_doc_vec = vectorizer.transform([textss]) # (1, dim) + + # Similaridade de cosseno texto completo x sentenças + sims = cosine_similarity(full_doc_vec, tfidf_matrix)[0] # (n_docs,) + + # Pega as top sentenças mais similares + order = np.argsort(-sims) + extra_sentences = [] + extra_scores = [] + + for idx in order: + s_text = documents[idx] + if s_text in candidate_sentences: + continue # já está nos candidatos Sumy + + tokens = [t.lower() for t in word_tokenize(s_text)] + kw_score = sum(1 for t in tokens if t in kw_set) + extra_sentences.append(s_text) + extra_scores.append(kw_score) + + if len(extra_sentences) >= numofsent: + break + + candidate_sentences.extend(extra_sentences) + candidate_scores.extend(extra_scores) + + # 4) Agora faz o filtro gramatical com spaCy, + # priorizando sentenças com mais overlap de keywords + output_sentences = [] + i = 0 + + while i < truereq and candidate_sentences: + # acha sentença com maior score + best_idx = int(np.argmax(candidate_scores)) + best_sentence = candidate_sentences[best_idx] + best_score = candidate_scores[best_idx] + + # se score é 0, provavelmente o resto não é tão relevante + if best_score == 0 and output_sentences: + break + + # Analisa sujeito com spaCy + doc = nlp(best_sentence) + subjects = [w.text.lower() for w in doc if w.dep_ == "nsubj"] + + # Regras parecidas com o seu código original + if subjects: + subj = subjects[0] + if subj not in ("they", "their", "both", "these", "this"): + if best_sentence.count(",") < 7: + output_sentences.append(best_sentence) + i += 1 + + # remove a sentença usada + del candidate_sentences[best_idx] + del candidate_scores[best_idx] + + return output_sentences diff --git a/summary_processor.py b/summary_processor.py index f8c12c0..7c2ed5f 100644 --- a/summary_processor.py +++ b/summary_processor.py @@ -8,7 +8,6 @@ def getJob(): - result = summary_collection.find( { 'status': "Queued" } ).limit( 1 ) return result @@ -51,14 +50,17 @@ def run_job(job): def processNextJob(): print('fetching job') - job = getJob() - jobs_len = job.count() + #job = getJob() #job is a group of jobs that have the 'Queued' status in the database + job_cursor = getJob() # ainda é um Cursor + jobs = list(job_cursor) # transforma em lista + #jobs_len = job.count() + jobs_len = len(jobs) if jobs_len == 0: print('no more jobs to process') return jobs_len else: - run_job(job) + run_job(jobs) return jobs_len while(True): From b1209335c801cd81aec28e1b2e0496824883ae2f Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 12:35:30 -0300 Subject: [PATCH 04/14] =?UTF-8?q?fix:=20fun=C3=A7=C3=A3o=20update=20desatu?= =?UTF-8?q?alizada=20para=20a=20vers=C3=A3o=20do=20python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- processor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/processor.py b/processor.py index 60d0fb6..4891489 100644 --- a/processor.py +++ b/processor.py @@ -16,8 +16,7 @@ def getJob(): return result def updateJobStatus(jobid, status): - - collection.update( + collection.update_one( {"_id": jobid}, { "$set": { From 59e795827eef5b7fe33e4782f0e3d56050eebbe8 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 12:37:25 -0300 Subject: [PATCH 05/14] =?UTF-8?q?fix:=20ajuste=20de=20summary=20a=20vers?= =?UTF-8?q?=C3=A3o=20do=20Python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- summary_processor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/summary_processor.py b/summary_processor.py index 7c2ed5f..91d77fe 100644 --- a/summary_processor.py +++ b/summary_processor.py @@ -12,8 +12,7 @@ def getJob(): return result def updateJobStatus(jobid, status): - - summary_collection.update( + summary_collection.update_one( {"_id": jobid}, { "$set": { From 977691f28e9a9455f77a46b5e83e804d2e671829 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 14:24:31 -0300 Subject: [PATCH 06/14] =?UTF-8?q?fix:=20atualiza=C3=A7=C3=A3o=20de=20probl?= =?UTF-8?q?ema=20no=20processo=20de=20pesquisa=20do=20Google?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 8 + _google_/__init__.py | 38 ++++ requirements.txt | 3 +- src/SimpleDictionary.py | 44 +++++ src/search_data.py | 97 ++++++++-- src/sumytest-old.py | 305 ++++++++++++++++++++++++++++++++ src/sumytest.py | 381 +++++++++++++++------------------------- 7 files changed, 622 insertions(+), 254 deletions(-) create mode 100644 src/SimpleDictionary.py create mode 100644 src/sumytest-old.py diff --git a/.dockerignore b/.dockerignore index 03a268b..feb80fa 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,6 +7,7 @@ **/.DS_Store **/__pycache__ **/.venv +**/env **/.classpath **/.dockerignore **/.env @@ -32,3 +33,10 @@ **/values.dev.yaml LICENSE README.md +txt.zip +README-EN.md +README.Docker.md +LICENSE.md +CONTRIBUTING-EN.md +CONTRIBUTING.md +CODE-OF-CONDUCT.md \ No newline at end of file diff --git a/_google_/__init__.py b/_google_/__init__.py index f77a465..ea7f81d 100644 --- a/_google_/__init__.py +++ b/_google_/__init__.py @@ -308,6 +308,7 @@ def search(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, soup = BeautifulSoup(html, 'html.parser') else: soup = BeautifulSoup(html) + ''' anchors = soup.find(id='search').findAll('a') for a in anchors: @@ -334,6 +335,43 @@ def search(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, continue hashes.add(h) + # Yield the result. + yield link + ''' + + search_container = soup.find(id='search') + + if search_container is not None: + anchors = search_container.find_all('a') + else: + # fallback: se não tiver #search (layout diferente, captcha, etc), + # pega todos da página + anchors = soup.find_all('a') + + for a in anchors: + + # Leave only the "standard" results if requested. + # Otherwise grab all possible links. + if only_standard and (not a.parent or a.parent.name.lower() != "h3"): + continue + + # Get the URL from the anchor tag. + try: + link = a['href'] + except KeyError: + continue + + # Filter invalid links and links pointing to Google itself. + link = filter_result(link) + if not link: + continue + + # Discard repeated results. + h = hash(link) + if h in hashes: + continue + hashes.add(h) + # Yield the result. yield link diff --git a/requirements.txt b/requirements.txt index 3fc11e7..6e47787 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,5 @@ gensim unidecode sumy lxml -lxml_html_clean \ No newline at end of file +lxml_html_clean +googlesearch-python \ No newline at end of file diff --git a/src/SimpleDictionary.py b/src/SimpleDictionary.py new file mode 100644 index 0000000..d220024 --- /dev/null +++ b/src/SimpleDictionary.py @@ -0,0 +1,44 @@ +import pickle +from collections import defaultdict + +class SimpleDictionary: + def __init__(self, docs=None): + self.token2id = {} + self.id2token = {} + self.doc_freq = defaultdict(int) + + if docs: + self.build(docs) + + def build(self, docs): + # docs = lista de listas: [[word1, word2], [word3, word1], ...] + for doc in docs: + for token in set(doc): + self.doc_freq[token] += 1 + for token in doc: + if token not in self.token2id: + idx = len(self.token2id) + self.token2id[token] = idx + self.id2token[idx] = token + + def doc2bow(self, words): + """Converte lista de palavras para Bag-of-Words: [(id, freq)]""" + freq = defaultdict(int) + for w in words: + if w in self.token2id: + freq[self.token2id[w]] += 1 + return list(freq.items()) + + def save(self, path): + with open(path, "wb") as f: + pickle.dump((self.token2id, self.id2token, dict(self.doc_freq)), f) + + @staticmethod + def load(path): + with open(path, "rb") as f: + token2id, id2token, doc_freq = pickle.load(f) + dic = SimpleDictionary() + dic.token2id = token2id + dic.id2token = id2token + dic.doc_freq = defaultdict(int, doc_freq) + return dic diff --git a/src/search_data.py b/src/search_data.py index def140f..3eae6d8 100644 --- a/src/search_data.py +++ b/src/search_data.py @@ -1,11 +1,12 @@ -from _google_ import search +#from _google_ import search +from googlesearch import search from urllib.request import urlopen from bs4 import BeautifulSoup import re import logging -def get_text_from_url(response): +'''def get_text_from_url(response): try: soup = BeautifulSoup(response, "html.parser") text = " " @@ -14,10 +15,38 @@ def get_text_from_url(response): text = ''.join(p.text.strip() for p in all_paras) except Exception as e: pass - return text + return text''' + +def get_text_from_url(response): + try: + # Se por algum motivo vier None, já evita erro + if response is None: + return "" + # Lê o conteúdo da resposta + html = response.read() + if not html: + return "" -def google_search_query(query): + # Garante que estamos passando string/bytes para o BS + soup = BeautifulSoup(html, "html.parser") + if soup is None: # extra segurança + return "" + + paragraphs = soup.find_all("p") + if not paragraphs: + return "" + + text = " ".join(p.get_text(strip=True) for p in paragraphs) + # normaliza espaços + text = re.sub(r"\s+", " ", text) + return text + except Exception as e: + # por enquanto loga o erro pra debug + print("Erro em get_text_from_url:", e, type(response)) + return "" + +'''def google_search_query(query): subtopic_text = "" for url in search(query, stop=20): try: @@ -32,25 +61,61 @@ def google_search_query(query): except Exception as e: pass return subtopic_text +''' + +def google_search_query(query): + subtopic_text = "" + for url in search(query, stop=20): + try: + response = urlopen(url) + content_type = response.getheader("Content-Type") or "" + mime_type = re.sub(r";.*", "", content_type) + + if mime_type != "application/pdf": + page_text = get_text_from_url(response).strip() + if page_text: + subtopic_text += " " + page_text + subtopic_text = re.sub(r"[^A-Za-z0-9]+", " ", subtopic_text) + except Exception as e: + # enquanto você está debugando, é bom ver qual URL quebra + print("Erro ao processar URL:", url, "->", e) + return subtopic_text + + +#def generate_search_query(topic_names, keywords): +# query = "(" +# for i in range(len(keywords)-1): +# #concatenating the keywords with 'or' +# query = query + keywords[i].lower() + " or " +# query = query + keywords[len(keywords)-1].lower() + ") and (" +# '''Starts new code''' +# logging.debug("Query:") +# logging.debug(query) +# '''Ends new code''' +# +# for i in range(len(topic_names)-1): +# query = query + topic_names[i].lower() + " or " +# +# query = query + topic_names[len(topic_names)-1].lower() + ")" +# print("Query: ", query) +# return query#concatenating the keywords with the topic, e.g.: keywords = [racing, homing]; topic = [birds] i.e. query = '(racing or homing) and (birds)' def generate_search_query(topic_names, keywords): - query = "(" - for i in range(len(keywords)-1): - #concatenating the keywords with 'or' - query = query + keywords[i].lower() + " or " - query = query + keywords[len(keywords)-1].lower() + ") and (" - '''Starts new code''' + if not keywords: + # fallback simples: usa só os topics + base = " or ".join(t.lower() for t in topic_names) + query = f"({base})" + print("Query (sem keywords):", query) + return query + + query = "(" + " or ".join(k.lower() for k in keywords) + ") and (" logging.debug("Query:") logging.debug(query) - '''Ends new code''' - - for i in range(len(topic_names)-1): - query = query + topic_names[i].lower() + " or " - query = query + topic_names[len(topic_names)-1].lower() + ")" + query += " or ".join(t.lower() for t in topic_names) + ")" print("Query: ", query) - return query#concatenating the keywords with the topic, e.g.: keywords = [racing, homing]; topic = [birds] i.e. query = '(racing or homing) and (birds)' + return query def get_data(topics): diff --git a/src/sumytest-old.py b/src/sumytest-old.py new file mode 100644 index 0000000..a312b9b --- /dev/null +++ b/src/sumytest-old.py @@ -0,0 +1,305 @@ +from __future__ import absolute_import +from __future__ import division, print_function, unicode_literals + +from unidecode import unidecode + +import sys, traceback, unicodedata, codecs, requests +import unicodedata +import spacy +from spacy.lang.en import English +nlp = spacy.load('en_core_web_sm') + +from sumy.parsers.html import HtmlParser +from sumy.parsers.plaintext import PlaintextParser +from sumy.nlp.tokenizers import Tokenizer +from sumy.summarizers.lex_rank import LexRankSummarizer +from sumy.summarizers.lsa import LsaSummarizer as Summarizer +from sumy.nlp.stemmers import Stemmer +from sumy.utils import get_stop_words +from sumy.summarizers.luhn import LuhnSummarizer +from sumy.summarizers.edmundson import EdmundsonSummarizer + +from sklearn.feature_extraction.text import TfidfVectorizer +from sklearn.metrics.pairwise import cosine_similarity + +import numpy as np + +from src.lsi_model import LSIModel +from src.SimpleDictionary import SimpleDictionary + +import pickle + +import logging +import nltk, re, os +from nltk import word_tokenize +from nltk import sent_tokenize + + +#from gensim.summarization import keywords +#from gensim.summarization import summarize +#from gensim import corpora, models, similarities +from collections import defaultdict, Counter +import tempfile + +sentencess=[] +compare=[] +LANGUAGE = "english" + +###### PARTE UM DO AJUSTE +def save_corpus(path, corpus): + with open(path, "wb") as f: + pickle.dump(corpus, f) + +def load_corpus(path): + with open(path, "rb") as f: + return pickle.load(f) + +def query_with_cosine(query_vec, docs_matrix, topn=10): + # query_vec: (1, dim) | docs_matrix: (n_docs, dim) + sims = cosine_similarity(query_vec, docs_matrix)[0] # (n_docs,) + top_idx = np.argsort(-sims)[:topn] + return list(zip(top_idx, sims[top_idx])) + +def tokenize(text): + return re.findall(r'\b\w+\b', text.lower()) + +###### REMOÇÃO DO GENSIM +def get_keywords(text: str, topn: int = 10, language: str = LANGUAGE): + """ + Extrai palavras-chave usando TF-IDF em um único documento. + Retorna lista de strings (keywords). + """ + if not text or not text.strip(): + return [] + + vectorizer = TfidfVectorizer(stop_words=language) + tfidf = vectorizer.fit_transform([text]) + scores = tfidf.toarray()[0] + terms = np.array(vectorizer.get_feature_names_out()) + + if len(terms) == 0: + return [] + + topn = min(topn, len(terms)) + top_idx = np.argsort(-scores)[:topn] + return terms[top_idx].tolist() + +def keywords(text, words=10, split=True, language: str = LANGUAGE): + kws = get_keywords(text, topn=words, language=language) + return kws if split else "\n".join(kws) + +#def build_model(texts): +# vectorizer = TfidfVectorizer(stop_words='english') +# tfidf_matrix = vectorizer.fit_transform(texts) +# return vectorizer, tfidf_matrix + +#def build_index(matrix): +# """ +# matrix: ndarray (n_docs, dim) +# retorna matriz normalizada igual ao MatrixSimilarity +# """ +# norms = np.linalg.norm(matrix, axis=1, keepdims=True) +# return matrix / (norms + 1e-10) +''' +def get_summary(textss , truereq, numofsent): + output_sentences = [] + hold='' + truecount=0 + store='' + store=keywords(textss,ratio=0.05)#extracting the most relevant words from full text + store1=str(store) + holdfirst=nltk.word_tokenize(store1)#storing the tokenized string (keywords) to remove punctuation + parser = PlaintextParser.from_string(textss,Tokenizer(LANGUAGE))#storing the full text into an object + stemmer = Stemmer(LANGUAGE) + summarizer = Summarizer(stemmer) + summarizer.stop_words = get_stop_words(LANGUAGE) + sentencess=[] + compare=[] + TEMP_FOLDER = tempfile.gettempdir() + documents=sent_tokenize(textss)#storing sentences of full text + summalen=len(documents)#storing the number of sentences + stoplist = set('for a of the and to in'.split()) + + + for sentence in summarizer(parser.document,numofsent): + hold=str(sentence) + ttt=nltk.word_tokenize(hold) + count=0 + for i in range(0, len(ttt)): + for j in range(0,len(holdfirst)): + if ttt[i]==holdfirst[j]: + count+=1 + compare.append(count) + sentencess.append(str(sentence)) + + texts = [[word for word in document.lower().split() if word not in stoplist] + for document in documents]#storing an array of sentences where each sentence is a list of words without stopwords + frequency = defaultdict(int)#storing a subclass that calls a factory function to supply missing values + + for text in texts: + for token in text: + frequency[token] += 1 + + texts = [[token for token in text if frequency[token] > 1] + for text in texts]#storing an array of words that occur more than once + + + dictionary = tokenize(texts)#storing a map of words + dictionary.save(os.path.join(TEMP_FOLDER, 'deerwester.dict')) + new_doc = str(textss.encode('utf-8'))#storing the utf-8 version of textss (original) + new_vec = dictionary.doc2bow(new_doc.lower().split())#converting the utf-8 econded textss into a bag-of-words format = list of (token_id, token_count) 2-tuples. Each word is assumed to be a tokenized and normalized string (either unicode or utf8-encoded). + + corpus = [dictionary.doc2bow(text) for text in texts]#applying doc2bow to texts(list of words that occur more than once) save into an array + save_corpus(os.path.join(TEMP_FOLDER, 'deerwester.mm'), corpus) + dictionary = tokenize.load( os.path.join(TEMP_FOLDER, 'deerwester.dict')) + corpus = load_corpus(os.path.join(TEMP_FOLDER, 'deerwester.mm')) + lsi = LSIModel(corpus, id2word=dictionary, num_topics=2) + doc = str(textss.encode('utf-8')) + vec_bow = dictionary.doc2bow(doc.lower().split()) + vec_lsi = lsi[vec_bow]#converting the query to LSI space + index = similarities.MatrixSimilarity(lsi[corpus]) + index.save( os.path.join(TEMP_FOLDER, 'deerwester.index') ) + index = similarities.MatrixSimilarity.load( os.path.join(TEMP_FOLDER, 'deerwester.index') ) + sims = index[vec_lsi] + sims = sorted(enumerate(sims), key=lambda item: -item[1]) + newlist=[] + + for i in range(0,summalen): + newlist.append(documents[sims[i][0]]) + if i==4: + break + + for sentencez in newlist: + hold=str(sentencez) + ttt=nltk.word_tokenize(hold) + count=0 + + for i in range(0, len(ttt)): + for j in range(0,len(holdfirst)): + if ttt[i]==holdfirst[j]: + count+=1 + compare.append(count) + sentencess.append(str(sentencez)) + i=0 + while i 0: + # TF-IDF por sentença + vectorizer = TfidfVectorizer(stop_words="english") + tfidf_matrix = vectorizer.fit_transform(documents) # (n_docs, dim) + + # Vetor do documento completo + full_doc_vec = vectorizer.transform([textss]) # (1, dim) + + # Similaridade de cosseno texto completo x sentenças + sims = cosine_similarity(full_doc_vec, tfidf_matrix)[0] # (n_docs,) + + # Pega as top sentenças mais similares + order = np.argsort(-sims) + extra_sentences = [] + extra_scores = [] + + for idx in order: + s_text = documents[idx] + if s_text in candidate_sentences: + continue # já está nos candidatos Sumy + + tokens = [t.lower() for t in word_tokenize(s_text)] + kw_score = sum(1 for t in tokens if t in kw_set) + extra_sentences.append(s_text) + extra_scores.append(kw_score) + + if len(extra_sentences) >= numofsent: + break + + candidate_sentences.extend(extra_sentences) + candidate_scores.extend(extra_scores) + + # 4) Agora faz o filtro gramatical com spaCy, + # priorizando sentenças com mais overlap de keywords + output_sentences = [] + i = 0 + + while i < truereq and candidate_sentences: + # acha sentença com maior score + best_idx = int(np.argmax(candidate_scores)) + best_sentence = candidate_sentences[best_idx] + best_score = candidate_scores[best_idx] + + # se score é 0, provavelmente o resto não é tão relevante + if best_score == 0 and output_sentences: + break + + # Analisa sujeito com spaCy + doc = nlp(best_sentence) + subjects = [w.text.lower() for w in doc if w.dep_ == "nsubj"] + + # Regras parecidas com o seu código original + if subjects: + subj = subjects[0] + if subj not in ("they", "their", "both", "these", "this"): + if best_sentence.count(",") < 7: + output_sentences.append(best_sentence) + i += 1 + + # remove a sentença usada + del candidate_sentences[best_idx] + del candidate_scores[best_idx] + + return output_sentences +''' +###### SEGUNDA TENTATIVA DE CORREÇÃO diff --git a/src/sumytest.py b/src/sumytest.py index 505c989..2e3932a 100644 --- a/src/sumytest.py +++ b/src/sumytest.py @@ -1,301 +1,208 @@ -from __future__ import absolute_import -from __future__ import division, print_function, unicode_literals +from __future__ import absolute_import, division, print_function, unicode_literals -from unidecode import unidecode +import re +import os +import pickle +from collections import Counter + +import nltk +from nltk import sent_tokenize, word_tokenize -import sys, traceback, unicodedata, codecs, requests -import unicodedata import spacy from spacy.lang.en import English -nlp = spacy.load('en_core_web_sm') -from sumy.parsers.html import HtmlParser from sumy.parsers.plaintext import PlaintextParser from sumy.nlp.tokenizers import Tokenizer -from sumy.summarizers.lex_rank import LexRankSummarizer from sumy.summarizers.lsa import LsaSummarizer as Summarizer from sumy.nlp.stemmers import Stemmer from sumy.utils import get_stop_words -from sumy.summarizers.luhn import LuhnSummarizer -from sumy.summarizers.edmundson import EdmundsonSummarizer from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity -import numpy as np - -from src.lsi_model import LSIModel - -import pickle - -import logging -import nltk, re, os -from nltk import word_tokenize -from nltk import sent_tokenize +# Carregando modelo do spaCy +nlp = spacy.load("en_core_web_sm") - -#from gensim.summarization import keywords -#from gensim.summarization import summarize -#from gensim import corpora, models, similarities -from collections import defaultdict, Counter -import tempfile - -sentencess=[] -compare=[] LANGUAGE = "english" -###### PARTE UM DO AJUSTE +# --------------------------------------------------- +# Utilidades básicas (tokenização, salvamento, etc.) +# --------------------------------------------------- + def save_corpus(path, corpus): + """Mantida por compatibilidade, caso queira reutilizar depois.""" with open(path, "wb") as f: pickle.dump(corpus, f) + def load_corpus(path): + """Mantida por compatibilidade, caso queira reutilizar depois.""" with open(path, "rb") as f: return pickle.load(f) -def query_with_cosine(query_vec, docs_matrix, topn=10): - # query_vec: (1, dim) | docs_matrix: (n_docs, dim) - sims = cosine_similarity(query_vec, docs_matrix)[0] # (n_docs,) - top_idx = np.argsort(-sims)[:topn] - return list(zip(top_idx, sims[top_idx])) def tokenize(text): - return re.findall(r'\b\w+\b', text.lower()) + """Tokenização simples em palavras alfanuméricas, minúsculas.""" + return re.findall(r"\b\w+\b", text.lower()) + + +# --------------------------------------------------- +# Palavras-chave (substituindo gensim.summarization.keywords) +# --------------------------------------------------- -###### REMOÇÃO DO GENSIM def get_keywords(text: str, topn: int = 10, language: str = LANGUAGE): """ - Extrai palavras-chave usando TF-IDF em um único documento. - Retorna lista de strings (keywords). + Extrai palavras-chave por frequência (bem simples), removendo + algumas stopwords comuns em inglês. + Retorna uma lista de strings. """ if not text or not text.strip(): return [] - vectorizer = TfidfVectorizer(stop_words=language) - tfidf = vectorizer.fit_transform([text]) - scores = tfidf.toarray()[0] - terms = np.array(vectorizer.get_feature_names_out()) + # stopwords bem simples para não depender de downloads do NLTK + basic_stopwords = { + "the", "and", "to", "of", "in", "a", "is", "it", "for", "on", "that", + "this", "with", "as", "by", "an", "be", "are", "at", "from", "or", + "was", "were", "has", "have", "had", "but", "not", "can", "will", + "would", "should", "could", "about", "into", "than", "then", + "there", "their", "they", "them", "these", "those", "its", "we", + "you", "your", "our", "us" + } + + tokens = tokenize(text) + tokens = [t for t in tokens if t not in basic_stopwords] + freq = Counter(tokens) + keywords_list = [w for w, _ in freq.most_common(topn)] + return keywords_list - if len(terms) == 0: - return [] - topn = min(topn, len(terms)) - top_idx = np.argsort(-scores)[:topn] - return terms[top_idx].tolist() +def keywords(text, words=10, split=True, language: str = LANGUAGE, **kwargs): + """ + Wrapper compatível com a antiga gensim.summarization.keywords. + Aceita 'words' (número de palavras) e ignora silenciosamente 'ratio', + se alguém ainda passar. + """ + # suporte opcional a ratio, apenas para não quebrar chamadas antigas + ratio = kwargs.get("ratio", None) + if ratio is not None: + # heurística: número de palavras-chave em função do tamanho do texto + approx_words = max(1, int(len(tokenize(text)) * ratio)) + words = approx_words -def keywords(text, words=10, split=True, language: str = LANGUAGE): kws = get_keywords(text, topn=words, language=language) return kws if split else "\n".join(kws) -#def build_model(texts): -# vectorizer = TfidfVectorizer(stop_words='english') -# tfidf_matrix = vectorizer.fit_transform(texts) -# return vectorizer, tfidf_matrix - -#def build_index(matrix): -# """ -# matrix: ndarray (n_docs, dim) -# retorna matriz normalizada igual ao MatrixSimilarity -# """ -# norms = np.linalg.norm(matrix, axis=1, keepdims=True) -# return matrix / (norms + 1e-10) -''' -def get_summary(textss , truereq, numofsent): - output_sentences = [] - hold='' - truecount=0 - store='' - store=keywords(textss,ratio=0.05)#extracting the most relevant words from full text - store1=str(store) - holdfirst=nltk.word_tokenize(store1)#storing the tokenized string (keywords) to remove punctuation - parser = PlaintextParser.from_string(textss,Tokenizer(LANGUAGE))#storing the full text into an object - stemmer = Stemmer(LANGUAGE) - summarizer = Summarizer(stemmer) - summarizer.stop_words = get_stop_words(LANGUAGE) - sentencess=[] - compare=[] - TEMP_FOLDER = tempfile.gettempdir() - documents=sent_tokenize(textss)#storing sentences of full text - summalen=len(documents)#storing the number of sentences - stoplist = set('for a of the and to in'.split()) - - - for sentence in summarizer(parser.document,numofsent): - hold=str(sentence) - ttt=nltk.word_tokenize(hold) - count=0 - for i in range(0, len(ttt)): - for j in range(0,len(holdfirst)): - if ttt[i]==holdfirst[j]: - count+=1 - compare.append(count) - sentencess.append(str(sentence)) - - texts = [[word for word in document.lower().split() if word not in stoplist] - for document in documents]#storing an array of sentences where each sentence is a list of words without stopwords - frequency = defaultdict(int)#storing a subclass that calls a factory function to supply missing values - - for text in texts: - for token in text: - frequency[token] += 1 - - texts = [[token for token in text if frequency[token] > 1] - for text in texts]#storing an array of words that occur more than once - - - dictionary = tokenize(texts)#storing a map of words - dictionary.save(os.path.join(TEMP_FOLDER, 'deerwester.dict')) - new_doc = str(textss.encode('utf-8'))#storing the utf-8 version of textss (original) - new_vec = dictionary.doc2bow(new_doc.lower().split())#converting the utf-8 econded textss into a bag-of-words format = list of (token_id, token_count) 2-tuples. Each word is assumed to be a tokenized and normalized string (either unicode or utf8-encoded). - - corpus = [dictionary.doc2bow(text) for text in texts]#applying doc2bow to texts(list of words that occur more than once) save into an array - save_corpus(os.path.join(TEMP_FOLDER, 'deerwester.mm'), corpus) - dictionary = tokenize.load( os.path.join(TEMP_FOLDER, 'deerwester.dict')) - corpus = load_corpus(os.path.join(TEMP_FOLDER, 'deerwester.mm')) - lsi = LSIModel(corpus, id2word=dictionary, num_topics=2) - doc = str(textss.encode('utf-8')) - vec_bow = dictionary.doc2bow(doc.lower().split()) - vec_lsi = lsi[vec_bow]#converting the query to LSI space - index = similarities.MatrixSimilarity(lsi[corpus]) - index.save( os.path.join(TEMP_FOLDER, 'deerwester.index') ) - index = similarities.MatrixSimilarity.load( os.path.join(TEMP_FOLDER, 'deerwester.index') ) - sims = index[vec_lsi] - sims = sorted(enumerate(sims), key=lambda item: -item[1]) - newlist=[] - - for i in range(0,summalen): - newlist.append(documents[sims[i][0]]) - if i==4: - break - - for sentencez in newlist: - hold=str(sentencez) - ttt=nltk.word_tokenize(hold) - count=0 - - for i in range(0, len(ttt)): - for j in range(0,len(holdfirst)): - if ttt[i]==holdfirst[j]: - count+=1 - compare.append(count) - sentencess.append(str(sentencez)) - i=0 - while i 0: - # TF-IDF por sentença - vectorizer = TfidfVectorizer(stop_words="english") - tfidf_matrix = vectorizer.fit_transform(documents) # (n_docs, dim) - - # Vetor do documento completo - full_doc_vec = vectorizer.transform([textss]) # (1, dim) - - # Similaridade de cosseno texto completo x sentenças - sims = cosine_similarity(full_doc_vec, tfidf_matrix)[0] # (n_docs,) - - # Pega as top sentenças mais similares - order = np.argsort(-sims) - extra_sentences = [] - extra_scores = [] - - for idx in order: - s_text = documents[idx] - if s_text in candidate_sentences: - continue # já está nos candidatos Sumy - - tokens = [t.lower() for t in word_tokenize(s_text)] - kw_score = sum(1 for t in tokens if t in kw_set) - extra_sentences.append(s_text) - extra_scores.append(kw_score) - - if len(extra_sentences) >= numofsent: - break - - candidate_sentences.extend(extra_sentences) - candidate_scores.extend(extra_scores) - - # 4) Agora faz o filtro gramatical com spaCy, - # priorizando sentenças com mais overlap de keywords + # Pega algumas frases iniciais com SUMY (limitadas por numofsent) + initial_candidates = [str(s) for s in summarizer(parser.document, numofsent)] + candidate_set = set(initial_candidates) + + # 4) Montar listas de frases + pontuações (compare) + sentencess = [] + compare = [] + + for sent in documents: + # Se SUMY foi usado, podemos priorizar frases que ele já sugeriu + base_score = 1 if sent in candidate_set else 0 + + # Overlap com palavras-chave + tokens = tokenize(sent) + overlap = sum(1 for t in tokens if t in kw_set) + + score = base_score + overlap + sentencess.append(sent) + compare.append(score) + + # 5) Selecionar as melhores `truereq` frases, + # aplicando o mesmo filtro de sujeito que você já usava. output_sentences = [] i = 0 - while i < truereq and candidate_sentences: - # acha sentença com maior score - best_idx = int(np.argmax(candidate_scores)) - best_sentence = candidate_sentences[best_idx] - best_score = candidate_scores[best_idx] + # Evita loop infinito se truereq > número de frases + truereq = min(truereq, len(sentencess)) + + while i < truereq and sentencess: + # índice da frase com maior score + idx = compare.index(max(compare)) - # se score é 0, provavelmente o resto não é tão relevante - if best_score == 0 and output_sentences: - break + sentence_candidate = sentencess[idx] + doc_spacy = nlp(sentence_candidate) - # Analisa sujeito com spaCy - doc = nlp(best_sentence) - subjects = [w.text.lower() for w in doc if w.dep_ == "nsubj"] + # Coletar sujeitos gramaticais (nsubj) + subjects = [w.text.lower() for w in doc_spacy if w.dep_ == "nsubj"] - # Regras parecidas com o seu código original + use_sentence = True if subjects: - subj = subjects[0] - if subj not in ("they", "their", "both", "these", "this"): - if best_sentence.count(",") < 7: - output_sentences.append(best_sentence) - i += 1 + bad_pronouns = {"they", "their", "both", "these", "this"} + if subjects[0] in bad_pronouns: + use_sentence = False + + if use_sentence: + # Filtra frases exageradamente longas por número de vírgulas + if sentence_candidate.count(",") < 7: + output_sentences.append(sentence_candidate) + i += 1 - # remove a sentença usada - del candidate_sentences[best_idx] - del candidate_scores[best_idx] + # Remove essa frase das listas para não ser escolhida de novo + del sentencess[idx] + del compare[idx] - return output_sentences + return output_sentences \ No newline at end of file From b8ecade6899c8797775d0493c23696da9b7af814 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 14:51:19 -0300 Subject: [PATCH 07/14] fix: ajuste no get_data --- Dockerfile | 3 +-- src/search_data.py | 39 +++++++++++++++------------------------ 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/Dockerfile b/Dockerfile index 33adce1..23c98f0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,11 +44,10 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* - - # cria usuário não privilegiado RUN useradd -m appuser RUN mkdir -p /data/db && chown -R appuser:appuser /data/db +RUN touch /app/log_SM.txt && chmod 666 /app/log_SM.txt USER appuser # Copy the source code into the container. diff --git a/src/search_data.py b/src/search_data.py index 3eae6d8..74a5246 100644 --- a/src/search_data.py +++ b/src/search_data.py @@ -46,42 +46,23 @@ def get_text_from_url(response): print("Erro em get_text_from_url:", e, type(response)) return "" -'''def google_search_query(query): - subtopic_text = "" - for url in search(query, stop=20): - try: - response = urlopen(url) - content_type = response.getheader('Content-Type') - reg_exp = ';.*' - mime_type = re.sub(reg_exp, '', content_type) - - if 'application/pdf' != mime_type: - subtopic_text = subtopic_text + get_text_from_url(response).strip() - subtopic_text = re.sub('[^A-Za-z0-9]+', ' ', subtopic_text) - except Exception as e: - pass - return subtopic_text -''' - def google_search_query(query): subtopic_text = "" - for url in search(query, stop=20): + for url in search(query, num_results=20, lang="pt"): try: response = urlopen(url) content_type = response.getheader("Content-Type") or "" - mime_type = re.sub(r";.*", "", content_type) + mime_type = content_type.split(";")[0] if mime_type != "application/pdf": page_text = get_text_from_url(response).strip() if page_text: subtopic_text += " " + page_text - subtopic_text = re.sub(r"[^A-Za-z0-9]+", " ", subtopic_text) except Exception as e: - # enquanto você está debugando, é bom ver qual URL quebra print("Erro ao processar URL:", url, "->", e) - return subtopic_text - + continue + return re.sub(r"[^A-Za-z0-9]+", " ", subtopic_text) #def generate_search_query(topic_names, keywords): # query = "(" @@ -118,7 +99,7 @@ def generate_search_query(topic_names, keywords): return query -def get_data(topics): +'''def get_data(topics): #storing a list of topics in current job topic_names = topics["topic_name"] #storing a list of subtopics in current job @@ -137,4 +118,14 @@ def get_data(topics): subtopic_text = google_search_query(search_query) topic_text[subtopic_name.lower()] = subtopic_text + return topic_text''' + +def get_data(topics): + topic_names = topics["topic_name"] + subtopics = topics["subtopics"] + topic_text = {} + for i in range(len(subtopics)): + subtopic_name = subtopics[i]["subtopic_name"] + subtopic_text = "texto de teste " * 1000 # <-- só para testar + topic_text[subtopic_name.lower()] = subtopic_text return topic_text From c9131f3c12c57cf7f710550db4a3d021a3fc1a06 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 15:29:35 -0300 Subject: [PATCH 08/14] =?UTF-8?q?fix:=20erro=20na=20cria=C3=A7=C3=A3o=20do?= =?UTF-8?q?=20modelo=20corrigido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 7 ++++++- README-PTBR.md | 14 ++++++++++++++ compose.yaml | 3 +++ src/create_model.py | 2 +- 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 README-PTBR.md diff --git a/Dockerfile b/Dockerfile index 23c98f0..0781c89 100644 --- a/Dockerfile +++ b/Dockerfile @@ -47,7 +47,12 @@ RUN apt-get update && \ # cria usuário não privilegiado RUN useradd -m appuser RUN mkdir -p /data/db && chown -R appuser:appuser /data/db -RUN touch /app/log_SM.txt && chmod 666 /app/log_SM.txt +RUN touch ./log_SM.txt && chmod 666 ./log_SM.txt + +RUN mkdir -p ./models ./Summaries ./Data \ + && touch ./log_SM.txt \ + && chmod -R 777 /app + USER appuser # Copy the source code into the container. diff --git a/README-PTBR.md b/README-PTBR.md new file mode 100644 index 0000000..be51fee --- /dev/null +++ b/README-PTBR.md @@ -0,0 +1,14 @@ +*Esta ferramenta digital faz parte do catálogo de ferramentas do **Banco Interamericano de Desenvolvimento**. Você poderá conhecer mais sobre a iniciativa em: [https://knowledge.iadb.org/es/codigo-para-el-desarrollo](https://knowledge.iadb.org/es/codigo-para-el-desarrollo)* + +## *SmartReader* + +### Descrição e contexto +--- + +*SmartReader* é uma ferramenta que utiliza técnicas de Processamento em Linguagem Natural (NPL) para proporcionar uma nova forma de realizar as suas pesquisa (tanto a questão de pesquisa como a literatura coletada). Esto lo hace a través de consultar a Google y recuperar información actualizada y relacionada con tu pregunta de investigación. *SmartReader* es una alternativa para hacerle frente a la necesidad que tienen los trabajadores de conocimiento de mantener el ritmo a la cantidad exponencial de información que se genera todos los días y que se comparte en el internet. + +El Departamento de Conocimiento Innovación y Comunicación del **Banco Interamericano de Desarrollo** creó esta herramienta luego de reconocer esta necesidad además de querer explorar tecnologías como la Inteligencia Artificial y el Procesamiento del Lenguaje Natural para asistir en el proceso de Gestión del Conocimiento. + +La herramienta consta de cuatro interfaces: 1) *Definición del modelo*, 2) *Estado del modelo*, 3) *Aplicación del modelo*, e 4) *Interfaz de resultados*. + +casdas \ No newline at end of file diff --git a/compose.yaml b/compose.yaml index 9ef31f7..31c4be0 100644 --- a/compose.yaml +++ b/compose.yaml @@ -2,6 +2,7 @@ services: server: build: context: . + user: "0:0" depends_on: - mongo ports: @@ -17,6 +18,7 @@ services: processor: build: context: . + user: "0:0" command: ["python", "processor.py"] depends_on: - mongo @@ -27,6 +29,7 @@ services: summary-processor: build: context: . + user: "0:0" command: ["python", "summary_processor.py"] depends_on: - mongo diff --git a/src/create_model.py b/src/create_model.py index 583047b..7776f7d 100644 --- a/src/create_model.py +++ b/src/create_model.py @@ -38,7 +38,7 @@ def create_and_save_model(subtopics, output_file): X = vec.fit_transform(all_texts) global gX gX = X - features = vec.get_feature_names() + features = vec.get_feature_names_out() for i in range(len(subtopic_names)): if subtopic_names[i] not in no_data_subtopic_names: Xi = X[i, :] From db56b0b1e0e6614b525f04391b612f5033c7f6cd Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 15:44:50 -0300 Subject: [PATCH 09/14] =?UTF-8?q?fix:=20corre=C3=A7=C3=A3o=20no=20get=5Fmo?= =?UTF-8?q?dels?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 14f9b15..0974beb 100644 --- a/main.py +++ b/main.py @@ -175,20 +175,40 @@ def get_status(): @app.route('/get_models') +#def get_models(): +# models = [] +# cursor = collection.find({"status": "Done"}) +# for document in cursor: +# ts = document.get('timestamp') +# ts_str = ts.strftime('%Y-%m-%d %H:%M:%S') if ts else None +# +# models.append({ +# "label": document["model_name"], +# # É ISSO que o /create_summary vai receber em request.form['model'] +# "value": f'{document["model_name"]}, {document["output_model_file"]}', +# "file": document["output_model_file"], +# "timestamp": ts_str +# }) + def get_models(): - models = [] - cursor = collection.find({"status": "Done"}) - for document in cursor: - ts = document.get('timestamp') - ts_str = ts.strftime('%Y-%m-%d %H:%M:%S') if ts else None - - models.append({ - "label": document["model_name"], - # É ISSO que o /create_summary vai receber em request.form['model'] - "value": f'{document["model_name"]}, {document["output_model_file"]}', - "file": document["output_model_file"], - "timestamp": ts_str - }) + try: + models = [] + cursor = collection.find({"status": "Done"}).sort("timestamp", -1) + + for document in cursor: + models.append([ + document.get("model_name", ""), + document.get("output_model_file", ""), + document.get("timestamp", datetime.utcnow()).strftime('%Y-%m-%d %H:%M:%S') + ]) + + # SEMPRE retorna alguma coisa (nem que seja lista vazia) + return jsonify(models) + except Exception as e: + # loga pra você ver no container + print("Erro em /get_models:", e) + # ainda assim devolve JSON válido + return jsonify([]), 500 @app.route('/create_summary',methods = ['POST']) def upload_file(): From a2ea0fee6e9b6de4b84236fde6e1c2303e9cc2d4 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 16:15:16 -0300 Subject: [PATCH 10/14] =?UTF-8?q?del:=20remo=C3=A7=C3=A3o=20da=20bibliotec?= =?UTF-8?q?a=20google=20por=20obsolecencia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _google_/__init__.py | 387 ----------------- _google_/user_agents.txt | 899 --------------------------------------- 2 files changed, 1286 deletions(-) delete mode 100644 _google_/__init__.py delete mode 100644 _google_/user_agents.txt diff --git a/_google_/__init__.py b/_google_/__init__.py deleted file mode 100644 index ea7f81d..0000000 --- a/_google_/__init__.py +++ /dev/null @@ -1,387 +0,0 @@ -#!/usr/bin/env python - -# Python bindings to the Google search engine -# Copyright (c) 2009-2016, Mario Vilas -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice,this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -__all__ = ['search', 'search_images', 'search_news', 'search_videos', 'search_shop', 'search_books', 'search_apps', 'lucky'] - -import os -import random -import sys -import time - -if sys.version_info[0] > 2: - from http.cookiejar import LWPCookieJar - from urllib.request import Request, urlopen - from urllib.parse import quote_plus, urlparse, parse_qs -else: - from cookielib import LWPCookieJar - from urllib import quote_plus - from urllib2 import Request, urlopen - from urlparse import urlparse, parse_qs - -try: - from bs4 import BeautifulSoup - is_bs4 = True -except ImportError: - from BeautifulSoup import BeautifulSoup - is_bs4 = False - -# URL templates to make Google searches. -url_home = "https://www.google.%(tld)s/" -url_search = "https://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&btnG=Google+Search&tbs=%(tbs)s&safe=%(safe)s&tbm=%(tpe)s" -url_next_page = "https://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&start=%(start)d&tbs=%(tbs)s&safe=%(safe)s&tbm=%(tpe)s" -url_search_num = "https://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&num=%(num)d&btnG=Google+Search&tbs=%(tbs)s&safe=%(safe)s&tbm=%(tpe)s" -url_next_page_num = "https://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&num=%(num)d&start=%(start)d&tbs=%(tbs)s&safe=%(safe)s&tbm=%(tpe)s" - -# Cookie jar. Stored at the user's home folder. -home_folder = os.getenv('HOME') -if not home_folder: - home_folder = os.getenv('USERHOME') - if not home_folder: - home_folder = '.' # Use the current folder on error. -cookie_jar = LWPCookieJar(os.path.join(home_folder, '.google-cookie')) -try: - cookie_jar.load() -except Exception: - pass - -# Default user agent, unless instructed by the user to change it. -USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)' - -# Load the list of valid user agents from the install folder. -install_folder = os.path.abspath(os.path.split(__file__)[0]) -user_agents_file = os.path.join(install_folder, 'user_agents.txt') -try: - with open('user_agents.txt') as fp: - user_agents_list = [_.strip() for _ in fp.readlines()] -except Exception: - user_agents_list = [USER_AGENT] - - -# Get a random user agent. -def get_random_user_agent(): - """ - Get a random user agent string. - - @rtype: str - @return: Random user agent string. - """ - return random.choice(user_agents_list) - - -# Request the given URL and return the response page, using the cookie jar. -def get_page(url, user_agent=None): - """ - Request the given URL and return the response page, using the cookie jar. - - @type url: str - @param url: URL to retrieve. - - @type user_agent: str - @param user_agent: User agent for the HTTP requests. Use C{None} for the default. - - @rtype: str - @return: Web page retrieved for the given URL. - - @raise IOError: An exception is raised on error. - @raise urllib2.URLError: An exception is raised on error. - @raise urllib2.HTTPError: An exception is raised on error. - """ - if user_agent is None: - user_agent = USER_AGENT - request = Request(url) - request.add_header('User-Agent', USER_AGENT) - cookie_jar.add_cookie_header(request) - response = urlopen(request) - cookie_jar.extract_cookies(response, request) - html = response.read() - response.close() - cookie_jar.save() - return html - - -# Filter links found in the Google result pages HTML code. -# Returns None if the link doesn't yield a valid result. -def filter_result(link): - try: - - # Valid results are absolute URLs not pointing to a Google domain - # like images.google.com or googleusercontent.com - o = urlparse(link, 'http') - if o.netloc and 'google' not in o.netloc: - return link - - # Decode hidden URLs. - if link.startswith('/url?'): - link = parse_qs(o.query)['q'][0] - - # Valid results are absolute URLs not pointing to a Google domain - # like images.google.com or googleusercontent.com - o = urlparse(link, 'http') - if o.netloc and 'google' not in o.netloc: - return link - - # Otherwise, or on error, return None. - except Exception: - pass - return None - - -# Shortcut to search images -# Beware, this does not return the image link. -def search_images(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, - stop=None, pause=2.0, only_standard=False, extra_params={}): - return search(query, tld, lang, tbs, safe, num, start, stop, pause, only_standard, extra_params, tpe='isch') - - -# Shortcut to search news -def search_news(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, - stop=None, pause=2.0, only_standard=False, extra_params={}): - return search(query, tld, lang, tbs, safe, num, start, stop, pause, only_standard, extra_params, tpe='nws') - - -# Shortcut to search videos -def search_videos(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, - stop=None, pause=2.0, only_standard=False, extra_params={}): - return search(query, tld, lang, tbs, safe, num, start, stop, pause, only_standard, extra_params, tpe='vid') - - -# Shortcut to search shop -def search_shop(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, - stop=None, pause=2.0, only_standard=False, extra_params={}): - return search(query, tld, lang, tbs, safe, num, start, stop, pause, only_standard, extra_params, tpe='shop') - - -# Shortcut to search books -def search_books(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, - stop=None, pause=2.0, only_standard=False, extra_params={}): - return search(query, tld, lang, tbs, safe, num, start, stop, pause, only_standard, extra_params, tpe='bks') - - -# Shortcut to search apps -def search_apps(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, - stop=None, pause=2.0, only_standard=False, extra_params={}): - return search(query, tld, lang, tbs, safe, num, start, stop, pause, only_standard, extra_params, tpe='app') - -# Shortcut to single-item search. Evaluates the iterator to return the single -# URL as a string. -def lucky(query, tld='com', lang='en', tbs='0', safe='off', only_standard=False, - extra_params={}, tpe=''): - gen = search(query, tld, lang, tbs, safe, 1, 0, 1, 0., only_standard, extra_params, tpe) - return next(gen) - -# Returns a generator that yields URLs. -def search(query, tld='com', lang='en', tbs='0', safe='off', num=10, start=0, - stop=None, pause=2.0, only_standard=False, extra_params={}, tpe='', user_agent=None): - """ - Search the given query string using Google. - - @type query: str - @param query: Query string. Must NOT be url-encoded. - - @type tld: str - @param tld: Top level domain. - - @type lang: str - @param lang: Languaje. - - @type tbs: str - @param tbs: Time limits (i.e "qdr:h" => last hour, "qdr:d" => last 24 hours, "qdr:m" => last month). - - @type safe: str - @param safe: Safe search. - - @type num: int - @param num: Number of results per page. - - @type start: int - @param start: First result to retrieve. - - @type stop: int - @param stop: Last result to retrieve. - Use C{None} to keep searching forever. - - @type pause: float - @param pause: Lapse to wait between HTTP requests. - A lapse too long will make the search slow, but a lapse too short may - cause Google to block your IP. Your mileage may vary! - - @type only_standard: bool - @param only_standard: If C{True}, only returns the standard results from - each page. If C{False}, it returns every possible link from each page, - except for those that point back to Google itself. Defaults to C{False} - for backwards compatibility with older versions of this module. - - @type extra_params: dict - @param extra_params: A dictionary of extra HTTP GET parameters, which must be URL encoded. - For example if you don't want google to filter similar results you can set the extra_params to - {'filter': '0'} which will append '&filter=0' to every query. - - @type tpe: str - @param tpe: Search type (images, videos, news, shopping, books, apps) - Use the following values {videos: 'vid', images: 'isch', news: 'nws', - shopping: 'shop', books: 'bks', applications: 'app'} - - @type user_agent: str - @param user_agent: User agent for the HTTP requests. Use C{None} for the default. - - @rtype: generator - @return: Generator (iterator) that yields found URLs. If the C{stop} - parameter is C{None} the iterator will loop forever. - """ - # Set of hashes for the results found. - # This is used to avoid repeated results. - hashes = set() - - # Prepare the search string. - query = quote_plus(query) - - # Check extra_params for overlapping - for builtin_param in ('hl', 'q', 'btnG', 'tbs', 'safe', 'tbm'): - if builtin_param in extra_params.keys(): - raise ValueError( - 'GET parameter "%s" is overlapping with \ - the built-in GET parameter', - builtin_param - ) - - # Grab the cookie from the home page. - get_page(url_home % vars()) - - # Prepare the URL of the first request. - if start: - if num == 10: - url = url_next_page % vars() - else: - url = url_next_page_num % vars() - else: - if num == 10: - url = url_search % vars() - else: - url = url_search_num % vars() - - # Loop until we reach the maximum result, if any (otherwise, loop forever). - while not stop or start < stop: - - try: # Is it python<3? - iter_extra_params = extra_params.iteritems() - except AttributeError: # Or python>3? - iter_extra_params = extra_params.items() - # Append extra GET_parameters to URL - for k, v in iter_extra_params: - url += url + ('&%s=%s' % (k, v)) - - # Sleep between requests. - time.sleep(pause) - - # Request the Google Search results page. - html = get_page(url) - - # Parse the response and process every anchored URL. - if is_bs4: - soup = BeautifulSoup(html, 'html.parser') - else: - soup = BeautifulSoup(html) - ''' - anchors = soup.find(id='search').findAll('a') - for a in anchors: - - # Leave only the "standard" results if requested. - # Otherwise grab all possible links. - if only_standard and ( - not a.parent or a.parent.name.lower() != "h3"): - continue - - # Get the URL from the anchor tag. - try: - link = a['href'] - except KeyError: - continue - - # Filter invalid links and links pointing to Google itself. - link = filter_result(link) - if not link: - continue - - # Discard repeated results. - h = hash(link) - if h in hashes: - continue - hashes.add(h) - - # Yield the result. - yield link - ''' - - search_container = soup.find(id='search') - - if search_container is not None: - anchors = search_container.find_all('a') - else: - # fallback: se não tiver #search (layout diferente, captcha, etc), - # pega todos da página - anchors = soup.find_all('a') - - for a in anchors: - - # Leave only the "standard" results if requested. - # Otherwise grab all possible links. - if only_standard and (not a.parent or a.parent.name.lower() != "h3"): - continue - - # Get the URL from the anchor tag. - try: - link = a['href'] - except KeyError: - continue - - # Filter invalid links and links pointing to Google itself. - link = filter_result(link) - if not link: - continue - - # Discard repeated results. - h = hash(link) - if h in hashes: - continue - hashes.add(h) - - # Yield the result. - yield link - - # End if there are no more results. - if not soup.find(id='nav'): - break - - # Prepare the URL for the next request. - start += num - if num == 10: - url = url_next_page % vars() - else: - url = url_next_page_num % vars() diff --git a/_google_/user_agents.txt b/_google_/user_agents.txt deleted file mode 100644 index a8d0f3d..0000000 --- a/_google_/user_agents.txt +++ /dev/null @@ -1,899 +0,0 @@ -Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0) -Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) -Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0) -Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0) -Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1) -Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US)) -Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7 -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0 -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57) -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205 -Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57) -Mozilla/5.0 ( ; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) -Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 5.1; Trident/5.0) -Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 7.1; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C) -Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTB5.5) -Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.2; .NET4.0C; .NET4.0E) -Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C) -Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; FDM; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E; Tablet PC 2.0) -Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320) -Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322) -Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) -Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727) -Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30) -Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; msn OptimizedIE8;ZHCN) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; InfoPath.3; .NET4.0C; .NET4.0E) chromeframe/8.0.552.224 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; .NET4.0C; .NET4.0E; Zune 4.7; InfoPath.3) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; .NET4.0C; .NET4.0E; Zune 4.7) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; Zune 4.0) -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MS-RTC LM 8; Zune 4.7) -Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre -Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20100101 Firefox/4.2a1pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110324 Firefox/4.2a1pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.2a1pre) Gecko/20110323 Firefox/4.2a1pre -Mozilla/5.0 (X11; Linux x86_64; rv:2.0b9pre) Gecko/20110111 Firefox/4.0b9pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b9pre) Gecko/20101228 Firefox/4.0b9pre -Mozilla/5.0 (Windows NT 5.1; rv:2.0b9pre) Gecko/20110105 Firefox/4.0b9pre -Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101213 Firefox/4.0b8pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101128 Firefox/4.0b8pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b8pre) Gecko/20101114 Firefox/4.0b8pre -Mozilla/5.0 (Windows NT 5.1; rv:2.0b8pre) Gecko/20101127 Firefox/4.0b8pre -Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8 -Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre -Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20101111 Firefox/4.0b7 -Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b7) Gecko/20100101 Firefox/4.0b7 -Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre -Mozilla/5.0 (Windows NT 6.1; rv:2.0b6pre) Gecko/20100903 Firefox/4.0b6pre Firefox/4.0b6pre -Mozilla/5.0 (X11; Linux x86_64; rv:2.0b4) Gecko/20100818 Firefox/4.0b4 -Mozilla/5.0 (X11; Linux i686; rv:2.0b3pre) Gecko/20100731 Firefox/4.0b3pre -Mozilla/5.0 (Windows NT 5.2; rv:2.0b13pre) Gecko/20110304 Firefox/4.0b13pre -Mozilla/5.0 (Windows NT 5.1; rv:2.0b13pre) Gecko/20110223 Firefox/4.0b13pre -Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20110204 Firefox/4.0b12pre -Mozilla/5.0 (X11; Linux i686; rv:2.0b12pre) Gecko/20100101 Firefox/4.0b12pre -Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110131 Firefox/4.0b11pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110129 Firefox/4.0b11pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b11pre) Gecko/20110128 Firefox/4.0b11pre -Mozilla/5.0 (Windows NT 6.1; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre -Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b11pre) Gecko/20110126 Firefox/4.0b11pre -Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b10pre) Gecko/20110118 Firefox/4.0b10pre -Mozilla/5.0 (Windows NT 6.1; rv:2.0b10pre) Gecko/20110113 Firefox/4.0b10pre -Mozilla/5.0 (X11; Linux i686; rv:2.0b10) Gecko/20100101 Firefox/4.0b10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:2.0b10) Gecko/20110126 Firefox/4.0b10 -Mozilla/5.0 (Windows NT 6.1; rv:2.0b10) Gecko/20110126 Firefox/4.0b10 -Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:2.0) Gecko/20110307 Firefox/4.0 -Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:2.0) Gecko/20110404 Fedora/16-dev Firefox/4.0 -Mozilla/5.0 (X11; Arch Linux i686; rv:2.0) Gecko/20110321 Firefox/4.0 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20110319 Firefox/4.0 -Mozilla/5.0 (Windows NT 6.1; rv:1.9) Gecko/20100101 Firefox/4.0 -Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8 -Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 -Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.25 (jaunty) Firefox/3.8 -Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.3a5pre) Gecko/20100526 Firefox/3.7a5pre -Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 -Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2) Gecko/20091218 Firefox 3.6b5 -Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2b4) Gecko/20091124 Firefox/3.6b4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2b1) Gecko/20091014 Firefox/3.6b1 GTB5 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090428 Firefox/3.6a1pre -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2a1pre) Gecko/20090405 Firefox/3.6a1pre -Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.2a1pre) Gecko/20090405 Ubuntu/9.04 (jaunty) Firefox/3.6a1pre -Mozilla/5.0 (Windows; Windows NT 5.1; es-ES; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre -Mozilla/5.0 (Windows; Windows NT 5.1; en-US; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre -Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2a1pre) Gecko/20090402 Firefox/3.6a1pre (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100915 Gentoo Firefox/3.6.9 -Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.2.9) Gecko/20100913 Firefox/3.6.9 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 ( .NET CLR 3.5.30729; .NET CLR 4.0.20506) -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 -Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.2.8) Gecko/20101230 Firefox/3.6.8 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100804 Gentoo Firefox/3.6.8 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.8) Gecko/20100723 SUSE/3.6.8-0.1.1 Firefox/3.6.8 -Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100722 Ubuntu/10.04 (lucid) Firefox/3.6.8 -Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8 -Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100727 Firefox/3.6.8 -Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.9.2.8) Gecko/20100725 Gentoo Firefox/3.6.8 -Mozilla/5.0 (X11; U; FreeBSD i386; de-CH; rv:1.9.2.8) Gecko/20100729 Firefox/3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.8) Gecko/20100722 AskTbADAP/3.9.1.14019 Firefox/3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0C) -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.8) Gecko/20100722 Firefox 3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20121221 Firefox/3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-TW; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 -Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100809 Fedora/3.6.7-1.fc14 Firefox/3.6.7 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100723 Fedora/3.6.7-1.fc13 Firefox/3.6.7 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.7) Gecko/20100726 CentOS/3.6-3.el5.centos Firefox/3.6.7 -Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.7 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.0 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-PT; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 -Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729; .NET4.0E) -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.4) Gecko/20100614 Ubuntu/10.04 (lucid) Firefox/3.6.4 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.4) Gecko/20100625 Gentoo Firefox/3.6.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100527 Firefox/3.6.4 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-CA; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 GTB7.0 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100513 Firefox/3.6.4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.4) Gecko/20100503 Firefox/3.6.4 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.4) Gecko/20100523 Firefox/3.6.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; cs; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3pre) Gecko/20100405 Firefox/3.6.3plugin1 ( .NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.3) Gecko/20100403 Fedora/3.6.3-4.fc13 Firefox/3.6.3 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100403 Firefox/3.6.3 -Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.3) Gecko/20100401 SUSE/3.6.3-1.1 Firefox/3.6.3 -Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100404 Ubuntu/10.04 (lucid) Firefox/3.6.3 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.3 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 -Mozilla/5.0 (X11; U; Linux AMD64; en-US; rv:1.9.2.3) Gecko/20100403 Ubuntu/10.10 (maverick) Firefox/3.6.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; cs; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; ca; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 -Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB7.0 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 AskTbSPC2/3.9.1.14019 Firefox/3.6.2 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 GTB6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.0.04506.648) -Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 ( .NET CLR 3.0.04506.30) -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.7; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10pre) Gecko/20100902 Ubuntu/9.10 (karmic) Firefox/3.6.1pre -Mozilla/5.0 (X11; U; Linux x86_64; ja-JP; rv:1.9.2.16) Gecko/20110323 Ubuntu/10.10 (maverick) Firefox/3.6.16 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16) Gecko/20110323 Ubuntu/9.10 (karmic) Firefox/3.6.16 FirePHP/0.5 -Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 -Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729; .NET4.0E) -Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.1.13) Gecko/20100914 Firefox/3.6.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.16) Gecko/20110319 AskTbUTR/3.11.3.15590 Firefox/3.6.16 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.16pre) Gecko/20110304 Ubuntu/10.10 (maverick) Firefox/3.6.15pre -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15 FirePHP/0.5 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.15) Gecko/20110330 CentOS/3.6-1.el5.centos Firefox/3.6.15 -Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 ( .NET CLR 3.5.30729; .NET4.0C) FirePHP/0.5 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.15) Gecko/20110303 AskTbBT4/3.11.3.15590 Firefox/3.6.15 ( .NET CLR 3.5.30729; .NET4.0C) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14pre) Gecko/20110105 Firefox/3.6.14pre -Mozilla/5.0 (X11; U; Linux armv7l; en-US; rv:1.9.2.14) Gecko/20110224 Firefox/3.6.14 MB860/Version.0.43.3.MB860.AmericaMovil.en.MX -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-AU; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.14) Gecko/20110218 Firefox/3.6.14 GTB7.1 ( .NET CLR 3.5.30729) -Mozilla/5.0 Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; nb-NO; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.04 (lucid) Firefox/3.6.13 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101223 Gentoo Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101219 Gentoo Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-3.el4 Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-NZ; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.2.13) Gecko/20101206 Red Hat/3.6-2.el5 Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux x86_64; da-DK; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux MIPS32 1074Kf CPS QuadCore; en-US; rv:1.9.2.13) Gecko/20110103 Fedora/3.6.13-1.fc14 Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.13) Gecko/20101209 Fedora/3.6.13-1.fc13 Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.2.13) Gecko/20101206 Ubuntu/9.10 (karmic) Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101209 CentOS/3.6-2.el5.centos Firefox/3.6.13 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13 -Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.9.2.12) Gecko/20101030 Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux x86_64; es-MX; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.2.12) Gecko/20101026 SUSE/3.6.12-0.7.1 Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Gentoo Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101102 Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux ppc; fr; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux i686; ko-KR; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 -Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.10 (maverick) Firefox/3.6.12 GTB7.1 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.12) Gecko/20101027 Fedora/3.6.12-1.fc13 Firefox/3.6.12 -Mozilla/5.0 (X11; FreeBSD x86_64; rv:2.0) Gecko/20100101 Firefox/3.6.12 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 ( .NET CLR 3.5.30729; .NET4.0E) -Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; .NET CLR 3.5.21022) -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; de; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB5 -Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.2.11) Gecko/20101028 CentOS/3.6-2.el5.centos Firefox/3.6.11 -Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2.3pre) Gecko/20100723 Firefox/3.6.11 -Mozilla/5.0 (Windows; U; Windows NT 5.2; ru; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 -Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11 ( .NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux x86_64; pt-BR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux x86_64; pl-PL; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1 -Mozilla/5.0 (X11; U; Linux x86_64; el-GR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 GTB7.1 -Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.04 (jaunty) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.11) Gecko/20101013 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; en-CA; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/9.10 (karmic) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.10) Gecko/20100914 SUSE/3.6.10-0.3.1 Firefox/3.6.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ro; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; nl; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.1) Gecko/20100122 firefox/3.6.1 -Mozilla/5.0(Windows; U; Windows NT 7.0; rv:1.9.2) Gecko/20100101 Firefox/3.6 -Mozilla/5.0(Windows; U; Windows NT 5.2; rv:1.9.2) Gecko/20100101 Firefox/3.6 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100222 Ubuntu/10.04 (lucid) Firefox/3.6 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100130 Gentoo Firefox/3.6 -Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2) Gecko/20100308 Ubuntu/10.04 (lucid) Firefox/3.6 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.2pre) Gecko/20100312 Ubuntu/9.04 (jaunty) Firefox/3.6 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100128 Gentoo Firefox/3.6 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Ubuntu/10.04 (lucid) Firefox/3.6 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 FirePHP/0.4 -Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6 -Mozilla/5.0 (X11; FreeBSD i686) Firefox/3.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU; rv:1.9.2) Gecko/20100105 MRA 5.6 (build 03278) Firefox/3.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; lt; rv:1.9.2) Gecko/20100115 Firefox/3.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a3pre) Gecko/20100306 Firefox3.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100806 Firefox/3.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.3) Gecko/20100401 Firefox/3.6;MEGAUPLOAD 1.0 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ar; rv:1.9.2) Gecko/20100115 Firefox/3.6 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2) Gecko/20100105 Firefox/3.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.2) Gecko/20100115 Firefox/3.6 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b5pre) Gecko/20090517 Firefox/3.5b4pre (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090409 Firefox/3.5b4pre -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4pre) Gecko/20090401 Firefox/3.5b4pre -Mozilla/5.0 (X11; U; Linux i686; nl-NL; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; fr; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4 GTB5 -Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-2.fc12 Firefox/3.5.9 -Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9 GTB7.0 -Mozilla/5.0 (X11; U; Linux x86_64; es-CL; rv:1.9.1.9) Gecko/20100402 Ubuntu/9.10 (karmic) Firefox/3.5.9 -Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1.1 Firefox/3.5.9 -Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9 -Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.9.1.9) Gecko/20100330 Fedora/3.5.9-1.fc12 Firefox/3.5.9 -Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.9) Gecko/20100317 SUSE/3.5.9-0.1 Firefox/3.5.9 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100401 Ubuntu/9.10 (karmic) Firefox/3.5.9 GTB7.1 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100315 Ubuntu/9.10 (karmic) Firefox/3.5.9 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4) Gecko/20091028 Ubuntu/9.10 (karmic) Firefox/3.5.9 -Mozilla/5.0 (Windows; U; Windows NT 6.1; tr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; hu; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 -Mozilla/5.0 (Windows; U; Windows NT 6.1; et; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 -Mozilla/5.0 (Windows; U; Windows NT 6.0; nl; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; es-ES; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB5 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.5.9 (de) -Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.0 (.NET CLR 3.0.30618) -Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 -Mozilla/5.0 (X11; U; Linux x86_64; es-ES; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc11 Firefox/3.5.8 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100318 Gentoo Firefox/3.5.8 -Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 -Mozilla/5.0 (X11; U; Linux i686; ja-JP; rv:1.9.1.8) Gecko/20100216 Fedora/3.5.8-1.fc12 Firefox/3.5.8 -Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.8 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 -Mozilla/5.0 (X11; U; FreeBSD i386; ja-JP; rv:1.9.1.8) Gecko/20100305 Firefox/3.5.8 -Mozilla/5.0 (Windows; U; Windows NT 6.1; sl; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 (.NET CLR 3.5.30729) FirePHP/0.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB7.0 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100305 Gentoo Firefox/3.5.7 -Mozilla/5.0 (X11; U; Linux x86_64; cs-CZ; rv:1.9.1.7) Gecko/20100106 Ubuntu/9.10 (karmic) Firefox/3.5.7 -Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.7) Gecko/20091222 SUSE/3.5.7-1.1.1 Firefox/3.5.7 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6 -Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.0.04506.648) -Mozilla/5.0 (Windows; U; Windows NT 5.1; fa; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 MRA 5.5 (build 02842) Firefox/3.5.7 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.6) Gecko/20100117 Gentoo Firefox/3.5.6 -Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.6) Gecko/20091216 Fedora/3.5.6-1.fc11 Firefox/3.5.6 GTB6 -Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6 GTB6 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.6) Gecko/20100118 Gentoo Firefox/3.5.6 -Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB6 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 GTB7.0 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.6) Gecko/20091201 SUSE/3.5.6-1.1.1 Firefox/3.5.6 -Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.9.1.6) Gecko/20100107 Fedora/3.5.6-1.fc12 Firefox/3.5.6 -Mozilla/5.0 (X11; U; Linux i686; ca; rv:1.9.1.6) Gecko/20091215 Ubuntu/9.10 (karmic) Firefox/3.5.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; it; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; id; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.4 (build 02647) Firefox/3.5.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 MRA 5.5 (build 02842) Firefox/3.5.6 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB6 (.NET CLR 3.5.30729) FBSMTWB -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729) FBSMTWB -Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8pre) Gecko/20091227 Ubuntu/9.10 (karmic) Firefox/3.5.5 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091114 Gentoo Firefox/3.5.5 -Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 -Mozilla/5.0 (Windows; U; Windows NT 6.1; uk; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.5) Gecko/Firefox/3.5.5 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 MRA 5.5 (build 02842) Firefox/3.5.5 -Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.8.1) Gecko/20091102 Firefox/3.5.5 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; pl; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 FBSMTWB -Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.1.4) Gecko/20091016 SUSE/3.5.4-1.1.2 Firefox/3.5.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729) FBSMTWB -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4 ( .NET CLR 3.5.30729; .NET4.0E) -Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.4) Gecko/20091007 Firefox/3.5.4 -Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.3pre -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090914 Slackware/13.0_stable Firefox/3.5.3 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 -Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 -Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090919 Firefox/3.5.3 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.3) Gecko/20090912 Gentoo Firefox/3.5.3 FirePHP/0.3 -Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 GTB5 -Mozilla/5.0 (X11; U; FreeBSD i386; ru-RU; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.5.3;MEGAUPLOAD 1.0 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; fi; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 2.0.50727; .NET CLR 3.0.30618; .NET CLR 3.5.21022; .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; bg; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; pl; rv:1.9.1.2) Gecko/20090911 Slackware Firefox/3.5.2 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Slackware Firefox/3.5.2 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090803 Firefox/3.5.2 Slackware -Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.9.1.2) Gecko/20090804 Firefox/3.5.2 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Slackware/13.0 Firefox/3.5.2 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (X11; U; Linux i686 (x86_64); fr; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB7.1 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; es-MX; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (Windows; U; Windows NT 5.1; uk; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 -Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 FirePHP/0.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.16) Gecko/20101130 AskTbMYC/3.9.1.14019 Firefox/3.5.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; it; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.16) Gecko/20101130 MRA 5.4 (build 02647) Firefox/3.5.16 ( .NET CLR 3.5.30729; .NET4.0C) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.16) Gecko/20101130 AskTbPLTV5/3.8.0.12304 Firefox/3.5.16 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 GTB7.1 -Mozilla/5.0 (X11; U; Linux x86_64; it; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15 -Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.1.15) Gecko/20101027 Fedora/3.5.15-1.fc12 Firefox/3.5.15 -Mozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.9.1.13) Gecko/20100914 Firefox/3.5.13 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.5.12 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.12) Gecko/20100824 MRA 5.7 (build 03755) Firefox/3.5.12 -Mozilla/5.0 (X11; U; Linux; en-US; rv:1.9.1.11) Gecko/20100720 Firefox/3.5.11 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 ( .NET CLR 3.5.30729; .NET4.0C) -Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 ( .NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.11 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.1.10) Gecko/20100506 SUSE/3.5.10-0.1.1 Firefox/3.5.10 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.10) Gecko/20100504 Firefox/3.5.10 GTB7.0 ( .NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux x86_64; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100524 Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Linux Mint/7 (Gloria) Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux x86; rv:1.9.1.1) Gecko/20090716 Linux Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2pre) Gecko/20090729 Ubuntu/9.04 (jaunty) Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090722 Gentoo Firefox/3.5.1 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1.1) Gecko/20090714 SUSE/3.5.1-1.1 Firefox/3.5.1 -Mozilla/5.0 (X11; U; DragonFly i386; de; rv:1.9.1) Gecko/20090720 Firefox/3.5.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; tr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 4.0.20506) -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1 GTB5 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1) Gecko/20090630 Firefox/3.5 GTB6 -Mozilla/5.0 (X11; U; Linux i686; ja; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) -Mozilla/5.0 (X11; U; Linux i686; it-IT; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5 -Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.1) Gecko/20090624 Firefox/3.5 -Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5 -Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1) Gecko/20090701 Ubuntu/9.04 (jaunty) Firefox/3.5 -Mozilla/5.0 (X11; U; Linux i686; en-us; rv:1.9.0.2) Gecko/2008092313 Ubuntu/9.04 (jaunty) Firefox/3.5 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Ubuntu/8.04 (hardy) Firefox/3.5 -Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 -Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.9.1) Gecko/20090624 Firefox/3.5 -Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.1) Gecko/20090703 Firefox/3.5 -Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.9.0.10) Gecko/20090624 Firefox/3.5 -Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5 (.NET CLR 4.0.20506) -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1) Gecko/20090612 Firefox/3.5 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 4.0.20506) -Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1) Gecko/20090624 Firefox/3.5 -Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729) -Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.25 (KHTML, like Gecko) Chrome/12.0.706.0 Safari/534.25 -Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.703.0 Chrome/12.0.703.0 Safari/534.24 -Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.702.0 Chrome/12.0.702.0 Safari/534.24 -Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24 -Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/12.0.702.0 Safari/534.24 -Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24 -Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.699.0 Safari/534.24 -Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.698.0 Safari/534.24 -Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.697.0 Safari/534.24 -Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.43 Safari/534.24 -Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24 -Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.34 Safari/534.24 -Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 -Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 -Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24 -Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.14 Safari/534.24 -Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24 -Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.12 Safari/534.24 -Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.04 Chromium/11.0.696.0 Chrome/11.0.696.0 Safari/534.24 -Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.0 Safari/534.24 -Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.694.0 Safari/534.24 -Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.23 (KHTML, like Gecko) Chrome/11.0.686.3 Safari/534.23 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.682.0 Safari/534.21 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 -Mozilla/5.0 (Windows NT) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.669.0 Safari/534.20 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.19 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.19 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.661.0 Safari/534.18 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.18 (KHTML, like Gecko) Chrome/11.0.660.0 Safari/534.18 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.654.0 Safari/534.17 -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.652.0 Safari/534.17 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.82 Safari/534.16 -Mozilla/5.0 (X11; U; Linux armv7l; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 -Mozilla/5.0 (X11; U; FreeBSD x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 -Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.134 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.127 Chrome/10.0.648.127 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.11 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.0 Chrome/10.0.648.0 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.0 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.642.0 Chrome/10.0.642.0 Safari/534.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.639.0 Safari/534.16 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.638.0 Safari/534.16 -Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.16 SUSE/10.0.626.0 (KHTML, like Gecko) Chrome/10.0.626.0 Safari/534.16 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.613.0 Safari/534.15 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.613.0 Chrome/10.0.613.0 Safari/534.15 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.04 Chromium/10.0.612.3 Chrome/10.0.612.3 Safari/534.15 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.612.1 Safari/534.15 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.611.0 Chrome/10.0.611.0 Safari/534.15 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.602.0 Safari/534.14 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML,like Gecko) Chrome/9.1.0.0 Safari/540.0 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/9.1.0.0 Safari/540.0 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Ubuntu/10.10 Chromium/9.0.600.0 Chrome/9.0.600.0 Safari/534.14 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.600.0 Safari/534.14 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.599.0 Safari/534.13 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.84 Safari/534.13 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.44 Safari/534.13 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.19 Safari/534.13 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.0 Safari/534.13 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.596.0 Safari/534.13 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/10.04 Chromium/9.0.595.0 Chrome/9.0.595.0 Safari/534.13 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Ubuntu/9.10 Chromium/9.0.592.0 Chrome/9.0.592.0 Safari/534.13 -Mozilla/5.0 (X11; U; Windows NT 6; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.587.0 Safari/534.12 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.579.0 Safari/534.12 -Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US) AppleWebKit/534.12 (KHTML, like Gecko) Chrome/9.0.576.0 Safari/534.12 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/8.1.0.0 Safari/540.0 -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.558.0 Safari/534.10 -Mozilla/5.0 (X11; U; CrOS i686 0.9.130; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.344 Safari/534.10 -Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.343 Safari/534.10 -Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.341 Safari/534.10 -Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339 Safari/534.10 -Mozilla/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.339 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Ubuntu/10.10 Chromium/8.0.552.237 Chrome/8.0.552.237 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/533.3 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.210 Safari/534.10 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.200 Safari/534.10 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.551.0 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.548.0 Safari/534.10 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.544.0 Safari/534.10 -Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/7.0.540.0 Safari/534.10 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.9 (KHTML, like Gecko) Chrome/7.0.531.0 Safari/534.9 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.8 (KHTML, like Gecko) Chrome/7.0.521.0 Safari/534.8 -Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.24 Safari/534.7 -Mozilla/5.0 (X11; U; Linux x86_64; fr-FR) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 -Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.500.0 Safari/534.6 -Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27 -Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5 -Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5 -Mozilla/5.0 (iPod; U; CPU iPhone OS 4_2_1 like Mac OS X; he-il) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; fr; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_1 like Mac OS X; zh-tw) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; pl-pl) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; fr-fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; en-gb) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; nb-no) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; it-it) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; fi-fi) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; fi-fi) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; th-th) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8 -Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ -Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ -Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; fr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; zh-cn) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ru-ru) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ko-kr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/534.1+ (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-au) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; el-gr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ca-es) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-tw) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; it-it) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fr-fr) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 -Mozilla/5.0 (Windows; U; Windows NT 5.0; en-en) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; nl-nl) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; ja-jp) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de-de) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7; en-us) AppleWebKit/533.4 (KHTML, like Gecko) Version/4.1 Safari/533.4 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; tr) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; de) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081212 Mozilla/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/526.9 (KHTML, like Gecko) Version/4.0dp1 Safari/526.8 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-gb) AppleWebKit/528.10+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-us) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-gb) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2 -Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-gb) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Windows; U; Windows NT 5.1; cs-CZ) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; da-dk) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.4+ (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; de-de) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ja-jp) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B5097d Safari/6531.22.7 -Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 -Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc -Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10 -Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/123 -Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-TW) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Windows; U; Windows NT 5.1; de-DE) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; hu-hu) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/531.21.11 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; ru-ru) AppleWebKit/533.2+ (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-at) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10 -Mozilla/5.0 (iPhone; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10 -Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7D11 Safari/531.21.10 -Mozilla/5.0 (iPad; U; CPU OS 3_2_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B500 Safari/53 -Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10 -Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; es-es) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B360 Safari/531.21.10 -Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.1021.10gin_lib.cc -Mozilla/5.0 (iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-us) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9.2009 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; en-us) AppleWebKit/532.0+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; nl-nl) AppleWebKit/532.3+ (KHTML, like Gecko) Version/4.0.3 Safari/531.9 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fi-fi) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.3 Safari/531.21.10 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532+ (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; pl-PL) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 5.2; de-DE) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19.1 -Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/4.0.1 Safari/530.18 -Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.1 Safari/530.18 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; he-IL) AppleWebKit/528+ (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; es-es) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; nb-NO) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; hu-HU) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16 -Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10 -Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10 -Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01 -Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01 -Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01 -Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01 -Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01 -Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01 -Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01 -Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00 -Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00 -Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00 -Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00 -Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00 -Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00 -Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00 -Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00 -Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00 -Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.7.39 Version/11.00 -Opera/9.80 (Windows NT 5.1; U; MRA 5.5 (build 02842); ru) Presto/2.7.62 Version/11.00 -Opera/9.80 (Windows NT 5.1; U; it) Presto/2.7.62 Version/11.00 -Mozilla/5.0 (Windows NT 6.0; U; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 -Mozilla/5.0 (Windows NT 5.1; U; pl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 -Mozilla/5.0 (Windows NT 5.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00 -Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; pl) Opera 11.00 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; fr) Opera 11.00 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; ja) Opera 11.00 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; en) Opera 11.00 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; pl) Opera 11.00 -Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.6.31 Version/10.70 -Mozilla/5.0 (Windows NT 5.2; U; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70 -Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70 -Opera/9.80 (Windows NT 5.2; U; zh-cn) Presto/2.6.30 Version/10.63 -Opera/9.80 (Windows NT 5.2; U; en) Presto/2.6.30 Version/10.63 -Opera/9.80 (Windows NT 5.1; U; MRA 5.6 (build 03278); ru) Presto/2.6.30 Version/10.63 -Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.62 -Mozilla/5.0 (X11; Linux x86_64; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.62 -Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; de) Opera 10.62 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; en) Opera 10.62 -Opera/9.80 (X11; Linux i686; U; pl) Presto/2.6.30 Version/10.61 -Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.6.30 Version/10.61 -Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.30 Version/10.61 -Opera/9.80 (Windows NT 6.1; U; en) Presto/2.6.30 Version/10.61 -Opera/9.80 (Windows NT 6.0; U; it) Presto/2.6.30 Version/10.61 -Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.6.30 Version/10.61 -Opera/9.80 (Windows 98; U; de) Presto/2.6.30 Version/10.61 -Opera/9.80 (Macintosh; Intel Mac OS X; U; nl) Presto/2.6.30 Version/10.61 -Opera/9.80 (X11; Linux i686; U; en) Presto/2.5.27 Version/10.60 -Opera/9.80 (Windows NT 6.0; U; nl) Presto/2.6.30 Version/10.60 -Opera/10.60 (Windows NT 5.1; U; zh-cn) Presto/2.6.30 Version/10.60 -Opera/10.60 (Windows NT 5.1; U; en-US) Presto/2.6.30 Version/10.60 -Opera/9.80 (X11; Linux i686; U; it) Presto/2.5.24 Version/10.54 -Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.5.24 Version/10.53 -Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 -Mozilla/5.0 (Windows NT 5.1; U; Firefox/5.0; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 -Mozilla/5.0 (Windows NT 5.1; U; Firefox/4.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 -Mozilla/5.0 (Windows NT 5.1; U; Firefox/3.5; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.53 -Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; ko) Opera 10.53 -Opera/9.80 (Windows NT 6.1; U; fr) Presto/2.5.24 Version/10.52 -Opera/9.80 (Windows NT 6.1; U; en) Presto/2.5.22 Version/10.51 -Opera/9.80 (Windows NT 6.0; U; cs) Presto/2.5.22 Version/10.51 -Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51 -Opera/9.80 (Linux i686; U; en) Presto/2.5.22 Version/10.51 -Mozilla/5.0 (Windows NT 6.1; U; en-GB; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51 -Mozilla/5.0 (Linux i686; U; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51 -Mozilla/4.0 (compatible; MSIE 8.0; Linux i686; en) Opera 10.51 -Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.5.22 Version/10.50 -Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.5.22 Version/10.50 -Opera/9.80 (Windows NT 6.1; U; sk) Presto/2.6.22 Version/10.50 -Opera/9.80 (Windows NT 6.1; U; ja) Presto/2.5.22 Version/10.50 -Opera/9.80 (Windows NT 6.0; U; zh-cn) Presto/2.5.22 Version/10.50 -Opera/9.80 (Windows NT 5.1; U; sk) Presto/2.5.22 Version/10.50 -Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.22 Version/10.50 -Opera/10.50 (Windows NT 6.1; U; en-GB) Presto/2.2.2 -Opera/9.80 (S60; SymbOS; Opera Tablet/9174; U; en) Presto/2.7.81 Version/10.5 -Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10 -Opera/9.80 (X11; Linux x86_64; U; it) Presto/2.2.15 Version/10.10 -Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.10 -Opera/9.80 (Windows NT 6.0; U; Gecko/20100115; pl) Presto/2.2.15 Version/10.10 -Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.10 -Opera/9.80 (Windows NT 5.1; U; de) Presto/2.2.15 Version/10.10 -Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.2.15 Version/10.10 -Mozilla/5.0 (Windows NT 6.0; U; tr; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 10.10 -Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; de) Opera 10.10 -Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.0; tr) Opera 10.10 -Opera/9.80 (X11; Linux x86_64; U; en-GB) Presto/2.2.15 Version/10.01 -Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux x86_64; U; de) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; ru) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; pt-BR) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; pl) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; nb) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; en) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; Debian; pl) Presto/2.2.15 Version/10.00 -Opera/9.80 (X11; Linux i686; U; de) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 6.1; U; en) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 6.1; U; de) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 6.0; U; en) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 6.0; U; de) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 5.2; U; en) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/10.00 -Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.2.15 Version/10.00 \ No newline at end of file From 0b52c5eb10a100b10a636eda3a6b1d8a4f0eac0a Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 16:35:44 -0300 Subject: [PATCH 11/14] =?UTF-8?q?fix:=20problema=20de=20comunica=C3=A7?= =?UTF-8?q?=C3=A3o=20entre=20os=20conteineres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compose.yaml | 15 ++++++++++++++- main.py | 3 ++- summary_processor.py | 20 +++++++++----------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/compose.yaml b/compose.yaml index 31c4be0..41693db 100644 --- a/compose.yaml +++ b/compose.yaml @@ -9,6 +9,11 @@ services: - 8080:8080 environment: - MONGO_URL=mongodb://mongo:27017/meu_banco + volumes: + - ./models:/app/models + - ./Data:/app/Data + - ./Summaries:/app/Summaries + mongo: image: mongo:6 restart: always @@ -25,6 +30,10 @@ services: - server environment: - MONGO_URL=mongodb://mongo:27017/meu_banco + volumes: + - ./models:/app/models + - ./Data:/app/Data + - ./Summaries:/app/Summaries summary-processor: build: @@ -36,4 +45,8 @@ services: - server - processor environment: - - MONGO_URL=mongodb://mongo:27017/meu_banco \ No newline at end of file + - MONGO_URL=mongodb://mongo:27017/meu_banco + volumes: + - ./models:/app/models + - ./Data:/app/Data + - ./Summaries:/app/Summaries \ No newline at end of file diff --git a/main.py b/main.py index 0974beb..2521f75 100644 --- a/main.py +++ b/main.py @@ -276,7 +276,7 @@ def upload_file(): upload_input_files(filename, file_path) timestamp = datetime.now() - summary_collection.insert({ + result = summary_collection.insert_one({ "file_path": file_path, "summary_filename": summary_filename, "model_name": model_name, @@ -284,6 +284,7 @@ def upload_file(): "status": "Queued", "timestamp": timestamp }) + print("Job de summary criado, _id:", result.inserted_id) return Response(json.dumps({'success': True}), 200, {'contentType': 'application/json'}) diff --git a/summary_processor.py b/summary_processor.py index 91d77fe..220797c 100644 --- a/summary_processor.py +++ b/summary_processor.py @@ -14,11 +14,7 @@ def getJob(): def updateJobStatus(jobid, status): summary_collection.update_one( {"_id": jobid}, - { - "$set": { - "status": status - } - } + {"$set": {"status": status}} ) def run_job(job): @@ -32,21 +28,23 @@ def run_job(job): 'status': 'Queued', 'timestamp': datetime.datetime(2019, 3, 27, 10, 9, 50, 24000)} ''' for document in job: + jobid = document["_id"] try: - jobid = document["_id"] updateJobStatus(jobid, "Processing") output_json = create_summary(document["file_path"], document["model_file_name"]) convert_txt_html(output_json) - if not os.path.isdir('Summaries'): - os.mkdir('Summaries') - json.dump(output_json, open("Summaries/" + document["summary_filename"], "w")) + + os.makedirs("Summaries", exist_ok=True) + + with open(os.path.join("Summaries", document["summary_filename"]), "w") as f: + json.dump(output_json, f) + updateJobStatus(jobid, "Done") except Exception as e: - print (e) + print("Erro ao processar job", jobid, "->", e) updateJobStatus(jobid, "Error") - def processNextJob(): print('fetching job') #job = getJob() #job is a group of jobs that have the 'Queued' status in the database From 6218bfdf29b9cfb33d79988ccdab4d14100ac2d2 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 16:37:56 -0300 Subject: [PATCH 12/14] novos arquivos para ignorar --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 7bbc71c..1efedbf 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ __pycache__/ .Python env/ build/ +Data/ develop-eggs/ dist/ downloads/ @@ -99,3 +100,6 @@ ENV/ # mypy .mypy_cache/ + +#Models +*.pkl \ No newline at end of file From 1a0be3a65c4a5ded8f86db0e234adec4d762e6af Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 18:59:17 -0300 Subject: [PATCH 13/14] ajuste no sistema de gerar resumo de documentos --- .dockerignore | 1 + compose.yaml | 4 +++- main.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/.dockerignore b/.dockerignore index feb80fa..2e73abe 100644 --- a/.dockerignore +++ b/.dockerignore @@ -38,5 +38,6 @@ README-EN.md README.Docker.md LICENSE.md CONTRIBUTING-EN.md +CONTRIBUTING-PTBR.md CONTRIBUTING.md CODE-OF-CONDUCT.md \ No newline at end of file diff --git a/compose.yaml b/compose.yaml index 41693db..009af22 100644 --- a/compose.yaml +++ b/compose.yaml @@ -13,6 +13,7 @@ services: - ./models:/app/models - ./Data:/app/Data - ./Summaries:/app/Summaries + - ./static/documents:/app/static/documents mongo: image: mongo:6 @@ -49,4 +50,5 @@ services: volumes: - ./models:/app/models - ./Data:/app/Data - - ./Summaries:/app/Summaries \ No newline at end of file + - ./Summaries:/app/Summaries + - ./static/documents:/app/static/documents \ No newline at end of file diff --git a/main.py b/main.py index 2521f75..bc61208 100644 --- a/main.py +++ b/main.py @@ -323,7 +323,7 @@ def download(): headers={"Content-disposition": "attachment; filename=" + summary_filename}) - +''' def upload_input_files(filename, file_path): try: @@ -342,4 +342,56 @@ def upload_input_files(filename, file_path): print (e) for name in dirs: os.rmdir(os.path.join(root, name)) - os.remove(filename) \ No newline at end of file + os.remove(filename) +''' +def upload_input_files(zip_filename, dest_dir): + """ + zip_filename: nome do arquivo .zip (no cwd) ou caminho completo. + dest_dir: pasta destino onde os arquivos serão extraídos. + """ + + # Garante que a pasta de destino existe + os.makedirs(dest_dir, exist_ok=True) + + # Se zip_filename não for caminho absoluto, considera que está no cwd + if not os.path.isabs(zip_filename): + zip_path = os.path.join(os.getcwd(), zip_filename) + else: + zip_path = zip_filename + + try: + # 1) Extrair o ZIP + with zipfile.ZipFile(zip_path, "r") as zip_ref: + zip_ref.extractall(dest_dir) + + # 2) "Achatar": mover arquivos de subpastas para dest_dir + for root, dirs, files in os.walk(dest_dir, topdown=False): + if root != dest_dir: + for name in files: + src = os.path.join(root, name) + dst = os.path.join(dest_dir, name) + + # Se já existir arquivo com o mesmo nome, você pode: + # - renomear + # - pular + # - sobrescrever + # Aqui vou sobrescrever + if os.path.exists(dst): + os.remove(dst) + os.rename(src, dst) + + # Remover diretórios vazios + for d in dirs: + dir_path = os.path.join(root, d) + if not os.listdir(dir_path): + os.rmdir(dir_path) + + except Exception as e: + print("Erro em upload_input_files:", e) + finally: + # Se quiser sempre apagar o zip depois de extrair: + try: + if os.path.exists(zip_path): + os.remove(zip_path) + except Exception as e: + print("Erro ao remover zip:", e) \ No newline at end of file From 041e0f7861292a6823f3cf1237a2f616714c6b36 Mon Sep 17 00:00:00 2001 From: Samuel Carvalho Date: Sat, 15 Nov 2025 19:02:43 -0300 Subject: [PATCH 14/14] =?UTF-8?q?fix:=20Atualiza=C3=A7=C3=A3o=20em=20bibli?= =?UTF-8?q?oteca=20decaida=20no=20html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 +++++-- templates/visualize_summary.html | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 1efedbf..a2fa287 100644 --- a/.gitignore +++ b/.gitignore @@ -101,5 +101,8 @@ ENV/ # mypy .mypy_cache/ -#Models -*.pkl \ No newline at end of file +# Models +*.pkl + +# Outros +Summaries/ \ No newline at end of file diff --git a/templates/visualize_summary.html b/templates/visualize_summary.html index 450c788..1278098 100644 --- a/templates/visualize_summary.html +++ b/templates/visualize_summary.html @@ -208,7 +208,10 @@

Entities

- + + + + {##}