dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
249 lines • 26.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding, ViewChild } from '@angular/core';
import { CurrentService } from 'dbweb-core';
import { of } from 'rxjs';
import { debounceTime, startWith } from 'rxjs/operators';
import { BillComponent } from '../bill/bill.component';
import { UserBack, RoleType } from './back';
import pinyin from 'pinyin';
/**
* @record
*/
function ModelUserRole() { }
if (false) {
/** @type {?} */
ModelUserRole.prototype.UserName;
/** @type {?} */
ModelUserRole.prototype.RoleName;
}
var UserComponent = /** @class */ (function () {
function UserComponent(back, curr) {
this.back = back;
this.curr = curr;
this.hostClass = true;
this.roles = {};
this.roleTypeAlways = RoleType.always;
this.beforeSave = this.beforeSave.bind(this);
}
/**
* @return {?}
*/
UserComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.back.fetchRoles().subscribe((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.validRoles = v;
_this.roleLists = _this.validRoles.map((/**
* @param {?} num
* @return {?}
*/
function (num) { return num.Name; }));
_this.roleLitters = map2WithLetter(_this.roleLists);
}));
};
/**
* @param {?} selft
* @return {?}
*/
UserComponent.prototype.beforeSave = /**
* @param {?} selft
* @return {?}
*/
function (selft) {
var _this = this;
return of((/** @type {?} */ ({
record: {
Password: selft.typeRecord.Password ? btoa(selft.typeRecord.Password) : null,
Roles: Object.keys(this.roles)
.filter((/**
* @param {?} v
* @return {?}
*/
function (v) { return _this.roles[v]; }))
.map((/**
* @param {?} v
* @return {?}
*/
function (v) { return ({
UserName: selft.typeRecord.Name,
RoleName: v
}); }))
}
})));
};
/**
* @return {?}
*/
UserComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.bill.init.subscribe((/**
* @return {?}
*/
function () {
_this.bill.formGroup.get('Password').patchValue(null);
((/** @type {?} */ ((_this.bill.typeRecord.Roles || [])))).forEach((/**
* @param {?} v
* @return {?}
*/
function (v) {
_this.roles[v.RoleName] = true;
}));
_this.bill.formGroup
.get('Dept')
.valueChanges.pipe(startWith(_this.curr.data.Dept.Code), debounceTime(500))
.subscribe((/**
* @param {?} val
* @return {?}
*/
function (val) {
_this.filterDeptList = _this.back.fetchFilterDept(val);
console.log('内:', _this.filterDeptList);
}));
}));
this.bill.onBeforeSave = this.beforeSave;
};
/**
* @param {?} event
* @param {?} roleName
* @return {?}
*/
UserComponent.prototype.roleChange = /**
* @param {?} event
* @param {?} roleName
* @return {?}
*/
function (event, roleName) {
if (event.checked) {
this.roles[roleName] = true;
}
else {
delete this.roles[roleName];
}
};
/**
* @param {?} letter
* @return {?}
*/
UserComponent.prototype.acronymFun = /**
* @param {?} letter
* @return {?}
*/
function (letter) {
document.querySelector('#' + letter).scrollIntoView(true);
};
/**
* @return {?}
*/
UserComponent.prototype.try = /**
* @return {?}
*/
function () {
console.log(this.filterDeptList);
};
UserComponent.decorators = [
{ type: Component, args: [{
selector: 'common-user',
template: "<common-bill #bill>\r\n\r\n\t<div [formGroup]=\"bill.formGroup\" *ngIf=\"bill.formGroup\" class=\"main mat-elevation-z2 dis-row-sb\">\r\n\t\t<section class=\"section-1\">\r\n\t\t\t<header class=\"title\">\u4FEE\u6539\u7528\u6237</header>\r\n\t\t\t<section class=\"s1-content\">\r\n\t\t\t\t<div class=\"box-1\">\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u540D\u79F0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"Name\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u6635\u79F0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"NickName\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u5BC6\u7801</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput type=\"password\"\r\n\t\t\t\t\t\t\t\tformControlName=\"Password\" commonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u6240\u5C5E\u90E8\u95E8</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"Dept\"\r\n\t\t\t\t\t\t\t\tcommonBillField [matAutocomplete]=\"autoDept\">\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t<mat-autocomplete #autoDept=\"matAutocomplete\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let dept of filterDeptList|async\" [value]=\"dept.Code\">{{dept.Code}} - {{dept.Name}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-autocomplete>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"box-2\">\r\n\t\t\t\t\t<div class=\"wrapper freeze-time\">\r\n\t\t\t\t\t\t<div class=\"title\">\u51BB\u7ED3\u65E5\u671F</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput type=\"datetime-local\" \r\n\t\t\t\t\t\t\t\tformControlName=\"FreezeTime\" commonBillField\r\n\t\t\t\t\t\t\t\tstep=\"1\">\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u51BB\u7ED3\u539F\u56E0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"FreezeDesc\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u9644\u52A0\u4FE1\u606F</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<textarea matInput matTextareaAutosize matAutosizeMinRows=2 matAutosizeMaxRows=5 formControlName=\"Tag\"\r\n\t\t\t\t\t\t\t\tcommonBillField></textarea>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</section>\r\n\t\t</section>\r\n\t\t<section class=\"section-2\">\r\n\t\t\t\r\n\t\t\t<section class=\"s2-content\">\r\n\t\t\t\t<header class=\"title\">\u89D2\u8272</header>\r\n\t\t\t\t<div class=\"s2-box-1\">\r\n\t\t\t\t\t<div class=\"wrapper-box\" *ngFor=\"let letter of roleLitters\">\r\n\t\t\t\t\t\t<div class=\"s2-title\" id=\"{{ letter.Letter }}\">{{letter.Letter | uppercase}}</div>\r\n\t\t\t\t\t\t<div class=\"s2-wrapper\" *ngFor=\"let list of letter.Columns\">\r\n\t\t\t\t\t\t\t<mat-checkbox [checked]=\"roles[list]\" (change)=\"roleChange($event,list)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<span>{{list}}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n\t\t\t\t</div>\r\n\t\t\t\r\n\t\t\t</section>\r\n\t\t\t<section class=\"s2-content-2\">\r\n\t\t\t\t<div class=\"s2-title\" *ngFor=\"let letter of roleLitters\">\r\n\t\t\t\t\t<span (click)=\"acronymFun(letter.Letter)\">{{letter.Letter | uppercase}}</span>\r\n\t\t\t\t</div>\r\n\t\t\t</section>\r\n\t\t</section>\r\n\t</div>\r\n<button (click)=\"try()\">111</button>\r\n</common-bill>\r\n\r\n\r\n<!-- 0: {Name: \"Name\", DBName: \"NAME\", Type: \"STR\", MaxLength: 50, Hidden: true, \u2026}\r\n1: {Name: \"NickName\", DBName: \"NICKNAME\", Type: \"STR\", MaxLength: 50, Null: true, \u2026}\r\n2: {Name: \"Salt\", DBName: \"SALT\", Type: \"BYTEA\", Value: \"pMA8mf37dmKZ8QKiZ/1FiA==\"}\r\n3: {Name: \"Password\", DBName: \"PASSWORD\", Type: \"BYTEA\", Value: \"ul0c07xKTaeYr2IX/jd6VI8iRnkWlCukaMF0Q4JyEic=\"}\r\n4: {Name: \"Dept\", DBName: \"DEPT\", Type: \"STR\", MaxLength: 50, Value: \"r\"}\r\n5: {Name: \"Tag\", DBName: \"TAG\", Type: \"STR\", MaxLength: 300, Null: true, \u2026}\r\n6: {Name: \"FreezeTime\", DBName: \"FREEZETIME\", Type: \"DATE\", Null: true, Value: \"\"}\r\n7: {Name: \"FreezeDesc\", DBName: \"FREEZEDESC\", Type: \"STR\", MaxLength: 300, Null: true, \u2026}\r\n8: {Name: \"HeadPortrait\", DBName: \"HEADPORTRAIT\", Type: \"BYTEA\", Null: true, Value: \"\"}\r\n9: {Name: \"HeadPortraitType\", DBName: \"HEADPORTRAITTYPE\", Type: \"STR\", MaxLength: 15, Null: true, \u2026}\r\n10: {Name: \"HeadPortraitTime\", DBName: \"HEADPORTRAITTIME\", Type: \"DATE\", Null: true, Value: \"\"}\r\n11: {Name: \"IndexSetting\", DBName: \"INDEXSETTING\", Type: \"BY -->\r\n\r\n\r\n\r\n<!-- \r\n<common-bill #bill>\r\n\t<div [formGroup]=\"bill.formGroup\" *ngIf=\"bill.formGroup\" class=\"main\">\r\n\t\t<span>\u540D\u79F0</span>\r\n\t\t<mat-form-field>\r\n\t\t\t<input matInput formControlName=\"Name\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u6635\u79F0</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"NickName\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u5BC6\u7801</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput type=\"password\" formControlName=\"Password\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u6240\u5C5E\u90E8\u95E8</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"Dept\" commonBillField [matAutocomplete]=\"autoDept\">\r\n\t\t</mat-form-field>\r\n\t\t<mat-autocomplete #autoDept=\"matAutocomplete\">\r\n\t\t\t<mat-option *ngFor=\"let dept of filterDeptList|async\" [value]=\"dept.Code\">{{dept.Code}} - {{dept.Name}}\r\n\t\t\t</mat-option>\r\n\t\t</mat-autocomplete>\r\n\t\t<span>\u51BB\u7ED3\u5230\u671F</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input type=\"datetime-local\" matInput formControlName=\"FreezeTime\" commonBillField step=\"1\">\r\n\t\t</mat-form-field>\r\n\t\t<span>\u51BB\u7ED3\u539F\u56E0</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"FreezeDesc\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u9644\u52A0\u4FE1\u606F</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"Tag\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\t<ng-container *ngFor=\"let role of validRoles\">\r\n\t\t<mat-checkbox *ngIf=\"role.Type==='roleTypeAlways';else normalRole\" [checked]=\"roles[role.Name]\"\r\n\t\t\t(click)=\"$event.preventDefault()\" (change)=\"roleChange($event,role.Name)\">\r\n\t\t\t{{role.Name}}\r\n\t\t</mat-checkbox>\r\n\t\t<ng-template #normalRole>\r\n\t\t\t<mat-checkbox [checked]=\"roles[role.Name]\" (change)=\"roleChange($event,role.Name)\">\r\n\t\t\t\t{{role.Name}}\r\n\t\t\t</mat-checkbox>\r\n\t\t</ng-template>\r\n\t</ng-container>\r\n\r\n</common-bill> -->",
providers: [UserBack],
styles: ["@charset \"UTF-8\";.dis-row-c{display:flex;justify-content:center}.dis-row-sb{display:flex;justify-content:space-between}.main{width:100%;max-width:960px;min-width:300px;height:calc(100% - 48px - 40px);box-sizing:border-box;margin:48px auto;border-radius:4px}.main .mat-form-field ::ng-deep .mat-form-field-wrapper{margin:0;padding-bottom:0}.main .mat-form-field ::ng-deep .mat-form-field-infix{border:0;padding:14px 0 11px}.section-1{width:65%;max-width:664px;min-width:100px;box-sizing:border-box;margin-top:24px;margin-left:24px}.section-1 .title{font-size:20px}.s1-content{display:flex;width:100%;max-width:664px;min-width:300px;height:100%;box-sizing:border-box}.s1-content .title{padding-top:24px;padding-bottom:8px}.box-1{width:35%;max-width:216px;min-width:100px;box-sizing:border-box;padding-right:32px;height:calc(100% - 48px - 24px)}.box-1 .wrapper{width:100%;max-width:100%}.box-1 .wrapper .title{font-size:12px}.box-1 .wrapper .mat-form-field{width:100%;font-size:14px}.box-2{width:65%;max-width:304px;min-width:100px;box-sizing:border-box;margin-left:32px;height:368px}.box-2 .wrapper{width:100%;max-width:100%}.box-2 .wrapper .title{font-size:12px}.box-2 .wrapper .mat-form-field{width:100%;font-size:14px}.section-2{position:relative;width:30%;max-width:296px;min-width:100px;box-sizing:border-box}.s2-content{padding-left:24px}.s2-content header{padding-top:24px;margin-bottom:8px;font-size:14px}.s2-title{font-size:12px}.s2-box-1{height:100%;max-height:calc(100vh - 96px - 192px);box-sizing:border-box;overflow:auto}.s2-box-1 .wrapper-box{margin-bottom:8px}.s2-box-1 .s2-wrapper{font-size:14px;height:40px;line-height:40px}.s2-box-1 .s2-wrapper span{margin-left:16px}.s2-content-2{position:absolute;top:0;right:0;margin-top:74px;margin-right:12px}"]
}] }
];
/** @nocollapse */
UserComponent.ctorParameters = function () { return [
{ type: UserBack },
{ type: CurrentService }
]; };
UserComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.c-user',] }],
bill: [{ type: ViewChild, args: ['bill', { static: true },] }]
};
return UserComponent;
}());
export { UserComponent };
if (false) {
/** @type {?} */
UserComponent.prototype.hostClass;
/** @type {?} */
UserComponent.prototype.bill;
/** @type {?} */
UserComponent.prototype.filterDeptList;
/** @type {?} */
UserComponent.prototype.validRoles;
/** @type {?} */
UserComponent.prototype.roles;
/** @type {?} */
UserComponent.prototype.roleLists;
/** @type {?} */
UserComponent.prototype.roleLitters;
/** @type {?} */
UserComponent.prototype.roleTypeAlways;
/**
* @type {?}
* @private
*/
UserComponent.prototype.back;
/**
* @type {?}
* @private
*/
UserComponent.prototype.curr;
}
/**
* @param {?} v
* @return {?}
*/
function map2WithLetter(v) {
/** @type {?} */
var mapList = new Map();
v.forEach((/**
* @param {?} vv
* @return {?}
*/
function (vv) {
/** @type {?} */
var headerLetter = pinyin(vv, { style: pinyin.STYLE_FIRST_LETTER }).map((/**
* @param {?} s
* @return {?}
*/
function (s) { return s[0]; }))[0];
if (headerLetter.length > 1) {
headerLetter = headerLetter[0];
}
if (mapList.has(headerLetter)) {
mapList.get(headerLetter).push(vv);
}
else {
mapList.set(headerLetter, [vv]);
}
}));
// 排序
/** @type {?} */
var rev = (/** @type {?} */ ([]));
mapList.forEach((/**
* @param {?} columns
* @param {?} letter
* @return {?}
*/
function (columns, letter) {
rev.push((/** @type {?} */ ({ Letter: letter, Columns: columns })));
}));
return rev.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a.Letter.localeCompare(b.Letter); }));
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlci91c2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsV0FBVyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RixPQUFPLEVBQVMsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQVksUUFBUSxFQUFxQixNQUFNLFFBQVEsQ0FBQztBQUN6RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFFNUIsNEJBR0M7OztJQUZBLGlDQUFpQjs7SUFDakIsaUNBQWlCOztBQUVsQjtJQWlCQyx1QkFBb0IsSUFBYyxFQUFVLElBQW9CO1FBQTVDLFNBQUksR0FBSixJQUFJLENBQVU7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFnQjtRQVZuQyxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBSzlDLFVBQUssR0FBK0IsRUFBRSxDQUFDO1FBSTlCLG1CQUFjLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUV6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7Ozs7SUFFRCxnQ0FBUTs7O0lBQVI7UUFBQSxpQkFNQztRQUxBLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUzs7OztRQUFDLFVBQUEsQ0FBQztZQUNqQyxLQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZ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LFlBQVksQ0FBQyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25DO2FBQU07WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEM7SUFDRixDQUFDLEVBQUMsQ0FBQzs7O1FBR0csR0FBRyxHQUFHLG1CQUFBLEVBQUUsRUFBdUI7SUFDckMsT0FBTyxDQUFDLE9BQU87Ozs7O0lBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtRQUMvQixHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFBLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQXFCLENBQUMsQ0FBQztJQUNyRSxDQUFDLEVBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDLElBQUk7Ozs7O0lBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFoQyxDQUFnQyxFQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94Q2hhbmdlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBJRGVwdCwgQ3VycmVudFNlcnZpY2UgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEJlZm9yZVNhdmVQYXJhbSwgQmlsbENvbXBvbmVudCB9IGZyb20gJy4uL2JpbGwvYmlsbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVc2VyQmFjaywgVXNlclJvbGUsIFJvbGVUeXBlLCBDb2x1bW5zV2l0aExldHRlciB9IGZyb20gJy4vYmFjayc7XHJcbmltcG9ydCBwaW55aW4gZnJvbSAncGlueWluJztcclxuXHJcbmludGVyZmFjZSBNb2RlbFVzZXJSb2xlIHtcclxuXHRVc2VyTmFtZTogc3RyaW5nO1xyXG5cdFJvbGVOYW1lOiBzdHJpbmc7XHJcbn1cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdjb21tb24tdXNlcicsXHJcblx0dGVtcGxhdGVVcmw6ICcuL3VzZXIuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL3VzZXIuY29tcG9uZW50LnNjc3MnXSxcclxuXHRwcm92aWRlcnM6IFtVc2VyQmFja11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG5cdEBIb3N0QmluZGluZygnY2xhc3MuYy11c2VyJykgaG9zdENsYXNzID0gdHJ1ZTtcclxuXHRAVmlld0NoaWxkKCdiaWxsJywgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRiaWxsOiBCaWxsQ29tcG9uZW50O1xyXG5cdGZpbHRlckRlcHRMaXN0OiBPYnNlcnZhYmxlPElEZXB0W10+O1xyXG5cdHZhbGlkUm9sZXM6IFVzZXJSb2xlW107XHJcblx0cm9sZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcblx0cm9sZUxpc3RzOiBzdHJpbmdbXTtcclxuXHRyb2xlTGl0dGVyczogQ29sdW1uc1dpdGhMZXR0ZXJbXTtcclxuXHJcblx0cmVhZG9ubHkgcm9sZVR5cGVBbHdheXMgPSBSb2xlVHlwZS5hbHdheXM7XHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBiYWNrOiBVc2VyQmFjaywgcHJpdmF0ZSBjdXJyOiBDdXJyZW50U2VydmljZSkge1xyXG5cdFx0dGhpcy5iZWZvcmVTYXZlID0gdGhpcy5iZWZvcmVTYXZlLmJpbmQodGhpcyk7XHJcblx0fVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHRcdHRoaXMuYmFjay5mZXRjaFJvbGVzKCkuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHR0aGlzLnZhbGlkUm9sZXMgPSB2O1xyXG5cdFx0XHR0aGlzLnJvbGVMaXN0cyA9IHRoaXMudmFsaWRSb2xlcy5tYXAobnVtID0+IG51bS5OYW1lKTtcclxuXHRcdFx0dGhpcy5yb2xlTGl0dGVycyA9IG1hcDJXaXRoTGV0dGVyKHRoaXMucm9sZUxpc3RzKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YmVmb3JlU2F2ZShzZWxmdDogQmlsbENvbXBvbmVudCk6IE9ic2VydmFibGU8QmVmb3JlU2F2ZVBhcmFtPiB7XHJcblx0XHRyZXR1cm4gb2Yoe1xyXG5cdFx0XHRyZWNvcmQ6IHtcclxuXHRcdFx0XHRQYXNzd29yZDogc2VsZnQudHlwZVJlY29yZC5QYXNzd29yZCA/IGJ0b2Eoc2VsZnQudHlwZVJlY29yZC5QYXNzd29yZCkgOiBudWxsLFxyXG5cdFx0XHRcdFJvbGVzOiBPYmplY3Qua2V5cyh0aGlzLnJvbGVzKVxyXG5cdFx0XHRcdFx0LmZpbHRlcih2ID0+IHRoaXMucm9sZXNbdl0pXHJcblx0XHRcdFx0XHQubWFwKHYgPT4gKHtcclxuXHRcdFx0XHRcdFx0VXNlck5hbWU6IHNlbGZ0LnR5cGVSZWNvcmQuTmFtZSxcclxuXHRcdFx0XHRcdFx0Um9sZU5hbWU6IHZcclxuXHRcdFx0XHRcdH0pKVxyXG5cdFx0XHR9XHJcblx0XHR9IGFzIEJlZm9yZVNhdmVQYXJhbSk7XHJcblx0fVxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuXHRcdHRoaXMuYmlsbC5pbml0LnN1YnNjcmliZSgoKSA9PiB7XHJcblx0XHRcdHRoaXMuYmlsbC5mb3JtR3JvdXAuZ2V0KCdQYXNzd29yZCcpLnBhdGNoVmFsdWUobnVsbCk7XHJcblx0XHRcdCgodGhpcy5iaWxsLnR5cGVSZWNvcmQuUm9sZXMgfHwgW10pIGFzIE1vZGVsVXNlclJvbGVbXSkuZm9yRWFjaCh2ID0+IHtcclxuXHRcdFx0XHR0aGlzLnJvbGVzW3YuUm9sZU5hbWVdID0gdHJ1ZTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLmJpbGwuZm9ybUdyb3VwXHJcblx0XHRcdFx0LmdldCgnRGVwdCcpXHJcblx0XHRcdFx0LnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmN1cnIuZGF0YS5EZXB0LkNvZGUpLCBkZWJvdW5jZVRpbWUoNTAwKSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKHZhbCA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmZpbHRlckRlcHRMaXN0ID0gdGhpcy5iYWNrLmZldGNoRmlsdGVyRGVwdCh2YWwpO1xyXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coJ+WGhe+8micsIHRoaXMuZmlsdGVyRGVwdExpc3QpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmJpbGwub25CZWZvcmVTYXZlID0gdGhpcy5iZWZvcmVTYXZlO1xyXG5cdH1cclxuXHRyb2xlQ2hhbmdlKGV2ZW50OiBNYXRDaGVja2JveENoYW5nZSwgcm9sZU5hbWU6IHN0cmluZykge1xyXG5cdFx0aWYgKGV2ZW50LmNoZWNrZWQpIHtcclxuXHRcdFx0dGhpcy5yb2xlc1tyb2xlTmFtZV0gPSB0cnVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0ZGVsZXRlIHRoaXMucm9sZXNbcm9sZU5hbWVdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRhY3JvbnltRnVuKGxldHRlcjogc3RyaW5nKSB7XHJcblx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGxldHRlcikuc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7XHJcblx0fVxyXG5cdHRyeSgpIHtcclxuXHRcdGNvbnNvbGUubG9nKHRoaXMuZmlsdGVyRGVwdExpc3QpO1xyXG5cdH1cclxufVxyXG5mdW5jdGlvbiBtYXAyV2l0aExldHRlcih2OiBzdHJpbmdbXSkge1xyXG5cdGNvbnN0IG1hcExpc3QgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XHJcblx0di5mb3JFYWNoKHZ2ID0+IHtcclxuXHRcdGxldCBoZWFkZXJMZXR0ZXIgPSBwaW55aW4odnYsIHsgc3R5bGU6IHBpbnlpbi5TVFlMRV9GSVJTVF9MRVRURVIgfSkubWFwKHMgPT4gc1swXSlbMF07XHJcblx0XHRpZiAoaGVhZGVyTGV0dGVyLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0aGVhZGVyTGV0dGVyID0gaGVhZGVyTGV0dGVyWzBdO1xyXG5cdFx0fVxyXG5cdFx0aWYgKG1hcExpc3QuaGFzKGhlYWRlckxldHRlcikpIHtcclxuXHRcdFx0bWFwTGlzdC5nZXQoaGVhZGVyTGV0dGVyKS5wdXNoKHZ2KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG1hcExpc3Quc2V0KGhlYWRlckxldHRlciwgW3Z2XSk7XHJcblx0XHR9XHJcblx0fSk7XHJcblx0Ly8g5o6S5bqPXHJcblxyXG5cdGNvbnN0IHJldiA9IFtdIGFzIENvbHVtbnNXaXRoTGV0dGVyW107XHJcblx0bWFwTGlzdC5mb3JFYWNoKChjb2x1bW5zLCBsZXR0ZXIpID0+IHtcclxuXHRcdHJldi5wdXNoKHsgTGV0dGVyOiBsZXR0ZXIsIENvbHVtbnM6IGNvbHVtbnMgfSBhcyBDb2x1bW5zV2l0aExldHRlcik7XHJcblx0fSk7XHJcblx0cmV0dXJuIHJldi5zb3J0KChhLCBiKSA9PiBhLkxldHRlci5sb2NhbGVDb21wYXJlKGIuTGV0dGVyKSk7XHJcbn1cclxuIl19