UNPKG

@uex/web-extensions

Version:

Uex extensions for Angular 6+ web projects

347 lines 28.8 kB
/** * @fileoverview added by tsickle * Generated from: lib/modules/drag-and-drop/drag-and-drop.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable, NgZone } from '@angular/core'; import * as _ from 'lodash'; import { Draggable } from './classes/draggable'; import { DropZone } from './classes/drop-zone'; /** * @record */ function DropZoneRegisterParams() { } if (false) { /** @type {?} */ DropZoneRegisterParams.prototype.element; } /** * @record */ function DraggableRegisterParams() { } if (false) { /** @type {?} */ DraggableRegisterParams.prototype.element; } /** * @record */ function DragHandlerSubscriptions() { } /** * @record */ export function DragAndDropEvent() { } if (false) { /** @type {?} */ DragAndDropEvent.prototype.action; /** @type {?} */ DragAndDropEvent.prototype.data; /** @type {?} */ DragAndDropEvent.prototype.event; } export class DragAndDropService { /** * @param {?} _ngZone */ constructor(_ngZone) { this._ngZone = _ngZone; this.active_draggable = null; this.active_drop_zone = null; this._draggable_id = 0; this._draggables = []; this._draggable_subscriptions = {}; this._drop_zone_id = 0; this._drop_zones = []; this._drop_zone_subscriptions = {}; this._checkLeave = (/** * @param {?} event * @return {?} */ (event) => { /** @type {?} */ const drop_zone = this.active_drop_zone; if (!drop_zone) { return; } if (!drop_zone.dragging_over) { return; } if (drop_zone.element !== event.target && !drop_zone.element.contains((/** @type {?} */ (event.target)))) { drop_zone.$onLeave.emit(); } }); this.addEventListener(document, 'dragenter', this._checkLeave); } /** * @param {?} params * @return {?} */ registerDraggable(params) { /** @type {?} */ const _draggable = new Draggable(this, this._draggable_id, params.element); this._draggable_subscriptions[_draggable.id] = { onStart: _draggable.$onStart.subscribe((/** * @param {?} event * @return {?} */ (event) => { this.active_draggable = _draggable; _draggable.setDragging(true); _draggable.onStart.emit(this.getEvent(event)); })), onEnd: _draggable.$onEnd.subscribe((/** * @param {?} event * @return {?} */ (event) => { this._drop_zones.forEach((/** * @param {?} drop_zone * @return {?} */ (drop_zone) => { if (drop_zone.dragging_over) { drop_zone.$onLeave.emit(); } })); _draggable.setDragging(false); _draggable.onEnd.emit(this.getEvent(event)); this.active_draggable = null; })) }; this._draggables.push(_draggable); this._draggable_id++; return _draggable; } /** * @param {?} draggable * @return {?} */ unregisterDraggable(draggable) { /** @type {?} */ const index = this._draggables.findIndex((/** * @param {?} _draggable * @return {?} */ (_draggable) => _draggable.id == draggable.id)); if (index >= 0) { this._draggables.splice(index, 1); } /** @type {?} */ const subscriptions = this._draggable_subscriptions[draggable.id]; Object.keys(subscriptions).forEach((/** * @param {?} key * @return {?} */ (key) => subscriptions[key].unsubscribe())); delete this._draggable_subscriptions[draggable.id]; draggable.destroy(); } /** * @param {?} params * @return {?} */ registerDropZone(params) { /** @type {?} */ const _drop_zone = new DropZone(this, this._drop_zone_id, params.element); this._drop_zone_subscriptions[_drop_zone.id] = { onEnter: _drop_zone.$onEnter.subscribe((/** * @param {?} event * @return {?} */ (event) => { if (this.isDropZoneRestricted(_drop_zone)) { return; } if (_drop_zone.dragging_over) { return; } if (this.active_drop_zone && this.active_drop_zone.id !== _drop_zone.id) { this.active_drop_zone.$onLeave.emit(); } this.active_drop_zone = _drop_zone; _drop_zone.setDraggingOver(true); _drop_zone.onEnter.emit(this.getEvent(event)); })), onLeave: _drop_zone.$onLeave.subscribe((/** * @return {?} */ () => { if (this.active_drop_zone && this.active_drop_zone.id === _drop_zone.id) { this.active_drop_zone = null; } _drop_zone.setDraggingOver(false); _drop_zone.onLeave.emit(this.getEvent()); })), onDrop: _drop_zone.$onDrop.subscribe((/** * @param {?} event * @return {?} */ (event) => { if (this.isDropZoneRestricted(_drop_zone)) { return; } if (this.active_draggable && this.active_draggable.action === 'move') { // Check and emit "onRemove" event this._drop_zones.forEach((/** * @param {?} drop_zone * @return {?} */ (drop_zone) => { if (_drop_zone.id !== drop_zone.id) { /** @type {?} */ const draggable_index = drop_zone.children.findIndex((/** * @param {?} draggable * @return {?} */ (draggable) => draggable.id === this.active_draggable.id)); if (draggable_index >= 0) { drop_zone.onRemove.emit(this.getEvent(event)); } } })); } _drop_zone.onDrop.emit(this.getEvent(event)); _drop_zone.$onLeave.emit(); })) }; this._drop_zones.push(_drop_zone); this._drop_zone_id++; return _drop_zone; } /** * @param {?} drop_zone * @return {?} */ unregisterDropZone(drop_zone) { /** @type {?} */ const index = this._drop_zones.findIndex((/** * @param {?} _drop_zone * @return {?} */ (_drop_zone) => _drop_zone.id == drop_zone.id)); if (index >= 0) { this._drop_zones.splice(index, 1); } /** @type {?} */ const subscriptions = this._drop_zone_subscriptions[drop_zone.id]; Object.keys(subscriptions).forEach((/** * @param {?} key * @return {?} */ (key) => subscriptions[key].unsubscribe())); delete this._drop_zone_subscriptions[drop_zone.id]; drop_zone.destroy(); } /** * @param {?} element * @param {?} event_name * @param {?} cb * @param {?=} outside_angular * @return {?} */ addEventListener(element, event_name, cb, outside_angular = false) { if (outside_angular) { this._ngZone.runOutsideAngular((/** * @return {?} */ () => element.addEventListener(event_name, cb))); } else { element.addEventListener(event_name, cb); } } /** * @param {?} element * @param {?} event_name * @param {?} cb * @return {?} */ removeEventListener(element, event_name, cb) { element.removeEventListener(event_name, cb); } /** * @param {?} drop_zone * @return {?} */ isDropZoneRestricted(drop_zone) { if (this.active_draggable) { if (drop_zone.element.contains(this.active_draggable.element)) { return true; } if (drop_zone.restriction) { /** @type {?} */ const restriction = _.isArray(drop_zone.restriction) ? ((/** @type {?} */ (drop_zone.restriction))) : [((/** @type {?} */ (drop_zone.restriction)))]; if (restriction.indexOf(this.active_draggable.name) >= 0) { return true; } } return false; } return true; } /** * @param {?=} event * @return {?} */ getEvent(event) { return { action: this.active_draggable ? this.active_draggable.action : 'move', data: this.active_draggable ? this.active_draggable.data : null, event: event || null }; } } DragAndDropService.decorators = [ { type: Injectable } ]; /** @nocollapse */ DragAndDropService.ctorParameters = () => [ { type: NgZone } ]; if (false) { /** @type {?} */ DragAndDropService.prototype.active_draggable; /** @type {?} */ DragAndDropService.prototype.active_drop_zone; /** * @type {?} * @private */ DragAndDropService.prototype._draggable_id; /** * @type {?} * @private */ DragAndDropService.prototype._draggables; /** * @type {?} * @private */ DragAndDropService.prototype._draggable_subscriptions; /** * @type {?} * @private */ DragAndDropService.prototype._drop_zone_id; /** * @type {?} * @private */ DragAndDropService.prototype._drop_zones; /** * @type {?} * @private */ DragAndDropService.prototype._drop_zone_subscriptions; /** * @type {?} * @private */ DragAndDropService.prototype._checkLeave; /** * @type {?} * @private */ DragAndDropService.prototype._ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1hbmQtZHJvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVleC93ZWItZXh0ZW5zaW9ucy8iLCJzb3VyY2VzIjpbImxpYi9tb2R1bGVzL2RyYWctYW5kLWRyb3AvZHJhZy1hbmQtZHJvcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUcvQyxxQ0FFQzs7O0lBREMseUNBQXFCOzs7OztBQUd2QixzQ0FFQzs7O0lBREMsMENBQXFCOzs7OztBQUd2Qix1Q0FJQzs7OztBQUlELHNDQUlDOzs7SUFIQyxrQ0FBbUI7O0lBQ25CLGdDQUFVOztJQUNWLGlDQUFpQjs7QUFJbkIsTUFBTSxPQUFPLGtCQUFrQjs7OztJQUU3QixZQUNVLE9BQWU7UUFBZixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBS2xCLHFCQUFnQixHQUFjLElBQUksQ0FBQztRQUNuQyxxQkFBZ0IsR0FBYSxJQUFJLENBQUM7UUFFakMsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsZ0JBQVcsR0FBZ0IsRUFBRSxDQUFDO1FBQzlCLDZCQUF3QixHQUE2QixFQUFFLENBQUM7UUFFeEQsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsZ0JBQVcsR0FBZSxFQUFFLENBQUM7UUFDN0IsNkJBQXdCLEdBQTZCLEVBQUUsQ0FBQztRQW9KeEQsZ0JBQVc7Ozs7UUFBRyxDQUFDLEtBQWdCLEVBQVEsRUFBRTs7a0JBQ3pDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO1lBRXZDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBQzNCLElB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Ozs7OztJQUV6QywyQ0FBMEI7Ozs7O0lBQzFCLHlDQUFzQzs7Ozs7SUFDdEMsc0RBQWdFOzs7OztJQUVoRSwyQ0FBMEI7Ozs7O0lBQzFCLHlDQUFxQzs7Ozs7SUFDckMsc0RBQWdFOzs7OztJQW9KaEUseUNBU0M7Ozs7O0lBM0tDLHFDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5cclxuaW1wb3J0IHsgRHJhZ2dhYmxlIH0gZnJvbSAnLi9jbGFzc2VzL2RyYWdnYWJsZSc7XHJcbmltcG9ydCB7IERyb3Bab25lIH0gZnJvbSAnLi9jbGFzc2VzL2Ryb3Atem9uZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW50ZXJmYWNlIERyb3Bab25lUmVnaXN0ZXJQYXJhbXMge1xyXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRHJhZ2dhYmxlUmVnaXN0ZXJQYXJhbXMge1xyXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRHJhZ0hhbmRsZXJTdWJzY3JpcHRpb25zIHtcclxuICBbaWQ6IG51bWJlcl06IHtcclxuICAgIFtrZXk6IHN0cmluZ106IFN1YnNjcmlwdGlvbjtcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBEcmFnQWN0aW9uID0gJ21vdmUnIHwgJ2NvcHknO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEcmFnQW5kRHJvcEV2ZW50IHtcclxuICBhY3Rpb246IERyYWdBY3Rpb247XHJcbiAgZGF0YTogYW55O1xyXG4gIGV2ZW50OiBEcmFnRXZlbnQ7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERyYWdBbmREcm9wU2VydmljZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmVcclxuICApIHtcclxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCwgJ2RyYWdlbnRlcicsIHRoaXMuX2NoZWNrTGVhdmUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFjdGl2ZV9kcmFnZ2FibGU6IERyYWdnYWJsZSA9IG51bGw7XHJcbiAgcHVibGljIGFjdGl2ZV9kcm9wX3pvbmU6IERyb3Bab25lID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfZHJhZ2dhYmxlX2lkID0gMDtcclxuICBwcml2YXRlIF9kcmFnZ2FibGVzOiBEcmFnZ2FibGVbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RyYWdnYWJsZV9zdWJzY3JpcHRpb25zOiBEcmFnSGFuZGxlclN1YnNjcmlwdGlvbnMgPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBfZHJvcF96b25lX2lkID0gMDtcclxuICBwcml2YXRlIF9kcm9wX3pvbmVzOiBEcm9wWm9uZVtdID0gW107XHJcbiAgcHJpdmF0ZSBfZHJvcF96b25lX3N1YnNjcmlwdGlvbnM6IERyYWdIYW5kbGVyU3Vic2NyaXB0aW9ucyA9IHt9O1xyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJEcmFnZ2FibGUocGFyYW1zOiBEcmFnZ2FibGVSZWdpc3RlclBhcmFtcyk6IERyYWdnYWJsZSB7XHJcbiAgICBjb25zdCBfZHJhZ2dhYmxlID0gbmV3IERyYWdnYWJsZShcclxuICAgICAgdGhpcyxcclxuICAgICAgdGhpcy5fZHJhZ2dhYmxlX2lkLFxyXG4gICAgICBwYXJhbXMuZWxlbWVudFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLl9kcmFnZ2FibGVfc3Vic2NyaXB0aW9uc1tfZHJhZ2dhYmxlLmlkXSA9IHtcclxuICAgICAgb25TdGFydDogX2RyYWdnYWJsZS4kb25TdGFydC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcclxuICAgICAgICB0aGlzLmFjdGl2ZV9kcmFnZ2FibGUgPSBfZHJhZ2dhYmxlO1xyXG5cclxuICAgICAgICBfZHJhZ2dhYmxlLnNldERyYWdnaW5nKHRydWUpO1xyXG4gICAgICAgIF9kcmFnZ2FibGUub25TdGFydC5lbWl0KHRoaXMuZ2V0RXZlbnQoZXZlbnQpKTtcclxuICAgICAgfSksXHJcbiAgICAgIG9uRW5kOiBfZHJhZ2dhYmxlLiRvbkVuZC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcclxuICAgICAgICB0aGlzLl9kcm9wX3pvbmVzLmZvckVhY2goKGRyb3Bfem9uZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRyb3Bfem9uZS5kcmFnZ2luZ19vdmVyKSB7XHJcbiAgICAgICAgICAgIGRyb3Bfem9uZS4kb25MZWF2ZS5lbWl0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIF9kcmFnZ2FibGUuc2V0RHJhZ2dpbmcoZmFsc2UpO1xyXG4gICAgICAgIF9kcmFnZ2FibGUub25FbmQuZW1pdCh0aGlzLmdldEV2ZW50KGV2ZW50KSk7XHJcblxyXG4gICAgICAgIHRoaXMuYWN0aXZlX2RyYWdnYWJsZSA9IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX2RyYWdnYWJsZXMucHVzaChfZHJhZ2dhYmxlKTtcclxuXHJcbiAgICB0aGlzLl9kcmFnZ2FibGVfaWQrKztcclxuXHJcbiAgICByZXR1cm4gX2RyYWdnYWJsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1bnJlZ2lzdGVyRHJhZ2dhYmxlKGRyYWdnYWJsZTogRHJhZ2dhYmxlKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2RyYWdnYWJsZXMuZmluZEluZGV4KChfZHJhZ2dhYmxlKSA9PiBfZHJhZ2dhYmxlLmlkID09IGRyYWdnYWJsZS5pZCk7XHJcbiAgICBpZiAoaW5kZXggPj0gMCkgeyB0aGlzLl9kcmFnZ2FibGVzLnNwbGljZShpbmRleCwgMSk7IH1cclxuXHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5fZHJhZ2dhYmxlX3N1YnNjcmlwdGlvbnNbZHJhZ2dhYmxlLmlkXTtcclxuICAgIE9iamVjdC5rZXlzKHN1YnNjcmlwdGlvbnMpLmZvckVhY2goKGtleSkgPT4gc3Vic2NyaXB0aW9uc1trZXldLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgZGVsZXRlIHRoaXMuX2RyYWdnYWJsZV9zdWJzY3JpcHRpb25zW2RyYWdnYWJsZS5pZF07XHJcblxyXG4gICAgZHJhZ2dhYmxlLmRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWdpc3RlckRyb3Bab25lKHBhcmFtczogRHJvcFpvbmVSZWdpc3RlclBhcmFtcyk6IERyb3Bab25lIHtcclxuICAgIGNvbnN0IF9kcm9wX3pvbmUgPSBuZXcgRHJvcFpvbmUoXHJcbiAgICAgIHRoaXMsXHJcbiAgICAgIHRoaXMuX2Ryb3Bfem9uZV9pZCxcclxuICAgICAgcGFyYW1zLmVsZW1lbnRcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5fZHJvcF96b25lX3N1YnNjcmlwdGlvbnNbX2Ryb3Bfem9uZS5pZF0gPSB7XHJcbiAgICAgIG9uRW50ZXI6IF9kcm9wX3pvbmUuJG9uRW50ZXIuc3Vic2NyaWJlKChldmVudDogRHJhZ0V2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wWm9uZVJlc3RyaWN0ZWQoX2Ryb3Bfem9uZSkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKF9kcm9wX3pvbmUuZHJhZ2dpbmdfb3ZlcikgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlX2Ryb3Bfem9uZSAmJiB0aGlzLmFjdGl2ZV9kcm9wX3pvbmUuaWQgIT09IF9kcm9wX3pvbmUuaWQpIHtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlX2Ryb3Bfem9uZS4kb25MZWF2ZS5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFjdGl2ZV9kcm9wX3pvbmUgPSBfZHJvcF96b25lO1xyXG5cclxuICAgICAgICBfZHJvcF96b25lLnNldERyYWdnaW5nT3Zlcih0cnVlKTtcclxuICAgICAgICBfZHJvcF96b25lLm9uRW50ZXIuZW1pdCh0aGlzLmdldEV2ZW50KGV2ZW50KSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBvbkxlYXZlOiBfZHJvcF96b25lLiRvbkxlYXZlLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlX2Ryb3Bfem9uZSAmJiB0aGlzLmFjdGl2ZV9kcm9wX3pvbmUuaWQgPT09IF9kcm9wX3pvbmUuaWQpIHtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlX2Ryb3Bfem9uZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfZHJvcF96b25lLnNldERyYWdnaW5nT3ZlcihmYWxzZSk7XHJcbiAgICAgICAgX2Ryb3Bfem9uZS5vbkxlYXZlLmVtaXQodGhpcy5nZXRFdmVudCgpKTtcclxuICAgICAgfSksXHJcbiAgICAgIG9uRHJvcDogX2Ryb3Bfem9uZS4kb25Ecm9wLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRHJvcFpvbmVSZXN0cmljdGVkKF9kcm9wX3pvbmUpKSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVfZHJhZ2dhYmxlICYmIHRoaXMuYWN0aXZlX2RyYWdnYWJsZS5hY3Rpb24gPT09ICdtb3ZlJykge1xyXG4gICAgICAgICAgLy8gQ2hlY2sgYW5kIGVtaXQgXCJvblJlbW92ZVwiIGV2ZW50XHJcbiAgICAgICAgICB0aGlzLl9kcm9wX3pvbmVzLmZvckVhY2goKGRyb3Bfem9uZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoX2Ryb3Bfem9uZS5pZCAhPT0gZHJvcF96b25lLmlkKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlX2luZGV4ID0gZHJvcF96b25lLmNoaWxkcmVuLmZpbmRJbmRleCgoZHJhZ2dhYmxlKSA9PiBkcmFnZ2FibGUuaWQgPT09IHRoaXMuYWN0aXZlX2RyYWdnYWJsZS5pZCk7XHJcbiAgICAgICAgICAgICAgaWYgKGRyYWdnYWJsZV9pbmRleCA+PSAwKSB7IGRyb3Bfem9uZS5vblJlbW92ZS5lbWl0KHRoaXMuZ2V0RXZlbnQoZXZlbnQpKTsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9kcm9wX3pvbmUub25Ecm9wLmVtaXQodGhpcy5nZXRFdmVudChldmVudCkpO1xyXG4gICAgICAgIF9kcm9wX3pvbmUuJG9uTGVhdmUuZW1pdCgpO1xyXG4gICAgICB9KVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9kcm9wX3pvbmVzLnB1c2goX2Ryb3Bfem9uZSk7XHJcblxyXG4gICAgdGhpcy5fZHJvcF96b25lX2lkKys7XHJcblxyXG4gICAgcmV0dXJuIF9kcm9wX3pvbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdW5yZWdpc3RlckRyb3Bab25lKGRyb3Bfem9uZTogRHJvcFpvbmUpOiB2b2lkIHtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZHJvcF96b25lcy5maW5kSW5kZXgoKF9kcm9wX3pvbmUpID0+IF9kcm9wX3pvbmUuaWQgPT0gZHJvcF96b25lLmlkKTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7IHRoaXMuX2Ryb3Bfem9uZXMuc3BsaWNlKGluZGV4LCAxKTsgfVxyXG5cclxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9kcm9wX3pvbmVfc3Vic2NyaXB0aW9uc1tkcm9wX3pvbmUuaWRdO1xyXG4gICAgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiBzdWJzY3JpcHRpb25zW2tleV0udW5zdWJzY3JpYmUoKSk7XHJcbiAgICBkZWxldGUgdGhpcy5fZHJvcF96b25lX3N1YnNjcmlwdGlvbnNbZHJvcF96b25lLmlkXTtcclxuXHJcbiAgICBkcm9wX3pvbmUuZGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCwgZXZlbnRfbmFtZTogc3RyaW5nLCBjYjogKGV2ZW50OiBEcmFnRXZlbnQpID0+IHZvaWQsIG91dHNpZGVfYW5ndWxhcjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAob3V0c2lkZV9hbmd1bGFyKSB7XHJcbiAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRfbmFtZSwgY2IpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudF9uYW1lLCBjYik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCB8IERvY3VtZW50LCBldmVudF9uYW1lOiBzdHJpbmcsIGNiOiAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdm9pZCkge1xyXG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50X25hbWUsIGNiKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0Ryb3Bab25lUmVzdHJpY3RlZChkcm9wX3pvbmU6IERyb3Bab25lKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVfZHJhZ2dhYmxlKSB7XHJcbiAgICAgIGlmIChkcm9wX3pvbmUuZWxlbWVudC5jb250YWlucyh0aGlzLmFjdGl2ZV9kcmFnZ2FibGUuZWxlbWVudCkpIHsgcmV0dXJuIHRydWU7IH1cclxuXHJcbiAgICAgIGlmIChkcm9wX3pvbmUucmVzdHJpY3Rpb24pIHtcclxuICAgICAgICBjb25zdCByZXN0cmljdGlvbiA9IF8uaXNBcnJheShkcm9wX3pvbmUucmVzdHJpY3Rpb24pID8gKDxzdHJpbmdbXT5kcm9wX3pvbmUucmVzdHJpY3Rpb24pIDogWyg8c3RyaW5nPmRyb3Bfem9uZS5yZXN0cmljdGlvbildO1xyXG4gICAgICAgIGlmIChyZXN0cmljdGlvbi5pbmRleE9mKHRoaXMuYWN0aXZlX2RyYWdnYWJsZS5uYW1lKSA+PSAwKSB7IHJldHVybiB0cnVlOyB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFdmVudChldmVudD86IERyYWdFdmVudCk6IERyYWdBbmREcm9wRXZlbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aW9uOiB0aGlzLmFjdGl2ZV9kcmFnZ2FibGUgPyB0aGlzLmFjdGl2ZV9kcmFnZ2FibGUuYWN0aW9uIDogJ21vdmUnLFxyXG4gICAgICBkYXRhOiB0aGlzLmFjdGl2ZV9kcmFnZ2FibGUgPyB0aGlzLmFjdGl2ZV9kcmFnZ2FibGUuZGF0YSA6IG51bGwsXHJcbiAgICAgIGV2ZW50OiBldmVudCB8fCBudWxsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2hlY2tMZWF2ZSA9IChldmVudDogRHJhZ0V2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBkcm9wX3pvbmUgPSB0aGlzLmFjdGl2ZV9kcm9wX3pvbmU7XHJcblxyXG4gICAgaWYgKCFkcm9wX3pvbmUpIHsgcmV0dXJuOyB9XHJcbiAgICBpZiAoIWRyb3Bfem9uZS5kcmFnZ2luZ19vdmVyKSB7IHJldHVybjsgfVxyXG5cclxuICAgIGlmIChkcm9wX3pvbmUuZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmICFkcm9wX3pvbmUuZWxlbWVudC5jb250YWlucyg8Tm9kZT5ldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIGRyb3Bfem9uZS4kb25MZWF2ZS5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==