UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

157 lines 16.4 kB
/** * Created by Jarrod Chesney / Synerty on 22/11/16. */ // ---------------------------------------------------------------------------- /** * Keys from Object * * Extract an array of keys from a json object. * This will not include keys starting with an underscore. * * @param obj: The object to get the keys from. * @param includeUnderscore: Should keys with underscores be included? * @return A list of keys from the object. */ export function dictKeysFromObject(obj, includeUnderscore = false) { let keys = []; for (let k in obj) { if ((!k.startsWith("_") || includeUnderscore) && obj.hasOwnProperty(k) && typeof k !== "function") { keys.push(k); } } return keys; } // ---------------------------------------------------------------------------- export class AssertException { message; constructor(message) { let self = this; self.message = message; } toString() { let self = this; return "AssertException: " + self.message; } } /** * A simple assert statement * @param exp : The boolean to assert * @param message : The message to log when the assertion fails. */ export function assert(exp, message = null) { if (exp) return; console.trace(); throw new AssertException(message); } // ---------------------------------------------------------------------------- /** * Create url encoded arguments * * @param filter : The object containing the key:value pairs to convert into a url * */ export function getFiltStr(filter) { let filtStr = ""; for (let key in filter) { if (!filter.hasOwnProperty(key)) continue; filtStr += (filtStr.length ? "&" : "?") + key + "=" + filter[key]; } return filtStr; } // ---------------------------------------------------------------------------- /** * Date String * * @return A date and time formatted to a string for log messages. */ export function dateStr() { let d = new Date(); return d.toTimeString() .split(" ")[0] + "." + d.getUTCMilliseconds() + ": "; } // ---------------------------------------------------------------------------- /** * Bind a function * @param obj : The object to bind the function for. * @param method : The method to bind onto to the object. * * @return A callable function that will call the method correctly bound to "this" */ export function bind(obj, method) { return function () { return method.apply(obj, arguments); }; } // ---------------------------------------------------------------------------- /** * Bind a function * @param err : The err object to convert to a string. * * @return A callable function that will call the method correctly bound to "this" */ export function errToStr(err) { if (err.message != null) return err.message; try { let jsonStr = JSON.stringify(err); if (jsonStr != "{}") return jsonStr; } catch (ignore) { } return err.toString(); } /** Deep Clone * @param data: Deep Clone an entire JSON data structure * @param ignoreFieldNames: An array of field names not to copy. * * @return A clone of the data */ export function deepCopy(data, ignoreFieldNames = null) { const dict = {}; if (ignoreFieldNames != null && Object.prototype.toString.call(ignoreFieldNames) .slice(8, -1) == "Array") { for (const fieldName of ignoreFieldNames) dict[fieldName] = true; } return _deepCopy(data, dict); } function _deepCopy(data, ignoreFieldNames) { // If the data is null or undefined then we return undefined if (data === null || data === undefined) return undefined; // Get the data type and store it const dataType = Object.prototype.toString.call(data) .slice(8, -1); // DATE if (dataType == "Date") { const clonedDate = new Date(); clonedDate.setTime(data.getTime()); return clonedDate; } // OBJECT if (dataType == "Object") { let copiedObject = {}; for (const key of Object.keys(data)) { if (ignoreFieldNames != null && ignoreFieldNames[key] === true) continue; copiedObject[key] = _deepCopy(data[key], ignoreFieldNames); } return copiedObject; } // ARRAY if (dataType == "Array") { let copiedArray = []; for (const item of data) copiedArray.push(_deepCopy(item, ignoreFieldNames)); return copiedArray; } return data; } // ---------------------------------------------------------------------------- /* Add a imports for these requires */ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbE1pc2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdm9ydGV4L1V0aWxNaXNjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsK0VBQStFO0FBQy9FOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDOUIsR0FBTyxFQUNQLGlCQUFpQixHQUFHLEtBQUs7SUFFekIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQ2IsS0FBSyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixDQUFDO2VBQ3RDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVSxFQUFFO1lBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDZjtLQUNKO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQsK0VBQStFO0FBRS9FLE1BQU0sT0FBTyxlQUFlO0lBQ3hCLE9BQU8sQ0FBUTtJQUVmLFlBQVksT0FBZTtRQUN2QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUE7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtJQUMxQixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNmLE9BQU8sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUM3QyxDQUFDO0NBQ0o7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsR0FBWSxFQUNaLFVBQXlCLElBQUk7SUFFN0IsSUFBSSxHQUFHO1FBQ0gsT0FBTTtJQUVWLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNmLE1BQU0sSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdEMs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Q0FBQTtRQUNsQyxPQUFPLFVBQVUsQ0FBQTtLQUNwQjtJQUVELFNBQVM7SUFDVCxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUU7UUFDdEIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO1FBRXJCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyxJQUFJLGdCQUFnQixJQUFJLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJO2dCQUMxRCxTQUFRO1lBQ1osWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtTQUM3RDtRQUVELE9BQU8sWUFBWSxDQUFBO0tBQ3RCO0lBRUQsUUFBUTtJQUNSLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRTtRQUNyQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFFcEIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7UUFFdkQsT0FBTyxXQUFXLENBQUE7S0FDckI7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCwrRUFBK0U7QUFFL0Usc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVkIGJ5IEphcnJvZCBDaGVzbmV5IC8gU3luZXJ0eSBvbiAyMi8xMS8xNi5cbiAqL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBLZXlzIGZyb20gT2JqZWN0XG4gKlxuICogRXh0cmFjdCBhbiBhcnJheSBvZiBrZXlzIGZyb20gYSBqc29uIG9iamVjdC5cbiAqIFRoaXMgd2lsbCBub3QgaW5jbHVkZSBrZXlzIHN0YXJ0aW5nIHdpdGggYW4gdW5kZXJzY29yZS5cbiAqXG4gKiBAcGFyYW0gb2JqOiBUaGUgb2JqZWN0IHRvIGdldCB0aGUga2V5cyBmcm9tLlxuICogQHBhcmFtIGluY2x1ZGVVbmRlcnNjb3JlOiBTaG91bGQga2V5cyB3aXRoIHVuZGVyc2NvcmVzIGJlIGluY2x1ZGVkP1xuICogQHJldHVybiBBIGxpc3Qgb2Yga2V5cyBmcm9tIHRoZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWN0S2V5c0Zyb21PYmplY3QoXG4gICAgb2JqOiB7fSxcbiAgICBpbmNsdWRlVW5kZXJzY29yZSA9IGZhbHNlXG4pOiBzdHJpbmdbXSB7XG4gICAgbGV0IGtleXMgPSBbXVxuICAgIGZvciAobGV0IGsgaW4gb2JqKSB7XG4gICAgICAgIGlmICgoIWsuc3RhcnRzV2l0aChcIl9cIikgfHwgaW5jbHVkZVVuZGVyc2NvcmUpXG4gICAgICAgICAgICAmJiBvYmouaGFzT3duUHJvcGVydHkoaykgJiYgdHlwZW9mIGsgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAga2V5cy5wdXNoKGspXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleXNcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY2xhc3MgQXNzZXJ0RXhjZXB0aW9uIHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzXG4gICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2VcbiAgICB9XG4gICAgXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzXG4gICAgICAgIHJldHVybiBcIkFzc2VydEV4Y2VwdGlvbjogXCIgKyBzZWxmLm1lc3NhZ2VcbiAgICB9XG59XG5cbi8qKlxuICogQSBzaW1wbGUgYXNzZXJ0IHN0YXRlbWVudFxuICogQHBhcmFtIGV4cCA6IFRoZSBib29sZWFuIHRvIGFzc2VydFxuICogQHBhcmFtIG1lc3NhZ2UgOiBUaGUgbWVzc2FnZSB0byBsb2cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KFxuICAgIGV4cDogYm9vbGVhbixcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuKTogbnVsbCB7XG4gICAgaWYgKGV4cClcbiAgICAgICAgcmV0dXJuXG4gICAgXG4gICAgY29uc29sZS50cmFjZSgpXG4gICAgdGhyb3cgbmV3IEFzc2VydEV4Y2VwdGlvbihtZXNzYWdlKVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ3JlYXRlIHVybCBlbmNvZGVkIGFyZ3VtZW50c1xuICpcbiAqIEBwYXJhbSBmaWx0ZXIgOiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleTp2YWx1ZSBwYWlycyB0byBjb252ZXJ0IGludG8gYSB1cmxcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0U3RyKGZpbHRlcjoge30pOiBzdHJpbmcge1xuICAgIGxldCBmaWx0U3RyID0gXCJcIlxuICAgIFxuICAgIGZvciAobGV0IGtleSBpbiBmaWx0ZXIpIHtcbiAgICAgICAgaWYgKCFmaWx0ZXIuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIFxuICAgICAgICBmaWx0U3RyICs9IChmaWx0U3RyLmxlbmd0aCA/IFwiJlwiIDogXCI/XCIpICsga2V5ICsgXCI9XCIgKyBmaWx0ZXJba2V5XVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmlsdFN0clxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRGF0ZSBTdHJpbmdcbiAqXG4gKiBAcmV0dXJuIEEgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZWQgdG8gYSBzdHJpbmcgZm9yIGxvZyBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVTdHIoKTogc3RyaW5nIHtcbiAgICBsZXQgZCA9IG5ldyBEYXRlKClcbiAgICByZXR1cm4gZC50b1RpbWVTdHJpbmcoKVxuICAgICAgICAuc3BsaXQoXCIgXCIpWzBdICsgXCIuXCIgKyBkLmdldFVUQ01pbGxpc2Vjb25kcygpICsgXCI6IFwiXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBCaW5kIGEgZnVuY3Rpb25cbiAqIEBwYXJhbSBvYmogOiBUaGUgb2JqZWN0IHRvIGJpbmQgdGhlIGZ1bmN0aW9uIGZvci5cbiAqIEBwYXJhbSBtZXRob2QgOiBUaGUgbWV0aG9kIHRvIGJpbmQgb250byB0byB0aGUgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4gQSBjYWxsYWJsZSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCB0aGUgbWV0aG9kIGNvcnJlY3RseSBib3VuZCB0byBcInRoaXNcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZChcbiAgICBvYmo6IGFueSxcbiAgICBtZXRob2Q6IGFueVxuKTogYW55IHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KG9iaiwgYXJndW1lbnRzKVxuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJpbmQgYSBmdW5jdGlvblxuICogQHBhcmFtIGVyciA6IFRoZSBlcnIgb2JqZWN0IHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuXG4gKlxuICogQHJldHVybiBBIGNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIHRoZSBtZXRob2QgY29ycmVjdGx5IGJvdW5kIHRvIFwidGhpc1wiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJUb1N0cihlcnI6IGFueSk6IHN0cmluZyB7XG4gICAgXG4gICAgaWYgKGVyci5tZXNzYWdlICE9IG51bGwpXG4gICAgICAgIHJldHVybiBlcnIubWVzc2FnZVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAgIGxldCBqc29uU3RyID0gSlNPTi5zdHJpbmdpZnkoZXJyKVxuICAgICAgICBpZiAoanNvblN0ciAhPSBcInt9XCIpXG4gICAgICAgICAgICByZXR1cm4ganNvblN0clxuICAgICAgICBcbiAgICB9XG4gICAgY2F0Y2ggKGlnbm9yZSkge1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZXJyLnRvU3RyaW5nKClcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgaWdub3JlRGljdFR5cGUge1xuICAgIFtuYW1lOiBzdHJpbmddOiBhbnlcbn1cblxuLyoqIERlZXAgQ2xvbmVcbiAqIEBwYXJhbSBkYXRhOiBEZWVwIENsb25lIGFuIGVudGlyZSBKU09OIGRhdGEgc3RydWN0dXJlXG4gKiBAcGFyYW0gaWdub3JlRmllbGROYW1lczogQW4gYXJyYXkgb2YgZmllbGQgbmFtZXMgbm90IHRvIGNvcHkuXG4gKlxuICogQHJldHVybiBBIGNsb25lIG9mIHRoZSBkYXRhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDb3B5KFxuICAgIGRhdGEsXG4gICAgaWdub3JlRmllbGROYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbFxuKSB7XG4gICAgY29uc3QgZGljdDogaWdub3JlRGljdFR5cGUgPSB7fVxuICAgIGlmIChpZ25vcmVGaWVsZE5hbWVzICE9IG51bGxcbiAgICAgICAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlnbm9yZUZpZWxkTmFtZXMpXG4gICAgICAgICAgICAuc2xpY2UoOCwgLTEpID09IFwiQXJyYXlcIikge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBpZ25vcmVGaWVsZE5hbWVzKVxuICAgICAgICAgICAgZGljdFtmaWVsZE5hbWVdID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gX2RlZXBDb3B5KGRhdGEsIGRpY3QpXG4gICAgXG59XG5cbmZ1bmN0aW9uIF9kZWVwQ29weShcbiAgICBkYXRhLFxuICAgIGlnbm9yZUZpZWxkTmFtZXM6IGlnbm9yZURpY3RUeXBlXG4pIHtcbiAgICBcbiAgICAvLyBJZiB0aGUgZGF0YSBpcyBudWxsIG9yIHVuZGVmaW5lZCB0aGVuIHdlIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICBcbiAgICAvLyBHZXQgdGhlIGRhdGEgdHlwZSBhbmQgc3RvcmUgaXRcbiAgICBjb25zdCBkYXRhVHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKVxuICAgICAgICAuc2xpY2UoOCwgLTEpXG4gICAgXG4gICAgLy8gREFURVxuICAgIGlmIChkYXRhVHlwZSA9PSBcIkRhdGVcIikge1xuICAgICAgICBjb25zdCBjbG9uZWREYXRlID0gbmV3IERhdGUoKVxuICAgICAgICBjbG9uZWREYXRlLnNldFRpbWUoZGF0YS5nZXRUaW1lKCkpXG4gICAgICAgIHJldHVybiBjbG9uZWREYXRlXG4gICAgfVxuICAgIFxuICAgIC8vIE9CSkVDVFxuICAgIGlmIChkYXRhVHlwZSA9PSBcIk9iamVjdFwiKSB7XG4gICAgICAgIGxldCBjb3BpZWRPYmplY3QgPSB7fVxuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZGF0YSkpIHtcbiAgICAgICAgICAgIGlmIChpZ25vcmVGaWVsZE5hbWVzICE9IG51bGwgJiYgaWdub3JlRmllbGROYW1lc1trZXldID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICBjb3BpZWRPYmplY3Rba2V5XSA9IF9kZWVwQ29weShkYXRhW2tleV0sIGlnbm9yZUZpZWxkTmFtZXMpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjb3BpZWRPYmplY3RcbiAgICB9XG4gICAgXG4gICAgLy8gQVJSQVlcbiAgICBpZiAoZGF0YVR5cGUgPT0gXCJBcnJheVwiKSB7XG4gICAgICAgIGxldCBjb3BpZWRBcnJheSA9IFtdXG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSlcbiAgICAgICAgICAgIGNvcGllZEFycmF5LnB1c2goX2RlZXBDb3B5KGl0ZW0sIGlnbm9yZUZpZWxkTmFtZXMpKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGNvcGllZEFycmF5XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkYXRhXG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyogQWRkIGEgaW1wb3J0cyBmb3IgdGhlc2UgcmVxdWlyZXMgKi9cbiJdfQ==