dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
439 lines • 40.6 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;
}
var CategoryComponent = /** @class */ (function () {
function CategoryComponent(svr, dialog, snackBar, viewportRuler, cd) {
var _this = this;
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 {?}
*/
function (drag, drop) {
if (drop === _this.placeholder) {
return true;
}
if (drop !== _this.activeContainer) {
return false;
}
/** @type {?} */
var phElement = _this.placeholder.element.nativeElement;
/** @type {?} */
var sourceElement = drag.dropContainer.element.nativeElement;
/** @type {?} */
var dropElement = drop.element.nativeElement;
/** @type {?} */
var dragIndex = _this.indexOfNum(dropElement.parentElement.children, _this.source ? phElement : sourceElement);
/** @type {?} */
var 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 {?}
*/
CategoryComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
CategoryComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var phElement = this.placeholder.element.nativeElement;
phElement.style.display = 'none';
phElement.parentElement.removeChild(phElement);
};
/**
* @return {?}
*/
CategoryComponent.prototype.add = /**
* @return {?}
*/
function () {
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 {?}
*/
CategoryComponent.prototype.addCategoryClick = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var dialogRef = this.dialog.open(EditCategoryDialogComponent, {
width: '360px',
height: '224px',
data: {
name: '新的类别',
title: '增加新的类别'
}
});
dialogRef.afterClosed().subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) {
if (result) {
_this.svr
.addCategory({ name: result.name, beforeAtID: _this.category.ID })
.subscribe((/**
* @return {?}
*/
function () { }), _this.errProcess());
}
}));
};
/**
* @private
* @return {?}
*/
CategoryComponent.prototype.errProcess = /**
* @private
* @return {?}
*/
function () {
var _this = this;
return (/**
* @param {?} err
* @return {?}
*/
function (err) {
if (err instanceof HttpErrorResponse) {
/** @type {?} */
var 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 {?}
*/
CategoryComponent.prototype.editCategoryClick = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var dialogRef = this.dialog.open(EditCategoryDialogComponent, {
width: '360px',
height: '224px',
data: {
name: this.category.Name,
title: '修改类别'
}
});
dialogRef.afterClosed().subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) {
if (result) {
_this.svr
.editCategory({ name: result.name, id: _this.category.ID })
.subscribe((/**
* @return {?}
*/
function () { }), _this.errProcess());
}
}));
};
/**
* @return {?}
*/
CategoryComponent.prototype.up = /**
* @return {?}
*/
function () {
this.svr.setCategoryPosition(this.category, this.category.Position - 1);
};
/**
* @return {?}
*/
CategoryComponent.prototype.down = /**
* @return {?}
*/
function () {
this.svr.setCategoryPosition(this.category, this.category.Position + 1);
};
/**
* @return {?}
*/
CategoryComponent.prototype.delete = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var dialogRef = this.dialog.open(ConfirmDialogComponent, {
width: '360px',
height: '224px',
data: "\u786E\u5B9A\u8981\u5220\u9664\u7C7B\u522B[" + this.category.Name + "]\u53CA\u5176\u6240\u6709\u7684\u6807\u7B7E\u5417\uFF1F"
});
dialogRef.afterClosed().subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) {
if (result) {
_this.svr.removeCategory(_this.category.ID).subscribe((/**
* @return {?}
*/
function () { }), _this.errProcess());
}
}));
};
/**
* @param {?} e
* @return {?}
*/
CategoryComponent.prototype.dragMoved = /**
* @param {?} e
* @return {?}
*/
function (e) {
var _this = this;
/** @type {?} */
var point = this.getPointerPositionOnPage(e.event);
this.listGroup._items.forEach((/**
* @param {?} dropList
* @return {?}
*/
function (dropList) {
if (__isInsideDropListClientRect(dropList, point.x, point.y)) {
_this.activeContainer = dropList;
return;
}
}));
};
/**
* @param {?} event
* @return {?}
*/
CategoryComponent.prototype.dropListDropped = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (!this.target) {
return;
}
/** @type {?} */
var phElement = this.placeholder.element.nativeElement;
/** @type {?} */
var 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 {?}
*/
function (v) {
_this.category.setLabelsPosition(v.map((/**
* @param {?} vv
* @return {?}
*/
function (vv) { return vv.ID; })));
_this.cd.reattach();
}), this.errProcess());
}
};
/**
* @param {?} event
* @return {?}
*/
CategoryComponent.prototype.getPointerPositionOnPage = /**
* @param {?} event
* @return {?}
*/
function (event) {
// `touches` will be empty for start/end events so we have to fall back to `changedTouches`.
/** @type {?} */
var point = __isTouchEvent(event) ? event.touches[0] || event.changedTouches[0] : event;
/** @type {?} */
var scrollPosition = this.viewportRuler.getViewportScrollPosition();
return {
x: point.pageX - scrollPosition.left,
y: point.pageY - scrollPosition.top
};
};
/**
* @param {?} collection
* @param {?} node
* @return {?}
*/
CategoryComponent.prototype.indexOfNum = /**
* @param {?} collection
* @param {?} node
* @return {?}
*/
function (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 = function () { return [
{ 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 },] }]
};
return CategoryComponent;
}());
export { CategoryComponent };
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) {
var _a = dropList.element.nativeElement.getBoundingClientRect(), top = _a.top, bottom = _a.bottom, left = _a.left, right = _a.right;
return y >= top && y <= bottom && x >= left && x <= right;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtY2F0ZWdvcnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvbGFiZWwtbWFuYWdlci9sYWJlbC1jYXRlZ29yeS9sYWJlbC1jYXRlZ29yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBcUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVwRSxPQUFPLEVBQWMsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7OztBQUN2RSxtQkFJQzs7O0lBSEEsMEJBQW1COztJQUNuQixrQkFBVzs7SUFDWCxvQkFBYTs7QUFFZDtJQWdCQywyQkFDUSxHQUF3QixFQUN4QixNQUFpQixFQUNoQixRQUFxQixFQUNyQixhQUE0QixFQUM1QixFQUFxQjtRQUw5QixpQkFNSTtRQUxJLFFBQUcsR0FBSCxHQUFH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QUNsQyxTQUFTLFNBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzhCQUM1QyxTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7SUF1TXpDLHdCQUFDO0NBQUEsQUFoTkQsSUFnTkM7U0EzTVksaUJBQWlCOzs7SUFDN0IscUNBQTRCOztJQUM1QixzQ0FBc0Q7O0lBQ3RELHNDQUF3Rjs7SUFDeEYsd0NBQW1FOztJQUNuRSxtQ0FBMkI7O0lBQzNCLHdDQUEyQjs7SUFDM0IsbUNBQWtDOztJQUNsQyx3Q0FBMkI7O0lBQzNCLHNDQUF5Qjs7SUFDekIsNENBQW9DOztJQStJcEMsbURBbUNFOztJQWhMRCxnQ0FBK0I7O0lBQy9CLG1DQUF3Qjs7Ozs7SUFDeEIscUNBQTZCOzs7OztJQUM3QiwwQ0FBb0M7Ozs7O0lBQ3BDLCtCQUE2Qjs7Ozs7OztBQTZML0IsU0FBUyxjQUFjLENBQUMsS0FBOEI7SUFDckQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QyxDQUFDOzs7Ozs7O0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxRQUFxQixFQUFFLENBQVMsRUFBRSxDQUFTO0lBQzFFLElBQUEsMkRBQXFGLEVBQW5GLFlBQUcsRUFBRSxrQkFBTSxFQUFFLGNBQUksRUFBRSxnQkFBZ0U7SUFDM0YsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgQ2RrRHJhZ01vdmUsIENka0Ryb3BMaXN0LCBDZGtEcm9wTGlzdEdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IFZpZXdwb3J0UnVsZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IElzRHVwbGljYXRlUEtFcnJvciB9IGZyb20gJ2Rid2ViLWNvcmUnO1xyXG5pbXBvcnQgeyBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYXRlZ29yeSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2VsZXZpZXcvdHlwZXMvY2F0ZWdvcnknO1xyXG5pbXBvcnQgeyBMYWJlbCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2VsZXZpZXcvdHlwZXMvbGFiZWwnO1xyXG5pbXBvcnQgeyBEaWFsb2dEYXRhLCBFZGl0Q2F0ZWdvcnlEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9lZGl0LWNhdGVnb3J5LWRpYWxvZy9lZGl0LWNhdGVnb3J5LWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0TGFiZWxDb21wb25lbnQgfSBmcm9tICcuLi9lZGl0LWxhYmVsL2VkaXQtbGFiZWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTGFiZWxNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvbGFiZWwtbWFuYWdlci5zZXJ2aWNlJztcclxuaW50ZXJmYWNlIEl0ZW0ge1xyXG5cdENhdGVnb3J5SUQ6IHN0cmluZztcclxuXHRJRDogc3RyaW5nO1xyXG5cdE5hbWU6IHN0cmluZztcclxufVxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvbW1vbi1sYWJlbC1jYXRlZ29yeScsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2xhYmVsLWNhdGVnb3J5LmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9sYWJlbC1jYXRlZ29yeS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXRlZ29yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0QElucHV0KCkgY2F0ZWdvcnk6IENhdGVnb3J5O1xyXG5cdEBIb3N0QmluZGluZygnY2xhc3MubGFiZWwtY2F0ZWdvcnknKSBob3N0Q2xhc3MgPSB0cnVlO1xyXG5cdEBWaWV3Q2hpbGQoQ2RrRHJvcExpc3RHcm91cCwgeyBzdGF0aWM6IHRydWUgfSkgbGlzdEdyb3VwOiBDZGtEcm9wTGlzdEdyb3VwPENka0Ryb3BMaXN0PjtcclxuXHRAVmlld0NoaWxkKENka0Ryb3BMaXN0LCB7IHN0YXRpYzogdHJ1ZSB9KSBwbGFjZWhvbGRlcjogQ2RrRHJvcExpc3Q7XHJcblx0cHVibGljIHRhcmdldDogQ2RrRHJvcExpc3Q7XHJcblx0cHVibGljIHRhcmdldEluZGV4OiBudW1iZXI7XHJcblx0cHVibGljIHNvdXJjZTogQ2RrRHJvcExpc3QgPSBudWxsO1xyXG5cdHB1YmxpYyBzb3VyY2VJbmRleDogbnVtYmVyO1xyXG5cdHB1YmxpYyBkcmFnSW5kZXg6IG51bWJlcjtcclxuXHRwdWJsaWMgYWN0aXZlQ29udGFpbmVyOiBDZGtEcm9wTGlzdDtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHB1YmxpYyBzdnI6IExhYmVsTWFuYWdlclNlcnZpY2UsXHJcblx0XHRwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcblx0XHRwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcclxuXHRcdHByaXZhdGUgdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcclxuXHRcdHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcblx0KSB7fVxyXG5cdG5nT25Jbml0KCkge31cclxuXHJcblx0bmdBZnRlclZpZXdJbml0KCkge1xyXG5cdFx0Y29uc3QgcGhFbGVtZW50ID0gdGhpcy5wbGFjZWhvbGRlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG5cdFx0cGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblx0XHRwaEVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChwaEVsZW1lbnQpO1xyXG5cdH1cclxuXHRhZGQoKTogdm9pZCB7XHJcblx0XHR0aGlzLnN2ci5lZGl0TGFiZWwuYWRkKHRoaXMuY2F0ZWdvcnkuSUQpO1xyXG5cdFx0dGhpcy5kaWFsb2cub3BlbihFZGl0TGFiZWxDb21wb25lbnQsIHtcclxuXHRcdFx0d2lkdGg6ICc4MDBweCcsXHJcblx0XHRcdGhlaWdodDogJzEwMCUnLFxyXG5cdFx0XHRtaW5XaWR0aDogJzgwMHB4JyxcclxuXHRcdFx0ZGF0YTogdGhpcy5zdnIsXHJcblx0XHRcdHBvc2l0aW9uOiB7XHJcblx0XHRcdFx0dG9wOiAnMHB4JyxcclxuXHRcdFx0XHRyaWdodDogJzBweCdcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cdGFkZENhdGVnb3J5Q2xpY2soKTogdm9pZCB7XHJcblx0XHRjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVkaXRDYXRlZ29yeURpYWxvZ0NvbXBvbmVudCwge1xyXG5cdFx0XHR3aWR0aDogJzM2MHB4JyxcclxuXHRcdFx0aGVpZ2h0OiAnMjI0cHgnLFxyXG5cdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0bmFtZTogJ+aWsOeahOexu+WIqycsXHJcblx0XHRcdFx0dGl0bGU6ICflop7liqDmlrDnmoTnsbvliKsnXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBEaWFsb2dEYXRhKSA9PiB7XHJcblx0XHRcdGlmIChyZXN1bHQpIHtcclxuXHRcdFx0XHR0aGlzLnN2clxyXG5cdFx0XHRcdFx0LmFkZENhdGVnb3J5KHsgbmFtZTogcmVzdWx0Lm5hbWUsIGJlZm9yZUF0SUQ6IHRoaXMuY2F0ZWdvcnkuSUQgfSlcclxuXHRcdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4ge30sIHRoaXMuZXJyUHJvY2VzcygpKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHByaXZhdGUgZXJyUHJvY2VzcygpOiAoZXJyb3I6IGFueSkgPT4gdm9pZCB7XHJcblx0XHRyZXR1cm4gZXJyID0+IHtcclxuXHRcdFx0aWYgKGVyciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcblx0XHRcdFx0Y29uc3QgZGVyciA9IElzRHVwbGljYXRlUEtFcnJvcihlcnIuZXJyb3IpO1xyXG5cdFx0XHRcdGlmIChkZXJyLlllcykge1xyXG5cdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKCflkI3np7Dph43lpI0nLCAn5YWz6ZetJywgeyBkdXJhdGlvbjogNTAwMCB9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKGVyci5lcnJvciwgJ+WFs+mXrScsIHsgZHVyYXRpb246IDUwMDAgfSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbihlcnIsICflhbPpl60nLCB7IGR1cmF0aW9uOiA1MDAwIH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZWRpdENhdGVnb3J5Q2xpY2soKTogdm9pZCB7XHJcblx0XHRjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVkaXRDYXRlZ29yeURpYWxvZ0NvbXBvbmVudCwge1xyXG5cdFx0XHR3aWR0aDogJzM2MHB4JyxcclxuXHRcdFx0aGVpZ2h0OiAnMjI0cHgnLFxyXG5cdFx0XHRkYXRhOiB7XHJcblx0XHRcdFx0bmFtZTogdGhpcy5jYXRlZ29yeS5OYW1lLFxyXG5cdFx0XHRcdHRpdGxlOiAn5L+u5pS557G75YirJ1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogRGlhbG9nRGF0YSkgPT4ge1xyXG5cdFx0XHRpZiAocmVzdWx0KSB7XHJcblx0XHRcdFx0dGhpcy5zdnJcclxuXHRcdFx0XHRcdC5lZGl0Q2F0ZWdvcnkoeyBuYW1lOiByZXN1bHQubmFtZSwgaWQ6IHRoaXMuY2F0ZWdvcnkuSUQgfSlcclxuXHRcdFx0XHRcdC5zdWJzY3JpYmUoKCkgPT4ge30sIHRoaXMuZXJyUHJvY2VzcygpKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHVwKCkge1xyXG5cdFx0dGhpcy5zdnIuc2V0Q2F0ZWdvcnlQb3NpdGlvbih0aGlzLmNhdGVnb3J5LCB0aGlzLmNhdGVnb3J5LlBvc2l0aW9uIC0gMSk7XHJcblx0fVxyXG5cdGRvd24oKSB7XHJcblx0XHR0aGlzLnN2ci5zZXRDYXRlZ29yeVBvc2l0aW9uKHRoaXMuY2F0ZWdvcnksIHRoaXMuY2F0ZWdvcnkuUG9zaXRpb24gKyAxKTtcclxuXHR9XHJcblx0ZGVsZXRlKCkge1xyXG5cdFx0Y29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XHJcblx0XHRcdHdpZHRoOiAnMzYwcHgnLFxyXG5cdFx0XHRoZWlnaHQ6ICcyMjRweCcsXHJcblx0XHRcdGRhdGE6IGDnoa7lrpropoHliKDpmaTnsbvliKtbJHt0aGlzLmNhdGVnb3J5Lk5hbWV9XeWPiuWFtuaJgOacieeahOagh+etvuWQl++8n2BcclxuXHRcdH0pO1xyXG5cclxuXHRcdGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBib29sZWFuKSA9PiB7XHJcblx0XHRcdGlmIChyZXN1bHQpIHtcclxuXHRcdFx0XHR0aGlzLnN2ci5yZW1vdmVDYXRlZ29yeSh0aGlzLmNhdGVnb3J5LklEKS5zdWJzY3JpYmUoKCkgPT4ge30sIHRoaXMuZXJyUHJvY2VzcygpKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cdGRyYWdNb3ZlZChlOiBDZGtEcmFnTW92ZSkge1xyXG5cdFx0Y29uc3QgcG9pbnQgPSB0aGlzLmdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShlLmV2ZW50KTtcclxuXHJcblx0XHR0aGlzLmxpc3RHcm91cC5faXRlbXMuZm9yRWFjaChkcm9wTGlzdCA9PiB7XHJcblx0XHRcdGlmIChfX2lzSW5zaWRlRHJvcExpc3RDbGllbnRSZWN0KGRyb3BMaXN0LCBwb2ludC54LCBwb2ludC55KSkge1xyXG5cdFx0XHRcdHRoaXMuYWN0aXZlQ29udGFpbmVyID0gZHJvcExpc3Q7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGRyb3BMaXN0RHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8TGFiZWxbXT4pIHtcclxuXHRcdGlmICghdGhpcy50YXJnZXQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHBoRWxlbWVudCA9IHRoaXMucGxhY2Vob2xkZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cdFx0Y29uc3QgcGFyZW50ID0gcGhFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcblxyXG5cdFx0cGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG5cdFx0cGFyZW50LnJlbW92ZUNoaWxkKHBoRWxlbWVudCk7XHJcblx0XHRwYXJlbnQuYXBwZW5kQ2hpbGQocGhFbGVtZW50KTtcclxuXHRcdHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBwYXJlbnQuY2hpbGRyZW5bdGhpcy5zb3VyY2VJbmRleF0pO1xyXG5cclxuXHRcdHRoaXMudGFyZ2V0ID0gbnVsbDtcclxuXHRcdHRoaXMuc291cmNlID0gbnVsbDtcclxuXHJcblx0XHRpZiAodGhpcy5zb3VyY2VJbmRleCAhPT0gdGhpcy50YXJnZXRJbmRleCAmJiB0aGlzLmNhdGVnb3J5LkxhYmVscykge1xyXG5cdFx0XHR0aGlzLmNkLmRldGFjaCgpO1xyXG5cdFx0XHQvLyBtb3ZlSXRlbUluQXJyYXkodGhpcy5jYXRlZ29yeS5MYWJlbHMsIHRoaXMuc291cmNlSW5kZXgsIHRoaXMudGFyZ2V0SW5kZXgpO1xyXG5cdFx0XHR0aGlzLnN2ci5iYWNrZmFjZVxyXG5cdFx0XHRcdC5zZXRMYWJlbFBvc2l0aW9uKHtcclxuXHRcdFx0XHRcdENhdGVnb3J5SUQ6IHRoaXMuY2F0ZWdvcnkuSUQsXHJcblx0XHRcdFx0XHRJRDogdGhpcy5jYXRlZ29yeS5MYWJlbHNbdGhpcy5zb3VyY2VJbmRleF0uSUQsXHJcblx0XHRcdFx0XHRQb3NpdGlvbjogdGhpcy50YXJnZXRJbmRleFxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0LnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuY2F0ZWdvcnkuc2V0TGFiZWxzUG9zaXRpb24odi5tYXAodnYgPT4gdnYuSUQpKTtcclxuXHRcdFx0XHRcdHRoaXMuY2QucmVhdHRhY2goKTtcclxuXHRcdFx0XHR9LCB0aGlzLmVyclByb2Nlc3MoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRkcm9wTGlzdEVudGVyUHJlZGljYXRlID0gKGRyYWc6IENka0RyYWcsIGRyb3A6IENka0Ryb3BMaXN0KSA9PiB7XHJcblx0XHRpZiAoZHJvcCA9PT0gdGhpcy5wbGFjZWhvbGRlcikge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHRcdGlmIChkcm9wICE9PSB0aGlzLmFjdGl2ZUNvbnRhaW5lcikge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRjb25zdCBwaEVsZW1lbnQgPSB0aGlzLnBsYWNlaG9sZGVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHRcdGNvbnN0IHNvdXJjZUVsZW1lbnQgPSBkcmFnLmRyb3BDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cdFx0Y29uc3QgZHJvcEVsZW1lbnQgPSBkcm9wLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHRcdGNvbnN0IGRyYWdJbmRleCA9IHRoaXMuaW5kZXhPZk51bShkcm9wRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCB0aGlzLnNvdXJjZSA/IHBoRWxlbWVudCA6IHNvdXJjZUVsZW1lbnQpO1xyXG5cdFx0Y29uc3QgZHJvcEluZGV4ID0gdGhpcy5pbmRleE9mTnVtKGRyb3BFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGRyb3BFbGVtZW50KTtcclxuXHJcblx0XHRpZiAoIXRoaXMuc291cmNlKSB7XHJcblx0XHRcdHRoaXMuc291cmNlSW5kZXggPSBkcmFnSW5kZXg7XHJcblx0XHRcdHRoaXMuc291cmNlID0gZHJhZy5kcm9wQ29udGFpbmVyO1xyXG5cclxuXHRcdFx0cGhFbGVtZW50LnN0eWxlLndpZHRoID0gc291cmNlRWxlbWVudC5jbGllbnRXaWR0aCArICdweCc7XHJcblx0XHRcdHBoRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzb3VyY2VFbGVtZW50LmNsaWVudEhlaWdodCArICdweCc7XHJcblxyXG5cdFx0XHRzb3VyY2VFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoc291cmNlRWxlbWVudCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy50YXJnZXRJbmRleCA9IGRyb3BJbmRleDtcclxuXHRcdHRoaXMudGFyZ2V0ID0gZHJvcDtcclxuXHJcblx0XHRwaEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG5cdFx0ZHJvcEVsZW1lbnQucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoXHJcblx0XHRcdHBoRWxlbWVudCxcclxuXHRcdFx0ZHJvcEluZGV4ID4gZHJhZ0luZGV4ID8gZHJvcEVsZW1lbnQubmV4dFNpYmxpbmcgOiBkcm9wRWxlbWVudFxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnBsYWNlaG9sZGVyLmVudGVyKGRyYWcsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCk7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c2VtaWNvbG9uXHJcblx0fTtcclxuXHJcblx0Z2V0UG9pbnRlclBvc2l0aW9uT25QYWdlKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkge1xyXG5cdFx0Ly8gYHRvdWNoZXNgIHdpbGwgYmUgZW1wdHkgZm9yIHN0YXJ0L2VuZCBldmVudHMgc28gd2UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gYGNoYW5nZWRUb3VjaGVzYC5cclxuXHRcdGNvbnN0IHBvaW50ID0gX19pc1RvdWNoRXZlbnQoZXZlbnQpID8gZXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IGV2ZW50O1xyXG5cdFx0Y29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLnZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpO1xyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHg6IHBvaW50LnBhZ2VYIC0gc2Nyb2xsUG9zaXRpb24ubGVmdCxcclxuXHRcdFx0eTogcG9pbnQucGFnZVkgLSBzY3JvbGxQb3NpdGlvbi50b3BcclxuXHRcdH07XHJcblx0fVxyXG5cdGluZGV4T2ZOdW0oY29sbGVjdGlvbiwgbm9kZSkge1xyXG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoY29sbGVjdGlvbiwgbm9kZSk7XHJcblx0fVxyXG59XHJcbi8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXZlbnQgaXMgYSB0b3VjaCBldmVudC4gKi9cclxuZnVuY3Rpb24gX19pc1RvdWNoRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XHJcblx0cmV0dXJuIGV2ZW50LnR5cGUuc3RhcnRzV2l0aCgndG91Y2gnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19pc0luc2lkZURyb3BMaXN0Q2xpZW50UmVjdChkcm9wTGlzdDogQ2RrRHJvcExpc3QsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcblx0Y29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IGRyb3BMaXN0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRyZXR1cm4geSA+PSB0b3AgJiYgeSA8PSBib3R0b20gJiYgeCA+PSBsZWZ0ICYmIHggPD0gcmlnaHQ7XHJcbn1cclxuIl19