@flogeez/angular-tiptap-editor 3.1.3 → 3.1.5

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 (117) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +2 -2
  3. package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
  4. package/esm2022/lib/ate-editor.provider.mjs +38 -0
  5. package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
  6. package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
  7. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
  8. package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
  9. package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
  10. package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
  11. package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
  12. package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
  13. package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
  14. package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
  15. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1032 -0
  16. package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
  17. package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
  18. package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
  19. package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
  20. package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
  21. package/esm2022/lib/config/ate-editor.config.mjs +133 -0
  22. package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
  23. package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
  24. package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
  25. package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
  26. package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
  27. package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
  28. package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
  29. package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
  30. package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
  31. package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
  32. package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
  33. package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
  34. package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
  35. package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
  36. package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
  37. package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
  38. package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
  39. package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
  40. package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
  41. package/esm2022/lib/models/ate-image.model.mjs +2 -0
  42. package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
  43. package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
  44. package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
  45. package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
  46. package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
  47. package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
  48. package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
  49. package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
  50. package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
  51. package/esm2022/lib/services/ate-editor-commands.service.mjs +507 -0
  52. package/esm2022/lib/services/ate-export.service.mjs +71 -0
  53. package/esm2022/lib/services/ate-i18n.service.mjs +449 -0
  54. package/esm2022/lib/services/ate-image.service.mjs +459 -0
  55. package/esm2022/lib/services/ate-link.service.mjs +99 -0
  56. package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
  57. package/esm2022/lib/utils/ate-markdown.utils.mjs +179 -0
  58. package/esm2022/public-api.mjs +41 -0
  59. package/fesm2022/flogeez-angular-tiptap-editor.mjs +627 -354
  60. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  61. package/index.d.ts +3 -1734
  62. package/lib/ate-editor.provider.d.ts +21 -0
  63. package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
  64. package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
  65. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
  66. package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
  67. package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
  68. package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
  69. package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
  70. package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
  71. package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
  72. package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
  73. package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
  74. package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
  75. package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
  76. package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
  77. package/lib/components/ui/ate-button.component.d.ts +25 -0
  78. package/lib/components/ui/ate-separator.component.d.ts +5 -0
  79. package/lib/config/ate-editor.config.d.ts +19 -0
  80. package/lib/config/ate-global-config.token.d.ts +6 -0
  81. package/lib/config/ate-slash-commands.config.d.ts +41 -0
  82. package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
  83. package/lib/directives/ate-tooltip.directive.d.ts +30 -0
  84. package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
  85. package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
  86. package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
  87. package/lib/extensions/ate-table.extension.d.ts +2 -0
  88. package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
  89. package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
  90. package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
  91. package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
  92. package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
  93. package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
  94. package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
  95. package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
  96. package/lib/models/ate-bubble-menu.model.d.ts +33 -0
  97. package/lib/models/ate-editor-config.model.d.ts +113 -0
  98. package/lib/models/ate-editor-state.model.d.ts +109 -0
  99. package/lib/models/ate-image.model.d.ts +104 -0
  100. package/lib/models/ate-slash-command.model.d.ts +17 -0
  101. package/lib/models/ate-toolbar.model.d.ts +18 -0
  102. package/lib/node-view/ate-angular-node-view.d.ts +115 -0
  103. package/lib/node-view/ate-injector.registry.d.ts +3 -0
  104. package/lib/node-view/ate-node-view.factory.d.ts +10 -0
  105. package/lib/node-view/ate-node-view.models.d.ts +138 -0
  106. package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
  107. package/lib/node-view/ate-register-angular-component.d.ts +35 -0
  108. package/lib/services/ate-color-picker.service.d.ts +65 -0
  109. package/lib/services/ate-editor-commands.service.d.ts +89 -0
  110. package/lib/services/ate-export.service.d.ts +27 -0
  111. package/lib/services/ate-i18n.service.d.ts +432 -0
  112. package/lib/services/ate-image.service.d.ts +82 -0
  113. package/lib/services/ate-link.service.d.ts +42 -0
  114. package/lib/utils/ate-color.utils.d.ts +12 -0
  115. package/lib/utils/ate-markdown.utils.d.ts +4 -0
  116. package/package.json +3 -1
  117. package/public-api.d.ts +32 -0
