UNPKG

@harbor/ui

Version:

Harbor shared UI components based on Clarity and Angular6

342 lines (341 loc) 30.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /* * Copyright (c) 2017 VMware, Inc. All Rights Reserved. * * This product is licensed to you under the Apache License, Version 2.0 (the "License"). * You may not use this product except in compliance with the License. * * This product may include a number of subcomponents with separate copyright notices * and license terms. Your use of these subcomponents is subject to the terms and * conditions of the subcomponent's license, as noted in the LICENSE file. */ import { Component, Input, Output, ContentChild, ViewChild, ViewChildren, TemplateRef, HostListener, ViewEncapsulation, EventEmitter } from "@angular/core"; import { TranslateService } from "@ngx-translate/core"; /** * Grid view general component. */ export class GridViewComponent { /** * @param {?} translate */ constructor(translate) { this.translate = translate; this.expectScrollPercent = 70; this.loadNextPageEvent = new EventEmitter(); this._items = []; this.cardStyles = []; this.itemsHolderStyle = {}; this.loadedPages = 0; this.hidePartialRows = false; this.CurrentScrollPosition = { sH: 0, sT: 0, cH: 0 }; this.preScrollPosition = null; } /** * @param {?} value * @return {?} */ set items(value) { /** @type {?} */ let newCardStyles = value.map((d, index) => { if (index < this.cardStyles.length) { return this.cardStyles[index]; } return { opacity: "0", overflow: "hidden" }; }); this.cardStyles = newCardStyles; this._items = value; } /** * @return {?} */ ngAfterViewInit() { this.cards.changes.subscribe(() => { this.throttleLayout(); }); this.throttleLayout(); } /** * @return {?} */ get items() { return this._items; } /** * @param {?} event * @return {?} */ onScroll(event) { this.preScrollPosition = this.CurrentScrollPosition; this.CurrentScrollPosition = { sH: event.target.scrollHeight, sT: event.target.scrollTop, cH: event.target.clientHeight }; if (!this.loading && this.isScrollDown() && this.isScrollExpectPercent() && this.currentPage * this.pageSize < this.totalCount) { this.loadNextPageEvent.emit(); } } /** * @return {?} */ isScrollDown() { return this.preScrollPosition.sT < this.CurrentScrollPosition.sT; } /** * @return {?} */ isScrollExpectPercent() { return ((this.CurrentScrollPosition.sT + this.CurrentScrollPosition.cH) / this.CurrentScrollPosition.sH > this.expectScrollPercent / 100); } /** * @param {?} event * @return {?} */ onResize(event) { this.throttleLayout(); } /** * @return {?} */ throttleLayout() { clearTimeout(this.layoutTimeout); this.layoutTimeout = setTimeout(() => { this.layout.call(this); }, 40); } /** * @return {?} */ get isFirstPage() { return this.currentPage <= 1; } /** * @return {?} */ layout() { /** @type {?} */ let el = this.itemsHolder.nativeElement; /** @type {?} */ let width = el.offsetWidth; /** @type {?} */ let items = el.querySelectorAll(".card-item"); /** @type {?} */ let items_count = items.length; if (items_count === 0) { el.height = 0; return; } /** @type {?} */ let itemsHeight = []; for (let i = 0; i < items_count; i++) { itemsHeight[i] = items[i].offsetHeight; } /** @type {?} */ let height = Math.max.apply(null, itemsHeight); /** @type {?} */ let itemsStyle = window.getComputedStyle(items[0]); /** @type {?} */ let minWidthStyle = itemsStyle.minWidth; /** @type {?} */ let maxWidthStyle = itemsStyle.maxWidth; /** @type {?} */ let minWidth = parseInt(minWidthStyle, 10); /** @type {?} */ let maxWidth = parseInt(maxWidthStyle, 10); /** @type {?} */ let marginHeight = parseInt(itemsStyle.marginTop, 10) + parseInt(itemsStyle.marginBottom, 10); /** @type {?} */ let marginWidth = parseInt(itemsStyle.marginLeft, 10) + parseInt(itemsStyle.marginRight, 10); /** @type {?} */ let columns = Math.floor(width / (minWidth + marginWidth)); /** @type {?} */ let columnsToUse = Math.max(Math.min(columns, items_count), 1); /** @type {?} */ let rows = Math.floor(items_count / columnsToUse); /** @type {?} */ let itemWidth = Math.min(Math.floor(width / columnsToUse) - marginWidth, maxWidth); /** @type {?} */ let itemSpacing = columnsToUse === 1 || columns > items_count ? marginWidth : (width - marginWidth - columnsToUse * itemWidth) / (columnsToUse - 1); if (!this.withAdmiral) { // Fixed spacing and margin on standalone mode itemSpacing = marginWidth; itemWidth = minWidth; } /** @type {?} */ let visible = items_count; if (this.hidePartialRows && this.totalItemsCount && items_count !== this.totalItemsCount) { visible = rows * columnsToUse; } /** @type {?} */ let count = 0; for (let i = 0; i < visible; i++) { /** @type {?} */ let item = items[i]; /** @type {?} */ let itemStyle = window.getComputedStyle(item); /** @type {?} */ let left = (i % columnsToUse) * (itemWidth + itemSpacing); /** @type {?} */ let top = Math.floor(count / columnsToUse) * (height + marginHeight); /** @type {?} */ let oldTransform = itemStyle.transform; if (!oldTransform || oldTransform === "none") { this.cardStyles[i] = { transform: "translate(" + left + "px," + top + "px) scale(0)", width: itemWidth + "px", transition: "none", overflow: "hidden" }; this.throttleLayout(); } else { this.cardStyles[i] = { transform: "translate(" + left + "px," + top + "px) scale(1)", width: itemWidth + "px", transition: null, overflow: "hidden" }; this.throttleLayout(); } if (!item.classList.contains("context-selected")) { /** @type {?} */ let itemHeight = itemsHeight[i]; if (itemStyle.display === "none" && itemHeight !== 0) { this.cardStyles[i].display = null; } if (itemHeight !== 0) { count++; } } } for (let i = visible; i < items_count; i++) { this.cardStyles[i] = { display: "none" }; } this.itemsHolderStyle = { height: Math.ceil(count / columnsToUse) * (height + marginHeight) + "px" }; } /** * @param {?} i * @return {?} */ onCardEnter(i) { this.cardStyles[i].overflow = "visible"; } /** * @param {?} i * @return {?} */ onCardLeave(i) { this.cardStyles[i].overflow = "hidden"; } /** * @param {?} index * @param {?} item * @return {?} */ trackByFn(index, item) { return index; } } GridViewComponent.decorators = [ { type: Component, args: [{ selector: "hbr-gridview", template: "<div class=\"grid-content\" (scroll)=\"onScroll($event)\">\n <div class=\"items\" [ngStyle]=\"itemsHolderStyle\" #itemsHolder >\n <span *ngFor=\"let item of items;let i = index; trackBy:trackByFn\" class='card-item' [ngStyle]=\"cardStyles[i]\" #cardItem\n (mouseenter)='onCardEnter(i)' (mouseleave)='onCardLeave(i)'>\n <ng-template [ngTemplateOutlet]=\"gridItemTmpl\" [ngTemplateOutletContext]=\"{item: item}\">\n </ng-template>\n </span>\n <span *ngIf=\"items.length === 0 && !loading\" class=\"content-empty\">\n {{'REPOSITORY.NO_ITEMS' | translate}}\n </span>\n </div>\n <div *ngIf=\"loading\" [ngClass]=\"{'central-block-loading': isFirstPage, 'central-block-loading-more': !isFirstPage}\">\n <span class=\"vertical-helper\"></span>\n <div class=\"spinner\"></div>\n </div>\n</div>", encapsulation: ViewEncapsulation.None, styles: [".grid-content{position:relative;top:36px;left:0;right:0;bottom:0;overflow:auto;max-height:65vh}.card-item{display:block;max-width:400px;min-width:300px;position:absolute;margin-right:40px;transition:width .4s,transform .4s,-webkit-transform .4s}.content-empty{text-align:center;display:block;margin-top:100px}.central-block-loading{position:absolute;z-index:10;top:0;left:0;right:0;bottom:0;text-align:center;background-color:rgba(255,255,255,.5)}.central-block-loading-more{position:relative;z-index:10;top:0;left:0;right:0;bottom:0;text-align:center;background-color:rgba(255,255,255,.5)}.vertical-helper{display:inline-block;height:100%;vertical-align:middle}.spinner{width:100px;height:100px;vertical-align:middle}"] }] } ]; /** @nocollapse */ GridViewComponent.ctorParameters = () => [ { type: TranslateService } ]; GridViewComponent.propDecorators = { loading: [{ type: Input }], totalCount: [{ type: Input }], currentPage: [{ type: Input }], pageSize: [{ type: Input }], expectScrollPercent: [{ type: Input }], withAdmiral: [{ type: Input }], items: [{ type: Input }], loadNextPageEvent: [{ type: Output }], cards: [{ type: ViewChildren, args: ["cardItem",] }], itemsHolder: [{ type: ViewChild, args: ["itemsHolder",] }], gridItemTmpl: [{ type: ContentChild, args: [TemplateRef,] }], onScroll: [{ type: HostListener, args: ["scroll", ["$event"],] }], onResize: [{ type: HostListener, args: ["window:resize", ["$event"],] }] }; if (false) { /** @type {?} */ GridViewComponent.prototype.loading; /** @type {?} */ GridViewComponent.prototype.totalCount; /** @type {?} */ GridViewComponent.prototype.currentPage; /** @type {?} */ GridViewComponent.prototype.pageSize; /** @type {?} */ GridViewComponent.prototype.expectScrollPercent; /** @type {?} */ GridViewComponent.prototype.withAdmiral; /** @type {?} */ GridViewComponent.prototype.loadNextPageEvent; /** @type {?} */ GridViewComponent.prototype.cards; /** @type {?} */ GridViewComponent.prototype.itemsHolder; /** @type {?} */ GridViewComponent.prototype.gridItemTmpl; /** @type {?} */ GridViewComponent.prototype._items; /** @type {?} */ GridViewComponent.prototype.cardStyles; /** @type {?} */ GridViewComponent.prototype.itemsHolderStyle; /** @type {?} */ GridViewComponent.prototype.layoutTimeout; /** @type {?} */ GridViewComponent.prototype.querySub; /** @type {?} */ GridViewComponent.prototype.routerSub; /** @type {?} */ GridViewComponent.prototype.totalItemsCount; /** @type {?} */ GridViewComponent.prototype.loadedPages; /** @type {?} */ GridViewComponent.prototype.nextPageLink; /** @type {?} */ GridViewComponent.prototype.hidePartialRows; /** @type {?} */ GridViewComponent.prototype.loadPagesTimeout; /** @type {?} */ GridViewComponent.prototype.CurrentScrollPosition; /** @type {?} */ GridViewComponent.prototype.preScrollPosition; /** @type {?} */ GridViewComponent.prototype.translate; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoYXJib3IvdWkvIiwic291cmNlcyI6WyJzcmMvZ3JpZHZpZXcvZ3JpZC12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQVdBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixZQUFZLEVBRWIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJdkQ7OztBQVNBLE1BQU07Ozs7SUFtREosWUFBb0IsU0FBMkI7UUFBM0IsY0FBUyxHQUFULFNBQVMsQ0FBa0I7bUNBOUNoQixFQUFFO2lDQWlCSCxJQUFJLFlBQVksRUFBTztzQkFNckMsRUFBRTswQkFFQSxFQUFFO2dDQUNJLEVBQUU7MkJBT1osQ0FBQzsrQkFFRyxLQUFLO3FDQUdpQjtZQUN0QyxFQUFFLEVBQUUsQ0FBQztZQUNMLEVBQUUsRUFBRSxDQUFDO1lBQ0wsRUFBRSxFQUFFLENBQUM7U0FDTjtpQ0FFbUMsSUFBSTtLQUVXOzs7OztJQTVDbkQsSUFDSSxLQUFLLENBQUMsS0FBWTs7UUFDcEIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDbEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsT0FBTztnQkFDTCxPQUFPLEVBQUUsR0FBRztnQkFDWixRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxh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QUNIO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJO1NBQ3pFLENBQUM7S0FDSDs7Ozs7SUFFRCxXQUFXLENBQUMsQ0FBUztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7S0FDekM7Ozs7O0lBRUQsV0FBVyxDQUFDLENBQVM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0tBQ3hDOzs7Ozs7SUFFRCxTQUFTLENBQUMsS0FBYSxFQUFFLElBQVM7UUFDaEMsT0FBTyxLQUFLLENBQUM7S0FDZDs7O1lBOU9GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsY0FBYztnQkFDeEIsNjBCQUF5QztnQkFFekMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O2FBQ3RDOzs7O1lBVFEsZ0JBQWdCOzs7c0JBY3RCLEtBQUs7eUJBQ0wsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7a0NBQ0wsS0FBSzswQkFDTCxLQUFLO29CQUNMLEtBQUs7Z0NBZUwsTUFBTTtvQkFFTixZQUFZLFNBQUMsVUFBVTswQkFDdkIsU0FBUyxTQUFDLGFBQWE7MkJBQ3ZCLFlBQVksU0FBQyxXQUFXO3VCQXNDeEIsWUFBWSxTQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQzt1QkE4QmpDLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgcHJvZHVjdCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS5cbiAqIFlvdSBtYXkgbm90IHVzZSB0aGlzIHByb2R1Y3QgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqXG4gKiBUaGlzIHByb2R1Y3QgbWF5IGluY2x1ZGUgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzXG4gKiBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmRcbiAqIGNvbmRpdGlvbnMgb2YgdGhlIHN1YmNvbXBvbmVudCdzIGxpY2Vuc2UsIGFzIG5vdGVkIGluIHRoZSBMSUNFTlNFIGZpbGUuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBDb250ZW50Q2hpbGQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBUZW1wbGF0ZVJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgRXZlbnRFbWl0dGVyLFxuICBBZnRlclZpZXdJbml0XG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5cbmltcG9ydCB7IFNjcm9sbFBvc2l0aW9uIH0gZnJvbSBcIi4uL3NlcnZpY2UvaW50ZXJmYWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJoYnItZ3JpZHZpZXdcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9ncmlkLXZpZXcuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2dyaWQtdmlldy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbi8qKlxuICogR3JpZCB2aWV3IGdlbmVyYWwgY29tcG9uZW50LlxuICovXG5leHBvcnQgY2xhc3MgR3JpZFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcbiAgQElucHV0KCkgdG90YWxDb3VudDogbnVtYmVyO1xuICBASW5wdXQoKSBjdXJyZW50UGFnZTogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoKSBleHBlY3RTY3JvbGxQZXJjZW50ID0gNzA7XG4gIEBJbnB1dCgpIHdpdGhBZG1pcmFsOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBzZXQgaXRlbXModmFsdWU6IGFueVtdKSB7XG4gICAgbGV0IG5ld0NhcmRTdHlsZXMgPSB2YWx1ZS5tYXAoKGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPCB0aGlzLmNhcmRTdHlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcmRTdHlsZXNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3BhY2l0eTogXCIwXCIsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuY2FyZFN0eWxlcyA9IG5ld0NhcmRTdHlsZXM7XG4gICAgdGhpcy5faXRlbXMgPSB2YWx1ZTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBsb2FkTmV4dFBhZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oXCJjYXJkSXRlbVwiKSBjYXJkczogYW55O1xuICBAVmlld0NoaWxkKFwiaXRlbXNIb2xkZXJcIikgaXRlbXNIb2xkZXI6IGFueTtcbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgZ3JpZEl0ZW1UbXBsOiBhbnk7XG5cbiAgX2l0ZW1zOiBhbnlbXSA9IFtdO1xuXG4gIGNhcmRTdHlsZXM6IGFueSA9IFtdO1xuICBpdGVtc0hvbGRlclN0eWxlOiBhbnkgPSB7fTtcbiAgbGF5b3V0VGltZW91dDogYW55O1xuXG4gIHF1ZXJ5U3ViOiBTdWJzY3JpcHRpb247XG4gIHJvdXRlclN1YjogU3Vic2NyaXB0aW9uO1xuXG4gIHRvdGFsSXRlbXNDb3VudDogbnVtYmVyO1xuICBsb2FkZWRQYWdlcyA9IDA7XG4gIG5leHRQYWdlTGluazogc3RyaW5nO1xuICBoaWRlUGFydGlhbFJvd3MgPSBmYWxzZTtcbiAgbG9hZFBhZ2VzVGltZW91dDogYW55O1xuXG4gIEN1cnJlbnRTY3JvbGxQb3NpdGlvbjogU2Nyb2xsUG9zaXRpb24gPSB7XG4gICAgc0g6IDAsXG4gICAgc1Q6IDAsXG4gICAgY0g6IDBcbiAgfTtcblxuICBwcmVTY3JvbGxQb3NpdGlvbjogU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNhcmRzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudGhyb3R0bGVMYXlvdXQoKTtcbiAgICB9KTtcbiAgICB0aGlzLnRocm90dGxlTGF5b3V0KCk7XG4gIH1cblxuICBnZXQgaXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcInNjcm9sbFwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uU2Nyb2xsKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnByZVNjcm9sbFBvc2l0aW9uID0gdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb247XG4gICAgdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb24gPSB7XG4gICAgICBzSDogZXZlbnQudGFyZ2V0LnNjcm9sbEhlaWdodCxcbiAgICAgIHNUOiBldmVudC50YXJnZXQuc2Nyb2xsVG9wLFxuICAgICAgY0g6IGV2ZW50LnRhcmdldC5jbGllbnRIZWlnaHRcbiAgICB9O1xuICAgIGlmIChcbiAgICAgICF0aGlzLmxvYWRpbmcgJiZcbiAgICAgIHRoaXMuaXNTY3JvbGxEb3duKCkgJiZcbiAgICAgIHRoaXMuaXNTY3JvbGxFeHBlY3RQZXJjZW50KCkgJiZcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplIDwgdGhpcy50b3RhbENvdW50XG4gICAgKSB7XG4gICAgICB0aGlzLmxvYWROZXh0UGFnZUV2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBpc1Njcm9sbERvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJlU2Nyb2xsUG9zaXRpb24uc1QgPCB0aGlzLkN1cnJlbnRTY3JvbGxQb3NpdGlvbi5zVDtcbiAgfVxuXG4gIGlzU2Nyb2xsRXhwZWN0UGVyY2VudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuQ3VycmVudFNjcm9sbFBvc2l0aW9uLnNUICsgdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb24uY0gpIC9cbiAgICAgICAgdGhpcy5DdXJyZW50U2Nyb2xsUG9zaXRpb24uc0ggPlxuICAgICAgdGhpcy5leHBlY3RTY3JvbGxQZXJjZW50IC8gMTAwXG4gICAgKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgb25SZXNpemUoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMudGhyb3R0bGVMYXlvdXQoKTtcbiAgfVxuXG4gIHRocm90dGxlTGF5b3V0KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxheW91dFRpbWVvdXQpO1xuICAgIHRoaXMubGF5b3V0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sYXlvdXQuY2FsbCh0aGlzKTtcbiAgICB9LCA0MCk7XG4gIH1cblxuICBnZXQgaXNGaXJzdFBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPD0gMTtcbiAgfVxuXG4gIGxheW91dCgpIHtcbiAgICBsZXQgZWwgPSB0aGlzLml0ZW1zSG9sZGVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBsZXQgd2lkdGggPSBlbC5vZmZzZXRXaWR0aDtcbiAgICBsZXQgaXRlbXMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiLmNhcmQtaXRlbVwiKTtcbiAgICBsZXQgaXRlbXNfY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgaWYgKGl0ZW1zX2NvdW50ID09PSAwKSB7XG4gICAgICBlbC5oZWlnaHQgPSAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpdGVtc0hlaWdodCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNfY291bnQ7IGkrKykge1xuICAgICAgaXRlbXNIZWlnaHRbaV0gPSBpdGVtc1tpXS5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuXG4gICAgbGV0IGhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGl0ZW1zSGVpZ2h0KTtcbiAgICBsZXQgaXRlbXNTdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGl0ZW1zWzBdKTtcblxuICAgIGxldCBtaW5XaWR0aFN0eWxlOiBzdHJpbmcgPSBpdGVtc1N0eWxlLm1pbldpZHRoO1xuICAgIGxldCBtYXhXaWR0aFN0eWxlOiBzdHJpbmcgPSBpdGVtc1N0eWxlLm1heFdpZHRoO1xuXG4gICAgbGV0IG1pbldpZHRoID0gcGFyc2VJbnQobWluV2lkdGhTdHlsZSwgMTApO1xuICAgIGxldCBtYXhXaWR0aCA9IHBhcnNlSW50KG1heFdpZHRoU3R5bGUsIDEwKTtcblxuICAgIGxldCBtYXJnaW5IZWlnaHQ6IG51bWJlciA9XG4gICAgICBwYXJzZUludChpdGVtc1N0eWxlLm1hcmdpblRvcCwgMTApICtcbiAgICAgIHBhcnNlSW50KGl0ZW1zU3R5bGUubWFyZ2luQm90dG9tLCAxMCk7XG4gICAgbGV0IG1hcmdpbldpZHRoOiBudW1iZXIgPVxuICAgICAgcGFyc2VJbnQoaXRlbXNTdHlsZS5tYXJnaW5MZWZ0LCAxMCkgK1xuICAgICAgcGFyc2VJbnQoaXRlbXNTdHlsZS5tYXJnaW5SaWdodCwgMTApO1xuXG4gICAgbGV0IGNvbHVtbnMgPSBNYXRoLmZsb29yKHdpZHRoIC8gKG1pbldpZHRoICsgbWFyZ2luV2lkdGgpKTtcblxuICAgIGxldCBjb2x1bW5zVG9Vc2UgPSBNYXRoLm1heChNYXRoLm1pbihjb2x1bW5zLCBpdGVtc19jb3VudCksIDEpO1xuICAgIGxldCByb3dzID0gTWF0aC5mbG9vcihpdGVtc19jb3VudCAvIGNvbHVtbnNUb1VzZSk7XG4gICAgbGV0IGl0ZW1XaWR0aCA9IE1hdGgubWluKFxuICAgICAgTWF0aC5mbG9vcih3aWR0aCAvIGNvbHVtbnNUb1VzZSkgLSBtYXJnaW5XaWR0aCxcbiAgICAgIG1heFdpZHRoXG4gICAgKTtcbiAgICBsZXQgaXRlbVNwYWNpbmcgPVxuICAgICAgY29sdW1uc1RvVXNlID09PSAxIHx8IGNvbHVtbnMgPiBpdGVtc19jb3VudFxuICAgICAgICA/IG1hcmdpbldpZHRoXG4gICAgICAgIDogKHdpZHRoIC0gbWFyZ2luV2lkdGggLSBjb2x1bW5zVG9Vc2UgKiBpdGVtV2lkdGgpIC8gKGNvbHVtbnNUb1VzZSAtIDEpO1xuICAgIGlmICghdGhpcy53aXRoQWRtaXJhbCkge1xuICAgICAgLy8gRml4ZWQgc3BhY2luZyBhbmQgbWFyZ2luIG9uIHN0YW5kYWxvbmUgbW9kZVxuICAgICAgaXRlbVNwYWNpbmcgPSBtYXJnaW5XaWR0aDtcbiAgICAgIGl0ZW1XaWR0aCA9IG1pbldpZHRoO1xuICAgIH1cblxuICAgIGxldCB2aXNpYmxlID0gaXRlbXNfY291bnQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oaWRlUGFydGlhbFJvd3MgJiZcbiAgICAgIHRoaXMudG90YWxJdGVtc0NvdW50ICYmXG4gICAgICBpdGVtc19jb3VudCAhPT0gdGhpcy50b3RhbEl0ZW1zQ291bnRcbiAgICApIHtcbiAgICAgIHZpc2libGUgPSByb3dzICogY29sdW1uc1RvVXNlO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlOyBpKyspIHtcbiAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XG4gICAgICBsZXQgaXRlbVN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoaXRlbSk7XG5cbiAgICAgIGxldCBsZWZ0ID0gKGkgJSBjb2x1bW5zVG9Vc2UpICogKGl0ZW1XaWR0aCArIGl0ZW1TcGFjaW5nKTtcbiAgICAgIGxldCB0b3AgPSBNYXRoLmZsb29yKGNvdW50IC8gY29sdW1uc1RvVXNlKSAqIChoZWlnaHQgKyBtYXJnaW5IZWlnaHQpO1xuXG4gICAgICAvLyB0cmljayB0byBzaG93IG5pY2UgYXBlYXIgYW5pbWF0aW9uLCB3aGVyZSB0aGUgaXRlbSBpcyBhbHJlYWR5IHBvc2l0aW9uZWQsXG4gICAgICAvLyBidXQgaXQgd2lsbCBwb3Agb3V0XG4gICAgICBsZXQgb2xkVHJhbnNmb3JtID0gaXRlbVN0eWxlLnRyYW5zZm9ybTtcbiAgICAgIGlmICghb2xkVHJhbnNmb3JtIHx8IG9sZFRyYW5zZm9ybSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgdGhpcy5jYXJkU3R5bGVzW2ldID0ge1xuICAgICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGUoXCIgKyBsZWZ0ICsgXCJweCxcIiArIHRvcCArIFwicHgpIHNjYWxlKDApXCIsXG4gICAgICAgICAgd2lkdGg6IGl0ZW1XaWR0aCArIFwicHhcIixcbiAgICAgICAgICB0cmFuc2l0aW9uOiBcIm5vbmVcIixcbiAgICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIlxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRocm90dGxlTGF5b3V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhcmRTdHlsZXNbaV0gPSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZShcIiArIGxlZnQgKyBcInB4LFwiICsgdG9wICsgXCJweCkgc2NhbGUoMSlcIixcbiAgICAgICAgICB3aWR0aDogaXRlbVdpZHRoICsgXCJweFwiLFxuICAgICAgICAgIHRyYW5zaXRpb246IG51bGwsXG4gICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCJcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50aHJvdHRsZUxheW91dCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiY29udGV4dC1zZWxlY3RlZFwiKSkge1xuICAgICAgICBsZXQgaXRlbUhlaWdodCA9IGl0ZW1zSGVpZ2h0W2ldO1xuICAgICAgICBpZiAoaXRlbVN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiICYmIGl0ZW1IZWlnaHQgIT09IDApIHtcbiAgICAgICAgICB0aGlzLmNhcmRTdHlsZXNbaV0uZGlzcGxheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW1IZWlnaHQgIT09IDApIHtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHZpc2libGU7IGkgPCBpdGVtc19jb3VudDsgaSsrKSB7XG4gICAgICB0aGlzLmNhcmRTdHlsZXNbaV0gPSB7XG4gICAgICAgIGRpc3BsYXk6IFwibm9uZVwiXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLml0ZW1zSG9sZGVyU3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IE1hdGguY2VpbChjb3VudCAvIGNvbHVtbnNUb1VzZSkgKiAoaGVpZ2h0ICsgbWFyZ2luSGVpZ2h0KSArIFwicHhcIlxuICAgIH07XG4gIH1cblxuICBvbkNhcmRFbnRlcihpOiBudW1iZXIpIHtcbiAgICB0aGlzLmNhcmRTdHlsZXNbaV0ub3ZlcmZsb3cgPSBcInZpc2libGVcIjtcbiAgfVxuXG4gIG9uQ2FyZExlYXZlKGk6IG51bWJlcikge1xuICAgIHRoaXMuY2FyZFN0eWxlc1tpXS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gIH1cblxuICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG4iXX0=