@skyux/text-editor 5.7.2 → 6.0.0-beta.2

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.
Files changed (98) hide show
  1. package/documentation.json +2 -2
  2. package/esm2020/index.mjs +15 -0
  3. package/esm2020/lib/modules/rich-text-display/rich-text-display.component.mjs +36 -0
  4. package/esm2020/lib/modules/rich-text-display/rich-text-display.module.mjs +18 -0
  5. package/esm2020/lib/modules/shared/forms-utility.mjs +10 -0
  6. package/esm2020/lib/modules/shared/sky-text-editor-resources.module.mjs +106 -0
  7. package/esm2020/lib/modules/text-editor/defaults/font-list-defaults.mjs +42 -0
  8. package/esm2020/lib/modules/text-editor/defaults/font-size-list-defaults.mjs +7 -0
  9. package/esm2020/lib/modules/text-editor/defaults/menu-defaults.mjs +5 -0
  10. package/esm2020/lib/modules/text-editor/defaults/style-state-defaults.mjs +15 -0
  11. package/esm2020/lib/modules/text-editor/defaults/toolbar-action-defaults.mjs +12 -0
  12. package/esm2020/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +191 -0
  13. package/esm2020/lib/modules/text-editor/services/text-editor-adapter.service.mjs +477 -0
  14. package/esm2020/lib/modules/text-editor/services/text-editor-selection.service.mjs +80 -0
  15. package/esm2020/lib/modules/text-editor/services/text-editor.service.mjs +61 -0
  16. package/esm2020/lib/modules/text-editor/services/text-sanitization.service.mjs +38 -0
  17. package/esm2020/lib/modules/text-editor/text-editor.component.mjs +322 -0
  18. package/esm2020/lib/modules/text-editor/text-editor.module.mjs +98 -0
  19. package/esm2020/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +179 -0
  20. package/esm2020/lib/modules/text-editor/types/editor-command.mjs +2 -0
  21. package/esm2020/lib/modules/text-editor/types/editor-setting.mjs +2 -0
  22. package/esm2020/lib/modules/text-editor/types/font-state.mjs +2 -0
  23. package/esm2020/lib/modules/text-editor/types/menu-type.mjs +2 -0
  24. package/esm2020/lib/modules/text-editor/types/style-state.mjs +2 -0
  25. package/esm2020/lib/modules/text-editor/types/text-editor-merge-field.mjs +2 -0
  26. package/esm2020/lib/modules/text-editor/types/toolbar-action-type.mjs +2 -0
  27. package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal-context.mjs +6 -0
  28. package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal-result.mjs +2 -0
  29. package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +117 -0
  30. package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-target.mjs +9 -0
  31. package/esm2020/skyux-text-editor.mjs +5 -0
  32. package/fesm2015/{skyux-text-editor.js → skyux-text-editor.mjs} +45 -69
  33. package/fesm2015/skyux-text-editor.mjs.map +1 -0
  34. package/fesm2020/skyux-text-editor.mjs +1743 -0
  35. package/fesm2020/skyux-text-editor.mjs.map +1 -0
  36. package/package.json +38 -22
  37. package/bundles/skyux-text-editor.umd.js +0 -2195
  38. package/esm2015/index.js +0 -15
  39. package/esm2015/index.js.map +0 -1
  40. package/esm2015/lib/modules/rich-text-display/rich-text-display.component.js +0 -39
  41. package/esm2015/lib/modules/rich-text-display/rich-text-display.component.js.map +0 -1
  42. package/esm2015/lib/modules/rich-text-display/rich-text-display.module.js +0 -18
  43. package/esm2015/lib/modules/rich-text-display/rich-text-display.module.js.map +0 -1
  44. package/esm2015/lib/modules/shared/forms-utility.js +0 -10
  45. package/esm2015/lib/modules/shared/forms-utility.js.map +0 -1
  46. package/esm2015/lib/modules/shared/sky-text-editor-resources.module.js +0 -106
  47. package/esm2015/lib/modules/shared/sky-text-editor-resources.module.js.map +0 -1
  48. package/esm2015/lib/modules/text-editor/defaults/font-list-defaults.js +0 -42
  49. package/esm2015/lib/modules/text-editor/defaults/font-list-defaults.js.map +0 -1
  50. package/esm2015/lib/modules/text-editor/defaults/font-size-list-defaults.js +0 -7
  51. package/esm2015/lib/modules/text-editor/defaults/font-size-list-defaults.js.map +0 -1
  52. package/esm2015/lib/modules/text-editor/defaults/menu-defaults.js +0 -5
  53. package/esm2015/lib/modules/text-editor/defaults/menu-defaults.js.map +0 -1
  54. package/esm2015/lib/modules/text-editor/defaults/style-state-defaults.js +0 -15
  55. package/esm2015/lib/modules/text-editor/defaults/style-state-defaults.js.map +0 -1
  56. package/esm2015/lib/modules/text-editor/defaults/toolbar-action-defaults.js +0 -12
  57. package/esm2015/lib/modules/text-editor/defaults/toolbar-action-defaults.js.map +0 -1
  58. package/esm2015/lib/modules/text-editor/menubar/text-editor-menubar.component.js +0 -196
  59. package/esm2015/lib/modules/text-editor/menubar/text-editor-menubar.component.js.map +0 -1
  60. package/esm2015/lib/modules/text-editor/services/text-editor-adapter.service.js +0 -474
  61. package/esm2015/lib/modules/text-editor/services/text-editor-adapter.service.js.map +0 -1
  62. package/esm2015/lib/modules/text-editor/services/text-editor-selection.service.js +0 -80
  63. package/esm2015/lib/modules/text-editor/services/text-editor-selection.service.js.map +0 -1
  64. package/esm2015/lib/modules/text-editor/services/text-editor.service.js +0 -61
  65. package/esm2015/lib/modules/text-editor/services/text-editor.service.js.map +0 -1
  66. package/esm2015/lib/modules/text-editor/services/text-sanitization.service.js +0 -38
  67. package/esm2015/lib/modules/text-editor/services/text-sanitization.service.js.map +0 -1
  68. package/esm2015/lib/modules/text-editor/text-editor.component.js +0 -322
  69. package/esm2015/lib/modules/text-editor/text-editor.component.js.map +0 -1
  70. package/esm2015/lib/modules/text-editor/text-editor.module.js +0 -99
  71. package/esm2015/lib/modules/text-editor/text-editor.module.js.map +0 -1
  72. package/esm2015/lib/modules/text-editor/toolbar/text-editor-toolbar.component.js +0 -175
  73. package/esm2015/lib/modules/text-editor/toolbar/text-editor-toolbar.component.js.map +0 -1
  74. package/esm2015/lib/modules/text-editor/types/editor-command.js +0 -2
  75. package/esm2015/lib/modules/text-editor/types/editor-command.js.map +0 -1
  76. package/esm2015/lib/modules/text-editor/types/editor-setting.js +0 -2
  77. package/esm2015/lib/modules/text-editor/types/editor-setting.js.map +0 -1
  78. package/esm2015/lib/modules/text-editor/types/font-state.js +0 -2
  79. package/esm2015/lib/modules/text-editor/types/font-state.js.map +0 -1
  80. package/esm2015/lib/modules/text-editor/types/menu-type.js +0 -2
  81. package/esm2015/lib/modules/text-editor/types/menu-type.js.map +0 -1
  82. package/esm2015/lib/modules/text-editor/types/style-state.js +0 -2
  83. package/esm2015/lib/modules/text-editor/types/style-state.js.map +0 -1
  84. package/esm2015/lib/modules/text-editor/types/text-editor-merge-field.js +0 -2
  85. package/esm2015/lib/modules/text-editor/types/text-editor-merge-field.js.map +0 -1
  86. package/esm2015/lib/modules/text-editor/types/toolbar-action-type.js +0 -2
  87. package/esm2015/lib/modules/text-editor/types/toolbar-action-type.js.map +0 -1
  88. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-context.js +0 -6
  89. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-context.js.map +0 -1
  90. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-result.js +0 -2
  91. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal-result.js.map +0 -1
  92. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal.component.js +0 -121
  93. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-modal.component.js.map +0 -1
  94. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-target.js +0 -9
  95. package/esm2015/lib/modules/text-editor/url-modal/text-editor-url-target.js.map +0 -1
  96. package/esm2015/skyux-text-editor.js +0 -5
  97. package/esm2015/skyux-text-editor.js.map +0 -1
  98. package/fesm2015/skyux-text-editor.js.map +0 -1
