@hmcts/media-viewer 4.1.8-exui-2488-1 → 4.1.8-exui-2600-1
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/assets/sass/box-highlight.scss +38 -0
- package/esm2022/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.mjs +74 -19
- package/esm2022/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.mjs +258 -0
- package/esm2022/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.mjs +4 -4
- package/esm2022/lib/annotations/annotation-set/annotation-view/annotation-view.component.mjs +37 -3
- package/esm2022/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.mjs +122 -0
- package/esm2022/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.mjs +39 -3
- package/esm2022/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.mjs +3 -3
- package/esm2022/lib/annotations/annotations.module.mjs +9 -3
- package/esm2022/lib/store/actions/annotation.actions.mjs +3 -2
- package/esm2022/lib/store/effects/annotation.effects.mjs +13 -3
- package/esm2022/lib/viewers/pdf-viewer/side-bar/side-bar.component.mjs +3 -8
- package/fesm2022/hmcts-media-viewer.mjs +545 -39
- package/fesm2022/hmcts-media-viewer.mjs.map +1 -1
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.d.ts +16 -2
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.d.ts.map +1 -1
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.d.ts +59 -0
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.d.ts.map +1 -0
- package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.d.ts +1 -1
- package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.d.ts.map +1 -1
- package/lib/annotations/annotation-set/annotation-view/annotation-view.component.d.ts +8 -2
- package/lib/annotations/annotation-set/annotation-view/annotation-view.component.d.ts.map +1 -1
- package/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.d.ts +27 -0
- package/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.d.ts.map +1 -0
- package/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.d.ts +10 -1
- package/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.d.ts.map +1 -1
- package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts +2 -1
- package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts.map +1 -1
- package/lib/annotations/annotations.module.d.ts +13 -11
- package/lib/annotations/annotations.module.d.ts.map +1 -1
- package/lib/store/actions/annotation.actions.d.ts +2 -1
- package/lib/store/actions/annotation.actions.d.ts.map +1 -1
- package/lib/store/effects/annotation.effects.d.ts +1 -0
- package/lib/store/effects/annotation.effects.d.ts.map +1 -1
- package/lib/viewers/pdf-viewer/side-bar/side-bar.component.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -7,4 +7,42 @@ mv-box-highlight-create {
|
|
|
7
7
|
z-index: 10;
|
|
8
8
|
opacity: 0.5;
|
|
9
9
|
}
|
|
10
|
+
|
|
11
|
+
// for keyboard users
|
|
12
|
+
.drawing-cursor {
|
|
13
|
+
width: 14px;
|
|
14
|
+
height: 14px;
|
|
15
|
+
margin-left: -7px;
|
|
16
|
+
margin-top: -7px;
|
|
17
|
+
z-index: 15;
|
|
18
|
+
pointer-events: none;
|
|
19
|
+
position: relative;
|
|
20
|
+
background-color: #ffdd00;
|
|
21
|
+
border-radius: 50%;
|
|
22
|
+
border: 1px solid #ffdd00;
|
|
23
|
+
|
|
24
|
+
// vertical line
|
|
25
|
+
&::before {
|
|
26
|
+
content: '';
|
|
27
|
+
position: absolute;
|
|
28
|
+
top: 0;
|
|
29
|
+
left: 50%;
|
|
30
|
+
width: 1px;
|
|
31
|
+
height: 100%;
|
|
32
|
+
background-color: #0b0c0c;
|
|
33
|
+
transform: translateX(-0.5px);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// horizontal line
|
|
37
|
+
&::after {
|
|
38
|
+
content: '';
|
|
39
|
+
position: absolute;
|
|
40
|
+
top: 50%;
|
|
41
|
+
left: 0;
|
|
42
|
+
width: 100%;
|
|
43
|
+
height: 1px;
|
|
44
|
+
background-color: #0b0c0c;
|
|
45
|
+
transform: translateY(-0.5px);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
10
48
|
}
|
|
@@ -4,6 +4,8 @@ import { HtmlTemplatesHelper } from '../../../../shared/util/helpers/html-templa
|
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "../../../../toolbar/toolbar-event.service";
|
|
6
6
|
import * as i2 from "../highlight-create/highlight-create.service";
|
|
7
|
+
import * as i3 from "@angular/common";
|
|
8
|
+
import * as i4 from "./keyboard-box-draw.directive";
|
|
7
9
|
export class BoxHighlightCreateComponent {
|
|
8
10
|
constructor(toolbarEvents, highlightService) {
|
|
9
11
|
this.toolbarEvents = toolbarEvents;
|
|
@@ -12,6 +14,8 @@ export class BoxHighlightCreateComponent {
|
|
|
12
14
|
this.drawStartX = -1;
|
|
13
15
|
this.drawStartY = -1;
|
|
14
16
|
this.backgroundColor = 'none';
|
|
17
|
+
this.keyboardDrawingMode = false;
|
|
18
|
+
this.showCursor = false;
|
|
15
19
|
this.subscriptions = [];
|
|
16
20
|
}
|
|
17
21
|
ngOnInit() {
|
|
@@ -19,6 +23,14 @@ export class BoxHighlightCreateComponent {
|
|
|
19
23
|
this.toolbarEvents.drawModeSubject.subscribe(drawMode => {
|
|
20
24
|
this.defaultHeight = drawMode ? '100%' : '0px';
|
|
21
25
|
this.defaultWidth = drawMode ? '100%' : '0px';
|
|
26
|
+
this.drawMode = drawMode;
|
|
27
|
+
if (drawMode) {
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
if (this.drawingContainer?.nativeElement && this.isElementInViewport(this.drawingContainer.nativeElement)) {
|
|
30
|
+
this.drawingContainer.nativeElement.focus();
|
|
31
|
+
}
|
|
32
|
+
}, 100);
|
|
33
|
+
}
|
|
22
34
|
}),
|
|
23
35
|
this.toolbarEvents.redactWholePage.subscribe(() => {
|
|
24
36
|
this.wholePage = true;
|
|
@@ -30,13 +42,20 @@ export class BoxHighlightCreateComponent {
|
|
|
30
42
|
subscription.unsubscribe();
|
|
31
43
|
});
|
|
32
44
|
}
|
|
45
|
+
isElementInViewport(el) {
|
|
46
|
+
const rect = el.getBoundingClientRect();
|
|
47
|
+
const windowHeight = (window.innerHeight || document.documentElement.clientHeight);
|
|
48
|
+
const windowWidth = (window.innerWidth || document.documentElement.clientWidth);
|
|
49
|
+
const verticallyVisible = rect.bottom > 0 && rect.top < windowHeight;
|
|
50
|
+
const horizontallyVisible = rect.right > 0 && rect.left < windowWidth;
|
|
51
|
+
return verticallyVisible && horizontallyVisible;
|
|
52
|
+
}
|
|
33
53
|
initHighlight(event) {
|
|
34
54
|
if (this.wholePage) {
|
|
35
55
|
this.highlightPage();
|
|
36
56
|
return;
|
|
37
57
|
}
|
|
38
58
|
const rect = HtmlTemplatesHelper.getAdjustedBoundingRect(event.target), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
|
|
39
|
-
console.log(`initHighlight: rect=${JSON.stringify(rect)}, clientX=${event.clientX}, clientY=${event.clientY}, offsetX=${offsetX}, offsetY=${offsetY}`);
|
|
40
59
|
this.position = 'absolute';
|
|
41
60
|
this.backgroundColor = 'yellow';
|
|
42
61
|
this.drawStartX = offsetX;
|
|
@@ -46,18 +65,7 @@ export class BoxHighlightCreateComponent {
|
|
|
46
65
|
this.width = 50;
|
|
47
66
|
this.top = this.drawStartY;
|
|
48
67
|
this.left = this.drawStartX;
|
|
49
|
-
|
|
50
|
-
case 90:
|
|
51
|
-
this.top = this.drawStartY - this.height;
|
|
52
|
-
break;
|
|
53
|
-
case 180:
|
|
54
|
-
this.top = this.drawStartY - this.height;
|
|
55
|
-
this.left = this.drawStartX - this.width;
|
|
56
|
-
break;
|
|
57
|
-
case 270:
|
|
58
|
-
this.left = this.drawStartX - this.width;
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
68
|
+
this.adjustForRotation();
|
|
61
69
|
}
|
|
62
70
|
updateHighlight(event) {
|
|
63
71
|
const rect = HtmlTemplatesHelper.getAdjustedBoundingRect(event.target, false), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
|
|
@@ -72,12 +80,56 @@ export class BoxHighlightCreateComponent {
|
|
|
72
80
|
if (this.height / this.zoom > 5 || this.width / this.zoom > 5) {
|
|
73
81
|
let rectangle = this.highlightService
|
|
74
82
|
.applyRotation(this.pageHeight, this.pageWidth, this.height, this.width, this.top, this.left, this.rotate, this.zoom);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
this.saveSelection.emit({ rectangles: [rectangle], page: this.page });
|
|
83
|
+
const annotationId = uuid();
|
|
84
|
+
rectangle = { id: annotationId, ...rectangle };
|
|
85
|
+
this.saveSelection.emit({ rectangles: [rectangle], page: this.page, annotationId });
|
|
78
86
|
this.resetHighlight();
|
|
79
87
|
}
|
|
80
88
|
}
|
|
89
|
+
onCursorPositionChanged(position) {
|
|
90
|
+
this.cursorX = position.x;
|
|
91
|
+
this.cursorY = position.y;
|
|
92
|
+
this.showCursor = position.visible;
|
|
93
|
+
}
|
|
94
|
+
onDrawingStarted(event) {
|
|
95
|
+
this.keyboardDrawingMode = true;
|
|
96
|
+
this.position = 'absolute';
|
|
97
|
+
this.backgroundColor = 'yellow';
|
|
98
|
+
this.display = 'block';
|
|
99
|
+
this.drawStartX = event.startX;
|
|
100
|
+
this.drawStartY = event.startY;
|
|
101
|
+
this.width = event.width;
|
|
102
|
+
this.height = event.height;
|
|
103
|
+
this.top = this.drawStartY;
|
|
104
|
+
this.left = this.drawStartX;
|
|
105
|
+
this.adjustForRotation();
|
|
106
|
+
}
|
|
107
|
+
onDrawingUpdated(event) {
|
|
108
|
+
this.width = event.width;
|
|
109
|
+
this.height = event.height;
|
|
110
|
+
}
|
|
111
|
+
onDrawingConfirmed(event) {
|
|
112
|
+
this.keyboardDrawingMode = false;
|
|
113
|
+
this.createHighlight();
|
|
114
|
+
}
|
|
115
|
+
onDrawingCancelled() {
|
|
116
|
+
this.keyboardDrawingMode = false;
|
|
117
|
+
this.resetHighlight();
|
|
118
|
+
}
|
|
119
|
+
adjustForRotation() {
|
|
120
|
+
switch (this.rotate) {
|
|
121
|
+
case 90:
|
|
122
|
+
this.top = this.drawStartY - this.height;
|
|
123
|
+
break;
|
|
124
|
+
case 180:
|
|
125
|
+
this.top = this.drawStartY - this.height;
|
|
126
|
+
this.left = this.drawStartX - this.width;
|
|
127
|
+
break;
|
|
128
|
+
case 270:
|
|
129
|
+
this.left = this.drawStartX - this.width;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
81
133
|
resetHighlight() {
|
|
82
134
|
this.drawStartX = -1;
|
|
83
135
|
this.drawStartY = -1;
|
|
@@ -96,11 +148,11 @@ export class BoxHighlightCreateComponent {
|
|
|
96
148
|
this.createHighlight();
|
|
97
149
|
}
|
|
98
150
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BoxHighlightCreateComponent, deps: [{ token: i1.ToolbarEventService }, { token: i2.HighlightCreateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
99
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: { page: "page", pageHeight: "pageHeight", pageWidth: "pageWidth", rotate: "rotate", zoom: "zoom", container: "container" }, outputs: { saveSelection: "saveSelection" }, viewQueries: [{ propertyName: "highlight", first: true, predicate: ["boxHighlight"], descendants: true }], ngImport: i0, template: "<div [style.height]=\"defaultHeight\"\n
|
|
151
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: { page: "page", pageHeight: "pageHeight", pageWidth: "pageWidth", rotate: "rotate", zoom: "zoom", container: "container" }, outputs: { saveSelection: "saveSelection" }, viewQueries: [{ propertyName: "highlight", first: true, predicate: ["boxHighlight"], descendants: true }, { propertyName: "drawingContainer", first: true, predicate: ["drawingContainer"], descendants: true }], ngImport: i0, template: "<div #drawingContainer\n [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n [tabindex]=\"drawMode ? 0 : -1\"\n mvKeyboardBoxDraw\n [enabled]=\"drawMode\"\n (cursorPositionChanged)=\"onCursorPositionChanged($event)\"\n (drawingStarted)=\"onDrawingStarted($event)\"\n (drawingUpdated)=\"onDrawingUpdated($event)\"\n (drawingConfirmed)=\"onDrawingConfirmed($event)\"\n (drawingCancelled)=\"onDrawingCancelled()\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n\n <div *ngIf=\"showCursor\"\n class=\"drawing-cursor\"\n [style.position]=\"'absolute'\"\n [style.top]=\"cursorY + 'px'\"\n [style.left]=\"cursorX + 'px'\">\n </div>\n\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.KeyboardBoxDrawDirective, selector: "[mvKeyboardBoxDraw]", inputs: ["enabled", "minBoxSize", "incrementSmall", "incrementMedium", "incrementLarge"], outputs: ["drawingStarted", "drawingUpdated", "drawingConfirmed", "drawingCancelled", "cursorPositionChanged"] }] }); }
|
|
100
152
|
}
|
|
101
153
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BoxHighlightCreateComponent, decorators: [{
|
|
102
154
|
type: Component,
|
|
103
|
-
args: [{ selector: 'mv-box-highlight-create', template: "<div [style.height]=\"defaultHeight\"\n
|
|
155
|
+
args: [{ selector: 'mv-box-highlight-create', template: "<div #drawingContainer\n [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n [tabindex]=\"drawMode ? 0 : -1\"\n mvKeyboardBoxDraw\n [enabled]=\"drawMode\"\n (cursorPositionChanged)=\"onCursorPositionChanged($event)\"\n (drawingStarted)=\"onDrawingStarted($event)\"\n (drawingUpdated)=\"onDrawingUpdated($event)\"\n (drawingConfirmed)=\"onDrawingConfirmed($event)\"\n (drawingCancelled)=\"onDrawingCancelled()\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n\n <div *ngIf=\"showCursor\"\n class=\"drawing-cursor\"\n [style.position]=\"'absolute'\"\n [style.top]=\"cursorY + 'px'\"\n [style.left]=\"cursorX + 'px'\">\n </div>\n\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n" }]
|
|
104
156
|
}], ctorParameters: () => [{ type: i1.ToolbarEventService }, { type: i2.HighlightCreateService }], propDecorators: { page: [{
|
|
105
157
|
type: Input
|
|
106
158
|
}], pageHeight: [{
|
|
@@ -118,5 +170,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
118
170
|
}], highlight: [{
|
|
119
171
|
type: ViewChild,
|
|
120
172
|
args: ['boxHighlight', { static: false }]
|
|
173
|
+
}], drawingContainer: [{
|
|
174
|
+
type: ViewChild,
|
|
175
|
+
args: ['drawingContainer', { static: false }]
|
|
121
176
|
}] } });
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS2xDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7O0FBSzVGLE1BQU0sT0FBTywyQkFBMkI7SUE2QnRDLFlBQTZCLGFBQWtDLEVBQzVDLGdCQUF3QztRQUQ5QixrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDNUMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQXJCakQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBNkMsQ0FBQztRQUl4RixlQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBVWhCLG9CQUFlLEdBQUcsTUFBTSxDQUFDO1FBR2pCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUdvQixDQUFDO0lBRWhFLFFBQVE7UUFDTixJ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QUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsU0FBUztzQkFBdEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUmVjdGFuZ2xlIH0gZnJvbSAnLi4vLi4vYW5ub3RhdGlvbi12aWV3L3JlY3RhbmdsZS9yZWN0YW5nbGUubW9kZWwnO1xuaW1wb3J0IHsgSGlnaGxpZ2h0Q3JlYXRlU2VydmljZSB9IGZyb20gJy4uL2hpZ2hsaWdodC1jcmVhdGUvaGlnaGxpZ2h0LWNyZWF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvb2xiYXJFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi90b29sYmFyL3Rvb2xiYXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBIdG1sVGVtcGxhdGVzSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3V0aWwvaGVscGVycy9odG1sLXRlbXBsYXRlcy5oZWxwZXInO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXYtYm94LWhpZ2hsaWdodC1jcmVhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBCb3hIaWdobGlnaHRDcmVhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcGFnZTogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlSGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2VXaWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSByb3RhdGU6IG51bWJlcjtcbiAgQElucHV0KCkgem9vbTogbnVtYmVyO1xuICBASW5wdXQoKSBjb250YWluZXI6IHsgdG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciB9O1xuXG4gIEBPdXRwdXQoKSBzYXZlU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlY3RhbmdsZXM6IFJlY3RhbmdsZVtdLCBwYWdlOiBudW1iZXIgfT4oKTtcblxuICBAVmlld0NoaWxkKCdib3hIaWdobGlnaHQnLCB7IHN0YXRpYzogZmFsc2UgfSkgaGlnaGxpZ2h0OiBFbGVtZW50UmVmO1xuXG4gIGRyYXdTdGFydFggPSAtMTtcbiAgZHJhd1N0YXJ0WSA9IC0xO1xuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgZGlzcGxheTogc3RyaW5nO1xuICBkcmF3TW9kZTogYm9vbGVhbjtcbiAgZGVmYXVsdEhlaWdodDogc3RyaW5nO1xuICBkZWZhdWx0V2lkdGg6IHN0cmluZztcbiAgcG9zaXRpb246IHN0cmluZztcbiAgYmFja2dyb3VuZENvbG9yID0gJ25vbmUnO1xuICB3aG9sZVBhZ2U6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdG9vbGJhckV2ZW50czogVG9vbGJhckV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZ2hsaWdodFNlcnZpY2U6IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgIHRoaXMudG9vbGJhckV2ZW50cy5kcmF3TW9kZVN1YmplY3Quc3Vic2NyaWJlKGRyYXdNb2RlID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVpZ2h0ID0gZHJhd01vZGUgPyAnMTAwJScgOiAnMHB4JztcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSBkcmF3TW9kZSA/ICcxMDAlJyA6ICcwcHgnO1xuICAgICAgfSksXG4gICAgICB0aGlzLnRvb2xiYXJFdmVudHMucmVkYWN0V2hvbGVQYWdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMud2hvbGVQYWdlID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy53aG9sZVBhZ2UpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0UGFnZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBIdG1sVGVtcGxhdGVzSGVscGVyLmdldEFkanVzdGVkQm91bmRpbmdSZWN0KChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSxcbiAgICBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgIGNvbnNvbGUubG9nKGBpbml0SGlnaGxpZ2h0OiByZWN0PSR7SlNPTi5zdHJpbmdpZnkocmVjdCl9LCBjbGllbnRYPSR7ZXZlbnQuY2xpZW50WH0sIGNsaWVudFk9JHtldmVudC5jbGllbnRZfSwgb2Zmc2V0WD0ke29mZnNldFh9LCBvZmZzZXRZPSR7b2Zmc2V0WX1gKTtcblxuICAgIHRoaXMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ3llbGxvdyc7XG4gICAgdGhpcy5kcmF3U3RhcnRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSBvZmZzZXRZO1xuXG4gICAgdGhpcy5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLmhlaWdodCA9IDUwO1xuICAgIHRoaXMud2lkdGggPSA1MDtcbiAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WTtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFg7XG5cbiAgICBzd2l0Y2ggKHRoaXMucm90YXRlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WSAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WSAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFggLSB0aGlzLndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFggLSB0aGlzLndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB1cGRhdGVIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCByZWN0ID0gSHRtbFRlbXBsYXRlc0hlbHBlci5nZXRBZGp1c3RlZEJvdW5kaW5nUmVjdChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGZhbHNlKSxcbiAgICAgIG9mZnNldFggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcbiAgICBpZiAodGhpcy5kcmF3U3RhcnRYID4gMCAmJiB0aGlzLmRyYXdTdGFydFkgPiAwKSB7XG4gICAgICB0aGlzLmhlaWdodCA9IE1hdGguYWJzKG9mZnNldFkgLSB0aGlzLmRyYXdTdGFydFkpO1xuICAgICAgdGhpcy53aWR0aCA9IE1hdGguYWJzKG9mZnNldFggLSB0aGlzLmRyYXdTdGFydFgpO1xuICAgICAgdGhpcy50b3AgPSBNYXRoLm1pbihvZmZzZXRZLCB0aGlzLmRyYXdTdGFydFkpO1xuICAgICAgdGhpcy5sZWZ0ID0gTWF0aC5taW4ob2Zmc2V0WCwgdGhpcy5kcmF3U3RhcnRYKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVIaWdobGlnaHQoKSB7XG4gICAgaWYgKHRoaXMuaGVpZ2h0IC8gdGhpcy56b29tID4gNSB8fCB0aGlzLndpZHRoIC8gdGhpcy56b29tID4gNSkge1xuICAgICAgbGV0IHJlY3RhbmdsZSA9IHRoaXMuaGlnaGxpZ2h0U2VydmljZVxuICAgICAgICAuYXBwbHlSb3RhdGlvbih0aGlzLnBhZ2VIZWlnaHQsIHRoaXMucGFnZVdpZHRoLCB0aGlzLmhlaWdodCwgdGhpcy53aWR0aCwgdGhpcy50b3AsIHRoaXMubGVmdCwgdGhpcy5yb3RhdGUsIHRoaXMuem9vbSk7XG4gICAgICByZWN0YW5nbGUgPSB7IGlkOiB1dWlkKCksIC4uLnJlY3RhbmdsZSB9IGFzIGFueTtcbiAgICAgIGNvbnNvbGUubG9nKGBjcmVhdGVIaWdobGlnaHQ6IHJlY3RhbmdsZT0ke0pTT04uc3RyaW5naWZ5KHJlY3RhbmdsZSl9YCk7XG4gICAgICB0aGlzLnNhdmVTZWxlY3Rpb24uZW1pdCh7IHJlY3RhbmdsZXM6IFtyZWN0YW5nbGVdLCBwYWdlOiB0aGlzLnBhZ2UgfSk7XG4gICAgICB0aGlzLnJlc2V0SGlnaGxpZ2h0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEhpZ2hsaWdodCgpIHtcbiAgICB0aGlzLmRyYXdTdGFydFggPSAtMTtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSAtMTtcbiAgICB0aGlzLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy53aWR0aCA9IDA7XG4gICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ25vbmUnO1xuICAgIHRoaXMucG9zaXRpb24gPSAnaW5pdGlhbCc7XG4gICAgdGhpcy53aG9sZVBhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0UGFnZSgpIHtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMucGFnZUhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5wYWdlV2lkdGg7XG4gICAgdGhpcy50b3AgPSAwO1xuICAgIHRoaXMubGVmdCA9IDA7XG4gICAgdGhpcy5jcmVhdGVIaWdobGlnaHQoKTtcbiAgfVxufVxuIiwiPGRpdiBbc3R5bGUuaGVpZ2h0XT1cImRlZmF1bHRIZWlnaHRcIlxuICAgICBbc3R5bGUud2lkdGhdPVwiZGVmYXVsdFdpZHRoXCJcbiAgICAgKG1vdXNlZG93bik9XCJpbml0SGlnaGxpZ2h0KCRldmVudClcIlxuICAgICAobW91c2Vtb3ZlKT1cInVwZGF0ZUhpZ2hsaWdodCgkZXZlbnQpXCJcbiAgICAgKG1vdXNldXApPVwiY3JlYXRlSGlnaGxpZ2h0KClcIj5cbiAgPGRpdiAjYm94SGlnaGxpZ2h0XG4gICAgIGNsYXNzPVwiYm94LWhpZ2hsaWdodFwiXG4gICAgIFtzdHlsZS5kaXNwbGF5XT1cImRpc3BsYXlcIlxuICAgICBbc3R5bGUucG9zaXRpb25dPVwicG9zaXRpb25cIlxuICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJiYWNrZ3JvdW5kQ29sb3JcIlxuICAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodCA/IGhlaWdodCArICdweCcgOiAnMTAwJSdcIlxuICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGggPyB3aWR0aCArICdweCcgOiAnMTAwJSdcIlxuICAgICBbc3R5bGUudG9wXT1cInRvcCArICdweCdcIlxuICAgICBbc3R5bGUubGVmdF09XCJsZWZ0ICsgJ3B4J1wiPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS2xDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7Ozs7QUFPNUYsTUFBTSxPQUFPLDJCQUEyQjtJQXFDdEMsWUFBNkIsYUFBa0MsRUFDNUMsZ0JBQXdDO1FBRDlCLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQUM1QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXdCO1FBN0JqRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFvRSxDQUFDO1FBSy9HLGVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQixlQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFRaEIsb0JBQWUsR0FBRyxNQUFNLENBQUM7UUFPekIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRzVCLGVBQVUsR0FBRyxLQUFLLENBQUM7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RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ00sZ0JBQWdCO3NCQUFqRSxTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL2Fubm90YXRpb24tdmlldy9yZWN0YW5nbGUvcmVjdGFuZ2xlLm1vZGVsJztcbmltcG9ydCB7IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UgfSBmcm9tICcuLi9oaWdobGlnaHQtY3JlYXRlL2hpZ2hsaWdodC1jcmVhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUb29sYmFyRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdG9vbGJhci90b29sYmFyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSHRtbFRlbXBsYXRlc0hlbHBlciB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC91dGlsL2hlbHBlcnMvaHRtbC10ZW1wbGF0ZXMuaGVscGVyJztcbmltcG9ydCB7IEtleWJvYXJkQm94RHJhd0V2ZW50LCBDdXJzb3JQb3NpdGlvbiB9IGZyb20gJy4va2V5Ym9hcmQtYm94LWRyYXcuZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXYtYm94LWhpZ2hsaWdodC1jcmVhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBCb3hIaWdobGlnaHRDcmVhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcGFnZTogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlSGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2VXaWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSByb3RhdGU6IG51bWJlcjtcbiAgQElucHV0KCkgem9vbTogbnVtYmVyO1xuICBASW5wdXQoKSBjb250YWluZXI6IHsgdG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciB9O1xuXG4gIEBPdXRwdXQoKSBzYXZlU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlY3RhbmdsZXM6IFJlY3RhbmdsZVtdLCBwYWdlOiBudW1iZXIsIGFubm90YXRpb25JZD86IHN0cmluZyB9PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2JveEhpZ2hsaWdodCcsIHsgc3RhdGljOiBmYWxzZSB9KSBoaWdobGlnaHQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2RyYXdpbmdDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgZHJhd2luZ0NvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBkcmF3U3RhcnRYID0gLTE7XG4gIGRyYXdTdGFydFkgPSAtMTtcblxuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgZGlzcGxheTogc3RyaW5nO1xuICBwb3NpdGlvbjogc3RyaW5nO1xuICBiYWNrZ3JvdW5kQ29sb3IgPSAnbm9uZSc7XG5cbiAgZHJhd01vZGU6IGJvb2xlYW47XG4gIGRlZmF1bHRIZWlnaHQ6IHN0cmluZztcbiAgZGVmYXVsdFdpZHRoOiBzdHJpbmc7XG4gIHdob2xlUGFnZTogYm9vbGVhbjtcblxuICBrZXlib2FyZERyYXdpbmdNb2RlID0gZmFsc2U7XG4gIGN1cnNvclg6IG51bWJlcjtcbiAgY3Vyc29yWTogbnVtYmVyO1xuICBzaG93Q3Vyc29yID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdG9vbGJhckV2ZW50czogVG9vbGJhckV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZ2hsaWdodFNlcnZpY2U6IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgIHRoaXMudG9vbGJhckV2ZW50cy5kcmF3TW9kZVN1YmplY3Quc3Vic2NyaWJlKGRyYXdNb2RlID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVpZ2h0ID0gZHJhd01vZGUgPyAnMTAwJScgOiAnMHB4JztcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSBkcmF3TW9kZSA/ICcxMDAlJyA6ICcwcHgnO1xuICAgICAgICB0aGlzLmRyYXdNb2RlID0gZHJhd01vZGU7XG4gICAgICAgIGlmIChkcmF3TW9kZSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJhd2luZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLmlzRWxlbWVudEluVmlld3BvcnQodGhpcy5kcmF3aW5nQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0aGlzLnRvb2xiYXJFdmVudHMucmVkYWN0V2hvbGVQYWdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMud2hvbGVQYWdlID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNFbGVtZW50SW5WaWV3cG9ydChlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcbiAgICBjb25zdCB3aW5kb3dXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO1xuXG4gICAgY29uc3QgdmVydGljYWxseVZpc2libGUgPSByZWN0LmJvdHRvbSA+IDAgJiYgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHQ7XG4gICAgY29uc3QgaG9yaXpvbnRhbGx5VmlzaWJsZSA9IHJlY3QucmlnaHQgPiAwICYmIHJlY3QubGVmdCA8IHdpbmRvd1dpZHRoO1xuXG4gICAgcmV0dXJuIHZlcnRpY2FsbHlWaXNpYmxlICYmIGhvcml6b250YWxseVZpc2libGU7XG4gIH1cblxuICBpbml0SGlnaGxpZ2h0KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMud2hvbGVQYWdlKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodFBhZ2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gSHRtbFRlbXBsYXRlc0hlbHBlci5nZXRBZGp1c3RlZEJvdW5kaW5nUmVjdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSksXG4gICAgb2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcblxuICAgIHRoaXMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ3llbGxvdyc7XG4gICAgdGhpcy5kcmF3U3RhcnRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSBvZmZzZXRZO1xuXG4gICAgdGhpcy5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLmhlaWdodCA9IDUwO1xuICAgIHRoaXMud2lkdGggPSA1MDtcbiAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WTtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFg7XG5cbiAgICB0aGlzLmFkanVzdEZvclJvdGF0aW9uKCk7XG4gIH1cblxuICB1cGRhdGVIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCByZWN0ID0gSHRtbFRlbXBsYXRlc0hlbHBlci5nZXRBZGp1c3RlZEJvdW5kaW5nUmVjdChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGZhbHNlKSxcbiAgICAgIG9mZnNldFggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcbiAgXG4gICAgaWYgKHRoaXMuZHJhd1N0YXJ0WCA+IDAgJiYgdGhpcy5kcmF3U3RhcnRZID4gMCkge1xuICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLmFicyhvZmZzZXRZIC0gdGhpcy5kcmF3U3RhcnRZKTtcbiAgICAgIHRoaXMud2lkdGggPSBNYXRoLmFicyhvZmZzZXRYIC0gdGhpcy5kcmF3U3RhcnRYKTtcbiAgICAgIHRoaXMudG9wID0gTWF0aC5taW4ob2Zmc2V0WSwgdGhpcy5kcmF3U3RhcnRZKTtcbiAgICAgIHRoaXMubGVmdCA9IE1hdGgubWluKG9mZnNldFgsIHRoaXMuZHJhd1N0YXJ0WCk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlSGlnaGxpZ2h0KCkge1xuICAgIGlmICh0aGlzLmhlaWdodCAvIHRoaXMuem9vbSA+IDUgfHwgdGhpcy53aWR0aCAvIHRoaXMuem9vbSA+IDUpIHtcbiAgICAgIGxldCByZWN0YW5nbGUgPSB0aGlzLmhpZ2hsaWdodFNlcnZpY2VcbiAgICAgICAgLmFwcGx5Um90YXRpb24odGhpcy5wYWdlSGVpZ2h0LCB0aGlzLnBhZ2VXaWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMud2lkdGgsIHRoaXMudG9wLCB0aGlzLmxlZnQsIHRoaXMucm90YXRlLCB0aGlzLnpvb20pO1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkID0gdXVpZCgpO1xuICAgICAgcmVjdGFuZ2xlID0geyBpZDogYW5ub3RhdGlvbklkLCAuLi5yZWN0YW5nbGUgfSBhcyBhbnk7XG4gICAgICB0aGlzLnNhdmVTZWxlY3Rpb24uZW1pdCh7IHJlY3RhbmdsZXM6IFtyZWN0YW5nbGVdLCBwYWdlOiB0aGlzLnBhZ2UsIGFubm90YXRpb25JZCB9KTtcbiAgICAgIHRoaXMucmVzZXRIaWdobGlnaHQoKTtcbiAgICB9XG4gIH1cblxuICBvbkN1cnNvclBvc2l0aW9uQ2hhbmdlZChwb3NpdGlvbjogQ3Vyc29yUG9zaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmN1cnNvclggPSBwb3NpdGlvbi54O1xuICAgIHRoaXMuY3Vyc29yWSA9IHBvc2l0aW9uLnk7XG4gICAgdGhpcy5zaG93Q3Vyc29yID0gcG9zaXRpb24udmlzaWJsZTtcbiAgfVxuXG4gIG9uRHJhd2luZ1N0YXJ0ZWQoZXZlbnQ6IEtleWJvYXJkQm94RHJhd0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5rZXlib2FyZERyYXdpbmdNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9ICd5ZWxsb3cnO1xuICAgIHRoaXMuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICB0aGlzLmRyYXdTdGFydFggPSBldmVudC5zdGFydFg7XG4gICAgdGhpcy5kcmF3U3RhcnRZID0gZXZlbnQuc3RhcnRZO1xuICAgIHRoaXMud2lkdGggPSBldmVudC53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGV2ZW50LmhlaWdodDtcbiAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WTtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFg7XG5cbiAgICB0aGlzLmFkanVzdEZvclJvdGF0aW9uKCk7XG4gIH1cblxuICBvbkRyYXdpbmdVcGRhdGVkKGV2ZW50OiBLZXlib2FyZEJveERyYXdFdmVudCk6IHZvaWQge1xuICAgIHRoaXMud2lkdGggPSBldmVudC53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGV2ZW50LmhlaWdodDtcbiAgfVxuXG4gIG9uRHJhd2luZ0NvbmZpcm1lZChldmVudDogS2V5Ym9hcmRCb3hEcmF3RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmtleWJvYXJkRHJhd2luZ01vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmNyZWF0ZUhpZ2hsaWdodCgpO1xuICB9XG5cbiAgb25EcmF3aW5nQ2FuY2VsbGVkKCk6IHZvaWQge1xuICAgIHRoaXMua2V5Ym9hcmREcmF3aW5nTW9kZSA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRIaWdobGlnaHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Rm9yUm90YXRpb24oKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0ZSkge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgdGhpcy50b3AgPSB0aGlzLmRyYXdTdGFydFkgLSB0aGlzLmhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgdGhpcy50b3AgPSB0aGlzLmRyYXdTdGFydFkgLSB0aGlzLmhlaWdodDtcbiAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5kcmF3U3RhcnRYIC0gdGhpcy53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5kcmF3U3RhcnRYIC0gdGhpcy53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEhpZ2hsaWdodCgpIHtcbiAgICB0aGlzLmRyYXdTdGFydFggPSAtMTtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSAtMTtcbiAgICB0aGlzLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy53aWR0aCA9IDA7XG4gICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ25vbmUnO1xuICAgIHRoaXMucG9zaXRpb24gPSAnaW5pdGlhbCc7XG4gICAgdGhpcy53aG9sZVBhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0UGFnZSgpIHtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMucGFnZUhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5wYWdlV2lkdGg7XG4gICAgdGhpcy50b3AgPSAwO1xuICAgIHRoaXMubGVmdCA9IDA7XG4gICAgdGhpcy5jcmVhdGVIaWdobGlnaHQoKTtcbiAgfVxufVxuIiwiPGRpdiAjZHJhd2luZ0NvbnRhaW5lclxuICBbc3R5bGUuaGVpZ2h0XT1cImRlZmF1bHRIZWlnaHRcIlxuICBbc3R5bGUud2lkdGhdPVwiZGVmYXVsdFdpZHRoXCJcbiAgW3RhYmluZGV4XT1cImRyYXdNb2RlID8gMCA6IC0xXCJcbiAgbXZLZXlib2FyZEJveERyYXdcbiAgW2VuYWJsZWRdPVwiZHJhd01vZGVcIlxuICAoY3Vyc29yUG9zaXRpb25DaGFuZ2VkKT1cIm9uQ3Vyc29yUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIlxuICAoZHJhd2luZ1N0YXJ0ZWQpPVwib25EcmF3aW5nU3RhcnRlZCgkZXZlbnQpXCJcbiAgKGRyYXdpbmdVcGRhdGVkKT1cIm9uRHJhd2luZ1VwZGF0ZWQoJGV2ZW50KVwiXG4gIChkcmF3aW5nQ29uZmlybWVkKT1cIm9uRHJhd2luZ0NvbmZpcm1lZCgkZXZlbnQpXCJcbiAgKGRyYXdpbmdDYW5jZWxsZWQpPVwib25EcmF3aW5nQ2FuY2VsbGVkKClcIlxuICAobW91c2Vkb3duKT1cImluaXRIaWdobGlnaHQoJGV2ZW50KVwiXG4gIChtb3VzZW1vdmUpPVwidXBkYXRlSGlnaGxpZ2h0KCRldmVudClcIlxuICAobW91c2V1cCk9XCJjcmVhdGVIaWdobGlnaHQoKVwiPlxuXG4gIDxkaXYgKm5nSWY9XCJzaG93Q3Vyc29yXCJcbiAgICBjbGFzcz1cImRyYXdpbmctY3Vyc29yXCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiXG4gICAgW3N0eWxlLnRvcF09XCJjdXJzb3JZICsgJ3B4J1wiXG4gICAgW3N0eWxlLmxlZnRdPVwiY3Vyc29yWCArICdweCdcIj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAjYm94SGlnaGxpZ2h0XG4gICAgY2xhc3M9XCJib3gtaGlnaGxpZ2h0XCJcbiAgICBbc3R5bGUuZGlzcGxheV09XCJkaXNwbGF5XCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwicG9zaXRpb25cIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXG4gICAgW3N0eWxlLmhlaWdodF09XCJoZWlnaHQgPyBoZWlnaHQgKyAncHgnIDogJzEwMCUnXCJcbiAgICBbc3R5bGUud2lkdGhdPVwid2lkdGggPyB3aWR0aCArICdweCcgOiAnMTAwJSdcIlxuICAgIFtzdHlsZS50b3BdPVwidG9wICsgJ3B4J1wiXG4gICAgW3N0eWxlLmxlZnRdPVwibGVmdCArICdweCdcIj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class KeyboardBoxDrawDirective {
|
|
4
|
+
set enabled(value) {
|
|
5
|
+
const wasEnabled = this._enabled;
|
|
6
|
+
this._enabled = value;
|
|
7
|
+
if (value && !wasEnabled && KeyboardBoxDrawDirective.lastInteractionWasKeyboard && !this.showCursor) {
|
|
8
|
+
this.initializeCursorForKeyboard();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
get enabled() {
|
|
12
|
+
return this._enabled;
|
|
13
|
+
}
|
|
14
|
+
static { this.lastInteractionWasKeyboard = false; }
|
|
15
|
+
constructor(elementRef) {
|
|
16
|
+
this.elementRef = elementRef;
|
|
17
|
+
this._enabled = false;
|
|
18
|
+
this.minBoxSize = 10;
|
|
19
|
+
this.incrementSmall = 1;
|
|
20
|
+
this.incrementMedium = 5;
|
|
21
|
+
this.incrementLarge = 10;
|
|
22
|
+
this.drawingStarted = new EventEmitter();
|
|
23
|
+
this.drawingUpdated = new EventEmitter();
|
|
24
|
+
this.drawingConfirmed = new EventEmitter();
|
|
25
|
+
this.drawingCancelled = new EventEmitter();
|
|
26
|
+
this.cursorPositionChanged = new EventEmitter();
|
|
27
|
+
this.isDrawing = false;
|
|
28
|
+
this.showCursor = false;
|
|
29
|
+
if (typeof window !== 'undefined') {
|
|
30
|
+
window.addEventListener('keydown', KeyboardBoxDrawDirective.onGlobalKeyDown, { capture: true });
|
|
31
|
+
window.addEventListener('mousedown', KeyboardBoxDrawDirective.onGlobalMouseDown, { capture: true });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
static onGlobalKeyDown() {
|
|
35
|
+
KeyboardBoxDrawDirective.lastInteractionWasKeyboard = true;
|
|
36
|
+
}
|
|
37
|
+
static onGlobalMouseDown() {
|
|
38
|
+
KeyboardBoxDrawDirective.lastInteractionWasKeyboard = false;
|
|
39
|
+
}
|
|
40
|
+
ngOnDestroy() {
|
|
41
|
+
this.cleanup();
|
|
42
|
+
}
|
|
43
|
+
initializeCursorForKeyboard() {
|
|
44
|
+
if (this.enabled && !this.showCursor && !this.isDrawing) {
|
|
45
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
46
|
+
if (rect.width > 0 && rect.height > 0) {
|
|
47
|
+
this.cursorX = rect.width / 2;
|
|
48
|
+
this.cursorY = rect.height / 2;
|
|
49
|
+
this.showCursor = true;
|
|
50
|
+
this.emitCursorPosition();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
onKeyDown(event) {
|
|
55
|
+
if (!this.enabled) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (event.key === 'Enter') {
|
|
59
|
+
event.preventDefault();
|
|
60
|
+
event.stopPropagation();
|
|
61
|
+
if (!this.isDrawing) {
|
|
62
|
+
this.startDrawing();
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.confirmDrawing();
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (event.key === 'Escape') {
|
|
70
|
+
event.preventDefault();
|
|
71
|
+
event.stopPropagation();
|
|
72
|
+
if (this.isDrawing) {
|
|
73
|
+
this.cancelDrawing();
|
|
74
|
+
}
|
|
75
|
+
else if (this.showCursor) {
|
|
76
|
+
this.hideCursor();
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
event.stopPropagation();
|
|
83
|
+
if (this.isDrawing) {
|
|
84
|
+
this.resizeBox(event);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.moveCursor(event);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
onBlur() {
|
|
92
|
+
if (this.showCursor && !this.isDrawing) {
|
|
93
|
+
this.hideCursor();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
moveCursor(event) {
|
|
97
|
+
const increment = event.shiftKey ? this.incrementLarge : this.incrementMedium;
|
|
98
|
+
if (!this.showCursor) {
|
|
99
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
100
|
+
this.cursorX = rect.width / 2;
|
|
101
|
+
this.cursorY = rect.height / 2;
|
|
102
|
+
this.showCursor = true;
|
|
103
|
+
this.emitCursorPosition();
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
107
|
+
switch (event.key) {
|
|
108
|
+
case 'ArrowUp':
|
|
109
|
+
this.cursorY = Math.max(0, this.cursorY - increment);
|
|
110
|
+
break;
|
|
111
|
+
case 'ArrowDown':
|
|
112
|
+
this.cursorY = Math.min(rect.height, this.cursorY + increment);
|
|
113
|
+
break;
|
|
114
|
+
case 'ArrowLeft':
|
|
115
|
+
this.cursorX = Math.max(0, this.cursorX - increment);
|
|
116
|
+
break;
|
|
117
|
+
case 'ArrowRight':
|
|
118
|
+
this.cursorX = Math.min(rect.width, this.cursorX + increment);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
this.emitCursorPosition();
|
|
122
|
+
}
|
|
123
|
+
startDrawing() {
|
|
124
|
+
let startX;
|
|
125
|
+
let startY;
|
|
126
|
+
if (this.showCursor) {
|
|
127
|
+
startX = this.cursorX;
|
|
128
|
+
startY = this.cursorY;
|
|
129
|
+
this.showCursor = false;
|
|
130
|
+
this.emitCursorPosition();
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// default to center
|
|
134
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
135
|
+
startX = rect.width / 2;
|
|
136
|
+
startY = rect.height / 2;
|
|
137
|
+
}
|
|
138
|
+
this.isDrawing = true;
|
|
139
|
+
this.drawStartX = startX;
|
|
140
|
+
this.drawStartY = startY;
|
|
141
|
+
this.currentWidth = this.minBoxSize;
|
|
142
|
+
this.currentHeight = this.minBoxSize;
|
|
143
|
+
this.emitDrawingStarted();
|
|
144
|
+
}
|
|
145
|
+
resizeBox(event) {
|
|
146
|
+
const increment = event.shiftKey ? this.incrementLarge : this.incrementSmall;
|
|
147
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
148
|
+
switch (event.key) {
|
|
149
|
+
case 'ArrowRight':
|
|
150
|
+
const maxWidth = rect.width - this.drawStartX;
|
|
151
|
+
this.currentWidth = Math.min(maxWidth, this.currentWidth + increment);
|
|
152
|
+
break;
|
|
153
|
+
case 'ArrowLeft':
|
|
154
|
+
this.currentWidth = Math.max(this.minBoxSize, this.currentWidth - increment);
|
|
155
|
+
break;
|
|
156
|
+
case 'ArrowDown':
|
|
157
|
+
const maxHeight = rect.height - this.drawStartY;
|
|
158
|
+
this.currentHeight = Math.min(maxHeight, this.currentHeight + increment);
|
|
159
|
+
break;
|
|
160
|
+
case 'ArrowUp':
|
|
161
|
+
this.currentHeight = Math.max(this.minBoxSize, this.currentHeight - increment);
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
this.emitDrawingUpdated();
|
|
165
|
+
}
|
|
166
|
+
confirmDrawing() {
|
|
167
|
+
this.emitDrawingConfirmed();
|
|
168
|
+
this.cleanup();
|
|
169
|
+
}
|
|
170
|
+
cancelDrawing() {
|
|
171
|
+
this.drawingCancelled.emit();
|
|
172
|
+
this.cleanup();
|
|
173
|
+
}
|
|
174
|
+
hideCursor() {
|
|
175
|
+
this.showCursor = false;
|
|
176
|
+
this.emitCursorPosition();
|
|
177
|
+
}
|
|
178
|
+
cleanup() {
|
|
179
|
+
this.isDrawing = false;
|
|
180
|
+
this.showCursor = false;
|
|
181
|
+
this.cursorX = undefined;
|
|
182
|
+
this.cursorY = undefined;
|
|
183
|
+
this.drawStartX = undefined;
|
|
184
|
+
this.drawStartY = undefined;
|
|
185
|
+
this.currentWidth = undefined;
|
|
186
|
+
this.currentHeight = undefined;
|
|
187
|
+
}
|
|
188
|
+
emitCursorPosition() {
|
|
189
|
+
this.cursorPositionChanged.emit({
|
|
190
|
+
x: this.cursorX,
|
|
191
|
+
y: this.cursorY,
|
|
192
|
+
visible: this.showCursor
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
emitDrawingStarted() {
|
|
196
|
+
this.drawingStarted.emit({
|
|
197
|
+
startX: this.drawStartX,
|
|
198
|
+
startY: this.drawStartY,
|
|
199
|
+
width: this.currentWidth,
|
|
200
|
+
height: this.currentHeight
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
emitDrawingUpdated() {
|
|
204
|
+
this.drawingUpdated.emit({
|
|
205
|
+
startX: this.drawStartX,
|
|
206
|
+
startY: this.drawStartY,
|
|
207
|
+
width: this.currentWidth,
|
|
208
|
+
height: this.currentHeight
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
emitDrawingConfirmed() {
|
|
212
|
+
this.drawingConfirmed.emit({
|
|
213
|
+
startX: this.drawStartX,
|
|
214
|
+
startY: this.drawStartY,
|
|
215
|
+
width: this.currentWidth,
|
|
216
|
+
height: this.currentHeight
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
reset() {
|
|
220
|
+
this.cleanup();
|
|
221
|
+
this.emitCursorPosition();
|
|
222
|
+
}
|
|
223
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxDrawDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
224
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: KeyboardBoxDrawDirective, selector: "[mvKeyboardBoxDraw]", inputs: { enabled: "enabled", minBoxSize: "minBoxSize", incrementSmall: "incrementSmall", incrementMedium: "incrementMedium", incrementLarge: "incrementLarge" }, outputs: { drawingStarted: "drawingStarted", drawingUpdated: "drawingUpdated", drawingConfirmed: "drawingConfirmed", drawingCancelled: "drawingCancelled", cursorPositionChanged: "cursorPositionChanged" }, host: { listeners: { "keydown": "onKeyDown($event)", "blur": "onBlur()" } }, ngImport: i0 }); }
|
|
225
|
+
}
|
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxDrawDirective, decorators: [{
|
|
227
|
+
type: Directive,
|
|
228
|
+
args: [{
|
|
229
|
+
selector: '[mvKeyboardBoxDraw]'
|
|
230
|
+
}]
|
|
231
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { enabled: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}], minBoxSize: [{
|
|
234
|
+
type: Input
|
|
235
|
+
}], incrementSmall: [{
|
|
236
|
+
type: Input
|
|
237
|
+
}], incrementMedium: [{
|
|
238
|
+
type: Input
|
|
239
|
+
}], incrementLarge: [{
|
|
240
|
+
type: Input
|
|
241
|
+
}], drawingStarted: [{
|
|
242
|
+
type: Output
|
|
243
|
+
}], drawingUpdated: [{
|
|
244
|
+
type: Output
|
|
245
|
+
}], drawingConfirmed: [{
|
|
246
|
+
type: Output
|
|
247
|
+
}], drawingCancelled: [{
|
|
248
|
+
type: Output
|
|
249
|
+
}], cursorPositionChanged: [{
|
|
250
|
+
type: Output
|
|
251
|
+
}], onKeyDown: [{
|
|
252
|
+
type: HostListener,
|
|
253
|
+
args: ['keydown', ['$event']]
|
|
254
|
+
}], onBlur: [{
|
|
255
|
+
type: HostListener,
|
|
256
|
+
args: ['blur']
|
|
257
|
+
}] } });
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQtYm94LWRyYXcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUva2V5Ym9hcmQtYm94LWRyYXcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWtCNUcsTUFBTSxPQUFPLHdCQUF3QjtJQUVuQyxJQUFhLE9BQU8sQ0FBQyxLQUFjO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksd0JBQXdCLENBQUMsMEJBQTBCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQzthQXNCYywrQkFBMEIsR0FBRyxLQUFLLEFBQVIsQ0FBUztJQUVsRCxZQUFvQixVQUFtQztRQUFuQyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQXZCL0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBRW5CLG1CQUFjLEdBQUcsSUFBSSxZ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LHdCQUF3QjtzSEFBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7aUJBQ2hDOytFQUdjLE9BQU87c0JBQW5CLEtBQUs7Z0JBYUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBNENQLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkNuQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtleWJvYXJkQm94RHJhd0V2ZW50IHtcbiAgc3RhcnRYOiBudW1iZXI7XG4gIHN0YXJ0WTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXJzb3JQb3NpdGlvbiB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB2aXNpYmxlOiBib29sZWFuO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbXZLZXlib2FyZEJveERyYXddJ1xufSlcbmV4cG9ydCBjbGFzcyBLZXlib2FyZEJveERyYXdEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHNldCBlbmFibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2FzRW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmICF3YXNFbmFibGVkICYmIEtleWJvYXJkQm94RHJhd0RpcmVjdGl2ZS5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCAmJiAhdGhpcy5zaG93Q3Vyc29yKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVDdXJzb3JGb3JLZXlib2FyZCgpO1xuICAgIH1cbiAgfVxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuICBwcml2YXRlIF9lbmFibGVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbWluQm94U2l6ZSA9IDEwO1xuICBASW5wdXQoKSBpbmNyZW1lbnRTbWFsbCA9IDE7XG4gIEBJbnB1dCgpIGluY3JlbWVudE1lZGl1bSA9IDU7XG4gIEBJbnB1dCgpIGluY3JlbWVudExhcmdlID0gMTA7IFxuXG4gIEBPdXRwdXQoKSBkcmF3aW5nU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRCb3hEcmF3RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmF3aW5nVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRCb3hEcmF3RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmF3aW5nQ29uZmlybWVkID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZEJveERyYXdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYXdpbmdDYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjdXJzb3JQb3NpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEN1cnNvclBvc2l0aW9uPigpO1xuXG4gIHByaXZhdGUgaXNEcmF3aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY3Vyc29yWDogbnVtYmVyO1xuICBwcml2YXRlIGN1cnNvclk6IG51bWJlcjtcbiAgcHJpdmF0ZSBzaG93Q3Vyc29yID0gZmFsc2U7XG4gIHByaXZhdGUgZHJhd1N0YXJ0WDogbnVtYmVyO1xuICBwcml2YXRlIGRyYXdTdGFydFk6IG51bWJlcjtcbiAgcHJpdmF0ZSBjdXJyZW50V2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBjdXJyZW50SGVpZ2h0OiBudW1iZXI7XG4gIHByaXZhdGUgc3RhdGljIGxhc3RJbnRlcmFjdGlvbldhc0tleWJvYXJkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBLZXlib2FyZEJveERyYXdEaXJlY3RpdmUub25HbG9iYWxLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgS2V5Ym9hcmRCb3hEcmF3RGlyZWN0aXZlLm9uR2xvYmFsTW91c2VEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgb25HbG9iYWxLZXlEb3duKCk6IHZvaWQge1xuICAgIEtleWJvYXJkQm94RHJhd0RpcmVjdGl2ZS5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvbkdsb2JhbE1vdXNlRG93bigpOiB2b2lkIHtcbiAgICBLZXlib2FyZEJveERyYXdEaXJlY3RpdmUubGFzdEludGVyYWN0aW9uV2FzS2V5Ym9hcmQgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ3Vyc29yRm9yS2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCAmJiAhdGhpcy5zaG93Q3Vyc29yICYmICF0aGlzLmlzRHJhd2luZykge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgICB0aGlzLmN1cnNvclggPSByZWN0LndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy5jdXJzb3JZID0gcmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICB0aGlzLnNob3dDdXJzb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXRDdXJzb3JQb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKCF0aGlzLmlzRHJhd2luZykge1xuICAgICAgICB0aGlzLnN0YXJ0RHJhd2luZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maXJtRHJhd2luZygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLmlzRHJhd2luZykge1xuICAgICAgICB0aGlzLmNhbmNlbERyYXdpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93Q3Vyc29yKSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnNvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ0Fycm93VXAnLCAnQXJyb3dEb3duJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J10uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAodGhpcy5pc0RyYXdpbmcpIHtcbiAgICAgICAgdGhpcy5yZXNpemVCb3goZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgb25CbHVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dDdXJzb3IgJiYgIXRoaXMuaXNEcmF3aW5nKSB7XG4gICAgICB0aGlzLmhpZGVDdXJzb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVDdXJzb3IoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSBldmVudC5zaGlmdEtleSA/IHRoaXMuaW5jcmVtZW50TGFyZ2UgOiB0aGlzLmluY3JlbWVudE1lZGl1bTtcblxuICAgIGlmICghdGhpcy5zaG93Q3Vyc29yKSB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmN1cnNvclggPSByZWN0LndpZHRoIC8gMjtcbiAgICAgIHRoaXMuY3Vyc29yWSA9IHJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgIHRoaXMuc2hvd0N1cnNvciA9IHRydWU7XG5cbiAgICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLmN1cnNvclkgPSBNYXRoLm1heCgwLCB0aGlzLmN1cnNvclkgLSBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuY3Vyc29yWSA9IE1hdGgubWluKHJlY3QuaGVpZ2h0LCB0aGlzLmN1cnNvclkgKyBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuY3Vyc29yWCA9IE1hdGgubWF4KDAsIHRoaXMuY3Vyc29yWCAtIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuY3Vyc29yWCA9IE1hdGgubWluKHJlY3Qud2lkdGgsIHRoaXMuY3Vyc29yWCArIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHJhd2luZygpOiB2b2lkIHtcbiAgICBsZXQgc3RhcnRYOiBudW1iZXI7XG4gICAgbGV0IHN0YXJ0WTogbnVtYmVyO1xuXG4gICAgaWYgKHRoaXMuc2hvd0N1cnNvcikge1xuICAgICAgc3RhcnRYID0gdGhpcy5jdXJzb3JYO1xuICAgICAgc3RhcnRZID0gdGhpcy5jdXJzb3JZO1xuICAgICAgdGhpcy5zaG93Q3Vyc29yID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRDdXJzb3JQb3NpdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkZWZhdWx0IHRvIGNlbnRlclxuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgc3RhcnRYID0gcmVjdC53aWR0aCAvIDI7XG4gICAgICBzdGFydFkgPSByZWN0LmhlaWdodCAvIDI7XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYXdpbmcgPSB0cnVlO1xuICAgIHRoaXMuZHJhd1N0YXJ0WCA9IHN0YXJ0WDtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSBzdGFydFk7XG4gICAgdGhpcy5jdXJyZW50V2lkdGggPSB0aGlzLm1pbkJveFNpemU7XG4gICAgdGhpcy5jdXJyZW50SGVpZ2h0ID0gdGhpcy5taW5Cb3hTaXplO1xuXG4gICAgdGhpcy5lbWl0RHJhd2luZ1N0YXJ0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplQm94KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5jcmVtZW50ID0gZXZlbnQuc2hpZnRLZXkgPyB0aGlzLmluY3JlbWVudExhcmdlIDogdGhpcy5pbmNyZW1lbnRTbWFsbDtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gcmVjdC53aWR0aCAtIHRoaXMuZHJhd1N0YXJ0WDtcbiAgICAgICAgdGhpcy5jdXJyZW50V2lkdGggPSBNYXRoLm1pbihtYXhXaWR0aCwgdGhpcy5jdXJyZW50V2lkdGggKyBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuY3VycmVudFdpZHRoID0gTWF0aC5tYXgodGhpcy5taW5Cb3hTaXplLCB0aGlzLmN1cnJlbnRXaWR0aCAtIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gcmVjdC5oZWlnaHQgLSB0aGlzLmRyYXdTdGFydFk7XG4gICAgICAgIHRoaXMuY3VycmVudEhlaWdodCA9IE1hdGgubWluKG1heEhlaWdodCwgdGhpcy5jdXJyZW50SGVpZ2h0ICsgaW5jcmVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgdGhpcy5jdXJyZW50SGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5taW5Cb3hTaXplLCB0aGlzLmN1cnJlbnRIZWlnaHQgLSBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmVtaXREcmF3aW5nVXBkYXRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maXJtRHJhd2luZygpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXREcmF3aW5nQ29uZmlybWVkKCk7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbERyYXdpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3aW5nQ2FuY2VsbGVkLmVtaXQoKTtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUN1cnNvcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDdXJzb3IgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRDdXJzb3JQb3NpdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcmF3aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Q3Vyc29yID0gZmFsc2U7XG4gICAgdGhpcy5jdXJzb3JYID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3Vyc29yWSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRyYXdTdGFydFggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kcmF3U3RhcnRZID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFdpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEhlaWdodCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEN1cnNvclBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuY3Vyc29yUG9zaXRpb25DaGFuZ2VkLmVtaXQoe1xuICAgICAgeDogdGhpcy5jdXJzb3JYLFxuICAgICAgeTogdGhpcy5jdXJzb3JZLFxuICAgICAgdmlzaWJsZTogdGhpcy5zaG93Q3Vyc29yXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREcmF3aW5nU3RhcnRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdpbmdTdGFydGVkLmVtaXQoe1xuICAgICAgc3RhcnRYOiB0aGlzLmRyYXdTdGFydFgsXG4gICAgICBzdGFydFk6IHRoaXMuZHJhd1N0YXJ0WSxcbiAgICAgIHdpZHRoOiB0aGlzLmN1cnJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50SGVpZ2h0XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREcmF3aW5nVXBkYXRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdpbmdVcGRhdGVkLmVtaXQoe1xuICAgICAgc3RhcnRYOiB0aGlzLmRyYXdTdGFydFgsXG4gICAgICBzdGFydFk6IHRoaXMuZHJhd1N0YXJ0WSxcbiAgICAgIHdpZHRoOiB0aGlzLmN1cnJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50SGVpZ2h0XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREcmF3aW5nQ29uZmlybWVkKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd2luZ0NvbmZpcm1lZC5lbWl0KHtcbiAgICAgIHN0YXJ0WDogdGhpcy5kcmF3U3RhcnRYLFxuICAgICAgc3RhcnRZOiB0aGlzLmRyYXdTdGFydFksXG4gICAgICB3aWR0aDogdGhpcy5jdXJyZW50V2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuY3VycmVudEhlaWdodFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gIH1cbn0iXX0=
|