@tft/interact 12.5.2 → 14.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.
- package/esm2020/index.mjs +6 -0
- package/esm2020/lib/directives/account-for-scale.directive.mjs +26 -0
- package/esm2020/lib/directives/apply-scale.directive.mjs +28 -0
- package/esm2020/lib/directives/auto-scroll.directive.mjs +56 -0
- package/esm2020/lib/directives/drag-preview.directive.mjs +20 -0
- package/esm2020/lib/directives/drag-root.directive.mjs +32 -0
- package/esm2020/lib/directives/draggable.directive.mjs +320 -0
- package/esm2020/lib/directives/dropzone.directive.mjs +114 -0
- package/esm2020/lib/directives/gesturable.directive.mjs +82 -0
- package/esm2020/lib/directives/index.mjs +10 -0
- package/esm2020/lib/directives/resizable.directive.mjs +228 -0
- package/esm2020/lib/interact.module.mjs +66 -0
- package/esm2020/lib/models/index.mjs +2 -0
- package/esm2020/lib/models/interact.mjs +28 -0
- package/esm2020/lib/pipes/array-of-n.pipe.mjs +22 -0
- package/esm2020/lib/pipes/index.mjs +2 -0
- package/esm2020/lib/services/interact.service.mjs +197 -0
- package/esm2020/lib/utils/helpers.mjs +35 -0
- package/esm2020/lib/utils/index.mjs +2 -0
- package/esm2020/tft-interact.mjs +5 -0
- package/fesm2015/{tft-interact.js → tft-interact.mjs} +464 -267
- package/fesm2015/tft-interact.mjs.map +1 -0
- package/fesm2020/tft-interact.mjs +1192 -0
- package/fesm2020/tft-interact.mjs.map +1 -0
- package/lib/directives/account-for-scale.directive.d.ts +3 -0
- package/lib/directives/apply-scale.directive.d.ts +3 -0
- package/lib/directives/auto-scroll.directive.d.ts +34 -0
- package/lib/directives/drag-preview.directive.d.ts +3 -0
- package/lib/directives/drag-root.directive.d.ts +3 -0
- package/lib/directives/draggable.directive.d.ts +8 -1
- package/lib/directives/dropzone.directive.d.ts +5 -0
- package/lib/directives/gesturable.directive.d.ts +3 -0
- package/lib/directives/index.d.ts +1 -0
- package/lib/directives/resizable.directive.d.ts +10 -2
- package/lib/interact.module.d.ts +15 -0
- package/lib/pipes/array-of-n.pipe.d.ts +3 -0
- package/lib/services/interact.service.d.ts +3 -0
- package/package.json +24 -11
- package/tft-interact-14.0.0.tgz +0 -0
- package/bundles/tft-interact.umd.js +0 -1419
- package/bundles/tft-interact.umd.js.map +0 -1
- package/esm2015/index.js +0 -6
- package/esm2015/index.js.map +0 -1
- package/esm2015/index.metadata.json +0 -1
- package/esm2015/lib/directives/account-for-scale.directive.js +0 -26
- package/esm2015/lib/directives/account-for-scale.directive.js.map +0 -1
- package/esm2015/lib/directives/account-for-scale.directive.metadata.json +0 -1
- package/esm2015/lib/directives/apply-scale.directive.js +0 -26
- package/esm2015/lib/directives/apply-scale.directive.js.map +0 -1
- package/esm2015/lib/directives/apply-scale.directive.metadata.json +0 -1
- package/esm2015/lib/directives/drag-preview.directive.js +0 -20
- package/esm2015/lib/directives/drag-preview.directive.js.map +0 -1
- package/esm2015/lib/directives/drag-preview.directive.metadata.json +0 -1
- package/esm2015/lib/directives/drag-root.directive.js +0 -27
- package/esm2015/lib/directives/drag-root.directive.js.map +0 -1
- package/esm2015/lib/directives/drag-root.directive.metadata.json +0 -1
- package/esm2015/lib/directives/draggable.directive.js +0 -265
- package/esm2015/lib/directives/draggable.directive.js.map +0 -1
- package/esm2015/lib/directives/draggable.directive.metadata.json +0 -1
- package/esm2015/lib/directives/dropzone.directive.js +0 -103
- package/esm2015/lib/directives/dropzone.directive.js.map +0 -1
- package/esm2015/lib/directives/dropzone.directive.metadata.json +0 -1
- package/esm2015/lib/directives/gesturable.directive.js +0 -77
- package/esm2015/lib/directives/gesturable.directive.js.map +0 -1
- package/esm2015/lib/directives/gesturable.directive.metadata.json +0 -1
- package/esm2015/lib/directives/index.js +0 -9
- package/esm2015/lib/directives/index.js.map +0 -1
- package/esm2015/lib/directives/index.metadata.json +0 -1
- package/esm2015/lib/directives/resizable.directive.js +0 -175
- package/esm2015/lib/directives/resizable.directive.js.map +0 -1
- package/esm2015/lib/directives/resizable.directive.metadata.json +0 -1
- package/esm2015/lib/interact.module.js +0 -42
- package/esm2015/lib/interact.module.js.map +0 -1
- package/esm2015/lib/interact.module.metadata.json +0 -1
- package/esm2015/lib/models/index.js +0 -2
- package/esm2015/lib/models/index.js.map +0 -1
- package/esm2015/lib/models/index.metadata.json +0 -1
- package/esm2015/lib/models/interact.js +0 -28
- package/esm2015/lib/models/interact.js.map +0 -1
- package/esm2015/lib/models/interact.metadata.json +0 -1
- package/esm2015/lib/pipes/array-of-n.pipe.js +0 -18
- package/esm2015/lib/pipes/array-of-n.pipe.js.map +0 -1
- package/esm2015/lib/pipes/array-of-n.pipe.metadata.json +0 -1
- package/esm2015/lib/pipes/index.js +0 -2
- package/esm2015/lib/pipes/index.js.map +0 -1
- package/esm2015/lib/pipes/index.metadata.json +0 -1
- package/esm2015/lib/services/interact.service.js +0 -196
- package/esm2015/lib/services/interact.service.js.map +0 -1
- package/esm2015/lib/services/interact.service.metadata.json +0 -1
- package/esm2015/lib/utils/helpers.js +0 -35
- package/esm2015/lib/utils/helpers.js.map +0 -1
- package/esm2015/lib/utils/helpers.metadata.json +0 -1
- package/esm2015/lib/utils/index.js +0 -2
- package/esm2015/lib/utils/index.js.map +0 -1
- package/esm2015/lib/utils/index.metadata.json +0 -1
- package/esm2015/tft-interact.js +0 -7
- package/esm2015/tft-interact.js.map +0 -1
- package/esm2015/tft-interact.metadata.json +0 -1
- package/fesm2015/tft-interact.js.map +0 -1
- package/tft-interact-12.5.2.tgz +0 -0
- package/tft-interact.d.ts +0 -6
- package/tft-interact.metadata.json +0 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './lib/interact.module';
|
|
2
|
+
export * from './lib/directives';
|
|
3
|
+
export * from './lib/models';
|
|
4
|
+
export * from './lib/pipes';
|
|
5
|
+
export * from './lib/utils';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2ludGVyYWN0L3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmFjdC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGlyZWN0aXZlcydcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlscyc7XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Directive, ElementRef, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Use to apply scale to the element and tell the drag and resize directives to account for the scale when
|
|
5
|
+
* @example <div tftAccountForScale [scale]="2.5"> <div tftDraggable> </div> </div>
|
|
6
|
+
* @note if `dragRoot` is used this directive should be used on the same element to ensure that the drag
|
|
7
|
+
* element accounts for scale
|
|
8
|
+
*/
|
|
9
|
+
export class AccountForScaleDirective {
|
|
10
|
+
constructor(el) {
|
|
11
|
+
this.el = el;
|
|
12
|
+
// this setup allows consumers to set x, y scale independently or just set them both with scale
|
|
13
|
+
this.scale = 1;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
AccountForScaleDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: AccountForScaleDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
17
|
+
AccountForScaleDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: AccountForScaleDirective, selector: "[tftAccountForScale]", inputs: { scale: "scale" }, ngImport: i0 });
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: AccountForScaleDirective, decorators: [{
|
|
19
|
+
type: Directive,
|
|
20
|
+
args: [{
|
|
21
|
+
selector: '[tftAccountForScale]'
|
|
22
|
+
}]
|
|
23
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { scale: [{
|
|
24
|
+
type: Input
|
|
25
|
+
}] } });
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC1mb3Itc2NhbGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9pbnRlcmFjdC9zcmMvbGliL2RpcmVjdGl2ZXMvYWNjb3VudC1mb3Itc2NhbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFlLEtBQUssRUFBNEIsTUFBTSxlQUFlLENBQUM7O0FBRXBHOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLHdCQUF3QjtJQUluQyxZQUNTLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBSnZCLCtGQUErRjtRQUN0RixVQUFLLEdBQUcsQ0FBQyxDQUFDO0lBSWYsQ0FBQzs7cUhBTk0sd0JBQXdCO3lHQUF4Qix3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFIcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2lCQUNqQztpR0FHVSxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogVXNlIHRvIGFwcGx5IHNjYWxlIHRvIHRoZSBlbGVtZW50IGFuZCB0ZWxsIHRoZSBkcmFnIGFuZCByZXNpemUgZGlyZWN0aXZlcyB0byBhY2NvdW50IGZvciB0aGUgc2NhbGUgd2hlblxuICogQGV4YW1wbGUgPGRpdiB0ZnRBY2NvdW50Rm9yU2NhbGUgW3NjYWxlXT1cIjIuNVwiPiA8ZGl2IHRmdERyYWdnYWJsZT4gPC9kaXY+IDwvZGl2PlxuICogQG5vdGUgaWYgYGRyYWdSb290YCBpcyB1c2VkIHRoaXMgZGlyZWN0aXZlIHNob3VsZCBiZSB1c2VkIG9uIHRoZSBzYW1lIGVsZW1lbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGRyYWdcbiAqIGVsZW1lbnQgYWNjb3VudHMgZm9yIHNjYWxlXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t0ZnRBY2NvdW50Rm9yU2NhbGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBBY2NvdW50Rm9yU2NhbGVEaXJlY3RpdmUge1xuICAvLyB0aGlzIHNldHVwIGFsbG93cyBjb25zdW1lcnMgdG8gc2V0IHgsIHkgc2NhbGUgaW5kZXBlbmRlbnRseSBvciBqdXN0IHNldCB0aGVtIGJvdGggd2l0aCBzY2FsZVxuICBASW5wdXQoKSBzY2FsZSA9IDE7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmXG4gICkgeyB9XG59XG4iXX0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Directive, ElementRef, HostBinding, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ApplyScaleDirective {
|
|
4
|
+
constructor(el) {
|
|
5
|
+
this.el = el;
|
|
6
|
+
this._scale = 1;
|
|
7
|
+
}
|
|
8
|
+
// this setup allows consumers to set x, y scale independently or just set them both with scale
|
|
9
|
+
set scale(val) {
|
|
10
|
+
this._scale;
|
|
11
|
+
this.fontSize = `${val}px`;
|
|
12
|
+
}
|
|
13
|
+
;
|
|
14
|
+
}
|
|
15
|
+
ApplyScaleDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: ApplyScaleDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
16
|
+
ApplyScaleDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: ApplyScaleDirective, selector: "[tftApplyScale]", inputs: { scale: "scale" }, host: { properties: { "style.fontSize": "this.fontSize" } }, ngImport: i0 });
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: ApplyScaleDirective, decorators: [{
|
|
18
|
+
type: Directive,
|
|
19
|
+
args: [{
|
|
20
|
+
selector: '[tftApplyScale]'
|
|
21
|
+
}]
|
|
22
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { scale: [{
|
|
23
|
+
type: Input
|
|
24
|
+
}], fontSize: [{
|
|
25
|
+
type: HostBinding,
|
|
26
|
+
args: ['style.fontSize']
|
|
27
|
+
}] } });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktc2NhbGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9pbnRlcmFjdC9zcmMvbGliL2RpcmVjdGl2ZXMvYXBwbHktc2NhbGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzFFLE1BQU0sT0FBTyxtQkFBbUI7SUFXOUIsWUFDUyxFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQVZ2QixXQUFNLEdBQUcsQ0FBQyxDQUFDO0lBV1AsQ0FBQztJQVZKLCtGQUErRjtJQUNoRyxJQUFhLEtBQUssQ0FBQyxHQUFXO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDWixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUFBLENBQUM7O2dIQVBTLG1CQUFtQjtvR0FBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtpQkFDNUI7aUdBS2MsS0FBSztzQkFBakIsS0FBSztnQkFLeUIsUUFBUTtzQkFBdEMsV0FBVzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdGZ0QXBwbHlTY2FsZV0nXG59KVxuZXhwb3J0IGNsYXNzIEFwcGx5U2NhbGVEaXJlY3RpdmUge1xuXG4gIF9zY2FsZSA9IDE7XG4gICAvLyB0aGlzIHNldHVwIGFsbG93cyBjb25zdW1lcnMgdG8gc2V0IHgsIHkgc2NhbGUgaW5kZXBlbmRlbnRseSBvciBqdXN0IHNldCB0aGVtIGJvdGggd2l0aCBzY2FsZVxuICBASW5wdXQoKSBzZXQgc2NhbGUodmFsOiBudW1iZXIpe1xuICAgIHRoaXMuX3NjYWxlO1xuICAgIHRoaXMuZm9udFNpemUgPSBgJHt2YWx9cHhgO1xuICB9O1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuZm9udFNpemUnKSBmb250U2l6ZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZlxuICApIHsgfVxufVxuIl19
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
+
import { scan, shareReplay } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
;
|
|
6
|
+
/**
|
|
7
|
+
* Use to apply scale to the element and tell the drag and resize directives to account for the scale when
|
|
8
|
+
* @example <div tftAccountForScale [scale]="2.5"> <div tftDraggable> </div> </div>
|
|
9
|
+
* @note if `dragRoot` is used this directive should be used on the same element to ensure that the drag
|
|
10
|
+
* element accounts for scale
|
|
11
|
+
*/
|
|
12
|
+
export class AutoScrollDirective {
|
|
13
|
+
constructor(el) {
|
|
14
|
+
this.el = el;
|
|
15
|
+
/**
|
|
16
|
+
* Limit minimum time between scroll events in milliseconds
|
|
17
|
+
*/
|
|
18
|
+
this.autoScrollConfig = {
|
|
19
|
+
margin: 50,
|
|
20
|
+
distance: 3,
|
|
21
|
+
interval: 50,
|
|
22
|
+
speed: 300,
|
|
23
|
+
enabled: true
|
|
24
|
+
};
|
|
25
|
+
this.scrollDeltaObserver = new Subject();
|
|
26
|
+
const { scrollTop, scrollLeft } = el.nativeElement;
|
|
27
|
+
this.scrollSubject = new BehaviorSubject({ scrollTop, scrollLeft });
|
|
28
|
+
this.scrollObserver = this.scrollSubject.pipe(scan((previous, current) => {
|
|
29
|
+
const scrollTop = current.scrollTop - previous.scrollTop;
|
|
30
|
+
const scrollLeft = current.scrollLeft - previous.scrollLeft;
|
|
31
|
+
this.scrollDeltaObserver.next({ scrollTop, scrollLeft });
|
|
32
|
+
return current;
|
|
33
|
+
}), shareReplay(1));
|
|
34
|
+
this.scrollObserver.subscribe();
|
|
35
|
+
}
|
|
36
|
+
// this setup allows consumers to set x, y scale independently or just set them both with scale
|
|
37
|
+
scroll(scrollEvent) {
|
|
38
|
+
const target = scrollEvent.target;
|
|
39
|
+
const { scrollTop, scrollLeft } = target;
|
|
40
|
+
this.scrollSubject.next({ scrollTop, scrollLeft });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
AutoScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: AutoScrollDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
44
|
+
AutoScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: AutoScrollDirective, selector: "[tftAutoScroll]", inputs: { autoScrollConfig: "autoScrollConfig" }, host: { listeners: { "scroll": "scroll($event)" } }, ngImport: i0 });
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: AutoScrollDirective, decorators: [{
|
|
46
|
+
type: Directive,
|
|
47
|
+
args: [{
|
|
48
|
+
selector: '[tftAutoScroll]'
|
|
49
|
+
}]
|
|
50
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { autoScrollConfig: [{
|
|
51
|
+
type: Input
|
|
52
|
+
}], scroll: [{
|
|
53
|
+
type: HostListener,
|
|
54
|
+
args: ['scroll', ['$event']]
|
|
55
|
+
}] } });
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9pbnRlcmFjdC9zcmMvbGliL2RpcmVjdGl2ZXMvYXV0by1zY3JvbGwuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFVyxDQUFDO0FBQy9EOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQXNCOUIsWUFDUyxFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQXRCdkI7O1dBRUc7UUFDTSxxQkFBZ0IsR0FBRztZQUMxQixNQUFNLEVBQUUsRUFBRTtZQUNWLFFBQVEsRUFBRSxDQUFDO1lBQ1gsUUFBUSxFQUFFLEVBQUU7WUFDWixLQUFLLEVBQUUsR0FBRztZQUNWLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztRQUdPLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBWXpELE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUksRUFBRSxDQUFDLGFBQTZCLENBQUM7UUFDcEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQzNDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN6QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDekQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQzVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQztZQUN2RCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsRUFDRixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQTtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQXZCRCwrRkFBK0Y7SUFDM0QsTUFBTSxDQUFDLFdBQWtCO1FBQzNELE1BQU0sTUFBTSxHQUFJLFdBQVcsQ0FBQyxNQUFzQixDQUFDO1FBQ25ELE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDbEQsQ0FBQzs7Z0hBbkJVLG1CQUFtQjtvR0FBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtpQkFDNUI7aUdBS1UsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVc4QixNQUFNO3NCQUF6QyxZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzY2FuLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW50ZXJmYWNlIFNjcm9sbE9iamVjdCB7c2Nyb2xsVG9wOiBudW1iZXIsIHNjcm9sbExlZnQ6IG51bWJlcn07XG4vKipcbiAqIFVzZSB0byBhcHBseSBzY2FsZSB0byB0aGUgZWxlbWVudCBhbmQgdGVsbCB0aGUgZHJhZyBhbmQgcmVzaXplIGRpcmVjdGl2ZXMgdG8gYWNjb3VudCBmb3IgdGhlIHNjYWxlIHdoZW5cbiAqIEBleGFtcGxlIDxkaXYgdGZ0QWNjb3VudEZvclNjYWxlIFtzY2FsZV09XCIyLjVcIj4gPGRpdiB0ZnREcmFnZ2FibGU+IDwvZGl2PiA8L2Rpdj5cbiAqIEBub3RlIGlmIGBkcmFnUm9vdGAgaXMgdXNlZCB0aGlzIGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCBvbiB0aGUgc2FtZSBlbGVtZW50IHRvIGVuc3VyZSB0aGF0IHRoZSBkcmFnXG4gKiBlbGVtZW50IGFjY291bnRzIGZvciBzY2FsZVxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdGZ0QXV0b1Njcm9sbF0nXG59KVxuZXhwb3J0IGNsYXNzIEF1dG9TY3JvbGxEaXJlY3RpdmUge1xuICAvKipcbiAgICogTGltaXQgbWluaW11bSB0aW1lIGJldHdlZW4gc2Nyb2xsIGV2ZW50cyBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9TY3JvbGxDb25maWcgPSB7XG4gICAgbWFyZ2luOiA1MCxcbiAgICBkaXN0YW5jZTogMyxcbiAgICBpbnRlcnZhbDogNTAsXG4gICAgc3BlZWQ6IDMwMCxcbiAgICBlbmFibGVkOiB0cnVlXG4gIH07XG4gIHByaXZhdGUgc2Nyb2xsU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFNjcm9sbE9iamVjdD47XG4gIHJlYWRvbmx5IHNjcm9sbE9ic2VydmVyOiBPYnNlcnZhYmxlPFNjcm9sbE9iamVjdD47XG4gIHJlYWRvbmx5IHNjcm9sbERlbHRhT2JzZXJ2ZXIgPSBuZXcgU3ViamVjdDxTY3JvbGxPYmplY3Q+KCk7XG4gIC8vIHRoaXMgc2V0dXAgYWxsb3dzIGNvbnN1bWVycyB0byBzZXQgeCwgeSBzY2FsZSBpbmRlcGVuZGVudGx5IG9yIGp1c3Qgc2V0IHRoZW0gYm90aCB3aXRoIHNjYWxlXG4gIEBIb3N0TGlzdGVuZXIoJ3Njcm9sbCcsIFsnJGV2ZW50J10pIHNjcm9sbChzY3JvbGxFdmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSAoc2Nyb2xsRXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCB9ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2Nyb2xsU3ViamVjdC5uZXh0KHtzY3JvbGxUb3AsIHNjcm9sbExlZnR9KVxuICB9XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSA9IChlbC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICB0aGlzLnNjcm9sbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHtzY3JvbGxUb3AsIHNjcm9sbExlZnR9KTtcbiAgICB0aGlzLnNjcm9sbE9ic2VydmVyID0gdGhpcy5zY3JvbGxTdWJqZWN0LnBpcGUoXG4gICAgICBzY2FuKChwcmV2aW91cywgY3VycmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBjdXJyZW50LnNjcm9sbFRvcCAtIHByZXZpb3VzLnNjcm9sbFRvcDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGN1cnJlbnQuc2Nyb2xsTGVmdCAtIHByZXZpb3VzLnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuc2Nyb2xsRGVsdGFPYnNlcnZlci5uZXh0KHtzY3JvbGxUb3AsIHNjcm9sbExlZnR9KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgIClcbiAgICB0aGlzLnNjcm9sbE9ic2VydmVyLnN1YnNjcmliZSgpO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Directive, InjectionToken, Input, TemplateRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export const TFT_DRAG_PREVIEW = new InjectionToken('DragPreviewDirective');
|
|
4
|
+
export class DragPreviewDirective {
|
|
5
|
+
constructor(templateRef) {
|
|
6
|
+
this.templateRef = templateRef;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
DragPreviewDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: DragPreviewDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
10
|
+
DragPreviewDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: DragPreviewDirective, selector: "ng-template[tftDragPreview]", inputs: { dragData: "dragData" }, ngImport: i0 });
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: DragPreviewDirective, decorators: [{
|
|
12
|
+
type: Directive,
|
|
13
|
+
args: [{
|
|
14
|
+
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
15
|
+
selector: 'ng-template[tftDragPreview]',
|
|
16
|
+
}]
|
|
17
|
+
}], ctorParameters: function () { return [{ type: i0.TemplateRef }]; }, propDecorators: { dragData: [{
|
|
18
|
+
type: Input
|
|
19
|
+
}] } });
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1wcmV2aWV3LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi9kaXJlY3RpdmVzL2RyYWctcHJldmlldy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7QUFFNUUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLENBQXVCLHNCQUFzQixDQUFDLENBQUM7QUFNakcsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUFtQixXQUEyQjtRQUEzQixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7SUFBSSxDQUFDOztpSEFIeEMsb0JBQW9CO3FHQUFwQixvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFKaEMsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSw2QkFBNkI7aUJBQ3ZDO2tHQUdTLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSW5qZWN0aW9uVG9rZW4sIElucHV0LCBUZW1wbGF0ZVJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBURlRfRFJBR19QUkVWSUVXID0gbmV3IEluamVjdGlvblRva2VuPERyYWdQcmV2aWV3RGlyZWN0aXZlPignRHJhZ1ByZXZpZXdEaXJlY3RpdmUnKTtcblxuQERpcmVjdGl2ZSh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbdGZ0RHJhZ1ByZXZpZXddJyxcbiB9KVxuZXhwb3J0IGNsYXNzIERyYWdQcmV2aWV3RGlyZWN0aXZlPFQgPSBhbnk+IHtcblxuICBASW5wdXQoKSBkcmFnRGF0YTogVDtcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxUPikgeyB9XG59XG4iXX0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AccountForScaleDirective } from './account-for-scale.directive';
|
|
2
|
+
import { Directive, ElementRef, Optional, Self } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./account-for-scale.directive";
|
|
5
|
+
/**
|
|
6
|
+
* Use this directive to select which element to attach the element to while dragging
|
|
7
|
+
* @example <div tftDragRoot><div tftDraggable> </div> </div>
|
|
8
|
+
* @note this directive will overwrite any style transformations (e.g. transform: scale(2); )
|
|
9
|
+
*/
|
|
10
|
+
export class DragRootDirective {
|
|
11
|
+
constructor(el,
|
|
12
|
+
// This is used when passing a dragRoot as in input to a draggable element that not a child of that dragRoot
|
|
13
|
+
// It allows the the interact service to check if the drag root has some scaling applied to it and account for it when the component is dragged
|
|
14
|
+
account_for_scale_dir) {
|
|
15
|
+
this.el = el;
|
|
16
|
+
this.account_for_scale_dir = account_for_scale_dir;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
DragRootDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: DragRootDirective, deps: [{ token: i0.ElementRef }, { token: i1.AccountForScaleDirective, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
20
|
+
DragRootDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.1", type: DragRootDirective, selector: "[tftDragRoot]", exportAs: ["tftDragRoot"], ngImport: i0 });
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: DragRootDirective, decorators: [{
|
|
22
|
+
type: Directive,
|
|
23
|
+
args: [{
|
|
24
|
+
selector: '[tftDragRoot]',
|
|
25
|
+
exportAs: 'tftDragRoot'
|
|
26
|
+
}]
|
|
27
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.AccountForScaleDirective, decorators: [{
|
|
28
|
+
type: Optional
|
|
29
|
+
}, {
|
|
30
|
+
type: Self
|
|
31
|
+
}] }]; } });
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1yb290LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvaW50ZXJhY3Qvc3JjL2xpYi9kaXJlY3RpdmVzL2RyYWctcm9vdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBRXRFOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLFlBQ1MsRUFBYztJQUNyQiw0R0FBNEc7SUFDNUcsK0lBQStJO0lBQ3BILHFCQUFnRDtRQUhwRSxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBR00sMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtJQUN6RSxDQUFDOzs4R0FQTSxpQkFBaUI7a0dBQWpCLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUo3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixRQUFRLEVBQUUsYUFBYTtpQkFDeEI7OzBCQU9JLFFBQVE7OzBCQUFJLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2NvdW50Rm9yU2NhbGVEaXJlY3RpdmUgfSBmcm9tICcuL2FjY291bnQtZm9yLXNjYWxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIE9wdGlvbmFsLCBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogVXNlIHRoaXMgZGlyZWN0aXZlIHRvIHNlbGVjdCB3aGljaCBlbGVtZW50IHRvIGF0dGFjaCB0aGUgZWxlbWVudCB0byB3aGlsZSBkcmFnZ2luZ1xuICogQGV4YW1wbGUgPGRpdiB0ZnREcmFnUm9vdD48ZGl2IHRmdERyYWdnYWJsZT4gPC9kaXY+IDwvZGl2PlxuICogQG5vdGUgdGhpcyBkaXJlY3RpdmUgd2lsbCBvdmVyd3JpdGUgYW55IHN0eWxlIHRyYW5zZm9ybWF0aW9ucyAoZS5nLiB0cmFuc2Zvcm06IHNjYWxlKDIpOyApXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t0ZnREcmFnUm9vdF0nLFxuICBleHBvcnRBczogJ3RmdERyYWdSb290J1xufSlcbmV4cG9ydCBjbGFzcyBEcmFnUm9vdERpcmVjdGl2ZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmLFxuICAgIC8vIFRoaXMgaXMgdXNlZCB3aGVuIHBhc3NpbmcgYSBkcmFnUm9vdCBhcyBpbiBpbnB1dCB0byBhIGRyYWdnYWJsZSBlbGVtZW50IHRoYXQgbm90IGEgY2hpbGQgb2YgdGhhdCBkcmFnUm9vdFxuICAgIC8vIEl0IGFsbG93cyB0aGUgdGhlIGludGVyYWN0IHNlcnZpY2UgdG8gY2hlY2sgaWYgdGhlIGRyYWcgcm9vdCBoYXMgc29tZSBzY2FsaW5nIGFwcGxpZWQgdG8gaXQgYW5kIGFjY291bnQgZm9yIGl0IHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkcmFnZ2VkXG4gICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgYWNjb3VudF9mb3Jfc2NhbGVfZGlyPzogQWNjb3VudEZvclNjYWxlRGlyZWN0aXZlXG4gICkgeyB9XG59XG4iXX0=
|
|
@@ -0,0 +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
|