ng-yunzai-mobile
Version:
1. 修改wechat.micro.ts
656 lines • 58.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: select-contacts/yz-select-contacts/yz-select-contacts.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Inject } from '@angular/core';
import { ModalService } from "ng-zorro-antd-mobile";
import { ComponentOption } from "./dept.interface";
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { YzSelectContactsService } from './yz-select-contacts.service';
export class YzSelectContactsComponent {
/**
* @param {?} dialogRef
* @param {?} _modal
* @param {?} yzContactsService
* @param {?} data
*/
constructor(dialogRef, _modal, yzContactsService, data) {
this.dialogRef = dialogRef;
this._modal = _modal;
this.yzContactsService = yzContactsService;
this.data = data;
this.modalRefCpt = [];
this.subscribed = [];
this.dtPullToRefreshStyle = { height: window.innerHeight - 44 - 51 + 'px' };
// 总部门数据
this.deptNodes = [];
// 页面展示的部门数据
this.deptList = [];
// 面包屑
this.deptBarList = [];
// 页面加载中
this.pageLoading = false;
// 人员列表参数
this.baseUserParams = {
total: 0,
pageSize: 20,
pageNum: 1,
deptId: null,
realName: null,
userTypes: null
};
// 人员数据
this.baseUserList = [];
// 是否全选人员
this.allUserCheck = false;
// 已选择的联系人
this.selectedContacts = [];
// 年级数据
this.gradeList = [];
this.gradeParams = [];
}
/**
* @return {?}
*/
ngOnInit() {
if (this.data.onlyStudent === true) {
this.baseUserParams.userTypes = '2,3';
this.dtPullToRefreshStyle = { height: window.innerHeight - 44 - 51 - 44 + 'px' };
this.initDeptOnlyStu();
this.queryGrade();
}
else {
this.baseUserParams.userTypes = this.data.userTypes;
this.dtPullToRefreshStyle = { height: window.innerHeight - 44 - 51 + 'px' };
this.initDept();
}
}
// 查询部门树
/**
* @return {?}
*/
initDept() {
this.deptList = [];
this.deptNodes = [];
this.pageLoading = true;
/** @type {?} */
const $temp = this.yzContactsService.getDeptTree(this.data.includeClass, this.data.includeHisClass).subscribe((/**
* @param {?} dept
* @return {?}
*/
(dept) => {
this.pageLoading = false;
this.deptNodes = dept;
this.deptList = JSON.parse(JSON.stringify(this.deptNodes));
this.queryDefaultContact();
this.blDeptTree(this.deptList);
this.blDeptTree(this.deptNodes);
this.subscribed.push($temp);
}), (/**
* @return {?}
*/
() => {
this.pageLoading = false;
}));
}
// 查询部门->只选学生
/**
* @return {?}
*/
initDeptOnlyStu() {
this.deptList = [];
this.deptNodes = [];
this.pageLoading = true;
/** @type {?} */
let gradeId = null;
if (this.gradeParams.length > 0) {
gradeId = this.gradeParams[0].value;
}
/** @type {?} */
const $temp = this.yzContactsService.getDeptTreeOnlyStu(gradeId, this.data.includeClass, this.data.includeHisClass).subscribe((/**
* @param {?} dept
* @return {?}
*/
(dept) => {
this.pageLoading = false;
this.deptNodes = dept;
this.deptList = JSON.parse(JSON.stringify(this.deptNodes));
this.queryDefaultContact();
this.blDeptTree(this.deptList);
this.blDeptTree(this.deptNodes);
this.subscribed.push($temp);
}), (/**
* @return {?}
*/
() => {
this.pageLoading = false;
}));
}
// 查询年级
/**
* @return {?}
*/
queryGrade() {
this.gradeList = [];
this.pageLoading = true;
/** @type {?} */
const $temp = this.yzContactsService.getGrade().subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.pageLoading = false;
this.gradeList = [];
data.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (item.enable !== 0 && item.enable !== null) {
this.gradeList.push({
value: item.openId,
label: item.name
});
}
}));
this.gradeList.unshift({
value: null,
label: '全部'
});
this.subscribed.push($temp);
}), (/**
* @return {?}
*/
() => {
this.pageLoading = false;
this.gradeList.unshift({
value: null,
label: '全部'
});
}));
}
// 遍历部门树,确定叶子节点
/**
* @param {?} tree
* @return {?}
*/
blDeptTree(tree) {
if (tree && tree.length && tree.length > 0) {
tree.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.expanded = true;
if (item.children === null || item.children.length === 0) {
item['isLeaf'] = true;
}
else {
item['isLeaf'] = false;
}
this.blDeptTree(item.children);
}));
}
}
// 查询默认已被选择人员的信息
/**
* @return {?}
*/
queryDefaultContact() {
if (this.data.defaultContacts && this.data.defaultContacts.length > 0) {
/** @type {?} */
const userIdsArray = [];
this.data.defaultContacts.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (item.userId) {
userIdsArray.push(item.userId);
}
}));
this.pageLoading = true;
/** @type {?} */
const $temp = this.yzContactsService.getUserByUserIds(userIdsArray).subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.pageLoading = false;
this.selectedContacts = data;
this.queryBaseUser();
this.subscribed.push($temp);
}), (/**
* @return {?}
*/
() => {
this.pageLoading = false;
}));
}
else {
this.queryBaseUser();
}
}
// 查询人员列表
/**
* @return {?}
*/
queryBaseUser() {
this.pageLoading = true;
/** @type {?} */
const $temp = this.yzContactsService.getBaseUser(this.baseUserParams.pageNum, this.baseUserParams.pageSize, this.baseUserParams.realName, this.baseUserParams.deptId, this.baseUserParams.userTypes).subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.pageLoading = false;
this.baseUserParams.total = data.total;
this.baseUserList.push(...data.list);
this.baseUserList.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
item['checked'] = false;
item['disabled'] = false;
if (!item.dept) {
item.dept = { deptName: '暂无部门' };
}
if (!item.realName) {
item.realName = '暂无姓名';
}
if (!item.userCode) {
item.realName = '暂无学/工号';
}
if (!item.roles) {
item.roles = [];
item.rolesData = '暂无角色';
}
else {
/** @type {?} */
const roleArray = [];
item.roles.forEach((/**
* @param {?} value
* @return {?}
*/
(value) => {
roleArray.push(value.roleName);
}));
item.rolesData = roleArray.toString();
}
this.selectedContacts.forEach((/**
* @param {?} value
* @return {?}
*/
(value) => {
if (value.userId === item.userId) {
item['checked'] = true;
}
}));
}));
this.isMaxCount();
this.subscribed.push($temp);
}), (/**
* @return {?}
*/
() => {
this.pageLoading = false;
}));
}
// 刷新回调函数
/**
* @return {?}
*/
pullToRefresh() {
if (this.baseUserList.length < this.baseUserParams.total) {
this.baseUserParams.pageNum++;
this.queryBaseUser();
}
}
// 根据用户姓名即时搜索人员
/**
* @return {?}
*/
queryUserByRealName() {
this.baseUserParams.pageNum = 1;
this.baseUserList = [];
this.queryBaseUser();
}
// 取消——根据用户姓名即时搜索人员
/**
* @return {?}
*/
cancelQueUserByRealName() {
this.baseUserParams.realName = null;
this.baseUserParams.pageNum = 1;
this.baseUserList = [];
this.queryBaseUser();
}
// 查询全部人员
/**
* @return {?}
*/
viewAllList() {
this.deptList = JSON.parse(JSON.stringify(this.deptNodes));
this.deptBarList = [];
this.baseUserParams.deptId = '';
this.baseUserParams.pageNum = 1;
this.baseUserList = [];
this.queryBaseUser();
}
// 顶部面包屑查看部门详细
/**
* @param {?} item
* @param {?} index
* @return {?}
*/
deptBarviewList(item, index) {
if (index != this.deptBarList.length - 1) {
this.deptList = item.children;
this.deptBarList.length = index + 1;
this.baseUserParams.deptId = item.key;
this.baseUserParams.pageNum = 1;
this.baseUserList = [];
this.queryBaseUser();
}
}
// 查看子部门 -> 查询当前部门人员
/**
* @param {?} item
* @return {?}
*/
viewDeptChildrenList(item) {
if (item.isLeaf) { // 是叶子节点,无子部门
this.deptList = [];
}
else {
this.deptList = item.children;
}
this.deptBarList.push(item);
this.baseUserParams.deptId = item.key;
this.baseUserParams.pageNum = 1;
this.baseUserList = [];
this.queryBaseUser();
}
// 人员选择变化的回调
/**
* @param {?} $event
* @return {?}
*/
userCheckedChange($event) {
if ($event.checked) { // 选中
this.allUserCheck = this.baseUserList.every((/**
* @param {?} item
* @return {?}
*/
(item) => {
return item.checked === true;
}));
}
else { // 取消
// 取消
/** @type {?} */
let itemIndex = 0;
this.selectedContacts.forEach((/**
* @param {?} value
* @param {?} index
* @return {?}
*/
(value, index) => {
if (value.userId === $event.value) {
itemIndex = index;
}
}));
this.deleteContact($event.value, itemIndex);
}
this.addBaseUser();
}
// 将人员列表中选中项添加至已选择的人员列表中
/**
* @return {?}
*/
addBaseUser() {
this.baseUserList.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
/** @type {?} */
const hasThisMen = this.selectedContacts.some((/**
* @param {?} value
* @return {?}
*/
(value) => {
return value.userId === item.userId;
}));
if (item.checked && !hasThisMen) {
this.selectedContacts.push(item);
}
}));
this.isMaxCount();
}
// 人数选择达到最大值
/**
* @return {?}
*/
isMaxCount() {
if (this.data.count > 0 && this.selectedContacts.length >= this.data.count) {
this.selectedContacts.length = this.data.count;
this.baseUserList.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
/** @type {?} */
const hasThisUser = this.selectedContacts.some((/**
* @param {?} value
* @return {?}
*/
(value) => {
return item.userId === value.userId;
}));
if (!hasThisUser) {
item.checked = false;
item.disabled = true;
}
}));
}
else {
this.baseUserList.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.disabled = false;
}));
}
if (this.baseUserList.length == 0) {
this.allUserCheck = false;
}
else {
this.allUserCheck = this.baseUserList.every((/**
* @param {?} item
* @return {?}
*/
(item) => {
return item.checked === true;
}));
}
}
// 删除联系人
/**
* @param {?} id
* @param {?} index
* @return {?}
*/
deleteContact(id, index) {
this.selectedContacts.splice(index, 1);
this.baseUserList.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
if (item.userId === id) {
item.checked = false;
}
}));
if (this.baseUserList.length == 0) {
this.allUserCheck = false;
}
else {
this.allUserCheck = this.baseUserList.every((/**
* @param {?} item
* @return {?}
*/
(item) => {
return item.checked === true;
}));
}
}
// 全选
/**
* @return {?}
*/
allSelect() {
this.allUserCheck = true;
this.baseUserList.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
item.checked = true;
}));
this.addBaseUser();
}
// 取消全选
/**
* @return {?}
*/
cancelAllSelect() {
this.allUserCheck = false;
this.baseUserList.forEach((/**
* @param {?} item
* @return {?}
*/
(item) => {
/** @type {?} */
let itemIndex = 0;
this.selectedContacts.forEach((/**
* @param {?} value
* @param {?} index
* @return {?}
*/
(value, index) => {
if (value.userId === item.userId) {
itemIndex = index;
}
}));
this.deleteContact(item.userId, itemIndex);
}));
}
// 切换年级
/**
* @param {?} $event
* @return {?}
*/
onChangeGrade($event) {
if ($event && $event.length && $event.length > 0) {
this.gradeParams = $event;
}
else {
this.gradeParams = [{
value: null,
label: '全部'
}];
}
this.deptBarList = [];
this.baseUserParams.deptId = '';
this.baseUserParams.pageNum = 1;
this.baseUserList = [];
this.initDeptOnlyStu();
}
// 点“完成”按钮,完成人员选择
/**
* @return {?}
*/
confirmSelect() {
this.dialogRef.close(this.selectedContacts);
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subscribed.forEach((/**
* @param {?} sub
* @return {?}
*/
(sub) => {
sub.unsubscribe();
}));
this.modalRefCpt.forEach((/**
* @param {?} ref
* @return {?}
*/
(ref) => {
ref.destroy();
}));
}
}
YzSelectContactsComponent.decorators = [
{ type: Component, args: [{
selector: 'yz-select-contacts',
template: "<yz-loading-mask *ngIf=\"pageLoading\"></yz-loading-mask>\r\n<div class=\"yz-select-contacts\">\r\n <div class=\"yz-select-contacts-search\">\r\n <SearchBar [placeholder]=\"'\u8BF7\u8F93\u5165\u59D3\u540D\u2026\u2026'\"\r\n [(ngModel)]=\"baseUserParams.realName\"\r\n (onSubmit)=\"queryUserByRealName()\"\r\n (onCancel)=\"cancelQueUserByRealName()\"\r\n (onClear)=\"cancelQueUserByRealName()\"></SearchBar>\r\n </div>\r\n <div class=\"yz-select-contacts-grade\" *ngIf=\"data.onlyStudent\">\r\n <List [className]=\"'yz-select-contact-list'\">\r\n <ListItem\r\n Picker\r\n [extra]=\"gradeParams.length>0?gradeParams[0].label:'\u8BF7\u9009\u62E9\u5E74\u7EA7\u2026\u2026'\"\r\n [arrow]=\"'horizontal'\"\r\n [data]=\"gradeList\"\r\n [(ngModel)]=\"gradeParams\"\r\n (ngModelChange)=\"onChangeGrade($event)\">\r\n \u5E74\u7EA7\uFF1A\r\n </ListItem>\r\n </List>\r\n </div>\r\n\r\n\r\n <PullToRefresh [ngStyle]=\"dtPullToRefreshStyle\"\r\n [direction]=\"'up'\"\r\n (onRefresh)=\"pullToRefresh()\"\r\n >\r\n <div class=\"yz-select-contact-dept-bar\">\r\n <a (click)=\"viewAllList()\">\u5168\u90E8</a>\r\n <ng-container *ngFor=\"let item of deptBarList;let i=index;\">\r\n <a (click)=\"deptBarviewList(item, i)\">>{{item?.title}}</a>\r\n </ng-container>\r\n </div>\r\n\r\n <!--\u90E8\u95E8-->\r\n <List [className]=\"'yz-select-contact-list'\" *ngIf=\"deptList.length>0\">\r\n <ListItem multipleLine [arrow]=\"'horizontal'\"\r\n [thumb]=\"'./assets/imgs/icon_dept.png'\"\r\n *ngFor=\"let item of deptList\"\r\n (onClick)=\"viewDeptChildrenList(item)\">\r\n {{item?.title || '--'}}\r\n </ListItem>\r\n </List>\r\n\r\n <!--\u4EBA\u5458-->\r\n <List [className]=\"'contact-list'\" *ngIf=\"baseUserList.length>0\">\r\n <CheckboxItem\r\n *ngFor=\"let item of baseUserList\"\r\n [name]=\"item.realName\"\r\n [value]=\"item.userId\"\r\n [(ngModel)]=\"item.checked\"\r\n [disabled]=\"item.disabled\"\r\n (onChange)=\"userCheckedChange($event)\"\r\n >\r\n {{ item.realName }}<small *ngIf=\"item?.userCode\">({{item.userCode}})</small>\r\n </CheckboxItem>\r\n </List>\r\n </PullToRefresh>\r\n\r\n\r\n <div class=\"yz-select-contacts-btn\">\r\n <div class=\"count-box\">\u5DF2\u9009\u62E9\uFF1A{{selectedContacts.length}} \u4EBA</div>\r\n <div Button [type]=\"'primary'\" [size]=\"'small'\" [inline]=\"true\" (onClick)=\"confirmSelect()\">\u5B8C\u6210</div>\r\n <div Button [type]=\"'ghost'\" [size]=\"'small'\" [inline]=\"true\" *ngIf=\"!allUserCheck\" (onClick)=\"allSelect()\">\u5168\u9009</div>\r\n <div Button [type]=\"'ghost'\" [size]=\"'small'\" [inline]=\"true\" *ngIf=\"allUserCheck\" (onClick)=\"cancelAllSelect()\">\r\n \u53D6\u6D88\u5168\u9009\r\n </div>\r\n </div>\r\n\r\n</div>\r\n",
styles: ["::ng-deep .yz-select-contact-list .am-list-item .am-list-line .am-list-content{font-size:15px}::ng-deep .yz-select-contact-list .am-list-item img{width:34px;height:34px}.yz-select-contact-dept-bar{background:#efeff4;padding:9px 8px}.yz-select-contact-dept-bar a{display:inline-block;color:#1e90ff;margin-bottom:3px;letter-spacing:2px}.yz-select-contact-dept-bar a:last-child{color:#444}::ng-deep .yz-select-contacts-search{width:100%;background:#fff}::ng-deep .yz-select-contacts-search .am-search{background:#fff}::ng-deep .yz-select-contacts-search .am-search-input{background-color:#efeff4}::ng-deep .yz-select-contacts-btn{background:#fff;border-top:1px solid #d9d9d9;position:fixed;bottom:0;left:0;width:100%;padding:10px 0;z-index:5}::ng-deep .yz-select-contacts-btn .am-button-small{display:block;float:right;margin-right:10px}::ng-deep .yz-select-contacts-btn .count-box{display:block;float:left;line-height:30px;margin-left:10px;max-width:calc(100% - 150px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .yz-select-contacts-panel{position:fixed!important;top:0;left:0;z-index:10;width:100%;height:100%;background:#fff;max-width:unset!important}::ng-deep .yz-select-contacts-panel .mat-dialog-container{padding:0;border-radius:0;transform:none!important}"]
}] }
];
/** @nocollapse */
YzSelectContactsComponent.ctorParameters = () => [
{ type: MatDialogRef },
{ type: ModalService },
{ type: YzSelectContactsService },
{ type: ComponentOption, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }
];
if (false) {
/** @type {?} */
YzSelectContactsComponent.prototype.modalRefCpt;
/** @type {?} */
YzSelectContactsComponent.prototype.subscribed;
/** @type {?} */
YzSelectContactsComponent.prototype.dtPullToRefreshStyle;
/** @type {?} */
YzSelectContactsComponent.prototype.deptNodes;
/** @type {?} */
YzSelectContactsComponent.prototype.deptList;
/** @type {?} */
YzSelectContactsComponent.prototype.deptBarList;
/** @type {?} */
YzSelectContactsComponent.prototype.pageLoading;
/** @type {?} */
YzSelectContactsComponent.prototype.baseUserParams;
/** @type {?} */
YzSelectContactsComponent.prototype.baseUserList;
/** @type {?} */
YzSelectContactsComponent.prototype.allUserCheck;
/** @type {?} */
YzSelectContactsComponent.prototype.selectedContacts;
/** @type {?} */
YzSelectContactsComponent.prototype.gradeList;
/** @type {?} */
YzSelectContactsComponent.prototype.gradeParams;
/** @type {?} */
YzSelectContactsComponent.prototype.dialogRef;
/**
* @type {?}
* @private
*/
YzSelectContactsComponent.prototype._modal;
/**
* @type {?}
* @private
*/
YzSelectContactsComponent.prototype.yzContactsService;
/** @type {?} */
YzSelectContactsComponent.prototype.data;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXotc2VsZWN0LWNvbnRhY3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXl1bnphaS1tb2JpbGUvIiwic291cmNlcyI6WyJzZWxlY3QtY29udGFjdHMveXotc2VsZWN0LWNvbnRhY3RzL3l6LXNlbGVjdC1jb250YWN0cy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFXLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTVELE9BQU8sRUFBb0IsZUFBZSxFQUFnQixNQUFNLGtCQUFrQixDQUFDO0FBQ25GLE9BQU8sRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFPckUsTUFBTSxPQUFPLHlCQUF5Qjs7Ozs7OztJQXlDcEMsWUFDUyxTQUFrRCxFQUNqRCxNQUFvQixFQUNwQixpQkFBMEMsRUFDbEIsSUFBcUI7UUFIOUMsY0FBUyxHQUFULFNBQVMsQ0FBeUM7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQXlCO1FBQ2xCLFNBQUksR0FBSixJQUFJLENBQWlCO1FBM0N2RCxnQkFBVyxHQUFvQixFQUFFLENBQUM7UUFDbEMsZUFBVSxHQUF3QixFQUFFLENBQUM7UUFDckMseUJBQW9CLEdBQUcsRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBQyxDQUFDOztRQUdyRSxjQUFTLEdBQXlCLEVBQUUsQ0FBQzs7UUFHckMsYUFBUSxHQUF5QixFQUFFLENBQUM7O1FBR3BDLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQzs7UUFHdkMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7O1FBRzdCLG1C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RGVzdHJveSwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtNb2RhbFJlZiwgTW9kYWxTZXJ2aWNlfSBmcm9tIFwibmctem9ycm8tYW50ZC1tb2JpbGVcIjtcclxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7QmFzZVVzZXJJbnRlcmZhY2UsIENvbXBvbmVudE9wdGlvbiwgRGVwdEludGVyZmFjZX0gZnJvbSBcIi4vZGVwdC5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHtZelNlbGVjdENvbnRhY3RzU2VydmljZX0gZnJvbSAnLi95ei1zZWxlY3QtY29udGFjdHMuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3l6LXNlbGVjdC1jb250YWN0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3l6LXNlbGVjdC1jb250YWN0cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4veXotc2VsZWN0LWNvbnRhY3RzLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFl6U2VsZWN0Q29udGFjdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIG1vZGFsUmVmQ3B0OiBBcnJheTxNb2RhbFJlZj4gPSBbXTtcclxuICBzdWJzY3JpYmVkOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XHJcbiAgZHRQdWxsVG9SZWZyZXNoU3R5bGUgPSB7aGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSA0NCAtIDUxICsgJ3B4J307XHJcblxyXG4gIC8vIOaAu+mDqOmXqOaVsOaNrlxyXG4gIGRlcHROb2RlczogQXJyYXk8RGVwdEludGVyZmFjZT4gPSBbXTtcclxuXHJcbiAgLy8g6aG16Z2i5bGV56S655qE6YOo6Zeo5pWw5o2uXHJcbiAgZGVwdExpc3Q6IEFycmF5PERlcHRJbnRlcmZhY2U+ID0gW107XHJcblxyXG4gIC8vIOmdouWMheWxkVxyXG4gIGRlcHRCYXJMaXN0OiBBcnJheTxEZXB0SW50ZXJmYWNlPiA9IFtdO1xyXG5cclxuICAvLyDpobXpnaLliqDovb3kuK1cclxuICBwYWdlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDkurrlkZjliJfooajlj4LmlbBcclxuICBiYXNlVXNlclBhcmFtcyA9IHtcclxuICAgIHRvdGFsOiAwLFxyXG4gICAgcGFnZVNpemU6IDIwLFxyXG4gICAgcGFnZU51bTogMSxcclxuICAgIGRlcHRJZDogbnVsbCxcclxuICAgIHJlYWxOYW1lOiBudWxsLFxyXG4gICAgdXNlclR5cGVzOiBudWxsXHJcbiAgfTtcclxuXHJcbiAgLy8g5Lq65ZGY5pWw5o2uXHJcbiAgYmFzZVVzZXJMaXN0OiBBcnJheTxCYXNlVXNlckludGVyZmFjZT4gPSBbXTtcclxuXHJcbiAgLy8g5piv5ZCm5YWo6YCJ5Lq65ZGYXHJcbiAgYWxsVXNlckNoZWNrOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOW3sumAieaLqeeahOiBlOezu+S6ulxyXG4gIHNlbGVjdGVkQ29udGFjdHM6IEFycmF5PEJhc2VVc2VySW50ZXJmYWNlPiA9IFtdO1xyXG5cclxuICAvLyDlubTnuqfmlbDmja5cclxuICBncmFkZUxpc3Q6IEFycmF5PHsgdmFsdWU6IHN0cmluZywgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xyXG4gIGdyYWRlUGFyYW1zOiBBcnJheTx7IHZhbHVlOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8WXpTZWxlY3RDb250YWN0c0NvbXBvbmVudD4sXHJcbiAgICBwcml2YXRlIF9tb2RhbDogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB5ekNvbnRhY3RzU2VydmljZTogWXpTZWxlY3RDb250YWN0c1NlcnZpY2UsXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IENvbXBvbmVudE9wdGlvblxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLm9ubHlTdHVkZW50ID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuYmFzZVVzZXJQYXJhbXMudXNlclR5cGVzID0gJzIsMyc7XHJcbiAgICAgIHRoaXMuZHRQdWxsVG9SZWZyZXNoU3R5bGUgPSB7aGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSA0NCAtIDUxIC0gNDQgKyAncHgnfTtcclxuICAgICAgdGhpcy5pbml0RGVwdE9ubHlTdHUoKTtcclxuICAgICAgdGhpcy5xdWVyeUdyYWRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnVzZXJUeXBlcyA9IHRoaXMuZGF0YS51c2VyVHlwZXM7XHJcbiAgICAgIHRoaXMuZHRQdWxsVG9SZWZyZXNoU3R5bGUgPSB7aGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSA0NCAtIDUxICsgJ3B4J307XHJcbiAgICAgIHRoaXMuaW5pdERlcHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOafpeivoumDqOmXqOagkVxyXG4gIGluaXREZXB0KCkge1xyXG4gICAgdGhpcy5kZXB0TGlzdCA9IFtdO1xyXG4gICAgdGhpcy5kZXB0Tm9kZXMgPSBbXTtcclxuICAgIHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgJHRlbXAgPSB0aGlzLnl6Q29udGFjdHNTZXJ2aWNlLmdldERlcHRUcmVlKHRoaXMuZGF0YS5pbmNsdWRlQ2xhc3MsIHRoaXMuZGF0YS5pbmNsdWRlSGlzQ2xhc3MpLnN1YnNjcmliZSgoZGVwdDogQXJyYXk8RGVwdEludGVyZmFjZT4pID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRlcHROb2RlcyA9IGRlcHQ7XHJcbiAgICAgIHRoaXMuZGVwdExpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGVwdE5vZGVzKSk7XHJcblxyXG4gICAgICB0aGlzLnF1ZXJ5RGVmYXVsdENvbnRhY3QoKTtcclxuXHJcbiAgICAgIHRoaXMuYmxEZXB0VHJlZSh0aGlzLmRlcHRMaXN0KTtcclxuICAgICAgdGhpcy5ibERlcHRUcmVlKHRoaXMuZGVwdE5vZGVzKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVkLnB1c2goJHRlbXApO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOafpeivoumDqOmXqC0+5Y+q6YCJ5a2m55SfXHJcbiAgaW5pdERlcHRPbmx5U3R1KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXB0TGlzdCA9IFtdO1xyXG4gICAgdGhpcy5kZXB0Tm9kZXMgPSBbXTtcclxuICAgIHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IGdyYWRlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZ3JhZGVQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBncmFkZUlkID0gdGhpcy5ncmFkZVBhcmFtc1swXS52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAkdGVtcCA9IHRoaXMueXpDb250YWN0c1NlcnZpY2UuZ2V0RGVwdFRyZWVPbmx5U3R1KGdyYWRlSWQsIHRoaXMuZGF0YS5pbmNsdWRlQ2xhc3MsIHRoaXMuZGF0YS5pbmNsdWRlSGlzQ2xhc3MpLnN1YnNjcmliZSgoZGVwdDogQXJyYXk8RGVwdEludGVyZmFjZT4pID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgdGhpcy5kZXB0Tm9kZXMgPSBkZXB0O1xyXG4gICAgICB0aGlzLmRlcHRMaXN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRlcHROb2RlcykpO1xyXG4gICAgICB0aGlzLnF1ZXJ5RGVmYXVsdENvbnRhY3QoKTtcclxuXHJcbiAgICAgIHRoaXMuYmxEZXB0VHJlZSh0aGlzLmRlcHRMaXN0KTtcclxuICAgICAgdGhpcy5ibERlcHRUcmVlKHRoaXMuZGVwdE5vZGVzKTtcclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlZC5wdXNoKCR0ZW1wKTtcclxuICAgIH0sICgpID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDmn6Xor6LlubTnuqdcclxuICBxdWVyeUdyYWRlKCkge1xyXG4gICAgdGhpcy5ncmFkZUxpc3QgPSBbXTtcclxuICAgIHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgJHRlbXAgPSB0aGlzLnl6Q29udGFjdHNTZXJ2aWNlLmdldEdyYWRlKCkuc3Vic2NyaWJlKChkYXRhOiBBcnJheTxhbnk+KSA9PiB7XHJcbiAgICAgIHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5ncmFkZUxpc3QgPSBbXTtcclxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgaWYoaXRlbS5lbmFibGUgIT09IDAgJiYgaXRlbS5lbmFibGUgIT09IG51bGwpe1xyXG4gICAgICAgICAgdGhpcy5ncmFkZUxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLm9wZW5JZCxcclxuICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubmFtZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5ncmFkZUxpc3QudW5zaGlmdCh7XHJcbiAgICAgICAgdmFsdWU6IG51bGwsXHJcbiAgICAgICAgbGFiZWw6ICflhajpg6gnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpYmVkLnB1c2goJHRlbXApO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ3JhZGVMaXN0LnVuc2hpZnQoe1xyXG4gICAgICAgIHZhbHVlOiBudWxsLFxyXG4gICAgICAgIGxhYmVsOiAn5YWo6YOoJ1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIOmBjeWOhumDqOmXqOagke+8jOehruWumuWPtuWtkOiKgueCuVxyXG4gIGJsRGVwdFRyZWUodHJlZSkge1xyXG4gICAgaWYgKHRyZWUgJiYgdHJlZS5sZW5ndGggJiYgdHJlZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRyZWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGl0ZW0uZXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuID09PSBudWxsIHx8IGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBpdGVtWydpc0xlYWYnXSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGl0ZW1bJ2lzTGVhZiddID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJsRGVwdFRyZWUoaXRlbS5jaGlsZHJlbik7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDmn6Xor6Lpu5jorqTlt7LooqvpgInmi6nkurrlkZjnmoTkv6Hmga9cclxuICBxdWVyeURlZmF1bHRDb250YWN0KCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5kZWZhdWx0Q29udGFjdHMgJiYgdGhpcy5kYXRhLmRlZmF1bHRDb250YWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHVzZXJJZHNBcnJheTogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICB0aGlzLmRhdGEuZGVmYXVsdENvbnRhY3RzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBpZiAoaXRlbS51c2VySWQpIHtcclxuICAgICAgICAgIHVzZXJJZHNBcnJheS5wdXNoKGl0ZW0udXNlcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgY29uc3QgJHRlbXAgPSB0aGlzLnl6Q29udGFjdHNTZXJ2aWNlLmdldFVzZXJCeVVzZXJJZHModXNlcklkc0FycmF5KS5zdWJzY3JpYmUoKGRhdGE6IEFycmF5PEJhc2VVc2VySW50ZXJmYWNlPikgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29udGFjdHMgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMucXVlcnlCYXNlVXNlcigpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZC5wdXNoKCR0ZW1wKTtcclxuICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnF1ZXJ5QmFzZVVzZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOafpeivouS6uuWRmOWIl+ihqFxyXG4gIHF1ZXJ5QmFzZVVzZXIoKSB7XHJcbiAgICB0aGlzLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0ICR0ZW1wID0gdGhpcy55ekNvbnRhY3RzU2VydmljZS5nZXRCYXNlVXNlcihcclxuICAgICAgdGhpcy5iYXNlVXNlclBhcmFtcy5wYWdlTnVtLFxyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnBhZ2VTaXplLFxyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnJlYWxOYW1lLFxyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLmRlcHRJZCxcclxuICAgICAgdGhpcy5iYXNlVXNlclBhcmFtcy51c2VyVHlwZXNcclxuICAgICkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnRvdGFsID0gZGF0YS50b3RhbDtcclxuICAgICAgdGhpcy5iYXNlVXNlckxpc3QucHVzaCguLi5kYXRhLmxpc3QpO1xyXG4gICAgICB0aGlzLmJhc2VVc2VyTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgaXRlbVsnY2hlY2tlZCddID0gZmFsc2U7XHJcbiAgICAgICAgaXRlbVsnZGlzYWJsZWQnXSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghaXRlbS5kZXB0KSB7XHJcbiAgICAgICAgICBpdGVtLmRlcHQgPSB7ZGVwdE5hbWU6ICfmmoLml6Dpg6jpl6gnfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWl0ZW0ucmVhbE5hbWUpIHtcclxuICAgICAgICAgIGl0ZW0ucmVhbE5hbWUgPSAn5pqC5peg5aeT5ZCNJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpdGVtLnVzZXJDb2RlKSB7XHJcbiAgICAgICAgICBpdGVtLnJlYWxOYW1lID0gJ+aaguaXoOWtpi/lt6Xlj7cnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXRlbS5yb2xlcykge1xyXG4gICAgICAgICAgaXRlbS5yb2xlcyA9IFtdO1xyXG4gICAgICAgICAgaXRlbS5yb2xlc0RhdGEgPSAn5pqC5peg6KeS6ImyJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgcm9sZUFycmF5ID0gW107XHJcbiAgICAgICAgICBpdGVtLnJvbGVzLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHJvbGVBcnJheS5wdXNoKHZhbHVlLnJvbGVOYW1lKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaXRlbS5yb2xlc0RhdGEgPSByb2xlQXJyYXkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbnRhY3RzLm