should work
authorahmad <ahmad@dw-10.eecs.uci.edu>
Mon, 3 Dec 2018 00:19:57 +0000 (16:19 -0800)
committerahmad <ahmad@dw-10.eecs.uci.edu>
Mon, 3 Dec 2018 00:19:57 +0000 (16:19 -0800)
gdax-orderbook-hpp/demo/dependencies/libcds-2.3.2.tar.gz [new file with mode: 0644]
gdax-orderbook-hpp/demo/dependencies/rapidjson-1.1.0.tar.gz [new file with mode: 0644]
gdax-orderbook-hpp/demo/dependencies/websocketpp-0.7.0.tar.gz [new file with mode: 0644]
mabain/binaries/Makefile [new file with mode: 0644]
mabain/binaries/expr_parser.cpp [new file with mode: 0644]
mabain/binaries/expr_parser.h [new file with mode: 0644]
mabain/binaries/hexbin.cpp [new file with mode: 0644]
mabain/binaries/hexbin.h [new file with mode: 0644]
mabain/binaries/mbc.cpp [new file with mode: 0644]
mabain/src/test/key_list_3 [new file with mode: 0644]

diff --git a/gdax-orderbook-hpp/demo/dependencies/libcds-2.3.2.tar.gz b/gdax-orderbook-hpp/demo/dependencies/libcds-2.3.2.tar.gz
new file mode 100644 (file)
index 0000000..adbad83
Binary files /dev/null and b/gdax-orderbook-hpp/demo/dependencies/libcds-2.3.2.tar.gz differ
diff --git a/gdax-orderbook-hpp/demo/dependencies/rapidjson-1.1.0.tar.gz b/gdax-orderbook-hpp/demo/dependencies/rapidjson-1.1.0.tar.gz
new file mode 100644 (file)
index 0000000..eb129f3
Binary files /dev/null and b/gdax-orderbook-hpp/demo/dependencies/rapidjson-1.1.0.tar.gz differ
diff --git a/gdax-orderbook-hpp/demo/dependencies/websocketpp-0.7.0.tar.gz b/gdax-orderbook-hpp/demo/dependencies/websocketpp-0.7.0.tar.gz
new file mode 100644 (file)
index 0000000..91e7fb7
Binary files /dev/null and b/gdax-orderbook-hpp/demo/dependencies/websocketpp-0.7.0.tar.gz differ
diff --git a/mabain/binaries/Makefile b/mabain/binaries/Makefile
new file mode 100644 (file)
index 0000000..17714eb
--- /dev/null
@@ -0,0 +1,17 @@
+CPP=g++
+
+all: mbc
+
+CFLAGS  = -I. -I../src -I../src/util -Wall -Werror -g -O3 -c -std=c++11
+LDFLAGS = -lpthread -lreadline -lncurses -L../src -lmabain
+
+mbc: mbc.cpp expr_parser.h expr_parser.cpp hexbin.h hexbin.cpp
+       $(CPP) $(CFLAGS) mbc.cpp
+       $(CPP) $(CFLAGS) expr_parser.cpp
+       $(CPP) $(CFLAGS) hexbin.cpp
+       $(CPP) mbc.o expr_parser.o hexbin.o -o mbc $(LDFLAGS)
+
+build: mbc
+
+clean:
+       -rm -f *.o mbc
diff --git a/mabain/binaries/expr_parser.cpp b/mabain/binaries/expr_parser.cpp
new file mode 100644 (file)
index 0000000..2fc6049
--- /dev/null
@@ -0,0 +1,145 @@
+/**
+ * Copyright (C) 2017 Cisco Inc.
+ *
+ * This program is free software: you can redistribute it and/or  modify
+ * it under the terms of the GNU General Public License, version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// @author Changxue Deng <chadeng@cisco.com>
+
+#include <string.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <iostream>
+
+#include "expr_parser.h"
+#include "hexbin.h"
+
+ExprParser::ExprParser(const std::string &exp)
+{
+    pos = 0;
+    expr = exp;
+    err_str = "";
+}
+
+ExprParser::~ExprParser()
+{
+}
+
+int ExprParser::Evaluate(std::string &result)
+{
+    result = "";
+    int rval = Parse(result);
+    if(rval < 0)
+    {
+        std::cout << err_str << "\n";
+    }
+    else if(rval == 0 && pos < expr.length())
+    {
+        std::cout << "extra string " + expr.substr(pos)
+                  << " found at the end of expression\n";
+        return -1;
+    }
+
+    return rval;
+}
+
+// Grammer:
+//    S ---> E
+//    E ---> bin( E )
+//    E ---> hex( E )
+//    E ---> T
+//    E ---> T + E (NOT IMPLEMENTED YET)
+//    T ---> literal string
+// Sample expressions
+// literal string: 'abcdefg'
+// convert hex to binary: bin('0001ff01')
+// convert hex to binary and back to hex:
+// hex(bin('4da32feebf1611e7bd98c0b13cdb778c'))=='4da32feebf1611e7bd98c0b13cdb778c'
+int ExprParser::Parse(std::string &result)
+{
+    if(pos >= expr.length())
+        return 0;
+
+    int rval;
+    switch(expr[pos])
+    {
+        case 'b':
+            if(expr.find("in(", pos+1, 3) == std::string::npos)
+            {
+                err_str = "unrecognized expression " + expr.substr(pos);
+                return -1;
+            }
+            pos += 4;
+            rval = Parse(result);
+            if(rval < 0)
+                return rval;
+            if(expr[pos] != ')')
+            {
+                err_str = "missing ) at the end of " + expr.substr(0, pos);
+                return -1;
+            }
+            pos++;
+            rval = hex_2_bin(result.c_str(), result.length(), buffer,
+                             EXPR_PARSER_BUFFER_SIZE);
+            if(rval < 0)
+            {
+                err_str = "failed to convert hex string " + result + " to binary format";
+                return -1;
+            }
+            result = std::string((char *)buffer, rval);
+            break;
+        case 'h':
+            if(expr.find("ex(", pos+1, 3) == std::string::npos)
+            {
+                err_str = "unrecognized expression " + expr.substr(pos);
+                return -1;
+            }
+            pos += 4;
+            rval = Parse(result);
+            if(rval < 0)
+                return rval;
+            if(expr[pos] != ')')
+            {
+                err_str = "missing ) at the end of " + expr.substr(0, pos);
+                return -1;
+            }
+            pos++;
+            rval = bin_2_hex((const uint8_t *)result.data(), result.size(),
+                             (char *)buffer, EXPR_PARSER_BUFFER_SIZE);
+            if(rval < 0)
+            {
+                err_str = "failed to convert binary string to hex";
+                return -1;
+            }
+            result = std::string((char *)buffer, rval);
+            break;
+        case '\'':
+            {
+                size_t endp = expr.find('\'', pos+1);
+                if(endp ==  std::string::npos)
+                {
+                    err_str = "expression " + expr.substr(0, pos) + " missing closing \'";
+                    return -1;
+                }
+                result = expr.substr(pos+1, endp-pos-1);
+                pos = endp + 1;
+            }
+            break;
+        default:
+            err_str  = "unrecognized expression " + expr.substr(pos) + "\n";
+            err_str += "                        ^";
+            return -1; 
+    }
+
+    return 0;
+}
diff --git a/mabain/binaries/expr_parser.h b/mabain/binaries/expr_parser.h
new file mode 100644 (file)
index 0000000..c80d495
--- /dev/null
@@ -0,0 +1,42 @@
+/**
+ * Copyright (C) 2017 Cisco Inc.
+ *
+ * This program is free software: you can redistribute it and/or  modify
+ * it under the terms of the GNU General Public License, version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// @author Changxue Deng <chadeng@cisco.com>
+
+#ifndef __EXPR_PARSER_H__
+#define __EXPR_PARSER_H__
+
+#include <string>
+
+// A simple mabain client expression LL parser
+class ExprParser
+{
+public:
+    ExprParser(const std::string &expr);
+    ~ExprParser();
+    int Evaluate(std::string &result);
+
+private:
+    int Parse(std::string &result);
+
+    size_t pos;
+    std::string expr;
+#define EXPR_PARSER_BUFFER_SIZE 1024
+    uint8_t buffer[EXPR_PARSER_BUFFER_SIZE];
+    std::string err_str;
+};
+
+#endif
diff --git a/mabain/binaries/hexbin.cpp b/mabain/binaries/hexbin.cpp
new file mode 100644 (file)
index 0000000..e737e4a
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * Copyright (C) 2017 Cisco Inc.
+ *
+ * This program is free software: you can redistribute it and/or  modify
+ * it under the terms of the GNU General Public License, version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// @author Changxue Deng <chadeng@cisco.com>
+
+#include <stdio.h>
+
+#include "hexbin.h"
+
+int bin_2_hex(const uint8_t *data, int len, char *buff, int buf_size)
+{
+    if(buf_size < 2*len+1) return -1;
+    for(int i = 0; i < len; i++)
+    {
+        sprintf(buff + 2*i, "%02x", data[i]);
+    }
+    len *= 2;
+    buff[len] = '\0';
+    return len;
+}
+
+static inline int hex_to_half_byte(char hex)
+{
+    switch(hex)
+    {
+        case '0': return 0;
+        case '1': return 1;
+        case '2': return 2;
+        case '3': return 3;
+        case '4': return 4;
+        case '5': return 5;
+        case '6': return 6;
+        case '7': return 7;
+        case '8': return 8;
+        case '9': return 9;
+        case 'a':
+        case 'A': return 10;
+        case 'b':
+        case 'B': return 11;
+        case 'c':
+        case 'C': return 12;
+        case 'd':
+        case 'D': return 13;
+        case 'e':
+        case 'E': return 14;
+        case 'f':
+        case 'F': return 15;
+        default:  return -1;
+    }
+}
+
+int hex_2_bin(const char *data, int len, uint8_t *buff, int buf_size)
+{
+    if(len % 2 != 0) return -1;
+    len = len/2;
+    if(buf_size < len) return -1;
+
+    char high_byte, low_byte;
+    for(int i = 0; i < len; i++)
+    {
+        high_byte = hex_to_half_byte(data[2*i]);
+        low_byte  = hex_to_half_byte(data[2*i + 1]);
+        if(high_byte < 0 || low_byte < 0) return -1;
+        buff[i] = (high_byte << 4) + low_byte;
+    }
+
+    return len;
+}
diff --git a/mabain/binaries/hexbin.h b/mabain/binaries/hexbin.h
new file mode 100644 (file)
index 0000000..cb8d99a
--- /dev/null
@@ -0,0 +1,27 @@
+/**
+ * Copyright (C) 2017 Cisco Inc.
+ *
+ * This program is free software: you can redistribute it and/or  modify
+ * it under the terms of the GNU General Public License, version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// @author Changxue Deng <chadeng@cisco.com>
+
+#ifndef __HEXBIN_H__
+#define __HEXBIN_H__
+
+#include <stdint.h>
+
+int bin_2_hex(const uint8_t *data, int len, char *buff, int buf_size);
+int hex_2_bin(const char *data, int len, uint8_t *buff, int buf_size);
+
+#endif
diff --git a/mabain/binaries/mbc.cpp b/mabain/binaries/mbc.cpp
new file mode 100644 (file)
index 0000000..70099c9
--- /dev/null
@@ -0,0 +1,676 @@
+/**
+ * Copyright (C) 2017 Cisco Inc.
+ *
+ * This program is free software: you can redistribute it and/or  modify
+ * it under the terms of the GNU General Public License, version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// @author Changxue Deng <chadeng@cisco.com>
+
+// A mabain command-line client
+
+#include <stdlib.h>
+#include <string.h>
+#include <iostream>
+#include <fstream>
+#include <string> 
+#include <assert.h>
+#include <signal.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#include "db.h"
+#include "mb_data.h"
+#include "dict.h"
+#include "error.h"
+#include "version.h"
+
+#include "hexbin.h"
+#include "expr_parser.h"
+
+using namespace mabain;
+
+enum mbc_command {
+    COMMAND_NONE = 0,
+    COMMAND_QUIT = 1,
+    COMMAND_UNKNOWN = 2,
+    COMMAND_STATS = 3,
+    COMMAND_FIND = 4,
+    COMMAND_FIND_ALL = 5,
+    COMMAND_INSERT = 6,
+    COMMAND_REPLACE = 7,
+    COMMAND_DELETE = 8,
+    COMMAND_DELETE_ALL = 9,
+    COMMAND_HELP = 10,
+    COMMAND_RESET_N_WRITER = 11,
+    COMMAND_RESET_N_READER = 12,
+    COMMAND_FIND_LPREFIX = 13,
+    COMMAND_PRINT_HEADER = 14,
+    COMMAND_FIND_HEX = 15,
+    COMMAND_FIND_LPREFIX_HEX = 16,
+    COMMAND_RECLAIM_RESOURCES = 17,
+    COMMAND_PARSING_ERROR = 18,
+};
+
+volatile bool quit_mbc = false;
+static void HandleSignal(int sig)
+{
+    switch(sig)
+    {
+        case SIGSEGV:
+            std::cerr << "process segfault\n";
+            abort();
+        case SIGTERM:
+        case SIGINT:
+        case SIGQUIT:
+        case SIGHUP:
+        case SIGPIPE:
+            quit_mbc = true;
+        case SIGUSR1:
+        case SIGUSR2:
+            break;
+    }
+}
+
+static void usage(const char *prog)
+{
+    std::cout << "Usage: " << prog << " -d mabain-directory [-im index-memcap] [-dm data-memcap] [-w] [-e query] [-s script-file]\n";
+    std::cout <<"\t-d mabain databse directory\n";
+    std::cout <<"\t-im index memcap\n";
+    std::cout <<"\t-dm data memcap\n";
+    std::cout <<"\t-w running in writer mode\n";
+    std::cout <<"\t-e run query on command line\n";
+    std::cout <<"\t-s run queries in a file\n";
+    exit(1);
+}
+
+static void show_help()
+{
+    std::cout << "\tfind(\"key\")\t\tsearch entry by key\n";
+    std::cout << "\tfindPrefix(\"key\")\tsearch entry by key using longest prefix match\n";
+    std::cout << "\tfindAll\t\t\tlist all entries\n";
+    std::cout << "\tinsert(\"key\":\"value\")\tinsert a key-value pair\n";
+    std::cout << "\treplace(\"key\":\"value\")\treplace a key-value pair\n";
+    std::cout << "\tdelete(\"key\")\t\tdelete entry by key\n";
+    std::cout << "\tdeleteAll\t\tdelete all entries\n";
+    std::cout << "\tshow\t\t\tshow database statistics\n";
+    std::cout << "\thelp\t\t\tshow helps\n";
+    std::cout << "\tquit\t\t\tquit mabain client\n";
+    std::cout << "\tdecWriterCount\t\tClear writer count in shared memory header\n";
+    std::cout << "\tdecReaderCount\t\tdecrement reader count in shared memory header\n";
+    std::cout << "\tprintHeader\t\tPrint shared memory header\n";
+    std::cout << "\treclaimResources\tReclaim deleted resources\n";
+}
+
+static void trim_spaces(const char *cmd, std::string &cmd_trim)
+{
+    cmd_trim.clear();
+
+    int quotation = 0;
+    const char *p = cmd;
+    while(*p != '\0')
+    {
+        if(*p == '\'' || *p == '\"')
+        {
+            cmd_trim.append(1, '\'');
+            quotation ^= 1; 
+        }
+        else if(!isspace(*p) || quotation) 
+        {
+            cmd_trim.append(1, *p);
+        }
+
+        p++;
+    }
+}
+
+static bool check_hex_output(std::string &cmd)
+{
+    size_t pos = cmd.rfind(".hex()");
+    if(pos == std::string::npos)
+        return false;
+    if(pos == cmd.length()-6)
+    {
+        cmd.erase(pos);
+        return true;
+    }
+
+    return false;
+}
+
+static int parse_key_value_pair(const std::string &kv_str,
+                                std::string &key,
+                                std::string &value)
+{
+    // search for ':' that separates key and value pair
+    // currently this utility does not support quotation in
+    // quotation, e.g, "abc\"def" as key or value.
+    size_t pos = 0;
+    int quotation_cnt = 0;
+    for(size_t i = 0; i < kv_str.length(); i++)
+    {
+        if(kv_str[i] == '\'')
+        {
+            quotation_cnt++;
+        }
+        else if(kv_str[i] == ':')
+        {
+            // do not count the ':' in the key or value string.
+            if(quotation_cnt % 2 == 0)
+            {
+                pos = i;
+                break;
+            }
+        }
+    }
+
+    if(pos == 0)
+        return -1;
+
+    ExprParser expr_key(kv_str.substr(0, pos));
+    if(expr_key.Evaluate(key) < 0)
+        return -1;
+
+    ExprParser expr_value(kv_str.substr(pos+1));
+    if(expr_value.Evaluate(value) < 0)
+        return -1;
+
+    return 0;
+}
+
+static int parse_command(std::string &cmd,
+                         std::string &key,
+                         std::string &value)
+{
+    std::string yes;
+    bool hex_output = false;
+
+    key = "";
+    value = "";
+    switch(cmd[0])
+    {
+        case 'q':
+            if(cmd.compare("quit") == 0)
+                return COMMAND_QUIT;
+            break;
+        case 's':
+            if(cmd.compare("show") == 0)
+                return COMMAND_STATS;
+            break;
+        case 'f':
+            hex_output = check_hex_output(cmd);
+            if(cmd.compare(0, 5, "find(") == 0)
+            {
+                if(cmd[cmd.length()-1] != ')')
+                    return COMMAND_UNKNOWN;
+                ExprParser expr(cmd.substr(5, cmd.length()-6));
+                if(expr.Evaluate(key) < 0)
+                    return COMMAND_PARSING_ERROR;
+                if(hex_output)
+                    return COMMAND_FIND_HEX;
+                return COMMAND_FIND;
+            }
+            else if(cmd.compare(0, 11, "findPrefix(") == 0)
+            {
+                if(cmd[cmd.length()-1] != ')')
+                    return COMMAND_UNKNOWN;
+                ExprParser expr(cmd.substr(11, cmd.length()-12));
+                if(expr.Evaluate(key) < 0)
+                    return COMMAND_PARSING_ERROR;
+                if(hex_output)
+                    return COMMAND_FIND_LPREFIX_HEX;
+                return COMMAND_FIND_LPREFIX;
+            }
+            else if(cmd.compare("findAll") == 0)
+                return COMMAND_FIND_ALL;
+            break;
+        case 'd':
+            if(cmd.compare(0, 7, "delete(") == 0)
+            {
+                if(cmd[cmd.length()-1] != ')')
+                    return COMMAND_UNKNOWN;
+                ExprParser expr(cmd.substr(7, cmd.length()-8));
+                if(expr.Evaluate(key) < 0)
+                    return COMMAND_PARSING_ERROR; 
+                return COMMAND_DELETE;
+            }
+            else if(cmd.compare("deleteAll") == 0)
+            {
+                std::cout << "Do you want to delete all entries? Press \'Y\' to continue: ";
+                std::string del_all;
+                std::getline(std::cin, del_all);
+                if(del_all.length() == 0 || del_all[0] != 'Y')
+                    return COMMAND_NONE;
+                return COMMAND_DELETE_ALL;
+            }
+            else if(cmd.compare("decReaderCount") == 0)
+            {
+                std::cout << "Do you want to decrement number of reader? Press \'y\' to continue: ";
+                std::getline(std::cin, yes);   
+                if(yes.length() > 0 && yes[0] == 'y')
+                    return COMMAND_RESET_N_READER;
+                return COMMAND_NONE;
+            }
+            else if(cmd.compare("decWriterCount") == 0)
+            {
+                std::cout << "Do you want to decrement number of writer? Press \'y\' to continue: ";
+                std::getline(std::cin, yes);   
+                if(yes.length() > 0 && yes[0] == 'y')
+                    return COMMAND_RESET_N_WRITER;
+                return COMMAND_NONE;
+            }
+            break;
+        case 'i':
+            if(cmd.compare(0, 7, "insert(") == 0)
+            {
+                if(cmd[cmd.length()-1] != ')')
+                    return COMMAND_UNKNOWN;
+                if(parse_key_value_pair(cmd.substr(7, cmd.length()-8), key, value) < 0)
+                    return COMMAND_PARSING_ERROR;
+                return COMMAND_INSERT;
+            }
+            break;
+        case 'r':
+            if(cmd.compare(0, 8, "replace(") == 0)
+            {
+                if(cmd[cmd.length()-1] != ')')
+                    return COMMAND_UNKNOWN;
+                if(parse_key_value_pair(cmd.substr(8, cmd.length()-9), key, value) < 0)
+                    return COMMAND_PARSING_ERROR;
+                return COMMAND_REPLACE;
+            }
+            else if(cmd.compare("reclaimResources") == 0)
+                return COMMAND_RECLAIM_RESOURCES;
+            else
+                return COMMAND_UNKNOWN;
+            break;
+        case 'h':
+            if(cmd.compare("help") == 0)
+                return COMMAND_HELP;
+            break;
+        case 'p':
+            if(cmd.compare("printHeader") == 0)
+                return COMMAND_PRINT_HEADER;
+            break;
+        default:
+            break;
+    }
+
+    return COMMAND_UNKNOWN;
+}
+
+#define ENTRY_PER_PAGE 20
+static void display_all_kvs(DB *db)
+{
+    if(db == NULL)
+        return;
+
+    int count = 0;
+    for(DB::iterator iter = db->begin(); iter != db->end(); ++iter)
+    {
+        count++;
+        std::cout << iter.key << ": " <<
+                     std::string((char *)iter.value.buff, iter.value.data_len) << "\n";
+        if(count % ENTRY_PER_PAGE == 0)
+        {
+            std::string show_more;
+            std::cout << "Press \'y\' for displaying more: ";
+            std::getline(std::cin, show_more);
+            if(show_more.length() == 0 || show_more[0] != 'y')
+                break;
+        }
+    }
+}
+
+static void display_output(const MBData &mbd, bool hex_output, bool prefix)
+{
+    if(prefix)
+        std::cout << "key length matched: " << mbd.match_len << "\n";
+    if(hex_output)
+    {
+        char hex_buff[256];
+        int len = mbd.data_len;
+        if(256 < 2*len + 1)
+        {
+            std::cout << "display the first 127 bytes\n";
+            len = 127;
+        }
+        if(bin_2_hex((const uint8_t *)mbd.buff, len, hex_buff, 256) < 0)
+            std::cout << "failed to convert binary to hex\n";
+        else 
+            std::cout << hex_buff << "\n";
+    }
+    else
+    {
+        std::cout << std::string((char *)mbd.buff, mbd.data_len) << "\n";
+    }
+}
+
+static int RunCommand(int mode, DB *db, int cmd_id, const std::string &key, const std::string &value)
+{
+    int rval = MBError::SUCCESS;
+    bool overwrite = false;
+    bool hex_output = false;
+    MBData mbd;
+
+    switch(cmd_id)
+    {
+        case COMMAND_NONE:
+            // no opertation needed
+            break;
+        case COMMAND_QUIT:
+            std::cout << "bye\n";
+            quit_mbc = true;
+            break;
+        case COMMAND_FIND_HEX:
+            hex_output = true;
+        case COMMAND_FIND:
+            rval = db->Find(key, mbd);
+            if(rval == MBError::SUCCESS)
+                display_output(mbd, hex_output, false);
+            else
+                std::cout << MBError::get_error_str(rval) << "\n";
+            break;
+        case COMMAND_FIND_LPREFIX_HEX:
+            hex_output = true;
+        case COMMAND_FIND_LPREFIX:
+            rval = db->FindLongestPrefix(key, mbd);
+            if(rval == MBError::SUCCESS)
+                display_output(mbd, hex_output, true);
+            else
+                std::cout << MBError::get_error_str(rval) << "\n";
+            break;
+        case COMMAND_DELETE:
+            if(mode & CONSTS::ACCESS_MODE_WRITER)
+            {
+                rval = db->Remove(key);
+                std::cout << MBError::get_error_str(rval) << "\n";
+            }
+            else
+                std::cout << "permission not allowed\n";
+            break;
+        case COMMAND_REPLACE:
+            overwrite = true;
+        case COMMAND_INSERT:
+            if(mode & CONSTS::ACCESS_MODE_WRITER)
+            {
+                rval = db->Add(key, value, overwrite);
+                std::cout << MBError::get_error_str(rval) << "\n";
+            }
+            else
+                std::cout << "permission not allowed\n";
+            break;
+        case COMMAND_STATS:
+            db->PrintStats();
+            break;
+        case COMMAND_HELP:
+            show_help();
+            break;
+        case COMMAND_DELETE_ALL:
+            if(mode & CONSTS::ACCESS_MODE_WRITER)
+            {
+                rval = db->RemoveAll();
+                std::cout << MBError::get_error_str(rval) << "\n";
+            }
+            else
+                std::cout << "permission not allowed\n";
+            break;
+        case COMMAND_FIND_ALL:
+            display_all_kvs(db);
+            break;
+        case COMMAND_RESET_N_WRITER:
+            if(mode & CONSTS::ACCESS_MODE_WRITER)
+                std::cout << "writer is running, cannot reset writer counter\n";
+            else
+                db->UpdateNumHandlers(CONSTS::ACCESS_MODE_WRITER, -1);
+            break;
+        case COMMAND_RESET_N_READER:
+            db->UpdateNumHandlers(CONSTS::ACCESS_MODE_READER, -1);
+            break;
+        case COMMAND_PRINT_HEADER:
+            db->PrintHeader();
+            break;
+        case COMMAND_RECLAIM_RESOURCES:
+            if(mode & CONSTS::ACCESS_MODE_WRITER)
+                db->CollectResource(1, 1);
+            else
+                std::cout << "writer is not running, can not perform grabage collection" << std::endl;
+            break;
+        case COMMAND_PARSING_ERROR:
+            break;
+        case COMMAND_UNKNOWN:
+        default:
+            std::cout << "unknown query\n";
+            break;
+    }
+
+    return rval;
+}
+
+static void mbclient(DB *db, int mode)
+{
+    rl_bind_key('\t', rl_complete);
+
+    printf("mabain %d.%d.%d shell\n", version[0], version[1], version[2]);
+    std::cout << "database directory: " << db->GetDBDir() << "\n";
+
+    int cmd_id;
+    std::string key;
+    std::string value;
+    std::string cmd;
+
+    while(true)
+    {
+        char* line = readline(">> ");
+        if(line == NULL) break;
+        if(line[0] == '\0')
+        {
+            free(line);
+            continue;
+        }
+
+        trim_spaces(line, cmd);
+        add_history(line);
+        free(line);
+        cmd_id = parse_command(cmd, key, value);
+
+        RunCommand(mode, db, cmd_id, key, value);
+
+        if(quit_mbc) break;
+    }
+}
+
+static void run_query_command(DB *db, int mode, const std::string &command_str)
+{
+    std::string cmd;
+    int cmd_id;
+    std::string key;
+    std::string value;
+
+    trim_spaces(command_str.c_str(), cmd);
+    if(cmd.length() == 0)
+    {
+        std::cerr << command_str << " not a valid command\n";
+        return;
+    }
+
+    cmd_id = parse_command(cmd, key, value);
+    RunCommand(mode, db, cmd_id, key, value);
+}
+
+static void run_script(DB *db, int mode, const std::string &script_file)
+{
+    std::ifstream script_in(script_file);
+    if(!script_in.is_open()) {
+        std::cerr << "cannot open file " << script_file << "\n";
+        return;
+    }
+
+    std::string line;
+    int cmd_id;
+    std::string key;
+    std::string value;
+    std::string cmd;
+    
+    while(getline(script_in, line))
+    {
+        trim_spaces(line.c_str(), cmd);
+        if(cmd.length() == 0)
+        {
+            std::cerr << line << " not a valid query\n";
+            continue;
+        }
+
+        cmd_id = parse_command(cmd, key, value);
+        std::cout << cmd << ": ";
+        RunCommand(mode, db, cmd_id, key, value);
+
+        if(quit_mbc) break;
+    }
+    script_in.close();
+}
+
+int main(int argc, char *argv[])
+{
+    sigset_t mask;
+
+    signal(SIGINT, HandleSignal);
+    signal(SIGTERM, HandleSignal);
+    signal(SIGQUIT, HandleSignal);
+    signal(SIGPIPE, HandleSignal);
+    signal(SIGHUP, HandleSignal);
+    signal(SIGSEGV, HandleSignal);
+    signal(SIGUSR1, HandleSignal);
+    signal(SIGUSR2, HandleSignal);
+
+    sigemptyset(&mask);
+    sigaddset(&mask, SIGTERM);
+    sigaddset(&mask, SIGQUIT);
+    sigaddset(&mask, SIGINT);
+    sigaddset(&mask, SIGPIPE);
+    sigaddset(&mask, SIGHUP);
+    sigaddset(&mask, SIGSEGV);
+    sigaddset(&mask, SIGUSR1);
+    sigaddset(&mask, SIGUSR2);
+    pthread_sigmask(SIG_SETMASK, &mask, NULL);
+
+    sigemptyset(&mask);
+    pthread_sigmask(SIG_SETMASK, &mask, NULL);
+
+    int64_t memcap_i = 1024*1024LL;
+    int64_t memcap_d = 1024*1024LL;
+    const char *db_dir = NULL;
+    int mode = 0;
+    std::string query_cmd = "";
+    std::string script_file = "";
+    int64_t index_blk_size = 64LL*1024*1024;
+    int64_t data_blk_size = 64LL*1024*1024;
+    int64_t lru_bucket_size = 1000;
+
+    for(int i = 1; i < argc; i++)
+    {
+        if(strcmp(argv[i], "-d") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            db_dir = argv[i];
+        }
+        else if(strcmp(argv[i], "-im") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            memcap_i = atoi(argv[i]);
+        }
+        else if(strcmp(argv[i], "-dm") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            memcap_d = atoi(argv[i]);
+        }
+        else if(strcmp(argv[i], "-w") == 0)
+        {
+            mode |= CONSTS::ACCESS_MODE_WRITER;
+        }
+        else if(strcmp(argv[i], "-e") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            query_cmd = argv[i];
+        }
+        else if(strcmp(argv[i], "-s") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            script_file = argv[i];
+        }
+        else if(strcmp(argv[i], "--lru-bucket-size") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            lru_bucket_size = atoi(argv[i]);
+        }
+        else if(strcmp(argv[i], "--index-block-size") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            index_blk_size = atoi(argv[i]);
+        }
+        else if(strcmp(argv[i], "--data-block-size") == 0)
+        {
+            if(++i >= argc)
+                usage(argv[0]);
+            data_blk_size = atoi(argv[i]);
+        }
+        else
+            usage(argv[0]);
+    }
+
+    if(db_dir == NULL)
+        usage(argv[0]);
+
+    MBConfig mbconf;
+    memset(&mbconf, 0, sizeof(mbconf));
+    mbconf.mbdir = db_dir;
+    mbconf.options = mode;
+    mbconf.memcap_index = memcap_i;
+    mbconf.memcap_data = memcap_d;
+    mbconf.block_size_index = index_blk_size;
+    mbconf.block_size_data = data_blk_size;
+    mbconf.num_entry_per_bucket = lru_bucket_size;
+    DB *db = new DB(mbconf);
+    if(!db->is_open())
+    {
+        std::cout << db->StatusStr() << "\n";
+        exit(1);
+    }
+
+    // DB::SetLogFile("/var/tmp/mabain.log");
+    // DB::LogDebug();
+
+    if(query_cmd.length() != 0)
+    {
+        run_query_command(db, mode, query_cmd);
+    }
+    else if(script_file.length() != 0)
+    {
+        run_script(db, mode, script_file);
+    }
+    else
+    {
+        mbclient(db, mode);
+    }
+
+    db->Close();
+    // DB::CloseLogFile();
+    delete db;
+    return 0;
+}
diff --git a/mabain/src/test/key_list_3 b/mabain/src/test/key_list_3
new file mode 100644 (file)
index 0000000..c32fced
--- /dev/null
@@ -0,0 +1,1000 @@
+com.VcAdhtqdgW/oLTG9vJZ
+google.com/analytics
+google.com/imghp
+google.com/buzz
+google.com/news
+google.com/talk
+google.com/apps
+google.com/chrome
+google.com/Top/Adult
+google.com/intl/en/ads
+google.com/intl/en/help/faq_translation.html
+google.com/images
+google.com/Top/World/Deutsch/Spiele/Brett-_und_Tischspiele/Kartenspiele/Poker
+google.com/intl/ja
+google.com/Top/World/Deutsch/Online-Shops/Computer/Spiele
+google.com/translate_p
+google.com/translate_t
+google.com/contact/spamreport.html
+google.com/intl/en/help
+google.com/language_tools
+google.com/health
+google.com/hws/dell-inc/afe
+google.com/finance
+google.com/intl/en
+google.com/mail
+google.com
+google.com/url
+google.com/intl
+google.com/voice
+google.com/intl/zh-TW
+google.com/ig
+google.com/search
+google.com/intl/es
+facebook.com/pages/Hustletown-USA/The-Hustletown-Chronicle/244761903326
+facebook.com/pages/Osama-Shot-Down-Video/128655053878408
+facebook.com/pages/Brave-New-Foundation/48691586830
+facebook.com/pages/ineo/215689711935
+facebook.com/myfoodlovers
+facebook.com
+facebook.com/KnowItAll
+facebook.com/Hatchlings.LGP
+facebook.com/pages/Lil-Green-Patch
+facebook.com/careers
+facebook.com/pages/KickassClassicalcom
+facebook.com/pages/Osama-is-dead-watch-the-Video-below/182039455179797
+facebook.com/mindjolt
+facebook.com/wikileaks
+facebook.com/video
+facebook.com/fishworld
+facebook.com/monsterworld
+facebook.com/login.php
+facebook.com/pages/Sex-hikayeleri/197453986950203
+facebook.com/apps
+facebook.com/pages/Money
+facebook.com/connect/uiserver.php
+facebook.com/pages/Osama-Bin-Laden-Dead-Video/159067474156934
+youtube.com/GoogleDevelopers
+youtube.com
+youtube.com/user/rkellysextape1
+youtube.com/watch
+youtube.com/opposide
+youtube.com/watchihr-zFzBqo
+youtube.com/profile_videos
+youtube.com/proactivecomm
+youtube.com/index
+youtube.com/verify_age
+yahoo.com/r/m2
+yahoo.com/sports
+yahoo.com/image
+yahoo.com
+yahoo.com/video
+yahoo.com/shopping
+live.com
+static.ak.fbcdn.net
+wikipedia.org/wiki/Sexual_health_clinic
+wikipedia.org
+baidu.com/index.html
+baidu.com
+blogger.com/start
+blogger.com
+msn.com
+qq.com
+twitter.com/KimKardashian11
+twitter.com/KendraWilkinso1
+twitter.com/rasche1401
+twitter.com/KatieHolmesNud
+twitter.com/perahta985
+twitter.com/weishaupt917
+twitter.com/reinke341
+twitter.com/wachsmann1541
+128.242.240.20
+128.242.245.20
+twitter.com
+twitter.com/zastrow994
+twitter.com/trautwein9975
+twitter.com/fitz1677
+twitter.com/DeniseRichardsK
+twitter.com/BritneySpearse
+twitter.com/MileyCyrusnud
+twitter.com/knab190
+twitter.com/Shakira_nude
+twitter.com/steenbab
+twitter.com/LilKimUncensord
+twitter.com/BritneySpears11
+twitter.com/KateWinsletNude
+twitter.com/carmenelectrapn
+twitter.com/gustave12
+twitter.com/scheid1265
+twitter.com/ordella509
+twitter.com/jobs
+twitter.com/JenniferLovew
+twitter.com/verina1238
+twitter.com/downloads
+twitter.com/falkner425
+twitter.com/PamelaAnderson0
+twitter.com/gamble_winning
+twitter.com/LindsayLohanee
+twitter.com/LindsayLohannn
+168.143.162.36
+twitter.com/opel1409
+twitter.com/lysa380
+twitter.com/weinhold344
+twitter.com/schlecht1581
+twitter.com/britneyspearst
+twitter.com/AnnaFarisNnude
+twitter.com/CHristinaRicciN
+twitter.com/carmenelectrasx
+twitter.com/kimkardashian3
+twitter.com/adulttrishstrat
+124.83.139.192
+203.216.227.176
+yahoo.co.jp
+google.co.in
+taobao.com/home/error2.php
+taobao.com
+taobao.com/index.php
+taobao.com/info
+taobao.com/university
+google.de
+google.de/search
+google.com.hk
+wordpress.com/zevk
+72.233.104.124
+74.200.247.60
+wordpress.com/tag/anal
+76.74.254.126
+wordpress.com
+amazon.com/exec/obidos/tg/browse/-/3023481/ref=tab_m_gw_l
+amazon.com/b
+amazon.com/gp/sign-in.html/104-2529875-5942324
+amazon.com/dvd
+amazon.com/books-used-books-textbooks/b/104-1942702-2157560
+amazon.com/Sims-Online-Game-Time-Card/dp/B00006CRVG
+amazon.com/American-Military-Patch-Guide-Force-Marine/dp/1884452329
+amazon.com/s/103-0082455-2158222
+amazon.com
+amazon.com/Barrons-Military-Careers-Donald-Hutton/dp/0764104896
+amazon.com/S3-AWS-home-page-Money
+amazon.com/s.html/102-2323371-1345742
+amazon.com/Fugitive-Game-Online-Kevin-Mitnick/dp/0316528692
+amazon.com/exec/obidos/tg/browse/-/408310/sr=53-1/qid=1155809905/ref=tr_52741
+amazon.com/exec/obidos/tg/browse/-/577394/103-8906703-1799821
+amazon.com/exec/obidos/tg/sim-explorer/explore-artists/-/artist-name/music/Hedberg, Mitch/104-0925646-4260729
+amazon.com/b/ref=sc_fe_c_0_14248821_4/102-8963016-5264938
+amazon.com/gp/product/0976726904/qid=1097359582/sr=2-1/ref=pd_ka_2_1/002-9285128-9965644
+amazon.com/gp/sign-in.html
+amazon.com/2005-Online-Shopping-Directory-Dummies/dp/0764574957
+amazon.com/Mechanical-Turk-AWS-home-page
+amazon.com/Simple-Queue-Service-home-page
+amazon.com/refr_ss_null/102-7504955-2659335
+amazon.com/My-Favorite-Roleplaying-Games/lm/21P7OMKQAU0DW
+amazon.com/gp/browse.html/103-0612920-1453449
+amazon.com/s.html/002-4151026-7240030
+amazon.com/s.html/104-2205730-4045512
+amazon.com/aws
+amazon.com/AWS-home-page-Money/b/ref=sc_fe_l_1/102-8963016-5264938
+amazon.com/Dark-Sourcebook-Star-Roleplaying-Game/dp/0786918497
+amazon.com/exec/obidos/ASIN/b0001h0a8o/domainsherloc-20/b0001h0a8o
+amazon.com/gp/homepage.html/102-2323371-1345742
+amazon.com/exec/obidos/tg/browse/-/577394/104-2456764-4185545
+amazon.com/exec/obidos/ASIN/1556228686//steendam1-20
+amazon.com/exec/obidos/subst/home/home.html
+amazon.com/gp/explorer/0976726904/2/ref=pd_lpo_ase/002-5655700-1876011
+amazon.com/My-Favorite-Roleplaying-Games/lm/21...[FoundonGoogle]28.htm
+amazon.com/exec/obidos/tg/browse/-/3023481/ref=tab_m_gw_l/104-2456764-4185545
+amazon.com/b/ref=sc_fe_l_2/102-8963016-5264938
+amazon.com/E-Commerce-Service-AWS-home-page
+amazon.com/b5FencodingTF8&node28013&tagoolshopcom&linkCoder2&camp789&creative325
+amazon.com/gp
+amazon.com/exec/obidos/tg/browse/-/1040024/104-2456764-4185545
+amazon.com/gp/homepage.html/002-3020495-6312822
+amazon.com/My-Favorite-Roleplaying-Games/lm/21...[FoundonGoogle]42.htm
+amazon.com/gp/browse.html
+72.21.214.128
+amazon.com/Michael-Moorcooks-Stormbringer-Roleplaying-Game/dp/1568821522
+202.108.33.60
+sina.com.cn
+google.co.uk
+microsoft.com/japan/office/project/prodinfo/default.mspx
+microsoft.com/japan/sharepoint/groupboard/default.mspx
+microsoft.com/france/office/Access/prodinfo
+microsoft.com/spain/empresas/guias/usabilidad/home.mspx
+microsoft.com/latam/technet/info/news/art01
+microsoft.com/france/powerpoint
+microsoft.com/france/trucform/default.asp
+microsoft.com/latam/technet/articulos/200001/art07
+microsoft.com/library/errorpages/smarterror.aspx
+microsoft.com/latam/windows/default.asp
+microsoft.com/japan/office/frontpage/prodinfo/default.mspx
+microsoft.com/france/formezvous/default.asp
+microsoft.com/japan/msdn/vbasic
+microsoft.com/latam/juegos/pandora
+microsoft.com/australia
+microsoft.com/XBOX
+microsoft.com/germany/windows/products/windowsxp/default.mspx
+microsoft.com/latam/office
+microsoft.com/france/jeux/listexbox.asp
+microsoft.com/technet/prodtechnol/isa/default.mspx
+microsoft.com/presspass/features/1998/12-7ecom.mspx
+microsoft.com/latam/technet/articulos/200007/art12
+microsoft.com/france/publisher
+microsoft.com/japan/office/word/prodinfo/default.mspx
+microsoft.com/pt/pt/default.aspx
+microsoft.com/latam/technet/techinfo/intranet/default.asp
+microsoft.com/mac/products/remote-desktop/default.mspx
+microsoft.com/games/PC/combatfs3.aspx
+microsoft.com/games/crimsonskies
+microsoft.com
+microsoft.com/isapi/redir.dll
+microsoft.com/spain/defaultns.asp
+microsoft.com/encarta/jp
+microsoft.com/japan/sql/default.mspx
+microsoft.com/cze
+microsoft.com/latam/juegos/golf2001
+microsoft.com/smallbusiness/online/services-transition.mspx
+microsoft.com/japan/technet/default.mspx
+microsoft.com/games/Xbox/default.aspx
+microsoft.com/security
+microsoft.com/japan/enable/default.mspx
+microsoft.com/brasil/windows/default.mspx
+microsoft.com/italy/windows/products/winfamily/ie/default.mspx
+microsoft.com/france/jeux/combatfs
+microsoft.com/poland/windowsxp/mediacenter/default.mspx
+microsoft.com/billgates/columns/1998essay/3-25col.aspx
+microsoft.com/windows/embedded/eval/default.mspx
+microsoft.com/japan/office/outlook/prodinfo/default.mspx
+microsoft.com/en
+microsoft.com/communities
+microsoft.com/france/jeux/fs2000
+microsoft.com/presspass/default.mspx
+microsoft.com/latam/applicationcenter/downloads/sp1.asp
+microsoft.com/latam/technet/articulos/200102/art02/default.asp
+microsoft.com/windows/desktopsearch/default.mspx
+microsoft.com/japan/office/powerpoint/prodinfo/default.mspx
+microsoft.com/spain/windows/ie/default.mspx
+microsoft.com/windows/products/winfamily/windowshomeserver/connect.mspx
+microsoft.com/japan/mac/officex/powerpoint
+microsoft.com/japan/office/access/prodinfo/default.mspx
+microsoft.com/technet/security/bulletin/notify.mspx
+microsoft.com/latam/juegos/age2
+microsoft.com/products/info/default.aspx
+microsoft.com/france/mappoint/default.mspx
+microsoft.com/spain
+microsoft.com/canada/windows/shop/default.mspx
+microsoft.com/en/us/default.aspx
+microsoft.com/japan/mac/officex/word
+microsoft.com/iag
+microsoft.com/mexico/404.asp
+microsoft.com/germany/windows/downloads/ie/getitnow.mspx
+microsoft.com/downloads
+microsoft.com/france/jeux/motocross2
+microsoft.com/portugal
+microsoft.com/latam/juegos/Age
+microsoft.com/turkiye
+microsoft.com/france/jeux/combatfs2
+microsoft.com/windowsxp/default.mspx
+microsoft.com/Spain/technet/comunidad/articulos/2010.htm
+microsoft.com/brasil
+microsoft.com/downloads/Browse.aspx
+microsoft.com/latam/juegos/flight
+microsoft.com/careers
+microsoft.com/france/404.htm
+microsoft.com/windows/windowsmedia/default.mspx
+microsoft.com/windows/ie/ie6/downloads/default.mspx
+microsoft.com/poland
+microsoft.com/technet/isa/default.mspx
+microsoft.com/windows/using/windowsvista/tipsandtricks/default.mspx
+microsoft.com/japan/msdn/vcsharp
+microsoft.com/en/us
+microsoft.com/isaserver/default.mspx
+microsoft.com/france/word
+microsoft.com/downloads/release.asp
+microsoft.com/genuine/downloads/notepurchaselink.aspx
+microsoft.com/silverlight/install.aspx
+microsoft.com/IntlKB/Spain/E268/8/91.ASP
+microsoft.com/Spain/technet/comunidad/articulos/2009.htm
+microsoft.com/france/jeux/midtown2
+microsoft.com/japan/office/powerpoint/producer/prodinfo/default.mspx
+microsoft.com/downloads/details.aspx
+microsoft.com/windows/products/windowsvista/default.mspx
+microsoft.com/germany/express/download/default.aspx
+microsoft.com/latam/visualc
+microsoft.com/japan/office/visio/prodinfo/default.mspx
+microsoft.com/canada/home/planningandorganizing/2.6.9_takeyourgiftlistonline.aspx
+microsoft.com/latam/juegos/nba
+microsoft.com/Games/mechcommander2/default_go.asp
+microsoft.com/japan/Office/default.mspx
+microsoft.com/france/jeux/midtown
+microsoft.com/japan/msdn/xml/default.asp
+microsoft.com/latam/juegos/futbol
+microsoft.com/windowsxp/using/games/learnmore/mmo.htm
+microsoft.com/games/riseofnations/downloads.asp
+microsoft.com/games
+microsoft.com/latam/juegos/ls2000
+microsoft.com/spain/support/backoffice/nt/winntp.asp
+microsoft.com/japan/msdn/visualc
+microsoft.com/security/default.mspx
+microsoft.com/latam/technet
+microsoft.com/office/visio/networkcenter/jpn/default.mspx
+microsoft.com/france/office/excel/prodinfo
+microsoft.com/canada/home/familyandfun/2.1.49_gameonplayagainstonlineopponents.aspx
+microsoft.com/latam/technet/productos/windows/windows2000/default.mspx
+microsoft.com/latam/juegos/madness
+microsoft.com/fr/fr/default.aspx
+microsoft.com/japan/hagakistudio/default.mspx
+microsoft.com/germany/windows/default.mspx
+microsoft.com/latam/juegos/fs2000
+microsoft.com/games/dungeonsiege/5a.asp
+microsoft.com/latam/technet/win98/default.asp
+microsoft.com/latam/windowsme
+microsoft.com/smallbusiness/hub.mspx
+microsoft.com/France/jeux
+microsoft.com/mexico
+microsoft.com/germany/office/project/leistungsmerkmale/default.mspx
+microsoft.com/latam/juegos/conquerors
+microsoft.com/france/entrepreneur
+microsoft.com/canada/windows/default.mspx
+microsoft.com/korea/games
+microsoft.com/finland/default.mspx
+microsoft.com/japan/mac/officex
+microsoft.com/japan/windowsxp/using/windowsmessenger/default.asp
+microsoft.com/spain/windows/millennium/default.asp
+microsoft.com/windows/default.mspx
+microsoft.com/spain/support/windows/winmep.asp
+microsoft.com/spain/support/win2000/win2000p.asp
+microsoft.com/japan/mac/products/outlook
+microsoft.com/spain/support/windows/win98p.asp
+microsoft.com/latam/windows2000/server/evaluacion/noticias/boletines/sp2.asp
+microsoft.com/france/office/frontpage/prodinfo
+microsoft.com/streets/gps.mspx
+microsoft.com/germany/isaserver/default.mspx
+microsoft.com/Latam/windows95/default.asp
+microsoft.com/japan/mac/products/oe
+microsoft.com/hk
+microsoft.com/korea/windows
+microsoft.com/france/core/404.mspx
+microsoft.com/japan/athome/security/default.mspx
+microsoft.com/japan/exchange/default.mspx
+microsoft.com/windows/windowsmedia/es/default.aspx
+microsoft.com/windows/ie/ie6/using/securityandprivacy/default.mspx
+microsoft.com/exchange/services/default.mspx
+microsoft.com/japan/windowsxp/using/windowsmessenger
+microsoft.com/japan/users/tips/powerpoint
+microsoft.com/spain/juegos/ageofmythology/home.asp
+microsoft.com/spain/windowsxp/default.mspx
+microsoft.com/latam/juegos/motocross2
+microsoft.com/japan/office/excel/prodinfo/default.mspx
+microsoft.com/latam/windowsxp
+microsoft.com/piracy/Resources
+microsoft.com/japan/mac/officex/excel
+google.fr
+myspace.com/agonyhill
+myspace.com/kendall24
+myspace.com/shakerecords
+myspace.com/thefight
+myspace.com/kingfreedomman
+myspace.com/winklemusic
+myspace.com/flashlightbrown
+myspace.com/deadartistsyndrome
+myspace.com/ghostwhisperer
+myspace.com/fuckfx
+myspace.com/macmc
+myspace.com/chateaumarmont
+myspace.com/addictedrock
+myspace.com/bexymartin
+myspace.com/torymasonxxx
+myspace.com/roozmusic
+myspace.com/gregcannon
+myspace.com/nothingrock
+myspace.com/gbedu
+63.135.80.49
+myspace.com/index.cfm
+myspace.com/skater_12345
+myspace.com/thestampedingmachinestour
+myspace.com/4cuartos
+myspace.com/toxicpopnyc
+myspace.com/thebandlucid
+myspace.com/locknloadevents
+myspace.com/thehessian
+myspace.com/realdealhustle
+myspace.com/primalage
+myspace.com/novastaremi
+myspace.com/healthyliving2day
+myspace.com/photographybycj
+myspace.com/pivotisagoodboy
+myspace.com/geometrix
+myspace.com/amyfarrismusic
+myspace.com/shishapipe
+myspace.com/afunkybeat
+myspace.com/pierceband1
+myspace.com/aenimatoolcoverband
+myspace.com/riccardobrush
+myspace.com/kolpa
+myspace.com/lyonmusic
+myspace.com/francescosullo
+myspace.com/vicegripthrottle
+myspace.com/villebillies
+myspace.com/iannnnnn
+myspace.com/scrappygurlee
+myspace.com/140410
+myspace.com/lil_hodge
+myspace.com/virtualgeo
+myspace.com/djebar
+myspace.com/MK_Armageddon
+myspace.com/burningheartsburlesque
+myspace.com/daytripperrrr
+myspace.com/calvinrichardson
+myspace.com/seizethemoment
+myspace.com/corbancreek
+myspace.com/burnthecities
+myspace.com/yakuza
+myspace.com/djonline
+myspace.com/nae_sde
+myspace.com/slunt
+myspace.com/rock939
+myspace.com/madtracker
+myspace.com/cdoassfagersta
+myspace.com/thewarriors
+myspace.com/cubacrew
+myspace.com/trippcore
+myspace.com/andpress
+myspace.com/concerttickets
+myspace.com/freesonstudio
+myspace.com/picturemeclubbing
+myspace.com/realitytvconvention
+myspace.com/theunionbar
+myspace.com/truthuniversal
+myspace.com/arestotheninth
+myspace.com/adinahoward
+myspace.com/twintanks
+myspace.com/bluchip
+myspace.com/intimatesaucergirl
+myspace.com/dilanarox
+myspace.com/wutanglatino
+myspace.com/home/willyoucare
+myspace.com/viperose
+myspace.com/dixonmatthews
+myspace.com/notrinity
+myspace.com/glassepl
+myspace.com/kellybrockmusic
+myspace.com/gjfunkmusic
+myspace.com/therealjin
+myspace.com/dr_ken
+myspace.com/underpressurerocks
+myspace.com/totallylostit
+myspace.com/primadonna
+myspace.com/cr2records
+myspace.com/officialpendulum
+myspace.com/ritual_art_tattoo
+myspace.com
+myspace.com/theo
+myspace.com/u989
+myspace.com/lacandelacanada
+myspace.com/sierraswan
+myspace.com/lovebitesmusicspace
+windows.com
+myspace.com/angelssensualsocialclub
+myspace.com/thevenusguns
+myspace.com/sundomingo
+myspace.com/hurricaneanniemusic
+myspace.com/blue_mike
+myspace.com/mothmanohio
+myspace.com/mentake
+myspace.com/pleadthe5thproductions
+myspace.com/waterhouserecords
+myspace.com/playalyztic
+myspace.com/theviolets
+bing.com/reference
+bing.com/community/blogs/webmaster
+bing.com/maps
+bing.com/videos
+bing.com/community/blogs/travel
+bing.com/travel
+bing.com/games
+bing.com/local
+bing.com/shopping
+bing.com/video
+bing.com/community
+bing.com/toolbox
+bing.com/images
+bing.com/news
+bing.com/shop
+bing.com
+bing.com/search
+ebay.com
+yandex.ru
+yandex.ru/schoolsearch
+yandex.ru/yandsearch
+87.250.250.11
+google.co.jp
+linkedin.com/in/jennifergarnernude1
+linkedin.com/in/minimesextape
+linkedin.com/jobs
+linkedin.com/in/freejennifertoasteetoofsex
+linkedin.com/in/carmencocks1
+linkedin.com/pub/anneliese-van-der-pol-nude/14/150/371
+linkedin.com/pub/dir/shakira/nude
+linkedin.com/in/keeleyhazellsextape
+linkedin.com/pub/dir/olsen twins/camel toe
+linkedin.com/in/aishwaryaraiwearingnothing
+linkedin.com/in/jenniferlopezdesnuda
+linkedin.com/in/mondelore
+linkedin.com/in/mariahcareynude1
+linkedin.com/in/isprinceharrygay
+linkedin.com/in/carmenelectrasex1
+linkedin.com/in/angelinajolienaked1
+linkedin.com/pub/dir/denise richards/naked
+linkedin.com/pub/dir/disney's raven
+linkedin.com/in/emmawatsonkissingsomeone
+linkedin.com/in/halleberrysexscene
+linkedin.com/in/katehudsonnude
+linkedin.com/directory/jobs
+linkedin.com/in/nudetubee
+linkedin.com/in/jenniferanistonnude
+linkedin.com/pub/dir/emma watson/porn
+linkedin.com/in/aliciamachadodesnuda
+linkedin.com/in/parishiltonsextapeq
+linkedin.com/in/britneyspearssextapeq
+linkedin.com/pub/dir/tila tequila/sex
+linkedin.com/in/carmenelectra
+linkedin.com/pub/dir/kate mara/naked
+linkedin.com/in/vernetroyersextape
+linkedin.com/in/lindsaylohansex1
+linkedin.com/in/carmenelectranaked1
+linkedin.com/in/adriennebailonnudephotos
+linkedin.com
+linkedin.com/in/jennifermorrisonnude1
+linkedin.com/in/nudepics2
+linkedin.com/in/adriennebailonnaked
+linkedin.com/in/freenudecelebrities1
+linkedin.com/in/nudephotos1
+linkedin.com/e/mv4bh9-ggo389m5-s/isd/1923193846/AZ406oUM/EML-invg_59
+linkedin.com/in/trishstratusnude
+linkedin.com/pub/free-nude-celebs/14/6b/65b
+linkedin.com/in/ravensymonebreast
+linkedin.com/pub/dir/leighton meester/nude
+linkedin.com/pub/dir/emma watson/wearing
+linkedin.com/in/lindsaylohansextape1
+linkedin.com/pub/dir/olsen twins/nudity
+linkedin.com/pub/disney-s-raven-symone-nude/14/150/604
+linkedin.com/in/nudecelebrities1
+linkedin.com/in/olsentwinsnude
+linkedin.com/hiring
+linkedin.com/pub/dir/jennifer aniston/sex scene
+linkedin.com/pub/nude-art/14/6b/6a
+linkedin.com/pub/dir/tila tequila/porn
+linkedin.com/in/jenniferanistonbangs1
+linkedin.com/in/keiraknightleynude
+linkedin.com/in/christinaaguileradirrty1
+linkedin.com/in/vanessahudgensnude
+linkedin.com/pub/jennifer-love-hewitt/13/ab6/396
+linkedin.com/pub/dir/ellen degeneres/gay
+linkedin.com/in/carmenelectrasexscene1
+linkedin.com/in/hilaryduffnude2
+google.com.br
+163.com
+mail.ru
+flickr.com/photos/maryami
+flickr.com/photos/glenneroo
+flickr.com/photos/genosfear
+flickr.com/photos/matthamilton
+flickr.com/photos/lowelisboa
+flickr.com/photos/68945978@N00
+flickr.com/photos/tags
+flickr.com/photos/hainsworth
+flickr.com/photos/acid
+flickr.com/photos/81074972@N00
+flickr.com/photos/hereandnow
+flickr.com
+flickr.com/photos/koganuts
+flickr.com/photos/annettes
+fc2.com
+craigslist.org/ers
+craigslist.org
+google.it
+98.142.98.80
+conduit.com
+rapidshare.com/files/262414747/PC_protect2.exe
+rapidshare.com/files/174279263/orkut_fake_kanoor.rar
+rapidshare.com
+shiki-kin.com
+rapidshare.com/files/433860916/LS-Magazine-LS-Models-Issue-16-lsm-set.01.rar
+vkontakte.ru/id122531457
+vkontakte.ru/photos91312199
+vkontakte.ru/id94033115
+vkontakte.ru/id94292517
+vkontakte.ru/id82145469
+vkontakte.ru/id108735554
+vkontakte.ru/photos133344035
+vkontakte.ru
+vkontakte.ru/id134990765
+vkontakte.ru/id112043304
+vkontakte.ru/id61003935
+vkontakte.ru/photo86288043_168151072
+vkontakte.ru/id128090653
+vkontakte.ru/id123995726
+vkontakte.ru/id76171013
+vkontakte.ru/photos116888097
+merriam-webster.com
+google.es
+soso.com
+soso.com/q
+bbc.co.uk/sports
+bbc.co.uk/celebdaq
+bbc.co.uk/iplayer
+bbc.co.uk/religion/religions/islam
+bbc.co.uk/cbeebies/teletubbies/funandgames/animalsounds/index.shtml
+bbc.co.uk/skillswise
+bbc.co.uk/bbcfour/cinema/features/kon-ichikawa.shtml
+bbc.co.uk/webwise/askbruce
+bbc.co.uk/religion/religions/islam/history/safavidempire_1.shtml
+bbc.co.uk/food/recipes/database/ovenbakedsweetmisoma_73596.shtml
+bbc.co.uk/urdu
+bbc.co.uk/radio4/science
+bbc.co.uk/blogs
+bbc.co.uk/radio4/hitchhikers/game_nolan.shtml
+bbc.co.uk/dna/h2g2/A1152983
+bbc.co.uk/china
+bbc.co.uk/sport
+bbc.co.uk/radio4/hitchhikers
+bbc.co.uk/religion/religions/islam/history/mughalempire_1.shtml
+bbc.co.uk/history/historic_figures/cranmer_thomas.shtml
+bbc.co.uk/radio4/hitchhikers/game.shtml
+bbc.co.uk/religion/religions/islam/history/uk_1.shtml
+bbc.co.uk/worldservice
+bbc.co.uk/tamil
+bbc.co.uk/worldservice/index.shtml
+bbc.co.uk/weather/world/country_guides/results.shtml
+bbc.co.uk/go/dragonsden/ext/ide1/-/http://203.187.230.42/.~/ws/SignIn.htm
+bbc.co.uk/religion/religions/christianity/holydays
+bbc.co.uk/go/dragonsden
+bbc.co.uk/schools
+bbc.co.uk/cgi-bin/worldservice/psims/ScheduleSDT.cgi
+bbc.co.uk/films/2000/10/26/maggie_cheung_inthemoodforlove_261000_interview.shtml
+bbc.co.uk/go/dragonsden/ext/ide1/-
+bbc.co.uk/pressoffice/pressreleases/stories/2002/10_october/10/omar_sharif_pyramid.shtml
+bbc.co.uk/religion/religions/hinduism/index.shtml
+bbc.co.uk/somali/index.shtml
+bbc.co.uk/spanish/especiales/humanrights
+bbc.co.uk/films/2000/10/31/richard_attenborough_article.shtml
+bbc.co.uk/opensource
+bbc.co.uk/dna/h2g2/alabaster/A246980
+bbc.co.uk/eastenders/games
+bbc.co.uk/worldservice/africa/features/storyofafrica/index_section7.shtml
+bbc.co.uk
+bbc.co.uk/weather
+bbc.co.uk/go/dragonsden/ext/ide1
+bbc.co.uk/religion/religions/islam/history/china_1.shtml
+bbc.co.uk/go/dragonsden/ext
+bbc.co.uk/radio4/science/soundoflife.shtml
+bbc.co.uk/fivelive
+imdb.com/name/nm0374423/bio
+imdb.com
+imdb.com/title/tt0283701
+imdb.com/name/nm0001041
+imdb.com/name/nm0374423
+imdb.com/name/nm0000118
+imdb.com/name/nm0001008
+imdb.com/name/nm0003593
+imdb.com/name/nm0006191
+imdb.com/name/nm0297906
+imdb.com/name/nm0437819
+imdb.com/title/tt0080310
+imdb.com/name/nm0005033
+imdb.com/name/nm0581093
+imdb.com/name/nm0000235
+imdb.com/name/nm0156484
+imdb.com/name/nm0000109
+imdb.com/title/tt0454919
+imdb.com/title/tt0159251
+imdb.com/name/nm0685472
+imdb.com/name/nm0000653
+imdb.com/name/nm0000659
+imdb.com/name/nm0828838
+imdb.com/name/nm0005406
+imdb.com/title/tt0070917
+imdb.com/name/nm0000308
+imdb.com/name/nm0001725
+imdb.com/name/nm0521872
+imdb.com/name/nm0000071
+imdb.com/name/nm0025483
+imdb.com/name/nm0000115
+imdb.com/name/nm0000314
+imdb.com/sections/games
+imdb.com/title/tt0319262
+imdb.com/name/nm0559381
+imdb.com/name/nm0001127
+imdb.com/name/nm0576127
+imdb.com/title/tt0772174
+imdb.com/name/nm0001023
+imdb.com/Sections/Languages/Japanese
+imdb.com/title/tt0103850
+imdb.com/name/nm0155562
+imdb.com/name/nm0680795
+imdb.com/name/nm0803238
+imdb.com/name/nm0005002
+imdb.com/name/nm0843775
+imdb.com/name/nm0000229
+imdb.com/name/nm0085312
+imdb.com/name/nm0000347
+googleusercontent.com
+doubleclick.com
+d-real.com
+go.com
+livejasmin.com
+aol.com
+aol.com/moreptr
+aol.com/morefilein
+aol.com/mail
+aol.com/redir.adp
+danadinhos.com
+youku.com
+bp.blogspot.com
+google.com.mx
+apple.com/es
+apple.com/dotmac
+apple.com/itunes
+apple.com/jp
+apple.com/fr/webobjects
+apple.com/remotedesktop
+apple.com/trailers
+apple.com/dotmac/storage.html
+apple.com/es/macosx
+apple.com/downloads/macosx/games/role_strategy/cosmicencounteronline.html
+apple.com/education/powerschool
+apple.com/trailers/fox/dayaftertomorrow
+apple.com/jobs/us/index.html
+apple.com/itunes/store
+apple.com/es/safari
+apple.com/quicktime/win.html
+dedesomantri.com
+apple.com/jp/quicktime/player/win.html
+apple.com
+apple.com/quicktime/download/win.html
+apple.com/jp/ipod
+apple.com/de/itunes/download
+apple.com/de/quicktime/download
+apple.com/games
+apple.com/es/ipod
+69.55.59.132
+69.55.52.105
+xvideos.com
+69.55.59.148
+69.55.48.246
+69.55.51.106
+69.55.52.86
+69.55.52.200
+146.82.203.230
+146.82.200.125
+146.82.203.242
+146.82.202.179
+146.82.202.180
+146.82.203.228
+146.82.204.113
+146.82.204.17
+146.82.204.35
+pornhub.com
+sohu.com
+orkut.com.br
+fudosan-toushi.com
+google.ca/search
+google.ca
+ask.com
+ask.com/news
+ask.com/web
+ask.com/Latin-Chat
+ask.com/#
+ask.com/bar
+ask.com/deals
+ask.com/image
+ask.com/video
+ask.com/pictures
+cnn.com/WORLD/europe/9908/31/moscow.blast.08/index.html
+cnn.com/video
+cnn.com/WORLD/europe/9810/13/giant.scrabble
+cnn.com/WORLD/europe/9908/31/moscow.blast.07/index.html
+cnn.com/SPECIALS
+cnn.com/TECH/science/9812/03/t_t/shopping.online/index.html
+cnn.com/TECH/computing/9806/18/email.overload.idg/index.html
+cnn.com/travel
+cnn.com/TECH/computing/9806/23/cheap.spam.idg/index.html
+cnn.com/TECH/science/9811/26/t_t/doctor.on.call/next.week.html
+cnn.com/2000/TECH/computing/05/05/open.source.smugglers.idg/index.html
+cnn.com/2003/TECH/internet/12/12/sprj.hs03.gifts.online/index.html
+cnn.com/HEALTH
+cnn.com/US/9508/Labor_Day
+cnn.com/WORLD/europe/9908/31/moscow.blast.03/index.html
+cnn.com/SHOWBIZ
+cnn.com/TECH/computing/9807/14/junk.email.02
+cnn.com/TECH/computing/9910/21/cybershopping.t_t/index.html
+cnn.com/2005/LAW/06/24/ramasastry.website.prices
+cnn.com/sport
+cnn.com/SHOWBIZ/Movies/9907/07/isaac.hayes/index.html
+cnn.com/WORLD/europe/9908/31/moscow.blast.06/index.html
+cnn.com/2000/US/09/11/kids.tobacco.addiction
+cnn.com/SHOWBIZ/TV/9911/17/obit.bergman.poss/index.html
+cnn.com/sports
+cnn.com/SHOWBIZ/9604/06/inherit.wind/index.html
+cnn.com/WEATHER
+cnn.com/video/netshow
+cnn.com/TECH/computing/9806/30/diy.spam.idg/index.html
+cnn.com/WORLD/europe/9908/31/moscow.blast.01/index.html
+cnn.com/WORLD/europe/9908/31/moscow.blast.02/index.html
+cnn.com
+cnn.com/SPECIALS/2003/iraq/forces/weapons/index.html
+cnn.com/espanol
+cnn.com/TECH/computing/9903/24/mall.idg/index.html
+cnn.com/WORLD/9511/okinawa/index.html
+cnn.com/2003/TECH/internet/08/03/wikipedia
+cnn.com/SPECIALS/1998/sinatra
+google.ru
+photobucket.com
+youporn.com
+adobe.com/products/flex
+adobe.com/nl
+adobe.com/products/acrobat
+adobe.com/enterprise/accelio_jetform_notice.html
+162.115.225.90
+adobe.com/fr/products/fireworks
+adobe.com/cfusion/event/index.cfm
+adobe.com/digitalimag/photoshop_services.html
+adobe.com/kr
+adobe.com/devnet/dreamweaver/articles/build_shopping_cart_pt3.html
+adobe.com/no
+adobe.com/products/photoshop/index.html
+adobe.com/fr/products/photoshop
+adobe.com/ie
+adobe.com/devnet/security/security_zone/notification_service.html
+adobe.com/dk
+adobe.com/products/acrobat/main.html
+adobe.com/au
+adobe.com/tw
+adobe.com/products/acrobat/readstep2.html
+adobe.com/epaper/ebooks/ebookmall/index.html
+adobe.com/za
+adobe.com/de/products/flashplayer
+adobe.com/de
+adobe.com/es
+adobe.com/devnet/dreamweaver/articles/build_shopping_cart_pt2.html
+adobe.com/support/security
+adobe.com/br
+adobe.com/shockwave/download/download.cgi
+adobe.com
+adobe.com/in
+137.188.96.90
+adobe.com/shockwave/download/index.cgi
+adobe.com/fr
+adobe.com/es/products/coldfusion
+adobe.com/fr/products/tips
+adobe.com/aboutadobe/careeropp/college/internships.html
+vzw.com
+162.115.32.90
+mediafire.com
+205.196.120.8
+orkut.com
+orkut.com/formularios/administradores
+orkut.com/formularios
+orkut.com/GLogin.aspx
+orkut.com/formularios/administradores/orkut_admin_formulario.htm=20
+javapropertindo.com
+about.com/careers
+about.com/travel
+about.com
+about.com/shopping
+tudou.com
+221.12.89.120
+tudou.com/index.html
+ebay.de/online
+ebay.de
+kagayaki-hills.jp
+88.208.24.43
+88.208.24.44
+88.208.24.45
+88.208.24.47
+xhamster.com
+xhamster.com/movies/644840/young_teen_fuck.html
+espn.go.com
+espn.go.com/nfl/columns/pasquarelli_len/1564103.html
+espn.go.com/free-online-games
+espn.go.com/mlb/profiles/profile/5650.html
+68.71.210.70
+4shared.com/account/file/JICg20kf/The_big_bad_wolf.html
+4shared.com
+4shared.com/file/N0CqbMyz/Habbo_Moedas_Generator.html
+files.wordpress.com
+yahoo.net
+google.co.id
+ameblo.jp/r-nice
+ameblo.jp/terumame
+ameblo.jp/kataoka
+ameblo.jp/nyan-evolution
+ameblo.jp/latteco
+ameblo.jp/kamada-yuya
+ameblo.jp
+ameblo.jp/kenken9
+ameblo.jp/f-hideo
+ameblo.jp/papa0529
+ameblo.jp/gindama
+ameblo.jp/meshi
+ameblo.jp/ryumachi
+ameblo.jp/indigo55
+ameblo.jp/tomizawaeri
+ameblo.jp/photoem
+ameblo.jp/tansaibouseibutsu
+rakuten.co.jp/uzumasa
+rakuten.co.jp/fande
+rakuten.co.jp/asanoya
+rakuten.co.jp/ccrepo
+rakuten.co.jp/jewelclimb
+rakuten.co.jp/yachiyoglass
+rakuten.co.jp/benq
+rakuten.co.jp/tokyouniform
+rakuten.co.jp/amb
+rakuten.co.jp/tmf
+rakuten.co.jp/rack-kan
+rakuten.co.jp/j-kotobuki
+rakuten.co.jp/copo
+rakuten.co.jp/lemocolo
+rakuten.co.jp/nibac
+rakuten.co.jp/uchigo
+rakuten.co.jp/atomic-cycle
+rakuten.co.jp/dousan
+rakuten.co.jp/nkl
+rakuten.co.jp/blessyou
+rakuten.co.jp/hakuga
+rakuten.co.jp/ninja
+rakuten.co.jp/omsoc
+rakuten.co.jp/nail-yasan
+rakuten.co.jp/siletto
+rakuten.co.jp/j-sugiyama
+rakuten.co.jp/nagi
+rakuten.co.jp/witdenmark
+rakuten.co.jp/vivochica
+rakuten.co.jp/magwater
+rakuten.co.jp/diva-shop
+rakuten.co.jp/denkyu
+rakuten.co.jp/amigos
+rakuten.co.jp/to-get-her
+rakuten.co.jp/hakusen
+rakuten.co.jp/mitsuba
+rakuten.co.jp/volleyball
+rakuten.co.jp/hokkori
+rakuten.co.jp/deradera
+rakuten.co.jp/bluehigh
+rakuten.co.jp/bunza
+rakuten.co.jp/tskagu
+rakuten.co.jp/kawamoto
+rakuten.co.jp/gps
+rakuten.co.jp/kiriyasan
+rakuten.co.jp/rosemadame
+rakuten.co.jp/bali-indah
+rakuten.co.jp/hukuya
+rakuten.co.jp/fukusumi
+rakuten.co.jp/office-world
+rakuten.co.jp/olvo
+rakuten.co.jp/mikazuki
+rakuten.co.jp/touhoukoueki
+rakuten.co.jp/k-zoy
+rakuten.co.jp/itohkyuemon
+rakuten.co.jp/kaban-club
+rakuten.co.jp/aluk
+rakuten.co.jp/e-cycleparts/kaiso.html
+rakuten.co.jp/dankan
+rakuten.co.jp/georges2
+rakuten.co.jp/omochaya
+rakuten.co.jp
+rakuten.co.jp/goodsman
+rakuten.co.jp/yacon
+rakuten.co.jp/e-hanafusa
+rakuten.co.jp/clickcare
+rakuten.co.jp/angeldew
+rakuten.co.jp/yumelistshop
+rakuten.co.jp/natural
+rakuten.co.jp/925m
+rakuten.co.jp/zeal
+rakuten.co.jp/taurus
+rakuten.co.jp/nagashio
+rakuten.co.jp/ms
+rakuten.co.jp/allora
+rakuten.co.jp/onosun