ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
265 lines • 22.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, TemplateRef, HostBinding } from '@angular/core';
export class GridComponent {
constructor() {
this.wrapCls = {};
this.itemCls = {};
this.carouselProps = {
dots: false,
dragging: false
};
this.defaultProps = {
data: [],
hasLine: true,
isCarousel: false,
columnNum: 4,
carouselMaxRow: 2,
prefixCls: 'am-grid',
square: true,
itemStyle: {}
};
this.carouselData = [];
this.carouselDataTmp = [];
this.gridData = [];
this._data = [];
this.columnNum = 4;
this.carouselMaxRow = 2;
this.itemStyle = {};
this.square = true;
this.hasLine = true;
this.activeStyle = true;
this.onClick = new EventEmitter();
this.amGrid = true;
}
/**
* @return {?}
*/
get isCarousel() {
return this.defaultProps.isCarousel;
}
/**
* @param {?} value
* @return {?}
*/
set isCarousel(value) {
this.defaultProps.isCarousel = value;
this.init();
}
/**
* @param {?} value
* @return {?}
*/
set data(value) {
this._data = value;
this.init();
}
/**
* @return {?}
*/
get amGridSquare() {
return true === this.square;
}
/**
* @return {?}
*/
get amGridLine() {
return true === this.hasLine;
}
/**
* @return {?}
*/
get amGridCarousel() {
return true === this.isCarousel;
}
/**
* @param {?} value
* @return {?}
*/
getContentType(value) {
if ((value.indexOf('http') >= 0 || value.indexOf('assets') >= 0) && value.indexOf('<') < 0) {
return 'url';
}
else if (value.indexOf('<') >= 0) {
return 'innerHTML';
}
else if (value instanceof TemplateRef) {
return 'TemplateRef';
}
else {
return 'icon';
}
}
/**
* @return {?}
*/
init() {
/** @type {?} */
const dataLength = (this._data && this._data.length) || 0;
/** @type {?} */
let rowCount = Math.ceil(dataLength / this.columnNum);
/** @type {?} */
let rowsArr;
if (this.defaultProps.isCarousel) {
if (rowCount % this.carouselMaxRow !== 0) {
rowCount = rowCount + this.carouselMaxRow - (rowCount % this.carouselMaxRow);
}
/** @type {?} */
const pageCount = Math.ceil(rowCount / this.carouselMaxRow);
rowsArr = this.getRows(rowCount, dataLength);
if (pageCount <= 1) {
this.carouselProps = {
dots: false,
dragging: false
};
}
else {
this.carouselProps = {
dots: true,
dragging: true
};
}
this.carouselDataTmp = this.getCarouselData(rowsArr, pageCount, rowCount);
}
else {
this.gridData = this.getRows(rowCount, dataLength);
}
}
/**
* @param {?} rowsArr
* @param {?} pageCount
* @param {?} rowCount
* @return {?}
*/
getCarouselData(rowsArr, pageCount, rowCount) {
/** @type {?} */
const pagesArr = [];
for (let pageIndex = 0; pageIndex < pageCount; pageIndex++) {
/** @type {?} */
const pageRows = [];
for (let ii = 0; ii < this.carouselMaxRow; ii++) {
/** @type {?} */
const rowIndex = pageIndex * this.carouselMaxRow + ii;
if (rowIndex < rowCount) {
pageRows.push(rowsArr[rowIndex]);
}
else {
// 空节点为了确保末尾页的最后未到底的行有底线(样式中last-child会没线)
pageRows.push(null);
}
}
pagesArr.push(pageRows);
}
return pagesArr;
}
/**
* @param {?} rowCount
* @param {?} dataLength
* @return {?}
*/
getRows(rowCount, dataLength) {
/** @type {?} */
const columnNum = this.columnNum;
/** @type {?} */
const rowArr = new Array();
for (let i = 0; i < rowCount; i++) {
rowArr[i] = new Array();
for (let j = 0; j < columnNum; j++) {
/** @type {?} */
const dataIndex = i * columnNum + j;
if (dataIndex < dataLength) {
rowArr[i][j] = this._data[dataIndex];
}
else {
rowArr[i][j] = null;
}
}
}
return rowArr;
}
/**
* @param {?} data
* @param {?} index
* @return {?}
*/
click(data, index) {
/** @type {?} */
const outputData = {
data: data,
index: index
};
this.onClick.emit(outputData);
}
/**
* @return {?}
*/
ngOnInit() {
this.itemCls = {
[`${this.defaultProps.prefixCls}-item`]: true,
[`${this.defaultProps.prefixCls}-active-item`]: false
};
}
}
GridComponent.decorators = [
{ type: Component, args: [{
selector: 'Grid, nzm-grid',
template: "<ng-container *ngIf=\"!isCarousel\">\n <Flex *ngFor=\"let item of gridData; let i = index\" [justify]=\"'center'\" [align]=\"'stretch'\">\n <FlexItem\n TouchFeedbackDirective\n *ngFor=\"let subItem of item; let j = index\"\n [ngClass]=\"itemCls\"\n [ngStyle]=\"itemStyle\"\n [className]=\"['am-grid-item-active']\"\n [activeStyle]=\"activeStyle\"\n >\n <div\n *ngIf=\"subItem !== null\"\n class=\"{{ defaultProps.prefixCls }}-item-content\"\n (click)=\"click(subItem, i * columnNum + j)\"\n >\n <div class=\"{{ defaultProps.prefixCls }}-item-inner-content column-num-{{ columnNum }}\">\n <img\n *ngIf=\"subItem.icon && getContentType(subItem.icon) === 'url'\"\n src=\"{{ subItem.icon }}\"\n class=\"{{ defaultProps.prefixCls }}-icon\"\n />\n <Icon\n *ngIf=\"subItem.icon && getContentType(subItem.icon) === 'icon'\"\n [type]=\"subItem.icon\"\n [size]=\"subItem.size\"\n ></Icon>\n <div\n *ngIf=\"subItem.icon && getContentType(subItem.icon) === 'innerHTML'\"\n [innerHTML]=\"subItem.icon | safeHTML\"\n ></div>\n <ng-template\n *ngIf=\"subItem.icon && getContentType(subItem.icon) === 'TemplateRef'\"\n [ngTemplateOutlet]=\"subItem.icon\"\n ></ng-template>\n <div class=\"{{ defaultProps.prefixCls }}-text\">{{ subItem.text }}</div>\n </div>\n </div>\n <div *ngIf=\"subItem === null\" class=\"{{ defaultProps.prefixCls }}-null-item\"></div>\n </FlexItem>\n </Flex>\n <ng-content></ng-content>\n</ng-container>\n\n<Carousel\n *ngIf=\"isCarousel && carouselDataTmp.length > 0\"\n [autoplay]=\"false\"\n [infinite]=\"true\"\n [selectedIndex]=\"0\"\n [autoplayInterval]=\"3000\"\n [dots]=\"carouselProps.dots\"\n [dragging]=\"carouselProps.dragging\"\n>\n <CarouselSlide\n *ngFor=\"let gridData of carouselDataTmp\"\n class=\"{{ defaultProps.prefixCls }}-carousel-page\"\n style=\"display: block;\"\n >\n <Flex *ngFor=\"let item of gridData; let i = index\" [justify]=\"'center'\" [align]=\"'stretch'\">\n <FlexItem\n TouchFeedbackDirective\n *ngFor=\"let subItem of item; let j = index\"\n class=\"{{ defaultProps.prefixCls }}-item\"\n [ngStyle]=\"itemStyle\"\n [className]=\"['am-grid-item-active']\"\n >\n <div\n *ngIf=\"subItem !== null\"\n class=\"{{ defaultProps.prefixCls }}-item-content\"\n (click)=\"click(subItem, i * columnNum + j)\"\n >\n <div class=\"{{ defaultProps.prefixCls }}-item-inner-content column-num-4\">\n <img class=\"{{ defaultProps.prefixCls }}-icon\" src=\"{{ subItem.icon }}\" />\n <div class=\"{{ defaultProps.prefixCls }}-text\">{{ subItem.text }}</div>\n </div>\n </div>\n <div *ngIf=\"subItem === null\" class=\"{{ defaultProps.prefixCls }}-null-item\"></div>\n </FlexItem>\n </Flex>\n </CarouselSlide>\n</Carousel>\n"
}] }
];
/** @nocollapse */
GridComponent.ctorParameters = () => [];
GridComponent.propDecorators = {
columnNum: [{ type: Input }],
carouselMaxRow: [{ type: Input }],
itemStyle: [{ type: Input }],
square: [{ type: Input }],
hasLine: [{ type: Input }],
isCarousel: [{ type: Input }],
activeStyle: [{ type: Input }],
data: [{ type: Input }],
onClick: [{ type: Output }],
amGrid: [{ type: HostBinding, args: ['class.am-grid',] }],
amGridSquare: [{ type: HostBinding, args: ['class.am-grid-square',] }],
amGridLine: [{ type: HostBinding, args: ['class.am-grid-line',] }],
amGridCarousel: [{ type: HostBinding, args: ['class.am-grid-carousel',] }]
};
if (false) {
/** @type {?} */
GridComponent.prototype.wrapCls;
/** @type {?} */
GridComponent.prototype.itemCls;
/** @type {?} */
GridComponent.prototype.carouselProps;
/** @type {?} */
GridComponent.prototype.defaultProps;
/** @type {?} */
GridComponent.prototype.carouselData;
/** @type {?} */
GridComponent.prototype.carouselDataTmp;
/** @type {?} */
GridComponent.prototype.gridData;
/**
* @type {?}
* @private
*/
GridComponent.prototype._data;
/** @type {?} */
GridComponent.prototype.columnNum;
/** @type {?} */
GridComponent.prototype.carouselMaxRow;
/** @type {?} */
GridComponent.prototype.itemStyle;
/** @type {?} */
GridComponent.prototype.square;
/** @type {?} */
GridComponent.prototype.hasLine;
/** @type {?} */
GridComponent.prototype.activeStyle;
/** @type {?} */
GridComponent.prototype.onClick;
/** @type {?} */
GridComponent.prototype.amGrid;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbImdyaWQvZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU16RyxNQUFNLE9BQU8sYUFBYTtJQWtFeEI7UUFqRUEsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixrQkFBYSxHQUFHO1lBQ2QsSUFBSSxFQUFFLEtBQUs7WUFDWCxRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDO1FBQ0YsaUJBQVksR0FBRztZQUNiLElBQUksRUFBRSxFQUFFO1lBQ1IsT0FBTyxFQUFFLElBQUk7WUFDYixVQUFVLEVBQUUsS0FBSztZQUNqQixTQUFTLEVBQUUsQ0FBQztZQUNaLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLE1BQU0sRUFBRSxJQUFJO1lBQ1osU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBQ0YsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVOLFVBQUssR0FBRyxFQUFFLENBQUM7UUFHbkIsY0FBUyxHQUFXLENBQUMsQ0FBQztRQUV0QixtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUUzQixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLFdBQU0sR0FBWSxJQUFJLENBQUM7UUFFdkIsWUFBTyxHQUFZLElBQUksQ0FBQztRQVV4QixnQkFBVyxHQUFZLElBQUksQ0FBQztRQU81QixZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHaEQsV0FBTSxHQUFZLElBQUksQ0FBQztJQWNS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Qix1Q0FDMkI7O0lBQzNCLGtDQUN1Qjs7SUFDdkIsK0JBQ3VCOztJQUN2QixnQ0FDd0I7O0lBU3hCLG9DQUM0Qjs7SUFNNUIsZ0NBQ2dEOztJQUVoRCwrQkFDdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBUZW1wbGF0ZVJlZiwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnR3JpZCwgbnptLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHdyYXBDbHMgPSB7fTtcbiAgaXRlbUNscyA9IHt9O1xuICBjYXJvdXNlbFByb3BzID0ge1xuICAgIGRvdHM6IGZhbHNlLFxuICAgIGRyYWdnaW5nOiBmYWxzZVxuICB9O1xuICBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZGF0YTogW10sXG4gICAgaGFzTGluZTogdHJ1ZSxcbiAgICBpc0Nhcm91c2VsOiBmYWxzZSxcbiAgICBjb2x1bW5OdW06IDQsXG4gICAgY2Fyb3VzZWxNYXhSb3c6IDIsXG4gICAgcHJlZml4Q2xzOiAnYW0tZ3JpZCcsXG4gICAgc3F1YXJlOiB0cnVlLFxuICAgIGl0ZW1TdHlsZToge31cbiAgfTtcbiAgY2Fyb3VzZWxEYXRhID0gW107XG4gIGNhcm91c2VsRGF0YVRtcCA9IFtdO1xuICBncmlkRGF0YSA9IFtdO1xuXG4gIHByaXZhdGUgX2RhdGEgPSBbXTtcblxuICBASW5wdXQoKVxuICBjb2x1bW5OdW06IG51bWJlciA9IDQ7XG4gIEBJbnB1dCgpXG4gIGNhcm91c2VsTWF4Um93OiBudW1iZXIgPSAyO1xuICBASW5wdXQoKVxuICBpdGVtU3R5bGU6IG9iamVjdCA9IHt9O1xuICBASW5wdXQoKVxuICBzcXVhcmU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBoYXNMaW5lOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgZ2V0IGlzQ2Fyb3VzZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFByb3BzLmlzQ2Fyb3VzZWw7XG4gIH1cbiAgc2V0IGlzQ2Fyb3VzZWwodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRlZmF1bHRQcm9wcy5pc0Nhcm91c2VsID0gdmFsdWU7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cbiAgQElucHV0KClcbiAgYWN0aXZlU3R5bGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBzZXQgZGF0YSh2YWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1ncmlkJylcbiAgYW1HcmlkOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS1ncmlkLXNxdWFyZScpXG4gIGdldCBhbUdyaWRTcXVhcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWUgPT09IHRoaXMuc3F1YXJlO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tZ3JpZC1saW5lJylcbiAgZ2V0IGFtR3JpZExpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWUgPT09IHRoaXMuaGFzTGluZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWdyaWQtY2Fyb3VzZWwnKVxuICBnZXQgYW1HcmlkQ2Fyb3VzZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWUgPT09IHRoaXMuaXNDYXJvdXNlbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBnZXRDb250ZW50VHlwZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoKHZhbHVlLmluZGV4T2YoJ2h0dHAnKSA+PSAwIHx8IHZhbHVlLmluZGV4T2YoJ2Fzc2V0cycpID49IDApICYmIHZhbHVlLmluZGV4T2YoJzwnKSA8IDApIHtcbiAgICAgIHJldHVybiAndXJsJztcbiAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJzwnKSA+PSAwKSB7XG4gICAgICByZXR1cm4gJ2lubmVySFRNTCc7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICByZXR1cm4gJ1RlbXBsYXRlUmVmJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdpY29uJztcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCkgfHwgMDtcbiAgICBsZXQgcm93Q291bnQgPSBNYXRoLmNlaWwoZGF0YUxlbmd0aCAvIHRoaXMuY29sdW1uTnVtKTtcbiAgICBsZXQgcm93c0FycjtcbiAgICBpZiAodGhpcy5kZWZhdWx0UHJvcHMuaXNDYXJvdXNlbCkge1xuICAgICAgaWYgKHJvd0NvdW50ICUgdGhpcy5jYXJvdXNlbE1heFJvdyAhPT0gMCkge1xuICAgICAgICByb3dDb3VudCA9IHJvd0NvdW50ICsgdGhpcy5jYXJvdXNlbE1heFJvdyAtIChyb3dDb3VudCAlIHRoaXMuY2Fyb3VzZWxNYXhSb3cpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFnZUNvdW50ID0gTWF0aC5jZWlsKHJvd0NvdW50IC8gdGhpcy5jYXJvdXNlbE1heFJvdyk7XG4gICAgICByb3dzQXJyID0gdGhpcy5nZXRSb3dzKHJvd0NvdW50LCBkYXRhTGVuZ3RoKTtcbiAgICAgIGlmIChwYWdlQ291bnQgPD0gMSkge1xuICAgICAgICB0aGlzLmNhcm91c2VsUHJvcHMgPSB7XG4gICAgICAgICAgZG90czogZmFsc2UsXG4gICAgICAgICAgZHJhZ2dpbmc6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhcm91c2VsUHJvcHMgPSB7XG4gICAgICAgICAgZG90czogdHJ1ZSxcbiAgICAgICAgICBkcmFnZ2luZzogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhpcy5jYXJvdXNlbERhdGFUbXAgPSB0aGlzLmdldENhcm91c2VsRGF0YShyb3dzQXJyLCBwYWdlQ291bnQsIHJvd0NvdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ncmlkRGF0YSA9IHRoaXMuZ2V0Um93cyhyb3dDb3VudCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2Fyb3VzZWxEYXRhKHJvd3NBcnI6IGFueVtdLCBwYWdlQ291bnQ6IG51bWJlciwgcm93Q291bnQ6IG51bWJlcikge1xuICAgIGNvbnN0IHBhZ2VzQXJyOiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IHBhZ2VDb3VudDsgcGFnZUluZGV4KyspIHtcbiAgICAgIGNvbnN0IHBhZ2VSb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHRoaXMuY2Fyb3VzZWxNYXhSb3c7IGlpKyspIHtcbiAgICAgICAgY29uc3Qgcm93SW5kZXggPSBwYWdlSW5kZXggKiB0aGlzLmNhcm91c2VsTWF4Um93ICsgaWk7XG4gICAgICAgIGlmIChyb3dJbmRleCA8IHJvd0NvdW50KSB7XG4gICAgICAgICAgcGFnZVJvd3MucHVzaChyb3dzQXJyW3Jvd0luZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8g56m66IqC54K55Li65LqG56Gu5L+d5pyr5bC+6aG155qE5pyA5ZCO5pyq5Yiw5bqV55qE6KGM5pyJ5bqV57q/KOagt+W8j+S4rWxhc3QtY2hpbGTkvJrmsqHnur8pXG4gICAgICAgICAgcGFnZVJvd3MucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFnZXNBcnIucHVzaChwYWdlUm93cyk7XG4gICAgfVxuICAgIHJldHVybiBwYWdlc0FycjtcbiAgfVxuXG4gIGdldFJvd3Mocm93Q291bnQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKSB7XG4gICAgY29uc3QgY29sdW1uTnVtID0gdGhpcy5jb2x1bW5OdW07XG4gICAgY29uc3Qgcm93QXJyID0gbmV3IEFycmF5KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7XG4gICAgICByb3dBcnJbaV0gPSBuZXcgQXJyYXkoKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1uTnVtOyBqKyspIHtcbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gaSAqIGNvbHVtbk51bSArIGo7XG4gICAgICAgIGlmIChkYXRhSW5kZXggPCBkYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgcm93QXJyW2ldW2pdID0gdGhpcy5fZGF0YVtkYXRhSW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvd0FycltpXVtqXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd0FycjtcbiAgfVxuXG4gIGNsaWNrKGRhdGEsIGluZGV4KSB7XG4gICAgY29uc3Qgb3V0cHV0RGF0YSA9IHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIHRoaXMub25DbGljay5lbWl0KG91dHB1dERhdGEpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pdGVtQ2xzID0ge1xuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30taXRlbWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMuZGVmYXVsdFByb3BzLnByZWZpeENsc30tYWN0aXZlLWl0ZW1gXTogZmFsc2VcbiAgICB9O1xuICB9XG59XG4iXX0=