@worktile/gantt 12.2.2 → 13.0.0-next.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.
Files changed (77) hide show
  1. package/components/bar/bar.component.scss +201 -0
  2. package/components/calendar/calendar.component.scss +79 -0
  3. package/components/drag-backdrop/drag-backdrop.component.scss +50 -0
  4. package/components/icon/icon.component.scss +13 -0
  5. package/components/links/links.component.scss +29 -0
  6. package/components/range/range.component.scss +35 -0
  7. package/components/table/gantt-table.component.scss +153 -0
  8. package/{esm2015/class/date-point.js → esm2020/class/date-point.mjs} +0 -0
  9. package/{esm2015/class/event.js → esm2020/class/event.mjs} +0 -0
  10. package/{esm2015/class/group.js → esm2020/class/group.mjs} +0 -0
  11. package/{esm2015/class/index.js → esm2020/class/index.mjs} +0 -0
  12. package/{esm2015/class/item.js → esm2020/class/item.mjs} +0 -0
  13. package/{esm2015/class/link.js → esm2020/class/link.mjs} +0 -0
  14. package/{esm2015/class/view-type.js → esm2020/class/view-type.mjs} +0 -0
  15. package/esm2020/components/bar/bar-drag.mjs +308 -0
  16. package/{esm2015/components/bar/bar.component.js → esm2020/components/bar/bar.component.mjs} +5 -9
  17. package/{esm2015/components/calendar/calendar.component.js → esm2020/components/calendar/calendar.component.mjs} +5 -8
  18. package/{esm2015/components/drag-backdrop/drag-backdrop.component.js → esm2020/components/drag-backdrop/drag-backdrop.component.mjs} +6 -10
  19. package/{esm2015/components/icon/icon.component.js → esm2020/components/icon/icon.component.mjs} +3 -3
  20. package/{esm2015/components/icon/icons.js → esm2020/components/icon/icons.mjs} +0 -0
  21. package/esm2020/components/links/lines/curve.mjs +95 -0
  22. package/{esm2015/components/links/lines/factory.js → esm2020/components/links/lines/factory.mjs} +0 -0
  23. package/{esm2015/components/links/lines/line.js → esm2020/components/links/lines/line.mjs} +0 -0
  24. package/{esm2015/components/links/lines/straight.js → esm2020/components/links/lines/straight.mjs} +0 -0
  25. package/esm2020/components/links/links.component.mjs +178 -0
  26. package/{esm2015/components/main/gantt-main.component.js → esm2020/components/main/gantt-main.component.mjs} +5 -8
  27. package/{esm2015/components/range/range.component.js → esm2020/components/range/range.component.mjs} +5 -8
  28. package/esm2020/components/table/gantt-table.component.mjs +163 -0
  29. package/{esm2015/gantt-abstract.js → esm2020/gantt-abstract.mjs} +0 -0
  30. package/{esm2015/gantt-dom.service.js → esm2020/gantt-dom.service.mjs} +3 -3
  31. package/esm2020/gantt-drag-container.mjs +78 -0
  32. package/{esm2015/gantt-item-upper.js → esm2020/gantt-item-upper.mjs} +4 -4
  33. package/esm2020/gantt-print.service.mjs +94 -0
  34. package/esm2020/gantt-upper.mjs +339 -0
  35. package/{esm2015/gantt.component.js → esm2020/gantt.component.mjs} +7 -13
  36. package/{esm2015/gantt.config.js → esm2020/gantt.config.mjs} +0 -0
  37. package/{esm2015/gantt.module.js → esm2020/gantt.module.mjs} +4 -4
  38. package/{esm2015/gantt.pipe.js → esm2020/gantt.pipe.mjs} +9 -9
  39. package/{esm2015/gantt.styles.js → esm2020/gantt.styles.mjs} +0 -0
  40. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  41. package/{esm2015/root.component.js → esm2020/root.component.mjs} +6 -11
  42. package/{esm2015/table/gantt-column.component.js → esm2020/table/gantt-column.component.mjs} +3 -3
  43. package/{esm2015/table/gantt-table.component.js → esm2020/table/gantt-table.component.mjs} +3 -3
  44. package/{esm2015/utils/date.js → esm2020/utils/date.mjs} +0 -0
  45. package/{esm2015/utils/helpers.js → esm2020/utils/helpers.mjs} +0 -0
  46. package/{esm2015/utils/passive-listeners.js → esm2020/utils/passive-listeners.mjs} +0 -0
  47. package/{esm2015/utils/set-style-with-vendor-prefix.js → esm2020/utils/set-style-with-vendor-prefix.mjs} +0 -0
  48. package/{esm2015/views/day.js → esm2020/views/day.mjs} +0 -0
  49. package/{esm2015/views/factory.js → esm2020/views/factory.mjs} +0 -0
  50. package/{esm2015/views/month.js → esm2020/views/month.mjs} +0 -0
  51. package/{esm2015/views/quarter.js → esm2020/views/quarter.mjs} +0 -0
  52. package/{esm2015/views/view.js → esm2020/views/view.mjs} +5 -5
  53. package/{esm2015/views/week.js → esm2020/views/week.mjs} +0 -0
  54. package/{esm2015/views/year.js → esm2020/views/year.mjs} +0 -0
  55. package/{esm2015/worktile-gantt.js → esm2020/worktile-gantt.mjs} +0 -0
  56. package/fesm2015/worktile-gantt.mjs +3080 -0
  57. package/fesm2015/worktile-gantt.mjs.map +1 -0
  58. package/{fesm2015/worktile-gantt.js → fesm2020/worktile-gantt.mjs} +175 -199
  59. package/fesm2020/worktile-gantt.mjs.map +1 -0
  60. package/gantt-drag-container.d.ts +1 -1
  61. package/gantt-item-upper.d.ts +1 -1
  62. package/gantt-upper.d.ts +1 -1
  63. package/gantt.component.scss +83 -0
  64. package/package.json +33 -9
  65. package/styles/index.scss +9 -0
  66. package/styles/variables.scss +46 -0
  67. package/bundles/worktile-gantt.umd.js +0 -3717
  68. package/bundles/worktile-gantt.umd.js.map +0 -1
  69. package/esm2015/components/bar/bar-drag.js +0 -302
  70. package/esm2015/components/links/lines/curve.js +0 -96
  71. package/esm2015/components/links/links.component.js +0 -173
  72. package/esm2015/components/table/gantt-table.component.js +0 -167
  73. package/esm2015/gantt-drag-container.js +0 -77
  74. package/esm2015/gantt-print.service.js +0 -97
  75. package/esm2015/gantt-upper.js +0 -340
  76. package/fesm2015/worktile-gantt.js.map +0 -1
  77. package/main.bundle.scss +0 -688
