UNPKG

cubex-multiselect-dropdown

Version:
355 lines (354 loc) 51.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, HostListener, ElementRef } from '@angular/core'; export class MultiselectDropdownComponent { /** * @param {?} eRef */ constructor(eRef) { this.eRef = eRef; this.filterText = ''; this.selectionLabel = 'Select'; this.optionList = []; this.open = false; this.selectedOptions = []; this.displayNameKey = ''; this.toggleSelectionKey = ''; this.selectionTextWidth = 11; this.componentWidth = 250; this.componentHeight = 400; this.selectedOptionsSet = []; this.selectionChange = new EventEmitter(); this.selectedAll = false; this.isSelectedOptionsArayString = false; this.isoptionListArayString = false; this.tooltipBoxWidth = 150; this.searchError = false; this.listOptionColorKey = ''; } /** * @return {?} */ ngOnInit() { if (!this.selectedOptions) { this.selectedOptions = []; } this.currentStyles = { width: this.componentWidth < 250 ? '250px' : (this.componentWidth + 'px'), "max-height": this.componentHeight + 'px', }; this.noOption = { "padding-left": (this.componentWidth / 2) - 75 + 'px', "color": "gainsboro" }; this.tooltipTextWidth = { width: this.tooltipBoxWidth <= 150 ? '150px' : (this.tooltipBoxWidth + 'px'), }; this.tooltipTopUnshift = { top: this.selectionLabel !== '' ? '25px' : '7px', }; this.errorAlert = { border: this.searchError == true ? '1px solid red' : '1px solid #dfdfdf' }; } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { this.errorAlert = { border: this.searchError == true ? '1px solid red' : '1px solid #dfdfdf' }; for (let propName in changes) { if (propName === 'selectionSet') { // if((changes[propName].previousValue === undefined || changes[propName].firstChange === true) && this.toggleSelectionKey !=='build'){ // return; // } this.isoptionListArayString = typeof this.optionList[0] === 'string'; this.selectedOptions = changes[propName].currentValue; //console.log("Is this string -->", this.isoptionListArayString, this.selectedOptions); if (this.isoptionListArayString) { this.selectedOptionsSet = []; this.optionList.filter((item) => { /** @type {?} */ let itemKey = this.selectedOptions.indexOf(/** @type {?} */ (item)); if (itemKey > -1) { this.selectedOptionsSet[itemKey] = item; return true; } else { return false; } }); this.filterText = this.selectedOptions.length > 0 && this.open === false ? (this.selectedOptions[0].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0] : this.selectedOptions[0].substring(0, this.selectionTextWidth) + '..') : ''; } else { this.selectedOptionsSet = []; this.optionList.filter((item) => { /** @type {?} */ let index = this.selectedOptions.findIndex(x => x[this.displayNameKey] === (/** @type {?} */ (item))[this.toggleSelectionKey]); //console.log("selectedOptions --> ", this.selectedOptions, index,(<any>item)[this.toggleSelectionKey]) if (index > -1) { this.selectedOptionsSet[index] = item; return true; } else { return false; } }); console.log("selectedOptionsSet -->", this.selectedOptionsSet); this.filterText = this.selectedOptions.length > 0 && this.open === false ? (this.selectedOptions[0][this.toggleSelectionKey].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0][this.toggleSelectionKey] : this.selectedOptions[0][this.toggleSelectionKey].substring(0, this.selectionTextWidth) + '..') : ''; } this.selectedAll = this.optionList.length === this.selectedOptionsSet.length ? true : false; } } } /** * @param {?} option * @return {?} */ toggleOption(option) { this.filterText = ''; /** @type {?} */ let index = 0; if (this.isoptionListArayString) { index = this.selectedOptions.indexOf(option); if (index < 0) { this.selectedOptions.push(option); this.selectedOptionsSet.push(option); } else { this.selectedOptions.splice(index, 1); this.selectedOptionsSet.splice(index, 1); } } else { index = this.selectedOptions.findIndex(x => x[this.toggleSelectionKey] === option[this.toggleSelectionKey]); //console.log("selectedOptions --> ", this.selectedOptions, index, option[this.toggleSelectionKey]); if (index < 0) { this.selectedOptions.push(option); this.selectedOptionsSet.push(option); } else { this.selectedOptions.splice(index, 1); this.selectedOptionsSet.splice(index, 1); } } if (this.optionList.length === this.selectedOptions.length) { this.selectedAll = true; } else { this.selectedAll = false; } // console.log(this.selectedOptions); // console.log(this.selectedOptionsSet); //this.selectedOptionsSet = this.getSelectedOptionSet(this.selectedOptionsSet); // console.log("After Modified -->", this.selectedOptionsSet); this.selectionChange.emit(this.selectedOptionsSet); } /** * @param {?} event * @return {?} */ selectAll(event) { event.stopPropagation(); this.filterText = ''; this.selectedAll = true; /** @type {?} */ let toggleSelectionKey = this.toggleSelectionKey; if (this.isoptionListArayString) { this.selectedOptions = this.optionList.map(function (item) { return item[toggleSelectionKey]; }); } else { this.selectedOptions = this.optionList.map(function (item) { return item; }); } this.selectedOptionsSet = this.optionList; //this.selectedOptionsSet = this.getSelectedOptionSet(this.selectedOptionsSet); this.selectionChange.emit(this.selectedOptionsSet); } /** * @param {?} event * @return {?} */ reset(event) { event.stopPropagation(); this.selectedAll = false; this.selectedOptions = []; this.selectedOptionsSet = []; this.filterText = ''; this.selectionChange.emit(this.selectedOptionsSet); } /** * @param {?} option * @return {?} */ isOptionSelected(option) { /** @type {?} */ let selectedFlag; if (this.isoptionListArayString) { selectedFlag = this.selectedOptions.indexOf(option) > -1; } else { /** @type {?} */ let index = this.selectedOptions.findIndex(x => x[this.toggleSelectionKey] === option[this.toggleSelectionKey]); selectedFlag = index > -1; } return selectedFlag; } /** * @return {?} */ closeDropdown() { this.open = false; if (this.isoptionListArayString) { this.filterText = this.selectedOptions[0] ? (this.selectedOptions[0].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0] : this.selectedOptions[0].substring(0, this.selectionTextWidth) + '..') : ''; } else { this.filterText = this.selectedOptions.length > 0 && this.open === false ? (this.selectedOptions[0][this.toggleSelectionKey].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0][this.toggleSelectionKey] : this.selectedOptions[0][this.toggleSelectionKey].substring(0, this.selectionTextWidth) + '..') : ''; } } /** * @return {?} */ toggleDropdown() { this.open = !this.open; if (this.open) { this.filterText = ''; } else { if (this.isoptionListArayString) { this.filterText = this.selectedOptions[0] ? (this.selectedOptions[0].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0] : this.selectedOptions[0].substring(0, this.selectionTextWidth) + '..') : ''; } else { this.filterText = this.selectedOptions.length > 0 && this.open === false ? (this.selectedOptions[0][this.toggleSelectionKey].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0][this.toggleSelectionKey] : this.selectedOptions[0][this.toggleSelectionKey].substring(0, this.selectionTextWidth) + '..') : ''; } } } /** * @return {?} */ openDropdown() { this.open = true; this.filterText = ''; } /** * @param {?} event * @return {?} */ clickout(event) { if (!this.eRef.nativeElement.contains(event.target)) { this.open = false; if (this.isoptionListArayString) { this.filterText = this.selectedOptions[0] ? (this.selectedOptions[0].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0] : this.selectedOptions[0].substring(0, this.selectionTextWidth) + '..') : ''; } else { this.filterText = this.selectedOptions.length > 0 && this.open === false ? (this.selectedOptions[0][this.toggleSelectionKey].length < (this.selectionTextWidth + 1) ? this.selectedOptions[0][this.toggleSelectionKey] : this.selectedOptions[0][this.toggleSelectionKey].substring(0, this.selectionTextWidth) + '..') : ''; } } } } MultiselectDropdownComponent.decorators = [ { type: Component, args: [{ selector: 'cubex-multiselect-dropdown', template: "<div *ngIf=\"!isoptionListArayString\" style=\"position: relative !important;\">\n <span class=\"tooltip\" *ngIf=\"!open\" [ngStyle]=\"tooltipTopUnshift\">\n <small *ngIf=\"selectedOptions.length>1\">+{{selectedOptions.length-1}} selected</small>\n <span class=\"tooltiptextparent\">\n <span class=\"tooltiptext\" [ngStyle]=\"tooltipTextWidth\">\n <ng-template ngFor let-selectedOption let-index=\"index\" [ngForOf]=\"selectedOptions.slice(1)\">\n <span class=\"bullet\"></span>\n <span>{{selectedOption[displayNameKey]}}</span>\n <br>\n </ng-template>\n </span>\n </span>\n </span>\n\n <div class=\"form-group proto-select\" (clickOutside)=\"closeDropdown()\">\n <div class=\"form-group__text\">\n <input class=\"text-small text-vibrant\" type=\"text\" (click)=\"openDropdown()\" [(ngModel)]=\"filterText\"\n placeholder=\"{{selectedOptions.length <1?selectionPlaceholder: ''}}\" [ngStyle]=\"errorAlert\" />\n <label>{{selectionLabel}}</label>\n <i class=\"proto-select-chevron\" [ngClass]=\"[ open ? 'icon-chevron-up' : 'icon-chevron-down' ]\"\n (click)=\"toggleDropdown()\"></i>\n </div>\n\n <div class=\"panel panel--raised proto-select-dropdown\" *ngIf=\"open\">\n <div class=\"text-small text-muted text-noselect qtr-padding\" *ngIf=\"optionList.length == 0\">\n No option available\n </div>\n <!-- Select All & Clear -->\n <div class=\"flex flex-center-vertical dropdown-header clearfix\" *ngIf=\"optionList.length > 0\">\n <div class=\"form-group\">\n <label class=\"checkbox\">\n <input type=\"checkbox\" *ngIf=\"!selectedAll\" (click)=\"selectAll($event)\">\n <input type=\"checkbox\" *ngIf=\"selectedAll\" checked (click)=\"reset($event)\">\n <span class=\"checkbox__input\"></span>\n <span class=\"checkbox__label text-small text-blue\"> &nbsp;All</span>\n </label>\n </div>\n <span class=\"flex-fluid\"></span>\n <span class=\"text-small text-warning qtr-padding half-padding-right clickable pull-right\"\n (click)=\"reset($event)\">Clear</span>\n </div>\n\n <!-- <div class=\"panel no-padding\" *ngFor=\"let item of optionList | filterObjectsByKey : displayNameKey : filterText | arraySort: displayNameKey\"> -->\n <div class=\"panel no-padding\" *ngFor=\"let item of optionList | filterObjectsByKey : displayNameKey : filterText\">\n\n <div class=\"form-group\">\n <label class=\"checkbox\">\n <input type=\"checkbox\" (click)=\"toggleOption(item)\" name=item[displayNameKey]\n value=item[displayNameKey] [checked]=\"isOptionSelected(item)\">\n <span class=\"checkbox__input\"></span>\n <span class=\"checkbox__label text-small\"\n [ngStyle]=\"{'color': ((item[listOptionColorKey] !== '')?item[listOptionColorKey]: '#58585b')}\">\n &nbsp;{{item[displayNameKey]|uppercase }}</span>\n </label>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n\n<div *ngIf=\"isoptionListArayString\" style=\"position: relative !important;\">\n <span class=\"tooltip\" *ngIf=\"!open\" [ngStyle]=\"tooltipTopUnshift\">\n <small *ngIf=\"selectedOptions.length>1\">+{{selectedOptions.length-1}} selected</small>\n <span class=\"tooltiptextparent\">\n <span class=\"tooltiptext\" [ngStyle]=\"tooltipTextWidth\">\n <ng-template ngFor let-selectedOption let-index=\"index\" [ngForOf]=\"selectedOptions.slice(1)\">\n <span class=\"bullet\"></span>\n <span>{{selectedOption}}</span>\n <br>\n </ng-template>\n </span>\n </span>\n </span>\n\n <div class=\"form-group proto-select\" (clickOutside)=\"closeDropdown()\">\n <div class=\"form-group__text\">\n <input class=\"text-small text-vibrant\" type=\"text\" (click)=\"openDropdown()\" [(ngModel)]=\"filterText\"\n placeholder=\"{{selectedOptions.length <1?selectionPlaceholder: ''}}\" [ngStyle]=\"errorAlert\" />\n <label>{{selectionLabel}}</label>\n <i class=\"proto-select-chevron\" [ngClass]=\"[ open ? 'icon-chevron-up' : 'icon-chevron-down' ]\"\n (click)=\"toggleDropdown()\"></i>\n </div>\n\n <div class=\"panel panel--raised proto-select-dropdown\" *ngIf=\"open\">\n <div class=\"text-small text-muted text-noselect qtr-padding\" *ngIf=\"optionList.length == 0\">\n No option available\n </div>\n <!-- Select All & Clear -->\n <div class=\"flex flex-center-vertical dropdown-header clearfix\" *ngIf=\"optionList.length > 0\">\n <div class=\"form-group\">\n <label class=\"checkbox\">\n <input type=\"checkbox\" *ngIf=\"!selectedAll\" (click)=\"selectAll($event)\">\n <input type=\"checkbox\" *ngIf=\"selectedAll\" checked (click)=\"reset($event)\">\n <span class=\"checkbox__input\"></span>\n <span class=\"checkbox__label text-small text-blue\"> &nbsp;All</span>\n </label>\n </div>\n <span class=\"flex-fluid\"></span>\n <span class=\"text-small text-warning qtr-padding half-padding-right clickable pull-right\"\n (click)=\"reset($event)\">Clear</span>\n </div>\n\n <div class=\"panel no-padding\" *ngFor=\"let item of optionList | filterStrings : filterText\">\n <div class=\"form-group\">\n <label class=\"checkbox\">\n <input type=\"checkbox\" (click)=\"toggleOption(item)\" name=item value=item\n [checked]=\"isOptionSelected(item)\">\n <span class=\"checkbox__input\"></span>\n <span class=\"checkbox__label text-small\" [ngStyle]=\"{'color': ((item !== '')?item: '#58585b')}\">\n &nbsp;{{item|uppercase }}</span>\n </label>\n </div>\n </div>\n\n </div>\n </div>\n</div>", styles: [".overlayAnchor{display:inline-block;min-width:250px}.link{text-decoration:underline;cursor:pointer;color:#007493;padding-left:8px}.noOption{padding-top:5px}.tooltip{position:absolute;right:40px;top:25px;z-index:1;display:inline-block}.tooltip .tooltiptext{visibility:hidden;min-width:120px;background-color:#555;color:#fff;text-align:center;padding:5px 0;border-radius:6px;max-height:460px;overflow:scroll;position:absolute;z-index:1;top:125%;left:50%;margin-left:-60px;opacity:0;transition:opacity .3s}.tooltip .tooltiptextparent{visibility:hidden;opacity:0;transition:opacity .3s}.tooltip .tooltiptextparent::after{content:\"\";position:absolute;top:15px;left:15px;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555}.tooltip:hover .tooltiptext,.tooltip:hover .tooltiptextparent{visibility:visible;opacity:1}.bullet{height:5px;width:5px;background-color:#fff;border-radius:50%;display:inline-block;margin-bottom:3px}.inputBox{border-bottom:1px solid #ddd;border-top:none;border-left:none;border-right:none;width:-webkit-fill-available;width:-moz-available;width:stretch}.dropdown-expanded{border:1px solid #d3d3d3;padding-left:9px;min-width:171px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;overflow:scroll;float:left}.customInput{outline:0;padding-left:6px;padding-top:3px}.customInput:hover{outline:#ccc solid 1px}.inlineBox{display:block;cursor:pointer;position:relative;padding-left:28px;padding-bottom:6px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin:5px 0;border-bottom:1px solid #ccc;word-wrap:break-word}.inlineBox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.checkmark{position:absolute;top:0;left:0;height:22px;width:22px;background-color:#eee;border-radius:5px}.checkmarkText{position:relative;top:3px}.inlineBox:hover input~.checkmark{background-color:#ccc}.inlineBox input:checked~.checkmark{background-color:#ddd}.checkmark:after{content:\"\";position:absolute;display:none}.inlineBox input:checked~.checkmark:after{display:block}.inlineBox .checkmark:after{left:4px;top:4px;width:14px;height:14px;background:#00beed;border-radius:5px}::-webkit-scrollbar{width:6px}::-webkit-scrollbar:horizontal{height:6px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:5px}::-webkit-scrollbar-thumb:hover{background:#666}.proto-select .proto-select-backdrop{position:fixed;top:0;bottom:0;right:0;left:0;z-index:99}.proto-select .proto-select-chevron{position:absolute;bottom:0;right:0;padding:5px 8px;color:gray}.proto-select .proto-select-dropdown{position:absolute;z-index:999;border:1px solid #f1f1f1;overflow-y:auto;padding:0;top:100%;left:0;right:0;max-height:215px}.proto-select .proto-select-dropdown .dropdown-header{position:-webkit-sticky;position:sticky;top:0;z-index:99;width:100%;background-color:#fff;border-bottom:1px solid #f1f1f1}.proto-select .proto-select-dropdown .form-group{padding:6px 10px;margin:0}.proto-select .proto-select-dropdown .form-group .checkbox__label{padding-top:2px}.proto-select .proto-select-dropdown .form-group.selected,.proto-select .proto-select-dropdown .form-group.selected:hover{background-color:#00bceb!important;color:#fff}.proto-select .proto-select-dropdown .form-group.selected .checkbox__label,.proto-select .proto-select-dropdown .form-group.selected:hover .checkbox__label{color:#fff!important}.proto-select .proto-select-dropdown .form-group:hover{background-color:#f1f1f1}"] }] } ]; /** @nocollapse */ MultiselectDropdownComponent.ctorParameters = () => [ { type: ElementRef } ]; MultiselectDropdownComponent.propDecorators = { selectionLabel: [{ type: Input, args: ['label',] }], optionList: [{ type: Input, args: ['data',] }], selectionSet: [{ type: Input, args: ['checkedOptions',] }], open: [{ type: Input, args: ['isOpen',] }], displayNameKey: [{ type: Input, args: ['displayKey',] }], toggleSelectionKey: [{ type: Input, args: ['toggleKey',] }], selectionPlaceholder: [{ type: Input, args: ['placeholder',] }], selectionTextWidth: [{ type: Input, args: ['selectionWidth',] }], componentWidth: [{ type: Input, args: ['width',] }], componentHeight: [{ type: Input, args: ['height',] }], selectionChange: [{ type: Output, args: ['onChange',] }], tooltipBoxWidth: [{ type: Input, args: ['tooltipWidth',] }], searchError: [{ type: Input, args: ['error',] }], listOptionColorKey: [{ type: Input, args: ['optionColorKey',] }], clickout: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; if (false) { /** @type {?} */ MultiselectDropdownComponent.prototype.filterText; /** @type {?} */ MultiselectDropdownComponent.prototype.selectionLabel; /** @type {?} */ MultiselectDropdownComponent.prototype.optionList; /** @type {?} */ MultiselectDropdownComponent.prototype.selectionSet; /** @type {?} */ MultiselectDropdownComponent.prototype.open; /** @type {?} */ MultiselectDropdownComponent.prototype.selectedOptions; /** @type {?} */ MultiselectDropdownComponent.prototype.displayNameKey; /** @type {?} */ MultiselectDropdownComponent.prototype.toggleSelectionKey; /** @type {?} */ MultiselectDropdownComponent.prototype.selectionPlaceholder; /** @type {?} */ MultiselectDropdownComponent.prototype.selectionTextWidth; /** @type {?} */ MultiselectDropdownComponent.prototype.componentWidth; /** @type {?} */ MultiselectDropdownComponent.prototype.componentHeight; /** @type {?} */ MultiselectDropdownComponent.prototype.selectedOptionsSet; /** @type {?} */ MultiselectDropdownComponent.prototype.selectionChange; /** @type {?} */ MultiselectDropdownComponent.prototype.currentStyles; /** @type {?} */ MultiselectDropdownComponent.prototype.noOption; /** @type {?} */ MultiselectDropdownComponent.prototype.tooltipTextWidth; /** @type {?} */ MultiselectDropdownComponent.prototype.errorAlert; /** @type {?} */ MultiselectDropdownComponent.prototype.tooltipTopUnshift; /** @type {?} */ MultiselectDropdownComponent.prototype.selectedAll; /** @type {?} */ MultiselectDropdownComponent.prototype.isSelectedOptionsArayString; /** @type {?} */ MultiselectDropdownComponent.prototype.isoptionListArayString; /** @type {?} */ MultiselectDropdownComponent.prototype.tooltipBoxWidth; /** @type {?} */ MultiselectDropdownComponent.prototype.searchError; /** @type {?} */ MultiselectDropdownComponent.prototype.listOptionColorKey; /** @type {?} */ MultiselectDropdownComponent.prototype.eRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY3ViZXgtbXVsdGlzZWxlY3QtZHJvcGRvd24vIiwic291cmNlcyI6WyJsaWIvbXVsdGlzZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUE0QixZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBT2xJLE1BQU07Ozs7SUE0QkosWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTswQkExQmYsRUFBRTs4QkFDa0IsUUFBUTswQkFDTixFQUFFO29CQUVaLEtBQUs7K0JBQ0wsRUFBRTs4QkFDRyxFQUFFO2tDQUNDLEVBQUU7a0NBRVcsRUFBRTs4QkFDZixHQUFHOytCQUNELEdBQUc7a0NBQ1YsRUFBRTsrQkFDQSxJQUFJLFlBQVksRUFBTzsyQkFNdEMsS0FBSzsyQ0FDVyxLQUFLO3NDQUNWLEtBQUs7K0JBQ1UsR0FBRzsyQkFDYixLQUFLO2tDQUNVLEVBQUU7S0FHdkQ7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3pFLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUk7U0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJO1lBQ3JELE9BQU8sRUFBRSxXQUFXO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7U0FDN0UsQ0FBQTtRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRztZQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSztTQUNqRCxDQUFBO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1NBQ3pFLENBQUM7S0FDSDs7Ozs7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1NBQ3pFLENBQUM7UUFDRixLQUFLLElBQUksUUFBUSxJQUFJLE9BQU8sRUFBRTtZQUM1QixJQUFJLFFBQVEsS0FBSyxjQUFjLEVBQUU7Ozs7Z0JBSS9CLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDO2dCQUNyRSxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUM7O2dCQUV0RCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTs7d0JBQzlCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxtQkFBTSxJQUFJLEVBQUMsQ0FBQzt3QkFDdEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQ2hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7NEJBQ3hDLE9BQU8sSUFBSSxDQUFDO3lCQUNiOzZCQUFNOzRCQUNMLE9BQU8sS0FBSyxDQUFDO3lCQUNkO3FCQUNGLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07MEJBQ3RHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO3dCQUN6SCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNkO3FCQUFNO29CQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7O3dCQUU5QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssbUJBQU0sSUFBSSxFQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQzs7d0JBRWpILElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFOzRCQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7NEJBQ3RDLE9BQU8sSUFBSSxDQUFDO3lCQUNiOzZCQUFNOzRCQUNMLE9BQU8sS0FBSyxDQUFDO3lCQUNkO3FCQUNGLENBQUMsQ0FBQztvQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUMvRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU07MEJBQy9ILENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO3dCQUMzSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNkO2dCQUdELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDN0Y7U0FDRjtLQUNGOzs7OztJQUVELFlBQVksQ0FBQyxNQUFNO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDOztRQUNyQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDMUM7U0FDRjthQUFNO1lBQ0wsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDOztZQUU1RyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMxQztTQUNGO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtZQUMxRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUN6QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7U0FDMUI7Ozs7O1FBTUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7S0FDcEQ7Ozs7O0lBY0QsU0FBUyxDQUFDLEtBQUs7UUFDYixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O1FBQ3hCLElBQUksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFTO2dCQUM1RCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO2FBQ2hDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBUztnQkFDNUQsT0FBTyxJQUFJLENBQUE7YUFDWixDQUFDLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDOztRQUUxQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUNwRDs7Ozs7SUFDRCxLQUFLLENBQUMsS0FBSztRQUNULEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3BEOzs7OztJQUVELGdCQUFnQixDQUFDLE1BQU07O1FBQ3JCLElBQUksWUFBWSxDQUFVO1FBQzFCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMxRDthQUFNOztZQUNMLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ2hILFlBQVksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLFlBQVksQ0FBQztLQUNyQjs7OztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2tCQUN2RSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDekgsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNkO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU07a0JBQy9ILENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUMzSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2Q7S0FDRjs7OztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07c0JBQ3ZFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO29CQUN6SCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2Q7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNO3NCQUMvSCxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDM0ssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNkO1NBQ0Y7S0FDRjs7OztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztLQUN0Qjs7Ozs7SUFHRCxRQUFRLENBQUMsS0FBSztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO3NCQUN2RSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDekgsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNkO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTTtzQkFDL0gsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUM7b0JBQzNLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDZDtTQUNGO0tBQ0Y7OztZQXBQRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDRCQUE0QjtnQkFDdEMsZ2tOQUF1Qzs7YUFFeEM7Ozs7WUFOZ0csVUFBVTs7OzZCQVV4RyxLQUFLLFNBQUMsT0FBTzt5QkFDYixLQUFLLFNBQUMsTUFBTTsyQkFDWixLQUFLLFNBQUMsZ0JBQWdCO21CQUN0QixLQUFLLFNBQUMsUUFBUTs2QkFFZCxLQUFLLFNBQUMsWUFBWTtpQ0FDbEIsS0FBSyxTQUFDLFdBQVc7bUNBQ2pCLEtBQUssU0FBQyxhQUFhO2lDQUNuQixLQUFLLFNBQUMsZ0JBQWdCOzZCQUN0QixLQUFLLFNBQUMsT0FBTzs4QkFDYixLQUFLLFNBQUMsUUFBUTs4QkFFZCxNQUFNLFNBQUMsVUFBVTs4QkFTakIsS0FBSyxTQUFDLGNBQWM7MEJBQ3BCLEtBQUssU0FBQyxPQUFPO2lDQUNiLEtBQUssU0FBQyxnQkFBZ0I7dUJBdU10QixZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2N1YmV4LW11bHRpc2VsZWN0LWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6J211bHRpc2VsZWN0LWRyb3Bkb3duLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnbXVsdGlzZWxlY3QtZHJvcGRvd24uY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlzZWxlY3REcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBmaWx0ZXJUZXh0OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCdsYWJlbCcpIHNlbGVjdGlvbkxhYmVsOiBzdHJpbmcgPSAnU2VsZWN0JztcbiAgQElucHV0KCdkYXRhJykgb3B0aW9uTGlzdDogQXJyYXk8T2JqZWN0PiA9IFtdO1xuICBASW5wdXQoJ2NoZWNrZWRPcHRpb25zJykgc2VsZWN0aW9uU2V0OiBBcnJheTxzdHJpbmc+O1xuICBASW5wdXQoJ2lzT3BlbicpIG9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWRPcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIEBJbnB1dCgnZGlzcGxheUtleScpIGRpc3BsYXlOYW1lS2V5ID0gJyc7XG4gIEBJbnB1dCgndG9nZ2xlS2V5JykgdG9nZ2xlU2VsZWN0aW9uS2V5ID0gJyc7XG4gIEBJbnB1dCgncGxhY2Vob2xkZXInKSBzZWxlY3Rpb25QbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoJ3NlbGVjdGlvbldpZHRoJykgc2VsZWN0aW9uVGV4dFdpZHRoOiBudW1iZXIgPSAxMTtcbiAgQElucHV0KCd3aWR0aCcpIGNvbXBvbmVudFdpZHRoOiBudW1iZXIgPSAyNTA7XG4gIEBJbnB1dCgnaGVpZ2h0JykgY29tcG9uZW50SGVpZ2h0OiBudW1iZXIgPSA0MDA7XG4gIHNlbGVjdGVkT3B0aW9uc1NldDogQXJyYXk8T2JqZWN0PiA9IFtdO1xuICBAT3V0cHV0KCdvbkNoYW5nZScpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBjdXJyZW50U3R5bGVzOiB7fTtcbiAgbm9PcHRpb246IHt9O1xuICB0b29sdGlwVGV4dFdpZHRoOiB7fTtcbiAgZXJyb3JBbGVydDoge307XG4gIHRvb2x0aXBUb3BVbnNoaWZ0OiB7fTtcbiAgc2VsZWN0ZWRBbGw6IEJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTZWxlY3RlZE9wdGlvbnNBcmF5U3RyaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGlzb3B0aW9uTGlzdEFyYXlTdHJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCd0b29sdGlwV2lkdGgnKSB0b29sdGlwQm94V2lkdGg6IG51bWJlciA9IDE1MDtcbiAgQElucHV0KCdlcnJvcicpIHNlYXJjaEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgnb3B0aW9uQ29sb3JLZXknKSBsaXN0T3B0aW9uQ29sb3JLZXk6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZVJlZjogRWxlbWVudFJlZikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkT3B0aW9ucykge1xuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50U3R5bGVzID0ge1xuICAgICAgd2lkdGg6IHRoaXMuY29tcG9uZW50V2lkdGggPCAyNTAgPyAnMjUwcHgnIDogKHRoaXMuY29tcG9uZW50V2lkdGggKyAncHgnKSxcbiAgICAgIFwibWF4LWhlaWdodFwiOiB0aGlzLmNvbXBvbmVudEhlaWdodCArICdweCcsXG4gICAgfTtcbiAgICB0aGlzLm5vT3B0aW9uID0ge1xuICAgICAgXCJwYWRkaW5nLWxlZnRcIjogKHRoaXMuY29tcG9uZW50V2lkdGggLyAyKSAtIDc1ICsgJ3B4JyxcbiAgICAgIFwiY29sb3JcIjogXCJnYWluc2Jvcm9cIlxuICAgIH07XG4gICAgdGhpcy50b29sdGlwVGV4dFdpZHRoID0ge1xuICAgICAgd2lkdGg6IHRoaXMudG9vbHRpcEJveFdpZHRoIDw9IDE1MCA/ICcxNTBweCcgOiAodGhpcy50b29sdGlwQm94V2lkdGggKyAncHgnKSxcbiAgICB9XG4gICAgdGhpcy50b29sdGlwVG9wVW5zaGlmdCA9IHtcbiAgICAgIHRvcDogdGhpcy5zZWxlY3Rpb25MYWJlbCAhPT0gJycgPyAnMjVweCcgOiAnN3B4JyxcbiAgICB9XG4gICAgdGhpcy5lcnJvckFsZXJ0ID0ge1xuICAgICAgYm9yZGVyOiB0aGlzLnNlYXJjaEVycm9yID09IHRydWUgPyAnMXB4IHNvbGlkIHJlZCcgOiAnMXB4IHNvbGlkICNkZmRmZGYnXG4gICAgfTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmVycm9yQWxlcnQgPSB7XG4gICAgICBib3JkZXI6IHRoaXMuc2VhcmNoRXJyb3IgPT0gdHJ1ZSA/ICcxcHggc29saWQgcmVkJyA6ICcxcHggc29saWQgI2RmZGZkZidcbiAgICB9O1xuICAgIGZvciAobGV0IHByb3BOYW1lIGluIGNoYW5nZXMpIHtcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3NlbGVjdGlvblNldCcpIHtcbiAgICAgICAgLy8gaWYoKGNoYW5nZXNbcHJvcE5hbWVdLnByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjaGFuZ2VzW3Byb3BOYW1lXS5maXJzdENoYW5nZSA9PT0gdHJ1ZSkgJiYgdGhpcy50b2dnbGVTZWxlY3Rpb25LZXkgIT09J2J1aWxkJyl7XG4gICAgICAgIC8vICAgcmV0dXJuO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuaXNvcHRpb25MaXN0QXJheVN0cmluZyA9IHR5cGVvZiB0aGlzLm9wdGlvbkxpc3RbMF0gPT09ICdzdHJpbmcnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucyA9IGNoYW5nZXNbcHJvcE5hbWVdLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIklzIHRoaXMgc3RyaW5nIC0tPlwiLCB0aGlzLmlzb3B0aW9uTGlzdEFyYXlTdHJpbmcsIHRoaXMuc2VsZWN0ZWRPcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuaXNvcHRpb25MaXN0QXJheVN0cmluZykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zU2V0ID0gW107XG4gICAgICAgICAgdGhpcy5vcHRpb25MaXN0LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1LZXkgPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKDxhbnk+aXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUtleSA+IC0xKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zU2V0W2l0ZW1LZXldID0gaXRlbTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gdGhpcy5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLm9wZW4gPT09IGZhbHNlID8gKHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdLmxlbmd0aFxuICAgICAgICAgICAgPCAodGhpcy5zZWxlY3Rpb25UZXh0V2lkdGggKyAxKSA/IHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdIDogdGhpcy5zZWxlY3RlZE9wdGlvbnNbMF0uc3Vic3RyaW5nKDAsIHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoKSArXG4gICAgICAgICAgICAnLi4nKSA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zU2V0ID0gW107XG4gICAgICAgICAgdGhpcy5vcHRpb25MaXN0LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlRlc3QgT2JqZWN0IC0tPlwiLHRoaXMuc2VsZWN0ZWRPcHRpb25zLmZpbmRJbmRleCh4ID0+IHhbdGhpcy5kaXNwbGF5TmFtZUtleV0gPT09ICg8YW55Pml0ZW0pW3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XSkpO1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5zZWxlY3RlZE9wdGlvbnMuZmluZEluZGV4KHggPT4geFt0aGlzLmRpc3BsYXlOYW1lS2V5XSA9PT0gKDxhbnk+aXRlbSlbdGhpcy50b2dnbGVTZWxlY3Rpb25LZXldKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzZWxlY3RlZE9wdGlvbnMgLS0+IFwiLCB0aGlzLnNlbGVjdGVkT3B0aW9ucywgaW5kZXgsKDxhbnk+aXRlbSlbdGhpcy50b2dnbGVTZWxlY3Rpb25LZXldKVxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnNTZXRbaW5kZXhdID0gaXRlbTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJzZWxlY3RlZE9wdGlvbnNTZXQgLS0+XCIsIHRoaXMuc2VsZWN0ZWRPcHRpb25zU2V0KTtcbiAgICAgICAgICB0aGlzLmZpbHRlclRleHQgPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMub3BlbiA9PT0gZmFsc2UgPyAodGhpcy5zZWxlY3RlZE9wdGlvbnNbMF1bdGhpcy50b2dnbGVTZWxlY3Rpb25LZXldLmxlbmd0aFxuICAgICAgICAgICAgPCAodGhpcy5zZWxlY3Rpb25UZXh0V2lkdGggKyAxKSA/IHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdW3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XSA6IHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdW3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XS5zdWJzdHJpbmcoMCwgdGhpcy5zZWxlY3Rpb25UZXh0V2lkdGgpICtcbiAgICAgICAgICAgICcuLicpIDogJyc7XG4gICAgICAgIH1cblxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBbGwgPSB0aGlzLm9wdGlvbkxpc3QubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkT3B0aW9uc1NldC5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgaWYgKHRoaXMuaXNvcHRpb25MaXN0QXJheVN0cmluZykge1xuICAgICAgaW5kZXggPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5pbmRleE9mKG9wdGlvbik7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnNTZXQucHVzaChvcHRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnNTZXQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXggPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5maW5kSW5kZXgoeCA9PiB4W3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XSA9PT0gb3B0aW9uW3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XSk7XG4gICAgICAvL2NvbnNvbGUubG9nKFwic2VsZWN0ZWRPcHRpb25zIC0tPiBcIiwgdGhpcy5zZWxlY3RlZE9wdGlvbnMsIGluZGV4LCBvcHRpb25bdGhpcy50b2dnbGVTZWxlY3Rpb25LZXldKTtcbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMucHVzaChvcHRpb24pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uc1NldC5wdXNoKG9wdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uc1NldC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbkxpc3QubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRBbGwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQWxsID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRPcHRpb25zU2V0KTtcbiAgICAvL3RoaXMuc2VsZWN0ZWRPcHRpb25zU2V0ID0gdGhpcy5nZXRTZWxlY3RlZE9wdGlvblNldCh0aGlzLnNlbGVjdGVkT3B0aW9uc1NldCk7XG4gICAgLy8gY29uc29sZS5sb2coXCJBZnRlciBNb2RpZmllZCAtLT5cIiwgdGhpcy5zZWxlY3RlZE9wdGlvbnNTZXQpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZE9wdGlvbnNTZXQpO1xuICB9XG5cbiAgLy8gZ2V0U2VsZWN0ZWRPcHRpb25TZXQoc2VsZWN0ZWRPcHRpb25zU2V0KSB7XG4gIC8vICAgaWYodGhpcy5pc1NlbGVjdGVkT3B0aW9uc0FyYXlTdHJpbmcpe1xuICAvLyAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25MaXN0U3RyaW5nQXJyYXk6IGFueSA9IFtdO1xuICAvLyAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uc1NldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAvLyAgICAgICAgIHNlbGVjdGVkT3B0aW9uTGlzdFN0cmluZ0FycmF5LnB1c2goaXRlbVt0aGlzLmRpc3BsYXlOYW1lS2V5XSk7XG4gIC8vICAgICAgICB9KTtcbiAgLy8gICAgICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uTGlzdFN0cmluZ0FycmF5O1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb25zU2V0O1xuICAvLyAgIH1cblxuICAvLyB9XG4gIHNlbGVjdEFsbChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRBbGwgPSB0cnVlO1xuICAgIGxldCB0b2dnbGVTZWxlY3Rpb25LZXkgPSB0aGlzLnRvZ2dsZVNlbGVjdGlvbktleTtcbiAgICBpZiAodGhpcy5pc29wdGlvbkxpc3RBcmF5U3RyaW5nKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucyA9IHRoaXMub3B0aW9uTGlzdC5tYXAoZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgICByZXR1cm4gaXRlbVt0b2dnbGVTZWxlY3Rpb25LZXldXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbkxpc3QubWFwKGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkT3B0aW9uc1NldCA9IHRoaXMub3B0aW9uTGlzdDtcbiAgICAvL3RoaXMuc2VsZWN0ZWRPcHRpb25zU2V0ID0gdGhpcy5nZXRTZWxlY3RlZE9wdGlvblNldCh0aGlzLnNlbGVjdGVkT3B0aW9uc1NldCk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkT3B0aW9uc1NldCk7XG4gIH1cbiAgcmVzZXQoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNlbGVjdGVkQWxsID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkT3B0aW9uc1NldCA9IFtdO1xuICAgIHRoaXMuZmlsdGVyVGV4dCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZE9wdGlvbnNTZXQpO1xuICB9XG5cbiAgaXNPcHRpb25TZWxlY3RlZChvcHRpb24pIHtcbiAgICBsZXQgc2VsZWN0ZWRGbGFnOiBib29sZWFuO1xuICAgIGlmICh0aGlzLmlzb3B0aW9uTGlzdEFyYXlTdHJpbmcpIHtcbiAgICAgIHNlbGVjdGVkRmxhZyA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmluZGV4T2Yob3B0aW9uKSA+IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaW5kZXggPSB0aGlzLnNlbGVjdGVkT3B0aW9ucy5maW5kSW5kZXgoeCA9PiB4W3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XSA9PT0gb3B0aW9uW3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XSk7XG4gICAgICBzZWxlY3RlZEZsYWcgPSBpbmRleCA+IC0xO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRGbGFnO1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5pc29wdGlvbkxpc3RBcmF5U3RyaW5nKSB7XG4gICAgICB0aGlzLmZpbHRlclRleHQgPSB0aGlzLnNlbGVjdGVkT3B0aW9uc1swXSA/ICh0aGlzLnNlbGVjdGVkT3B0aW9uc1swXS5sZW5ndGhcbiAgICAgICAgPCAodGhpcy5zZWxlY3Rpb25UZXh0V2lkdGggKyAxKSA/IHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdIDogdGhpcy5zZWxlY3RlZE9wdGlvbnNbMF0uc3Vic3RyaW5nKDAsIHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoKSArXG4gICAgICAgICcuLicpIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA+IDAgJiYgdGhpcy5vcGVuID09PSBmYWxzZSA/ICh0aGlzLnNlbGVjdGVkT3B0aW9uc1swXVt0aGlzLnRvZ2dsZVNlbGVjdGlvbktleV0ubGVuZ3RoXG4gICAgICAgIDwgKHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoICsgMSkgPyB0aGlzLnNlbGVjdGVkT3B0aW9uc1swXVt0aGlzLnRvZ2dsZVNlbGVjdGlvbktleV0gOiB0aGlzLnNlbGVjdGVkT3B0aW9uc1swXVt0aGlzLnRvZ2dsZVNlbGVjdGlvbktleV0uc3Vic3RyaW5nKDAsIHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoKSArXG4gICAgICAgICcuLicpIDogJyc7XG4gICAgfVxuICB9XG4gIHRvZ2dsZURyb3Bkb3duKCkge1xuICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG4gICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlzb3B0aW9uTGlzdEFyYXlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJUZXh0ID0gdGhpcy5zZWxlY3RlZE9wdGlvbnNbMF0gPyAodGhpcy5zZWxlY3RlZE9wdGlvbnNbMF0ubGVuZ3RoXG4gICAgICAgICAgPCAodGhpcy5zZWxlY3Rpb25UZXh0V2lkdGggKyAxKSA/IHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdIDogdGhpcy5zZWxlY3RlZE9wdGlvbnNbMF0uc3Vic3RyaW5nKDAsIHRoaXMuc2VsZWN0aW9uVGV4dFdpZHRoKSArXG4gICAgICAgICAgJy4uJykgOiAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsdGVyVGV4dCA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCA+IDAgJiYgdGhpcy5vcGVuID09PSBmYWxzZSA/ICh0aGlzLnNlbGVjdGVkT3B0aW9uc1swXVt0aGlzLnRvZ2dsZVNlbGVjdGlvbktleV0ubGVuZ3RoXG4gICAgICAgICAgPCAodGhpcy5zZWxlY3Rpb25UZXh0V2lkdGggKyAxKSA/IHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdW3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XSA6IHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdW3RoaXMudG9nZ2xlU2VsZWN0aW9uS2V5XS5zdWJzdHJpbmcoMCwgdGhpcy5zZWxlY3Rpb25UZXh0V2lkdGgpICtcbiAgICAgICAgICAnLi4nKSA6ICcnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvcGVuRHJvcGRvd24oKSB7XG4gICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm