UNPKG

ngx-pluto

Version:
248 lines 23.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, ViewChild } from '@angular/core'; import { ViewportRuler } from '@angular/cdk/overlay'; import { CdkDropListGroup, CdkDropList, moveItemInArray } from '../drag-drop/index'; import { Utils } from '../utils'; /** * 可拖拽图片组件 - 上传多张图片时展示多图并可拖拽改变排列顺序 * * <example-url>https://stackblitz.com/edit/np-draggable-pics-sample?embed=1&file=src/app/app.component.html</example-url> */ export class NpDraggablePics { /** * @param {?} viewportRuler */ constructor(viewportRuler) { this.viewportRuler = viewportRuler; /** * 包含图片url的图片列表,可选值id(unique) */ this.items = []; this.dropListEnterPredicate = (/** * @param {?} drag * @param {?} drop * @return {?} */ (drag, drop) => { if (drop == this.placeholder) return true; if (drop != this.activeContainer) return false; /** @type {?} */ let phElement = this.placeholder.element.nativeElement; /** @type {?} */ let sourceElement = drag.dropContainer.element.nativeElement; /** @type {?} */ let dropElement = drop.element.nativeElement; /** @type {?} */ let dragIndex = __indexOf(dropElement.parentElement.children, (this.source ? phElement : sourceElement)); /** @type {?} */ let dropIndex = __indexOf(dropElement.parentElement.children, dropElement); if (!this.source) { this.sourceIndex = dragIndex; this.source = drag.dropContainer; phElement.style.width = sourceElement.clientWidth + 'px'; phElement.style.height = sourceElement.clientHeight + 'px'; sourceElement.parentElement.removeChild(sourceElement); } this.targetIndex = dropIndex; this.target = drop; phElement.style.display = ''; dropElement.parentElement.insertBefore(phElement, (dropIndex > dragIndex ? dropElement.nextSibling : dropElement)); this.placeholder.enter(drag, drag.element.nativeElement.offsetLeft, drag.element.nativeElement.offsetTop); return false; }); this.target = null; this.source = null; } /** * @return {?} */ ngOnInit() { this.items.forEach((/** * @param {?} item * @return {?} */ item => { if (!item.id) { item.id = Utils.ID(); } })); } /** * @return {?} */ ngAfterViewInit() { /** @type {?} */ let phElement = this.placeholder.element.nativeElement; phElement.style.display = 'none'; phElement.parentElement.removeChild(phElement); } /** * @param {?} e * @return {?} */ dragMoved(e) { if (this.isDisabled) { return; } /** @type {?} */ let point = this.getPointerPositionOnPage(e.event); this.listGroup._items.forEach((/** * @param {?} dropList * @return {?} */ dropList => { if (__isInsideDropListClientRect(dropList, point.x, point.y)) { this.activeContainer = dropList; return; } })); } /** * @return {?} */ dropListDropped() { if (!this.target) return; /** @type {?} */ let phElement = this.placeholder.element.nativeElement; /** @type {?} */ let parent = phElement.parentElement; phElement.style.display = 'none'; parent.removeChild(phElement); parent.appendChild(phElement); parent.insertBefore(this.source.element.nativeElement, parent.children[this.sourceIndex]); this.target = null; this.source = null; if (this.sourceIndex != this.targetIndex) moveItemInArray(this.items, this.sourceIndex, this.targetIndex); } /** * Determines the point of the page that was touched by the user. * @param {?} event * @return {?} */ getPointerPositionOnPage(event) { // `touches` will be empty for start/end events so we have to fall back to `changedTouches`. /** @type {?} */ const point = __isTouchEvent(event) ? (event.touches[0] || event.changedTouches[0]) : event; /** @type {?} */ const scrollPosition = this.viewportRuler.getViewportScrollPosition(); return { x: point.pageX - scrollPosition.left, y: point.pageY - scrollPosition.top }; } /** * @param {?} item * @return {?} */ onRemove(item) { /** @type {?} */ let index = this.items.indexOf(item); if (index > -1) { this.items.splice(index, 1); } } } NpDraggablePics.decorators = [ { type: Component, args: [{ selector: `np-draggable-pics`, template: "<div class=\"np-draggable-pics-wrapper item-container\" cdkDropListGroup>\r\n <div cdkDropList [cdkDropListEnterPredicate]=\"dropListEnterPredicate\" (cdkDropListDropped)=\"dropListDropped()\">\r\n </div>\r\n <div cdkDropList *ngFor=\"let item of items\" [cdkDropListEnterPredicate]=\"dropListEnterPredicate\"\r\n (cdkDropListDropped)=\"dropListDropped()\">\r\n <div cdkDrag class=\"item-box\" (cdkDragMoved)=\"dragMoved($event);\" [style.width.px]=\"itemWidth\"\r\n [style.height.px]=\"itemHeight\">\r\n <i class=\"fas fa-times-circle\" *ngIf=\"!isDisabled\" (click)=\"onRemove(item)\"></i>\r\n <img [src]=\"item.url\" [style.width.px]=\"itemWidth\" [style.height.px]=\"itemHeight\">\r\n </div>\r\n </div>\r\n</div>\r\n", host: { 'class': 'host-inline-block' }, encapsulation: ViewEncapsulation.None, styles: [".host-inline-block{display:inline-block}.np-draggable-pics-wrapper.item-container{display:flex;flex-wrap:wrap;min-width:600px;padding:10px}.np-draggable-pics-wrapper.item-container .item-box{height:auto;font-size:30pt;cursor:move;display:flex;justify-content:center;align-items:center;text-align:center;border-radius:4px;position:relative;z-index:1;transition:box-shadow .2s cubic-bezier(0,0,.2,1)}.np-draggable-pics-wrapper.item-container .item-box>.fas.fa-times-circle{position:absolute;top:-6px;right:-6px;font-size:16px;cursor:pointer;border-radius:50%}.cdk-drop-list{display:flex;box-sizing:border-box!important;padding-right:10px;padding-bottom:10px}.cdk-drag-preview{border-radius:4px;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);display:flex;justify-content:center;align-items:center;text-align:center;font-size:30pt;opacity:.8;padding:3px;border:2px dotted gray!important;background-color:transparent!important}.cdk-drag-placeholder{box-sizing:border-box!important;opacity:.2;border:2px dotted gray!important;background-color:#ddd!important}.cdk-drag-animating{transition:transform 250ms cubic-bezier(0,0,.2,1)}"] }] } ]; /** @nocollapse */ NpDraggablePics.ctorParameters = () => [ { type: ViewportRuler } ]; NpDraggablePics.propDecorators = { listGroup: [{ type: ViewChild, args: [CdkDropListGroup,] }], placeholder: [{ type: ViewChild, args: [CdkDropList,] }], items: [{ type: Input }], itemWidth: [{ type: Input }], itemHeight: [{ type: Input }], isDisabled: [{ type: Input }] }; if (false) { /** @type {?} */ NpDraggablePics.prototype.listGroup; /** @type {?} */ NpDraggablePics.prototype.placeholder; /** * 包含图片url的图片列表,可选值id(unique) * @type {?} */ NpDraggablePics.prototype.items; /** * 图片展示宽度 * @type {?} */ NpDraggablePics.prototype.itemWidth; /** * 图片展示高度 * @type {?} */ NpDraggablePics.prototype.itemHeight; /** * 是否禁用图片可拖拽删除 * @type {?} */ NpDraggablePics.prototype.isDisabled; /** @type {?} */ NpDraggablePics.prototype.target; /** @type {?} */ NpDraggablePics.prototype.targetIndex; /** @type {?} */ NpDraggablePics.prototype.source; /** @type {?} */ NpDraggablePics.prototype.sourceIndex; /** @type {?} */ NpDraggablePics.prototype.dragIndex; /** @type {?} */ NpDraggablePics.prototype.activeContainer; /** @type {?} */ NpDraggablePics.prototype.dropListEnterPredicate; /** * @type {?} * @private */ NpDraggablePics.prototype.viewportRuler; } /** * @param {?} collection * @param {?} node * @return {?} */ function __indexOf(collection, node) { return Array.prototype.indexOf.call(collection, node); } ; /** * Determines whether an event is a touch event. * @param {?} event * @return {?} */ function __isTouchEvent(event) { return event.type.startsWith('touch'); } /** * @param {?} dropList * @param {?} x * @param {?} y * @return {?} */ function __isInsideDropListClientRect(dropList, x, y) { const { top, bottom, left, right } = dropList.element.nativeElement.getBoundingClientRect(); return y >= top && y <= bottom && x >= left && x <= right; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLXBpY3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZHJhZ2dhYmxlLXBpY3MvZHJhZ2dhYmxlLXBpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUF3QixTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDekgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQWUsZUFBZSxFQUFXLE1BQU0sb0JBQW9CLENBQUM7QUFDMUcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBZ0JqQyxNQUFNLE9BQU8sZUFBZTs7OztJQXdCMUIsWUFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7Ozs7UUFsQnZDLFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBd0V6RCwyQkFBc0I7Ozs7O1FBQUcsQ0FBQyxJQUFhLEVBQUUsSUFBaUIsRUFBRSxFQUFFO1lBQzVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXO2dCQUMxQixPQUFPLElBQUksQ0FBQztZQUVkLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlO2dCQUM5QixPQUFPLEtBQUssQ0FBQzs7Z0JBRVgsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWE7O2dCQUNsRCxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsYUFBYTs7Z0JBQ3hELFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7O2dCQUV4QyxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENB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QUFDLHFCQUFxQixFQUFFO0lBQzNGLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBDZGtEcm9wTGlzdEdyb3VwLCBDZGtEcm9wTGlzdCwgQ2RrRHJhZ01vdmUsIG1vdmVJdGVtSW5BcnJheSwgQ2RrRHJhZyB9IGZyb20gJy4uL2RyYWctZHJvcC9pbmRleCc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIOWPr+aLluaLveWbvueJh+e7hOS7tiAtIOS4iuS8oOWkmuW8oOWbvueJh+aXtuWxleekuuWkmuWbvuW5tuWPr+aLluaLveaUueWPmOaOkuWIl+mhuuW6j1xyXG4gKiBcclxuICogPGV4YW1wbGUtdXJsPmh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9ucC1kcmFnZ2FibGUtcGljcy1zYW1wbGU/ZW1iZWQ9MSZmaWxlPXNyYy9hcHAvYXBwLmNvbXBvbmVudC5odG1sPC9leGFtcGxlLXVybD5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZHJhZ2dhYmxlLXBpY3NgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZHJhZ2dhYmxlLXBpY3MuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RyYWdnYWJsZS1waWNzLnNjc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICAnY2xhc3MnOiAnaG9zdC1pbmxpbmUtYmxvY2snXHJcbiAgfSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOcERyYWdnYWJsZVBpY3MgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBAVmlld0NoaWxkKENka0Ryb3BMaXN0R3JvdXApIGxpc3RHcm91cDogQ2RrRHJvcExpc3RHcm91cDxDZGtEcm9wTGlzdD47XHJcbiAgQFZpZXdDaGlsZChDZGtEcm9wTGlzdCkgcGxhY2Vob2xkZXI6IENka0Ryb3BMaXN0O1xyXG5cclxuICAvKirljIXlkKvlm77niYd1cmznmoTlm77niYfliJfooajvvIzlj6/pgInlgLxpZO+8iHVuaXF1Ze+8iSAqL1xyXG4gIEBJbnB1dCgpIGl0ZW1zOiBBcnJheTx7IHVybDogc3RyaW5nLCBpZD86IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICAvKirlm77niYflsZXnpLrlrr3luqYgKi9cclxuICBASW5wdXQoKSBpdGVtV2lkdGg6IG51bWJlcjtcclxuXHJcbiAgLyoq5Zu+54mH5bGV56S66auY5bqmICovXHJcbiAgQElucHV0KCkgaXRlbUhlaWdodDogbnVtYmVyO1xyXG5cclxuICAvKirmmK/lkKbnpoHnlKjlm77niYflj6/mi5bmi73liKDpmaQgKi9cclxuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICB0YXJnZXQ6IENka0Ryb3BMaXN0O1xyXG4gIHRhcmdldEluZGV4OiBudW1iZXI7XHJcbiAgc291cmNlOiBDZGtEcm9wTGlzdDtcclxuICBzb3VyY2VJbmRleDogbnVtYmVyO1xyXG4gIGRyYWdJbmRleDogbnVtYmVyO1xyXG4gIGFjdGl2ZUNvbnRhaW5lcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyKSB7XHJcbiAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICB0aGlzLnNvdXJjZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgaWYgKCFpdGVtLmlkKSB7XHJcbiAgICAgICAgaXRlbS5pZCA9IFV0aWxzLklEKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgbGV0IHBoRWxlbWVudCA9IHRoaXMucGxhY2Vob2xkZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIHBoRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgcGhFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocGhFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGRyYWdNb3ZlZChlOiBDZGtEcmFnTW92ZSkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgcG9pbnQgPSB0aGlzLmdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShlLmV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmxpc3RHcm91cC5faXRlbXMuZm9yRWFjaChkcm9wTGlzdCA9PiB7XHJcbiAgICAgIGlmIChfX2lzSW5zaWRlRHJvcExpc3RDbGllbnRSZWN0KGRyb3BMaXN0LCBwb2ludC54LCBwb2ludC55KSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlQ29udGFpbmVyID0gZHJvcExpc3Q7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRyb3BMaXN0RHJvcHBlZCgpIHtcclxuICAgIGlmICghdGhpcy50YXJnZXQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgcGhFbGVtZW50ID0gdGhpcy5wbGFjZWhvbGRlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBsZXQgcGFyZW50ID0gcGhFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcblxyXG4gICAgcGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHBoRWxlbWVudCk7XHJcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQocGhFbGVtZW50KTtcclxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBwYXJlbnQuY2hpbGRyZW5bdGhpcy5zb3VyY2VJbmRleF0pO1xyXG5cclxuICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcclxuICAgIHRoaXMuc291cmNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5zb3VyY2VJbmRleCAhPSB0aGlzLnRhcmdldEluZGV4KVxyXG4gICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5pdGVtcywgdGhpcy5zb3VyY2VJbmRleCwgdGhpcy50YXJnZXRJbmRleCk7XHJcbiAgfVxyXG5cclxuICBkcm9wTGlzdEVudGVyUHJlZGljYXRlID0gKGRyYWc6IENka0RyYWcsIGRyb3A6IENka0Ryb3BMaXN0KSA9PiB7XHJcbiAgICBpZiAoZHJvcCA9PSB0aGlzLnBsYWNlaG9sZGVyKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZHJvcCAhPSB0aGlzLmFjdGl2ZUNvbnRhaW5lcilcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGxldCBwaEVsZW1lbnQgPSB0aGlzLnBsYWNlaG9sZGVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGxldCBzb3VyY2VFbGVtZW50ID0gZHJhZy5kcm9wQ29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGxldCBkcm9wRWxlbWVudCA9IGRyb3AuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGxldCBkcmFnSW5kZXggPSBfX2luZGV4T2YoZHJvcEVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgKHRoaXMuc291cmNlID8gcGhFbGVtZW50IDogc291cmNlRWxlbWVudCkpO1xyXG4gICAgbGV0IGRyb3BJbmRleCA9IF9faW5kZXhPZihkcm9wRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBkcm9wRWxlbWVudCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNvdXJjZSkge1xyXG4gICAgICB0aGlzLnNvdXJjZUluZGV4ID0gZHJhZ0luZGV4O1xyXG4gICAgICB0aGlzLnNvdXJjZSA9IGRyYWcuZHJvcENvbnRhaW5lcjtcclxuXHJcbiAgICAgIHBoRWxlbWVudC5zdHlsZS53aWR0aCA9IHNvdXJjZUVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnO1xyXG4gICAgICBwaEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc291cmNlRWxlbWVudC5jbGllbnRIZWlnaHQgKyAncHgnO1xyXG5cclxuICAgICAgc291cmNlRWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHNvdXJjZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFyZ2V0SW5kZXggPSBkcm9wSW5kZXg7XHJcbiAgICB0aGlzLnRhcmdldCA9IGRyb3A7XHJcblxyXG4gICAgcGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIGRyb3BFbGVtZW50LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHBoRWxlbWVudCwgKGRyb3BJbmRleCA+IGRyYWdJbmRleFxyXG4gICAgICA/IGRyb3BFbGVtZW50Lm5leHRTaWJsaW5nIDogZHJvcEVsZW1lbnQpKTtcclxuXHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyLmVudGVyKGRyYWcsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogRGV0ZXJtaW5lcyB0aGUgcG9pbnQgb2YgdGhlIHBhZ2UgdGhhdCB3YXMgdG91Y2hlZCBieSB0aGUgdXNlci4gKi9cclxuICBnZXRQb2ludGVyUG9zaXRpb25PblBhZ2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcbiAgICAvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLlxyXG4gICAgY29uc3QgcG9pbnQgPSBfX2lzVG91Y2hFdmVudChldmVudCkgPyAoZXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSkgOiBldmVudDtcclxuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy52aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiBwb2ludC5wYWdlWCAtIHNjcm9sbFBvc2l0aW9uLmxlZnQsXHJcbiAgICAgIHk6IHBvaW50LnBhZ2VZIC0gc2Nyb2xsUG9zaXRpb24udG9wXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25SZW1vdmUoaXRlbTogeyB1cmw6IHN0cmluZywgaWQ/OiBzdHJpbmcgfSkge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19pbmRleE9mKGNvbGxlY3Rpb24sIG5vZGUpIHtcclxuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChjb2xsZWN0aW9uLCBub2RlKTtcclxufTtcclxuXHJcbi8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXZlbnQgaXMgYSB0b3VjaCBldmVudC4gKi9cclxuZnVuY3Rpb24gX19pc1RvdWNoRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XHJcbiAgcmV0dXJuIGV2ZW50LnR5cGUuc3RhcnRzV2l0aCgndG91Y2gnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19pc0luc2lkZURyb3BMaXN0Q2xpZW50UmVjdChkcm9wTGlzdDogQ2RrRHJvcExpc3QsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgY29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IGRyb3BMaXN0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICByZXR1cm4geSA+PSB0b3AgJiYgeSA8PSBib3R0b20gJiYgeCA+PSBsZWZ0ICYmIHggPD0gcmlnaHQ7XHJcbn1cclxuXHJcblxyXG4iXX0=