@colijnit/sharedcomponents 1.0.57 → 1.0.58

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 (157) hide show
  1. package/bundles/colijnit-sharedcomponents.umd.js +3555 -6
  2. package/bundles/colijnit-sharedcomponents.umd.js.map +1 -1
  3. package/colijnit-sharedcomponents.d.ts +17 -0
  4. package/colijnit-sharedcomponents.metadata.json +1 -1
  5. package/esm2015/colijnit-sharedcomponents.js +18 -1
  6. package/esm2015/lib/businessobject/build-images-and-documentation-result.js +2 -0
  7. package/esm2015/lib/businessobject/co-document-right.bo.js +3 -0
  8. package/esm2015/lib/businessobject/drag-drop-container-element.js +2 -0
  9. package/esm2015/lib/businessobject/drag-drop-container.js +7 -0
  10. package/esm2015/lib/components/activity-list/activity-list.component.js +130 -0
  11. package/esm2015/lib/components/activity-list/activity-list.module.js +24 -0
  12. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.component.js +47 -0
  13. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.module.js +20 -0
  14. package/esm2015/lib/components/file-upload/file-upload.component.js +189 -0
  15. package/esm2015/lib/components/file-upload/file-upload.module.js +25 -0
  16. package/esm2015/lib/components/file-upload-popup/file-upload-popup.component.js +397 -0
  17. package/esm2015/lib/components/file-upload-popup/file-upload-popup.module.js +30 -0
  18. package/esm2015/lib/components/files-upload/components/base-file-upload.component.js +469 -0
  19. package/esm2015/lib/components/files-upload/components/drag-drop-container.component.js +115 -0
  20. package/esm2015/lib/components/files-upload/files-upload.component.js +131 -0
  21. package/esm2015/lib/components/files-upload/files-upload.module.js +47 -0
  22. package/esm2015/lib/components/image-display/image-display.component.js +36 -0
  23. package/esm2015/lib/components/image-display/image-display.module.js +23 -0
  24. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.component.js +89 -0
  25. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.module.js +21 -0
  26. package/esm2015/lib/components/tile-renderer/tile-render.component.js +80 -0
  27. package/esm2015/lib/components/tile-renderer/tile-render.module.js +26 -0
  28. package/esm2015/lib/decorator/input-boolean.decorator.js +34 -0
  29. package/esm2015/lib/enum/document-email-report.enum.js +18 -0
  30. package/esm2015/lib/enum/domain-multiple-name.enum.js +13 -0
  31. package/esm2015/lib/enum/file-type.js +14 -0
  32. package/esm2015/lib/enum/files-upload-config-objects.js +3 -0
  33. package/esm2015/lib/enum/icon.enum.js +7 -1
  34. package/esm2015/lib/enum/internal-param.enum.js +38 -0
  35. package/esm2015/lib/enum/read-write-access-config-names.enum.js +2 -0
  36. package/esm2015/lib/enum/table-name.enum.js +86 -0
  37. package/esm2015/lib/enum/tag-category.enum.js +22 -0
  38. package/esm2015/lib/enum/tags-component-config-names.js +2 -0
  39. package/esm2015/lib/enum/tile-size-type.js +7 -0
  40. package/esm2015/lib/event/co-drag-event.js +2 -0
  41. package/esm2015/lib/event/co-drop-event.js +2 -0
  42. package/esm2015/lib/interface/key-value-pair.js +2 -0
  43. package/esm2015/lib/interface/operation-callback-simple-function.js +4 -0
  44. package/esm2015/lib/model/icon-svg.js +7 -1
  45. package/esm2015/lib/model/tag-tree-item.bo.js +16 -0
  46. package/esm2015/lib/model/tree-object.js +15 -0
  47. package/esm2015/lib/pipe/file-type-image.pipe.js +51 -0
  48. package/esm2015/lib/pipe/master-pipes.js +4 -2
  49. package/esm2015/lib/service/drag-drop.service.js +365 -0
  50. package/esm2015/lib/service/shared-connector.service.js +10 -1
  51. package/esm2015/lib/service/shared.service.js +2 -2
  52. package/esm2015/lib/utils/array-utils.js +202 -0
  53. package/esm2015/lib/utils/check-precision-and-scale-result.js +2 -0
  54. package/esm2015/lib/utils/check-within-stepped-bounds-result.js +2 -0
  55. package/esm2015/lib/utils/co-document-shared-field-logic.js +50 -0
  56. package/esm2015/lib/utils/enum-utils.js +128 -0
  57. package/esm2015/lib/utils/is-nill.function.js +5 -0
  58. package/esm2015/lib/utils/number-utils.js +390 -0
  59. package/esm2015/lib/utils/object-utils.js +278 -0
  60. package/esm2015/lib/utils/ref-code-utils.js +49 -0
  61. package/esm2015/lib/utils/string-utils.js +30 -1
  62. package/esm2015/public-api.js +5 -1
  63. package/fesm2015/colijnit-sharedcomponents.js +3528 -6
  64. package/fesm2015/colijnit-sharedcomponents.js.map +1 -1
  65. package/lib/businessobject/build-images-and-documentation-result.d.ts +5 -0
  66. package/lib/businessobject/co-document-right.bo.d.ts +6 -0
  67. package/lib/businessobject/drag-drop-container-element.d.ts +6 -0
  68. package/lib/businessobject/drag-drop-container.d.ts +6 -0
  69. package/lib/components/access/read-write-access.scss +25 -0
  70. package/lib/components/access/style/_layout.scss +23 -0
  71. package/lib/components/access/style/_material-definition.scss +12 -0
  72. package/lib/components/access/style/_theme.scss +4 -0
  73. package/lib/components/access/style/material.scss +4 -0
  74. package/lib/components/activity-list/activity-list.component.d.ts +33 -0
  75. package/lib/components/activity-list/activity-list.module.d.ts +2 -0
  76. package/lib/components/activity-list/style/_layout.scss +68 -0
  77. package/lib/components/activity-list/style/_material-definition.scss +0 -0
  78. package/lib/components/activity-list/style/_theme.scss +4 -0
  79. package/lib/components/activity-list/style/material.scss +4 -0
  80. package/lib/components/app-file-dropzone/app-file-dropzone.component.d.ts +14 -0
  81. package/lib/components/app-file-dropzone/app-file-dropzone.module.d.ts +2 -0
  82. package/lib/components/app-file-dropzone/style/_layout.scss +61 -0
  83. package/lib/components/app-file-dropzone/style/_material-definition.scss +0 -0
  84. package/lib/components/app-file-dropzone/style/_theme.scss +4 -0
  85. package/lib/components/app-file-dropzone/style/material.scss +4 -0
  86. package/lib/components/file-upload/file-upload.component.d.ts +42 -0
  87. package/lib/components/file-upload/file-upload.module.d.ts +2 -0
  88. package/lib/components/file-upload/style/_layout.scss +59 -0
  89. package/lib/components/file-upload/style/_material-definition.scss +2 -0
  90. package/lib/components/file-upload/style/_theme.scss +4 -0
  91. package/lib/components/file-upload/style/material.scss +4 -0
  92. package/lib/components/file-upload-popup/file-upload-popup.component.d.ts +75 -0
  93. package/lib/components/file-upload-popup/file-upload-popup.module.d.ts +2 -0
  94. package/lib/components/file-upload-popup/style/_layout.scss +48 -0
  95. package/lib/components/file-upload-popup/style/_material-definition.scss +2 -0
  96. package/lib/components/file-upload-popup/style/_theme.scss +5 -0
  97. package/lib/components/file-upload-popup/style/material.scss +4 -0
  98. package/lib/components/files-upload/components/base-file-upload.component.d.ts +98 -0
  99. package/lib/components/files-upload/components/drag-drop-container.component.d.ts +34 -0
  100. package/lib/components/files-upload/files-upload.component.d.ts +32 -0
  101. package/lib/components/files-upload/files-upload.module.d.ts +2 -0
  102. package/lib/components/files-upload/style/_layout.scss +49 -0
  103. package/lib/components/files-upload/style/_material-definition.scss +0 -0
  104. package/lib/components/files-upload/style/_theme.scss +5 -0
  105. package/lib/components/files-upload/style/material.scss +4 -0
  106. package/lib/components/image-display/image-display.component.d.ts +14 -0
  107. package/lib/components/image-display/image-display.module.d.ts +2 -0
  108. package/lib/components/image-display/style/_layout.scss +56 -0
  109. package/lib/components/image-display/style/_material-definition.scss +4 -0
  110. package/lib/components/image-display/style/_theme.scss +6 -0
  111. package/lib/components/image-display/style/material.scss +3 -0
  112. package/lib/components/multi-property-toggler/multiple-property-toggler.component.d.ts +27 -0
  113. package/lib/components/multi-property-toggler/multiple-property-toggler.module.d.ts +2 -0
  114. package/lib/components/multi-property-toggler/style/_layout.scss +24 -0
  115. package/lib/components/multi-property-toggler/style/_material-definition.scss +0 -0
  116. package/lib/components/multi-property-toggler/style/_theme.scss +4 -0
  117. package/lib/components/multi-property-toggler/style/material.scss +4 -0
  118. package/lib/components/tile-renderer/style/_layout.scss +90 -0
  119. package/lib/components/tile-renderer/style/_material-definition.scss +0 -0
  120. package/lib/components/tile-renderer/style/_theme.scss +4 -0
  121. package/lib/components/tile-renderer/style/material.scss +4 -0
  122. package/lib/components/tile-renderer/tile-render.component.d.ts +31 -0
  123. package/lib/components/tile-renderer/tile-render.module.d.ts +2 -0
  124. package/lib/decorator/input-boolean.decorator.d.ts +8 -0
  125. package/lib/enum/document-email-report.enum.d.ts +15 -0
  126. package/lib/enum/domain-multiple-name.enum.d.ts +10 -0
  127. package/lib/enum/file-type.d.ts +7 -0
  128. package/lib/enum/files-upload-config-objects.d.ts +22 -0
  129. package/lib/enum/icon.enum.d.ts +6 -0
  130. package/lib/enum/internal-param.enum.d.ts +34 -0
  131. package/lib/enum/read-write-access-config-names.enum.d.ts +4 -0
  132. package/lib/enum/table-name.enum.d.ts +84 -0
  133. package/lib/enum/tag-category.enum.d.ts +19 -0
  134. package/lib/enum/tags-component-config-names.d.ts +4 -0
  135. package/lib/enum/tile-size-type.d.ts +4 -0
  136. package/lib/event/co-drag-event.d.ts +5 -0
  137. package/lib/event/co-drop-event.d.ts +8 -0
  138. package/lib/interface/key-value-pair.d.ts +4 -0
  139. package/lib/interface/operation-callback-simple-function.d.ts +4 -0
  140. package/lib/model/tag-tree-item.bo.d.ts +18 -0
  141. package/lib/model/tree-object.d.ts +8 -0
  142. package/lib/pipe/file-type-image.pipe.d.ts +12 -0
  143. package/lib/service/drag-drop.service.d.ts +86 -0
  144. package/lib/service/shared-connector.service.d.ts +2 -0
  145. package/lib/style/_variables.scss +1 -1
  146. package/lib/utils/array-utils.d.ts +63 -0
  147. package/lib/utils/check-precision-and-scale-result.d.ts +4 -0
  148. package/lib/utils/check-within-stepped-bounds-result.d.ts +8 -0
  149. package/lib/utils/co-document-shared-field-logic.d.ts +7 -0
  150. package/lib/utils/enum-utils.d.ts +31 -0
  151. package/lib/utils/is-nill.function.d.ts +1 -0
  152. package/lib/utils/number-utils.d.ts +125 -0
  153. package/lib/utils/object-utils.d.ts +40 -0
  154. package/lib/utils/ref-code-utils.d.ts +10 -0
  155. package/lib/utils/string-utils.d.ts +16 -0
  156. package/package.json +1 -1
  157. package/public-api.d.ts +4 -0
