tui-image-editor-angular3 14.0.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.
- package/README.md +155 -0
- package/esm2020/lib/consts.mjs +170 -0
- package/esm2020/lib/i18n/en.mjs +129 -0
- package/esm2020/lib/i18n/nl.mjs +128 -0
- package/esm2020/lib/i18n/translation.service.mjs +40 -0
- package/esm2020/lib/interfaces/command.mjs +2 -0
- package/esm2020/lib/interfaces/history-item.mjs +343 -0
- package/esm2020/lib/interfaces/image-size.mjs +2 -0
- package/esm2020/lib/interfaces/tools-config.mjs +2 -0
- package/esm2020/lib/menus/buttons/crop/crop.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/delete/delete.component.mjs +40 -0
- package/esm2020/lib/menus/buttons/delete-all/delete-all.component.mjs +27 -0
- package/esm2020/lib/menus/buttons/download/download.component.mjs +40 -0
- package/esm2020/lib/menus/buttons/drag/drag.component.mjs +41 -0
- package/esm2020/lib/menus/buttons/draw/draw.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/filter/filter.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/flip/flip.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/history/history.component.mjs +41 -0
- package/esm2020/lib/menus/buttons/icon/icon.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/load/load.component.mjs +23 -0
- package/esm2020/lib/menus/buttons/mask/mask.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/redo/redo.component.mjs +36 -0
- package/esm2020/lib/menus/buttons/reset/reset.component.mjs +28 -0
- package/esm2020/lib/menus/buttons/rotate/rotate.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/shape/shape.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/text/text.component.mjs +22 -0
- package/esm2020/lib/menus/buttons/undo/undo.component.mjs +36 -0
- package/esm2020/lib/menus/buttons/zoom-in/zoom-in.component.mjs +45 -0
- package/esm2020/lib/menus/buttons/zoom-out/zoom-out.component.mjs +20 -0
- package/esm2020/lib/services/history.service.mjs +86 -0
- package/esm2020/lib/services/tools.config-manager.service.mjs +45 -0
- package/esm2020/lib/submenus/crop/crop.component.mjs +76 -0
- package/esm2020/lib/submenus/draw/draw.component.mjs +149 -0
- package/esm2020/lib/submenus/filter/filter.component.mjs +345 -0
- package/esm2020/lib/submenus/flip/flip.component.mjs +39 -0
- package/esm2020/lib/submenus/icon/icon.component.mjs +119 -0
- package/esm2020/lib/submenus/mask/mask.component.mjs +69 -0
- package/esm2020/lib/submenus/rotate/rotate.component.mjs +57 -0
- package/esm2020/lib/submenus/shape/shape.component.mjs +163 -0
- package/esm2020/lib/submenus/text/text.component.mjs +175 -0
- package/esm2020/lib/svg-definitions/svg-definitions.component.mjs +12 -0
- package/esm2020/lib/tui-image-editor.component.mjs +294 -0
- package/esm2020/lib/tui-image-editor.module.mjs +136 -0
- package/esm2020/lib/utils.mjs +173 -0
- package/esm2020/public-api.mjs +8 -0
- package/esm2020/tui-image-editor-angular2.mjs +5 -0
- package/esm2020/tui-image-editor-angular3.mjs +5 -0
- package/fesm2015/tui-image-editor-angular2.mjs +3166 -0
- package/fesm2015/tui-image-editor-angular2.mjs.map +1 -0
- package/fesm2015/tui-image-editor-angular3.mjs +3166 -0
- package/fesm2015/tui-image-editor-angular3.mjs.map +1 -0
- package/fesm2020/tui-image-editor-angular2.mjs +3126 -0
- package/fesm2020/tui-image-editor-angular2.mjs.map +1 -0
- package/fesm2020/tui-image-editor-angular3.mjs +3126 -0
- package/fesm2020/tui-image-editor-angular3.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/consts.d.ts +144 -0
- package/lib/consts.d.ts.map +1 -0
- package/lib/i18n/en.d.ts +128 -0
- package/lib/i18n/en.d.ts.map +1 -0
- package/lib/i18n/nl.d.ts +127 -0
- package/lib/i18n/nl.d.ts.map +1 -0
- package/lib/i18n/translation.service.d.ts +14 -0
- package/lib/i18n/translation.service.d.ts.map +1 -0
- package/lib/interfaces/command.d.ts +4 -0
- package/lib/interfaces/command.d.ts.map +1 -0
- package/lib/interfaces/history-item.d.ts +26 -0
- package/lib/interfaces/history-item.d.ts.map +1 -0
- package/lib/interfaces/image-size.d.ts +6 -0
- package/lib/interfaces/image-size.d.ts.map +1 -0
- package/lib/interfaces/tools-config.d.ts +14 -0
- package/lib/interfaces/tools-config.d.ts.map +1 -0
- package/lib/menus/buttons/crop/crop.component.d.ts +10 -0
- package/lib/menus/buttons/crop/crop.component.d.ts.map +1 -0
- package/lib/menus/buttons/delete/delete.component.d.ts +13 -0
- package/lib/menus/buttons/delete/delete.component.d.ts.map +1 -0
- package/lib/menus/buttons/delete-all/delete-all.component.d.ts +11 -0
- package/lib/menus/buttons/delete-all/delete-all.component.d.ts.map +1 -0
- package/lib/menus/buttons/download/download.component.d.ts +9 -0
- package/lib/menus/buttons/download/download.component.d.ts.map +1 -0
- package/lib/menus/buttons/drag/drag.component.d.ts +11 -0
- package/lib/menus/buttons/drag/drag.component.d.ts.map +1 -0
- package/lib/menus/buttons/draw/draw.component.d.ts +10 -0
- package/lib/menus/buttons/draw/draw.component.d.ts.map +1 -0
- package/lib/menus/buttons/filter/filter.component.d.ts +10 -0
- package/lib/menus/buttons/filter/filter.component.d.ts.map +1 -0
- package/lib/menus/buttons/flip/flip.component.d.ts +10 -0
- package/lib/menus/buttons/flip/flip.component.d.ts.map +1 -0
- package/lib/menus/buttons/history/history.component.d.ts +13 -0
- package/lib/menus/buttons/history/history.component.d.ts.map +1 -0
- package/lib/menus/buttons/icon/icon.component.d.ts +10 -0
- package/lib/menus/buttons/icon/icon.component.d.ts.map +1 -0
- package/lib/menus/buttons/load/load.component.d.ts +9 -0
- package/lib/menus/buttons/load/load.component.d.ts.map +1 -0
- package/lib/menus/buttons/mask/mask.component.d.ts +10 -0
- package/lib/menus/buttons/mask/mask.component.d.ts.map +1 -0
- package/lib/menus/buttons/redo/redo.component.d.ts +12 -0
- package/lib/menus/buttons/redo/redo.component.d.ts.map +1 -0
- package/lib/menus/buttons/reset/reset.component.d.ts +12 -0
- package/lib/menus/buttons/reset/reset.component.d.ts.map +1 -0
- package/lib/menus/buttons/rotate/rotate.component.d.ts +10 -0
- package/lib/menus/buttons/rotate/rotate.component.d.ts.map +1 -0
- package/lib/menus/buttons/shape/shape.component.d.ts +10 -0
- package/lib/menus/buttons/shape/shape.component.d.ts.map +1 -0
- package/lib/menus/buttons/text/text.component.d.ts +10 -0
- package/lib/menus/buttons/text/text.component.d.ts.map +1 -0
- package/lib/menus/buttons/undo/undo.component.d.ts +12 -0
- package/lib/menus/buttons/undo/undo.component.d.ts.map +1 -0
- package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts +12 -0
- package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts.map +1 -0
- package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts +9 -0
- package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts.map +1 -0
- package/lib/services/history.service.d.ts +45 -0
- package/lib/services/history.service.d.ts.map +1 -0
- package/lib/services/tools.config-manager.service.d.ts +12 -0
- package/lib/services/tools.config-manager.service.d.ts.map +1 -0
- package/lib/submenus/crop/crop.component.d.ts +23 -0
- package/lib/submenus/crop/crop.component.d.ts.map +1 -0
- package/lib/submenus/draw/draw.component.d.ts +32 -0
- package/lib/submenus/draw/draw.component.d.ts.map +1 -0
- package/lib/submenus/filter/filter.component.d.ts +70 -0
- package/lib/submenus/filter/filter.component.d.ts.map +1 -0
- package/lib/submenus/flip/flip.component.d.ts +10 -0
- package/lib/submenus/flip/flip.component.d.ts.map +1 -0
- package/lib/submenus/icon/icon.component.d.ts +24 -0
- package/lib/submenus/icon/icon.component.d.ts.map +1 -0
- package/lib/submenus/mask/mask.component.d.ts +16 -0
- package/lib/submenus/mask/mask.component.d.ts.map +1 -0
- package/lib/submenus/rotate/rotate.component.d.ts +12 -0
- package/lib/submenus/rotate/rotate.component.d.ts.map +1 -0
- package/lib/submenus/shape/shape.component.d.ts +31 -0
- package/lib/submenus/shape/shape.component.d.ts.map +1 -0
- package/lib/submenus/text/text.component.d.ts +31 -0
- package/lib/submenus/text/text.component.d.ts.map +1 -0
- package/lib/svg-definitions/svg-definitions.component.d.ts +6 -0
- package/lib/svg-definitions/svg-definitions.component.d.ts.map +1 -0
- package/lib/tui-image-editor.component.d.ts +71 -0
- package/lib/tui-image-editor.component.d.ts.map +1 -0
- package/lib/tui-image-editor.module.d.ts +48 -0
- package/lib/tui-image-editor.module.d.ts.map +1 -0
- package/lib/utils.d.ts +45 -0
- package/lib/utils.d.ts.map +1 -0
- package/package.json +43 -0
- package/public-api.d.ts +4 -0
- package/public-api.d.ts.map +1 -0
- package/src/checkboxes.scss +95 -0
- package/src/theme.scss +936 -0
- package/tui-image-editor-angular2.d.ts.map +1 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { Component, Input, } from '@angular/core';
|
|
2
|
+
import { defaultColors, eventNames } from '../../consts';
|
|
3
|
+
import { clearSelection, getActiveObjectId } from '../../utils';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
import * as i2 from "ngx-color-picker";
|
|
7
|
+
import * as i3 from "@ngx-translate/core";
|
|
8
|
+
export class ShapeComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.defaultShapeStrokeColors = defaultColors;
|
|
11
|
+
this.defaultShapeFillColors = defaultColors;
|
|
12
|
+
this.shapeStrokeWidthValue = 3;
|
|
13
|
+
this.shapeFillColor = 'rgba(255, 255, 255, 0)';
|
|
14
|
+
this.shapeStrokeColor = 'rgba(0, 169, 255, 1)';
|
|
15
|
+
this.onObjectActivatedEventListener = this.onObjectActivated.bind(this);
|
|
16
|
+
this.onObjectAddedEventListener = this.onObjectAdded.bind(this);
|
|
17
|
+
}
|
|
18
|
+
ngOnChanges(changes) {
|
|
19
|
+
var that = this;
|
|
20
|
+
if (changes['imageEditor']) {
|
|
21
|
+
this.activeObjectId = getActiveObjectId(changes['imageEditor'].currentValue);
|
|
22
|
+
this.checkActiveObject(this.activeObjectId);
|
|
23
|
+
changes['imageEditor'].previousValue?.off(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
|
|
24
|
+
changes['imageEditor'].currentValue?.on(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
|
|
25
|
+
changes['imageEditor'].previousValue?.off(eventNames.OBJECT_ADDED, that.onObjectAddedEventListener);
|
|
26
|
+
changes['imageEditor'].currentValue?.on(eventNames.OBJECT_ADDED, that.onObjectAddedEventListener);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
ngOnDestroy() {
|
|
30
|
+
if (this.imageEditor) {
|
|
31
|
+
this.imageEditor.off(eventNames.OBJECT_ACTIVATED, this.onObjectActivatedEventListener);
|
|
32
|
+
this.imageEditor.off(eventNames.OBJECT_ADDED, this.onObjectAddedEventListener);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
onObjectActivated(props) {
|
|
36
|
+
this.activeObjectId = props?.id;
|
|
37
|
+
this.checkActiveObject(this.activeObjectId);
|
|
38
|
+
}
|
|
39
|
+
onObjectAdded(props) {
|
|
40
|
+
if (props && ['rect', 'circle', 'triangle'].indexOf(props.type) > -1) {
|
|
41
|
+
this.shapeType = null;
|
|
42
|
+
this.imageEditor?.stopDrawingMode();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
checkActiveObject(activeObjectId) {
|
|
46
|
+
if (activeObjectId != null) {
|
|
47
|
+
var props = this.imageEditor?.getObjectProperties(activeObjectId, [
|
|
48
|
+
'type',
|
|
49
|
+
'strokeWidth',
|
|
50
|
+
'stroke',
|
|
51
|
+
'fill',
|
|
52
|
+
]);
|
|
53
|
+
if (props && ['rect', 'circle', 'triangle'].indexOf(props.type) > -1) {
|
|
54
|
+
this.shapeStrokeWidthValue = props.strokeWidth;
|
|
55
|
+
this.shapeFillColor =
|
|
56
|
+
typeof props.fill == 'object' && props.fill.type == 'color'
|
|
57
|
+
? props.fill.color
|
|
58
|
+
: props.fill == null || props.fill.trim() == ''
|
|
59
|
+
? 'rgba(255, 255, 255, 0)'
|
|
60
|
+
: props.fill;
|
|
61
|
+
this.shapeStrokeColor =
|
|
62
|
+
props.stroke == null || props.stroke.trim() == ''
|
|
63
|
+
? 'rgba(255, 255, 255, 0)'
|
|
64
|
+
: props.stroke;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
shapeStrokeWidthChanged(currentStrokeWidth, isSilent) {
|
|
69
|
+
this.setDrawingShape(this.shapeType, {
|
|
70
|
+
fill: this.shapeFillColor,
|
|
71
|
+
stroke: this.shapeStrokeColor,
|
|
72
|
+
strokeWidth: typeof currentStrokeWidth === "number" ? currentStrokeWidth : this.shapeStrokeWidthValue,
|
|
73
|
+
});
|
|
74
|
+
this.shapeChangeActiveObject('strokeWidth', isSilent);
|
|
75
|
+
}
|
|
76
|
+
shapeColorChanged(type, currentColor) {
|
|
77
|
+
switch (type) {
|
|
78
|
+
case 'fill':
|
|
79
|
+
this.setDrawingShape(this.shapeType, {
|
|
80
|
+
fill: currentColor,
|
|
81
|
+
stroke: this.shapeStrokeColor,
|
|
82
|
+
strokeWidth: this.shapeStrokeWidthValue,
|
|
83
|
+
});
|
|
84
|
+
break;
|
|
85
|
+
case 'stroke':
|
|
86
|
+
this.setDrawingShape(this.shapeType, {
|
|
87
|
+
fill: this.shapeFillColor,
|
|
88
|
+
stroke: currentColor,
|
|
89
|
+
strokeWidth: this.shapeStrokeWidthValue,
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
this.shapeChangeActiveObject(type == 'stroke' ? 'strokeColor' : 'fillColor');
|
|
94
|
+
}
|
|
95
|
+
setShapeType(type) {
|
|
96
|
+
clearSelection(this.imageEditor);
|
|
97
|
+
if (this.shapeType != type) {
|
|
98
|
+
this.shapeType = type;
|
|
99
|
+
this.imageEditor.startDrawingMode('SHAPE');
|
|
100
|
+
this.setDrawingShape(this.shapeType, {
|
|
101
|
+
fill: this.shapeFillColor,
|
|
102
|
+
stroke: this.shapeStrokeColor,
|
|
103
|
+
strokeWidth: this.shapeStrokeWidthValue,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.shapeType = null;
|
|
108
|
+
this.imageEditor.stopDrawingMode();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
setDrawingShape(type, options) {
|
|
112
|
+
this.imageEditor.setDrawingShape(type, options);
|
|
113
|
+
}
|
|
114
|
+
shapeChangeActiveObject(changedProperty, isSilent = false) {
|
|
115
|
+
if (this.activeObjectId != null &&
|
|
116
|
+
getActiveObjectId(this.imageEditor) == this.activeObjectId) {
|
|
117
|
+
var props = this.imageEditor.getObjectProperties(this.activeObjectId, 'type');
|
|
118
|
+
if (props != null &&
|
|
119
|
+
['rect', 'circle', 'triangle'].indexOf(props.type) > -1) {
|
|
120
|
+
let parameters = null;
|
|
121
|
+
switch (changedProperty) {
|
|
122
|
+
case 'strokeWidth':
|
|
123
|
+
parameters = {
|
|
124
|
+
strokeWidth: this.shapeStrokeWidthValue,
|
|
125
|
+
};
|
|
126
|
+
break;
|
|
127
|
+
case 'strokeColor':
|
|
128
|
+
parameters = {
|
|
129
|
+
stroke: this.shapeStrokeColor,
|
|
130
|
+
};
|
|
131
|
+
break;
|
|
132
|
+
case 'fillColor':
|
|
133
|
+
parameters = {
|
|
134
|
+
fill: this.shapeFillColor,
|
|
135
|
+
};
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
let functionToExecute = () => {
|
|
139
|
+
this.imageEditor.changeShape(this.activeObjectId, parameters, isSilent);
|
|
140
|
+
};
|
|
141
|
+
if (isSilent) {
|
|
142
|
+
functionToExecute();
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
setTimeout(functionToExecute);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
ShapeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ShapeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
152
|
+
ShapeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: ShapeComponent, selector: "tui-image-editor-submenus-shape", inputs: { imageEditor: "imageEditor", defaultShapeStrokeColors: "defaultShapeStrokeColors", defaultShapeFillColors: "defaultShapeFillColors" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"tui-image-editor-menu-shape\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\">\r\n <div class=\"tie-shape-button\">\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button rect ' +\r\n (shapeType == 'rect' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('rect')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-rectangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button circle ' +\r\n (shapeType == 'circle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('circle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-shape-circle\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button triangle ' +\r\n (shapeType == 'triangle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('triangle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-triangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div class=\"tie-shape-color-button tui-image-editor-d-flex tui-image-editor-flex-row\">\r\n <div\r\n class=\"tie-color-fill tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Fill\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeFillColor\"\r\n [style.background]=\"shapeFillColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeFillColors\"\r\n (colorPickerChange)=\"shapeColorChanged('fill', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-shape-fill\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n <div\r\n class=\"tie-color-stroke tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Stroke\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeStrokeColor\"\r\n [style.background]=\"shapeStrokeColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeStrokeColors\"\r\n (colorPickerChange)=\"shapeColorChanged('stroke', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-stroke\" | translate\r\n }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-justify-content-center tui-image-editor-align-items-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">{{\r\n \"tui-image-editor-angular-submenus-shape-strokeWidth\" | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n min=\"2\"\r\n max=\"300\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"2\"\r\n max=\"300\"\r\n step=\"1\"\r\n class=\"tie-draw-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.ColorPickerDirective, selector: "[colorPicker]", inputs: ["colorPicker", "cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpEyeDropper", "cpPresetLabel", "cpPresetColors", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "cpExtraTemplate"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: ShapeComponent, decorators: [{
|
|
154
|
+
type: Component,
|
|
155
|
+
args: [{ selector: 'tui-image-editor-submenus-shape', template: "<div class=\"tui-image-editor-menu-shape\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\">\r\n <div class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\">\r\n <div class=\"tie-shape-button\">\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button rect ' +\r\n (shapeType == 'rect' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('rect')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-rectangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-rectangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button circle ' +\r\n (shapeType == 'circle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('circle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-circle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-shape-circle\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button triangle ' +\r\n (shapeType == 'triangle' ? 'active' : '')\r\n \"\r\n (click)=\"setShapeType('triangle')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-shape-triangle\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-triangle\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div class=\"tie-shape-color-button tui-image-editor-d-flex tui-image-editor-flex-row\">\r\n <div\r\n class=\"tie-color-fill tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Fill\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeFillColor\"\r\n [style.background]=\"shapeFillColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeFillColors\"\r\n (colorPickerChange)=\"shapeColorChanged('fill', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-shape-fill\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n <div\r\n class=\"tie-color-stroke tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Stroke\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-draw-color-picker\"\r\n [(colorPicker)]=\"shapeStrokeColor\"\r\n [style.background]=\"shapeStrokeColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultShapeStrokeColors\"\r\n (colorPickerChange)=\"shapeColorChanged('stroke', $event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{\r\n \"tui-image-editor-angular-submenus-shape-stroke\" | translate\r\n }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-justify-content-center tui-image-editor-align-items-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">{{\r\n \"tui-image-editor-angular-submenus-shape-strokeWidth\" | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n min=\"2\"\r\n max=\"300\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"2\"\r\n max=\"300\"\r\n step=\"1\"\r\n class=\"tie-draw-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"shapeStrokeWidthValue\"\r\n (ngModelChange)=\"shapeStrokeWidthChanged($event, true)\"\r\n (change)=\"shapeStrokeWidthChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n" }]
|
|
156
|
+
}], ctorParameters: function () { return []; }, propDecorators: { imageEditor: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], defaultShapeStrokeColors: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], defaultShapeFillColors: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}] } });
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVpLWltYWdlLWVkaXRvci1hbmd1bGFyMi9zcmMvbGliL3N1Ym1lbnVzL3NoYXBlL3NoYXBlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy9zaGFwZS9zaGFwZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssR0FLTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU9oRSxNQUFNLE9BQU8sY0FBYztJQVl6QjtRQVZTLDZCQUF3QixHQUFhLGFBQWEsQ0FBQztRQUNuRCwyQkFBc0IsR0FBYSxhQUFhLENBQUM7UUFDbkQsMEJBQXFCLEdBQVcsQ0FBQyxDQUFDO1FBQ2xDLG1CQUFjLEdBQVcsd0JBQXdCLENBQUM7UUFDbEQscUJBQWdCLEdBQVcsc0JBQXNCLENBQUM7UUFPdkQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQ3JD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QyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN2RDtnQkFDQSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLFFBQVEsZUFBZSxFQUFFO29CQUN2QixLQUFLLGFBQWE7d0JBQ2hCLFVBQVUsR0FBRzs0QkFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjt5QkFDeEMsQ0FBQzt3QkFDRixNQUFNO29CQUNSLEtBQUssYUFBYTt3QkFDaEIsVUFBVSxHQUFHOzRCQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCO3lCQUM5QixDQUFDO3dCQUNGLE1BQU07b0JBQ1IsS0FBSyxXQUFXO3dCQUNkLFVBQVUsR0FBRzs0QkFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWM7eUJBQzFCLENBQUM7d0JBQ0YsTUFBTTtpQkFDVDtnQkFDRCxJQUFJLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtvQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQzFCLElBQUksQ0FBQyxjQUFjLEVBQ25CLFVBQVUsRUFDVixRQUFRLENBQ1QsQ0FBQztnQkFDSixDQUFDLENBQUM7Z0JBQ0YsSUFBSSxRQUFRLEVBQUU7b0JBQ1osaUJBQWlCLEVBQUUsQ0FBQztpQkFDckI7cUJBQU07b0JBQ0wsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7U0FDRjtJQUNILENBQUM7OzJHQXhNVSxjQUFjOytGQUFkLGNBQWMsNE9DaEIzQixvOExBMkpBOzJGRDNJYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLGlDQUFpQzswRUFLbEMsV0FBVztzQkFBbkIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZGVmYXVsdENvbG9ycywgZXZlbnROYW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0cyc7XHJcbmltcG9ydCB7IGNsZWFyU2VsZWN0aW9uLCBnZXRBY3RpdmVPYmplY3RJZCB9IGZyb20gJy4uLy4uL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHVpLWltYWdlLWVkaXRvci1zdWJtZW51cy1zaGFwZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NoYXBlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zaGFwZS5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaGFwZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBpbWFnZUVkaXRvcjogYW55O1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRTaGFwZVN0cm9rZUNvbG9yczogc3RyaW5nW10gPSBkZWZhdWx0Q29sb3JzO1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRTaGFwZUZpbGxDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgc2hhcGVTdHJva2VXaWR0aFZhbHVlOiBudW1iZXIgPSAzO1xyXG4gIHB1YmxpYyBzaGFwZUZpbGxDb2xvcjogc3RyaW5nID0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMCknO1xyXG4gIHB1YmxpYyBzaGFwZVN0cm9rZUNvbG9yOiBzdHJpbmcgPSAncmdiYSgwLCAxNjksIDI1NSwgMSknO1xyXG4gIHB1YmxpYyBzaGFwZVR5cGU6ICdjaXJjbGUnIHwgJ3RyaWFuZ2xlJyB8ICdyZWN0JztcclxuICBwdWJsaWMgYWN0aXZlT2JqZWN0SWQ6IG51bWJlcjtcclxuICBwdWJsaWMgb25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyOiBhbnk7XHJcbiAgcHVibGljIG9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5vbk9iamVjdEFjdGl2YXRlZEV2ZW50TGlzdGVuZXIgPSB0aGlzLm9uT2JqZWN0QWN0aXZhdGVkLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyID0gdGhpcy5vbk9iamVjdEFkZGVkLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICBpZiAoY2hhbmdlc1snaW1hZ2VFZGl0b3InXSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gZ2V0QWN0aXZlT2JqZWN0SWQoXHJcbiAgICAgICAgY2hhbmdlc1snaW1hZ2VFZGl0b3InXS5jdXJyZW50VmFsdWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuXHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10ucHJldmlvdXNWYWx1ZT8ub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLmN1cnJlbnRWYWx1ZT8ub24oXHJcbiAgICAgICAgZXZlbnROYW1lcy5PQkpFQ1RfQUNUSVZBVEVELFxyXG4gICAgICAgIHRoYXQub25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLnByZXZpb3VzVmFsdWU/Lm9mZihcclxuICAgICAgICBldmVudE5hbWVzLk9CSkVDVF9BRERFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10uY3VycmVudFZhbHVlPy5vbihcclxuICAgICAgICBldmVudE5hbWVzLk9CSkVDVF9BRERFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmltYWdlRWRpdG9yKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VFZGl0b3Iub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGlzLm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmltYWdlRWRpdG9yLm9mZihcclxuICAgICAgICBldmVudE5hbWVzLk9CSkVDVF9BRERFRCxcclxuICAgICAgICB0aGlzLm9uT2JqZWN0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uT2JqZWN0QWN0aXZhdGVkKHByb3BzKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gcHJvcHM/LmlkO1xyXG4gICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25PYmplY3RBZGRlZChwcm9wcykge1xyXG4gICAgaWYgKHByb3BzICYmIFsncmVjdCcsICdjaXJjbGUnLCAndHJpYW5nbGUnXS5pbmRleE9mKHByb3BzLnR5cGUpID4gLTEpIHtcclxuICAgICAgdGhpcy5zaGFwZVR5cGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlRWRpdG9yPy5zdG9wRHJhd2luZ01vZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tBY3RpdmVPYmplY3QoYWN0aXZlT2JqZWN0SWQ6IG51bWJlcikge1xyXG4gICAgaWYgKGFjdGl2ZU9iamVjdElkICE9IG51bGwpIHtcclxuICAgICAgdmFyIHByb3BzID0gdGhpcy5pbWFnZUVkaXRvcj8uZ2V0T2JqZWN0UHJvcGVydGllcyhhY3RpdmVPYmplY3RJZCwgW1xyXG4gICAgICAgICd0eXBlJyxcclxuICAgICAgICAnc3Ryb2tlV2lkdGgnLFxyXG4gICAgICAgICdzdHJva2UnLFxyXG4gICAgICAgICdmaWxsJyxcclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChwcm9wcyAmJiBbJ3JlY3QnLCAnY2lyY2xlJywgJ3RyaWFuZ2xlJ10uaW5kZXhPZihwcm9wcy50eXBlKSA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5zaGFwZVN0cm9rZVdpZHRoVmFsdWUgPSBwcm9wcy5zdHJva2VXaWR0aDtcclxuICAgICAgICB0aGlzLnNoYXBlRmlsbENvbG9yID1cclxuICAgICAgICAgIHR5cGVvZiBwcm9wcy5maWxsID09ICdvYmplY3QnICYmIHByb3BzLmZpbGwudHlwZSA9PSAnY29sb3InXHJcbiAgICAgICAgICAgID8gcHJvcHMuZmlsbC5jb2xvclxyXG4gICAgICAgICAgICA6IHByb3BzLmZpbGwgPT0gbnVsbCB8fCBwcm9wcy5maWxsLnRyaW0oKSA9PSAnJ1xyXG4gICAgICAgICAgICA/ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDApJ1xyXG4gICAgICAgICAgICA6IHByb3BzLmZpbGw7XHJcbiAgICAgICAgdGhpcy5zaGFwZVN0cm9rZUNvbG9yID1cclxuICAgICAgICAgIHByb3BzLnN0cm9rZSA9PSBudWxsIHx8IHByb3BzLnN0cm9rZS50cmltKCkgPT0gJydcclxuICAgICAgICAgICAgPyAncmdiYSgyNTUsIDI1NSwgMjU1LCAwKSdcclxuICAgICAgICAgICAgOiBwcm9wcy5zdHJva2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNoYXBlU3Ryb2tlV2lkdGhDaGFuZ2VkKGN1cnJlbnRTdHJva2VXaWR0aDogbnVtYmVyIHwgRXZlbnQsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNldERyYXdpbmdTaGFwZSh0aGlzLnNoYXBlVHlwZSwge1xyXG4gICAgICBmaWxsOiB0aGlzLnNoYXBlRmlsbENvbG9yLFxyXG4gICAgICBzdHJva2U6IHRoaXMuc2hhcGVTdHJva2VDb2xvcixcclxuICAgICAgc3Ryb2tlV2lkdGg6IHR5cGVvZiBjdXJyZW50U3Ryb2tlV2lkdGggPT09IFwibnVtYmVyXCIgPyBjdXJyZW50U3Ryb2tlV2lkdGggOiB0aGlzLnNoYXBlU3Ryb2tlV2lkdGhWYWx1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zaGFwZUNoYW5nZUFjdGl2ZU9iamVjdCgnc3Ryb2tlV2lkdGgnLCBpc1NpbGVudCk7XHJcbiAgfVxyXG5cclxuICBzaGFwZUNvbG9yQ2hhbmdlZCh0eXBlOiAnc3Ryb2tlJyB8ICdmaWxsJywgY3VycmVudENvbG9yOiBzdHJpbmcpIHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdmaWxsJzpcclxuICAgICAgICB0aGlzLnNldERyYXdpbmdTaGFwZSh0aGlzLnNoYXBlVHlwZSwge1xyXG4gICAgICAgICAgZmlsbDogY3VycmVudENvbG9yLFxyXG4gICAgICAgICAgc3Ryb2tlOiB0aGlzLnNoYXBlU3Ryb2tlQ29sb3IsXHJcbiAgICAgICAgICBzdHJva2VXaWR0aDogdGhpcy5zaGFwZVN0cm9rZVdpZHRoVmFsdWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3N0cm9rZSc6XHJcbiAgICAgICAgdGhpcy5zZXREcmF3aW5nU2hhcGUodGhpcy5zaGFwZVR5cGUsIHtcclxuICAgICAgICAgIGZpbGw6IHRoaXMuc2hhcGVGaWxsQ29sb3IsXHJcbiAgICAgICAgICBzdHJva2U6IGN1cnJlbnRDb2xvcixcclxuICAgICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnNoYXBlU3Ryb2tlV2lkdGhWYWx1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHRoaXMuc2hhcGVDaGFuZ2VBY3RpdmVPYmplY3QoXHJcbiAgICAgIHR5cGUgPT0gJ3N0cm9rZScgPyAnc3Ryb2tlQ29sb3InIDogJ2ZpbGxDb2xvcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRTaGFwZVR5cGUodHlwZTogJ2NpcmNsZScgfCAndHJpYW5nbGUnIHwgJ3JlY3QnKSB7XHJcbiAgICBjbGVhclNlbGVjdGlvbih0aGlzLmltYWdlRWRpdG9yKTtcclxuICAgIGlmICh0aGlzLnNoYXBlVHlwZSAhPSB0eXBlKSB7XHJcbiAgICAgIHRoaXMuc2hhcGVUeXBlID0gdHlwZTtcclxuICAgICAgdGhpcy5pbWFnZUVkaXRvci5zdGFydERyYXdpbmdNb2RlKCdTSEFQRScpO1xyXG4gICAgICB0aGlzLnNldERyYXdpbmdTaGFwZSh0aGlzLnNoYXBlVHlwZSwge1xyXG4gICAgICAgIGZpbGw6IHRoaXMuc2hhcGVGaWxsQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlOiB0aGlzLnNoYXBlU3Ryb2tlQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc2hhcGVTdHJva2VXaWR0aFZhbHVlLFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hhcGVUeXBlID0gbnVsbDtcclxuICAgICAgdGhpcy5pbWFnZUVkaXRvci5zdG9wRHJhd2luZ01vZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldERyYXdpbmdTaGFwZShcclxuICAgIHR5cGU6ICdjaXJjbGUnIHwgJ3RyaWFuZ2xlJyB8ICdyZWN0JyxcclxuICAgIG9wdGlvbnM6IHtcclxuICAgICAgZmlsbDogc3RyaW5nO1xyXG4gICAgICBzdHJva2U6IHN0cmluZztcclxuICAgICAgc3Ryb2tlV2lkdGg6IG51bWJlcjtcclxuICAgIH1cclxuICApIHtcclxuICAgIHRoaXMuaW1hZ2VFZGl0b3Iuc2V0RHJhd2luZ1NoYXBlKHR5cGUsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgc2hhcGVDaGFuZ2VBY3RpdmVPYmplY3QoXHJcbiAgICBjaGFuZ2VkUHJvcGVydHk6ICdzdHJva2VXaWR0aCcgfCAnc3Ryb2tlQ29sb3InIHwgJ2ZpbGxDb2xvcicsXHJcbiAgICBpc1NpbGVudDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYWN0aXZlT2JqZWN0SWQgIT0gbnVsbCAmJlxyXG4gICAgICBnZXRBY3RpdmVPYmplY3RJZCh0aGlzLmltYWdlRWRpdG9yKSA9PSB0aGlzLmFjdGl2ZU9iamVjdElkXHJcbiAgICApIHtcclxuICAgICAgdmFyIHByb3BzID0gdGhpcy5pbWFnZUVkaXRvci5nZXRPYmplY3RQcm9wZXJ0aWVzKFxyXG4gICAgICAgIHRoaXMuYWN0aXZlT2JqZWN0SWQsXHJcbiAgICAgICAgJ3R5cGUnXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwcm9wcyAhPSBudWxsICYmXHJcbiAgICAgICAgWydyZWN0JywgJ2NpcmNsZScsICd0cmlhbmdsZSddLmluZGV4T2YocHJvcHMudHlwZSkgPiAtMVxyXG4gICAgICApIHtcclxuICAgICAgICBsZXQgcGFyYW1ldGVycyA9IG51bGw7XHJcbiAgICAgICAgc3dpdGNoIChjaGFuZ2VkUHJvcGVydHkpIHtcclxuICAgICAgICAgIGNhc2UgJ3N0cm9rZVdpZHRoJzpcclxuICAgICAgICAgICAgcGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogdGhpcy5zaGFwZVN0cm9rZVdpZHRoVmFsdWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnc3Ryb2tlQ29sb3InOlxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICAgIHN0cm9rZTogdGhpcy5zaGFwZVN0cm9rZUNvbG9yLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2ZpbGxDb2xvcic6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZmlsbDogdGhpcy5zaGFwZUZpbGxDb2xvcixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jdGlvblRvRXhlY3V0ZSA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuY2hhbmdlU2hhcGUoXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlT2JqZWN0SWQsXHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMsXHJcbiAgICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGlzU2lsZW50KSB7XHJcbiAgICAgICAgICBmdW5jdGlvblRvRXhlY3V0ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uVG9FeGVjdXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbWVudS1zaGFwZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtaXRlbVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItanVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLW92ZXJmbG93YWJsZS14IHR1aS1pbWFnZS1lZGl0b3ItcHktM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aWUtc2hhcGUtYnV0dG9uXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gcmVjdCAnICtcclxuICAgICAgICAgICAgICAoc2hhcGVUeXBlID09ICdyZWN0JyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRTaGFwZVR5cGUoJ3JlY3QnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtcmVjdGFuZ2xlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub3JtYWwgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXNoYXBlLXJlY3RhbmdsZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aXZlIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtc2hhcGUtcmVjdGFuZ2xlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gY2lyY2xlICcgK1xyXG4gICAgICAgICAgICAgIChzaGFwZVR5cGUgPT0gJ2NpcmNsZScgPyAnYWN0aXZlJyA6ICcnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0U2hhcGVUeXBlKCdjaXJjbGUnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtY2lyY2xlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub3JtYWwgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXNoYXBlLWNpcmNsZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aXZlIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICB7eyBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1zaGFwZS1jaXJjbGVcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gdHJpYW5nbGUgJyArXHJcbiAgICAgICAgICAgICAgKHNoYXBlVHlwZSA9PSAndHJpYW5nbGUnID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNldFNoYXBlVHlwZSgndHJpYW5nbGUnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtdHJpYW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vcm1hbCB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtc2hhcGUtdHJpYW5nbGVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLXNoYXBlLXRyaWFuZ2xlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItcGFydGl0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aWUtc2hhcGUtY29sb3ItYnV0dG9uIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3dcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtY29sb3ItZmlsbCB0dWktaW1hZ2UtZWRpdG9yLWJ1dHRvbiB0dWktaW1hZ2UtZWRpdG9yLWJ1dHRvbi1jb2xvci1waWNrZXIgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LWNvbHVtblwiXHJcbiAgICAgICAgICAgIHRpdGxlPVwiRmlsbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRpZS1kcmF3LWNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICBbKGNvbG9yUGlja2VyKV09XCJzaGFwZUZpbGxDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzaGFwZUZpbGxDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbY3BPdXRwdXRGb3JtYXRdPVwiJ3JnYmEnXCJcclxuICAgICAgICAgICAgICAgIFtjcFByZXNldENvbG9yc109XCJkZWZhdWx0U2hhcGVGaWxsQ29sb3JzXCJcclxuICAgICAgICAgICAgICAgIChjb2xvclBpY2tlckNoYW5nZSk9XCJzaGFwZUNvbG9yQ2hhbmdlZCgnZmlsbCcsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW2NwVXNlUm9vdFZpZXdDb250YWluZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtc2hhcGUtZmlsbFwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtY29sb3Itc3Ryb2tlIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uLWNvbG9yLXBpY2tlciB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtY29sdW1uXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJTdHJva2VcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZHJhdy1jb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgWyhjb2xvclBpY2tlcildPVwic2hhcGVTdHJva2VDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzaGFwZVN0cm9rZUNvbG9yXCJcclxuICAgICAgICAgICAgICAgIFtjcE91dHB1dEZvcm1hdF09XCIncmdiYSdcIlxyXG4gICAgICAgICAgICAgICAgW2NwUHJlc2V0Q29sb3JzXT1cImRlZmF1bHRTaGFwZVN0cm9rZUNvbG9yc1wiXHJcbiAgICAgICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwic2hhcGVDb2xvckNoYW5nZWQoJ3N0cm9rZScsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW2NwVXNlUm9vdFZpZXdDb250YWluZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtc2hhcGUtc3Ryb2tlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLW5ld2xpbmUgdHVpLWltYWdlLWVkaXRvci1yYW5nZS13cmFwIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbWItM1wiXHJcbiAgICA+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cInJhbmdlXCI+e3tcclxuICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1zaGFwZS1zdHJva2VXaWR0aFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgIH19PC9sYWJlbD5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNoYXBlU3Ryb2tlV2lkdGhWYWx1ZVwiXHJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2hhcGVTdHJva2VXaWR0aENoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJzaGFwZVN0cm9rZVdpZHRoQ2hhbmdlZCgkZXZlbnQsIGZhbHNlKVwiXHJcbiAgICAgICAgbWluPVwiMlwiXHJcbiAgICAgICAgbWF4PVwiMzAwXCJcclxuICAgICAgLz5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgbWluPVwiMlwiXHJcbiAgICAgICAgbWF4PVwiMzAwXCJcclxuICAgICAgICBzdGVwPVwiMVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0aWUtZHJhdy1yYW5nZS12YWx1ZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXZhbHVlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNoYXBlU3Ryb2tlV2lkdGhWYWx1ZVwiXHJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2hhcGVTdHJva2VXaWR0aENoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJzaGFwZVN0cm9rZVdpZHRoQ2hhbmdlZCgkZXZlbnQsIGZhbHNlKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Component, Input, } from '@angular/core';
|
|
2
|
+
import { defaultColors, eventNames } from '../../consts';
|
|
3
|
+
import { getActiveObjectId } from '../../utils';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
import * as i2 from "ngx-color-picker";
|
|
7
|
+
import * as i3 from "@ngx-translate/core";
|
|
8
|
+
export class TextComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.defaultTextColors = defaultColors;
|
|
11
|
+
this.textColor = 'rgba(255, 187, 59, 1)';
|
|
12
|
+
this.textSizeValue = 50;
|
|
13
|
+
this.textAlign = 'left';
|
|
14
|
+
this.textFontFamily = 'Noto Sans';
|
|
15
|
+
this.textFontStyle = 'normal';
|
|
16
|
+
this.textFontWeight = 'normal';
|
|
17
|
+
this.textDecoration = null;
|
|
18
|
+
this.onObjectActivatedEventListener = this.onObjectActivated.bind(this);
|
|
19
|
+
this.onTextAddedEventListener = this.onTextAdded.bind(this);
|
|
20
|
+
}
|
|
21
|
+
ngOnChanges(changes) {
|
|
22
|
+
var that = this;
|
|
23
|
+
if (changes['imageEditor']) {
|
|
24
|
+
this.activeObjectId = getActiveObjectId(changes['imageEditor'].currentValue);
|
|
25
|
+
this.checkActiveObject(this.activeObjectId);
|
|
26
|
+
changes['imageEditor'].currentValue?.startDrawingMode('TEXT');
|
|
27
|
+
changes['imageEditor'].previousValue?.off(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
|
|
28
|
+
changes['imageEditor'].currentValue?.on(eventNames.OBJECT_ACTIVATED, that.onObjectActivatedEventListener);
|
|
29
|
+
changes['imageEditor'].previousValue?.off(eventNames.ADD_TEXT, that.onTextAddedEventListener);
|
|
30
|
+
changes['imageEditor'].currentValue?.on(eventNames.ADD_TEXT, that.onTextAddedEventListener);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
ngOnDestroy() {
|
|
34
|
+
if (this.imageEditor) {
|
|
35
|
+
this.imageEditor.off(eventNames.OBJECT_ACTIVATED, this.onObjectActivatedEventListener);
|
|
36
|
+
this.imageEditor.off(eventNames.ADD_TEXT, this.onTextAddedEventListener);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
onObjectActivated(props) {
|
|
40
|
+
this.activeObjectId = props?.id;
|
|
41
|
+
this.checkActiveObject(this.activeObjectId);
|
|
42
|
+
}
|
|
43
|
+
onTextAdded(e) {
|
|
44
|
+
this.imageEditor
|
|
45
|
+
.addText('Edit text', {
|
|
46
|
+
position: e.originPosition,
|
|
47
|
+
styles: {
|
|
48
|
+
fill: this.textColor,
|
|
49
|
+
fontFamily: this.textFontFamily,
|
|
50
|
+
fontSize: this.textSizeValue,
|
|
51
|
+
fontStyle: this.textFontStyle,
|
|
52
|
+
fontWeight: this.textFontWeight,
|
|
53
|
+
textAlign: this.textAlign,
|
|
54
|
+
textDecoration: this.textDecoration,
|
|
55
|
+
underline: this.textDecoration == 'underline',
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
.then(() => {
|
|
59
|
+
this.imageEditor.changeCursor('default');
|
|
60
|
+
this.imageEditor?.startDrawingMode('TEXT');
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
checkActiveObject(activeObjectId) {
|
|
64
|
+
if (activeObjectId != null) {
|
|
65
|
+
var props = this.imageEditor?.getObjectProperties(activeObjectId, [
|
|
66
|
+
'type',
|
|
67
|
+
'fill',
|
|
68
|
+
'textAlign',
|
|
69
|
+
'textDecoration',
|
|
70
|
+
'fontFamily',
|
|
71
|
+
'fontStyle',
|
|
72
|
+
'fontWeight',
|
|
73
|
+
'fontSize',
|
|
74
|
+
]);
|
|
75
|
+
if (props && (props.type === 'i-text' || props.type === 'text')) {
|
|
76
|
+
this.textAlign = props.textAlign;
|
|
77
|
+
this.textColor = props.fill;
|
|
78
|
+
this.textDecoration = props.textDecoration;
|
|
79
|
+
this.textFontFamily = props.fontFamily;
|
|
80
|
+
this.textFontStyle = props.fontStyle;
|
|
81
|
+
this.textFontWeight = props.fontWeight;
|
|
82
|
+
this.textSizeValue = props.fontSize;
|
|
83
|
+
this.imageEditor?.startDrawingMode('TEXT');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
changeTextAlignment(newValue) {
|
|
88
|
+
this.textAlign = newValue;
|
|
89
|
+
this.textChangeActiveObject('textAlign');
|
|
90
|
+
}
|
|
91
|
+
changeTextFontStyle(newFontStyle) {
|
|
92
|
+
this.textFontStyle = newFontStyle;
|
|
93
|
+
this.textChangeActiveObject('fontStyle');
|
|
94
|
+
}
|
|
95
|
+
changeTextFontWeight(newFontWeight) {
|
|
96
|
+
this.textFontWeight = newFontWeight;
|
|
97
|
+
this.textChangeActiveObject('fontWeight');
|
|
98
|
+
}
|
|
99
|
+
changeTextDecoration(newTextDecoration) {
|
|
100
|
+
this.textDecoration = newTextDecoration;
|
|
101
|
+
this.textChangeActiveObject('textDecoration');
|
|
102
|
+
}
|
|
103
|
+
textSizeValueChanged(currentTextSizeValue, isSilent) {
|
|
104
|
+
this.textChangeActiveObject('fontSize', isSilent);
|
|
105
|
+
}
|
|
106
|
+
textColorChanged(currentColor) {
|
|
107
|
+
this.textChangeActiveObject('color');
|
|
108
|
+
}
|
|
109
|
+
textChangeActiveObject(type, isSilent = false) {
|
|
110
|
+
if (this.activeObjectId != null &&
|
|
111
|
+
getActiveObjectId(this.imageEditor) == this.activeObjectId) {
|
|
112
|
+
var props = this.imageEditor.getObjectProperties(this.activeObjectId, 'type');
|
|
113
|
+
let parameters = null;
|
|
114
|
+
if (props.type === 'i-text' || props.type === 'text') {
|
|
115
|
+
switch (type) {
|
|
116
|
+
case 'color':
|
|
117
|
+
parameters = {
|
|
118
|
+
fill: this.textColor,
|
|
119
|
+
};
|
|
120
|
+
break;
|
|
121
|
+
case 'fontFamily':
|
|
122
|
+
parameters = {
|
|
123
|
+
fontFamily: this.textFontFamily,
|
|
124
|
+
};
|
|
125
|
+
break;
|
|
126
|
+
case 'fontSize':
|
|
127
|
+
parameters = {
|
|
128
|
+
fontSize: this.textSizeValue,
|
|
129
|
+
};
|
|
130
|
+
break;
|
|
131
|
+
case 'fontStyle':
|
|
132
|
+
parameters = {
|
|
133
|
+
fontStyle: this.textFontStyle,
|
|
134
|
+
};
|
|
135
|
+
break;
|
|
136
|
+
case 'fontWeight':
|
|
137
|
+
parameters = {
|
|
138
|
+
fontWeight: this.textFontWeight,
|
|
139
|
+
};
|
|
140
|
+
break;
|
|
141
|
+
case 'textAlign':
|
|
142
|
+
parameters = {
|
|
143
|
+
textAlign: this.textAlign,
|
|
144
|
+
};
|
|
145
|
+
break;
|
|
146
|
+
case 'textDecoration':
|
|
147
|
+
parameters = {
|
|
148
|
+
textDecoration: this.textDecoration,
|
|
149
|
+
};
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
let functionToExecute = () => {
|
|
153
|
+
this.imageEditor.changeTextStyle(this.activeObjectId, parameters, isSilent);
|
|
154
|
+
};
|
|
155
|
+
if (isSilent) {
|
|
156
|
+
functionToExecute();
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
setTimeout(functionToExecute);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
TextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
166
|
+
TextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: TextComponent, selector: "tui-image-editor-submenus-text", inputs: { imageEditor: "imageEditor", defaultTextColors: "defaultTextColors" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"tui-image-editor-menu-text\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n [style.maxWidth]=\"'100%'\"\r\n >\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\"\r\n >\r\n <div\r\n class=\"tie-text-effect-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button bold ' +\r\n (textFontWeight == 'bold' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontWeight(textFontWeight == 'bold' ? 'normal' : 'bold')\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-bold\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button italic ' +\r\n (textFontStyle == 'italic' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontStyle(\r\n textFontStyle == 'italic' ? 'normal' : 'italic'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-italic\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button underline ' +\r\n (textDecoration == 'underline' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextDecoration(\r\n textDecoration == 'underline' ? null : 'underline'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-text-underline\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div\r\n class=\"tie-text-align-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button left ' +\r\n (textAlign == 'left' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('left')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-left\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button center ' +\r\n (textAlign == 'center' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('center')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-center\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button right ' +\r\n (textAlign == 'right' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('right')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-right\" | translate }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div>\r\n <div\r\n class=\"tie-text-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Color\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-text-color-picker\"\r\n [(colorPicker)]=\"textColor\"\r\n [style.background]=\"textColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultTextColors\"\r\n (colorPickerChange)=\"textColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-text-color\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-justify-content-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">\r\n {{\r\n \"tui-image-editor-angular-submenus-text-textSize\" | translate\r\n }}</label\r\n >\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n min=\"10\"\r\n max=\"100\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"10\"\r\n max=\"100\"\r\n step=\"1\"\r\n class=\"tie-text-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.ColorPickerDirective, selector: "[colorPicker]", inputs: ["colorPicker", "cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpEyeDropper", "cpPresetLabel", "cpPresetColors", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "cpExtraTemplate"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: TextComponent, decorators: [{
|
|
168
|
+
type: Component,
|
|
169
|
+
args: [{ selector: 'tui-image-editor-submenus-text', template: "<div class=\"tui-image-editor-menu-text\">\r\n <div class=\"tui-image-editor-submenu-item\">\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n [style.maxWidth]=\"'100%'\"\r\n >\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\"\r\n >\r\n <div\r\n class=\"tie-text-effect-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button bold ' +\r\n (textFontWeight == 'bold' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontWeight(textFontWeight == 'bold' ? 'normal' : 'bold')\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-bold\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-bold\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button italic ' +\r\n (textFontStyle == 'italic' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextFontStyle(\r\n textFontStyle == 'italic' ? 'normal' : 'italic'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-italic\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-italic\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button underline ' +\r\n (textDecoration == 'underline' ? 'active' : '')\r\n \"\r\n (click)=\"\r\n changeTextDecoration(\r\n textDecoration == 'underline' ? null : 'underline'\r\n )\r\n \"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-underline\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{\r\n \"tui-image-editor-angular-submenus-text-underline\" | translate\r\n }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div\r\n class=\"tie-text-align-button tui-image-editor-d-flex tui-image-editor-flex-row\"\r\n >\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button left ' +\r\n (textAlign == 'left' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('left')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-left\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-left\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button center ' +\r\n (textAlign == 'center' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('center')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-center\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-center\" | translate }}\r\n </label>\r\n </div>\r\n <div\r\n [class]=\"\r\n 'tui-image-editor-button right ' +\r\n (textAlign == 'right' ? 'active' : '')\r\n \"\r\n (click)=\"changeTextAlignment('right')\"\r\n >\r\n <div>\r\n <svg class=\"svg_ic-submenu\">\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"normal use-default\"\r\n ></use>\r\n <use\r\n xlink:href=\"#ic-text-align-right\"\r\n class=\"active use-default\"\r\n ></use>\r\n </svg>\r\n </div>\r\n <label>\r\n {{ \"tui-image-editor-angular-submenus-text-right\" | translate }}\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div>\r\n <div\r\n class=\"tie-text-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column\"\r\n title=\"Color\"\r\n >\r\n <label>\r\n <input\r\n readonly\r\n class=\"tie-text-color-picker\"\r\n [(colorPicker)]=\"textColor\"\r\n [style.background]=\"textColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultTextColors\"\r\n (colorPickerChange)=\"textColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <div>\r\n {{ \"tui-image-editor-angular-submenus-text-color\" | translate }}\r\n </div></label\r\n >\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-justify-content-center tui-image-editor-mb-3\"\r\n >\r\n <label class=\"range\">\r\n {{\r\n \"tui-image-editor-angular-submenus-text-textSize\" | translate\r\n }}</label\r\n >\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n min=\"10\"\r\n max=\"100\"\r\n />\r\n <input\r\n type=\"number\"\r\n min=\"10\"\r\n max=\"100\"\r\n step=\"1\"\r\n class=\"tie-text-range-value tui-image-editor-range-value\"\r\n [(ngModel)]=\"textSizeValue\"\r\n (ngModelChange)=\"textSizeValueChanged($event, true)\"\r\n (change)=\"textSizeValueChanged($event, false)\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n" }]
|
|
170
|
+
}], ctorParameters: function () { return []; }, propDecorators: { imageEditor: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], defaultTextColors: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}] } });
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXIyL3NyYy9saWIvc3VibWVudXMvdGV4dC90ZXh0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy90ZXh0L3RleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU9oRCxNQUFNLE9BQU8sYUFBYTtJQWtCeEI7UUFmUyxzQkFBaUIsR0FBYSxhQUFhLENBQUM7UUFDOUMsY0FBUyxHQUFXLHVCQUF1QixDQUFDO1FBQzVDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGNBQVMsR0FBZ0MsTUFBTSxDQUFDO1FBQ2hELG1CQUFjLEdBQUcsV0FBVyxDQUFDO1FBQzdCLGtCQUFhLEdBQXdCLFFBQVEsQ0FBQztRQUM5QyxtQkFBYyxHQUFzQixRQUFRLENBQUM7UUFDN0MsbUJBQWMsR0FJVixJQUFJLENBQUM7UUFLZCxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxP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QUFNO29CQUNSLEtBQUssWUFBWTt3QkFDZixVQUFVLEdBQUc7NEJBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjO3lCQUNoQyxDQUFDO3dCQUNGLE1BQU07b0JBQ1IsS0FBSyxXQUFXO3dCQUNkLFVBQVUsR0FBRzs0QkFDWCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7eUJBQzFCLENBQUM7d0JBQ0YsTUFBTTtvQkFDUixLQUFLLGdCQUFnQjt3QkFDbkIsVUFBVSxHQUFHOzRCQUNYLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYzt5QkFDcEMsQ0FBQzt3QkFDRixNQUFNO2lCQUNUO2dCQUNELElBQUksaUJBQWlCLEdBQUcsR0FBRyxFQUFFO29CQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDOUIsSUFBSSxDQUFDLGNBQWMsRUFDbkIsVUFBVSxFQUNWLFFBQVEsQ0FDVCxDQUFDO2dCQUNKLENBQUMsQ0FBQztnQkFDRixJQUFJLFFBQVEsRUFBRTtvQkFDWixpQkFBaUIsRUFBRSxDQUFDO2lCQUNyQjtxQkFBTTtvQkFDTCxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztpQkFDL0I7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7MEdBdk5VLGFBQWE7OEZBQWIsYUFBYSwyS0NoQjFCLHkrUEFrT0E7MkZEbE5hLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsZ0NBQWdDOzBFQUtqQyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRlZmF1bHRDb2xvcnMsIGV2ZW50TmFtZXMgfSBmcm9tICcuLi8uLi9jb25zdHMnO1xyXG5pbXBvcnQgeyBnZXRBY3RpdmVPYmplY3RJZCB9IGZyb20gJy4uLy4uL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHVpLWltYWdlLWVkaXRvci1zdWJtZW51cy10ZXh0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGltYWdlRWRpdG9yOiBhbnk7XHJcbiAgcHVibGljIGFjdGl2ZU9iamVjdElkOiBudW1iZXI7XHJcbiAgQElucHV0KCkgZGVmYXVsdFRleHRDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgdGV4dENvbG9yOiBzdHJpbmcgPSAncmdiYSgyNTUsIDE4NywgNTksIDEpJztcclxuICBwdWJsaWMgdGV4dFNpemVWYWx1ZTogbnVtYmVyID0gNTA7XHJcbiAgcHVibGljIHRleHRBbGlnbjogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnID0gJ2xlZnQnO1xyXG4gIHB1YmxpYyB0ZXh0Rm9udEZhbWlseSA9ICdOb3RvIFNhbnMnO1xyXG4gIHB1YmxpYyB0ZXh0Rm9udFN0eWxlOiAnbm9ybWFsJyB8ICdpdGFsaWMnID0gJ25vcm1hbCc7XHJcbiAgcHVibGljIHRleHRGb250V2VpZ2h0OiAnbm9ybWFsJyB8ICdib2xkJyA9ICdub3JtYWwnO1xyXG4gIHB1YmxpYyB0ZXh0RGVjb3JhdGlvbjpcclxuICAgIHwgJ3VuZGVybGluZSdcclxuICAgIHwgJ2xpbmUtdGhyb3VnaCdcclxuICAgIHwgJ292ZXJsaW5lJ1xyXG4gICAgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgb25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyOiBhbnk7XHJcbiAgcHVibGljIG9uVGV4dEFkZGVkRXZlbnRMaXN0ZW5lcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMub25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyID0gdGhpcy5vbk9iamVjdEFjdGl2YXRlZC5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5vblRleHRBZGRlZEV2ZW50TGlzdGVuZXIgPSB0aGlzLm9uVGV4dEFkZGVkLmJpbmQodGhpcyk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICBpZiAoY2hhbmdlc1snaW1hZ2VFZGl0b3InXSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gZ2V0QWN0aXZlT2JqZWN0SWQoXHJcbiAgICAgICAgY2hhbmdlc1snaW1hZ2VFZGl0b3InXS5jdXJyZW50VmFsdWVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuICAgICAgY2hhbmdlc1snaW1hZ2VFZGl0b3InXS5jdXJyZW50VmFsdWU/LnN0YXJ0RHJhd2luZ01vZGUoJ1RFWFQnKTtcclxuXHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10ucHJldmlvdXNWYWx1ZT8ub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGF0Lm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLmN1cnJlbnRWYWx1ZT8ub24oXHJcbiAgICAgICAgZXZlbnROYW1lcy5PQkpFQ1RfQUNUSVZBVEVELFxyXG4gICAgICAgIHRoYXQub25PYmplY3RBY3RpdmF0ZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBjaGFuZ2VzWydpbWFnZUVkaXRvciddLnByZXZpb3VzVmFsdWU/Lm9mZihcclxuICAgICAgICBldmVudE5hbWVzLkFERF9URVhULFxyXG4gICAgICAgIHRoYXQub25UZXh0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICAgIGNoYW5nZXNbJ2ltYWdlRWRpdG9yJ10uY3VycmVudFZhbHVlPy5vbihcclxuICAgICAgICBldmVudE5hbWVzLkFERF9URVhULFxyXG4gICAgICAgIHRoYXQub25UZXh0QWRkZWRFdmVudExpc3RlbmVyXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmltYWdlRWRpdG9yKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VFZGl0b3Iub2ZmKFxyXG4gICAgICAgIGV2ZW50TmFtZXMuT0JKRUNUX0FDVElWQVRFRCxcclxuICAgICAgICB0aGlzLm9uT2JqZWN0QWN0aXZhdGVkRXZlbnRMaXN0ZW5lclxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmltYWdlRWRpdG9yLm9mZihldmVudE5hbWVzLkFERF9URVhULCB0aGlzLm9uVGV4dEFkZGVkRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uT2JqZWN0QWN0aXZhdGVkKHByb3BzKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU9iamVjdElkID0gcHJvcHM/LmlkO1xyXG4gICAgdGhpcy5jaGVja0FjdGl2ZU9iamVjdCh0aGlzLmFjdGl2ZU9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25UZXh0QWRkZWQoZSkge1xyXG4gICAgdGhpcy5pbWFnZUVkaXRvclxyXG4gICAgICAuYWRkVGV4dCgnRWRpdCB0ZXh0Jywge1xyXG4gICAgICAgIHBvc2l0aW9uOiBlLm9yaWdpblBvc2l0aW9uLFxyXG4gICAgICAgIHN0eWxlczoge1xyXG4gICAgICAgICAgZmlsbDogdGhpcy50ZXh0Q29sb3IsXHJcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLnRleHRGb250RmFtaWx5LFxyXG4gICAgICAgICAgZm9udFNpemU6IHRoaXMudGV4dFNpemVWYWx1ZSxcclxuICAgICAgICAgIGZvbnRTdHlsZTogdGhpcy50ZXh0Rm9udFN0eWxlLFxyXG4gICAgICAgICAgZm9udFdlaWdodDogdGhpcy50ZXh0Rm9udFdlaWdodCxcclxuICAgICAgICAgIHRleHRBbGlnbjogdGhpcy50ZXh0QWxpZ24sXHJcbiAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogdGhpcy50ZXh0RGVjb3JhdGlvbixcclxuICAgICAgICAgIHVuZGVybGluZTogdGhpcy50ZXh0RGVjb3JhdGlvbiA9PSAndW5kZXJsaW5lJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRvci5jaGFuZ2VDdXJzb3IoJ2RlZmF1bHQnKTtcclxuICAgICAgICB0aGlzLmltYWdlRWRpdG9yPy5zdGFydERyYXdpbmdNb2RlKCdURVhUJyk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0FjdGl2ZU9iamVjdChhY3RpdmVPYmplY3RJZDogbnVtYmVyKSB7XHJcbiAgICBpZiAoYWN0aXZlT2JqZWN0SWQgIT0gbnVsbCkge1xyXG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLmltYWdlRWRpdG9yPy5nZXRPYmplY3RQcm9wZXJ0aWVzKGFjdGl2ZU9iamVjdElkLCBbXHJcbiAgICAgICAgJ3R5cGUnLFxyXG4gICAgICAgICdmaWxsJyxcclxuICAgICAgICAndGV4dEFsaWduJyxcclxuICAgICAgICAndGV4dERlY29yYXRpb24nLFxyXG4gICAgICAgICdmb250RmFtaWx5JyxcclxuICAgICAgICAnZm9udFN0eWxlJyxcclxuICAgICAgICAnZm9udFdlaWdodCcsXHJcbiAgICAgICAgJ2ZvbnRTaXplJyxcclxuICAgICAgXSk7XHJcbiAgICAgIGlmIChwcm9wcyAmJiAocHJvcHMudHlwZSA9PT0gJ2ktdGV4dCcgfHwgcHJvcHMudHlwZSA9PT0gJ3RleHQnKSkge1xyXG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduO1xyXG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gcHJvcHMuZmlsbDtcclxuICAgICAgICB0aGlzLnRleHREZWNvcmF0aW9uID0gcHJvcHMudGV4dERlY29yYXRpb247XHJcbiAgICAgICAgdGhpcy50ZXh0Rm9udEZhbWlseSA9IHByb3BzLmZvbnRGYW1pbHk7XHJcbiAgICAgICAgdGhpcy50ZXh0Rm9udFN0eWxlID0gcHJvcHMuZm9udFN0eWxlO1xyXG4gICAgICAgIHRoaXMudGV4dEZvbnRXZWlnaHQgPSBwcm9wcy5mb250V2VpZ2h0O1xyXG4gICAgICAgIHRoaXMudGV4dFNpemVWYWx1ZSA9IHByb3BzLmZvbnRTaXplO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3I/LnN0YXJ0RHJhd2luZ01vZGUoJ1RFWFQnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGV4dEFsaWdubWVudChuZXdWYWx1ZTogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnKSB7XHJcbiAgICB0aGlzLnRleHRBbGlnbiA9IG5ld1ZhbHVlO1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlQWN0aXZlT2JqZWN0KCd0ZXh0QWxpZ24nKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZVRleHRGb250U3R5bGUobmV3Rm9udFN0eWxlOiAnbm9ybWFsJyB8ICdpdGFsaWMnKSB7XHJcbiAgICB0aGlzLnRleHRGb250U3R5bGUgPSBuZXdGb250U3R5bGU7XHJcbiAgICB0aGlzLnRleHRDaGFuZ2VBY3RpdmVPYmplY3QoJ2ZvbnRTdHlsZScpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGV4dEZvbnRXZWlnaHQobmV3Rm9udFdlaWdodDogJ25vcm1hbCcgfCAnYm9sZCcpIHtcclxuICAgIHRoaXMudGV4dEZvbnRXZWlnaHQgPSBuZXdGb250V2VpZ2h0O1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlQWN0aXZlT2JqZWN0KCdmb250V2VpZ2h0Jyk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VUZXh0RGVjb3JhdGlvbihcclxuICAgIG5ld1RleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJyB8ICdsaW5lLXRocm91Z2gnIHwgJ292ZXJsaW5lJyB8IG51bGxcclxuICApIHtcclxuICAgIHRoaXMudGV4dERlY29yYXRpb24gPSBuZXdUZXh0RGVjb3JhdGlvbjtcclxuICAgIHRoaXMudGV4dENoYW5nZUFjdGl2ZU9iamVjdCgndGV4dERlY29yYXRpb24nKTtcclxuICB9XHJcblxyXG4gIHRleHRTaXplVmFsdWVDaGFuZ2VkKGN1cnJlbnRUZXh0U2l6ZVZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRleHRDaGFuZ2VBY3RpdmVPYmplY3QoJ2ZvbnRTaXplJywgaXNTaWxlbnQpO1xyXG4gIH1cclxuXHJcbiAgdGV4dENvbG9yQ2hhbmdlZChjdXJyZW50Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlQWN0aXZlT2JqZWN0KCdjb2xvcicpO1xyXG4gIH1cclxuXHJcbiAgdGV4dENoYW5nZUFjdGl2ZU9iamVjdChcclxuICAgIHR5cGU6XHJcbiAgICAgIHwgJ2NvbG9yJ1xyXG4gICAgICB8ICdmb250RmFtaWx5J1xyXG4gICAgICB8ICdmb250U2l6ZSdcclxuICAgICAgfCAnZm9udFN0eWxlJ1xyXG4gICAgICB8ICdmb250V2VpZ2h0J1xyXG4gICAgICB8ICd0ZXh0QWxpZ24nXHJcbiAgICAgIHwgJ3RleHREZWNvcmF0aW9uJyxcclxuICAgIGlzU2lsZW50OiBib29sZWFuID0gZmFsc2VcclxuICApIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5hY3RpdmVPYmplY3RJZCAhPSBudWxsICYmXHJcbiAgICAgIGdldEFjdGl2ZU9iamVjdElkKHRoaXMuaW1hZ2VFZGl0b3IpID09IHRoaXMuYWN0aXZlT2JqZWN0SWRcclxuICAgICkge1xyXG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLmltYWdlRWRpdG9yLmdldE9iamVjdFByb3BlcnRpZXMoXHJcbiAgICAgICAgdGhpcy5hY3RpdmVPYmplY3RJZCxcclxuICAgICAgICAndHlwZSdcclxuICAgICAgKTtcclxuICAgICAgbGV0IHBhcmFtZXRlcnMgPSBudWxsO1xyXG4gICAgICBpZiAocHJvcHMudHlwZSA9PT0gJ2ktdGV4dCcgfHwgcHJvcHMudHlwZSA9PT0gJ3RleHQnKSB7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICBjYXNlICdjb2xvcic6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZmlsbDogdGhpcy50ZXh0Q29sb3IsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZm9udEZhbWlseSc6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogdGhpcy50ZXh0Rm9udEZhbWlseSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdmb250U2l6ZSc6XHJcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgZm9udFNpemU6IHRoaXMudGV4dFNpemVWYWx1ZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdmb250U3R5bGUnOlxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICAgIGZvbnRTdHlsZTogdGhpcy50ZXh0Rm9udFN0eWxlLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2ZvbnRXZWlnaHQnOlxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzID0ge1xyXG4gICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IHRoaXMudGV4dEZvbnRXZWlnaHQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAndGV4dEFsaWduJzpcclxuICAgICAgICAgICAgcGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICB0ZXh0QWxpZ246IHRoaXMudGV4dEFsaWduLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ3RleHREZWNvcmF0aW9uJzpcclxuICAgICAgICAgICAgcGFyYW1ldGVycyA9IHtcclxuICAgICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbjogdGhpcy50ZXh0RGVjb3JhdGlvbixcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jdGlvblRvRXhlY3V0ZSA9ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuY2hhbmdlVGV4dFN0eWxlKFxyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU9iamVjdElkLFxyXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxyXG4gICAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChpc1NpbGVudCkge1xyXG4gICAgICAgICAgZnVuY3Rpb25Ub0V4ZWN1dGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvblRvRXhlY3V0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLW1lbnUtdGV4dFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtaXRlbVwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItanVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbiAgICAgIFtzdHlsZS5tYXhXaWR0aF09XCInMTAwJSdcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3Itb3ZlcmZsb3dhYmxlLXggdHVpLWltYWdlLWVkaXRvci1weS0zXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwidGllLXRleHQtZWZmZWN0LWJ1dHRvbiB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gYm9sZCAnICtcclxuICAgICAgICAgICAgICAodGV4dEZvbnRXZWlnaHQgPT0gJ2JvbGQnID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIlxyXG4gICAgICAgICAgICAgIGNoYW5nZVRleHRGb250V2VpZ2h0KHRleHRGb250V2VpZ2h0ID09ICdib2xkJyA/ICdub3JtYWwnIDogJ2JvbGQnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzdmdfaWMtc3VibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtYm9sZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWJvbGRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC1ib2xkXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgJ3R1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIGl0YWxpYyAnICtcclxuICAgICAgICAgICAgICAodGV4dEZvbnRTdHlsZSA9PSAnaXRhbGljJyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgICAgICBjaGFuZ2VUZXh0Rm9udFN0eWxlKFxyXG4gICAgICAgICAgICAgICAgdGV4dEZvbnRTdHlsZSA9PSAnaXRhbGljJyA/ICdub3JtYWwnIDogJ2l0YWxpYydcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtdGV4dC1pdGFsaWNcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vcm1hbCB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtdGV4dC1pdGFsaWNcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC1pdGFsaWNcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gdW5kZXJsaW5lICcgK1xyXG4gICAgICAgICAgICAgICh0ZXh0RGVjb3JhdGlvbiA9PSAndW5kZXJsaW5lJyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJcclxuICAgICAgICAgICAgICBjaGFuZ2VUZXh0RGVjb3JhdGlvbihcclxuICAgICAgICAgICAgICAgIHRleHREZWNvcmF0aW9uID09ICd1bmRlcmxpbmUnID8gbnVsbCA6ICd1bmRlcmxpbmUnXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzdmdfaWMtc3VibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub3JtYWwgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3RpdmUgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy10ZXh0LXVuZGVybGluZVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXBhcnRpdGlvblwiPlxyXG4gICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInRpZS10ZXh0LWFsaWduLWJ1dHRvbiB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgICAndHVpLWltYWdlLWVkaXRvci1idXR0b24gbGVmdCAnICtcclxuICAgICAgICAgICAgICAodGV4dEFsaWduID09ICdsZWZ0JyA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUZXh0QWxpZ25tZW50KCdsZWZ0JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzdmdfaWMtc3VibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2ljLXRleHQtYWxpZ24tbGVmdFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLWxlZnRcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGl2ZSB1c2UtZGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICA+PC91c2U+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAge3sgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC1sZWZ0XCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgJ3R1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIGNlbnRlciAnICtcclxuICAgICAgICAgICAgICAodGV4dEFsaWduID09ICdjZW50ZXInID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVRleHRBbGlnbm1lbnQoJ2NlbnRlcicpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwic3ZnX2ljLXN1Ym1lbnVcIj5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aXZlIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICB7eyBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy10ZXh0LWNlbnRlclwiIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgW2NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICd0dWktaW1hZ2UtZWRpdG9yLWJ1dHRvbiByaWdodCAnICtcclxuICAgICAgICAgICAgICAodGV4dEFsaWduID09ICdyaWdodCcgPyAnYWN0aXZlJyA6ICcnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGV4dEFsaWdubWVudCgncmlnaHQnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInN2Z19pYy1zdWJtZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjaWMtdGV4dC1hbGlnbi1yaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9ybWFsIHVzZS1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgID48L3VzZT5cclxuICAgICAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNpYy10ZXh0LWFsaWduLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY3RpdmUgdXNlLWRlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgPjwvdXNlPlxyXG4gICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgIHt7IFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLXRleHQtcmlnaHRcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItcGFydGl0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwidGllLXRleHQtY29sb3IgdHVpLWltYWdlLWVkaXRvci1idXR0b24gdHVpLWltYWdlLWVkaXRvci1idXR0b24tY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1jb2x1bW5cIlxyXG4gICAgICAgICAgICB0aXRsZT1cIkNvbG9yXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGllLXRleHQtY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgIFsoY29sb3JQaWNrZXIpXT1cInRleHRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJ0ZXh0Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgW2NwT3V0cHV0Rm9ybWF0XT1cIidyZ2JhJ1wiXHJcbiAgICAgICAgICAgICAgICBbY3BQcmVzZXRDb2xvcnNdPVwiZGVmYXVsdFRleHRDb2xvcnNcIlxyXG4gICAgICAgICAgICAgICAgKGNvbG9yUGlja2VyQ2hhbmdlKT1cInRleHRDb2xvckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbY3BVc2VSb290Vmlld0NvbnRhaW5lcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICB7eyBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy10ZXh0LWNvbG9yXCIgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj48L2xhYmVsXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbmV3bGluZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXdyYXAgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWp1c3RpZnktY29udGVudC1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1tYi0zXCJcclxuICAgID5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwicmFuZ2VcIj5cclxuICAgICAgICB7e1xyXG4gICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtdGV4dC10ZXh0U2l6ZVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgfX08L2xhYmVsXHJcbiAgICAgID5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInRleHRTaXplVmFsdWVcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRleHRTaXplVmFsdWVDaGFuZ2VkKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwidGV4dFNpemVWYWx1ZUNoYW5nZWQoJGV2ZW50LCBmYWxzZSlcIlxyXG4gICAgICAgIG1pbj1cIjEwXCJcclxuICAgICAgICBtYXg9XCIxMDBcIlxyXG4gICAgICAvPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICBtaW49XCIxMFwiXHJcbiAgICAgICAgbWF4PVwiMTAwXCJcclxuICAgICAgICBzdGVwPVwiMVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0aWUtdGV4dC1yYW5nZS12YWx1ZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXZhbHVlXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInRleHRTaXplVmFsdWVcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRleHRTaXplVmFsdWVDaGFuZ2VkKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwidGV4dFNpemVWYWx1ZUNoYW5nZWQoJGV2ZW50LCBmYWxzZSlcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|