@tft/interact 14.0.0 → 15.0.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 (48) hide show
  1. package/{esm2020 → esm2022}/index.mjs +5 -5
  2. package/{esm2020 → esm2022}/lib/directives/account-for-scale.directive.mjs +26 -26
  3. package/{esm2020 → esm2022}/lib/directives/apply-scale.directive.mjs +28 -28
  4. package/esm2022/lib/directives/auto-scroll.directive.mjs +56 -0
  5. package/{esm2020 → esm2022}/lib/directives/drag-preview.directive.mjs +20 -20
  6. package/{esm2020 → esm2022}/lib/directives/drag-root.directive.mjs +32 -32
  7. package/{esm2020 → esm2022}/lib/directives/draggable.directive.mjs +320 -320
  8. package/{esm2020 → esm2022}/lib/directives/dropzone.directive.mjs +114 -114
  9. package/{esm2020 → esm2022}/lib/directives/gesturable.directive.mjs +82 -82
  10. package/{esm2020 → esm2022}/lib/directives/index.mjs +9 -9
  11. package/esm2022/lib/directives/resizable.directive.mjs +228 -0
  12. package/{esm2020 → esm2022}/lib/interact.module.mjs +66 -66
  13. package/{esm2020 → esm2022}/lib/models/index.mjs +1 -1
  14. package/{esm2020 → esm2022}/lib/models/interact.mjs +27 -27
  15. package/{esm2020 → esm2022}/lib/pipes/array-of-n.pipe.mjs +22 -22
  16. package/{esm2020 → esm2022}/lib/pipes/index.mjs +1 -1
  17. package/{esm2020 → esm2022}/lib/services/interact.service.mjs +197 -197
  18. package/{esm2020 → esm2022}/lib/utils/helpers.mjs +34 -34
  19. package/{esm2020 → esm2022}/lib/utils/index.mjs +1 -1
  20. package/{esm2020 → esm2022}/tft-interact.mjs +4 -4
  21. package/{fesm2020 → fesm2022}/tft-interact.mjs +1155 -1155
  22. package/{fesm2020 → fesm2022}/tft-interact.mjs.map +1 -1
  23. package/index.d.ts +5 -5
  24. package/lib/directives/account-for-scale.directive.d.ts +15 -15
  25. package/lib/directives/apply-scale.directive.d.ts +11 -11
  26. package/lib/directives/auto-scroll.directive.d.ts +34 -34
  27. package/lib/directives/drag-preview.directive.d.ts +10 -10
  28. package/lib/directives/drag-root.directive.d.ts +15 -15
  29. package/lib/directives/draggable.directive.d.ts +76 -76
  30. package/lib/directives/dropzone.directive.d.ts +40 -40
  31. package/lib/directives/gesturable.directive.d.ts +27 -27
  32. package/lib/directives/index.d.ts +9 -9
  33. package/lib/directives/resizable.directive.d.ts +61 -61
  34. package/lib/interact.module.d.ts +20 -20
  35. package/lib/models/index.d.ts +1 -1
  36. package/lib/models/interact.d.ts +140 -140
  37. package/lib/pipes/array-of-n.pipe.d.ts +12 -12
  38. package/lib/pipes/index.d.ts +1 -1
  39. package/lib/services/interact.service.d.ts +83 -83
  40. package/lib/utils/helpers.d.ts +12 -12
  41. package/lib/utils/index.d.ts +1 -1
  42. package/package.json +7 -15
  43. package/tft-interact-15.0.0.tgz +0 -0
  44. package/esm2020/lib/directives/auto-scroll.directive.mjs +0 -56
  45. package/esm2020/lib/directives/resizable.directive.mjs +0 -228
  46. package/fesm2015/tft-interact.mjs +0 -1203
  47. package/fesm2015/tft-interact.mjs.map +0 -1
  48. package/tft-interact-14.0.0.tgz +0 -0
