UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

478 lines 43.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { MatDialog, MatSnackBar } from '@angular/material'; import { BillBackfaceService, BillOperate, RouteElementService, BillFieldDataType } from 'dbweb-core'; import { TabsService } from '../home/tabs.service'; import { BillCloneBackfaceService } from './bill-clone-backface.service'; import { CloneComponent } from './clone/clone.component'; import { ErrorMessageComponent } from './error-message/error-message.component'; /** * @record */ function Record() { } if (false) { /** @type {?} */ Record.prototype.Main; /** @type {?|undefined} */ Record.prototype.Child; } /** * @record */ export function BeforeSaveParam() { } if (false) { /** @type {?} */ BeforeSaveParam.prototype.record; /** @type {?|undefined} */ BeforeSaveParam.prototype.tag; } export class BillComponent { /** * @param {?} rele * @param {?} billBackface * @param {?} tabs * @param {?} dialog * @param {?} billCloneService * @param {?} snackBar */ constructor(rele, billBackface, tabs, dialog, billCloneService, snackBar) { this.rele = rele; this.billBackface = billBackface; this.tabs = tabs; this.dialog = dialog; this.billCloneService = billCloneService; this.snackBar = snackBar; this.init = new EventEmitter(); // 这里的Name依据typestruct来 this.useTypeRecord = false; this.typeRecord = {}; this.rele.currentElement.subscribe((/** * @param {?} v * @return {?} */ v => { this.element = v; this.billBackface.get(v).subscribe((/** * @param {?} vv * @return {?} */ vv => { this.checkResults = vv.CheckResults; this.oldData = vv.EncodeData; this.operate = vv.Operate; this.allowClone = vv.AllowClone; this.fields = vv.Fields; this.typeRecord = vv.TypeRecord; this.record = vv.Record; this.signKeyValues = vv.SignKeyValues; this.useTypeRecord = vv.TypeRecord !== undefined && vv.TypeRecord !== null; // 对主表字段的映射 this.fieldMap = vv.Fields.reduce((/** * @param {?} result * @param {?} item * @return {?} */ (result, item) => { result[item.Name] = item; return result; }), {}); // 只建立主表的formgroup if (this.useTypeRecord) { this.formGroup = new FormGroup(this.fields.reduce((/** * @param {?} result * @param {?} fld * @return {?} */ (result, fld) => { if (fld.Type === BillFieldDataType.DATE && this.typeRecord[fld.Name]) { result[fld.Name] = new FormControl({ value: this.fixShowDate((/** @type {?} */ (this.typeRecord[fld.Name]))), // 去掉时区 disabled: fld.Readonly }); } else { result[fld.Name] = new FormControl({ value: this.typeRecord[fld.Name], disabled: fld.Readonly }); } return result; }), {})); } else { this.formGroup = new FormGroup(this.fields.reduce((/** * @param {?} result * @param {?} fld * @return {?} */ (result, fld) => { if (fld.Type === BillFieldDataType.DATE && this.record.Main[fld.Name]) { result[fld.Name] = new FormControl({ value: this.fixShowDate((/** @type {?} */ (this.record.Main[fld.Name]))), // 去掉时区 disabled: fld.Readonly }); } else { result[fld.Name] = new FormControl({ value: this.record.Main[fld.Name], disabled: fld.Readonly }); } return result; }), {})); } this.init.emit(); }), (/** * @param {?} err * @return {?} */ (err) => { this.error = err.error.Error; })); })); } /** * @private * @param {?} d * @return {?} */ fixShowDate(d) { if (d) { return d.substr(0, 16); } return d; } /** * @return {?} */ ngAfterContentInit() { } /** * @param {?} mes * @return {?} */ showErrorMessage(mes) { this.dialog.open(ErrorMessageComponent, { // width: '450px', data: { message: mes }, autoFocus: false }); // dialogRef.afterClosed().subscribe(result => { // console.log('The dialog was closed'); // }); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ isAdd() { return this.operate === BillOperate.Add; } /** * @return {?} */ isEdit() { return this.operate === BillOperate.Edit; } /** * @return {?} */ isDelete() { return this.operate === BillOperate.Delete; } /** * @return {?} */ isBrowse() { return this.operate === BillOperate.Browse; } /** * @return {?} */ close() { this.tabs.close(); } /** * @private * @param {?} d * @return {?} */ fixDate(d) { /** @type {?} */ const timezoneOffsetInHours = -(d.getTimezoneOffset() / 60); // UTC minus local time /** @type {?} */ const sign = timezoneOffsetInHours >= 0 ? '+' : '-'; /** @type {?} */ const leadingZero = Math.abs(timezoneOffsetInHours) < 10 ? '0' : ''; // It's a bit unfortunate that we need to construct a new Date instance // (we don't want _this_ Date instance to be modified) /** @type {?} */ const correctedDate = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()); correctedDate.setHours(d.getHours() + timezoneOffsetInHours); /** @type {?} */ const iso = correctedDate.toISOString().replace('Z', ''); return iso + sign + leadingZero + Math.abs(timezoneOffsetInHours).toString() + ':00'; } // 返回formgroup的转换好类型的值 /** * @return {?} */ getFormGroupValueAsType() { /** @type {?} */ const rev = {}; this.fields.forEach((/** * @param {?} fld * @return {?} */ fld => { switch (fld.Type) { case BillFieldDataType.FLOAT: rev[fld.Name] = parseFloat(this.formGroup.get(fld.Name).value); break; case BillFieldDataType.INT: rev[fld.Name] = parseInt(this.formGroup.get(fld.Name).value, 10); break; case BillFieldDataType.DATE: if (this.formGroup.get(fld.Name).value) { rev[fld.Name] = this.fixDate(new Date(this.formGroup.get(fld.Name).value)); } else { rev[fld.Name] = null; } break; default: rev[fld.Name] = this.formGroup.get(fld.Name).value; break; } })); return rev; } /** * @return {?} */ save() { // 合并修改的数据 if (this.useTypeRecord) { this.typeRecord = Object.assign({}, this.typeRecord, this.getFormGroupValueAsType()); } else { this.record = { Main: Object.assign({}, this.record.Main, this.getFormGroupValueAsType()), Child: Object.assign({}, this.record.Child) }; } /** @type {?} */ const process = (/** * @param {?} data * @return {?} */ (data) => { // 合并修改的数据 if (this.useTypeRecord) { this.typeRecord = Object.assign({}, this.typeRecord, data ? data.record : null); } else { if (data && data.record) { this.record.Main = Object.assign({}, this.record.Main, data.record.Main); this.record.Child = data.record.Child; } } this.billBackface .post(this.element, (/** @type {?} */ ({ CheckOnly: false, OldData: this.oldData, Tag: data ? data.tag : null, NewTypeRecord: this.typeRecord, NewRecord: this.record }))) .subscribe((/** * @param {?} v * @return {?} */ v => { if (v.Ok) { this.tabs.close(); return; } this.showErrorMessage(v.Error); })); }); if (this.onBeforeSave) { this.onBeforeSave(this).subscribe((/** * @param {?} v * @return {?} */ v => { process(v); })); } else { process(null); } } /** * @return {?} */ delete() { return this.billBackface.delete(this.element, this.oldData).subscribe((/** * @param {?} v * @return {?} */ v => { if (v.Ok) { this.tabs.close(); return; } this.showErrorMessage(v.Error); })); } /** * @return {?} */ clone() { this.billCloneService .getClonePK({ OldSignPK: this.signKeyValues, EleName: this.element.element.Name }) .subscribe((/** * @param {?} v * @return {?} */ v => { /** @type {?} */ const dialogRef = this.dialog.open(CloneComponent, { // width: '450px', data: v }); dialogRef.afterClosed().subscribe((/** * @param {?} result * @return {?} */ (result) => { if (result) { this.billCloneService .billClone({ EleName: this.element.element.Name, OldSignPK: this.signKeyValues, NewPK: result }) .subscribe((/** * @param {?} apirev * @return {?} */ apirev => { if (apirev.Ok) { this.snackBar.open('成功完成克隆', '关闭', { horizontalPosition: 'right', verticalPosition: 'bottom', duration: 5000 }); } else { this.snackBar.open(apirev.Error, '关闭', { horizontalPosition: 'right', verticalPosition: 'bottom' }); } })); } })); })); } } BillComponent.decorators = [ { type: Component, args: [{ selector: 'common-bill', template: "<div *ngIf=\"error;else noErr\">{{error}}</div>\r\n<ng-template #noErr>\r\n\t<div class=\"bill\">\r\n\t\t<div class=\"content\">\r\n\t\t\t<ng-content></ng-content>\r\n\t\t</div>\r\n\t\t<div class=\"footer\">\r\n\t\t\t<div class=\"clone\">\r\n\t\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"clone()\"\r\n\t\t\t\t\t*ngIf=\"allowClone\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"compare_arrows\"></mat-icon>\u514B\u9686\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\"\r\n\t\t\t\t*ngIf=\"checkResults&&checkResults.length>0\">\r\n\t\t\t\t<mat-icon svgIcon=\"spellcheck\"></mat-icon>\u5BA1\u6838\u5907\u6CE8\r\n\t\t\t</button>\r\n\t\t\t<div class=\"\u5206\u5272\u7EBF\"\r\n\t\t\t\t*ngIf=\"allowClone || (checkResults && checkResults.length>0)\">\r\n\t\t\t</div>\r\n\t\t\t<!-- <button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"close()\">\r\n\t\t\t\t<mat-icon svgIcon=\"outlined:book\"></mat-icon>\u65E5\u5FD7\r\n\t\t\t</button> -->\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"close()\"\r\n\t\t\t\t*ngIf=\"isAdd() || isEdit() || isDelete()\">\r\n\t\t\t\t<mat-icon svgIcon=\"close\"></mat-icon>\u53D6\u6D88\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"close()\"\r\n\t\t\t\t*ngIf=\"isBrowse()\">\r\n\t\t\t\t<mat-icon svgIcon=\"close\"></mat-icon>\u5173\u95ED\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"save()\" *ngIf=\"isAdd()\">\r\n\t\t\t\t<mat-icon svgIcon=\"add\"></mat-icon>\u65B0\u589E\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE \u4FDD\u5B58\u6309\u94AE\" (click)=\"save()\"\r\n\t\t\t\t*ngIf=\"isEdit()\">\r\n\t\t\t\t<mat-icon svgIcon=\"outlined:save\"></mat-icon>\u4FDD\u5B58\r\n\t\t\t</button>\r\n\t\t\t<button mat-button class=\"\u529F\u80FD\u6309\u94AE\" (click)=\"delete()\"\r\n\t\t\t\t*ngIf=\"isDelete()\">\r\n\t\t\t\t<mat-icon svgIcon=\"delete\"></mat-icon>\u5220\u9664\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t</div>\r\n</ng-template>", styles: ["@charset \"UTF-8\";.bill{width:100%;height:100%;display:flex;flex-direction:column;align-items:stretch}.content{width:100%;flex:1;overflow:auto;padding:16px 8px;box-sizing:border-box}.footer{width:100%;height:48px;display:flex;justify-content:flex-end;align-items:center;padding-right:16px;box-sizing:border-box}.clone{text-align:left}.\u529F\u80FD\u6309\u94AE{height:32px;text-align:center;max-height:32px;line-height:32px;font-size:14px;cursor:pointer}.\u529F\u80FD\u6309\u94AE .mat-icon{width:16px;height:16px;line-height:16px;margin-right:4px;vertical-align:middle}.\u4FDD\u5B58\u6309\u94AE{display:inline-block;margin-left:8px}.\u5206\u5272\u7EBF{width:1px;height:50%;margin:0 24px}"] }] } ]; /** @nocollapse */ BillComponent.ctorParameters = () => [ { type: RouteElementService }, { type: BillBackfaceService }, { type: TabsService }, { type: MatDialog }, { type: BillCloneBackfaceService }, { type: MatSnackBar } ]; BillComponent.propDecorators = { onBeforeSave: [{ type: Input }], init: [{ type: Output }] }; if (false) { /** @type {?} */ BillComponent.prototype.onBeforeSave; /** @type {?} */ BillComponent.prototype.init; /** @type {?} */ BillComponent.prototype.element; /** * @type {?} * @private */ BillComponent.prototype.oldData; /** * @type {?} * @private */ BillComponent.prototype.operate; /** @type {?} */ BillComponent.prototype.allowClone; /** @type {?} */ BillComponent.prototype.checkResults; /** @type {?} */ BillComponent.prototype.fieldMap; /** @type {?} */ BillComponent.prototype.fields; /** * @type {?} * @private */ BillComponent.prototype.useTypeRecord; /** * @type {?} * @private */ BillComponent.prototype.signKeyValues; /** @type {?} */ BillComponent.prototype.formGroup; /** @type {?} */ BillComponent.prototype.typeRecord; /** @type {?} */ BillComponent.prototype.record; /** @type {?} */ BillComponent.prototype.error; /** @type {?} */ BillComponent.prototype.rele; /** * @type {?} * @private */ BillComponent.prototype.billBackface; /** * @type {?} * @private */ BillComponent.prototype.tabs; /** @type {?} */ BillComponent.prototype.dialog; /** * @type {?} * @private */ BillComponent.prototype.billCloneService; /** * @type {?} * @private */ BillComponent.prototype.snackBar; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvYmlsbC9iaWxsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFvQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFDTixtQkFBbUIsRUFDbkIsV0FBVyxFQUlYLG1CQUFtQixFQUVuQixpQkFBaUIsRUFDakIsTUFBTSxZQUFZLENBQUM7QUFHcEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7OztBQUNoRixxQkFHQzs7O0lBRkEsc0JBQTZCOztJQUM3Qix1QkFBb0Q7Ozs7O0FBRXJELHFDQUdDOzs7SUFGQSxpQ0FBd0M7O0lBQ3hDLDhCQUFVOztBQU9YLE1BQU0sT0FBTyxhQUFhOzs7Ozs7Ozs7SUFnQnpCLFlBQ1EsSUFBeUIsRUFDeEIsWUFBaUMsRUFDakMsSUFBaUIsRUFDbEIsTUFBaUIsRUFDaEIsZ0JBQTBDLEVBQzFDLFFBQXFCO1FBTHRCLFNBQUksR0FBSixJQUFJLENBQXFCO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFn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d0I7Ozs7O0lBQ3hCLHlDQUFrRDs7Ozs7SUFDbEQsaUNBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHtcclxuXHRCaWxsQmFja2ZhY2VTZXJ2aWNlLFxyXG5cdEJpbGxPcGVyYXRlLFxyXG5cdEVsZW1lbnRSb3V0ZSxcclxuXHRJQmlsbFBvc3RFdmVudEJvZHksXHJcblx0SUZpZWxkLFxyXG5cdFJvdXRlRWxlbWVudFNlcnZpY2UsXHJcblx0SVRhYmxlQ2hlY2tSZXN1bHQsXHJcblx0QmlsbEZpZWxkRGF0YVR5cGVcclxufSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUYWJzU2VydmljZSB9IGZyb20gJy4uL2hvbWUvdGFicy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmlsbENsb25lQmFja2ZhY2VTZXJ2aWNlIH0gZnJvbSAnLi9iaWxsLWNsb25lLWJhY2tmYWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDbG9uZUNvbXBvbmVudCB9IGZyb20gJy4vY2xvbmUvY2xvbmUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXJyb3JNZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9lcnJvci1tZXNzYWdlL2Vycm9yLW1lc3NhZ2UuY29tcG9uZW50JztcclxuaW50ZXJmYWNlIFJlY29yZCB7XHJcblx0TWFpbjogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcclxuXHRDaGlsZD86IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdIH07XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBCZWZvcmVTYXZlUGFyYW0ge1xyXG5cdHJlY29yZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IFJlY29yZDtcclxuXHR0YWc/OiBhbnk7XHJcbn1cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdjb21tb24tYmlsbCcsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2JpbGwuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2JpbGwuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmlsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblx0QElucHV0KCkgb25CZWZvcmVTYXZlOiAoc2VsZnQ6IEJpbGxDb21wb25lbnQpID0+IE9ic2VydmFibGU8QmVmb3JlU2F2ZVBhcmFtPjtcclxuXHRAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHRwdWJsaWMgZWxlbWVudDogRWxlbWVudFJvdXRlO1xyXG5cdHByaXZhdGUgb2xkRGF0YTogc3RyaW5nO1xyXG5cdHByaXZhdGUgb3BlcmF0ZTogQmlsbE9wZXJhdGU7XHJcblx0cHVibGljIGFsbG93Q2xvbmU6IGJvb2xlYW47XHJcblx0cHVibGljIGNoZWNrUmVzdWx0czogSVRhYmxlQ2hlY2tSZXN1bHRbXTtcclxuXHRwdWJsaWMgZmllbGRNYXA6IHsgW2tleTogc3RyaW5nXTogSUZpZWxkIH07XHJcblx0cHVibGljIGZpZWxkczogSUZpZWxkW107IC8vIOi/memHjOeahE5hbWXkvp3mja50eXBlc3RydWN05p2lXHJcblx0cHJpdmF0ZSB1c2VUeXBlUmVjb3JkID0gZmFsc2U7XHJcblx0cHJpdmF0ZSBzaWduS2V5VmFsdWVzOiBzdHJpbmc7XHJcblx0cHVibGljIGZvcm1Hcm91cD86IEZvcm1Hcm91cDtcclxuXHRwdWJsaWMgdHlwZVJlY29yZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cdHB1YmxpYyByZWNvcmQ6IFJlY29yZDtcclxuXHRwdWJsaWMgZXJyb3I6IHN0cmluZztcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHB1YmxpYyByZWxlOiBSb3V0ZUVsZW1lbnRTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBiaWxsQmFja2ZhY2U6IEJpbGxCYWNrZmFjZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHRhYnM6IFRhYnNTZXJ2aWNlLFxyXG5cdFx0cHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG5cdFx0cHJpdmF0ZSBiaWxsQ2xvbmVTZXJ2aWNlOiBCaWxsQ2xvbmVCYWNrZmFjZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhclxyXG5cdCkge1xyXG5cdFx0dGhpcy5yZWxlLmN1cnJlbnRFbGVtZW50LnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0dGhpcy5lbGVtZW50ID0gdjtcclxuXHRcdFx0dGhpcy5iaWxsQmFja2ZhY2UuZ2V0KHYpLnN1YnNjcmliZShcclxuXHRcdFx0XHR2diA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmNoZWNrUmVzdWx0cyA9IHZ2LkNoZWNrUmVzdWx0cztcclxuXHRcdFx0XHRcdHRoaXMub2xkRGF0YSA9IHZ2LkVuY29kZURhdGE7XHJcblx0XHRcdFx0XHR0aGlzLm9wZXJhdGUgPSB2di5PcGVyYXRlO1xyXG5cdFx0XHRcdFx0dGhpcy5hbGxvd0Nsb25lID0gdnYuQWxsb3dDbG9uZTtcclxuXHRcdFx0XHRcdHRoaXMuZmllbGRzID0gdnYuRmllbGRzO1xyXG5cdFx0XHRcdFx0dGhpcy50eXBlUmVjb3JkID0gdnYuVHlwZVJlY29yZDtcclxuXHRcdFx0XHRcdHRoaXMucmVjb3JkID0gdnYuUmVjb3JkO1xyXG5cdFx0XHRcdFx0dGhpcy5zaWduS2V5VmFsdWVzID0gdnYuU2lnbktleVZhbHVlcztcclxuXHRcdFx0XHRcdHRoaXMudXNlVHlwZVJlY29yZCA9IHZ2LlR5cGVSZWNvcmQgIT09IHVuZGVmaW5lZCAmJiB2di5UeXBlUmVjb3JkICE9PSBudWxsO1xyXG5cdFx0XHRcdFx0Ly8g5a+55Li76KGo5a2X5q6155qE5pig5bCEXHJcblx0XHRcdFx0XHR0aGlzLmZpZWxkTWFwID0gdnYuRmllbGRzLnJlZHVjZSgocmVzdWx0LCBpdGVtKSA9PiB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdFtpdGVtLk5hbWVdID0gaXRlbTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHRcdH0sIHt9KTtcclxuXHRcdFx0XHRcdC8vIOWPquW7uueri+S4u+ihqOeahGZvcm1ncm91cFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMudXNlVHlwZVJlY29yZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5maWVsZHMucmVkdWNlKChyZXN1bHQsIGZsZCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZsZC5UeXBlID09PSBCaWxsRmllbGREYXRhVHlwZS5EQVRFICYmIHRoaXMudHlwZVJlY29yZFtmbGQuTmFtZV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2ZsZC5OYW1lXSA9IG5ldyBGb3JtQ29udHJvbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHRoaXMuZml4U2hvd0RhdGUodGhpcy50eXBlUmVjb3JkW2ZsZC5OYW1lXSBhcyBzdHJpbmcpLCAvLyDljrvmjonml7bljLpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogZmxkLlJlYWRvbmx5XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2ZsZC5OYW1lXSA9IG5ldyBGb3JtQ29udHJvbCh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHRoaXMudHlwZVJlY29yZFtmbGQuTmFtZV0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlzYWJsZWQ6IGZsZC5SZWFkb25seVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdFx0XHRcdFx0fSwge30pXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5maWVsZHMucmVkdWNlKChyZXN1bHQsIGZsZCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZsZC5UeXBlID09PSBCaWxsRmllbGREYXRhVHlwZS5EQVRFICYmIHRoaXMucmVjb3JkLk1haW5bZmxkLk5hbWVdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdFtmbGQuTmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woe1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLmZpeFNob3dEYXRlKHRoaXMucmVjb3JkLk1haW5bZmxkLk5hbWVdIGFzIHN0cmluZyksIC8vIOWOu+aOieaXtuWMulxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRpc2FibGVkOiBmbGQuUmVhZG9ubHlcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHRbZmxkLk5hbWVdID0gbmV3IEZvcm1Db250cm9sKHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogdGhpcy5yZWNvcmQuTWFpbltmbGQuTmFtZV0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlzYWJsZWQ6IGZsZC5SZWFkb25seVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdFx0XHRcdFx0fSwge30pXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLmluaXQuZW1pdCgpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0KGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuZXJyb3IgPSBlcnIuZXJyb3IuRXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHByaXZhdGUgZml4U2hvd0RhdGUoZDogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGlmIChkKSB7XHJcblx0XHRcdHJldHVybiBkLnN1YnN0cigwLCAxNik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZDtcclxuXHR9XHJcblx0bmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge31cclxuXHRzaG93RXJyb3JNZXNzYWdlKG1lczogc3RyaW5nKTogdm9pZCB7XHJcblx0XHR0aGlzLmRpYWxvZy5vcGVuKEVycm9yTWVzc2FnZUNvbXBvbmVudCwge1xyXG5cdFx0XHQvLyB3aWR0aDogJzQ1MHB4JyxcclxuXHRcdFx0ZGF0YTogeyBtZXNzYWdlOiBtZXMgfSxcclxuXHRcdFx0YXV0b0ZvY3VzOiBmYWxzZVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcblx0XHQvLyBcdGNvbnNvbGUubG9nKCdUaGUgZGlhbG9nIHdhcyBjbG9zZWQnKTtcclxuXHRcdC8vIH0pO1xyXG5cdH1cclxuXHRuZ09uSW5pdCgpIHt9XHJcblx0aXNBZGQoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcGVyYXRlID09PSBCaWxsT3BlcmF0ZS5BZGQ7XHJcblx0fVxyXG5cdGlzRWRpdCgpIHtcclxuXHRcdHJldHVybiB0aGlzLm9wZXJhdGUgPT09IEJpbGxPcGVyYXRlLkVkaXQ7XHJcblx0fVxyXG5cdGlzRGVsZXRlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMub3BlcmF0ZSA9PT0gQmlsbE9wZXJhdGUuRGVsZXRlO1xyXG5cdH1cclxuXHRpc0Jyb3dzZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLm9wZXJhdGUgPT09IEJpbGxPcGVyYXRlLkJyb3dzZTtcclxuXHR9XHJcblx0Y2xvc2UoKSB7XHJcblx0XHR0aGlzLnRhYnMuY2xvc2UoKTtcclxuXHR9XHJcblx0cHJpdmF0ZSBmaXhEYXRlKGQ6IERhdGUpIHtcclxuXHRcdGNvbnN0IHRpbWV6b25lT2Zmc2V0SW5Ib3VycyA9IC0oZC5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjApOyAvLyBVVEMgbWludXMgbG9jYWwgdGltZVxyXG5cdFx0Y29uc3Qgc2lnbiA9IHRpbWV6b25lT2Zmc2V0SW5Ib3VycyA+PSAwID8gJysnIDogJy0nO1xyXG5cdFx0Y29uc3QgbGVhZGluZ1plcm8gPSBNYXRoLmFicyh0aW1lem9uZU9mZnNldEluSG91cnMpIDwgMTAgPyAnMCcgOiAnJztcclxuXHJcblx0XHQvLyBJdCdzIGEgYml0IHVuZm9ydHVuYXRlIHRoYXQgd2UgbmVlZCB0byBjb25zdHJ1Y3QgYSBuZXcgRGF0ZSBpbnN0YW5jZVxyXG5cdFx0Ly8gKHdlIGRvbid0IHdhbnQgX3RoaXNfIERhdGUgaW5zdGFuY2UgdG8gYmUgbW9kaWZpZWQpXHJcblx0XHRjb25zdCBjb3JyZWN0ZWREYXRlID0gbmV3IERhdGUoXHJcblx0XHRcdGQuZ2V0RnVsbFllYXIoKSxcclxuXHRcdFx0ZC5nZXRNb250aCgpLFxyXG5cdFx0XHRkLmdldERhdGUoKSxcclxuXHRcdFx0ZC5nZXRIb3VycygpLFxyXG5cdFx0XHRkLmdldE1pbnV0ZXMoKSxcclxuXHRcdFx0ZC5nZXRTZWNvbmRzKCksXHJcblx0XHRcdGQuZ2V0TWlsbGlzZWNvbmRzKClcclxuXHRcdCk7XHJcblx0XHRjb3JyZWN0ZWREYXRlLnNldEhvdXJzKGQuZ2V0SG91cnMoKSArIHRpbWV6b25lT2Zmc2V0SW5Ib3Vycyk7XHJcblx0XHRjb25zdCBpc28gPSBjb3JyZWN0ZWREYXRlLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnWicsICcnKTtcclxuXHJcblx0XHRyZXR1cm4gaXNvICsgc2lnbiArIGxlYWRpbmdaZXJvICsgTWF0aC5hYnModGltZXpvbmVPZmZzZXRJbkhvdXJzKS50b1N0cmluZygpICsgJzowMCc7XHJcblx0fVxyXG5cdC8vIOi/lOWbnmZvcm1ncm91cOeahOi9rOaNouWlveexu+Wei+eahOWAvFxyXG5cdGdldEZvcm1Hcm91cFZhbHVlQXNUeXBlKCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG5cdFx0Y29uc3QgcmV2OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblx0XHR0aGlzLmZpZWxkcy5mb3JFYWNoKGZsZCA9PiB7XHJcblx0XHRcdHN3aXRjaCAoZmxkLlR5cGUpIHtcclxuXHRcdFx0XHRjYXNlIEJpbGxGaWVsZERhdGFUeXBlLkZMT0FUOlxyXG5cdFx0XHRcdFx0cmV2W2ZsZC5OYW1lXSA9IHBhcnNlRmxvYXQodGhpcy5mb3JtR3JvdXAuZ2V0KGZsZC5OYW1lKS52YWx1ZSk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIEJpbGxGaWVsZERhdGFUeXBlLklOVDpcclxuXHRcdFx0XHRcdHJldltmbGQuTmFtZV0gPSBwYXJzZUludCh0aGlzLmZvcm1Hcm91cC5nZXQoZmxkLk5hbWUpLnZhbHVlLCAxMCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRjYXNlIEJpbGxGaWVsZERhdGFUeXBlLkRBVEU6XHJcblx0XHRcdFx0XHRpZiAodGhpcy5mb3JtR3JvdXAuZ2V0KGZsZC5OYW1lKS52YWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRyZXZbZmxkLk5hbWVdID0gdGhpcy5maXhEYXRlKG5ldyBEYXRlKHRoaXMuZm9ybUdyb3VwLmdldChmbGQuTmFtZSkudmFsdWUpKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHJldltmbGQuTmFtZV0gPSBudWxsO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdHJldltmbGQuTmFtZV0gPSB0aGlzLmZvcm1Hcm91cC5nZXQoZmxkLk5hbWUpLnZhbHVlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHJldjtcclxuXHR9XHJcblx0c2F2ZSgpIHtcclxuXHRcdC8vIOWQiOW5tuS/ruaUueeahOaVsOaNrlxyXG5cdFx0aWYgKHRoaXMudXNlVHlwZVJlY29yZCkge1xyXG5cdFx0XHR0aGlzLnR5cGVSZWNvcmQgPSB7IC4uLnRoaXMudHlwZVJlY29yZCwgLi4udGhpcy5nZXRGb3JtR3JvdXBWYWx1ZUFzVHlwZSgpIH07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnJlY29yZCA9IHtcclxuXHRcdFx0XHRNYWluOiB7IC4uLnRoaXMucmVjb3JkLk1haW4sIC4uLnRoaXMuZ2V0Rm9ybUdyb3VwVmFsdWVBc1R5cGUoKSB9LFxyXG5cdFx0XHRcdENoaWxkOiB7IC4uLnRoaXMucmVjb3JkLkNoaWxkIH1cclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHByb2Nlc3MgPSAoZGF0YTogQmVmb3JlU2F2ZVBhcmFtKSA9PiB7XHJcblx0XHRcdC8vIOWQiOW5tuS/ruaUueeahOaVsOaNrlxyXG5cdFx0XHRpZiAodGhpcy51c2VUeXBlUmVjb3JkKSB7XHJcblx0XHRcdFx0dGhpcy50eXBlUmVjb3JkID0geyAuLi50aGlzLnR5cGVSZWNvcmQsIC4uLmRhdGEgPyBkYXRhLnJlY29yZCA6IG51bGwgfTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoZGF0YSAmJiBkYXRhLnJlY29yZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5yZWNvcmQuTWFpbiA9IHsgLi4udGhpcy5yZWNvcmQuTWFpbiwgLi4uZGF0YS5yZWNvcmQuTWFpbiB9O1xyXG5cdFx0XHRcdFx0dGhpcy5yZWNvcmQuQ2hpbGQgPSBkYXRhLnJlY29yZC5DaGlsZDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5iaWxsQmFja2ZhY2VcclxuXHRcdFx0XHQucG9zdCh0aGlzLmVsZW1lbnQsIHtcclxuXHRcdFx0XHRcdENoZWNrT25seTogZmFsc2UsXHJcblx0XHRcdFx0XHRPbGREYXRhOiB0aGlzLm9sZERhdGEsXHJcblx0XHRcdFx0XHRUYWc6IGRhdGEgPyBkYXRhLnRhZyA6IG51bGwsXHJcblx0XHRcdFx0XHROZXdUeXBlUmVjb3JkOiB0aGlzLnR5cGVSZWNvcmQsXHJcblx0XHRcdFx0XHROZXdSZWNvcmQ6IHRoaXMucmVjb3JkXHJcblx0XHRcdFx0fSBhcyBJQmlsbFBvc3RFdmVudEJvZHkpXHJcblx0XHRcdFx0LnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHRcdGlmICh2Lk9rKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMudGFicy5jbG9zZSgpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnNob3dFcnJvck1lc3NhZ2Uodi5FcnJvcik7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9O1xyXG5cdFx0aWYgKHRoaXMub25CZWZvcmVTYXZlKSB7XHJcblx0XHRcdHRoaXMub25CZWZvcmVTYXZlKHRoaXMpLnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHRwcm9jZXNzKHYpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHByb2Nlc3MobnVsbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGRlbGV0ZSgpIHtcclxuXHRcdHJldHVybiB0aGlzLmJpbGxCYWNrZmFjZS5kZWxldGUodGhpcy5lbGVtZW50LCB0aGlzLm9sZERhdGEpLnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0aWYgKHYuT2spIHtcclxuXHRcdFx0XHR0aGlzLnRhYnMuY2xvc2UoKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5zaG93RXJyb3JNZXNzYWdlKHYuRXJyb3IpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdGNsb25lKCkge1xyXG5cdFx0dGhpcy5iaWxsQ2xvbmVTZXJ2aWNlXHJcblx0XHRcdC5nZXRDbG9uZVBLKHsgT2xkU2lnblBLOiB0aGlzLnNpZ25LZXlWYWx1ZXMsIEVsZU5hbWU6IHRoaXMuZWxlbWVudC5lbGVtZW50Lk5hbWUgfSlcclxuXHRcdFx0LnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHRjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENsb25lQ29tcG9uZW50LCB7XHJcblx0XHRcdFx0XHQvLyB3aWR0aDogJzQ1MHB4JyxcclxuXHRcdFx0XHRcdGRhdGE6IHZcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0ZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pID0+IHtcclxuXHRcdFx0XHRcdGlmIChyZXN1bHQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5iaWxsQ2xvbmVTZXJ2aWNlXHJcblx0XHRcdFx0XHRcdFx0LmJpbGxDbG9uZSh7XHJcblx0XHRcdFx0XHRcdFx0XHRFbGVOYW1lOiB0aGlzLmVsZW1lbnQuZWxlbWVudC5OYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0T2xkU2lnblBLOiB0aGlzLnNpZ25LZXlWYWx1ZXMsXHJcblx0XHRcdFx0XHRcdFx0XHROZXdQSzogcmVzdWx0XHJcblx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHQuc3Vic2NyaWJlKGFwaXJldiA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoYXBpcmV2Lk9rKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3Blbign5oiQ5Yqf5a6M5oiQ5YWL6ZqGJywgJ+WFs+mXrScsIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRob3Jpem9udGFsUG9zaXRpb246ICdyaWdodCcsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmVydGljYWxQb3NpdGlvbjogJ2JvdHRvbScsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZHVyYXRpb246IDUwMDBcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oYXBpcmV2LkVycm9yLCAn5YWz6ZetJywge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhvcml6b250YWxQb3NpdGlvbjogJ3JpZ2h0JyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2ZXJ0aWNhbFBvc2l0aW9uOiAnYm90dG9tJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblx0fVxyXG59XHJcbiJdfQ==