@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
131 lines • 18.7 kB
JavaScript
/*
* ###############################################################################
* Common Serialisation functions
* ###############################################################################
*/
import { dictKeysFromObject } from "./UtilMisc";
import * as base64 from "base-64";
export class SerialiseUtil {
static T_RAPUI_TUPLE = "rt";
static T_RAPUI_PAYLOAD = "rp";
static T_RAPUI_PAYLOAD_ENVELOPE = "rpe";
static T_GENERIC_CLASS = "gen"; // NOT SUPPORTED
static T_FLOAT = "float";
static T_INT = "int";
static T_STR = "str";
static T_BYTES = "bytes";
static T_BOOL = "bool";
static T_DATETIME = "datetime";
static T_DICT = "dict";
static T_LIST = "list";
static V_NULL = "null";
static V_TRUE = "1";
static V_FALSE = "0";
static ISO8601_PY = "%Y-%m-%d %H:%M:%S.%f%z";
static ISO8601 = "YYYY-MM-DD HH:mm:ss.SSSSSSZZ";
// Rapui Serialised Type - Shortened for memory constraints.
__rst;
toStr(obj) {
let self = this;
if (obj["toISOString"] != null)
// instanceof Date or moment
return obj.toISOString().replace("Z", "000+0000").replace("T", " ");
if (typeof obj.constructor === "boolean")
return obj ? SerialiseUtil.V_TRUE : SerialiseUtil.V_FALSE;
if (typeof obj.constructor === "string")
return obj;
return obj.toString();
}
fromStr(val, typeName) {
let self = this;
if (typeName === SerialiseUtil.T_STR)
return val;
if (typeName === SerialiseUtil.T_BYTES)
return base64.decode(encodeURI(val));
if (typeName === SerialiseUtil.T_BOOL)
return val === SerialiseUtil.V_TRUE;
if (typeName === SerialiseUtil.T_FLOAT ||
typeName === SerialiseUtil.T_INT)
return parseFloat(val);
if (typeName === SerialiseUtil.T_DATETIME)
return new Date(val);
alert("fromStr - UNKNOWN TYPE");
}
toRapuiType(value) {
let self = this;
if (value == null)
return SerialiseUtil.V_NULL;
if (value.__rst === SerialiseUtil.T_RAPUI_TUPLE)
return SerialiseUtil.T_RAPUI_TUPLE;
if (value.__rst === SerialiseUtil.T_RAPUI_PAYLOAD)
return SerialiseUtil.T_RAPUI_PAYLOAD;
if (value.__rst === SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE)
return SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE;
if (value instanceof Date)
return SerialiseUtil.T_DATETIME;
if (value.constructor === Number)
return SerialiseUtil.T_FLOAT;
if (value.constructor === String)
return SerialiseUtil.T_STR;
if (value.constructor === Boolean)
return SerialiseUtil.T_BOOL;
if (value.constructor === Array)
return SerialiseUtil.T_LIST;
if (value.constructor === Object)
return SerialiseUtil.T_DICT;
alert("toRapuiType - UNKNOWN TYPE");
}
rapuiEquals(obj1, obj2, obj1FieldNames, obj2FieldNames) {
let self = this;
let fieldNames1 = obj1FieldNames;
fieldNames1.sort();
let fieldNames2 = obj2FieldNames;
fieldNames2.sort();
if (!fieldNames1.equals(fieldNames2))
return false;
// Create the <items> base element
for (let fieldIndex = 0; fieldIndex < fieldNames1.length; ++fieldIndex) {
let name = fieldNames1[fieldIndex];
let field1 = obj1[name];
let field2 = obj2[name];
if (field1 === undefined && field2 === undefined)
continue;
else if (field1 === undefined || field2 === undefined)
return false;
let type1 = self.toRapuiType(field1);
let type2 = self.toRapuiType(field2);
if (type1 !== type2)
return false;
if (type1 === SerialiseUtil.T_RAPUI_TUPLE ||
type1 === SerialiseUtil.T_RAPUI_PAYLOAD ||
type1 === SerialiseUtil.T_RAPUI_PAYLOAD_ENVELOPE) {
if (!field1.equals(field2))
return false;
}
else if (type1 === SerialiseUtil.T_LIST) {
let indexes = [];
for (let index = 0; index < field1.length; index++) {
indexes.push(index);
}
let isEqual = self.rapuiEquals(field1, field2, indexes, indexes);
if (!isEqual)
return false;
}
else if (type1 === SerialiseUtil.T_DICT) {
let isEqual = self.rapuiEquals(field1, field2, dictKeysFromObject(field1), dictKeysFromObject(field2));
if (!isEqual)
return false;
}
else if (type1 === SerialiseUtil.T_DATETIME) {
if (field1.getTime() !== field2.getTime())
return false;
}
else {
if (field1 !== field2)
return false;
}
}
return true;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VyaWFsaXNlVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvU2VyaWFsaXNlVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxhQUFhO0lBQ2YsTUFBTSxDQUFVLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDckMsTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDdkMsTUFBTSxDQUFVLHdCQUF3QixHQUFHLEtBQUssQ0FBQztJQUNqRCxNQUFNLENBQVUsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLGdCQUFnQjtJQUN6RCxNQUFNLENBQVUsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNsQyxNQUFNLENBQVUsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUM5QixNQUFNLENBQVUsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUM5QixNQUFNLENBQVUsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNsQyxNQUFNLENBQVUsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxNQUFNLENBQVUsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUN4QyxNQUFNLENBQVUsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxNQUFNLENBQVUsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxNQUFNLENBQVUsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxNQUFNLENBQVUsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUM3QixNQUFNLENBQVUsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUM5QixNQUFNLENBQVUsVUFBVSxHQUFHLHdCQUF3QixDQUFDO0lBQ3RELE1BQU0sQ0FBVSxPQUFPLEdBQUcsOEJBQThCLENBQUM7SUFFaEUsNkRBQTZEO0lBQ25ELEtBQUssQ0FB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QztpQkFBTSxJQUFJLEtBQUssS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUN2QyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2pCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN2QjtnQkFFRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUMxQixNQUFNLEVBQ04sTUFBTSxFQUNOLE9BQU8sRUFDUCxPQUFPLENBQ1YsQ0FBQztnQkFDRixJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPLEtBQUssQ0FBQzthQUM5QjtpQkFBTSxJQUFJLEtBQUssS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUN2QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUMxQixNQUFNLEVBQ04sTUFBTSxFQUNOLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUMxQixrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FDN0IsQ0FBQztnQkFDRixJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPLEtBQUssQ0FBQzthQUM5QjtpQkFBTSxJQUFJLEtBQUssS0FBSyxhQUFhLENBQUMsVUFBVSxFQUFFO2dCQUMzQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFO29CQUFFLE9BQU8sS0FBSyxDQUFDO2FBQzNEO2lCQUFNO2dCQUNILElBQUksTUFBTSxLQUFLLE1BQU07b0JBQUUsT0FBTyxLQUFLLENBQUM7YUFDdkM7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICogQ29tbW9uIFNlcmlhbGlzYXRpb24gZnVuY3Rpb25zXG4gKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gKi9cblxuaW1wb3J0IHtkaWN0S2V5c0Zyb21PYmplY3R9IGZyb20gXCIuL1V0aWxNaXNjXCI7XG5pbXBvcnQgKiBhcyBiYXNlNjQgZnJvbSBcImJhc2UtNjRcIjtcblxuZXhwb3J0IGNsYXNzIFNlcmlhbGlzZVV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVF9SQVBVSV9UVVBMRSA9IFwicnRcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRfUkFQVUlfUEFZTE9BRCA9IFwicnBcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRfUkFQVUlfUEFZTE9BRF9FTlZFTE9QRSA9IFwicnBlXCI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBUX0dFTkVSSUNfQ0xBU1MgPSBcImdlblwiOyAvLyBOT1QgU1VQUE9SVEVEXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBUX0ZMT0FUID0gXCJmbG9hdFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVF9JTlQgPSBcImludFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVF9TVFIgPSBcInN0clwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVF9CWVRFUyA9IFwiYnl0ZXNcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRfQk9PTCA9IFwiYm9vbFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVF9EQVRFVElNRSA9IFwiZGF0ZXRpbWVcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRfRElDVCA9IFwiZGljdFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVF9MSVNUID0gXCJsaXN0XCI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBWX05VTEwgPSBcIm51bGxcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFZfVFJVRSA9IFwiMVwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVl9GQUxTRSA9IFwiMFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSVNPODYwMV9QWSA9IFwiJVktJW0tJWQgJUg6JU06JVMuJWYlelwiO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSVNPODYwMSA9IFwiWVlZWS1NTS1ERCBISDptbTpzcy5TU1NTU1NaWlwiO1xuXG4gICAgLy8gUmFwdWkgU2VyaWFsaXNlZCBUeXBlIC0gIFNob3J0ZW5lZCBmb3IgbWVtb3J5IGNvbnN0cmFpbnRzLlxuICAgIHByb3RlY3RlZCBfX3JzdDogc3RyaW5nO1xuXG4gICAgdG9TdHIob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKG9ialtcInRvSVNPU3RyaW5nXCJdICE9IG51bGwpXG4gICAgICAgICAgICAvLyBpbnN0YW5jZW9mIERhdGUgb3IgbW9tZW50XG4gICAgICAgICAgICByZXR1cm4gb2JqLnRvSVNPU3RyaW5nKCkucmVwbGFjZShcIlpcIiwgXCIwMDArMDAwMFwiKS5yZXBsYWNlKFwiVFwiLCBcIiBcIik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmouY29uc3RydWN0b3IgPT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgcmV0dXJuIG9iaiA/IFNlcmlhbGlzZVV0aWwuVl9UUlVFIDogU2VyaWFsaXNlVXRpbC5WX0ZBTFNFO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yID09PSBcInN0cmluZ1wiKSByZXR1cm4gb2JqO1xuXG4gICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBmcm9tU3RyKHZhbDogc3RyaW5nLCB0eXBlTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmICh0eXBlTmFtZSA9PT0gU2VyaWFsaXNlVXRpbC5UX1NUUikgcmV0dXJuIHZhbDtcblxuICAgICAgICBpZiAodHlwZU5hbWUgPT09IFNlcmlhbGlzZVV0aWwuVF9CWVRFUylcbiAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZGVjb2RlKGVuY29kZVVSSSh2YWwpKTtcblxuICAgICAgICBpZiAodHlwZU5hbWUgPT09IFNlcmlhbGlzZVV0aWwuVF9CT09MKVxuICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gU2VyaWFsaXNlVXRpbC5WX1RSVUU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZU5hbWUgPT09IFNlcmlhbGlzZVV0aWwuVF9GTE9BVCB8fFxuICAgICAgICAgICAgdHlwZU5hbWUgPT09IFNlcmlhbGlzZVV0aWwuVF9JTlRcbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsKTtcblxuICAgICAgICBpZiAodHlwZU5hbWUgPT09IFNlcmlhbGlzZVV0aWwuVF9EQVRFVElNRSkgcmV0dXJuIG5ldyBEYXRlKHZhbCk7XG5cbiAgICAgICAgYWxlcnQoXCJmcm9tU3RyIC0gVU5LTk9XTiBUWVBFXCIpO1xuICAgIH1cblxuICAgIHRvUmFwdWlUeXBlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBTZXJpYWxpc2VVdGlsLlZfTlVMTDtcblxuICAgICAgICBpZiAodmFsdWUuX19yc3QgPT09IFNlcmlhbGlzZVV0aWwuVF9SQVBVSV9UVVBMRSlcbiAgICAgICAgICAgIHJldHVybiBTZXJpYWxpc2VVdGlsLlRfUkFQVUlfVFVQTEU7XG5cbiAgICAgICAgaWYgKHZhbHVlLl9fcnN0ID09PSBTZXJpYWxpc2VVdGlsLlRfUkFQVUlfUEFZTE9BRClcbiAgICAgICAgICAgIHJldHVybiBTZXJpYWxpc2VVdGlsLlRfUkFQVUlfUEFZTE9BRDtcblxuICAgICAgICBpZiAodmFsdWUuX19yc3QgPT09IFNlcmlhbGlzZVV0aWwuVF9SQVBVSV9QQVlMT0FEX0VOVkVMT1BFKVxuICAgICAgICAgICAgcmV0dXJuIFNlcmlhbGlzZVV0aWwuVF9SQVBVSV9QQVlMT0FEX0VOVkVMT1BFO1xuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBTZXJpYWxpc2VVdGlsLlRfREFURVRJTUU7XG5cbiAgICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBOdW1iZXIpIHJldHVybiBTZXJpYWxpc2VVdGlsLlRfRkxPQVQ7XG5cbiAgICAgICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHJldHVybiBTZXJpYWxpc2VVdGlsLlRfU1RSO1xuXG4gICAgICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gQm9vbGVhbikgcmV0dXJuIFNlcmlhbGlzZVV0aWwuVF9CT09MO1xuXG4gICAgICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHJldHVybiBTZXJpYWxpc2VVdGlsLlRfTElTVDtcblxuICAgICAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCkgcmV0dXJuIFNlcmlhbGlzZVV0aWwuVF9ESUNUO1xuXG4gICAgICAgIGFsZXJ0KFwidG9SYXB1aVR5cGUgLSBVTktOT1dOIFRZUEVcIik7XG4gICAgfVxuXG4gICAgcmFwdWlFcXVhbHMoXG4gICAgICAgIG9iajE6IGFueSxcbiAgICAgICAgb2JqMjogYW55LFxuICAgICAgICBvYmoxRmllbGROYW1lczogc3RyaW5nW10sXG4gICAgICAgIG9iajJGaWVsZE5hbWVzOiBzdHJpbmdbXSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGxldCBmaWVsZE5hbWVzMTogc3RyaW5nW10gPSBvYmoxRmllbGROYW1lcztcbiAgICAgICAgZmllbGROYW1lczEuc29ydCgpO1xuXG4gICAgICAgIGxldCBmaWVsZE5hbWVzMjogc3RyaW5nW10gPSBvYmoyRmllbGROYW1lcztcbiAgICAgICAgZmllbGROYW1lczIuc29ydCgpO1xuXG4gICAgICAgIGlmICghZmllbGROYW1lczEuZXF1YWxzKGZpZWxkTmFtZXMyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgPGl0ZW1zPiBiYXNlIGVsZW1lbnRcbiAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGxldCBmaWVsZEluZGV4ID0gMDtcbiAgICAgICAgICAgIGZpZWxkSW5kZXggPCBmaWVsZE5hbWVzMS5sZW5ndGg7XG4gICAgICAgICAgICArK2ZpZWxkSW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IGZpZWxkTmFtZXMxW2ZpZWxkSW5kZXhdO1xuICAgICAgICAgICAgbGV0IGZpZWxkMSA9IG9iajFbbmFtZV07XG4gICAgICAgICAgICBsZXQgZmllbGQyID0gb2JqMltuYW1lXTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkMSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkMiA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkMSA9PT0gdW5kZWZpbmVkIHx8IGZpZWxkMiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIGxldCB0eXBlMSA9IHNlbGYudG9SYXB1aVR5cGUoZmllbGQxKTtcbiAgICAgICAgICAgIGxldCB0eXBlMiA9IHNlbGYudG9SYXB1aVR5cGUoZmllbGQyKTtcblxuICAgICAgICAgICAgaWYgKHR5cGUxICE9PSB0eXBlMikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZTEgPT09IFNlcmlhbGlzZVV0aWwuVF9SQVBVSV9UVVBMRSB8fFxuICAgICAgICAgICAgICAgIHR5cGUxID09PSBTZXJpYWxpc2VVdGlsLlRfUkFQVUlfUEFZTE9BRCB8fFxuICAgICAgICAgICAgICAgIHR5cGUxID09PSBTZXJpYWxpc2VVdGlsLlRfUkFQVUlfUEFZTE9BRF9FTlZFTE9QRVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWVsZDEuZXF1YWxzKGZpZWxkMikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZTEgPT09IFNlcmlhbGlzZVV0aWwuVF9MSVNUKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmllbGQxLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBpc0VxdWFsID0gc2VsZi5yYXB1aUVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgZmllbGQxLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDIsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZXMsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZXMsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRXF1YWwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZTEgPT09IFNlcmlhbGlzZVV0aWwuVF9ESUNUKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlzRXF1YWwgPSBzZWxmLnJhcHVpRXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDEsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkMixcbiAgICAgICAgICAgICAgICAgICAgZGljdEtleXNGcm9tT2JqZWN0KGZpZWxkMSksXG4gICAgICAgICAgICAgICAgICAgIGRpY3RLZXlzRnJvbU9iamVjdChmaWVsZDIpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0VxdWFsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUxID09PSBTZXJpYWxpc2VVdGlsLlRfREFURVRJTUUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQxLmdldFRpbWUoKSAhPT0gZmllbGQyLmdldFRpbWUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQxICE9PSBmaWVsZDIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXX0=