@@ -0,0 +1,80 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * @internal
5
+ */
6
+ export class SkyTextEditorSelectionService {
7
+ isElementSelected(documentEl, element) {
8
+ const selectedNode = this.getCurrentSelection(documentEl)
9
+ .anchorNode;
10
+ /* istanbul ignore next */
11
+ return (selectedNode &&
12
+ (element.contains(selectedNode) ||
13
+ (selectedNode.parentNode && element.contains(selectedNode.parentNode))));
14
+ }
15
+ getCurrentSelection(documentEl) {
16
+ return documentEl.getSelection();
17
+ }
18
+ getCurrentSelectionParentElement(documentEl) {
19
+ const selection = this.getCurrentSelection(documentEl);
20
+ let selectedEl;
21
+ /* istanbul ignore else */
22
+ if (selection &&
23
+ selection.getRangeAt &&
24
+ selection.getRangeAt(0).commonAncestorContainer) {
25
+ selectedEl = selection.getRangeAt(0).commonAncestorContainer;
26
+ selectedEl =
27
+ selectedEl.nodeType !== 1 ? selectedEl.parentElement : selectedEl;
28
+ }
29
+ else if (selection && selection.type !== 'Control') {
30
+ selectedEl = selection.createRange().parentElement();
31
+ }
32
+ else {
33
+ return undefined;
34
+ }
35
+ return selectedEl;
36
+ }
37
+ getCurrentSelectionRange(documentEl, windowEl) {
38
+ /* istanbul ignore else */
39
+ if (windowEl.getSelection) {
40
+ const sel = windowEl.getSelection();
41
+ /* istanbul ignore else */
42
+ if (sel.getRangeAt && sel.rangeCount) {
43
+ return sel.getRangeAt(0);
44
+ }
45
+ }
46
+ else if (documentEl.getSelection() &&
47
+ documentEl.getSelection().getRangeAt) {
48
+ return documentEl.getSelection().getRangeAt(0);
49
+ }
50
+ }
51
+ selectElement(documentEl, windowEl, element) {
52
+ /* istanbul ignore else */
53
+ if (element) {
54
+ /* istanbul ignore else */
55
+ if (windowEl.getSelection) {
56
+ const sel = windowEl.getSelection();
57
+ sel.removeAllRanges();
58
+ const range = documentEl.createRange();
59
+ range.selectNodeContents(element);
60
+ sel.addRange(range);
61
+ }
62
+ else if (documentEl.getSelection) {
63
+ const sel = documentEl.getSelection();
64
+ sel.removeAllRanges();
65
+ const range = documentEl.createRange();
66
+ range.selectNodeContents(element);
67
+ sel.addRange(range);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ SkyTextEditorSelectionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
73
+ SkyTextEditorSelectionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorSelectionService, providedIn: 'root' });
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorSelectionService, decorators: [{
75
+ type: Injectable,
76
+ args: [{
77
+ providedIn: 'root',
78
+ }]
79
+ }] });
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3Itc2VsZWN0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3NlcnZpY2VzL3RleHQtZWRpdG9yLXNlbGVjdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNDOztHQUVHO0FBSUgsTUFBTSxPQUFPLDZCQUE2QjtJQUNqQyxpQkFBaUIsQ0FBQyxVQUFvQixFQUFFLE9BQW9CO1FBQ2pFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7YUFDdEQsVUFBeUIsQ0FBQztRQUM3QiwwQkFBMEI7UUFDMUIsT0FBTyxDQUNMLFlBQVk7WUFDWixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2dCQUM3QixDQUFDLFlBQVksQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVNLG1CQUFtQixDQUFDLFVBQW9CO1FBQzdDLE9BQU8sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxnQ0FBZ0MsQ0FBQyxVQUFvQjtRQUMxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsSUFBSSxVQUFtQixDQUFDO1FBQ3hCLDBCQUEwQjtRQUMxQixJQUNFLFNBQVM7WUFDVCxTQUFTLENBQUMsVUFBVTtZQUNwQixTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixFQUMvQztZQUNBLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUFrQyxDQUFDO1lBQ3hFLFVBQVU7Z0JBQ1IsVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUNyRTthQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3BELFVBQVUsR0FBSSxTQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQy9EO2FBQU07WUFDTCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFTSx3QkFBd0IsQ0FDN0IsVUFBb0IsRUFDcEIsUUFBZ0I7UUFFaEIsMEJBQTBCO1FBQzFCLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRTtZQUN6QixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsMEJBQTBCO1lBQzFCLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUNwQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUI7U0FDRjthQUFNLElBQ0wsVUFBVSxDQUFDLFlBQVksRUFBRTtZQUN6QixVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxFQUNwQztZQUNBLE9BQU8sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFTSxhQUFhLENBQ2xCLFVBQW9CLEVBQ3BCLFFBQWdCLEVBQ2hCLE9BQW9CO1FBRXBCLDBCQUEwQjtRQUMxQixJQUFJLE9BQU8sRUFBRTtZQUNYLDBCQUEwQjtZQUMxQixJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3pCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtTQUNGO0lBQ0gsQ0FBQzs7MEhBN0VVLDZCQUE2Qjs4SEFBN0IsNkJBQTZCLGNBRjVCLE1BQU07MkZBRVAsNkJBQTZCO2tCQUh6QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIGlzRWxlbWVudFNlbGVjdGVkKGRvY3VtZW50RWw6IERvY3VtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkTm9kZSA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbihkb2N1bWVudEVsKVxuICAgICAgLmFuY2hvck5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gKFxuICAgICAgc2VsZWN0ZWROb2RlICYmXG4gICAgICAoZWxlbWVudC5jb250YWlucyhzZWxlY3RlZE5vZGUpIHx8XG4gICAgICAgIChzZWxlY3RlZE5vZGUucGFyZW50Tm9kZSAmJiBlbGVtZW50LmNvbnRhaW5zKHNlbGVjdGVkTm9kZS5wYXJlbnROb2RlKSkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50RWw6IERvY3VtZW50KTogU2VsZWN0aW9uIHtcbiAgICByZXR1cm4gZG9jdW1lbnRFbC5nZXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uUGFyZW50RWxlbWVudChkb2N1bWVudEVsOiBEb2N1bWVudCk6IEVsZW1lbnQge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbihkb2N1bWVudEVsKTtcbiAgICBsZXQgc2VsZWN0ZWRFbDogRWxlbWVudDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGlvbiAmJlxuICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQgJiZcbiAgICAgIHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXG4gICAgKSB7XG4gICAgICBzZWxlY3RlZEVsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXIgYXMgRWxlbWVudDtcbiAgICAgIHNlbGVjdGVkRWwgPVxuICAgICAgICBzZWxlY3RlZEVsLm5vZGVUeXBlICE9PSAxID8gc2VsZWN0ZWRFbC5wYXJlbnRFbGVtZW50IDogc2VsZWN0ZWRFbDtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udHlwZSAhPT0gJ0NvbnRyb2wnKSB7XG4gICAgICBzZWxlY3RlZEVsID0gKHNlbGVjdGlvbiBhcyBhbnkpLmNyZWF0ZVJhbmdlKCkucGFyZW50RWxlbWVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRFbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U2VsZWN0aW9uUmFuZ2UoXG4gICAgZG9jdW1lbnRFbDogRG9jdW1lbnQsXG4gICAgd2luZG93RWw6IFdpbmRvd1xuICApOiBSYW5nZSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAod2luZG93RWwuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBzZWwgPSB3aW5kb3dFbC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoc2VsLmdldFJhbmdlQXQgJiYgc2VsLnJhbmdlQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHNlbC5nZXRSYW5nZUF0KDApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpICYmXG4gICAgICBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXRcbiAgICApIHtcbiAgICAgIHJldHVybiBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdEVsZW1lbnQoXG4gICAgZG9jdW1lbnRFbDogRG9jdW1lbnQsXG4gICAgd2luZG93RWw6IFdpbmRvdyxcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudFxuICApOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHdpbmRvd0VsLmdldFNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3dFbC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50RWwuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsZW1lbnQpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkb2N1bWVudEVsLmdldFNlbGVjdGlvbikge1xuICAgICAgICBjb25zdCBzZWwgPSBkb2N1bWVudEVsLmdldFNlbGVjdGlvbigpO1xuICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnRFbC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,61 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * @internal
5
+ */
6
+ export class SkyTextEditorService {
7
+ constructor() {
8
+ /**
9
+ * A dictionary representing all active text editors and their settings.
10
+ */
11
+ this.editors = {};
12
+ }
13
+ /**
14
+ * Returns the blur observable from the editor with the corresponding id.
15
+ */
16
+ blurListener(id) {
17
+ return this.editors[id].blurObservable;
18
+ }
19
+ /**
20
+ * Returns the click observable from the editor with the corresponding id.
21
+ */
22
+ clickListener(id) {
23
+ return this.editors[id].clickObservable;
24
+ }
25
+ /**
26
+ * Returns the command change observable from the editor with the corresponding id.
27
+ */
28
+ commandChangeListener(id) {
29
+ return this.editors[id].commandChangeObservable;
30
+ }
31
+ /**
32
+ * Returns the input change observable from the editor with the corresponding id.
33
+ */
34
+ inputListener(id) {
35
+ return this.editors[id].inputObservable;
36
+ }
37
+ /**
38
+ * Removes editor from the `editors` index by id.
39
+ */
40
+ removeEditor(id) {
41
+ /* istanbul ignore else */
42
+ if (id in this.editors) {
43
+ delete this.editors[id];
44
+ }
45
+ }
46
+ /**
47
+ * Returns the selection change observable from the editor with the corresponding id.
48
+ */
49
+ selectionChangeListener(id) {
50
+ return this.editors[id].selectionChangeObservable;
51
+ }
52
+ }
53
+ SkyTextEditorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
54
+ SkyTextEditorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorService, providedIn: 'root' });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorService, decorators: [{
56
+ type: Injectable,
57
+ args: [{
58
+ providedIn: 'root',
59
+ }]
60
+ }] });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90ZXh0LWVkaXRvci9zcmMvbGliL21vZHVsZXMvdGV4dC1lZGl0b3Ivc2VydmljZXMvdGV4dC1lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0zQzs7R0FFRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFIakM7UUFJRTs7V0FFRztRQUNJLFlBQU8sR0FBcUMsRUFBRSxDQUFDO0tBOEN2RDtJQTVDQzs7T0FFRztJQUNJLFlBQVksQ0FBQyxFQUFVO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLEVBQVU7UUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUIsQ0FBQyxFQUFVO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsRUFBVTtRQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxFQUFVO1FBQzVCLDBCQUEwQjtRQUMxQixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLHVCQUF1QixDQUFDLEVBQVU7UUFDdkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO0lBQ3BELENBQUM7O2lIQWpEVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRWRpdG9yU2V0dGluZyB9IGZyb20gJy4uL3R5cGVzL2VkaXRvci1zZXR0aW5nJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEEgZGljdGlvbmFyeSByZXByZXNlbnRpbmcgYWxsIGFjdGl2ZSB0ZXh0IGVkaXRvcnMgYW5kIHRoZWlyIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGVkaXRvcnM6IHsgW2tleTogc3RyaW5nXTogRWRpdG9yU2V0dGluZyB9ID0ge307XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJsdXIgb2JzZXJ2YWJsZSBmcm9tIHRoZSBlZGl0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBibHVyTGlzdGVuZXIoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvcnNbaWRdLmJsdXJPYnNlcnZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNsaWNrIG9ic2VydmFibGUgZnJvbSB0aGUgZWRpdG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaWQuXG4gICAqL1xuICBwdWJsaWMgY2xpY2tMaXN0ZW5lcihpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yc1tpZF0uY2xpY2tPYnNlcnZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbW1hbmQgY2hhbmdlIG9ic2VydmFibGUgZnJvbSB0aGUgZWRpdG9yIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaWQuXG4gICAqL1xuICBwdWJsaWMgY29tbWFuZENoYW5nZUxpc3RlbmVyKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JzW2lkXS5jb21tYW5kQ2hhbmdlT2JzZXJ2YWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbnB1dCBjaGFuZ2Ugb2JzZXJ2YWJsZSBmcm9tIHRoZSBlZGl0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBpZC5cbiAgICovXG4gIHB1YmxpYyBpbnB1dExpc3RlbmVyKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JzW2lkXS5pbnB1dE9ic2VydmFibGU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBlZGl0b3IgZnJvbSB0aGUgYGVkaXRvcnNgIGluZGV4IGJ5IGlkLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVkaXRvcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaWQgaW4gdGhpcy5lZGl0b3JzKSB7XG4gICAgICBkZWxldGUgdGhpcy5lZGl0b3JzW2lkXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGNoYW5nZSBvYnNlcnZhYmxlIGZyb20gdGhlIGVkaXRvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGlkLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JzW2lkXS5zZWxlY3Rpb25DaGFuZ2VPYnNlcnZhYmxlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ import { Injectable } from '@angular/core';
2
+ import createDOMPurify from 'dompurify';
3
+ import * as i0 from "@angular/core";
4
+ const domPurify = createDOMPurify(window);
5
+ domPurify.addHook('afterSanitizeAttributes', (node) => {
6
+ // Set all elements owning target to target=_blank
7
+ // so we only allow the target attribute with that value.
8
+ if (node.getAttribute('target')) {
9
+ node.setAttribute('target', '_blank');
10
+ node.setAttribute('rel', 'noopener noreferrer');
11
+ }
12
+ });
13
+ /**
14
+ * The `SkyTextSanitizationService` user the `DOMPurify` library to sanitize strings for use
15
+ * in the DOM. `DOMPurify` allows more customization than Angular's internal `DomSanitizer` so we
16
+ * can preserve `<style>` tags and allow `target` attributes for new tab links.
17
+ * @internal
18
+ */
19
+ export class SkyTextSanitizationService {
20
+ constructor() {
21
+ this.allowedAttributes = ['target'];
22
+ }
23
+ /**
24
+ * Returns a sanitized string, allowing target attribute for new tab links.
25
+ */
26
+ sanitize(htmlString) {
27
+ return domPurify.sanitize(htmlString, { ADD_ATTR: this.allowedAttributes });
28
+ }
29
+ }
30
+ SkyTextSanitizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextSanitizationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
31
+ SkyTextSanitizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextSanitizationService, providedIn: 'root' });
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextSanitizationService, decorators: [{
33
+ type: Injectable,
34
+ args: [{
35
+ providedIn: 'root',
36
+ }]
37
+ }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1zYW5pdGl6YXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy90ZXh0LWVkaXRvci9zcmMvbGliL21vZHVsZXMvdGV4dC1lZGl0b3Ivc2VydmljZXMvdGV4dC1zYW5pdGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sZUFBZSxNQUFNLFdBQVcsQ0FBQzs7QUFFeEMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRTFDLFNBQVMsQ0FBQyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM3RCxrREFBa0Q7SUFDbEQseURBQXlEO0lBQ3pELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQ2pEO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTywwQkFBMEI7SUFIdkM7UUFJVSxzQkFBaUIsR0FBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBUWxEO0lBTkM7O09BRUc7SUFDSSxRQUFRLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7O3VIQVJVLDBCQUEwQjsySEFBMUIsMEJBQTBCLGNBRnpCLE1BQU07MkZBRVAsMEJBQTBCO2tCQUh0QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IGNyZWF0ZURPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuXG5jb25zdCBkb21QdXJpZnkgPSBjcmVhdGVET01QdXJpZnkod2luZG93KTtcblxuZG9tUHVyaWZ5LmFkZEhvb2soJ2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzJywgKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgLy8gU2V0IGFsbCBlbGVtZW50cyBvd25pbmcgdGFyZ2V0IHRvIHRhcmdldD1fYmxhbmtcbiAgLy8gc28gd2Ugb25seSBhbGxvdyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSB3aXRoIHRoYXQgdmFsdWUuXG4gIGlmIChub2RlLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpO1xuICB9XG59KTtcblxuLyoqXG4gKiBUaGUgYFNreVRleHRTYW5pdGl6YXRpb25TZXJ2aWNlYCB1c2VyIHRoZSBgRE9NUHVyaWZ5YCBsaWJyYXJ5IHRvIHNhbml0aXplIHN0cmluZ3MgZm9yIHVzZVxuICogaW4gdGhlIERPTS4gYERPTVB1cmlmeWAgYWxsb3dzIG1vcmUgY3VzdG9taXphdGlvbiB0aGFuIEFuZ3VsYXIncyBpbnRlcm5hbCBgRG9tU2FuaXRpemVyYCBzbyB3ZVxuICogY2FuIHByZXNlcnZlIGA8c3R5bGU+YCB0YWdzIGFuZCBhbGxvdyBgdGFyZ2V0YCBhdHRyaWJ1dGVzIGZvciBuZXcgdGFiIGxpbmtzLlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lUZXh0U2FuaXRpemF0aW9uU2VydmljZSB7XG4gIHByaXZhdGUgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gWyd0YXJnZXQnXTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIHNhbml0aXplZCBzdHJpbmcsIGFsbG93aW5nIHRhcmdldCBhdHRyaWJ1dGUgZm9yIG5ldyB0YWIgbGlua3MuXG4gICAqL1xuICBwdWJsaWMgc2FuaXRpemUoaHRtbFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9tUHVyaWZ5LnNhbml0aXplKGh0bWxTdHJpbmcsIHsgQUREX0FUVFI6IHRoaXMuYWxsb3dlZEF0dHJpYnV0ZXMgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,322 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, NgZone, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { NgControl } from '@angular/forms';
3
+ import { SkyCoreAdapterService } from '@skyux/core';
4
+ import { Subject } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import { SkyFormsUtility } from '../shared/forms-utility';
7
+ import { FONT_LIST_DEFAULTS } from './defaults/font-list-defaults';
8
+ import { FONT_SIZE_LIST_DEFAULTS } from './defaults/font-size-list-defaults';
9
+ import { MENU_DEFAULTS } from './defaults/menu-defaults';
10
+ import { STYLE_STATE_DEFAULTS } from './defaults/style-state-defaults';
11
+ import { TOOLBAR_ACTION_DEFAULTS } from './defaults/toolbar-action-defaults';
12
+ import { SkyTextEditorAdapterService } from './services/text-editor-adapter.service';
13
+ import { SkyTextEditorService } from './services/text-editor.service';
14
+ import { SkyTextSanitizationService } from './services/text-sanitization.service';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@skyux/core";
17
+ import * as i2 from "./services/text-editor-adapter.service";
18
+ import * as i3 from "./services/text-editor.service";
19
+ import * as i4 from "./services/text-sanitization.service";
20
+ import * as i5 from "@angular/forms";
21
+ import * as i6 from "@skyux/layout";
22
+ import * as i7 from "./menubar/text-editor-menubar.component";
23
+ import * as i8 from "./toolbar/text-editor-toolbar.component";
24
+ import * as i9 from "@angular/common";
25
+ /**
26
+ * Auto-incrementing integer used to generate unique ids for radio components.
27
+ */
28
+ let nextUniqueId = 0;
29
+ /**
30
+ * The text editor component lets users format and manipulate text.
31
+ */
32
+ export class SkyTextEditorComponent {
33
+ constructor(changeDetector, coreAdapterService, adapterService, editorService, sanitizationService, ngControl, zone) {
34
+ this.changeDetector = changeDetector;
35
+ this.coreAdapterService = coreAdapterService;
36
+ this.adapterService = adapterService;
37
+ this.editorService = editorService;
38
+ this.sanitizationService = sanitizationService;
39
+ this.ngControl = ngControl;
40
+ this.zone = zone;
41
+ /**
42
+ * Indicates whether to put focus on the editor after it renders.
43
+ */
44
+ this.autofocus = false;
45
+ this.editorFocusStream = new Subject();
46
+ /**
47
+ * Specifies the fonts to include in the font picker.
48
+ * @default [{name: 'Blackbaud Sans', value: '"Blackbaud Sans", Arial, sans-serif'}, {name: 'Arial', value: 'Arial'}, {name: 'Arial Black', value: '"Arial Black"'}, {name: 'Courier New', value: '"Courier New"'}, {name: 'Georgia', value: 'Georgia, serif'}, {name: 'Tahoma', value: 'Tahoma, Geneva, sans-serif'}, {name: 'Times New Roman', value: '"Times New Roman"'}, {name: 'Trebuchet MS', value: '"Trebuchet MS", sans-serif'}, {name: 'Verdana', value: 'Verdana, Geneva, sans-serif'}]
49
+ */
50
+ this.fontList = FONT_LIST_DEFAULTS;
51
+ /**
52
+ * Specifies the font sizes to include in the font size picker.
53
+ * @default [6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 36, 48]
54
+ */
55
+ this.fontSizeList = FONT_SIZE_LIST_DEFAULTS;
56
+ /**
57
+ * Specifies a unique ID attribute for the text editor.
58
+ * By default, the component generates a random ID.
59
+ */
60
+ this.id = `sky-text-editor-${++nextUniqueId}`;
61
+ /**
62
+ * Specifies the menus to include in the menu bar.
63
+ * @default [ 'edit', 'format' ]
64
+ */
65
+ this.menus = MENU_DEFAULTS;
66
+ /**
67
+ * Specifies the merge fields to include in the merge field menu.
68
+ */
69
+ this.mergeFields = [];
70
+ /**
71
+ * Specifies the actions to include in the toolbar and determines their order.
72
+ * @default [ 'font-family', 'font-size', 'font-style', 'color', 'list', 'link ]
73
+ */
74
+ this.toolbarActions = TOOLBAR_ACTION_DEFAULTS;
75
+ this.focusInitialized = false;
76
+ this.initialized = false;
77
+ this.ngUnsubscribe = new Subject();
78
+ this._disabled = false;
79
+ this._initialStyleState = Object.assign({}, STYLE_STATE_DEFAULTS);
80
+ this._placeholder = '';
81
+ this._value = '<p></p>';
82
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
83
+ this._onTouched = () => { };
84
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
85
+ this._onChange = () => { };
86
+ this.ngControl.valueAccessor = this;
87
+ }
88
+ /**
89
+ * Indicates whether to disable the text editor.
90
+ * @default false
91
+ */
92
+ set disabled(value) {
93
+ const coercedValue = SkyFormsUtility.coerceBooleanProperty(value);
94
+ if (coercedValue !== this.disabled) {
95
+ this._disabled = coercedValue;
96
+ // Update focusableChildren inside the iframe.
97
+ let focusableChildren;
98
+ /* istanbul ignore else */
99
+ if (this.iframeRef) {
100
+ focusableChildren = this.coreAdapterService.getFocusableChildren(this.iframeRef.nativeElement.contentDocument.body, {
101
+ ignoreVisibility: true,
102
+ ignoreTabIndex: true,
103
+ });
104
+ }
105
+ if (this._disabled) {
106
+ this.adapterService.disableEditor(this.id, focusableChildren, this.iframeRef.nativeElement);
107
+ }
108
+ else {
109
+ this.adapterService.enableEditor(this.id, focusableChildren, this.iframeRef.nativeElement);
110
+ }
111
+ this.changeDetector.markForCheck();
112
+ }
113
+ }
114
+ get disabled() {
115
+ return this._disabled;
116
+ }
117
+ /**
118
+ * Specifies the initial styles for all content, including background color, font size, and link state.
119
+ */
120
+ set initialStyleState(state) {
121
+ // Do not update the state after initialization has taken place
122
+ /* istanbul ignore else */
123
+ if (!this.initialized) {
124
+ this._initialStyleState = {
125
+ ...STYLE_STATE_DEFAULTS,
126
+ ...state,
127
+ };
128
+ }
129
+ }
130
+ get initialStyleState() {
131
+ return this._initialStyleState;
132
+ }
133
+ /**
134
+ * Specifies placeholder text to display when the text entry area is empty.
135
+ */
136
+ set placeholder(value) {
137
+ /* istanbul ignore else */
138
+ if (value !== this._placeholder) {
139
+ this._placeholder = value;
140
+ if (this.initialized) {
141
+ this.adapterService.setPlaceholder(this.id, value);
142
+ }
143
+ }
144
+ }
145
+ get placeholder() {
146
+ return this._placeholder;
147
+ }
148
+ /**
149
+ * The internal value of the control.
150
+ */
151
+ set value(value) {
152
+ // Normalize value and set any empty state to an empty string.
153
+ let normalizedValue = value;
154
+ if (!value ||
155
+ value.trim() === '<p></p>' ||
156
+ value.trim() === '<br>' ||
157
+ value.trim() === '<p><br></p>') {
158
+ normalizedValue = '';
159
+ }
160
+ normalizedValue = this.sanitizationService.sanitize(normalizedValue).trim();
161
+ if (this._value !== normalizedValue) {
162
+ this._value = normalizedValue;
163
+ // Update angular form control if model has been normalized.
164
+ /* istanbul ignore else */
165
+ if (this.ngControl && this.ngControl.control) {
166
+ /* istanbul ignore else */
167
+ if (normalizedValue !== this.ngControl.control.value) {
168
+ this.ngControl.control.setValue(normalizedValue, {
169
+ emitModelToViewChange: false,
170
+ });
171
+ }
172
+ }
173
+ // Autofocus isn't testable in Firefox and IE.
174
+ /* istanbul ignore next */
175
+ if (this.autofocus && !this.focusInitialized) {
176
+ this.adapterService.focusEditor(this.id);
177
+ this.focusInitialized = true;
178
+ }
179
+ }
180
+ }
181
+ get value() {
182
+ return this._value;
183
+ }
184
+ ngAfterViewInit() {
185
+ this.initIframe();
186
+ }
187
+ ngOnDestroy() {
188
+ this.adapterService.removeObservers(this.editorService.editors[this.id]);
189
+ this.editorService.removeEditor(this.id);
190
+ this.ngUnsubscribe.next();
191
+ this.ngUnsubscribe.complete();
192
+ }
193
+ onIframeLoad() {
194
+ // Remove editor if it already exists to cover situations where the text editor might have been moved in the DOM.
195
+ /* istanbul ignore else */
196
+ if (this.editorService.editors[this.id]) {
197
+ this.editorService.removeEditor(this.id);
198
+ this.initIframe();
199
+ }
200
+ }
201
+ /**
202
+ * Implemented as part of ControlValueAccessor.
203
+ */
204
+ writeValue(value) {
205
+ this.value = value;
206
+ // Update HTML if necessary.
207
+ const editorValue = this.adapterService.getEditorInnerHtml(this.id);
208
+ if (this.initialized && editorValue !== this._value) {
209
+ this.adapterService.setEditorInnerHtml(this.id, this._value);
210
+ }
211
+ }
212
+ /**
213
+ * Implemented as part of ControlValueAccessor.
214
+ */
215
+ registerOnChange(fn) {
216
+ this._onChange = fn;
217
+ }
218
+ /**
219
+ * Implemented as part of ControlValueAccessor.
220
+ */
221
+ registerOnTouched(fn) {
222
+ this._onTouched = fn;
223
+ }
224
+ /**
225
+ * Implemented as part of ControlValueAccessor.
226
+ */
227
+ setDisabledState(isDisabled) {
228
+ this.disabled = isDisabled;
229
+ }
230
+ updateStyle() {
231
+ this._initialStyleState = {
232
+ ...this._initialStyleState,
233
+ ...this.adapterService.getStyleState(this.id),
234
+ };
235
+ }
236
+ initIframe() {
237
+ this.adapterService.addEditor(this.id, this.iframeRef.nativeElement, this.initialStyleState, this.placeholder);
238
+ this.editorService
239
+ .inputListener(this.id)
240
+ .pipe(takeUntil(this.ngUnsubscribe))
241
+ .subscribe(() => {
242
+ // Angular doesn't run change detection for changes originating inside an iframe,
243
+ // so we have to call the onChange() event inside NgZone to force change propigation to consuming components.
244
+ this.zone.run(() => {
245
+ this.ViewToModelUpdate();
246
+ });
247
+ });
248
+ this.editorService
249
+ .selectionChangeListener(this.id)
250
+ .pipe(takeUntil(this.ngUnsubscribe))
251
+ .subscribe(() => {
252
+ this.updateStyle();
253
+ this.editorFocusStream.next();
254
+ });
255
+ this.editorService
256
+ .clickListener(this.id)
257
+ .pipe(takeUntil(this.ngUnsubscribe))
258
+ .subscribe(() => {
259
+ this.editorFocusStream.next();
260
+ });
261
+ this.editorService
262
+ .blurListener(this.id)
263
+ .pipe(takeUntil(this.ngUnsubscribe))
264
+ .subscribe(() => {
265
+ // Angular doesn't run change detection for changes originating inside an iframe,
266
+ // so we have to run markForCheck() inside the NgZone to force change propigation to consuming components.
267
+ this.zone.run(() => {
268
+ this._onTouched();
269
+ });
270
+ });
271
+ this.editorService
272
+ .commandChangeListener(this.id)
273
+ .pipe(takeUntil(this.ngUnsubscribe))
274
+ .subscribe(() => {
275
+ this.updateStyle();
276
+ this.ViewToModelUpdate();
277
+ });
278
+ this.adapterService.setEditorInnerHtml(this.id, this._value);
279
+ /* istanbul ignore next */
280
+ if (this.autofocus) {
281
+ this.adapterService.focusEditor(this.id);
282
+ }
283
+ this.initialized = true;
284
+ }
285
+ ViewToModelUpdate(emitChange = true) {
286
+ this.value = this.adapterService.getEditorInnerHtml(this.id);
287
+ /* istanbul ignore else */
288
+ if (emitChange) {
289
+ this._onChange(this._value);
290
+ }
291
+ }
292
+ }
293
+ SkyTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyCoreAdapterService }, { token: i2.SkyTextEditorAdapterService }, { token: i3.SkyTextEditorService }, { token: i4.SkyTextSanitizationService }, { token: i5.NgControl }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
294
+ SkyTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: SkyTextEditorComponent, selector: "sky-text-editor", inputs: { autofocus: "autofocus", disabled: "disabled", fontList: "fontList", fontSizeList: "fontSizeList", id: "id", initialStyleState: "initialStyleState", menus: "menus", mergeFields: "mergeFields", placeholder: "placeholder", toolbarActions: "toolbarActions" }, viewQueries: [{ propertyName: "iframeRef", first: true, predicate: ["iframe"], descendants: true }], ngImport: i0, template: "<div class=\"sky-text-editor\">\n <sky-toolbar class=\"sky-text-editor-toolbar\">\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"menubar\"\n role=\"toolbar\"\n >\n <sky-text-editor-menubar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [menus]=\"menus\"\n [mergeFields]=\"mergeFields\"\n >\n </sky-text-editor-menubar>\n </sky-toolbar-section>\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"toolbar\"\n role=\"toolbar\"\n >\n <sky-text-editor-toolbar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [fontList]=\"fontList\"\n [fontSizeList]=\"fontSizeList\"\n [toolbarActions]=\"toolbarActions\"\n [styleState]=\"initialStyleState\"\n >\n </sky-text-editor-toolbar>\n </sky-toolbar-section>\n </sky-toolbar>\n <iframe\n class=\"sky-text-editor-wrapper\"\n src=\"about:blank\"\n title=\"Text Editor\"\n [ngClass]=\"{\n 'sky-text-editor-wrapper-disabled': disabled\n }\"\n (load)=\"onIframeLoad()\"\n #iframe\n >\n </iframe>\n</div>\n", styles: [".sky-text-editor .sky-text-editor-wrapper{display:flex;flex-wrap:wrap;background-color:#fff;width:100%;height:300px;padding:1rem;font-size:1.2rem;border:1px solid #c0c0c0;overflow-y:auto;outline:none}.sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ededee}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-left:1px solid #cdcfd2!important;border-right:1px solid #cdcfd2!important}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-dropdown-button{border:none}.sky-text-editor .sky-text-editor-toolbar sky-text-editor-menubar,.sky-text-editor .sky-text-editor-toolbar sky-text-editor-toolbar{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper{border:1px solid #d2d2d2}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ececed}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar{padding:10px 10px 0}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-top:1px solid #d2d2d2!important;border-left:1px solid #d2d2d2!important;border-right:1px solid #d2d2d2!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 0 0!important}\n"], components: [{ type: i6.λ37, selector: "sky-toolbar" }, { type: i6.λ38, selector: "sky-toolbar-section" }, { type: i7.SkyTextEditorMenubarComponent, selector: "sky-text-editor-menubar", inputs: ["editorFocusStream", "editorId", "menus", "mergeFields", "disabled"] }, { type: i8.SkyTextEditorToolbarComponent, selector: "sky-text-editor-toolbar", inputs: ["editorFocusStream", "editorId", "fontList", "fontSizeList", "toolbarActions", "styleState", "disabled"] }], directives: [{ type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
295
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: SkyTextEditorComponent, decorators: [{
296
+ type: Component,
297
+ args: [{ selector: 'sky-text-editor', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"sky-text-editor\">\n <sky-toolbar class=\"sky-text-editor-toolbar\">\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"menubar\"\n role=\"toolbar\"\n >\n <sky-text-editor-menubar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [menus]=\"menus\"\n [mergeFields]=\"mergeFields\"\n >\n </sky-text-editor-menubar>\n </sky-toolbar-section>\n <sky-toolbar-section\n aria-label=\"Text formatting\"\n class=\"toolbar\"\n role=\"toolbar\"\n >\n <sky-text-editor-toolbar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [editorId]=\"id\"\n [fontList]=\"fontList\"\n [fontSizeList]=\"fontSizeList\"\n [toolbarActions]=\"toolbarActions\"\n [styleState]=\"initialStyleState\"\n >\n </sky-text-editor-toolbar>\n </sky-toolbar-section>\n </sky-toolbar>\n <iframe\n class=\"sky-text-editor-wrapper\"\n src=\"about:blank\"\n title=\"Text Editor\"\n [ngClass]=\"{\n 'sky-text-editor-wrapper-disabled': disabled\n }\"\n (load)=\"onIframeLoad()\"\n #iframe\n >\n </iframe>\n</div>\n", styles: [".sky-text-editor .sky-text-editor-wrapper{display:flex;flex-wrap:wrap;background-color:#fff;width:100%;height:300px;padding:1rem;font-size:1.2rem;border:1px solid #c0c0c0;overflow-y:auto;outline:none}.sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ededee}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-left:1px solid #cdcfd2!important;border-right:1px solid #cdcfd2!important}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-dropdown-button{border:none}.sky-text-editor .sky-text-editor-toolbar sky-text-editor-menubar,.sky-text-editor .sky-text-editor-toolbar sky-text-editor-toolbar{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper{border:1px solid #d2d2d2}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ececed}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar{padding:10px 10px 0}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-top:1px solid #d2d2d2!important;border-left:1px solid #d2d2d2!important;border-right:1px solid #d2d2d2!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 0 0!important}\n"] }]
298
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyCoreAdapterService }, { type: i2.SkyTextEditorAdapterService }, { type: i3.SkyTextEditorService }, { type: i4.SkyTextSanitizationService }, { type: i5.NgControl }, { type: i0.NgZone }]; }, propDecorators: { autofocus: [{
299
+ type: Input
300
+ }], disabled: [{
301
+ type: Input
302
+ }], fontList: [{
303
+ type: Input
304
+ }], fontSizeList: [{
305
+ type: Input
306
+ }], id: [{
307
+ type: Input
308
+ }], initialStyleState: [{
309
+ type: Input
310
+ }], menus: [{
311
+ type: Input
312
+ }], mergeFields: [{
313
+ type: Input
314
+ }], placeholder: [{
315
+ type: Input
316
+ }], toolbarActions: [{
317
+ type: Input
318
+ }], iframeRef: [{
319
+ type: ViewChild,
320
+ args: ['iframe']
321
+ }] } });
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RleHQtZWRpdG9yL3NyYy9saWIvbW9kdWxlcy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFB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SUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxhQUFzQixJQUFJO1FBQ2xELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0QsMEJBQTBCO1FBQzFCLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDOzttSEE3VVUsc0JBQXNCO3VHQUF0QixzQkFBc0Isc2FDakRuQyxxdUNBNkNBOzJGRElhLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTsrU0FPOUIsU0FBUztzQkFEZixLQUFLO2dCQVFLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBK0NDLFFBQVE7c0JBRGQsS0FBSztnQkFRQyxZQUFZO3NCQURsQixLQUFLO2dCQVFDLEVBQUU7c0JBRFIsS0FBSztnQkFPSyxpQkFBaUI7c0JBRDNCLEtBQUs7Z0JBcUJDLEtBQUs7c0JBRFgsS0FBSztnQkFPQyxXQUFXO3NCQURqQixLQUFLO2dCQU9LLFdBQVc7c0JBRHJCLEtBQUs7Z0JBb0JDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBaURFLFNBQVM7c0JBRGhCLFNBQVM7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUZvcm1zVXRpbGl0eSB9IGZyb20gJy4uL3NoYXJlZC9mb3Jtcy11dGlsaXR5JztcblxuaW1wb3J0IHsgRk9OVF9MSVNUX0RFRkFVTFRTIH0gZnJvbSAnLi9kZWZhdWx0cy9mb250LWxpc3QtZGVmYXVsdHMnO1xuaW1wb3J0IHsgRk9OVF9TSVpFX0xJU1RfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL2ZvbnQtc2l6ZS1saXN0LWRlZmF1bHRzJztcbmltcG9ydCB7IE1FTlVfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL21lbnUtZGVmYXVsdHMnO1xuaW1wb3J0IHsgU1RZTEVfU1RBVEVfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL3N0eWxlLXN0YXRlLWRlZmF1bHRzJztcbmltcG9ydCB7IFRPT0xCQVJfQUNUSU9OX0RFRkFVTFRTIH0gZnJvbSAnLi9kZWZhdWx0cy90b29sYmFyLWFjdGlvbi1kZWZhdWx0cyc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RleHQtZWRpdG9yLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lUZXh0U2FuaXRpemF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1zYW5pdGl6YXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yRm9udCB9IGZyb20gJy4vdHlwZXMvZm9udC1zdGF0ZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yTWVudVR5cGUgfSBmcm9tICcuL3R5cGVzL21lbnUtdHlwZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZSB9IGZyb20gJy4vdHlwZXMvc3R5bGUtc3RhdGUnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvck1lcmdlRmllbGQgfSBmcm9tICcuL3R5cGVzL3RleHQtZWRpdG9yLW1lcmdlLWZpZWxkJztcbmltcG9ydCB7IFNreVRleHRFZGl0b3JUb29sYmFyQWN0aW9uVHlwZSB9IGZyb20gJy4vdHlwZXMvdG9vbGJhci1hY3Rpb24tdHlwZSc7XG5cbi8qKlxuICogQXV0by1pbmNyZW1lbnRpbmcgaW50ZWdlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBpZHMgZm9yIHJhZGlvIGNvbXBvbmVudHMuXG4gKi9cbmxldCBuZXh0VW5pcXVlSWQgPSAwO1xuXG4vKipcbiAqIFRoZSB0ZXh0IGVkaXRvciBjb21wb25lbnQgbGV0cyB1c2VycyBmb3JtYXQgYW5kIG1hbmlwdWxhdGUgdGV4dC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRleHQtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gcHV0IGZvY3VzIG9uIHRoZSBlZGl0b3IgYWZ0ZXIgaXQgcmVuZGVycy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvZm9jdXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgdGV4dCBlZGl0b3IuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgY29lcmNlZFZhbHVlID0gU2t5Rm9ybXNVdGlsaXR5LmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgaWYgKGNvZXJjZWRWYWx1ZSAhPT0gdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VkVmFsdWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBmb2N1c2FibGVDaGlsZHJlbiBpbnNpZGUgdGhlIGlmcmFtZS5cbiAgICAgIGxldCBmb2N1c2FibGVDaGlsZHJlbjogSFRNTEVsZW1lbnRbXTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAodGhpcy5pZnJhbWVSZWYpIHtcbiAgICAgICAgZm9jdXNhYmxlQ2hpbGRyZW4gPSB0aGlzLmNvcmVBZGFwdGVyU2VydmljZS5nZXRGb2N1c2FibGVDaGlsZHJlbihcbiAgICAgICAgICB0aGlzLmlmcmFtZVJlZi5uYXRpdmVFbGVtZW50LmNvbnRlbnREb2N1bWVudC5ib2R5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlnbm9yZVZpc2liaWxpdHk6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVUYWJJbmRleDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmRpc2FibGVFZGl0b3IoXG4gICAgICAgICAgdGhpcy5pZCxcbiAgICAgICAgICBmb2N1c2FibGVDaGlsZHJlbixcbiAgICAgICAgICB0aGlzLmlmcmFtZVJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmVuYWJsZUVkaXRvcihcbiAgICAgICAgICB0aGlzLmlkLFxuICAgICAgICAgIGZvY3VzYWJsZUNoaWxkcmVuLFxuICAgICAgICAgIHRoaXMuaWZyYW1lUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgZWRpdG9yRm9jdXNTdHJlYW0gPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvbnRzIHRvIGluY2x1ZGUgaW4gdGhlIGZvbnQgcGlja2VyLlxuICAgKiBAZGVmYXVsdCBbe25hbWU6ICdCbGFja2JhdWQgU2FucycsIHZhbHVlOiAnXCJCbGFja2JhdWQgU2Fuc1wiLCBBcmlhbCwgc2Fucy1zZXJpZid9LCB7bmFtZTogJ0FyaWFsJywgdmFsdWU6ICdBcmlhbCd9LCB7bmFtZTogJ0FyaWFsIEJsYWNrJywgdmFsdWU6ICdcIkFyaWFsIEJsYWNrXCInfSwge25hbWU6ICdDb3VyaWVyIE5ldycsIHZhbHVlOiAnXCJDb3VyaWVyIE5ld1wiJ30sIHtuYW1lOiAnR2VvcmdpYScsIHZhbHVlOiAnR2VvcmdpYSwgc2VyaWYnfSwge25hbWU6ICdUYWhvbWEnLCB2YWx1ZTogJ1RhaG9tYSwgR2VuZXZhLCBzYW5zLXNlcmlmJ30sIHtuYW1lOiAnVGltZXMgTmV3IFJvbWFuJywgdmFsdWU6ICdcIlRpbWVzIE5ldyBSb21hblwiJ30sIHtuYW1lOiAnVHJlYnVjaGV0IE1TJywgdmFsdWU6ICdcIlRyZWJ1Y2hldCBNU1wiLCBzYW5zLXNlcmlmJ30sIHtuYW1lOiAnVmVyZGFuYScsIHZhbHVlOiAnVmVyZGFuYSwgR2VuZXZhLCBzYW5zLXNlcmlmJ31dXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZm9udExpc3Q6IFNreVRleHRFZGl0b3JGb250W10gPSBGT05UX0xJU1RfREVGQVVMVFM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9udCBzaXplcyB0byBpbmNsdWRlIGluIHRoZSBmb250IHNpemUgcGlja2VyLlxuICAgKiBAZGVmYXVsdCBbNiwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDM2LCA0OF1cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmb250U2l6ZUxpc3Q6IG51bWJlcltdID0gRk9OVF9TSVpFX0xJU1RfREVGQVVMVFM7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHVuaXF1ZSBJRCBhdHRyaWJ1dGUgZm9yIHRoZSB0ZXh0IGVkaXRvci5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGNvbXBvbmVudCBnZW5lcmF0ZXMgYSByYW5kb20gSUQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaWQgPSBgc2t5LXRleHQtZWRpdG9yLSR7KytuZXh0VW5pcXVlSWR9YDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHN0eWxlcyBmb3IgYWxsIGNvbnRlbnQsIGluY2x1ZGluZyBiYWNrZ3JvdW5kIGNvbG9yLCBmb250IHNpemUsIGFuZCBsaW5rIHN0YXRlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbml0aWFsU3R5bGVTdGF0ZShzdGF0ZTogU2t5VGV4dEVkaXRvclN0eWxlU3RhdGUpIHtcbiAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSBzdGF0ZSBhZnRlciBpbml0aWFsaXphdGlvbiBoYXMgdGFrZW4gcGxhY2VcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5faW5pdGlhbFN0eWxlU3RhdGUgPSB7XG4gICAgICAgIC4uLlNUWUxFX1NUQVRFX0RFRkFVTFRTLFxuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbml0aWFsU3R5bGVTdGF0ZSgpOiBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxTdHlsZVN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWVudXMgdG8gaW5jbHVkZSBpbiB0aGUgbWVudSBiYXIuXG4gICAqIEBkZWZhdWx0IFsgJ2VkaXQnLCAnZm9ybWF0JyBdXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWVudXM6IFNreVRleHRFZGl0b3JNZW51VHlwZVtdID0gTUVOVV9ERUZBVUxUUztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBtZXJnZSBmaWVsZHMgdG8gaW5jbHVkZSBpbiB0aGUgbWVyZ2UgZmllbGQgbWVudS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtZXJnZUZpZWxkczogU2t5VGV4dEVkaXRvck1lcmdlRmllbGRbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgcGxhY2Vob2xkZXIgdGV4dCB0byBkaXNwbGF5IHdoZW4gdGhlIHRleHQgZW50cnkgYXJlYSBpcyBlbXB0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLl9wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0UGxhY2Vob2xkZXIodGhpcy5pZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBhY3Rpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHRvb2xiYXIgYW5kIGRldGVybWluZXMgdGhlaXIgb3JkZXIuXG4gICAqIEBkZWZhdWx0IFsgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXN0eWxlJywgJ2NvbG9yJywgJ2xpc3QnLCAnbGluayBdXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdG9vbGJhckFjdGlvbnM6IFNreVRleHRFZGl0b3JUb29sYmFyQWN0aW9uVHlwZVtdID0gVE9PTEJBUl9BQ1RJT05fREVGQVVMVFM7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCB2YWx1ZSBvZiB0aGUgY29udHJvbC5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIC8vIE5vcm1hbGl6ZSB2YWx1ZSBhbmQgc2V0IGFueSBlbXB0eSBzdGF0ZSB0byBhbiBlbXB0eSBzdHJpbmcuXG4gICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZTogc3RyaW5nID0gdmFsdWU7XG4gICAgaWYgKFxuICAgICAgIXZhbHVlIHx8XG4gICAgICB2YWx1ZS50cmltKCkgPT09ICc8cD48L3A+JyB8fFxuICAgICAgdmFsdWUudHJpbSgpID09PSAnPGJyPicgfHxcbiAgICAgIHZhbHVlLnRyaW0oKSA9PT0gJzxwPjxicj48L3A+J1xuICAgICkge1xuICAgICAgbm9ybWFsaXplZFZhbHVlID0gJyc7XG4gICAgfVxuICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IHRoaXMuc2FuaXRpemF0aW9uU2VydmljZS5zYW5pdGl6ZShub3JtYWxpemVkVmFsdWUpLnRyaW0oKTtcblxuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gbm9ybWFsaXplZFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZTtcblxuICAgICAgLy8gVXBkYXRlIGFuZ3VsYXIgZm9ybSBjb250cm9sIGlmIG1vZGVsIGhhcyBiZWVuIG5vcm1hbGl6ZWQuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRWYWx1ZSAhPT0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuc2V0VmFsdWUobm9ybWFsaXplZFZhbHVlLCB7XG4gICAgICAgICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEF1dG9mb2N1cyBpc24ndCB0ZXN0YWJsZSBpbiBGaXJlZm94IGFuZCBJRS5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAodGhpcy5hdXRvZm9jdXMgJiYgIXRoaXMuZm9jdXNJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmZvY3VzRWRpdG9yKHRoaXMuaWQpO1xuICAgICAgICB0aGlzLmZvY3VzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdpZnJhbWUnKVxuICBwcml2YXRlIGlmcmFtZVJlZjogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2luaXRpYWxTdHlsZVN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgU1RZTEVfU1RBVEVfREVGQVVMVFMpO1xuXG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyID0gJyc7XG5cbiAgcHJpdmF0ZSBfdmFsdWUgPSAnPHA+PC9wPic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBjb3JlQWRhcHRlclNlcnZpY2U6IFNreUNvcmVBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFkYXB0ZXJTZXJ2aWNlOiBTa3lUZXh0RWRpdG9yQWRhcHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBTa3lUZXh0RWRpdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHNhbml0aXphdGlvblNlcnZpY2U6IFNreVRleHRTYW5pdGl6YXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdElmcmFtZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuYWRhcHRlclNlcnZpY2UucmVtb3ZlT2JzZXJ2ZXJzKHRoaXMuZWRpdG9yU2VydmljZS5lZGl0b3JzW3RoaXMuaWRdKTtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UucmVtb3ZlRWRpdG9yKHRoaXMuaWQpO1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgb25JZnJhbWVMb2FkKCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBlZGl0b3IgaWYgaXQgYWxyZWFkeSBleGlzdHMgdG8gY292ZXIgc2l0dWF0aW9ucyB3aGVyZSB0aGUgdGV4dCBlZGl0b3IgbWlnaHQgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSBET00uXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5lZGl0b3JTZXJ2aWNlLmVkaXRvcnNbdGhpcy5pZF0pIHtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5yZW1vdmVFZGl0b3IodGhpcy5pZCk7XG4gICAgICB0aGlzLmluaXRJZnJhbWUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cbiAgICAvLyBVcGRhdGUgSFRNTCBpZiBuZWNlc3NhcnkuXG4gICAgY29uc3QgZWRpdG9yVmFsdWUgPSB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmdldEVkaXRvcklubmVySHRtbCh0aGlzLmlkKTtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiBlZGl0b3JWYWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2Uuc2V0RWRpdG9ySW5uZXJIdG1sKHRoaXMuaWQsIHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRpYWxTdHlsZVN0YXRlID0ge1xuICAgICAgLi4udGhpcy5faW5pdGlhbFN0eWxlU3RhdGUsXG4gICAgICAuLi4odGhpcy5hZGFwdGVyU2VydmljZS5nZXRTdHlsZVN0YXRlKHRoaXMuaWQpIGFzIGFueSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdElmcmFtZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmFkZEVkaXRvcihcbiAgICAgIHRoaXMuaWQsXG4gICAgICB0aGlzLmlmcmFtZVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5pbml0aWFsU3R5bGVTdGF0ZSxcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJcbiAgICApO1xuXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlXG4gICAgICAuaW5wdXRMaXN0ZW5lcih0aGlzLmlkKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQW5ndWxhciBkb2Vzbid0IHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGZvciBjaGFuZ2VzIG9yaWdpbmF0aW5nIGluc2lkZSBhbiBpZnJhbWUsXG4gICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY2FsbCB0aGUgb25DaGFuZ2UoKSBldmVudCBpbnNpZGUgTmdab25lIHRvIGZvcmNlIGNoYW5nZSBwcm9waWdhdGlvbiB0byBjb25zdW1pbmcgY29tcG9uZW50cy5cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5WaWV3VG9Nb2RlbFVwZGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlXG4gICAgICAuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcbiAgICAgICAgdGhpcy5lZGl0b3JGb2N1c1N0cmVhbS5uZXh0KCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZWRpdG9yU2VydmljZVxuICAgICAgLmNsaWNrTGlzdGVuZXIodGhpcy5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdG9yRm9jdXNTdHJlYW0ubmV4dCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmVkaXRvclNlcnZpY2VcbiAgICAgIC5ibHVyTGlzdGVuZXIodGhpcy5pZClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEFuZ3VsYXIgZG9lc24ndCBydW4gY2hhbmdlIGRldGVjdGlvbiBmb3IgY2hhbmdlcyBvcmlnaW5hdGluZyBpbnNpZGUgYW4gaWZyYW1lLFxuICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHJ1biBtYXJrRm9yQ2hlY2soKSBpbnNpZGUgdGhlIE5nWm9uZSB0byBmb3JjZSBjaGFuZ2UgcHJvcGlnYXRpb24gdG8gY29uc3VtaW5nIGNvbXBvbmVudHMuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlXG4gICAgICAuY29tbWFuZENoYW5nZUxpc3RlbmVyKHRoaXMuaWQpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XG4gICAgICAgIHRoaXMuVmlld1RvTW9kZWxVcGRhdGUoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5zZXRFZGl0b3JJbm5lckh0bWwodGhpcy5pZCwgdGhpcy5fdmFsdWUpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAodGhpcy5hdXRvZm9jdXMpIHtcbiAgICAgIHRoaXMuYWRhcHRlclNlcnZpY2UuZm9jdXNFZGl0b3IodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIFZpZXdUb01vZGVsVXBkYXRlKGVtaXRDaGFuZ2U6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuYWRhcHRlclNlcnZpY2UuZ2V0RWRpdG9ySW5uZXJIdG1sKHRoaXMuaWQpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGVtaXRDaGFuZ2UpIHtcbiAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG59XG4iLCI8ZGl2IGNsYXNzPVwic2t5LXRleHQtZWRpdG9yXCI+XG4gIDxza3ktdG9vbGJhciBjbGFzcz1cInNreS10ZXh0LWVkaXRvci10b29sYmFyXCI+XG4gICAgPHNreS10b29sYmFyLXNlY3Rpb25cbiAgICAgIGFyaWEtbGFiZWw9XCJUZXh0IGZvcm1hdHRpbmdcIlxuICAgICAgY2xhc3M9XCJtZW51YmFyXCJcbiAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICA+XG4gICAgICA8c2t5LXRleHQtZWRpdG9yLW1lbnViYXJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2VkaXRvckZvY3VzU3RyZWFtXT1cImVkaXRvckZvY3VzU3RyZWFtXCJcbiAgICAgICAgW2VkaXRvcklkXT1cImlkXCJcbiAgICAgICAgW21lbnVzXT1cIm1lbnVzXCJcbiAgICAgICAgW21lcmdlRmllbGRzXT1cIm1lcmdlRmllbGRzXCJcbiAgICAgID5cbiAgICAgIDwvc2t5LXRleHQtZWRpdG9yLW1lbnViYXI+XG4gICAgPC9za3ktdG9vbGJhci1zZWN0aW9uPlxuICAgIDxza3ktdG9vbGJhci1zZWN0aW9uXG4gICAgICBhcmlhLWxhYmVsPVwiVGV4dCBmb3JtYXR0aW5nXCJcbiAgICAgIGNsYXNzPVwidG9vbGJhclwiXG4gICAgICByb2xlPVwidG9vbGJhclwiXG4gICAgPlxuICAgICAgPHNreS10ZXh0LWVkaXRvci10b29sYmFyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtlZGl0b3JGb2N1c1N0cmVhbV09XCJlZGl0b3JGb2N1c1N0cmVhbVwiXG4gICAgICAgIFtlZGl0b3JJZF09XCJpZFwiXG4gICAgICAgIFtmb250TGlzdF09XCJmb250TGlzdFwiXG4gICAgICAgIFtmb250U2l6ZUxpc3RdPVwiZm9udFNpemVMaXN0XCJcbiAgICAgICAgW3Rvb2xiYXJBY3Rpb25zXT1cInRvb2xiYXJBY3Rpb25zXCJcbiAgICAgICAgW3N0eWxlU3RhdGVdPVwiaW5pdGlhbFN0eWxlU3RhdGVcIlxuICAgICAgPlxuICAgICAgPC9za3ktdGV4dC1lZGl0b3ItdG9vbGJhcj5cbiAgICA8L3NreS10b29sYmFyLXNlY3Rpb24+XG4gIDwvc2t5LXRvb2xiYXI+XG4gIDxpZnJhbWVcbiAgICBjbGFzcz1cInNreS10ZXh0LWVkaXRvci13cmFwcGVyXCJcbiAgICBzcmM9XCJhYm91dDpibGFua1wiXG4gICAgdGl0bGU9XCJUZXh0IEVkaXRvclwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3NreS10ZXh0LWVkaXRvci13cmFwcGVyLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICB9XCJcbiAgICAobG9hZCk9XCJvbklmcmFtZUxvYWQoKVwiXG4gICAgI2lmcmFtZVxuICA+XG4gIDwvaWZyYW1lPlxuPC9kaXY+XG4iXX0=