@@ -0,0 +1,531 @@
1
+ import { Component, input, inject, ChangeDetectionStrategy } from "@angular/core";
2
+ import { AteButtonComponent } from "../ui/ate-button.component";
3
+ import { AteSeparatorComponent } from "../ui/ate-separator.component";
4
+ import { AteEditorCommandsService } from "../../services/ate-editor-commands.service";
5
+ import { AteI18nService } from "../../services/ate-i18n.service";
6
+ import { AteColorPickerComponent } from "../color-picker/ate-color-picker.component";
7
+ import * as i0 from "@angular/core";
8
+ export class AteToolbarComponent {
9
+ constructor() {
10
+ this.editor = input.required();
11
+ this.config = input.required();
12
+ this.imageUpload = input({});
13
+ this.floating = input(false);
14
+ this.i18nService = inject(AteI18nService);
15
+ this.editorCommands = inject(AteEditorCommandsService);
16
+ this.t = this.i18nService.toolbar;
17
+ this.state = this.editorCommands.editorState;
18
+ }
19
+ onCommand(command, ...args) {
20
+ const editor = this.editor();
21
+ if (!editor) {
22
+ return;
23
+ }
24
+ this.editorCommands.execute(editor, command, ...args);
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
27
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AteToolbarComponent, isStandalone: true, selector: "ate-toolbar", inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, imageUpload: { classPropertyName: "imageUpload", publicName: "imageUpload", isSignal: true, isRequired: false, transformFunction: null }, floating: { classPropertyName: "floating", publicName: "floating", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
28
+ <div class="ate-toolbar" [class.floating]="floating()">
29
+ @if (config().bold) {
30
+ <ate-button
31
+ icon="format_bold"
32
+ [title]="t().bold"
33
+ [active]="state().marks.bold"
34
+ [disabled]="!state().can.toggleBold"
35
+ (buttonClick)="onCommand('toggleBold')" />
36
+ }
37
+ @if (config().italic) {
38
+ <ate-button
39
+ icon="format_italic"
40
+ [title]="t().italic"
41
+ [active]="state().marks.italic"
42
+ [disabled]="!state().can.toggleItalic"
43
+ (buttonClick)="onCommand('toggleItalic')" />
44
+ }
45
+ @if (config().underline) {
46
+ <ate-button
47
+ icon="format_underlined"
48
+ [title]="t().underline"
49
+ [active]="state().marks.underline"
50
+ [disabled]="!state().can.toggleUnderline"
51
+ (buttonClick)="onCommand('toggleUnderline')" />
52
+ }
53
+ @if (config().strike) {
54
+ <ate-button
55
+ icon="strikethrough_s"
56
+ [title]="t().strike"
57
+ [active]="state().marks.strike"
58
+ [disabled]="!state().can.toggleStrike"
59
+ (buttonClick)="onCommand('toggleStrike')" />
60
+ }
61
+ @if (config().code) {
62
+ <ate-button
63
+ icon="code"
64
+ [title]="t().code"
65
+ [active]="state().marks.code"
66
+ [disabled]="!state().can.toggleCode"
67
+ (buttonClick)="onCommand('toggleCode')" />
68
+ }
69
+ @if (config().codeBlock) {
70
+ <ate-button
71
+ icon="terminal"
72
+ [title]="t().codeBlock"
73
+ [active]="state().nodes.isCodeBlock"
74
+ [disabled]="!state().can.toggleCodeBlock"
75
+ (buttonClick)="onCommand('toggleCodeBlock')" />
76
+ }
77
+ @if (config().superscript) {
78
+ <ate-button
79
+ icon="superscript"
80
+ [title]="t().superscript"
81
+ [active]="state().marks.superscript"
82
+ [disabled]="!state().can.toggleSuperscript"
83
+ (buttonClick)="onCommand('toggleSuperscript')" />
84
+ }
85
+ @if (config().subscript) {
86
+ <ate-button
87
+ icon="subscript"
88
+ [title]="t().subscript"
89
+ [active]="state().marks.subscript"
90
+ [disabled]="!state().can.toggleSubscript"
91
+ (buttonClick)="onCommand('toggleSubscript')" />
92
+ }
93
+ @if (config().highlight) {
94
+ <ate-button
95
+ icon="highlight"
96
+ [title]="t().highlight"
97
+ [active]="state().marks.highlight"
98
+ [disabled]="!state().can.toggleHighlight"
99
+ (buttonClick)="onCommand('toggleHighlight')" />
100
+ }
101
+ @if (config().highlightPicker) {
102
+ <ate-color-picker
103
+ mode="highlight"
104
+ [editor]="editor()"
105
+ [disabled]="!state().can.setHighlight" />
106
+ }
107
+ @if (config().textColor) {
108
+ <ate-color-picker mode="text" [editor]="editor()" [disabled]="!state().can.setColor" />
109
+ }
110
+
111
+ @if (config().separator && (config().heading1 || config().heading2 || config().heading3)) {
112
+ <ate-separator />
113
+ }
114
+ @if (config().heading1) {
115
+ <ate-button
116
+ icon="format_h1"
117
+ [title]="t().heading1"
118
+ [active]="state().nodes.h1"
119
+ [disabled]="!state().can.toggleHeading1"
120
+ (buttonClick)="onCommand('toggleHeading', 1)" />
121
+ }
122
+ @if (config().heading2) {
123
+ <ate-button
124
+ icon="format_h2"
125
+ [title]="t().heading2"
126
+ [active]="state().nodes.h2"
127
+ [disabled]="!state().can.toggleHeading2"
128
+ (buttonClick)="onCommand('toggleHeading', 2)" />
129
+ }
130
+ @if (config().heading3) {
131
+ <ate-button
132
+ icon="format_h3"
133
+ [title]="t().heading3"
134
+ [active]="state().nodes.h3"
135
+ [disabled]="!state().can.toggleHeading3"
136
+ (buttonClick)="onCommand('toggleHeading', 3)" />
137
+ }
138
+ @if (
139
+ config().separator && (config().bulletList || config().orderedList || config().blockquote)
140
+ ) {
141
+ <ate-separator />
142
+ }
143
+ @if (config().bulletList) {
144
+ <ate-button
145
+ icon="format_list_bulleted"
146
+ [title]="t().bulletList"
147
+ [active]="state().nodes.isBulletList"
148
+ [disabled]="!state().can.toggleBulletList"
149
+ (buttonClick)="onCommand('toggleBulletList')" />
150
+ }
151
+ @if (config().orderedList) {
152
+ <ate-button
153
+ icon="format_list_numbered"
154
+ [title]="t().orderedList"
155
+ [active]="state().nodes.isOrderedList"
156
+ [disabled]="!state().can.toggleOrderedList"
157
+ (buttonClick)="onCommand('toggleOrderedList')" />
158
+ }
159
+ @if (config().blockquote) {
160
+ <ate-button
161
+ icon="format_quote"
162
+ [title]="t().blockquote"
163
+ [active]="state().nodes.isBlockquote"
164
+ [disabled]="!state().can.toggleBlockquote"
165
+ (buttonClick)="onCommand('toggleBlockquote')" />
166
+ }
167
+ @if (
168
+ config().separator &&
169
+ (config().alignLeft || config().alignCenter || config().alignRight || config().alignJustify)
170
+ ) {
171
+ <ate-separator />
172
+ }
173
+ @if (config().alignLeft) {
174
+ <ate-button
175
+ icon="format_align_left"
176
+ [title]="t().alignLeft"
177
+ [active]="state().nodes.alignLeft"
178
+ [disabled]="!state().can.setTextAlignLeft"
179
+ (buttonClick)="onCommand('setTextAlign', 'left')" />
180
+ }
181
+ @if (config().alignCenter) {
182
+ <ate-button
183
+ icon="format_align_center"
184
+ [title]="t().alignCenter"
185
+ [active]="state().nodes.alignCenter"
186
+ [disabled]="!state().can.setTextAlignCenter"
187
+ (buttonClick)="onCommand('setTextAlign', 'center')" />
188
+ }
189
+ @if (config().alignRight) {
190
+ <ate-button
191
+ icon="format_align_right"
192
+ [title]="t().alignRight"
193
+ [active]="state().nodes.alignRight"
194
+ [disabled]="!state().can.setTextAlignRight"
195
+ (buttonClick)="onCommand('setTextAlign', 'right')" />
196
+ }
197
+ @if (config().alignJustify) {
198
+ <ate-button
199
+ icon="format_align_justify"
200
+ [title]="t().alignJustify"
201
+ [active]="state().nodes.alignJustify"
202
+ [disabled]="!state().can.setTextAlignJustify"
203
+ (buttonClick)="onCommand('setTextAlign', 'justify')" />
204
+ }
205
+ @if (config().separator && (config().link || config().horizontalRule)) {
206
+ <ate-separator />
207
+ }
208
+ @if (config().link) {
209
+ <ate-button
210
+ icon="link"
211
+ [title]="t().link"
212
+ [active]="state().marks.link"
213
+ [disabled]="!state().can.toggleLink"
214
+ (buttonClick)="onCommand('toggleLink', $event)" />
215
+ }
216
+ @if (config().horizontalRule) {
217
+ <ate-button
218
+ icon="horizontal_rule"
219
+ [title]="t().horizontalRule"
220
+ [disabled]="!state().can.insertHorizontalRule"
221
+ (buttonClick)="onCommand('insertHorizontalRule')" />
222
+ }
223
+ @if (config().table) {
224
+ <ate-button
225
+ icon="table_view"
226
+ [title]="t().table"
227
+ [disabled]="!state().can.insertTable"
228
+ (buttonClick)="onCommand('insertTable')" />
229
+ }
230
+ @if (config().separator && config().image) {
231
+ <ate-separator />
232
+ }
233
+ @if (config().image) {
234
+ <ate-button
235
+ icon="image"
236
+ [title]="t().image"
237
+ [disabled]="!state().can.insertImage"
238
+ (buttonClick)="onCommand('insertImage', imageUpload())" />
239
+ }
240
+ @if (config().separator && (config().undo || config().redo)) {
241
+ <ate-separator />
242
+ }
243
+ @if (config().undo) {
244
+ <ate-button
245
+ icon="undo"
246
+ [title]="t().undo"
247
+ [disabled]="!state().can.undo"
248
+ (buttonClick)="onCommand('undo')" />
249
+ }
250
+ @if (config().redo) {
251
+ <ate-button
252
+ icon="redo"
253
+ [title]="t().redo"
254
+ [disabled]="!state().can.redo"
255
+ (buttonClick)="onCommand('redo')" />
256
+ }
257
+ @if (config().separator && config().clear) {
258
+ <ate-separator />
259
+ }
260
+ @if (config().clear) {
261
+ <ate-button
262
+ icon="delete"
263
+ [title]="t().clear"
264
+ [disabled]="!state().isEditable"
265
+ (buttonClick)="onCommand('clearContent')" />
266
+ }
267
+ @if (config().custom?.length) {
268
+ @for (item of config().custom; track item.key) {
269
+ <ate-button
270
+ [icon]="item.icon"
271
+ [title]="item.label"
272
+ (buttonClick)="item.command(editor())"></ate-button>
273
+ }
274
+ }
275
+ </div>
276
+ `, isInline: true, styles: [":host{display:block;transition:opacity .3s ease}:host-context(.floating-toolbar){position:sticky;top:3rem;left:0;right:0;z-index:100;display:flex;height:0;overflow:visible;pointer-events:none;opacity:0}:host-context(.floating-toolbar:focus-within),:host-context(.floating-toolbar:hover){opacity:1}.ate-toolbar{display:flex;align-items:center;gap:var(--ate-toolbar-gap);padding:var(--ate-toolbar-padding);background:var(--ate-toolbar-background);border-bottom:1px solid var(--ate-toolbar-border-color);flex-wrap:wrap;min-height:32px;position:relative;z-index:50;border-top-left-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px));border-top-right-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px))}.ate-toolbar.floating{pointer-events:auto;border-radius:var(--ate-menu-border-radius, 12px);border:1px solid var(--ate-menu-border)!important;box-shadow:var(--ate-menu-shadow)!important;background:var(--ate-menu-bg)!important;padding:var(--ate-menu-padding)!important;flex-wrap:nowrap;overflow-x:auto;max-width:95vw;scrollbar-width:none;transform:translateY(0);transition:transform .3s cubic-bezier(.4,0,.2,1)}.ate-toolbar.floating::-webkit-scrollbar{display:none}:host-context(.floating-toolbar:focus-within) .ate-toolbar.floating,:host-context(.floating-toolbar:hover) .ate-toolbar.floating{transform:translateY(-2rem)}@keyframes toolbarSlideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.ate-toolbar{animation:toolbarSlideIn .3s cubic-bezier(.4,0,.2,1)}\n"], dependencies: [{ kind: "component", type: AteButtonComponent, selector: "ate-button", inputs: ["icon", "title", "active", "disabled", "color", "backgroundColor", "variant", "size", "iconSize"], outputs: ["buttonClick"] }, { kind: "component", type: AteSeparatorComponent, selector: "ate-separator" }, { kind: "component", type: AteColorPickerComponent, selector: "ate-color-picker", inputs: ["editor", "mode", "disabled", "anchorToText"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
277
+ }
278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteToolbarComponent, decorators: [{
279
+ type: Component,
280
+ args: [{ selector: "ate-toolbar", standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [AteButtonComponent, AteSeparatorComponent, AteColorPickerComponent], template: `
281
+ <div class="ate-toolbar" [class.floating]="floating()">
282
+ @if (config().bold) {
283
+ <ate-button
284
+ icon="format_bold"
285
+ [title]="t().bold"
286
+ [active]="state().marks.bold"
287
+ [disabled]="!state().can.toggleBold"
288
+ (buttonClick)="onCommand('toggleBold')" />
289
+ }
290
+ @if (config().italic) {
291
+ <ate-button
292
+ icon="format_italic"
293
+ [title]="t().italic"
294
+ [active]="state().marks.italic"
295
+ [disabled]="!state().can.toggleItalic"
296
+ (buttonClick)="onCommand('toggleItalic')" />
297
+ }
298
+ @if (config().underline) {
299
+ <ate-button
300
+ icon="format_underlined"
301
+ [title]="t().underline"
302
+ [active]="state().marks.underline"
303
+ [disabled]="!state().can.toggleUnderline"
304
+ (buttonClick)="onCommand('toggleUnderline')" />
305
+ }
306
+ @if (config().strike) {
307
+ <ate-button
308
+ icon="strikethrough_s"
309
+ [title]="t().strike"
310
+ [active]="state().marks.strike"
311
+ [disabled]="!state().can.toggleStrike"
312
+ (buttonClick)="onCommand('toggleStrike')" />
313
+ }
314
+ @if (config().code) {
315
+ <ate-button
316
+ icon="code"
317
+ [title]="t().code"
318
+ [active]="state().marks.code"
319
+ [disabled]="!state().can.toggleCode"
320
+ (buttonClick)="onCommand('toggleCode')" />
321
+ }
322
+ @if (config().codeBlock) {
323
+ <ate-button
324
+ icon="terminal"
325
+ [title]="t().codeBlock"
326
+ [active]="state().nodes.isCodeBlock"
327
+ [disabled]="!state().can.toggleCodeBlock"
328
+ (buttonClick)="onCommand('toggleCodeBlock')" />
329
+ }
330
+ @if (config().superscript) {
331
+ <ate-button
332
+ icon="superscript"
333
+ [title]="t().superscript"
334
+ [active]="state().marks.superscript"
335
+ [disabled]="!state().can.toggleSuperscript"
336
+ (buttonClick)="onCommand('toggleSuperscript')" />
337
+ }
338
+ @if (config().subscript) {
339
+ <ate-button
340
+ icon="subscript"
341
+ [title]="t().subscript"
342
+ [active]="state().marks.subscript"
343
+ [disabled]="!state().can.toggleSubscript"
344
+ (buttonClick)="onCommand('toggleSubscript')" />
345
+ }
346
+ @if (config().highlight) {
347
+ <ate-button
348
+ icon="highlight"
349
+ [title]="t().highlight"
350
+ [active]="state().marks.highlight"
351
+ [disabled]="!state().can.toggleHighlight"
352
+ (buttonClick)="onCommand('toggleHighlight')" />
353
+ }
354
+ @if (config().highlightPicker) {
355
+ <ate-color-picker
356
+ mode="highlight"
357
+ [editor]="editor()"
358
+ [disabled]="!state().can.setHighlight" />
359
+ }
360
+ @if (config().textColor) {
361
+ <ate-color-picker mode="text" [editor]="editor()" [disabled]="!state().can.setColor" />
362
+ }
363
+
364
+ @if (config().separator && (config().heading1 || config().heading2 || config().heading3)) {
365
+ <ate-separator />
366
+ }
367
+ @if (config().heading1) {
368
+ <ate-button
369
+ icon="format_h1"
370
+ [title]="t().heading1"
371
+ [active]="state().nodes.h1"
372
+ [disabled]="!state().can.toggleHeading1"
373
+ (buttonClick)="onCommand('toggleHeading', 1)" />
374
+ }
375
+ @if (config().heading2) {
376
+ <ate-button
377
+ icon="format_h2"
378
+ [title]="t().heading2"
379
+ [active]="state().nodes.h2"
380
+ [disabled]="!state().can.toggleHeading2"
381
+ (buttonClick)="onCommand('toggleHeading', 2)" />
382
+ }
383
+ @if (config().heading3) {
384
+ <ate-button
385
+ icon="format_h3"
386
+ [title]="t().heading3"
387
+ [active]="state().nodes.h3"
388
+ [disabled]="!state().can.toggleHeading3"
389
+ (buttonClick)="onCommand('toggleHeading', 3)" />
390
+ }
391
+ @if (
392
+ config().separator && (config().bulletList || config().orderedList || config().blockquote)
393
+ ) {
394
+ <ate-separator />
395
+ }
396
+ @if (config().bulletList) {
397
+ <ate-button
398
+ icon="format_list_bulleted"
399
+ [title]="t().bulletList"
400
+ [active]="state().nodes.isBulletList"
401
+ [disabled]="!state().can.toggleBulletList"
402
+ (buttonClick)="onCommand('toggleBulletList')" />
403
+ }
404
+ @if (config().orderedList) {
405
+ <ate-button
406
+ icon="format_list_numbered"
407
+ [title]="t().orderedList"
408
+ [active]="state().nodes.isOrderedList"
409
+ [disabled]="!state().can.toggleOrderedList"
410
+ (buttonClick)="onCommand('toggleOrderedList')" />
411
+ }
412
+ @if (config().blockquote) {
413
+ <ate-button
414
+ icon="format_quote"
415
+ [title]="t().blockquote"
416
+ [active]="state().nodes.isBlockquote"
417
+ [disabled]="!state().can.toggleBlockquote"
418
+ (buttonClick)="onCommand('toggleBlockquote')" />
419
+ }
420
+ @if (
421
+ config().separator &&
422
+ (config().alignLeft || config().alignCenter || config().alignRight || config().alignJustify)
423
+ ) {
424
+ <ate-separator />
425
+ }
426
+ @if (config().alignLeft) {
427
+ <ate-button
428
+ icon="format_align_left"
429
+ [title]="t().alignLeft"
430
+ [active]="state().nodes.alignLeft"
431
+ [disabled]="!state().can.setTextAlignLeft"
432
+ (buttonClick)="onCommand('setTextAlign', 'left')" />
433
+ }
434
+ @if (config().alignCenter) {
435
+ <ate-button
436
+ icon="format_align_center"
437
+ [title]="t().alignCenter"
438
+ [active]="state().nodes.alignCenter"
439
+ [disabled]="!state().can.setTextAlignCenter"
440
+ (buttonClick)="onCommand('setTextAlign', 'center')" />
441
+ }
442
+ @if (config().alignRight) {
443
+ <ate-button
444
+ icon="format_align_right"
445
+ [title]="t().alignRight"
446
+ [active]="state().nodes.alignRight"
447
+ [disabled]="!state().can.setTextAlignRight"
448
+ (buttonClick)="onCommand('setTextAlign', 'right')" />
449
+ }
450
+ @if (config().alignJustify) {
451
+ <ate-button
452
+ icon="format_align_justify"
453
+ [title]="t().alignJustify"
454
+ [active]="state().nodes.alignJustify"
455
+ [disabled]="!state().can.setTextAlignJustify"
456
+ (buttonClick)="onCommand('setTextAlign', 'justify')" />
457
+ }
458
+ @if (config().separator && (config().link || config().horizontalRule)) {
459
+ <ate-separator />
460
+ }
461
+ @if (config().link) {
462
+ <ate-button
463
+ icon="link"
464
+ [title]="t().link"
465
+ [active]="state().marks.link"
466
+ [disabled]="!state().can.toggleLink"
467
+ (buttonClick)="onCommand('toggleLink', $event)" />
468
+ }
469
+ @if (config().horizontalRule) {
470
+ <ate-button
471
+ icon="horizontal_rule"
472
+ [title]="t().horizontalRule"
473
+ [disabled]="!state().can.insertHorizontalRule"
474
+ (buttonClick)="onCommand('insertHorizontalRule')" />
475
+ }
476
+ @if (config().table) {
477
+ <ate-button
478
+ icon="table_view"
479
+ [title]="t().table"
480
+ [disabled]="!state().can.insertTable"
481
+ (buttonClick)="onCommand('insertTable')" />
482
+ }
483
+ @if (config().separator && config().image) {
484
+ <ate-separator />
485
+ }
486
+ @if (config().image) {
487
+ <ate-button
488
+ icon="image"
489
+ [title]="t().image"
490
+ [disabled]="!state().can.insertImage"
491
+ (buttonClick)="onCommand('insertImage', imageUpload())" />
492
+ }
493
+ @if (config().separator && (config().undo || config().redo)) {
494
+ <ate-separator />
495
+ }
496
+ @if (config().undo) {
497
+ <ate-button
498
+ icon="undo"
499
+ [title]="t().undo"
500
+ [disabled]="!state().can.undo"
501
+ (buttonClick)="onCommand('undo')" />
502
+ }
503
+ @if (config().redo) {
504
+ <ate-button
505
+ icon="redo"
506
+ [title]="t().redo"
507
+ [disabled]="!state().can.redo"
508
+ (buttonClick)="onCommand('redo')" />
509
+ }
510
+ @if (config().separator && config().clear) {
511
+ <ate-separator />
512
+ }
513
+ @if (config().clear) {
514
+ <ate-button
515
+ icon="delete"
516
+ [title]="t().clear"
517
+ [disabled]="!state().isEditable"
518
+ (buttonClick)="onCommand('clearContent')" />
519
+ }
520
+ @if (config().custom?.length) {
521
+ @for (item of config().custom; track item.key) {
522
+ <ate-button
523
+ [icon]="item.icon"
524
+ [title]="item.label"
525
+ (buttonClick)="item.command(editor())"></ate-button>
526
+ }
527
+ }
528
+ </div>
529
+ `, styles: [":host{display:block;transition:opacity .3s ease}:host-context(.floating-toolbar){position:sticky;top:3rem;left:0;right:0;z-index:100;display:flex;height:0;overflow:visible;pointer-events:none;opacity:0}:host-context(.floating-toolbar:focus-within),:host-context(.floating-toolbar:hover){opacity:1}.ate-toolbar{display:flex;align-items:center;gap:var(--ate-toolbar-gap);padding:var(--ate-toolbar-padding);background:var(--ate-toolbar-background);border-bottom:1px solid var(--ate-toolbar-border-color);flex-wrap:wrap;min-height:32px;position:relative;z-index:50;border-top-left-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px));border-top-right-radius:calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px))}.ate-toolbar.floating{pointer-events:auto;border-radius:var(--ate-menu-border-radius, 12px);border:1px solid var(--ate-menu-border)!important;box-shadow:var(--ate-menu-shadow)!important;background:var(--ate-menu-bg)!important;padding:var(--ate-menu-padding)!important;flex-wrap:nowrap;overflow-x:auto;max-width:95vw;scrollbar-width:none;transform:translateY(0);transition:transform .3s cubic-bezier(.4,0,.2,1)}.ate-toolbar.floating::-webkit-scrollbar{display:none}:host-context(.floating-toolbar:focus-within) .ate-toolbar.floating,:host-context(.floating-toolbar:hover) .ate-toolbar.floating{transform:translateY(-2rem)}@keyframes toolbarSlideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.ate-toolbar{animation:toolbarSlideIn .3s cubic-bezier(.4,0,.2,1)}\n"] }]
530
+ }] });
531
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvY29tcG9uZW50cy90b29sYmFyL2F0ZS10b29sYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOztBQTBWckYsTUFBTSxPQUFPLG1CQUFtQjtJQXRWaEM7UUF1VkUsV0FBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUNsQyxXQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBb0IsQ0FBQztRQUM1QyxnQkFBVyxHQUFHLEtBQUssQ0FBMEIsRUFBRSxDQUFDLENBQUM7UUFDakQsYUFBUSxHQUFHLEtBQUssQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUV6QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyQyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRWpELE1BQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUM3QixVQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7S0FTbEQ7SUFQQyxTQUFTLENBQUMsT0FBZSxFQUFFLEdBQUcsSUFBZTtRQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQzsrR0FsQlUsbUJBQW1CO21HQUFuQixtQkFBbUIsa2xCQWpWcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlQVCxzbERBMVBTLGtCQUFrQiw2TEFBRSxxQkFBcUIsMERBQUUsdUJBQXVCOzs0RkFrVmpFLG1CQUFtQjtrQkF0Vi9CLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHVCQUF1QixDQUFDLFlBQ25FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5UFQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0LCBpbmplY3QsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IEF0ZUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi91aS9hdGUtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQXRlU2VwYXJhdG9yQ29tcG9uZW50IH0gZnJvbSBcIi4uL3VpL2F0ZS1zZXBhcmF0b3IuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBdGVFZGl0b3JDb21tYW5kc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBdGVJMThuU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hdGUtaTE4bi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBdGVDb2xvclBpY2tlckNvbXBvbmVudCB9IGZyb20gXCIuLi9jb2xvci1waWNrZXIvYXRlLWNvbG9yLXBpY2tlci5jb21wb25lbnRcIjtcblxuaW1wb3J0IHsgQXRlVG9vbGJhckNvbmZpZyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvYXRlLXRvb2xiYXIubW9kZWxcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF0ZS10b29sYmFyXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbQXRlQnV0dG9uQ29tcG9uZW50LCBBdGVTZXBhcmF0b3JDb21wb25lbnQsIEF0ZUNvbG9yUGlja2VyQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYXRlLXRvb2xiYXJcIiBbY2xhc3MuZmxvYXRpbmddPVwiZmxvYXRpbmcoKVwiPlxuICAgICAgQGlmIChjb25maWcoKS5ib2xkKSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImZvcm1hdF9ib2xkXCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmJvbGRcIlxuICAgICAgICAgIFthY3RpdmVdPVwic3RhdGUoKS5tYXJrcy5ib2xkXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLnRvZ2dsZUJvbGRcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3RvZ2dsZUJvbGQnKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLml0YWxpYykge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJmb3JtYXRfaXRhbGljXCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLml0YWxpY1wiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm1hcmtzLml0YWxpY1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi50b2dnbGVJdGFsaWNcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3RvZ2dsZUl0YWxpYycpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkudW5kZXJsaW5lKSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImZvcm1hdF91bmRlcmxpbmVkXCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLnVuZGVybGluZVwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm1hcmtzLnVuZGVybGluZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi50b2dnbGVVbmRlcmxpbmVcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3RvZ2dsZVVuZGVybGluZScpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuc3RyaWtlKSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cInN0cmlrZXRocm91Z2hfc1wiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5zdHJpa2VcIlxuICAgICAgICAgIFthY3RpdmVdPVwic3RhdGUoKS5tYXJrcy5zdHJpa2VcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlU3RyaWtlXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVTdHJpa2UnKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLmNvZGUpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiY29kZVwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5jb2RlXCJcbiAgICAgICAgICBbYWN0aXZlXT1cInN0YXRlKCkubWFya3MuY29kZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi50b2dnbGVDb2RlXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVDb2RlJylcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5jb2RlQmxvY2spIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwidGVybWluYWxcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkuY29kZUJsb2NrXCJcbiAgICAgICAgICBbYWN0aXZlXT1cInN0YXRlKCkubm9kZXMuaXNDb2RlQmxvY2tcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlQ29kZUJsb2NrXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVDb2RlQmxvY2snKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLnN1cGVyc2NyaXB0KSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cInN1cGVyc2NyaXB0XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLnN1cGVyc2NyaXB0XCJcbiAgICAgICAgICBbYWN0aXZlXT1cInN0YXRlKCkubWFya3Muc3VwZXJzY3JpcHRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlU3VwZXJzY3JpcHRcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3RvZ2dsZVN1cGVyc2NyaXB0JylcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5zdWJzY3JpcHQpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwic3Vic2NyaXB0XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLnN1YnNjcmlwdFwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm1hcmtzLnN1YnNjcmlwdFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi50b2dnbGVTdWJzY3JpcHRcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3RvZ2dsZVN1YnNjcmlwdCcpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuaGlnaGxpZ2h0KSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImhpZ2hsaWdodFwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5oaWdobGlnaHRcIlxuICAgICAgICAgIFthY3RpdmVdPVwic3RhdGUoKS5tYXJrcy5oaWdobGlnaHRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlSGlnaGxpZ2h0XCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVIaWdobGlnaHQnKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLmhpZ2hsaWdodFBpY2tlcikge1xuICAgICAgICA8YXRlLWNvbG9yLXBpY2tlclxuICAgICAgICAgIG1vZGU9XCJoaWdobGlnaHRcIlxuICAgICAgICAgIFtlZGl0b3JdPVwiZWRpdG9yKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4uc2V0SGlnaGxpZ2h0XCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkudGV4dENvbG9yKSB7XG4gICAgICAgIDxhdGUtY29sb3ItcGlja2VyIG1vZGU9XCJ0ZXh0XCIgW2VkaXRvcl09XCJlZGl0b3IoKVwiIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4uc2V0Q29sb3JcIiAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGNvbmZpZygpLnNlcGFyYXRvciAmJiAoY29uZmlnKCkuaGVhZGluZzEgfHwgY29uZmlnKCkuaGVhZGluZzIgfHwgY29uZmlnKCkuaGVhZGluZzMpKSB7XG4gICAgICAgIDxhdGUtc2VwYXJhdG9yIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLmhlYWRpbmcxKSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImZvcm1hdF9oMVwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5oZWFkaW5nMVwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm5vZGVzLmgxXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLnRvZ2dsZUhlYWRpbmcxXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVIZWFkaW5nJywgMSlcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5oZWFkaW5nMikge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJmb3JtYXRfaDJcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkuaGVhZGluZzJcIlxuICAgICAgICAgIFthY3RpdmVdPVwic3RhdGUoKS5ub2Rlcy5oMlwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi50b2dnbGVIZWFkaW5nMlwiXG4gICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ29tbWFuZCgndG9nZ2xlSGVhZGluZycsIDIpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuaGVhZGluZzMpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiZm9ybWF0X2gzXCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmhlYWRpbmczXCJcbiAgICAgICAgICBbYWN0aXZlXT1cInN0YXRlKCkubm9kZXMuaDNcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlSGVhZGluZzNcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3RvZ2dsZUhlYWRpbmcnLCAzKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKFxuICAgICAgICBjb25maWcoKS5zZXBhcmF0b3IgJiYgKGNvbmZpZygpLmJ1bGxldExpc3QgfHwgY29uZmlnKCkub3JkZXJlZExpc3QgfHwgY29uZmlnKCkuYmxvY2txdW90ZSlcbiAgICAgICkge1xuICAgICAgICA8YXRlLXNlcGFyYXRvciAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5idWxsZXRMaXN0KSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImZvcm1hdF9saXN0X2J1bGxldGVkXCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmJ1bGxldExpc3RcIlxuICAgICAgICAgIFthY3RpdmVdPVwic3RhdGUoKS5ub2Rlcy5pc0J1bGxldExpc3RcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlQnVsbGV0TGlzdFwiXG4gICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ29tbWFuZCgndG9nZ2xlQnVsbGV0TGlzdCcpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkub3JkZXJlZExpc3QpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiZm9ybWF0X2xpc3RfbnVtYmVyZWRcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkub3JkZXJlZExpc3RcIlxuICAgICAgICAgIFthY3RpdmVdPVwic3RhdGUoKS5ub2Rlcy5pc09yZGVyZWRMaXN0XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLnRvZ2dsZU9yZGVyZWRMaXN0XCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVPcmRlcmVkTGlzdCcpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuYmxvY2txdW90ZSkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJmb3JtYXRfcXVvdGVcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkuYmxvY2txdW90ZVwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm5vZGVzLmlzQmxvY2txdW90ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi50b2dnbGVCbG9ja3F1b3RlXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCd0b2dnbGVCbG9ja3F1b3RlJylcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChcbiAgICAgICAgY29uZmlnKCkuc2VwYXJhdG9yICYmXG4gICAgICAgIChjb25maWcoKS5hbGlnbkxlZnQgfHwgY29uZmlnKCkuYWxpZ25DZW50ZXIgfHwgY29uZmlnKCkuYWxpZ25SaWdodCB8fCBjb25maWcoKS5hbGlnbkp1c3RpZnkpXG4gICAgICApIHtcbiAgICAgICAgPGF0ZS1zZXBhcmF0b3IgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuYWxpZ25MZWZ0KSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImZvcm1hdF9hbGlnbl9sZWZ0XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmFsaWduTGVmdFwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm5vZGVzLmFsaWduTGVmdFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi5zZXRUZXh0QWxpZ25MZWZ0XCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdzZXRUZXh0QWxpZ24nLCAnbGVmdCcpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuYWxpZ25DZW50ZXIpIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwiZm9ybWF0X2FsaWduX2NlbnRlclwiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5hbGlnbkNlbnRlclwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm5vZGVzLmFsaWduQ2VudGVyXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLnNldFRleHRBbGlnbkNlbnRlclwiXG4gICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ29tbWFuZCgnc2V0VGV4dEFsaWduJywgJ2NlbnRlcicpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuYWxpZ25SaWdodCkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJmb3JtYXRfYWxpZ25fcmlnaHRcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkuYWxpZ25SaWdodFwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm5vZGVzLmFsaWduUmlnaHRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4uc2V0VGV4dEFsaWduUmlnaHRcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3NldFRleHRBbGlnbicsICdyaWdodCcpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuYWxpZ25KdXN0aWZ5KSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImZvcm1hdF9hbGlnbl9qdXN0aWZ5XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmFsaWduSnVzdGlmeVwiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm5vZGVzLmFsaWduSnVzdGlmeVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZSgpLmNhbi5zZXRUZXh0QWxpZ25KdXN0aWZ5XCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdzZXRUZXh0QWxpZ24nLCAnanVzdGlmeScpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuc2VwYXJhdG9yICYmIChjb25maWcoKS5saW5rIHx8IGNvbmZpZygpLmhvcml6b250YWxSdWxlKSkge1xuICAgICAgICA8YXRlLXNlcGFyYXRvciAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5saW5rKSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImxpbmtcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkubGlua1wiXG4gICAgICAgICAgW2FjdGl2ZV09XCJzdGF0ZSgpLm1hcmtzLmxpbmtcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4udG9nZ2xlTGlua1wiXG4gICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ29tbWFuZCgndG9nZ2xlTGluaycsICRldmVudClcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5ob3Jpem9udGFsUnVsZSkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJob3Jpem9udGFsX3J1bGVcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkuaG9yaXpvbnRhbFJ1bGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5jYW4uaW5zZXJ0SG9yaXpvbnRhbFJ1bGVcIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ2luc2VydEhvcml6b250YWxSdWxlJylcIiAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS50YWJsZSkge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJ0YWJsZV92aWV3XCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLnRhYmxlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLmluc2VydFRhYmxlXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdpbnNlcnRUYWJsZScpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuc2VwYXJhdG9yICYmIGNvbmZpZygpLmltYWdlKSB7XG4gICAgICAgIDxhdGUtc2VwYXJhdG9yIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLmltYWdlKSB7XG4gICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgaWNvbj1cImltYWdlXCJcbiAgICAgICAgICBbdGl0bGVdPVwidCgpLmltYWdlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLmluc2VydEltYWdlXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdpbnNlcnRJbWFnZScsIGltYWdlVXBsb2FkKCkpXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkuc2VwYXJhdG9yICYmIChjb25maWcoKS51bmRvIHx8IGNvbmZpZygpLnJlZG8pKSB7XG4gICAgICAgIDxhdGUtc2VwYXJhdG9yIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLnVuZG8pIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwidW5kb1wiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS51bmRvXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLnVuZG9cIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3VuZG8nKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLnJlZG8pIHtcbiAgICAgICAgPGF0ZS1idXR0b25cbiAgICAgICAgICBpY29uPVwicmVkb1wiXG4gICAgICAgICAgW3RpdGxlXT1cInQoKS5yZWRvXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXN0YXRlKCkuY2FuLnJlZG9cIlxuICAgICAgICAgIChidXR0b25DbGljayk9XCJvbkNvbW1hbmQoJ3JlZG8nKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLnNlcGFyYXRvciAmJiBjb25maWcoKS5jbGVhcikge1xuICAgICAgICA8YXRlLXNlcGFyYXRvciAvPlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5jbGVhcikge1xuICAgICAgICA8YXRlLWJ1dHRvblxuICAgICAgICAgIGljb249XCJkZWxldGVcIlxuICAgICAgICAgIFt0aXRsZV09XCJ0KCkuY2xlYXJcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3RhdGUoKS5pc0VkaXRhYmxlXCJcbiAgICAgICAgICAoYnV0dG9uQ2xpY2spPVwib25Db21tYW5kKCdjbGVhckNvbnRlbnQnKVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKGNvbmZpZygpLmN1c3RvbT8ubGVuZ3RoKSB7XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgY29uZmlnKCkuY3VzdG9tOyB0cmFjayBpdGVtLmtleSkge1xuICAgICAgICAgIDxhdGUtYnV0dG9uXG4gICAgICAgICAgICBbaWNvbl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgW3RpdGxlXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cIml0ZW0uY29tbWFuZChlZGl0b3IoKSlcIj48L2F0ZS1idXR0b24+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2U7XG4gICAgICB9XG5cbiAgICAgIDpob3N0LWNvbnRleHQoLmZsb2F0aW5nLXRvb2xiYXIpIHtcbiAgICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgICAgdG9wOiAzcmVtO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgei1pbmRleDogMTAwO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsgLyogTGV0IGNsaWNrcyBwYXNzIHRocm91Z2ggdG8gY29udGVudCBpZiBub3Qgb24gdG9vbGJhciAqL1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgfVxuXG4gICAgICA6aG9zdC1jb250ZXh0KC5mbG9hdGluZy10b29sYmFyOmZvY3VzLXdpdGhpbiksXG4gICAgICA6aG9zdC1jb250ZXh0KC5mbG9hdGluZy10b29sYmFyOmhvdmVyKSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG5cbiAgICAgIC5hdGUtdG9vbGJhciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogdmFyKC0tYXRlLXRvb2xiYXItZ2FwKTtcbiAgICAgICAgcGFkZGluZzogdmFyKC0tYXRlLXRvb2xiYXItcGFkZGluZyk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWF0ZS10b29sYmFyLWJhY2tncm91bmQpO1xuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYXRlLXRvb2xiYXItYm9yZGVyLWNvbG9yKTtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICBtaW4taGVpZ2h0OiAzMnB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHotaW5kZXg6IDUwO1xuICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBjYWxjKFxuICAgICAgICAgIHZhcigtLWF0ZS1tZW51LWJvcmRlci1yYWRpdXMsIDEycHgpIC0gdmFyKC0tYXRlLWJvcmRlci13aWR0aCwgMnB4KVxuICAgICAgICApO1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogY2FsYyhcbiAgICAgICAgICB2YXIoLS1hdGUtbWVudS1ib3JkZXItcmFkaXVzLCAxMnB4KSAtIHZhcigtLWF0ZS1ib3JkZXItd2lkdGgsIDJweClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLyogRmxvYXRpbmcgVG9vbGJhciBNb2RlICovXG4gICAgICAuYXRlLXRvb2xiYXIuZmxvYXRpbmcge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tYXRlLW1lbnUtYm9yZGVyLXJhZGl1cywgMTJweCk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWF0ZS1tZW51LWJvcmRlcikgIWltcG9ydGFudDtcbiAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tYXRlLW1lbnUtc2hhZG93KSAhaW1wb3J0YW50O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hdGUtbWVudS1iZykgIWltcG9ydGFudDtcbiAgICAgICAgcGFkZGluZzogdmFyKC0tYXRlLW1lbnUtcGFkZGluZykgIWltcG9ydGFudDtcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICAgIG1heC13aWR0aDogOTV2dztcbiAgICAgICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lO1xuXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgICAgIH1cblxuICAgICAgLmF0ZS10b29sYmFyLmZsb2F0aW5nOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgIDpob3N0LWNvbnRleHQoLmZsb2F0aW5nLXRvb2xiYXI6Zm9jdXMtd2l0aGluKSAuYXRlLXRvb2xiYXIuZmxvYXRpbmcsXG4gICAgICA6aG9zdC1jb250ZXh0KC5mbG9hdGluZy10b29sYmFyOmhvdmVyKSAuYXRlLXRvb2xiYXIuZmxvYXRpbmcge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJyZW0pO1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIHRvb2xiYXJTbGlkZUluIHtcbiAgICAgICAgZnJvbSB7XG4gICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpO1xuICAgICAgICB9XG4gICAgICAgIHRvIHtcbiAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuYXRlLXRvb2xiYXIge1xuICAgICAgICBhbmltYXRpb246IHRvb2xiYXJTbGlkZUluIDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBdGVUb29sYmFyQ29tcG9uZW50IHtcbiAgZWRpdG9yID0gaW5wdXQucmVxdWlyZWQ8RWRpdG9yPigpO1xuICBjb25maWcgPSBpbnB1dC5yZXF1aXJlZDxBdGVUb29sYmFyQ29uZmlnPigpO1xuICBpbWFnZVVwbG9hZCA9IGlucHV0PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih7fSk7XG4gIGZsb2F0aW5nID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgaTE4blNlcnZpY2UgPSBpbmplY3QoQXRlSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGVkaXRvckNvbW1hbmRzID0gaW5qZWN0KEF0ZUVkaXRvckNvbW1hbmRzU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgdCA9IHRoaXMuaTE4blNlcnZpY2UudG9vbGJhcjtcbiAgcmVhZG9ubHkgc3RhdGUgPSB0aGlzLmVkaXRvckNvbW1hbmRzLmVkaXRvclN0YXRlO1xuXG4gIG9uQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yKCk7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lZGl0b3JDb21tYW5kcy5leGVjdXRlKGVkaXRvciwgY29tbWFuZCwgLi4uYXJncyk7XG4gIH1cbn1cbiJdfQ==