UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

717 lines 61.2 kB
/** * @fileoverview added by tsickle * Generated from: tree-select.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewChild, TemplateRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { OperableTreeComponent } from '@duoduo-oba/ng-devui/tree'; import DefaultIcons from './tree-default-icons'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; import { I18nService } from '@duoduo-oba/ng-devui/i18n'; export class TreeSelectComponent { /** * @param {?} renderer * @param {?} changeDetectorRef * @param {?} i18n */ constructor(renderer, changeDetectorRef, i18n) { this.renderer = renderer; this.changeDetectorRef = changeDetectorRef; this.i18n = i18n; this.placeholder = ''; this.disabled = false; this.expandTree = false; this.multiple = false; this.treeNodeIdKey = 'id'; this.treeNodeChildrenKey = 'children'; this.disabledKey = 'disabled'; this.leafOnly = false; this.delimiter = ', '; this.iconParentOpen = DefaultIcons.iconParentOpen; this.iconParentClose = DefaultIcons.iconParentClose; this.iconLeaf = DefaultIcons.iconLeaf; this.closeOnNodeSelected = true; this.width = null; this.searchable = false; this.appendTo = 'body'; this.treeNodeTitleKey = 'title'; this.allowUnselect = true; this.valueChanged = new EventEmitter(); this._treeData = []; this.searchString = null; this.noRecord = false; this._isOpen = false; this._sourceTree = []; this.readyEvent = (/** * @param {?} treeSelect * @return {?} */ (treeSelect) => { }); this.onChange = (/** * @param {?} _ * @return {?} */ (_) => null); this.onTouch = (/** * @return {?} */ () => null); } /** * @param {?} allowClear * @return {?} */ set allowClear(allowClear) { this._allowClear = allowClear; } /** * @return {?} */ get allowClear() { return !this.disabled && !this.multiple && this.allowUnselect && this._allowClear && !!this.selectedValue; } /** * @param {?} treeData * @return {?} */ set treeData(treeData) { this._sourceTree = treeData; this.refreshTree(treeData); } /** * @return {?} */ get treeData() { return this._treeData; } /** * @return {?} */ get isOpen() { return this._isOpen; } /** * @param {?} value * @return {?} */ set isOpen(value) { if (this._isOpen !== value) { this._isOpen = value; this.changeDetectorRef.detectChanges(); } } /** * @return {?} */ ngAfterViewInit() { this.changeDetectorRef.detectChanges(); this.readyEvent(this); if (this.searchable) { this.registerSearchListener(); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { } /** * @return {?} */ ngOnDestroy() { if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } } /** * @return {?} */ ngOnInit() { this.setI18nText(); } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouch = fn; } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * @param {?} value * @return {?} */ writeValue(value) { this.value = this.multiple ? Object.assign([], value) : value; this.refreshTree(this.treeData); // Trigger visualization after tree data is fulfilled. this.changeDetectorRef.detectChanges(); this.visualizeSelectedItems(); } /** * @return {?} */ toggle() { if (this.timer) { clearTimeout(this.timer); } /** @type {?} */ const applyNow = !this.timer; this.timer = setTimeout((/** * @return {?} */ () => { this.timer = null; }), 200); if (applyNow) { this.isOpen = !this.isOpen; } } /** * @private * @return {?} */ setI18nText() { this.i18nCommonText = this.i18n.getI18nText().common; this.i18nSubscription = this.i18n.langChange().subscribe((/** * @param {?} data * @return {?} */ (data) => { this.i18nCommonText = data.common; })); } /** * @private * @param {?} treeNode * @return {?} */ expandAllNodes(treeNode) { if (Array.isArray(treeNode)) { return treeNode.map((/** * @param {?} node * @return {?} */ node => this.expandAllNodes(node))); } else if (treeNode instanceof Object) { if (treeNode.hasOwnProperty(this.treeNodeChildrenKey)) { treeNode.open = true; treeNode[this.treeNodeChildrenKey] = this.expandAllNodes(treeNode[this.treeNodeChildrenKey]); } return treeNode; } } /** * @private * @param {?} treeNode * @param {?=} expandTree * @return {?} */ prepareTree(treeNode, expandTree = false) { if (Array.isArray(treeNode)) { return treeNode.map((/** * @param {?} node * @return {?} */ node => this.prepareTree(node, expandTree))); } else if (treeNode) { /** @type {?} */ let parentCheckedByChildren = false; if (treeNode.hasOwnProperty(this.treeNodeChildrenKey)) { treeNode.open = expandTree ? true : treeNode.open; treeNode[this.treeNodeChildrenKey] = this.prepareTree(treeNode[this.treeNodeChildrenKey], expandTree); if (this.multiple) { [parentCheckedByChildren, treeNode.halfChecked] = this.resolveParentNode(treeNode[this.treeNodeChildrenKey]); } } if (treeNode.hasOwnProperty(this.treeNodeIdKey)) { /** @type {?} */ const nodeId = treeNode[this.treeNodeIdKey]; if (this.multiple) { /** @type {?} */ const selectedByValue = this.nodeSelected(nodeId); treeNode.isActive = false; treeNode.isChecked = selectedByValue || parentCheckedByChildren; if (!this.leafOnly && !selectedByValue && parentCheckedByChildren) { /** @type {?} */ const insertObject = {}; insertObject[this.treeNodeIdKey] = treeNode[this.treeNodeIdKey]; insertObject[this.treeNodeTitleKey] = treeNode[this.treeNodeTitleKey]; ((/** @type {?} */ (this.value))).push(insertObject); } } else { treeNode.isChecked = false; treeNode.isActive = this.nodeSelected(nodeId); if (treeNode.isActive) { this.currentActiveNode = treeNode; } } } return treeNode; } } /** * @private * @param {?} treeNodeId * @return {?} */ nodeSelected(treeNodeId) { if (!this.value) { return false; } if (this.multiple && Array.isArray(this.value)) { // polyfill Array.prototype.includes() return this.value.map((/** * @param {?} _ * @return {?} */ _ => _[this.treeNodeIdKey])).indexOf(treeNodeId) > -1; } else { return this.value[this.treeNodeIdKey] && treeNodeId === this.value[this.treeNodeIdKey]; } } /** * @private * @param {?} treeNodes * @return {?} */ resolveParentNode(treeNodes) { /** @type {?} */ const childrenFullCheckedCount = treeNodes.filter((/** * @param {?} _ * @return {?} */ _ => _.isChecked)).length; /** @type {?} */ const childrenCheckedCount = treeNodes.filter((/** * @param {?} _ * @return {?} */ _ => _.isChecked || _.halfChecked)).length; return [ childrenFullCheckedCount > 0 && treeNodes.length === childrenFullCheckedCount, childrenCheckedCount > 0 && treeNodes.length > childrenFullCheckedCount ]; } /** * @private * @param {?} treeData * @return {?} */ refreshTree(treeData) { this._treeData = Object.assign([], this.prepareTree(treeData, this.expandTree)); } /** * @param {?} selectedNodes * @return {?} */ onOperableNodeChecked(selectedNodes) { /** @type {?} */ const selectedValueExtractor = (/** * @param {?} _selectedNodes * @return {?} */ (_selectedNodes) => { return this.leafOnly ? _selectedNodes.filter((/** * @param {?} _ * @return {?} */ _ => !_.data.isParent)).map((/** * @param {?} _ * @return {?} */ _ => _.data.originItem)) : _selectedNodes.map((/** * @param {?} _ * @return {?} */ _ => _.data.originItem)); }); if (this.multiple) { this.value = selectedValueExtractor(selectedNodes); this.emitEvents(); } } /** * @param {?} selectedNode * @return {?} */ onOperableNodeSelected(selectedNode) { if (!this.multiple) { if (this.leafOnly && selectedNode.data.isParent) { return; } if (selectedNode.data.isActive) { this.currentActiveNode = selectedNode.data.originItem; this.value = selectedNode.data.originItem; // Configurable close on node selected if (this.closeOnNodeSelected) { this.isOpen = false; } } else { if (this.allowUnselect) { this.currentActiveNode = null; this.value = null; } else { selectedNode.data.isActive = true; if (this.closeOnNodeSelected) { this.isOpen = false; } } } this.emitEvents(); } } /** * @return {?} */ emitEvents() { this.visualizeSelectedItems(); this.onChange(this.value); this.valueChanged.emit(this.selectedValue()); this.onTouch(); } /** * @return {?} */ visualizeSelectedItems() { if (this.multiple) { this.visualizeMultipleValue(); } else { this.visualizeSingleValue(); } } /** * @return {?} */ visualizeMultipleValue() { if (this.tree && this.tree.treeFactory) { /** @type {?} */ const selectedNodes = (/** @type {?} */ (this.selectedValue())); /** @type {?} */ const valueText = selectedNodes.map((/** * @param {?} _ * @return {?} */ _ => _[this.treeNodeTitleKey])).join(this.delimiter); this.renderer.setAttribute(this.selectHost.nativeElement, 'value', valueText); } else { this.emptyInput(); } } /** * @return {?} */ visualizeSingleValue() { if (this.value && this.value[this.treeNodeTitleKey]) { /** @type {?} */ const valueText = this.value[this.treeNodeTitleKey]; this.renderer.setAttribute(this.selectHost.nativeElement, 'value', valueText); } else { this.emptyInput(); } } /** * @return {?} */ emptyInput() { this.renderer.setAttribute(this.selectHost.nativeElement, 'value', ''); } /** * @return {?} */ selectedValue() { return this.value; } /** * @param {?} popperState * @return {?} */ responsePopperChange(popperState) { if (popperState && this.searchable) { this.focusSearchInput(); } } /** * @private * @return {?} */ focusSearchInput() { if (this.searchInput.nativeElement) { this.searchInput.nativeElement.focus(); } } /** * @param {?} searchString * @return {?} */ search(searchString) { /** @type {?} */ const searchRes = this.tree.treeFactory.searchTree(searchString, true); if (typeof searchRes === 'boolean') { this.noRecord = searchRes; } else if (Array.isArray(searchRes)) { this.noRecord = searchRes.every((/** * @param {?} res * @return {?} */ res => !res)); } this.popper.update(); } /** * @private * @return {?} */ registerSearchListener() { this.searchInputModel.valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe((/** * @param {?} searchString * @return {?} */ searchString => { this.search(searchString); })); } /** * @private * @return {?} */ scrollToSelected() { if (this.multiple) { return; } /** @type {?} */ const selectedNode = this.optionsContainer.nativeElement.querySelector('.tree-node.operable-tree-node.selected'); /** @type {?} */ const scrollableContainer = this.optionsContainer.nativeElement.parentNode; if (!selectedNode || !scrollableContainer) { return; } /** @type {?} */ const scrollOffset = selectedNode.offsetTop; scrollableContainer.scrollTo({ top: (scrollOffset - scrollableContainer.scrollTop) }); } /** * @return {?} */ clearValue() { if (this.treeData && this.treeData.length > 0 && !this.disabled && !this.multiple && !!this.selectedValue) { this.tree.treeFactory.deactivateAllNodes(); this.currentActiveNode = null; this.value = null; this.emitEvents(); } } /** * @return {?} */ onNodeToggled() { if (this.popper) { this.popper.update(); } } } TreeSelectComponent.decorators = [ { type: Component, args: [{ selector: 'd-tree-select', template: "<div class=\"devui-tree-select\">\r\n <popper-component [(open)]=\"isOpen\" [fluidPopper]=\"!width\" (openChange)=\"responsePopperChange($event)\" [appendTo]=\"appendTo\" #popper>\r\n <input\r\n #selectHost\r\n class=\"devui-select-input devui-input devui-form-control devui-tree-select-input\"\r\n (click)=\"toggle()\"\r\n [placeholder]=\"placeholder\"\r\n autocomplete=\"off\"\r\n [disabled]=\"disabled\"\r\n readonly\r\n popper-activator\r\n />\r\n <div popper-prepend class=\"devui-tree-select devui-search-container\" *ngIf=\"searchable\">\r\n <input class=\"devui-input\" [(ngModel)]=\"searchString\" #searchInputModel=\"ngModel\" #searchInput />\r\n </div>\r\n <div class=\"devui-tree-select devui-options-container\" #optionsContainer popper-container [ngStyle]=\"{ width: width }\">\r\n <d-operable-tree\r\n #tree\r\n [style.display]=\"treeData && treeData.length > 0 && !noRecord ? 'block' : 'none'\"\r\n [tree]=\"treeData\"\r\n [treeNodeIdKey]=\"treeNodeIdKey\"\r\n [treeNodeChildrenKey]=\"treeNodeChildrenKey\"\r\n [checkboxDisabledKey]=\"disabledKey\"\r\n [checkboxInput]=\"checkboxInput\"\r\n [checkable]=\"multiple\"\r\n [canActivateNode]=\"!multiple\"\r\n [canActivateParentNode]=\"!leafOnly\"\r\n (nodeChecked)=\"onOperableNodeChecked($event)\"\r\n (nodeSelected)=\"onOperableNodeSelected($event)\"\r\n (nodeToggled)=\"onNodeToggled()\"\r\n [iconParentOpen]=\"iconParentOpen\"\r\n [iconParentClose]=\"iconParentClose\"\r\n [iconLeaf]=\"iconLeaf\"\r\n [treeNodeTitleKey]=\"treeNodeTitleKey\"\r\n [iconTemplatePosition]=\"iconTemplatePosition\"\r\n class=\"devui-tree\"\r\n >\r\n <ng-template *ngIf=\"iconTemplateInput || iconTemplatePassThrough\" #iconTemplate let-node=\"node\">\r\n <ng-template [ngTemplateOutlet]=\"iconTemplateInput || iconTemplatePassThrough\" [ngTemplateOutletContext]=\"{ node: node }\">\r\n </ng-template>\r\n </ng-template>\r\n </d-operable-tree>\r\n <div *ngIf=\"!treeData || treeData.length <= 0\" class=\"devui-no-data-tip\">\r\n {{ i18nCommonText?.noData }}\r\n </div>\r\n <div *ngIf=\"noRecord\" class=\"devui-no-data-tip\">\r\n {{ i18nCommonText?.noRecordsFound }}\r\n </div>\r\n </div>\r\n </popper-component>\r\n <div\r\n [ngClass]=\"{ disabled: disabled, clear: allowClear }\"\r\n (click)=\"$event.stopPropagation(); $event.preventDefault(); clearValue()\"\r\n ></div>\r\n <span class=\"devui-select-chevron-icon\" [class.open]=\"isOpen\" [ngClass]=\"{ disabled: disabled, clear: allowClear }\">\r\n <svg width=\"14px\" height=\"14px\" viewBox=\"0 0 16 16\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g id=\"chevron_down\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\r\n <polygon id=\"chevron_down\" points=\"4.5 5 8 8.76923077 11.5 5 13 6.61538462 8 12 3 6.61538462\"></polygon>\r\n </g>\r\n </svg>\r\n </span>\r\n</div>\r\n", exportAs: 'select', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => TreeSelectComponent)), multi: true } ], styles: [".devui-tree-select{position:relative;width:100%}.devui-tree-select input.devui-select-input{cursor:pointer;display:inline-block;width:100%;color:#252b3a;text-overflow:ellipsis}.devui-tree-select input.devui-select-input.devui-tree-select-input{padding:5px 2em 5px 10px}.devui-tree-select:hover .clear{position:absolute;height:14px;width:14px;right:12px;top:calc((100% - 14px)/ 2);cursor:pointer}.devui-tree-select:hover .clear::after,.devui-tree-select:hover .clear::before{position:absolute;content:'';height:14px;width:1px;background-color:#252b3a;left:50%}.devui-tree-select:hover .clear::before{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.devui-tree-select:hover .clear::after{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.devui-tree-select:hover .clear:hover::after,.devui-tree-select:hover .clear:hover::before{background-color:#252b3a}.devui-tree-select .devui-select-chevron-icon{right:12px;top:calc((100% - 14px)/ 2);position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.devui-tree-select .devui-select-chevron-icon svg{-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.devui-tree-select .devui-select-chevron-icon.open svg{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.devui-tree-select .devui-select-chevron-icon.clear{opacity:0}.devui-tree-select .devui-select-chevron-icon.disabled{opacity:.3}.devui-tree-select .devui-select-chevron-icon ::ng-deep g{fill:#252b3a}.devui-tree-select:not(:hover) .devui-select-chevron-icon:not(.disabled){opacity:1;-webkit-transition:opacity .1s linear;transition:opacity .1s linear}.devui-tree-select.devui-options-container{width:100%;color:#252b3a;padding:5px 0}.devui-tree-select.devui-options-container .devui-tree ::ng-deep .devui-tree-node.devui-operable-tree-node .devui-tree-node__content{margin-left:10px}.devui-tree-select.devui-options-container .devui-tree ::ng-deep .devui-tree-node.devui-operable-tree-node .active{background-color:transparent}.devui-tree-select.devui-options-container .devui-tree ::ng-deep .devui-tree-node.devui-operable-tree-node.selected{position:relative;-webkit-width:-webkit-fit-content;-moz-width:-moz-fit-content;width:fit-content;min-width:calc(100% - 1.2em)}.devui-tree-select.devui-options-container .devui-tree ::ng-deep .devui-tree-node.devui-operable-tree-node.selected::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background-color:#f2f5fc;z-index:-1}.devui-tree-select.devui-options-container .devui-no-data-tip{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:not-allowed;padding:5px 12px;opacity:.3}.devui-tree-select.devui-search-container{padding:5px}:host{display:inline-block;width:100%}"] }] } ]; /** @nocollapse */ TreeSelectComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ChangeDetectorRef }, { type: I18nService } ]; TreeSelectComponent.propDecorators = { allowClear: [{ type: Input }], treeData: [{ type: Input }], placeholder: [{ type: Input }], disabled: [{ type: Input }], expandTree: [{ type: Input }], multiple: [{ type: Input }], treeNodeIdKey: [{ type: Input }], treeNodeChildrenKey: [{ type: Input }], disabledKey: [{ type: Input }], leafOnly: [{ type: Input }], delimiter: [{ type: Input }], iconParentOpen: [{ type: Input }], iconParentClose: [{ type: Input }], iconLeaf: [{ type: Input }], closeOnNodeSelected: [{ type: Input }], width: [{ type: Input }], searchable: [{ type: Input }], appendTo: [{ type: Input }], treeNodeTitleKey: [{ type: Input }], allowUnselect: [{ type: Input }], iconTemplatePosition: [{ type: Input }], iconTemplateInput: [{ type: Input }], selectHost: [{ type: ViewChild, args: ['selectHost', { static: true },] }], optionsContainer: [{ type: ViewChild, args: ['optionsContainer', { static: true },] }], tree: [{ type: ViewChild, args: ['tree', { static: true },] }], searchInput: [{ type: ViewChild, args: ['searchInput', { static: false },] }], searchInputModel: [{ type: ViewChild, args: ['searchInputModel', { static: false },] }], popper: [{ type: ViewChild, args: ['popper', { static: true },] }], iconTemplatePassThrough: [{ type: ContentChild, args: ['iconTemplate', { static: false },] }], valueChanged: [{ type: Output }], readyEvent: [{ type: Input }] }; if (false) { /** @type {?} */ TreeSelectComponent.prototype.placeholder; /** @type {?} */ TreeSelectComponent.prototype.disabled; /** @type {?} */ TreeSelectComponent.prototype.expandTree; /** @type {?} */ TreeSelectComponent.prototype.multiple; /** @type {?} */ TreeSelectComponent.prototype.treeNodeIdKey; /** @type {?} */ TreeSelectComponent.prototype.treeNodeChildrenKey; /** @type {?} */ TreeSelectComponent.prototype.disabledKey; /** @type {?} */ TreeSelectComponent.prototype.leafOnly; /** @type {?} */ TreeSelectComponent.prototype.delimiter; /** @type {?} */ TreeSelectComponent.prototype.iconParentOpen; /** @type {?} */ TreeSelectComponent.prototype.iconParentClose; /** @type {?} */ TreeSelectComponent.prototype.iconLeaf; /** @type {?} */ TreeSelectComponent.prototype.closeOnNodeSelected; /** @type {?} */ TreeSelectComponent.prototype.width; /** @type {?} */ TreeSelectComponent.prototype.searchable; /** @type {?} */ TreeSelectComponent.prototype.appendTo; /** @type {?} */ TreeSelectComponent.prototype.treeNodeTitleKey; /** @type {?} */ TreeSelectComponent.prototype.allowUnselect; /** @type {?} */ TreeSelectComponent.prototype.iconTemplatePosition; /** @type {?} */ TreeSelectComponent.prototype.iconTemplateInput; /** @type {?} */ TreeSelectComponent.prototype.selectHost; /** @type {?} */ TreeSelectComponent.prototype.optionsContainer; /** @type {?} */ TreeSelectComponent.prototype.tree; /** @type {?} */ TreeSelectComponent.prototype.searchInput; /** @type {?} */ TreeSelectComponent.prototype.searchInputModel; /** @type {?} */ TreeSelectComponent.prototype.popper; /** @type {?} */ TreeSelectComponent.prototype.iconTemplatePassThrough; /** @type {?} */ TreeSelectComponent.prototype.valueChanged; /** @type {?} */ TreeSelectComponent.prototype.checkboxInput; /** @type {?} */ TreeSelectComponent.prototype._treeData; /** @type {?} */ TreeSelectComponent.prototype.value; /** @type {?} */ TreeSelectComponent.prototype.currentActiveNode; /** @type {?} */ TreeSelectComponent.prototype.searchString; /** @type {?} */ TreeSelectComponent.prototype.i18nCommonText; /** @type {?} */ TreeSelectComponent.prototype.i18nSubscription; /** @type {?} */ TreeSelectComponent.prototype.noRecord; /** * @type {?} * @private */ TreeSelectComponent.prototype._isOpen; /** * @type {?} * @private */ TreeSelectComponent.prototype._sourceTree; /** * @type {?} * @private */ TreeSelectComponent.prototype._allowClear; /** * @type {?} * @private */ TreeSelectComponent.prototype.timer; /** @type {?} */ TreeSelectComponent.prototype.readyEvent; /** * @type {?} * @private */ TreeSelectComponent.prototype.onChange; /** * @type {?} * @private */ TreeSelectComponent.prototype.onTouch; /** * @type {?} * @protected */ TreeSelectComponent.prototype.renderer; /** * @type {?} * @protected */ TreeSelectComponent.prototype.changeDetectorRef; /** * @type {?} * @private */ TreeSelectComponent.prototype.i18n; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvdHJlZS1zZWxlY3QvIiwic291cmNlcyI6WyJ0cmVlLXNlbGVjdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUlMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUE2QixxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLFlBQVksTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFpQjNELE1BQU0sT0FBTyxtQkFBbUI7Ozs7OztJQTZCOUIsWUFDWSxRQUFtQixFQUNuQixpQkFBb0MsRUFDdEMsSUFBaUI7UUFGZixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDdEMsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUlsQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQix3QkFBbUIsR0FBRyxVQUFVLENBQUM7UUFDakMsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFDekIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLG1CQUFjLEdBQVcsWUFBWSxDQUFDLGNBQWMsQ0FBQztRQUNyRCxvQkFBZSxHQUFXLFlBQVksQ0FBQyxlQUFlLENBQUM7UUFDdkQsYUFBUSxHQUFXLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDekMsd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQzNCLFVBQUssR0FBVyxJQUFJLENBQUM7UUFDckIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixhQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ2xCLHFCQUFnQixHQUFHLE9BQU8sQ0FBQztRQUMzQixrQkFBYSxHQUFHLElBQUksQ0FBQztRQVdwQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFNUMsY0FBUyxHQUFxQixFQUFFLENBQUM7UUFHakMsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFHNUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNULFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFJaEIsZUFBVTs7OztRQUFHLENBQUMsVUFBK0IsRUFBRSxFQUFFO1FBQzFELENBQUMsRUFBQTtRQUVPLGFBQVE7Ozs7UUFBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFDO1FBQzVCLFlBQU87OztRQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBQztJQWhEN0IsQ0FBQzs7Ozs7SUFqQ0QsSUFBYSxVQUFVLENBQUMsVUFBVTtRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDOzs7O0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1RyxDQUFDOzs7OztJQUVELElBQWEsUUFBUSxDQUFDLFFBQVE7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDOzs7O0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Ozs7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQzs7Ozs7SUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLO1FBQ2QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDeEM7SUFDSCxDQUFDOzs7O0lBeURELGVBQWU7UUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDL0I7SUFDSCxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjtJQUNsQyxDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNyQztJQUNILENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7OztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQyxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFFRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUFFOztjQUN2QyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVU7OztRQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELElBQUksUUFBUSxFQUFFO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FBRTtJQUMvQyxDQUFDOzs7OztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEMsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7Ozs7SUFFTyxjQUFjLENBQUMsUUFBUTtRQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxRQUFRLENBQUMsR0FBRzs7OztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDO1NBQ3hEO2FBQU0sSUFBSSxRQUFRLFlBQVksTUFBTSxFQUFFO1lBQ3JDLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRTtnQkFDckQsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2FBQzlGO1lBQ0QsT0FBTyxRQUFRLENBQUM7U0FDakI7SUFDSCxDQUFDOzs7Ozs7O0lBRU8sV0FBVyxDQUFDLFFBQWEsRUFBRSxVQUFVLEdBQUcsS0FBSztRQUNuRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxRQUFRLENBQUMsR0FBRzs7OztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUMsQ0FBQztTQUNqRTthQUFNLElBQUksUUFBUSxFQUFFOztnQkFDZix1QkFBdUIsR0FBRyxLQUFLO1lBQ25DLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRTtnQkFDckQsUUFBUSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDbEQsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2pCLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztpQkFDOUc7YUFDRjtZQUNELElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7O3NCQUN6QyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzNDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTs7MEJBQ1gsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO29CQUNqRCxRQUFRLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztvQkFDMUIsUUFBUSxDQUFDLFNBQVMsR0FBRyxlQUFlLElBQUksdUJBQXVCLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsZUFBZSxJQUFJLHVCQUF1QixFQUFFOzs4QkFDM0QsWUFBWSxHQUFHLEVBQUU7d0JBQ3ZCLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDaEUsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt3QkFDdEUsQ0FBQyxtQkFBQSxJQUFJLENBQUMsS0FBSyxFQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQzFDO2lCQUNGO3FCQUFNO29CQUNMLFFBQVEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUMzQixRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzlDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTt3QkFDckIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztxQkFDbkM7aUJBQ0Y7YUFDRjtZQUVELE9BQU8sUUFBUSxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQzs7Ozs7O0lBRU8sWUFBWSxDQUFDLFVBQWU7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzlDLHNDQUFzQztZQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRzs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM1RTthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDeEY7SUFDSCxDQUFDOzs7Ozs7SUFFTyxpQkFBaUIsQ0FBQyxTQUFzQjs7Y0FDeEMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDLE1BQU07Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxNQUFNOztjQUNwRSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsTUFBTTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFDLENBQUMsTUFBTTtRQUN2RixPQUFPO1lBQ0wsd0JBQXdCLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssd0JBQXdCO1lBQzdFLG9CQUFvQixHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLHdCQUF3QjtTQUN4RSxDQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBRU8sV0FBVyxDQUFDLFFBQW9CO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQzs7Ozs7SUFFRCxxQkFBcUIsQ0FBQyxhQUEwQjs7Y0FDeEMsc0JBQXNCOzs7O1FBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEIsY0FBYyxDQUFDLE1BQU07Ozs7Z0JBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUMsR0FBRzs7OztnQkFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQztnQkFDMUUsY0FBYyxDQUFDLEdBQUc7Ozs7Z0JBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQTtRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7Ozs7O0lBRUQsc0JBQXNCLENBQUMsWUFBdUI7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUMvQyxPQUFPO2FBQ1I7WUFDRCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQzFDLHNDQUFzQztnQkFDdEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUNyQjthQUNGO2lCQUFNO2dCQUNMLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztvQkFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ25CO3FCQUFNO29CQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDbEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7d0JBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7cUJBQUU7aUJBQ3ZEO2FBQ0Y7WUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDOzs7O0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDOzs7O0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDOzs7O0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTs7a0JBQ2hDLGFBQWEsR0FBRyxtQkFBQSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQVM7O2tCQUM3QyxTQUFTLEdBQUcsYUFBYSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztTQUMvRTthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQzs7OztJQUVELG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRTs7a0JBQzdDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDL0U7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7Ozs7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Ozs7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Ozs7O0lBRUQsb0JBQW9CLENBQUMsV0FBZ0I7UUFDbkMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7Ozs7O0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDeEM7SUFDSCxDQUFDOzs7OztJQUVELE1BQU0sQ0FBQyxZQUFZOztjQUNYLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztRQUN0RSxJQUFJLE9BQU8sU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztTQUMzQjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLOzs7O1lBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN2QixDQUFDOzs7OztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDckMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixvQkFBb0IsRUFBRSxDQUN2QixDQUFDLFNBQVM7Ozs7UUFBQyxZQUFZLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQUUsT0FBTztTQUFFOztjQUN4QixZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLENBQUM7O2NBQzFHLG1CQUFtQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsVUFBVTtRQUMxRSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFBRSxPQUFPO1NBQUU7O2NBQ2hELFlBQVksR0FBRyxZQUFZLENBQUMsU0FBUztRQUMzQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7Ozs7SUFDRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3pHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztZQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDOzs7O0lBRUQsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDOzs7WUF4V0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxlQUFlO2dCQUN6Qix1a0dBQTJDO2dCQUUzQyxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVOzs7d0JBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLEVBQUM7d0JBQ2xELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGOzthQUNGOzs7O1lBeEJDLFNBQVM7WUFYVCxpQkFBaUI7WUFvQlYsV0FBVzs7O3lCQWtCakIsS0FBSzt1QkFRTCxLQUFLOzBCQTJCTCxLQUFLO3VCQUNMLEtBQUs7eUJBQ0wsS0FBSzt1QkFDTCxLQUFLOzRCQUNMLEtBQUs7a0NBQ0wsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7d0JBQ0wsS0FBSzs2QkFDTCxLQUFLOzhCQUNMLEtBQUs7dUJBQ0wsS0FBSztrQ0FDTCxLQUFLO29CQUNMLEtBQUs7eUJBQ0wsS0FBSzt1QkFDTCxLQUFLOytCQUNMLEtBQUs7NEJBQ0wsS0FBSzttQ0FDTCxLQUFLO2dDQUNMLEtBQUs7eUJBQ0wsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7K0JBQ3hDLFNBQVMsU0FBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7bUJBQzlDLFNBQVMsU0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzBCQUNsQyxTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTsrQkFDMUMsU0FBUyxTQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtxQkFDL0MsU0FBUyxTQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7c0NBQ3BDLFlBQVksU0FBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzJCQUU5QyxNQUFNO3lCQWNOLEtBQUs7Ozs7SUExQ04sMENBQTBCOztJQUMxQix1Q0FBMEI7O0lBQzFCLHlDQUE0Qjs7SUFDNUIsdUNBQTBCOztJQUMxQiw0Q0FBOEI7O0lBQzlCLGtEQUEwQzs7SUFDMUMsMENBQWtDOztJQUNsQyx1Q0FBMEI7O0lBQzFCLHdDQUEwQjs7SUFDMUIsNkNBQThEOztJQUM5RCw4Q0FBZ0U7O0lBQ2hFLHVDQUFrRDs7SUFDbEQsa0RBQW9DOztJQUNwQyxvQ0FBOEI7O0lBQzlCLHlDQUE0Qjs7SUFDNUIsdUNBQTJCOztJQUMzQiwrQ0FBb0M7O0lBQ3BDLDRDQUE4Qjs7SUFDOUIsbURBQXNDOztJQUN0QyxnREFBNkM7O0lBQzdDLHlDQUFrRTs7SUFDbEUsK0NBQThFOztJQUM5RSxtQ0FBaUU7O0lBQ2pFLDBDQUF5RDs7SUFDekQsK0NBQW1FOztJQUNuRSxxQ0FBOEM7O0lBQzlDLHNEQUF5RTs7SUFFekUsMkNBQTRDOztJQUM1Qyw0Q0FBOEI7O0lBQzlCLHdDQUFpQzs7SUFDakMsb0NBQTJCOztJQUMzQixnREFBNkI7O0lBQzdCLDJDQUE0Qjs7SUFDNUIsNkNBQXdDOztJQUN4QywrQ0FBK0I7O0lBQy9CLHVDQUFpQjs7Ozs7SUFDakIsc0NBQXdCOzs7OztJQUN4QiwwQ0FBeUI7Ozs7O0lBQ3pCLDBDQUE2Qjs7Ozs7SUFDN0Isb0NBQW1COztJQUVuQix5Q0FDQzs7Ozs7SUFFRCx1Q0FBb0M7Ozs7O0lBQ3BDLHNDQUE2Qjs7Ozs7SUFwRDNCLHVDQUE2Qjs7Ozs7SUFDN0IsZ0RBQThDOzs7OztJQUM5QyxtQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVGVtcGxhdGVSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJQ2hlY2tib3hJbnB1dCwgSVRyZWVJdGVtLCBPcGVyYWJsZVRyZWVDb21wb25lbnQgfSBmcm9tICduZy1kZXZ1aS90cmVlJztcclxuaW1wb3J0IERlZmF1bHRJY29ucyBmcm9tICcuL3RyZWUtZGVmYXVsdC1pY29ucyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlLCBJMThuSW50ZXJmYWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLXRyZWUtc2VsZWN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJlZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW2AuL3RyZWUtc2VsZWN0LmNvbXBvbmVudC5zY3NzYF0sXHJcbiAgZXhwb3J0QXM6ICdzZWxlY3QnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVHJlZVNlbGVjdENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFRyZWVTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgc2V0IGFsbG93Q2xlYXIoYWxsb3dDbGVhcikge1xyXG4gICAgdGhpcy5fYWxsb3dDbGVhciA9IGFsbG93Q2xlYXI7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsb3dDbGVhcigpIHtcclxuICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLmFsbG93VW5zZWxlY3QgJiYgdGhpcy5fYWxsb3dDbGVhciAmJiAhIXRoaXMuc2VsZWN0ZWRWYWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCB0cmVlRGF0YSh0cmVlRGF0YSkge1xyXG4gICAgdGhpcy5fc291cmNlVHJlZSA9IHRyZWVEYXRhO1xyXG4gICAgdGhpcy5yZWZyZXNoVHJlZSh0cmVlRGF0YSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdHJlZURhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJlZURhdGE7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNPcGVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcclxuICB9XHJcblxyXG4gIHNldCBpc09wZW4odmFsdWUpIHtcclxuICAgIGlmICh0aGlzLl9pc09wZW4gIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2lzT3BlbiA9IHZhbHVlO1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGV4cGFuZFRyZWUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHRyZWVOb2RlSWRLZXkgPSAnaWQnO1xyXG4gIEBJbnB1dCgpIHRyZWVOb2RlQ2hpbGRyZW5LZXkgPSAnY2hpbGRyZW4nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkS2V5ID0gJ2Rpc2FibGVkJztcclxuICBASW5wdXQoKSBsZWFmT25seSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRlbGltaXRlciA9ICcsICc7XHJcbiAgQElucHV0KCkgaWNvblBhcmVudE9wZW46IHN0cmluZyA9IERlZmF1bHRJY29ucy5pY29uUGFyZW50T3BlbjtcclxuICBASW5wdXQoKSBpY29uUGFyZW50Q2xvc2U6IHN0cmluZyA9IERlZmF1bHRJY29ucy5pY29uUGFyZW50Q2xvc2U7XHJcbiAgQElucHV0KCkgaWNvbkxlYWY6IHN0cmluZyA9IERlZmF1bHRJY29ucy5pY29uTGVhZjtcclxuICBASW5wdXQoKSBjbG9zZU9uTm9kZVNlbGVjdGVkID0gdHJ1ZTtcclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBzZWFyY2hhYmxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYXBwZW5kVG8gPSAnYm9keSc7XHJcbiAgQElucHV0KCkgdHJlZU5vZGVUaXRsZUtleSA9ICd0aXRsZSc7XHJcbiAgQElucHV0KCkgYWxsb3dVbnNlbGVjdCA9IHRydWU7XHJcbiAgQElucHV0KCkgaWNvblRlbXBsYXRlUG9zaXRpb246IHN0cmluZztcclxuICBASW5wdXQoKSBpY29uVGVtcGxhdGVJbnB1dDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RIb3N0JywgeyBzdGF0aWM6IHRydWUgfSkgc2VsZWN0SG9zdDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdvcHRpb25zQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgb3B0aW9uc0NvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0cmVlJywgeyBzdGF0aWM6IHRydWUgfSkgdHJlZTogT3BlcmFibGVUcmVlQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHNlYXJjaElucHV0O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0TW9kZWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VhcmNoSW5wdXRNb2RlbDtcclxuICBAVmlld0NoaWxkKCdwb3BwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3BwZXI7XHJcbiAgQENvbnRlbnRDaGlsZCgnaWNvblRlbXBsYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pIGljb25UZW1wbGF0ZVBhc3NUaHJvdWdoO1xyXG5cclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIGNoZWNrYm94SW5wdXQ6IElDaGVja2JveElucHV0O1xyXG4gIF90cmVlRGF0YTogQXJyYXk8SVRyZWVJdGVtPiA9IFtdO1xyXG4gIHZhbHVlOiBvYmplY3QgfCBBcnJheTxhbnk+O1xyXG4gIGN1cnJlbnRBY3RpdmVOb2RlOiBJVHJlZUl0ZW07XHJcbiAgc2VhcmNoU3RyaW5nOiBzdHJpbmcgPSBudWxsO1xyXG4gIGkxOG5Db21tb25UZXh0OiBJMThuSW50ZXJmYWNlWydjb21tb24nXTtcclxuICBpMThuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgbm9SZWNvcmQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9zb3VyY2VUcmVlID0gW107XHJcbiAgcHJpdmF0ZSBfYWxsb3dDbGVhcjogYm9vbGVhbjtcclxuICBwcml2YXRlIHRpbWVyOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpIHJlYWR5RXZlbnQgPSAodHJlZVNlbGVjdDogVHJlZVNlbGVjdENvbXBvbmVudCkgPT4ge1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IG51bGw7XHJcbiAgcHJpdmF0ZSBvblRvdWNoID0gKCkgPT4gbnVsbDtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnJlYWR5RXZlbnQodGhpcyk7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hhYmxlKSB7XHJcbiAgICAgIHRoaXMucmVnaXN0ZXJTZWFyY2hMaXN0ZW5lcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pMThuU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldEkxOG5UZXh0KCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIH