Skip to content

Instantly share code, notes, and snippets.

@dingzj
Created September 4, 2015 14:07
Show Gist options
  • Save dingzj/74a4803b9c667248e208 to your computer and use it in GitHub Desktop.
Save dingzj/74a4803b9c667248e208 to your computer and use it in GitHub Desktop.
qtranslate-x fix for divi theme, save it in admin/js folder
function qtranxj_get_cookie(n) {
for (var e = document.cookie.split(";"), a = 0; a < e.length; ++a) {
var t = e[a],
i = t.split("=");
if (i[0].trim() == n && !(e.length < 2)) return i[1].trim()
}
return ""
}
function qtranxj_ce(n, e, a, t) {
var i = document.createElement(n);
if (e)
for (prop in e) i[prop] = e[prop];
return a && (t && a.firstChild ? a.insertBefore(i, a.firstChild) : a.appendChild(i)), i
}
qtranxj_get_split_blocks = function(n) {
var e = /(<!--:[a-z]{2}-->|<!--:-->|\[:[a-z]{2}\]|\[:\]|\{:[a-z]{2}\}|\{:\})/gi;
return n.xsplit(e)
}, qtranxj_split = function(n) {
var e = qtranxj_get_split_blocks(n);
return qtranxj_split_blocks(e)
}, qtranxj_split_blocks = function(n) {
var e = new Object;
for (var a in qTranslateConfig.language_config) e[a] = "";
if (!n || !n.length) return e;
if (1 == n.length) {
var t = n[0];
for (var a in qTranslateConfig.language_config) e[a] += t;
return e
}
for (var i, r = /<!--:([a-z]{2})-->/gi, o = /\[:([a-z]{2})\]/gi, s = /\{:([a-z]{2})\}/gi, a = !1, l = 0; l < n.length; ++l) {
var t = n[l];
if (t.length)
if (i = r.exec(t), r.lastIndex = 0, null == i)
if (i = o.exec(t), o.lastIndex = 0, null == i)
if (i = s.exec(t), s.lastIndex = 0, null == i)
if ("<!--:-->" != t && "[:]" != t && "{:}" != t)
if (a) e[a] ? e[a] += t : e[a] = t, a = !1;
else
for (var c in e) e[c] += t;
else a = !1;
else a = i[1];
else a = i[1];
else a = i[1]
}
return e
}, String.prototype.xsplit = function(n) {
if (3 === "a~b".split(/(~)/).length) return this.split(n);
n.global || (n = new RegExp(n.source, "g" + (n.ignoreCase ? "i" : "")));
for (var e, a = 0, t = []; null != (e = n.exec(this));) t.push(this.slice(a, e.index)), e.length > 1 && t.push(e[1]), a = n.lastIndex;
return a < this.length && t.push(this.slice(a)), a == this.length && t.push(""), t
};
var qTranslateX = function(n) {
var e = this;
qTranslateConfig.qtx = this, this.getLanguages = function() {
return qTranslateConfig.language_config
}, this.getFlagLocation = function() {
return qTranslateConfig.flag_location
}, this.isLanguageEnabled = function(n) {
return !!qTranslateConfig.language_config[n]
};
var a = function(n) {
document.cookie = "qtrans_edit_language=" + n
};
qTranslateConfig.activeLanguage, qTranslateConfig.LSB ? (qTranslateConfig.activeLanguage = qtranxj_get_cookie("qtrans_edit_language"), qTranslateConfig.activeLanguage && this.isLanguageEnabled(qTranslateConfig.activeLanguage) || (qTranslateConfig.activeLanguage = qTranslateConfig.language, this.isLanguageEnabled(qTranslateConfig.activeLanguage) ? a(qTranslateConfig.activeLanguage) : qTranslateConfig.LSB = !1)) : (qTranslateConfig.activeLanguage = qTranslateConfig.language, a(qTranslateConfig.activeLanguage)), this.getActiveLanguage = function() {
return qTranslateConfig.activeLanguage
}, this.getLanguages = function() {
return qTranslateConfig.language_config
};
var t = {};
this.hasContentHook = function(n) {
return t[n]
}, this.addContentHook = function(n, a, i) {
if (!n) return !1;
switch (n.tagName) {
case "TEXTAREA":
break;
case "INPUT":
if ("text" != n.type) return !1;
break;
default:
return !1
}
if (!i) {
if (!n.name) return !1;
i = n.name
}
if (n.id) {
if (t[n.id]) {
if (jQuery.contains(document, n)) return t[n.id];
e.removeContentHook(n)
}
} else jQuery(n).uniqueId();
var r = t[n.id] = {};
r.name = i, r.contentField = n, r.lang = qTranslateConfig.activeLanguage;
var o = qtranxj_split(n.value);
n.value = o[r.lang];
var s;
if (a) switch (a) {
case "slug":
s = "qtranslate-slugs[";
break;
case "term":
s = "qtranslate-terms[";
break;
default:
s = "qtranslate-fields["
} else a = "[", s = "qtranslate-fields[";
var l, c, f = r.name.indexOf("[");
if (0 > f) l = s + r.name + "]";
else if (l = s + r.name.substring(0, f) + "]", r.name.lastIndexOf("[]") < 0) l += r.name.substring(f);
else {
var g = r.name.length - 2;
g > f && (l += r.name.substring(f, g)), c = "[]"
}
r.fields = {};
for (var u in o) {
var d = o[u],
h = l + "[" + u + "]";
c && (h += c);
var v = qtranxj_ce("input", {
name: h,
type: "hidden",
className: "hidden",
value: d
});
r.fields[u] = v, n.parentNode.insertBefore(v, n)
}
switch (a) {
case "slug":
case "term":
r.sepfield = qtranxj_ce("input", {
name: l + "[qtranslate-original-value]",
type: "hidden",
className: "hidden",
value: o[qTranslateConfig.default_language]
});
break;
default:
r.sepfield = qtranxj_ce("input", {
name: l + "[qtranslate-separator]",
type: "hidden",
className: "hidden",
value: a
})
}
return n.parentNode.insertBefore(r.sepfield, n), r.encode = a, n.className += " qtranxs-translatable", r
}, this.addContentHookC = function(n) {
return e.addContentHook(n, "[")
}, this.addContentHookB = function(n) {
return e.addContentHook(n, "[")
}, this.addContentHookById = function(n, a, t) {
return e.addContentHook(document.getElementById(n), a, t)
}, this.addContentHookByIdName = function(n) {
var a;
switch (n[0]) {
case "<":
case "[":
a = n.substring(0, 1), n = n.substring(1)
}
return e.addContentHookById(n, a)
}, this.addContentHookByIdC = function(n) {
return e.addContentHookById(n, "[")
}, this.addContentHookByIdB = function(n) {
return e.addContentHookById(n, "[")
}, this.addContentHooks = function(n, a, t) {
for (var i = 0; i < n.length; ++i) {
var r = n[i];
e.addContentHook(r, a, t)
}
};
var i = function(n, a, t) {
a || (a = document);
var i = a.getElementsByClassName(n);
e.addContentHooks(i, t)
};
this.addContentHooksByClass = function(n, e) {
var a;
(0 == n.indexOf("<") || 0 == n.indexOf("[")) && (a = n.substring(0, 1), n = n.substring(1)), i(n, e, a)
}, this.addContentHooksByTagInClass = function(n, a, t) {
for (var i = t.getElementsByClassName(n), r = 0; r < i.length; ++r) {
var o = i[r],
s = o.getElementsByTagName(a);
e.addContentHooks(s)
}
};
var r = function(n) {
if (!n) return !1;
n.sepfield && jQuery(n.sepfield).remove();
for (var e in n.fields) jQuery(n.fields[e]).remove();
return delete t[n.contentField.id], !0
};
this.removeContentHook = function(n) {
if (!n) return !1;
if (!n.id) return !1;
if (!t[n.id]) return !1;
var e = t[n.id];
return r(e), jQuery(n).removeClass("qtranxs-translatable"), !0
}, this.refreshContentHook = function(n) {
if (!n) return !1;
if (!n.id) return !1;
var a = t[n.id];
return a && r(a), e.addContentHook(n)
};
var o = [],
s = function(n) {
if (!n.nodeValue) return 0;
var e = qtranxj_get_split_blocks(n.nodeValue);
if (!e || !e.length || 1 == e.length) return 0;
var a = {};
return a.nd = n, a.contents = qtranxj_split_blocks(e), n.nodeValue = a.contents[qTranslateConfig.activeLanguage], o.push(a), 1
},
l = [],
c = function(n) {
if (!n.value) return 0;
var e = qtranxj_get_split_blocks(n.value);
if (!e || !e.length || 1 == e.length) return 0;
var a = {};
return a.nd = n, a.contents = qtranxj_split_blocks(e), n.value = a.contents[qTranslateConfig.activeLanguage], l.push(a), 1
};
this.addDisplayHook = function(n) {
if (!n || !n.tagName) return 0;
switch (n.tagName) {
case "TEXTAREA":
return 0;
case "INPUT":
switch (n.type) {
case "submit":
if (n.value) return c(n);
default:
return 0
}
}
var a = 0;
if (n.childNodes && n.childNodes.length)
for (var t = 0; t < n.childNodes.length; ++t) {
var i = n.childNodes[t];
switch (i.nodeType) {
case 1:
a += e.addDisplayHook(i);
break;
case 2:
case 3:
a += s(i)
}
}
return a
}, this.addDisplayHookById = function(n) {
return e.addDisplayHook(document.getElementById(n))
};
var f = function(n) {
text = n.contentField.value, n.wpautop && window.switchEditors && (text = window.switchEditors.wpautop(text)), n.mce.setContent(text, {
format: "html"
})
},
g = function(n) {
a(n);
for (var e = 0; e < o.length; ++e) {
var i = o[e];
i.nd.nodeValue = i.contents[n]
}
for (var e = 0; e < l.length; ++e) {
var i = l[e];
i.nd.value = i.contents[n]
}
for (var r in t) {
var i = t[r],
s = i.mce && !i.mce.hidden;
s && i.mce.save({
format: "html"
}), i.fields[i.lang].value = i.contentField.value, i.lang = n;
var c = i.fields[i.lang].value;
i.contentField.placeholder && "" != c && (i.contentField.placeholder = ""), i.contentField.value = c, s && f(i)
}
};
function n(n) {
var e = n.id;
if (e) {
var a = t[e];
if (a && !a.mce) {
a.mce = n, n.getContainer().className += " qtranxs-translatable", n.getElement().className += " qtranxs-translatable";
var i = a.updateTinyMCEonInit;
if (null == i) {
var r = n.getContent({
format: "html"
}).replace(/\s+/g, ""),
o = a.contentField.value.replace(/\s+/g, "");
i = r != o
}
return i && f(a), a
}
}
};
setTinyMceInit = function() {
if (window.tinyMCE)
for (var e in t) {
var a = t[e];
if ("TEXTAREA" === a.contentField.tagName && !a.mce && !a.mceInit && tinyMCEPreInit.mceInit[e]) {
if (a.mceInit = tinyMCEPreInit.mceInit[e], a.mceInit.wpautop) {
a.wpautop = a.mceInit.wpautop;
var i = tinymce.DOM.select("#wp-" + e + "-wrap");
i && i.length && (a.wrapper = i[0], a.wrapper && (tinymce.DOM.hasClass(a.wrapper, "tmce-active") && (a.updateTinyMCEonInit = !0), tinymce.DOM.hasClass(a.wrapper, "html-active") && (a.updateTinyMCEonInit = !1)))
} else a.updateTinyMCEonInit = !1;
tinyMCEPreInit.mceInit[e].init_instance_callback = function(e) {
n(e)
}
}
}
};
this.addDisplayHooks = function(n) {
for (var a = 0; a < n.length; ++a) {
var t = n[a];
e.addDisplayHook(t)
}
}, this.addDisplayHooksByClass = function(n, a) {
var t = a.getElementsByClassName(n);
e.addDisplayHooks(t)
}, this.addDisplayHooksByTagInClass = function(n, a, t) {
for (var i = t.getElementsByClassName(n), r = 0; r < i.length; ++r) {
var o = i[r],
s = o.getElementsByTagName(a);
e.addDisplayHooks(s)
}
}, this.addCustomContentHooks = function() {
for (var n = 0; n < qTranslateConfig.custom_fields.length; ++n) {
var a = qTranslateConfig.custom_fields[n];
e.addContentHookByIdName(a)
}
for (var n = 0; n < qTranslateConfig.custom_field_classes.length; ++n) {
var a = qTranslateConfig.custom_field_classes[n];
e.addContentHooksByClass(a)
}
setTinyMceInit()
};
var u = function(n) {
n(".i18n-multilingual").each(function(n, a) {
e.addContentHook(a, "[")
}), n(".i18n-multilingual-curly").each(function(n, a) {
e.addContentHook(a, "{")
}), n(".i18n-multilingual-term").each(function(n, a) {
e.addContentHook(a, "term")
}), n(".i18n-multilingual-slug").each(function(n, a) {
e.addContentHook(a, "slug")
}), n(".i18n-multilingual-display").each(function(n, a) {
e.addDisplayHook(a)
})
},
d = function(n) {
for (var a in n) {
var t, i = n[a];
if (i.form) {
if (i.form.id) t = document.getElementById(i.form.id);
else if (i.form.jquery) t = $(i.form.jquery);
else if (i.form.name) {
var r = document.getElementsByName(i.form.name);
r && r.length && (t = r[0])
}
} else t = document.getElementById(a);
t || (t = v(), t || (t = document));
for (var o in i.fields) {
var s = i.fields[o],
l = [];
if (s.container_id) {
var c = document.getElementById(s.container_id);
c && l.push(c)
} else s.container_jquery ? l = $(s.container_jquery) : s.container_class ? l = document.getElementsByClassName(s.container_class) : l.push(t);
var f = s.encode;
switch (f) {
case "none":
continue;
case "display":
if (s.jquery)
for (var g = 0; g < l.length; ++g) {
var c = l[g],
u = jQuery(c).find(s.jquery);
e.addDisplayHooks(u)
} else {
var d = s.id ? s.id : o;
e.addDisplayHook(document.getElementById(d))
}
break;
case "[":
case "<":
case "{":
case "byline":
default:
if (s.jquery)
for (var g = 0; g < l.length; ++g) {
var c = l[g],
u = jQuery(c).find(s.jquery);
e.addContentHooks(u, f, s.name)
} else {
var d = s.id ? s.id : o;
e.addContentHookById(d, f, s.name)
}
}
}
}
},
h = function() {
function n(n) {
var e = n.id;
if (e) {
var a = t[e];
if (a && !a.mce) {
a.mce = n, n.getContainer().className += " qtranxs-translatable", n.getElement().className += " qtranxs-translatable";
var i = a.updateTinyMCEonInit;
if (null == i) {
var r = n.getContent({
format: "html"
}).replace(/\s+/g, ""),
o = a.contentField.value.replace(/\s+/g, "");
i = r != o
}
return i && f(a), a
}
}
}
setTinyMceInit = function() {
if (window.tinyMCE)
for (var e in t) {
var a = t[e];
if ("TEXTAREA" === a.contentField.tagName && !a.mce && !a.mceInit && tinyMCEPreInit.mceInit[e]) {
if (a.mceInit = tinyMCEPreInit.mceInit[e], a.mceInit.wpautop) {
a.wpautop = a.mceInit.wpautop;
var i = tinymce.DOM.select("#wp-" + e + "-wrap");
i && i.length && (a.wrapper = i[0], a.wrapper && (tinymce.DOM.hasClass(a.wrapper, "tmce-active") && (a.updateTinyMCEonInit = !0), tinymce.DOM.hasClass(a.wrapper, "html-active") && (a.updateTinyMCEonInit = !1)))
} else a.updateTinyMCEonInit = !1;
tinyMCEPreInit.mceInit[e].init_instance_callback = function(e) {
n(e)
}
}
}
}, setTinyMceInit(), loadTinyMceHooks = function() {
if (window.tinyMCE)
for (var e = 0; e < tinyMCE.editors.length; ++e) {
var a = tinyMCE.editors[e];
n(a)
}
}, window.addEventListener("load", loadTinyMceHooks)
};
qTranslateConfig.onTabSwitchFunctions || (qTranslateConfig.onTabSwitchFunctions = []), qTranslateConfig.onTabSwitchFunctionsSave || (qTranslateConfig.onTabSwitchFunctionsSave = []), qTranslateConfig.onTabSwitchFunctionsLoad || (qTranslateConfig.onTabSwitchFunctionsLoad = []), this.addLanguageSwitchListener = function(n) {
qTranslateConfig.onTabSwitchFunctions.push(n)
}, this.addLanguageSwitchBeforeListener = function(n) {
qTranslateConfig.onTabSwitchFunctionsSave.push(n)
}, this.delLanguageSwitchBeforeListener = function(n) {
for (var e = 0; e < qTranslateConfig.onTabSwitchFunctionsSave.length; ++e) {
var a = qTranslateConfig.onTabSwitchFunctionsSave[e];
if (a == n) return void qTranslateConfig.onTabSwitchFunctionsSave.splice(e, 1)
}
}, this.addLanguageSwitchAfterListener = function(n) {
qTranslateConfig.onTabSwitchFunctionsLoad.push(n)
}, this.delLanguageSwitchAfterListener = function(n) {
for (var e = 0; e < qTranslateConfig.onTabSwitchFunctionsLoad.length; ++e) {
var a = qTranslateConfig.onTabSwitchFunctionsLoad[e];
if (a == n) return void qTranslateConfig.onTabSwitchFunctionsLoad.splice(e, 1)
}
}, this.enableLanguageSwitchingButtons = function(n) {
var e = n ? "block" : "none";
for (var a in qTranslateConfig.tabSwitches) {
for (var t = qTranslateConfig.tabSwitches[a], i = 0; i < t.length; ++i) {
var r = (t[i], t[i].parentElement);
r.style.display = e;
break
}
break
}
};
var v = function() {
for (var n = document.getElementsByClassName("wrap"), e = 0; e < n.length; ++e) {
var a = n[e],
t = a.getElementsByTagName("form");
if (t.length) return t[0]
}
var t = document.getElementsByTagName("form");
if (1 === t.length) return t[0];
for (var e = 0; e < t.length; ++e) {
var i = t[e];
if (n = i.getElementsByClassName("wrap"), n.length) return i
}
return null
};
if ("function" == typeof n.addContentHooks && n.addContentHooks(this), qTranslateConfig.page_config && qTranslateConfig.page_config.forms && d(qTranslateConfig.page_config.forms), u(jQuery), !o.length && !l.length) {
var C = !1;
for (var m in t) {
C = !0;
break
}
if (!C) return
}
this.switchActiveLanguage = function() {
var n = this,
e = n.lang;
if (!e) return void alert("qTranslate-X: This should not have happened: Please, report this incident to the developers: !lang");
if (qTranslateConfig.activeLanguage !== e) {
if (qTranslateConfig.activeLanguage) {
for (var a = !0, t = qTranslateConfig.onTabSwitchFunctionsSave, i = 0; i < t.length; ++i) {
var r = t[i].call(qTranslateConfig.qtx, qTranslateConfig.activeLanguage, e);
r === !1 && (a = !1)
}
if (!a) return;
for (var o = qTranslateConfig.tabSwitches[qTranslateConfig.activeLanguage], i = 0; i < o.length; ++i) o[i].classList.remove(qTranslateConfig.lsb_style_active_class)
}
var s = qTranslateConfig.activeLanguage;
qTranslateConfig.activeLanguage = e;
for (var o = qTranslateConfig.tabSwitches[qTranslateConfig.activeLanguage], i = 0; i < o.length; ++i) o[i].classList.add(qTranslateConfig.lsb_style_active_class);
for (var l = qTranslateConfig.onTabSwitchFunctions, i = 0; i < l.length; ++i) l[i].call(qTranslateConfig.qtx, e, s);
for (var c = qTranslateConfig.onTabSwitchFunctionsLoad, i = 0; i < c.length; ++i) c[i].call(qTranslateConfig.qtx, e, s)
}
};
var q = function() {
var n = qtranxj_ce("ul", {
className: qTranslateConfig.lsb_style_wrap_class
}),
e = qTranslateConfig.language_config;
qTranslateConfig.tabSwitches || (qTranslateConfig.tabSwitches = {});
for (var a in e) {
var t = e[a],
i = qTranslateConfig.flag_location,
r = qtranxj_ce("li", {
lang: a,
className: "qtranxs-lang-switch",
onclick: qTranslateConfig.qtx.switchActiveLanguage
}, n);
qtranxj_ce("img", {
src: i + t.flag
}, r), qtranxj_ce("span", {
innerHTML: t.name
}, r), qTranslateConfig.activeLanguage == a && r.classList.add(qTranslateConfig.lsb_style_active_class), qTranslateConfig.tabSwitches[a] || (qTranslateConfig.tabSwitches[a] = []), qTranslateConfig.tabSwitches[a].push(r)
}
return n
},
T = function(n) {
var e = document.getElementById("qtranxs-meta-box-lsb");
if (e) {
var a = e.getElementsByClassName("inside");
if (a.length) {
e.className += " closed", n(e).find(".hndle").remove();
var t = document.createElement("span");
e.insertBefore(t, a[0]), t.className = "hndle ui-sortable-handle";
var i = q();
t.appendChild(i), n(function(n) {
n("#qtranxs-meta-box-lsb .hndle").unbind("click.postboxes")
})
}
}
};
if (qTranslateConfig.LSB) {
h(), T(jQuery);
var p = [];
if (qTranslateConfig.page_config && qTranslateConfig.page_config.anchors)
for (var y in qTranslateConfig.page_config.anchors) {
var w = document.getElementById(y);
if (w) {
var b = qTranslateConfig.page_config.anchors[y];
b.id = y, b.f = w, p.push(b)
}
}
if (!p.length) {
var w = n.langSwitchWrapAnchor;
w || (w = v()), w && p.push({
f: w,
where: "before"
})
}
for (var _ = 0; _ < p.length; ++_) {
var b = p[_];
if (!b.where || b.where.indexOf("before") >= 0) {
var k = q();
b.f.parentNode.insertBefore(k, b.f)
}
if (b.where && b.where.indexOf("after") >= 0) {
var k = q();
b.f.parentNode.insertBefore(k, b.f.nextSibling)
}
if (b.where && b.where.indexOf("first") >= 0) {
var k = q();
b.f.insertBefore(k, b.f.firstChild)
}
if (b.where && b.where.indexOf("last") >= 0) {
var k = q();
b.f.insertBefore(k, null)
}
}
this.addLanguageSwitchListener(g), n.onTabSwitch && this.addLanguageSwitchListener(n.onTabSwitch)
}
};
qTranslateConfig.js.get_qtx = function() {
return qTranslateConfig.qtx || new qTranslateX(qTranslateConfig.js), qTranslateConfig.qtx
}, jQuery(document).ready(qTranslateConfig.js.get_qtx);
jQuery(document).ready(function(e) {
var a, n, t, r, l, i, s, d, h = qTranslateConfig.js.get_qtx(),
o = function(e, a) {
switch (qTranslateConfig.url_mode.toString()) {
case "1":
e.search ? e.search += "&lang=" + a : e.search = "?lang=" + a;
break;
case "2":
var n = qTranslateConfig.url_info_home,
t = e.pathname.indexOf(n);
e.pathname = n + a + e.pathname.substring(t + n.length - 1);
break;
case "3":
e.host = a + "." + e.host;
break;
case "4":
e.host = qTranslateConfig.domains[a]
}
},
c = function(h) {
if (!a) {
var c = document.getElementById("view-post-btn");
if (!c || !c.children.length) return;
if (a = c.children[0], "A" != a.tagName) return;
n = a.href, t = qtranxj_ce("a", {}), r = n.search(/\?/) > 0
}
t.href = n, o(t, h), a.href = t.href;
var g = document.getElementById("preview-action");
if (g && g.children.length && (g.children[0].href = t.href), 1 != qTranslateConfig.url_mode) {
if (!l) {
var m = document.getElementById("sample-permalink");
m && m.childNodes.length && (l = m.childNodes[0], i = l.nodeValue)
}
l && (t.href = i, o(t, h), l.nodeValue = t.href)
} else d || (e("#sample-permalink").append('<span id="sample-permalink-lang-query"></span>'), d = e("#sample-permalink-lang-query")), d && d.text((n.search(/\?/) < 0 ? "/?lang=" : "&lang=") + h);
s || (s = document.getElementById("wp-admin-bar-view")), s && s.children.length && (s.children[0].href = t.href)
},
g = jQuery("#title"),
m = jQuery("#title-prompt-text"),
f = function() {
var e = g.attr("value");
e ? m.addClass("screen-reader-text") : m.removeClass("screen-reader-text")
};
h.addCustomContentHooks(), c(h.getActiveLanguage()), h.addLanguageSwitchAfterListener(c), m && g && h.addLanguageSwitchAfterListener(f)
}); //]]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment