@plait/draw 0.77.2 → 0.78.0-next.0

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 (156) hide show
  1. package/fesm2022/plait-draw.mjs +21 -14
  2. package/fesm2022/plait-draw.mjs.map +1 -1
  3. package/package.json +1 -3
  4. package/transforms/image.d.ts +6 -0
  5. package/utils/hit.d.ts +1 -1
  6. package/esm2022/arrow-line.component.mjs +0 -165
  7. package/esm2022/constants/default.mjs +0 -7
  8. package/esm2022/constants/geometry.mjs +0 -272
  9. package/esm2022/constants/image.mjs +0 -2
  10. package/esm2022/constants/index.mjs +0 -9
  11. package/esm2022/constants/line.mjs +0 -12
  12. package/esm2022/constants/pointer.mjs +0 -23
  13. package/esm2022/constants/swimlane.mjs +0 -25
  14. package/esm2022/constants/text.mjs +0 -2
  15. package/esm2022/constants/theme.mjs +0 -28
  16. package/esm2022/engines/basic-shapes/cloud.mjs +0 -146
  17. package/esm2022/engines/basic-shapes/comment.mjs +0 -56
  18. package/esm2022/engines/basic-shapes/cross.mjs +0 -33
  19. package/esm2022/engines/basic-shapes/diamond.mjs +0 -16
  20. package/esm2022/engines/basic-shapes/ellipse.mjs +0 -53
  21. package/esm2022/engines/basic-shapes/hexagon.mjs +0 -27
  22. package/esm2022/engines/basic-shapes/left-arrow.mjs +0 -30
  23. package/esm2022/engines/basic-shapes/octagon.mjs +0 -29
  24. package/esm2022/engines/basic-shapes/parallelogram.mjs +0 -26
  25. package/esm2022/engines/basic-shapes/pentagon-arrow.mjs +0 -27
  26. package/esm2022/engines/basic-shapes/pentagon.mjs +0 -30
  27. package/esm2022/engines/basic-shapes/polygon.mjs +0 -56
  28. package/esm2022/engines/basic-shapes/process-arrow.mjs +0 -26
  29. package/esm2022/engines/basic-shapes/rectangle.mjs +0 -26
  30. package/esm2022/engines/basic-shapes/right-arrow.mjs +0 -28
  31. package/esm2022/engines/basic-shapes/round-comment.mjs +0 -82
  32. package/esm2022/engines/basic-shapes/round-rectangle.mjs +0 -58
  33. package/esm2022/engines/basic-shapes/star.mjs +0 -39
  34. package/esm2022/engines/basic-shapes/trapezoid.mjs +0 -26
  35. package/esm2022/engines/basic-shapes/triangle.mjs +0 -34
  36. package/esm2022/engines/basic-shapes/two-way-arrow.mjs +0 -25
  37. package/esm2022/engines/flowchart/database.mjs +0 -84
  38. package/esm2022/engines/flowchart/delay.mjs +0 -44
  39. package/esm2022/engines/flowchart/display.mjs +0 -74
  40. package/esm2022/engines/flowchart/document.mjs +0 -81
  41. package/esm2022/engines/flowchart/hard-disk.mjs +0 -84
  42. package/esm2022/engines/flowchart/internal-storage.mjs +0 -47
  43. package/esm2022/engines/flowchart/manual-input.mjs +0 -33
  44. package/esm2022/engines/flowchart/manual-loop.mjs +0 -26
  45. package/esm2022/engines/flowchart/merge.mjs +0 -34
  46. package/esm2022/engines/flowchart/multi-document.mjs +0 -143
  47. package/esm2022/engines/flowchart/note-curly-left.mjs +0 -86
  48. package/esm2022/engines/flowchart/note-curly-right.mjs +0 -89
  49. package/esm2022/engines/flowchart/note-square.mjs +0 -46
  50. package/esm2022/engines/flowchart/off-page.mjs +0 -32
  51. package/esm2022/engines/flowchart/or.mjs +0 -20
  52. package/esm2022/engines/flowchart/predefined-process.mjs +0 -47
  53. package/esm2022/engines/flowchart/preparation.mjs +0 -27
  54. package/esm2022/engines/flowchart/stored-data.mjs +0 -79
  55. package/esm2022/engines/flowchart/summing-junction.mjs +0 -23
  56. package/esm2022/engines/flowchart/terminal.mjs +0 -68
  57. package/esm2022/engines/index.mjs +0 -130
  58. package/esm2022/engines/table/table.mjs +0 -101
  59. package/esm2022/engines/uml/activity-class.mjs +0 -47
  60. package/esm2022/engines/uml/actor.mjs +0 -119
  61. package/esm2022/engines/uml/assembly.mjs +0 -105
  62. package/esm2022/engines/uml/combined-fragment.mjs +0 -66
  63. package/esm2022/engines/uml/component-box.mjs +0 -61
  64. package/esm2022/engines/uml/component.mjs +0 -117
  65. package/esm2022/engines/uml/container.mjs +0 -44
  66. package/esm2022/engines/uml/deletion.mjs +0 -54
  67. package/esm2022/engines/uml/note.mjs +0 -58
  68. package/esm2022/engines/uml/package.mjs +0 -105
  69. package/esm2022/engines/uml/provided-interface.mjs +0 -92
  70. package/esm2022/engines/uml/required-interface.mjs +0 -81
  71. package/esm2022/engines/uml/template.mjs +0 -47
  72. package/esm2022/generators/arrow-line-auto-complete.generator.mjs +0 -46
  73. package/esm2022/generators/arrow-line.generator.mjs +0 -13
  74. package/esm2022/generators/geometry-shape.generator.mjs +0 -29
  75. package/esm2022/generators/index.mjs +0 -7
  76. package/esm2022/generators/line-active.generator.mjs +0 -84
  77. package/esm2022/generators/single-text.generator.mjs +0 -16
  78. package/esm2022/generators/table.generator.mjs +0 -25
  79. package/esm2022/generators/text.generator.mjs +0 -131
  80. package/esm2022/generators/vector-line-generator.mjs +0 -13
  81. package/esm2022/geometry.component.mjs +0 -145
  82. package/esm2022/image.component.mjs +0 -67
  83. package/esm2022/interfaces/arrow-line.mjs +0 -70
  84. package/esm2022/interfaces/element.mjs +0 -9
  85. package/esm2022/interfaces/engine.mjs +0 -2
  86. package/esm2022/interfaces/geometry.mjs +0 -82
  87. package/esm2022/interfaces/image.mjs +0 -2
  88. package/esm2022/interfaces/index.mjs +0 -92
  89. package/esm2022/interfaces/line.mjs +0 -2
  90. package/esm2022/interfaces/options.mjs +0 -2
  91. package/esm2022/interfaces/swimlane.mjs +0 -13
  92. package/esm2022/interfaces/table.mjs +0 -13
  93. package/esm2022/interfaces/text.mjs +0 -2
  94. package/esm2022/interfaces/vector-line.mjs +0 -10
  95. package/esm2022/plait-draw.mjs +0 -5
  96. package/esm2022/plugins/with-arrow-line-auto-complete-reaction.mjs +0 -43
  97. package/esm2022/plugins/with-arrow-line-auto-complete.mjs +0 -76
  98. package/esm2022/plugins/with-arrow-line-bound-reaction.mjs +0 -53
  99. package/esm2022/plugins/with-arrow-line-create.mjs +0 -51
  100. package/esm2022/plugins/with-arrow-line-resize.mjs +0 -158
  101. package/esm2022/plugins/with-arrow-line-text-move.mjs +0 -53
  102. package/esm2022/plugins/with-arrow-line-text.mjs +0 -73
  103. package/esm2022/plugins/with-draw-fragment.mjs +0 -98
  104. package/esm2022/plugins/with-draw-hotkey.mjs +0 -45
  105. package/esm2022/plugins/with-draw-resize.mjs +0 -269
  106. package/esm2022/plugins/with-draw-rotate.mjs +0 -132
  107. package/esm2022/plugins/with-draw.mjs +0 -144
  108. package/esm2022/plugins/with-geometry-create.mjs +0 -182
  109. package/esm2022/plugins/with-swimlane-create.mjs +0 -127
  110. package/esm2022/plugins/with-swimlane.mjs +0 -21
  111. package/esm2022/plugins/with-table-resize.mjs +0 -135
  112. package/esm2022/plugins/with-table.mjs +0 -109
  113. package/esm2022/plugins/with-vector-line-create.mjs +0 -85
  114. package/esm2022/plugins/with-vector-line-resize.mjs +0 -61
  115. package/esm2022/public-api.mjs +0 -11
  116. package/esm2022/table.component.mjs +0 -162
  117. package/esm2022/transforms/arrow-line.mjs +0 -66
  118. package/esm2022/transforms/common.mjs +0 -36
  119. package/esm2022/transforms/geometry-text.mjs +0 -59
  120. package/esm2022/transforms/geometry.mjs +0 -43
  121. package/esm2022/transforms/image.mjs +0 -22
  122. package/esm2022/transforms/index.mjs +0 -36
  123. package/esm2022/transforms/multi-text-geometry-text.mjs +0 -15
  124. package/esm2022/transforms/swimlane.mjs +0 -164
  125. package/esm2022/transforms/table-text.mjs +0 -44
  126. package/esm2022/transforms/table.mjs +0 -36
  127. package/esm2022/transforms/vector-line.mjs +0 -13
  128. package/esm2022/utils/arrow-line/arrow-line-arrow.mjs +0 -123
  129. package/esm2022/utils/arrow-line/arrow-line-basic.mjs +0 -205
  130. package/esm2022/utils/arrow-line/arrow-line-common.mjs +0 -162
  131. package/esm2022/utils/arrow-line/arrow-line-resize.mjs +0 -309
  132. package/esm2022/utils/arrow-line/elbow.mjs +0 -114
  133. package/esm2022/utils/arrow-line/index.mjs +0 -6
  134. package/esm2022/utils/clipboard.mjs +0 -55
  135. package/esm2022/utils/common.mjs +0 -184
  136. package/esm2022/utils/geometry.mjs +0 -178
  137. package/esm2022/utils/hit.mjs +0 -242
  138. package/esm2022/utils/index.mjs +0 -17
  139. package/esm2022/utils/line.mjs +0 -64
  140. package/esm2022/utils/memorize.mjs +0 -93
  141. package/esm2022/utils/multi-text-geometry.mjs +0 -61
  142. package/esm2022/utils/polygon.mjs +0 -30
  143. package/esm2022/utils/position/arrow-line.mjs +0 -20
  144. package/esm2022/utils/position/geometry.mjs +0 -30
  145. package/esm2022/utils/position/line.mjs +0 -51
  146. package/esm2022/utils/selected.mjs +0 -39
  147. package/esm2022/utils/shape.mjs +0 -11
  148. package/esm2022/utils/snap-resizing.mjs +0 -185
  149. package/esm2022/utils/style/index.mjs +0 -2
  150. package/esm2022/utils/style/stroke.mjs +0 -21
  151. package/esm2022/utils/swimlane.mjs +0 -124
  152. package/esm2022/utils/table-selected.mjs +0 -21
  153. package/esm2022/utils/table.mjs +0 -172
  154. package/esm2022/utils/uml.mjs +0 -90
  155. package/esm2022/utils/vector-line.mjs +0 -71
  156. package/esm2022/vector-line.component.mjs +0 -55