@@ -0,0 +1,365 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { Subject } from "rxjs";
3
+ import { ArrayUtils } from "../utils/array-utils";
4
+ import { CoOrientation } from "@colijnit/corecomponents_v12";
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Handles drag and drop elements
8
+ */
9
+ export class DragDropService {
10
+ constructor() {
11
+ this.drag = new Subject();
12
+ this.drop = new Subject();
13
+ // Container(s) holding the elements to be dragged.
14
+ this._containers = [];
15
+ this._disabledContainers = [];
16
+ // Drag handle(s) that contains the classes of the handles.
17
+ this._dragHandles = [];
18
+ this._isdragging = false;
19
+ this._clickCounter = 0;
20
+ this._ghostLeft = 0;
21
+ this._ghostTop = 0;
22
+ this._mouseDown = false;
23
+ this._currentMousePosition = { x: 0, y: 0 };
24
+ this._currentMouseOffset = { x: 0, y: 0 };
25
+ // Handles the mouse down event. Saves the current mouse position.
26
+ this._handleMouseDown = (event) => {
27
+ this._currentMousePosition.x = event.screenX;
28
+ this._currentMousePosition.y = event.screenY;
29
+ if (event.buttons !== 1 || event.metaKey || event.ctrlKey) {
30
+ return;
31
+ }
32
+ const element = event.target ? event.target : event.srcElement;
33
+ const dragElement = this._getValidDragDropElement(element, true);
34
+ if (!dragElement) {
35
+ return;
36
+ }
37
+ if (this._disabledContainers.indexOf(dragElement.container) !== -1) {
38
+ return;
39
+ }
40
+ this._dragElement = dragElement;
41
+ this._dragInContainer = dragElement.container.element;
42
+ const offset = this._getOffset();
43
+ this._currentMouseOffset.x = event.clientX - offset.left;
44
+ this._currentMouseOffset.y = event.clientY - offset.top;
45
+ this._mouseDown = true;
46
+ this._handleEventListener(document, "mousemove", this._handleMouseMove);
47
+ this._clickCounter++;
48
+ };
49
+ this._handleMouseUp = (event) => {
50
+ this._mouseDown = false;
51
+ this._handleEventListener(document, "mousemove", this._handleMouseMove, false);
52
+ this._clickCounter--;
53
+ if (this._isdragging) {
54
+ this._endDrag();
55
+ }
56
+ };
57
+ this._handleMouseMove = (event) => {
58
+ // nothing to drag?
59
+ if (!this._dragElement) {
60
+ return;
61
+ }
62
+ // only drag when mouse down and there actually is movement
63
+ if (!this._mouseDown || (this._currentMousePosition.x === event.screenX && this._currentMousePosition.y === event.screenY)) {
64
+ return;
65
+ }
66
+ this._isdragging = true;
67
+ this._startDrag();
68
+ this._drag(event);
69
+ this._currentMousePosition.x = event.screenX;
70
+ this._currentMousePosition.y = event.screenY;
71
+ };
72
+ }
73
+ set renderer(value) {
74
+ this._renderer = value;
75
+ this._setEvents();
76
+ }
77
+ set ghostLeft(value) {
78
+ this._ghostLeft = value;
79
+ this._positionGhostImage();
80
+ }
81
+ set ghostTop(value) {
82
+ this._ghostTop = value;
83
+ this._positionGhostImage();
84
+ }
85
+ ngOnDestroy() {
86
+ this._removeListeners();
87
+ }
88
+ addContainer(container) {
89
+ const direction = (getComputedStyle(container.element).flexDirection === "row" && getComputedStyle(container.element).display === "flex")
90
+ ? CoOrientation.Horizontal
91
+ : CoOrientation.Vertical;
92
+ container.direction = direction;
93
+ this._containers.push(container);
94
+ }
95
+ addDragHandle(handle) {
96
+ this._dragHandles.push(handle);
97
+ }
98
+ removeContainer(container) {
99
+ ArrayUtils.RemoveElement(container, this._containers);
100
+ ArrayUtils.RemoveElement(container, this._disabledContainers);
101
+ if (!this._containers || this._containers.length === 0) {
102
+ this._removeListeners();
103
+ }
104
+ }
105
+ removeDragHandle(handle) {
106
+ ArrayUtils.RemoveElement(handle, this._dragHandles);
107
+ }
108
+ enableContainer(container) {
109
+ ArrayUtils.RemoveElement(container, this._disabledContainers);
110
+ }
111
+ disableContainer(container) {
112
+ this._disabledContainers.push(container);
113
+ }
114
+ _removeListeners() {
115
+ this._handleEventListener(document, "mouseup", this._handleMouseUp, false);
116
+ this._handleEventListener(document, "mousemove", this._handleMouseMove, false);
117
+ }
118
+ _setEvents() {
119
+ this._handleEventListener(document, "mousedown", this._handleMouseDown); //TODO: mousedown only within given containers
120
+ this._handleEventListener(document, "mouseup", this._handleMouseUp);
121
+ }
122
+ _setElementClass(element, elementClass) {
123
+ if (!this._renderer) {
124
+ return;
125
+ }
126
+ this._renderer.addClass(element, elementClass);
127
+ }
128
+ _handleEventListener(element, event, handler, add = true) {
129
+ if (add) {
130
+ element.removeEventListener(event, handler);
131
+ element.addEventListener(event, handler);
132
+ }
133
+ else {
134
+ element.removeEventListener(event, handler);
135
+ }
136
+ }
137
+ // Returns the container that holds given element.
138
+ _getContainerOfElement(element) {
139
+ for (let i = 0, len1 = this._containers.length; i < len1; i++) {
140
+ const container = this._containers[i];
141
+ for (let ii = 0, len2 = container.element.children.length; ii < len2; ii++) {
142
+ if (container.element.children[ii] === element) {
143
+ return container;
144
+ }
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Checks if given element is a child of container(s)
150
+ * @param element
151
+ * @returns {number} index of element
152
+ */
153
+ _getElementOfContainer(element) {
154
+ for (let i = 0, len1 = this._containers.length; i < len1; i++) {
155
+ const container = this._containers[i];
156
+ for (let ii = 0, len2 = container.element.children.length; ii < len2; ii++) {
157
+ if (container.element.children[ii] === element) {
158
+ return { container: container, element: element, elementIdx: ii };
159
+ }
160
+ }
161
+ }
162
+ return { container: undefined, element: undefined, elementIdx: -1 };
163
+ }
164
+ /**
165
+ * Returns next sibling of container that contains given element.
166
+ * @param element
167
+ * @returns {any} null if there are no siblings left
168
+ */
169
+ _getNextElementInContainer(element) {
170
+ const container = this._getContainerOfElement(element);
171
+ for (let i = 0, len = container.element.children.length; i < len; i++) {
172
+ if (container.element.children[i] === element) {
173
+ return i < (len - 1) ? { container: container, element: container.element.children[i + 1], elementIdx: i } : null;
174
+ }
175
+ }
176
+ }
177
+ _getDragHandleClicked(element) {
178
+ if (this._dragHandles && this._dragHandles.length > 0) { // check if handle clicked
179
+ while (element) {
180
+ for (let i = 0, len = this._dragHandles.length; i < len; i++) {
181
+ if (element.classList && element.classList.length > 0 && !!this._dragHandles[i]) {
182
+ if (element.classList.contains(this._dragHandles[i])) {
183
+ return true;
184
+ }
185
+ }
186
+ }
187
+ element = element.parentNode === document ? null : element.parentNode;
188
+ }
189
+ return false;
190
+ }
191
+ else {
192
+ return true;
193
+ }
194
+ }
195
+ // Returns element when it's a valid drop target, false otherwise.
196
+ _getValidDragDropElement(element, checkHandle = false) {
197
+ if (checkHandle) {
198
+ const validHandleClicked = this._getDragHandleClicked(element);
199
+ if (!validHandleClicked) {
200
+ return undefined;
201
+ }
202
+ }
203
+ while (element) {
204
+ const elementOfContainer = this._getElementOfContainer(element);
205
+ if (elementOfContainer.elementIdx > -1) {
206
+ return elementOfContainer;
207
+ }
208
+ element = element.parentNode === document ? null : element.parentNode;
209
+ }
210
+ return undefined;
211
+ }
212
+ _getNextSibling(element) {
213
+ return this._getNextElementInContainer(element);
214
+ }
215
+ // Returns the current index of element within its container.
216
+ _indexOf(element) {
217
+ const elementOfContainer = this._getElementOfContainer(element.hasOwnProperty("element") ? element.element : element);
218
+ return elementOfContainer ? elementOfContainer.elementIdx : -1;
219
+ }
220
+ // Creates a ghost image/element of the element being dragged.
221
+ _createGhostImage() {
222
+ if (this._ghostDragImage) {
223
+ return;
224
+ }
225
+ // create ghost drag image
226
+ const offsetRect = this._getOffset();
227
+ this._ghostDragImage = this._dragElement.element.cloneNode(true);
228
+ this._ghostDragImage.style.width = offsetRect.width + "px";
229
+ this._ghostDragImage.style.height = offsetRect.height + "px";
230
+ this.ghostLeft = offsetRect.left;
231
+ this.ghostTop = offsetRect.top;
232
+ this._setElementClass(this._ghostDragImage, "ghost-image");
233
+ this._setElementClass(document.activeElement, "no-select");
234
+ document.body.appendChild(this._ghostDragImage);
235
+ }
236
+ _destroyGhostImage() {
237
+ if (this._ghostDragImage) {
238
+ this._renderer.removeClass(document.activeElement, "no-select");
239
+ document.body.removeChild(this._ghostDragImage);
240
+ this._ghostDragImage = undefined;
241
+ }
242
+ }
243
+ // Positions the ghost image at the given coordinates.
244
+ _positionGhostImage() {
245
+ if (!this._ghostDragImage) {
246
+ return;
247
+ }
248
+ this._ghostDragImage.style.left = this._ghostLeft + "px";
249
+ this._ghostDragImage.style.top = this._ghostTop + "px";
250
+ }
251
+ _getScroll(scrollProp, offsetProp) {
252
+ if (document.activeElement.clientHeight) {
253
+ return document.activeElement[scrollProp];
254
+ }
255
+ return document.body[scrollProp];
256
+ }
257
+ _getOffset() {
258
+ const rect = this._dragElement.element.getBoundingClientRect();
259
+ const scrollLeft = 0;
260
+ const scrollTop = 0;
261
+ return {
262
+ bottom: rect.bottom,
263
+ height: rect.height,
264
+ left: rect.left + scrollLeft,
265
+ right: rect.right,
266
+ top: rect.top + scrollTop,
267
+ width: rect.width
268
+ };
269
+ }
270
+ _determineDroptarget(element, x, y) {
271
+ const dropElement = this._getValidDragDropElement(element);
272
+ if (dropElement) {
273
+ if (dropElement.element !== this._dragElement.element) {
274
+ this._dropTargetElement = dropElement;
275
+ return;
276
+ }
277
+ }
278
+ this._dropTargetElement = null;
279
+ }
280
+ /**
281
+ * Briefly hides the ghost image to be able to determine which element is under mouse.
282
+ * @param x
283
+ * @param y
284
+ * @returns {Element} Top level element
285
+ */
286
+ _getHoveredElement(x, y) {
287
+ this._setElementClass(this._ghostDragImage, "ghost-image-hide");
288
+ const elm = document.elementFromPoint(x, y);
289
+ this._renderer.removeClass(this._ghostDragImage, "ghost-image-hide");
290
+ return elm;
291
+ }
292
+ _animateVisibility(element, transitionTime = 0.2, start = "0", end = "1") {
293
+ if (!element) {
294
+ return;
295
+ }
296
+ const transitionStyle = "opacity " + transitionTime + "s ease-in-out";
297
+ const transition = element.style.transition;
298
+ element.style.transition = transition + (transition ? "," : "") + transitionStyle;
299
+ element.style.opacity = start;
300
+ element.style.opacity = end;
301
+ return new Promise((resolve) => {
302
+ setTimeout(() => {
303
+ resolve();
304
+ }, transitionTime * 1000);
305
+ });
306
+ }
307
+ _animateMove(parent, dragElement, dropTargetElement, down) {
308
+ if (down) { // insert element before
309
+ parent.insertBefore(dragElement.element, dropTargetElement.element);
310
+ }
311
+ else { // insert after
312
+ parent.insertBefore(dragElement.element, dropTargetElement.element.nextSibling);
313
+ }
314
+ }
315
+ _startDrag() {
316
+ this._createGhostImage();
317
+ this._setElementClass(this._dragElement.element, "is-dragged");
318
+ }
319
+ _drag(event) {
320
+ this.ghostLeft = this._ghostLeft + (event.screenX - this._currentMousePosition.x);
321
+ this.ghostTop = this._ghostTop + (event.screenY - this._currentMousePosition.y);
322
+ const x = event.clientX;
323
+ const y = event.clientY;
324
+ const hoveredElement = this._getHoveredElement(x, y);
325
+ this._determineDroptarget(hoveredElement, x, y);
326
+ if (this._dropTargetElement) {
327
+ const down = (this._dropTargetElement.container.direction === CoOrientation.Vertical && event.screenY > this._currentMousePosition.y) ||
328
+ (this._dropTargetElement.container.direction === CoOrientation.Horizontal && event.screenX > this._currentMousePosition.x);
329
+ this._animateMove(this._dropTargetElement.container.element, this._dragElement, this._dropTargetElement, down);
330
+ this.drag.next({
331
+ element: this._dragElement,
332
+ elementIndex: this._dragElement.elementIdx,
333
+ source: this._dropTargetElement.container.element
334
+ });
335
+ this._lastDropTarget = this._dropTargetElement;
336
+ }
337
+ }
338
+ // element is dropped
339
+ _endDrag() {
340
+ this._renderer.removeClass(this._dragElement.element, "is-dragged");
341
+ this._destroyGhostImage();
342
+ this.drop.next({
343
+ element: this._dragElement.element,
344
+ elementIndex: this._dragElement.elementIdx,
345
+ target: this._lastDropTarget ? this._lastDropTarget.element : null,
346
+ targetIndex: this._lastDropTarget ? this._lastDropTarget.elementIdx : -1,
347
+ container: this._lastDropTarget ? this._lastDropTarget.container : null
348
+ });
349
+ this._resetDrag();
350
+ }
351
+ _resetDrag() {
352
+ this._dragElement = null;
353
+ this._dragInContainer = null;
354
+ this._lastDropTarget = null;
355
+ this._isdragging = false;
356
+ }
357
+ }
358
+ DragDropService.ɵprov = i0.ɵɵdefineInjectable({ factory: function DragDropService_Factory() { return new DragDropService(); }, token: DragDropService, providedIn: "root" });
359
+ DragDropService.decorators = [
360
+ { type: Injectable, args: [{
361
+ providedIn: "root"
362
+ },] }
363
+ ];
364
+ DragDropService.ctorParameters = () => [];
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvc2VydmljZS9kcmFnLWRyb3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksVUFBVSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBSTdCLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7O0FBRzNEOztHQUVHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFtRHhCO1FBMUNPLFNBQUksR0FBeUIsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUN4RCxTQUFJLEdBQXlCLElBQUksT0FBTyxFQUFlLENBQUM7UUFHL0QsbURBQW1EO1FBQzNDLGdCQUFXLEdBQXdCLEVBQUUsQ0FBQztRQUV0Qyx3QkFBbUIsR0FBd0IsRUFBRSxDQUFDO1FBSXRELDJEQUEyRDtRQUNuRCxpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQVM3QixrQkFBYSxHQUFXLENBQUMsQ0FBQztRQVkxQixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGNBQVMsR0FBVyxDQUFDLENBQUM7UUFFdEIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUU1QiwwQkFBcUIsR0FBUSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO1FBQzFDLHdCQUFtQixHQUFRLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7UUFvUWhELGtFQUFrRTtRQUMxRCxxQkFBZ0IsR0FBYSxDQUFDLEtBQWlCLEVBQVEsRUFBRTtZQUM3RCxJQUFJLENB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QUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUMxRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVPLFVBQVU7UUFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7Ozs7WUF6WkosVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUmVuZGVyZXIyfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1N1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Q29Ecm9wRXZlbnR9IGZyb20gXCIuLi9ldmVudC9jby1kcm9wLWV2ZW50XCI7XHJcbmltcG9ydCB7Q29EcmFnRXZlbnR9IGZyb20gXCIuLi9ldmVudC9jby1kcmFnLWV2ZW50XCI7XHJcbmltcG9ydCB7RHJhZ0Ryb3BDb250YWluZXJ9IGZyb20gXCIuLi9idXNpbmVzc29iamVjdC9kcmFnLWRyb3AtY29udGFpbmVyXCI7XHJcbmltcG9ydCB7QXJyYXlVdGlsc30gZnJvbSBcIi4uL3V0aWxzL2FycmF5LXV0aWxzXCI7XHJcbmltcG9ydCB7Q29PcmllbnRhdGlvbn0gZnJvbSBcIkBjb2xpam5pdC9jb3JlY29tcG9uZW50c192MTJcIjtcclxuaW1wb3J0IHtEcmFnRHJvcENvbnRhaW5lckVsZW1lbnR9IGZyb20gXCIuLi9idXNpbmVzc29iamVjdC9kcmFnLWRyb3AtY29udGFpbmVyLWVsZW1lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBIYW5kbGVzIGRyYWcgYW5kIGRyb3AgZWxlbWVudHNcclxuICovXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJhZ0Ryb3BTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICAgIHB1YmxpYyBzZXQgcmVuZGVyZXIodmFsdWU6IFJlbmRlcmVyMikge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fc2V0RXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVG9EbzogdXNlIGRyYWcgYW5kIGRyb3AgU3ViamVjdHMgaW5zdGVhZCBhbmQgdHJhY2sgb3JpZ2luIGFuZCB0YXJnZXQgY29tcG9uZW50c1xyXG4gICAgcHVibGljIGRyYWdEYXRhOiBhbnk7XHJcblxyXG4gICAgcHVibGljIGRyYWc6IFN1YmplY3Q8Q29EcmFnRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Q29EcmFnRXZlbnQ+KCk7XHJcbiAgICBwdWJsaWMgZHJvcDogU3ViamVjdDxDb0Ryb3BFdmVudD4gPSBuZXcgU3ViamVjdDxDb0Ryb3BFdmVudD4oKTtcclxuXHJcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyO1xyXG4gICAgLy8gQ29udGFpbmVyKHMpIGhvbGRpbmcgdGhlIGVsZW1lbnRzIHRvIGJlIGRyYWdnZWQuXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJzOiBEcmFnRHJvcENvbnRhaW5lcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWRDb250YWluZXJzOiBEcmFnRHJvcENvbnRhaW5lcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfZHJvcFRhcmdldEVsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudDtcclxuXHJcbiAgICAvLyBEcmFnIGhhbmRsZShzKSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzc2VzIG9mIHRoZSBoYW5kbGVzLlxyXG4gICAgcHJpdmF0ZSBfZHJhZ0hhbmRsZXM6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIF9pc2RyYWdnaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9kcmFnRWxlbWVudDogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0luQ29udGFpbmVyOiBhbnk7XHJcbiAgICBwcml2YXRlIF9sYXN0RHJvcFRhcmdldDogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50O1xyXG4gICAgLyoqXHJcbiAgICAgKiBHaG9zdCBpbWFnZSBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dob3N0RHJhZ0ltYWdlOiBhbnk7XHJcblxyXG4gICAgcHJpdmF0ZSBfY2xpY2tDb3VudGVyOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgc2V0IGdob3N0TGVmdCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZ2hvc3RMZWZ0ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fcG9zaXRpb25HaG9zdEltYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXQgZ2hvc3RUb3AodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2dob3N0VG9wID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fcG9zaXRpb25HaG9zdEltYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2hvc3RMZWZ0OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZ2hvc3RUb3A6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfbW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfY3VycmVudE1vdXNlUG9zaXRpb246IGFueSA9IHt4OiAwLCB5OiAwfTtcclxuICAgIHByaXZhdGUgX2N1cnJlbnRNb3VzZU9mZnNldDogYW55ID0ge3g6IDAsIHk6IDB9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRDb250YWluZXIoY29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbjogQ29PcmllbnRhdGlvbiA9XHJcbiAgICAgICAgICAgIChnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lci5lbGVtZW50KS5mbGV4RGlyZWN0aW9uID09PSBcInJvd1wiICYmIGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyLmVsZW1lbnQpLmRpc3BsYXkgPT09IFwiZmxleFwiKVxyXG4gICAgICAgICAgICAgICAgPyBDb09yaWVudGF0aW9uLkhvcml6b250YWxcclxuICAgICAgICAgICAgICAgIDogQ29PcmllbnRhdGlvbi5WZXJ0aWNhbDtcclxuICAgICAgICBjb250YWluZXIuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lcnMucHVzaChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGREcmFnSGFuZGxlKGhhbmRsZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0hhbmRsZXMucHVzaChoYW5kbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVDb250YWluZXIoY29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lcik6IHZvaWQge1xyXG4gICAgICAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudChjb250YWluZXIsIHRoaXMuX2NvbnRhaW5lcnMpO1xyXG4gICAgICAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudChjb250YWluZXIsIHRoaXMuX2Rpc2FibGVkQ29udGFpbmVycyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXJzIHx8IHRoaXMuX2NvbnRhaW5lcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlRHJhZ0hhbmRsZShoYW5kbGU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIEFycmF5VXRpbHMuUmVtb3ZlRWxlbWVudChoYW5kbGUsIHRoaXMuX2RyYWdIYW5kbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5hYmxlQ29udGFpbmVyKGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIpOiB2b2lkIHtcclxuICAgICAgICBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnQoY29udGFpbmVyLCB0aGlzLl9kaXNhYmxlZENvbnRhaW5lcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNhYmxlQ29udGFpbmVyKGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kaXNhYmxlZENvbnRhaW5lcnMucHVzaChjb250YWluZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlbW92ZUxpc3RlbmVycygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNldXBcIiwgdGhpcy5faGFuZGxlTW91c2VVcCwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwibW91c2Vtb3ZlXCIsIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldEV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNlZG93blwiLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pOyAvL1RPRE86IG1vdXNlZG93biBvbmx5IHdpdGhpbiBnaXZlbiBjb250YWluZXJzXHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZXVwXCIsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NldEVsZW1lbnRDbGFzcyhlbGVtZW50OiBhbnksIGVsZW1lbnRDbGFzczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9yZW5kZXJlcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsIGVsZW1lbnRDbGFzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaGFuZGxlRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBhbnksIGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IGFueSwgYWRkOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChhZGQpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcclxuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIHRoZSBjb250YWluZXIgdGhhdCBob2xkcyBnaXZlbiBlbGVtZW50LlxyXG4gICAgcHJpdmF0ZSBfZ2V0Q29udGFpbmVyT2ZFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRHJhZ0Ryb3BDb250YWluZXIge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjE6IG51bWJlciA9IHRoaXMuX2NvbnRhaW5lcnMubGVuZ3RoOyBpIDwgbGVuMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIgPSB0aGlzLl9jb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpaTogbnVtYmVyID0gMCwgbGVuMjogbnVtYmVyID0gY29udGFpbmVyLmVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpaSA8IGxlbjI7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpaV0gPT09IGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIGdpdmVuIGVsZW1lbnQgaXMgYSBjaGlsZCBvZiBjb250YWluZXIocylcclxuICAgICAqIEBwYXJhbSBlbGVtZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRleCBvZiBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2dldEVsZW1lbnRPZkNvbnRhaW5lcihlbGVtZW50OiBhbnkpOiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQge1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjE6IG51bWJlciA9IHRoaXMuX2NvbnRhaW5lcnMubGVuZ3RoOyBpIDwgbGVuMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcjogRHJhZ0Ryb3BDb250YWluZXIgPSB0aGlzLl9jb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpaTogbnVtYmVyID0gMCwgbGVuMjogbnVtYmVyID0gY29udGFpbmVyLmVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpaSA8IGxlbjI7IGlpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpaV0gPT09IGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2NvbnRhaW5lcjogY29udGFpbmVyLCBlbGVtZW50OiBlbGVtZW50LCBlbGVtZW50SWR4OiBpaX07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtjb250YWluZXI6IHVuZGVmaW5lZCwgZWxlbWVudDogdW5kZWZpbmVkLCBlbGVtZW50SWR4OiAtMX07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG5leHQgc2libGluZyBvZiBjb250YWluZXIgdGhhdCBjb250YWlucyBnaXZlbiBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnRcclxuICAgICAqIEByZXR1cm5zIHthbnl9IG51bGwgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzIGxlZnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dEVsZW1lbnRJbkNvbnRhaW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lciA9IHRoaXMuX2dldENvbnRhaW5lck9mRWxlbWVudChlbGVtZW50KTtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBsZW46IG51bWJlciA9IGNvbnRhaW5lci5lbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpXSA9PT0gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgPCAobGVuIC0gMSkgPyB7Y29udGFpbmVyOiBjb250YWluZXIsIGVsZW1lbnQ6IDxIVE1MRWxlbWVudD5jb250YWluZXIuZWxlbWVudC5jaGlsZHJlbltpICsgMV0sIGVsZW1lbnRJZHg6IGl9IDogbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXREcmFnSGFuZGxlQ2xpY2tlZChlbGVtZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0hhbmRsZXMgJiYgdGhpcy5fZHJhZ0hhbmRsZXMubGVuZ3RoID4gMCkgeyAvLyBjaGVjayBpZiBoYW5kbGUgY2xpY2tlZFxyXG4gICAgICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSB0aGlzLl9kcmFnSGFuZGxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdCAmJiBlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGggPiAwICYmICEhdGhpcy5fZHJhZ0hhbmRsZXNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHRoaXMuX2RyYWdIYW5kbGVzW2ldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlID09PSBkb2N1bWVudCA/IG51bGwgOiBlbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIGVsZW1lbnQgd2hlbiBpdCdzIGEgdmFsaWQgZHJvcCB0YXJnZXQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgIHByaXZhdGUgX2dldFZhbGlkRHJhZ0Ryb3BFbGVtZW50KGVsZW1lbnQ6IGFueSwgY2hlY2tIYW5kbGU6IGJvb2xlYW4gPSBmYWxzZSk6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKGNoZWNrSGFuZGxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkSGFuZGxlQ2xpY2tlZDogYm9vbGVhbiA9IHRoaXMuX2dldERyYWdIYW5kbGVDbGlja2VkKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBpZiAoIXZhbGlkSGFuZGxlQ2xpY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50T2ZDb250YWluZXI6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnRPZkNvbnRhaW5lcihlbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRPZkNvbnRhaW5lci5lbGVtZW50SWR4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50T2ZDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZG9jdW1lbnQgPyBudWxsIDogZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2dldE5leHRTaWJsaW5nKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRHJhZ0Ryb3BDb250YWluZXJFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TmV4dEVsZW1lbnRJbkNvbnRhaW5lcihlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGluZGV4IG9mIGVsZW1lbnQgd2l0aGluIGl0cyBjb250YWluZXIuXHJcbiAgICBwcml2YXRlIF9pbmRleE9mKGVsZW1lbnQ6IGFueSk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudE9mQ29udGFpbmVyOiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50T2ZDb250YWluZXIoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eShcImVsZW1lbnRcIikgPyBlbGVtZW50LmVsZW1lbnQgOiBlbGVtZW50KTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudE9mQ29udGFpbmVyID8gZWxlbWVudE9mQ29udGFpbmVyLmVsZW1lbnRJZHggOiAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGVzIGEgZ2hvc3QgaW1hZ2UvZWxlbWVudCBvZiB0aGUgZWxlbWVudCBiZWluZyBkcmFnZ2VkLlxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlR2hvc3RJbWFnZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ2hvc3REcmFnSW1hZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjcmVhdGUgZ2hvc3QgZHJhZyBpbWFnZVxyXG4gICAgICAgIGNvbnN0IG9mZnNldFJlY3Q6IGFueSA9IHRoaXMuX2dldE9mZnNldCgpO1xyXG4gICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlID0gdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5fZ2hvc3REcmFnSW1hZ2Uuc3R5bGUud2lkdGggPSBvZmZzZXRSZWN0LndpZHRoICsgXCJweFwiO1xyXG4gICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlLnN0eWxlLmhlaWdodCA9IG9mZnNldFJlY3QuaGVpZ2h0ICsgXCJweFwiO1xyXG4gICAgICAgIHRoaXMuZ2hvc3RMZWZ0ID0gb2Zmc2V0UmVjdC5sZWZ0O1xyXG4gICAgICAgIHRoaXMuZ2hvc3RUb3AgPSBvZmZzZXRSZWN0LnRvcDtcclxuICAgICAgICB0aGlzLl9zZXRFbGVtZW50Q2xhc3ModGhpcy5fZ2hvc3REcmFnSW1hZ2UsIFwiZ2hvc3QtaW1hZ2VcIik7XHJcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudENsYXNzKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIFwibm8tc2VsZWN0XCIpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZ2hvc3REcmFnSW1hZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Rlc3Ryb3lHaG9zdEltYWdlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9naG9zdERyYWdJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBcIm5vLXNlbGVjdFwiKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9naG9zdERyYWdJbWFnZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2dob3N0RHJhZ0ltYWdlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBQb3NpdGlvbnMgdGhlIGdob3N0IGltYWdlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cclxuICAgIHByaXZhdGUgX3Bvc2l0aW9uR2hvc3RJbWFnZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2dob3N0RHJhZ0ltYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZ2hvc3REcmFnSW1hZ2Uuc3R5bGUubGVmdCA9IHRoaXMuX2dob3N0TGVmdCArIFwicHhcIjtcclxuICAgICAgICB0aGlzLl9naG9zdERyYWdJbWFnZS5zdHlsZS50b3AgPSB0aGlzLl9naG9zdFRvcCArIFwicHhcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9nZXRTY3JvbGwoc2Nyb2xsUHJvcDogc3RyaW5nLCBvZmZzZXRQcm9wOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsaWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFtzY3JvbGxQcm9wXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHlbc2Nyb2xsUHJvcF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZ2V0T2Zmc2V0KCk6IENsaWVudFJlY3Qge1xyXG4gICAgICAgIGNvbnN0IHJlY3Q6IENsaWVudFJlY3QgPSB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXHJcbiAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArIHNjcm9sbExlZnQsXHJcbiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxyXG4gICAgICAgICAgICB0b3A6IHJlY3QudG9wICsgc2Nyb2xsVG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lRHJvcHRhcmdldChlbGVtZW50OiBhbnksIHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZHJvcEVsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2dldFZhbGlkRHJhZ0Ryb3BFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChkcm9wRWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoZHJvcEVsZW1lbnQuZWxlbWVudCAhPT0gdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcFRhcmdldEVsZW1lbnQgPSBkcm9wRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCcmllZmx5IGhpZGVzIHRoZSBnaG9zdCBpbWFnZSB0byBiZSBhYmxlIHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50IGlzIHVuZGVyIG1vdXNlLlxyXG4gICAgICogQHBhcmFtIHhcclxuICAgICAqIEBwYXJhbSB5XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gVG9wIGxldmVsIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZ2V0SG92ZXJlZEVsZW1lbnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBhbnkge1xyXG4gICAgICAgIHRoaXMuX3NldEVsZW1lbnRDbGFzcyh0aGlzLl9naG9zdERyYWdJbWFnZSwgXCJnaG9zdC1pbWFnZS1oaWRlXCIpO1xyXG4gICAgICAgIGNvbnN0IGVsbTogYW55ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9naG9zdERyYWdJbWFnZSwgXCJnaG9zdC1pbWFnZS1oaWRlXCIpO1xyXG4gICAgICAgIHJldHVybiBlbG07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0ZVZpc2liaWxpdHkoZWxlbWVudDogYW55LCB0cmFuc2l0aW9uVGltZTogbnVtYmVyID0gMC4yLCBzdGFydDogc3RyaW5nID0gXCIwXCIsIGVuZDogc3RyaW5nID0gXCIxXCIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0cmFuc2l0aW9uU3R5bGU6IHN0cmluZyA9IFwib3BhY2l0eSBcIiArIHRyYW5zaXRpb25UaW1lICsgXCJzIGVhc2UtaW4tb3V0XCI7XHJcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbjogc3RyaW5nID0gZWxlbWVudC5zdHlsZS50cmFuc2l0aW9uO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb24gKyAodHJhbnNpdGlvbiA/IFwiLFwiIDogXCJcIikgKyB0cmFuc2l0aW9uU3R5bGU7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gc3RhcnQ7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gZW5kO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZTogRnVuY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0sIHRyYW5zaXRpb25UaW1lICogMTAwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0ZU1vdmUocGFyZW50OiBIVE1MRWxlbWVudCwgZHJhZ0VsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCwgZHJvcFRhcmdldEVsZW1lbnQ6IERyYWdEcm9wQ29udGFpbmVyRWxlbWVudCwgZG93bjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmIChkb3duKSB7IC8vIGluc2VydCBlbGVtZW50IGJlZm9yZVxyXG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdFbGVtZW50LmVsZW1lbnQsIGRyb3BUYXJnZXRFbGVtZW50LmVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7IC8vIGluc2VydCBhZnRlclxyXG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdFbGVtZW50LmVsZW1lbnQsIGRyb3BUYXJnZXRFbGVtZW50LmVsZW1lbnQubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBIYW5kbGVzIHRoZSBtb3VzZSBkb3duIGV2ZW50LiBTYXZlcyB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbi5cclxuICAgIHByaXZhdGUgX2hhbmRsZU1vdXNlRG93bjogRnVuY3Rpb24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgICB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi54ID0gZXZlbnQuc2NyZWVuWDtcclxuICAgICAgICB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi55ID0gZXZlbnQuc2NyZWVuWTtcclxuICAgICAgICBpZiAoZXZlbnQuYnV0dG9ucyAhPT0gMSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSBldmVudC50YXJnZXQgPyBldmVudC50YXJnZXQgOiBldmVudC5zcmNFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGRyYWdFbGVtZW50OiBEcmFnRHJvcENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9nZXRWYWxpZERyYWdEcm9wRWxlbWVudChlbGVtZW50LCB0cnVlKTtcclxuICAgICAgICBpZiAoIWRyYWdFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkQ29udGFpbmVycy5pbmRleE9mKGRyYWdFbGVtZW50LmNvbnRhaW5lcikgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZHJhZ0VsZW1lbnQgPSBkcmFnRWxlbWVudDtcclxuICAgICAgICB0aGlzLl9kcmFnSW5Db250YWluZXIgPSBkcmFnRWxlbWVudC5jb250YWluZXIuZWxlbWVudDtcclxuICAgICAgICBjb25zdCBvZmZzZXQ6IGFueSA9IHRoaXMuX2dldE9mZnNldCgpO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZU9mZnNldC54ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldC5sZWZ0O1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZU9mZnNldC55ID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldC50b3A7XHJcbiAgICAgICAgdGhpcy5fbW91c2VEb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcIm1vdXNlbW92ZVwiLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrQ291bnRlcisrO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2hhbmRsZU1vdXNlVXA6IEZ1bmN0aW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5fbW91c2VEb3duID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgXCJtb3VzZW1vdmVcIiwgdGhpcy5faGFuZGxlTW91c2VNb3ZlLCBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tDb3VudGVyLS07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc2RyYWdnaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZERyYWcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaGFuZGxlTW91c2VNb3ZlOiBGdW5jdGlvbiA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZHJhZz9cclxuICAgICAgICBpZiAoIXRoaXMuX2RyYWdFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gb25seSBkcmFnIHdoZW4gbW91c2UgZG93biBhbmQgdGhlcmUgYWN0dWFsbHkgaXMgbW92ZW1lbnRcclxuICAgICAgICBpZiAoIXRoaXMuX21vdXNlRG93biB8fCAodGhpcy5fY3VycmVudE1vdXNlUG9zaXRpb24ueCA9PT0gZXZlbnQuc2NyZWVuWCAmJiB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi55ID09PSBldmVudC5zY3JlZW5ZKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzZHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0RHJhZygpO1xyXG4gICAgICAgIHRoaXMuX2RyYWcoZXZlbnQpO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnggPSBldmVudC5zY3JlZW5YO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkgPSBldmVudC5zY3JlZW5ZO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3N0YXJ0RHJhZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jcmVhdGVHaG9zdEltYWdlKCk7XHJcbiAgICAgICAgdGhpcy5fc2V0RWxlbWVudENsYXNzKHRoaXMuX2RyYWdFbGVtZW50LmVsZW1lbnQsIFwiaXMtZHJhZ2dlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9kcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5naG9zdExlZnQgPSB0aGlzLl9naG9zdExlZnQgKyAoZXZlbnQuc2NyZWVuWCAtIHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLngpO1xyXG4gICAgICAgIHRoaXMuZ2hvc3RUb3AgPSB0aGlzLl9naG9zdFRvcCArIChldmVudC5zY3JlZW5ZIC0gdGhpcy5fY3VycmVudE1vdXNlUG9zaXRpb24ueSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHg6IG51bWJlciA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgY29uc3QgeTogbnVtYmVyID0gZXZlbnQuY2xpZW50WTtcclxuICAgICAgICBjb25zdCBob3ZlcmVkRWxlbWVudDogYW55ID0gdGhpcy5fZ2V0SG92ZXJlZEVsZW1lbnQoeCwgeSk7XHJcbiAgICAgICAgdGhpcy5fZGV0ZXJtaW5lRHJvcHRhcmdldChob3ZlcmVkRWxlbWVudCwgeCwgeSk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvd246IGJvb2xlYW4gPVxyXG4gICAgICAgICAgICAgICAgKHRoaXMuX2Ryb3BUYXJnZXRFbGVtZW50LmNvbnRhaW5lci5kaXJlY3Rpb24gPT09IENvT3JpZW50YXRpb24uVmVydGljYWwgJiYgZXZlbnQuc2NyZWVuWSA+IHRoaXMuX2N1cnJlbnRNb3VzZVBvc2l0aW9uLnkpIHx8XHJcbiAgICAgICAgICAgICAgICAodGhpcy5fZHJvcFRhcmdldEVsZW1lbnQuY29udGFpbmVyLmRpcmVjdGlvbiA9PT0gQ29PcmllbnRhdGlvbi5Ib3Jpem9udGFsICYmIGV2ZW50LnNjcmVlblggPiB0aGlzLl9jdXJyZW50TW91c2VQb3NpdGlvbi54KTtcclxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0ZU1vdmUodGhpcy5fZHJvcFRhcmdldEVsZW1lbnQuY29udGFpbmVyLmVsZW1lbnQsIHRoaXMuX2RyYWdFbGVtZW50LCB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudCwgZG93bik7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZy5uZXh0KHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuX2RyYWdFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudEluZGV4OiB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50SWR4LFxyXG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudC5jb250YWluZXIuZWxlbWVudFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdERyb3BUYXJnZXQgPSB0aGlzLl9kcm9wVGFyZ2V0RWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZWxlbWVudCBpcyBkcm9wcGVkXHJcbiAgICBwcml2YXRlIF9lbmREcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2RyYWdFbGVtZW50LmVsZW1lbnQsIFwiaXMtZHJhZ2dlZFwiKTtcclxuICAgICAgICB0aGlzLl9kZXN0cm95R2hvc3RJbWFnZSgpO1xyXG4gICAgICAgIHRoaXMuZHJvcC5uZXh0KHtcclxuICAgICAgICAgICAgZWxlbWVudDogdGhpcy5fZHJhZ0VsZW1lbnQuZWxlbWVudCxcclxuICAgICAgICAgICAgZWxlbWVudEluZGV4OiB0aGlzLl9kcmFnRWxlbWVudC5lbGVtZW50SWR4LFxyXG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMuX2xhc3REcm9wVGFyZ2V0ID8gdGhpcy5fbGFzdERyb3BUYXJnZXQuZWxlbWVudCA6IG51bGwsXHJcbiAgICAgICAgICAgIHRhcmdldEluZGV4OiB0aGlzLl9sYXN0RHJvcFRhcmdldCA/IHRoaXMuX2xhc3REcm9wVGFyZ2V0LmVsZW1lbnRJZHggOiAtMSwgLy8gaXRlbXMgYXJlIGFscmVhZHkgc2hpZnRlZCBzbyBzdWJ0cmFjdCAxIGZyb20gdGFyZ2V0IGluZGV4XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy5fbGFzdERyb3BUYXJnZXQgPyB0aGlzLl9sYXN0RHJvcFRhcmdldC5jb250YWluZXIgOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXREcmFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVzZXREcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RyYWdFbGVtZW50ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kcmFnSW5Db250YWluZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2xhc3REcm9wVGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc2RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuIl19