dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
392 lines • 38.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { CdkDropList, CdkDropListGroup } from '@angular/cdk/drag-drop';
import { ViewportRuler } from '@angular/cdk/overlay';
import { HttpErrorResponse } from '@angular/common/http';
import { ChangeDetectorRef, Component, HostBinding, Input, ViewChild } from '@angular/core';
import { MatDialog, MatSnackBar } from '@angular/material';
import { IsDuplicatePKError } from 'dbweb-core';
import { ConfirmDialogComponent } from '../../../components/confirm-dialog/confirm-dialog.component';
import { Category } from '../../../services/eleview/types/category';
import { EditCategoryDialogComponent } from '../edit-category-dialog/edit-category-dialog.component';
import { EditLabelComponent } from '../edit-label/edit-label.component';
import { LabelManagerService } from '../service/label-manager.service';
/**
* @record
*/
function Item() { }
if (false) {
/** @type {?} */
Item.prototype.CategoryID;
/** @type {?} */
Item.prototype.ID;
/** @type {?} */
Item.prototype.Name;
}
export class CategoryComponent {
/**
* @param {?} svr
* @param {?} dialog
* @param {?} snackBar
* @param {?} viewportRuler
* @param {?} cd
*/
constructor(svr, dialog, snackBar, viewportRuler, cd) {
this.svr = svr;
this.dialog = dialog;
this.snackBar = snackBar;
this.viewportRuler = viewportRuler;
this.cd = cd;
this.hostClass = true;
this.source = null;
this.dropListEnterPredicate = (/**
* @param {?} drag
* @param {?} drop
* @return {?}
*/
(drag, drop) => {
if (drop === this.placeholder) {
return true;
}
if (drop !== this.activeContainer) {
return false;
}
/** @type {?} */
const phElement = this.placeholder.element.nativeElement;
/** @type {?} */
const sourceElement = drag.dropContainer.element.nativeElement;
/** @type {?} */
const dropElement = drop.element.nativeElement;
/** @type {?} */
const dragIndex = this.indexOfNum(dropElement.parentElement.children, this.source ? phElement : sourceElement);
/** @type {?} */
const dropIndex = this.indexOfNum(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;
// tslint:disable-next-line:semicolon
});
}
/**
* @return {?}
*/
ngOnInit() { }
/**
* @return {?}
*/
ngAfterViewInit() {
/** @type {?} */
const phElement = this.placeholder.element.nativeElement;
phElement.style.display = 'none';
phElement.parentElement.removeChild(phElement);
}
/**
* @return {?}
*/
add() {
this.svr.editLabel.add(this.category.ID);
this.dialog.open(EditLabelComponent, {
width: '800px',
height: '100%',
minWidth: '800px',
data: this.svr,
position: {
top: '0px',
right: '0px'
}
});
}
/**
* @return {?}
*/
addCategoryClick() {
/** @type {?} */
const dialogRef = this.dialog.open(EditCategoryDialogComponent, {
width: '360px',
height: '224px',
data: {
name: '新的类别',
title: '增加新的类别'
}
});
dialogRef.afterClosed().subscribe((/**
* @param {?} result
* @return {?}
*/
(result) => {
if (result) {
this.svr
.addCategory({ name: result.name, beforeAtID: this.category.ID })
.subscribe((/**
* @return {?}
*/
() => { }), this.errProcess());
}
}));
}
/**
* @private
* @return {?}
*/
errProcess() {
return (/**
* @param {?} err
* @return {?}
*/
err => {
if (err instanceof HttpErrorResponse) {
/** @type {?} */
const derr = IsDuplicatePKError(err.error);
if (derr.Yes) {
this.snackBar.open('名称重复', '关闭', { duration: 5000 });
}
else {
this.snackBar.open(err.error, '关闭', { duration: 5000 });
}
}
else {
this.snackBar.open(err, '关闭', { duration: 5000 });
}
});
}
/**
* @return {?}
*/
editCategoryClick() {
/** @type {?} */
const dialogRef = this.dialog.open(EditCategoryDialogComponent, {
width: '360px',
height: '224px',
data: {
name: this.category.Name,
title: '修改类别'
}
});
dialogRef.afterClosed().subscribe((/**
* @param {?} result
* @return {?}
*/
(result) => {
if (result) {
this.svr
.editCategory({ name: result.name, id: this.category.ID })
.subscribe((/**
* @return {?}
*/
() => { }), this.errProcess());
}
}));
}
/**
* @return {?}
*/
up() {
this.svr.setCategoryPosition(this.category, this.category.Position - 1);
}
/**
* @return {?}
*/
down() {
this.svr.setCategoryPosition(this.category, this.category.Position + 1);
}
/**
* @return {?}
*/
delete() {
/** @type {?} */
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
width: '360px',
height: '224px',
data: `确定要删除类别[${this.category.Name}]及其所有的标签吗?`
});
dialogRef.afterClosed().subscribe((/**
* @param {?} result
* @return {?}
*/
(result) => {
if (result) {
this.svr.removeCategory(this.category.ID).subscribe((/**
* @return {?}
*/
() => { }), this.errProcess());
}
}));
}
/**
* @param {?} e
* @return {?}
*/
dragMoved(e) {
/** @type {?} */
const point = this.getPointerPositionOnPage(e.event);
this.listGroup._items.forEach((/**
* @param {?} dropList
* @return {?}
*/
dropList => {
if (__isInsideDropListClientRect(dropList, point.x, point.y)) {
this.activeContainer = dropList;
return;
}
}));
}
/**
* @param {?} event
* @return {?}
*/
dropListDropped(event) {
if (!this.target) {
return;
}
/** @type {?} */
const phElement = this.placeholder.element.nativeElement;
/** @type {?} */
const 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 && this.category.Labels) {
this.cd.detach();
// moveItemInArray(this.category.Labels, this.sourceIndex, this.targetIndex);
this.svr.backface
.setLabelPosition({
CategoryID: this.category.ID,
ID: this.category.Labels[this.sourceIndex].ID,
Position: this.targetIndex
})
.subscribe((/**
* @param {?} v
* @return {?}
*/
v => {
this.category.setLabelsPosition(v.map((/**
* @param {?} vv
* @return {?}
*/
vv => vv.ID)));
this.cd.reattach();
}), this.errProcess());
}
}
/**
* @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 {?} collection
* @param {?} node
* @return {?}
*/
indexOfNum(collection, node) {
return Array.prototype.indexOf.call(collection, node);
}
}
CategoryComponent.decorators = [
{ type: Component, args: [{
selector: 'common-label-category',
template: "<div class=\"title\">\r\n\t<ng-content></ng-content>\r\n\t<span>\r\n\t\t<span class=\"title-name\">{{ category?.displayLabel() }}</span></span\r\n\t>\r\n\t<span>\r\n\t\t<button mat-icon-button (click)=\"editCategoryClick()\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807\" svgIcon=\"outlined:edit\"></mat-icon>\r\n\t\t</button>\r\n\t\t<button mat-icon-button (click)=\"delete()\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807\" svgIcon=\"outlined:delete\"></mat-icon>\r\n\t\t</button>\r\n\t\t<div class=\"\u5206\u5272\u7EBF\"></div>\r\n\t\t<button mat-icon-button (click)=\"up()\" *ngIf=\"category.Position > 1\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807 \u7C7B\u522B\u529F\u80FD\u9AD8\u4EAE\u56FE\u6807\" svgIcon=\"arrow_upward\"></mat-icon>\r\n\t\t</button>\r\n\t\t<button mat-icon-button (click)=\"down()\" *ngIf=\"svr.categorys[svr.categorys.length - 1] !== category\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807 \u7C7B\u522B\u529F\u80FD\u9AD8\u4EAE\u56FE\u6807\" svgIcon=\"arrow_downward\"></mat-icon>\r\n\t\t</button>\r\n\r\n\t\t<button mat-icon-button (click)=\"addCategoryClick()\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807 \u7C7B\u522B\u529F\u80FD\u9AD8\u4EAE\u56FE\u6807\" svgIcon=\"outlined:add\"></mat-icon>\r\n\t\t</button>\r\n\t</span>\r\n</div>\r\n<div class=\"example-container\" cdkDropListGroup>\r\n\t<div\r\n\t\tcdkDropList\r\n\t\t[cdkDropListEnterPredicate]=\"dropListEnterPredicate\"\r\n\t\t(cdkDropListDropped)=\"dropListDropped($event)\"\r\n\t></div>\r\n\t<div\r\n\t\tcdkDropList\r\n\t\t*ngFor=\"let label of category?.Labels\"\r\n\t\t[cdkDropListEnterPredicate]=\"dropListEnterPredicate\"\r\n\t\t(cdkDropListDropped)=\"dropListDropped($event)\"\r\n\t>\r\n\t\t<common-label-for-edit\r\n\t\t\t[label]=\"label\"\r\n\t\t\t[categoryID]=\"category?.ID\"\r\n\t\t\tcdkDrag\r\n\t\t\tclass=\"example-box \u5355\u4E2A\u6807\u7B7E\"\r\n\t\t\t(cdkDragMoved)=\"dragMoved($event)\"\r\n\t\t>\r\n\t\t\t<mat-icon cdkDragHandle class=\"\u62D6\u52A8\u56FE\u6807\" svgIcon=\"drag_indicator\"> </mat-icon>\r\n\t\t</common-label-for-edit>\r\n\t</div>\r\n\t<span class=\"\u6807\u7B7E \u6DFB\u52A0\u6807\u7B7E\" (click)=\"add()\">\r\n\t\t<mat-icon class=\"\u6DFB\u52A0\u56FE\u6807\" svgIcon=\"add\"></mat-icon>\r\n\t</span>\r\n</div>\r\n",
styles: ["@charset \"UTF-8\";:host:hover .title{padding-left:32px;box-sizing:border-box}:host:hover .title .title-name{font-size:14px;font-weight:700}:host:hover .title .\u5206\u5272\u7EBF,:host:hover .title .\u7C7B\u522B\u529F\u80FD\u56FE\u6807{display:inline-block}.title{height:64px;padding:16px 0 16px 8px;box-sizing:border-box;display:flex;justify-content:space-between;align-items:center}.title .title-name{font-size:12px}.title button{width:32px;height:32px;line-height:32px}.title .\u7C7B\u522B\u529F\u80FD\u56FE\u6807{width:24px;height:24px;line-height:24px;cursor:pointer;display:none}.title .\u5206\u5272\u7EBF{width:1px;height:24px;vertical-align:middle;display:none}.\u6807\u7B7E{font-size:14px;display:inline-block;margin:0 16px 8px 0;height:34px;padding:0 24px;border-radius:4px;line-height:34px;cursor:pointer;position:relative}.\u6807\u7B7E:hover .\u67E5\u770B\u6309\u94AE{display:block}.\u5355\u4E2A\u6807\u7B7E{height:34px;border-radius:4px;line-height:34px;margin:0 16px 16px 0;cursor:pointer}.\u5355\u4E2A\u6807\u7B7E .\u62D6\u52A8\u56FE\u6807{width:16px;height:16px;line-height:16px;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:none}.\u5355\u4E2A\u6807\u7B7E:hover .\u62D6\u52A8\u56FE\u6807{display:block}.\u6DFB\u52A0\u6807\u7B7E{width:40px;padding:0 8px;text-align:center;vertical-align:top}.\u6DFB\u52A0\u56FE\u6807{padding:5px 0;width:24px;height:24px;line-height:24px}.\u67E5\u770B\u6309\u94AE{width:16px;height:16px;line-height:16px;position:absolute;right:0;top:0;display:none}.example-container{padding-left:24px;display:flex;flex-wrap:wrap}.example-box{min-width:50px;position:relative;z-index:1;box-shadow:none}.example-box:last-child{border:0}.cdk-drop-list{display:flex}.cdk-drag-preview{box-sizing:border-box;border-radius:4px}.cdk-drag-placeholder{opacity:.3}.cdk-drag-animating{transition:transform 250ms cubic-bezier(0,0,.2,1);transition:transform 250ms cubic-bezier(0,0,.2,1),-webkit-transform 250ms cubic-bezier(0,0,.2,1)}"]
}] }
];
/** @nocollapse */
CategoryComponent.ctorParameters = () => [
{ type: LabelManagerService },
{ type: MatDialog },
{ type: MatSnackBar },
{ type: ViewportRuler },
{ type: ChangeDetectorRef }
];
CategoryComponent.propDecorators = {
category: [{ type: Input }],
hostClass: [{ type: HostBinding, args: ['class.label-category',] }],
listGroup: [{ type: ViewChild, args: [CdkDropListGroup, { static: true },] }],
placeholder: [{ type: ViewChild, args: [CdkDropList, { static: true },] }]
};
if (false) {
/** @type {?} */
CategoryComponent.prototype.category;
/** @type {?} */
CategoryComponent.prototype.hostClass;
/** @type {?} */
CategoryComponent.prototype.listGroup;
/** @type {?} */
CategoryComponent.prototype.placeholder;
/** @type {?} */
CategoryComponent.prototype.target;
/** @type {?} */
CategoryComponent.prototype.targetIndex;
/** @type {?} */
CategoryComponent.prototype.source;
/** @type {?} */
CategoryComponent.prototype.sourceIndex;
/** @type {?} */
CategoryComponent.prototype.dragIndex;
/** @type {?} */
CategoryComponent.prototype.activeContainer;
/** @type {?} */
CategoryComponent.prototype.dropListEnterPredicate;
/** @type {?} */
CategoryComponent.prototype.svr;
/** @type {?} */
CategoryComponent.prototype.dialog;
/**
* @type {?}
* @private
*/
CategoryComponent.prototype.snackBar;
/**
* @type {?}
* @private
*/
CategoryComponent.prototype.viewportRuler;
/**
* @type {?}
* @private
*/
CategoryComponent.prototype.cd;
}
/**
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtY2F0ZWdvcnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvbGFiZWwtbWFuYWdlci9sYWJlbC1jYXRlZ29yeS9sYWJlbC1jYXRlZ29yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBcUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVwRSxPQUFPLEVBQWMsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7OztBQUN2RSxtQkFJQzs7O0lBSEEsMEJBQW1COztJQUNuQixrQkFBVzs7SUFDWCxvQkFBYTs7QUFPZCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7OztJQVc3QixZQUNRLEdBQXdCLEVBQ3hCLE1BQWlCLEVBQ2hCLFFBQXFCLEVBQ3JCLGFBQTRCLEVBQzVCLEVBQXFCO1FBSnRCLFFB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OztJQUh4QyxxQ0FBNEI7O0lBQzVCLHNDQUFzRDs7SUFDdEQsc0NBQXdGOztJQUN4Rix3Q0FBbUU7O0lBQ25FLG1DQUEyQjs7SUFDM0Isd0NBQTJCOztJQUMzQixtQ0FBa0M7O0lBQ2xDLHdDQUEyQjs7SUFDM0Isc0NBQXlCOztJQUN6Qiw0Q0FBb0M7O0lBK0lwQyxtREFtQ0U7O0lBaExELGdDQUErQjs7SUFDL0IsbUNBQXdCOzs7OztJQUN4QixxQ0FBNkI7Ozs7O0lBQzdCLDBDQUFvQzs7Ozs7SUFDcEMsK0JBQTZCOzs7Ozs7O0FBNkwvQixTQUFTLGNBQWMsQ0FBQyxLQUE4QjtJQUNyRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7Ozs7Ozs7QUFFRCxTQUFTLDRCQUE0QixDQUFDLFFBQXFCLEVBQUUsQ0FBUyxFQUFFLENBQVM7VUFDMUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRTtJQUMzRixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wLCBDZGtEcmFnTW92ZSwgQ2RrRHJvcExpc3QsIENka0Ryb3BMaXN0R3JvdXAgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgVmlld3BvcnRSdWxlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgSXNEdXBsaWNhdGVQS0Vycm9yIH0gZnJvbSAnZGJ3ZWItY29yZSc7XHJcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZWxldmlldy90eXBlcy9jYXRlZ29yeSc7XHJcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZWxldmlldy90eXBlcy9sYWJlbCc7XHJcbmltcG9ydCB7IERpYWxvZ0RhdGEsIEVkaXRDYXRlZ29yeURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2VkaXQtY2F0ZWdvcnktZGlhbG9nL2VkaXQtY2F0ZWdvcnktZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVkaXRMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2VkaXQtbGFiZWwvZWRpdC1sYWJlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYWJlbE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9sYWJlbC1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbnRlcmZhY2UgSXRlbSB7XHJcblx0Q2F0ZWdvcnlJRDogc3RyaW5nO1xyXG5cdElEOiBzdHJpbmc7XHJcblx0TmFtZTogc3RyaW5nO1xyXG59XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLWxhYmVsLWNhdGVnb3J5JyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vbGFiZWwtY2F0ZWdvcnkuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2xhYmVsLWNhdGVnb3J5LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENhdGVnb3J5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuXHRASW5wdXQoKSBjYXRlZ29yeTogQ2F0ZWdvcnk7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5sYWJlbC1jYXRlZ29yeScpIGhvc3RDbGFzcyA9IHRydWU7XHJcblx0QFZpZXdDaGlsZChDZGtEcm9wTGlzdEdyb3VwLCB7IHN0YXRpYzogdHJ1ZSB9KSBsaXN0R3JvdXA6IENka0Ryb3BMaXN0R3JvdXA8Q2RrRHJvcExpc3Q+O1xyXG5cdEBWaWV3Q2hpbGQoQ2RrRHJvcExpc3QsIHsgc3RhdGljOiB0cnVlIH0pIHBsYWNlaG9sZGVyOiBDZGtEcm9wTGlzdDtcclxuXHRwdWJsaWMgdGFyZ2V0OiBDZGtEcm9wTGlzdDtcclxuXHRwdWJsaWMgdGFyZ2V0SW5kZXg6IG51bWJlcjtcclxuXHRwdWJsaWMgc291cmNlOiBDZGtEcm9wTGlzdCA9IG51bGw7XHJcblx0cHVibGljIHNvdXJjZUluZGV4OiBudW1iZXI7XHJcblx0cHVibGljIGRyYWdJbmRleDogbnVtYmVyO1xyXG5cdHB1YmxpYyBhY3RpdmVDb250YWluZXI6IENka0Ryb3BMaXN0O1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIHN2cjogTGFiZWxNYW5hZ2VyU2VydmljZSxcclxuXHRcdHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuXHRcdHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxyXG5cdFx0cHJpdmF0ZSB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxyXG5cdFx0cHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuXHQpIHt9XHJcblx0bmdPbkluaXQoKSB7fVxyXG5cclxuXHRuZ0FmdGVyVmlld0luaXQoKSB7XHJcblx0XHRjb25zdCBwaEVsZW1lbnQgPSB0aGlzLnBsYWNlaG9sZGVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcblx0XHRwaEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdHBoRWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHBoRWxlbWVudCk7XHJcblx0fVxyXG5cdGFkZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3ZyLmVkaXRMYWJlbC5hZGQodGhpcy5jYXRlZ29yeS5JRCk7XHJcblx0XHR0aGlzLmRpYWxvZy5vcGVuKEVkaXRMYWJlbENvbXBvbmVudCwge1xyXG5cdFx0XHR3aWR0aDogJzgwMHB4JyxcclxuXHRcdFx0aGVpZ2h0OiAnMTAwJScsXHJcblx0XHRcdG1pbldpZHRoOiAnODAwcHgnLFxyXG5cdFx0XHRkYXRhOiB0aGlzLnN2cixcclxuXHRcdFx0cG9zaXRpb246IHtcclxuXHRcdFx0XHR0b3A6ICcwcHgnLFxyXG5cdFx0XHRcdHJpZ2h0OiAnMHB4J1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0YWRkQ2F0ZWdvcnlDbGljaygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRWRpdENhdGVnb3J5RGlhbG9nQ29tcG9uZW50LCB7XHJcblx0XHRcdHdpZHRoOiAnMzYwcHgnLFxyXG5cdFx0XHRoZWlnaHQ6ICcyMjRweCcsXHJcblx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRuYW1lOiAn5paw55qE57G75YirJyxcclxuXHRcdFx0XHR0aXRsZTogJ+WinuWKoOaWsOeahOexu+WIqydcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IERpYWxvZ0RhdGEpID0+IHtcclxuXHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdHRoaXMuc3ZyXHJcblx0XHRcdFx0XHQuYWRkQ2F0ZWdvcnkoeyBuYW1lOiByZXN1bHQubmFtZSwgYmVmb3JlQXRJRDogdGhpcy5jYXRlZ29yeS5JRCB9KVxyXG5cdFx0XHRcdFx0LnN1YnNjcmliZSgoKSA9PiB7fSwgdGhpcy5lcnJQcm9jZXNzKCkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0cHJpdmF0ZSBlcnJQcm9jZXNzKCk6IChlcnJvcjogYW55KSA9PiB2b2lkIHtcclxuXHRcdHJldHVybiBlcnIgPT4ge1xyXG5cdFx0XHRpZiAoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuXHRcdFx0XHRjb25zdCBkZXJyID0gSXNEdXBsaWNhdGVQS0Vycm9yKGVyci5lcnJvcik7XHJcblx0XHRcdFx0aWYgKGRlcnIuWWVzKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oJ+WQjeensOmHjeWkjScsICflhbPpl60nLCB7IGR1cmF0aW9uOiA1MDAwIH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oZXJyLmVycm9yLCAn5YWz6ZetJywgeyBkdXJhdGlvbjogNTAwMCB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKGVyciwgJ+WFs+mXrScsIHsgZHVyYXRpb246IDUwMDAgfSk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHRlZGl0Q2F0ZWdvcnlDbGljaygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRWRpdENhdGVnb3J5RGlhbG9nQ29tcG9uZW50LCB7XHJcblx0XHRcdHdpZHRoOiAnMzYwcHgnLFxyXG5cdFx0XHRoZWlnaHQ6ICcyMjRweCcsXHJcblx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRuYW1lOiB0aGlzLmNhdGVnb3J5Lk5hbWUsXHJcblx0XHRcdFx0dGl0bGU6ICfkv67mlLnnsbvliKsnXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBEaWFsb2dEYXRhKSA9PiB7XHJcblx0XHRcdGlmIChyZXN1bHQpIHtcclxuXHRcdFx0XHR0aGlzLnN2clxyXG5cdFx0XHRcdFx0LmVkaXRDYXRlZ29yeSh7IG5hbWU6IHJlc3VsdC5uYW1lLCBpZDogdGhpcy5jYXRlZ29yeS5JRCB9KVxyXG5cdFx0XHRcdFx0LnN1YnNjcmliZSgoKSA9PiB7fSwgdGhpcy5lcnJQcm9jZXNzKCkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0dXAoKSB7XHJcblx0XHR0aGlzLnN2ci5zZXRDYXRlZ29yeVBvc2l0aW9uKHRoaXMuY2F0ZWdvcnksIHRoaXMuY2F0ZWdvcnkuUG9zaXRpb24gLSAxKTtcclxuXHR9XHJcblx0ZG93bigpIHtcclxuXHRcdHRoaXMuc3ZyLnNldENhdGVnb3J5UG9zaXRpb24odGhpcy5jYXRlZ29yeSwgdGhpcy5jYXRlZ29yeS5Qb3NpdGlvbiArIDEpO1xyXG5cdH1cclxuXHRkZWxldGUoKSB7XHJcblx0XHRjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcclxuXHRcdFx0d2lkdGg6ICczNjBweCcsXHJcblx0XHRcdGhlaWdodDogJzIyNHB4JyxcclxuXHRcdFx0ZGF0YTogYOehruWumuimgeWIoOmZpOexu+WIq1ske3RoaXMuY2F0ZWdvcnkuTmFtZX1d5Y+K5YW25omA5pyJ55qE5qCH562+5ZCX77yfYFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdHRoaXMuc3ZyLnJlbW92ZUNhdGVnb3J5KHRoaXMuY2F0ZWdvcnkuSUQpLnN1YnNjcmliZSgoKSA9PiB7fSwgdGhpcy5lcnJQcm9jZXNzKCkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0ZHJhZ01vdmVkKGU6IENka0RyYWdNb3ZlKSB7XHJcblx0XHRjb25zdCBwb2ludCA9IHRoaXMuZ2V0UG9pbnRlclBvc2l0aW9uT25QYWdlKGUuZXZlbnQpO1xyXG5cclxuXHRcdHRoaXMubGlzdEdyb3VwLl9pdGVtcy5mb3JFYWNoKGRyb3BMaXN0ID0+IHtcclxuXHRcdFx0aWYgKF9faXNJbnNpZGVEcm9wTGlzdENsaWVudFJlY3QoZHJvcExpc3QsIHBvaW50LngsIHBvaW50LnkpKSB7XHJcblx0XHRcdFx0dGhpcy5hY3RpdmVDb250YWluZXIgPSBkcm9wTGlzdDtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZHJvcExpc3REcm9wcGVkKGV2ZW50OiBDZGtEcmFnRHJvcDxMYWJlbFtdPikge1xyXG5cdFx0aWYgKCF0aGlzLnRhcmdldCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcGhFbGVtZW50ID0gdGhpcy5wbGFjZWhvbGRlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblx0XHRjb25zdCBwYXJlbnQgPSBwaEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuXHJcblx0XHRwaEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcblx0XHRwYXJlbnQucmVtb3ZlQ2hpbGQocGhFbGVtZW50KTtcclxuXHRcdHBhcmVudC5hcHBlbmRDaGlsZChwaEVsZW1lbnQpO1xyXG5cdFx0cGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLnNvdXJjZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHBhcmVudC5jaGlsZHJlblt0aGlzLnNvdXJjZUluZGV4XSk7XHJcblxyXG5cdFx0dGhpcy50YXJnZXQgPSBudWxsO1xyXG5cdFx0dGhpcy5zb3VyY2UgPSBudWxsO1xyXG5cclxuXHRcdGlmICh0aGlzLnNvdXJjZUluZGV4ICE9PSB0aGlzLnRhcmdldEluZGV4ICYmIHRoaXMuY2F0ZWdvcnkuTGFiZWxzKSB7XHJcblx0XHRcdHRoaXMuY2QuZGV0YWNoKCk7XHJcblx0XHRcdC8vIG1vdmVJdGVtSW5BcnJheSh0aGlzLmNhdGVnb3J5LkxhYmVscywgdGhpcy5zb3VyY2VJbmRleCwgdGhpcy50YXJnZXRJbmRleCk7XHJcblx0XHRcdHRoaXMuc3ZyLmJhY2tmYWNlXHJcblx0XHRcdFx0LnNldExhYmVsUG9zaXRpb24oe1xyXG5cdFx0XHRcdFx0Q2F0ZWdvcnlJRDogdGhpcy5jYXRlZ29yeS5JRCxcclxuXHRcdFx0XHRcdElEOiB0aGlzLmNhdGVnb3J5LkxhYmVsc1t0aGlzLnNvdXJjZUluZGV4XS5JRCxcclxuXHRcdFx0XHRcdFBvc2l0aW9uOiB0aGlzLnRhcmdldEluZGV4XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5jYXRlZ29yeS5zZXRMYWJlbHNQb3NpdGlvbih2Lm1hcCh2diA9PiB2di5JRCkpO1xyXG5cdFx0XHRcdFx0dGhpcy5jZC5yZWF0dGFjaCgpO1xyXG5cdFx0XHRcdH0sIHRoaXMuZXJyUHJvY2VzcygpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGRyb3BMaXN0RW50ZXJQcmVkaWNhdGUgPSAoZHJhZzogQ2RrRHJhZywgZHJvcDogQ2RrRHJvcExpc3QpID0+IHtcclxuXHRcdGlmIChkcm9wID09PSB0aGlzLnBsYWNlaG9sZGVyKSB7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGRyb3AgIT09IHRoaXMuYWN0aXZlQ29udGFpbmVyKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHBoRWxlbWVudCA9IHRoaXMucGxhY2Vob2xkZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cdFx0Y29uc3Qgc291cmNlRWxlbWVudCA9IGRyYWcuZHJvcENvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblx0XHRjb25zdCBkcm9wRWxlbWVudCA9IGRyb3AuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cdFx0Y29uc3QgZHJhZ0luZGV4ID0gdGhpcy5pbmRleE9mTnVtKGRyb3BFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIHRoaXMuc291cmNlID8gcGhFbGVtZW50IDogc291cmNlRWxlbWVudCk7XHJcblx0XHRjb25zdCBkcm9wSW5kZXggPSB0aGlzLmluZGV4T2ZOdW0oZHJvcEVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZHJvcEVsZW1lbnQpO1xyXG5cclxuXHRcdGlmICghdGhpcy5zb3VyY2UpIHtcclxuXHRcdFx0dGhpcy5zb3VyY2VJbmRleCA9IGRyYWdJbmRleDtcclxuXHRcdFx0dGhpcy5zb3VyY2UgPSBkcmFnLmRyb3BDb250YWluZXI7XHJcblxyXG5cdFx0XHRwaEVsZW1lbnQuc3R5bGUud2lkdGggPSBzb3VyY2VFbGVtZW50LmNsaWVudFdpZHRoICsgJ3B4JztcclxuXHRcdFx0cGhFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNvdXJjZUVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgJ3B4JztcclxuXHJcblx0XHRcdHNvdXJjZUVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChzb3VyY2VFbGVtZW50KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRhcmdldEluZGV4ID0gZHJvcEluZGV4O1xyXG5cdFx0dGhpcy50YXJnZXQgPSBkcm9wO1xyXG5cclxuXHRcdHBoRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcblx0XHRkcm9wRWxlbWVudC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShcclxuXHRcdFx0cGhFbGVtZW50LFxyXG5cdFx0XHRkcm9wSW5kZXggPiBkcmFnSW5kZXggPyBkcm9wRWxlbWVudC5uZXh0U2libGluZyA6IGRyb3BFbGVtZW50XHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMucGxhY2Vob2xkZXIuZW50ZXIoZHJhZywgZHJhZy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCwgZHJhZy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wKTtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzZW1pY29sb25cclxuXHR9O1xyXG5cclxuXHRnZXRQb2ludGVyUG9zaXRpb25PblBhZ2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcblx0XHQvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLlxyXG5cdFx0Y29uc3QgcG9pbnQgPSBfX2lzVG91Y2hFdmVudChldmVudCkgPyBldmVudC50b3VjaGVzWzBdIHx8IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQ7XHJcblx0XHRjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMudmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0eDogcG9pbnQucGFnZVggLSBzY3JvbGxQb3NpdGlvbi5sZWZ0LFxyXG5cdFx0XHR5OiBwb2ludC5wYWdlWSAtIHNjcm9sbFBvc2l0aW9uLnRvcFxyXG5cdFx0fTtcclxuXHR9XHJcblx0aW5kZXhPZk51bShjb2xsZWN0aW9uLCBub2RlKSB7XHJcblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChjb2xsZWN0aW9uLCBub2RlKTtcclxuXHR9XHJcbn1cclxuLyoqIERldGVybWluZXMgd2hldGhlciBhbiBldmVudCBpcyBhIHRvdWNoIGV2ZW50LiAqL1xyXG5mdW5jdGlvbiBfX2lzVG91Y2hFdmVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiBldmVudCBpcyBUb3VjaEV2ZW50IHtcclxuXHRyZXR1cm4gZXZlbnQudHlwZS5zdGFydHNXaXRoKCd0b3VjaCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX2lzSW5zaWRlRHJvcExpc3RDbGllbnRSZWN0KGRyb3BMaXN0OiBDZGtEcm9wTGlzdCwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuXHRjb25zdCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9ID0gZHJvcExpc3QuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdHJldHVybiB5ID49IHRvcCAmJiB5IDw9IGJvdHRvbSAmJiB4ID49IGxlZnQgJiYgeCA8PSByaWdodDtcclxufVxyXG4iXX0=