angular-xml-editor
Version:
XML editor component for Angular
324 lines (323 loc) • 37.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Subject } from 'rxjs';
import { XmlEditorDebugger } from './xmlEditorDebugger';
import { XmlCursorPosMover } from './cursor/xmlCursorPosMover.class';
import { XmlCursor } from './cursor/xmlCursor.class';
import { XmlCursorPosSetter } from './cursor/xmlCursorPosSetter.class';
import { DomDummyNodeManager } from './dummyNodes/domDummyNodeManager.class';
import { XmlDomCleaner } from './xml-editing/xmlDomCleaner.class';
import { XmlEditDelete } from './xml-editing/xmlEditDeleteclass';
import { Xml2html } from './xml-html-converter/xml2html.class';
import { XmlEditInsert } from './xml-editing/xmlEditInsert.class';
export class XmlEditorContext {
/**
* @param {?} _document
*/
constructor(_document) {
this._document = _document;
this.actualCursor = new XmlCursor();
this.dummyNodeManager = new DomDummyNodeManager();
this.actualCursorChanged = new Subject();
this.debugService = new XmlEditorDebugger();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.actualCursorChanged.unsubscribe();
}
/**
* @param {?} cursorPos
* @return {?}
*/
setCursorPos(cursorPos) {
this.actualCursor = cursorPos;
this.actualCursorChanged.next(cursorPos);
this.debugService.setActualCursorPos(cursorPos);
}
/**
* @param {?} mouseEvent
* @return {?}
*/
mouseUp(mouseEvent) {
if (window.getSelection) {
/** @type {?} */
let userSelection;
userSelection = window.getSelection();
XmlCursorPosSetter.setFromSelection(this.actualCursor.StartPos, userSelection.anchorNode, userSelection.anchorOffset, this.debugService);
XmlCursorPosSetter.setFromSelection(this.actualCursor.EndPos, userSelection.focusNode, userSelection.focusOffset, this.debugService);
this.setCursorPos(this.actualCursor);
this.actualCursor.sortStartAndEnd();
this.actualCursor.show();
}
else {
throw new Error(`can't get window.getSelection, target=${JSON.stringify(mouseEvent.target)}`);
}
}
/**
* @param {?} event
* @return {?}
*/
keyDown(event) {
console.log('keydown! key:' + event.key + ' / code:' + event.code);
switch (event.key) {
case 'Control':
this.keyCtrlIsDown = true;
break;
case 'Shift':
this.keyShiftIsDown = true;
break;
case 'c':
if (this.keyCtrlIsDown) {
// Copy
return false;
}
else {
if (this.insertText('c')) {
return false;
}
}
break;
case 'ArrowUp':
case 'ArrowDown':
return true;
case 'ArrowRight':
if (this.keyShiftIsDown) {
XmlCursorPosMover.moveRight(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlCursorPosMover.moveRight(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
this.actualCursor.StartPos.SetCursor(this.actualCursor.EndPos.ActualNode, this.actualCursor.EndPos.PosAtNode, this.actualCursor.EndPos.PosInTextnode);
}
this.actualCursor.sortStartAndEnd();
this.actualCursor.show();
this.setCursorPos(this.actualCursor);
return false;
case 'ArrowLeft':
if (this.keyShiftIsDown) {
XmlCursorPosMover.moveLeft(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlCursorPosMover.moveLeft(this.actualCursor.StartPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
this.actualCursor.EndPos.SetCursor(this.actualCursor.StartPos.ActualNode, this.actualCursor.StartPos.PosAtNode, this.actualCursor.StartPos.PosInTextnode);
}
this.actualCursor.sortStartAndEnd();
this.actualCursor.show();
this.setCursorPos(this.actualCursor);
return false;
case 'Backspace':
if (this.actualCursor.isEmptySelection()) {
XmlEditDelete.deleteBefore(this.actualCursor.StartPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlEditDelete.deleteSelection(this.actualCursor, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
this.actualCursor.EndPos.SetCursor(this.actualCursor.StartPos.ActualNode, this.actualCursor.StartPos.PosAtNode, this.actualCursor.StartPos.PosInTextnode);
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
return false;
case 'Delete':
if (this.actualCursor.isEmptySelection()) {
XmlEditDelete.deleteAfter(this.actualCursor.StartPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
else {
XmlEditDelete.deleteSelection(this.actualCursor, this.actualCursor.xmlDocumentRootNode, this.config.rules);
}
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
return false;
case 'Enter':
return false;
default:
/** @type {?} */
const textInsert = event.key;
if (this.insertText(textInsert)) {
return false;
}
break;
}
return true;
}
/**
* @param {?} event
* @return {?}
*/
keyUp(event) {
switch (event.key) {
case 'Control':
this.keyCtrlIsDown = false;
break;
case 'Shift':
this.actualCursor.sortStartAndEnd();
this.keyShiftIsDown = false;
break;
case 'ArrowLeft':
case 'ArrowRight':
this.actualCursor.show();
break;
case 'ArrowUp':
case 'ArrowDown':
case 'Backspace':
case 'Delete':
case 'Enter':
case 'Control':
case 'Shift':
break;
}
return true;
}
/**
* @param {?} text
* @return {?}
*/
pasted(text) {
alert('pasted: ' + text);
return false;
}
/**
* @return {?}
*/
copied() {
alert('copied');
return false;
}
/**
* @param {?} value
* @return {?}
*/
insertText(value) {
if (value === '' || value === null || value === undefined) {
return true;
}
/** @type {?} */
let inserted = false;
if (this.actualCursor.isEmptySelection()) {
inserted = XmlEditInsert.insertText(this.actualCursor.EndPos, value, this.actualCursor.xmlDocumentRootNode, this.config.rules, this.config.xmlSchema);
}
else {
inserted = XmlEditInsert.replaceWithText(this.actualCursor, value, this.actualCursor.xmlDocumentRootNode, this.config.rules, this.config.xmlSchema);
}
if (inserted) {
// character inserted -> move cursor right
// for (let index = 0; index < value.length; index++) {
// XmlCursorPosMover.moveRight(this.actualCursor.EndPos, this.actualCursor.xmlDocumentRootNode, this.config.rules);
// }
this.actualCursor.StartPos.SetCursor(this.actualCursor.EndPos.ActualNode, this.actualCursor.EndPos.PosAtNode, this.actualCursor.EndPos.PosInTextnode);
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
console.warn('text inserted!');
return true;
}
else {
console.warn('text NOT inserted!');
return false;
}
}
/**
* inserts a new element at the actual cursor pos
* @param {?} element
* @return {?}
*/
insertElement(element) {
/** @type {?} */
const html = new Xml2html(this.config.rules).createNewElementHtml(element);
this.domInsertHtml(html);
this.cleanUpAndUpdateDummyElements();
// this.actualCursor.show();
console.warn('element inserted!');
}
/**
* Create raw HTML
* @param {?} html HTML string
* @return {?}
*/
domInsertHtml(html) {
if (document.getSelection) {
/** @type {?} */
const range = document.getSelection().getRangeAt(0);
range.insertNode(range.createContextualFragment(html));
}
else {
throw new Error('document.getSelection not defined!');
}
this.cleanUpAndUpdateDummyElements();
this.actualCursor.show();
}
/**
* save selection when the editor is focussed out
* @return {?}
*/
saveSelection() {
if (window.getSelection) {
/** @type {?} */
const sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
this.savedSelection = sel.getRangeAt(0);
this.selectedText = sel.toString();
}
}
else if (this._document.getSelection && this._document.createRange) {
this.savedSelection = document.createRange();
}
else {
this.savedSelection = null;
}
}
/**
* restore selection when the editor is focussed in
* @return {?}
*/
restoreSelection() {
if (this.savedSelection) {
if (window.getSelection) {
/** @type {?} */
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(this.savedSelection);
return true;
}
else if (this._document.getSelection /*&& this.savedSelection.select*/) {
// this.savedSelection.select();
return true;
}
}
else {
return false;
}
}
/**
* @return {?}
*/
cleanUpAndUpdateDummyElements() {
this.dummyNodeManager.RemoveAllDummyNodes(this.actualCursor.xmlDocumentRootNode);
XmlDomCleaner.cleanUp(this.actualCursor.xmlDocumentRootNode, this.actualCursor);
this.dummyNodeManager.UpdateDummyNodes(this.actualCursor.xmlDocumentRootNode);
this.actualCursor.sortStartAndEnd();
}
}
if (false) {
/** @type {?} */
XmlEditorContext.prototype.debugService;
/** @type {?} */
XmlEditorContext.prototype.config;
/** @type {?} */
XmlEditorContext.prototype.actualCursorChanged;
/** @type {?} */
XmlEditorContext.prototype.actualCursor;
/** @type {?} */
XmlEditorContext.prototype.dummyNodeManager;
/** @type {?} */
XmlEditorContext.prototype.savedSelection;
/** @type {?} */
XmlEditorContext.prototype.selectedText;
/** @type {?} */
XmlEditorContext.prototype.keyCtrlIsDown;
/** @type {?} */
XmlEditorContext.prototype.keyShiftIsDown;
/** @type {?} */
XmlEditorContext.prototype._document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdG9yQ29udGV4dC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb2RlL3htbEVkaXRvckNvbnRleHQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUdsRSxNQUFNOzs7O0lBY0osWUFBb0IsU0FBbUI7UUFBbkIsY0FBUyxHQUFULFNBQVMsQ0FBVTs0QkFUeEIsSUFBSSxTQUFTLEVBQUU7Z0NBQ1gsSUFBSSxtQkFBbUIsRUFBRTtRQVMxQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztLQUM3Qzs7OztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDeEM7Ozs7O0lBRUQsWUFBWSxDQUFDLFNBQW9CO1FBQy9CLElBQUks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QUFjLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzlDO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM1QjtLQUNGOzs7OztJQUtELGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUU7O2dCQUN2QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2xDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksb0NBQW9DOztnQkFFeEUsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7Ozs7SUFFRCw2QkFBNkI7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqRixhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztLQUNyQztDQWdCRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgWG1sUnVsZUVsZW1lbnQgfSBmcm9tICcuL3htbC1ydWxlcy1jaGVjay94bWxSdWxlRWxlbWVudC5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbEVkaXRvckNvbmZpZyB9IGZyb20gJy4veG1sRWRpdG9yQ29uZmlnJztcclxuaW1wb3J0IHsgWG1sRWRpdG9yRGVidWdnZXIgfSBmcm9tICcuL3htbEVkaXRvckRlYnVnZ2VyJztcclxuaW1wb3J0IHsgWG1sQ3Vyc29yUG9zTW92ZXIgfSBmcm9tICcuL2N1cnNvci94bWxDdXJzb3JQb3NNb3Zlci5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbEN1cnNvciB9IGZyb20gJy4vY3Vyc29yL3htbEN1cnNvci5jbGFzcyc7XHJcbmltcG9ydCB7IE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBYbWxDdXJzb3JQb3NTZXR0ZXIgfSBmcm9tICcuL2N1cnNvci94bWxDdXJzb3JQb3NTZXR0ZXIuY2xhc3MnO1xyXG5pbXBvcnQgeyBEb21EdW1teU5vZGVNYW5hZ2VyIH0gZnJvbSAnLi9kdW1teU5vZGVzL2RvbUR1bW15Tm9kZU1hbmFnZXIuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxEb21DbGVhbmVyIH0gZnJvbSAnLi94bWwtZWRpdGluZy94bWxEb21DbGVhbmVyLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sRWRpdERlbGV0ZSB9IGZyb20gJy4veG1sLWVkaXRpbmcveG1sRWRpdERlbGV0ZWNsYXNzJztcclxuaW1wb3J0IHsgWG1sMmh0bWwgfSBmcm9tICcuL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcbmltcG9ydCB7IFRvdWNoU2VxdWVuY2UgfSBmcm9tICdzZWxlbml1bS13ZWJkcml2ZXInO1xyXG5pbXBvcnQgeyBYbWxFZGl0SW5zZXJ0IH0gZnJvbSAnLi94bWwtZWRpdGluZy94bWxFZGl0SW5zZXJ0LmNsYXNzJztcclxuaW1wb3J0IHsgZGVidWcgfSBmcm9tICd1dGlsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBYbWxFZGl0b3JDb250ZXh0IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwdWJsaWMgZGVidWdTZXJ2aWNlOiBYbWxFZGl0b3JEZWJ1Z2dlcjtcclxuICBwdWJsaWMgY29uZmlnOiBYbWxFZGl0b3JDb25maWc7XHJcblxyXG4gIGFjdHVhbEN1cnNvckNoYW5nZWQ6IFN1YmplY3Q8WG1sQ3Vyc29yPjtcclxuICBhY3R1YWxDdXJzb3IgPSBuZXcgWG1sQ3Vyc29yKCk7XHJcbiAgZHVtbXlOb2RlTWFuYWdlciA9IG5ldyBEb21EdW1teU5vZGVNYW5hZ2VyKCk7XHJcblxyXG4gIHNhdmVkU2VsZWN0aW9uOiBSYW5nZSB8IG51bGw7XHJcbiAgc2VsZWN0ZWRUZXh0OiBzdHJpbmc7XHJcblxyXG4gIGtleUN0cmxJc0Rvd246IGJvb2xlYW47XHJcbiAga2V5U2hpZnRJc0Rvd246IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCkge1xyXG4gICAgdGhpcy5hY3R1YWxDdXJzb3JDaGFuZ2VkID0gbmV3IFN1YmplY3Q8WG1sQ3Vyc29yPigpO1xyXG4gICAgdGhpcy5kZWJ1Z1NlcnZpY2UgPSBuZXcgWG1sRWRpdG9yRGVidWdnZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3R1YWxDdXJzb3JDaGFuZ2VkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRDdXJzb3JQb3MoY3Vyc29yUG9zOiBYbWxDdXJzb3IpIHtcclxuICAgIHRoaXMuYWN0dWFsQ3Vyc29yID0gY3Vyc29yUG9zO1xyXG4gICAgdGhpcy5hY3R1YWxDdXJzb3JDaGFuZ2VkLm5leHQoY3Vyc29yUG9zKTtcclxuICAgIHRoaXMuZGVidWdTZXJ2aWNlLnNldEFjdHVhbEN1cnNvclBvcyhjdXJzb3JQb3MpO1xyXG4gIH1cclxuXHJcbiAgLy8gLyoqXHJcbiAgLy8gICAqIEV4ZWN1dGVkIGNvbW1hbmQgZnJvbSBlZGl0b3IgaGVhZGVyIGJ1dHRvbnNcclxuICAvLyAgICogQHBhcmFtIGNvbW1hbmQgc3RyaW5nIGZyb20gdHJpZ2dlckNvbW1hbmRcclxuICAvLyAgICovXHJcbiAgLy8gZXhlY3V0ZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKSB7XHJcbiAgLy8gICBpZiAoY29tbWFuZCAhPT0gJycpIHtcclxuICAvLyAgICAgdGhpcy5jb21tYW5kZXIuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7XHJcbiAgLy8gICAgIHRoaXMuZXhlYygpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy5vbkVkaXRvckZvY3VzKCk7XHJcbiAgLy8gICBjb25zdCBjbGVhblVwRmlyc3QgPSBmYWxzZTtcclxuICAvLyAgIHRoaXMuZG9tRHVtbXlOb2RlTWFuYWdlci5VcGRhdGVEdW1teU5vZGVzKHRoaXMueG1sRG9jdW1lbnRSb290Tm9kZSwgY2xlYW5VcEZpcnN0KTtcclxuICAvLyAgIHJldHVybjtcclxuICAvLyB9XHJcblxyXG4gIG1vdXNlVXAobW91c2VFdmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcclxuICAgICAgbGV0IHVzZXJTZWxlY3Rpb246IFNlbGVjdGlvbjtcclxuICAgICAgdXNlclNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgWG1sQ3Vyc29yUG9zU2V0dGVyLnNldEZyb21TZWxlY3Rpb24odGhpcy5hY3R1YWxDdXJzb3IuU3RhcnRQb3MsIHVzZXJTZWxlY3Rpb24uYW5jaG9yTm9kZSwgdXNlclNlbGVjdGlvbi5hbmNob3JPZmZzZXQsIHRoaXMuZGVidWdTZXJ2aWNlKTtcclxuICAgICAgWG1sQ3Vyc29yUG9zU2V0dGVyLnNldEZyb21TZWxlY3Rpb24odGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLCB1c2VyU2VsZWN0aW9uLmZvY3VzTm9kZSwgdXNlclNlbGVjdGlvbi5mb2N1c09mZnNldCwgdGhpcy5kZWJ1Z1NlcnZpY2UpO1xyXG4gICAgICB0aGlzLnNldEN1cnNvclBvcyh0aGlzLmFjdHVhbEN1cnNvcik7XHJcbiAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNvcnRTdGFydEFuZEVuZCgpO1xyXG4gICAgICB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IGdldCB3aW5kb3cuZ2V0U2VsZWN0aW9uLCB0YXJnZXQ9JHtKU09OLnN0cmluZ2lmeShtb3VzZUV2ZW50LnRhcmdldCl9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBrZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICBjb25zb2xlLmxvZygna2V5ZG93biEga2V5OicgKyBldmVudC5rZXkgKyAnIC8gY29kZTonICsgZXZlbnQuY29kZSk7XHJcblxyXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgY2FzZSAnQ29udHJvbCc6XHJcbiAgICAgICAgdGhpcy5rZXlDdHJsSXNEb3duID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ1NoaWZ0JzpcclxuICAgICAgICB0aGlzLmtleVNoaWZ0SXNEb3duID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2MnOlxyXG4gICAgICAgIGlmICh0aGlzLmtleUN0cmxJc0Rvd24pIHtcclxuICAgICAgICAgIC8vIENvcHlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMuaW5zZXJ0VGV4dCgnYycpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxyXG4gICAgICAgIGlmICh0aGlzLmtleVNoaWZ0SXNEb3duKSB7XHJcbiAgICAgICAgICBYbWxDdXJzb3JQb3NNb3Zlci5tb3ZlUmlnaHQodGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIFhtbEN1cnNvclBvc01vdmVyLm1vdmVSaWdodCh0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MsIHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIHRoaXMuY29uZmlnLnJ1bGVzKTtcclxuICAgICAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLlNldEN1cnNvcih0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuQWN0dWFsTm9kZSwgdGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLlBvc0F0Tm9kZSwgdGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLlBvc0luVGV4dG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zb3J0U3RhcnRBbmRFbmQoKTtcclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5zZXRDdXJzb3JQb3ModGhpcy5hY3R1YWxDdXJzb3IpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgaWYgKHRoaXMua2V5U2hpZnRJc0Rvd24pIHtcclxuICAgICAgICAgIFhtbEN1cnNvclBvc01vdmVyLm1vdmVMZWZ0KHRoaXMuYWN0dWFsQ3Vyc29yLkVuZFBvcywgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBYbWxDdXJzb3JQb3NNb3Zlci5tb3ZlTGVmdCh0aGlzLmFjdHVhbEN1cnNvci5TdGFydFBvcywgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMpO1xyXG4gICAgICAgICAgdGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLlNldEN1cnNvcih0aGlzLmFjdHVhbEN1cnNvci5TdGFydFBvcy5BY3R1YWxOb2RlLCB0aGlzLmFjdHVhbEN1cnNvci5TdGFydFBvcy5Qb3NBdE5vZGUsIHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLlBvc0luVGV4dG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zb3J0U3RhcnRBbmRFbmQoKTtcclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgICAgICAgdGhpcy5zZXRDdXJzb3JQb3ModGhpcy5hY3R1YWxDdXJzb3IpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0dWFsQ3Vyc29yLmlzRW1wdHlTZWxlY3Rpb24oKSkge1xyXG4gICAgICAgICAgWG1sRWRpdERlbGV0ZS5kZWxldGVCZWZvcmUodGhpcy5hY3R1YWxDdXJzb3IuU3RhcnRQb3MsIHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIHRoaXMuY29uZmlnLnJ1bGVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgWG1sRWRpdERlbGV0ZS5kZWxldGVTZWxlY3Rpb24odGhpcy5hY3R1YWxDdXJzb3IsIHRoaXMuYWN0dWFsQ3Vyc29yLnhtbERvY3VtZW50Um9vdE5vZGUsIHRoaXMuY29uZmlnLnJ1bGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLlNldEN1cnNvcih0aGlzLmFjdHVhbEN1cnNvci5TdGFydFBvcy5BY3R1YWxOb2RlLCB0aGlzLmFjdHVhbEN1cnNvci5TdGFydFBvcy5Qb3NBdE5vZGUsIHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLlBvc0luVGV4dG5vZGUpO1xyXG4gICAgICAgIHRoaXMuY2xlYW5VcEFuZFVwZGF0ZUR1bW15RWxlbWVudHMoKTtcclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgY2FzZSAnRGVsZXRlJzpcclxuICAgICAgICBpZiAodGhpcy5hY3R1YWxDdXJzb3IuaXNFbXB0eVNlbGVjdGlvbigpKSB7XHJcbiAgICAgICAgICBYbWxFZGl0RGVsZXRlLmRlbGV0ZUFmdGVyKHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIFhtbEVkaXREZWxldGUuZGVsZXRlU2VsZWN0aW9uKHRoaXMuYWN0dWFsQ3Vyc29yLCB0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmNvbmZpZy5ydWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2xlYW5VcEFuZFVwZGF0ZUR1bW15RWxlbWVudHMoKTtcclxuICAgICAgICB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc3QgdGV4dEluc2VydCA9IGV2ZW50LmtleTtcclxuICAgICAgICBpZiAodGhpcy5pbnNlcnRUZXh0KHRleHRJbnNlcnQpKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAga2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgIGNhc2UgJ0NvbnRyb2wnOlxyXG4gICAgICAgIHRoaXMua2V5Q3RybElzRG93biA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdTaGlmdCc6XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDdXJzb3Iuc29ydFN0YXJ0QW5kRW5kKCk7XHJcbiAgICAgICAgdGhpcy5rZXlTaGlmdElzRG93biA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDdXJzb3Iuc2hvdygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XHJcbiAgICAgIGNhc2UgJ0RlbGV0ZSc6XHJcbiAgICAgIGNhc2UgJ0VudGVyJzpcclxuICAgICAgY2FzZSAnQ29udHJvbCc6XHJcbiAgICAgIGNhc2UgJ1NoaWZ0JzpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHBhc3RlZCh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGFsZXJ0KCdwYXN0ZWQ6ICcgKyB0ZXh0KTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvcGllZCgpOiBib29sZWFuIHtcclxuICAgIGFsZXJ0KCdjb3BpZWQnKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGluc2VydFRleHQodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpbnNlcnRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLmFjdHVhbEN1cnNvci5pc0VtcHR5U2VsZWN0aW9uKCkpIHtcclxuICAgICAgaW5zZXJ0ZWQgPSBYbWxFZGl0SW5zZXJ0Lmluc2VydFRleHQodGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLCB2YWx1ZSwgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMsIHRoaXMuY29uZmlnLnhtbFNjaGVtYSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbnNlcnRlZCA9IFhtbEVkaXRJbnNlcnQucmVwbGFjZVdpdGhUZXh0KHRoaXMuYWN0dWFsQ3Vyc29yLCB2YWx1ZSwgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMsIHRoaXMuY29uZmlnLnhtbFNjaGVtYSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGluc2VydGVkKSB7XHJcbiAgICAgIC8vIGNoYXJhY3RlciBpbnNlcnRlZCAtPiBtb3ZlIGN1cnNvciByaWdodFxyXG4gICAgICAvLyBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIC8vICAgWG1sQ3Vyc29yUG9zTW92ZXIubW92ZVJpZ2h0KHRoaXMuYWN0dWFsQ3Vyc29yLkVuZFBvcywgdGhpcy5hY3R1YWxDdXJzb3IueG1sRG9jdW1lbnRSb290Tm9kZSwgdGhpcy5jb25maWcucnVsZXMpO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLlN0YXJ0UG9zLlNldEN1cnNvcih0aGlzLmFjdHVhbEN1cnNvci5FbmRQb3MuQWN0dWFsTm9kZSwgdGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLlBvc0F0Tm9kZSwgdGhpcy5hY3R1YWxDdXJzb3IuRW5kUG9zLlBvc0luVGV4dG5vZGUpO1xyXG4gICAgICB0aGlzLmNsZWFuVXBBbmRVcGRhdGVEdW1teUVsZW1lbnRzKCk7XHJcbiAgICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNob3coKTtcclxuICAgICAgY29uc29sZS53YXJuKCd0ZXh0IGluc2VydGVkIScpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybigndGV4dCBOT1QgaW5zZXJ0ZWQhJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBpbnNlcnRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIGFjdHVhbCBjdXJzb3IgcG9zICovXHJcbiAgaW5zZXJ0RWxlbWVudChlbGVtZW50OiBYbWxSdWxlRWxlbWVudCkge1xyXG4gICAgY29uc3QgaHRtbCA9IG5ldyBYbWwyaHRtbCh0aGlzLmNvbmZpZy5ydWxlcykuY3JlYXRlTmV3RWxlbWVudEh0bWwoZWxlbWVudCk7XHJcbiAgICB0aGlzLmRvbUluc2VydEh0bWwoaHRtbCk7XHJcbiAgICB0aGlzLmNsZWFuVXBBbmRVcGRhdGVEdW1teUVsZW1lbnRzKCk7XHJcbiAgICAvLyB0aGlzLmFjdHVhbEN1cnNvci5zaG93KCk7XHJcbiAgICBjb25zb2xlLndhcm4oJ2VsZW1lbnQgaW5zZXJ0ZWQhJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgcmF3IEhUTUxcclxuICAgKiBAcGFyYW0gaHRtbCBIVE1MIHN0cmluZ1xyXG4gICAqL1xyXG4gIHB1YmxpYyBkb21JbnNlcnRIdG1sKGh0bWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbikge1xyXG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgIHJhbmdlLmluc2VydE5vZGUocmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZG9jdW1lbnQuZ2V0U2VsZWN0aW9uIG5vdCBkZWZpbmVkIScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbGVhblVwQW5kVXBkYXRlRHVtbXlFbGVtZW50cygpO1xyXG4gICAgdGhpcy5hY3R1YWxDdXJzb3Iuc2hvdygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogc2F2ZSBzZWxlY3Rpb24gd2hlbiB0aGUgZWRpdG9yIGlzIGZvY3Vzc2VkIG91dFxyXG4gICAqL1xyXG4gIHNhdmVTZWxlY3Rpb24oKTogYW55IHtcclxuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgaWYgKHNlbC5nZXRSYW5nZUF0ICYmIHNlbC5yYW5nZUNvdW50KSB7XHJcbiAgICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IHNlbC5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gc2VsLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5fZG9jdW1lbnQuZ2V0U2VsZWN0aW9uICYmIHRoaXMuX2RvY3VtZW50LmNyZWF0ZVJhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiByZXN0b3JlIHNlbGVjdGlvbiB3aGVuIHRoZSBlZGl0b3IgaXMgZm9jdXNzZWQgaW5cclxuICAgKi9cclxuICByZXN0b3JlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuc2F2ZWRTZWxlY3Rpb24pIHtcclxuICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIHNlbC5hZGRSYW5nZSh0aGlzLnNhdmVkU2VsZWN0aW9uKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9kb2N1bWVudC5nZXRTZWxlY3Rpb24gLyomJiB0aGlzLnNhdmVkU2VsZWN0aW9uLnNlbGVjdCovKSB7XHJcbiAgICAgICAgLy8gdGhpcy5zYXZlZFNlbGVjdGlvbi5zZWxlY3QoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYW5VcEFuZFVwZGF0ZUR1bW15RWxlbWVudHMoKSB7XHJcbiAgICB0aGlzLmR1bW15Tm9kZU1hbmFnZXIuUmVtb3ZlQWxsRHVtbXlOb2Rlcyh0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlKTtcclxuICAgIFhtbERvbUNsZWFuZXIuY2xlYW5VcCh0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlLCB0aGlzLmFjdHVhbEN1cnNvcik7XHJcbiAgICB0aGlzLmR1bW15Tm9kZU1hbmFnZXIuVXBkYXRlRHVtbXlOb2Rlcyh0aGlzLmFjdHVhbEN1cnNvci54bWxEb2N1bWVudFJvb3ROb2RlKTtcclxuICAgIHRoaXMuYWN0dWFsQ3Vyc29yLnNvcnRTdGFydEFuZEVuZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gLyoqIGNoZWNrIGFueSBzbGVjdGlvbiBpcyBtYWRlIG9yIG5vdCAqL1xyXG4gIC8vIHByaXZhdGUgY2hlY2tTZWxlY3Rpb24oKTogYW55IHtcclxuICAvLyAgIGNvbnN0IHNsZWN0ZWRUZXh0ID0gdGhpcy5zYXZlZFNlbGVjdGlvbi50b1N0cmluZygpO1xyXG5cclxuICAvLyAgIGlmIChzbGVjdGVkVGV4dC5sZW5ndGggPT09IDApIHtcclxuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTZWxlY3Rpb24gTWFkZScpO1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIHJldHVybiB0cnVlO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0RGVmYXVsdFBhcmFncmFwaFNlcGFyYXRvcihzZXBhcmF0b3I6IHN0cmluZykge1xyXG4gIC8vICAgdGhpcy5fZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2RlZmF1bHRQYXJhZ3JhcGhTZXBhcmF0b3InLCBmYWxzZSwgc2VwYXJhdG9yKTtcclxuICAvLyB9XHJcbn1cclxuIl19