No more "version" keyword, new syntax is "package foo.bar.baz@3.4;"
diff --git a/FQName.cpp b/FQName.cpp
index cabe503..5ad6a4b 100644
--- a/FQName.cpp
+++ b/FQName.cpp
@@ -9,10 +9,15 @@
 
 static const std::regex kRE1("(" RE_PATH ")(" RE_VERSION ")?::(" RE_PATH ")");
 static const std::regex kRE2("(" RE_VERSION ")::(" RE_PATH ")");
-static const std::regex kRE3(RE_PATH);
+static const std::regex kRE3("(" RE_PATH ")(" RE_VERSION ")");
+static const std::regex kRE4(RE_PATH);
 
 namespace android {
 
+FQName::FQName()
+    : mValid(false) {
+}
+
 FQName::FQName(const std::string &s)
     : mValid(false) {
     setTo(s);
@@ -42,6 +47,11 @@
         mVersion = match.str(1);
         mName = match.str(2);
     } else if (std::regex_match(s, match, kRE3)) {
+        CHECK_EQ(match.size(), 4u);
+
+        mPackage = match.str(1);
+        mVersion = match.str(3);
+    } else if (std::regex_match(s, match, kRE4)) {
         mName = match.str(0);
     } else {
         mValid = false;
@@ -80,14 +90,25 @@
     std::string out = "FQName(";
     out.append(mPackage);
     out.append(mVersion);
-    if (!mPackage.empty() || !mVersion.empty()) {
-        out.append("::");
+    if (!mName.empty()) {
+        if (!mPackage.empty() || !mVersion.empty()) {
+            out.append("::");
+        }
+        out.append(mName);
     }
-    out.append(mName);
     out.append(")");
 
     return out;
 }
 
+void FQName::print() const {
+    if (!mValid) {
+        LOG(INFO) << "INVALID";
+        return;
+    }
+
+    LOG(INFO) << debugString();
+}
+
 }  // namespace android