UNPKG

ngx-tencent-im

Version:
93 lines 25.5 kB
import { Component, Input } from '@angular/core'; import { MESSAGE_STATUS } from '../../shared.data'; import { showAction } from '../../store/actions'; import { updateCurrentMemberListAction } from '../../store/actions/group.action'; import { currentMemberListSelector } from '../../store/selectors/group.selector'; import * as i0 from "@angular/core"; import * as i1 from "@ngrx/store"; import * as i2 from "../../tim-helper.service"; import * as i3 from "../group-member-info/group-member-info.component"; import * as i4 from "../../avatar/avatar.component"; import * as i5 from "ng-zorro-antd/core/transition-patch"; import * as i6 from "ng-zorro-antd/icon"; import * as i7 from "ng-zorro-antd/popover"; import * as i8 from "@angular/common"; import * as i9 from "ng-zorro-antd/input"; import * as i10 from "@angular/forms"; export class GroupMemberListComponent { constructor(store, timHelperService) { this.store = store; this.timHelperService = timHelperService; this.currentMemberList = []; this.currentMemberID = ''; this.count = 30; } get members() { return this.currentMemberList.slice(0, this.count); } get showLoadMore() { return this.members.length < this.currentConversation.groupProfile.memberNum; } ngOnInit() { // 获取当group前成员 this.subscription = this.store.select(currentMemberListSelector).subscribe(res => { this.currentMemberList = res; }); } addGroupMember() { const groupID = this.currentConversation.conversationID.replace('GROUP', ''); this.timHelperService.tim .addGroupMember({ groupID, userIDList: [this.userID] }) .then((imResponse) => { const { successUserIDList, failureUserIDList, existedUserIDList } = imResponse.data; if (successUserIDList.length > 0) { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.success, message: `群成员:${successUserIDList.join(',')},加群成功` })); this.timHelperService.tim.getGroupMemberProfile({ groupID, userIDList: successUserIDList }) .then(({ data: { memberList } }) => { this.store.dispatch(updateCurrentMemberListAction({ currentMemberList: memberList })); this.popoverVisible = false; }); } if (failureUserIDList.length > 0) { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.error, message: `群成员:${failureUserIDList.join(',')},添加失败!` })); } if (existedUserIDList.length > 0) { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.warning, message: `群成员:${existedUserIDList.join(',')},已在群中` })); } }) .catch(error => { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.error, message: error.message })); }); } getGroupMemberAvatarText(role) { switch (role) { case 'Owner': return '群主'; case 'Admin': return '管理员'; default: return '群成员'; } } loadMore() { this.timHelperService.getGroupMemberList(this.currentConversation.groupProfile.groupID); this.count += 30; } ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } } } GroupMemberListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: GroupMemberListComponent, deps: [{ token: i1.Store }, { token: i2.TimHelperService }], target: i0.ɵɵFactoryTarget.Component }); GroupMemberListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: GroupMemberListComponent, selector: "app-group-member-list", inputs: { currentConversation: "currentConversation" }, ngImport: i0, template: "<div class=\"group-member-list-wrapper\">\r\n <div class=\"header\">\r\n <span\r\n class=\"member-count text-ellipsis\">\u7FA4\u6210\u5458\uFF1A{{this.currentConversation?.groupProfile.memberCount}}</span>\r\n <i nz-icon nzType=\"user-add\" nzTheme=\"outline\"\r\n [ngStyle]=\"{'font-size': '1.5em','cursor':'pointer'}\" nz-popover\r\n [nzPopoverContent]=\"addGroupTemplate\" nzPopoverPlacement=\"topRight\" nzPopoverTrigger=\"click\"\r\n [nzPopoverVisible]=\"popoverVisible\"></i>\r\n\r\n <ng-template #addGroupTemplate>\r\n <input nz-input [(ngModel)]=\"userID\" placeholder=\"\u56DE\u8F66\u786E\u8BA4\" (keydown.enter)=\"addGroupMember()\">\r\n </ng-template>\r\n\r\n </div>\r\n <div class=\"scroll-content\">\r\n <div class=\"group-member-list\">\r\n <div *ngFor=\"let member of members;\" nz-popover [nzPopoverContent]=\"contentTemplate\"\r\n nzPopoverPlacement=\"topRight\" nzPopoverTrigger=\"click\" [nzPopoverVisible]=\"popoverVisible\">\r\n <ng-template #contentTemplate>\r\n <app-group-member-info [member]=\"member\" [currentConversation]=\"currentConversation\"\r\n (enterEnd)=\"popoverVisible=false\">\r\n </app-group-member-info>\r\n </ng-template>\r\n\r\n <div class=\"group-member\" (click)=\"currentMemberID = member.userID\">\r\n <im-avatar [title]=\"getGroupMemberAvatarText(member.role)\" [src]=\"member.avatar\">\r\n </im-avatar>\r\n <div class=\"member-name text-ellipsis\">\r\n <span *ngIf=\"member.nameCard\" [title]=\"member.nameCard\">{{ member.nameCard }}</span>\r\n <span *ngIf=\"member.nick\" [title]=\"member.nick\">{{ member.nick }}</span>\r\n <span *ngIf=\"!member.nameCard&&!member.nick\"\r\n [title]=\"member.userID\">{{ member.userID }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"more\">\r\n <a *ngIf=\"showLoadMore\" (click)=\"loadMore()\">\u67E5\u770B\u66F4\u591A</a>\r\n </div>\r\n</div>\r\n", styles: [".group-member-list-wrapper .header{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;align-items:center;height:50px;padding:10px 16px 10px 20px;border-bottom:1px solid #e7e7e7}.group-member-list-wrapper .header .member-count{display:inline-block;max-width:130px;line-height:30px;font-size:14px;vertical-align:bottom}.group-member-list-wrapper .header .btn-add-member{width:30px;height:30px;font-size:28px;text-align:center;line-height:32px;cursor:pointer;float:right}.group-member-list-wrapper .header .btn-add-member:hover{color:#5cadff}.group-member-list-wrapper .scroll-content{max-height:250px;overflow-y:scroll;padding:10px 15px;width:100%}.group-member-list-wrapper .scroll-content .group-member-list{display:flex;justify-content:flex-start;flex-wrap:wrap;width:100%}.group-member-list-wrapper .scroll-content .group-member{width:60px;height:60px;display:flex;justify-content:center;align-content:center;flex-direction:column;align-items:center;text-align:center;color:#000;cursor:pointer}.group-member-list-wrapper .scroll-content .group-member im-avatar::ng-deep .avatar{width:40px;height:40px;border-radius:50%}.group-member-list-wrapper .scroll-content .group-member .member-name{font-size:12px;width:40px;text-align:center}.group-member-list-wrapper .more{padding:0 20px;border-bottom:1px solid #e7e7e7}\n"], components: [{ type: i3.GroupMemberInfoComponent, selector: "app-group-member-info", inputs: ["member", "currentConversation"], outputs: ["enterEnd"] }, { type: i4.AvatarComponent, selector: "im-avatar", inputs: ["shape", "size", "type", "title", "src"] }], directives: [{ type: i5.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i6.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i7.NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle", "nzPopoverBackdrop"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i9.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: GroupMemberListComponent, decorators: [{ type: Component, args: [{ selector: 'app-group-member-list', template: "<div class=\"group-member-list-wrapper\">\r\n <div class=\"header\">\r\n <span\r\n class=\"member-count text-ellipsis\">\u7FA4\u6210\u5458\uFF1A{{this.currentConversation?.groupProfile.memberCount}}</span>\r\n <i nz-icon nzType=\"user-add\" nzTheme=\"outline\"\r\n [ngStyle]=\"{'font-size': '1.5em','cursor':'pointer'}\" nz-popover\r\n [nzPopoverContent]=\"addGroupTemplate\" nzPopoverPlacement=\"topRight\" nzPopoverTrigger=\"click\"\r\n [nzPopoverVisible]=\"popoverVisible\"></i>\r\n\r\n <ng-template #addGroupTemplate>\r\n <input nz-input [(ngModel)]=\"userID\" placeholder=\"\u56DE\u8F66\u786E\u8BA4\" (keydown.enter)=\"addGroupMember()\">\r\n </ng-template>\r\n\r\n </div>\r\n <div class=\"scroll-content\">\r\n <div class=\"group-member-list\">\r\n <div *ngFor=\"let member of members;\" nz-popover [nzPopoverContent]=\"contentTemplate\"\r\n nzPopoverPlacement=\"topRight\" nzPopoverTrigger=\"click\" [nzPopoverVisible]=\"popoverVisible\">\r\n <ng-template #contentTemplate>\r\n <app-group-member-info [member]=\"member\" [currentConversation]=\"currentConversation\"\r\n (enterEnd)=\"popoverVisible=false\">\r\n </app-group-member-info>\r\n </ng-template>\r\n\r\n <div class=\"group-member\" (click)=\"currentMemberID = member.userID\">\r\n <im-avatar [title]=\"getGroupMemberAvatarText(member.role)\" [src]=\"member.avatar\">\r\n </im-avatar>\r\n <div class=\"member-name text-ellipsis\">\r\n <span *ngIf=\"member.nameCard\" [title]=\"member.nameCard\">{{ member.nameCard }}</span>\r\n <span *ngIf=\"member.nick\" [title]=\"member.nick\">{{ member.nick }}</span>\r\n <span *ngIf=\"!member.nameCard&&!member.nick\"\r\n [title]=\"member.userID\">{{ member.userID }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"more\">\r\n <a *ngIf=\"showLoadMore\" (click)=\"loadMore()\">\u67E5\u770B\u66F4\u591A</a>\r\n </div>\r\n</div>\r\n", styles: [".group-member-list-wrapper .header{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;align-items:center;height:50px;padding:10px 16px 10px 20px;border-bottom:1px solid #e7e7e7}.group-member-list-wrapper .header .member-count{display:inline-block;max-width:130px;line-height:30px;font-size:14px;vertical-align:bottom}.group-member-list-wrapper .header .btn-add-member{width:30px;height:30px;font-size:28px;text-align:center;line-height:32px;cursor:pointer;float:right}.group-member-list-wrapper .header .btn-add-member:hover{color:#5cadff}.group-member-list-wrapper .scroll-content{max-height:250px;overflow-y:scroll;padding:10px 15px;width:100%}.group-member-list-wrapper .scroll-content .group-member-list{display:flex;justify-content:flex-start;flex-wrap:wrap;width:100%}.group-member-list-wrapper .scroll-content .group-member{width:60px;height:60px;display:flex;justify-content:center;align-content:center;flex-direction:column;align-items:center;text-align:center;color:#000;cursor:pointer}.group-member-list-wrapper .scroll-content .group-member im-avatar::ng-deep .avatar{width:40px;height:40px;border-radius:50%}.group-member-list-wrapper .scroll-content .group-member .member-name{font-size:12px;width:40px;text-align:center}.group-member-list-wrapper .more{padding:0 20px;border-bottom:1px solid #e7e7e7}\n"] }] }], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.TimHelperService }]; }, propDecorators: { currentConversation: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtbWVtYmVyLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlbmNlbnQtaW0vc3JjL2dyb3VwL2dyb3VwLW1lbWJlci1saXN0L2dyb3VwLW1lbWJlci1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZW5jZW50LWltL3NyYy9ncm91cC9ncm91cC1tZW1iZXItbGlzdC9ncm91cC1tZW1iZXItbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFJcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVqRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7Ozs7Ozs7O0FBUWpGLE1BQU0sT0FBTyx3QkFBd0I7SUFXbkMsWUFDVSxLQUFZLEVBQ1osZ0JBQWtDO1FBRGxDLFVBQUssR0FBTCxLQUFLLENBQU87UUFDWixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBVjVDLHNCQUFpQixHQUF1QixFQUFFLENBQUM7UUFDM0Msb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsVUFBSyxHQUFHLEVBQUUsQ0FBQztJQVNQLENBQUM7SUFFTCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FB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QUNmO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBR0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7cUhBOUZVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLHFIQ2hCckMsMmhFQXlDQTsyRkR6QmEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHVCQUF1QjsySEFLeEIsbUJBQW1CO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb252ZXJzYXRpb24sIEdyb3VwLCBHcm91cE1lbWJlciB9IGZyb20gJ3RpbS1qcy1zZGsnO1xyXG5pbXBvcnQgeyBNRVNTQUdFX1NUQVRVUyB9IGZyb20gJy4uLy4uL3NoYXJlZC5kYXRhJztcclxuaW1wb3J0IHsgc2hvd0FjdGlvbiB9IGZyb20gJy4uLy4uL3N0b3JlL2FjdGlvbnMnO1xyXG5pbXBvcnQgeyB1cGRhdGVDdXJyZW50TWVtYmVyTGlzdEFjdGlvbiB9IGZyb20gJy4uLy4uL3N0b3JlL2FjdGlvbnMvZ3JvdXAuYWN0aW9uJztcclxuaW1wb3J0IHsgY3VycmVudENvbnZlcnNhdGlvblNlbGVjdG9yIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2VsZWN0b3JzJztcclxuaW1wb3J0IHsgY3VycmVudE1lbWJlckxpc3RTZWxlY3RvciB9IGZyb20gJy4uLy4uL3N0b3JlL3NlbGVjdG9ycy9ncm91cC5zZWxlY3Rvcic7XHJcbmltcG9ydCB7IFRpbUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi90aW0taGVscGVyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZ3JvdXAtbWVtYmVyLWxpc3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ncm91cC1tZW1iZXItbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3JvdXAtbWVtYmVyLWxpc3QuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JvdXBNZW1iZXJMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRDb252ZXJzYXRpb246IENvbnZlcnNhdGlvbjtcclxuXHJcbiAgY3VycmVudE1lbWJlckxpc3Q6IEFycmF5PEdyb3VwTWVtYmVyPiA9IFtdO1xyXG4gIGN1cnJlbnRNZW1iZXJJRCA9ICcnO1xyXG4gIGNvdW50ID0gMzA7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcG9wb3ZlclZpc2libGU6IGJvb2xlYW47XHJcbiAgdXNlcklEOiBzdHJpbmc7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlLFxyXG4gICAgcHJpdmF0ZSB0aW1IZWxwZXJTZXJ2aWNlOiBUaW1IZWxwZXJTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIGdldCBtZW1iZXJzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudE1lbWJlckxpc3Quc2xpY2UoMCwgdGhpcy5jb3VudCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd0xvYWRNb3JlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWVtYmVycy5sZW5ndGggPCB0aGlzLmN1cnJlbnRDb252ZXJzYXRpb24uZ3JvdXBQcm9maWxlLm1lbWJlck51bTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8g6I635Y+W5b2TZ3JvdXDliY3miJDlkZhcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5zdG9yZS5zZWxlY3QoY3VycmVudE1lbWJlckxpc3RTZWxlY3Rvcikuc3Vic2NyaWJlKHJlcyA9PiB7XHJcblxyXG4gICAgICB0aGlzLmN1cnJlbnRNZW1iZXJMaXN0ID0gcmVzO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRHcm91cE1lbWJlcigpIHtcclxuICAgIGNvbnN0IGdyb3VwSUQgPSB0aGlzLmN1cnJlbnRDb252ZXJzYXRpb24uY29udmVyc2F0aW9uSUQucmVwbGFjZSgnR1JPVVAnLCAnJyk7XHJcbiAgICB0aGlzLnRpbUhlbHBlclNlcnZpY2UudGltXHJcbiAgICAgIC5hZGRHcm91cE1lbWJlcih7XHJcbiAgICAgICAgZ3JvdXBJRCxcclxuICAgICAgICB1c2VySURMaXN0OiBbdGhpcy51c2VySURdXHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKChpbVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgc3VjY2Vzc1VzZXJJRExpc3QsXHJcbiAgICAgICAgICBmYWlsdXJlVXNlcklETGlzdCxcclxuICAgICAgICAgIGV4aXN0ZWRVc2VySURMaXN0XHJcbiAgICAgICAgfSA9IGltUmVzcG9uc2UuZGF0YTtcclxuICAgICAgICBpZiAoc3VjY2Vzc1VzZXJJRExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcclxuICAgICAgICAgICAgc2hvd0FjdGlvbih7IG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLnN1Y2Nlc3MsIG1lc3NhZ2U6IGDnvqTmiJDlkZjvvJoke3N1Y2Nlc3NVc2VySURMaXN0LmpvaW4oJywnKX3vvIzliqDnvqTmiJDlip9gIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50aW1IZWxwZXJTZXJ2aWNlLnRpbS5nZXRHcm91cE1lbWJlclByb2ZpbGUoeyBncm91cElELCB1c2VySURMaXN0OiBzdWNjZXNzVXNlcklETGlzdCB9KVxyXG4gICAgICAgICAgICAudGhlbigoeyBkYXRhOiB7IG1lbWJlckxpc3QgfSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh1cGRhdGVDdXJyZW50TWVtYmVyTGlzdEFjdGlvbih7IGN1cnJlbnRNZW1iZXJMaXN0OiBtZW1iZXJMaXN0IH0pKTtcclxuICAgICAgICAgICAgICB0aGlzLnBvcG92ZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmFpbHVyZVVzZXJJRExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcclxuICAgICAgICAgICAgc2hvd0FjdGlvbih7IG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLmVycm9yLCBtZXNzYWdlOiBg576k5oiQ5ZGY77yaJHtmYWlsdXJlVXNlcklETGlzdC5qb2luKCcsJyl977yM5re75Yqg5aSx6LSl77yBYCB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV4aXN0ZWRVc2VySURMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXHJcbiAgICAgICAgICAgIHNob3dBY3Rpb24oeyBtc2dUeXBlOiBNRVNTQUdFX1NUQVRVUy53YXJuaW5nLCBtZXNzYWdlOiBg576k5oiQ5ZGY77yaJHtleGlzdGVkVXNlcklETGlzdC5qb2luKCcsJyl977yM5bey5Zyo576k5LitYCB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcclxuICAgICAgICAgIHNob3dBY3Rpb24oeyBtc2dUeXBlOiBNRVNTQUdFX1NUQVRVUy5lcnJvciwgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBNZW1iZXJBdmF0YXJUZXh0KHJvbGU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoIChyb2xlKSB7XHJcbiAgICAgIGNhc2UgJ093bmVyJzpcclxuICAgICAgICByZXR1cm4gJ+e+pOS4uyc7XHJcbiAgICAgIGNhc2UgJ0FkbWluJzpcclxuICAgICAgICByZXR1cm4gJ+euoeeQhuWRmCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICfnvqTmiJDlkZgnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZE1vcmUoKSB7XHJcbiAgICB0aGlzLnRpbUhlbHBlclNlcnZpY2UuZ2V0R3JvdXBNZW1iZXJMaXN0KHRoaXMuY3VycmVudENvbnZlcnNhdGlvbi5ncm91cFByb2ZpbGUuZ3JvdXBJRCk7XHJcbiAgICB0aGlzLmNvdW50ICs9IDMwO1xyXG4gIH1cclxuXHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJncm91cC1tZW1iZXItbGlzdC13cmFwcGVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgPHNwYW5cclxuICAgICAgY2xhc3M9XCJtZW1iZXItY291bnQgdGV4dC1lbGxpcHNpc1wiPue+pOaIkOWRmO+8mnt7dGhpcy5jdXJyZW50Q29udmVyc2F0aW9uPy5ncm91cFByb2ZpbGUubWVtYmVyQ291bnR9fTwvc3Bhbj5cclxuICAgIDxpIG56LWljb24gbnpUeXBlPVwidXNlci1hZGRcIiBuelRoZW1lPVwib3V0bGluZVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cInsnZm9udC1zaXplJzogJzEuNWVtJywnY3Vyc29yJzoncG9pbnRlcid9XCIgbnotcG9wb3ZlclxyXG4gICAgICBbbnpQb3BvdmVyQ29udGVudF09XCJhZGRHcm91cFRlbXBsYXRlXCIgbnpQb3BvdmVyUGxhY2VtZW50PVwidG9wUmlnaHRcIiBuelBvcG92ZXJUcmlnZ2VyPVwiY2xpY2tcIlxyXG4gICAgICBbbnpQb3BvdmVyVmlzaWJsZV09XCJwb3BvdmVyVmlzaWJsZVwiPjwvaT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2FkZEdyb3VwVGVtcGxhdGU+XHJcbiAgICAgIDxpbnB1dCBuei1pbnB1dCBbKG5nTW9kZWwpXT1cInVzZXJJRFwiIHBsYWNlaG9sZGVyPVwi5Zue6L2m56Gu6K6kXCIgKGtleWRvd24uZW50ZXIpPVwiYWRkR3JvdXBNZW1iZXIoKVwiPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInNjcm9sbC1jb250ZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtbWVtYmVyLWxpc3RcIj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWVtYmVyIG9mIG1lbWJlcnM7XCIgbnotcG9wb3ZlciBbbnpQb3BvdmVyQ29udGVudF09XCJjb250ZW50VGVtcGxhdGVcIlxyXG4gICAgICAgIG56UG9wb3ZlclBsYWNlbWVudD1cInRvcFJpZ2h0XCIgbnpQb3BvdmVyVHJpZ2dlcj1cImNsaWNrXCIgW256UG9wb3ZlclZpc2libGVdPVwicG9wb3ZlclZpc2libGVcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnRUZW1wbGF0ZT5cclxuICAgICAgICAgIDxhcHAtZ3JvdXAtbWVtYmVyLWluZm8gW21lbWJlcl09XCJtZW1iZXJcIiBbY3VycmVudENvbnZlcnNhdGlvbl09XCJjdXJyZW50Q29udmVyc2F0aW9uXCJcclxuICAgICAgICAgICAgKGVudGVyRW5kKT1cInBvcG92ZXJWaXNpYmxlPWZhbHNlXCI+XHJcbiAgICAgICAgICA8L2FwcC1ncm91cC1tZW1iZXItaW5mbz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtbWVtYmVyXCIgKGNsaWNrKT1cImN1cnJlbnRNZW1iZXJJRCA9IG1lbWJlci51c2VySURcIj5cclxuICAgICAgICAgIDxpbS1hdmF0YXIgW3RpdGxlXT1cImdldEdyb3VwTWVtYmVyQXZhdGFyVGV4dChtZW1iZXIucm9sZSlcIiBbc3JjXT1cIm1lbWJlci5hdmF0YXJcIj5cclxuICAgICAgICAgIDwvaW0tYXZhdGFyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbWJlci1uYW1lIHRleHQtZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtZW1iZXIubmFtZUNhcmRcIiBbdGl0bGVdPVwibWVtYmVyLm5hbWVDYXJkXCI+e3sgbWVtYmVyLm5hbWVDYXJkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm1lbWJlci5uaWNrXCIgW3RpdGxlXT1cIm1lbWJlci5uaWNrXCI+e3sgbWVtYmVyLm5pY2sgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIW1lbWJlci5uYW1lQ2FyZCYmIW1lbWJlci5uaWNrXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwibWVtYmVyLnVzZXJJRFwiPnt7IG1lbWJlci51c2VySUQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibW9yZVwiPlxyXG4gICAgPGEgKm5nSWY9XCJzaG93TG9hZE1vcmVcIiAoY2xpY2spPVwibG9hZE1vcmUoKVwiPuafpeeci+abtOWkmjwvYT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==