@@ -1,184 +0,0 @@
1
- import { ACTIVE_STROKE_WIDTH, addSelectedElement, BoardTransforms, clearSelectedElement, createG, depthFirstRecursion, drawCircle, getI18nValue, getIsRecursionFunc, PlaitBoard, PlaitPointerType, RectangleClient, rotateAntiPointsByElement, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SNAPPING_STROKE_WIDTH, Transforms } from '@plait/core';
2
- import { DefaultDrawStyle, DefaultTextProperty, DrawI18nKey, LINE_HIT_GEOMETRY_BUFFER, LINE_SNAPPING_BUFFER, ShapeDefaultSpace } from '../constants';
3
- import { GeometryCommonTextKeys, PlaitDrawElement } from '../interfaces';
4
- import { Alignment, getTextEditorsByElement } from '@plait/common';
5
- import { isCellIncludeText } from './table';
6
- import { getEngine } from '../engines';
7
- import { getElementShape } from './shape';
8
- import { memorizeLatestShape } from './memorize';
9
- import { isHitEdgeOfShape, isInsideOfShape } from './hit';
10
- import { getHitConnectorPoint } from './arrow-line';
11
- import { getNearestPoint, isGeometryClosed, isGeometryIncludeText, isSingleTextGeometry } from './geometry';
12
- import { isMultipleTextGeometry } from './multi-text-geometry';
13
- export const getTextRectangle = (element) => {
14
- const elementRectangle = RectangleClient.getRectangleByPoints(element.points);
15
- const strokeWidth = getStrokeWidthByElement(element);
16
- const height = element.textHeight;
17
- const width = elementRectangle.width - ShapeDefaultSpace.rectangleAndText * 2 - strokeWidth * 2;
18
- return {
19
- height,
20
- width: width > 0 ? width : 0,
21
- x: elementRectangle.x + ShapeDefaultSpace.rectangleAndText + strokeWidth,
22
- y: elementRectangle.y + (elementRectangle.height - height) / 2
23
- };
24
- };
25
- export const getStrokeWidthByElement = (element) => {
26
- if (PlaitDrawElement.isText(element)) {
27
- return 0;
28
- }
29
- const strokeWidth = element.strokeWidth || DefaultDrawStyle.strokeWidth;
30
- return strokeWidth;
31
- };
32
- export const insertElement = (board, element) => {
33
- memorizeLatestShape(board, element.shape);
34
- Transforms.insertNode(board, element, [board.children.length]);
35
- clearSelectedElement(board);
36
- addSelectedElement(board, element);
37
- BoardTransforms.updatePointerType(board, PlaitPointerType.selection);
38
- };
39
- export const isDrawElementIncludeText = (element) => {
40
- if (PlaitDrawElement.isText(element)) {
41
- return true;
42
- }
43
- if (PlaitDrawElement.isImage(element)) {
44
- return false;
45
- }
46
- if (PlaitDrawElement.isGeometry(element)) {
47
- return isGeometryIncludeText(element);
48
- }
49
- if (PlaitDrawElement.isArrowLine(element)) {
50
- const editors = getTextEditorsByElement(element);
51
- return editors.length > 0;
52
- }
53
- if (PlaitDrawElement.isElementByTable(element)) {
54
- return element.cells.some((cell) => isCellIncludeText(cell));
55
- }
56
- return true;
57
- };
58
- export const isDrawElementsIncludeText = (elements) => {
59
- return elements.some((item) => {
60
- return isDrawElementIncludeText(item);
61
- });
62
- };
63
- export const isClosedDrawElement = (element) => {
64
- if (PlaitDrawElement.isDrawElement(element)) {
65
- if (PlaitDrawElement.isText(element) || PlaitDrawElement.isArrowLine(element) || PlaitDrawElement.isImage(element)) {
66
- return false;
67
- }
68
- if (PlaitDrawElement.isVectorLine(element)) {
69
- return isClosedPoints(element.points);
70
- }
71
- if (PlaitDrawElement.isGeometry(element)) {
72
- return isGeometryClosed(element);
73
- }
74
- return true;
75
- }
76
- return false;
77
- };
78
- export const isClosedCustomGeometry = (board, value) => {
79
- return PlaitDrawElement.isCustomGeometryElement(board, value) && isClosedPoints(value.points);
80
- };
81
- export const getSnappingShape = (board, point) => {
82
- let hitElement = getHitShape(board, point);
83
- if (hitElement) {
84
- const ref = getSnappingRef(board, hitElement, point);
85
- if (ref.isHitConnector || ref.isHitEdge) {
86
- return hitElement;
87
- }
88
- }
89
- return null;
90
- };
91
- export const getSnappingRef = (board, hitElement, point) => {
92
- const rotatedPoint = rotateAntiPointsByElement(board, point, hitElement) || point;
93
- const connectorPoint = getHitConnectorPoint(rotatedPoint, hitElement);
94
- const edgePoint = getNearestPoint(hitElement, rotatedPoint);
95
- const isHitEdge = isHitEdgeOfShape(board, hitElement, rotatedPoint, LINE_SNAPPING_BUFFER);
96
- return { isHitEdge, isHitConnector: !!connectorPoint, connectorPoint, edgePoint };
97
- };
98
- export const getHitShape = (board, point, offset = LINE_HIT_GEOMETRY_BUFFER) => {
99
- let hitShape = null;
100
- traverseDrawShapes(board, (element) => {
101
- if (hitShape === null && isInsideOfShape(board, element, rotateAntiPointsByElement(board, point, element) || point, offset * 2)) {
102
- hitShape = element;
103
- }
104
- });
105
- return hitShape;
106
- };
107
- export const traverseDrawShapes = (board, callback) => {
108
- depthFirstRecursion(board, (node) => {
109
- if (!PlaitBoard.isBoard(node) && PlaitDrawElement.isShapeElement(node)) {
110
- callback(node);
111
- }
112
- }, getIsRecursionFunc(board), true);
113
- };
114
- export const drawShape = (board, outerRectangle, shape, roughOptions, drawOptions) => {
115
- return getEngine(shape).draw(board, outerRectangle, roughOptions, drawOptions);
116
- };
117
- export const drawBoundReaction = (board, element, roughOptions = { hasMask: true, hasConnector: true }) => {
118
- const g = createG();
119
- const rectangle = RectangleClient.getRectangleByPoints(element.points);
120
- const activeRectangle = RectangleClient.inflate(rectangle, SNAPPING_STROKE_WIDTH);
121
- const shape = getElementShape(element);
122
- let drawOptions;
123
- if (PlaitDrawElement.isElementByTable(element)) {
124
- drawOptions = { element };
125
- }
126
- const strokeG = drawShape(board, activeRectangle, shape, {
127
- stroke: SELECTION_BORDER_COLOR,
128
- strokeWidth: SNAPPING_STROKE_WIDTH
129
- }, drawOptions);
130
- g.appendChild(strokeG);
131
- if (roughOptions.hasMask) {
132
- const maskG = drawShape(board, activeRectangle, shape, {
133
- stroke: SELECTION_BORDER_COLOR,
134
- strokeWidth: 0,
135
- fill: isClosedDrawElement(element) ? SELECTION_FILL_COLOR : DefaultDrawStyle.fill,
136
- fillStyle: 'solid'
137
- }, drawOptions);
138
- g.appendChild(maskG);
139
- }
140
- if (roughOptions.hasConnector) {
141
- const connectorPoints = getEngine(shape).getConnectorPoints(rectangle);
142
- connectorPoints.forEach((point) => {
143
- const circleG = drawCircle(PlaitBoard.getRoughSVG(board), point, 8, {
144
- stroke: SELECTION_BORDER_COLOR,
145
- strokeWidth: ACTIVE_STROKE_WIDTH,
146
- fill: '#FFF',
147
- fillStyle: 'solid'
148
- });
149
- g.appendChild(circleG);
150
- });
151
- }
152
- return g;
153
- };
154
- export const getTextKey = (element, text) => {
155
- if (element && isMultipleTextGeometry(element)) {
156
- return `${element.id}-${text.id}`;
157
- }
158
- else {
159
- return text.id;
160
- }
161
- };
162
- export const getGeometryAlign = (board, element) => {
163
- if (isMultipleTextGeometry(element)) {
164
- const drawShapeText = element.texts.find((item) => item.id.includes(GeometryCommonTextKeys.content));
165
- return drawShapeText?.text.align || Alignment.center;
166
- }
167
- if (isSingleTextGeometry(element)) {
168
- return element.text?.align || Alignment.center;
169
- }
170
- if (PlaitDrawElement.isElementByTable(element)) {
171
- const firstTextCell = element.cells.find((item) => item.text);
172
- return firstTextCell?.text?.align || Alignment.center;
173
- }
174
- return Alignment.center;
175
- };
176
- export const isClosedPoints = (points) => {
177
- const startPoint = points[0];
178
- const endPoint = points[points.length - 1];
179
- return startPoint[0] === endPoint[0] && startPoint[1] === endPoint[1];
180
- };
181
- export const getDefaultGeometryText = (board) => {
182
- return getI18nValue(board, DrawI18nKey.geometryText, DefaultTextProperty.text);
183
- };
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvZHJhdy9zcmMvdXRpbHMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBRWxCLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsT0FBTyxFQUNQLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixVQUFVLEVBRVYsZ0JBQWdCLEVBRWhCLGVBQWUsRUFDZix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsVUFBVSxFQUNiLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNwQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBR0gsc0JBQXNCLEVBSXRCLGdCQUFnQixFQUduQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVB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RUYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDeEQsT0FBTyxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkYsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBQ1RJVkVfU1RST0tFX1dJRFRILFxuICAgIGFkZFNlbGVjdGVkRWxlbWVudCxcbiAgICBBbmNlc3RvcixcbiAgICBCb2FyZFRyYW5zZm9ybXMsXG4gICAgY2xlYXJTZWxlY3RlZEVsZW1lbnQsXG4gICAgY3JlYXRlRyxcbiAgICBkZXB0aEZpcnN0UmVjdXJzaW9uLFxuICAgIGRyYXdDaXJjbGUsXG4gICAgZ2V0STE4blZhbHVlLFxuICAgIGdldElzUmVjdXJzaW9uRnVuYyxcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQbGFpdFBvaW50ZXJUeXBlLFxuICAgIFBvaW50LFxuICAgIFJlY3RhbmdsZUNsaWVudCxcbiAgICByb3RhdGVBbnRpUG9pbnRzQnlFbGVtZW50LFxuICAgIFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgU0VMRUNUSU9OX0ZJTExfQ09MT1IsXG4gICAgU05BUFBJTkdfU1RST0tFX1dJRFRILFxuICAgIFRyYW5zZm9ybXNcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHtcbiAgICBEZWZhdWx0RHJhd1N0eWxlLFxuICAgIERlZmF1bHRUZXh0UHJvcGVydHksXG4gICAgRHJhd0kxOG5LZXksXG4gICAgTElORV9ISVRfR0VPTUVUUllfQlVGRkVSLFxuICAgIExJTkVfU05BUFBJTkdfQlVGRkVSLFxuICAgIFNoYXBlRGVmYXVsdFNwYWNlXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICAgIERyYXdPcHRpb25zLFxuICAgIERyYXdTaGFwZXMsXG4gICAgR2VvbWV0cnlDb21tb25UZXh0S2V5cyxcbiAgICBQbGFpdEJhc2VHZW9tZXRyeSxcbiAgICBQbGFpdENvbW1vbkdlb21ldHJ5LFxuICAgIFBsYWl0Q3VzdG9tR2VvbWV0cnksXG4gICAgUGxhaXREcmF3RWxlbWVudCxcbiAgICBQbGFpdEdlb21ldHJ5LFxuICAgIFBsYWl0U2hhcGVFbGVtZW50XG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQWxpZ25tZW50LCBnZXRUZXh0RWRpdG9yc0J5RWxlbWVudCB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgaXNDZWxsSW5jbHVkZVRleHQgfSBmcm9tICcuL3RhYmxlJztcbmltcG9ydCB7IGdldEVuZ2luZSB9IGZyb20gJy4uL2VuZ2luZXMnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudFNoYXBlIH0gZnJvbSAnLi9zaGFwZSc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBQbGFpdEJhc2VUYWJsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvdGFibGUnO1xuaW1wb3J0IHsgbWVtb3JpemVMYXRlc3RTaGFwZSB9IGZyb20gJy4vbWVtb3JpemUnO1xuaW1wb3J0IHsgaXNIaXRFZGdlT2ZTaGFwZSwgaXNJbnNpZGVPZlNoYXBlIH0gZnJvbSAnLi9oaXQnO1xuaW1wb3J0IHsgZ2V0SGl0Q29ubmVjdG9yUG9pbnQgfSBmcm9tICcuL2Fycm93LWxpbmUnO1xuaW1wb3J0IHsgZ2V0TmVhcmVzdFBvaW50LCBpc0dlb21ldHJ5Q2xvc2VkLCBpc0dlb21ldHJ5SW5jbHVkZVRleHQsIGlzU2luZ2xlVGV4dEdlb21ldHJ5IH0gZnJvbSAnLi9nZW9tZXRyeSc7XG5pbXBvcnQgeyBpc011bHRpcGxlVGV4dEdlb21ldHJ5IH0gZnJvbSAnLi9tdWx0aS10ZXh0LWdlb21ldHJ5JztcbmltcG9ydCB7IERyYXdUZXh0SW5mbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvdGV4dC5nZW5lcmF0b3InO1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dFJlY3RhbmdsZSA9IDxUIGV4dGVuZHMgUGxhaXRFbGVtZW50ID0gUGxhaXRHZW9tZXRyeT4oZWxlbWVudDogVCkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZWxlbWVudC5wb2ludHMhKTtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQudGV4dEhlaWdodCE7XG4gICAgY29uc3Qgd2lkdGggPSBlbGVtZW50UmVjdGFuZ2xlLndpZHRoIC0gU2hhcGVEZWZhdWx0U3BhY2UucmVjdGFuZ2xlQW5kVGV4dCAqIDIgLSBzdHJva2VXaWR0aCAqIDI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB3aWR0aDogd2lkdGggPiAwID8gd2lkdGggOiAwLFxuICAgICAgICB4OiBlbGVtZW50UmVjdGFuZ2xlLnggKyBTaGFwZURlZmF1bHRTcGFjZS5yZWN0YW5nbGVBbmRUZXh0ICsgc3Ryb2tlV2lkdGgsXG4gICAgICAgIHk6IGVsZW1lbnRSZWN0YW5nbGUueSArIChlbGVtZW50UmVjdGFuZ2xlLmhlaWdodCAtIGhlaWdodCkgLyAyXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc1RleHQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZWxlbWVudC5zdHJva2VXaWR0aCB8fCBEZWZhdWx0RHJhd1N0eWxlLnN0cm9rZVdpZHRoO1xuICAgIHJldHVybiBzdHJva2VXaWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBpbnNlcnRFbGVtZW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdEJhc2VHZW9tZXRyeSB8IFBsYWl0QmFzZVRhYmxlKSA9PiB7XG4gICAgbWVtb3JpemVMYXRlc3RTaGFwZShib2FyZCwgZWxlbWVudC5zaGFwZSk7XG4gICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlKGJvYXJkLCBlbGVtZW50LCBbYm9hcmQuY2hpbGRyZW4ubGVuZ3RoXSk7XG4gICAgY2xlYXJTZWxlY3RlZEVsZW1lbnQoYm9hcmQpO1xuICAgIGFkZFNlbGVjdGVkRWxlbWVudChib2FyZCwgZWxlbWVudCk7XG4gICAgQm9hcmRUcmFuc2Zvcm1zLnVwZGF0ZVBvaW50ZXJUeXBlKGJvYXJkLCBQbGFpdFBvaW50ZXJUeXBlLnNlbGVjdGlvbik7XG59O1xuXG5leHBvcnQgY29uc3QgaXNEcmF3RWxlbWVudEluY2x1ZGVUZXh0ID0gKGVsZW1lbnQ6IFBsYWl0RHJhd0VsZW1lbnQpID0+IHtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc1RleHQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzSW1hZ2UoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0dlb21ldHJ5KGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBpc0dlb21ldHJ5SW5jbHVkZVRleHQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzQXJyb3dMaW5lKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGVkaXRvcnMgPSBnZXRUZXh0RWRpdG9yc0J5RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGVkaXRvcnMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNFbGVtZW50QnlUYWJsZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jZWxscy5zb21lKChjZWxsKSA9PiBpc0NlbGxJbmNsdWRlVGV4dChjZWxsKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRHJhd0VsZW1lbnRzSW5jbHVkZVRleHQgPSAoZWxlbWVudHM6IFBsYWl0RHJhd0VsZW1lbnRbXSkgPT4ge1xuICAgIHJldHVybiBlbGVtZW50cy5zb21lKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpc0RyYXdFbGVtZW50SW5jbHVkZVRleHQoaXRlbSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNDbG9zZWREcmF3RWxlbWVudCA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQpID0+IHtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0RyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzVGV4dChlbGVtZW50KSB8fCBQbGFpdERyYXdFbGVtZW50LmlzQXJyb3dMaW5lKGVsZW1lbnQpIHx8IFBsYWl0RHJhd0VsZW1lbnQuaXNJbWFnZShlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzVmVjdG9yTGluZShlbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQ2xvc2VkUG9pbnRzKGVsZW1lbnQucG9pbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0dlb21ldHJ5KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNHZW9tZXRyeUNsb3NlZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ2xvc2VkQ3VzdG9tR2VvbWV0cnkgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHZhbHVlOiBQbGFpdEVsZW1lbnQpOiB2YWx1ZSBpcyBQbGFpdEN1c3RvbUdlb21ldHJ5ID0+IHtcbiAgICByZXR1cm4gUGxhaXREcmF3RWxlbWVudC5pc0N1c3RvbUdlb21ldHJ5RWxlbWVudChib2FyZCwgdmFsdWUpICYmIGlzQ2xvc2VkUG9pbnRzKHZhbHVlLnBvaW50cyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U25hcHBpbmdTaGFwZSA9IChib2FyZDogUGxhaXRCb2FyZCwgcG9pbnQ6IFBvaW50KTogUGxhaXRTaGFwZUVsZW1lbnQgfCBudWxsID0+IHtcbiAgICBsZXQgaGl0RWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQgfCBudWxsID0gZ2V0SGl0U2hhcGUoYm9hcmQsIHBvaW50KTtcbiAgICBpZiAoaGl0RWxlbWVudCkge1xuICAgICAgICBjb25zdCByZWYgPSBnZXRTbmFwcGluZ1JlZihib2FyZCwgaGl0RWxlbWVudCwgcG9pbnQpO1xuICAgICAgICBpZiAocmVmLmlzSGl0Q29ubmVjdG9yIHx8IHJlZi5pc0hpdEVkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBoaXRFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNuYXBwaW5nUmVmID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBoaXRFbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3Qgcm90YXRlZFBvaW50ID0gcm90YXRlQW50aVBvaW50c0J5RWxlbWVudChib2FyZCwgcG9pbnQsIGhpdEVsZW1lbnQpIHx8IHBvaW50O1xuICAgIGNvbnN0IGNvbm5lY3RvclBvaW50ID0gZ2V0SGl0Q29ubmVjdG9yUG9pbnQocm90YXRlZFBvaW50LCBoaXRFbGVtZW50KTtcbiAgICBjb25zdCBlZGdlUG9pbnQgPSBnZXROZWFyZXN0UG9pbnQoaGl0RWxlbWVudCwgcm90YXRlZFBvaW50KTtcbiAgICBjb25zdCBpc0hpdEVkZ2UgPSBpc0hpdEVkZ2VPZlNoYXBlKGJvYXJkLCBoaXRFbGVtZW50LCByb3RhdGVkUG9pbnQsIExJTkVfU05BUFBJTkdfQlVGRkVSKTtcbiAgICByZXR1cm4geyBpc0hpdEVkZ2UsIGlzSGl0Q29ubmVjdG9yOiAhIWNvbm5lY3RvclBvaW50LCBjb25uZWN0b3JQb2ludCwgZWRnZVBvaW50IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGl0U2hhcGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50OiBQb2ludCwgb2Zmc2V0ID0gTElORV9ISVRfR0VPTUVUUllfQlVGRkVSKTogUGxhaXRTaGFwZUVsZW1lbnQgfCBudWxsID0+IHtcbiAgICBsZXQgaGl0U2hhcGU6IFBsYWl0U2hhcGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgdHJhdmVyc2VEcmF3U2hhcGVzKGJvYXJkLCAoZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGhpdFNoYXBlID09PSBudWxsICYmIGlzSW5zaWRlT2ZTaGFwZShib2FyZCwgZWxlbWVudCwgcm90YXRlQW50aVBvaW50c0J5RWxlbWVudChib2FyZCwgcG9pbnQsIGVsZW1lbnQpIHx8IHBvaW50LCBvZmZzZXQgKiAyKSkge1xuICAgICAgICAgICAgaGl0U2hhcGUgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGhpdFNoYXBlO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYXZlcnNlRHJhd1NoYXBlcyA9IChib2FyZDogUGxhaXRCb2FyZCwgY2FsbGJhY2s6IChlbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCkgPT4gdm9pZCkgPT4ge1xuICAgIGRlcHRoRmlyc3RSZWN1cnNpb248QW5jZXN0b3I+KFxuICAgICAgICBib2FyZCxcbiAgICAgICAgKG5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmICghUGxhaXRCb2FyZC5pc0JvYXJkKG5vZGUpICYmIFBsYWl0RHJhd0VsZW1lbnQuaXNTaGFwZUVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0SXNSZWN1cnNpb25GdW5jKGJvYXJkKSxcbiAgICAgICAgdHJ1ZVxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgZHJhd1NoYXBlID0gKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIG91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsXG4gICAgc2hhcGU6IERyYXdTaGFwZXMsXG4gICAgcm91Z2hPcHRpb25zOiBPcHRpb25zLFxuICAgIGRyYXdPcHRpb25zPzogRHJhd09wdGlvbnNcbikgPT4ge1xuICAgIHJldHVybiBnZXRFbmdpbmUoc2hhcGUpLmRyYXcoYm9hcmQsIG91dGVyUmVjdGFuZ2xlLCByb3VnaE9wdGlvbnMsIGRyYXdPcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkcmF3Qm91bmRSZWFjdGlvbiA9IChcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBlbGVtZW50OiBQbGFpdFNoYXBlRWxlbWVudCxcbiAgICByb3VnaE9wdGlvbnM6IHsgaGFzTWFzazogYm9vbGVhbjsgaGFzQ29ubmVjdG9yOiBib29sZWFuIH0gPSB7IGhhc01hc2s6IHRydWUsIGhhc0Nvbm5lY3RvcjogdHJ1ZSB9XG4pID0+IHtcbiAgICBjb25zdCBnID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUocmVjdGFuZ2xlLCBTTkFQUElOR19TVFJPS0VfV0lEVEgpO1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0RWxlbWVudFNoYXBlKGVsZW1lbnQpO1xuICAgIGxldCBkcmF3T3B0aW9uczogRHJhd09wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFBsYWl0RHJhd0VsZW1lbnQuaXNFbGVtZW50QnlUYWJsZShlbGVtZW50KSkge1xuICAgICAgICBkcmF3T3B0aW9ucyA9IHsgZWxlbWVudCB9O1xuICAgIH1cbiAgICBjb25zdCBzdHJva2VHID0gZHJhd1NoYXBlKFxuICAgICAgICBib2FyZCxcbiAgICAgICAgYWN0aXZlUmVjdGFuZ2xlLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAge1xuICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IFNOQVBQSU5HX1NUUk9LRV9XSURUSFxuICAgICAgICB9LFxuICAgICAgICBkcmF3T3B0aW9uc1xuICAgICk7XG4gICAgZy5hcHBlbmRDaGlsZChzdHJva2VHKTtcblxuICAgIGlmIChyb3VnaE9wdGlvbnMuaGFzTWFzaykge1xuICAgICAgICBjb25zdCBtYXNrRyA9IGRyYXdTaGFwZShcbiAgICAgICAgICAgIGJvYXJkLFxuICAgICAgICAgICAgYWN0aXZlUmVjdGFuZ2xlLFxuICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAwLFxuICAgICAgICAgICAgICAgIGZpbGw6IGlzQ2xvc2VkRHJhd0VsZW1lbnQoZWxlbWVudCkgPyBTRUxFQ1RJT05fRklMTF9DT0xPUiA6IERlZmF1bHREcmF3U3R5bGUuZmlsbCxcbiAgICAgICAgICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkcmF3T3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBnLmFwcGVuZENoaWxkKG1hc2tHKTtcbiAgICB9XG4gICAgaWYgKHJvdWdoT3B0aW9ucy5oYXNDb25uZWN0b3IpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdG9yUG9pbnRzID0gZ2V0RW5naW5lKHNoYXBlKS5nZXRDb25uZWN0b3JQb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgY29ubmVjdG9yUG9pbnRzLmZvckVhY2goKHBvaW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVHID0gZHJhd0NpcmNsZShQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKSwgcG9pbnQsIDgsIHtcbiAgICAgICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IEFDVElWRV9TVFJPS0VfV0lEVEgsXG4gICAgICAgICAgICAgICAgZmlsbDogJyNGRkYnLFxuICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBnLmFwcGVuZENoaWxkKGNpcmNsZUcpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEtleSA9IChlbGVtZW50OiBQbGFpdEVsZW1lbnQgfCB1bmRlZmluZWQsIHRleHQ6IFBpY2s8RHJhd1RleHRJbmZvLCAnaWQnPikgPT4ge1xuICAgIGlmIChlbGVtZW50ICYmIGlzTXVsdGlwbGVUZXh0R2VvbWV0cnkoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGAke2VsZW1lbnQuaWR9LSR7dGV4dC5pZH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZXh0LmlkO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHZW9tZXRyeUFsaWduID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdENvbW1vbkdlb21ldHJ5IHwgUGxhaXRCYXNlVGFibGUpID0+IHtcbiAgICBpZiAoaXNNdWx0aXBsZVRleHRHZW9tZXRyeShlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBkcmF3U2hhcGVUZXh0ID0gZWxlbWVudC50ZXh0cy5maW5kKChpdGVtKSA9PiBpdGVtLmlkLmluY2x1ZGVzKEdlb21ldHJ5Q29tbW9uVGV4dEtleXMuY29udGVudCkpO1xuICAgICAgICByZXR1cm4gZHJhd1NoYXBlVGV4dD8udGV4dC5hbGlnbiB8fCBBbGlnbm1lbnQuY2VudGVyO1xuICAgIH1cbiAgICBpZiAoaXNTaW5nbGVUZXh0R2VvbWV0cnkoZWxlbWVudCBhcyBQbGFpdENvbW1vbkdlb21ldHJ5KSkge1xuICAgICAgICByZXR1cm4gKGVsZW1lbnQgYXMgUGxhaXRHZW9tZXRyeSkudGV4dD8uYWxpZ24gfHwgQWxpZ25tZW50LmNlbnRlcjtcbiAgICB9XG5cbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc0VsZW1lbnRCeVRhYmxlKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VGV4dENlbGwgPSBlbGVtZW50LmNlbGxzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udGV4dCk7XG4gICAgICAgIHJldHVybiBmaXJzdFRleHRDZWxsPy50ZXh0Py5hbGlnbiB8fCBBbGlnbm1lbnQuY2VudGVyO1xuICAgIH1cbiAgICByZXR1cm4gQWxpZ25tZW50LmNlbnRlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Nsb3NlZFBvaW50cyA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBzdGFydFBvaW50ID0gcG9pbnRzWzBdO1xuICAgIGNvbnN0IGVuZFBvaW50ID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gc3RhcnRQb2ludFswXSA9PT0gZW5kUG9pbnRbMF0gJiYgc3RhcnRQb2ludFsxXSA9PT0gZW5kUG9pbnRbMV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEdlb21ldHJ5VGV4dCA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIHJldHVybiBnZXRJMThuVmFsdWUoYm9hcmQsIERyYXdJMThuS2V5Lmdlb21ldHJ5VGV4dCwgRGVmYXVsdFRleHRQcm9wZXJ0eS50ZXh0KTtcbn07XG4iXX0=
@@ -1,178 +0,0 @@
1
- import { RectangleClient, idCreator, toActiveRectangleFromViewBoxRectangle } from '@plait/core';
2
- import { BasicShapes } from '../interfaces/geometry';
3
- import { DefaultBasicShapeProperty, DefaultBasicShapePropertyMap, DefaultFlowchartPropertyMap, DefaultTextProperty, DefaultUMLPropertyMap, DrawThemeColors, GEOMETRY_NOT_CLOSED, GEOMETRY_WITHOUT_TEXT, ShapeDefaultSpace, getFlowchartPointers, getUMLPointers } from '../constants';
4
- import { Alignment, DEFAULT_FONT_FAMILY, RESIZE_HANDLE_DIAMETER, buildText, getFirstTextManage, measureElement } from '@plait/common';
5
- import { getEngine } from '../engines';
6
- import { getElementShape } from './shape';
7
- import { PlaitDrawElement } from '../interfaces';
8
- import { getMemorizedLatestByPointer } from './memorize';
9
- import { getTextManage } from '../generators/text.generator';
10
- import { createUMLClassOrInterfaceGeometryElement } from './uml';
11
- import { createMultipleTextGeometryElement, isMultipleTextGeometry, isMultipleTextShape } from './multi-text-geometry';
12
- import { DEFAULT_FONT_SIZE } from '@plait/text-plugins';
13
- export const createGeometryElement = (shape, points, text, options = {}, textProperties = {}) => {
14
- if (GEOMETRY_WITHOUT_TEXT.includes(shape)) {
15
- return createGeometryElementWithoutText(shape, points, options);
16
- }
17
- else {
18
- return createGeometryElementWithText(shape, points, text, options, textProperties);
19
- }
20
- };
21
- export const createGeometryElementWithText = (shape, points, text, options = {}, textProperties = {}) => {
22
- let textOptions = {};
23
- let alignment = Alignment.center;
24
- let textHeight = DefaultTextProperty.height;
25
- if (shape === BasicShapes.text) {
26
- textOptions = { autoSize: true };
27
- alignment = undefined;
28
- }
29
- textProperties = { ...textProperties };
30
- textProperties?.align && (alignment = textProperties?.align);
31
- textProperties?.textHeight && (textHeight = textProperties?.textHeight);
32
- delete textProperties?.align;
33
- delete textProperties?.textHeight;
34
- return {
35
- id: idCreator(),
36
- type: 'geometry',
37
- shape,
38
- angle: 0,
39
- opacity: 1,
40
- textHeight,
41
- text: buildText(text, alignment, textProperties),
42
- points,
43
- ...textOptions,
44
- ...options
45
- };
46
- };
47
- export const createGeometryElementWithoutText = (shape, points, options = {}) => {
48
- return {
49
- id: idCreator(),
50
- type: 'geometry',
51
- shape,
52
- angle: 0,
53
- opacity: 1,
54
- points,
55
- ...options
56
- };
57
- };
58
- export const drawGeometry = (board, outerRectangle, shape, roughOptions) => {
59
- return getEngine(shape).draw(board, outerRectangle, roughOptions);
60
- };
61
- export const getNearestPoint = (element, point) => {
62
- const rectangle = RectangleClient.getRectangleByPoints(element.points);
63
- const shape = getElementShape(element);
64
- return getEngine(shape).getNearestPoint(rectangle, point);
65
- };
66
- export const getCenterPointsOnPolygon = (points) => {
67
- const centerPoint = [];
68
- for (let i = 0; i < points.length; i++) {
69
- let j = i == points.length - 1 ? 0 : i + 1;
70
- centerPoint.push([(points[i][0] + points[j][0]) / 2, (points[i][1] + points[j][1]) / 2]);
71
- }
72
- return centerPoint;
73
- };
74
- export const getDefaultFlowchartProperty = (symbol) => {
75
- return DefaultFlowchartPropertyMap[symbol];
76
- };
77
- export const getDefaultBasicShapeProperty = (shape) => {
78
- return DefaultBasicShapePropertyMap[shape] || DefaultBasicShapeProperty;
79
- };
80
- export const getDefaultUMLProperty = (shape) => {
81
- return DefaultUMLPropertyMap[shape];
82
- };
83
- export const getAutoCompletePoints = (board, element, isToActive = false) => {
84
- const AutoCompleteMargin = (12 + RESIZE_HANDLE_DIAMETER / 2) * 2;
85
- const rectangle = RectangleClient.getRectangleByPoints(element.points);
86
- const activeRectangle = toActiveRectangleFromViewBoxRectangle(board, rectangle);
87
- const targetRectangle = isToActive ? activeRectangle : rectangle;
88
- return RectangleClient.getEdgeCenterPoints(RectangleClient.inflate(targetRectangle, AutoCompleteMargin));
89
- };
90
- export const getHitIndexOfAutoCompletePoint = (movingPoint, points) => {
91
- return points.findIndex((point) => {
92
- const movingRectangle = RectangleClient.getRectangleByPoints([movingPoint]);
93
- let rectangle = RectangleClient.getRectangleByPoints([point]);
94
- rectangle = RectangleClient.inflate(rectangle, RESIZE_HANDLE_DIAMETER);
95
- return RectangleClient.isHit(movingRectangle, rectangle);
96
- });
97
- };
98
- export const getDrawDefaultStrokeColor = (theme) => {
99
- return DrawThemeColors[theme].strokeColor;
100
- };
101
- export const getFlowchartDefaultFill = (theme) => {
102
- return DrawThemeColors[theme].fill;
103
- };
104
- export const getTextShapeProperty = (board, text, fontSize) => {
105
- fontSize = fontSize ? Number(fontSize) : DEFAULT_FONT_SIZE;
106
- const textSize = measureElement(buildText(text), { fontSize, fontFamily: DEFAULT_FONT_FAMILY });
107
- return {
108
- width: textSize.width + ShapeDefaultSpace.rectangleAndText * 2,
109
- height: textSize.height
110
- };
111
- };
112
- export const getDefaultGeometryPoints = (pointer, centerPoint) => {
113
- const property = getDefaultGeometryProperty(pointer);
114
- return RectangleClient.getPoints(RectangleClient.getRectangleByCenterPoint(centerPoint, property.width, property.height));
115
- };
116
- export const getDefaultGeometryProperty = (pointer) => {
117
- const isFlowChart = getFlowchartPointers().includes(pointer);
118
- const isUML = getUMLPointers().includes(pointer);
119
- if (isFlowChart) {
120
- return getDefaultFlowchartProperty(pointer);
121
- }
122
- else if (isUML) {
123
- return getDefaultUMLProperty(pointer);
124
- }
125
- else {
126
- return getDefaultBasicShapeProperty(pointer);
127
- }
128
- };
129
- export const getDefaultTextPoints = (board, centerPoint, fontSize) => {
130
- const property = getTextShapeProperty(board, DefaultTextProperty.text, fontSize);
131
- return RectangleClient.getPoints(RectangleClient.getRectangleByCenterPoint(centerPoint, property.width, property.height));
132
- };
133
- export const createTextElement = (board, points, text, textHeight) => {
134
- const memorizedLatest = getMemorizedLatestByPointer(BasicShapes.text);
135
- textHeight = textHeight ? textHeight : RectangleClient.getRectangleByPoints(points).height;
136
- return createGeometryElement(BasicShapes.text, points, text, memorizedLatest.geometryProperties, {
137
- ...memorizedLatest.textProperties,
138
- textHeight
139
- });
140
- };
141
- export const createDefaultGeometry = (board, points, shape) => {
142
- const memorizedLatest = getMemorizedLatestByPointer(shape);
143
- const textHeight = getTextShapeProperty(board, DefaultTextProperty.text, memorizedLatest.textProperties['font-size']).height;
144
- if (PlaitDrawElement.isUMLClassOrInterface({ shape })) {
145
- return createUMLClassOrInterfaceGeometryElement(board, shape, points);
146
- }
147
- if (isMultipleTextShape(shape)) {
148
- return createMultipleTextGeometryElement(shape, points, {
149
- strokeWidth: DefaultBasicShapeProperty.strokeWidth,
150
- ...memorizedLatest.geometryProperties
151
- });
152
- }
153
- else {
154
- return createGeometryElement(shape, points, '', {
155
- strokeWidth: DefaultBasicShapeProperty.strokeWidth,
156
- ...memorizedLatest.geometryProperties
157
- }, { ...memorizedLatest.textProperties, textHeight });
158
- }
159
- };
160
- export const editText = (board, element, text) => {
161
- const textManage = text ? getTextManage(board, element, text) : getFirstTextManage(element);
162
- if (textManage) {
163
- textManage.edit(() => { });
164
- }
165
- };
166
- export const isGeometryIncludeText = (element) => {
167
- return isSingleTextGeometry(element) || isMultipleTextGeometry(element);
168
- };
169
- export const isSingleTextShape = (shape) => {
170
- return !GEOMETRY_WITHOUT_TEXT.includes(shape) && !isMultipleTextShape(shape);
171
- };
172
- export const isSingleTextGeometry = (element) => {
173
- return PlaitDrawElement.isGeometry(element) && isSingleTextShape(element.shape);
174
- };
175
- export const isGeometryClosed = (element) => {
176
- return !GEOMETRY_NOT_CLOSED.includes(element.shape);
177
- };
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUgsZUFBZSxFQUdmLFNBQVMsRUFDVCxxQ0FBcUMsRUFDeEMsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFrQixXQUFXLEVBQStDLE1BQU0sd0JBQXdCLENBQUM7QUFFbEgsT0FBTyxFQUNILHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIsMkJBQTJCLEVBQzNCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFFckIsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2pCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFFSCxTQUFTLEVBRVQsbUJBQW1CLEVBRW5CLHNCQUFzQixFQUN0QixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pELE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxzQkFBc0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBTXhELE1BQU0sQ0FBQyxN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bnQiOlsiaW1wb3J0IHtcbiAgICBQbGFpdEJvYXJkLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBQb2ludCxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgVGhlbWVDb2xvck1vZGUsXG4gICAgZ2V0U2VsZWN0ZWRFbGVtZW50cyxcbiAgICBpZENyZWF0b3IsXG4gICAgdG9BY3RpdmVSZWN0YW5nbGVGcm9tVmlld0JveFJlY3RhbmdsZVxufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBHZW9tZXRyeVNoYXBlcywgQmFzaWNTaGFwZXMsIFBsYWl0R2VvbWV0cnksIEZsb3djaGFydFN5bWJvbHMsIFVNTFN5bWJvbHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dlb21ldHJ5JztcbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQge1xuICAgIERlZmF1bHRCYXNpY1NoYXBlUHJvcGVydHksXG4gICAgRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eU1hcCxcbiAgICBEZWZhdWx0Rmxvd2NoYXJ0UHJvcGVydHlNYXAsXG4gICAgRGVmYXVsdFRleHRQcm9wZXJ0eSxcbiAgICBEZWZhdWx0VU1MUHJvcGVydHlNYXAsXG4gICAgRHJhd1BvaW50ZXJUeXBlLFxuICAgIERyYXdUaGVtZUNvbG9ycyxcbiAgICBHRU9NRVRSWV9OT1RfQ0xPU0VELFxuICAgIEdFT01FVFJZX1dJVEhPVVRfVEVYVCxcbiAgICBTaGFwZURlZmF1bHRTcGFjZSxcbiAgICBnZXRGbG93Y2hhcnRQb2ludGVycyxcbiAgICBnZXRVTUxQb2ludGVyc1xufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgICBBY3RpdmVHZW5lcmF0b3IsXG4gICAgQWxpZ25tZW50LFxuICAgIEN1c3RvbVRleHQsXG4gICAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgICBQbGFpdENvbW1vbkVsZW1lbnRSZWYsXG4gICAgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUixcbiAgICBidWlsZFRleHQsXG4gICAgZ2V0Rmlyc3RUZXh0TWFuYWdlLFxuICAgIG1lYXN1cmVFbGVtZW50XG59IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ3JvdWdoanMvYmluL2NvcmUnO1xuaW1wb3J0IHsgZ2V0RW5naW5lIH0gZnJvbSAnLi4vZW5naW5lcyc7XG5pbXBvcnQgeyBnZXRFbGVtZW50U2hhcGUgfSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IFBsYWl0RHJhd0VsZW1lbnQsIFBsYWl0U2hhcGVFbGVtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRNZW1vcml6ZWRMYXRlc3RCeVBvaW50ZXIgfSBmcm9tICcuL21lbW9yaXplJztcbmltcG9ydCB7IERyYXdUZXh0SW5mbywgZ2V0VGV4dE1hbmFnZSB9IGZyb20gJy4uL2dlbmVyYXRvcnMvdGV4dC5nZW5lcmF0b3InO1xuaW1wb3J0IHsgY3JlYXRlVU1MQ2xhc3NPckludGVyZmFjZUdlb21ldHJ5RWxlbWVudCB9IGZyb20gJy4vdW1sJztcbmltcG9ydCB7IGNyZWF0ZU11bHRpcGxlVGV4dEdlb21ldHJ5RWxlbWVudCwgaXNNdWx0aXBsZVRleHRHZW9tZXRyeSwgaXNNdWx0aXBsZVRleHRTaGFwZSB9IGZyb20gJy4vbXVsdGktdGV4dC1nZW9tZXRyeSc7XG5pbXBvcnQgeyBERUZBVUxUX0ZPTlRfU0laRSB9IGZyb20gJ0BwbGFpdC90ZXh0LXBsdWdpbnMnO1xuXG5leHBvcnQgdHlwZSBHZW9tZXRyeVN0eWxlT3B0aW9ucyA9IFBpY2s8UGxhaXRHZW9tZXRyeSwgJ2ZpbGwnIHwgJ3N0cm9rZUNvbG9yJyB8ICdzdHJva2VXaWR0aCc+O1xuXG5leHBvcnQgdHlwZSBUZXh0UHJvcGVydGllcyA9IFBhcnRpYWw8Q3VzdG9tVGV4dD4gJiB7IGFsaWduPzogQWxpZ25tZW50OyB0ZXh0SGVpZ2h0PzogbnVtYmVyIH07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHZW9tZXRyeUVsZW1lbnQgPSAoXG4gICAgc2hhcGU6IEdlb21ldHJ5U2hhcGVzLFxuICAgIHBvaW50czogW1BvaW50LCBQb2ludF0sXG4gICAgdGV4dDogc3RyaW5nIHwgRWxlbWVudCxcbiAgICBvcHRpb25zOiBHZW9tZXRyeVN0eWxlT3B0aW9ucyA9IHt9LFxuICAgIHRleHRQcm9wZXJ0aWVzOiBUZXh0UHJvcGVydGllcyA9IHt9XG4pOiBQbGFpdEdlb21ldHJ5ID0+IHtcbiAgICBpZiAoR0VPTUVUUllfV0lUSE9VVF9URVhULmluY2x1ZGVzKHNoYXBlKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlR2VvbWV0cnlFbGVtZW50V2l0aG91dFRleHQoc2hhcGUsIHBvaW50cywgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUdlb21ldHJ5RWxlbWVudFdpdGhUZXh0KHNoYXBlLCBwb2ludHMsIHRleHQsIG9wdGlvbnMsIHRleHRQcm9wZXJ0aWVzKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlR2VvbWV0cnlFbGVtZW50V2l0aFRleHQgPSAoXG4gICAgc2hhcGU6IEdlb21ldHJ5U2hhcGVzLFxuICAgIHBvaW50czogW1BvaW50LCBQb2ludF0sXG4gICAgdGV4dDogc3RyaW5nIHwgRWxlbWVudCxcbiAgICBvcHRpb25zOiBHZW9tZXRyeVN0eWxlT3B0aW9ucyA9IHt9LFxuICAgIHRleHRQcm9wZXJ0aWVzOiBUZXh0UHJvcGVydGllcyA9IHt9XG4pOiBQbGFpdEdlb21ldHJ5ID0+IHtcbiAgICBsZXQgdGV4dE9wdGlvbnMgPSB7fTtcbiAgICBsZXQgYWxpZ25tZW50OiB1bmRlZmluZWQgfCBBbGlnbm1lbnQgPSBBbGlnbm1lbnQuY2VudGVyO1xuICAgIGxldCB0ZXh0SGVpZ2h0ID0gRGVmYXVsdFRleHRQcm9wZXJ0eS5oZWlnaHQ7XG4gICAgaWYgKHNoYXBlID09PSBCYXNpY1NoYXBlcy50ZXh0KSB7XG4gICAgICAgIHRleHRPcHRpb25zID0geyBhdXRvU2l6ZTogdHJ1ZSB9O1xuICAgICAgICBhbGlnbm1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHRQcm9wZXJ0aWVzID0geyAuLi50ZXh0UHJvcGVydGllcyB9O1xuICAgIHRleHRQcm9wZXJ0aWVzPy5hbGlnbiAmJiAoYWxpZ25tZW50ID0gdGV4dFByb3BlcnRpZXM/LmFsaWduKTtcbiAgICB0ZXh0UHJvcGVydGllcz8udGV4dEhlaWdodCAmJiAodGV4dEhlaWdodCA9IHRleHRQcm9wZXJ0aWVzPy50ZXh0SGVpZ2h0KTtcbiAgICBkZWxldGUgdGV4dFByb3BlcnRpZXM/LmFsaWduO1xuICAgIGRlbGV0ZSB0ZXh0UHJvcGVydGllcz8udGV4dEhlaWdodDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZENyZWF0b3IoKSxcbiAgICAgICAgdHlwZTogJ2dlb21ldHJ5JyxcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIGFuZ2xlOiAwLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICB0ZXh0SGVpZ2h0LFxuICAgICAgICB0ZXh0OiBidWlsZFRleHQodGV4dCwgYWxpZ25tZW50LCB0ZXh0UHJvcGVydGllcyksXG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgLi4udGV4dE9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdlb21ldHJ5RWxlbWVudFdpdGhvdXRUZXh0ID0gKFxuICAgIHNoYXBlOiBHZW9tZXRyeVNoYXBlcyxcbiAgICBwb2ludHM6IFtQb2ludCwgUG9pbnRdLFxuICAgIG9wdGlvbnM6IEdlb21ldHJ5U3R5bGVPcHRpb25zID0ge31cbik6IFBsYWl0R2VvbWV0cnkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZENyZWF0b3IoKSxcbiAgICAgICAgdHlwZTogJ2dlb21ldHJ5JyxcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIGFuZ2xlOiAwLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICBwb2ludHMsXG4gICAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGRyYXdHZW9tZXRyeSA9IChib2FyZDogUGxhaXRCb2FyZCwgb3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgc2hhcGU6IEdlb21ldHJ5U2hhcGVzLCByb3VnaE9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gZ2V0RW5naW5lKHNoYXBlKS5kcmF3KGJvYXJkLCBvdXRlclJlY3RhbmdsZSwgcm91Z2hPcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXROZWFyZXN0UG9pbnQgPSAoZWxlbWVudDogUGxhaXRTaGFwZUVsZW1lbnQsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRFbGVtZW50U2hhcGUoZWxlbWVudCk7XG4gICAgcmV0dXJuIGdldEVuZ2luZShzaGFwZSkuZ2V0TmVhcmVzdFBvaW50KHJlY3RhbmdsZSwgcG9pbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENlbnRlclBvaW50c09uUG9seWdvbiA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBjZW50ZXJQb2ludDogUG9pbnRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBqID0gaSA9PSBwb2ludHMubGVuZ3RoIC0gMSA/IDAgOiBpICsgMTtcbiAgICAgICAgY2VudGVyUG9pbnQucHVzaChbKHBvaW50c1tpXVswXSArIHBvaW50c1tqXVswXSkgLyAyLCAocG9pbnRzW2ldWzFdICsgcG9pbnRzW2pdWzFdKSAvIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlbnRlclBvaW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRGbG93Y2hhcnRQcm9wZXJ0eSA9IChzeW1ib2w6IEZsb3djaGFydFN5bWJvbHMpID0+IHtcbiAgICByZXR1cm4gRGVmYXVsdEZsb3djaGFydFByb3BlcnR5TWFwW3N5bWJvbF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eSA9IChzaGFwZTogQmFzaWNTaGFwZXMpID0+IHtcbiAgICByZXR1cm4gRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eU1hcFtzaGFwZV0gfHwgRGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0VU1MUHJvcGVydHkgPSAoc2hhcGU6IFVNTFN5bWJvbHMpID0+IHtcbiAgICByZXR1cm4gRGVmYXVsdFVNTFByb3BlcnR5TWFwW3NoYXBlXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBdXRvQ29tcGxldGVQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0U2hhcGVFbGVtZW50LCBpc1RvQWN0aXZlID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBBdXRvQ29tcGxldGVNYXJnaW4gPSAoMTIgKyBSRVNJWkVfSEFORExFX0RJQU1FVEVSIC8gMikgKiAyO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3QgYWN0aXZlUmVjdGFuZ2xlID0gdG9BY3RpdmVSZWN0YW5nbGVGcm9tVmlld0JveFJlY3RhbmdsZShib2FyZCwgcmVjdGFuZ2xlKTtcbiAgICBjb25zdCB0YXJnZXRSZWN0YW5nbGUgPSBpc1RvQWN0aXZlID8gYWN0aXZlUmVjdGFuZ2xlIDogcmVjdGFuZ2xlO1xuICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuZ2V0RWRnZUNlbnRlclBvaW50cyhSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZSh0YXJnZXRSZWN0YW5nbGUsIEF1dG9Db21wbGV0ZU1hcmdpbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdEluZGV4T2ZBdXRvQ29tcGxldGVQb2ludCA9IChtb3ZpbmdQb2ludDogUG9pbnQsIHBvaW50czogUG9pbnRbXSkgPT4ge1xuICAgIHJldHVybiBwb2ludHMuZmluZEluZGV4KChwb2ludCkgPT4ge1xuICAgICAgICBjb25zdCBtb3ZpbmdSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW21vdmluZ1BvaW50XSk7XG4gICAgICAgIGxldCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3BvaW50XSk7XG4gICAgICAgIHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHJlY3RhbmdsZSwgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUik7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQobW92aW5nUmVjdGFuZ2xlLCByZWN0YW5nbGUpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERyYXdEZWZhdWx0U3Ryb2tlQ29sb3IgPSAodGhlbWU6IFRoZW1lQ29sb3JNb2RlKSA9PiB7XG4gICAgcmV0dXJuIERyYXdUaGVtZUNvbG9yc1t0aGVtZV0uc3Ryb2tlQ29sb3I7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Rmxvd2NoYXJ0RGVmYXVsdEZpbGwgPSAodGhlbWU6IFRoZW1lQ29sb3JNb2RlKSA9PiB7XG4gICAgcmV0dXJuIERyYXdUaGVtZUNvbG9yc1t0aGVtZV0uZmlsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0U2hhcGVQcm9wZXJ0eSA9IChib2FyZDogUGxhaXRCb2FyZCwgdGV4dDogc3RyaW5nIHwgRWxlbWVudCwgZm9udFNpemU/OiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBmb250U2l6ZSA9IGZvbnRTaXplID8gTnVtYmVyKGZvbnRTaXplKSA6IERFRkFVTFRfRk9OVF9TSVpFO1xuICAgIGNvbnN0IHRleHRTaXplID0gbWVhc3VyZUVsZW1lbnQoYnVpbGRUZXh0KHRleHQpLCB7IGZvbnRTaXplLCBmb250RmFtaWx5OiBERUZBVUxUX0ZPTlRfRkFNSUxZIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB0ZXh0U2l6ZS53aWR0aCArIFNoYXBlRGVmYXVsdFNwYWNlLnJlY3RhbmdsZUFuZFRleHQgKiAyLFxuICAgICAgICBoZWlnaHQ6IHRleHRTaXplLmhlaWdodFxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEdlb21ldHJ5UG9pbnRzID0gKHBvaW50ZXI6IERyYXdQb2ludGVyVHlwZSwgY2VudGVyUG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBnZXREZWZhdWx0R2VvbWV0cnlQcm9wZXJ0eShwb2ludGVyKTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlDZW50ZXJQb2ludChjZW50ZXJQb2ludCwgcHJvcGVydHkud2lkdGgsIHByb3BlcnR5LmhlaWdodCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRHZW9tZXRyeVByb3BlcnR5ID0gKHBvaW50ZXI6IERyYXdQb2ludGVyVHlwZSkgPT4ge1xuICAgIGNvbnN0IGlzRmxvd0NoYXJ0ID0gZ2V0Rmxvd2NoYXJ0UG9pbnRlcnMoKS5pbmNsdWRlcyhwb2ludGVyKTtcbiAgICBjb25zdCBpc1VNTCA9IGdldFVNTFBvaW50ZXJzKCkuaW5jbHVkZXMocG9pbnRlcik7XG4gICAgaWYgKGlzRmxvd0NoYXJ0KSB7XG4gICAgICAgIHJldHVybiBnZXREZWZhdWx0Rmxvd2NoYXJ0UHJvcGVydHkocG9pbnRlciBhcyBGbG93Y2hhcnRTeW1ib2xzKTtcbiAgICB9IGVsc2UgaWYgKGlzVU1MKSB7XG4gICAgICAgIHJldHVybiBnZXREZWZhdWx0VU1MUHJvcGVydHkocG9pbnRlciBhcyBVTUxTeW1ib2xzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdEJhc2ljU2hhcGVQcm9wZXJ0eShwb2ludGVyIGFzIEJhc2ljU2hhcGVzKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFRleHRQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGNlbnRlclBvaW50OiBQb2ludCwgZm9udFNpemU/OiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGdldFRleHRTaGFwZVByb3BlcnR5KGJvYXJkLCBEZWZhdWx0VGV4dFByb3BlcnR5LnRleHQsIGZvbnRTaXplKTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlDZW50ZXJQb2ludChjZW50ZXJQb2ludCwgcHJvcGVydHkud2lkdGgsIHByb3BlcnR5LmhlaWdodCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRleHRFbGVtZW50ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludHM6IFtQb2ludCwgUG9pbnRdLCB0ZXh0OiBzdHJpbmcgfCBFbGVtZW50LCB0ZXh0SGVpZ2h0PzogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgbWVtb3JpemVkTGF0ZXN0ID0gZ2V0TWVtb3JpemVkTGF0ZXN0QnlQb2ludGVyKEJhc2ljU2hhcGVzLnRleHQpO1xuICAgIHRleHRIZWlnaHQgPSB0ZXh0SGVpZ2h0ID8gdGV4dEhlaWdodCA6IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhwb2ludHMpLmhlaWdodDtcbiAgICByZXR1cm4gY3JlYXRlR2VvbWV0cnlFbGVtZW50KEJhc2ljU2hhcGVzLnRleHQsIHBvaW50cywgdGV4dCwgbWVtb3JpemVkTGF0ZXN0Lmdlb21ldHJ5UHJvcGVydGllcyBhcyBHZW9tZXRyeVN0eWxlT3B0aW9ucywge1xuICAgICAgICAuLi5tZW1vcml6ZWRMYXRlc3QudGV4dFByb3BlcnRpZXMsXG4gICAgICAgIHRleHRIZWlnaHRcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVEZWZhdWx0R2VvbWV0cnkgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50czogW1BvaW50LCBQb2ludF0sIHNoYXBlOiBHZW9tZXRyeVNoYXBlcykgPT4ge1xuICAgIGNvbnN0IG1lbW9yaXplZExhdGVzdCA9IGdldE1lbW9yaXplZExhdGVzdEJ5UG9pbnRlcihzaGFwZSk7XG4gICAgY29uc3QgdGV4dEhlaWdodCA9IGdldFRleHRTaGFwZVByb3BlcnR5KGJvYXJkLCBEZWZhdWx0VGV4dFByb3BlcnR5LnRleHQsIG1lbW9yaXplZExhdGVzdC50ZXh0UHJvcGVydGllc1snZm9udC1zaXplJ10pLmhlaWdodDtcbiAgICBpZiAoUGxhaXREcmF3RWxlbWVudC5pc1VNTENsYXNzT3JJbnRlcmZhY2UoeyBzaGFwZSB9KSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlVU1MQ2xhc3NPckludGVyZmFjZUdlb21ldHJ5RWxlbWVudChib2FyZCwgc2hhcGUsIHBvaW50cyk7XG4gICAgfVxuICAgIGlmIChpc011bHRpcGxlVGV4dFNoYXBlKHNoYXBlKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTXVsdGlwbGVUZXh0R2VvbWV0cnlFbGVtZW50KHNoYXBlLCBwb2ludHMsIHtcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBEZWZhdWx0QmFzaWNTaGFwZVByb3BlcnR5LnN0cm9rZVdpZHRoLFxuICAgICAgICAgICAgLi4uKG1lbW9yaXplZExhdGVzdC5nZW9tZXRyeVByb3BlcnRpZXMgYXMgR2VvbWV0cnlTdHlsZU9wdGlvbnMpXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVHZW9tZXRyeUVsZW1lbnQoXG4gICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgIHBvaW50cyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBEZWZhdWx0QmFzaWNTaGFwZVByb3BlcnR5LnN0cm9rZVdpZHRoLFxuICAgICAgICAgICAgICAgIC4uLihtZW1vcml6ZWRMYXRlc3QuZ2VvbWV0cnlQcm9wZXJ0aWVzIGFzIEdlb21ldHJ5U3R5bGVPcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgLi4ubWVtb3JpemVkTGF0ZXN0LnRleHRQcm9wZXJ0aWVzLCB0ZXh0SGVpZ2h0IH1cbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZWRpdFRleHQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnksIHRleHQ/OiBEcmF3VGV4dEluZm8pID0+IHtcbiAgICBjb25zdCB0ZXh0TWFuYWdlID0gdGV4dCA/IGdldFRleHRNYW5hZ2UoYm9hcmQsIGVsZW1lbnQsIHRleHQpIDogZ2V0Rmlyc3RUZXh0TWFuYWdlKGVsZW1lbnQpO1xuICAgIGlmICh0ZXh0TWFuYWdlKSB7XG4gICAgICAgIHRleHRNYW5hZ2UuZWRpdCgoKSA9PiB7fSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzR2VvbWV0cnlJbmNsdWRlVGV4dCA9IChlbGVtZW50OiBQbGFpdEdlb21ldHJ5KSA9PiB7XG4gICAgcmV0dXJuIGlzU2luZ2xlVGV4dEdlb21ldHJ5KGVsZW1lbnQpIHx8IGlzTXVsdGlwbGVUZXh0R2VvbWV0cnkoZWxlbWVudCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNTaW5nbGVUZXh0U2hhcGUgPSAoc2hhcGU6IEdlb21ldHJ5U2hhcGVzKSA9PiB7XG4gICAgcmV0dXJuICFHRU9NRVRSWV9XSVRIT1VUX1RFWFQuaW5jbHVkZXMoc2hhcGUpICYmICFpc011bHRpcGxlVGV4dFNoYXBlKHNoYXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1NpbmdsZVRleHRHZW9tZXRyeSA9IChlbGVtZW50OiBQbGFpdEdlb21ldHJ5KSA9PiB7XG4gICAgcmV0dXJuIFBsYWl0RHJhd0VsZW1lbnQuaXNHZW9tZXRyeShlbGVtZW50KSAmJiBpc1NpbmdsZVRleHRTaGFwZShlbGVtZW50LnNoYXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0dlb21ldHJ5Q2xvc2VkID0gKGVsZW1lbnQ6IFBsYWl0R2VvbWV0cnkpID0+IHtcbiAgICByZXR1cm4gIUdFT01FVFJZX05PVF9DTE9TRUQuaW5jbHVkZXMoZWxlbWVudC5zaGFwZSk7XG59O1xuIl19