@@ -1,320 +1,320 @@
1
- import { Directive, ElementRef, Input, Output, EventEmitter, Optional, SkipSelf, Renderer2, ContentChild, ViewContainerRef, Inject } from '@angular/core';
2
- import { DOCUMENT } from '@angular/common';
3
- import interact from 'interactjs';
4
- import { InteractService } from '../services/interact.service';
5
- import { DropzoneDirective } from './dropzone.directive';
6
- import { DEFAULT_REGISTRY_ID } from '../models';
7
- import { DragPreviewDirective } from './drag-preview.directive';
8
- import { getRootNode } from '../utils';
9
- import { DragRootDirective } from './drag-root.directive';
10
- import { AccountForScaleDirective } from './account-for-scale.directive';
11
- import { AutoScrollDirective } from './auto-scroll.directive';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../services/interact.service";
14
- import * as i2 from "./account-for-scale.directive";
15
- import * as i3 from "./dropzone.directive";
16
- import * as i4 from "./drag-root.directive";
17
- import * as i5 from "./auto-scroll.directive";
18
- /** @dynamic */
19
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
- export class DraggableDirective {
21
- constructor(el, interactService, renderer, _viewContainerRef, _document, account_for_scale_dir, dropzone_dir, drag_root_dir, auto_scroll_dir) {
22
- this.el = el;
23
- this.interactService = interactService;
24
- this.renderer = renderer;
25
- this._viewContainerRef = _viewContainerRef;
26
- this._document = _document;
27
- this.account_for_scale_dir = account_for_scale_dir;
28
- this.dropzone_dir = dropzone_dir;
29
- this.drag_root_dir = drag_root_dir;
30
- this.auto_scroll_dir = auto_scroll_dir;
31
- /* zIndex while dragging*/
32
- this.dragZIndex = 10000;
33
- this.enableDragDefault = true;
34
- /**
35
- * @deprecated replaced by 'dragDisabled' property, please migrate before v13
36
- */
37
- this.disabled = false;
38
- this.dragDisabled = false;
39
- this.showPlaceholder = false;
40
- // pipes all interact events to event emitters
41
- this.dragStart = new EventEmitter();
42
- this.dragMove = new EventEmitter();
43
- this.dragInertiaStart = new EventEmitter();
44
- this.dragEnd = new EventEmitter();
45
- }
46
- // check all the different places for scale
47
- get scale() {
48
- return this.account_for_scale_dir?.scale || this.drag_root_dir?.account_for_scale_dir?.scale || this.dragRoot?.account_for_scale_dir?.scale || 1;
49
- }
50
- ngOnInit() {
51
- this.interactable = this.initiateDragEvents(this.dragConfig, this.el.nativeElement);
52
- this.dragRootEl = (this.dragRoot?.el?.nativeElement || this.drag_root_dir?.el?.nativeElement) || this._document.body;
53
- // register with parent dropzone if it exists, otherwise use default
54
- // this gives us a place on the registry to store our drag items that don't have a dropzone
55
- this.registryId = this.dropzone_dir?.dropzoneId || DEFAULT_REGISTRY_ID;
56
- // add draggable to directory and store its id
57
- this.interactableId = this.interactService.addDraggableToRegistry(this.registryId, this.interactableId);
58
- this.alignPositionWithInputs(this.x, this.y);
59
- // cache subscription to interactable state so we can unsubscribe onDestroy
60
- this.interactableState = this.interactService
61
- .getInteractableState(this.interactableId, this.registryId);
62
- // keep our cached position values in line with our drag state
63
- this.interactableSubscription = this.interactableState.subscribe((state) => {
64
- this.y = state.y;
65
- this.x = state.x;
66
- });
67
- this.setDragConfig();
68
- }
69
- // TODO: watch config here as well and update interactable
70
- ngOnChanges(changes) {
71
- // we do this here instead of using a setter on the input so that it
72
- // will only run once when there is a change to x and y
73
- if (changes.y || changes.x) {
74
- this.alignPositionWithInputs(this.x, this.y);
75
- }
76
- if (changes.dragConfig || changes.disabled || changes.dragDisabled) {
77
- if (!this.interactable)
78
- return;
79
- this.setDragConfig();
80
- }
81
- /**
82
- * @deprecated remove this in v13
83
- */
84
- if (changes.disabled) {
85
- console.warn(`It looks like your using the 'disabled' input on a tftDraggable directive, it has been deprecated and is replaced with 'dragDisabled', please migrate by v13`);
86
- }
87
- }
88
- setDragConfig() {
89
- const enabled = !(this.disabled || this.dragDisabled);
90
- const dragConfig = { ...this.dragConfig, enabled };
91
- this.interactable.draggable(dragConfig);
92
- }
93
- ngAfterViewInit() {
94
- this.addDragPropertiesToElement(this.el.nativeElement);
95
- if (!this.dropzone_dir) {
96
- this.previewRef = this.el.nativeElement;
97
- }
98
- }
99
- ngOnDestroy() {
100
- // clean up state and subscriptions related to destroyed component
101
- this.interactableSubscription.unsubscribe();
102
- this.interactService.destroyInteractable(this.interactableId, this.registryId);
103
- }
104
- dragMoveListener(event, element) {
105
- const { dx, dy } = event;
106
- const scale = this.scale;
107
- const deltaX = scale ? dx / scale : dx;
108
- const deltaY = scale ? dy / scale : dy;
109
- this.interactService.updateDeltas(this.interactableId, this.registryId, { deltaX, deltaY }, element);
110
- }
111
- setDragStyles(dragElement) {
112
- this.renderer.setStyle(dragElement, 'touchAction', 'none');
113
- this.renderer.setStyle(dragElement, 'zIndex', this.dragZIndex);
114
- this.renderer.setStyle(dragElement, 'position', 'absolute');
115
- }
116
- addDragPropertiesToElement(nativeElement) {
117
- this.renderer.setProperty(nativeElement, 'dropTarget', this.dropzone_dir || null);
118
- this.renderer.setProperty(nativeElement, 'dragOrigin', this.dropzone_dir || null);
119
- this.renderer.setProperty(nativeElement, 'dragRef', this);
120
- }
121
- mapDragEvent(event) {
122
- const { target, dropzone } = event;
123
- const dropzoneElement = dropzone?.target || target.dropTarget?.el.nativeElement;
124
- const scale = this.scale;
125
- const positionInDropTarget = target && dropzoneElement
126
- ? this.interactService.calculatePositionInElement(dropzoneElement, this.previewRef, scale)
127
- : null;
128
- return {
129
- interactEvent: event,
130
- dragRef: this,
131
- dragOrigin: target.dragOrigin,
132
- dropTarget: target.dropTarget,
133
- positionInDropTarget
134
- };
135
- }
136
- setPosition(x, y) {
137
- this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.el.nativeElement);
138
- }
139
- alignPositionWithInputs(x, y) {
140
- // short circuit if positions aren't numbers or if they haven't changed
141
- if (!this.isValidPosition(x, y))
142
- return;
143
- this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.el.nativeElement);
144
- }
145
- isValidPosition(x, y) {
146
- return this.isNumeric(x) && this.isNumeric(y);
147
- }
148
- // We use use this instead of isNaN here to try and help performance
149
- // We should be able to reliably restrict to numbers or falsey values
150
- isNumeric(num) {
151
- return typeof num === 'number' && !isNaN(num);
152
- }
153
- initiateDragEvents(dragConfig, nativeElement) {
154
- const defaultDragConfig = {
155
- ...dragConfig,
156
- enabled: !(this.disabled || this.dragDisabled),
157
- ...(this.auto_scroll_dir && {
158
- autoScroll: {
159
- ...this.auto_scroll_dir.autoScrollConfig,
160
- container: this.auto_scroll_dir.el.nativeElement
161
- }
162
- })
163
- };
164
- return interact(nativeElement).draggable(defaultDragConfig)
165
- .on('dragstart', (event) => {
166
- const interaction = event.interaction;
167
- // check if we should append drag element to body
168
- if (this.enableDragDefault
169
- && interaction.pointerIsDown
170
- // TODO: probably don't need following condition checks anymore remove by 2022
171
- // && !!this.dropzone_dir
172
- // && !interaction.interacting()
173
- ) {
174
- if (this._previewTemplate) {
175
- const viewRef = this._viewContainerRef.createEmbeddedView(this._previewTemplate.templateRef);
176
- this.previewRef = getRootNode(viewRef, this._document);
177
- }
178
- else {
179
- this.previewRef = cloneElement(this.el.nativeElement);
180
- }
181
- this.addDragPropertiesToElement(this.previewRef);
182
- this.setDragStyles(this.previewRef);
183
- this.dragRootEl.prepend(this.previewRef);
184
- const scale = this.account_for_scale_dir?.scale || this.dragRoot?.account_for_scale_dir?.scale || 1;
185
- const { x, y } = this.interactService.calculatePositionInElement(this.dragRootEl, nativeElement, scale);
186
- this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.previewRef);
187
- if (!this.showPlaceholder) {
188
- this.renderer.setStyle(this.el.nativeElement, 'display', 'none');
189
- }
190
- }
191
- // subscribe to scroll events if they are there, by only subscribing on dragstart we avoid wasting subscriptions on interactables that aren't be dragged
192
- if (this.auto_scroll_dir) {
193
- this.subscribeToScrollEvents();
194
- }
195
- this.dragStart.emit(this.mapDragEvent(event));
196
- })
197
- .on('dragmove', (event) => {
198
- if (this.enableDragDefault) {
199
- const dragElement = this.dropzone_dir && this.previewRef || nativeElement;
200
- this.dragMoveListener(event, dragElement);
201
- }
202
- const mappedEvent = this.mapDragEvent(event);
203
- this.dragMove.emit(mappedEvent);
204
- })
205
- .on('draginertiastart', (event) => {
206
- this.dragInertiaStart.emit(this.mapDragEvent(event));
207
- })
208
- .on('dragend', (event) => {
209
- const mappedEvent = this.mapDragEvent(event);
210
- if (!!this.dropzone_dir && this.dropzone_dir === event.target.dropTarget) {
211
- const { x, y } = mappedEvent.positionInDropTarget;
212
- this.setPosition(x, y);
213
- }
214
- this.renderer.setStyle(this.el.nativeElement, 'display', '');
215
- this.dragEnd.emit(mappedEvent);
216
- // unsubscribe from scroll events if subscribed
217
- if (this.auto_scroll_dir) {
218
- this.scrollEventsSubscription.unsubscribe();
219
- }
220
- if (this.el.nativeElement !== this.previewRef) {
221
- // we do this in a timeout, so that we don't remove before the dropzone can get the boundingElementRect
222
- setTimeout(() => {
223
- this.dragRootEl.removeChild(this.previewRef);
224
- });
225
- }
226
- });
227
- }
228
- subscribeToScrollEvents() {
229
- this.scrollEventsSubscription = this.auto_scroll_dir.scrollDeltaObserver.subscribe(({ scrollLeft, scrollTop }) => {
230
- const deltaX = this.scale ? scrollLeft / this.scale : scrollLeft;
231
- const deltaY = this.scale ? scrollTop / this.scale : scrollTop;
232
- this.interactService.updateDeltas(this.interactableId, this.registryId, { deltaX, deltaY }, this.previewRef);
233
- });
234
- }
235
- }
236
- DraggableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: DraggableDirective, deps: [{ token: i0.ElementRef }, { token: i1.InteractService }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: DOCUMENT }, { token: i2.AccountForScaleDirective, optional: true }, { token: i3.DropzoneDirective, optional: true, skipSelf: true }, { token: i4.DragRootDirective, optional: true, skipSelf: true }, { token: i5.AutoScrollDirective, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive });
237
- DraggableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: DraggableDirective, selector: "[tftDraggable]", inputs: { x: "x", y: "y", dragZIndex: "dragZIndex", zIndex: "zIndex", interactableId: "interactableId", dragData: "dragData", enableDragDefault: "enableDragDefault", disabled: "disabled", dragDisabled: "dragDisabled", dragConfig: "dragConfig", showPlaceholder: "showPlaceholder", dragRoot: "dragRoot" }, outputs: { dragStart: "dragStart", dragMove: "dragMove", dragInertiaStart: "dragInertiaStart", dragEnd: "dragEnd" }, host: { properties: { "style.touchAction": "this.dragDisabled ? \"auto\" : \"none\"", "style.position": "\"absolute\"", "id": "interactableId" } }, queries: [{ propertyName: "_previewTemplate", first: true, predicate: DragPreviewDirective, descendants: true }], usesOnChanges: true, ngImport: i0 });
238
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: DraggableDirective, decorators: [{
239
- type: Directive,
240
- args: [{
241
- selector: '[tftDraggable]',
242
- // eslint-disable-next-line @angular-eslint/no-host-metadata-property
243
- host: {
244
- '[style.touchAction]': 'this.dragDisabled ? "auto" : "none"',
245
- '[style.position]': '"absolute"',
246
- '[id]': 'interactableId',
247
- }
248
- }]
249
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.InteractService }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: Document, decorators: [{
250
- type: Inject,
251
- args: [DOCUMENT]
252
- }] }, { type: i2.AccountForScaleDirective, decorators: [{
253
- type: Optional
254
- }] }, { type: i3.DropzoneDirective, decorators: [{
255
- type: Optional
256
- }, {
257
- type: SkipSelf
258
- }] }, { type: i4.DragRootDirective, decorators: [{
259
- type: Optional
260
- }, {
261
- type: SkipSelf
262
- }] }, { type: i5.AutoScrollDirective, decorators: [{
263
- type: Optional
264
- }, {
265
- type: SkipSelf
266
- }] }]; }, propDecorators: { x: [{
267
- type: Input
268
- }], y: [{
269
- type: Input
270
- }], dragZIndex: [{
271
- type: Input
272
- }], zIndex: [{
273
- type: Input
274
- }], interactableId: [{
275
- type: Input
276
- }], dragData: [{
277
- type: Input
278
- }], enableDragDefault: [{
279
- type: Input
280
- }], disabled: [{
281
- type: Input
282
- }], dragDisabled: [{
283
- type: Input
284
- }], dragConfig: [{
285
- type: Input
286
- }], showPlaceholder: [{
287
- type: Input
288
- }], dragRoot: [{
289
- type: Input
290
- }], dragStart: [{
291
- type: Output
292
- }], dragMove: [{
293
- type: Output
294
- }], dragInertiaStart: [{
295
- type: Output
296
- }], dragEnd: [{
297
- type: Output
298
- }], _previewTemplate: [{
299
- type: ContentChild,
300
- args: [DragPreviewDirective]
301
- }] } });
302
- /**
303
- * Component utils
304
- */
305
- // create a clone of the component passed in and add it to the root component
306
- function cloneElement(element) {
307
- const clone = element.cloneNode(true);
308
- clone.removeAttribute('id');
309
- return clone;
310
- }
311
- function getPreviewInsertionPoint(documentRef) {
312
- // We can't use the body if the user is in fullscreen mode,
313
- // because the preview will render under the fullscreen element.
314
- return documentRef.fullscreenElement ||
315
- documentRef.webkitFullscreenElement ||
316
- documentRef.mozFullScreenElement ||
317
- documentRef.msFullscreenElement ||
318
- documentRef.body;
319
- }
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi9kaXJlY3RpdmVzL2RyYWdnYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFDdkMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUE0QixZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUMsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUcvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQTZCLG1CQUFtQixFQUE0QixNQUFNLFdBQVcsQ0FBQztBQUNyRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7O0FBRTlELGVBQWU7QUFVZiw4REFBOEQ7QUFDOUQsTUFBTSxPQUFPLGtCQUFrQjtJQWlEN0IsWUFDUyxFQUFjLEVBQ2IsZUFBZ0MsRUFDaEMsUUFBbUIsRUFDbkIsaUJBQW1DLEVBQ2pCLFNBQW1CLEVBQzFCLHFCQUFnRCxFQUNwQyxZQUFnQyxFQUNoQyxhQUFpQyxF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QkFBb0I7O0FBMFBwQzs7R0FFRztBQUNILDZFQUE2RTtBQUM3RSxTQUFTLFlBQVksQ0FBQyxPQUFvQjtJQUN4QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBZ0IsQ0FBQztJQUNyRCxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUNELFNBQVMsd0JBQXdCLENBQUMsV0FBZ0I7SUFDaEQsMkRBQTJEO0lBQzNELGdFQUFnRTtJQUNoRSxPQUFPLFdBQVcsQ0FBQyxpQkFBaUI7UUFDN0IsV0FBVyxDQUFDLHVCQUF1QjtRQUNuQyxXQUFXLENBQUMsb0JBQW9CO1FBQ2hDLFdBQVcsQ0FBQyxtQkFBbUI7UUFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsXG4gICBPbkRlc3Ryb3ksIEV2ZW50RW1pdHRlciwgT3B0aW9uYWwsIFNraXBTZWxmLCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgQ29udGVudENoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBJbmplY3QsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IGludGVyYWN0IGZyb20gJ2ludGVyYWN0anMnO1xuaW1wb3J0IHsgSW50ZXJhY3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaW50ZXJhY3Quc2VydmljZSc7XG5pbXBvcnQgeyBEcmFnZ2FibGVPcHRpb25zLCBJbnRlcmFjdGFibGUgfSBmcm9tICdAaW50ZXJhY3Rqcy90eXBlcy9pbmRleCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERyb3B6b25lRGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wem9uZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdEcmFnRXZlbnQsIFRmdERyYWdFdmVudCwgREVGQVVMVF9SRUdJU1RSWV9JRCwgVGZ0Q29vcmRzLCBUZnREcmFnRWxlbWVudH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IERyYWdQcmV2aWV3RGlyZWN0aXZlIH0gZnJvbSAnLi9kcmFnLXByZXZpZXcuZGlyZWN0aXZlJztcbmltcG9ydCB7IGdldFJvb3ROb2RlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgRHJhZ1Jvb3REaXJlY3RpdmUgfSBmcm9tICcuL2RyYWctcm9vdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWNjb3VudEZvclNjYWxlRGlyZWN0aXZlIH0gZnJvbSAnLi9hY2NvdW50LWZvci1zY2FsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQXV0b1Njcm9sbERpcmVjdGl2ZSB9IGZyb20gJy4vYXV0by1zY3JvbGwuZGlyZWN0aXZlJztcblxuLyoqIEBkeW5hbWljICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdGZ0RHJhZ2dhYmxlXScsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taG9zdC1tZXRhZGF0YS1wcm9wZXJ0eVxuICBob3N0OiB7XG4gICAgJ1tzdHlsZS50b3VjaEFjdGlvbl0nOiAndGhpcy5kcmFnRGlzYWJsZWQgPyBcImF1dG9cIiA6IFwibm9uZVwiJyxcbiAgICAnW3N0eWxlLnBvc2l0aW9uXSc6ICdcImFic29sdXRlXCInLFxuICAgICdbaWRdJzogJ2ludGVyYWN0YWJsZUlkJyxcbiAgfVxufSlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlRGlyZWN0aXZlPEQgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cblxuICBASW5wdXQoKSB4OiBudW1iZXI7XG4gIEBJbnB1dCgpIHk6IG51bWJlcjtcbiAgLyogekluZGV4IHdoaWxlIGRyYWdnaW5nKi9cbiAgQElucHV0KCkgZHJhZ1pJbmRleCA9IDEwMDAwO1xuICAvKiogekluZGV4IHdoaWxlIGF0IHJlc3QgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXJcbiAgQElucHV0KCkgaW50ZXJhY3RhYmxlSWQ6IHN0cmluZztcbiAgQElucHV0KCkgZHJhZ0RhdGE6IEQ7XG4gIEBJbnB1dCgpIGVuYWJsZURyYWdEZWZhdWx0ID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5ICdkcmFnRGlzYWJsZWQnIHByb3BlcnR5LCBwbGVhc2UgbWlncmF0ZSBiZWZvcmUgdjEzXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkcmFnRGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZHJhZ0NvbmZpZzogUGFydGlhbDxJbnRlcmFjdC5PckJvb2xlYW48RHJhZ2dhYmxlT3B0aW9ucz4+O1xuICBASW5wdXQoKSBzaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgd2Ugd2FudCB0byBwcmVwZW5kIHRoZSBkcmFnIGVsZW1lbnQgdG8uXG4gICAqIFVzZSBgdGZ0RHJhZ1Jvb3RgIGRpcmVjdGl2ZSBvbiBhIHBhcmVudCBlbGVtZW50IHRvIHNldCBjdXN0b20gcm9vdCBlbGVtZW50XG4gICAqICBAZGVmYXVsdCBkb2N1bWVudC5ib2R5XG4gICAqL1xuICBASW5wdXQoKSBkcmFnUm9vdDogRHJhZ1Jvb3REaXJlY3RpdmU7IC8vIEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgZHJhZ1Jvb3RFbDogSFRNTEVsZW1lbnQ7XG4gIC8vIHBpcGVzIGFsbCBpbnRlcmFjdCBldmVudHMgdG8gZXZlbnQgZW1pdHRlcnNcbiAgQE91dHB1dCgpIGRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8VGZ0RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJhZ01vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdJbmVydGlhU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyYWdFdmVudD4oKTtcblxuICBAQ29udGVudENoaWxkKERyYWdQcmV2aWV3RGlyZWN0aXZlKSBfcHJldmlld1RlbXBsYXRlOiBEcmFnUHJldmlld0RpcmVjdGl2ZTtcbiAgLy8gZHJhZ1ByZXZpZXc6IEludGVyYWN0LkVsZW1lbnQ7XG4gIGludGVyYWN0YWJsZVN0YXRlOiBPYnNlcnZhYmxlPFRmdENvb3Jkcz47XG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlO1xuICBwcml2YXRlIHJlZ2lzdHJ5SWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpbnRlcmFjdGFibGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBzY3JvbGxFdmVudHNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvLyBjYWNoZSBob2xkaW5nIGVsZW1lbnQgdG8gdXNlIGFzIGRyYWcgcHJldmlldyAodGhlIGVsZW1lbnQgdGhlIHVzZXIgc2VlcyBiZWluZyBkcmFnZ2VkIGFyb3VuZClcbiAgcHJldmlld1JlZjogVGZ0RHJhZ0VsZW1lbnQ7XG4gIC8vIGNoZWNrIGFsbCB0aGUgZGlmZmVyZW50IHBsYWNlcyBmb3Igc2NhbGVcbiAgZ2V0IHNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudF9mb3Jfc2NhbGVfZGlyPy5zY2FsZSB8fCB0aGlzLmRyYWdfcm9vdF9kaXI/LmFjY291bnRfZm9yX3NjYWxlX2Rpcj8uc2NhbGUgfHwgdGhpcy5kcmFnUm9vdD8uYWNjb3VudF9mb3Jfc2NhbGVfZGlyPy5zY2FsZSB8fCAxO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgaW50ZXJhY3RTZXJ2aWNlOiBJbnRlcmFjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBhY2NvdW50X2Zvcl9zY2FsZV9kaXI/OiBBY2NvdW50Rm9yU2NhbGVEaXJlY3RpdmUsXG4gICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHVibGljIGRyb3B6b25lX2Rpcj86IERyb3B6b25lRGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHB1YmxpYyBkcmFnX3Jvb3RfZGlyPzogRHJhZ1Jvb3REaXJlY3RpdmUsXG4gICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHVibGljIGF1dG9fc2Nyb2xsX2Rpcj86IEF1dG9TY3JvbGxEaXJlY3RpdmVcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmludGVyYWN0YWJsZSA9IHRoaXMuaW5pdGlhdGVEcmFnRXZlbnRzKHRoaXMuZHJhZ0NvbmZpZywgdGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLmRyYWdSb290RWwgPSAodGhpcy5kcmFnUm9vdD8uZWw/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5kcmFnX3Jvb3RfZGlyPy5lbD8ubmF0aXZlRWxlbWVudCkgYXMgSFRNTEVsZW1lbnQgfHwgdGhpcy5fZG9jdW1lbnQuYm9keTtcbiAgICAvLyByZWdpc3RlciB3aXRoIHBhcmVudCBkcm9wem9uZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB1c2UgZGVmYXVsdFxuICAgIC8vIHRoaXMgZ2l2ZXMgdXMgYSBwbGFjZSBvbiB0aGUgcmVnaXN0cnkgdG8gc3RvcmUgb3VyIGRyYWcgaXRlbXMgdGhhdCBkb24ndCBoYXZlIGEgZHJvcHpvbmVcbiAgICB0aGlzLnJlZ2lzdHJ5SWQgPSB0aGlzLmRyb3B6b25lX2Rpcj8uZHJvcHpvbmVJZCB8fCBERUZBVUxUX1JFR0lTVFJZX0lEO1xuICAgIC8vIGFkZCBkcmFnZ2FibGUgdG8gZGlyZWN0b3J5IGFuZCBzdG9yZSBpdHMgaWRcbiAgICB0aGlzLmludGVyYWN0YWJsZUlkID0gdGhpcy5pbnRlcmFjdFNlcnZpY2UuYWRkRHJhZ2dhYmxlVG9SZWdpc3RyeSh0aGlzLnJlZ2lzdHJ5SWQsIHRoaXMuaW50ZXJhY3RhYmxlSWQpO1xuICAgIHRoaXMuYWxpZ25Qb3NpdGlvbldpdGhJbnB1dHModGhpcy54LCB0aGlzLnkpO1xuICAgIC8vIGNhY2hlIHN1YnNjcmlwdGlvbiB0byBpbnRlcmFjdGFibGUgc3RhdGUgc28gd2UgY2FuIHVuc3Vic2NyaWJlIG9uRGVzdHJveVxuICAgIHRoaXMuaW50ZXJhY3RhYmxlU3RhdGUgPSB0aGlzLmludGVyYWN0U2VydmljZVxuICAgICAgLmdldEludGVyYWN0YWJsZVN0YXRlKHRoaXMuaW50ZXJhY3RhYmxlSWQsIHRoaXMucmVnaXN0cnlJZCk7XG4gICAgLy8ga2VlcCBvdXIgY2FjaGVkIHBvc2l0aW9uIHZhbHVlcyBpbiBsaW5lIHdpdGggb3VyIGRyYWcgc3RhdGVcbiAgICB0aGlzLmludGVyYWN0YWJsZVN1YnNjcmlwdGlvbiA9IHRoaXMuaW50ZXJhY3RhYmxlU3RhdGUuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgdGhpcy55ID0gc3RhdGUueTtcbiAgICAgIHRoaXMueCA9IHN0YXRlLng7XG4gICAgfSk7XG4gICAgdGhpcy5zZXREcmFnQ29uZmlnKCk7XG4gIH1cblxuICAvLyBUT0RPOiB3YXRjaCBjb25maWcgaGVyZSBhcyB3ZWxsIGFuZCB1cGRhdGUgaW50ZXJhY3RhYmxlXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyB3ZSBkbyB0aGlzIGhlcmUgaW5zdGVhZCBvZiB1c2luZyBhIHNldHRlciBvbiB0aGUgaW5wdXQgc28gdGhhdCBpdFxuICAgIC8vIHdpbGwgb25seSBydW4gb25jZSB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIHRvIHggYW5kIHlcbiAgICBpZihjaGFuZ2VzLnkgfHwgY2hhbmdlcy54KSB7XG4gICAgICB0aGlzLmFsaWduUG9zaXRpb25XaXRoSW5wdXRzKHRoaXMueCwgdGhpcy55KTtcbiAgICB9XG4gICAgaWYoY2hhbmdlcy5kcmFnQ29uZmlnIHx8IGNoYW5nZXMuZGlzYWJsZWQgfHwgY2hhbmdlcy5kcmFnRGlzYWJsZWQpIHtcbiAgICAgIGlmKCF0aGlzLmludGVyYWN0YWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXREcmFnQ29uZmlnKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHJlbW92ZSB0aGlzIGluIHYxM1xuICAgICAqL1xuICAgIGlmIChjaGFuZ2VzLmRpc2FibGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEl0IGxvb2tzIGxpa2UgeW91ciB1c2luZyB0aGUgJ2Rpc2FibGVkJyBpbnB1dCBvbiBhIHRmdERyYWdnYWJsZSBkaXJlY3RpdmUsIGl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGggJ2RyYWdEaXNhYmxlZCcsIHBsZWFzZSBtaWdyYXRlIGJ5IHYxM2ApXG4gICAgfVxuICB9XG5cbiAgc2V0RHJhZ0NvbmZpZygpIHtcbiAgICBjb25zdCBlbmFibGVkID0gISh0aGlzLmRpc2FibGVkIHx8IHRoaXMuZHJhZ0Rpc2FibGVkKVxuICAgIGNvbnN0IGRyYWdDb25maWcgPSB7Li4udGhpcy5kcmFnQ29uZmlnLCBlbmFibGVkfTtcbiAgICB0aGlzLmludGVyYWN0YWJsZS5kcmFnZ2FibGUoZHJhZ0NvbmZpZyk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5hZGREcmFnUHJvcGVydGllc1RvRWxlbWVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIGlmICghdGhpcy5kcm9wem9uZV9kaXIpIHtcbiAgICAgIHRoaXMucHJldmlld1JlZiA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBjbGVhbiB1cCBzdGF0ZSBhbmQgc3Vic2NyaXB0aW9ucyByZWxhdGVkIHRvIGRlc3Ryb3llZCBjb21wb25lbnRcbiAgICB0aGlzLmludGVyYWN0YWJsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLmRlc3Ryb3lJbnRlcmFjdGFibGUodGhpcy5pbnRlcmFjdGFibGVJZCwgdGhpcy5yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIGRyYWdNb3ZlTGlzdGVuZXIoZXZlbnQ6IE5nRHJhZ0V2ZW50LCBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gICAgY29uc3QgeyBkeCwgZHkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICBjb25zdCBkZWx0YVggPSBzY2FsZSA/IGR4IC8gc2NhbGUgOiBkeDtcbiAgICBjb25zdCBkZWx0YVkgPSBzY2FsZSA/IGR5IC8gc2NhbGUgOiBkeTtcblxuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLnVwZGF0ZURlbHRhcyhcbiAgICAgIHRoaXMuaW50ZXJhY3RhYmxlSWQsXG4gICAgICB0aGlzLnJlZ2lzdHJ5SWQsXG4gICAgICB7ZGVsdGFYLCBkZWx0YVl9LFxuICAgICAgZWxlbWVudFxuICAgICk7XG4gIH1cblxuICBzZXREcmFnU3R5bGVzKGRyYWdFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZHJhZ0VsZW1lbnQsICd0b3VjaEFjdGlvbicsICdub25lJylcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRyYWdFbGVtZW50LCAnekluZGV4JywgdGhpcy5kcmFnWkluZGV4KVxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZHJhZ0VsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gIH1cblxuICBhZGREcmFnUHJvcGVydGllc1RvRWxlbWVudChuYXRpdmVFbGVtZW50OiBUZnREcmFnRWxlbWVudCkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkobmF0aXZlRWxlbWVudCwgJ2Ryb3BUYXJnZXQnLCB0aGlzLmRyb3B6b25lX2RpciB8fCBudWxsKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KG5hdGl2ZUVsZW1lbnQsICdkcmFnT3JpZ2luJywgdGhpcy5kcm9wem9uZV9kaXIgfHwgbnVsbCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShuYXRpdmVFbGVtZW50LCAnZHJhZ1JlZicsIHRoaXMpO1xuICB9XG5cbiAgbWFwRHJhZ0V2ZW50KGV2ZW50OiBOZ0RyYWdFdmVudCk6IFRmdERyYWdFdmVudCB7XG4gICAgY29uc3QgeyB0YXJnZXQsIGRyb3B6b25lIH0gPSBldmVudDtcbiAgICBjb25zdCBkcm9wem9uZUVsZW1lbnQgPSBkcm9wem9uZT8udGFyZ2V0IHx8IHRhcmdldC5kcm9wVGFyZ2V0Py5lbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICBjb25zdCBwb3NpdGlvbkluRHJvcFRhcmdldCA9IHRhcmdldCAmJiBkcm9wem9uZUVsZW1lbnRcbiAgICAgID8gdGhpcy5pbnRlcmFjdFNlcnZpY2UuY2FsY3VsYXRlUG9zaXRpb25JbkVsZW1lbnQoZHJvcHpvbmVFbGVtZW50LCB0aGlzLnByZXZpZXdSZWYsIHNjYWxlKVxuICAgICAgOiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICBpbnRlcmFjdEV2ZW50OiBldmVudCxcbiAgICAgIGRyYWdSZWY6IHRoaXMsXG4gICAgICBkcmFnT3JpZ2luOiB0YXJnZXQuZHJhZ09yaWdpbixcbiAgICAgIGRyb3BUYXJnZXQ6IHRhcmdldC5kcm9wVGFyZ2V0LFxuICAgICAgcG9zaXRpb25JbkRyb3BUYXJnZXRcbiAgICB9XG4gIH1cblxuICBzZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLnVwZGF0ZVBvc2l0aW9uKFxuICAgICAgdGhpcy5pbnRlcmFjdGFibGVJZCxcbiAgICAgIHRoaXMucmVnaXN0cnlJZCxcbiAgICAgIHt4LCB5fSxcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICBhbGlnblBvc2l0aW9uV2l0aElucHV0cyh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIC8vIHNob3J0IGNpcmN1aXQgaWYgcG9zaXRpb25zIGFyZW4ndCBudW1iZXJzIG9yICBpZiB0aGV5IGhhdmVuJ3QgY2hhbmdlZFxuICAgIGlmKCF0aGlzLmlzVmFsaWRQb3NpdGlvbih4LCB5KSkgcmV0dXJuO1xuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLnVwZGF0ZVBvc2l0aW9uKFxuICAgICAgdGhpcy5pbnRlcmFjdGFibGVJZCxcbiAgICAgIHRoaXMucmVnaXN0cnlJZCxcbiAgICAgIHt4LCB5fSxcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICBpc1ZhbGlkUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5pc051bWVyaWMoeCkgJiYgdGhpcy5pc051bWVyaWMoeSk7XG4gIH1cbiAgLy8gV2UgdXNlIHVzZSB0aGlzIGluc3RlYWQgb2YgaXNOYU4gaGVyZSB0byB0cnkgYW5kIGhlbHAgcGVyZm9ybWFuY2VcbiAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVsaWFibHkgcmVzdHJpY3QgdG8gbnVtYmVycyBvciBmYWxzZXkgdmFsdWVzXG4gIGlzTnVtZXJpYyhudW06IG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgbnVtID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obnVtKTtcbiAgfVxuXG4gIGluaXRpYXRlRHJhZ0V2ZW50cyhkcmFnQ29uZmlnOiBQYXJ0aWFsPEludGVyYWN0Lk9yQm9vbGVhbjxEcmFnZ2FibGVPcHRpb25zPj4sIG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgZGVmYXVsdERyYWdDb25maWcgPSB7XG4gICAgICAuLi5kcmFnQ29uZmlnLFxuICAgICAgZW5hYmxlZDogICEodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmRyYWdEaXNhYmxlZCksXG4gICAgICAuLi4odGhpcy5hdXRvX3Njcm9sbF9kaXIgJiYge1xuICAgICAgICBhdXRvU2Nyb2xsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnRoaXMuYXV0b19zY3JvbGxfZGlyLmF1dG9TY3JvbGxDb25maWcsXG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuYXV0b19zY3JvbGxfZGlyLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9O1xuICAgIHJldHVybiBpbnRlcmFjdChuYXRpdmVFbGVtZW50KS5kcmFnZ2FibGUoZGVmYXVsdERyYWdDb25maWcpXG4gICAgICAub24oJ2RyYWdzdGFydCcsICAoZXZlbnQ6IE5nRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZXZlbnQuaW50ZXJhY3Rpb247XG4gICAgICAgIC8vIGNoZWNrIGlmIHdlIHNob3VsZCBhcHBlbmQgZHJhZyBlbGVtZW50IHRvIGJvZHlcbiAgICAgICAgaWYgKCB0aGlzLmVuYWJsZURyYWdEZWZhdWx0XG4gICAgICAgICAgJiYgaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93blxuICAgICAgICAgIC8vIFRPRE86IHByb2JhYmx5IGRvbid0IG5lZWQgZm9sbG93aW5nIGNvbmRpdGlvbiBjaGVja3MgYW55bW9yZSByZW1vdmUgYnkgMjAyMlxuICAgICAgICAgIC8vICYmICEhdGhpcy5kcm9wem9uZV9kaXJcbiAgICAgICAgICAvLyAmJiAhaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKVxuICAgICAgICAgICkge1xuICAgICAgICAgIGlmICh0aGlzLl9wcmV2aWV3VGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl9wcmV2aWV3VGVtcGxhdGUudGVtcGxhdGVSZWYpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3UmVmID0gZ2V0Um9vdE5vZGUodmlld1JlZiwgdGhpcy5fZG9jdW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdSZWYgPSBjbG9uZUVsZW1lbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGREcmFnUHJvcGVydGllc1RvRWxlbWVudCh0aGlzLnByZXZpZXdSZWYpO1xuICAgICAgICAgIHRoaXMuc2V0RHJhZ1N0eWxlcyh0aGlzLnByZXZpZXdSZWYpXG5cbiAgICAgICAgICB0aGlzLmRyYWdSb290RWwucHJlcGVuZCh0aGlzLnByZXZpZXdSZWYpO1xuICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5hY2NvdW50X2Zvcl9zY2FsZV9kaXI/LnNjYWxlIHx8IHRoaXMuZHJhZ1Jvb3Q/LmFjY291bnRfZm9yX3NjYWxlX2Rpcj8uc2NhbGUgfHwgMTtcbiAgICAgICAgICBjb25zdCB7eCwgeX0gPSB0aGlzLmludGVyYWN0U2VydmljZS5jYWxjdWxhdGVQb3NpdGlvbkluRWxlbWVudCh0aGlzLmRyYWdSb290RWwsIG5hdGl2ZUVsZW1lbnQsIHNjYWxlKTtcbiAgICAgICAgICB0aGlzLmludGVyYWN0U2VydmljZS51cGRhdGVQb3NpdGlvbih0aGlzLmludGVyYWN0YWJsZUlkLCB0aGlzLnJlZ2lzdHJ5SWQsIHt4LCB5fSwgdGhpcy5wcmV2aWV3UmVmKTtcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd1BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc2Nyb2xsIGV2ZW50cyBpZiB0aGV5IGFyZSB0aGVyZSwgYnkgb25seSBzdWJzY3JpYmluZyBvbiBkcmFnc3RhcnQgd2UgYXZvaWQgd2FzdGluZyBzdWJzY3JpcHRpb25zIG9uIGludGVyYWN0YWJsZXMgdGhhdCBhcmVuJ3QgYmUgZHJhZ2dlZFxuICAgICAgICBpZiAodGhpcy5hdXRvX3Njcm9sbF9kaXIpIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvU2Nyb2xsRXZlbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmFnU3RhcnQuZW1pdCh0aGlzLm1hcERyYWdFdmVudChldmVudCkpO1xuICAgICAgfSlcbiAgICAgIC5vbignZHJhZ21vdmUnLCAoZXZlbnQ6IE5nRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZURyYWdEZWZhdWx0KSB7XG4gICAgICAgICAgY29uc3QgZHJhZ0VsZW1lbnQgPSB0aGlzLmRyb3B6b25lX2RpciAmJiB0aGlzLnByZXZpZXdSZWYgfHwgbmF0aXZlRWxlbWVudFxuICAgICAgICAgIHRoaXMuZHJhZ01vdmVMaXN0ZW5lcihldmVudCwgZHJhZ0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcHBlZEV2ZW50ID0gdGhpcy5tYXBEcmFnRXZlbnQoZXZlbnQpO1xuICAgICAgICB0aGlzLmRyYWdNb3ZlLmVtaXQobWFwcGVkRXZlbnQpO1xuICAgICAgfSlcbiAgICAgIC5vbignZHJhZ2luZXJ0aWFzdGFydCcsIChldmVudDogTmdEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnSW5lcnRpYVN0YXJ0LmVtaXQodGhpcy5tYXBEcmFnRXZlbnQoZXZlbnQpKVxuICAgICAgfSlcbiAgICAgIC5vbignZHJhZ2VuZCcsIChldmVudDogTmdEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgbWFwcGVkRXZlbnQgPSB0aGlzLm1hcERyYWdFdmVudChldmVudClcbiAgICAgICAgaWYoISF0aGlzLmRyb3B6b25lX2RpciAmJiB0aGlzLmRyb3B6b25lX2RpciA9PT0gZXZlbnQudGFyZ2V0LmRyb3BUYXJnZXQpIHtcbiAgICAgICAgICBjb25zdCB7IHgsIHl9ID0gbWFwcGVkRXZlbnQucG9zaXRpb25JbkRyb3BUYXJnZXQ7XG4gICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICAgIHRoaXMuZHJhZ0VuZC5lbWl0KG1hcHBlZEV2ZW50KTtcbiAgICAgICAgLy8gdW5zdWJzY3JpYmUgZnJvbSBzY3JvbGwgZXZlbnRzIGlmIHN1YnNjcmliZWRcbiAgICAgICAgaWYgKHRoaXMuYXV0b19zY3JvbGxfZGlyKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxFdmVudHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIHRoaXMuZWwubmF0aXZlRWxlbWVudCAhPT0gdGhpcy5wcmV2aWV3UmVmKSB7XG4gICAgICAgICAgLy8gd2UgZG8gdGhpcyBpbiBhIHRpbWVvdXQsIHNvIHRoYXQgd2UgZG9uJ3QgcmVtb3ZlIGJlZm9yZSB0aGUgZHJvcHpvbmUgY2FuIGdldCB0aGUgYm91bmRpbmdFbGVtZW50UmVjdFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kcmFnUm9vdEVsLnJlbW92ZUNoaWxkKHRoaXMucHJldmlld1JlZik7XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBzdWJzY3JpYmVUb1Njcm9sbEV2ZW50cygpIHtcbiAgICB0aGlzLnNjcm9sbEV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMuYXV0b19zY3JvbGxfZGlyLnNjcm9sbERlbHRhT2JzZXJ2ZXIuc3Vic2NyaWJlKCh7c2Nyb2xsTGVmdCwgc2Nyb2xsVG9wfSkgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gdGhpcy5zY2FsZSA/IHNjcm9sbExlZnQgLyB0aGlzLnNjYWxlIDogc2Nyb2xsTGVmdDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IHRoaXMuc2NhbGUgPyBzY3JvbGxUb3AgLyB0aGlzLnNjYWxlIDogc2Nyb2xsVG9wO1xuXG4gICAgICB0aGlzLmludGVyYWN0U2VydmljZS51cGRhdGVEZWx0YXMoXG4gICAgICAgIHRoaXMuaW50ZXJhY3RhYmxlSWQsXG4gICAgICAgIHRoaXMucmVnaXN0cnlJZCxcbiAgICAgICAge2RlbHRhWCwgZGVsdGFZfSxcbiAgICAgICAgdGhpcy5wcmV2aWV3UmVmXG4gICAgICApO1xuICAgIH0pO1xuXG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdXRpbHNcbiAqL1xuLy8gY3JlYXRlIGEgY2xvbmUgb2YgdGhlIGNvbXBvbmVudCBwYXNzZWQgaW4gYW5kIGFkZCBpdCB0byB0aGUgcm9vdCBjb21wb25lbnRcbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICBjb25zdCBjbG9uZSA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuICBjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7XG4gIHJldHVybiBjbG9uZTtcbn1cbmZ1bmN0aW9uIGdldFByZXZpZXdJbnNlcnRpb25Qb2ludChkb2N1bWVudFJlZjogYW55KTogSFRNTEVsZW1lbnQge1xuICAvLyBXZSBjYW4ndCB1c2UgdGhlIGJvZHkgaWYgdGhlIHVzZXIgaXMgaW4gZnVsbHNjcmVlbiBtb2RlLFxuICAvLyBiZWNhdXNlIHRoZSBwcmV2aWV3IHdpbGwgcmVuZGVyIHVuZGVyIHRoZSBmdWxsc2NyZWVuIGVsZW1lbnQuXG4gIHJldHVybiBkb2N1bWVudFJlZi5mdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgZG9jdW1lbnRSZWYud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgIGRvY3VtZW50UmVmLm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICBkb2N1bWVudFJlZi5tc0Z1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICBkb2N1bWVudFJlZi5ib2R5O1xufVxuIl19
1
+ import { Directive, ElementRef, Input, Output, EventEmitter, Optional, SkipSelf, Renderer2, ContentChild, ViewContainerRef, Inject } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import interact from 'interactjs';
4
+ import { InteractService } from '../services/interact.service';
5
+ import { DropzoneDirective } from './dropzone.directive';
6
+ import { DEFAULT_REGISTRY_ID } from '../models';
7
+ import { DragPreviewDirective } from './drag-preview.directive';
8
+ import { getRootNode } from '../utils';
9
+ import { DragRootDirective } from './drag-root.directive';
10
+ import { AccountForScaleDirective } from './account-for-scale.directive';
11
+ import { AutoScrollDirective } from './auto-scroll.directive';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "../services/interact.service";
14
+ import * as i2 from "./account-for-scale.directive";
15
+ import * as i3 from "./dropzone.directive";
16
+ import * as i4 from "./drag-root.directive";
17
+ import * as i5 from "./auto-scroll.directive";
18
+ /** @dynamic */
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ export class DraggableDirective {
21
+ // check all the different places for scale
22
+ get scale() {
23
+ return this.account_for_scale_dir?.scale || this.drag_root_dir?.account_for_scale_dir?.scale || this.dragRoot?.account_for_scale_dir?.scale || 1;
24
+ }
25
+ constructor(el, interactService, renderer, _viewContainerRef, _document, account_for_scale_dir, dropzone_dir, drag_root_dir, auto_scroll_dir) {
26
+ this.el = el;
27
+ this.interactService = interactService;
28
+ this.renderer = renderer;
29
+ this._viewContainerRef = _viewContainerRef;
30
+ this._document = _document;
31
+ this.account_for_scale_dir = account_for_scale_dir;
32
+ this.dropzone_dir = dropzone_dir;
33
+ this.drag_root_dir = drag_root_dir;
34
+ this.auto_scroll_dir = auto_scroll_dir;
35
+ /* zIndex while dragging*/
36
+ this.dragZIndex = 10000;
37
+ this.enableDragDefault = true;
38
+ /**
39
+ * @deprecated replaced by 'dragDisabled' property, please migrate before v13
40
+ */
41
+ this.disabled = false;
42
+ this.dragDisabled = false;
43
+ this.showPlaceholder = false;
44
+ // pipes all interact events to event emitters
45
+ this.dragStart = new EventEmitter();
46
+ this.dragMove = new EventEmitter();
47
+ this.dragInertiaStart = new EventEmitter();
48
+ this.dragEnd = new EventEmitter();
49
+ }
50
+ ngOnInit() {
51
+ this.interactable = this.initiateDragEvents(this.dragConfig, this.el.nativeElement);
52
+ this.dragRootEl = (this.dragRoot?.el?.nativeElement || this.drag_root_dir?.el?.nativeElement) || this._document.body;
53
+ // register with parent dropzone if it exists, otherwise use default
54
+ // this gives us a place on the registry to store our drag items that don't have a dropzone
55
+ this.registryId = this.dropzone_dir?.dropzoneId || DEFAULT_REGISTRY_ID;
56
+ // add draggable to directory and store its id
57
+ this.interactableId = this.interactService.addDraggableToRegistry(this.registryId, this.interactableId);
58
+ this.alignPositionWithInputs(this.x, this.y);
59
+ // cache subscription to interactable state so we can unsubscribe onDestroy
60
+ this.interactableState = this.interactService
61
+ .getInteractableState(this.interactableId, this.registryId);
62
+ // keep our cached position values in line with our drag state
63
+ this.interactableSubscription = this.interactableState.subscribe((state) => {
64
+ this.y = state.y;
65
+ this.x = state.x;
66
+ });
67
+ this.setDragConfig();
68
+ }
69
+ // TODO: watch config here as well and update interactable
70
+ ngOnChanges(changes) {
71
+ // we do this here instead of using a setter on the input so that it
72
+ // will only run once when there is a change to x and y
73
+ if (changes.y || changes.x) {
74
+ this.alignPositionWithInputs(this.x, this.y);
75
+ }
76
+ if (changes.dragConfig || changes.disabled || changes.dragDisabled) {
77
+ if (!this.interactable)
78
+ return;
79
+ this.setDragConfig();
80
+ }
81
+ /**
82
+ * @deprecated remove this in v13
83
+ */
84
+ if (changes.disabled) {
85
+ console.warn(`It looks like your using the 'disabled' input on a tftDraggable directive, it has been deprecated and is replaced with 'dragDisabled', please migrate by v13`);
86
+ }
87
+ }
88
+ setDragConfig() {
89
+ const enabled = !(this.disabled || this.dragDisabled);
90
+ const dragConfig = { ...this.dragConfig, enabled };
91
+ this.interactable.draggable(dragConfig);
92
+ }
93
+ ngAfterViewInit() {
94
+ this.addDragPropertiesToElement(this.el.nativeElement);
95
+ if (!this.dropzone_dir) {
96
+ this.previewRef = this.el.nativeElement;
97
+ }
98
+ }
99
+ ngOnDestroy() {
100
+ // clean up state and subscriptions related to destroyed component
101
+ this.interactableSubscription.unsubscribe();
102
+ this.interactService.destroyInteractable(this.interactableId, this.registryId);
103
+ }
104
+ dragMoveListener(event, element) {
105
+ const { dx, dy } = event;
106
+ const scale = this.scale;
107
+ const deltaX = scale ? dx / scale : dx;
108
+ const deltaY = scale ? dy / scale : dy;
109
+ this.interactService.updateDeltas(this.interactableId, this.registryId, { deltaX, deltaY }, element);
110
+ }
111
+ setDragStyles(dragElement) {
112
+ this.renderer.setStyle(dragElement, 'touchAction', 'none');
113
+ this.renderer.setStyle(dragElement, 'zIndex', this.dragZIndex);
114
+ this.renderer.setStyle(dragElement, 'position', 'absolute');
115
+ }
116
+ addDragPropertiesToElement(nativeElement) {
117
+ this.renderer.setProperty(nativeElement, 'dropTarget', this.dropzone_dir || null);
118
+ this.renderer.setProperty(nativeElement, 'dragOrigin', this.dropzone_dir || null);
119
+ this.renderer.setProperty(nativeElement, 'dragRef', this);
120
+ }
121
+ mapDragEvent(event) {
122
+ const { target, dropzone } = event;
123
+ const dropzoneElement = dropzone?.target || target.dropTarget?.el.nativeElement;
124
+ const scale = this.scale;
125
+ const positionInDropTarget = target && dropzoneElement
126
+ ? this.interactService.calculatePositionInElement(dropzoneElement, this.previewRef, scale)
127
+ : null;
128
+ return {
129
+ interactEvent: event,
130
+ dragRef: this,
131
+ dragOrigin: target.dragOrigin,
132
+ dropTarget: target.dropTarget,
133
+ positionInDropTarget
134
+ };
135
+ }
136
+ setPosition(x, y) {
137
+ this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.el.nativeElement);
138
+ }
139
+ alignPositionWithInputs(x, y) {
140
+ // short circuit if positions aren't numbers or if they haven't changed
141
+ if (!this.isValidPosition(x, y))
142
+ return;
143
+ this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.el.nativeElement);
144
+ }
145
+ isValidPosition(x, y) {
146
+ return this.isNumeric(x) && this.isNumeric(y);
147
+ }
148
+ // We use use this instead of isNaN here to try and help performance
149
+ // We should be able to reliably restrict to numbers or falsey values
150
+ isNumeric(num) {
151
+ return typeof num === 'number' && !isNaN(num);
152
+ }
153
+ initiateDragEvents(dragConfig, nativeElement) {
154
+ const defaultDragConfig = {
155
+ ...dragConfig,
156
+ enabled: !(this.disabled || this.dragDisabled),
157
+ ...(this.auto_scroll_dir && {
158
+ autoScroll: {
159
+ ...this.auto_scroll_dir.autoScrollConfig,
160
+ container: this.auto_scroll_dir.el.nativeElement
161
+ }
162
+ })
163
+ };
164
+ return interact(nativeElement).draggable(defaultDragConfig)
165
+ .on('dragstart', (event) => {
166
+ const interaction = event.interaction;
167
+ // check if we should append drag element to body
168
+ if (this.enableDragDefault
169
+ && interaction.pointerIsDown
170
+ // TODO: probably don't need following condition checks anymore remove by 2022
171
+ // && !!this.dropzone_dir
172
+ // && !interaction.interacting()
173
+ ) {
174
+ if (this._previewTemplate) {
175
+ const viewRef = this._viewContainerRef.createEmbeddedView(this._previewTemplate.templateRef);
176
+ this.previewRef = getRootNode(viewRef, this._document);
177
+ }
178
+ else {
179
+ this.previewRef = cloneElement(this.el.nativeElement);
180
+ }
181
+ this.addDragPropertiesToElement(this.previewRef);
182
+ this.setDragStyles(this.previewRef);
183
+ this.dragRootEl.prepend(this.previewRef);
184
+ const scale = this.account_for_scale_dir?.scale || this.dragRoot?.account_for_scale_dir?.scale || 1;
185
+ const { x, y } = this.interactService.calculatePositionInElement(this.dragRootEl, nativeElement, scale);
186
+ this.interactService.updatePosition(this.interactableId, this.registryId, { x, y }, this.previewRef);
187
+ if (!this.showPlaceholder) {
188
+ this.renderer.setStyle(this.el.nativeElement, 'display', 'none');
189
+ }
190
+ }
191
+ // subscribe to scroll events if they are there, by only subscribing on dragstart we avoid wasting subscriptions on interactables that aren't be dragged
192
+ if (this.auto_scroll_dir) {
193
+ this.subscribeToScrollEvents();
194
+ }
195
+ this.dragStart.emit(this.mapDragEvent(event));
196
+ })
197
+ .on('dragmove', (event) => {
198
+ if (this.enableDragDefault) {
199
+ const dragElement = this.dropzone_dir && this.previewRef || nativeElement;
200
+ this.dragMoveListener(event, dragElement);
201
+ }
202
+ const mappedEvent = this.mapDragEvent(event);
203
+ this.dragMove.emit(mappedEvent);
204
+ })
205
+ .on('draginertiastart', (event) => {
206
+ this.dragInertiaStart.emit(this.mapDragEvent(event));
207
+ })
208
+ .on('dragend', (event) => {
209
+ const mappedEvent = this.mapDragEvent(event);
210
+ if (!!this.dropzone_dir && this.dropzone_dir === event.target.dropTarget) {
211
+ const { x, y } = mappedEvent.positionInDropTarget;
212
+ this.setPosition(x, y);
213
+ }
214
+ this.renderer.setStyle(this.el.nativeElement, 'display', '');
215
+ this.dragEnd.emit(mappedEvent);
216
+ // unsubscribe from scroll events if subscribed
217
+ if (this.auto_scroll_dir) {
218
+ this.scrollEventsSubscription.unsubscribe();
219
+ }
220
+ if (this.el.nativeElement !== this.previewRef) {
221
+ // we do this in a timeout, so that we don't remove before the dropzone can get the boundingElementRect
222
+ setTimeout(() => {
223
+ this.dragRootEl.removeChild(this.previewRef);
224
+ });
225
+ }
226
+ });
227
+ }
228
+ subscribeToScrollEvents() {
229
+ this.scrollEventsSubscription = this.auto_scroll_dir.scrollDeltaObserver.subscribe(({ scrollLeft, scrollTop }) => {
230
+ const deltaX = this.scale ? scrollLeft / this.scale : scrollLeft;
231
+ const deltaY = this.scale ? scrollTop / this.scale : scrollTop;
232
+ this.interactService.updateDeltas(this.interactableId, this.registryId, { deltaX, deltaY }, this.previewRef);
233
+ });
234
+ }
235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DraggableDirective, deps: [{ token: i0.ElementRef }, { token: i1.InteractService }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: DOCUMENT }, { token: i2.AccountForScaleDirective, optional: true }, { token: i3.DropzoneDirective, optional: true, skipSelf: true }, { token: i4.DragRootDirective, optional: true, skipSelf: true }, { token: i5.AutoScrollDirective, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive }); }
236
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.9", type: DraggableDirective, selector: "[tftDraggable]", inputs: { x: "x", y: "y", dragZIndex: "dragZIndex", zIndex: "zIndex", interactableId: "interactableId", dragData: "dragData", enableDragDefault: "enableDragDefault", disabled: "disabled", dragDisabled: "dragDisabled", dragConfig: "dragConfig", showPlaceholder: "showPlaceholder", dragRoot: "dragRoot" }, outputs: { dragStart: "dragStart", dragMove: "dragMove", dragInertiaStart: "dragInertiaStart", dragEnd: "dragEnd" }, host: { properties: { "style.touchAction": "this.dragDisabled ? \"auto\" : \"none\"", "style.position": "\"absolute\"", "id": "interactableId" } }, queries: [{ propertyName: "_previewTemplate", first: true, predicate: DragPreviewDirective, descendants: true }], usesOnChanges: true, ngImport: i0 }); }
237
+ }
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DraggableDirective, decorators: [{
239
+ type: Directive,
240
+ args: [{
241
+ selector: '[tftDraggable]',
242
+ // eslint-disable-next-line @angular-eslint/no-host-metadata-property
243
+ host: {
244
+ '[style.touchAction]': 'this.dragDisabled ? "auto" : "none"',
245
+ '[style.position]': '"absolute"',
246
+ '[id]': 'interactableId',
247
+ }
248
+ }]
249
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.InteractService }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: Document, decorators: [{
250
+ type: Inject,
251
+ args: [DOCUMENT]
252
+ }] }, { type: i2.AccountForScaleDirective, decorators: [{
253
+ type: Optional
254
+ }] }, { type: i3.DropzoneDirective, decorators: [{
255
+ type: Optional
256
+ }, {
257
+ type: SkipSelf
258
+ }] }, { type: i4.DragRootDirective, decorators: [{
259
+ type: Optional
260
+ }, {
261
+ type: SkipSelf
262
+ }] }, { type: i5.AutoScrollDirective, decorators: [{
263
+ type: Optional
264
+ }, {
265
+ type: SkipSelf
266
+ }] }], propDecorators: { x: [{
267
+ type: Input
268
+ }], y: [{
269
+ type: Input
270
+ }], dragZIndex: [{
271
+ type: Input
272
+ }], zIndex: [{
273
+ type: Input
274
+ }], interactableId: [{
275
+ type: Input
276
+ }], dragData: [{
277
+ type: Input
278
+ }], enableDragDefault: [{
279
+ type: Input
280
+ }], disabled: [{
281
+ type: Input
282
+ }], dragDisabled: [{
283
+ type: Input
284
+ }], dragConfig: [{
285
+ type: Input
286
+ }], showPlaceholder: [{
287
+ type: Input
288
+ }], dragRoot: [{
289
+ type: Input
290
+ }], dragStart: [{
291
+ type: Output
292
+ }], dragMove: [{
293
+ type: Output
294
+ }], dragInertiaStart: [{
295
+ type: Output
296
+ }], dragEnd: [{
297
+ type: Output
298
+ }], _previewTemplate: [{
299
+ type: ContentChild,
300
+ args: [DragPreviewDirective]
301
+ }] } });
302
+ /**
303
+ * Component utils
304
+ */
305
+ // create a clone of the component passed in and add it to the root component
306
+ function cloneElement(element) {
307
+ const clone = element.cloneNode(true);
308
+ clone.removeAttribute('id');
309
+ return clone;
310
+ }
311
+ function getPreviewInsertionPoint(documentRef) {
312
+ // We can't use the body if the user is in fullscreen mode,
313
+ // because the preview will render under the fullscreen element.
314
+ return documentRef.fullscreenElement ||
315
+ documentRef.webkitFullscreenElement ||
316
+ documentRef.mozFullScreenElement ||
317
+ documentRef.msFullscreenElement ||
318
+ documentRef.body;
319
+ }
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi9kaXJlY3RpdmVzL2RyYWdnYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFDdkMsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUE0QixZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUMsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUcvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQTZCLG1CQUFtQixFQUE0QixNQUFNLFdBQVcsQ0FBQztBQUNyRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7O0FBRTlELGVBQWU7QUFVZiw4REFBOEQ7QUFDOUQsTUFBTSxPQUFPLGtCQUFrQjtJQTRDN0IsMkNBQTJDO0lBQzNDLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLHFCQUFxQixFQUFF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Qzs7R0FFRztBQUNILDZFQUE2RTtBQUM3RSxTQUFTLFlBQVksQ0FBQyxPQUFvQjtJQUN4QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBZ0IsQ0FBQztJQUNyRCxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUNELFNBQVMsd0JBQXdCLENBQUMsV0FBZ0I7SUFDaEQsMkRBQTJEO0lBQzNELGdFQUFnRTtJQUNoRSxPQUFPLFdBQVcsQ0FBQyxpQkFBaUI7UUFDN0IsV0FBVyxDQUFDLHVCQUF1QjtRQUNuQyxXQUFXLENBQUMsb0JBQW9CO1FBQ2hDLFdBQVcsQ0FBQyxtQkFBbUI7UUFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsXG4gICBPbkRlc3Ryb3ksIEV2ZW50RW1pdHRlciwgT3B0aW9uYWwsIFNraXBTZWxmLCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgQ29udGVudENoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBJbmplY3QsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IGludGVyYWN0IGZyb20gJ2ludGVyYWN0anMnO1xuaW1wb3J0IHsgSW50ZXJhY3RTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaW50ZXJhY3Quc2VydmljZSc7XG5pbXBvcnQgeyBEcmFnZ2FibGVPcHRpb25zLCBJbnRlcmFjdGFibGUgfSBmcm9tICdAaW50ZXJhY3Rqcy90eXBlcy9pbmRleCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERyb3B6b25lRGlyZWN0aXZlIH0gZnJvbSAnLi9kcm9wem9uZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdEcmFnRXZlbnQsIFRmdERyYWdFdmVudCwgREVGQVVMVF9SRUdJU1RSWV9JRCwgVGZ0Q29vcmRzLCBUZnREcmFnRWxlbWVudH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IERyYWdQcmV2aWV3RGlyZWN0aXZlIH0gZnJvbSAnLi9kcmFnLXByZXZpZXcuZGlyZWN0aXZlJztcbmltcG9ydCB7IGdldFJvb3ROb2RlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgRHJhZ1Jvb3REaXJlY3RpdmUgfSBmcm9tICcuL2RyYWctcm9vdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWNjb3VudEZvclNjYWxlRGlyZWN0aXZlIH0gZnJvbSAnLi9hY2NvdW50LWZvci1zY2FsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQXV0b1Njcm9sbERpcmVjdGl2ZSB9IGZyb20gJy4vYXV0by1zY3JvbGwuZGlyZWN0aXZlJztcblxuLyoqIEBkeW5hbWljICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdGZ0RHJhZ2dhYmxlXScsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taG9zdC1tZXRhZGF0YS1wcm9wZXJ0eVxuICBob3N0OiB7XG4gICAgJ1tzdHlsZS50b3VjaEFjdGlvbl0nOiAndGhpcy5kcmFnRGlzYWJsZWQgPyBcImF1dG9cIiA6IFwibm9uZVwiJyxcbiAgICAnW3N0eWxlLnBvc2l0aW9uXSc6ICdcImFic29sdXRlXCInLFxuICAgICdbaWRdJzogJ2ludGVyYWN0YWJsZUlkJyxcbiAgfVxufSlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgRHJhZ2dhYmxlRGlyZWN0aXZlPEQgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cblxuICBASW5wdXQoKSB4OiBudW1iZXI7XG4gIEBJbnB1dCgpIHk6IG51bWJlcjtcbiAgLyogekluZGV4IHdoaWxlIGRyYWdnaW5nKi9cbiAgQElucHV0KCkgZHJhZ1pJbmRleCA9IDEwMDAwO1xuICAvKiogekluZGV4IHdoaWxlIGF0IHJlc3QgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXJcbiAgQElucHV0KCkgaW50ZXJhY3RhYmxlSWQ6IHN0cmluZztcbiAgQElucHV0KCkgZHJhZ0RhdGE6IEQ7XG4gIEBJbnB1dCgpIGVuYWJsZURyYWdEZWZhdWx0ID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5ICdkcmFnRGlzYWJsZWQnIHByb3BlcnR5LCBwbGVhc2UgbWlncmF0ZSBiZWZvcmUgdjEzXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBkcmFnRGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZHJhZ0NvbmZpZzogUGFydGlhbDxJbnRlcmFjdC5PckJvb2xlYW48RHJhZ2dhYmxlT3B0aW9ucz4+O1xuICBASW5wdXQoKSBzaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIGVsZW1lbnQgd2Ugd2FudCB0byBwcmVwZW5kIHRoZSBkcmFnIGVsZW1lbnQgdG8uXG4gICAqIFVzZSBgdGZ0RHJhZ1Jvb3RgIGRpcmVjdGl2ZSBvbiBhIHBhcmVudCBlbGVtZW50IHRvIHNldCBjdXN0b20gcm9vdCBlbGVtZW50XG4gICAqICBAZGVmYXVsdCBkb2N1bWVudC5ib2R5XG4gICAqL1xuICBASW5wdXQoKSBkcmFnUm9vdDogRHJhZ1Jvb3REaXJlY3RpdmU7IC8vIEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgZHJhZ1Jvb3RFbDogSFRNTEVsZW1lbnQ7XG4gIC8vIHBpcGVzIGFsbCBpbnRlcmFjdCBldmVudHMgdG8gZXZlbnQgZW1pdHRlcnNcbiAgQE91dHB1dCgpIGRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8VGZ0RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJhZ01vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdJbmVydGlhU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPFRmdERyYWdFdmVudD4oKTtcblxuICBAQ29udGVudENoaWxkKERyYWdQcmV2aWV3RGlyZWN0aXZlKSBfcHJldmlld1RlbXBsYXRlOiBEcmFnUHJldmlld0RpcmVjdGl2ZTtcbiAgLy8gZHJhZ1ByZXZpZXc6IEludGVyYWN0LkVsZW1lbnQ7XG4gIGludGVyYWN0YWJsZVN0YXRlOiBPYnNlcnZhYmxlPFRmdENvb3Jkcz47XG4gIGludGVyYWN0YWJsZTogSW50ZXJhY3RhYmxlO1xuICBwcml2YXRlIHJlZ2lzdHJ5SWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpbnRlcmFjdGFibGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBzY3JvbGxFdmVudHNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvLyBjYWNoZSBob2xkaW5nIGVsZW1lbnQgdG8gdXNlIGFzIGRyYWcgcHJldmlldyAodGhlIGVsZW1lbnQgdGhlIHVzZXIgc2VlcyBiZWluZyBkcmFnZ2VkIGFyb3VuZClcbiAgcHJldmlld1JlZjogVGZ0RHJhZ0VsZW1lbnQ7XG4gIC8vIGNoZWNrIGFsbCB0aGUgZGlmZmVyZW50IHBsYWNlcyBmb3Igc2NhbGVcbiAgZ2V0IHNjYWxlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudF9mb3Jfc2NhbGVfZGlyPy5zY2FsZSB8fCB0aGlzLmRyYWdfcm9vdF9kaXI/LmFjY291bnRfZm9yX3NjYWxlX2Rpcj8uc2NhbGUgfHwgdGhpcy5kcmFnUm9vdD8uYWNjb3VudF9mb3Jfc2NhbGVfZGlyPy5zY2FsZSB8fCAxO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgaW50ZXJhY3RTZXJ2aWNlOiBJbnRlcmFjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBhY2NvdW50X2Zvcl9zY2FsZV9kaXI/OiBBY2NvdW50Rm9yU2NhbGVEaXJlY3RpdmUsXG4gICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHVibGljIGRyb3B6b25lX2Rpcj86IERyb3B6b25lRGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHB1YmxpYyBkcmFnX3Jvb3RfZGlyPzogRHJhZ1Jvb3REaXJlY3RpdmUsXG4gICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKCkgcHVibGljIGF1dG9fc2Nyb2xsX2Rpcj86IEF1dG9TY3JvbGxEaXJlY3RpdmVcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmludGVyYWN0YWJsZSA9IHRoaXMuaW5pdGlhdGVEcmFnRXZlbnRzKHRoaXMuZHJhZ0NvbmZpZywgdGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLmRyYWdSb290RWwgPSAodGhpcy5kcmFnUm9vdD8uZWw/Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5kcmFnX3Jvb3RfZGlyPy5lbD8ubmF0aXZlRWxlbWVudCkgYXMgSFRNTEVsZW1lbnQgfHwgdGhpcy5fZG9jdW1lbnQuYm9keTtcbiAgICAvLyByZWdpc3RlciB3aXRoIHBhcmVudCBkcm9wem9uZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB1c2UgZGVmYXVsdFxuICAgIC8vIHRoaXMgZ2l2ZXMgdXMgYSBwbGFjZSBvbiB0aGUgcmVnaXN0cnkgdG8gc3RvcmUgb3VyIGRyYWcgaXRlbXMgdGhhdCBkb24ndCBoYXZlIGEgZHJvcHpvbmVcbiAgICB0aGlzLnJlZ2lzdHJ5SWQgPSB0aGlzLmRyb3B6b25lX2Rpcj8uZHJvcHpvbmVJZCB8fCBERUZBVUxUX1JFR0lTVFJZX0lEO1xuICAgIC8vIGFkZCBkcmFnZ2FibGUgdG8gZGlyZWN0b3J5IGFuZCBzdG9yZSBpdHMgaWRcbiAgICB0aGlzLmludGVyYWN0YWJsZUlkID0gdGhpcy5pbnRlcmFjdFNlcnZpY2UuYWRkRHJhZ2dhYmxlVG9SZWdpc3RyeSh0aGlzLnJlZ2lzdHJ5SWQsIHRoaXMuaW50ZXJhY3RhYmxlSWQpO1xuICAgIHRoaXMuYWxpZ25Qb3NpdGlvbldpdGhJbnB1dHModGhpcy54LCB0aGlzLnkpO1xuICAgIC8vIGNhY2hlIHN1YnNjcmlwdGlvbiB0byBpbnRlcmFjdGFibGUgc3RhdGUgc28gd2UgY2FuIHVuc3Vic2NyaWJlIG9uRGVzdHJveVxuICAgIHRoaXMuaW50ZXJhY3RhYmxlU3RhdGUgPSB0aGlzLmludGVyYWN0U2VydmljZVxuICAgICAgLmdldEludGVyYWN0YWJsZVN0YXRlKHRoaXMuaW50ZXJhY3RhYmxlSWQsIHRoaXMucmVnaXN0cnlJZCk7XG4gICAgLy8ga2VlcCBvdXIgY2FjaGVkIHBvc2l0aW9uIHZhbHVlcyBpbiBsaW5lIHdpdGggb3VyIGRyYWcgc3RhdGVcbiAgICB0aGlzLmludGVyYWN0YWJsZVN1YnNjcmlwdGlvbiA9IHRoaXMuaW50ZXJhY3RhYmxlU3RhdGUuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgdGhpcy55ID0gc3RhdGUueTtcbiAgICAgIHRoaXMueCA9IHN0YXRlLng7XG4gICAgfSk7XG4gICAgdGhpcy5zZXREcmFnQ29uZmlnKCk7XG4gIH1cblxuICAvLyBUT0RPOiB3YXRjaCBjb25maWcgaGVyZSBhcyB3ZWxsIGFuZCB1cGRhdGUgaW50ZXJhY3RhYmxlXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyB3ZSBkbyB0aGlzIGhlcmUgaW5zdGVhZCBvZiB1c2luZyBhIHNldHRlciBvbiB0aGUgaW5wdXQgc28gdGhhdCBpdFxuICAgIC8vIHdpbGwgb25seSBydW4gb25jZSB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIHRvIHggYW5kIHlcbiAgICBpZihjaGFuZ2VzLnkgfHwgY2hhbmdlcy54KSB7XG4gICAgICB0aGlzLmFsaWduUG9zaXRpb25XaXRoSW5wdXRzKHRoaXMueCwgdGhpcy55KTtcbiAgICB9XG4gICAgaWYoY2hhbmdlcy5kcmFnQ29uZmlnIHx8IGNoYW5nZXMuZGlzYWJsZWQgfHwgY2hhbmdlcy5kcmFnRGlzYWJsZWQpIHtcbiAgICAgIGlmKCF0aGlzLmludGVyYWN0YWJsZSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXREcmFnQ29uZmlnKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHJlbW92ZSB0aGlzIGluIHYxM1xuICAgICAqL1xuICAgIGlmIChjaGFuZ2VzLmRpc2FibGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEl0IGxvb2tzIGxpa2UgeW91ciB1c2luZyB0aGUgJ2Rpc2FibGVkJyBpbnB1dCBvbiBhIHRmdERyYWdnYWJsZSBkaXJlY3RpdmUsIGl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGlzIHJlcGxhY2VkIHdpdGggJ2RyYWdEaXNhYmxlZCcsIHBsZWFzZSBtaWdyYXRlIGJ5IHYxM2ApXG4gICAgfVxuICB9XG5cbiAgc2V0RHJhZ0NvbmZpZygpIHtcbiAgICBjb25zdCBlbmFibGVkID0gISh0aGlzLmRpc2FibGVkIHx8IHRoaXMuZHJhZ0Rpc2FibGVkKVxuICAgIGNvbnN0IGRyYWdDb25maWcgPSB7Li4udGhpcy5kcmFnQ29uZmlnLCBlbmFibGVkfTtcbiAgICB0aGlzLmludGVyYWN0YWJsZS5kcmFnZ2FibGUoZHJhZ0NvbmZpZyk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5hZGREcmFnUHJvcGVydGllc1RvRWxlbWVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIGlmICghdGhpcy5kcm9wem9uZV9kaXIpIHtcbiAgICAgIHRoaXMucHJldmlld1JlZiA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBjbGVhbiB1cCBzdGF0ZSBhbmQgc3Vic2NyaXB0aW9ucyByZWxhdGVkIHRvIGRlc3Ryb3llZCBjb21wb25lbnRcbiAgICB0aGlzLmludGVyYWN0YWJsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLmRlc3Ryb3lJbnRlcmFjdGFibGUodGhpcy5pbnRlcmFjdGFibGVJZCwgdGhpcy5yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIGRyYWdNb3ZlTGlzdGVuZXIoZXZlbnQ6IE5nRHJhZ0V2ZW50LCBlbGVtZW50OiBJbnRlcmFjdC5FbGVtZW50KSB7XG4gICAgY29uc3QgeyBkeCwgZHkgfSA9IGV2ZW50O1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICBjb25zdCBkZWx0YVggPSBzY2FsZSA/IGR4IC8gc2NhbGUgOiBkeDtcbiAgICBjb25zdCBkZWx0YVkgPSBzY2FsZSA/IGR5IC8gc2NhbGUgOiBkeTtcblxuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLnVwZGF0ZURlbHRhcyhcbiAgICAgIHRoaXMuaW50ZXJhY3RhYmxlSWQsXG4gICAgICB0aGlzLnJlZ2lzdHJ5SWQsXG4gICAgICB7ZGVsdGFYLCBkZWx0YVl9LFxuICAgICAgZWxlbWVudFxuICAgICk7XG4gIH1cblxuICBzZXREcmFnU3R5bGVzKGRyYWdFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZHJhZ0VsZW1lbnQsICd0b3VjaEFjdGlvbicsICdub25lJylcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRyYWdFbGVtZW50LCAnekluZGV4JywgdGhpcy5kcmFnWkluZGV4KVxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZHJhZ0VsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gIH1cblxuICBhZGREcmFnUHJvcGVydGllc1RvRWxlbWVudChuYXRpdmVFbGVtZW50OiBUZnREcmFnRWxlbWVudCkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkobmF0aXZlRWxlbWVudCwgJ2Ryb3BUYXJnZXQnLCB0aGlzLmRyb3B6b25lX2RpciB8fCBudWxsKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KG5hdGl2ZUVsZW1lbnQsICdkcmFnT3JpZ2luJywgdGhpcy5kcm9wem9uZV9kaXIgfHwgbnVsbCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShuYXRpdmVFbGVtZW50LCAnZHJhZ1JlZicsIHRoaXMpO1xuICB9XG5cbiAgbWFwRHJhZ0V2ZW50KGV2ZW50OiBOZ0RyYWdFdmVudCk6IFRmdERyYWdFdmVudCB7XG4gICAgY29uc3QgeyB0YXJnZXQsIGRyb3B6b25lIH0gPSBldmVudDtcbiAgICBjb25zdCBkcm9wem9uZUVsZW1lbnQgPSBkcm9wem9uZT8udGFyZ2V0IHx8IHRhcmdldC5kcm9wVGFyZ2V0Py5lbC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICBjb25zdCBwb3NpdGlvbkluRHJvcFRhcmdldCA9IHRhcmdldCAmJiBkcm9wem9uZUVsZW1lbnRcbiAgICAgID8gdGhpcy5pbnRlcmFjdFNlcnZpY2UuY2FsY3VsYXRlUG9zaXRpb25JbkVsZW1lbnQoZHJvcHpvbmVFbGVtZW50LCB0aGlzLnByZXZpZXdSZWYsIHNjYWxlKVxuICAgICAgOiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICBpbnRlcmFjdEV2ZW50OiBldmVudCxcbiAgICAgIGRyYWdSZWY6IHRoaXMsXG4gICAgICBkcmFnT3JpZ2luOiB0YXJnZXQuZHJhZ09yaWdpbixcbiAgICAgIGRyb3BUYXJnZXQ6IHRhcmdldC5kcm9wVGFyZ2V0LFxuICAgICAgcG9zaXRpb25JbkRyb3BUYXJnZXRcbiAgICB9XG4gIH1cblxuICBzZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLnVwZGF0ZVBvc2l0aW9uKFxuICAgICAgdGhpcy5pbnRlcmFjdGFibGVJZCxcbiAgICAgIHRoaXMucmVnaXN0cnlJZCxcbiAgICAgIHt4LCB5fSxcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICBhbGlnblBvc2l0aW9uV2l0aElucHV0cyh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIC8vIHNob3J0IGNpcmN1aXQgaWYgcG9zaXRpb25zIGFyZW4ndCBudW1iZXJzIG9yICBpZiB0aGV5IGhhdmVuJ3QgY2hhbmdlZFxuICAgIGlmKCF0aGlzLmlzVmFsaWRQb3NpdGlvbih4LCB5KSkgcmV0dXJuO1xuICAgIHRoaXMuaW50ZXJhY3RTZXJ2aWNlLnVwZGF0ZVBvc2l0aW9uKFxuICAgICAgdGhpcy5pbnRlcmFjdGFibGVJZCxcbiAgICAgIHRoaXMucmVnaXN0cnlJZCxcbiAgICAgIHt4LCB5fSxcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICBpc1ZhbGlkUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5pc051bWVyaWMoeCkgJiYgdGhpcy5pc051bWVyaWMoeSk7XG4gIH1cbiAgLy8gV2UgdXNlIHVzZSB0aGlzIGluc3RlYWQgb2YgaXNOYU4gaGVyZSB0byB0cnkgYW5kIGhlbHAgcGVyZm9ybWFuY2VcbiAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVsaWFibHkgcmVzdHJpY3QgdG8gbnVtYmVycyBvciBmYWxzZXkgdmFsdWVzXG4gIGlzTnVtZXJpYyhudW06IG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgbnVtID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obnVtKTtcbiAgfVxuXG4gIGluaXRpYXRlRHJhZ0V2ZW50cyhkcmFnQ29uZmlnOiBQYXJ0aWFsPEludGVyYWN0Lk9yQm9vbGVhbjxEcmFnZ2FibGVPcHRpb25zPj4sIG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgZGVmYXVsdERyYWdDb25maWcgPSB7XG4gICAgICAuLi5kcmFnQ29uZmlnLFxuICAgICAgZW5hYmxlZDogICEodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmRyYWdEaXNhYmxlZCksXG4gICAgICAuLi4odGhpcy5hdXRvX3Njcm9sbF9kaXIgJiYge1xuICAgICAgICBhdXRvU2Nyb2xsOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnRoaXMuYXV0b19zY3JvbGxfZGlyLmF1dG9TY3JvbGxDb25maWcsXG4gICAgICAgICAgICBjb250YWluZXI6IHRoaXMuYXV0b19zY3JvbGxfZGlyLmVsLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9O1xuICAgIHJldHVybiBpbnRlcmFjdChuYXRpdmVFbGVtZW50KS5kcmFnZ2FibGUoZGVmYXVsdERyYWdDb25maWcpXG4gICAgICAub24oJ2RyYWdzdGFydCcsICAoZXZlbnQ6IE5nRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gZXZlbnQuaW50ZXJhY3Rpb247XG4gICAgICAgIC8vIGNoZWNrIGlmIHdlIHNob3VsZCBhcHBlbmQgZHJhZyBlbGVtZW50IHRvIGJvZHlcbiAgICAgICAgaWYgKCB0aGlzLmVuYWJsZURyYWdEZWZhdWx0XG4gICAgICAgICAgJiYgaW50ZXJhY3Rpb24ucG9pbnRlcklzRG93blxuICAgICAgICAgIC8vIFRPRE86IHByb2JhYmx5IGRvbid0IG5lZWQgZm9sbG93aW5nIGNvbmRpdGlvbiBjaGVja3MgYW55bW9yZSByZW1vdmUgYnkgMjAyMlxuICAgICAgICAgIC8vICYmICEhdGhpcy5kcm9wem9uZV9kaXJcbiAgICAgICAgICAvLyAmJiAhaW50ZXJhY3Rpb24uaW50ZXJhY3RpbmcoKVxuICAgICAgICAgICkge1xuICAgICAgICAgIGlmICh0aGlzLl9wcmV2aWV3VGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl9wcmV2aWV3VGVtcGxhdGUudGVtcGxhdGVSZWYpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3UmVmID0gZ2V0Um9vdE5vZGUodmlld1JlZiwgdGhpcy5fZG9jdW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpZXdSZWYgPSBjbG9uZUVsZW1lbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGREcmFnUHJvcGVydGllc1RvRWxlbWVudCh0aGlzLnByZXZpZXdSZWYpO1xuICAgICAgICAgIHRoaXMuc2V0RHJhZ1N0eWxlcyh0aGlzLnByZXZpZXdSZWYpXG5cbiAgICAgICAgICB0aGlzLmRyYWdSb290RWwucHJlcGVuZCh0aGlzLnByZXZpZXdSZWYpO1xuICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5hY2NvdW50X2Zvcl9zY2FsZV9kaXI/LnNjYWxlIHx8IHRoaXMuZHJhZ1Jvb3Q/LmFjY291bnRfZm9yX3NjYWxlX2Rpcj8uc2NhbGUgfHwgMTtcbiAgICAgICAgICBjb25zdCB7eCwgeX0gPSB0aGlzLmludGVyYWN0U2VydmljZS5jYWxjdWxhdGVQb3NpdGlvbkluRWxlbWVudCh0aGlzLmRyYWdSb290RWwsIG5hdGl2ZUVsZW1lbnQsIHNjYWxlKTtcbiAgICAgICAgICB0aGlzLmludGVyYWN0U2VydmljZS51cGRhdGVQb3NpdGlvbih0aGlzLmludGVyYWN0YWJsZUlkLCB0aGlzLnJlZ2lzdHJ5SWQsIHt4LCB5fSwgdGhpcy5wcmV2aWV3UmVmKTtcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd1BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc2Nyb2xsIGV2ZW50cyBpZiB0aGV5IGFyZSB0aGVyZSwgYnkgb25seSBzdWJzY3JpYmluZyBvbiBkcmFnc3RhcnQgd2UgYXZvaWQgd2FzdGluZyBzdWJzY3JpcHRpb25zIG9uIGludGVyYWN0YWJsZXMgdGhhdCBhcmVuJ3QgYmUgZHJhZ2dlZFxuICAgICAgICBpZiAodGhpcy5hdXRvX3Njcm9sbF9kaXIpIHtcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvU2Nyb2xsRXZlbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kcmFnU3RhcnQuZW1pdCh0aGlzLm1hcERyYWdFdmVudChldmVudCkpO1xuICAgICAgfSlcbiAgICAgIC5vbignZHJhZ21vdmUnLCAoZXZlbnQ6IE5nRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZURyYWdEZWZhdWx0KSB7XG4gICAgICAgICAgY29uc3QgZHJhZ0VsZW1lbnQgPSB0aGlzLmRyb3B6b25lX2RpciAmJiB0aGlzLnByZXZpZXdSZWYgfHwgbmF0aXZlRWxlbWVudFxuICAgICAgICAgIHRoaXMuZHJhZ01vdmVMaXN0ZW5lcihldmVudCwgZHJhZ0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcHBlZEV2ZW50ID0gdGhpcy5tYXBEcmFnRXZlbnQoZXZlbnQpO1xuICAgICAgICB0aGlzLmRyYWdNb3ZlLmVtaXQobWFwcGVkRXZlbnQpO1xuICAgICAgfSlcbiAgICAgIC5vbignZHJhZ2luZXJ0aWFzdGFydCcsIChldmVudDogTmdEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnSW5lcnRpYVN0YXJ0LmVtaXQodGhpcy5tYXBEcmFnRXZlbnQoZXZlbnQpKVxuICAgICAgfSlcbiAgICAgIC5vbignZHJhZ2VuZCcsIChldmVudDogTmdEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgbWFwcGVkRXZlbnQgPSB0aGlzLm1hcERyYWdFdmVudChldmVudClcbiAgICAgICAgaWYoISF0aGlzLmRyb3B6b25lX2RpciAmJiB0aGlzLmRyb3B6b25lX2RpciA9PT0gZXZlbnQudGFyZ2V0LmRyb3BUYXJnZXQpIHtcbiAgICAgICAgICBjb25zdCB7IHgsIHl9ID0gbWFwcGVkRXZlbnQucG9zaXRpb25JbkRyb3BUYXJnZXQ7XG4gICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbih4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICAgIHRoaXMuZHJhZ0VuZC5lbWl0KG1hcHBlZEV2ZW50KTtcbiAgICAgICAgLy8gdW5zdWJzY3JpYmUgZnJvbSBzY3JvbGwgZXZlbnRzIGlmIHN1YnNjcmliZWRcbiAgICAgICAgaWYgKHRoaXMuYXV0b19zY3JvbGxfZGlyKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxFdmVudHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIHRoaXMuZWwubmF0aXZlRWxlbWVudCAhPT0gdGhpcy5wcmV2aWV3UmVmKSB7XG4gICAgICAgICAgLy8gd2UgZG8gdGhpcyBpbiBhIHRpbWVvdXQsIHNvIHRoYXQgd2UgZG9uJ3QgcmVtb3ZlIGJlZm9yZSB0aGUgZHJvcHpvbmUgY2FuIGdldCB0aGUgYm91bmRpbmdFbGVtZW50UmVjdFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kcmFnUm9vdEVsLnJlbW92ZUNoaWxkKHRoaXMucHJldmlld1JlZik7XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBzdWJzY3JpYmVUb1Njcm9sbEV2ZW50cygpIHtcbiAgICB0aGlzLnNjcm9sbEV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMuYXV0b19zY3JvbGxfZGlyLnNjcm9sbERlbHRhT2JzZXJ2ZXIuc3Vic2NyaWJlKCh7c2Nyb2xsTGVmdCwgc2Nyb2xsVG9wfSkgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gdGhpcy5zY2FsZSA/IHNjcm9sbExlZnQgLyB0aGlzLnNjYWxlIDogc2Nyb2xsTGVmdDtcbiAgICAgIGNvbnN0IGRlbHRhWSA9IHRoaXMuc2NhbGUgPyBzY3JvbGxUb3AgLyB0aGlzLnNjYWxlIDogc2Nyb2xsVG9wO1xuXG4gICAgICB0aGlzLmludGVyYWN0U2VydmljZS51cGRhdGVEZWx0YXMoXG4gICAgICAgIHRoaXMuaW50ZXJhY3RhYmxlSWQsXG4gICAgICAgIHRoaXMucmVnaXN0cnlJZCxcbiAgICAgICAge2RlbHRhWCwgZGVsdGFZfSxcbiAgICAgICAgdGhpcy5wcmV2aWV3UmVmXG4gICAgICApO1xuICAgIH0pO1xuXG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdXRpbHNcbiAqL1xuLy8gY3JlYXRlIGEgY2xvbmUgb2YgdGhlIGNvbXBvbmVudCBwYXNzZWQgaW4gYW5kIGFkZCBpdCB0byB0aGUgcm9vdCBjb21wb25lbnRcbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICBjb25zdCBjbG9uZSA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuICBjbG9uZS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7XG4gIHJldHVybiBjbG9uZTtcbn1cbmZ1bmN0aW9uIGdldFByZXZpZXdJbnNlcnRpb25Qb2ludChkb2N1bWVudFJlZjogYW55KTogSFRNTEVsZW1lbnQge1xuICAvLyBXZSBjYW4ndCB1c2UgdGhlIGJvZHkgaWYgdGhlIHVzZXIgaXMgaW4gZnVsbHNjcmVlbiBtb2RlLFxuICAvLyBiZWNhdXNlIHRoZSBwcmV2aWV3IHdpbGwgcmVuZGVyIHVuZGVyIHRoZSBmdWxsc2NyZWVuIGVsZW1lbnQuXG4gIHJldHVybiBkb2N1bWVudFJlZi5mdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgZG9jdW1lbnRSZWYud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgIGRvY3VtZW50UmVmLm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICBkb2N1bWVudFJlZi5tc0Z1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICBkb2N1bWVudFJlZi5ib2R5O1xufVxuIl19