angular-xml-editor
Version:
XML editor component for Angular
165 lines (164 loc) • 18.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { XMLCursorPositions } from '../cursor/xmlCursorPos.class';
import { XmlEditRuleCheckTextInsert } from '../xml-rules-check/xmlEditRuleCheckTextInsert.class';
import { XmlEditDelete } from './xmlEditDeleteclass';
import { DomDummyNodeManager } from '../dummyNodes/domDummyNodeManager.class';
var XmlEditInsert = /** @class */ (function () {
function XmlEditInsert() {
}
/**
* @param {?} pos
* @param {?} value
* @param {?} rootNode
* @param {?} xmlRules
* @param {?} xmlSchema
* @return {?}
*/
XmlEditInsert.replaceWithText = /**
* @param {?} pos
* @param {?} value
* @param {?} rootNode
* @param {?} xmlRules
* @param {?} xmlSchema
* @return {?}
*/
function (pos, value, rootNode, xmlRules, xmlSchema) {
if (pos === undefined) {
return false;
}
if (value === '' || value === undefined || value == null) {
return false;
}
if (pos.isEmptySelection() === false) {
if (XmlEditDelete.deleteSelection(pos, rootNode, xmlRules) === false) {
return false;
}
}
return XmlEditInsert.insertText(pos.EndPos, value, rootNode, xmlRules, xmlSchema);
};
/**
* @param {?} pos
* @param {?} value
* @param {?} rootNode
* @param {?} xmlRules
* @param {?} xmlSchema
* @return {?}
*/
XmlEditInsert.insertText = /**
* @param {?} pos
* @param {?} value
* @param {?} rootNode
* @param {?} xmlRules
* @param {?} xmlSchema
* @return {?}
*/
function (pos, value, rootNode, xmlRules, xmlSchema) {
if (pos === undefined) {
return false;
}
if (value === '' || value === undefined || value == null) {
return false;
}
switch (pos.PosAtNode) {
case XMLCursorPositions.CursorOnCompleteNode:
/** @type {?} */
var textAllowed = XmlEditInsert.isTextAllowedInParentNode(pos, xmlSchema);
if (textAllowed === true) {
/** @type {?} */
var newTextNode = pos.ActualNode.ownerDocument.createTextNode(value);
pos.ActualNode.parentElement.insertBefore(newTextNode, pos.ActualNode);
pos.ActualNode.parentElement.removeChild(pos.ActualNode);
/** @type {?} */
var nextSibling = DomDummyNodeManager.getNextSibling(newTextNode);
if (nextSibling) {
pos.SetCursor(nextSibling, XMLCursorPositions.CursorInFrontOfNode);
}
else {
pos.SetCursor(newTextNode, XMLCursorPositions.CursorBehindNode);
}
return true;
}
else {
return false;
}
case XMLCursorPositions.CursorBehindNode:
if (pos.ActualNode.nodeType === Node.TEXT_NODE) {
pos.ActualNode.textContent = pos.ActualNode.textContent + value;
return true;
}
else {
textAllowed = XmlEditInsert.isTextAllowedInParentNode(pos, xmlSchema);
if (textAllowed === true) {
/** @type {?} */
var newTextNode = pos.ActualNode.ownerDocument.createTextNode(value);
pos.ActualNode.parentElement.insertBefore(newTextNode, pos.ActualNode.nextSibling); // inserts the new node after the actual node
return true;
}
else {
return false;
}
}
case XMLCursorPositions.CursorInFrontOfNode:
if (pos.ActualNode.nodeType === Node.TEXT_NODE) {
pos.ActualNode.textContent = value + pos.ActualNode.textContent;
return true;
}
else {
textAllowed = XmlEditInsert.isTextAllowedInParentNode(pos, xmlSchema);
if (textAllowed === true) {
/** @type {?} */
var newTextNode = pos.ActualNode.ownerDocument.createTextNode(value);
pos.ActualNode.parentElement.insertBefore(newTextNode, pos.ActualNode);
return true;
}
else {
return false;
}
}
case XMLCursorPositions.CursorInEmptyNode:
textAllowed = new XmlEditRuleCheckTextInsert(xmlSchema.xsdNodes).isTextAllowedAtThisCursorPos(pos);
if (textAllowed === true) {
/** @type {?} */
var newTextNode = pos.ActualNode.ownerDocument.createTextNode(value);
pos.ActualNode.appendChild(newTextNode);
return true;
}
else {
return false;
}
case XMLCursorPositions.CursorInsideTextNode:
/** @type {?} */
var text = pos.ActualNode.textContent;
pos.ActualNode.textContent = text.substr(0, pos.PosInTextnode) + value + text.substr(pos.PosInTextnode, text.length);
pos.SetCursor(pos.ActualNode, XMLCursorPositions.CursorInsideTextNode, pos.PosInTextnode + 1);
break;
default:
throw new Error("String.Format(\"XmlEditInsert.insert: unknown CursorPos " + pos.getDebugDescription());
}
return true;
};
/**
* @param {?} pos
* @param {?} xmlSchema
* @return {?}
*/
XmlEditInsert.isTextAllowedInParentNode = /**
* @param {?} pos
* @param {?} xmlSchema
* @return {?}
*/
function (pos, xmlSchema) {
/** @type {?} */
var parentNode = pos.ActualNode.parentElement;
/** @type {?} */
var parentCursorPos = pos.clone();
parentCursorPos.SetCursor(parentNode, XMLCursorPositions.CursorInEmptyNode);
return new XmlEditRuleCheckTextInsert(xmlSchema.xsdNodes).isTextAllowedAtThisCursorPos(parentCursorPos);
};
return XmlEditInsert;
}());
export { XmlEditInsert };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdEluc2VydC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb2RlL3htbC1lZGl0aW5nL3htbEVkaXRJbnNlcnQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVoRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUVqRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUUsSUFBQTs7Ozs7Ozs7Ozs7SUFDZ0IsNkJBQWU7Ozs7Ozs7O2NBQUMsR0FBYyxFQUFFLEtBQWEsRUFBRSxRQUFpQixFQUFFLFFBQWtCLEVBQUUsU0FBb0I7UUFDdEgsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3hELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUNwQyxJQUFJLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0JBQ3BFLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUVELE9BQU8sYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBR3RFLHdCQUFVOzs7Ozs7OztjQUFDLEdBQWlCLEVBQUUsS0FBYSxFQUFFLFFB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QzNHO1FBRUQsT0FBTyxJQUFJLENBQUM7Ozs7Ozs7SUFHQyx1Q0FBeUI7Ozs7O2NBQUMsR0FBaUIsRUFBRSxTQUFvQjs7UUFDOUUsSUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7O1FBQ2hELElBQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxlQUFlLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsNEJBQTRCLENBQUMsZUFBZSxDQUFDLENBQUM7O3dCQTlHNUc7SUFnSEMsQ0FBQTtBQXhHRCx5QkF3R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWxDdXJzb3JQb3MsIFhNTEN1cnNvclBvc2l0aW9ucyB9IGZyb20gJy4uL2N1cnNvci94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxSdWxlcyB9IGZyb20gJy4uL3htbC1ydWxlcy1jaGVjay94bWxSdWxlcy5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbEVkaXRSdWxlQ2hlY2tUZXh0SW5zZXJ0IH0gZnJvbSAnLi4veG1sLXJ1bGVzLWNoZWNrL3htbEVkaXRSdWxlQ2hlY2tUZXh0SW5zZXJ0LmNsYXNzJztcclxuaW1wb3J0IHsgWG1sU2NoZW1hIH0gZnJvbSAnLi4veG1sLXJ1bGVzLWNoZWNrL3htbFNjaGVtYS5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbEVkaXREZWxldGUgfSBmcm9tICcuL3htbEVkaXREZWxldGVjbGFzcyc7XHJcbmltcG9ydCB7IFhtbEN1cnNvciB9IGZyb20gJy4uL2N1cnNvci94bWxDdXJzb3IuY2xhc3MnO1xyXG5pbXBvcnQgeyBEb21EdW1teU5vZGVNYW5hZ2VyIH0gZnJvbSAnLi4vZHVtbXlOb2Rlcy9kb21EdW1teU5vZGVNYW5hZ2VyLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBYbWxFZGl0SW5zZXJ0IHtcclxuICBwdWJsaWMgc3RhdGljIHJlcGxhY2VXaXRoVGV4dChwb3M6IFhtbEN1cnNvciwgdmFsdWU6IHN0cmluZywgcm9vdE5vZGU6IEVsZW1lbnQsIHhtbFJ1bGVzOiBYbWxSdWxlcywgeG1sU2NoZW1hOiBYbWxTY2hlbWEpOiBib29sZWFuIHtcclxuICAgIGlmIChwb3MgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBvcy5pc0VtcHR5U2VsZWN0aW9uKCkgPT09IGZhbHNlKSB7XHJcbiAgICAgIGlmIChYbWxFZGl0RGVsZXRlLmRlbGV0ZVNlbGVjdGlvbihwb3MsIHJvb3ROb2RlLCB4bWxSdWxlcykgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFhtbEVkaXRJbnNlcnQuaW5zZXJ0VGV4dChwb3MuRW5kUG9zLCB2YWx1ZSwgcm9vdE5vZGUsIHhtbFJ1bGVzLCB4bWxTY2hlbWEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBpbnNlcnRUZXh0KHBvczogWG1sQ3Vyc29yUG9zLCB2YWx1ZTogc3RyaW5nLCByb290Tm9kZTogRWxlbWVudCwgeG1sUnVsZXM6IFhtbFJ1bGVzLCB4bWxTY2hlbWE6IFhtbFNjaGVtYSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHBvcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChwb3MuUG9zQXROb2RlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvck9uQ29tcGxldGVOb2RlOlxyXG4gICAgICAgIGxldCB0ZXh0QWxsb3dlZCA9IFhtbEVkaXRJbnNlcnQuaXNUZXh0QWxsb3dlZEluUGFyZW50Tm9kZShwb3MsIHhtbFNjaGVtYSk7XHJcbiAgICAgICAgaWYgKHRleHRBbGxvd2VkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdUZXh0Tm9kZSA9IHBvcy5BY3R1YWxOb2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xyXG4gICAgICAgICAgcG9zLkFjdHVhbE5vZGUucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUobmV3VGV4dE5vZGUsIHBvcy5BY3R1YWxOb2RlKTtcclxuICAgICAgICAgIHBvcy5BY3R1YWxOb2RlLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocG9zLkFjdHVhbE5vZGUpO1xyXG4gICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBEb21EdW1teU5vZGVNYW5hZ2VyLmdldE5leHRTaWJsaW5nKG5ld1RleHROb2RlKTtcclxuICAgICAgICAgIGlmIChuZXh0U2libGluZykge1xyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKG5leHRTaWJsaW5nLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwb3MuU2V0Q3Vyc29yKG5ld1RleHROb2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckJlaGluZE5vZGU6XHJcbiAgICAgICAgaWYgKHBvcy5BY3R1YWxOb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgcG9zLkFjdHVhbE5vZGUudGV4dENvbnRlbnQgPSBwb3MuQWN0dWFsTm9kZS50ZXh0Q29udGVudCArIHZhbHVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRleHRBbGxvd2VkID0gWG1sRWRpdEluc2VydC5pc1RleHRBbGxvd2VkSW5QYXJlbnROb2RlKHBvcywgeG1sU2NoZW1hKTtcclxuICAgICAgICAgIGlmICh0ZXh0QWxsb3dlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdUZXh0Tm9kZSA9IHBvcy5BY3R1YWxOb2RlLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xyXG4gICAgICAgICAgICBwb3MuQWN0dWFsTm9kZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShuZXdUZXh0Tm9kZSwgcG9zLkFjdHVhbE5vZGUubmV4dFNpYmxpbmcpOyAvLyBpbnNlcnRzIHRoZSBuZXcgbm9kZSBhZnRlciB0aGUgYWN0dWFsIG5vZGVcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZTpcclxuICAgICAgICBpZiAocG9zLkFjdHVhbE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICBwb3MuQWN0dWFsTm9kZS50ZXh0Q29udGVudCA9IHZhbHVlICsgcG9zLkFjdHVhbE5vZGUudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGV4dEFsbG93ZWQgPSBYbWxFZGl0SW5zZXJ0LmlzVGV4dEFsbG93ZWRJblBhcmVudE5vZGUocG9zLCB4bWxTY2hlbWEpO1xyXG4gICAgICAgICAgaWYgKHRleHRBbGxvd2VkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1RleHROb2RlID0gcG9zLkFjdHVhbE5vZGUub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgIHBvcy5BY3R1YWxOb2RlLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5ld1RleHROb2RlLCBwb3MuQWN0dWFsTm9kZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlOlxyXG4gICAgICAgIHRleHRBbGxvd2VkID0gbmV3IFhtbEVkaXRSdWxlQ2hlY2tUZXh0SW5zZXJ0KHhtbFNjaGVtYS54c2ROb2RlcykuaXNUZXh0QWxsb3dlZEF0VGhpc0N1cnNvclBvcyhwb3MpO1xyXG4gICAgICAgIGlmICh0ZXh0QWxsb3dlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgY29uc3QgbmV3VGV4dE5vZGUgPSBwb3MuQWN0dWFsTm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTtcclxuICAgICAgICAgIHBvcy5BY3R1YWxOb2RlLmFwcGVuZENoaWxkKG5ld1RleHROb2RlKTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5zaWRlVGV4dE5vZGU6XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IHBvcy5BY3R1YWxOb2RlLnRleHRDb250ZW50O1xyXG4gICAgICAgIHBvcy5BY3R1YWxOb2RlLnRleHRDb250ZW50ID0gdGV4dC5zdWJzdHIoMCwgcG9zLlBvc0luVGV4dG5vZGUpICsgdmFsdWUgKyB0ZXh0LnN1YnN0cihwb3MuUG9zSW5UZXh0bm9kZSwgdGV4dC5sZW5ndGgpO1xyXG4gICAgICAgIHBvcy5TZXRDdXJzb3IocG9zLkFjdHVhbE5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbnNpZGVUZXh0Tm9kZSwgcG9zLlBvc0luVGV4dG5vZGUgKyAxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcuRm9ybWF0KFwiWG1sRWRpdEluc2VydC5pbnNlcnQ6IHVua25vd24gQ3Vyc29yUG9zICAke3Bvcy5nZXREZWJ1Z0Rlc2NyaXB0aW9uKCl9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBpc1RleHRBbGxvd2VkSW5QYXJlbnROb2RlKHBvczogWG1sQ3Vyc29yUG9zLCB4bWxTY2hlbWE6IFhtbFNjaGVtYSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IHBvcy5BY3R1YWxOb2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBjb25zdCBwYXJlbnRDdXJzb3JQb3MgPSBwb3MuY2xvbmUoKTtcclxuICAgIHBhcmVudEN1cnNvclBvcy5TZXRDdXJzb3IocGFyZW50Tm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlKTtcclxuICAgIHJldHVybiBuZXcgWG1sRWRpdFJ1bGVDaGVja1RleHRJbnNlcnQoeG1sU2NoZW1hLnhzZE5vZGVzKS5pc1RleHRBbGxvd2VkQXRUaGlzQ3Vyc29yUG9zKHBhcmVudEN1cnNvclBvcyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==