@@ -1,302 +0,0 @@
1
- import { Injectable, SkipSelf } from '@angular/core';
2
- import { InBarPosition } from '../../gantt-drag-container';
3
- import { differenceInCalendarDays } from '../../utils/date';
4
- import { fromEvent, Subject } from 'rxjs';
5
- import { takeUntil } from 'rxjs/operators';
6
- import { GanttLinkType } from '../../class/link';
7
- import { passiveListenerOptions } from '../../utils/passive-listeners';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/cdk/drag-drop";
10
- import * as i2 from "../../gantt-dom.service";
11
- import * as i3 from "../../gantt-drag-container";
12
- import * as i4 from "../../root.component";
13
- const dragMinWidth = 10;
14
- const activeClass = 'gantt-bar-active';
15
- const dropActiveClass = 'gantt-bar-drop-active';
16
- const singleDropActiveClass = 'gantt-bar-single-drop-active';
17
- function createSvgElement(qualifiedName, className) {
18
- const element = document.createElementNS('http://www.w3.org/2000/svg', qualifiedName);
19
- element.classList.add(className);
20
- return element;
21
- }
22
- export class GanttBarDrag {
23
- constructor(dragDrop, dom, dragContainer, root) {
24
- this.dragDrop = dragDrop;
25
- this.dom = dom;
26
- this.dragContainer = dragContainer;
27
- this.root = root;
28
- this.dragRefs = [];
29
- this.destroy$ = new Subject();
30
- }
31
- get dragDisabled() {
32
- return !this.item.draggable || !this.ganttUpper.draggable;
33
- }
34
- get linkDragDisabled() {
35
- return !this.item.linkable || !this.ganttUpper.linkable;
36
- }
37
- createMouseEvents() {
38
- var _a, _b, _c;
39
- const dropClass = ((_b = (_a = this.ganttUpper.config.linkOptions) === null || _a === void 0 ? void 0 : _a.dependencyTypes) === null || _b === void 0 ? void 0 : _b.length) === 1 &&
40
- ((_c = this.ganttUpper.config.linkOptions) === null || _c === void 0 ? void 0 : _c.dependencyTypes[0]) === GanttLinkType.fs
41
- ? singleDropActiveClass
42
- : dropActiveClass;
43
- fromEvent(this.barElement, 'mouseenter', passiveListenerOptions)
44
- .pipe(takeUntil(this.destroy$))
45
- .subscribe(() => {
46
- if (this.dragContainer.linkDraggingId && this.dragContainer.linkDraggingId !== this.item.id) {
47
- if (this.item.linkable) {
48
- this.barElement.classList.add(dropClass);
49
- this.dragContainer.emitLinkDragEntered({
50
- item: this.item,
51
- element: this.barElement
52
- });
53
- }
54
- }
55
- else {
56
- this.barElement.classList.add(activeClass);
57
- }
58
- });
59
- fromEvent(this.barElement, 'mouseleave', passiveListenerOptions)
60
- .pipe(takeUntil(this.destroy$))
61
- .subscribe(() => {
62
- if (!this.dragContainer.linkDraggingId) {
63
- this.barElement.classList.remove(activeClass);
64
- }
65
- else {
66
- this.dragContainer.emitLinkDragLeaved();
67
- }
68
- this.barElement.classList.remove(dropClass);
69
- });
70
- }
71
- createBarDrag() {
72
- const dragRef = this.dragDrop.createDrag(this.barElement);
73
- dragRef.lockAxis = 'x';
74
- dragRef.started.subscribe(() => {
75
- this.setDraggingStyles();
76
- this.dragContainer.dragStarted.emit({ item: this.item.origin });
77
- });
78
- dragRef.moved.subscribe((event) => {
79
- const currentX = this.item.refs.x + event.distance.x;
80
- const currentDate = this.ganttUpper.view.getDateByXPoint(currentX);
81
- const currentStartX = this.ganttUpper.view.getXPointByDate(currentDate);
82
- const dayWidth = this.ganttUpper.view.getDayOccupancyWidth(currentDate);
83
- const diffDays = differenceInCalendarDays(this.item.end.value, this.item.start.value);
84
- let start = currentDate;
85
- let end = currentDate.addDays(diffDays);
86
- if (currentX > currentStartX + dayWidth / 2) {
87
- start = start.addDays(1);
88
- end = end.addDays(1);
89
- }
90
- this.openDragBackdrop(this.barElement, start, end);
91
- this.item.updateDate(start, end);
92
- this.dragContainer.dragMoved.emit({ item: this.item.origin });
93
- });
94
- dragRef.ended.subscribe((event) => {
95
- this.clearDraggingStyles();
96
- this.closeDragBackdrop();
97
- event.source.reset();
98
- this.dragContainer.dragEnded.emit({ item: this.item.origin });
99
- });
100
- this.barDragRef = dragRef;
101
- return dragRef;
102
- }
103
- createBarHandleDrags() {
104
- const dragRefs = [];
105
- const handles = this.barElement.querySelectorAll('.drag-handles .handle');
106
- handles.forEach((handle, index) => {
107
- const isBefore = index === 0;
108
- const dragRef = this.dragDrop.createDrag(handle);
109
- dragRef.lockAxis = 'x';
110
- dragRef.withBoundaryElement(this.dom.root);
111
- dragRef.started.subscribe(() => {
112
- this.setDraggingStyles();
113
- this.dragContainer.dragStarted.emit({ item: this.item.origin });
114
- });
115
- dragRef.moved.subscribe((event) => {
116
- if (isBefore) {
117
- const x = this.item.refs.x + event.distance.x;
118
- const width = this.item.refs.width + event.distance.x * -1;
119
- if (width > dragMinWidth) {
120
- this.barElement.style.width = width + 'px';
121
- this.barElement.style.left = x + 'px';
122
- this.openDragBackdrop(this.barElement, this.ganttUpper.view.getDateByXPoint(x), this.item.end);
123
- this.item.updateDate(this.ganttUpper.view.getDateByXPoint(x), this.item.end);
124
- }
125
- }
126
- else {
127
- const width = this.item.refs.width + event.distance.x;
128
- if (width > dragMinWidth) {
129
- this.barElement.style.width = width + 'px';
130
- this.openDragBackdrop(this.barElement, this.item.start, this.ganttUpper.view.getDateByXPoint(this.item.refs.x + width));
131
- }
132
- this.item.updateDate(this.item.start, this.ganttUpper.view.getDateByXPoint(this.item.refs.x + width));
133
- }
134
- this.dragContainer.dragMoved.emit({ item: this.item.origin });
135
- event.source.reset();
136
- });
137
- dragRef.ended.subscribe((event) => {
138
- if (isBefore) {
139
- const width = this.item.refs.width + event.distance.x * -1;
140
- if (width > dragMinWidth) {
141
- this.item.updateDate(this.ganttUpper.view.getDateByXPoint(this.item.refs.x + event.distance.x), this.item.end);
142
- }
143
- else {
144
- this.item.updateDate(this.item.end.startOfDay(), this.item.end);
145
- }
146
- }
147
- else {
148
- const width = this.item.refs.width + event.distance.x;
149
- if (width > dragMinWidth) {
150
- this.item.updateDate(this.item.start, this.ganttUpper.view.getDateByXPoint(this.item.refs.x + this.item.refs.width + event.distance.x));
151
- }
152
- else {
153
- this.item.updateDate(this.item.start, this.item.start.endOfDay());
154
- }
155
- }
156
- this.clearDraggingStyles();
157
- this.closeDragBackdrop();
158
- this.dragContainer.dragEnded.emit({ item: this.item.origin });
159
- });
160
- dragRefs.push(dragRef);
161
- });
162
- return dragRefs;
163
- }
164
- createLinkHandleDrags() {
165
- const dragRefs = [];
166
- const handles = this.barElement.querySelectorAll('.link-handles .handle');
167
- handles.forEach((handle, index) => {
168
- const isBegin = index === 0;
169
- const dragRef = this.dragDrop.createDrag(handle);
170
- dragRef.withBoundaryElement(this.dom.root);
171
- dragRef.beforeStarted.subscribe(() => {
172
- handle.style.pointerEvents = 'none';
173
- if (this.barDragRef) {
174
- this.barDragRef.disabled = true;
175
- }
176
- this.createLinkDraggingLine();
177
- this.dragContainer.emitLinkDragStarted({
178
- element: this.barElement,
179
- item: this.item,
180
- pos: isBegin ? InBarPosition.start : InBarPosition.finish
181
- });
182
- });
183
- dragRef.moved.subscribe(() => {
184
- const positions = this.calcLinkLinePositions(handle, isBegin);
185
- this.linkDraggingLine.setAttribute('x1', positions.x1.toString());
186
- this.linkDraggingLine.setAttribute('y1', positions.y1.toString());
187
- this.linkDraggingLine.setAttribute('x2', positions.x2.toString());
188
- this.linkDraggingLine.setAttribute('y2', positions.y2.toString());
189
- });
190
- dragRef.ended.subscribe((event) => {
191
- handle.style.pointerEvents = '';
192
- if (this.barDragRef) {
193
- this.barDragRef.disabled = false;
194
- }
195
- // 计算line拖动的落点位于目标Bar的值,如果值大于Bar宽度的一半,说明是拖动到Begin位置,否则则为拖动到End位置
196
- if (this.dragContainer.linkDragPath.to) {
197
- const placePointX = event.source.getRootElement().getBoundingClientRect().x -
198
- this.dragContainer.linkDragPath.to.element.getBoundingClientRect().x;
199
- this.dragContainer.emitLinkDragEnded(Object.assign(Object.assign({}, this.dragContainer.linkDragPath.to), { pos: placePointX < this.dragContainer.linkDragPath.to.item.refs.width / 2
200
- ? InBarPosition.start
201
- : InBarPosition.finish }));
202
- }
203
- event.source.reset();
204
- this.barElement.classList.remove(activeClass);
205
- this.destroyLinkDraggingLine();
206
- });
207
- dragRefs.push(dragRef);
208
- });
209
- return dragRefs;
210
- }
211
- openDragBackdrop(dragElement, start, end) {
212
- const dragBackdropElement = this.root.backdrop.nativeElement;
213
- const dragMaskElement = dragBackdropElement.querySelector('.gantt-drag-mask');
214
- const rootRect = this.dom.root.getBoundingClientRect();
215
- const dragRect = dragElement.getBoundingClientRect();
216
- const left = dragRect.left - rootRect.left - this.dom.side.clientWidth;
217
- const width = dragRect.right - dragRect.left;
218
- // Note: updating styles will cause re-layout so we have to place them consistently one by one.
219
- dragMaskElement.style.left = left + 'px';
220
- dragMaskElement.style.width = width + 'px';
221
- dragMaskElement.style.display = 'block';
222
- dragBackdropElement.style.display = 'block';
223
- // This will invalidate the layout, but we won't need re-layout, because we set styles previously.
224
- dragMaskElement.querySelector('.start').innerHTML = start.format('MM-dd');
225
- dragMaskElement.querySelector('.end').innerHTML = end.format('MM-dd');
226
- }
227
- closeDragBackdrop() {
228
- const dragBackdropElement = this.root.backdrop.nativeElement;
229
- const dragMaskElement = dragBackdropElement.querySelector('.gantt-drag-mask');
230
- dragMaskElement.style.display = 'none';
231
- dragBackdropElement.style.display = 'none';
232
- }
233
- setDraggingStyles() {
234
- this.barElement.style.pointerEvents = 'none';
235
- this.barElement.classList.add('gantt-bar-draggable-drag');
236
- }
237
- clearDraggingStyles() {
238
- this.barElement.style.pointerEvents = '';
239
- this.barElement.classList.remove('gantt-bar-draggable-drag');
240
- }
241
- calcLinkLinePositions(target, isBefore) {
242
- const rootRect = this.dom.root.getBoundingClientRect();
243
- const targetRect = target.getBoundingClientRect();
244
- const layerRect = target.parentElement.parentElement.getBoundingClientRect();
245
- return {
246
- x1: layerRect.left + (isBefore ? 0 : layerRect.width) - rootRect.left,
247
- y1: layerRect.top + layerRect.height / 2 - rootRect.top,
248
- x2: targetRect.left - rootRect.left + targetRect.width / 2,
249
- y2: targetRect.top - rootRect.top + targetRect.height / 2
250
- };
251
- }
252
- createLinkDraggingLine() {
253
- if (!this.linkDraggingLine) {
254
- const svgElement = createSvgElement('svg', 'gantt-link-drag-container');
255
- const linElement = createSvgElement('line', 'link-dragging-line');
256
- linElement.style.pointerEvents = 'none';
257
- svgElement.appendChild(linElement);
258
- this.dom.root.appendChild(svgElement);
259
- this.linkDraggingLine = linElement;
260
- }
261
- }
262
- destroyLinkDraggingLine() {
263
- if (this.linkDraggingLine) {
264
- this.linkDraggingLine.parentElement.remove();
265
- this.linkDraggingLine = null;
266
- }
267
- }
268
- createDrags(elementRef, item, ganttUpper) {
269
- this.item = item;
270
- this.barElement = elementRef.nativeElement;
271
- this.ganttUpper = ganttUpper;
272
- if (!item.draggable || (this.dragDisabled && this.linkDragDisabled)) {
273
- return;
274
- }
275
- else {
276
- this.createMouseEvents();
277
- if (!this.dragDisabled) {
278
- const dragRef = this.createBarDrag();
279
- const dragHandlesRefs = this.createBarHandleDrags();
280
- this.dragRefs.push(dragRef, ...dragHandlesRefs);
281
- }
282
- if (!this.linkDragDisabled) {
283
- const linkDragRefs = this.createLinkHandleDrags();
284
- this.dragRefs.push(...linkDragRefs);
285
- }
286
- }
287
- }
288
- ngOnDestroy() {
289
- this.closeDragBackdrop();
290
- this.dragRefs.forEach((dragRef) => dragRef.dispose());
291
- this.destroy$.next();
292
- this.destroy$.complete();
293
- }
294
- }
295
- GanttBarDrag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GanttBarDrag, deps: [{ token: i1.DragDrop }, { token: i2.GanttDomService }, { token: i3.GanttDragContainer }, { token: i4.NgxGanttRootComponent, skipSelf: true }], target: i0.ɵɵFactoryTarget.Injectable });
296
- GanttBarDrag.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GanttBarDrag });
297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GanttBarDrag, decorators: [{
298
- type: Injectable
299
- }], ctorParameters: function () { return [{ type: i1.DragDrop }, { type: i2.GanttDomService }, { type: i3.GanttDragContainer }, { type: i4.NgxGanttRootComponent, decorators: [{
300
- type: SkipSelf
301
- }] }]; } });
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWRyYWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nYW50dC9zcmMvY29tcG9uZW50cy9iYXIvYmFyLWRyYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBeUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVFLE9BQU8sRUFBc0IsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0UsT0FBTyxFQUFhLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7O0FBRXZFLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN4QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztBQUN2QyxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQztBQUNoRCxNQUFNLHFCQUFxQixHQUFHLDhCQUE4QixDQUFDO0FBRTdELFNBQVMsZ0JBQWdCLENBQUMsYUFBcUIsRUFBRSxTQUFpQjtJQUM5RCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLDRCQUE0QixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RGLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFHRCxNQUFNLE9BQU8sWUFBWTtJQXVCckIsWUFDWSxRQUFrQixFQUNsQixHQUFvQixFQUNwQixhQUFpQyxFQUNyQixJQUEyQjtRQUh2QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FB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QkFDckMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7YUFDdkM7U0FDSjtJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDOzt5R0F6VFEsWUFBWTs2R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7OzBCQTRCRixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRWxlbWVudFJlZiwgT25EZXN0cm95LCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHJhZ1JlZiwgRHJhZ0Ryb3AgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEdhbnR0RG9tU2VydmljZSB9IGZyb20gJy4uLy4uL2dhbnR0LWRvbS5zZXJ2aWNlJztcbmltcG9ydCB7IEdhbnR0RHJhZ0NvbnRhaW5lciwgSW5CYXJQb3NpdGlvbiB9IGZyb20gJy4uLy4uL2dhbnR0LWRyYWctY29udGFpbmVyJztcbmltcG9ydCB7IEdhbnR0SXRlbUludGVybmFsIH0gZnJvbSAnLi4vLi4vY2xhc3MvaXRlbSc7XG5pbXBvcnQgeyBHYW50dERhdGUsIGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBHYW50dFVwcGVyIH0gZnJvbSAnLi4vLi4vZ2FudHQtdXBwZXInO1xuaW1wb3J0IHsgR2FudHRMaW5rVHlwZSB9IGZyb20gJy4uLy4uL2NsYXNzL2xpbmsnO1xuaW1wb3J0IHsgTmd4R2FudHRSb290Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcm9vdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgcGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL3Bhc3NpdmUtbGlzdGVuZXJzJztcblxuY29uc3QgZHJhZ01pbldpZHRoID0gMTA7XG5jb25zdCBhY3RpdmVDbGFzcyA9ICdnYW50dC1iYXItYWN0aXZlJztcbmNvbnN0IGRyb3BBY3RpdmVDbGFzcyA9ICdnYW50dC1iYXItZHJvcC1hY3RpdmUnO1xuY29uc3Qgc2luZ2xlRHJvcEFjdGl2ZUNsYXNzID0gJ2dhbnR0LWJhci1zaW5nbGUtZHJvcC1hY3RpdmUnO1xuXG5mdW5jdGlvbiBjcmVhdGVTdmdFbGVtZW50KHF1YWxpZmllZE5hbWU6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIHF1YWxpZmllZE5hbWUpO1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgIHJldHVybiBlbGVtZW50O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR2FudHRCYXJEcmFnIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIGdhbnR0VXBwZXI6IEdhbnR0VXBwZXI7XG5cbiAgICBwcml2YXRlIGJhckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBpdGVtOiBHYW50dEl0ZW1JbnRlcm5hbDtcblxuICAgIHByaXZhdGUgZ2V0IGRyYWdEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLml0ZW0uZHJhZ2dhYmxlIHx8ICF0aGlzLmdhbnR0VXBwZXIuZHJhZ2dhYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGxpbmtEcmFnRGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pdGVtLmxpbmthYmxlIHx8ICF0aGlzLmdhbnR0VXBwZXIubGlua2FibGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaW5rRHJhZ2dpbmdMaW5lOiBTVkdFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBiYXJEcmFnUmVmOiBEcmFnUmVmO1xuXG4gICAgcHJpdmF0ZSBkcmFnUmVmczogRHJhZ1JlZltdID0gW107XG5cbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGRyYWdEcm9wOiBEcmFnRHJvcCxcbiAgICAgICAgcHJpdmF0ZSBkb206IEdhbnR0RG9tU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkcmFnQ29udGFpbmVyOiBHYW50dERyYWdDb250YWluZXIsXG4gICAgICAgIEBTa2lwU2VsZigpIHByaXZhdGUgcm9vdDogTmd4R2FudHRSb290Q29tcG9uZW50XG4gICAgKSB7fVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVNb3VzZUV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgZHJvcENsYXNzID1cbiAgICAgICAgICAgIHRoaXMuZ2FudHRVcHBlci5jb25maWcubGlua09wdGlvbnM/LmRlcGVuZGVuY3lUeXBlcz8ubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICB0aGlzLmdhbnR0VXBwZXIuY29uZmlnLmxpbmtPcHRpb25zPy5kZXBlbmRlbmN5VHlwZXNbMF0gPT09IEdhbnR0TGlua1R5cGUuZnNcbiAgICAgICAgICAgICAgICA/IHNpbmdsZURyb3BBY3RpdmVDbGFzc1xuICAgICAgICAgICAgICAgIDogZHJvcEFjdGl2ZUNsYXNzO1xuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmJhckVsZW1lbnQsICdtb3VzZWVudGVyJywgcGFzc2l2ZUxpc3RlbmVyT3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdnaW5nSWQgJiYgdGhpcy5kcmFnQ29udGFpbmVyLmxpbmtEcmFnZ2luZ0lkICE9PSB0aGlzLml0ZW0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbS5saW5rYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoZHJvcENsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5lbWl0TGlua0RyYWdFbnRlcmVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5iYXJFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5jbGFzc0xpc3QuYWRkKGFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBmcm9tRXZlbnQodGhpcy5iYXJFbGVtZW50LCAnbW91c2VsZWF2ZScsIHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJhZ0NvbnRhaW5lci5saW5rRHJhZ2dpbmdJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShhY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmVtaXRMaW5rRHJhZ0xlYXZlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkcm9wQ2xhc3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCYXJEcmFnKCkge1xuICAgICAgICBjb25zdCBkcmFnUmVmID0gdGhpcy5kcmFnRHJvcC5jcmVhdGVEcmFnKHRoaXMuYmFyRWxlbWVudCk7XG4gICAgICAgIGRyYWdSZWYubG9ja0F4aXMgPSAneCc7XG4gICAgICAgIGRyYWdSZWYuc3RhcnRlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmRyYWdTdGFydGVkLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW0ub3JpZ2luIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZHJhZ1JlZi5tb3ZlZC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50WCA9IHRoaXMuaXRlbS5yZWZzLnggKyBldmVudC5kaXN0YW5jZS54O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlQnlYUG9pbnQoY3VycmVudFgpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXJ0WCA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldFhQb2ludEJ5RGF0ZShjdXJyZW50RGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBkYXlXaWR0aCA9IHRoaXMuZ2FudHRVcHBlci52aWV3LmdldERheU9jY3VwYW5jeVdpZHRoKGN1cnJlbnREYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZEYXlzID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHRoaXMuaXRlbS5lbmQudmFsdWUsIHRoaXMuaXRlbS5zdGFydC52YWx1ZSk7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBjdXJyZW50RGF0ZTtcbiAgICAgICAgICAgIGxldCBlbmQgPSBjdXJyZW50RGF0ZS5hZGREYXlzKGRpZmZEYXlzKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50WCA+IGN1cnJlbnRTdGFydFggKyBkYXlXaWR0aCAvIDIpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0LmFkZERheXMoMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZW5kLmFkZERheXMoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wZW5EcmFnQmFja2Ryb3AodGhpcy5iYXJFbGVtZW50LCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgIHRoaXMuaXRlbS51cGRhdGVEYXRlKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgdGhpcy5kcmFnQ29udGFpbmVyLmRyYWdNb3ZlZC5lbWl0KHsgaXRlbTogdGhpcy5pdGVtLm9yaWdpbiB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRyYWdSZWYuZW5kZWQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhckRyYWdnaW5nU3R5bGVzKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRHJhZ0JhY2tkcm9wKCk7XG4gICAgICAgICAgICBldmVudC5zb3VyY2UucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5kcmFnRW5kZWQuZW1pdCh7IGl0ZW06IHRoaXMuaXRlbS5vcmlnaW4gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJhckRyYWdSZWYgPSBkcmFnUmVmO1xuICAgICAgICByZXR1cm4gZHJhZ1JlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUJhckhhbmRsZURyYWdzKCkge1xuICAgICAgICBjb25zdCBkcmFnUmVmcyA9IFtdO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gdGhpcy5iYXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuZHJhZy1oYW5kbGVzIC5oYW5kbGUnKTtcbiAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0JlZm9yZSA9IGluZGV4ID09PSAwO1xuICAgICAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuZHJhZ0Ryb3AuY3JlYXRlRHJhZyhoYW5kbGUpO1xuICAgICAgICAgICAgZHJhZ1JlZi5sb2NrQXhpcyA9ICd4JztcbiAgICAgICAgICAgIGRyYWdSZWYud2l0aEJvdW5kYXJ5RWxlbWVudCh0aGlzLmRvbS5yb290IGFzIEhUTUxFbGVtZW50KTtcblxuICAgICAgICAgICAgZHJhZ1JlZi5zdGFydGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5kcmFnU3RhcnRlZC5lbWl0KHsgaXRlbTogdGhpcy5pdGVtLm9yaWdpbiB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkcmFnUmVmLm1vdmVkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMuaXRlbS5yZWZzLnggKyBldmVudC5kaXN0YW5jZS54O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuaXRlbS5yZWZzLndpZHRoICsgZXZlbnQuZGlzdGFuY2UueCAqIC0xO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBkcmFnTWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS5sZWZ0ID0geCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5EcmFnQmFja2Ryb3AodGhpcy5iYXJFbGVtZW50LCB0aGlzLmdhbnR0VXBwZXIudmlldy5nZXREYXRlQnlYUG9pbnQoeCksIHRoaXMuaXRlbS5lbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtLnVwZGF0ZURhdGUodGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZUJ5WFBvaW50KHgpLCB0aGlzLml0ZW0uZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5pdGVtLnJlZnMud2lkdGggKyBldmVudC5kaXN0YW5jZS54O1xuICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBkcmFnTWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkRyYWdCYWNrZHJvcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2FudHRVcHBlci52aWV3LmdldERhdGVCeVhQb2ludCh0aGlzLml0ZW0ucmVmcy54ICsgd2lkdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbS51cGRhdGVEYXRlKHRoaXMuaXRlbS5zdGFydCwgdGhpcy5nYW50dFVwcGVyLnZpZXcuZ2V0RGF0ZUJ5WFBvaW50KHRoaXMuaXRlbS5yZWZzLnggKyB3aWR0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZHJhZ01vdmVkLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW0ub3JpZ2luIH0pO1xuICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5yZXNldCgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRyYWdSZWYuZW5kZWQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc0JlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuaXRlbS5yZWZzLndpZHRoICsgZXZlbnQuZGlzdGFuY2UueCAqIC0xO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBkcmFnTWluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbS51cGRhdGVEYXRlKHRoaXMuZ2FudHRVcHBlci52aWV3LmdldERhdGVCeVhQb2ludCh0aGlzLml0ZW0ucmVmcy54ICsgZXZlbnQuZGlzdGFuY2UueCksIHRoaXMuaXRlbS5lbmQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtLnVwZGF0ZURhdGUodGhpcy5pdGVtLmVuZC5zdGFydE9mRGF5KCksIHRoaXMuaXRlbS5lbmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLml0ZW0ucmVmcy53aWR0aCArIGV2ZW50LmRpc3RhbmNlLng7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGRyYWdNaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtLnVwZGF0ZURhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2FudHRVcHBlci52aWV3LmdldERhdGVCeVhQb2ludCh0aGlzLml0ZW0ucmVmcy54ICsgdGhpcy5pdGVtLnJlZnMud2lkdGggKyBldmVudC5kaXN0YW5jZS54KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbS51cGRhdGVEYXRlKHRoaXMuaXRlbS5zdGFydCwgdGhpcy5pdGVtLnN0YXJ0LmVuZE9mRGF5KCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJEcmFnZ2luZ1N0eWxlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VEcmFnQmFja2Ryb3AoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZHJhZ0VuZGVkLmVtaXQoeyBpdGVtOiB0aGlzLml0ZW0ub3JpZ2luIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkcmFnUmVmcy5wdXNoKGRyYWdSZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRyYWdSZWZzO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlTGlua0hhbmRsZURyYWdzKCkge1xuICAgICAgICBjb25zdCBkcmFnUmVmcyA9IFtdO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gdGhpcy5iYXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcubGluay1oYW5kbGVzIC5oYW5kbGUnKTtcbiAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoYW5kbGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0JlZ2luID0gaW5kZXggPT09IDA7XG4gICAgICAgICAgICBjb25zdCBkcmFnUmVmID0gdGhpcy5kcmFnRHJvcC5jcmVhdGVEcmFnKGhhbmRsZSk7XG4gICAgICAgICAgICBkcmFnUmVmLndpdGhCb3VuZGFyeUVsZW1lbnQodGhpcy5kb20ucm9vdCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBkcmFnUmVmLmJlZm9yZVN0YXJ0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5iYXJEcmFnUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyRHJhZ1JlZi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTGlua0RyYWdnaW5nTGluZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0NvbnRhaW5lci5lbWl0TGlua0RyYWdTdGFydGVkKHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5iYXJFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgIHBvczogaXNCZWdpbiA/IEluQmFyUG9zaXRpb24uc3RhcnQgOiBJbkJhclBvc2l0aW9uLmZpbmlzaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRyYWdSZWYubW92ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmNhbGNMaW5rTGluZVBvc2l0aW9ucyhoYW5kbGUsIGlzQmVnaW4pO1xuICAgICAgICAgICAgICAgIHRoaXMubGlua0RyYWdnaW5nTGluZS5zZXRBdHRyaWJ1dGUoJ3gxJywgcG9zaXRpb25zLngxLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlua0RyYWdnaW5nTGluZS5zZXRBdHRyaWJ1dGUoJ3kxJywgcG9zaXRpb25zLnkxLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlua0RyYWdnaW5nTGluZS5zZXRBdHRyaWJ1dGUoJ3gyJywgcG9zaXRpb25zLngyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlua0RyYWdnaW5nTGluZS5zZXRBdHRyaWJ1dGUoJ3kyJywgcG9zaXRpb25zLnkyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRyYWdSZWYuZW5kZWQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFyRHJhZ1JlZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhckRyYWdSZWYuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g6K6h566XbGluZeaLluWKqOeahOiQveeCueS9jeS6juebruagh0JhcueahOWAvO+8jOWmguaenOWAvOWkp+S6jkJhcuWuveW6pueahOS4gOWNiu+8jOivtOaYjuaYr+aLluWKqOWIsEJlZ2lu5L2N572u77yM5ZCm5YiZ5YiZ5Li65ouW5Yqo5YiwRW5k5L2N572uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ0NvbnRhaW5lci5saW5rRHJhZ1BhdGgudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VQb2ludFggPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc291cmNlLmdldFJvb3RFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueCAtXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIubGlua0RyYWdQYXRoLnRvLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkueDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdDb250YWluZXIuZW1pdExpbmtEcmFnRW5kZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5kcmFnQ29udGFpbmVyLmxpbmtEcmFnUGF0aC50byxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZVBvaW50WCA8IHRoaXMuZHJhZ0NvbnRhaW5lci5saW5rRHJhZ1BhdGgudG8uaXRlbS5yZWZzLndpZHRoIC8gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEluQmFyUG9zaXRpb24uc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbkJhclBvc2l0aW9uLmZpbmlzaFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnQuc291cmNlLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUxpbmtEcmFnZ2luZ0xpbmUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkcmFnUmVmcy5wdXNoKGRyYWdSZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRyYWdSZWZzO1xuICAgIH1cblxuICAgIHByaXZhdGUgb3BlbkRyYWdCYWNrZHJvcChkcmFnRWxlbWVudDogSFRNTEVsZW1lbnQsIHN0YXJ0OiBHYW50dERhdGUsIGVuZDogR2FudHREYXRlKSB7XG4gICAgICAgIGNvbnN0IGRyYWdCYWNrZHJvcEVsZW1lbnQgPSB0aGlzLnJvb3QuYmFja2Ryb3AubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgZHJhZ01hc2tFbGVtZW50ID0gZHJhZ0JhY2tkcm9wRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZ2FudHQtZHJhZy1tYXNrJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5kb20ucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgZHJhZ1JlY3QgPSBkcmFnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRyYWdSZWN0LmxlZnQgLSByb290UmVjdC5sZWZ0IC0gdGhpcy5kb20uc2lkZS5jbGllbnRXaWR0aDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBkcmFnUmVjdC5yaWdodCAtIGRyYWdSZWN0LmxlZnQ7XG4gICAgICAgIC8vIE5vdGU6IHVwZGF0aW5nIHN0eWxlcyB3aWxsIGNhdXNlIHJlLWxheW91dCBzbyB3ZSBoYXZlIHRvIHBsYWNlIHRoZW0gY29uc2lzdGVudGx5IG9uZSBieSBvbmUuXG4gICAgICAgIGRyYWdNYXNrRWxlbWVudC5zdHlsZS5sZWZ0ID0gbGVmdCArICdweCc7XG4gICAgICAgIGRyYWdNYXNrRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkcmFnQmFja2Ryb3BFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAvLyBUaGlzIHdpbGwgaW52YWxpZGF0ZSB0aGUgbGF5b3V0LCBidXQgd2Ugd29uJ3QgbmVlZCByZS1sYXlvdXQsIGJlY2F1c2Ugd2Ugc2V0IHN0eWxlcyBwcmV2aW91c2x5LlxuICAgICAgICBkcmFnTWFza0VsZW1lbnQucXVlcnlTZWxlY3RvcignLnN0YXJ0JykuaW5uZXJIVE1MID0gc3RhcnQuZm9ybWF0KCdNTS1kZCcpO1xuICAgICAgICBkcmFnTWFza0VsZW1lbnQucXVlcnlTZWxlY3RvcignLmVuZCcpLmlubmVySFRNTCA9IGVuZC5mb3JtYXQoJ01NLWRkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbG9zZURyYWdCYWNrZHJvcCgpIHtcbiAgICAgICAgY29uc3QgZHJhZ0JhY2tkcm9wRWxlbWVudCA9IHRoaXMucm9vdC5iYWNrZHJvcC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBkcmFnTWFza0VsZW1lbnQgPSBkcmFnQmFja2Ryb3BFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5nYW50dC1kcmFnLW1hc2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZHJhZ01hc2tFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRyYWdCYWNrZHJvcEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERyYWdnaW5nU3R5bGVzKCkge1xuICAgICAgICB0aGlzLmJhckVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5iYXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2dhbnR0LWJhci1kcmFnZ2FibGUtZHJhZycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJEcmFnZ2luZ1N0eWxlcygpIHtcbiAgICAgICAgdGhpcy5iYXJFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnJztcbiAgICAgICAgdGhpcy5iYXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2dhbnR0LWJhci1kcmFnZ2FibGUtZHJhZycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY0xpbmtMaW5lUG9zaXRpb25zKHRhcmdldDogSFRNTEVsZW1lbnQsIGlzQmVmb3JlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJvb3RSZWN0ID0gdGhpcy5kb20ucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbGF5ZXJSZWN0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHgxOiBsYXllclJlY3QubGVmdCArIChpc0JlZm9yZSA/IDAgOiBsYXllclJlY3Qud2lkdGgpIC0gcm9vdFJlY3QubGVmdCxcbiAgICAgICAgICAgIHkxOiBsYXllclJlY3QudG9wICsgbGF5ZXJSZWN0LmhlaWdodCAvIDIgLSByb290UmVjdC50b3AsXG4gICAgICAgICAgICB4MjogdGFyZ2V0UmVjdC5sZWZ0IC0gcm9vdFJlY3QubGVmdCArIHRhcmdldFJlY3Qud2lkdGggLyAyLFxuICAgICAgICAgICAgeTI6IHRhcmdldFJlY3QudG9wIC0gcm9vdFJlY3QudG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQgLyAyXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMaW5rRHJhZ2dpbmdMaW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMubGlua0RyYWdnaW5nTGluZSkge1xuICAgICAgICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9IGNyZWF0ZVN2Z0VsZW1lbnQoJ3N2ZycsICdnYW50dC1saW5rLWRyYWctY29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb25zdCBsaW5FbGVtZW50ID0gY3JlYXRlU3ZnRWxlbWVudCgnbGluZScsICdsaW5rLWRyYWdnaW5nLWxpbmUnKTtcbiAgICAgICAgICAgIGxpbkVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgIHN2Z0VsZW1lbnQuYXBwZW5kQ2hpbGQobGluRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHN2Z0VsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5saW5rRHJhZ2dpbmdMaW5lID0gbGluRWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveUxpbmtEcmFnZ2luZ0xpbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmtEcmFnZ2luZ0xpbmUpIHtcbiAgICAgICAgICAgIHRoaXMubGlua0RyYWdnaW5nTGluZS5wYXJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5saW5rRHJhZ2dpbmdMaW5lID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZURyYWdzKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIGl0ZW06IEdhbnR0SXRlbUludGVybmFsLCBnYW50dFVwcGVyOiBHYW50dFVwcGVyKSB7XG4gICAgICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMuYmFyRWxlbWVudCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5nYW50dFVwcGVyID0gZ2FudHRVcHBlcjtcblxuICAgICAgICBpZiAoIWl0ZW0uZHJhZ2dhYmxlIHx8ICh0aGlzLmRyYWdEaXNhYmxlZCAmJiB0aGlzLmxpbmtEcmFnRGlzYWJsZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vdXNlRXZlbnRzKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZHJhZ0Rpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ1JlZiA9IHRoaXMuY3JlYXRlQmFyRHJhZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdIYW5kbGVzUmVmcyA9IHRoaXMuY3JlYXRlQmFySGFuZGxlRHJhZ3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdSZWZzLnB1c2goZHJhZ1JlZiwgLi4uZHJhZ0hhbmRsZXNSZWZzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5saW5rRHJhZ0Rpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlua0RyYWdSZWZzID0gdGhpcy5jcmVhdGVMaW5rSGFuZGxlRHJhZ3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdSZWZzLnB1c2goLi4ubGlua0RyYWdSZWZzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsb3NlRHJhZ0JhY2tkcm9wKCk7XG4gICAgICAgIHRoaXMuZHJhZ1JlZnMuZm9yRWFjaCgoZHJhZ1JlZikgPT4gZHJhZ1JlZi5kaXNwb3NlKCkpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,96 +0,0 @@
1
- import { __decorate, __param } from "tslib";
2
- import { Inject } from '@angular/core';
3
- import { GanttLinkType } from '../../../class/link';
4
- import { GANTT_UPPER_TOKEN } from '../../../gantt-upper';
5
- import { GanttLinkLine } from './line';
6
- let GanttLinkLineCurve = class GanttLinkLineCurve extends GanttLinkLine {
7
- constructor(ganttUpper) {
8
- super();
9
- this.ganttUpper = ganttUpper;
10
- }
11
- generateSSPath(source, target) {
12
- const x1 = source.before.x;
13
- const y1 = source.before.y;
14
- const x4 = target.before.x;
15
- const y4 = target.before.y;
16
- const isMirror = y4 > y1 ? 0 : 1;
17
- const radius = Math.abs(y4 - y1) / 2;
18
- if (x4 > x1) {
19
- return `M ${x1} ${y1}
20
- A ${radius} ${radius} 0 1 ${isMirror} ${x1} ${y4}
21
- L ${x4} ${y4}`;
22
- }
23
- else {
24
- return `M ${x1} ${y1}
25
- L ${x4} ${y1}
26
- A ${radius} ${radius} 0 1 ${isMirror} ${x4} ${y4}`;
27
- }
28
- }
29
- generateFFPath(source, target) {
30
- const x1 = source.after.x;
31
- const y1 = source.after.y;
32
- const x4 = target.after.x;
33
- const y4 = target.after.y;
34
- const isMirror = y4 > y1 ? 1 : 0;
35
- const radius = Math.abs(y4 - y1) / 2;
36
- if (x4 > x1) {
37
- return `M ${x1} ${y1}
38
- L ${x4} ${y1}
39
- A ${radius} ${radius} 0 1 ${isMirror} ${x4} ${y4}`;
40
- }
41
- else {
42
- return `M ${x1} ${y1}
43
- A ${radius} ${radius} 0 1 ${isMirror} ${x1} ${y4}
44
- L ${x4} ${y4}`;
45
- }
46
- }
47
- generateFSAndSFPath(source, target, type) {
48
- var _a;
49
- let x1 = source.after.x;
50
- let y1 = source.after.y;
51
- let x4 = target.before.x;
52
- let y4 = target.before.y;
53
- const bezierWeight = 0.5;
54
- if (type === GanttLinkType.sf) {
55
- x1 = target.after.x;
56
- y1 = target.after.y;
57
- x4 = source.before.x;
58
- y4 = source.before.y;
59
- }
60
- let dx = Math.abs(x4 - x1) * bezierWeight;
61
- let x2 = x1 + dx;
62
- let x3 = x4 - dx;
63
- const centerX = (x1 + x4) / 2;
64
- const centerY = (y1 + y4) / 2;
65
- let controlX = this.ganttUpper.styles.lineHeight / 2;
66
- const controlY = this.ganttUpper.styles.lineHeight / 2;
67
- if (x1 >= x4) {
68
- if (Math.abs(y4 - y1) <= this.ganttUpper.styles.lineHeight) {
69
- return `M ${x1} ${y1}
70
- C ${x1 + controlX} ${y1} ${x1 + controlX} ${y4 > y1 ? y1 + controlX : y1 - controlX} ${x1} ${y4 > y1 ? y1 + controlY : y1 - controlY}
71
- L ${x4} ${y4 > y1 ? y4 - controlY : y4 + controlY}
72
- C ${x4 - controlY} ${y4 > y1 ? y4 - controlY : y4 + controlY} ${x4 - controlX} ${y4} ${x4} ${y4}
73
- `;
74
- }
75
- else {
76
- controlX = this.ganttUpper.styles.lineHeight;
77
- return `M ${x1} ${y1}
78
- C ${x1 + controlX} ${y1} ${x1 + controlX} ${y4 > y1 ? y1 + controlX : y1 - controlX} ${centerX} ${centerY}
79
- C ${x4 - controlX} ${y4 > y1 ? y4 - controlX : y4 + controlX} ${x4 - controlX} ${y4} ${x4} ${y4}
80
- `;
81
- }
82
- }
83
- else if (((_a = this.ganttUpper.linkOptions) === null || _a === void 0 ? void 0 : _a.showArrow) && x4 - x1 < 200) {
84
- dx = Math.max(Math.abs(y4 - y1) * bezierWeight, 60);
85
- x2 = x1 + dx;
86
- x3 = x4 - dx;
87
- return `M ${x1} ${y1} C ${x2} ${y1} ${x3} ${y4} ${x4} ${y4}`;
88
- }
89
- return `M ${x1} ${y1} C ${x2} ${y1} ${x3} ${y4} ${x4} ${y4}`;
90
- }
91
- };
92
- GanttLinkLineCurve = __decorate([
93
- __param(0, Inject(GANTT_UPPER_TOKEN))
94
- ], GanttLinkLineCurve);
95
- export { GanttLinkLineCurve };
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VydmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nYW50dC9zcmMvY29tcG9uZW50cy9saW5rcy9saW5lcy9jdXJ2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQWlCLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQU8sRUFBYyxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsSUFBYSxrQkFBa0IsR0FBL0IsTUFBYSxrQkFBbUIsU0FBUSxhQUFhO0lBQ2pELFlBQStDLFVBQXNCO1FBQ2pFLEtBQUssRUFBRSxDQUFDO1FBRG1DLGVBQVUsR0FBVixVQUFVLENBQVk7SUFFckUsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFxQixFQUFFLE1BQXFCO1FBQ3ZELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDVCxPQUFPLEtBQUssRUFBRSxJQUFJLEVBQUU7d0JBQ1IsTUFBTSxJQUFJLE1BQU0sUUFBUSxRQUFRLElBQUksRUFBRSxJQUFJLEVBQUU7d0JBQzVDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztTQUMxQjthQUFNO1lBQ0gsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFO3dCQUNSLEVBQUUsSUFBSSxFQUFFO3dCQUNSLE1BQU0sSUFBSSxNQUFNLFFBQVEsUUFBUSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztTQUM5RDtJQUNMLENBQUM7SUFDRCxjQUFjLENBQUMsTUFBcUIsRUFBRSxNQUFxQjtRQUN2RCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ1QsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFO3dCQUNSLEVBQUUsSUFBSSxFQUFFO3dCQUNSLE1BQU0sSUFBSSxNQUFNLFFBQVEsUUFBUSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztTQUM5RDthQUFNO1lBQ0gsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFO3dCQUNSLE1BQU0sSUFBSSxNQUFNLFFBQVEsUUFBUSxJQUFJLEVBQUUsSUFBSSxFQUFFO3dCQUM1QyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lB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SSxPQUFPLElBQUksT0FBTzt3QkFDckcsRUFBRSxHQUFHLFFBQVEsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxJQUFJLEVBQUUsR0FBRyxRQUFRLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO3FCQUM5RixDQUFDO2FBQ1Q7U0FDSjthQUFNLElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVywwQ0FBRSxTQUFTLEtBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUU7WUFDaEUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2IsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1NBQ2hFO1FBRUQsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0NBQ0osQ0FBQTtBQTFGWSxrQkFBa0I7SUFDZCxXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0dBRDdCLGtCQUFrQixDQTBGOUI7U0ExRlksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHYW50dExpbmtJdGVtLCBHYW50dExpbmtUeXBlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3MvbGluayc7XG5pbXBvcnQgeyBHYW50dFVwcGVyLCBHQU5UVF9VUFBFUl9UT0tFTiB9IGZyb20gJy4uLy4uLy4uL2dhbnR0LXVwcGVyJztcbmltcG9ydCB7IEdhbnR0TGlua0xpbmUgfSBmcm9tICcuL2xpbmUnO1xuXG5leHBvcnQgY2xhc3MgR2FudHRMaW5rTGluZUN1cnZlIGV4dGVuZHMgR2FudHRMaW5rTGluZSB7XG4gICAgY29uc3RydWN0b3IoQEluamVjdChHQU5UVF9VUFBFUl9UT0tFTikgcHJpdmF0ZSBnYW50dFVwcGVyOiBHYW50dFVwcGVyKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVTU1BhdGgoc291cmNlOiBHYW50dExpbmtJdGVtLCB0YXJnZXQ6IEdhbnR0TGlua0l0ZW0pIHtcbiAgICAgICAgY29uc3QgeDEgPSBzb3VyY2UuYmVmb3JlLng7XG4gICAgICAgIGNvbnN0IHkxID0gc291cmNlLmJlZm9yZS55O1xuICAgICAgICBjb25zdCB4NCA9IHRhcmdldC5iZWZvcmUueDtcbiAgICAgICAgY29uc3QgeTQgPSB0YXJnZXQuYmVmb3JlLnk7XG4gICAgICAgIGNvbnN0IGlzTWlycm9yID0geTQgPiB5MSA/IDAgOiAxO1xuICAgICAgICBjb25zdCByYWRpdXMgPSBNYXRoLmFicyh5NCAtIHkxKSAvIDI7XG5cbiAgICAgICAgaWYgKHg0ID4geDEpIHtcbiAgICAgICAgICAgIHJldHVybiBgTSAke3gxfSAke3kxfVxuICAgICAgICAgICAgICAgICAgICBBICR7cmFkaXVzfSAke3JhZGl1c30gMCAxICR7aXNNaXJyb3J9ICR7eDF9ICR7eTR9XG4gICAgICAgICAgICAgICAgICAgIEwgJHt4NH0gJHt5NH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBNICR7eDF9ICR7eTF9XG4gICAgICAgICAgICAgICAgICAgIEwgJHt4NH0gJHt5MX1cbiAgICAgICAgICAgICAgICAgICAgQSAke3JhZGl1c30gJHtyYWRpdXN9IDAgMSAke2lzTWlycm9yfSAke3g0fSAke3k0fWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVGRlBhdGgoc291cmNlOiBHYW50dExpbmtJdGVtLCB0YXJnZXQ6IEdhbnR0TGlua0l0ZW0pIHtcbiAgICAgICAgY29uc3QgeDEgPSBzb3VyY2UuYWZ0ZXIueDtcbiAgICAgICAgY29uc3QgeTEgPSBzb3VyY2UuYWZ0ZXIueTtcbiAgICAgICAgY29uc3QgeDQgPSB0YXJnZXQuYWZ0ZXIueDtcbiAgICAgICAgY29uc3QgeTQgPSB0YXJnZXQuYWZ0ZXIueTtcbiAgICAgICAgY29uc3QgaXNNaXJyb3IgPSB5NCA+IHkxID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IE1hdGguYWJzKHk0IC0geTEpIC8gMjtcbiAgICAgICAgaWYgKHg0ID4geDEpIHtcbiAgICAgICAgICAgIHJldHVybiBgTSAke3gxfSAke3kxfVxuICAgICAgICAgICAgICAgICAgICBMICR7eDR9ICR7eTF9XG4gICAgICAgICAgICAgICAgICAgIEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDEgJHtpc01pcnJvcn0gJHt4NH0gJHt5NH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBNICR7eDF9ICR7eTF9XG4gICAgICAgICAgICAgICAgICAgIEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDEgJHtpc01pcnJvcn0gJHt4MX0gJHt5NH1cbiAgICAgICAgICAgICAgICAgICAgTCAke3g0fSAke3k0fWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZUZTQW5kU0ZQYXRoKHNvdXJjZTogR2FudHRMaW5rSXRlbSwgdGFyZ2V0OiBHYW50dExpbmtJdGVtLCB0eXBlPzogR2FudHRMaW5rVHlwZSkge1xuICAgICAgICBsZXQgeDEgPSBzb3VyY2UuYWZ0ZXIueDtcbiAgICAgICAgbGV0IHkxID0gc291cmNlLmFmdGVyLnk7XG4gICAgICAgIGxldCB4NCA9IHRhcmdldC5iZWZvcmUueDtcbiAgICAgICAgbGV0IHk0ID0gdGFyZ2V0LmJlZm9yZS55O1xuICAgICAgICBjb25zdCBiZXppZXJXZWlnaHQgPSAwLjU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IEdhbnR0TGlua1R5cGUuc2YpIHtcbiAgICAgICAgICAgIHgxID0gdGFyZ2V0LmFmdGVyLng7XG4gICAgICAgICAgICB5MSA9IHRhcmdldC5hZnRlci55O1xuICAgICAgICAgICAgeDQgPSBzb3VyY2UuYmVmb3JlLng7XG4gICAgICAgICAgICB5NCA9IHNvdXJjZS5iZWZvcmUueTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkeCA9IE1hdGguYWJzKHg0IC0geDEpICogYmV6aWVyV2VpZ2h0O1xuICAgICAgICBsZXQgeDIgPSB4MSArIGR4O1xuICAgICAgICBsZXQgeDMgPSB4NCAtIGR4O1xuXG4gICAgICAgIGNvbnN0IGNlbnRlclggPSAoeDEgKyB4NCkgLyAyO1xuICAgICAgICBjb25zdCBjZW50ZXJZID0gKHkxICsgeTQpIC8gMjtcblxuICAgICAgICBsZXQgY29udHJvbFggPSB0aGlzLmdhbnR0VXBwZXIuc3R5bGVzLmxpbmVIZWlnaHQgLyAyO1xuICAgICAgICBjb25zdCBjb250cm9sWSA9IHRoaXMuZ2FudHRVcHBlci5zdHlsZXMubGluZUhlaWdodCAvIDI7XG5cbiAgICAgICAgaWYgKHgxID49IHg0KSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoeTQgLSB5MSkgPD0gdGhpcy5nYW50dFVwcGVyLnN0eWxlcy5saW5lSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBNICR7eDF9ICR7eTF9XG4gICAgICAgICAgICAgICAgICAgIEMgJHt4MSArIGNvbnRyb2xYfSAke3kxfSAke3gxICsgY29udHJvbFh9ICR7eTQgPiB5MSA/IHkxICsgY29udHJvbFggOiB5MSAtIGNvbnRyb2xYfSAke3gxfSAke1xuICAgICAgICAgICAgICAgICAgICB5NCA+IHkxID8geTEgKyBjb250cm9sWSA6IHkxIC0gY29udHJvbFlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEwgJHt4NH0gJHt5NCA+IHkxID8geTQgLSBjb250cm9sWSA6IHk0ICsgY29udHJvbFl9XG4gICAgICAgICAgICAgICAgICAgIEMgJHt4NCAtIGNvbnRyb2xZfSAke3k0ID4geTEgPyB5NCAtIGNvbnRyb2xZIDogeTQgKyBjb250cm9sWX0gICR7eDQgLSBjb250cm9sWH0gJHt5NH0gJHt4NH0gJHt5NH1cbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbFggPSB0aGlzLmdhbnR0VXBwZXIuc3R5bGVzLmxpbmVIZWlnaHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBNICR7eDF9ICR7eTF9XG4gICAgICAgICAgICAgICAgICAgIEMgJHt4MSArIGNvbnRyb2xYfSAke3kxfSAke3gxICsgY29udHJvbFh9ICR7eTQgPiB5MSA/IHkxICsgY29udHJvbFggOiB5MSAtIGNvbnRyb2xYfSAke2NlbnRlclh9ICR7Y2VudGVyWX1cbiAgICAgICAgICAgICAgICAgICAgQyAke3g0IC0gY29udHJvbFh9ICR7eTQgPiB5MSA/IHk0IC0gY29udHJvbFggOiB5NCArIGNvbnRyb2xYfSAke3g0IC0gY29udHJvbFh9ICR7eTR9ICR7eDR9ICR7eTR9XG4gICAgICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nYW50dFVwcGVyLmxpbmtPcHRpb25zPy5zaG93QXJyb3cgJiYgeDQgLSB4MSA8IDIwMCkge1xuICAgICAgICAgICAgZHggPSBNYXRoLm1heChNYXRoLmFicyh5NCAtIHkxKSAqIGJlemllcldlaWdodCwgNjApO1xuICAgICAgICAgICAgeDIgPSB4MSArIGR4O1xuICAgICAgICAgICAgeDMgPSB4NCAtIGR4O1xuICAgICAgICAgICAgcmV0dXJuIGBNICR7eDF9ICR7eTF9IEMgJHt4Mn0gJHt5MX0gJHt4M30gJHt5NH0gJHt4NH0gJHt5NH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGBNICR7eDF9ICR7eTF9IEMgJHt4Mn0gJHt5MX0gJHt4M30gJHt5NH0gJHt4NH0gJHt5NH1gO1xuICAgIH1cbn1cbiJdfQ==