UNPKG

angular-xml-editor

Version:
324 lines (323 loc) 37.6 kB
/** * @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