diff --git a/include/configcat/config.h b/include/configcat/config.h index 29a197c..558576d 100644 --- a/include/configcat/config.h +++ b/include/configcat/config.h @@ -1,211 +1,383 @@ #pragma once +#include +#include #include -#include #include +#include #include -#include -#include -#include namespace configcat { -using ValueType = std::variant; -// Disable implicit conversion from pointer types (const char*) to bool when constructing std::variant -// https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0608r3.html -struct Value : public ValueType { - Value() : ValueType() {} - Value(bool v) : ValueType(v) {} - Value(const char* v) : ValueType(std::string(v)) {} - Value(const std::string& v) : ValueType(v) {} - Value(int v) : ValueType(v) {} - Value(double v) : ValueType(v) {} - - template - Value(T*) = delete; -}; - -std::string valueToString(const ValueType& value); - -enum RedirectMode: int { - NoRedirect = 0, - ShouldRedirect = 1, - ForceRedirect = 2 -}; - -struct Preferences { - std::string url; - RedirectMode redirect = NoRedirect; -}; - -struct RolloutPercentageItem { - // Value served when the rule is selected during evaluation. - Value value = 0; - - // The rule's percentage value. - double percentage = 0.0; - - // The rule's variation ID (for analytical purposes). - std::string variationId; - - bool operator==(const RolloutPercentageItem& other) const { - return value == other.value - && percentage == other.percentage - && variationId == other.variationId; - } -}; - -enum Comparator: int { - ONE_OF = 0, // IS ONE OF - NOT_ONE_OF = 1, // IS NOT ONE OF - CONTAINS = 2, // CONTAINS - NOT_CONTAINS = 3, // DOES NOT CONTAIN - ONE_OF_SEMVER = 4, // IS ONE OF (SemVer) - NOT_ONE_OF_SEMVER = 5, // IS NOT ONE OF (SemVer) - LT_SEMVER = 6, // < (SemVer) - LTE_SEMVER = 7, // <= (SemVer) - GT_SEMVER = 8, // > (SemVer) - GTE_SEMVER = 9, // >= (SemVer) - EQ_NUM = 10, // = (Number) - NOT_EQ_NUM = 11, // <> (Number) - LT_NUM = 12, // < (Number) - LTE_NUM = 13, // <= (Number) - GT_NUM = 14, // > (Number) - GTE_NUM = 15, // >= (Number) - ONE_OF_SENS = 16, // IS ONE OF (Sensitive) - NOT_ONE_OF_SENS = 17 // IS NOT ONE OF (Sensitive) -}; - -static constexpr char const* kComparatorTexts[] = { - "IS ONE OF", - "IS NOT ONE OF", - "CONTAINS", - "DOES NOT CONTAIN", - "IS ONE OF (SemVer)", - "IS NOT ONE OF (SemVer)", - "< (SemVer)", - "<= (SemVer)", - "> (SemVer)", - ">= (SemVer)", - "= (Number)", - "<> (Number)", - "< (Number)", - "<= (Number)", - "> (Number)", - ">= (Number)", - "IS ONE OF (Sensitive)", - "IS NOT ONE OF (Sensitive)" -}; - -inline const char* comparatorToString(Comparator comparator) { - return kComparatorTexts[comparator]; -} - -struct RolloutRule { - // Value served when the rule is selected during evaluation. - Value value = 0; // optional - - // The user attribute used in the comparison during evaluation. - std::string comparisonAttribute; - - // The operator used in the comparison. - Comparator comparator = ONE_OF; - - // The comparison value compared to the given user attribute. - std::string comparisonValue; - - // The rule's variation ID (for analytical purposes). - std::string variationId; - - bool operator==(const RolloutRule& other) const { - return value == other.value && - comparisonAttribute == other.comparisonAttribute && - comparator == other.comparator && - comparisonValue == other.comparisonValue && - variationId == other.variationId; - } -}; - -struct Setting { - // Value of the feature flag / setting. - Value value = 0; - - // Collection of percentage rules that belongs to the feature flag / setting. - std::vector percentageItems; - - // Collection of targeting rules that belongs to the feature flag / setting. - std::vector rolloutRules; - - // Variation ID (for analytical purposes). - std::string variationId; - - bool operator==(const Setting& other) const { - return value == other.value - && percentageItems == other.percentageItems - && rolloutRules == other.rolloutRules - && variationId == other.variationId; - } -}; - -using Settings = std::unordered_map; - -struct Config { - static constexpr char kValue[] = "v"; - static constexpr char kComparator[] = "t"; - static constexpr char kComparisonAttribute[] = "a"; - static constexpr char kComparisonValue[] = "c"; - static constexpr char kRolloutPercentageItems[] = "p"; - static constexpr char kPercentage[] = "p"; - static constexpr char kRolloutRules[] = "r"; - static constexpr char kVariationId[] = "i"; - static constexpr char kPreferences[] = "p"; - static constexpr char kPreferencesUrl[] = "u"; - static constexpr char kPreferencesRedirect[] = "r"; - static constexpr char kEntries[] = "f"; - - std::shared_ptr preferences; - std::shared_ptr entries; - - std::string toJson(); - static std::shared_ptr fromJson(const std::string& jsonString); - static std::shared_ptr fromFile(const std::string& filePath); - - static std::shared_ptr empty; - - Config() {}; - Config(const Config&) = delete; // Disable copy -}; - -// extra brackets to avoid numeric_limits::max()/min() not recognized error on windows -constexpr double kDistantFuture = (std::numeric_limits::max)(); -constexpr double kDistantPast = (std::numeric_limits::min)(); - -struct ConfigEntry { - static constexpr char kConfig[] = "config"; - static constexpr char kETag[] = "etag"; - static constexpr char kFetchTime[] = "fetch_time"; - static constexpr char kSerializationFormatVersion[] = "v2"; - - static std::shared_ptr empty; - - ConfigEntry(std::shared_ptr config = Config::empty, - const std::string& eTag = "", - const std::string& configJsonString = "{}", - double fetchTime = kDistantPast): - config(config), - eTag(eTag), - configJsonString(configJsonString), - fetchTime(fetchTime) { - } - ConfigEntry(const ConfigEntry&) = delete; // Disable copy - - static std::shared_ptr fromString(const std::string& text); - std::string serialize() const; - - std::shared_ptr config; - std::string eTag; - std::string configJsonString; - double fetchTime; -}; + struct SettingValue; + + struct Value : public std::variant { + private: + using _Base = std::variant; + public: + Value(const char* v) : _Base(std::string(v)) {} + + // https://stackoverflow.com/a/59372958/8656352 + template + Value(T*) = delete; + + using _Base::variant; + using _Base::operator=; + + operator SettingValue() const; + + std::string toString() const; + }; + + enum class RedirectMode : int { + No = 0, + Should = 1, + Force = 2 + }; + + /** Setting type. */ + enum class SettingType : int { + /** On/off type (feature flag). */ + Boolean = 0, + /** Text type. */ + String = 1, + /** Whole number type. */ + Int = 2, + /** Decimal number type. */ + Double = 3, + }; + + /** User Object attribute comparison operator used during the evaluation process. */ + enum class UserComparator { + /** IS ONE OF (cleartext) - It matches when the comparison attribute is equal to any of the comparison values. */ + TextIsOneOf = 0, + /** IS NOT ONE OF (cleartext) - It matches when the comparison attribute is not equal to any of the comparison values. */ + TextIsNotOneOf = 1, + /** CONTAINS ANY OF (cleartext) - It matches when the comparison attribute contains any comparison values as a substring. */ + TextContainsAnyOf = 2, + /** NOT CONTAINS ANY OF (cleartext) - It matches when the comparison attribute does not contain any comparison values as a substring. */ + TextNotContainsAnyOf = 3, + /** IS ONE OF (semver) - It matches when the comparison attribute interpreted as a semantic version is equal to any of the comparison values. */ + SemVerIsOneOf = 4, + /** IS NOT ONE OF (semver) - It matches when the comparison attribute interpreted as a semantic version is not equal to any of the comparison values. */ + SemVerIsNotOneOf = 5, + /** < (semver) - It matches when the comparison attribute interpreted as a semantic version is less than the comparison value. */ + SemVerLess = 6, + /** <= (semver) - It matches when the comparison attribute interpreted as a semantic version is less than or equal to the comparison value. */ + SemVerLessOrEquals = 7, + /** > (semver) - It matches when the comparison attribute interpreted as a semantic version is greater than the comparison value. */ + SemVerGreater = 8, + /** >= (semver) - It matches when the comparison attribute interpreted as a semantic version is greater than or equal to the comparison value. */ + SemVerGreaterOrEquals = 9, + /** = (number) - It matches when the comparison attribute interpreted as a decimal number is equal to the comparison value. */ + NumberEquals = 10, + /** != (number) - It matches when the comparison attribute interpreted as a decimal number is not equal to the comparison value. */ + NumberNotEquals = 11, + /** < (number) - It matches when the comparison attribute interpreted as a decimal number is less than the comparison value. */ + NumberLess = 12, + /** <= (number) - It matches when the comparison attribute interpreted as a decimal number is less than or equal to the comparison value. */ + NumberLessOrEquals = 13, + /** > (number) - It matches when the comparison attribute interpreted as a decimal number is greater than the comparison value. */ + NumberGreater = 14, + /** >= (number) - It matches when the comparison attribute interpreted as a decimal number is greater than or equal to the comparison value. */ + NumberGreaterOrEquals = 15, + /** IS ONE OF (hashed) - It matches when the comparison attribute is equal to any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextIsOneOf = 16, + /** IS NOT ONE OF (hashed) - It matches when the comparison attribute is not equal to any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextIsNotOneOf = 17, + /** BEFORE (UTC datetime) - It matches when the comparison attribute interpreted as the seconds elapsed since Unix Epoch is less than the comparison value. */ + DateTimeBefore = 18, + /** AFTER (UTC datetime) - It matches when the comparison attribute interpreted as the seconds elapsed since Unix Epoch is greater than the comparison value. */ + DateTimeAfter = 19, + /** EQUALS (hashed) - It matches when the comparison attribute is equal to the comparison value (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextEquals = 20, + /** NOT EQUALS (hashed) - It matches when the comparison attribute is not equal to the comparison value (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextNotEquals = 21, + /** STARTS WITH ANY OF (hashed) - It matches when the comparison attribute starts with any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextStartsWithAnyOf = 22, + /** NOT STARTS WITH ANY OF (hashed) - It matches when the comparison attribute does not start with any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextNotStartsWithAnyOf = 23, + /** ENDS WITH ANY OF (hashed) - It matches when the comparison attribute ends with any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextEndsWithAnyOf = 24, + /** NOT ENDS WITH ANY OF (hashed) - It matches when the comparison attribute does not end with any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveTextNotEndsWithAnyOf = 25, + /** ARRAY CONTAINS ANY OF (hashed) - It matches when the comparison attribute interpreted as a comma-separated list contains any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveArrayContainsAnyOf = 26, + /** ARRAY NOT CONTAINS ANY OF (hashed) - It matches when the comparison attribute interpreted as a comma-separated list does not contain any of the comparison values (where the comparison is performed using the salted SHA256 hashes of the values). */ + SensitiveArrayNotContainsAnyOf = 27, + /** EQUALS (cleartext) - It matches when the comparison attribute is equal to the comparison value. */ + TextEquals = 28, + /** NOT EQUALS (cleartext) - It matches when the comparison attribute is not equal to the comparison value. */ + TextNotEquals = 29, + /** STARTS WITH ANY OF (cleartext) - It matches when the comparison attribute starts with any of the comparison values. */ + TextStartsWithAnyOf = 30, + /** NOT STARTS WITH ANY OF (cleartext) - It matches when the comparison attribute does not start with any of the comparison values. */ + TextNotStartsWithAnyOf = 31, + /** ENDS WITH ANY OF (cleartext) - It matches when the comparison attribute ends with any of the comparison values. */ + TextEndsWithAnyOf = 32, + /** NOT ENDS WITH ANY OF (cleartext) - It matches when the comparison attribute does not end with any of the comparison values. */ + TextNotEndsWithAnyOf = 33, + /** ARRAY CONTAINS ANY OF (cleartext) - It matches when the comparison attribute interpreted as a comma-separated list contains any of the comparison values. */ + ArrayContainsAnyOf = 34, + /** ARRAY NOT CONTAINS ANY OF (cleartext) - It matches when the comparison attribute interpreted as a comma-separated list does not contain any of the comparison values. */ + ArrayNotContainsAnyOf = 35, + }; + + /** Prerequisite flag comparison operator used during the evaluation process. */ + enum class PrerequisiteFlagComparator { + /** EQUALS - It matches when the evaluated value of the specified prerequisite flag is equal to the comparison value. */ + Equals = 0, + /** NOT EQUALS - It matches when the evaluated value of the specified prerequisite flag is not equal to the comparison value. */ + NotEquals = 1 + }; + + /** Segment comparison operator used during the evaluation process. */ + enum class SegmentComparator { + /** IS IN SEGMENT - It matches when the conditions of the specified segment are evaluated to true. */ + IsIn = 0, + /** IS NOT IN SEGMENT - It matches when the conditions of the specified segment are evaluated to false. */ + IsNotIn = 1, + }; + + template + class one_of : public std::variant { + using _Base = std::variant; + public: + one_of() : _Base(std::nullopt) {} + using _Base::variant; // inherit std::variant's ctors + using _Base::operator=; // inherit std::variant's assignment operators + }; + + std::ostream& operator<<(std::ostream& os, const Value& v); + + struct SettingValuePrivate; + + struct SettingValue : public one_of { + // Not for maintainers: the indices of variant alternatives must correspond to + // the SettingType enum's member values because we rely on this! (See e.g. Setting::fromValue) + private: + using _Base = one_of; + protected: + friend struct SettingValuePrivate; + + struct UnsupportedValue { + std::string type; + std::string value; + }; + + std::shared_ptr unsupportedValue; + public: + static constexpr char kBoolean[] = "b"; + static constexpr char kString[] = "s"; + static constexpr char kInt[] = "i"; + static constexpr char kDouble[] = "d"; + + SettingValue(const char* v) : _Base(std::string(v)) {} + + // https://stackoverflow.com/a/59372958/8656352 + template + SettingValue(T*) = delete; + + using _Base::one_of; + using _Base::operator=; + + operator std::optional() const; + std::optional toValueChecked(SettingType type, bool throwIfInvalid = true) const; + }; + + struct SettingValueContainer { + static constexpr char kValue[] = "v"; + static constexpr char kVariationId[] = "i"; + + SettingValue value; + std::optional variationId; + }; + + struct PercentageOption : public SettingValueContainer { + static constexpr char kPercentage[] = "p"; + + uint8_t percentage; + }; + + using PercentageOptions = std::vector; + + using UserConditionComparisonValue = one_of>; + + struct UserCondition { + static constexpr char kComparisonAttribute[] = "a"; + static constexpr char kComparator[] = "c"; + static constexpr char kStringComparisonValue[] = "s"; + static constexpr char kNumberComparisonValue[] = "d"; + static constexpr char kStringListComparisonValue[] = "l"; + + std::string comparisonAttribute; + UserComparator comparator; + UserConditionComparisonValue comparisonValue; + }; + + using UserConditions = std::vector; + + struct PrerequisiteFlagCondition { + static constexpr char kPrerequisiteFlagKey[] = "f"; + static constexpr char kComparator[] = "c"; + static constexpr char kComparisonValue[] = "v"; + + std::string prerequisiteFlagKey; + PrerequisiteFlagComparator comparator; + SettingValue comparisonValue; + }; + + struct SegmentCondition { + static constexpr char kSegmentIndex[] = "s"; + static constexpr char kComparator[] = "c"; + + int segmentIndex; + SegmentComparator comparator; + }; + + using Condition = one_of; + + struct ConditionContainer { + static constexpr char kUserCondition[] = "u"; + static constexpr char kPrerequisiteFlagCondition[] = "p"; + static constexpr char kSegmentCondition[] = "s"; + + Condition condition; + }; + + using Conditions = std::vector; + + using TargetingRuleThen = one_of; + + struct TargetingRule { + static constexpr char kConditions[] = "c"; + static constexpr char kSimpleValue[] = "s"; + static constexpr char kPercentageOptions[] = "p"; + + Conditions conditions; + TargetingRuleThen then; + }; + + using TargetingRules = std::vector; + + struct Segment { + static constexpr char kName[] = "n"; + static constexpr char kConditions[] = "r"; + + std::string name; + UserConditions conditions; + }; + + using Segments = std::vector; + + struct Config; + class RolloutEvaluator; + + struct Setting : public SettingValueContainer { + static constexpr char kType[] = "t"; + static constexpr char kPercentageOptionsAttribute[] = "a"; + static constexpr char kTargetingRules[] = "r"; + static constexpr char kPercentageOptions[] = "p"; + + static Setting fromValue(const SettingValue& value); + + SettingType type; + std::optional percentageOptionsAttribute; + TargetingRules targetingRules; + PercentageOptions percentageOptions; + + SettingType getTypeChecked(); + + protected: + friend struct Config; + friend class RolloutEvaluator; + std::shared_ptr configJsonSalt; + std::shared_ptr segments; + }; + + using Settings = std::unordered_map; + + struct Preferences { + /** + * The JSON key of the base url from where the config.json is intended to be downloaded. + */ + static constexpr char kBaseUrl[] = "u"; + /** + * The JSON key of the redirect mode that should be used in case the data governance mode is wrongly configured. + */ + static constexpr char kRedirectMode[] = "r"; + /** + * The JSON key of The salt that, combined with the feature flag key or segment name, is used to hash values for sensitive text comparisons. + */ + static constexpr char kSalt[] = "s"; + + std::optional baseUrl; + RedirectMode redirectMode = RedirectMode::No; + std::shared_ptr salt; + + Preferences() {} + + Preferences(const Preferences& other) : Preferences() { *this = other; } + + Preferences& operator=(const Preferences& other) { + this->baseUrl = other.baseUrl; + this->redirectMode = other.redirectMode; + this->salt = other.salt ? std::make_shared(*other.salt) : std::shared_ptr(); + return *this; + } + + Preferences(Preferences&& other) = default; + + Preferences& operator=(Preferences&& other) = default; + }; + + /** + * Details of a ConfigCat config. + */ + struct Config { + /** + * The JSON key of preferences of the config.json, mostly for controlling the redirection behaviour of the SDK. + */ + static constexpr char kPreferences[] = "p"; + /** + * The JSON key of segment definitions for re-using segment rules in targeting rules. + */ + static constexpr char kSegments[] = "s"; + /** + * The JSON key of setting definitions. + */ + static constexpr char kSettings[] = "f"; + + static const std::shared_ptr empty; + + std::string toJson(); + static std::shared_ptr fromJson(const std::string& jsonString, bool tolerant = false); + static std::shared_ptr fromFile(const std::string& filePath, bool tolerant = true); + + std::optional preferences; + std::shared_ptr segments; + std::shared_ptr settings; + + std::shared_ptr ensureSegments() const { return segments ? segments : std::make_shared(); } + std::shared_ptr ensureSettings() const { return settings ? settings : std::make_shared(); } + + Config() : segments(std::make_shared()), settings(std::make_shared()) {} + + Config(const Config& other) : Config() { *this = other; } + + Config& operator=(const Config& other) { + this->preferences = other.preferences; + this->segments = other.segments ? std::make_shared(*other.segments) : nullptr; + this->settings = other.settings ? std::make_shared(*other.settings) : nullptr; + this->fixup(); + return *this; + } + + Config(Config&& other) = default; + + Config& operator=(Config&& other) = default; + private: + void fixup(); + }; } // namespace configcat diff --git a/include/configcat/configcatclient.h b/include/configcat/configcatclient.h index 5591528..aab9aaa 100644 --- a/include/configcat/configcatclient.h +++ b/include/configcat/configcatclient.h @@ -51,9 +51,9 @@ class ConfigCatClient { /** * Gets the value of a feature flag or setting as std::shared_ptr identified by the given [key]. - * In case of any failure, nullptr will be returned. The [user] param identifies the caller. + * In case of any failure, std::nullopt will be returned. The [user] param identifies the caller. */ - std::shared_ptr getValue(const std::string& key, const ConfigCatUser* user = nullptr) const; + std::optional getValue(const std::string& key, const ConfigCatUser* user = nullptr) const; /** * Gets the value and evaluation details of a feature flag or setting identified by the given `key`. diff --git a/include/configcat/configcatlogger.h b/include/configcat/configcatlogger.h index daeb89e..bbcdef6 100644 --- a/include/configcat/configcatlogger.h +++ b/include/configcat/configcatlogger.h @@ -64,22 +64,30 @@ class LogEntry { return *this; } + // TODO: remove? LogEntry& operator<<(const ConfigCatUser* user) { return operator<<(*user); } + // TODO: remove? LogEntry& operator<<(const ConfigCatUser& user) { if (logger && level <= logger->getLogLevel()) message += user.toJson(); return *this; } - LogEntry& operator<<(const Value& v) { + // TODO: remove? + LogEntry& operator<<(const std::optional& v) { if (logger && level <= logger->getLogLevel()) - message += valueToString(v); + message += v ? v->toString() : ""; return *this; } + // TODO: remove? + LogEntry& operator<<(const SettingValue& v) { + return *this << static_cast>(v); + } + template LogEntry& operator<<(Type arg) { if (logger && level <= logger->getLogLevel()) diff --git a/include/configcat/evaluationdetails.h b/include/configcat/evaluationdetails.h index bcbc99e..8230f8f 100644 --- a/include/configcat/evaluationdetails.h +++ b/include/configcat/evaluationdetails.h @@ -1,8 +1,10 @@ #pragma once -#include -#include #include +#include +#include +#include + #include "config.h" namespace configcat { @@ -13,13 +15,13 @@ struct EvaluationDetails { public: EvaluationDetails(const std::string& key = "", const Value& value = {}, - const std::string& variationId = "", + const std::optional& variationId = "", const std::chrono::time_point>& fetchTime = {}, const ConfigCatUser* user = nullptr, bool isDefaultValue = false, const std::string& error = "", - const RolloutRule* matchedEvaluationRule = nullptr, - const RolloutPercentageItem* matchedEvaluationPercentageRule = nullptr) + const TargetingRule* matchedTargetingRule = nullptr, + const PercentageOption* matchedPercentageOption = nullptr) : key(key) , value(value) , variationId(variationId) @@ -27,8 +29,11 @@ struct EvaluationDetails { , user(user) , isDefaultValue(isDefaultValue) , error(error) - , matchedEvaluationRule(matchedEvaluationRule ? std::optional{*matchedEvaluationRule} : std::nullopt) - , matchedEvaluationPercentageRule(matchedEvaluationPercentageRule ? std::optional{*matchedEvaluationPercentageRule} : std::nullopt) + // Unfortunately, std::optional is not possible (https://stackoverflow.com/a/26862721/8656352). + // We could use std::optional> as a workaround. However, that would take up more space + // than pointers, so we'd rather resort to pointers, as this is ctor is not meant for public use. + , matchedTargetingRule(matchedTargetingRule ? std::optional(*matchedTargetingRule) : std::nullopt) + , matchedPercentageOption(matchedPercentageOption ? std::optional(*matchedPercentageOption) : std::nullopt) {} static EvaluationDetails fromError(const std::string& key, const Value& value, const std::string& error, const std::string& variationId = {}) { @@ -37,13 +42,13 @@ struct EvaluationDetails { std::string key; Value value; - std::string variationId; + std::optional variationId; std::chrono::time_point> fetchTime; const ConfigCatUser* user; bool isDefaultValue; std::string error; - std::optional matchedEvaluationRule; - std::optional matchedEvaluationPercentageRule; + std::optional matchedTargetingRule; + std::optional matchedPercentageOption; }; } // namespace configcat diff --git a/include/configcat/log.h b/include/configcat/log.h index a292149..37a5b01 100644 --- a/include/configcat/log.h +++ b/include/configcat/log.h @@ -7,7 +7,6 @@ namespace configcat { class ConfigCatUser; -struct Value; enum LogLevel { LOG_LEVEL_ERROR, diff --git a/src/config.cpp b/src/config.cpp index 20995cd..4ae7e18 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -1,29 +1,31 @@ -#include "configcat/config.h" -#include #include -#include +#include + +#include "configcat/config.h" +#include "utils.h" using namespace std; using json = nlohmann::json; -// nlohmann::json std::shared_ptr serialization - namespace nlohmann { + // nlohmann::json std::optional serialization template - struct adl_serializer> { - static void to_json(json& j, const std::shared_ptr& opt) { + struct adl_serializer> { + static void to_json(json& j, const optional& opt) { if (opt) { j = *opt; - } else { + } + else { j = nullptr; } } - static void from_json(const json& j, std::shared_ptr& opt) { + static void from_json(const json& j, optional& opt) { if (j.is_null()) { - opt = nullptr; - } else { - opt.reset(new T(j.get())); + opt = nullopt; + } + else { + opt = optional{ j.get() }; } } }; @@ -31,178 +33,424 @@ namespace nlohmann { namespace configcat { -string valueToString(const ValueType& value) { - return visit([](auto&& arg){ - using T = decay_t; - if constexpr (is_same_v) { - return arg; - } else if constexpr (is_same_v) { - return string(arg); - } else if constexpr (is_same_v) { - return string(arg ? "true" : "false"); - } else if constexpr (is_same_v) { - auto str = to_string(arg); - // Drop unnecessary '0' characters at the end of the string and keep format 0.0 for zero double - auto pos = str.find_last_not_of('0'); - if (pos != string::npos && str[pos] == '.') { - ++pos; + Value::operator SettingValue() const + { + return visit([](auto&& alt) { + return SettingValue(alt); + }, *this); + } + + string Value::toString() const + { + return visit([](auto&& alt) { + using T = decay_t; + if constexpr (is_same_v) { + return string(alt ? "true" : "false"); + } + else if constexpr (is_same_v) { + return alt; + } + else if constexpr (is_same_v) { + return to_string(alt); + } + else /*if constexpr (is_same_v) */ { + auto str = to_string(alt); + // Drop unnecessary '0' characters at the end of the string and keep format 0.0 for zero double + auto pos = str.find_last_not_of('0'); + if (pos != string::npos && str[pos] == '.') { + --pos; + } + return str.erase(pos + 1, string::npos); + } + }, *this); + } + + ostream& operator<<(ostream& os, const Value& v) { + return os << v.toString(); + } + + // Config serialization + +#pragma region SettingValue + + struct SettingValuePrivate { + static void setUnsupportedValue(SettingValue& value, const json& j) { + value = nullopt; + value.unsupportedValue = shared_ptr(new SettingValue::UnsupportedValue{ j.type_name(), j.dump() }); + } + }; + + void to_json(json& j, const SettingValue& value) { + if (holds_alternative(value)) { + j[SettingValue::kBoolean] = get(value); + } + else if (holds_alternative(value)) { + j[SettingValue::kString] = get(value); + } + else if (holds_alternative(value)) { + j[SettingValue::kInt] = get(value); + } + else if (holds_alternative(value)) { + j[SettingValue::kDouble] = get(value); + } + } + + void from_json(const json& j, SettingValue& value) { + if (auto it = j.find(SettingValue::kBoolean); it != j.end()) { + value = it->get(); + } + else if (auto it = j.find(SettingValue::kString); it != j.end()) { + value = it->get(); + } + else if (auto it = j.find(SettingValue::kInt); it != j.end()) { + value = it->get(); + } + else if (auto it = j.find(SettingValue::kDouble); it != j.end()) { + value = it->get(); + } + else { + SettingValuePrivate::setUnsupportedValue(value, j); + } + } + + SettingValue::operator optional() const { + return visit([](auto&& alt) { + using T = decay_t; + if constexpr (is_same_v) { + return static_cast>(nullopt); + } + else { + return optional(alt); + } + }, *this); + } + + optional SettingValue::toValueChecked(SettingType type, bool throwIfInvalid) const + { + if (holds_alternative(*this)) { + if (type == SettingType::Boolean) return get(*this); + } + else if (holds_alternative(*this)) { + if (type == SettingType::String) return get(*this); + } + else if (holds_alternative(*this)) { + if (type == SettingType::Int) return get(*this); + } + else if (holds_alternative(*this)) { + if (type == SettingType::Double) return get(*this); + } + else if (this->unsupportedValue) { + if (throwIfInvalid) { + auto& unsupportedValue = *this->unsupportedValue; + throw new runtime_error(unsupportedValue.type == "null" + ? "Setting value is null." + : string_format("Setting value '%s' is of an unsupported type (%s).", unsupportedValue.value.c_str(), unsupportedValue.type.c_str())); + } + return nullopt; + } + + if (throwIfInvalid) { + throw new runtime_error("Setting value is missing or invalid."); + } + + return nullopt; + } + +#pragma endregion + +#pragma region SettingValueContainer + + void to_json(json& j, const SettingValueContainer& container) { + if (!holds_alternative(container.value)) j[SettingValueContainer::kValue] = container.value; + if (container.variationId) j[SettingValueContainer::kVariationId] = container.variationId; + } + + void from_json(const json& j, SettingValueContainer& container) { + if (auto it = j.find(SettingValueContainer::kValue); it != j.end()) it->get_to(container.value); + if (auto it = j.find(SettingValueContainer::kVariationId); it != j.end()) it->get_to(container.variationId); + } + +#pragma endregion + +#pragma region PercentageOption + + void to_json(json& j, const PercentageOption& percentageOption) { + j[PercentageOption::kPercentage] = percentageOption.percentage; + to_json(j, static_cast(percentageOption)); + } + + void from_json(const json& j, PercentageOption& percentageOption) { + j.at(PercentageOption::kPercentage).get_to(percentageOption.percentage); + from_json(j, static_cast(percentageOption)); + } + +#pragma endregion + +#pragma region UserCondition + + void to_json(json& j, const UserCondition& condition) { + j[UserCondition::kComparisonAttribute] = condition.comparisonAttribute; + j[UserCondition::kComparator] = condition.comparator; + if (holds_alternative(condition.comparisonValue)) { + j[UserCondition::kStringComparisonValue] = get(condition.comparisonValue); + } + else if (holds_alternative(condition.comparisonValue)) { + j[UserCondition::kNumberComparisonValue] = get(condition.comparisonValue); + } + else if (holds_alternative>(condition.comparisonValue)) { + j[UserCondition::kStringListComparisonValue] = get>(condition.comparisonValue); + } + } + + void from_json(const json& j, UserCondition& condition) { + j.at(UserCondition::kComparisonAttribute).get_to(condition.comparisonAttribute); + j.at(UserCondition::kComparator).get_to(condition.comparator); + if (auto it = j.find(UserCondition::kStringComparisonValue); it != j.end()) { + condition.comparisonValue = it->get(); + } + else if (auto it = j.find(UserCondition::kNumberComparisonValue); it != j.end()) { + condition.comparisonValue = it->get(); + } + else if (auto it = j.find(UserCondition::kStringListComparisonValue); it != j.end()) { + condition.comparisonValue = it->get>(); + } + } + +#pragma endregion + +#pragma region PrerequisiteFlagCondition + + void to_json(json& j, const PrerequisiteFlagCondition& condition) { + j[PrerequisiteFlagCondition::kPrerequisiteFlagKey] = condition.prerequisiteFlagKey; + j[PrerequisiteFlagCondition::kComparator] = condition.comparator; + if (!holds_alternative(condition.comparisonValue)) j[PrerequisiteFlagCondition::kComparisonValue] = condition.comparisonValue; + } + + void from_json(const json& j, PrerequisiteFlagCondition& condition) { + j.at(PrerequisiteFlagCondition::kPrerequisiteFlagKey).get_to(condition.prerequisiteFlagKey); + j.at(PrerequisiteFlagCondition::kComparator).get_to(condition.comparator); + if (auto it = j.find(PrerequisiteFlagCondition::kComparisonValue); it != j.end()) it->get_to(condition.comparisonValue); + } + +#pragma endregion + +#pragma region SegmentCondition + + void to_json(json& j, const SegmentCondition& condition) { + j[SegmentCondition::kSegmentIndex] = condition.segmentIndex; + j[SegmentCondition::kComparator] = condition.comparator; + } + + void from_json(const json& j, SegmentCondition& condition) { + j.at(SegmentCondition::kSegmentIndex).get_to(condition.segmentIndex); + j.at(SegmentCondition::kComparator).get_to(condition.comparator); + } + +#pragma endregion + +#pragma region ConditionContainer + + void to_json(json& j, const ConditionContainer& container) { + if (holds_alternative(container.condition)) { + j[ConditionContainer::kUserCondition] = get(container.condition); + } + else if (holds_alternative(container.condition)) { + j[ConditionContainer::kPrerequisiteFlagCondition] = get(container.condition); + } + else if (holds_alternative(container.condition)) { + j[ConditionContainer::kSegmentCondition] = get(container.condition); + } + } + + void from_json(const json& j, ConditionContainer& container) { + if (auto it = j.find(ConditionContainer::kUserCondition); it != j.end()) { + ConditionContainer c; + + container.condition = it->get(); + } + else if (auto it = j.find(ConditionContainer::kPrerequisiteFlagCondition); it != j.end()) { + container.condition = it->get(); + } + else if (auto it = j.find(ConditionContainer::kSegmentCondition); it != j.end()) { + container.condition = it->get(); + } + } + +#pragma endregion + +#pragma region TargetingRule + + void to_json(json& j, const TargetingRule& targetingRule) { + if (!targetingRule.conditions.empty()) j[TargetingRule::kConditions] = targetingRule.conditions; + if (holds_alternative(targetingRule.then)) { + j[TargetingRule::kSimpleValue] = get(targetingRule.then); + } + else { + j[TargetingRule::kPercentageOptions] = get>(targetingRule.then); + } + } + + void from_json(const json& j, TargetingRule& targetingRule) { + if (auto it = j.find(TargetingRule::kConditions); it != j.end()) it->get_to(targetingRule.conditions); + if (auto it = j.find(TargetingRule::kSimpleValue); it != j.end()) { + targetingRule.then = it->get(); + } + else if (auto it = j.find(TargetingRule::kPercentageOptions); it != j.end()) { + targetingRule.then = it->get>(); + } + } + +#pragma endregion + +#pragma region Segment + + void to_json(json& j, const Segment& segment) { + j[Segment::kName] = segment.name; + if (!segment.conditions.empty()) j[Segment::kConditions] = segment.conditions; + } + + void from_json(const json& j, Segment& segment) { + j.at(Segment::kName).get_to(segment.name); + if (auto it = j.find(Segment::kConditions); it != j.end()) it->get_to(segment.conditions); + } + +#pragma endregion + +#pragma region Setting + + void to_json(json& j, const Setting& setting) { + j[Setting::kType] = setting.type; + if (setting.percentageOptionsAttribute) j[Setting::kPercentageOptionsAttribute] = setting.percentageOptionsAttribute; + if (!setting.targetingRules.empty()) j[Setting::kTargetingRules] = setting.targetingRules; + if (!setting.percentageOptions.empty()) j[Setting::kPercentageOptions] = setting.percentageOptions; + to_json(j, static_cast(setting)); + } + + void from_json(const json& j, Setting& setting) { + j.at(Setting::kType).get_to(setting.type); + if (auto it = j.find(Setting::kPercentageOptionsAttribute); it != j.end()) it->get_to(setting.percentageOptionsAttribute); + if (auto it = j.find(Setting::kTargetingRules); it != j.end()) it->get_to(setting.targetingRules); + if (auto it = j.find(Setting::kPercentageOptions); it != j.end()) it->get_to(setting.percentageOptions); + from_json(j, static_cast(setting)); + } + + Setting Setting::fromValue(const SettingValue& value) { + Setting setting; + // For unsupported values this results in -1, which value is not present in the SettingType enum. + // However, we only use this value internally (will never expose it to the end user). + setting.type = static_cast(value.index() - 1); + setting.value = value; + return setting; + } + + SettingType Setting::getTypeChecked() { + if (this->type < SettingType::Boolean || SettingType::Double < this->type) { + throw std::runtime_error("Setting type is invalid."); + } + return this->type; + } + +#pragma endregion + +#pragma region Preference + + void to_json(json& j, const Preferences& preferences) { + j[Preferences::kBaseUrl] = preferences.baseUrl; + j[Preferences::kRedirectMode] = preferences.redirectMode; + if (preferences.salt) { + j[Preferences::kSalt] = *preferences.salt; + } + else { + j[Preferences::kSalt] = nullptr; + } + } + + void from_json(const json& j, Preferences& preferences) { + if (auto it = j.find(Preferences::kBaseUrl); it != j.end()) it->get_to(preferences.baseUrl); + if (auto it = j.find(Preferences::kRedirectMode); it != j.end()) it->get_to(preferences.redirectMode); + if (auto it = j.find(Preferences::kSalt); it != j.end()) { + preferences.salt = make_shared(); + it->get_to(*preferences.salt); + } + } + +#pragma endregion + +#pragma region Config + + void to_json(json& j, const Config& config) { + j[Config::kPreferences] = config.preferences ? *config.preferences : Preferences(); + if (config.segments && !config.segments->empty()) j[Config::kSegments] = *config.segments; + if (config.settings && !config.settings->empty()) j[Config::kSettings] = *config.settings; + } + + void from_json(const json& j, Config& config) { + if (auto it = j.find(Config::kPreferences); it != j.end()) it->get_to(config.preferences); + if (auto it = j.find(Config::kSegments); it != j.end()) it->get_to(*config.ensureSegments()); + if (auto it = j.find(Config::kSettings); it != j.end()) it->get_to(*config.ensureSettings()); + } + + const shared_ptr Config::empty = make_shared(); + + string Config::toJson() { + return json(*this).dump(); + } + + shared_ptr Config::fromJson(const string& jsonString, bool tolerant) { + json configObj = json::parse(jsonString, nullptr, true, tolerant); + auto config = make_shared(); + configObj.get_to(*config); + config->fixup(); + return config; + } + + shared_ptr Config::fromFile(const string& filePath, bool tolerant) { + ifstream file(filePath); + json data = json::parse(file, nullptr, true, tolerant); + auto config = make_shared(); + if (auto it = data.find("flags"); it != data.end()) { + // Simple (key-value) json format + config->settings = make_shared(); + for (auto& [key, value] : it->items()) { + SettingValue settingValue; + if (value.is_boolean()) { + settingValue = value.get(); + } + else if (value.is_string()) { + settingValue = value.get(); + } + else if (value.is_number_integer()) { + settingValue = value.get(); + } + else if (value.is_number()) { + settingValue = value.get(); + } + else { + SettingValuePrivate::setUnsupportedValue(settingValue, value); + } + config->settings->insert({ key, Setting::fromValue(settingValue) }); } - return str.erase(pos + 1, string::npos); - } else { - return to_string(arg); - } - }, value); -} - -// Config serialization - -void to_json(json& j, const ValueType& value) { - std::visit([&](auto&& arg){j = arg;}, value); -} - -void from_json(const json& j, ValueType& value) { - if (j.is_boolean()) { - value = j.get(); - } else if (j.is_string()) { - value = j.get(); - } else if (j.is_number_integer()) { - value = j.get(); - } else if (j.is_number_float()) { - value = j.get(); - } else { - throw json::parse_error::create(105, 0, string("Invalid value type: ") + j.type_name(), &j); - } -} - -void to_json(json& j, const Preferences& preferences) { - j[Config::kPreferencesUrl] = preferences.url; - j[Config::kPreferencesRedirect] = preferences.redirect; -} - -void from_json(const json& j, Preferences& preferences) { - j.at(Config::kPreferencesUrl).get_to(preferences.url); - j.at(Config::kPreferencesRedirect).get_to(preferences.redirect); -} - -void to_json(json& j, const RolloutPercentageItem& rolloutPercentageItem) { - j[Config::kValue] = rolloutPercentageItem.value; - j[Config::kPercentage] = rolloutPercentageItem.percentage; - if (!rolloutPercentageItem.variationId.empty()) j[Config::kVariationId] = rolloutPercentageItem.variationId; -} - -void from_json(const json& j, RolloutPercentageItem& rolloutPercentageItem) { - j.at(Config::kValue).get_to(rolloutPercentageItem.value); - j.at(Config::kPercentage).get_to(rolloutPercentageItem.percentage); - if (auto it = j.find(Config::kVariationId); it != j.end()) it->get_to(rolloutPercentageItem.variationId); -} - -void to_json(json& j, const RolloutRule& rolloutRule) { - j[Config::kValue] = rolloutRule.value; - j[Config::kComparisonAttribute] = rolloutRule.comparisonAttribute; - j[Config::kComparator] = rolloutRule.comparator; - j[Config::kComparisonValue] = rolloutRule.comparisonValue; - if (!rolloutRule.variationId.empty()) j[Config::kVariationId] = rolloutRule.variationId; -} - -void from_json(const json& j, RolloutRule& rolloutRule) { - j.at(Config::kValue).get_to(rolloutRule.value); - j.at(Config::kComparisonAttribute).get_to(rolloutRule.comparisonAttribute); - j.at(Config::kComparator).get_to(rolloutRule.comparator); - j.at(Config::kComparisonValue).get_to(rolloutRule.comparisonValue); - if (auto it = j.find(Config::kVariationId); it != j.end()) it->get_to(rolloutRule.variationId); -} - -void to_json(json& j, const Setting& setting) { - j[Config::kValue] = setting.value; - if (!setting.percentageItems.empty()) j[Config::kRolloutPercentageItems] = setting.percentageItems; - if (!setting.rolloutRules.empty()) j[Config::kRolloutRules] = setting.rolloutRules; - if (!setting.variationId.empty()) j[Config::kVariationId] = setting.variationId; -} - -void from_json(const json& j, Setting& setting) { - j.at(Config::kValue).get_to(setting.value); - if (auto it = j.find(Config::kRolloutPercentageItems); it != j.end()) it->get_to(setting.percentageItems); - if (auto it = j.find(Config::kRolloutRules); it != j.end()) it->get_to(setting.rolloutRules); - if (auto it = j.find(Config::kVariationId); it != j.end()) it->get_to(setting.variationId); -} - -void to_json(json& j, const Config& value) { - if (value.preferences) j[Config::kPreferences] = value.preferences; - if (value.entries) j[Config::kEntries] = value.entries; -} - -void from_json(const json& j, Config& config) { - if (auto it = j.find(Config::kPreferences); it != j.end()) it->get_to(config.preferences); - if (auto it = j.find(Config::kEntries); it != j.end()) it->get_to(config.entries); -} - -std::shared_ptr Config::empty = std::make_shared(); - -std::string Config::toJson() { - return json(*this).dump(); -} - -shared_ptr Config::fromJson(const string& jsonString) { - json configObj = json::parse(jsonString); - auto config = make_shared(); - configObj.get_to(*config); - return config; -} - -shared_ptr Config::fromFile(const string& filePath) { - ifstream file(filePath); - json data = json::parse(file); - auto config = make_shared(); - if (auto it = data.find("flags"); it != data.end()) { - // Simple (key-value) json format - config->entries = make_shared>(); - for (auto& [key, value] : it->items()) { - Setting setting; - value.get_to(setting.value); - config->entries->insert({key, setting}); - } - } else { - // Complex (full-featured) json format - data.get_to(*config); - } - return config; -} - -std::shared_ptr ConfigEntry::empty = std::make_shared(Config::empty, "empty"); - -shared_ptr ConfigEntry::fromString(const string& text) { - if (text.empty()) - return ConfigEntry::empty; - - auto fetchTimeIndex = text.find('\n'); - auto eTagIndex = text.find('\n', fetchTimeIndex + 1); - if (fetchTimeIndex == string::npos || eTagIndex == string::npos) { - throw std::invalid_argument("Number of values is fewer than expected."); - } - - auto fetchTimeString = text.substr(0, fetchTimeIndex); - double fetchTime; - try { - fetchTime = std::stod(fetchTimeString); - } catch (const std::exception& e) { - throw std::invalid_argument("Invalid fetch time: " + fetchTimeString + ". " + e.what()); - } - - auto eTag = text.substr(fetchTimeIndex + 1, eTagIndex - fetchTimeIndex - 1); - if (eTag.empty()) { - throw std::invalid_argument("Empty eTag value"); - } - - auto configJsonString = text.substr(eTagIndex + 1); - try { - return make_shared(Config::fromJson(configJsonString), eTag, configJsonString, fetchTime / 1000.0); - } catch (const std::exception& e) { - throw std::invalid_argument("Invalid config JSON: " + configJsonString + ". " + e.what()); - } -} - -string ConfigEntry::serialize() const { - return to_string(static_cast(floor(fetchTime * 1000))) + "\n" + eTag + "\n" + configJsonString; -} + } + else { + // Complex (full-featured) json format + data.get_to(*config); + config->fixup(); + } + return config; + } + + void Config::fixup() { + if (this->settings && !this->settings->empty()) { + auto configJsonSalt = this->preferences ? (*this->preferences).salt : nullptr; + auto segments = this->segments; + + for (auto& it : *this->settings) { + it.second.configJsonSalt = configJsonSalt; + it.second.segments = segments; + } + } + } + +#pragma endregion } // namespace configcat diff --git a/src/configcatclient.cpp b/src/configcatclient.cpp index 2ea5d75..b8d167f 100644 --- a/src/configcatclient.cpp +++ b/src/configcatclient.cpp @@ -152,7 +152,7 @@ std::string ConfigCatClient::getValue(const std::string& key, const std::string& return _getValue(key, defaultValue, user); } -std::shared_ptr ConfigCatClient::getValue(const std::string& key, const ConfigCatUser* user) const { +std::optional ConfigCatClient::getValue(const std::string& key, const ConfigCatUser* user) const { auto settingResult = getSettings(); auto& settings = settingResult.settings; auto& fetchTime = settingResult.fetchTime; @@ -177,7 +177,7 @@ std::shared_ptr ConfigCatClient::getValue(const std::string& key, const C } auto details = evaluate(key, user, setting->second, fetchTime); - return make_shared(details.value); + return details.value; } EvaluationDetails ConfigCatClient::getValueDetails(const std::string& key, bool defaultValue, const ConfigCatUser* user) const { @@ -252,28 +252,28 @@ std::vector ConfigCatClient::getAllKeys() const { std::shared_ptr ConfigCatClient::getKeyAndValue(const std::string& variationId) const { auto settingResult = getSettings(); auto& settings = settingResult.settings; - auto& fetchTime = settingResult.fetchTime; if (!settings) { LOG_ERROR(1000) << "Config JSON is not present. Returning null."; return nullptr; } - for (auto keyValue : *settings) { + for (auto& keyValue : *settings) { auto& key = keyValue.first; - auto setting = keyValue.second; + auto& setting = keyValue.second; if (setting.variationId == variationId) { - return make_shared(key, setting.value); + return make_shared(key, *static_cast>(setting.value)); } - for (auto rolloutRule : setting.rolloutRules) { - if (rolloutRule.variationId == variationId) { - return make_shared(key, rolloutRule.value); + for (auto& targetingRule : setting.targetingRules) { + auto simpleValue = std::get(targetingRule.then); + if (simpleValue.variationId == variationId) { + return make_shared(key, *static_cast>(simpleValue.value)); } } - for (auto percentageRule : setting.percentageItems) { - if (percentageRule.variationId == variationId) { - return make_shared(key, percentageRule.value); + for (auto& percentageOption : setting.percentageOptions) { + if (percentageOption.variationId == variationId) { + return make_shared(key, *static_cast>(percentageOption.value)); } } } @@ -363,17 +363,18 @@ EvaluationDetails ConfigCatClient::evaluate(const std::string& key, const Setting& setting, double fetchTime) const { user = user != nullptr ? user : defaultUser.get(); - auto [value, variationId, rule, percentageRule, error] = rolloutEvaluator->evaluate(key, user, setting); + auto evaluateResult = rolloutEvaluator->evaluate(key, user, setting); + auto& error = evaluateResult.error; EvaluationDetails details(key, - value, - variationId, + *static_cast>(evaluateResult.selectedValue.value), + evaluateResult.selectedValue.variationId, time_point>(duration(fetchTime)), user, error.empty() ? false : true, error, - rule, - percentageRule); + evaluateResult.targetingRule, + evaluateResult.percentageOption); hooks->invokeOnFlagEvaluated(details); return details; } diff --git a/src/configentry.cpp b/src/configentry.cpp new file mode 100644 index 0000000..4ca67d8 --- /dev/null +++ b/src/configentry.cpp @@ -0,0 +1,47 @@ +#include + +#include "configcat/config.h" +#include "configentry.h" + +using namespace std; + +namespace configcat { + + const shared_ptr ConfigEntry::empty = make_shared(Config::empty, "empty"); + + shared_ptr ConfigEntry::fromString(const string& text) { + if (text.empty()) + return ConfigEntry::empty; + + auto fetchTimeIndex = text.find('\n'); + auto eTagIndex = text.find('\n', fetchTimeIndex + 1); + if (fetchTimeIndex == string::npos || eTagIndex == string::npos) { + throw invalid_argument("Number of values is fewer than expected."); + } + + auto fetchTimeString = text.substr(0, fetchTimeIndex); + double fetchTime; + try { + fetchTime = stod(fetchTimeString); + } catch (const exception& e) { + throw invalid_argument("Invalid fetch time: " + fetchTimeString + ". " + e.what()); + } + + auto eTag = text.substr(fetchTimeIndex + 1, eTagIndex - fetchTimeIndex - 1); + if (eTag.empty()) { + throw invalid_argument("Empty eTag value"); + } + + auto configJsonString = text.substr(eTagIndex + 1); + try { + return make_shared(Config::fromJson(configJsonString), eTag, configJsonString, fetchTime / 1000.0); + } catch (const exception& e) { + throw invalid_argument("Invalid config JSON: " + configJsonString + ". " + e.what()); + } + } + + string ConfigEntry::serialize() const { + return to_string(static_cast(floor(fetchTime * 1000))) + "\n" + eTag + "\n" + configJsonString; + } + +} // namespace configcat diff --git a/src/configentry.h b/src/configentry.h new file mode 100644 index 0000000..d5c092c --- /dev/null +++ b/src/configentry.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +#include "configcat/config.h" + +namespace configcat { + + // extra brackets to avoid numeric_limits::max()/min() not recognized error on windows + constexpr double kDistantFuture = (std::numeric_limits::max)(); + constexpr double kDistantPast = (std::numeric_limits::min)(); + + struct ConfigEntry { + static constexpr char kConfig[] = "config"; + static constexpr char kETag[] = "etag"; + static constexpr char kFetchTime[] = "fetch_time"; + static constexpr char kSerializationFormatVersion[] = "v2"; + + static const std::shared_ptr empty; + + ConfigEntry(const std::shared_ptr config = Config::empty, + const std::string& eTag = "", + const std::string& configJsonString = "{}", + double fetchTime = kDistantPast): + config(config), + eTag(eTag), + configJsonString(configJsonString), + fetchTime(fetchTime) { + } + ConfigEntry(const ConfigEntry&) = delete; // Disable copy + + static std::shared_ptr fromString(const std::string& text); + std::string serialize() const; + + std::shared_ptr config; + std::string eTag; + std::string configJsonString; + double fetchTime; + }; + +} // namespace configcat diff --git a/src/configfetcher.cpp b/src/configfetcher.cpp index 40776b6..fb252cd 100644 --- a/src/configfetcher.cpp +++ b/src/configfetcher.cpp @@ -57,34 +57,35 @@ FetchResponse ConfigFetcher::fetchConfiguration(const std::string& eTag) { FetchResponse ConfigFetcher::executeFetch(const std::string& eTag, int executeCount) { auto response = fetch(eTag); - auto preferences = response.entry && response.entry->config ? response.entry->config->preferences : nullptr; + auto& preferences = response.entry && response.entry->config ? response.entry->config->preferences : nullopt; // If there wasn't a config change or there were no preferences in the config, we return the response - if (!response.isFetched() || preferences == nullptr) { + if (!response.isFetched() || !preferences) { return response; } + auto& baseUrl = preferences->baseUrl.value_or(""); // If the preferences url is the same as the last called one, just return the response. - if (!preferences->url.empty() && url == preferences->url) { + if (!baseUrl.empty() && url == baseUrl) { return response; } // If the url is overridden, and the redirect parameter is not ForceRedirect, // the SDK should not redirect the calls, and it just has to return the response. - if (urlIsCustom && preferences->redirect != ForceRedirect) { + if (urlIsCustom && preferences->redirectMode != RedirectMode::Force) { return response; } // The next call should use the preferences url provided in the config json - url = preferences->url; + url = baseUrl; - if (preferences->redirect == NoRedirect) { + if (preferences->redirectMode == RedirectMode::No) { return response; } // Try to download again with the new url - if (preferences->redirect == ShouldRedirect) { + if (preferences->redirectMode == RedirectMode::Should) { LOG_WARN(3002) << "The `dataGovernance` parameter specified at the client initialization is not in sync with the preferences on the ConfigCat Dashboard. " "Read more: https://configcat.com/docs/advanced/data-governance/"; diff --git a/src/configfetcher.h b/src/configfetcher.h index f9f0e6a..2768314 100644 --- a/src/configfetcher.h +++ b/src/configfetcher.h @@ -6,12 +6,12 @@ #include #include "configcat/proxyauthentication.h" +#include "configentry.h" namespace configcat { struct ConfigCatOptions; class ConfigCatLogger; -struct ConfigEntry; class HttpSessionAdapter; enum Status { @@ -22,11 +22,11 @@ enum Status { struct FetchResponse { Status status; - std::shared_ptr entry; + std::shared_ptr entry; std::string error; bool isTransientError = false; - FetchResponse(Status status, std::shared_ptr entry, const std::string& error = "", bool isTransientError = false): + FetchResponse(Status status, std::shared_ptr entry, const std::string& error = "", bool isTransientError = false): status(status), entry(entry), error(error), @@ -48,7 +48,7 @@ struct FetchResponse { class ConfigFetcher { public: - static constexpr char kConfigJsonName[] = "config_v5.json"; + static constexpr char kConfigJsonName[] = "config_v6.json"; static constexpr char kGlobalBaseUrl[] = "https://cdn-global.configcat.com"; static constexpr char kEuOnlyBaseUrl[] = "https://cdn-eu.configcat.com"; static constexpr char kUserAgentHeaderName[] = "X-ConfigCat-UserAgent"; diff --git a/src/configservice.cpp b/src/configservice.cpp index 60c2898..eb59ce3 100644 --- a/src/configservice.cpp +++ b/src/configservice.cpp @@ -19,7 +19,7 @@ ConfigService::ConfigService(const string& sdkKey, logger(logger), hooks(hooks), pollingMode(options.pollingMode ? options.pollingMode : PollingMode::autoPoll()), - cachedEntry(ConfigEntry::empty), + cachedEntry(const_pointer_cast(ConfigEntry::empty)), configCache(configCache) { cacheKey = generateCacheKey(sdkKey); configFetcher = make_unique(sdkKey, logger, pollingMode->getPollingIdentifier(), options); @@ -50,7 +50,7 @@ SettingResult ConfigService::getSettings() { auto now = chrono::steady_clock::now(); auto [ entry, _ ] = fetchIfOlder(getUtcNowSecondsSinceEpoch() - lazyPollingMode.cacheRefreshIntervalInSeconds); auto config = cachedEntry->config; - return { (cachedEntry != ConfigEntry::empty && config) ? config->entries : nullptr, entry->fetchTime }; + return { (cachedEntry != ConfigEntry::empty && config) ? config->ensureSettings() : nullptr, entry->fetchTime}; } else if (pollingMode->getPollingIdentifier() == AutoPollingMode::kIdentifier && !initialized) { auto& autoPollingMode = (AutoPollingMode&)*pollingMode; auto elapsedTime = chrono::duration(chrono::steady_clock::now() - startTime).count(); @@ -63,14 +63,14 @@ SettingResult ConfigService::getSettings() { if (!initialized) { setInitialized(); auto config = cachedEntry->config; - return { (cachedEntry != ConfigEntry::empty && config) ? config->entries : nullptr, cachedEntry->fetchTime }; + return { (cachedEntry != ConfigEntry::empty && config) ? config->ensureSettings() : nullptr, cachedEntry->fetchTime }; } } } auto [ entry, _ ] = fetchIfOlder(kDistantPast, true); auto config = entry->config; - return { (cachedEntry != ConfigEntry::empty && config) ? config->entries : nullptr, entry->fetchTime }; + return { (cachedEntry != ConfigEntry::empty && config) ? config->ensureSettings() : nullptr, entry->fetchTime }; } RefreshResult ConfigService::refresh() { @@ -113,7 +113,7 @@ void ConfigService::setOffline() { string ConfigService::generateCacheKey(const string& sdkKey) { return SHA1()(sdkKey + "_" + ConfigFetcher::kConfigJsonName + "_" + ConfigEntry::kSerializationFormatVersion); } -tuple, string> ConfigService::fetchIfOlder(double time, bool preferCache) { +tuple, string> ConfigService::fetchIfOlder(double time, bool preferCache) { { lock_guard lock(fetchMutex); @@ -121,8 +121,8 @@ tuple, string> ConfigService::fetchIfOlder(double time, if (cachedEntry == ConfigEntry::empty || cachedEntry->fetchTime > time) { auto entry = readCache(); if (entry != ConfigEntry::empty && entry->eTag != cachedEntry->eTag) { - cachedEntry = entry; - hooks->invokeOnConfigChanged(entry->config->entries); + cachedEntry = const_pointer_cast(entry); + hooks->invokeOnConfigChanged(entry->config->ensureSettings()); } // Cache isn't expired @@ -164,9 +164,9 @@ tuple, string> ConfigService::fetchIfOlder(double time, lock_guard lock(fetchMutex); if (response.isFetched()) { - cachedEntry = response.entry; + cachedEntry = const_pointer_cast(response.entry); writeCache(cachedEntry); - hooks->invokeOnConfigChanged(cachedEntry->config->entries); + hooks->invokeOnConfigChanged(cachedEntry->config->ensureSettings()); } else if ((response.notModified() || !response.isTransientError) && cachedEntry != ConfigEntry::empty) { cachedEntry->fetchTime = getUtcNowSecondsSinceEpoch(); writeCache(cachedEntry); @@ -184,7 +184,7 @@ void ConfigService::setInitialized() { } } -shared_ptr ConfigService::readCache() { +shared_ptr ConfigService::readCache() { try { auto jsonString = configCache->read(cacheKey); if (jsonString.empty() || jsonString == cachedEntryString) { @@ -199,7 +199,7 @@ shared_ptr ConfigService::readCache() { } } -void ConfigService::writeCache(const std::shared_ptr& configEntry) { +void ConfigService::writeCache(const std::shared_ptr& configEntry) { try { configCache->write(cacheKey, configEntry->serialize()); } catch (exception& exception) { diff --git a/src/configservice.h b/src/configservice.h index 1992c77..3aaf409 100644 --- a/src/configservice.h +++ b/src/configservice.h @@ -18,7 +18,6 @@ struct ConfigCatOptions; class ConfigCatLogger; class ConfigFetcher; class ConfigCache; -struct ConfigEntry; class PollingMode; class Hooks; @@ -41,10 +40,10 @@ class ConfigService { private: // Returns the ConfigEntry object and error message in case of any error. - std::tuple, std::string> fetchIfOlder(double time, bool preferCache = false); + std::tuple, std::string> fetchIfOlder(double time, bool preferCache = false); void setInitialized(); - std::shared_ptr readCache(); - void writeCache(const std::shared_ptr& configEntry); + std::shared_ptr readCache(); + void writeCache(const std::shared_ptr& configEntry); void startPoll(); void run(); diff --git a/src/fileoverridedatasource.cpp b/src/fileoverridedatasource.cpp index 5d3114a..6fecebe 100644 --- a/src/fileoverridedatasource.cpp +++ b/src/fileoverridedatasource.cpp @@ -38,7 +38,7 @@ void FileOverrideDataSource::reloadFileContent() { if (fileLastWriteTime != lastWriteTime) { fileLastWriteTime = lastWriteTime; auto config = Config::fromFile(filePath); - overrides = config->entries; + overrides = config->ensureSettings(); } } catch (filesystem::filesystem_error exception) { LOG_ERROR(1302) << "Failed to read the local config file '" << filePath << "'. " << exception.what(); diff --git a/src/mapoverridedatasource.cpp b/src/mapoverridedatasource.cpp index 54bc44b..e1b3a93 100644 --- a/src/mapoverridedatasource.cpp +++ b/src/mapoverridedatasource.cpp @@ -8,7 +8,7 @@ MapFlagOverrides::MapFlagOverrides(const std::unordered_map& overrides(make_shared()), behaviour(behaviour) { for (const auto& it : source) { - overrides->insert({it.first, {it.second}}); + overrides->insert({it.first, Setting::fromValue(it.second)}); } } diff --git a/src/rolloutevaluator.cpp b/src/rolloutevaluator.cpp index 4760d5f..64ce656 100644 --- a/src/rolloutevaluator.cpp +++ b/src/rolloutevaluator.cpp @@ -4,22 +4,66 @@ #include "utils.h" #include #include +#include +#include #include +#include #include +#include using namespace std; namespace configcat { +static constexpr std::array kComparatorTexts{ + "IS ONE OF", + "IS NOT ONE OF", + "CONTAINS", + "DOES NOT CONTAIN", + "IS ONE OF (SemVer)", + "IS NOT ONE OF (SemVer)", + "< (SemVer)", + "<= (SemVer)", + "> (SemVer)", + ">= (SemVer)", + "= (Number)", + "<> (Number)", + "< (Number)", + "<= (Number)", + "> (Number)", + ">= (Number)", + "IS ONE OF (Sensitive)", + "IS NOT ONE OF (Sensitive)" +}; + +static const char* comparatorToString(UserComparator comparator) { + return kComparatorTexts.at((int)comparator); +} + +static string comparisonValueToString(const UserConditionComparisonValue& comparisonValue) { + return visit([](auto&& alt) { + using T = std::decay_t; + nlohmann::json j; + if constexpr (std::is_same_v || std::is_same_v || std::is_same_v>) { + j = alt; + } + else { + j = ""; + } + return j.dump(); + }, comparisonValue); +} + RolloutEvaluator::RolloutEvaluator(std::shared_ptr logger): logger(logger), - sha1(make_unique()) { + sha1(make_unique()), + sha256(make_unique()) { } RolloutEvaluator::~RolloutEvaluator() { } -tuple RolloutEvaluator::evaluate( +const EvaluateResult RolloutEvaluator::evaluate( const string& key, const ConfigCatUser* user, const Setting& setting) { @@ -27,7 +71,7 @@ tuple R logEntry << "Evaluating getValue(" << key << ")"; if (!user) { - if (!setting.rolloutRules.empty() || !setting.percentageItems.empty()) { + if (!setting.targetingRules.empty() || !setting.percentageOptions.empty()) { LOG_WARN(3001) << "Cannot evaluate targeting rules and % options for setting '" << key << "' (User Object is missing). " "You should pass a User Object to the evaluation methods like `getValue()` in order to make targeting work properly. " @@ -35,19 +79,21 @@ tuple R } logEntry << "\n" << "Returning " << setting.value; - return {setting.value, setting.variationId, {}, {}, logEntry.getMessage()}; + return { setting, nullptr, nullptr, logEntry.getMessage() }; } logEntry << "\n" << "User object: " << user; - for (const auto& rule : setting.rolloutRules) { - const auto& comparisonAttribute = rule.comparisonAttribute; - const auto& comparisonValue = rule.comparisonValue; - const auto& comparator = rule.comparator; + for (const auto& rule : setting.targetingRules) { + const auto& condition = get(rule.conditions[0].condition); + + const auto& comparisonAttribute = condition.comparisonAttribute; + const auto& comparisonValue = condition.comparisonValue; + const auto& comparator = condition.comparator; const auto* userValuePtr = user->getAttribute(comparisonAttribute); - const auto& returnValue = rule.value; + const auto& returnValue = get(rule.then); - if (userValuePtr == nullptr || comparisonValue.empty() || userValuePtr->empty()) { + if (userValuePtr == nullptr || userValuePtr->empty()) { logEntry << "\n" << formatNoMatchRule(comparisonAttribute, userValuePtr ? *userValuePtr : "null", comparator, comparisonValue); continue; } @@ -55,73 +101,71 @@ tuple R const string& userValue = *userValuePtr; switch (comparator) { - case ONE_OF: { - stringstream stream(comparisonValue); - string token; - while (getline(stream, token, ',')) { - trim(token); - if (token == userValue) { + case UserComparator::TextIsOneOf: { + auto& texts = get>(comparisonValue); + for (auto& text : texts) { + if (text == userValue) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } } break; } - case NOT_ONE_OF: { - stringstream stream(comparisonValue); - string token; + case UserComparator::TextIsNotOneOf: { + auto& texts = get>(comparisonValue); bool found = false; - while (getline(stream, token, ',')) { - trim(token); - if (token == userValue) { + for (auto& text : texts) { + if (text == userValue) { found = true; break; } } if (!found) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } break; } - case CONTAINS: { - if (userValue.find(comparisonValue) != std::string::npos) { + case UserComparator::TextContainsAnyOf: { + auto& text = get>(comparisonValue)[0]; + if (userValue.find(text) != std::string::npos) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } break; } - case NOT_CONTAINS: { - if (userValue.find(comparisonValue) == std::string::npos) { + case UserComparator::TextNotContainsAnyOf: { + auto& text = get>(comparisonValue)[0]; + if (userValue.find(text) == std::string::npos) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } break; } - case ONE_OF_SEMVER: - case NOT_ONE_OF_SEMVER: { + case UserComparator::SemVerIsOneOf: + case UserComparator::SemVerIsNotOneOf: { + auto& texts = get>(comparisonValue); // The rule will be ignored if we found an invalid semantic version try { semver::version userValueVersion = semver::version::parse(userValue); - stringstream stream(comparisonValue); - string token; bool matched = false; - while (getline(stream, token, ',')) { - trim(token); + for (auto& text : texts) { + string version = text; + trim(version); // Filter empty versions - if (token.empty()) + if (version.empty()) continue; - semver::version tokenVersion = semver::version::parse(token); + semver::version tokenVersion = semver::version::parse(version); matched = tokenVersion == userValueVersion || matched; } - if ((matched && comparator == ONE_OF_SEMVER) || - (!matched && comparator == NOT_ONE_OF_SEMVER)) { + if ((matched && comparator == UserComparator::SemVerIsOneOf) || + (!matched && comparator == UserComparator::SemVerIsNotOneOf)) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } } catch (semver::semver_exception& exception) { auto message = formatValidationErrorRule(comparisonAttribute, userValue, comparator, @@ -131,25 +175,27 @@ tuple R } break; } - case LT_SEMVER: - case LTE_SEMVER: - case GT_SEMVER: - case GTE_SEMVER: { + case UserComparator::SemVerLess: + case UserComparator::SemVerLessOrEquals: + case UserComparator::SemVerGreater: + case UserComparator::SemVerGreaterOrEquals: { + auto& text = get(comparisonValue); + // The rule will be ignored if we found an invalid semantic version try { string userValueCopy = userValue; semver::version userValueVersion = semver::version::parse(userValueCopy); - string comparisonValueCopy = comparisonValue; + string comparisonValueCopy = text; semver::version comparisonValueVersion = semver::version::parse(trim(comparisonValueCopy)); - if ((comparator == LT_SEMVER && userValueVersion < comparisonValueVersion) || - (comparator == LTE_SEMVER && userValueVersion <= comparisonValueVersion) || - (comparator == GT_SEMVER && userValueVersion > comparisonValueVersion) || - (comparator == GTE_SEMVER && userValueVersion >= comparisonValueVersion)) { + if ((comparator == UserComparator::SemVerLess && userValueVersion < comparisonValueVersion) || + (comparator == UserComparator::SemVerLessOrEquals && userValueVersion <= comparisonValueVersion) || + (comparator == UserComparator::SemVerGreater && userValueVersion > comparisonValueVersion) || + (comparator == UserComparator::SemVerGreaterOrEquals && userValueVersion >= comparisonValueVersion)) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } } catch (semver::semver_exception& exception) { auto message = formatValidationErrorRule(comparisonAttribute, userValue, comparator, @@ -159,12 +205,14 @@ tuple R } break; } - case EQ_NUM: - case NOT_EQ_NUM: - case LT_NUM: - case LTE_NUM: - case GT_NUM: - case GTE_NUM: { + case UserComparator::NumberEquals: + case UserComparator::NumberNotEquals: + case UserComparator::NumberLess: + case UserComparator::NumberLessOrEquals: + case UserComparator::NumberGreater: + case UserComparator::NumberGreaterOrEquals: { + auto& number= get(comparisonValue); + bool error = false; double userValueDouble = str_to_double(userValue, error); if (error) { @@ -175,54 +223,43 @@ tuple R break; } - double comparisonValueDouble = str_to_double(comparisonValue, error); - if (error) { - string reason = string_format("Cannot convert string \"%s\" to double.", comparisonValue.c_str()); - auto message = formatValidationErrorRule(comparisonAttribute, userValue, comparator, comparisonValue, reason); - logEntry << "\n" << message; - LOG_WARN(0) << message; - break; - } - - if (comparator == EQ_NUM && userValueDouble == comparisonValueDouble || - comparator == NOT_EQ_NUM && userValueDouble != comparisonValueDouble || - comparator == LT_NUM && userValueDouble < comparisonValueDouble || - comparator == LTE_NUM && userValueDouble <= comparisonValueDouble || - comparator == GT_NUM && userValueDouble > comparisonValueDouble || - comparator == GTE_NUM && userValueDouble >= comparisonValueDouble) { + if (comparator == UserComparator::NumberEquals && userValueDouble == number || + comparator == UserComparator::NumberNotEquals && userValueDouble != number || + comparator == UserComparator::NumberLess && userValueDouble < number || + comparator == UserComparator::NumberLessOrEquals && userValueDouble <= number || + comparator == UserComparator::NumberGreater && userValueDouble > number || + comparator == UserComparator::NumberGreaterOrEquals && userValueDouble >= number) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } break; } - case ONE_OF_SENS: { - stringstream stream(comparisonValue); - string token; - auto userValueHash = (*sha1)(userValue); - while (getline(stream, token, ',')) { - trim(token); - if (token == userValueHash) { + case UserComparator::SensitiveTextIsOneOf: { + auto configJsonSalt = setting.configJsonSalt ? *setting.configJsonSalt : ""; + auto userValueHash = (*sha256)(userValue + configJsonSalt + key); + auto& texts = get>(comparisonValue); + for (auto& text : texts) { + if (text == userValueHash) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } } break; } - case NOT_ONE_OF_SENS: { - stringstream stream(comparisonValue); - string token; - auto userValueHash = (*sha1)(userValue); + case UserComparator::SensitiveTextIsNotOneOf: { + auto configJsonSalt = setting.configJsonSalt ? *setting.configJsonSalt : ""; + auto userValueHash = (*sha256)(userValue + configJsonSalt + key); + auto& texts = get>(comparisonValue); bool found = false; - while (getline(stream, token, ',')) { - trim(token); - if (token == userValueHash) { + for (auto& text : texts) { + if (text == userValueHash) { found = true; break; } } if (!found) { logEntry << "\n" << formatMatchRule(comparisonAttribute, userValue, comparator, comparisonValue, returnValue); - return {rule.value, rule.variationId, &rule, {}, {}}; + return { returnValue, &rule, nullptr, logEntry.getMessage() }; } break; } @@ -233,60 +270,62 @@ tuple R logEntry << "\n" << formatNoMatchRule(comparisonAttribute, userValue, comparator, comparisonValue); } - if (!setting.percentageItems.empty()) { + if (!setting.percentageOptions.empty()) { auto hashCandidate = key + user->identifier; string hash = (*sha1)(hashCandidate).substr(0, 7); auto num = std::stoul(hash, nullptr, 16); auto scaled = num % 100; double bucket = 0; - for (const auto& rolloutPercentageItem : setting.percentageItems) { + for (const auto& rolloutPercentageItem : setting.percentageOptions) { bucket += rolloutPercentageItem.percentage; if (scaled < bucket) { logEntry << "\n" << "Evaluating %% options. Returning " << rolloutPercentageItem.value; - return {rolloutPercentageItem.value, rolloutPercentageItem.variationId, {}, &rolloutPercentageItem, {}}; + return { rolloutPercentageItem, nullptr, &rolloutPercentageItem, logEntry.getMessage() }; } } } logEntry << "\n" << "Returning " << setting.value; - return {setting.value, setting.variationId, {}, {}, {}}; + return { setting, nullptr, nullptr, logEntry.getMessage() }; } std::string RolloutEvaluator::formatNoMatchRule(const std::string& comparisonAttribute, - const std::string& userValue, - Comparator comparator, - const std::string& comparisonValue) { + const std::string& userValue, + UserComparator comparator, + const UserConditionComparisonValue& comparisonValue) { return string_format("Evaluating rule: [%s:%s] [%s] [%s] => no match", - comparisonAttribute.c_str(), - userValue.c_str(), - comparatorToString(comparator), - comparisonValue.c_str()); + comparisonAttribute.c_str(), + userValue.c_str(), + comparatorToString(comparator), + comparisonValueToString(comparisonValue).c_str()); } std::string RolloutEvaluator::formatMatchRule(const std::string& comparisonAttribute, - const std::string& userValue, - Comparator comparator, - const std::string& comparisonValue, - const Value& returnValue) { + const std::string& userValue, + UserComparator comparator, + const UserConditionComparisonValue& comparisonValue, + const SettingValueContainer& returnValue) { + + optional v = returnValue.value; return string_format("Evaluating rule: [%s:%s] [%s] [%s] => match, returning: %s", - comparisonAttribute.c_str(), - userValue.c_str(), - comparatorToString(comparator), - comparisonValue.c_str(), - valueToString(returnValue).c_str()); + comparisonAttribute.c_str(), + userValue.c_str(), + comparatorToString(comparator), + comparisonValueToString(comparisonValue).c_str(), + (v ? v->toString() : "").c_str()); } std::string RolloutEvaluator::formatValidationErrorRule(const std::string& comparisonAttribute, - const std::string& userValue, - Comparator comparator, - const std::string& comparisonValue, - const std::string& error) { + const std::string& userValue, + UserComparator comparator, + const UserConditionComparisonValue& comparisonValue, + const std::string& error) { return string_format("Evaluating rule: [%s:%s] [%s] [%s] => Skip rule, Validation error: %s", - comparisonAttribute.c_str(), - userValue.c_str(), - comparatorToString(comparator), - comparisonValue.c_str(), - error.c_str()); + comparisonAttribute.c_str(), + userValue.c_str(), + comparatorToString(comparator), + comparisonValueToString(comparisonValue).c_str(), + error.c_str()); } } // namespace configcat diff --git a/src/rolloutevaluator.h b/src/rolloutevaluator.h index fed3b4a..5b02f1d 100644 --- a/src/rolloutevaluator.h +++ b/src/rolloutevaluator.h @@ -2,46 +2,55 @@ #include #include +#include #include "configcat/config.h" class SHA1; +class SHA256; namespace configcat { class ConfigCatUser; class ConfigCatLogger; +struct EvaluateResult { + const SettingValueContainer& selectedValue; + const TargetingRule* targetingRule; + const PercentageOption* percentageOption; + std::string error; +}; + class RolloutEvaluator { public: RolloutEvaluator(std::shared_ptr logger); ~RolloutEvaluator(); // Evaluate the feature flag or setting - // Returns [value, variationId, matchedEvaluationRule, matchedEvaluationPercentageRule, error] - std::tuple evaluate(const std::string& key, + const EvaluateResult evaluate(const std::string& key, const ConfigCatUser* user, const Setting& setting); inline static std::string formatNoMatchRule(const std::string& comparisonAttribute, const std::string& userValue, - Comparator comparator, - const std::string& comparisonValue); + UserComparator comparator, + const UserConditionComparisonValue& comparisonValue); inline static std::string formatMatchRule(const std::string& comparisonAttribute, const std::string& userValue, - Comparator comparator, - const std::string& comparisonValue, - const Value& returnValue); + UserComparator comparator, + const UserConditionComparisonValue& comparisonValue, + const SettingValueContainer& returnValue); inline static std::string formatValidationErrorRule(const std::string& comparisonAttribute, const std::string& userValue, - Comparator comparator, - const std::string& comparisonValue, + UserComparator comparator, + const UserConditionComparisonValue& comparisonValue, const std::string& error); private: std::shared_ptr logger; std::unique_ptr sha1; + std::unique_ptr sha256; }; } // namespace configcat diff --git a/test/data/test.json b/test/data/test.json index d547507..99153a7 100644 --- a/test/data/test.json +++ b/test/data/test.json @@ -1,19 +1,34 @@ { "f": { "disabledFeature": { - "v": false + "t": 0, + "v": { + "b": false + } + }, + "doubleSetting": { + "t": 3, + "v": { + "d": 3.14 + } }, "enabledFeature": { - "v": true + "t": 0, + "v": { + "b": true + } }, "intSetting": { - "v": 5 - }, - "doubleSetting": { - "v": 3.14 + "t": 2, + "v": { + "i": 5 + } }, "stringSetting": { - "v": "test" + "t": 1, + "v": { + "s": "test" + } } } } \ No newline at end of file diff --git a/test/data/testmatrix.csv b/test/data/testmatrix.csv index 9f37c51..6de7454 100644 --- a/test/data/testmatrix.csv +++ b/test/data/testmatrix.csv @@ -1,1013 +1,1013 @@ Identifier;Email;Country;Custom1;bool30TrueAdvancedRules;boolDefaultFalse;boolDefaultTrue;double25Pi25E25Gr25Zero;doubleDefaultPi;integer25One25Two25Three25FourAdvancedRules;integerDefaultOne;string25Cat25Dog25Falcon25Horse;string25Cat25Dog25Falcon25HorseAdvancedRules;string75Cat0Dog25Falcon0Horse;stringContainsDogDefaultCat;stringDefaultCat;stringIsInDogDefaultCat;stringIsNotInDogDefaultCat;stringNotContainsDogDefaultCat -##null##;;;;true;false;true;-1;3.1415;-1;1;Chicken;Chicken;Chicken;Cat;Cat;Cat;Cat;Cat -;;;;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -a@configcat.com;a@configcat.com;Hungary;admin;false;false;true;5.561;3.1415;5;1;Cat;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat -b@configcat.com;b@configcat.com;Hungary;;false;false;true;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat -c@configcat.com;c@configcat.com;United Kingdom;admin;false;false;true;5.561;3.1415;5;1;Dog;Dolphin;Falcon;Dog;Cat;Dog;Dog;Cat -d@configcat.com;d@configcat.com;United Kingdom;;false;false;true;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Cat;Dog;Cat -e@configcat.com;e@configcat.com;United States of America;;false;false;true;5.561;3.1415;5;1;Falcon;Kitten;Cat;Dog;Cat;Cat;Dog;Cat -f@configcat.com;f@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat -g@configcat.com;g@configcat.com;;;false;false;true;5.561;3.1415;5;1;Horse;Kitten;Cat;Dog;Cat;Cat;Dog;Cat -h@configcat.com;h@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Cat;Dog;Cat;Cat;Dog;Cat -i@configcat.com;i@configcat.com;;admin;true;false;true;5.561;3.1415;5;1;Cat;Lion;Falcon;Dog;Cat;Dog;Dog;Cat -j@configcat.com;j@configcat.com;;;false;false;true;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat -stern@msn.com;stern@msn.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -sarahs@yahoo.com;sarahs@yahoo.com;##null##;##null##;true;false;true;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -luebke@hotmail.com;luebke@hotmail.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -padme@icloud.com;padme@icloud.com;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -claypool@aol.com;claypool@aol.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -bogjobber@verizon.net;bogjobber@verizon.net;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -cliffordj@aol.com;cliffordj@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog -bryanw@verizon.net;bryanw@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog -jfmulder@sbcglobal.net;jfmulder@sbcglobal.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -raines@live.com;raines@live.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog -ribet@yahoo.ca;ribet@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -nacho@gmail.com;nacho@gmail.com;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog -sherzodr@att.net;sherzodr@att.net;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -oster@optonline.net;oster@optonline.net;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -josem@icloud.com;josem@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog -hedwig@outlook.com;hedwig@outlook.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -camenisch@yahoo.com;camenisch@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -ccohen@comcast.net;ccohen@comcast.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -techie@att.net;techie@att.net;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -damian@gmail.com;damian@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog -psharpe@comcast.net;psharpe@comcast.net;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -ebassi@me.com;ebassi@me.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -curly@aol.com;curly@aol.com;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -rddesign@optonline.net;rddesign@optonline.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -boftx@gmail.com;boftx@gmail.com;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -eegsa@yahoo.ca;eegsa@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -ganter@gmail.com;ganter@gmail.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog -mleary@att.net;mleary@att.net;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog -kassiesa@icloud.com;kassiesa@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -peterhoeg@outlook.com;peterhoeg@outlook.com;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog -mhanoh@yahoo.ca;mhanoh@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -henkp@yahoo.com;henkp@yahoo.com;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -krueger@sbcglobal.net;krueger@sbcglobal.net;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog -barjam@yahoo.com;barjam@yahoo.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -mirod@msn.com;mirod@msn.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -marioph@yahoo.com;marioph@yahoo.com;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog -niknejad@optonline.net;niknejad@optonline.net;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -bwcarty@sbcglobal.net;bwcarty@sbcglobal.net;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -mcast@aol.com;mcast@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -portscan@msn.com;portscan@msn.com;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog -pereinar@yahoo.ca;pereinar@yahoo.ca;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -floxy@verizon.net;floxy@verizon.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog -mhassel@comcast.net;mhassel@comcast.net;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog -mgemmons@optonline.net;mgemmons@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Dog;Dog -luvirini@mac.com;luvirini@mac.com;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -gslondon@gmail.com;gslondon@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -lamky@comcast.net;lamky@comcast.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog -lipeng@aol.com;lipeng@aol.com;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -keiji@mac.com;keiji@mac.com;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog -gumpish@verizon.net;gumpish@verizon.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog -tromey@hotmail.com;tromey@hotmail.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -miyop@aol.com;miyop@aol.com;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -natepuri@me.com;natepuri@me.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -sbmrjbr@outlook.com;sbmrjbr@outlook.com;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Dog;Dog -hahiss@gmail.com;hahiss@gmail.com;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog -gmcgath@yahoo.ca;gmcgath@yahoo.ca;##null##;##null##;true;false;true;0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog -zavadsky@msn.com;zavadsky@msn.com;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -munson@gmail.com;munson@gmail.com;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog -jfriedl@yahoo.com;jfriedl@yahoo.com;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -lushe@yahoo.ca;lushe@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog -skythe@gmail.com;skythe@gmail.com;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -lipeng@aol.com;lipeng@aol.com;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -jigsaw@me.com;jigsaw@me.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog -schwaang@gmail.com;schwaang@gmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog -eurohack@verizon.net;eurohack@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog -janneh@icloud.com;janneh@icloud.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -frederic@me.com;frederic@me.com;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -facet@optonline.net;facet@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -uncle@aol.com;uncle@aol.com;##null##;##null##;false;false;true;0;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -wilsonpm@comcast.net;wilsonpm@comcast.net;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog -garland@optonline.net;garland@optonline.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -srour@yahoo.com;srour@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog -inico@hotmail.com;inico@hotmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -plover@comcast.net;plover@comcast.net;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog -amichalo@comcast.net;amichalo@comcast.net;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -mirod@hotmail.com;mirod@hotmail.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog -bester@mac.com;bester@mac.com;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -kildjean@verizon.net;kildjean@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Dog;Dog -arandal@comcast.net;arandal@comcast.net;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -bartlett@yahoo.com;bartlett@yahoo.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -zyghom@icloud.com;zyghom@icloud.com;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog -valdez@mac.com;valdez@mac.com;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -scato@yahoo.com;scato@yahoo.com;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog -sinkou@live.com;sinkou@live.com;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -evilopie@comcast.net;evilopie@comcast.net;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog -ducasse@gmail.com;ducasse@gmail.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog -sthomas@sbcglobal.net;sthomas@sbcglobal.net;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog -plover@msn.com;plover@msn.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -mavilar@yahoo.com;mavilar@yahoo.com;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -josephw@msn.com;josephw@msn.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog -qmacro@yahoo.com;qmacro@yahoo.com;##null##;##null##;true;false;true;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -munson@mac.com;munson@mac.com;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog -paulv@mac.com;paulv@mac.com;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -dogdude@hotmail.com;dogdude@hotmail.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Dog;Dog -symbolic@yahoo.ca;symbolic@yahoo.ca;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog -carcus@yahoo.com;carcus@yahoo.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -sblack@me.com;sblack@me.com;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog -richard@gmail.com;richard@gmail.com;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog -tbusch@yahoo.ca;tbusch@yahoo.ca;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog -gtaylor@aol.com;gtaylor@aol.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -burniske@att.net;burniske@att.net;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -bebing@me.com;bebing@me.com;##null##;##null##;false;false;true;0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -joglo@gmail.com;joglo@gmail.com;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -chrwin@sbcglobal.net;chrwin@sbcglobal.net;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -chaikin@yahoo.com;chaikin@yahoo.com;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -jigsaw@verizon.net;jigsaw@verizon.net;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog -wbarker@yahoo.ca;wbarker@yahoo.ca;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -ganter@verizon.net;ganter@verizon.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog -eegsa@att.net;eegsa@att.net;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -sethbrown@hotmail.com;sethbrown@hotmail.com;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog -solomon@me.com;solomon@me.com;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog -tellis@yahoo.ca;tellis@yahoo.ca;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -jshirley@optonline.net;jshirley@optonline.net;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -tattooman@verizon.net;tattooman@verizon.net;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog -bescoto@yahoo.com;bescoto@yahoo.com;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog -hstiles@comcast.net;hstiles@comcast.net;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog -gumpish@optonline.net;gumpish@optonline.net;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog -hikoza@optonline.net;hikoza@optonline.net;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog -slanglois@yahoo.ca;slanglois@yahoo.ca;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog -kmiller@verizon.net;kmiller@verizon.net;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog -bowmanbs@hotmail.com;bowmanbs@hotmail.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog -penna@msn.com;penna@msn.com;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog -rnelson@live.com;rnelson@live.com;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog -johndo@aol.com;johndo@aol.com;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -shrapnull@att.net;shrapnull@att.net;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog -lcheng@comcast.net;lcheng@comcast.net;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -cyrus@msn.com;cyrus@msn.com;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog -suresh@yahoo.ca;suresh@yahoo.ca;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog -elflord@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -sassen@verizon.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dbindel@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -morain@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -timtroyr@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -esbeck@live.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -ilyaz@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -grinder@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -trieuvan@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -koudas@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -specprog@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -nichoj@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -sopwith@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -odlyzko@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -warrior@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -budinger@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -lstein@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -kmiller@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -british@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -webinc@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -kohlis@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -matthijs@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mmccool@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -ribet@hotmail.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -wildfire@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -makarow@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -garland@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -kjohnson@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -oneiros@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -jaxweb@gmail.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -raides@msn.com;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -cantu@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -msherr@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dwsauder@aol.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -comdig@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -esokullu@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -kjetilk@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -boomzilla@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -cvrcek@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -iamcal@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -grdschl@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jgwang@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -stevelim@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -weidai@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -dpitts@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -bebing@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -wikinerd@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -pfitza@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -policies@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -niknejad@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -aukjan@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dleconte@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -noahb@aol.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bdbrown@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -adillon@att.net;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -eegsa@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -chunzi@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -privcan@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -mglee@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -leocharre@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -dwendlan@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -lpalmer@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -emcleod@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -breegster@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mwandel@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -stewwy@me.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -drolsky@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -lukka@live.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -geekgrl@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -epeeist@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -papathan@verizon.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -singh@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -njpayne@aol.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -willg@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jimmichie@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -frosal@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -dunstan@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -parasite@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -firstpr@msn.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -konit@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -amaranth@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mcsporran@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gommix@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dprice@verizon.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -lcheng@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dwendlan@optonline.net;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -miami@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -ajlitt@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -grdschl@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -andersbr@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -nacho@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -hoangle@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jbuchana@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -knorr@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -saridder@gmail.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -scotfl@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -skoch@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -luebke@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -bsikdar@live.com;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -ryanvm@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dburrows@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -seebs@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mgemmons@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -kobayasi@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -marcs@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -netsfr@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -martink@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bflong@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -bhima@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -oster@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -teverett@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -kannan@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -yzheng@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -msusa@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -falcao@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -uraeus@live.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -dunstan@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -oracle@yahoo.ca;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -tbeck@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -scottzed@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -sblack@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -yenya@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bjoern@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -benanov@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -preneel@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -punkis@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -rwelty@comcast.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -penna@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -baveja@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -louise@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -arachne@icloud.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -hahiss@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -wayward@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -pajas@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -intlprog@comcast.net;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -hermanab@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -presoff@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -trygstad@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -denton@optonline.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -skythe@live.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -lushe@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -magusnet@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ullman@optonline.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -jyoliver@optonline.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -flavell@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -ianbuck@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -satch@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gommix@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -rnelson@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -crusader@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -rddesign@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -nanop@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -ngedmond@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -munjal@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -unreal@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jemarch@sbcglobal.net;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -shawnce@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -nweaver@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -british@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -ccohen@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -amaranth@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -louise@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -atmarks@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -iamcal@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -snunez@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mrobshaw@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -denton@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -konst@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -louise@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -wetter@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -kohlis@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -monkeydo@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -melnik@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -munge@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -stefano@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -giafly@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -gbacon@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -dgriffith@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dkrishna@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -firstpr@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -nichoj@comcast.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -aibrahim@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -inico@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -ribet@sbcglobal.net;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -ajlitt@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -errxn@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -lstein@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mgemmons@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jadavis@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -zilla@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -bogjobber@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -shazow@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -rgarton@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -meder@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -hedwig@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dhwon@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mstrout@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -manuals@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -andrewik@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -hahsler@icloud.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -miami@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -facet@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -zeitlin@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -lamprecht@aol.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -johnh@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -mrsam@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -lipeng@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -dsowsy@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -philen@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -kjohnson@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -nelson@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -syncnine@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -pgottsch@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jfmulder@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jacks@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -mrdvt@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -cfhsoft@outlook.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -kodeman@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mbrown@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jaxweb@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -symbolic@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -denism@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -hager@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -zavadsky@yahoo.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mugwump@hotmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -geekgrl@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -dprice@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -petersko@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -netsfr@aol.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -tbmaddux@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -meder@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -benits@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -timlinux@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -heroine@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hachi@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dkrishna@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -sthomas@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -thaljef@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -ganter@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -drjlaw@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -timtroyr@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -smcnabb@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -fwiles@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -delpino@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -whimsy@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -lbecchi@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jbearp@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -tamas@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -panolex@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -lridener@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -wayward@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -amaranth@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -garland@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -rfisher@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -stern@verizon.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -mavilar@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -rfisher@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -tarreau@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -koudas@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -bwcarty@mac.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jeteve@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -pmint@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -barlow@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -punkis@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jfinke@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -unreal@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -dwendlan@sbcglobal.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dbrobins@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -rasca@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jfriedl@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -clkao@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -noahb@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ducasse@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jrkorson@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -hmbrand@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -corrada@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -tmaek@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -richard@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -pkplex@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kwilliams@icloud.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mcrawfor@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -webteam@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -leakin@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ebassi@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -njpayne@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -konst@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -godeke@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -godeke@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -glenz@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -fallorn@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -nacho@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dkeeler@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -adhere@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gfody@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -codex@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -erynf@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -monkeydo@verizon.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -lauronen@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dinther@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -miami@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kewley@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dkeeler@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -galbra@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mastinfo@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -kempsonc@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -andale@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -airship@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -xtang@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jhardin@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -frederic@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -matsn@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -pereinar@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -salesgeek@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -tezbo@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -keijser@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -chaki@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -wetter@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -delpino@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -thassine@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -hoangle@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -bester@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jdhedden@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -killmenow@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -retoh@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -goresky@yahoo.ca;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -microfab@att.net;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -pfitza@aol.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -onestab@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -aracne@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -sherzodr@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -feamster@verizon.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -hyper@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jmgomez@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -fwitness@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -storerm@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -improv@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -arnold@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -blixem@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -rohitm@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -rfisher@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -alastair@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -multiplx@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -caidaperl@icloud.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -nacho@yahoo.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -keutzer@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -lbaxter@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -hachi@live.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mfburgo@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gfody@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -jaxweb@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -wojciech@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -doche@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -josephw@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -hakim@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -lstein@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -conteb@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -wildixon@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -oechslin@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -metzzo@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -kosact@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kodeman@optonline.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -ebassi@hotmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -pgolle@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jdhildeb@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -garyjb@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -gslondon@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -maratb@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -marnanel@optonline.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -rgiersig@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -gozer@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -valdez@hotmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -mnemonic@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -paina@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -syncnine@aol.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -melnik@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jaesenj@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -sekiya@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -tbusch@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -whimsy@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -firstpr@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -bartlett@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -bester@att.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -gordonjcp@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -bcevc@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -sethbrown@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mcmillan@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -raines@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -psharpe@comcast.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bachmann@gmail.com;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -leslie@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hager@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -ismail@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -nacho@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -kohlis@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -lahvak@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -gozer@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -willg@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -zavadsky@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -steve@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ccohen@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -msusa@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jsmith@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jshearer@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -pgottsch@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -majordick@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -sjava@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -rupak@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -empathy@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -intlprog@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -matthijs@gmail.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -portscan@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -morain@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -gozer@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -akoblin@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mhassel@comcast.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -spadkins@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -rohitm@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mwandel@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -warrior@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jipsen@aol.com;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -bancboy@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -corrada@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -wojciech@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -marcs@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -atmarks@me.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -quinn@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dkeeler@aol.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -pizza@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -empathy@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -dmouse@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -dinther@comcast.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -pappp@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -dougj@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -cfhsoft@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -maratb@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -stewwy@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -sravani@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -tmaek@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -juliano@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mcsporran@optonline.net;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -mgemmons@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -seasweb@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -lushe@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -schumer@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gfody@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mlewan@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -eegsa@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -rhavyn@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -cremonini@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -boftx@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -smartfart@outlook.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -uncled@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -quantaman@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -heidrich@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -moinefou@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ilial@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -fraser@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -csilvers@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -csilvers@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -kalpol@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -punkis@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -nacho@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mcsporran@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jaarnial@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gboss@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -henkp@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -philb@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -hllam@yahoo.com;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -roamer@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -geekgrl@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -cantu@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -firstpr@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -hmbrand@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -arandal@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jaarnial@live.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -hoyer@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mmccool@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -smcnabb@att.net;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -pakaste@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -panolex@mac.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hikoza@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -larry@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -arandal@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -ducasse@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -policies@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -sblack@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -hstiles@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -lushe@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -devphil@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dowdy@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -arachne@verizon.net;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -donev@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bowmanbs@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -roesch@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -lridener@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hmbrand@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -sopwith@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -vsprintf@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dwsauder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -symbolic@aol.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -gbacon@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hillct@verizon.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -earmstro@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -studyabr@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -shawnce@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -boser@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gknauss@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -marcs@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -bruck@icloud.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -comdig@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -floxy@yahoo.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -tmccarth@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -darin@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -mcraigw@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -fhirsch@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -unreal@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -crypt@comcast.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -pakaste@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -denism@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -staffelb@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jonas@outlook.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -staikos@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -mfburgo@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -psichel@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -brainless@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jmgomez@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -wsnyder@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -carcus@yahoo.ca;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dmouse@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -graham@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -murdocj@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -reziac@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -caronni@sbcglobal.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -hoyer@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -amcuri@verizon.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mstrout@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -osrin@verizon.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -geeber@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -konit@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -mxiao@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ryanshaw@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -bowmanbs@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -yamla@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ardagna@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -darin@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jmorris@me.com;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -valdez@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -haddawy@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -biglou@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -pplinux@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -afeldspar@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -campbell@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -akoblin@outlook.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -nwiger@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -stinson@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -daveed@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -arachne@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -augusto@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -xtang@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -itstatus@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ebassi@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kspiteri@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -kewley@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -yamla@me.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -oevans@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -ebassi@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -scitext@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -sisyphus@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jandrese@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jamuir@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -dobey@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -rande@live.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dkasak@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -greear@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -thaljef@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -sjmuir@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -joehall@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -kronvold@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jmorris@outlook.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -ajohnson@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -russotto@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -pgolle@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -mrdvt@aol.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -starstuff@icloud.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -jesse@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -luebke@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -emmanuel@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -imightb@msn.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -wbarker@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -luvirini@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -ylchang@yahoo.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -elflord@icloud.com;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -scottzed@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -mcraigw@yahoo.ca;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -nacho@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -rwelty@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -subir@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -tbusch@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -rupak@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -giafly@aol.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -british@outlook.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hllam@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -fatelk@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -parsimony@verizon.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -tbeck@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -citizenl@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jimxugle@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -starstuff@sbcglobal.net;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bader@icloud.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -starstuff@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -satishr@yahoo.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -ilikered@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -bader@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -yruan@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -skoch@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -bader@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -smallpaul@sbcglobal.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -stern@verizon.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -feamster@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -mcnihil@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -firstpr@msn.com;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -bmorrow@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -laird@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -ingolfke@msn.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -irving@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -monopole@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -keiji@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -wortmanj@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -keijser@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -aschmitz@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -tangsh@mac.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jdray@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -kewley@yahoo.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -policies@verizon.net;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -wayward@outlook.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -errxn@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -fglock@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -kmself@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -amichalo@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mwandel@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -thowell@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -pedwards@yahoo.ca;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dmiller@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -choset@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dbrobins@aol.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -pizza@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -noahb@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jespley@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jfriedl@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -arebenti@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -eidac@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jipsen@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -malin@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jramio@optonline.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jsnover@outlook.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -martyloo@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -danny@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bruck@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jfmulder@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -wsnyder@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -leslie@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -noticias@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -cgcra@yahoo.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -louise@me.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -rasca@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -cvrcek@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -chaffar@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -webdragon@att.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -keutzer@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -knorr@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -kawasaki@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -ducasse@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -satishr@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -drewf@comcast.net;##null##;##null##;##null##;true;false;true;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -martyloo@yahoo.ca;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -lstein@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -nighthawk@me.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -debest@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -cyrus@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dogdude@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -yruan@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -bmidd@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -policies@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -treit@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -animats@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kawasaki@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jramio@yahoo.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -josephw@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -rgarcia@me.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -ryanvm@gmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -rnewman@me.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -yangyan@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -tubesteak@optonline.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -munjal@sbcglobal.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -pgolle@live.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -milton@icloud.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -harryh@live.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -howler@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -drewf@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -cantu@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -leslie@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mfleming@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -nelson@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -valdez@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jsmith@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -djpig@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -bader@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -galbra@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dawnsong@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mcrawfor@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -pthomsen@icloud.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -raides@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -ahuillet@icloud.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -kostas@aol.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -lridener@att.net;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -maneesh@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -sartak@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -rohitm@comcast.net;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -heidrich@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -koudas@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -okroeger@me.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -cgcra@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -janusfury@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -seurat@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dhrakar@mac.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -delpino@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -bebing@msn.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -keiji@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -okroeger@hotmail.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -gward@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -jusdisgi@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -sakusha@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -rande@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -mwitte@hotmail.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -alhajj@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -marcs@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -juerd@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -sethbrown@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kdawson@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -mfburgo@aol.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -crandall@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -schwaang@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -mrsam@icloud.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -szymansk@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -epeeist@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -miyop@sbcglobal.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -wainwrig@me.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -pereinar@icloud.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -killmenow@mac.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -dsowsy@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -forsberg@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -amaranth@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -mkearl@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jandrese@live.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -openldap@msn.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -world@hotmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -adamk@att.net;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -pdbaby@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hellfire@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -firstpr@optonline.net;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kenja@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -leslie@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -bogjobber@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -hauma@verizon.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -hoangle@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -nimaclea@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -fraterk@icloud.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -ninenine@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dogdude@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -campware@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -amimojo@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -karasik@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -yenya@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -stevelim@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -dvdotnet@att.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -bonmots@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -schumer@icloud.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -andrei@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -alfred@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -multiplx@optonline.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -tjensen@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -dmath@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -kostas@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -carmena@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -terjesa@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -tjensen@sbcglobal.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -schwaang@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -nimaclea@gmail.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jaesenj@live.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jimxugle@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -mobileip@optonline.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -nullchar@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -crowemojo@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -hermanab@msn.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -esbeck@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -naoya@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -lpalmer@att.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -dgatwood@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -jtorkbob@att.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -rfoley@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -andale@comcast.net;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -mlewan@yahoo.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -ianbuck@yahoo.ca;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat -syrinx@live.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -imightb@live.com;##null##;##null##;##null##;true;false;true;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -gozer@icloud.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -gozer@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -shawnce@gmail.com;##null##;##null##;##null##;true;false;true;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -lauronen@att.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -raines@gmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jfriedl@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -hstiles@comcast.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -smpeters@icloud.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -thurston@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -flaviog@aol.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -mnemonic@me.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -privcan@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -mobileip@verizon.net;##null##;##null##;##null##;true;false;true;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -gbacon@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -caronni@optonline.net;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -tbeck@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -keijser@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -scotfl@verizon.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -ryanshaw@sbcglobal.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -eimear@att.net;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -noticias@comcast.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -leocharre@yahoo.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat -killmenow@yahoo.ca;##null##;##null##;##null##;true;false;true;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -petersen@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -bdthomas@yahoo.ca;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -mavilar@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -isaacson@msn.com;##null##;##null##;##null##;false;false;true;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat -miyop@msn.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -bwcarty@hotmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -warrior@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat -magusnet@hotmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -crowemojo@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -crypt@optonline.net;##null##;##null##;##null##;true;false;true;1.61803;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat -kempsonc@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat -kayvonf@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -noahb@yahoo.ca;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -symbolic@mac.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -wsnyder@yahoo.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -pdbaby@yahoo.ca;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -jfriedl@yahoo.com;##null##;##null##;##null##;false;false;true;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -openldap@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -jwarren@optonline.net;##null##;##null##;##null##;true;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -dsugal@verizon.net;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -kayvonf@aol.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat -nasarius@mac.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat -bolow@mac.com;##null##;##null##;##null##;true;false;true;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -tbmaddux@hotmail.com;##null##;##null##;##null##;true;false;true;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -maradine@aol.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -breegster@gmail.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat -breegster@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -openldap@gmail.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -jshirley@gmail.com;##null##;##null##;##null##;false;false;true;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat -tfinniga@msn.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat -delpino@mac.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat -stecoop@live.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat -jnolan@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -jhardin@yahoo.com;##null##;##null##;##null##;true;false;true;0;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -teverett@sbcglobal.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat -wsnyder@comcast.net;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -treeves@msn.com;##null##;##null##;##null##;false;false;true;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat -garland@outlook.com;##null##;##null##;##null##;false;false;true;0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat -ullman@comcast.net;##null##;##null##;##null##;false;false;true;3.1415;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat -sumdumass@outlook.com;##null##;##null##;##null##;false;false;true;2.7182;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +##null##;;;;True;False;True;-1;3.1415;-1;1;Chicken;Chicken;Chicken;Cat;Cat;Cat;Cat;Cat +;;;;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +a@configcat.com;a@configcat.com;Hungary;admin;False;False;True;5.561;3.1415;5;1;Cat;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat +b@configcat.com;b@configcat.com;Hungary;;False;False;True;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Dog;Cat;Cat +c@configcat.com;c@configcat.com;United Kingdom;admin;False;False;True;5.561;3.1415;5;1;Dog;Dolphin;Falcon;Dog;Cat;Dog;Dog;Cat +d@configcat.com;d@configcat.com;United Kingdom;;False;False;True;5.561;3.1415;5;1;Falcon;Dolphin;Cat;Dog;Cat;Cat;Dog;Cat +e@configcat.com;e@configcat.com;United States of America;;False;False;True;5.561;3.1415;5;1;Falcon;Kitten;Cat;Dog;Cat;Cat;Dog;Cat +f@configcat.com;f@configcat.com;;;False;False;True;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat +g@configcat.com;g@configcat.com;;;False;False;True;5.561;3.1415;5;1;Horse;Kitten;Cat;Dog;Cat;Cat;Dog;Cat +h@configcat.com;h@configcat.com;;;False;False;True;5.561;3.1415;5;1;Cat;Kitten;Cat;Dog;Cat;Cat;Dog;Cat +i@configcat.com;i@configcat.com;;admin;True;False;True;5.561;3.1415;5;1;Cat;Lion;Falcon;Dog;Cat;Dog;Dog;Cat +j@configcat.com;j@configcat.com;;;False;False;True;5.561;3.1415;5;1;Cat;Kitten;Falcon;Dog;Cat;Cat;Dog;Cat +stern@msn.com;stern@msn.com;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +sarahs@yahoo.com;sarahs@yahoo.com;##null##;##null##;True;False;True;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +luebke@hotmail.com;luebke@hotmail.com;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +padme@icloud.com;padme@icloud.com;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +claypool@aol.com;claypool@aol.com;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +bogjobber@verizon.net;bogjobber@verizon.net;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +cliffordj@aol.com;cliffordj@aol.com;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +bryanw@verizon.net;bryanw@verizon.net;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +jfmulder@sbcglobal.net;jfmulder@sbcglobal.net;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +raines@live.com;raines@live.com;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +ribet@yahoo.ca;ribet@yahoo.ca;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +nacho@gmail.com;nacho@gmail.com;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sherzodr@att.net;sherzodr@att.net;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +oster@optonline.net;oster@optonline.net;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +josem@icloud.com;josem@icloud.com;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +hedwig@outlook.com;hedwig@outlook.com;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +camenisch@yahoo.com;camenisch@yahoo.com;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +ccohen@comcast.net;ccohen@comcast.net;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +techie@att.net;techie@att.net;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +damian@gmail.com;damian@gmail.com;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +psharpe@comcast.net;psharpe@comcast.net;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +ebassi@me.com;ebassi@me.com;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +curly@aol.com;curly@aol.com;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +rddesign@optonline.net;rddesign@optonline.net;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +boftx@gmail.com;boftx@gmail.com;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +eegsa@yahoo.ca;eegsa@yahoo.ca;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +ganter@gmail.com;ganter@gmail.com;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +mleary@att.net;mleary@att.net;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +kassiesa@icloud.com;kassiesa@icloud.com;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +peterhoeg@outlook.com;peterhoeg@outlook.com;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +mhanoh@yahoo.ca;mhanoh@yahoo.ca;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +henkp@yahoo.com;henkp@yahoo.com;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +krueger@sbcglobal.net;krueger@sbcglobal.net;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog +barjam@yahoo.com;barjam@yahoo.com;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +mirod@msn.com;mirod@msn.com;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +marioph@yahoo.com;marioph@yahoo.com;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +niknejad@optonline.net;niknejad@optonline.net;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +bwcarty@sbcglobal.net;bwcarty@sbcglobal.net;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +mcast@aol.com;mcast@aol.com;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +portscan@msn.com;portscan@msn.com;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +pereinar@yahoo.ca;pereinar@yahoo.ca;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +floxy@verizon.net;floxy@verizon.net;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +mhassel@comcast.net;mhassel@comcast.net;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +mgemmons@optonline.net;mgemmons@optonline.net;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +luvirini@mac.com;luvirini@mac.com;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +gslondon@gmail.com;gslondon@gmail.com;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +lamky@comcast.net;lamky@comcast.net;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +lipeng@aol.com;lipeng@aol.com;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +keiji@mac.com;keiji@mac.com;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +gumpish@verizon.net;gumpish@verizon.net;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +tromey@hotmail.com;tromey@hotmail.com;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +miyop@aol.com;miyop@aol.com;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +natepuri@me.com;natepuri@me.com;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +sbmrjbr@outlook.com;sbmrjbr@outlook.com;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +hahiss@gmail.com;hahiss@gmail.com;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +gmcgath@yahoo.ca;gmcgath@yahoo.ca;##null##;##null##;True;False;True;0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +zavadsky@msn.com;zavadsky@msn.com;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +munson@gmail.com;munson@gmail.com;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +jfriedl@yahoo.com;jfriedl@yahoo.com;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +lushe@yahoo.ca;lushe@yahoo.ca;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +skythe@gmail.com;skythe@gmail.com;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +lipeng@aol.com;lipeng@aol.com;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +jigsaw@me.com;jigsaw@me.com;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +schwaang@gmail.com;schwaang@gmail.com;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +eurohack@verizon.net;eurohack@verizon.net;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +janneh@icloud.com;janneh@icloud.com;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +frederic@me.com;frederic@me.com;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +facet@optonline.net;facet@optonline.net;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +uncle@aol.com;uncle@aol.com;##null##;##null##;False;False;True;0;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +wilsonpm@comcast.net;wilsonpm@comcast.net;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +garland@optonline.net;garland@optonline.net;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +srour@yahoo.com;srour@yahoo.com;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +inico@hotmail.com;inico@hotmail.com;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +plover@comcast.net;plover@comcast.net;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +amichalo@comcast.net;amichalo@comcast.net;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +mirod@hotmail.com;mirod@hotmail.com;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +bester@mac.com;bester@mac.com;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +kildjean@verizon.net;kildjean@verizon.net;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Dog;Dog +arandal@comcast.net;arandal@comcast.net;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +bartlett@yahoo.com;bartlett@yahoo.com;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +zyghom@icloud.com;zyghom@icloud.com;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +valdez@mac.com;valdez@mac.com;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +scato@yahoo.com;scato@yahoo.com;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sinkou@live.com;sinkou@live.com;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +evilopie@comcast.net;evilopie@comcast.net;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +ducasse@gmail.com;ducasse@gmail.com;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +sthomas@sbcglobal.net;sthomas@sbcglobal.net;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +plover@msn.com;plover@msn.com;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +mavilar@yahoo.com;mavilar@yahoo.com;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +josephw@msn.com;josephw@msn.com;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Dog;Dog +qmacro@yahoo.com;qmacro@yahoo.com;##null##;##null##;True;False;True;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +munson@mac.com;munson@mac.com;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Dog;Dog +paulv@mac.com;paulv@mac.com;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +dogdude@hotmail.com;dogdude@hotmail.com;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +symbolic@yahoo.ca;symbolic@yahoo.ca;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +carcus@yahoo.com;carcus@yahoo.com;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sblack@me.com;sblack@me.com;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Dog;Dog +richard@gmail.com;richard@gmail.com;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +tbusch@yahoo.ca;tbusch@yahoo.ca;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Dog;Dog +gtaylor@aol.com;gtaylor@aol.com;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +burniske@att.net;burniske@att.net;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +bebing@me.com;bebing@me.com;##null##;##null##;False;False;True;0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +joglo@gmail.com;joglo@gmail.com;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +chrwin@sbcglobal.net;chrwin@sbcglobal.net;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +chaikin@yahoo.com;chaikin@yahoo.com;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +jigsaw@verizon.net;jigsaw@verizon.net;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Dog;Dog +wbarker@yahoo.ca;wbarker@yahoo.ca;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +ganter@verizon.net;ganter@verizon.net;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +eegsa@att.net;eegsa@att.net;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +sethbrown@hotmail.com;sethbrown@hotmail.com;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Dog;Dog +solomon@me.com;solomon@me.com;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Dog;Dog +tellis@yahoo.ca;tellis@yahoo.ca;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +jshirley@optonline.net;jshirley@optonline.net;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +tattooman@verizon.net;tattooman@verizon.net;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +bescoto@yahoo.com;bescoto@yahoo.com;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Dog;Dog +hstiles@comcast.net;hstiles@comcast.net;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +gumpish@optonline.net;gumpish@optonline.net;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Dog;Dog +hikoza@optonline.net;hikoza@optonline.net;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +slanglois@yahoo.ca;slanglois@yahoo.ca;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Dog;Dog +kmiller@verizon.net;kmiller@verizon.net;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +bowmanbs@hotmail.com;bowmanbs@hotmail.com;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Dog;Dog +penna@msn.com;penna@msn.com;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Dog;Dog +rnelson@live.com;rnelson@live.com;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Dog;Dog +johndo@aol.com;johndo@aol.com;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +shrapnull@att.net;shrapnull@att.net;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Dog;Dog +lcheng@comcast.net;lcheng@comcast.net;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +cyrus@msn.com;cyrus@msn.com;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Dog;Dog +suresh@yahoo.ca;suresh@yahoo.ca;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Dog;Dog +elflord@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +sassen@verizon.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dbindel@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +morain@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +timtroyr@outlook.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +esbeck@live.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +ilyaz@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +grinder@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +trieuvan@gmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +koudas@msn.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +specprog@yahoo.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +nichoj@outlook.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sopwith@outlook.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +odlyzko@yahoo.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +warrior@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +budinger@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lstein@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kmiller@gmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +british@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +webinc@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kohlis@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +matthijs@outlook.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mmccool@me.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ribet@hotmail.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +wildfire@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +makarow@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +garland@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +kjohnson@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +oneiros@sbcglobal.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jaxweb@gmail.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +raides@msn.com;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +cantu@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +msherr@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@aol.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +comdig@gmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +esokullu@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kjetilk@aol.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +boomzilla@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +cvrcek@outlook.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +iamcal@yahoo.ca;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +grdschl@att.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jgwang@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +stevelim@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +weidai@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dpitts@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bebing@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +wikinerd@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pfitza@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +policies@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +niknejad@me.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +aukjan@hotmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dleconte@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +noahb@aol.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bdbrown@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +adillon@att.net;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +eegsa@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +chunzi@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +privcan@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mglee@hotmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +leocharre@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dwendlan@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lpalmer@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +emcleod@msn.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +breegster@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mwandel@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +stewwy@me.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +drolsky@live.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +lukka@live.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +geekgrl@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +epeeist@me.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +papathan@verizon.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +singh@optonline.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +njpayne@aol.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +willg@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jimmichie@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +frosal@aol.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +dunstan@yahoo.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +parasite@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@msn.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +konit@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@msn.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mcsporran@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gommix@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dprice@verizon.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lcheng@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dwendlan@optonline.net;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +miami@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ajlitt@hotmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +grdschl@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +andersbr@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +nacho@yahoo.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hoangle@msn.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jbuchana@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +knorr@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +saridder@gmail.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +scotfl@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +skoch@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +luebke@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bsikdar@live.com;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ryanvm@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dburrows@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +seebs@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mgemmons@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +kobayasi@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +marcs@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +netsfr@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +martink@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bflong@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bhima@outlook.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +oster@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +teverett@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kannan@optonline.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +yzheng@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +msusa@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +falcao@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +uraeus@live.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dunstan@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +oracle@yahoo.ca;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +tbeck@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +scottzed@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +sblack@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +yenya@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bjoern@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +benanov@aol.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +preneel@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +punkis@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rwelty@comcast.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +penna@me.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +baveja@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +louise@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +arachne@icloud.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hahiss@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wayward@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pajas@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +intlprog@comcast.net;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +hermanab@sbcglobal.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +presoff@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +trygstad@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +denton@optonline.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +skythe@live.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lushe@sbcglobal.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +magusnet@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ullman@optonline.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jyoliver@optonline.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +flavell@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +ianbuck@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +satch@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gommix@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +rnelson@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +crusader@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rddesign@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +nanop@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ngedmond@live.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +munjal@live.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +unreal@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jemarch@sbcglobal.net;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +shawnce@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +nweaver@yahoo.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +british@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ccohen@verizon.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +louise@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +atmarks@optonline.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +iamcal@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +snunez@msn.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mrobshaw@optonline.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +denton@yahoo.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +konst@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +louise@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wetter@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kohlis@att.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +monkeydo@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +melnik@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +munge@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +stefano@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +giafly@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gbacon@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dgriffith@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dkrishna@icloud.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +nichoj@comcast.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +aibrahim@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +inico@aol.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ribet@sbcglobal.net;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ajlitt@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +errxn@me.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +lstein@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mgemmons@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jadavis@hotmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +zilla@hotmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bogjobber@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +shazow@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rgarton@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +meder@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hedwig@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dhwon@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mstrout@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +manuals@me.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +andrewik@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hahsler@icloud.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +miami@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +facet@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +zeitlin@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +lamprecht@aol.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +johnh@mac.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mrsam@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lipeng@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dsowsy@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +philen@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kjohnson@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +nelson@hotmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +syncnine@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +pgottsch@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jfmulder@yahoo.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jacks@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mrdvt@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +cfhsoft@outlook.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kodeman@yahoo.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mbrown@comcast.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jaxweb@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +symbolic@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +denism@att.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hager@mac.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +zavadsky@yahoo.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mugwump@hotmail.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +geekgrl@comcast.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dprice@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +petersko@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +netsfr@aol.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +tbmaddux@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +meder@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +benits@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +timlinux@gmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +heroine@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hachi@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dkrishna@icloud.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sthomas@gmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +thaljef@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ganter@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +drjlaw@live.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +timtroyr@gmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +smcnabb@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fwiles@live.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +delpino@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +whimsy@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lbecchi@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jbearp@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tamas@live.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +panolex@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lridener@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +wayward@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@me.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +garland@yahoo.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +rfisher@live.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +stern@verizon.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +mavilar@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rfisher@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +tarreau@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +koudas@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bwcarty@mac.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jeteve@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +pmint@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +barlow@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +punkis@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jfinke@optonline.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +unreal@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dwendlan@sbcglobal.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dbrobins@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rasca@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jfriedl@att.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +clkao@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noahb@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ducasse@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jrkorson@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +corrada@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +tmaek@aol.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +richard@mac.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pkplex@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kwilliams@icloud.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mcrawfor@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +webteam@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +leakin@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ebassi@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +njpayne@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +konst@live.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +godeke@me.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +godeke@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +glenz@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +fallorn@comcast.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +nacho@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dkeeler@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +adhere@live.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gfody@gmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +codex@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +erynf@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +monkeydo@verizon.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lauronen@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dinther@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +miami@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kewley@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dkeeler@outlook.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +galbra@gmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mastinfo@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kempsonc@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +andale@mac.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +airship@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +xtang@live.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jhardin@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +frederic@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +matsn@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +pereinar@optonline.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +salesgeek@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tezbo@aol.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +keijser@icloud.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +chaki@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wetter@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +delpino@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +thassine@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +hoangle@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +bester@gmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jdhedden@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +killmenow@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +retoh@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +goresky@yahoo.ca;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +microfab@att.net;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pfitza@aol.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +onestab@hotmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +aracne@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +sherzodr@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +feamster@verizon.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +hyper@yahoo.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jmgomez@me.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +fwitness@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +storerm@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +improv@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +arnold@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +blixem@live.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rohitm@outlook.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rfisher@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +alastair@gmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +multiplx@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +caidaperl@icloud.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +nacho@yahoo.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +keutzer@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lbaxter@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hachi@live.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mfburgo@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gfody@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +jaxweb@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wojciech@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +doche@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +josephw@hotmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hakim@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lstein@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +conteb@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +wildixon@att.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +oechslin@hotmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +metzzo@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kosact@live.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kodeman@optonline.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ebassi@hotmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +pgolle@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jdhildeb@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +garyjb@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +gslondon@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +maratb@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marnanel@optonline.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rgiersig@live.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gozer@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +valdez@hotmail.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +mnemonic@yahoo.ca;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +paina@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +syncnine@aol.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +melnik@gmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jaesenj@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sekiya@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tbusch@aol.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +whimsy@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +firstpr@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +bartlett@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +bester@att.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +gordonjcp@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +bcevc@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sethbrown@me.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mcmillan@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +raines@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +psharpe@comcast.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bachmann@gmail.com;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +leslie@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hager@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ismail@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +nacho@aol.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kohlis@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lahvak@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +gozer@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +willg@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +zavadsky@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +steve@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ccohen@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +msusa@mac.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jsmith@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jshearer@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +pgottsch@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +majordick@gmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sjava@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +rupak@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +empathy@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +intlprog@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +matthijs@gmail.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +portscan@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +morain@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gozer@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +akoblin@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mhassel@comcast.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +spadkins@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rohitm@yahoo.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mwandel@yahoo.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +warrior@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jipsen@aol.com;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bancboy@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +corrada@yahoo.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +wojciech@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marcs@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +atmarks@me.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +quinn@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dkeeler@aol.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pizza@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +empathy@mac.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dmouse@aol.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +dinther@comcast.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pappp@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +dougj@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +cfhsoft@msn.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +maratb@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +stewwy@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +sravani@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +tmaek@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +juliano@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mcsporran@optonline.net;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mgemmons@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +seasweb@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lushe@yahoo.ca;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +schumer@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gfody@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mlewan@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +eegsa@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rhavyn@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +cremonini@me.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +boftx@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +smartfart@outlook.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +uncled@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +quantaman@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +heidrich@live.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +moinefou@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ilial@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fraser@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +csilvers@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +csilvers@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kalpol@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +punkis@yahoo.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +nacho@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mcsporran@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jaarnial@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gboss@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +henkp@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +philb@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hllam@yahoo.com;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +roamer@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +geekgrl@comcast.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +cantu@outlook.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@outlook.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +hmbrand@aol.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +arandal@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jaarnial@live.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +hoyer@me.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mmccool@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +smcnabb@att.net;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +pakaste@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +panolex@mac.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hikoza@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +larry@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +arandal@outlook.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ducasse@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +policies@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sblack@yahoo.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hstiles@comcast.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +lushe@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +devphil@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dowdy@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +arachne@verizon.net;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +donev@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bowmanbs@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +roesch@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +lridener@aol.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hmbrand@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +sopwith@hotmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +vsprintf@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dwsauder@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +symbolic@aol.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +gbacon@live.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hillct@verizon.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +earmstro@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +studyabr@outlook.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +shawnce@yahoo.ca;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +boser@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gknauss@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marcs@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bruck@icloud.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +comdig@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +floxy@yahoo.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tmccarth@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +darin@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mcraigw@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fhirsch@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +unreal@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +crypt@comcast.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pakaste@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +denism@att.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +staffelb@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jonas@outlook.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +staikos@live.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mfburgo@me.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +psichel@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +brainless@live.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jmgomez@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wsnyder@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +carcus@yahoo.ca;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dmouse@outlook.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +graham@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +murdocj@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +reziac@att.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +caronni@sbcglobal.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hoyer@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +amcuri@verizon.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mstrout@live.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +osrin@verizon.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +geeber@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +konit@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mxiao@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ryanshaw@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bowmanbs@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +yamla@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ardagna@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +darin@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jmorris@me.com;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +valdez@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +haddawy@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +biglou@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pplinux@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +afeldspar@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +campbell@optonline.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +akoblin@outlook.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +nwiger@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +stinson@sbcglobal.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +daveed@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +arachne@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +augusto@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +xtang@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +itstatus@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ebassi@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kspiteri@yahoo.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kewley@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +yamla@me.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +oevans@me.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +ebassi@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +scitext@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sisyphus@verizon.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jandrese@live.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jamuir@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +dobey@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rande@live.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dkasak@yahoo.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +greear@msn.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +thaljef@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +sjmuir@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +joehall@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +kronvold@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jmorris@outlook.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ajohnson@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +russotto@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pgolle@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +mrdvt@aol.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +starstuff@icloud.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jesse@live.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +luebke@outlook.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +emmanuel@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +imightb@msn.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +wbarker@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +luvirini@hotmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Falcon;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +ylchang@yahoo.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +elflord@icloud.com;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +scottzed@yahoo.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mcraigw@yahoo.ca;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nacho@icloud.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +rwelty@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +subir@aol.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tbusch@yahoo.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +rupak@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +giafly@aol.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +british@outlook.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hllam@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +fatelk@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +parsimony@verizon.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tbeck@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +citizenl@optonline.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jimxugle@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +starstuff@sbcglobal.net;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bader@icloud.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +starstuff@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +satishr@yahoo.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ilikered@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +bader@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +yruan@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +skoch@outlook.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bader@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +smallpaul@sbcglobal.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +stern@verizon.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +feamster@outlook.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +mcnihil@sbcglobal.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@msn.com;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +bmorrow@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +laird@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +ingolfke@msn.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +irving@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +monopole@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +keiji@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wortmanj@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +keijser@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +aschmitz@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +tangsh@mac.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jdray@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kewley@yahoo.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +policies@verizon.net;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wayward@outlook.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +errxn@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +fglock@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kmself@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +amichalo@gmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mwandel@me.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +thowell@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +pedwards@yahoo.ca;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dmiller@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +choset@live.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dbrobins@aol.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +pizza@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noahb@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jespley@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jfriedl@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +arebenti@sbcglobal.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +eidac@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jipsen@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +malin@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jramio@optonline.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jsnover@outlook.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +martyloo@gmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +danny@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bruck@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jfmulder@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +wsnyder@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +leslie@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +noticias@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +cgcra@yahoo.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +louise@me.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rasca@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +cvrcek@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +chaffar@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +webdragon@att.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +keutzer@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +knorr@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +kawasaki@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ducasse@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +satishr@icloud.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +drewf@comcast.net;##null##;##null##;##null##;True;False;True;0;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +martyloo@yahoo.ca;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +lstein@live.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +nighthawk@me.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +debest@sbcglobal.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +cyrus@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dogdude@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +yruan@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bmidd@live.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +policies@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +treit@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +animats@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kawasaki@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jramio@yahoo.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +josephw@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +rgarcia@me.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Horse;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +ryanvm@gmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rnewman@me.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +yangyan@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +tubesteak@optonline.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +munjal@sbcglobal.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pgolle@live.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +milton@icloud.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +harryh@live.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +howler@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +drewf@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +cantu@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +leslie@optonline.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mfleming@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nelson@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +valdez@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jsmith@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +djpig@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bader@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +galbra@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dawnsong@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mcrawfor@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pthomsen@icloud.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +raides@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ahuillet@icloud.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +kostas@aol.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +lridener@att.net;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +maneesh@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sartak@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +rohitm@comcast.net;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +heidrich@mac.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +koudas@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +okroeger@me.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +cgcra@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +janusfury@yahoo.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +seurat@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dhrakar@mac.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +delpino@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bebing@msn.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +keiji@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +okroeger@hotmail.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gward@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +jusdisgi@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +sakusha@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +rande@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mwitte@hotmail.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +alhajj@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +marcs@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +juerd@mac.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +sethbrown@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kdawson@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mfburgo@aol.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +crandall@hotmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +schwaang@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mrsam@icloud.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +szymansk@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +epeeist@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +miyop@sbcglobal.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +wainwrig@me.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pereinar@icloud.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +killmenow@mac.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +dsowsy@mac.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +forsberg@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +amaranth@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +mkearl@hotmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jandrese@live.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +openldap@msn.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;3;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +world@hotmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +adamk@att.net;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +pdbaby@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hellfire@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +firstpr@optonline.net;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kenja@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +leslie@gmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bogjobber@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +hauma@verizon.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +hoangle@mac.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nimaclea@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +fraterk@icloud.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +ninenine@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dogdude@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +campware@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +amimojo@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +karasik@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +yenya@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +stevelim@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +dvdotnet@att.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +bonmots@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +schumer@icloud.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +andrei@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +alfred@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +multiplx@optonline.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tjensen@optonline.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +dmath@yahoo.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +kostas@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +carmena@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +terjesa@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +tjensen@sbcglobal.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +schwaang@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +nimaclea@gmail.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jaesenj@live.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jimxugle@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +mobileip@optonline.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +nullchar@aol.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +crowemojo@me.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +hermanab@msn.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +esbeck@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +naoya@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +lpalmer@att.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +dgatwood@aol.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +jtorkbob@att.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +rfoley@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Dog;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +andale@comcast.net;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +mlewan@yahoo.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +ianbuck@yahoo.ca;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Horse;Cat;Cat;Cat;Cat;Cat;Cat +syrinx@live.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +imightb@live.com;##null##;##null##;##null##;True;False;True;3.1415;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +gozer@icloud.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +gozer@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +shawnce@gmail.com;##null##;##null##;##null##;True;False;True;0;3.1415;4;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +lauronen@att.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +raines@gmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Falcon;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jfriedl@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +hstiles@comcast.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +smpeters@icloud.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +thurston@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +flaviog@aol.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mnemonic@me.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +privcan@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +mobileip@verizon.net;##null##;##null##;##null##;True;False;True;0;3.1415;3;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +gbacon@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +caronni@optonline.net;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +tbeck@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +keijser@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +scotfl@verizon.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +ryanshaw@sbcglobal.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +eimear@att.net;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noticias@comcast.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +leocharre@yahoo.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Horse;Dog;Cat;Cat;Cat;Cat;Cat;Cat +killmenow@yahoo.ca;##null##;##null##;##null##;True;False;True;3.1415;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +petersen@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +bdthomas@yahoo.ca;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +mavilar@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +isaacson@msn.com;##null##;##null##;##null##;False;False;True;3.1415;3.1415;3;1;Horse;Horse;Cat;Cat;Cat;Cat;Cat;Cat +miyop@msn.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +bwcarty@hotmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +warrior@mac.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;1;1;Dog;Dog;Cat;Cat;Cat;Cat;Cat;Cat +magusnet@hotmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;3;1;Cat;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +crowemojo@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +crypt@optonline.net;##null##;##null##;##null##;True;False;True;1.61803;3.1415;1;1;Cat;Dog;Falcon;Cat;Cat;Cat;Cat;Cat +kempsonc@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Falcon;Cat;Falcon;Cat;Cat;Cat;Cat;Cat +kayvonf@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +noahb@yahoo.ca;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +symbolic@mac.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +wsnyder@yahoo.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +pdbaby@yahoo.ca;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +jfriedl@yahoo.com;##null##;##null##;##null##;False;False;True;0;3.1415;4;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +openldap@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jwarren@optonline.net;##null##;##null##;##null##;True;False;True;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +dsugal@verizon.net;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +kayvonf@aol.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Cat;Horse;Cat;Cat;Cat;Cat;Cat;Cat +nasarius@mac.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Dog;Cat;Cat;Cat;Cat;Cat;Cat;Cat +bolow@mac.com;##null##;##null##;##null##;True;False;True;1.61803;3.1415;2;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +tbmaddux@hotmail.com;##null##;##null##;##null##;True;False;True;2.7182;3.1415;2;1;Horse;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +maradine@aol.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +breegster@gmail.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Cat;Cat;Cat;Cat;Cat;Cat;Cat;Cat +breegster@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;4;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +openldap@gmail.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;4;1;Falcon;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +jshirley@gmail.com;##null##;##null##;##null##;False;False;True;0;3.1415;2;1;Cat;Dog;Cat;Cat;Cat;Cat;Cat;Cat +tfinniga@msn.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;4;1;Dog;Horse;Cat;Cat;Cat;Cat;Cat;Cat +delpino@mac.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;3;1;Falcon;Cat;Cat;Cat;Cat;Cat;Cat;Cat +stecoop@live.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;2;1;Falcon;Dog;Cat;Cat;Cat;Cat;Cat;Cat +jnolan@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;3;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +jhardin@yahoo.com;##null##;##null##;##null##;True;False;True;0;3.1415;1;1;Dog;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +teverett@sbcglobal.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;2;1;Horse;Horse;Falcon;Cat;Cat;Cat;Cat;Cat +wsnyder@comcast.net;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +treeves@msn.com;##null##;##null##;##null##;False;False;True;1.61803;3.1415;2;1;Cat;Falcon;Cat;Cat;Cat;Cat;Cat;Cat +garland@outlook.com;##null##;##null##;##null##;False;False;True;0;3.1415;1;1;Horse;Cat;Cat;Cat;Cat;Cat;Cat;Cat +ullman@comcast.net;##null##;##null##;##null##;False;False;True;3.1415;3.1415;1;1;Horse;Falcon;Falcon;Cat;Cat;Cat;Cat;Cat +sumdumass@outlook.com;##null##;##null##;##null##;False;False;True;2.7182;3.1415;1;1;Dog;Horse;Falcon;Cat;Cat;Cat;Cat;Cat diff --git a/test/mock.h b/test/mock.h index abcebc9..9ef3763 100644 --- a/test/mock.h +++ b/test/mock.h @@ -130,36 +130,89 @@ class MockHttpSessionAdapter : public configcat::HttpSessionAdapter { }; static constexpr char kTestJsonString[] = R"({ - "p": { - "u": "https://cdn-global.configcat.com", - "r": 0 + "p": { + "u": "https://cdn-global.configcat.com", + "r": 0 + }, + "f": { + "key1": { + "t": 0, + "v": { + "b": true + }, + "i": "fakeId1" }, - "f": { - "testBoolKey": { - "v": true, "t": 0, "p": [], "r": [] - }, - "testStringKey": { - "v": "testValue", "i": "id", "t": 1, "p": [], - "r": [ - { - "i": "id1", "v": "fake1", "a": "Identifier", "t": 2, "c": "@test1.com" - }, - { - "i": "id2", "v": "fake2", "a": "Identifier", "t": 2, "c": "@test2.com" - } - ] - }, - "testIntKey": { - "v": 1, "t": 2, "p": [], "r": [] - }, - "testDoubleKey": { - "v": 1.1, "t": 3, "p": [], "r": [] - }, - "key1": { - "v": true, "i": "fakeId1", "p": [], "r": [] + "key2": { + "t": 0, + "v": { + "b": false + }, + "i": "fakeId2" + }, + "testBoolKey": { + "t": 0, + "v": { + "b": true + } + }, + "testDoubleKey": { + "t": 3, + "v": { + "d": 1.1 + } + }, + "testIntKey": { + "t": 2, + "v": { + "i": 1 + } + }, + "testStringKey": { + "t": 1, + "r": [ + { + "c": [ + { + "u": { + "a": "Identifier", + "c": 2, + "l": [ + "@test1.com" + ] + } + } + ], + "s": { + "v": { + "s": "fake1" + }, + "i": "id1" + } }, - "key2": { - "v": false, "i": "fakeId2", "p": [], "r": [] + { + "c": [ + { + "u": { + "a": "Identifier", + "c": 2, + "l": [ + "@test2.com" + ] + } + } + ], + "s": { + "v": { + "s": "fake2" + }, + "i": "id2" + } } + ], + "v": { + "s": "testValue" + }, + "i": "id" } + } })"; diff --git a/test/test-autopolling.cpp b/test/test-autopolling.cpp index e70ead6..afb5dd3 100644 --- a/test/test-autopolling.cpp +++ b/test/test-autopolling.cpp @@ -16,16 +16,16 @@ using namespace std::this_thread; class AutoPollingTest : public ::testing::Test { public: static constexpr char kTestSdkKey[] = "TestSdkKey"; - static constexpr char kTestJsonFormat[] = R"({ "f": { "fakeKey": { "v": %s, "p": [], "r": [] } } })"; + static constexpr char kTestJsonFormat[] = R"({"f":{"fakeKey":{"t":%d,"v":%s}}})"; shared_ptr mockHttpSessionAdapter = make_shared(); shared_ptr logger = make_shared(make_shared(), make_shared()); }; TEST_F(AutoPollingTest, Get) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -43,9 +43,9 @@ TEST_F(AutoPollingTest, Get) { } TEST_F(AutoPollingTest, GetFailedRequest) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {500, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {500, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -63,9 +63,9 @@ TEST_F(AutoPollingTest, GetFailedRequest) { } TEST_F(AutoPollingTest, OnConfigChanged) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); bool called = false; @@ -87,7 +87,7 @@ TEST_F(AutoPollingTest, OnConfigChanged) { } TEST_F(AutoPollingTest, RequestTimeout) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; constexpr int responseDelay = 3; mockHttpSessionAdapter->enqueueResponse(response, responseDelay); @@ -108,7 +108,7 @@ TEST_F(AutoPollingTest, RequestTimeout) { } TEST_F(AutoPollingTest, InitWaitTimeout) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; constexpr int responseDelay = 5; mockHttpSessionAdapter->enqueueResponse(response, responseDelay); @@ -129,7 +129,7 @@ TEST_F(AutoPollingTest, InitWaitTimeout) { } TEST_F(AutoPollingTest, CancelRequest) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; constexpr int responseDelay = 60; mockHttpSessionAdapter->enqueueResponse(response, responseDelay); @@ -148,9 +148,9 @@ TEST_F(AutoPollingTest, CancelRequest) { TEST_F(AutoPollingTest, Cache) { auto mockCache = make_shared(); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -162,7 +162,7 @@ TEST_F(AutoPollingTest, Cache) { EXPECT_EQ("test", std::get(settings["fakeKey"].value)); EXPECT_EQ(1, mockCache->store.size()); - EXPECT_TRUE(contains(mockCache->store.begin()->second, R"("test")")); + EXPECT_TRUE(contains(mockCache->store.begin()->second, R"({"s":"test"})")); sleep_for(seconds(3)); @@ -170,11 +170,11 @@ TEST_F(AutoPollingTest, Cache) { EXPECT_EQ("test2", std::get(settings["fakeKey"].value)); EXPECT_EQ(1, mockCache->store.size()); - EXPECT_TRUE(contains(mockCache->store.begin()->second, R"("test2")")); + EXPECT_TRUE(contains(mockCache->store.begin()->second, R"({"s":"test2"})")); } TEST_F(AutoPollingTest, ReturnCachedConfigWhenCacheIsNotExpired) { - auto jsonString = string_format(kTestJsonFormat, R"("test")"); + auto jsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})"); auto mockCache = make_shared(ConfigEntry( Config::fromJson(jsonString), "test-etag", @@ -182,7 +182,7 @@ TEST_F(AutoPollingTest, ReturnCachedConfigWhenCacheIsNotExpired) { getUtcNowSecondsSinceEpoch()).serialize() ); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); auto pollIntervalSeconds = 2; @@ -216,7 +216,7 @@ TEST_F(AutoPollingTest, ReturnCachedConfigWhenCacheIsNotExpired) { TEST_F(AutoPollingTest, FetchConfigWhenCacheIsExpired) { auto pollIntervalSeconds = 2; auto maxInitWaitTimeSeconds = 1; - auto jsonString = string_format(kTestJsonFormat, R"("test")"); + auto jsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})"); auto mockCache = make_shared(ConfigEntry( Config::fromJson(jsonString), "test-etag", @@ -224,7 +224,7 @@ TEST_F(AutoPollingTest, FetchConfigWhenCacheIsExpired) { getUtcNowSecondsSinceEpoch() - pollIntervalSeconds).serialize() ); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); ConfigCatOptions options; @@ -240,7 +240,7 @@ TEST_F(AutoPollingTest, FetchConfigWhenCacheIsExpired) { TEST_F(AutoPollingTest, initWaitTimeReturnCached) { auto pollIntervalSeconds = 60; auto maxInitWaitTimeSeconds = 1; - auto jsonString = string_format(kTestJsonFormat, R"("test")"); + auto jsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})"); auto mockCache = make_shared(ConfigEntry( Config::fromJson(jsonString), "test-etag", @@ -248,7 +248,7 @@ TEST_F(AutoPollingTest, initWaitTimeReturnCached) { getUtcNowSecondsSinceEpoch() - 2 * pollIntervalSeconds).serialize() ); - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; constexpr int responseDelay = 5; mockHttpSessionAdapter->enqueueResponse(response, responseDelay); @@ -271,7 +271,7 @@ TEST_F(AutoPollingTest, initWaitTimeReturnCached) { } TEST_F(AutoPollingTest, OnlineOffline) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; @@ -301,7 +301,7 @@ TEST_F(AutoPollingTest, OnlineOffline) { } TEST_F(AutoPollingTest, InitOffline) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; diff --git a/test/test-configcache.cpp b/test/test-configcache.cpp index 84bbcc6..ee90cba 100644 --- a/test/test-configcache.cpp +++ b/test/test-configcache.cpp @@ -10,8 +10,8 @@ using namespace configcat; using namespace std; TEST(ConfigCacheTest, CacheKey) { - EXPECT_EQ("147c5b4c2b2d7c77e1605b1a4309f0ea6684a0c6", ConfigService::generateCacheKey("test1")); - EXPECT_EQ("c09513b1756de9e4bc48815ec7a142b2441ed4d5", ConfigService::generateCacheKey("test2")); + EXPECT_EQ("f83ba5d45bceb4bb704410f51b704fb6dfa19942", ConfigService::generateCacheKey("configcat-sdk-1/TEST_KEY-0123456789012/1234567890123456789012")); + EXPECT_EQ("da7bfd8662209c8ed3f9db96daed4f8d91ba5876", ConfigService::generateCacheKey("configcat-sdk-1/TEST_KEY2-123456789012/1234567890123456789012")); } TEST(ConfigCacheTest, CachePayload) { @@ -22,11 +22,11 @@ TEST(ConfigCacheTest, CachePayload) { } TEST(ConfigCatTest, InvalidCacheContent) { - static constexpr char kTestJsonFormat[] = R"({ "f": { "testKey": { "v": %s, "p": [], "r": [] } } })"; + static constexpr char kTestJsonFormat[] = R"({"f":{"testKey":{"t":%d,"v":%s}}})"; HookCallbacks hookCallbacks; auto hooks = make_shared(); hooks->addOnError([&](const string& error) { hookCallbacks.onError(error); }); - auto configJsonString = string_format(kTestJsonFormat, R"("test")"); + auto configJsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})"); auto configCache = make_shared(ConfigEntry( Config::fromJson(configJsonString), "test-etag", @@ -44,12 +44,12 @@ TEST(ConfigCatTest, InvalidCacheContent) { EXPECT_EQ(0, hookCallbacks.errorCallCount); // Invalid fetch time in cache - configCache->value = "text\n"s + "test-etag\n" + string_format(kTestJsonFormat, R"("test2")"); + configCache->value = "text\n"s + "test-etag\n" + string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})"); EXPECT_EQ("test", client->getValue("testKey", "default")); EXPECT_TRUE(hookCallbacks.error.find("Error occurred while reading the cache. Invalid fetch time: text") != std::string::npos); // Number of values is fewer than expected - configCache->value = std::to_string(getUtcNowSecondsSinceEpoch()) + "\n" + string_format(kTestJsonFormat, R"("test2")"); + configCache->value = std::to_string(getUtcNowSecondsSinceEpoch()) + "\n" + string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})"); EXPECT_EQ("test", client->getValue("testKey", "default")); EXPECT_TRUE(hookCallbacks.error.find("Error occurred while reading the cache. Number of values is fewer than expected.") != std::string::npos); diff --git a/test/test-configcatclient.cpp b/test/test-configcatclient.cpp index 9b6e7c3..5ce58ba 100644 --- a/test/test-configcatclient.cpp +++ b/test/test-configcatclient.cpp @@ -12,8 +12,8 @@ using namespace std::this_thread; class ConfigCatClientTest : public ::testing::Test { public: static constexpr char kTestSdkKey[] = "TestSdkKey"; - static constexpr char kTestJsonFormat[] = R"({ "f": { "fakeKey": { "v": %s, "p": [], "r": [] } } })"; - static constexpr char kTestJsonMultiple[] = R"({ "f": { "key1": { "v": true, "i": "fakeId1", "p": [], "r": [] }, "key2": { "v": false, "i": "fakeId2", "p": [], "r": [] } } })"; + static constexpr char kTestJsonFormat[] = R"({"f":{"fakeKey":{"t":%d,"v":%s}}})"; + static constexpr char kTestJsonMultiple[] = R"({"f":{"key1":{"t":0,"v":{"b":true},"i":"fakeId1"},"key2":{"t":0,"v":{"b":false},"i":"fakeId2"}}})"; ConfigCatClient* client = nullptr; shared_ptr mockHttpSessionAdapter = make_shared(); @@ -60,7 +60,7 @@ TEST_F(ConfigCatClientTest, EnsureCloseWorks) { TEST_F(ConfigCatClientTest, GetIntValue) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, "43")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::Int, R"({"i":43})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", 10); @@ -71,7 +71,7 @@ TEST_F(ConfigCatClientTest, GetIntValue) { TEST_F(ConfigCatClientTest, GetIntValueFailed) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", 10); @@ -93,7 +93,7 @@ TEST_F(ConfigCatClientTest, GetIntValueFailedInvalidJson) { TEST_F(ConfigCatClientTest, GetIntValueFailedPartialJson) { SetUp(); - configcat::Response responseWithoutValue = {200, R"({ "f": { "fakeKey": { "p": [], "r": [] } } })"}; + configcat::Response responseWithoutValue = {200, R"({"f":{"fakeKey":{"p":[],"r":[]}}}})"}; mockHttpSessionAdapter->enqueueResponse(responseWithoutValue); client->forceRefresh(); auto value = client->getValue("fakeKey", 10); @@ -104,7 +104,7 @@ TEST_F(ConfigCatClientTest, GetIntValueFailedPartialJson) { TEST_F(ConfigCatClientTest, GetIntValueFailedNullValueJson) { SetUp(); - configcat::Response responseWithoutValue = {200, R"({ "f": { "fakeKey": { "v": null, "p": [], "r": [] } } })"}; + configcat::Response responseWithoutValue = {200, R"({"f":{"fakeKey":{"p":[],"r":[],"v":null}}}})"}; mockHttpSessionAdapter->enqueueResponse(responseWithoutValue); client->forceRefresh(); auto value = client->getValue("fakeKey", 10); @@ -115,7 +115,7 @@ TEST_F(ConfigCatClientTest, GetIntValueFailedNullValueJson) { TEST_F(ConfigCatClientTest, GetStringValue) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", "default"); @@ -126,7 +126,7 @@ TEST_F(ConfigCatClientTest, GetStringValue) { TEST_F(ConfigCatClientTest, GetStringValueFailed) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, "33")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::Int, R"({"i":33})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", "default"); @@ -137,7 +137,7 @@ TEST_F(ConfigCatClientTest, GetStringValueFailed) { TEST_F(ConfigCatClientTest, GetDoubleValue) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, "43.56")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::Double, R"({"d":43.56})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", 3.14); @@ -148,7 +148,7 @@ TEST_F(ConfigCatClientTest, GetDoubleValue) { TEST_F(ConfigCatClientTest, GetDoubleValueFailed) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", 3.14); @@ -159,7 +159,7 @@ TEST_F(ConfigCatClientTest, GetDoubleValueFailed) { TEST_F(ConfigCatClientTest, GetBoolValue) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, "true")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::Boolean, R"({"b":true})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", false); @@ -170,7 +170,7 @@ TEST_F(ConfigCatClientTest, GetBoolValue) { TEST_F(ConfigCatClientTest, GetBoolValueFailed) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); auto value = client->getValue("fakeKey", false); @@ -181,7 +181,7 @@ TEST_F(ConfigCatClientTest, GetBoolValueFailed) { TEST_F(ConfigCatClientTest, GetLatestOnFail) { SetUp(); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"(55)")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::Int, R"({"i":55})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); configcat::Response secondResponse = {500, ""}; mockHttpSessionAdapter->enqueueResponse(secondResponse); @@ -197,9 +197,9 @@ TEST_F(ConfigCatClientTest, GetLatestOnFail) { } TEST_F(ConfigCatClientTest, ForceRefreshLazy) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -217,9 +217,9 @@ TEST_F(ConfigCatClientTest, ForceRefreshLazy) { } TEST_F(ConfigCatClientTest, ForceRefreshAuto) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -251,7 +251,7 @@ TEST_F(ConfigCatClientTest, FailingAutoPoll) { TEST_F(ConfigCatClientTest, FromCacheOnly) { auto mockCache = make_shared(); auto cacheKey = SHA1()(""s + kTestSdkKey + "_" + ConfigFetcher::kConfigJsonName + "_" + ConfigEntry::kSerializationFormatVersion); - auto jsonString = string_format(kTestJsonFormat, R"("fake")"); + auto jsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})"); auto config = Config::fromJson(jsonString); auto configEntry = ConfigEntry(config, "test-etag", jsonString, getUtcNowSecondsSinceEpoch()); mockCache->write(cacheKey, configEntry.serialize()); @@ -270,7 +270,7 @@ TEST_F(ConfigCatClientTest, FromCacheOnly) { TEST_F(ConfigCatClientTest, FromCacheOnlyRefresh) { auto mockCache = make_shared(); auto cacheKey = SHA1()(""s + kTestSdkKey + "_" + ConfigFetcher::kConfigJsonName + "_" + ConfigEntry::kSerializationFormatVersion); - auto jsonString = string_format(kTestJsonFormat, R"("fake")"); + auto jsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})"); auto config = Config::fromJson(jsonString); auto configEntry = ConfigEntry(config, "test-etag", jsonString, getUtcNowSecondsSinceEpoch()); mockCache->write(cacheKey, configEntry.serialize()); @@ -406,11 +406,14 @@ TEST_F(ConfigCatClientTest, GetValueDetails) { EXPECT_EQ("id1", details.variationId); EXPECT_FALSE(details.isDefaultValue); EXPECT_TRUE(details.error.empty()); - EXPECT_TRUE(details.matchedEvaluationPercentageRule == std::nullopt); - EXPECT_EQ("fake1", get(details.matchedEvaluationRule->value)); - EXPECT_EQ(CONTAINS, details.matchedEvaluationRule->comparator); - EXPECT_EQ("Identifier", details.matchedEvaluationRule->comparisonAttribute); - EXPECT_EQ("@test1.com", details.matchedEvaluationRule->comparisonValue); + EXPECT_TRUE(details.matchedPercentageOption == std::nullopt); + + auto& condition = get(details.matchedTargetingRule->conditions[0].condition); + auto& simpleValue = get(details.matchedTargetingRule->then); + EXPECT_EQ("fake1", get(simpleValue.value)); + EXPECT_EQ(UserComparator::TextContainsAnyOf, condition.comparator); + EXPECT_EQ("Identifier", condition.comparisonAttribute); + EXPECT_EQ("@test1.com", get>(condition.comparisonValue)[0]); EXPECT_EQ(user.toJson(), details.user->toJson()); std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); EXPECT_GE(now, details.fetchTime); @@ -418,7 +421,7 @@ TEST_F(ConfigCatClientTest, GetValueDetails) { } TEST_F(ConfigCatClientTest, AutoPollUserAgentHeader) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; @@ -433,7 +436,7 @@ TEST_F(ConfigCatClientTest, AutoPollUserAgentHeader) { } TEST_F(ConfigCatClientTest, LazyPollUserAgentHeader) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; @@ -448,7 +451,7 @@ TEST_F(ConfigCatClientTest, LazyPollUserAgentHeader) { } TEST_F(ConfigCatClientTest, ManualPollUserAgentHeader) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; @@ -463,7 +466,7 @@ TEST_F(ConfigCatClientTest, ManualPollUserAgentHeader) { } TEST_F(ConfigCatClientTest, Concurrency_DoNotStartNewFetchIfThereIsAnOngoingFetch) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; constexpr int responseDelay = 1; mockHttpSessionAdapter->enqueueResponse(response, responseDelay); @@ -491,9 +494,9 @@ TEST_F(ConfigCatClientTest, Concurrency_DoNotStartNewFetchIfThereIsAnOngoingFetc #ifndef __APPLE__ // TODO: This test is broken on GitHub macos-latest os. TEST_F(ConfigCatClientTest, Concurrency_OngoingFetchDoesNotBlockGetValue) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("fake")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("fake2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"fake2"})")}; constexpr int responseDelay = 3; mockHttpSessionAdapter->enqueueResponse(secondResponse, responseDelay); @@ -557,7 +560,7 @@ TEST_F(ConfigCatClientTest, GetValueTypeTest) { TEST_F(ConfigCatClientTest, GetValueWithKeyNotFound) { SetUp(); - configcat::Response response = {200, string_format(kTestJsonFormat, "43")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::Int, R"({"i":43})")}; mockHttpSessionAdapter->enqueueResponse(response); client->forceRefresh(); @@ -565,8 +568,8 @@ TEST_F(ConfigCatClientTest, GetValueWithKeyNotFound) { EXPECT_EQ(10, value); ConfigCatUser* user = nullptr; - shared_ptr valuePtr = client->getValue("nonexisting", user); - EXPECT_EQ(nullptr, valuePtr); + auto settingValue = client->getValue("nonexisting", user); + EXPECT_FALSE(settingValue.has_value()); } TEST_F(ConfigCatClientTest, DefaultUserGetValue) { diff --git a/test/test-configcatclientintegration.cpp b/test/test-configcatclientintegration.cpp index 14465f5..6249117 100644 --- a/test/test-configcatclientintegration.cpp +++ b/test/test-configcatclientintegration.cpp @@ -29,7 +29,7 @@ TEST(ConfigCatClientIntegrationTest, DISABLED_ProxyTest) { * docker run -d --name squid-container -e TZ=UTC -p 3128:3128 ubuntu/squid:5.2-22.04_beta * * How to test the proxy server: - * curl --proxy localhost:3128 https://cdn-global.configcat.com/configuration-files/PKDVCLf-Hq-h-kCzMp-L7Q/psuH7BGHoUmdONrzzUOY7A/config_v5.json + * curl --proxy localhost:3128 https://cdn-global.configcat.com/configuration-files/PKDVCLf-Hq-h-kCzMp-L7Q/psuH7BGHoUmdONrzzUOY7A/config_v6.json * */ ConfigCatOptions options; diff --git a/test/test-configfetcher.cpp b/test/test-configfetcher.cpp index 839c206..54fb8dc 100644 --- a/test/test-configfetcher.cpp +++ b/test/test-configfetcher.cpp @@ -13,7 +13,7 @@ class ConfigFetcherTest : public ::testing::Test { public: static constexpr char kTestSdkKey[] = "TestSdkKey"; static constexpr char kCustomCdnUrl[] = "https://custom-cdn.configcat.com"; - static constexpr char kTestJson[] = R"({ "f": { "fakeKey": { "v": "fakeValue", "p": [], "r": [] } } })"; + static constexpr char kTestJson[] = R"({"f":{"fakeKey":{"t":1,"v":{"s":"fakeValue"}}}})"; unique_ptr fetcher; shared_ptr mockHttpSessionAdapter = make_shared(); shared_ptr logger = make_shared(make_shared(), make_shared()); @@ -31,22 +31,22 @@ class ConfigFetcherTest : public ::testing::Test { } string createTestJson(const string& url, RedirectMode redirectMode) { - return string_format(R"({ "p": { "u": "%s", "r": %d }, "f": {} })", url.c_str(), redirectMode); + return string_format(R"({"p":{"u":"%s","r":%d}})", url.c_str(), redirectMode); } }; TEST_F(ConfigFetcherTest, DataGovernance_ShouldStayOnGivenUrl) { SetUp(); - configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, NoRedirect)}; + configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::No)}; mockHttpSessionAdapter->enqueueResponse(response); auto fetchResponse = fetcher->fetchConfiguration(); ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kGlobalBaseUrl); - EXPECT_EQ(config->preferences->redirect, NoRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kGlobalBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::No); EXPECT_EQ(1, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, ConfigFetcher::kGlobalBaseUrl)); } @@ -54,15 +54,15 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldStayOnGivenUrl) { TEST_F(ConfigFetcherTest, DataGovernance_ShouldStayOnSameUrl) { SetUp(); - configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, ShouldRedirect)}; + configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::Should)}; mockHttpSessionAdapter->enqueueResponse(response); auto fetchResponse = fetcher->fetchConfiguration(); ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kGlobalBaseUrl); - EXPECT_EQ(config->preferences->redirect, ShouldRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kGlobalBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::Should); EXPECT_EQ(1, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, ConfigFetcher::kGlobalBaseUrl)); } @@ -70,15 +70,15 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldStayOnSameUrl) { TEST_F(ConfigFetcherTest, DataGovernance_ShouldStayOnSameUrlEvenWithForce) { SetUp(); - configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, ForceRedirect)}; + configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::Force)}; mockHttpSessionAdapter->enqueueResponse(response); auto fetchResponse = fetcher->fetchConfiguration(); ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kGlobalBaseUrl); - EXPECT_EQ(config->preferences->redirect, ForceRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kGlobalBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::Force); EXPECT_EQ(1, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, ConfigFetcher::kGlobalBaseUrl)); } @@ -86,17 +86,17 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldStayOnSameUrlEvenWithForce) { TEST_F(ConfigFetcherTest, DataGovernance_ShouldRedirectToAnotherServer) { SetUp(); - configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, ShouldRedirect)}; + configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, RedirectMode::Should)}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, NoRedirect)}; + configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, RedirectMode::No)}; mockHttpSessionAdapter->enqueueResponse(secondResponse); auto fetchResponse = fetcher->fetchConfiguration(); ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kEuOnlyBaseUrl); - EXPECT_EQ(config->preferences->redirect, NoRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kEuOnlyBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::No); EXPECT_EQ(2, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, ConfigFetcher::kGlobalBaseUrl)); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[1].url, ConfigFetcher::kEuOnlyBaseUrl)); @@ -105,17 +105,17 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldRedirectToAnotherServer) { TEST_F(ConfigFetcherTest, DataGovernance_ShouldRedirectToAnotherServerWhenForced) { SetUp(); - configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, ForceRedirect)}; + configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, RedirectMode::Force)}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, NoRedirect)}; + configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, RedirectMode::No)}; mockHttpSessionAdapter->enqueueResponse(secondResponse); auto fetchResponse = fetcher->fetchConfiguration(); ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kEuOnlyBaseUrl); - EXPECT_EQ(config->preferences->redirect, NoRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kEuOnlyBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::No); EXPECT_EQ(2, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, ConfigFetcher::kGlobalBaseUrl)); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[1].url, ConfigFetcher::kEuOnlyBaseUrl)); @@ -124,8 +124,8 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldRedirectToAnotherServerWhenForced TEST_F(ConfigFetcherTest, DataGovernance_ShouldBreakRedirectLoop) { SetUp(); - configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, ShouldRedirect)}; - configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, ShouldRedirect)}; + configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, RedirectMode::Should)}; + configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::Should)}; mockHttpSessionAdapter->enqueueResponse(firstResponse); mockHttpSessionAdapter->enqueueResponse(secondResponse); mockHttpSessionAdapter->enqueueResponse(firstResponse); @@ -134,8 +134,8 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldBreakRedirectLoop) { ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kEuOnlyBaseUrl); - EXPECT_EQ(config->preferences->redirect, ShouldRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kEuOnlyBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::Should); EXPECT_EQ(3, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, ConfigFetcher::kGlobalBaseUrl)); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[1].url, ConfigFetcher::kEuOnlyBaseUrl)); @@ -145,8 +145,8 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldBreakRedirectLoop) { TEST_F(ConfigFetcherTest, DataGovernance_ShouldBreakRedirectLoopWhenForced) { SetUp(); - configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, ForceRedirect)}; - configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, ForceRedirect)}; + configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kEuOnlyBaseUrl, RedirectMode::Force)}; + configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::Force)}; mockHttpSessionAdapter->enqueueResponse(firstResponse); mockHttpSessionAdapter->enqueueResponse(secondResponse); mockHttpSessionAdapter->enqueueResponse(firstResponse); @@ -155,8 +155,8 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldBreakRedirectLoopWhenForced) { ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kEuOnlyBaseUrl); - EXPECT_EQ(config->preferences->redirect, ForceRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kEuOnlyBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::Force); EXPECT_EQ(3, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, ConfigFetcher::kGlobalBaseUrl)); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[1].url, ConfigFetcher::kEuOnlyBaseUrl)); @@ -166,15 +166,15 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldBreakRedirectLoopWhenForced) { TEST_F(ConfigFetcherTest, DataGovernance_ShouldRespectCustomUrl) { SetUp(kCustomCdnUrl); - configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, ShouldRedirect)}; + configcat::Response response = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::Should)}; mockHttpSessionAdapter->enqueueResponse(response); auto fetchResponse = fetcher->fetchConfiguration(); ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kGlobalBaseUrl); - EXPECT_EQ(config->preferences->redirect, ShouldRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kGlobalBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::Should); EXPECT_EQ(1, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, kCustomCdnUrl)); } @@ -182,8 +182,8 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldRespectCustomUrl) { TEST_F(ConfigFetcherTest, DataGovernance_ShouldNotRespectCustomUrlWhenForced) { SetUp(kCustomCdnUrl); - configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, ForceRedirect)}; - configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, NoRedirect)}; + configcat::Response firstResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::Force)}; + configcat::Response secondResponse = {200, createTestJson(ConfigFetcher::kGlobalBaseUrl, RedirectMode::No)}; mockHttpSessionAdapter->enqueueResponse(firstResponse); mockHttpSessionAdapter->enqueueResponse(secondResponse); auto fetchResponse = fetcher->fetchConfiguration(); @@ -191,8 +191,8 @@ TEST_F(ConfigFetcherTest, DataGovernance_ShouldNotRespectCustomUrlWhenForced) { ASSERT_TRUE(fetchResponse.entry != ConfigEntry::empty); ASSERT_TRUE(fetchResponse.entry->config != Config::empty); auto& config = fetchResponse.entry->config; - EXPECT_EQ(config->preferences->url, ConfigFetcher::kGlobalBaseUrl); - EXPECT_EQ(config->preferences->redirect, NoRedirect); + EXPECT_EQ(config->preferences->baseUrl, ConfigFetcher::kGlobalBaseUrl); + EXPECT_EQ(config->preferences->redirectMode, RedirectMode::No); EXPECT_EQ(2, mockHttpSessionAdapter->requests.size()); EXPECT_TRUE(starts_with(mockHttpSessionAdapter->requests[0].url, kCustomCdnUrl)); @@ -210,7 +210,7 @@ TEST_F(ConfigFetcherTest, Fetcher_SimpleFetchSuccess) { EXPECT_TRUE(fetchResponse.isFetched()); EXPECT_TRUE(fetchResponse.entry != nullptr && fetchResponse.entry != ConfigEntry::empty); - auto entries = *fetchResponse.entry->config->entries; + auto entries = *fetchResponse.entry->config->settings; EXPECT_EQ("fakeValue", get(entries["fakeKey"].value)); } @@ -269,7 +269,7 @@ TEST_F(ConfigFetcherTest, Fetcher_FetchNotModifiedEtag) { EXPECT_TRUE(fetchResponse.isFetched()); EXPECT_TRUE(fetchResponse.entry != nullptr && fetchResponse.entry != ConfigEntry::empty); EXPECT_EQ(eTag, fetchResponse.entry->eTag); - auto entries = *fetchResponse.entry->config->entries; + auto entries = *fetchResponse.entry->config->settings; EXPECT_EQ("fakeValue", get(entries["fakeKey"].value)); fetchResponse = fetcher->fetchConfiguration(eTag); diff --git a/test/test-hooks.cpp b/test/test-hooks.cpp index 49e3b7c..0c312a1 100644 --- a/test/test-hooks.cpp +++ b/test/test-hooks.cpp @@ -6,6 +6,7 @@ #include "configcat/configcatoptions.h" #include "configcat/configcatlogger.h" #include +#include using namespace configcat; using namespace std; @@ -26,8 +27,6 @@ TEST_F(HooksTest, Init) { [&](const string& error) { hookCallbacks.onError(error); } ); - auto config = Config::fromJson(kTestJsonString); - ConfigCatOptions options; options.pollingMode = PollingMode::manualPoll(); options.configCache = make_shared(ConfigEntry( @@ -40,10 +39,16 @@ TEST_F(HooksTest, Init) { auto value = client->getValue("testStringKey", ""); + auto expectedConfig = Config::fromJson(kTestJsonString); + expectedConfig->preferences = {}; + expectedConfig->segments = {}; + Config actualConfig; + actualConfig.settings = hookCallbacks.changedConfig; + EXPECT_EQ("testValue", value); EXPECT_TRUE(hookCallbacks.isReady); EXPECT_EQ(1, hookCallbacks.isReadyCallCount); - EXPECT_EQ(*config->entries, *hookCallbacks.changedConfig); + EXPECT_EQ(expectedConfig->toJson(), actualConfig.toJson()); EXPECT_EQ(1, hookCallbacks.changedConfigCallCount); EXPECT_EQ("testStringKey", hookCallbacks.evaluationDetails.key); @@ -68,8 +73,6 @@ TEST_F(HooksTest, Subscribe) { hooks->addOnFlagEvaluated([&](const EvaluationDetails& details) { hookCallbacks.onFlagEvaluated(details); }); hooks->addOnError([&](const string& error) { hookCallbacks.onError(error); }); - auto config = Config::fromJson(kTestJsonString); - ConfigCatOptions options; options.pollingMode = PollingMode::manualPoll(); options.configCache = make_shared(ConfigEntry( @@ -82,10 +85,16 @@ TEST_F(HooksTest, Subscribe) { auto value = client->getValue("testStringKey", ""); + auto expectedConfig = Config::fromJson(kTestJsonString); + expectedConfig->preferences = {}; + expectedConfig->segments = {}; + Config actualConfig; + actualConfig.settings = hookCallbacks.changedConfig; + EXPECT_EQ("testValue", value); EXPECT_TRUE(hookCallbacks.isReady); EXPECT_EQ(1, hookCallbacks.isReadyCallCount); - EXPECT_EQ(*config->entries, *hookCallbacks.changedConfig); + EXPECT_EQ(expectedConfig->toJson(), actualConfig.toJson()); EXPECT_EQ(1, hookCallbacks.changedConfigCallCount); EXPECT_EQ("testStringKey", hookCallbacks.evaluationDetails.key); @@ -126,13 +135,15 @@ TEST_F(HooksTest, Evaluation) { EXPECT_EQ("id1", details.variationId); EXPECT_FALSE(details.isDefaultValue); EXPECT_TRUE(details.error.empty()); - EXPECT_TRUE(details.matchedEvaluationPercentageRule == std::nullopt); - - auto rule = details.matchedEvaluationRule; - EXPECT_EQ("fake1", get(rule->value)); - EXPECT_EQ(Comparator::CONTAINS, rule->comparator); - EXPECT_EQ("Identifier", rule->comparisonAttribute); - EXPECT_EQ("@test1.com", rule->comparisonValue); + EXPECT_TRUE(details.matchedPercentageOption == std::nullopt); + + auto& rule = details.matchedTargetingRule; + auto& condition = get(rule->conditions[0].condition); + auto& simpleValue = get(rule->then); + EXPECT_EQ("fake1", get(simpleValue.value)); + EXPECT_EQ(UserComparator::TextContainsAnyOf, condition.comparator); + EXPECT_EQ("Identifier", condition.comparisonAttribute); + EXPECT_EQ("@test1.com", get>(condition.comparisonValue)[0]); EXPECT_TRUE(details.user == &user); auto now = std::chrono::system_clock::now(); diff --git a/test/test-lazyloading.cpp b/test/test-lazyloading.cpp index 4c66a53..dca1e84 100644 --- a/test/test-lazyloading.cpp +++ b/test/test-lazyloading.cpp @@ -16,16 +16,16 @@ using namespace std::this_thread; class LazyLoadingTest : public ::testing::Test { public: static constexpr char kTestSdkKey[] = "TestSdkKey"; - static constexpr char kTestJsonFormat[] = R"({ "f": { "fakeKey": { "v": %s, "p": [], "r": [] } } })"; + static constexpr char kTestJsonFormat[] = R"({"f":{"fakeKey":{"t":%d,"v":%s}}})"; shared_ptr mockHttpSessionAdapter = make_shared(); shared_ptr logger = make_shared(make_shared(), make_shared()); }; TEST_F(LazyLoadingTest, Get) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; constexpr int secondResponseDelay = 2; mockHttpSessionAdapter->enqueueResponse(secondResponse, secondResponseDelay); @@ -50,9 +50,9 @@ TEST_F(LazyLoadingTest, Get) { } TEST_F(LazyLoadingTest, GetFailedRequest) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {500, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {500, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -78,9 +78,9 @@ TEST_F(LazyLoadingTest, GetFailedRequest) { TEST_F(LazyLoadingTest, Cache) { auto mockCache = make_shared(); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -92,7 +92,7 @@ TEST_F(LazyLoadingTest, Cache) { EXPECT_EQ("test", std::get(settings["fakeKey"].value)); EXPECT_EQ(1, mockCache->store.size()); - EXPECT_TRUE(contains(mockCache->store.begin()->second, R"("test")")); + EXPECT_TRUE(contains(mockCache->store.begin()->second, R"({"s":"test"})")); // Wait for cache invalidation sleep_for(seconds(3)); @@ -101,11 +101,11 @@ TEST_F(LazyLoadingTest, Cache) { EXPECT_EQ("test2", std::get(settings["fakeKey"].value)); EXPECT_EQ(1, mockCache->store.size()); - EXPECT_TRUE(contains(mockCache->store.begin()->second, R"("test2")")); + EXPECT_TRUE(contains(mockCache->store.begin()->second, R"({"s":"test2"})")); } TEST_F(LazyLoadingTest, ReturnCachedConfigWhenCacheIsNotExpired) { - auto jsonString = string_format(kTestJsonFormat, R"("test")"); + auto jsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})"); auto mockCache = make_shared(ConfigEntry( Config::fromJson(jsonString), "test-etag", @@ -113,7 +113,7 @@ TEST_F(LazyLoadingTest, ReturnCachedConfigWhenCacheIsNotExpired) { getUtcNowSecondsSinceEpoch()).serialize() ); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); ConfigCatOptions options; @@ -136,7 +136,7 @@ TEST_F(LazyLoadingTest, ReturnCachedConfigWhenCacheIsNotExpired) { TEST_F(LazyLoadingTest, FetchConfigWhenCacheIsExpired) { auto cacheTimeToLiveSeconds = 1; - auto jsonString = string_format(kTestJsonFormat, R"("test")"); + auto jsonString = string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})"); auto mockCache = make_shared(ConfigEntry( Config::fromJson(jsonString), "test-etag", @@ -144,7 +144,7 @@ TEST_F(LazyLoadingTest, FetchConfigWhenCacheIsExpired) { getUtcNowSecondsSinceEpoch() - cacheTimeToLiveSeconds).serialize() ); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); ConfigCatOptions options; @@ -158,7 +158,7 @@ TEST_F(LazyLoadingTest, FetchConfigWhenCacheIsExpired) { } TEST_F(LazyLoadingTest, OnlineOffline) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; @@ -189,7 +189,7 @@ TEST_F(LazyLoadingTest, OnlineOffline) { } TEST_F(LazyLoadingTest, InitOffline) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; diff --git a/test/test-manualpolling.cpp b/test/test-manualpolling.cpp index 148f860..624e8b1 100644 --- a/test/test-manualpolling.cpp +++ b/test/test-manualpolling.cpp @@ -15,16 +15,16 @@ using namespace std::this_thread; class ManualPollingTest : public ::testing::Test { public: static constexpr char kTestSdkKey[] = "TestSdkKey"; - static constexpr char kTestJsonFormat[] = R"({ "f": { "fakeKey": { "v": %s, "p": [], "r": [] } } })"; + static constexpr char kTestJsonFormat[] = R"({"f":{"fakeKey":{"t":%d,"v":%s}}})"; shared_ptr mockHttpSessionAdapter = make_shared(); shared_ptr logger = make_shared(make_shared(), make_shared()); }; TEST_F(ManualPollingTest, Get) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; constexpr int secondResponseDelay = 2; mockHttpSessionAdapter->enqueueResponse(secondResponse, secondResponseDelay); @@ -48,9 +48,9 @@ TEST_F(ManualPollingTest, Get) { } TEST_F(ManualPollingTest, GetFailedRefresh) { - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {500, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {500, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -72,9 +72,9 @@ TEST_F(ManualPollingTest, GetFailedRefresh) { TEST_F(ManualPollingTest, Cache) { auto mockCache = make_shared(); - configcat::Response firstResponse = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response firstResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(firstResponse); - configcat::Response secondResponse = {200, string_format(kTestJsonFormat, R"("test2")")}; + configcat::Response secondResponse = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test2"})")}; mockHttpSessionAdapter->enqueueResponse(secondResponse); ConfigCatOptions options; @@ -88,7 +88,7 @@ TEST_F(ManualPollingTest, Cache) { EXPECT_EQ("test", std::get(settings["fakeKey"].value)); EXPECT_EQ(1, mockCache->store.size()); - EXPECT_TRUE(contains(mockCache->store.begin()->second, R"("test")")); + EXPECT_TRUE(contains(mockCache->store.begin()->second, R"({"s":"test"})")); service.refresh(); @@ -96,11 +96,11 @@ TEST_F(ManualPollingTest, Cache) { EXPECT_EQ("test2", std::get(settings["fakeKey"].value)); EXPECT_EQ(1, mockCache->store.size()); - EXPECT_TRUE(contains(mockCache->store.begin()->second, R"("test2")")); + EXPECT_TRUE(contains(mockCache->store.begin()->second, R"({"s":"test2"})")); } TEST_F(ManualPollingTest, EmptyCacheDoesNotInitiateHTTP) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; @@ -115,7 +115,7 @@ TEST_F(ManualPollingTest, EmptyCacheDoesNotInitiateHTTP) { } TEST_F(ManualPollingTest, OnlineOffline) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; @@ -142,7 +142,7 @@ TEST_F(ManualPollingTest, OnlineOffline) { } TEST_F(ManualPollingTest, InitOffline) { - configcat::Response response = {200, string_format(kTestJsonFormat, R"("test")")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::String, R"({"s":"test"})")}; mockHttpSessionAdapter->enqueueResponse(response); ConfigCatOptions options; diff --git a/test/test-override.cpp b/test/test-override.cpp index 0eacf1b..f4c3d49 100644 --- a/test/test-override.cpp +++ b/test/test-override.cpp @@ -44,7 +44,7 @@ class OverrideTest : public ::testing::Test { string directoryPath = RemoveFileName(__FILE__); vector tempFiles; static constexpr char kTestSdkKey[] = "TestSdkKey"; - static constexpr char kTestJsonFormat[] = R"({ "f": { "fakeKey": { "v": %s, "p": [], "r": [] } } })"; + static constexpr char kTestJsonFormat[] = R"({"f":{"fakeKey":{"t":%d,"v":%s}}})"; ConfigCatClient* client = nullptr; shared_ptr mockHttpSessionAdapter = make_shared(); shared_ptr logger = make_shared(make_shared(), make_shared()); @@ -74,7 +74,7 @@ TEST_F(OverrideTest, Map) { } TEST_F(OverrideTest, LocalOverRemote) { - configcat::Response response = {200, string_format(kTestJsonFormat, "false")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::Boolean, R"({"b":false})")}; mockHttpSessionAdapter->enqueueResponse(response); const std::unordered_map& map = { @@ -96,7 +96,7 @@ TEST_F(OverrideTest, LocalOverRemote) { } TEST_F(OverrideTest, RemoteOverLocal) { - configcat::Response response = {200, string_format(kTestJsonFormat, "false")}; + configcat::Response response = {200, string_format(kTestJsonFormat, SettingType::Boolean, R"({"b":false})")}; mockHttpSessionAdapter->enqueueResponse(response); const std::unordered_map& map = { diff --git a/test/test-rolloutintegration.cpp b/test/test-rolloutintegration.cpp index 3152a0c..5c0dfc1 100644 --- a/test/test-rolloutintegration.cpp +++ b/test/test-rolloutintegration.cpp @@ -81,17 +81,34 @@ class RolloutIntegrationTest : public ::testing::Test { int j = 0; for (auto& settingKey : settingKeys) { - string expected = str_tolower(testObjects[j + 4]); + string expected = testObjects[j + 4]; if (isValueKind) { auto value = client->getValue(settingKey, user.get()); - if (!value || str_tolower(valueToString(*value)) != expected) { + + auto success = value.has_value(); + if (success) { + if (holds_alternative(*value)) { + success = get(*value) ? expected == "True" : expected == "False"; + } + else if (holds_alternative(*value)) { + success = get(*value) == expected; + } + else if (holds_alternative(*value)) { + success = get(*value) == stoi(expected); + } + else { + success = get(*value) == stod(expected); + } + } + + if (!success) { errors.push_back(string_format("Index: [%d:%d] Identifier: %s, Key: %s. UV: %s Expected: %s, Result: %s", i, j, testObjects[0].c_str(), settingKey.c_str(), testObjects[3].c_str(), expected.c_str(), - value ? valueToString(*value).c_str() : "##null##")); + !value ? value->toString().c_str() : "##null##")); } } else { auto details = client->getValueDetails(settingKey, "", user.get()); @@ -103,7 +120,7 @@ class RolloutIntegrationTest : public ::testing::Test { testObjects[0].c_str(), settingKey.c_str(), expected.c_str(), - variationId.c_str())); + variationId.value_or("").c_str())); } } ++j; diff --git a/test/test-variationid.cpp b/test/test-variationid.cpp index 9b121f8..7cb5ba0 100644 --- a/test/test-variationid.cpp +++ b/test/test-variationid.cpp @@ -11,48 +11,80 @@ using namespace std; class VariationIdTest : public ::testing::Test { public: static constexpr char kTestSdkKey[] = "TestSdkKey"; - static constexpr char kTestJson[] = R"( - {"f":{ - "key1":{ - "v":true, - "i":"fakeId1", - "p":[ - { - "v":true, - "p":50, - "i":"percentageId1" - }, - { - "v":false, - "p":50, - "i":"percentageId2" - } - ], - "r":[ - { - "a":"Email", - "t":2, - "c":"@configcat.com", - "v":true, - "i":"rolloutId1" - }, - { - "a":"Email", - "t":2, - "c":"@test.com", - "v":false, - "i":"rolloutId2" - } - ] - }, - "key2":{ - "v":false, - "i":"fakeId2", - "p":[], - "r":[] - } - }} - )"; + static constexpr char kTestJson[] = R"({ + "f": { + "key1": { + "t": 0, + "r": [ + { + "c": [ + { + "u": { + "a": "Email", + "c": 2, + "l": [ + "@configcat.com" + ] + } + } + ], + "s": { + "v": { + "b": true + }, + "i": "rolloutId1" + } + }, + { + "c": [ + { + "u": { + "a": "Email", + "c": 2, + "l": [ + "@test.com" + ] + } + } + ], + "s": { + "v": { + "b": false + }, + "i": "rolloutId2" + } + } + ], + "p": [ + { + "p": 50, + "v": { + "b": true + }, + "i": "percentageId1" + }, + { + "p": 50, + "v": { + "b": false + }, + "i": "percentageId2" + } + ], + "v": { + "b": true + }, + "i": "fakeId1" + }, + "key2": { + "t": 0, + "v": { + "b": false + }, + "i": "fakeId2" + } + } + })"; ConfigCatClient* client = nullptr; shared_ptr mockHttpSessionAdapter = make_shared();