rapid-text-editor 1.0.14 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -208,7 +208,7 @@ export class RapidTextEditorComponent {
|
|
|
208
208
|
}
|
|
209
209
|
// Handle drop event in the editor
|
|
210
210
|
drop(event) {
|
|
211
|
-
event.preventDefault();
|
|
211
|
+
// event.preventDefault();
|
|
212
212
|
}
|
|
213
213
|
removeImage(index) {
|
|
214
214
|
this.uploadedImages.splice(index, 1);
|
|
@@ -622,4 +622,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
622
622
|
type: ViewChild,
|
|
623
623
|
args: ['tableDialog']
|
|
624
624
|
}] } });
|
|
625
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFwaWQtdGV4dC1lZGl0b3Ivc3JjL2xpYi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9yYXBpZC10ZXh0LWVkaXRvci9zcmMvbGliL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQTBCLFVBQVUsRUFBRSxZQUFZLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBRWhNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZXpFLE1BQU0sT0FBTyx3QkFBd0I7SUFlbkMsWUFBb0IsTUFBaUIsRUFBVSxFQUFjLEVBQVUsUUFBbUIsRUFBVSxLQUFpQjtRQUFqRyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBYjVHLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLFdBQU0sR0FBVyxNQUFNLENBQUM7UUFDeEIsVUFBSyxHQUFXLE1BQU0sQ0FBQztRQUN0QixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFHN0Msa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDbkMsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUNqQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQW1F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LCBPdXRwdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkNoYW5nZXMsIFRlbXBsYXRlUmVmLCBmb3J3YXJkUmVmLCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyYXBpZC10ZXh0LWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFwaWRUZXh0RWRpdG9yQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbiAgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYXBpZFRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50Q2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gXCJhdXRvXCI7XHJcbiAgQElucHV0KCkgd2lkdGg6IHN0cmluZyA9IFwiYXV0b1wiO1xyXG4gIEBPdXRwdXQoKSBjb250ZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJsZURpYWxvZycpIHRhYmxlRGlhbG9nITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIGVkaXRvckNvbnRlbnQ6IHN0cmluZyA9ICcnO1xyXG4gIHJvd3M6IG51bWJlciA9IDE7XHJcbiAgY29sczogbnVtYmVyID0gMTtcclxuICBncmlkID0gQXJyYXkoNDkpLmZpbGwoMCk7XHJcbiAgTWF0aCA9IE1hdGg7XHJcbiAgdXBsb2FkZWRJbWFnZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgY29uc29sZS5sb2coJ0J1aWxkIC0xJylcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NvbnRlbnQgY2FwdHVyZSBpcyBlbmFibGVkLicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NvbnRlbnQgY2FwdHVyZSBpcyBkaXNhYmxlZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydoZWlnaHQnXSB8fCBjaGFuZ2VzWyd3aWR0aCddKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEaW1lbnNpb25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5RGltZW5zaW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRpbWVuc2lvbkVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRpbWVuc2lvbicpO1xyXG4gICAgaWYgKHRoaXMud2lkdGgpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkaW1lbnNpb25FbGVtZW50LCAnd2lkdGgnLCB0aGlzLndpZHRoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGVkaXRvckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpO1xyXG4gICAgaWYodGhpcy5oZWlnaHQpe1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVkaXRvckVsZW1lbnQsICdoZWlnaHQnLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvciAmJiAoZWRpdG9yLmlubmVySFRNTC50cmltKCkgPT09IFwiXCIgfHwgZWRpdG9yLmlubmVySFRNTC50cmltKCkgPT09IFwiPGJyPlwiKSkge1xyXG4gICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICByYW5nZS5zZXRTdGFydChlZGl0b3IsIDApO1xyXG4gICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgb25Db250ZW50Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yQ29udGVudCA9IGVkaXRvci5pbm5lckhUTUw7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhcHR1cmVkIENvbnRlbnQgKENoaWxkKTonLCB0aGlzLmVkaXRvckNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KHRoaXMuZWRpdG9yQ29udGVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZW50KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRIZWFkOiBhbnkgPSAnUCc7XHJcbiAgc2VsZWN0ZWRGb250OiBhbnkgPSAnMTQnO1xyXG5cclxuICBwdWJsaWMgb25DaGFuZ2UgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9PSAnPGJyPicgfHwgdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPT0gJycpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEhlYWQgPSAnUCc7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gJzE0JztcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgd3JpdGVWYWx1ZShjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudCB8fCAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKCkge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIHNldEZvbnRTaXplKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3Qgc2l6ZSA9IHNlbGVjdC52YWx1ZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgaWYgKCFyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgY29uc3QgcGFyZW50ID0gc2VsZWN0aW9uLmFuY2hvck5vZGU/LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwYXJlbnQgJiZcclxuICAgICAgICBwYXJlbnQuY2xhc3NMaXN0ICYmXHJcbiAgICAgICAgQXJyYXkuZnJvbShwYXJlbnQuY2xhc3NMaXN0KS5zb21lKChjOiBzdHJpbmcpID0+IGMuc3RhcnRzV2l0aCgnZnMtJykpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHBhcmVudC5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cHhgO1xyXG4gICAgICAgIHBhcmVudC5jbGFzc05hbWUgPSBgZnMtJHtzaXplfWA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgICAgcmFuZ2Uuc3Vycm91bmRDb250ZW50cyhzcGFuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBgJHtzaXplfXB4YDtcclxuICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKSk7IC8vIHplcm8td2lkdGggc3BhY2VcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcclxuICAgICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICBuZXdSYW5nZS5zZXRTdGFydChzcGFuLmZpcnN0Q2hpbGQgYXMgTm9kZSwgMSk7XHJcbiAgICAgIG5ld1JhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNldEhlYWRpbmcoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XHJcbiAgICBjb25zdCB0YWcgPSBzZWxlY3QudmFsdWU7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAgIGlmICghZWRpdG9yKSByZXR1cm47XHJcbiAgICBjb25zdCBuZXdFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xyXG4gICAgc3dpdGNoICh0YWcpIHtcclxuICAgICAgY2FzZSAnSDEnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMzJweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIMic6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcyOHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0gzJzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzI0cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDQnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMjBweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdINSc6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcxOHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDYnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1AnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ25vcm1hbCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuICAgIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgICAgbmV3RWxlbS50ZXh0Q29udGVudCA9IHNlbGVjdGVkVGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0VsZW0uaW5uZXJIVE1MID0gJ1xcdTIwMEInOyAvLyBaZXJvLXdpZHRoIHNwYWNlIHRvIGtlZXAgY3Vyc29yIHZpc2libGVcclxuICAgIH1cclxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICByYW5nZS5pbnNlcnROb2RlKG5ld0VsZW0pO1xyXG4gICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgbmV3UmFuZ2Uuc2V0U3RhcnQobmV3RWxlbSwgbmV3RWxlbS5jaGlsZE5vZGVzLmxlbmd0aCk7XHJcbiAgICBuZXdSYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdChjb21tYW5kOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvL0ltYWdlIFNlY3Rpb25cclxuXHJcbiAgYWxsb3dEcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBpbWFnZSBkcmFnIHN0YXJ0XHJcbiAgZHJhZyhldmVudDogRHJhZ0V2ZW50LCBpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBldmVudC5kYXRhVHJhbnNmZXI/LnNldERhdGEoXCJ0ZXh0XCIsIGltYWdlVXJsKTtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBkcm9wIGV2ZW50IGluIHRoZSBlZGl0b3JcclxuICBkcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVJbWFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgfVxyXG5cclxuICBpbnNlcnRJbWFnZUluRWRpdG9yKGltYWdlVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0VkaXRvciBlbGVtZW50IG5vdCBmb3VuZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBpbWFnZSBlbGVtZW50XHJcbiAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBpbWFnZSB0byBhbGxvdyByZXNpemluZ1xyXG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgd3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgIC8vIEVuc3VyZXMgdGhlIHdyYXBwZXIgb25seSB0YWtlcyB1cCBzcGFjZSBmb3IgdGhlIGltYWdlXHJcbiAgICB3cmFwcGVyLnN0eWxlLm1hcmdpbiA9ICcxMHB4JztcclxuICAgIHdyYXBwZXIuc3R5bGUucGFkZGluZyA9ICc1cHgnO1xyXG4gICAgd3JhcHBlci5zdHlsZS5ib3JkZXIgPSAnMXB4IGRhc2hlZCAjY2NjJzsgLy8gT3B0aW9uYWwgYm9yZGVyIHRvIGluZGljYXRlIHRoZSBpbWFnZSBhcmVhXHJcblxyXG4gICAgLy8gQXBwZW5kIHRoZSBpbWFnZSB0byB0aGUgd3JhcHBlclxyXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgd3JhcHBlciB0byB0aGUgZWRpdG9yXHJcbiAgICBlZGl0b3IuYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcblxyXG4gICAgLy8gTWFrZSB0aGUgaW1hZ2UgcmVzaXphYmxlXHJcbiAgICB0aGlzLm1ha2VJbWFnZVJlc2l6YWJsZSh3cmFwcGVyLCBpbWcpO1xyXG5cclxuICAgIC8vIE9wdGlvbmFsbHksIGFkZCBhIHRleHQgbm9kZSB0byBtYWludGFpbiBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgYXBwZW5kaW5nIHRoZSBpbWFnZVxyXG4gICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MjAwQicpOyAgLy8gSW52aXNpYmxlIGNoYXJhY3RlciB0byBtYWludGFpbiBwb3NpdGlvblxyXG4gICAgZWRpdG9yLmFwcGVuZENoaWxkKHRleHROb2RlKTtcclxuXHJcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdyYXBwZXIpO1xyXG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYWtlSW1hZ2VSZXNpemFibGUod3JhcHBlcjogSFRNTEVsZW1lbnQsIGltZzogSFRNTEltYWdlRWxlbWVudCk6IHZvaWQge1xyXG4gICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgIGxldCBzdGFydFggPSAwO1xyXG4gICAgbGV0IHN0YXJ0WSA9IDA7XHJcbiAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICBsZXQgc3RhcnRIZWlnaHQgPSAwO1xyXG5cclxuICAgIC8vIENyZWF0ZSByZXNpemUgaGFuZGxlcyBmb3IgdGhlIGltYWdlXHJcbiAgICBjb25zdCBjcmVhdGVSZXNpemVIYW5kbGUgPSAoXHJcbiAgICAgIGN1cnNvcjogc3RyaW5nLFxyXG4gICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgcmVzaXplQ2FsbGJhY2s6IChkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpID0+IHZvaWRcclxuICAgICkgPT4ge1xyXG4gICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgaGFuZGxlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgaGFuZGxlLnN0eWxlLndpZHRoID0gJzEwcHgnO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDAsIDAsIDAsIDAuNSknO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xyXG4gICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChyZXNpemVFdmVudCkgPT4ge1xyXG4gICAgICAgIGlzUmVzaXppbmcgPSB0cnVlO1xyXG4gICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgc3RhcnRZID0gcmVzaXplRXZlbnQuY2xpZW50WTtcclxuICAgICAgICBzdGFydFdpZHRoID0gaW1nLm9mZnNldFdpZHRoO1xyXG4gICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3Qgb25Nb3VzZU1vdmUgPSAobW92ZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNSZXNpemluZykge1xyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gbW92ZUV2ZW50LmNsaWVudFkgLSBzdGFydFk7XHJcbiAgICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrKGRlbHRhWCwgZGVsdGFZKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBvbk1vdXNlVXAgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChoYW5kbGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBZGQgcmVzaXppbmcgaGFuZGxlcyB0byB0aGUgd3JhcHBlciBmb3IgdGhlIGltYWdlXHJcbiAgICBjcmVhdGVSZXNpemVIYW5kbGUoXHJcbiAgICAgICdudy1yZXNpemUnLFxyXG4gICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgaW1nLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCAtIGRlbHRhWH1weGA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgJ3NlLXJlc2l6ZScsXHJcbiAgICAgIHsgYm90dG9tOiAnLTVweCcsIHJpZ2h0OiAnLTVweCcgfSxcclxuICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgaW1nLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCArIGRlbHRhWH1weGA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0ICsgZGVsdGFZfXB4YDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluc2VydEltYWdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmIChpbnB1dD8uZmlsZXMpIHtcclxuICAgICAgQXJyYXkuZnJvbShpbnB1dC5maWxlcykuZm9yRWFjaChmaWxlID0+IHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbWFnZVVybCA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXMucHVzaChpbWFnZVVybCk7IC8vIFN0b3JlIGltYWdlIFVSTCBpbiB0aGUgYXJyYXlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnZlcnRJbWFnZShmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoZmlsZS50eXBlICE9PSAnaW1hZ2UvcG5nJykge1xyXG4gICAgICAgIHJlc29sdmUoZmlsZSk7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgZmlsZSBpZiBpdCdzIG5vdCBhIFBOR1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAgIGlmICghY3R4KSB7XHJcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgY2FudmFzIGNvbnRleHQnKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XHJcbiAgICAgICAgICBjYW52YXMudG9CbG9iKFxyXG4gICAgICAgICAgICBibG9iID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmxvYikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QganBnRmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnBuZyQvLCAnLmpwZycpLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoanBnRmlsZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb252ZXJ0IFBORyB0byBKUEcnKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAnaW1hZ2UvanBlZycsXHJcbiAgICAgICAgICAgIDAuOTUgLy8gUXVhbGl0eSBmYWN0b3IgZm9yIEpQRUdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgdGhlIGZpbGUnKSk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGluc2VydEltYWdlVG9FZGl0b3IoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgd3JhcHBlci5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUuYm9yZGVyID0gJzFweCBkYXNoZWQgI2NjYyc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5tYXJnaW4gPSAnMTBweCc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5wYWRkaW5nID0gJzVweCc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5ib3JkZXJCbG9ja0NvbG9yID0gJyMwMDdCRkYnO1xyXG4gICAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gICAgICAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAgICAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGltZyk7XHJcbiAgICAgICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRZID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICAgICAgY3Vyc29yOiBzdHJpbmcsXHJcbiAgICAgICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUud2lkdGggPSAnMTBweCc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaXNSZXNpemluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBpbWcub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpc1Jlc2l6aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICAgICAgcmVzaXplQ2FsbGJhY2soZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChoYW5kbGUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAgICAgJ253LXJlc2l6ZScsXHJcbiAgICAgICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSBgJHtzdGFydFdpZHRoIC0gZGVsdGFYfXB4YDtcclxuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICAgICAgeyBib3R0b206ICctNXB4JywgcmlnaHQ6ICctNXB4JyB9LFxyXG4gICAgICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gYCR7c3RhcnRIZWlnaHQgKyBkZWx0YVl9cHhgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKTtcclxuICAgICAgICBlZGl0b3IuYXBwZW5kQ2hpbGQodGV4dE5vZGUpO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdyYXBwZXIpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuVGFibGVEaWFsb2coZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5zZXJ0TWFya2VyKCk7XHJcbiAgICB0aGlzLnJvd3MgPSAxO1xyXG4gICAgdGhpcy5jb2xzID0gMTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMudGFibGVEaWFsb2csIHtcclxuICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICB0b3A6IGAke2V2ZW50LmNsaWVudFl9cHhgLFxyXG4gICAgICAgIGxlZnQ6IGAke2V2ZW50LmNsaWVudFh9cHhgLFxyXG4gICAgICB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5pbnNlcnRUYWJsZShyZXN1bHQucm93cywgcmVzdWx0LmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByZXZpZXcoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuY29scyA9IGNvbHM7XHJcbiAgICB0aGlzLnJvd3MgPSByb3dzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0aW9uKGNvbEluZGV4OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIsIGRpYWxvZ1JlZjogYW55KSB7XHJcbiAgICB0aGlzLmNvbHMgPSBjb2xJbmRleDtcclxuICAgIHRoaXMucm93cyA9IHJvd0luZGV4O1xyXG4gICAgZGlhbG9nUmVmLmNsb3NlKHsgcm93czogdGhpcy5yb3dzLCBjb2xzOiB0aGlzLmNvbHMgfSk7IC8vIENsb3NlIGRpYWxvZyB3aXRoIHNlbGVjdGlvblxyXG4gIH1cclxuXHJcbiAgbWFrZUZpcnN0Um93SGVhZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIGVkaXRvclxyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uSW5zaWRlRWRpdG9yKGVkaXRvciwgc2VsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IHRhYmxlIHRvIHRoZSBzZWxlY3Rpb25cclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5maW5kQ2xvc2VzdFRhYmxlKHNlbGVjdGVkTm9kZSk7XHJcbiAgICBpZiAoIXRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIENvbnZlcnQgdGhlIGZpcnN0IHJvdyBjZWxscyB0byBoZWFkZXIgY2VsbHNcclxuICAgIGNvbnN0IGZpcnN0Um93ID0gdGFibGUucm93c1swXTtcclxuICAgIGlmIChmaXJzdFJvdykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2VsbCA9IGZpcnN0Um93LmNlbGxzW2ldO1xyXG4gICAgICAgIGNvbnN0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICB0aC5pbm5lckhUTUwgPSBjZWxsLmlubmVySFRNTDtcclxuICAgICAgICB0aC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuICAgICAgICB0aC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0YxRjFGMCc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyQ29sbGFwc2UgPSAnY29sbGFwc2UnO1xyXG4gICAgICAgIHRoLnN0eWxlLnBhZGRpbmcgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKS5wYWRkaW5nOyAvLyBSZXRhaW4gcGFkZGluZ1xyXG4gICAgICAgIHRoLnN0eWxlLndpZHRoID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCkud2lkdGg7IC8vIFJldGFpbiB3aWR0aFxyXG4gICAgICAgIHRoLnN0eWxlLmhlaWdodCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpLmhlaWdodDtcclxuICAgICAgICBmaXJzdFJvdy5yZXBsYWNlQ2hpbGQodGgsIGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZENsb3Nlc3RUYWJsZShub2RlOiBOb2RlKTogSFRNTFRhYmxlRWxlbWVudCB8IG51bGwge1xyXG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQpIHtcclxuICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICdUQUJMRScpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGUhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydE1hcmtlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICBjb25zdCBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIG1hcmtlci5pZCA9ICd0YWJsZS1tYXJrZXInO1xyXG4gICAgICBtYXJrZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShtYXJrZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0VGFibGUocm93czogc3RyaW5nLCBjb2xzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd0NvdW50ID0gcGFyc2VJbnQocm93cywgMTApO1xyXG4gICAgY29uc3QgY29sQ291bnQgPSBwYXJzZUludChjb2xzLCAxMCk7XHJcblxyXG4gICAgaWYgKGlzTmFOKHJvd0NvdW50KSB8fCBpc05hTihjb2xDb3VudCkgfHwgcm93Q291bnQgPCAxIHx8IGNvbENvdW50IDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IG1hcmtlciA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCcjdGFibGUtbWFya2VyJyk7XHJcblxyXG4gICAgY29uc3QgdGFibGVIVE1MID0gdGhpcy5jcmVhdGVUYWJsZUhUTUwocm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xyXG4gICAgY29uc3QgdGFibGUgPSB0ZW1wRGl2LmZpcnN0RWxlbWVudENoaWxkO1xyXG5cclxuICAgIGlmIChtYXJrZXIgJiYgdGFibGUpIHtcclxuICAgICAgbWFya2VyLnBhcmVudE5vZGUhLnJlcGxhY2VDaGlsZCh0YWJsZSwgbWFya2VyKTtcclxuICAgICAgdGhpcy5zZXRDdXJzb3JUb0ZpcnN0Q2VsbCh0YWJsZSBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gZmFsbGJhY2sgaWYgbm8gbWFya2VyLCBqdXN0IGFwcGVuZFxyXG4gICAgICB0aGlzLmFwcGVuZFRhYmxlKGVkaXRvciwgcm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFibGVIVE1MKHJvd0NvdW50OiBudW1iZXIsIGNvbENvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhYmxlSFRNTCA9ICc8dGFibGUgYm9yZGVyPVwiMVwiIHN0eWxlPVwiXCI+JztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICB0YWJsZUhUTUwgKz0gJzx0cj4nO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbENvdW50OyBqKyspIHtcclxuICAgICAgICB0YWJsZUhUTUwgKz0gYDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbWluLXdpZHRoOiAxLjVlbTsgaGVpZ2h0OiAyZW07IHBhZGRpbmc6IC40ZW07IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+PC90ZD5gO1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlSFRNTCArPSAnPC90cj4nO1xyXG4gICAgfVxyXG4gICAgdGFibGVIVE1MICs9ICc8L3RhYmxlPic7XHJcbiAgICByZXR1cm4gdGFibGVIVE1MO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRUYWJsZShlZGl0b3I6IEhUTUxFbGVtZW50LCByb3dDb3VudDogbnVtYmVyLCBjb2xDb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YWJsZUhUTUwgPSB0aGlzLmNyZWF0ZVRhYmxlSFRNTChyb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCArPSB0YWJsZUhUTUw7XHJcbiAgICBjb25zdCBsYXN0SW5zZXJ0ZWRUYWJsZSA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCd0YWJsZTpsYXN0LWNoaWxkJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNldEN1cnNvclRvRmlyc3RDZWxsKGxhc3RJbnNlcnRlZFRhYmxlKTtcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGlvbkluc2lkZUVkaXRvcihlZGl0b3I6IEhUTUxFbGVtZW50LCBzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgIGlmIChub2RlID09PSBlZGl0b3IpIHJldHVybiB0cnVlO1xyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q3Vyc29yVG9GaXJzdENlbGwodGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaXJzdENlbGwgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChmaXJzdENlbGwpIHtcclxuICAgICAgZmlyc3RDZWxsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcclxuICAgICAgZmlyc3RDZWxsLmZvY3VzKCk7XHJcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgbmV3UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGZpcnN0Q2VsbCk7IC8vIFNlbGVjdCB0aGUgY29udGVudHMgb2YgdGhlIGNlbGxcclxuICAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIENvbGxhcHNlIHRvIHRoZSBzdGFydFxyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0UGFnZUJyZWFrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZUJyZWFrID0gYDxkaXYgc3R5bGU9XCJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XCI+PGJyIC8+PC9kaXY+YDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHBhZ2VCcmVhayk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDb250ZW50KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuaW5uZXJIVE1MOyAvLyBHZXQgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBlZGl0b3JcclxuICAgIGNvbnN0IHBsYWluVGV4dENvbnRlbnQgPSBlZGl0b3IuaW5uZXJUZXh0OyAvLyBPcHRpb25hbGx5LCBnZXQgcGxhaW4gdGV4dCBjb250ZW50XHJcbiAgICB0aGlzLm9uQ2hhbmdlKGNvbnRlbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGltZW5zaW9uXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJpY2gtdGV4dC1lZGl0b3JcIj5cclxuICAgIDwhLS0gVG9vbGJhciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCI+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRIZWFkXCIgKGNoYW5nZSk9XCJzZXRIZWFkaW5nKCRldmVudClcIj5cclxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFwiIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPlBhcmFncmFwaDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMVwiIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMTwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMlwiIHN0eWxlPVwiZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMjwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIM1wiIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMzwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5INDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINVwiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNjAwO1wiPkg1PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg2XCIgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+SDY8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIChjaGFuZ2UpPVwib25DaGFuZ2UobnVsbClcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJzZXRGb250U2l6ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIiB2YWx1ZT1cIjEyXCI+MTJweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDE0cHg7XCIgdmFsdWU9XCIxNFwiIHNlbGVjdGVkPjE0cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4O1wiIHZhbHVlPVwiMTZcIj4xNnB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiB2YWx1ZT1cIjE4XCI+MThweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDI0cHg7XCIgdmFsdWU9XCIyNFwiPjI0cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4O1wiIHZhbHVlPVwiMzJcIj4zMnB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogNDhweDtcIiB2YWx1ZT1cIjQ4XCI+NDhweDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkJvbGRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2JvbGQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkl0YWxpY1wiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfaXRhbGljPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbmRlcmxpbmVcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X3VuZGVybGluZTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdzdHJpa2V0aHJvdWdoJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIlN0cmlrZXRocm91Z2hcIj5cclxuICAgICAgICA8bWF0LWljb24+c3RyaWtldGhyb3VnaF9zPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlMZWZ0JylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkFsaWduIExlZnRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2xlZnQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJDZW50ZXJcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5UmlnaHQnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiQWxpZ24gUmlnaHRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlGdWxsJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkp1c3RpZnlcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2p1c3RpZnk8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0VW5vcmRlcmVkTGlzdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbm9yZGVyZWQgTGlzdFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfbGlzdF9idWxsZXRlZDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJPcmRlcmVkIExpc3RcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2xpc3RfbnVtYmVyZWQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjb2xvcj1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJJbnNlcnQgSW1hZ2VcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIChjaGFuZ2UpPVwiaW5zZXJ0SW1hZ2VUb0VkaXRvcigkZXZlbnQpXCJcclxuICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtNTAlOyB0b3A6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG9wYWNpdHk6IDA7IGN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cclxuICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIj5pbnNlcnRfcGhvdG9fb3V0bGluZWQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3BlblRhYmxlRGlhbG9nKCRldmVudClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDaG9vc2UgdGFibGUgcm93cyBhbmQgY29sdW1uc1wiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5ib3JkZXJfYWxsPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwibWItMVwiIChjbGljayk9XCJtYWtlRmlyc3RSb3dIZWFkZXIoKVwiIHR5cGU9XCJidXR0b25cIiBjb2xvcj1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJNYWtlIEhlYWRlclwiPlxyXG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxyXG4gICAgICAgICAgcGFnZV9oZWFkZXJcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yXCIgaWQ9XCJlZGl0b3JcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgI2VkaXRvciAoaW5wdXQpPVwic3VibWl0Q29udGVudCgpXCIgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAoZHJvcCk9XCJkcm9wKCRldmVudClcIiAoZHJhZ292ZXIpPVwiYWxsb3dEcm9wKCRldmVudClcIj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxuZy10ZW1wbGF0ZSAjdGFibGVEaWFsb2cgbGV0LWRpYWxvZ1JlZj1cImRpYWxvZ1JlZlwiPlxyXG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+Q2hvb3NlIFRhYmxlIFNpemU8L2gyPlxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudD5cclxuICAgICAgPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2VsbCBvZiBncmlkOyBsZXQgaSA9IGluZGV4XCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdncmlkLWl0ZW0nOiB0cnVlLFxyXG4gICAgICAgICdoaWdobGlnaHRlZCc6IGkgJSA3IDwgY29scyAmJiBNYXRoLmZsb29yKGkgLyA3KSA8IHJvd3NcclxuICAgICAgfVwiIChtb3VzZWVudGVyKT1cInVwZGF0ZVByZXZpZXcoaSAlIDcgKyAxLCBNYXRoLmZsb29yKGkgLyA3KSArIDEpXCJcclxuICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVTZWxlY3Rpb24oaSAlIDcgKyAxLCBNYXRoLmZsb29yKGkgLyA3KSArIDEsIGRpYWxvZ1JlZilcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxwPnt7IHJvd3MgfX0geCB7eyBjb2xzIH19IDwvcD5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
625
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFwaWQtdGV4dC1lZGl0b3Ivc3JjL2xpYi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9yYXBpZC10ZXh0LWVkaXRvci9zcmMvbGliL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQTBCLFVBQVUsRUFBRSxZQUFZLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBRWhNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZXpFLE1BQU0sT0FBTyx3QkFBd0I7SUFlbkMsWUFBb0IsTUFBaUIsRUFBVSxFQUFjLEVBQVUsUUFBbUIsRUFBVSxLQUFpQjtRQUFqRyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBYjVHLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLFdBQU0sR0FBVyxNQUFNLENBQUM7UUFDeEIsVUFBSyxHQUFXLE1BQU0sQ0FBQztRQUN0QixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFHN0Msa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDbkMsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUNqQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQW1F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QU0sU0FBUyxHQUFHLHFEQUFxRCxDQUFDO1FBQ3hFLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyx1Q0FBdUM7UUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMscUNBQXFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7c0hBbHFCVSx3QkFBd0I7MEdBQXhCLHdCQUF3Qix5S0FUeEI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztZQUN2RCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsNFBDZEgsNDlKQWtHQTs0RkRqRmEsd0JBQXdCO2tCQWJwQyxTQUFTOytCQUNFLG1CQUFtQixhQUdsQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7MEtBS1EsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ2dDLE1BQU07c0JBQTVDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDWCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkNoYW5nZXMsIFRlbXBsYXRlUmVmLCBmb3J3YXJkUmVmLCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyYXBpZC10ZXh0LWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFwaWRUZXh0RWRpdG9yQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbiAgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYXBpZFRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50Q2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gXCJhdXRvXCI7XHJcbiAgQElucHV0KCkgd2lkdGg6IHN0cmluZyA9IFwiYXV0b1wiO1xyXG4gIEBPdXRwdXQoKSBjb250ZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJsZURpYWxvZycpIHRhYmxlRGlhbG9nITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIGVkaXRvckNvbnRlbnQ6IHN0cmluZyA9ICcnO1xyXG4gIHJvd3M6IG51bWJlciA9IDE7XHJcbiAgY29sczogbnVtYmVyID0gMTtcclxuICBncmlkID0gQXJyYXkoNDkpLmZpbGwoMCk7XHJcbiAgTWF0aCA9IE1hdGg7XHJcbiAgdXBsb2FkZWRJbWFnZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgY29uc29sZS5sb2coJ0J1aWxkIC0xJylcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NvbnRlbnQgY2FwdHVyZSBpcyBlbmFibGVkLicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NvbnRlbnQgY2FwdHVyZSBpcyBkaXNhYmxlZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydoZWlnaHQnXSB8fCBjaGFuZ2VzWyd3aWR0aCddKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEaW1lbnNpb25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5RGltZW5zaW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRpbWVuc2lvbkVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRpbWVuc2lvbicpO1xyXG4gICAgaWYgKHRoaXMud2lkdGgpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkaW1lbnNpb25FbGVtZW50LCAnd2lkdGgnLCB0aGlzLndpZHRoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGVkaXRvckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpO1xyXG4gICAgaWYodGhpcy5oZWlnaHQpe1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVkaXRvckVsZW1lbnQsICdoZWlnaHQnLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvciAmJiAoZWRpdG9yLmlubmVySFRNTC50cmltKCkgPT09IFwiXCIgfHwgZWRpdG9yLmlubmVySFRNTC50cmltKCkgPT09IFwiPGJyPlwiKSkge1xyXG4gICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICByYW5nZS5zZXRTdGFydChlZGl0b3IsIDApO1xyXG4gICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgb25Db250ZW50Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yQ29udGVudCA9IGVkaXRvci5pbm5lckhUTUw7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhcHR1cmVkIENvbnRlbnQgKENoaWxkKTonLCB0aGlzLmVkaXRvckNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KHRoaXMuZWRpdG9yQ29udGVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZW50KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRIZWFkOiBhbnkgPSAnUCc7XHJcbiAgc2VsZWN0ZWRGb250OiBhbnkgPSAnMTQnO1xyXG5cclxuICBwdWJsaWMgb25DaGFuZ2UgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9PSAnPGJyPicgfHwgdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPT0gJycpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEhlYWQgPSAnUCc7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gJzE0JztcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgd3JpdGVWYWx1ZShjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudCB8fCAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKCkge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIHNldEZvbnRTaXplKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3Qgc2l6ZSA9IHNlbGVjdC52YWx1ZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgaWYgKCFyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgY29uc3QgcGFyZW50ID0gc2VsZWN0aW9uLmFuY2hvck5vZGU/LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwYXJlbnQgJiZcclxuICAgICAgICBwYXJlbnQuY2xhc3NMaXN0ICYmXHJcbiAgICAgICAgQXJyYXkuZnJvbShwYXJlbnQuY2xhc3NMaXN0KS5zb21lKChjOiBzdHJpbmcpID0+IGMuc3RhcnRzV2l0aCgnZnMtJykpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHBhcmVudC5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cHhgO1xyXG4gICAgICAgIHBhcmVudC5jbGFzc05hbWUgPSBgZnMtJHtzaXplfWA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgICAgcmFuZ2Uuc3Vycm91bmRDb250ZW50cyhzcGFuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBgJHtzaXplfXB4YDtcclxuICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKSk7IC8vIHplcm8td2lkdGggc3BhY2VcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcclxuICAgICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICBuZXdSYW5nZS5zZXRTdGFydChzcGFuLmZpcnN0Q2hpbGQgYXMgTm9kZSwgMSk7XHJcbiAgICAgIG5ld1JhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNldEhlYWRpbmcoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XHJcbiAgICBjb25zdCB0YWcgPSBzZWxlY3QudmFsdWU7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAgIGlmICghZWRpdG9yKSByZXR1cm47XHJcbiAgICBjb25zdCBuZXdFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xyXG4gICAgc3dpdGNoICh0YWcpIHtcclxuICAgICAgY2FzZSAnSDEnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMzJweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIMic6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcyOHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0gzJzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzI0cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDQnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMjBweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdINSc6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcxOHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDYnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1AnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ25vcm1hbCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuICAgIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgICAgbmV3RWxlbS50ZXh0Q29udGVudCA9IHNlbGVjdGVkVGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0VsZW0uaW5uZXJIVE1MID0gJ1xcdTIwMEInOyAvLyBaZXJvLXdpZHRoIHNwYWNlIHRvIGtlZXAgY3Vyc29yIHZpc2libGVcclxuICAgIH1cclxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICByYW5nZS5pbnNlcnROb2RlKG5ld0VsZW0pO1xyXG4gICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgbmV3UmFuZ2Uuc2V0U3RhcnQobmV3RWxlbSwgbmV3RWxlbS5jaGlsZE5vZGVzLmxlbmd0aCk7XHJcbiAgICBuZXdSYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdChjb21tYW5kOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvL0ltYWdlIFNlY3Rpb25cclxuXHJcbiAgYWxsb3dEcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBpbWFnZSBkcmFnIHN0YXJ0XHJcbiAgZHJhZyhldmVudDogRHJhZ0V2ZW50LCBpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBldmVudC5kYXRhVHJhbnNmZXI/LnNldERhdGEoXCJ0ZXh0XCIsIGltYWdlVXJsKTtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBkcm9wIGV2ZW50IGluIHRoZSBlZGl0b3JcclxuICBkcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVJbWFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgfVxyXG5cclxuICBpbnNlcnRJbWFnZUluRWRpdG9yKGltYWdlVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0VkaXRvciBlbGVtZW50IG5vdCBmb3VuZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBpbWFnZSBlbGVtZW50XHJcbiAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBpbWFnZSB0byBhbGxvdyByZXNpemluZ1xyXG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgd3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgIC8vIEVuc3VyZXMgdGhlIHdyYXBwZXIgb25seSB0YWtlcyB1cCBzcGFjZSBmb3IgdGhlIGltYWdlXHJcbiAgICB3cmFwcGVyLnN0eWxlLm1hcmdpbiA9ICcxMHB4JztcclxuICAgIHdyYXBwZXIuc3R5bGUucGFkZGluZyA9ICc1cHgnO1xyXG4gICAgd3JhcHBlci5zdHlsZS5ib3JkZXIgPSAnMXB4IGRhc2hlZCAjY2NjJzsgLy8gT3B0aW9uYWwgYm9yZGVyIHRvIGluZGljYXRlIHRoZSBpbWFnZSBhcmVhXHJcblxyXG4gICAgLy8gQXBwZW5kIHRoZSBpbWFnZSB0byB0aGUgd3JhcHBlclxyXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgd3JhcHBlciB0byB0aGUgZWRpdG9yXHJcbiAgICBlZGl0b3IuYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcblxyXG4gICAgLy8gTWFrZSB0aGUgaW1hZ2UgcmVzaXphYmxlXHJcbiAgICB0aGlzLm1ha2VJbWFnZVJlc2l6YWJsZSh3cmFwcGVyLCBpbWcpO1xyXG5cclxuICAgIC8vIE9wdGlvbmFsbHksIGFkZCBhIHRleHQgbm9kZSB0byBtYWludGFpbiBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgYXBwZW5kaW5nIHRoZSBpbWFnZVxyXG4gICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MjAwQicpOyAgLy8gSW52aXNpYmxlIGNoYXJhY3RlciB0byBtYWludGFpbiBwb3NpdGlvblxyXG4gICAgZWRpdG9yLmFwcGVuZENoaWxkKHRleHROb2RlKTtcclxuXHJcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdyYXBwZXIpO1xyXG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYWtlSW1hZ2VSZXNpemFibGUod3JhcHBlcjogSFRNTEVsZW1lbnQsIGltZzogSFRNTEltYWdlRWxlbWVudCk6IHZvaWQge1xyXG4gICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgIGxldCBzdGFydFggPSAwO1xyXG4gICAgbGV0IHN0YXJ0WSA9IDA7XHJcbiAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICBsZXQgc3RhcnRIZWlnaHQgPSAwO1xyXG5cclxuICAgIC8vIENyZWF0ZSByZXNpemUgaGFuZGxlcyBmb3IgdGhlIGltYWdlXHJcbiAgICBjb25zdCBjcmVhdGVSZXNpemVIYW5kbGUgPSAoXHJcbiAgICAgIGN1cnNvcjogc3RyaW5nLFxyXG4gICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgcmVzaXplQ2FsbGJhY2s6IChkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpID0+IHZvaWRcclxuICAgICkgPT4ge1xyXG4gICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgaGFuZGxlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgaGFuZGxlLnN0eWxlLndpZHRoID0gJzEwcHgnO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDAsIDAsIDAsIDAuNSknO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xyXG4gICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChyZXNpemVFdmVudCkgPT4ge1xyXG4gICAgICAgIGlzUmVzaXppbmcgPSB0cnVlO1xyXG4gICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgc3RhcnRZID0gcmVzaXplRXZlbnQuY2xpZW50WTtcclxuICAgICAgICBzdGFydFdpZHRoID0gaW1nLm9mZnNldFdpZHRoO1xyXG4gICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3Qgb25Nb3VzZU1vdmUgPSAobW92ZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNSZXNpemluZykge1xyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gbW92ZUV2ZW50LmNsaWVudFkgLSBzdGFydFk7XHJcbiAgICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrKGRlbHRhWCwgZGVsdGFZKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBvbk1vdXNlVXAgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChoYW5kbGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBZGQgcmVzaXppbmcgaGFuZGxlcyB0byB0aGUgd3JhcHBlciBmb3IgdGhlIGltYWdlXHJcbiAgICBjcmVhdGVSZXNpemVIYW5kbGUoXHJcbiAgICAgICdudy1yZXNpemUnLFxyXG4gICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgaW1nLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCAtIGRlbHRhWH1weGA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgJ3NlLXJlc2l6ZScsXHJcbiAgICAgIHsgYm90dG9tOiAnLTVweCcsIHJpZ2h0OiAnLTVweCcgfSxcclxuICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgaW1nLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCArIGRlbHRhWH1weGA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0ICsgZGVsdGFZfXB4YDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluc2VydEltYWdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmIChpbnB1dD8uZmlsZXMpIHtcclxuICAgICAgQXJyYXkuZnJvbShpbnB1dC5maWxlcykuZm9yRWFjaChmaWxlID0+IHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbWFnZVVybCA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXMucHVzaChpbWFnZVVybCk7IC8vIFN0b3JlIGltYWdlIFVSTCBpbiB0aGUgYXJyYXlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnZlcnRJbWFnZShmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoZmlsZS50eXBlICE9PSAnaW1hZ2UvcG5nJykge1xyXG4gICAgICAgIHJlc29sdmUoZmlsZSk7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgZmlsZSBpZiBpdCdzIG5vdCBhIFBOR1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAgIGlmICghY3R4KSB7XHJcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgY2FudmFzIGNvbnRleHQnKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XHJcbiAgICAgICAgICBjYW52YXMudG9CbG9iKFxyXG4gICAgICAgICAgICBibG9iID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmxvYikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QganBnRmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnBuZyQvLCAnLmpwZycpLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoanBnRmlsZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb252ZXJ0IFBORyB0byBKUEcnKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAnaW1hZ2UvanBlZycsXHJcbiAgICAgICAgICAgIDAuOTUgLy8gUXVhbGl0eSBmYWN0b3IgZm9yIEpQRUdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgdGhlIGZpbGUnKSk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGluc2VydEltYWdlVG9FZGl0b3IoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgd3JhcHBlci5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUuYm9yZGVyID0gJzFweCBkYXNoZWQgI2NjYyc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5tYXJnaW4gPSAnMTBweCc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5wYWRkaW5nID0gJzVweCc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5ib3JkZXJCbG9ja0NvbG9yID0gJyMwMDdCRkYnO1xyXG4gICAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gICAgICAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAgICAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGltZyk7XHJcbiAgICAgICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRZID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICAgICAgY3Vyc29yOiBzdHJpbmcsXHJcbiAgICAgICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUud2lkdGggPSAnMTBweCc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaXNSZXNpemluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBpbWcub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpc1Jlc2l6aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICAgICAgcmVzaXplQ2FsbGJhY2soZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChoYW5kbGUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAgICAgJ253LXJlc2l6ZScsXHJcbiAgICAgICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSBgJHtzdGFydFdpZHRoIC0gZGVsdGFYfXB4YDtcclxuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICAgICAgeyBib3R0b206ICctNXB4JywgcmlnaHQ6ICctNXB4JyB9LFxyXG4gICAgICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gYCR7c3RhcnRIZWlnaHQgKyBkZWx0YVl9cHhgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKTtcclxuICAgICAgICBlZGl0b3IuYXBwZW5kQ2hpbGQodGV4dE5vZGUpO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdyYXBwZXIpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuVGFibGVEaWFsb2coZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5zZXJ0TWFya2VyKCk7XHJcbiAgICB0aGlzLnJvd3MgPSAxO1xyXG4gICAgdGhpcy5jb2xzID0gMTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMudGFibGVEaWFsb2csIHtcclxuICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICB0b3A6IGAke2V2ZW50LmNsaWVudFl9cHhgLFxyXG4gICAgICAgIGxlZnQ6IGAke2V2ZW50LmNsaWVudFh9cHhgLFxyXG4gICAgICB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5pbnNlcnRUYWJsZShyZXN1bHQucm93cywgcmVzdWx0LmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByZXZpZXcoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuY29scyA9IGNvbHM7XHJcbiAgICB0aGlzLnJvd3MgPSByb3dzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0aW9uKGNvbEluZGV4OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIsIGRpYWxvZ1JlZjogYW55KSB7XHJcbiAgICB0aGlzLmNvbHMgPSBjb2xJbmRleDtcclxuICAgIHRoaXMucm93cyA9IHJvd0luZGV4O1xyXG4gICAgZGlhbG9nUmVmLmNsb3NlKHsgcm93czogdGhpcy5yb3dzLCBjb2xzOiB0aGlzLmNvbHMgfSk7IC8vIENsb3NlIGRpYWxvZyB3aXRoIHNlbGVjdGlvblxyXG4gIH1cclxuXHJcbiAgbWFrZUZpcnN0Um93SGVhZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIGVkaXRvclxyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uSW5zaWRlRWRpdG9yKGVkaXRvciwgc2VsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IHRhYmxlIHRvIHRoZSBzZWxlY3Rpb25cclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5maW5kQ2xvc2VzdFRhYmxlKHNlbGVjdGVkTm9kZSk7XHJcbiAgICBpZiAoIXRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIENvbnZlcnQgdGhlIGZpcnN0IHJvdyBjZWxscyB0byBoZWFkZXIgY2VsbHNcclxuICAgIGNvbnN0IGZpcnN0Um93ID0gdGFibGUucm93c1swXTtcclxuICAgIGlmIChmaXJzdFJvdykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2VsbCA9IGZpcnN0Um93LmNlbGxzW2ldO1xyXG4gICAgICAgIGNvbnN0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICB0aC5pbm5lckhUTUwgPSBjZWxsLmlubmVySFRNTDtcclxuICAgICAgICB0aC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuICAgICAgICB0aC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0YxRjFGMCc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyQ29sbGFwc2UgPSAnY29sbGFwc2UnO1xyXG4gICAgICAgIHRoLnN0eWxlLnBhZGRpbmcgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKS5wYWRkaW5nOyAvLyBSZXRhaW4gcGFkZGluZ1xyXG4gICAgICAgIHRoLnN0eWxlLndpZHRoID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCkud2lkdGg7IC8vIFJldGFpbiB3aWR0aFxyXG4gICAgICAgIHRoLnN0eWxlLmhlaWdodCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpLmhlaWdodDtcclxuICAgICAgICBmaXJzdFJvdy5yZXBsYWNlQ2hpbGQodGgsIGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZENsb3Nlc3RUYWJsZShub2RlOiBOb2RlKTogSFRNTFRhYmxlRWxlbWVudCB8IG51bGwge1xyXG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQpIHtcclxuICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICdUQUJMRScpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGUhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydE1hcmtlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICBjb25zdCBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIG1hcmtlci5pZCA9ICd0YWJsZS1tYXJrZXInO1xyXG4gICAgICBtYXJrZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShtYXJrZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0VGFibGUocm93czogc3RyaW5nLCBjb2xzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd0NvdW50ID0gcGFyc2VJbnQocm93cywgMTApO1xyXG4gICAgY29uc3QgY29sQ291bnQgPSBwYXJzZUludChjb2xzLCAxMCk7XHJcblxyXG4gICAgaWYgKGlzTmFOKHJvd0NvdW50KSB8fCBpc05hTihjb2xDb3VudCkgfHwgcm93Q291bnQgPCAxIHx8IGNvbENvdW50IDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IG1hcmtlciA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCcjdGFibGUtbWFya2VyJyk7XHJcblxyXG4gICAgY29uc3QgdGFibGVIVE1MID0gdGhpcy5jcmVhdGVUYWJsZUhUTUwocm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xyXG4gICAgY29uc3QgdGFibGUgPSB0ZW1wRGl2LmZpcnN0RWxlbWVudENoaWxkO1xyXG5cclxuICAgIGlmIChtYXJrZXIgJiYgdGFibGUpIHtcclxuICAgICAgbWFya2VyLnBhcmVudE5vZGUhLnJlcGxhY2VDaGlsZCh0YWJsZSwgbWFya2VyKTtcclxuICAgICAgdGhpcy5zZXRDdXJzb3JUb0ZpcnN0Q2VsbCh0YWJsZSBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gZmFsbGJhY2sgaWYgbm8gbWFya2VyLCBqdXN0IGFwcGVuZFxyXG4gICAgICB0aGlzLmFwcGVuZFRhYmxlKGVkaXRvciwgcm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFibGVIVE1MKHJvd0NvdW50OiBudW1iZXIsIGNvbENvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhYmxlSFRNTCA9ICc8dGFibGUgYm9yZGVyPVwiMVwiIHN0eWxlPVwiXCI+JztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICB0YWJsZUhUTUwgKz0gJzx0cj4nO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbENvdW50OyBqKyspIHtcclxuICAgICAgICB0YWJsZUhUTUwgKz0gYDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbWluLXdpZHRoOiAxLjVlbTsgaGVpZ2h0OiAyZW07IHBhZGRpbmc6IC40ZW07IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+PC90ZD5gO1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlSFRNTCArPSAnPC90cj4nO1xyXG4gICAgfVxyXG4gICAgdGFibGVIVE1MICs9ICc8L3RhYmxlPic7XHJcbiAgICByZXR1cm4gdGFibGVIVE1MO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRUYWJsZShlZGl0b3I6IEhUTUxFbGVtZW50LCByb3dDb3VudDogbnVtYmVyLCBjb2xDb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YWJsZUhUTUwgPSB0aGlzLmNyZWF0ZVRhYmxlSFRNTChyb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCArPSB0YWJsZUhUTUw7XHJcbiAgICBjb25zdCBsYXN0SW5zZXJ0ZWRUYWJsZSA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCd0YWJsZTpsYXN0LWNoaWxkJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNldEN1cnNvclRvRmlyc3RDZWxsKGxhc3RJbnNlcnRlZFRhYmxlKTtcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGlvbkluc2lkZUVkaXRvcihlZGl0b3I6IEhUTUxFbGVtZW50LCBzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgIGlmIChub2RlID09PSBlZGl0b3IpIHJldHVybiB0cnVlO1xyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q3Vyc29yVG9GaXJzdENlbGwodGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaXJzdENlbGwgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChmaXJzdENlbGwpIHtcclxuICAgICAgZmlyc3RDZWxsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcclxuICAgICAgZmlyc3RDZWxsLmZvY3VzKCk7XHJcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgbmV3UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGZpcnN0Q2VsbCk7IC8vIFNlbGVjdCB0aGUgY29udGVudHMgb2YgdGhlIGNlbGxcclxuICAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIENvbGxhcHNlIHRvIHRoZSBzdGFydFxyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0UGFnZUJyZWFrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZUJyZWFrID0gYDxkaXYgc3R5bGU9XCJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XCI+PGJyIC8+PC9kaXY+YDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHBhZ2VCcmVhayk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDb250ZW50KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuaW5uZXJIVE1MOyAvLyBHZXQgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBlZGl0b3JcclxuICAgIGNvbnN0IHBsYWluVGV4dENvbnRlbnQgPSBlZGl0b3IuaW5uZXJUZXh0OyAvLyBPcHRpb25hbGx5LCBnZXQgcGxhaW4gdGV4dCBjb250ZW50XHJcbiAgICB0aGlzLm9uQ2hhbmdlKGNvbnRlbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGltZW5zaW9uXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJpY2gtdGV4dC1lZGl0b3JcIj5cclxuICAgIDwhLS0gVG9vbGJhciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCI+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRIZWFkXCIgKGNoYW5nZSk9XCJzZXRIZWFkaW5nKCRldmVudClcIj5cclxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFwiIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPlBhcmFncmFwaDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMVwiIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMTwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMlwiIHN0eWxlPVwiZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMjwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIM1wiIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMzwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5INDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINVwiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNjAwO1wiPkg1PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg2XCIgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+SDY8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIChjaGFuZ2UpPVwib25DaGFuZ2UobnVsbClcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJzZXRGb250U2l6ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIiB2YWx1ZT1cIjEyXCI+MTJweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDE0cHg7XCIgdmFsdWU9XCIxNFwiIHNlbGVjdGVkPjE0cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4O1wiIHZhbHVlPVwiMTZcIj4xNnB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiB2YWx1ZT1cIjE4XCI+MThweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDI0cHg7XCIgdmFsdWU9XCIyNFwiPjI0cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4O1wiIHZhbHVlPVwiMzJcIj4zMnB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogNDhweDtcIiB2YWx1ZT1cIjQ4XCI+NDhweDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkJvbGRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2JvbGQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkl0YWxpY1wiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfaXRhbGljPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbmRlcmxpbmVcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X3VuZGVybGluZTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdzdHJpa2V0aHJvdWdoJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIlN0cmlrZXRocm91Z2hcIj5cclxuICAgICAgICA8bWF0LWljb24+c3RyaWtldGhyb3VnaF9zPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlMZWZ0JylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkFsaWduIExlZnRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2xlZnQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJDZW50ZXJcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5UmlnaHQnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiQWxpZ24gUmlnaHRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlGdWxsJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkp1c3RpZnlcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2p1c3RpZnk8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0VW5vcmRlcmVkTGlzdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbm9yZGVyZWQgTGlzdFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfbGlzdF9idWxsZXRlZDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJPcmRlcmVkIExpc3RcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2xpc3RfbnVtYmVyZWQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjb2xvcj1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJJbnNlcnQgSW1hZ2VcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIChjaGFuZ2UpPVwiaW5zZXJ0SW1hZ2VUb0VkaXRvcigkZXZlbnQpXCJcclxuICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtNTAlOyB0b3A6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG9wYWNpdHk6IDA7IGN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cclxuICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIj5pbnNlcnRfcGhvdG9fb3V0bGluZWQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3BlblRhYmxlRGlhbG9nKCRldmVudClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDaG9vc2UgdGFibGUgcm93cyBhbmQgY29sdW1uc1wiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5ib3JkZXJfYWxsPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwibWItMVwiIChjbGljayk9XCJtYWtlRmlyc3RSb3dIZWFkZXIoKVwiIHR5cGU9XCJidXR0b25cIiBjb2xvcj1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJNYWtlIEhlYWRlclwiPlxyXG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxyXG4gICAgICAgICAgcGFnZV9oZWFkZXJcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yXCIgaWQ9XCJlZGl0b3JcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgI2VkaXRvciAoaW5wdXQpPVwic3VibWl0Q29udGVudCgpXCIgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAoZHJvcCk9XCJkcm9wKCRldmVudClcIiAoZHJhZ292ZXIpPVwiYWxsb3dEcm9wKCRldmVudClcIj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxuZy10ZW1wbGF0ZSAjdGFibGVEaWFsb2cgbGV0LWRpYWxvZ1JlZj1cImRpYWxvZ1JlZlwiPlxyXG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+Q2hvb3NlIFRhYmxlIFNpemU8L2gyPlxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudD5cclxuICAgICAgPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2VsbCBvZiBncmlkOyBsZXQgaSA9IGluZGV4XCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdncmlkLWl0ZW0nOiB0cnVlLFxyXG4gICAgICAgICdoaWdobGlnaHRlZCc6IGkgJSA3IDwgY29scyAmJiBNYXRoLmZsb29yKGkgLyA3KSA8IHJvd3NcclxuICAgICAgfVwiIChtb3VzZWVudGVyKT1cInVwZGF0ZVByZXZpZXcoaSAlIDcgKyAxLCBNYXRoLmZsb29yKGkgLyA3KSArIDEpXCJcclxuICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVTZWxlY3Rpb24oaSAlIDcgKyAxLCBNYXRoLmZsb29yKGkgLyA3KSArIDEsIGRpYWxvZ1JlZilcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxwPnt7IHJvd3MgfX0geCB7eyBjb2xzIH19IDwvcD5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'rapid-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"auto\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef, private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const dimensionElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.width) {\r\n this.renderer.setStyle(dimensionElement, 'width', this.width);\r\n }\r\n const editorElement = this.elRef.nativeElement.querySelector('.editor');\r\n if(this.height){\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor && (editor.innerHTML.trim() === \"\" || editor.innerHTML.trim() === \"<br>\")) {\r\n editor.focus();\r\n const range = document.createRange();\r\n range.setStart(editor, 0);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n else {\r\n console.error('Editor element not found.');\r\n }\r\n\r\n }\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n \r\n if (this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == '') {\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14';\r\n }\r\n };\r\n\r\n private onTouched = () => { };\r\n\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n if (!range.collapsed) {\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n }\r\n else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n span.appendChild(document.createTextNode('\\u200B')); // zero-width space\r\n range.insertNode(span);\r\n const newRange = document.createRange();\r\n newRange.setStart(span.firstChild as Node, 1);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n const newElem = document.createElement(tag);\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n editor.focus();\r\n }\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n editor.appendChild(wrapper);\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.insertMarker();\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n if (!table) {\r\n return;\r\n }\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n private insertMarker(): void {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0).cloneRange();\r\n const marker = document.createElement('span');\r\n marker.id = 'table-marker';\r\n marker.style.display = 'none';\r\n range.insertNode(marker);\r\n }\r\n }\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const marker = editor.querySelector('#table-marker');\r\n\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n const table = tempDiv.firstElementChild;\r\n\r\n if (marker && table) {\r\n marker.parentNode!.replaceChild(table, marker);\r\n this.setCursorToFirstCell(table as HTMLElement);\r\n editor.focus();\r\n } else {\r\n // fallback if no marker, just append\r\n this.appendTable(editor, rowCount, colCount);\r\n }\r\n }\r\n\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n if (firstCell) {\r\n firstCell.setAttribute('contenteditable', 'true');\r\n firstCell.focus();\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n this.onChange(content);\r\n }\r\n}\r\n","<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'rapid-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"auto\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef, private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const dimensionElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.width) {\r\n this.renderer.setStyle(dimensionElement, 'width', this.width);\r\n }\r\n const editorElement = this.elRef.nativeElement.querySelector('.editor');\r\n if(this.height){\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor && (editor.innerHTML.trim() === \"\" || editor.innerHTML.trim() === \"<br>\")) {\r\n editor.focus();\r\n const range = document.createRange();\r\n range.setStart(editor, 0);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n else {\r\n console.error('Editor element not found.');\r\n }\r\n\r\n }\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n \r\n if (this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == '') {\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14';\r\n }\r\n };\r\n\r\n private onTouched = () => { };\r\n\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n if (!range.collapsed) {\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n }\r\n else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n span.appendChild(document.createTextNode('\\u200B')); // zero-width space\r\n range.insertNode(span);\r\n const newRange = document.createRange();\r\n newRange.setStart(span.firstChild as Node, 1);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n const newElem = document.createElement(tag);\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n editor.focus();\r\n }\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n // event.preventDefault();\r\n }\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n editor.appendChild(wrapper);\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.insertMarker();\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n if (!table) {\r\n return;\r\n }\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n private insertMarker(): void {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0).cloneRange();\r\n const marker = document.createElement('span');\r\n marker.id = 'table-marker';\r\n marker.style.display = 'none';\r\n range.insertNode(marker);\r\n }\r\n }\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const marker = editor.querySelector('#table-marker');\r\n\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n const table = tempDiv.firstElementChild;\r\n\r\n if (marker && table) {\r\n marker.parentNode!.replaceChild(table, marker);\r\n this.setCursorToFirstCell(table as HTMLElement);\r\n editor.focus();\r\n } else {\r\n // fallback if no marker, just append\r\n this.appendTable(editor, rowCount, colCount);\r\n }\r\n }\r\n\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n if (firstCell) {\r\n firstCell.setAttribute('contenteditable', 'true');\r\n firstCell.focus();\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n this.onChange(content);\r\n }\r\n}\r\n","<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'rapid-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"auto\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef, private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const dimensionElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.width) {\r\n this.renderer.setStyle(dimensionElement, 'width', this.width);\r\n }\r\n const editorElement = this.elRef.nativeElement.querySelector('.editor');\r\n if(this.height){\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor && (editor.innerHTML.trim() === \"\" || editor.innerHTML.trim() === \"<br>\")) {\r\n editor.focus();\r\n const range = document.createRange();\r\n range.setStart(editor, 0);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n else {\r\n console.error('Editor element not found.');\r\n }\r\n\r\n }\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n \r\n if (this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == '') {\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14';\r\n }\r\n };\r\n\r\n private onTouched = () => { };\r\n\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n if (!range.collapsed) {\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n }\r\n else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n span.appendChild(document.createTextNode('\\u200B')); // zero-width space\r\n range.insertNode(span);\r\n const newRange = document.createRange();\r\n newRange.setStart(span.firstChild as Node, 1);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n const newElem = document.createElement(tag);\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n editor.focus();\r\n }\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n editor.appendChild(wrapper);\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.insertMarker();\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n if (!table) {\r\n return;\r\n }\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n private insertMarker(): void {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0).cloneRange();\r\n const marker = document.createElement('span');\r\n marker.id = 'table-marker';\r\n marker.style.display = 'none';\r\n range.insertNode(marker);\r\n }\r\n }\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const marker = editor.querySelector('#table-marker');\r\n\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n const table = tempDiv.firstElementChild;\r\n\r\n if (marker && table) {\r\n marker.parentNode!.replaceChild(table, marker);\r\n this.setCursorToFirstCell(table as HTMLElement);\r\n editor.focus();\r\n } else {\r\n // fallback if no marker, just append\r\n this.appendTable(editor, rowCount, colCount);\r\n }\r\n }\r\n\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n if (firstCell) {\r\n firstCell.setAttribute('contenteditable', 'true');\r\n firstCell.focus();\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n this.onChange(content);\r\n }\r\n}\r\n","<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RapidTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'rapid-text-editor',\r\n templateUrl: './rapid-text-editor.component.html',\r\n styleUrls: ['./rapid-text-editor.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RapidTextEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n \r\n})\r\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @Input() contentCapture: boolean = false;\r\n @Input() height: string = \"auto\";\r\n @Input() width: string = \"auto\";\r\n @Output() contentChange = new EventEmitter<string>();\r\n @ViewChild('editor', { static: true }) editor!: ElementRef;\r\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\r\n private editorContent: string = '';\r\n rows: number = 1;\r\n cols: number = 1;\r\n grid = Array(49).fill(0);\r\n Math = Math;\r\n uploadedImages: string[] = [];\r\n\r\n constructor(private dialog: MatDialog, private el: ElementRef, private renderer: Renderer2, private elRef: ElementRef) {\r\n console.log('Build -1')\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.contentCapture) {\r\n console.log('Content capture is enabled.');\r\n } else {\r\n console.log('Content capture is disabled.');\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['height'] || changes['width']) {\r\n this.applyDimensions();\r\n }\r\n }\r\n\r\n private applyDimensions(): void {\r\n const dimensionElement = this.elRef.nativeElement.querySelector('.dimension');\r\n if (this.width) {\r\n this.renderer.setStyle(dimensionElement, 'width', this.width);\r\n }\r\n const editorElement = this.elRef.nativeElement.querySelector('.editor');\r\n if(this.height){\r\n this.renderer.setStyle(editorElement, 'height', this.height);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor && (editor.innerHTML.trim() === \"\" || editor.innerHTML.trim() === \"<br>\")) {\r\n editor.focus();\r\n const range = document.createRange();\r\n range.setStart(editor, 0);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n else {\r\n console.error('Editor element not found.');\r\n }\r\n\r\n }\r\n\r\n onContentChange(): void {\r\n if (this.contentCapture) {\r\n const editor = this.el.nativeElement.querySelector('.editor');\r\n if (editor) {\r\n this.editorContent = editor.innerHTML;\r\n console.log('Captured Content (Child):', this.editorContent);\r\n this.contentChange.emit(this.editorContent);\r\n } else {\r\n console.error('Editor element not found.');\r\n }\r\n }\r\n }\r\n\r\n getContent(): string {\r\n return this.editorContent;\r\n }\r\n\r\n selectedHead: any = 'P';\r\n selectedFont: any = '14';\r\n\r\n public onChange = (content: string) => {\r\n \r\n if (this.editor.nativeElement.innerHTML == '<br>' || this.editor.nativeElement.innerHTML == '') {\r\n this.selectedHead = 'P';\r\n this.selectedFont = '14';\r\n }\r\n };\r\n\r\n private onTouched = () => { };\r\n\r\n writeValue(content: string): void {\r\n if (this.editor && this.editor.nativeElement) {\r\n this.editor.nativeElement.innerHTML = content || '';\r\n }\r\n }\r\n\r\n registerOnChange(fn: (content: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n onBlur() {\r\n this.onTouched();\r\n }\r\n\r\n setFontSize(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const size = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n if (!range.collapsed) {\r\n const parent = selection.anchorNode?.parentElement;\r\n if (\r\n parent &&\r\n parent.classList &&\r\n Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))\r\n ) {\r\n parent.style.fontSize = `${size}px`;\r\n parent.className = `fs-${size}`;\r\n } else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n range.surroundContents(span);\r\n }\r\n }\r\n else {\r\n const span = document.createElement('span');\r\n span.style.fontSize = `${size}px`;\r\n span.classList.add(`fs-${size}`);\r\n span.appendChild(document.createTextNode('\\u200B')); // zero-width space\r\n range.insertNode(span);\r\n const newRange = document.createRange();\r\n newRange.setStart(span.firstChild as Node, 1);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n setHeading(event: Event) {\r\n const select = event.target as HTMLSelectElement;\r\n const tag = select.value;\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n const range = selection.getRangeAt(0);\r\n const editor = document.getElementById('editor');\r\n if (!editor) return;\r\n const newElem = document.createElement(tag);\r\n switch (tag) {\r\n case 'H1':\r\n newElem.style.fontSize = '32px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H2':\r\n newElem.style.fontSize = '28px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H3':\r\n newElem.style.fontSize = '24px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H4':\r\n newElem.style.fontSize = '20px';\r\n newElem.style.fontWeight = 'bold';\r\n break;\r\n case 'H5':\r\n newElem.style.fontSize = '18px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'H6':\r\n newElem.style.fontSize = '16px';\r\n newElem.style.fontWeight = '600';\r\n break;\r\n case 'P':\r\n default:\r\n newElem.style.fontSize = '14px';\r\n newElem.style.fontWeight = 'normal';\r\n break;\r\n }\r\n const selectedText = selection.toString();\r\n if (selectedText) {\r\n newElem.textContent = selectedText;\r\n } else {\r\n newElem.innerHTML = '\\u200B'; // Zero-width space to keep cursor visible\r\n }\r\n range.deleteContents();\r\n range.insertNode(newElem);\r\n const newRange = document.createRange();\r\n newRange.setStart(newElem, newElem.childNodes.length);\r\n newRange.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n editor.focus();\r\n }\r\n\r\n format(command: string): void {\r\n document.execCommand(command, false, '');\r\n }\r\n\r\n //Image Section\r\n\r\n allowDrop(event: DragEvent): void {\r\n //event.preventDefault();\r\n }\r\n\r\n // Handle image drag start\r\n drag(event: DragEvent, imageUrl: string): void {\r\n event.dataTransfer?.setData(\"text\", imageUrl);\r\n }\r\n\r\n // Handle drop event in the editor\r\n drop(event: DragEvent): void {\r\n // event.preventDefault();\r\n }\r\n\r\n removeImage(index: number): void {\r\n this.uploadedImages.splice(index, 1);\r\n }\r\n\r\n insertImageInEditor(imageUrl: string): void {\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n\r\n // Create image element\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n\r\n // Create a wrapper around the image to allow resizing\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\r\n\r\n // Append the image to the wrapper\r\n wrapper.appendChild(img);\r\n\r\n // Append the wrapper to the editor\r\n editor.appendChild(wrapper);\r\n\r\n // Make the image resizable\r\n this.makeImageResizable(wrapper, img);\r\n\r\n // Optionally, add a text node to maintain cursor position after appending the image\r\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\r\n editor.appendChild(textNode);\r\n\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n // Create resize handles for the image\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n\r\n // Add resizing handles to the wrapper for the image\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n }\r\n\r\n insertImage(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input?.files) {\r\n Array.from(input.files).forEach(file => {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n this.uploadedImages.push(imageUrl); // Store image URL in the array\r\n };\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n }\r\n\r\n convertImage(file: File): Promise<File> {\r\n return new Promise((resolve, reject) => {\r\n if (file.type !== 'image/png') {\r\n resolve(file); // Return the original file if it's not a PNG\r\n return;\r\n }\r\n\r\n const img = new Image();\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Failed to get canvas context'));\r\n return;\r\n }\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.drawImage(img, 0, 0);\r\n canvas.toBlob(\r\n blob => {\r\n if (blob) {\r\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\r\n resolve(jpgFile);\r\n } else {\r\n reject(new Error('Failed to convert PNG to JPG'));\r\n }\r\n },\r\n 'image/jpeg',\r\n 0.95 // Quality factor for JPEG\r\n );\r\n };\r\n };\r\n\r\n reader.onerror = () => reject(new Error('Failed to read the file'));\r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n insertImageToEditor(event: any): void {\r\n const file = event.target.files[0];\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imageUrl = e.target.result;\r\n const editor = document.querySelector('.editor') as HTMLElement;\r\n\r\n if (!editor) {\r\n console.error('Editor element not found.');\r\n return;\r\n }\r\n const wrapper = document.createElement('div');\r\n wrapper.contentEditable = 'false';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.display = 'inline-block';\r\n wrapper.style.border = '1px dashed #ccc';\r\n wrapper.style.margin = '10px';\r\n wrapper.style.padding = '5px';\r\n wrapper.style.borderBlockColor = '#007BFF';\r\n const img = document.createElement('img');\r\n img.src = imageUrl;\r\n img.style.maxWidth = '100%';\r\n img.style.display = 'block';\r\n img.style.width = '300px';\r\n img.style.height = 'auto';\r\n wrapper.appendChild(img);\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n\r\n const createResizeHandle = (\r\n cursor: string,\r\n positionStyles: Record<string, string>,\r\n resizeCallback: (deltaX: number, deltaY: number) => void\r\n ) => {\r\n const handle = document.createElement('div');\r\n handle.style.position = 'absolute';\r\n handle.style.width = '10px';\r\n handle.style.height = '10px';\r\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\r\n handle.style.cursor = cursor;\r\n Object.assign(handle.style, positionStyles);\r\n\r\n handle.addEventListener('mousedown', (resizeEvent) => {\r\n isResizing = true;\r\n startX = resizeEvent.clientX;\r\n startY = resizeEvent.clientY;\r\n startWidth = img.offsetWidth;\r\n startHeight = img.offsetHeight;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n if (isResizing) {\r\n const deltaX = moveEvent.clientX - startX;\r\n const deltaY = moveEvent.clientY - startY;\r\n resizeCallback(deltaX, deltaY);\r\n }\r\n };\r\n const onMouseUp = () => {\r\n isResizing = false;\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n });\r\n\r\n wrapper.appendChild(handle);\r\n };\r\n createResizeHandle(\r\n 'nw-resize',\r\n { top: '-5px', left: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth - deltaX}px`;\r\n img.style.height = `${startHeight - deltaY}px`;\r\n }\r\n );\r\n createResizeHandle(\r\n 'se-resize',\r\n { bottom: '-5px', right: '-5px' },\r\n (deltaX, deltaY) => {\r\n img.style.width = `${startWidth + deltaX}px`;\r\n img.style.height = `${startHeight + deltaY}px`;\r\n }\r\n );\r\n editor.appendChild(wrapper);\r\n const textNode = document.createTextNode('\\u200B');\r\n editor.appendChild(textNode);\r\n const range = document.createRange();\r\n range.setStartAfter(wrapper);\r\n range.collapse(true);\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n openTableDialog(event: MouseEvent): void {\r\n this.insertMarker();\r\n this.rows = 1;\r\n this.cols = 1;\r\n\r\n const dialogRef = this.dialog.open(this.tableDialog, {\r\n position: {\r\n top: `${event.clientY}px`,\r\n left: `${event.clientX}px`,\r\n },\r\n panelClass: 'custom-dialog-container'\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result) => {\r\n if (result) {\r\n this.insertTable(result.rows, result.cols);\r\n }\r\n });\r\n }\r\n\r\n updatePreview(cols: number, rows: number) {\r\n this.cols = cols;\r\n this.rows = rows;\r\n }\r\n\r\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\r\n this.cols = colIndex;\r\n this.rows = rowIndex;\r\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\r\n }\r\n\r\n makeFirstRowHeader(): void {\r\n const editor = this.editor.nativeElement;\r\n const selection = window.getSelection();\r\n // Check if selection is inside the editor\r\n if (!this.isSelectionInsideEditor(editor, selection)) {\r\n return;\r\n }\r\n // Find the closest table to the selection\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const table = this.findClosestTable(selectedNode);\r\n if (!table) {\r\n return;\r\n }\r\n // Convert the first row cells to header cells\r\n const firstRow = table.rows[0];\r\n if (firstRow) {\r\n for (let i = 0; i < firstRow.cells.length; i++) {\r\n const cell = firstRow.cells[i];\r\n const th = document.createElement('th');\r\n th.innerHTML = cell.innerHTML;\r\n th.style.textAlign = 'center';\r\n th.style.backgroundColor = '#F1F1F0';\r\n th.style.border = '1px solid black';\r\n th.style.borderCollapse = 'collapse';\r\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\r\n th.style.width = window.getComputedStyle(cell).width; // Retain width\r\n th.style.height = window.getComputedStyle(cell).height;\r\n firstRow.replaceChild(th, cell);\r\n }\r\n }\r\n editor.focus();\r\n }\r\n\r\n private findClosestTable(node: Node): HTMLTableElement | null {\r\n while (node && node !== document) {\r\n if (node.nodeName === 'TABLE') {\r\n return node as HTMLTableElement;\r\n }\r\n node = node.parentNode!;\r\n }\r\n return null;\r\n }\r\n\r\n private insertMarker(): void {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0).cloneRange();\r\n const marker = document.createElement('span');\r\n marker.id = 'table-marker';\r\n marker.style.display = 'none';\r\n range.insertNode(marker);\r\n }\r\n }\r\n\r\n insertTable(rows: string, cols: string): void {\r\n const rowCount = parseInt(rows, 10);\r\n const colCount = parseInt(cols, 10);\r\n\r\n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\r\n return;\r\n }\r\n\r\n const editor = this.editor.nativeElement;\r\n const marker = editor.querySelector('#table-marker');\r\n\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = tableHTML;\r\n const table = tempDiv.firstElementChild;\r\n\r\n if (marker && table) {\r\n marker.parentNode!.replaceChild(table, marker);\r\n this.setCursorToFirstCell(table as HTMLElement);\r\n editor.focus();\r\n } else {\r\n // fallback if no marker, just append\r\n this.appendTable(editor, rowCount, colCount);\r\n }\r\n }\r\n\r\n private createTableHTML(rowCount: number, colCount: number): string {\r\n let tableHTML = '<table border=\"1\" style=\"\">';\r\n for (let i = 0; i < rowCount; i++) {\r\n tableHTML += '<tr>';\r\n for (let j = 0; j < colCount; j++) {\r\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\"\r\n role=\"textbox\" contenteditable=\"true\"></td>`;\r\n }\r\n tableHTML += '</tr>';\r\n }\r\n tableHTML += '</table>';\r\n return tableHTML;\r\n }\r\n\r\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\r\n const tableHTML = this.createTableHTML(rowCount, colCount);\r\n editor.innerHTML += tableHTML;\r\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\r\n this.setCursorToFirstCell(lastInsertedTable);\r\n editor.focus();\r\n }\r\n\r\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\r\n if (!selection.rangeCount) return false;\r\n let node = selection.getRangeAt(0).commonAncestorContainer;\r\n while (node) {\r\n if (node === editor) return true;\r\n node = node.parentNode!;\r\n }\r\n return false;\r\n }\r\n\r\n private setCursorToFirstCell(table: HTMLElement): void {\r\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\r\n if (firstCell) {\r\n firstCell.setAttribute('contenteditable', 'true');\r\n firstCell.focus();\r\n const newRange = document.createRange();\r\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\r\n newRange.collapse(true); // Collapse to the start\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n }\r\n }\r\n }\r\n\r\n insertPageBreak(): void {\r\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\r\n document.execCommand('insertHTML', false, pageBreak);\r\n }\r\n\r\n submitContent(): void {\r\n const editor = this.editor.nativeElement;\r\n const content = editor.innerHTML; // Get the HTML content from the editor\r\n const plainTextContent = editor.innerText; // Optionally, get plain text content\r\n this.onChange(content);\r\n }\r\n}\r\n","<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\r\n\r\n//Mat Modules\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n declarations: [\r\n RapidTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n FormsModule, ReactiveFormsModule\r\n ],\r\n exports: [\r\n RapidTextEditorComponent\r\n ]\r\n})\r\nexport class RapidTextEditorModule { }\r\n","/*\r\n * Public API Surface of rapid-text-editor\r\n */\r\n\r\nexport * from './lib/rapid-text-editor.service';\r\nexport * from './lib/rapid-text-editor.component';\r\nexport * from './lib/rapid-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rapid-text-editor",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Rapid Text Editor",
|
|
3
|
+
"version": "1.0.15",
|
|
4
|
+
"description": "Rapid Text Editor, Fixed Drag and Drop",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^13.0.0 || 13.x",
|
|
7
7
|
"@angular/core": "^13.0.0 || 13.x"
|