tnx-shared 5.2.10 → 5.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/assets/gulpfile.js +6 -1
  2. package/bundles/tnx-shared.umd.js +473 -165
  3. package/bundles/tnx-shared.umd.js.map +1 -1
  4. package/bundles/tnx-shared.umd.min.js +1 -1
  5. package/bundles/tnx-shared.umd.min.js.map +1 -1
  6. package/classes/base/component-base.d.ts +3 -0
  7. package/classes/base/component-base.d.ts.map +1 -1
  8. package/classes/base/list-base.d.ts +2 -0
  9. package/classes/base/list-base.d.ts.map +1 -1
  10. package/classes/environment-schema.d.ts +13 -4
  11. package/classes/environment-schema.d.ts.map +1 -1
  12. package/classes/form-schema.d.ts +4 -0
  13. package/classes/form-schema.d.ts.map +1 -1
  14. package/components/common-app-component/app-topbar-v1/app-topbar-v1.component.d.ts +4 -2
  15. package/components/common-app-component/app-topbar-v1/app-topbar-v1.component.d.ts.map +1 -1
  16. package/components/common-app-component/default-setting-form/default-data-settings.component.d.ts +20 -0
  17. package/components/common-app-component/default-setting-form/default-data-settings.component.d.ts.map +1 -0
  18. package/components/common-app-component/default-setting-form/default-data-settings.component.ngfactory.d.ts.map +1 -0
  19. package/components/common-app-component/default-setting-form/default-data-settings.component.scss.shim.ngstyle.d.ts.map +1 -0
  20. package/components/crud/advance-search/advance-search.component.d.ts +2 -2
  21. package/components/crud/advance-search/advance-search.component.d.ts.map +1 -1
  22. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  23. package/components/datetime-picker/datetime-picker.component.d.ts.map +1 -1
  24. package/components/workflow/services/workflow-settings.service.d.ts +2 -0
  25. package/components/workflow/services/workflow-settings.service.d.ts.map +1 -1
  26. package/esm2015/app-context/application-context.service.js +2 -1
  27. package/esm2015/classes/base/component-base.js +26 -10
  28. package/esm2015/classes/base/list-base.js +31 -2
  29. package/esm2015/classes/environment-schema.js +4 -4
  30. package/esm2015/classes/form-schema.js +2 -1
  31. package/esm2015/components/common-app-component/app-root-menu/app-root-menu.component.js +2 -2
  32. package/esm2015/components/common-app-component/app-topbar-v1/app-topbar-v1.component.js +24 -18
  33. package/esm2015/components/common-app-component/default-setting-form/default-data-settings.component.js +209 -0
  34. package/esm2015/components/crud/advance-search/advance-search.component.js +24 -21
  35. package/esm2015/components/crud/crud-form/crud-form.component.js +4 -2
  36. package/esm2015/components/datetime-picker/datetime-picker.component.js +7 -4
  37. package/esm2015/components/splash-component/splash-component-v1/splash-component-v1.component.js +2 -2
  38. package/esm2015/components/workflow/services/workflow-settings.service.js +6 -1
  39. package/esm2015/services/environment.service.js +26 -7
  40. package/esm2015/tnx-shared.js +89 -88
  41. package/esm2015/tnx-shared.module.js +3 -1
  42. package/fesm2015/tnx-shared.js +350 -63
  43. package/fesm2015/tnx-shared.js.map +1 -1
  44. package/package.json +2 -2
  45. package/services/environment.service.d.ts +19 -4
  46. package/services/environment.service.d.ts.map +1 -1
  47. package/tnx-shared.d.ts +88 -87
  48. package/tnx-shared.d.ts.map +1 -1
  49. package/tnx-shared.metadata.json +1 -1
  50. package/tnx-shared.module.d.ts +2 -1
  51. package/tnx-shared.module.d.ts.map +1 -1
  52. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
@@ -4,6 +4,7 @@ import { Router } from '@angular/router';
4
4
  import { TranslateService } from '@ngx-translate/core';
5
5
  import { ComponentContextService } from '../../../app-context/component-context.service';
6
6
  import { ComponentBase } from '../../../classes/base/component-base';
7
+ import { DialogModel, PopupSize } from '../../../classes/form-schema';
7
8
  import { ComCtxConstants } from '../../../configs/component-context.constant';
8
9
  import { AuthenService } from '../../../services/authen.service';
9
10
  import { CommonService } from '../../../services/common.service';
@@ -39,6 +40,14 @@ export class AppTopBarV1Component extends ComponentBase {
39
40
  this.isFirstTime = false;
40
41
  this.showSettings = false;
41
42
  this.allSubscriptions = [];
43
+ this.appDefaultSettings = [];
44
+ this.defaultSettingModel = new DialogModel({
45
+ header: 'Cấu hình phân hệ',
46
+ popupSize: new PopupSize({ width: 700, height: 350 }),
47
+ data: {
48
+ text: 'Thiết lập tham số mặc định'
49
+ }
50
+ });
42
51
  this.message = '';
43
52
  this.defaultAvatar = this._environmentService.getDefaultMaleAvatar();
44
53
  this.config.isProduction = this._environmentService.getIsProduction();
@@ -46,7 +55,10 @@ export class AppTopBarV1Component extends ComponentBase {
46
55
  this.config.logo = this._environmentService.getLogo();
47
56
  this.config.owner = this._environmentService.getOwner();
48
57
  this.fileApi = this._environmentService.getHttpServiceEndpoint('file');
49
- if (this.rootContext.data.currentAppMetadata && this.rootContext.data.currentAppMetadata.showDefaultSetting != null && this.rootContext.data.currentAppMetadata.showDefaultSetting != undefined) {
58
+ this.appDefaultSettings = this._environmentService.getConfigDefaultSetting();
59
+ if (this.rootContext.data.currentAppMetadata
60
+ && this.rootContext.data.currentAppMetadata.showDefaultSetting != null
61
+ && this.rootContext.data.currentAppMetadata.showDefaultSetting != undefined) {
50
62
  this.showDefaultSetting = this.rootContext.data.currentAppMetadata.showDefaultSetting;
51
63
  }
52
64
  else {
@@ -55,13 +67,13 @@ export class AppTopBarV1Component extends ComponentBase {
55
67
  if (!this.rootContext.data.currentUser) {
56
68
  this.rootContext.data.currentUser = {};
57
69
  }
58
- // this.allSubscriptions.push(this.rootContext.subscribe(ComCtxConstants.ROOT.USER_INFO_CHANGED, rs => {
59
- // this._cd.detectChanges();
60
- // }));
61
70
  this.rootContext.replaySubscribeOnce(ComCtxConstants.ROOT.USER_LOADED, rs => {
62
71
  this.currentUser = this._userService.getCurrentUser();
63
72
  this.loadMenuMetadata();
64
73
  });
74
+ this.rootContext.subscribe(ComCtxConstants.ROOT_USMART.SHOW_CONFIG_DATA_DEFAULT, rs => {
75
+ this.showDefaultSettingForm();
76
+ });
65
77
  if (this.rootModel.allowAnonymous) {
66
78
  this.loadMenuMetadata();
67
79
  }
@@ -148,9 +160,6 @@ export class AppTopBarV1Component extends ComponentBase {
148
160
  const dataCacheDefault = JSON.parse(stringDataDefault);
149
161
  this.formatDefaultDataSetting(dataCacheDefault);
150
162
  }
151
- else {
152
- this.defaultDataSetting = 'Thiết lập tham số mặc định';
153
- }
154
163
  }
155
164
  ngOnDestroy() {
156
165
  this.allSubscriptions.forEach(element => {
@@ -163,8 +172,8 @@ export class AppTopBarV1Component extends ComponentBase {
163
172
  }
164
173
  formatDefaultDataSetting(data) {
165
174
  let dataSetting = '';
166
- const fields = ['instanceIdHeDaoTao', 'heDaoTao', 'namHoc', 'hocKy', 'instanceIdNamHoc', 'instanceIdHocKy', 'idDotThi'];
167
- const fieldPluses = ['code', 'code', 'ten', 'ten', 'ten', 'ten', 'ten'];
175
+ const fields = ['idHe', 'namHoc', 'idHocKy', 'idDotThi'];
176
+ const fieldPluses = ['code', 'ten', 'ten', 'ten'];
168
177
  fields.forEach((field, index) => {
169
178
  if (!this.checkHidden(field)) {
170
179
  const _f = `${field}${fieldPluses[index]}`;
@@ -176,10 +185,10 @@ export class AppTopBarV1Component extends ComponentBase {
176
185
  if (dataSetting.length > 0) {
177
186
  dataSetting = dataSetting.substring(0, dataSetting.length - 1);
178
187
  }
179
- this.defaultDataSetting = dataSetting;
188
+ this.defaultSettingModel.data.text = dataSetting;
180
189
  }
181
190
  checkHidden(field) {
182
- return this.rootModel.currentAppMetadata.configDefaultSetting && !this.rootModel.currentAppMetadata.configDefaultSetting.column.some(p => p.field == field);
191
+ return this.appDefaultSettings.some(p => p.field == field);
183
192
  }
184
193
  getCurrentUserFullName() {
185
194
  return this.rootContext.data.currentUser && this.rootContext.data.currentUser.fullName ? this.rootContext.data.currentUser.fullName : 'Khách';
@@ -315,11 +324,8 @@ export class AppTopBarV1Component extends ComponentBase {
315
324
  }
316
325
  this._authenService.logout();
317
326
  }
318
- settingDefault() {
319
- this.model.dataModelSetting = {
320
- data: {},
321
- showSettings: true
322
- };
327
+ showDefaultSettingForm() {
328
+ this.defaultSettingModel.showEditForm = true;
323
329
  }
324
330
  onShowSettings(ev) {
325
331
  this.rootContext.fireEvent(ComCtxConstants.ROOT_USMART.CONFIG_DATA_DEFAULT_OPENED);
@@ -386,7 +392,7 @@ export class AppTopBarV1Component extends ComponentBase {
386
392
  AppTopBarV1Component.decorators = [
387
393
  { type: Component, args: [{
388
394
  selector: 'app-topbar-v1',
389
- template: "<div class=\"topbar clearfix tn-l-top-bar\">\n <div class=\"topbar-left tn-l-top-bar-left\" [ngClass]=\"{'beta-version': !config.isProduction }\">\n <div class=\"tn-l-left-menu-toggle-block\">\n <a tabindex=\"1\" id=\"menu-button\" class=\"tn-l-left-menu-toggle\" href=\"#\"\n (click)=\"_commonService.onMenuButtonClick($event)\">\n <i class=\"pi pi-chevron-left\"></i>\n </a>\n </div>\n\n <div class=\"topbar-logo tn-l-logo-wrapper\">\n <a tabindex=\"2\" href=\"javascript:\" style=\"display: inline-block;\">\n <img class=\"topbar-logo tn-l-logo\" [src]=\"config.logo\" (click)=\"goToHome()\" /></a>\n </div>\n <div class=\"topbar-title tn-l-logo-title-block\">\n <div class=\"topbar-owner\">\n {{config.owner}}\n </div>\n <div class=\"topbar-description\">\n {{config.title}}\n </div>\n </div>\n </div>\n <div class=\"setting-default-container\">\n <ng-container *ngIf=\"showDefaultSetting && currentUser\">\n <a tabindex=\"3\" href=\"javascript:void(0)\" class=\"tn-l-m-default-setting pi pi-cog\"\n (click)=\"settingDefault()\">\n </a>\n <h3 class=\"tn-l-default-detting\" (click)=\"settingDefault()\">\n {{defaultDataSetting}} <i class=\"pi pi-pencil\" style=\"margin-left:10px\"></i></h3>\n </ng-container>\n </div>\n <div #notify class=\"notify-message\">\n <marquee (mouseover)=\"handleMouseOver($event)\" (mouseout)=\"handleMouseOut($event)\">{{message}}</marquee>\n </div>\n <div class=\"topbar-right tn-l-top-bar-right\" [ngClass]=\"{'beta-version': !config.isProduction}\"\n oncontextmenu=\"return false\">\n <div class=\"tn-l-top-bar-right-block-1\">\n <a tabindex=\"4\" class=\"topbar-menu-button\" id=\"topbar-menu-button\" href=\"#\"\n (click)=\"_commonService.onTopbarMenuButtonClick($event)\">\n <svg focusable=\"false\" class=\"tn-m-topbar-menu-toggle\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M0 224h192V32H0v192zm256-192v192h192V32H256zM0 480h192V288H0v192zm256-192v192h192V288H256z\">\n </path>\n </svg>\n <span *ngIf=\"messages && messages.totalUnRead > 0\" class=\"topbar-badge animated rubberBand\"\n [ngClass]=\"{'topbar-badge-bounce': messages.bounceNoti}\">{{messages.totalUnRead}}</span>\n </a>\n </div>\n\n <div class=\"tn-l-top-bar-right-block-2\">\n <ul class=\"topbar-items fadeInDown\" [ngClass]=\"{'topbar-items-visible': _commonService.topbarMenuActive}\">\n <li *ngIf=\"_commonService.profileMode==='top'||_commonService.isHorizontal()\" #profile\n class=\"profile-item tn-l-top-bar-menu-item\"\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === profile}\">\n\n <a href=\"#\" tabindex=\"10\" class=\"UserPane tn-l-top-bar-menu-item-inner\"\n (click)=\"_commonService.onTopbarItemClick($event,profile)\">\n <div class=\"profile-image-wrapper topbar-icon-left\">\n <img class=\"profile-image tn-l-profile-img\" [src-fallback]=\"defaultAvatar\"\n [src]=\"getCurrentUserAvatar()\" />\n </div>\n <div class=\"profile-info-wrapper\">\n <div class=\"topbar-item-name-wrapper\"\n [ngClass]=\"{'not-show-position': !getCurrentUserPosition()}\">\n <span class=\"topbar-item-name tn-l-user-name\">{{getCurrentUserFullName()}}</span>\n </div>\n <div class=\"topbar-item-role-wrapper tn-l-topbar-item-role-wrapper\"><span\n class=\"topbar-item-role\">{{getCurrentUserPosition()}}</span></div>\n </div>\n <i class=\"pi pi-user\" style=\"opacity: 0; position: absolute;\"></i>\n </a>\n\n <ul class=\"layout-menu fadeInDown tn-l-switcher\">\n <ng-container *ngIf=\"currentUser\">\n <li role=\"menuitem\">\n <a href=\"#\" (click)=\"onEditInfo($event)\">\n <i class=\"pi pi-inbox\"></i>\n <span>Th\u01B0 m\u1EE5c c\u00E1 nh\u00E2n</span>\n </a>\n </li>\n <li role=\"menuitem\">\n <a href=\"#\" (click)=\"onEditInfo($event)\">\n <i class=\"pi pi-user-edit\"></i>\n <span>C\u1EADp nh\u1EADt th\u00F4ng tin</span>\n </a>\n </li>\n <li role=\"menuitem\">\n <a href=\"javascript:;\" (click)=\"onTopbarLogout()\">\n <i class=\"pi pi-sign-out\"></i>\n <span>\u0110\u0103ng xu\u1EA5t</span>\n </a>\n </li>\n </ng-container>\n <li *ngIf=\"!currentUser\" role=\"menuitem\">\n <a href=\"javascript:;\" (click)=\"login()\">\n <i class=\"pi pi-sign-in\"></i>\n <span>\u0110\u0103ng nh\u1EADp</span>\n </a>\n </li>\n </ul>\n </li>\n <li *ngIf=\"_customizeUiService.isShowHelp()\" #help class=\"menu-help tn-l-top-bar-menu-item\" tn-app-help>\n </li>\n <li *ngIf=\"_customizeUiService.isShowNotification()\" id=\"li-notifications\"\n class=\"tn-l-top-bar-menu-item\" #messages\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === messages || _commonService.activeTopbarItem === 0}\"\n tn-app-notification (openMenu)=\"_commonService.onTopbarItemClick($event,messages)\"></li>\n <li id=\"li-app-switcher\" class=\"tn-l-top-bar-menu-item\" #modules\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === modules || _commonService.activeTopbarItem === 1}\">\n <a href=\"#\" tabindex=\"7\" class=\"tn-l-top-bar-menu-item-inner\" style=\"height: 30px;\"\n pTooltip=\"Danh s\u00E1ch ph\u00E2n h\u1EC7\" tooltipPosition=\"bottom\"\n (click)=\"_commonService.onTopbarItemClick($event,modules)\">\n <span class=\"topbar-icon-left tn-l-topbar-icon-left\">\n <svg focusable=\"false\" class=\"topbar-icon animated swing svgmodule\" role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M0 224h192V32H0v192zm256-192v192h192V32H256zM0 480h192V288H0v192zm256-192v192h192V288H256z\">\n </path>\n </svg>\n <!-- <i class=\"pi pi-microsoft\"></i> -->\n </span>\n <span class=\"topbar-item-name\">{{ 'Danh s\u00E1ch ph\u00E2n h\u1EC7' | translate}}</span>\n </a>\n <ul class=\"app-switcher layout-menu fadeInDown\">\n <tn-custom-scrollbar #scrollbar class=\"app-switcher-holder\">\n <li role=\"menuitem\" class=\"wrapper-appswitch\">\n <ng-container *ngFor=\"let item of appSwitcherItems; let ind = index;\">\n <a class=\"switcher-item tn-l-switcher-item\" href=\"javascript:\"\n (click)=\"switchApp(item, true)\">\n <span class=\"tn-l-switcher-item-inner\">\n <i class=\"{{item.icon}} app-switcher-item-icon tn-l-switcher-item-icon\"></i>\n <div class=\"tn-l-switcher-item-label\">\n {{ item.title | translate}}\n </div>\n </span>\n </a>\n </ng-container>\n </li>\n </tn-custom-scrollbar>\n </ul>\n </li>\n </ul>\n </div>\n </div>\n</div>",
395
+ template: "<div class=\"topbar clearfix tn-l-top-bar\">\n <div class=\"topbar-left tn-l-top-bar-left\" [ngClass]=\"{'beta-version': !config.isProduction }\">\n <div class=\"tn-l-left-menu-toggle-block\">\n <a tabindex=\"1\" id=\"menu-button\" class=\"tn-l-left-menu-toggle\" href=\"#\"\n (click)=\"_commonService.onMenuButtonClick($event)\">\n <i class=\"pi pi-chevron-left\"></i>\n </a>\n </div>\n\n <div class=\"topbar-logo tn-l-logo-wrapper\">\n <a tabindex=\"2\" href=\"javascript:\" style=\"display: inline-block;\">\n <img class=\"topbar-logo tn-l-logo\" [src]=\"config.logo\" (click)=\"goToHome()\" /></a>\n </div>\n <div class=\"topbar-title tn-l-logo-title-block\">\n <div class=\"topbar-owner\">\n {{config.owner}}\n </div>\n <div class=\"topbar-description\">\n {{config.title}}\n </div>\n </div>\n </div>\n <div class=\"setting-default-container\">\n <ng-container *ngIf=\"showDefaultSetting && currentUser\">\n <a tabindex=\"3\" href=\"javascript:void(0)\" class=\"tn-l-m-default-setting pi pi-cog\"\n (click)=\"showDefaultSettingForm()\">\n </a>\n <h3 class=\"tn-l-default-detting\" (click)=\"showDefaultSettingForm()\">\n {{defaultSettingModel.data.text}} <i class=\"pi pi-pencil\" style=\"margin-left:10px\"></i></h3>\n </ng-container>\n </div>\n <div #notify class=\"notify-message\">\n <marquee (mouseover)=\"handleMouseOver($event)\" (mouseout)=\"handleMouseOut($event)\">{{message}}</marquee>\n </div>\n <div class=\"topbar-right tn-l-top-bar-right\" [ngClass]=\"{'beta-version': !config.isProduction}\"\n oncontextmenu=\"return false\">\n <div class=\"tn-l-top-bar-right-block-1\">\n <a tabindex=\"4\" class=\"topbar-menu-button\" id=\"topbar-menu-button\" href=\"#\"\n (click)=\"_commonService.onTopbarMenuButtonClick($event)\">\n <svg focusable=\"false\" class=\"tn-m-topbar-menu-toggle\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M0 224h192V32H0v192zm256-192v192h192V32H256zM0 480h192V288H0v192zm256-192v192h192V288H256z\">\n </path>\n </svg>\n <span *ngIf=\"messages && messages.totalUnRead > 0\" class=\"topbar-badge animated rubberBand\"\n [ngClass]=\"{'topbar-badge-bounce': messages.bounceNoti}\">{{messages.totalUnRead}}</span>\n </a>\n </div>\n\n <div class=\"tn-l-top-bar-right-block-2\">\n <ul class=\"topbar-items fadeInDown\" [ngClass]=\"{'topbar-items-visible': _commonService.topbarMenuActive}\">\n <li *ngIf=\"_commonService.profileMode==='top'||_commonService.isHorizontal()\" #profile\n class=\"profile-item tn-l-top-bar-menu-item\"\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === profile}\">\n\n <a href=\"#\" tabindex=\"10\" class=\"UserPane tn-l-top-bar-menu-item-inner\"\n (click)=\"_commonService.onTopbarItemClick($event,profile)\">\n <div class=\"profile-image-wrapper topbar-icon-left\">\n <img class=\"profile-image tn-l-profile-img\" [src-fallback]=\"defaultAvatar\"\n [src]=\"getCurrentUserAvatar()\" />\n </div>\n <div class=\"profile-info-wrapper\">\n <div class=\"topbar-item-name-wrapper\"\n [ngClass]=\"{'not-show-position': !getCurrentUserPosition()}\">\n <span class=\"topbar-item-name tn-l-user-name\">{{getCurrentUserFullName()}}</span>\n </div>\n <div class=\"topbar-item-role-wrapper tn-l-topbar-item-role-wrapper\"><span\n class=\"topbar-item-role\">{{getCurrentUserPosition()}}</span></div>\n </div>\n <i class=\"pi pi-user\" style=\"opacity: 0; position: absolute;\"></i>\n </a>\n\n <ul class=\"layout-menu fadeInDown tn-l-switcher\">\n <ng-container *ngIf=\"currentUser\">\n <li role=\"menuitem\">\n <a href=\"#\" (click)=\"onEditInfo($event)\">\n <i class=\"pi pi-inbox\"></i>\n <span>Th\u01B0 m\u1EE5c c\u00E1 nh\u00E2n</span>\n </a>\n </li>\n <li role=\"menuitem\">\n <a href=\"#\" (click)=\"onEditInfo($event)\">\n <i class=\"pi pi-user-edit\"></i>\n <span>C\u1EADp nh\u1EADt th\u00F4ng tin</span>\n </a>\n </li>\n <li role=\"menuitem\">\n <a href=\"javascript:;\" (click)=\"onTopbarLogout()\">\n <i class=\"pi pi-sign-out\"></i>\n <span>\u0110\u0103ng xu\u1EA5t</span>\n </a>\n </li>\n </ng-container>\n <li *ngIf=\"!currentUser\" role=\"menuitem\">\n <a href=\"javascript:;\" (click)=\"login()\">\n <i class=\"pi pi-sign-in\"></i>\n <span>\u0110\u0103ng nh\u1EADp</span>\n </a>\n </li>\n </ul>\n </li>\n <li *ngIf=\"_customizeUiService.isShowHelp()\" #help class=\"menu-help tn-l-top-bar-menu-item\" tn-app-help>\n </li>\n <li *ngIf=\"_customizeUiService.isShowNotification()\" id=\"li-notifications\"\n class=\"tn-l-top-bar-menu-item\" #messages\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === messages || _commonService.activeTopbarItem === 0}\"\n tn-app-notification (openMenu)=\"_commonService.onTopbarItemClick($event,messages)\"></li>\n <li id=\"li-app-switcher\" class=\"tn-l-top-bar-menu-item\" #modules\n [ngClass]=\"{'active-top-menu':_commonService.activeTopbarItem === modules || _commonService.activeTopbarItem === 1}\">\n <a href=\"#\" tabindex=\"7\" class=\"tn-l-top-bar-menu-item-inner\" style=\"height: 30px;\"\n pTooltip=\"Danh s\u00E1ch ph\u00E2n h\u1EC7\" tooltipPosition=\"bottom\"\n (click)=\"_commonService.onTopbarItemClick($event,modules)\">\n <span class=\"topbar-icon-left tn-l-topbar-icon-left\">\n <svg focusable=\"false\" class=\"topbar-icon animated swing svgmodule\" role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M0 224h192V32H0v192zm256-192v192h192V32H256zM0 480h192V288H0v192zm256-192v192h192V288H256z\">\n </path>\n </svg>\n <!-- <i class=\"pi pi-microsoft\"></i> -->\n </span>\n <span class=\"topbar-item-name\">{{ 'Danh s\u00E1ch ph\u00E2n h\u1EC7' | translate}}</span>\n </a>\n <ul class=\"app-switcher layout-menu fadeInDown\">\n <tn-custom-scrollbar #scrollbar class=\"app-switcher-holder\">\n <li role=\"menuitem\" class=\"wrapper-appswitch\">\n <ng-container *ngFor=\"let item of appSwitcherItems; let ind = index;\">\n <a class=\"switcher-item tn-l-switcher-item\" href=\"javascript:\"\n (click)=\"switchApp(item, true)\">\n <span class=\"tn-l-switcher-item-inner\">\n <i class=\"{{item.icon}} app-switcher-item-icon tn-l-switcher-item-icon\"></i>\n <div class=\"tn-l-switcher-item-label\">\n {{ item.title | translate}}\n </div>\n </span>\n </a>\n </ng-container>\n </li>\n </tn-custom-scrollbar>\n </ul>\n </li>\n </ul>\n </div>\n </div>\n</div>\n\n<tn-dialog *ngIf=\"defaultSettingModel.showEditForm\" [header]=\"defaultSettingModel.header | translate\"\n [popupSize]=\"defaultSettingModel.popupSize\" (onHide)=\"defaultSettingModel.showEditForm = false\">\n <default-data-settings #formBase (onHide)=\"defaultSettingModel.showEditForm = false;\"></default-data-settings>\n</tn-dialog>",
390
396
  providers: [ComponentContextService],
391
397
  styles: [".topBarSearchButton:disabled{background-color:#eee!important;border:1px solid #c8c8c8!important;border-right:none!important;color:#c1c1c1!important;opacity:1}::ng-deep app-topbar a{outline:none}input:disabled::-moz-placeholder{color:#b1b1b1}input:disabled:-ms-input-placeholder{color:#b1b1b1}input:disabled::placeholder{color:#b1b1b1}.UserPane.UserPane{display:flex}.profile-image-wrapper{order:1}.tn-l-user-name.tn-l-user-name.tn-l-user-name.tn-l-user-name.tn-l-user-name{float:none;margin-top:0}.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper{display:inline-flex;flex-direction:column;float:none;justify-content:center;order:0;text-align:right}.tn-l-logo{image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges}.tn-l-default-detting{color:#fff;cursor:pointer;margin:0}.tn-l-left-menu-toggle-block{-ms-grid-row-align:stretch;align-items:center;align-self:stretch;box-shadow:0 0 5px 0 rgba(0,0,0,.3764705882352941);display:flex}.tn-l-left-menu-toggle{color:#fff;padding:8px;transition:transform .25s ease-in-out}::ng-deep .layout-menu-static-inactive app-topbar .tn-l-left-menu-toggle{transform:rotate(180deg)}.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block{margin-left:0;margin-right:30px}.topbar-logo.topbar-logo.topbar-logo{float:none}.tn-l-logo.tn-l-logo.tn-l-logo.tn-l-logo{height:40px;margin:0;width:auto}.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper{font-size:0;height:auto;margin:0;padding-left:8px;padding-right:8px;width:auto}.tn-l-top-bar{display:flex}.topbar-description,.topbar-owner{white-space:nowrap}.topbar-owner.topbar-owner.topbar-owner.topbar-owner.topbar-owner{font-size:15px}.topbar-description.topbar-description.topbar-description.topbar-description.topbar-description{font-size:11px;text-transform:none}.tn-l-top-bar-left.tn-l-top-bar-left.tn-l-top-bar-left{display:flex;float:none;width:auto}.tn-l-top-bar-left{align-items:center}.tn-m-topbar-menu-toggle{display:block;height:28px;margin:auto;width:30px}.tn-m-topbar-menu-toggle g{stroke:#fff}.tn-m-topbar-menu-toggle path{fill:#fff}.tn-l-m-default-setting{display:none}.setting-default-container{justify-content:center}.notify-message,.setting-default-container{align-items:center;display:flex;margin-left:30px}.notify-message{flex:1 1;overflow:hidden}.notify-message>marquee{color:#ff0;font-size:500;white-space:nowrap}.search-item{margin-right:10px}.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item{background:#fff}.tn-l-switcher-item-label{color:#52abff;text-align:center;text-shadow:none}.tn-l-switcher-item-icon.tn-l-switcher-item-icon.tn-l-switcher-item-icon.tn-l-switcher-item-icon{color:#52abff;font-size:38px;margin:5px auto;text-shadow:none}.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item.tn-l-switcher-item{padding:8px}.tn-l-switcher.tn-l-switcher{margin-bottom:0}::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a.switcher-item{margin-top:0;width:unset}::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a.switcher-item:nth-child(3n+0){border-left:none}::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a.switcher-item:nth-child(3n+1){border-right:none}::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a.switcher-item:nth-child(3n+2){border:none}::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a.switcher-item:nth-child(3n+1):last-child,::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a.switcher-item:nth-child(3n+2):last-child{width:unset}::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a span{line-height:1.2}::ng-deep .layout-wrapper app-topbar-v1 .topbar .topbar-left{box-shadow:none}::ng-deep .layout-wrapper app-topbar-v1 .wrapper-appswitch{display:-ms-grid;display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));text-align:center}@media (max-width:1024px){::ng-deep .layout-wrapper app-topbar-v1 .layout-menu li a.switcher-item{width:unset}}@media (min-width:1025px){.tn-l-top-bar-right{align-items:center;display:flex;justify-content:space-between}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right{padding:0 15px}.topbar-items.topbar-items.topbar-items{align-items:center;display:flex;flex-direction:row-reverse;justify-content:flex-start;margin:0}.topbar-items.topbar-items.topbar-items,.topbar-items.topbar-items.topbar-items>li{float:none}::ng-deep .topbar .topbar-items>li>a{margin-top:0}::ng-deep .topbar .topbar-items>li>a>span>i{color:#fff;font-size:24px}.topbar .topbar-items>li>a.UserPane{height:auto;line-height:inherit;top:0}a.UserPane .profile-image.profile-image.profile-image.profile-image{margin-top:0}}@media (min-width:1025px) and (max-width:1400px){.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block.tn-l-logo-title-block{margin-right:19px}.search-item{margin-right:0}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right{padding-left:15px}.topbar-items>li.profile-item{margin-left:14px}}@media (max-width:1024px){.tn-l-m-default-setting{align-items:center;color:#fff;display:flex;font-size:28px;height:36px;justify-content:center;width:36px}.tn-l-default-detting{display:none}::ng-deep .layout-menu-static-mobile-inactive app-topbar .tn-l-left-menu-toggle{transform:rotate(180deg)}.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper.profile-info-wrapper{text-align:left}.topbar .topbar-right #topbar-menu-button{align-items:center;display:flex;justify-content:center;width:36px}.tn-l-top-bar-right-block-1{display:flex}.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper.tn-l-logo-wrapper{padding-left:5px;padding-right:5px}.tn-l-logo-title-block,.tn-l-top-bar-left,.topbar-description,.topbar-owner{overflow:hidden}.topbar-description,.topbar-owner{text-overflow:ellipsis}.tn-l-top-bar-menu-item:empty{display:none}.tn-l-top-bar-left.tn-l-top-bar-left.tn-l-top-bar-left{padding-left:0;padding-right:0}.topbar-title.topbar-title.topbar-title.topbar-title{margin:0}.topbar-owner.topbar-owner.topbar-owner.topbar-owner.topbar-owner{font-size:14px}.topbar-description.topbar-description.topbar-description.topbar-description.topbar-description{font-size:10px}.tn-l-top-bar-right{flex:1;position:relative}.topbar-menu-button span.topbar-badge{right:-4px}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right{align-items:center;display:flex;justify-content:flex-end;padding:0 .5em}.tn-l-top-bar-right.tn-l-top-bar-right.tn-l-top-bar-right #topbar-menu-button{margin-left:.5em;position:relative;right:0;top:0}.app-switcher.layout-menu.layout-menu.layout-menu.layout-menu{width:270px}.profile-image-wrapper{order:0}.tn-l-user-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:220px}::ng-deep app-topbar .tn-l-top-bar-menu-item .topbar-icon-left{align-items:center;display:flex;justify-content:center}.tn-l-topbar-item-role-wrapper{display:none}}"]
392
398
  },] }
@@ -410,4 +416,4 @@ AppTopBarV1Component.propDecorators = {
410
416
  notify: [{ type: ViewChild, args: ['notify', { static: true },] }],
411
417
  messages: [{ type: ViewChild, args: ['messages', { static: true },] }]
412
418
  };
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvcGJhci12MS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NvbW1vbi1hcHAtY29tcG9uZW50L2FwcC10b3BiYXItdjEvYXBwLXRvcGJhci12MS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVE3RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsYUFBYTtJ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Qjs7O29CQWF0QixTQUFTLFNBQUMsT0FBTztxQkFDakIsU0FBUyxTQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7dUJBQ3BDLFNBQVMsU0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBwLWNvbnRleHQvY29tcG9uZW50LWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRleHQuY29uc3RhbnQnO1xuaW1wb3J0IHsgVG5Vc2VyIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RuLXVzZXInO1xuaW1wb3J0IHsgQXV0aGVuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGhlbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb21tb24uc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21Sb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3VzdG9tLXJvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEN1c3RvbWl6ZVVpU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2N1c3RvbWl6ZS11aS5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3Blcm1pc3Npb24uc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLXRvcGJhci12MScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FwcC10b3BiYXItdjEuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2FwcC10b3BiYXItdjEuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9wQmFyVjFDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JykgaW5wdXQ6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnbm90aWZ5JywgeyBzdGF0aWM6IHRydWUgfSkgbm90aWZ5OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ21lc3NhZ2VzJywgeyBzdGF0aWM6IHRydWUgfSkgbWVzc2FnZXM6IGFueTtcblxuICAgIGRlZmF1bHRBdmF0YXIgPSAnJztcbiAgICBjb25maWc6IGFueSA9IHt9O1xuICAgIHNob3dEZWZhdWx0U2V0dGluZzogYW55O1xuICAgIGtleSA9ICcnO1xuXG4gICAgY3VycmVudFJvdXRlID0gJyc7XG4gICAgZmlsZUFwaSA9ICcnO1xuXG4gICAgY3VycmVudFVzZXI6IGFueSA9IG51bGw7XG4gICAgYXBwU3dpdGNoZXJJdGVtczogYW55ID0gW107XG4gICAgaXNGaXJzdFRpbWUgPSBmYWxzZTtcblxuICAgIHNlYXJjaERhdGE7XG4gICAgc2hvd1NldHRpbmdzID0gZmFsc2U7XG4gICAgYWxsU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgICBkZWZhdWx0RGF0YVNldHRpbmc6IHN0cmluZztcbiAgICB1c2VyUHJvZmlsZTogYW55O1xuXG4gICAgbWVzc2FnZTogc3RyaW5nID0gJyc7XG4gICAgaW50ZXJ2YWxDb3VudGRvd246IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAvLyBwdWJsaWMgYXBwOiBBcHBDb21wb25lbnQsXG4gICAgICAgIHByaXZhdGUgX2N1c3RvbVJvdXRlU2VydmljZTogQ3VzdG9tUm91dGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHB1YmxpYyBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfYXV0aGVuU2VydmljZTogQXV0aGVuU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgX3Blcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBfY3VzdG9taXplVWlTZXJ2aWNlOiBDdXN0b21pemVVaVNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXZhdGFyID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldERlZmF1bHRNYWxlQXZhdGFyKCk7XG4gICAgICAgIHRoaXMuY29uZmlnLmlzUHJvZHVjdGlvbiA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRJc1Byb2R1Y3Rpb24oKTtcbiAgICAgICAgdGhpcy5jb25maWcudGl0bGUgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0VGl0bGUoKTtcbiAgICAgICAgdGhpcy5jb25maWcubG9nbyA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRMb2dvKCk7XG4gICAgICAgIHRoaXMuY29uZmlnLm93bmVyID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldE93bmVyKCk7XG4gICAgICAgIHRoaXMuZmlsZUFwaSA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRIdHRwU2VydmljZUVuZHBvaW50KCdmaWxlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGEgJiYgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YS5zaG93RGVmYXVsdFNldHRpbmcgIT0gbnVsbCAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLnNob3dEZWZhdWx0U2V0dGluZyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0RlZmF1bHRTZXR0aW5nID0gdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YS5zaG93RGVmYXVsdFNldHRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEZWZhdWx0U2V0dGluZyA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRTaG93RGVmYXVsdFNldHRpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlcikge1xuICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRVc2VyID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLmFsbFN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX0lORk9fQ0hBTkdFRCwgcnMgPT4ge1xuICAgICAgICAvLyAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAvLyB9KSk7XG5cbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5yZXBsYXlTdWJzY3JpYmVPbmNlKENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfTE9BREVELCBycyA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKSBhcyBUblVzZXI7XG4gICAgICAgICAgICB0aGlzLmxvYWRNZW51TWV0YWRhdGEoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucm9vdE1vZGVsLmFsbG93QW5vbnltb3VzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRNZW51TWV0YWRhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRNZW51TWV0YWRhdGEoKSB7XG4gICAgICAgIGNvbnN0IHBybXNBcHBTd2ljaGVySXRlbSA9IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbHN0QXBwID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldExpc3RBcHAoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaW5kIGluIGxzdEFwcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBsc3RBcHBbaW5kXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290Q29udGV4dC5kYXRhLmFsbG93QW5vbnltb3VzICYmIGVsZW1lbnQuYWxsb3dBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBdXRob3JpemVkID0gYXdhaXQgdGhpcy5fcGVybWlzc2lvblNlcnZpY2UuaXNBdXRob3JpemVkKGVsZW1lbnQuY29kZSwgYCR7ZWxlbWVudC5jb2RlfS5NT0RVTEUuJHtlbGVtZW50LmNvZGV9YC50b1VwcGVyQ2FzZSgpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoYXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJtc0FwcFN3aWNoZXJJdGVtLnRoZW4ocnMgPT4ge1xuICAgICAgICAgICAgaWYgKHJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFVzZXIgPSB0aGlzLl91c2VyU2VydmljZS5nZXRDdXJyZW50VXNlcigpIGFzIFRuVXNlcjtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFN3aXRjaGVySXRlbXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAoPGFueT5ycykuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYWxsb3dBbm9ueW1vdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcFN3aXRjaGVySXRlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VXNlci5tYU5ndW9pSG9jICYmIGN1cnJlbnRVc2VyLmlzc3VwZXJ1c2VyICYmIGN1cnJlbnRVc2VyLmlzc3VwZXJ1c2VyLnRvTG93ZXJDYXNlKCkgIT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNvZGUudG9Mb3dlckNhc2UoKSA9PSAnc3YnIHx8IGVsZW1lbnQuY29kZS50b0xvd2VyQ2FzZSgpID09ICd1c2VyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBTd2l0Y2hlckl0ZW1zLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwU3dpdGNoZXJJdGVtcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlci5nZW5kZXIgPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEF2YXRhciA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXREZWZhdWx0RmVtYWxlQXZhdGFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRBdmF0YXIgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RGVmYXVsdE1hbGVBdmF0YXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51c2VyUHJvZmlsZSA9IHRoaXMuX3VzZXJTZXJ2aWNlLmdldFByb2ZpbGVJbmZvKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQk9EWV9NT1VTRV9ET1dOLCAoZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmhpZGVBZHZhbmNlU2VhcmNoKGUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuS0VZX0RPV05fQ1RSTF9GLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c1RvU2VhcmNoQm94KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuQ09NTU9OLkZPUkNFX1JFTE9BRCwgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvblJlbG9hZCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5TSE9XX05PVElGWSwgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Tm90aWZ5KGUubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFsbFN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVF9VU01BUlQuU0hPV19DT05GSUdfREFUQV9ERUZBVUxULCBlID0+IHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YU1vZGVsU2V0dGluZy5zaG93U2V0dGluZ3MgPSB0cnVlO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMubW9kZWwuZGF0YU1vZGVsU2V0dGluZyA9IHtcbiAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgc2hvd1NldHRpbmdzOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuQ09NTU9OLlNBVkVfREFUQV9ERUZBVUxULCBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0RGVmYXVsdERhdGFTZXR0aW5nKGRhdGEpO1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRXaW5kb3coKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHN0cmluZ0RhdGFEZWZhdWx0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuREVGQVVMVF9EQVRBKTtcbiAgICAgICAgaWYgKHN0cmluZ0RhdGFEZWZhdWx0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhQ2FjaGVEZWZhdWx0ID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdERlZmF1bHREYXRhU2V0dGluZyhkYXRhQ2FjaGVEZWZhdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdERhdGFTZXR0aW5nID0gJ1RoaeG6v3QgbOG6rXAgdGhhbSBz4buRIG3hurdjIMSR4buLbmgnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWxsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbENvdW50ZG93bik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBmb3JtYXREZWZhdWx0RGF0YVNldHRpbmcoZGF0YSkge1xuICAgICAgICBsZXQgZGF0YVNldHRpbmcgPSAnJztcbiAgICAgICAgY29uc3QgZmllbGRzID0gWydpbnN0YW5jZUlkSGVEYW9UYW8nLCAnaGVEYW9UYW8nLCAnbmFtSG9jJywgJ2hvY0t5JywgJ2luc3RhbmNlSWROYW1Ib2MnLCAnaW5zdGFuY2VJZEhvY0t5JywgJ2lkRG90VGhpJ107XG4gICAgICAgIGNvbnN0IGZpZWxkUGx1c2VzID0gWydjb2RlJywgJ2NvZGUnLCAndGVuJywgJ3RlbicsICd0ZW4nLCAndGVuJywgJ3RlbiddO1xuICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tIaWRkZW4oZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2YgPSBgJHtmaWVsZH0ke2ZpZWxkUGx1c2VzW2luZGV4XX1gO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhW19mXSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU2V0dGluZyArPSBkYXRhW19mXSArICcvJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGF0YVNldHRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGF0YVNldHRpbmcgPSBkYXRhU2V0dGluZy5zdWJzdHJpbmcoMCwgZGF0YVNldHRpbmcubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWZhdWx0RGF0YVNldHRpbmcgPSBkYXRhU2V0dGluZztcbiAgICB9XG5cbiAgICBjaGVja0hpZGRlbihmaWVsZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290TW9kZWwuY3VycmVudEFwcE1ldGFkYXRhLmNvbmZpZ0RlZmF1bHRTZXR0aW5nICYmICF0aGlzLnJvb3RNb2RlbC5jdXJyZW50QXBwTWV0YWRhdGEuY29uZmlnRGVmYXVsdFNldHRpbmcuY29sdW1uLnNvbWUocCA9PiBwLmZpZWxkID09IGZpZWxkKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50VXNlckZ1bGxOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRVc2VyICYmIHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlci5mdWxsTmFtZSA/IHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlci5mdWxsTmFtZSA6ICdLaMOhY2gnO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnRVc2VyUG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXJQcm9maWxlID8gdGhpcy51c2VyUHJvZmlsZS50ZW5Eb25WaSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFVzZXJBdmF0YXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIgJiYgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRVc2VyLmF2YXRhcikge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZmlsZUFwaX0vZmlsZS9wdWJsaWMvJHt0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIuYXZhdGFyfS9Eb3dubG9hZGA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QXZhdGFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJGaWx0ZXIoaW5wdXQpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlYXJjaE1vZGVsW3RoaXMubW9kZWwuZmllbGRLZXldID0gJyc7XG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZVNlcnZpY2UudXBkYXRlRnJhZ21lbnQodGhpcy5tb2RlbC5maWVsZEtleSwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZVNlcnZpY2UudXBkYXRlV2l0aG91dEZpcmVFdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuT05fU0VBUkNILCB0aGlzLm1vZGVsLnNlYXJjaE1vZGVsKTtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b2dnbGVBZHZhbmNlU2VhcmNoKGV2dCkge1xuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5BRFZBTkNFX1NFQVJDSF9UT0dHTEVfQk9YLCB7IGV2ZW50OiBldnQgfSk7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBoaWRlQWR2YW5jZVNlYXJjaChldnQpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZHZhbmNlLXNlYXJjaC1ib3gnKSkge1xuICAgICAgICAgICAgY29uc3QgbWFzazogYW55ID0gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbY2xhc3N+PVwidWktZGlhbG9nLW1hc2tcIl0nKTtcbiAgICAgICAgICAgIGlmICghbWFzay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbG9zZXN0RHJvcGRvd24gPSBldnQudGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bi1hZHZzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3REcm9wZG93biA9PSBudWxsIHx8IGNsb3Nlc3REcm9wZG93bi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5BRFZBTkNFX1NFQVJDSF9ISURFX0JPWCwgeyBldmVudDogZXZ0IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzVG9TZWFyY2hCb3goKSB7XG4gICAgICAgIGlmICghZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKCdkaXZbY2xhc3N+PVwidWktZGlhbG9nLW1hc2tcIl0nKSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblRvcGJhclNlYXJjaENsaWNrKGV2ZW50LCBpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMubW9kZWwuZmllbGRLZXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULk9OX1NFQVJDSCwgdGhpcy5tb2RlbC5zZWFyY2hNb2RlbCk7XG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZVNlcnZpY2UudXBkYXRlRnJhZ21lbnQodGhpcy5tb2RlbC5maWVsZEtleSwgaW5wdXQudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fY3VzdG9tUm91dGVTZXJ2aWNlLnVwZGF0ZVdpdGhvdXRGaXJlRXZlbnQoKTtcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRXNjKGV2ZW50LCBpbnB1dCkge1xuICAgICAgICB0aGlzLmNsZWFyRmlsdGVyKGlucHV0KTtcbiAgICB9XG5cbiAgICBvbkVudGVyKGV2ZW50LCBpbnB1dCkge1xuICAgICAgICB0aGlzLm9uVG9wYmFyU2VhcmNoQ2xpY2soZXZlbnQsIGlucHV0KTtcbiAgICB9XG5cbiAgICBzd2l0Y2hBcHAoaXRlbSwgb3Blbk5ld1RhYiA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChpdGVtLnRhcmdldCA9PSAnX2JsYW5rJykge1xuICAgICAgICAgICAgaWYgKCFpdGVtLmRlZmF1bHRSZWRpcmVjdCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uZGVmYXVsdFJlZGlyZWN0ID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5hbU5IIHRpcCB0cmljayBjaG8gbW90IHNvIG1heSBiaSBsb2kgaXRlbS51cmwgPSAnbWFpbicgLT4gcmVkaXJlY3Qgc2FpIGtoaSBjbGljayB2YW8gY2FjIHBoYW4gaGVcbiAgICAgICAgICAgIGlmIChpdGVtLnVybCA9PSBpdGVtLmRlZmF1bHRSZWRpcmVjdCkge1xuICAgICAgICAgICAgICAgIGl0ZW0udXJsID0gJy8nICsgaXRlbS5jb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghb3Blbk5ld1RhYikge1xuICAgICAgICAgICAgICAgIHRvcC5sb2NhdGlvbi5ocmVmID0gYCR7aXRlbS51cmx9LyR7aXRlbS5kZWZhdWx0UmVkaXJlY3R9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGAke2l0ZW0udXJsfS8ke2l0ZW0uZGVmYXVsdFJlZGlyZWN0fWAsICdfYmxhbmsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmRlZmF1bHRSZWRpcmVjdCAhPSAnJyAmJiAhdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLm1lbnVUb3BPcGVubmluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKGl0ZW0uZGVmYXVsdFJlZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldE9iamVjdEFwcChpdGVtLmNvZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGEuc2hvd0RlZmF1bHRTZXR0aW5nICE9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLnNob3dEZWZhdWx0U2V0dGluZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RlZmF1bHRTZXR0aW5nID0gdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YS5zaG93RGVmYXVsdFNldHRpbmcgJiYgdGhpcy5zaG93RGVmYXVsdFNldHRpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzQWR2YW5jZVNlYXJjaEJveCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuc2VhcmNoTW9kZWwuaGFzQWR2YW5jZVNlYXJjaDtcbiAgICB9XG5cbiAgICBpc0FkdmFuY2VTZWFyY2hpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0FkdmFuY2VTZWFyY2hWYWx1ZSh0aGlzLm1vZGVsLnNlYXJjaE1vZGVsKTtcbiAgICB9XG5cbiAgICBoYXNBZHZhbmNlU2VhcmNoVmFsdWUob2JqKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ19rJyB8fCBrZXkgPT09ICdoYXNBZHZhbmNlU2VhcmNoJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9ialtrZXldICE9IG51bGwgJiYgb2JqW2tleV0gIT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRDb21wb25lbnRJZCgpIHtcbiAgICAgICAgcmV0dXJuICdUT1BCQVInO1xuICAgIH1cblxuICAgIGdvVG9Ib21lKCkge1xuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudCgnR09fSE9NRScpO1xuICAgIH1cblxuICAgIG9uRWRpdEluZm8oZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEFwcFNldHRpbmcgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0T2JqZWN0QXBwKCdVU0VSJyk7XG4gICAgICAgIGlmIChjdXJyZW50QXBwU2V0dGluZykge1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hBcHAoY3VycmVudEFwcFNldHRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQuG6oW4gY2jGsGEgdGhp4bq/dCBs4bqtcCBtZXRhZGF0YSBjaG8gdHJhbmcgY8OhIG5ow6JuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNoYW5nZVBhc3N3b3JkKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vIHRoaXMuY2hhbmdlUGFzc3dvcmQuc2hvd1BvcHVwKHRoaXMuX3VzZXJTZXJ2aWNlLmdldElkKCkpO1xuICAgIH1cbiAgICBvblRvcGJhckxvZ291dCgpIHtcbiAgICAgICAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudFVybCcpKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY3VycmVudFVybCcsIHRvcC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hdXRoZW5TZXJ2aWNlLmxvZ291dCgpO1xuICAgIH1cbiAgICBzZXR0aW5nRGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5kYXRhTW9kZWxTZXR0aW5nID0ge1xuICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICBzaG93U2V0dGluZ3M6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG4gICAgb25TaG93U2V0dGluZ3MoZXYpIHtcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1RfVVNNQVJULkNPTkZJR19EQVRBX0RFRkFVTFRfT1BFTkVEKTtcbiAgICB9XG4gICAgb25DbG9zZVNldHRpbmdzKGV2KSB7XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09UX1VTTUFSVC5DT05GSUdfREFUQV9ERUZBVUxUX0NMT1NFRCk7XG4gICAgfVxuXG4gICAgc2hvd1Byb2ZpbGVQYWdlKCkge1xuICAgICAgICBpZiAodGhpcy5fdXNlclNlcnZpY2UuaXNTaW5oVmllbkFjY291bnQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxvZ2luKCkge1xuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudCgnTE9HSU4nKTtcbiAgICB9XG5cbiAgICBzZXROb3RpZnkobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgaGFuZGxlTW91c2VPdmVyKGV2dCkge1xuICAgICAgICBldnQudGFyZ2V0LnN0b3AoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVNb3VzZU91dChldnQpIHtcbiAgICAgICAgZXZ0LnRhcmdldC5zdGFydCgpO1xuICAgIH1cblxuICAgIHNob3dOb3RpZmljYXRpb25SZWxvYWQoKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9ICdI4buHIHRo4buRbmcgY8OzIHBoacOqbiBi4bqjbiBt4bubaSwgaMOjeSByZWZyZXNoIHRyw6xuaCBkdXnhu4d0IMSR4buDIGPhuq1wIG5o4bqtdCc7XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULlNIT1dfUkVKRUNUX0NPTkZJUk0sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlXG4gICAgICAgICkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWRXaW5kb3coKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pIHtcbiAgICAgICAgLy8gICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbENvdW50ZG93bik7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIC8vIGNvbnN0IGdvYWxEYXRlID0gKG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgMTAgKiAxMDAwKSkuZ2V0VGltZSgpOyAvLyDEkOG6v20gMTBzXG4gICAgICAgIC8vIHRoaXMuaW50ZXJ2YWxDb3VudGRvd24gPSBzZXRJbnRlcnZhbChmID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAvLyAgICAgY29uc3QgZGlzdGFuY2UgPSBnb2FsRGF0ZSAtIG5vdztcbiAgICAgICAgLy8gICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihkaXN0YW5jZSAvIDEwMDApO1xuXG4gICAgICAgIC8vICAgICAvLyBJZiB0aGUgY291bnQgZG93biBpcyBmaW5pc2hlZCwgd3JpdGUgc29tZSB0ZXh0XG4gICAgICAgIC8vICAgICBpZiAoZGlzdGFuY2UgPCAwKSB7XG4gICAgICAgIC8vICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsQ291bnRkb3duKTtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJlbG9hZFdpbmRvdygpO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGxldCBtZXNzYWdlID0gYFRyw6xuaCBkdXnhu4d0IHPhur0ga2jhu59pIMSR4buZbmcgbOG6oWkgc2F1ICR7c2Vjb25kc31zYDtcbiAgICAgICAgLy8gICAgIGlmIChzZWNvbmRzIDwgMSkge1xuICAgICAgICAvLyAgICAgICAgIG1lc3NhZ2UgPSAnVHLDrG5oIGR1eeG7h3Qgc+G6vSBraOG7n2kgxJHhu5luZyBs4bqhaSBuZ2F5IGLDonkgZ2nhu50nO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dDb25maXJtKFxuICAgICAgICAvLyAgICAgICAgIG1lc3NhZ2UsIG51bGwsIG51bGwsIGZhbHNlLCB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0NPTkZJUk0uQUNDRVBUX0xBQkVMJyksXG4gICAgICAgIC8vICAgICAgICAgJ3BpIHBpLWNoZWNrJ1xuICAgICAgICAvLyAgICAgKS50aGVuKHJlcyA9PiB7XG4gICAgICAgIC8vICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsQ291bnRkb3duKTtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJlbG9hZFdpbmRvdygpO1xuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIC8vIH0sIDEwMDApO1xuICAgIH1cblxuICAgIHJlbG9hZFdpbmRvdygpIHtcbiAgICAgICAgdG9wLmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cblxufVxuIl19
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvcGJhci12MS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NvbW1vbi1hcHAtY29tcG9uZW50L2FwcC10b3BiYXItdjEvYXBwLXRvcGJhci12MS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFB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O1lBcmJKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsczNTQUE2QztnQkFFN0MsU0FBUyxFQUFFLENBQUMsdUJBQXVCLENBQUM7O2FBQ3ZDOzs7WUFaUSxtQkFBbUI7WUFWbkIsTUFBTTtZQVNOLGFBQWE7WUFEYixhQUFhO1lBVGIsaUJBQWlCO1lBQXlCLFFBQVE7WUFlbEQsaUJBQWlCO1lBRmpCLGtCQUFrQjtZQUdsQixXQUFXO1lBRlgsZUFBZTtZQVpmLGdCQUFnQjtZQVVoQixrQkFBa0I7OztvQkFhdEIsU0FBUyxTQUFDLE9BQU87cUJBQ2pCLFNBQVMsU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3VCQUNwQyxTQUFTLFNBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XG5pbXBvcnQgeyBEaWFsb2dNb2RlbCwgUG9wdXBTaXplIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcbmltcG9ydCB7IFRuVXNlciB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90bi11c2VyJztcbmltcG9ydCB7IEF1dGhlblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoZW4uc2VydmljZSc7XG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tUm91dGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2N1c3RvbS1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21pemVVaVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jdXN0b21pemUtdWkuc2VydmljZSc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wZXJtaXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC10b3BiYXItdjEnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9wYmFyLXYxLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hcHAtdG9wYmFyLXYxLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEFwcFRvcEJhclYxQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcpIGlucHV0OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ25vdGlmeScsIHsgc3RhdGljOiB0cnVlIH0pIG5vdGlmeTogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdtZXNzYWdlcycsIHsgc3RhdGljOiB0cnVlIH0pIG1lc3NhZ2VzOiBhbnk7XG5cbiAgICBkZWZhdWx0QXZhdGFyID0gJyc7XG4gICAgY29uZmlnOiBhbnkgPSB7fTtcbiAgICBzaG93RGVmYXVsdFNldHRpbmc6IGFueTtcbiAgICBrZXkgPSAnJztcblxuICAgIGN1cnJlbnRSb3V0ZSA9ICcnO1xuICAgIGZpbGVBcGkgPSAnJztcblxuICAgIGN1cnJlbnRVc2VyOiBhbnkgPSBudWxsO1xuICAgIGFwcFN3aXRjaGVySXRlbXM6IGFueSA9IFtdO1xuICAgIGlzRmlyc3RUaW1lID0gZmFsc2U7XG5cbiAgICBzZWFyY2hEYXRhO1xuICAgIHNob3dTZXR0aW5ncyA9IGZhbHNlO1xuICAgIGFsbFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgYXBwRGVmYXVsdFNldHRpbmdzOiBhbnlbXSA9IFtdO1xuICAgIGRlZmF1bHRTZXR0aW5nTW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKHtcbiAgICAgICAgaGVhZGVyOiAnQ+G6pXUgaMOsbmggcGjDom4gaOG7hycsXG4gICAgICAgIHBvcHVwU2l6ZTogbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiA3MDAsIGhlaWdodDogMzUwIH0pLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0ZXh0OiAnVGhp4bq/dCBs4bqtcCB0aGFtIHPhu5EgbeG6t2MgxJHhu4tuaCdcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHVzZXJQcm9maWxlOiBhbnk7XG5cbiAgICBtZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgICBpbnRlcnZhbENvdW50ZG93bjogYW55O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIC8vIHB1YmxpYyBhcHA6IEFwcENvbXBvbmVudCxcbiAgICAgICAgcHJpdmF0ZSBfY3VzdG9tUm91dGVTZXJ2aWNlOiBDdXN0b21Sb3V0ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBfcGVybWlzc2lvblNlcnZpY2U6IFBlcm1pc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9lbnZpcm9ubWVudFNlcnZpY2U6IEVudmlyb25tZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHVibGljIF9jdXN0b21pemVVaVNlcnZpY2U6IEN1c3RvbWl6ZVVpU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLmRlZmF1bHRBdmF0YXIgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RGVmYXVsdE1hbGVBdmF0YXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcuaXNQcm9kdWN0aW9uID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldElzUHJvZHVjdGlvbigpO1xuICAgICAgICB0aGlzLmNvbmZpZy50aXRsZSA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRUaXRsZSgpO1xuICAgICAgICB0aGlzLmNvbmZpZy5sb2dvID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldExvZ28oKTtcbiAgICAgICAgdGhpcy5jb25maWcub3duZXIgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0T3duZXIoKTtcbiAgICAgICAgdGhpcy5maWxlQXBpID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEh0dHBTZXJ2aWNlRW5kcG9pbnQoJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5hcHBEZWZhdWx0U2V0dGluZ3MgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0Q29uZmlnRGVmYXVsdFNldHRpbmcoKTtcblxuICAgICAgICBpZiAodGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YVxuICAgICAgICAgICAgJiYgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YS5zaG93RGVmYXVsdFNldHRpbmcgIT0gbnVsbFxuICAgICAgICAgICAgJiYgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YS5zaG93RGVmYXVsdFNldHRpbmcgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEZWZhdWx0U2V0dGluZyA9IHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGEuc2hvd0RlZmF1bHRTZXR0aW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG93RGVmYXVsdFNldHRpbmcgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0U2hvd0RlZmF1bHRTZXR0aW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlciA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5yZXBsYXlTdWJzY3JpYmVPbmNlKENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfTE9BREVELCBycyA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKSBhcyBUblVzZXI7XG4gICAgICAgICAgICB0aGlzLmxvYWRNZW51TWV0YWRhdGEoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1RfVVNNQVJULlNIT1dfQ09ORklHX0RBVEFfREVGQVVMVCwgcnMgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93RGVmYXVsdFNldHRpbmdGb3JtKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnJvb3RNb2RlbC5hbGxvd0Fub255bW91cykge1xuICAgICAgICAgICAgdGhpcy5sb2FkTWVudU1ldGFkYXRhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkTWVudU1ldGFkYXRhKCkge1xuICAgICAgICBjb25zdCBwcm1zQXBwU3dpY2hlckl0ZW0gPSBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxzdEFwcCA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRMaXN0QXBwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGluZCBpbiBsc3RBcHApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbHN0QXBwW2luZF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5hbGxvd0Fub255bW91cyAmJiBlbGVtZW50LmFsbG93QW5vbnltb3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXV0aG9yaXplZCA9IGF3YWl0IHRoaXMuX3Blcm1pc3Npb25TZXJ2aWNlLmlzQXV0aG9yaXplZChlbGVtZW50LmNvZGUsIGAke2VsZW1lbnQuY29kZX0uTU9EVUxFLiR7ZWxlbWVudC5jb2RlfWAudG9VcHBlckNhc2UoKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdXRob3JpemVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKGFycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBybXNBcHBTd2ljaGVySXRlbS50aGVuKHJzID0+IHtcbiAgICAgICAgICAgIGlmIChycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKSBhcyBUblVzZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBTd2l0Y2hlckl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgKDxhbnk+cnMpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFsbG93QW5vbnltb3VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBTd2l0Y2hlckl0ZW1zLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFVzZXIubWFOZ3VvaUhvYyAmJiBjdXJyZW50VXNlci5pc3N1cGVydXNlciAmJiBjdXJyZW50VXNlci5pc3N1cGVydXNlci50b0xvd2VyQ2FzZSgpICE9ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb2RlLnRvTG93ZXJDYXNlKCkgPT0gJ3N2JyB8fCBlbGVtZW50LmNvZGUudG9Mb3dlckNhc2UoKSA9PSAndXNlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwU3dpdGNoZXJJdGVtcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcFN3aXRjaGVySXRlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIuZ2VuZGVyID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRBdmF0YXIgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0RGVmYXVsdEZlbWFsZUF2YXRhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QXZhdGFyID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldERlZmF1bHRNYWxlQXZhdGFyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXNlclByb2ZpbGUgPSB0aGlzLl91c2VyU2VydmljZS5nZXRQcm9maWxlSW5mbygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkJPRFlfTU9VU0VfRE9XTiwgKGUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oaWRlQWR2YW5jZVNlYXJjaChlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULktFWV9ET1dOX0NUUkxfRiwgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUb1NlYXJjaEJveCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5GT1JDRV9SRUxPQUQsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dOb3RpZmljYXRpb25SZWxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5DT01NT04uU0hPV19OT1RJRlksIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldE5vdGlmeShlLm1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbGxTdWJzY3JpcHRpb25zLnB1c2godGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1RfVVNNQVJULlNIT1dfQ09ORklHX0RBVEFfREVGQVVMVCwgZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFNb2RlbFNldHRpbmcuc2hvd1NldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLm1vZGVsLmRhdGFNb2RlbFNldHRpbmcgPSB7XG4gICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgIHNob3dTZXR0aW5nczogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5TQVZFX0RBVEFfREVGQVVMVCwgZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdERlZmF1bHREYXRhU2V0dGluZyhkYXRhKTtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkV2luZG93KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdHJpbmdEYXRhRGVmYXVsdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkRFRkFVTFRfREFUQSk7XG4gICAgICAgIGlmIChzdHJpbmdEYXRhRGVmYXVsdCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlRGVmYXVsdCA9IEpTT04ucGFyc2Uoc3RyaW5nRGF0YURlZmF1bHQpO1xuICAgICAgICAgICAgdGhpcy5mb3JtYXREZWZhdWx0RGF0YVNldHRpbmcoZGF0YUNhY2hlRGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxTdWJzY3JpcHRpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbENvdW50ZG93bikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsQ291bnRkb3duKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIH1cblxuICAgIGZvcm1hdERlZmF1bHREYXRhU2V0dGluZyhkYXRhKSB7XG4gICAgICAgIGxldCBkYXRhU2V0dGluZyA9ICcnO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBbJ2lkSGUnLCAnbmFtSG9jJywgJ2lkSG9jS3knLCAnaWREb3RUaGknXTtcbiAgICAgICAgY29uc3QgZmllbGRQbHVzZXMgPSBbJ2NvZGUnLCAndGVuJywgJ3RlbicsICd0ZW4nXTtcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSGlkZGVuKGZpZWxkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9mID0gYCR7ZmllbGR9JHtmaWVsZFBsdXNlc1tpbmRleF19YDtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVtfZl0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVNldHRpbmcgKz0gZGF0YVtfZl0gKyAnLyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRhdGFTZXR0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRhdGFTZXR0aW5nID0gZGF0YVNldHRpbmcuc3Vic3RyaW5nKDAsIGRhdGFTZXR0aW5nLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVmYXVsdFNldHRpbmdNb2RlbC5kYXRhLnRleHQgPSBkYXRhU2V0dGluZztcbiAgICB9XG5cbiAgICBjaGVja0hpZGRlbihmaWVsZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBEZWZhdWx0U2V0dGluZ3Muc29tZShwID0+IHAuZmllbGQgPT0gZmllbGQpO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnRVc2VyRnVsbE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIgJiYgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRVc2VyLmZ1bGxOYW1lID8gdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRVc2VyLmZ1bGxOYW1lIDogJ0tow6FjaCc7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFVzZXJQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlclByb2ZpbGUgPyB0aGlzLnVzZXJQcm9maWxlLnRlbkRvblZpIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50VXNlckF2YXRhcigpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlciAmJiB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudFVzZXIuYXZhdGFyKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5maWxlQXBpfS9maWxlL3B1YmxpYy8ke3RoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50VXNlci5hdmF0YXJ9L0Rvd25sb2FkYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRBdmF0YXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckZpbHRlcihpbnB1dCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VhcmNoTW9kZWxbdGhpcy5tb2RlbC5maWVsZEtleV0gPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlU2VydmljZS51cGRhdGVGcmFnbWVudCh0aGlzLm1vZGVsLmZpZWxkS2V5LCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlU2VydmljZS51cGRhdGVXaXRob3V0RmlyZUV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5PTl9TRUFSQ0gsIHRoaXMubW9kZWwuc2VhcmNoTW9kZWwpO1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvZ2dsZUFkdmFuY2VTZWFyY2goZXZ0KSB7XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkFEVkFOQ0VfU0VBUkNIX1RPR0dMRV9CT1gsIHsgZXZlbnQ6IGV2dCB9KTtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGhpZGVBZHZhbmNlU2VhcmNoKGV2dCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkdmFuY2Utc2VhcmNoLWJveCcpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXNrOiBhbnkgPSBkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdltjbGFzc349XCJ1aS1kaWFsb2ctbWFza1wiXScpO1xuICAgICAgICAgICAgaWYgKCFtYXNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3REcm9wZG93biA9IGV2dC50YXJnZXQuY2xvc2VzdCgnLmRyb3Bkb3duLWFkdnMnKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2VzdERyb3Bkb3duID09IG51bGwgfHwgY2xvc2VzdERyb3Bkb3duLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkFEVkFOQ0VfU0VBUkNIX0hJREVfQk9YLCB7IGV2ZW50OiBldnQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXNUb1NlYXJjaEJveCgpIHtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IoJ2RpdltjbGFzc349XCJ1aS1kaWFsb2ctbWFza1wiXScpKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVG9wYmFyU2VhcmNoQ2xpY2soZXZlbnQsIGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5maWVsZEtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuT05fU0VBUkNILCB0aGlzLm1vZGVsLnNlYXJjaE1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlU2VydmljZS51cGRhdGVGcmFnbWVudCh0aGlzLm1vZGVsLmZpZWxkS2V5LCBpbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZVNlcnZpY2UudXBkYXRlV2l0aG91dEZpcmVFdmVudCgpO1xuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Fc2MoZXZlbnQsIGlucHV0KSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWx0ZXIoaW5wdXQpO1xuICAgIH1cblxuICAgIG9uRW50ZXIoZXZlbnQsIGlucHV0KSB7XG4gICAgICAgIHRoaXMub25Ub3BiYXJTZWFyY2hDbGljayhldmVudCwgaW5wdXQpO1xuICAgIH1cblxuICAgIHN3aXRjaEFwcChpdGVtLCBvcGVuTmV3VGFiID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0ID09ICdfYmxhbmsnKSB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0uZGVmYXVsdFJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgaXRlbS5kZWZhdWx0UmVkaXJlY3QgPSAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTmFtTkggdGlwIHRyaWNrIGNobyBtb3Qgc28gbWF5IGJpIGxvaSBpdGVtLnVybCA9ICdtYWluJyAtPiByZWRpcmVjdCBzYWkga2hpIGNsaWNrIHZhbyBjYWMgcGhhbiBoZVxuICAgICAgICAgICAgaWYgKGl0ZW0udXJsID09IGl0ZW0uZGVmYXVsdFJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgaXRlbS51cmwgPSAnLycgKyBpdGVtLmNvZGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvcGVuTmV3VGFiKSB7XG4gICAgICAgICAgICAgICAgdG9wLmxvY2F0aW9uLmhyZWYgPSBgJHtpdGVtLnVybH0vJHtpdGVtLmRlZmF1bHRSZWRpcmVjdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oYCR7aXRlbS51cmx9LyR7aXRlbS5kZWZhdWx0UmVkaXJlY3R9YCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGl0ZW0uZGVmYXVsdFJlZGlyZWN0ICE9ICcnICYmICF0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MubWVudVRvcE9wZW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwoaXRlbS5kZWZhdWx0UmVkaXJlY3QpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGEgPSB0aGlzLl9lbnZpcm9ubWVudFNlcnZpY2UuZ2V0T2JqZWN0QXBwKGl0ZW0uY29kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YS5zaG93RGVmYXVsdFNldHRpbmcgIT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMucm9vdENvbnRleHQuZGF0YS5jdXJyZW50QXBwTWV0YWRhdGEuc2hvd0RlZmF1bHRTZXR0aW5nICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RGVmYXVsdFNldHRpbmcgPSB0aGlzLnJvb3RDb250ZXh0LmRhdGEuY3VycmVudEFwcE1ldGFkYXRhLnNob3dEZWZhdWx0U2V0dGluZyAmJiB0aGlzLnNob3dEZWZhdWx0U2V0dGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNBZHZhbmNlU2VhcmNoQm94KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5zZWFyY2hNb2RlbC5oYXNBZHZhbmNlU2VhcmNoO1xuICAgIH1cblxuICAgIGlzQWR2YW5jZVNlYXJjaGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQWR2YW5jZVNlYXJjaFZhbHVlKHRoaXMubW9kZWwuc2VhcmNoTW9kZWwpO1xuICAgIH1cblxuICAgIGhhc0FkdmFuY2VTZWFyY2hWYWx1ZShvYmopIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnX2snIHx8IGtleSA9PT0gJ2hhc0FkdmFuY2VTZWFyY2gnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2JqW2tleV0gIT0gbnVsbCAmJiBvYmpba2V5XSAhPSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldENvbXBvbmVudElkKCkge1xuICAgICAgICByZXR1cm4gJ1RPUEJBUic7XG4gICAgfVxuXG4gICAgZ29Ub0hvbWUoKSB7XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KCdHT19IT01FJyk7XG4gICAgfVxuXG4gICAgb25FZGl0SW5mbyhldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBjdXJyZW50QXBwU2V0dGluZyA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRPYmplY3RBcHAoJ1VTRVInKTtcbiAgICAgICAgaWYgKGN1cnJlbnRBcHBTZXR0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnN3aXRjaEFwcChjdXJyZW50QXBwU2V0dGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdC4bqhbiBjaMawYSB0aGnhur90IGzhuq1wIG1ldGFkYXRhIGNobyB0cmFuZyBjw6EgbmjDom4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2hhbmdlUGFzc3dvcmQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gdGhpcy5jaGFuZ2VQYXNzd29yZC5zaG93UG9wdXAodGhpcy5fdXNlclNlcnZpY2UuZ2V0SWQoKSk7XG4gICAgfVxuICAgIG9uVG9wYmFyTG9nb3V0KCkge1xuICAgICAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjdXJyZW50VXJsJykpIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjdXJyZW50VXJsJywgdG9wLmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2F1dGhlblNlcnZpY2UubG9nb3V0KCk7XG4gICAgfVxuICAgIHNob3dEZWZhdWx0U2V0dGluZ0Zvcm0oKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNldHRpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xuICAgIH1cbiAgICBvblNob3dTZXR0aW5ncyhldikge1xuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVF9VU01BUlQuQ09ORklHX0RBVEFfREVGQVVMVF9PUEVORUQpO1xuICAgIH1cbiAgICBvbkNsb3NlU2V0dGluZ3MoZXYpIHtcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1RfVVNNQVJULkNPTkZJR19EQVRBX0RFRkFVTFRfQ0xPU0VEKTtcbiAgICB9XG5cbiAgICBzaG93UHJvZmlsZVBhZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl91c2VyU2VydmljZS5pc1NpbmhWaWVuQWNjb3VudCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbG9naW4oKSB7XG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KCdMT0dJTicpO1xuICAgIH1cblxuICAgIHNldE5vdGlmeShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICBoYW5kbGVNb3VzZU92ZXIoZXZ0KSB7XG4gICAgICAgIGV2dC50YXJnZXQuc3RvcCgpO1xuICAgIH1cblxuICAgIGhhbmRsZU1vdXNlT3V0KGV2dCkge1xuICAgICAgICBldnQudGFyZ2V0LnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgc2hvd05vdGlmaWNhdGlvblJlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gJ0jhu4cgdGjhu5FuZyBjw7MgcGhpw6puIGLhuqNuIG3hu5tpLCBow6N5IHJlZnJlc2ggdHLDrG5oIGR1eeG7h3QgxJHhu4MgY+G6rXAgbmjhuq10JztcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuU0hPV19SRUpFQ1RfQ09ORklSTSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0oXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VcbiAgICAgICAgKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZFdpbmRvdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpZiAodGhpcy5pbnRlcnZhbENvdW50ZG93bikge1xuICAgICAgICAvLyAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsQ291bnRkb3duKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgLy8gY29uc3QgZ29hbERhdGUgPSAobmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgKyAxMCAqIDEwMDApKS5nZXRUaW1lKCk7IC8vIMSQ4bq/bSAxMHNcbiAgICAgICAgLy8gdGhpcy5pbnRlcnZhbENvdW50ZG93biA9IHNldEludGVydmFsKGYgPT4ge1xuICAgICAgICAvLyAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIC8vICAgICBjb25zdCBkaXN0YW5jZSA9IGdvYWxEYXRlIC0gbm93O1xuICAgICAgICAvLyAgICAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKGRpc3RhbmNlIC8gMTAwMCk7XG5cbiAgICAgICAgLy8gICAgIC8vIElmIHRoZSBjb3VudCBkb3duIGlzIGZpbmlzaGVkLCB3cml0ZSBzb21lIHRleHRcbiAgICAgICAgLy8gICAgIGlmIChkaXN0YW5jZSA8IDApIHtcbiAgICAgICAgLy8gICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pO1xuICAgICAgICAvLyAgICAgICAgIHRoaXMucmVsb2FkV2luZG93KCk7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgbGV0IG1lc3NhZ2UgPSBgVHLDrG5oIGR1eeG7h3Qgc+G6vSBraOG7n2kgxJHhu5luZyBs4bqhaSBzYXUgJHtzZWNvbmRzfXNgO1xuICAgICAgICAvLyAgICAgaWYgKHNlY29uZHMgPCAxKSB7XG4gICAgICAgIC8vICAgICAgICAgbWVzc2FnZSA9ICdUcsOsbmggZHV54buHdCBz4bq9IGto4bufaSDEkeG7mW5nIGzhuqFpIG5nYXkgYsOieSBnaeG7nSc7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0oXG4gICAgICAgIC8vICAgICAgICAgbWVzc2FnZSwgbnVsbCwgbnVsbCwgZmFsc2UsIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQ09ORklSTS5BQ0NFUFRfTEFCRUwnKSxcbiAgICAgICAgLy8gICAgICAgICAncGkgcGktY2hlY2snXG4gICAgICAgIC8vICAgICApLnRoZW4ocmVzID0+IHtcbiAgICAgICAgLy8gICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxDb3VudGRvd24pO1xuICAgICAgICAvLyAgICAgICAgIHRoaXMucmVsb2FkV2luZG93KCk7XG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy8gfSwgMTAwMCk7XG4gICAgfVxuXG4gICAgcmVsb2FkV2luZG93KCkge1xuICAgICAgICB0b3AubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxuXG59XG4iXX0=
@@ -0,0 +1,209 @@
1
+ import { __awaiter } from "tslib";
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Injector, Input, Output } from '@angular/core';
3
+ import { ComponentContextService } from '../../../app-context/component-context.service';
4
+ import { DataFormBase } from '../../../classes/base/data-form-base';
5
+ import { DropdownControlSchema, Operator } from '../../../classes/form-schema';
6
+ import { ComCtxConstants } from '../../../configs/component-context.constant';
7
+ import { EnvironmentService } from '../../../services/environment.service';
8
+ export class DefaultDataSettingsComponent extends DataFormBase {
9
+ constructor(injector, _environmentService
10
+ // private _tbl_DM_NguoiHoc_HeDaoTaoService: tbl_DM_NguoiHoc_HeDaoTaoService,
11
+ // private _tbl_HeThong_HocKyService: tbl_HeThong_HocKyService,
12
+ // private _tbl_HeThong_NamHocService: tbl_HeThong_NamHocService,
13
+ // private _tbl_Thi_DotThiService: tbl_Thi_DotThiService,
14
+ // private _tbl_Thi_Dkt_DotService: tbl_Thi_Dkt_DotService,
15
+ ) {
16
+ super(injector);
17
+ this._environmentService = _environmentService;
18
+ this.settingKey = '';
19
+ this.onShow = new EventEmitter();
20
+ this.onHide = new EventEmitter();
21
+ this.appDefaultSettings = [];
22
+ this.cacheDataSource = {};
23
+ this.doNotCheckBaseService = true;
24
+ }
25
+ ngOnInit() {
26
+ this.appDefaultSettings = this._environmentService.getConfigDefaultSetting();
27
+ this.setting.schema = [
28
+ new DropdownControlSchema({
29
+ field: 'idHe',
30
+ mdWidth: 6,
31
+ label: this._translateService.instant('Hệ đào tạo'),
32
+ // baseService: this._tbl_DM_NguoiHoc_HeDaoTaoService,
33
+ fieldPlus: 'code',
34
+ appendTo: 'body',
35
+ callbackDataFinish: data => {
36
+ this.cacheDataSource['idHe'] = data;
37
+ },
38
+ enableCaching: false,
39
+ required: this.getRequired('idHe'),
40
+ hidden: this.checkHidden('idHe')
41
+ }),
42
+ new DropdownControlSchema({
43
+ field: 'namHoc',
44
+ label: this._translateService.instant('Năm học'),
45
+ required: this.getRequired('namHoc'),
46
+ mdWidth: 3,
47
+ // baseService: this._tbl_HeThong_NamHocService,
48
+ fieldPlus: 'id',
49
+ valueField: 'nam',
50
+ appendTo: 'body',
51
+ callbackDataFinish: data => {
52
+ this.cacheDataSource['namHoc'] = data;
53
+ },
54
+ sortField: 'ten',
55
+ sortDir: -1,
56
+ enableCaching: false,
57
+ placeholder: 'Chọn năm',
58
+ hidden: this.checkHidden('namHoc')
59
+ }),
60
+ new DropdownControlSchema({
61
+ field: 'idHocKy',
62
+ label: this._translateService.instant('Học kỳ'),
63
+ required: this.getRequired('idHocKy'),
64
+ placeholder: 'Chọn học kỳ',
65
+ showClear: true,
66
+ mdWidth: 3,
67
+ // baseService: this._tbl_HeThong_HocKyService,
68
+ fieldPlus: 'code',
69
+ appendTo: 'body',
70
+ bindingFilters: [
71
+ this.newBindingFilter('namHoc', Operator.equal, 'namHoc')
72
+ ],
73
+ callbackDataFinish: data => {
74
+ this.cacheDataSource['idHocKy'] = data;
75
+ },
76
+ enableCaching: false,
77
+ hidden: this.checkHidden('idHocKy')
78
+ }),
79
+ new DropdownControlSchema({
80
+ field: 'idDotThi',
81
+ label: this._translateService.instant('Đợt thi'),
82
+ required: this.getRequired('idDotThi'),
83
+ placeholder: 'Chọn đợt thi',
84
+ showClear: true,
85
+ mdWidth: 12,
86
+ // baseService: this._tbl_Thi_DotThiService,
87
+ fieldPlus: 'code',
88
+ displayField: 'tenDotThi',
89
+ callbackDataFinish: data => {
90
+ this.cacheDataSource['idDotThi'] = data;
91
+ },
92
+ appendTo: 'body',
93
+ bindingFilters: [
94
+ this.newBindingFilter('namHoc', Operator.equal, 'namHoc'),
95
+ this.newBindingFilter('idHocKy', Operator.equal, 'idHocKy')
96
+ ],
97
+ enableCaching: false,
98
+ hidden: this.checkHidden('idDotThi')
99
+ }),
100
+ new DropdownControlSchema({
101
+ field: 'idDotDangKyThi',
102
+ label: this._translateService.instant('Đợt đăng ký thi'),
103
+ placeholder: 'Chọn đợt đăng ký thi',
104
+ showClear: true,
105
+ mdWidth: 12,
106
+ // baseService: this._tbl_Thi_Dkt_DotService,
107
+ displayField: 'ten',
108
+ callbackDataFinish: data => {
109
+ this.cacheDataSource['idDotDangKyThi'] = data;
110
+ },
111
+ appendTo: 'body',
112
+ bindingFilters: [
113
+ this.newBindingFilter('idDotThi', Operator.equal, 'idDotThi'),
114
+ ],
115
+ enableCaching: false,
116
+ hidden: this.checkHidden('idDotDangKyThi')
117
+ })
118
+ ];
119
+ this.getDataCache();
120
+ }
121
+ checkHidden(field) {
122
+ return this.appDefaultSettings.some(p => p.field == field);
123
+ }
124
+ getRequired(field) {
125
+ return this.appDefaultSettings.some(p => p.field == field && p.required);
126
+ }
127
+ getDataCache() {
128
+ const stringDataDefault = localStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.DEFAULT_DATA);
129
+ if (stringDataDefault) {
130
+ const dataCache = JSON.parse(stringDataDefault);
131
+ for (const item of this.setting.schema) {
132
+ const value = dataCache[item.field];
133
+ if (value) {
134
+ this.model.data[item.field] = value;
135
+ }
136
+ }
137
+ }
138
+ }
139
+ setCodeAndLabel(fields, itemSource) {
140
+ fields.forEach(field => {
141
+ this.model.data[`${field}code`] = itemSource.code;
142
+ this.model.data[`${field}ten`] = itemSource.label;
143
+ });
144
+ }
145
+ saveCommonSetting() {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ const valid = yield this._getResultValidate();
148
+ if (!valid)
149
+ return;
150
+ // Các đoạn code bên dưới có thể không tối ưu nhưng nhằm mục đích đồng bộ cấu hình giữa các phân hệ,
151
+ // tránh những bug gặp lại quá nhiều lần trong quá trình triển khai
152
+ if (this.model.data.idHe) {
153
+ const component = (this.setting.schema.find(item => item.field == 'idHe'))._component;
154
+ const itemHe = component.dataSourceInternal.find(item => item.value.id == this.model.data.idHe).value;
155
+ this.model.data.idHe = itemHe.id;
156
+ this.model.data.idHeDaoTao = itemHe.id;
157
+ this.model.data.codeHeDaoTao = itemHe.code;
158
+ this.setCodeAndLabel(['idHe', 'idHeDaoTao', 'codeHeDaoTao'], itemHe);
159
+ }
160
+ if (this.model.data.namHoc != null) {
161
+ const component = (this.setting.schema.find(item => item.field == 'namHoc'))._component;
162
+ const itemNamHoc = component.dataSourceInternal.find(item => item.value == this.model.data.namHoc).value;
163
+ this.setCodeAndLabel(['namHoc'], itemNamHoc);
164
+ }
165
+ if (this.model.data.idHocKy != null) {
166
+ const component = (this.setting.schema.find(item => item.field == 'idHocKy'))._component;
167
+ const itemHocKy = component.dataSourceInternal.find(item => item.value == this.model.data.idHocKy).value;
168
+ this.model.data.codeHocKy = itemHocKy.code;
169
+ this.setCodeAndLabel(['idHocKy', 'codeHocKy'], itemHocKy);
170
+ }
171
+ const defaultData = Object.assign(Object.assign({}, this.model.data), { syncProduct: true });
172
+ for (const field in this.model.data) {
173
+ defaultData[field] = this.model.data[field];
174
+ if (!this.cacheDataSource[field])
175
+ this.cacheDataSource[field] = [];
176
+ const data = this.cacheDataSource[field].find(p => p.value === this.model.data[field]);
177
+ if (data) {
178
+ defaultData[field + 'code'] = data.code;
179
+ defaultData[field + 'ten'] = data.label;
180
+ }
181
+ }
182
+ localStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.DEFAULT_DATA, JSON.stringify(defaultData));
183
+ window.location.reload();
184
+ this.cancel(null);
185
+ });
186
+ }
187
+ cancel(evt) {
188
+ this.onHide.emit();
189
+ }
190
+ }
191
+ DefaultDataSettingsComponent.decorators = [
192
+ { type: Component, args: [{
193
+ selector: 'default-data-settings',
194
+ template: "<crud-form #crudForm [setting]=\"setting\" [context]=\"context\" [disableCaching]=\"true\" [(data)]=\"model.data\"\n (onFormReady)=\"_handleFormReady($event)\">\n</crud-form>\n<ng-template #buttonTemplate>\n <button *ngIf=\"!model.data.__disableEdit && !__isFormView\" pButton type=\"button\" icon=\"pi pi-save\"\n class=\"p-button-text\" [label]=\"'FORM.SAVE' | translate\" (click)=\"saveCommonSetting()\"></button>\n <button pButton preventTab type=\"button\" icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\n [label]=\"'FORM.CANCEL' | translate\" (click)=\"cancel($event)\"></button>\n</ng-template>",
195
+ changeDetection: ChangeDetectionStrategy.Default,
196
+ providers: [ComponentContextService],
197
+ styles: [""]
198
+ },] }
199
+ ];
200
+ DefaultDataSettingsComponent.ctorParameters = () => [
201
+ { type: Injector },
202
+ { type: EnvironmentService }
203
+ ];
204
+ DefaultDataSettingsComponent.propDecorators = {
205
+ settingKey: [{ type: Input }],
206
+ onShow: [{ type: Output }],
207
+ onHide: [{ type: Output }]
208
+ };
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1kYXRhLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvY29tbW9uLWFwcC1jb21wb25lbnQvZGVmYXVsdC1zZXR0aW5nLWZvcm0vZGVmYXVsdC1kYXRhLXNldHRpbmdzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUscUJBQXFCLEVBQWtCLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQVczRSxNQUFNLE9BQU8sNEJBQTZCLFNBQVEsWUFBWTtJQVExRCxZQUNJLFFBQWtCLEVBQ1IsbUJBQXVDO0lBQ2pELDZFQUE2RTtJQUM3RSwrREFBK0Q7SUFDL0QsaUVBQWlFO0lBQ2pFLHlEQUF5RDtJQUN6RCwyREFBMkQ7O1FBRTNELEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQVBOLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFUNUMsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVmLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRTNDLHVCQUFrQixHQUFVLEVBQUUsQ0FBQztRQUMvQixvQkFBZSxHQUFRLEVBQUUsQ0FB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UyxTQUFDO2dCQUNQLFFBQVEsRUFBRSx1QkFBdUI7Z0JBQ2pDLDhvQkFBcUQ7Z0JBRXJELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPO2dCQUNoRCxTQUFTLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQzs7YUFDdkM7OztZQWhCMEQsUUFBUTtZQU0xRCxrQkFBa0I7Ozt5QkFZdEIsS0FBSztxQkFFTCxNQUFNO3FCQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YUZvcm1CYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2RhdGEtZm9ybS1iYXNlJztcbmltcG9ydCB7IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgRm9ybVNjaGVtYUJhc2UsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZGVmYXVsdC1kYXRhLXNldHRpbmdzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGVmYXVsdC1kYXRhLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kZWZhdWx0LWRhdGEtc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIERlZmF1bHREYXRhU2V0dGluZ3NDb21wb25lbnQgZXh0ZW5kcyBEYXRhRm9ybUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KCkgc2V0dGluZ0tleSA9ICcnO1xuXG4gICAgQE91dHB1dCgpIG9uU2hvdyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkhpZGUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIGFwcERlZmF1bHRTZXR0aW5nczogYW55W10gPSBbXTtcbiAgICBjYWNoZURhdGFTb3VyY2U6IGFueSA9IHt9O1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByb3RlY3RlZCBfZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2VcbiAgICAgICAgLy8gcHJpdmF0ZSBfdGJsX0RNX05ndW9pSG9jX0hlRGFvVGFvU2VydmljZTogdGJsX0RNX05ndW9pSG9jX0hlRGFvVGFvU2VydmljZSxcbiAgICAgICAgLy8gcHJpdmF0ZSBfdGJsX0hlVGhvbmdfSG9jS3lTZXJ2aWNlOiB0YmxfSGVUaG9uZ19Ib2NLeVNlcnZpY2UsXG4gICAgICAgIC8vIHByaXZhdGUgX3RibF9IZVRob25nX05hbUhvY1NlcnZpY2U6IHRibF9IZVRob25nX05hbUhvY1NlcnZpY2UsXG4gICAgICAgIC8vIHByaXZhdGUgX3RibF9UaGlfRG90VGhpU2VydmljZTogdGJsX1RoaV9Eb3RUaGlTZXJ2aWNlLFxuICAgICAgICAvLyBwcml2YXRlIF90YmxfVGhpX0RrdF9Eb3RTZXJ2aWNlOiB0YmxfVGhpX0RrdF9Eb3RTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgICAgIHRoaXMuZG9Ob3RDaGVja0Jhc2VTZXJ2aWNlID0gdHJ1ZTtcbiAgICB9XG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuYXBwRGVmYXVsdFNldHRpbmdzID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldENvbmZpZ0RlZmF1bHRTZXR0aW5nKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEgPSA8Rm9ybVNjaGVtYUJhc2VbXT5bXG4gICAgICAgICAgICBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2lkSGUnLFxuICAgICAgICAgICAgICAgIG1kV2lkdGg6IDYsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnSOG7hyDEkcOgbyB04bqhbycpLFxuICAgICAgICAgICAgICAgIC8vIGJhc2VTZXJ2aWNlOiB0aGlzLl90YmxfRE1fTmd1b2lIb2NfSGVEYW9UYW9TZXJ2aWNlLFxuICAgICAgICAgICAgICAgIGZpZWxkUGx1czogJ2NvZGUnLFxuICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhRmluaXNoOiBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZURhdGFTb3VyY2VbJ2lkSGUnXSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbmFibGVDYWNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdGhpcy5nZXRSZXF1aXJlZCgnaWRIZScpLFxuICAgICAgICAgICAgICAgIGhpZGRlbjogdGhpcy5jaGVja0hpZGRlbignaWRIZScpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBEcm9wZG93bkNvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtSG9jJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdOxINtIGjhu41jJyksXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRoaXMuZ2V0UmVxdWlyZWQoJ25hbUhvYycpLFxuICAgICAgICAgICAgICAgIG1kV2lkdGg6IDMsXG4gICAgICAgICAgICAgICAgLy8gYmFzZVNlcnZpY2U6IHRoaXMuX3RibF9IZVRob25nX05hbUhvY1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgZmllbGRQbHVzOiAnaWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlRmllbGQ6ICduYW0nLFxuICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhRmluaXNoOiBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZURhdGFTb3VyY2VbJ25hbUhvYyddID0gZGF0YTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNvcnRGaWVsZDogJ3RlbicsXG4gICAgICAgICAgICAgICAgc29ydERpcjogLTEsXG4gICAgICAgICAgICAgICAgZW5hYmxlQ2FjaGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdDaOG7jW4gbsSDbScsXG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0aGlzLmNoZWNrSGlkZGVuKCduYW1Ib2MnKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2lkSG9jS3knLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0jhu41jIGvhu7MnKSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdGhpcy5nZXRSZXF1aXJlZCgnaWRIb2NLeScpLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQ2jhu41uIGjhu41jIGvhu7MnLFxuICAgICAgICAgICAgICAgIHNob3dDbGVhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZFdpZHRoOiAzLFxuICAgICAgICAgICAgICAgIC8vIGJhc2VTZXJ2aWNlOiB0aGlzLl90YmxfSGVUaG9uZ19Ib2NLeVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgZmllbGRQbHVzOiAnY29kZScsXG4gICAgICAgICAgICAgICAgYXBwZW5kVG86ICdib2R5JyxcbiAgICAgICAgICAgICAgICBiaW5kaW5nRmlsdGVyczogW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0JpbmRpbmdGaWx0ZXIoJ25hbUhvYycsIE9wZXJhdG9yLmVxdWFsLCAnbmFtSG9jJylcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YUZpbmlzaDogZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVEYXRhU291cmNlWydpZEhvY0t5J10gPSBkYXRhO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW5hYmxlQ2FjaGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0aGlzLmNoZWNrSGlkZGVuKCdpZEhvY0t5JylcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IERyb3Bkb3duQ29udHJvbFNjaGVtYSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdpZERvdFRoaScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnxJDhu6N0IHRoaScpLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0aGlzLmdldFJlcXVpcmVkKCdpZERvdFRoaScpLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQ2jhu41uIMSR4bujdCB0aGknLFxuICAgICAgICAgICAgICAgIHNob3dDbGVhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZFdpZHRoOiAxMixcbiAgICAgICAgICAgICAgICAvLyBiYXNlU2VydmljZTogdGhpcy5fdGJsX1RoaV9Eb3RUaGlTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIGZpZWxkUGx1czogJ2NvZGUnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZDogJ3RlbkRvdFRoaScsXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhRmluaXNoOiBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZURhdGFTb3VyY2VbJ2lkRG90VGhpJ10gPSBkYXRhO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXBwZW5kVG86ICdib2R5JyxcbiAgICAgICAgICAgICAgICBiaW5kaW5nRmlsdGVyczogW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0JpbmRpbmdGaWx0ZXIoJ25hbUhvYycsIE9wZXJhdG9yLmVxdWFsLCAnbmFtSG9jJyksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3QmluZGluZ0ZpbHRlcignaWRIb2NLeScsIE9wZXJhdG9yLmVxdWFsLCAnaWRIb2NLeScpXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBlbmFibGVDYWNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRoaXMuY2hlY2tIaWRkZW4oJ2lkRG90VGhpJylcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IERyb3Bkb3duQ29udHJvbFNjaGVtYSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdpZERvdERhbmdLeVRoaScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnxJDhu6N0IMSRxINuZyBrw70gdGhpJyksXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdDaOG7jW4gxJHhu6N0IMSRxINuZyBrw70gdGhpJyxcbiAgICAgICAgICAgICAgICBzaG93Q2xlYXI6IHRydWUsXG4gICAgICAgICAgICAgICAgbWRXaWR0aDogMTIsXG4gICAgICAgICAgICAgICAgLy8gYmFzZVNlcnZpY2U6IHRoaXMuX3RibF9UaGlfRGt0X0RvdFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgZGlzcGxheUZpZWxkOiAndGVuJyxcbiAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGFGaW5pc2g6IGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlRGF0YVNvdXJjZVsnaWREb3REYW5nS3lUaGknXSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhcHBlbmRUbzogJ2JvZHknLFxuICAgICAgICAgICAgICAgIGJpbmRpbmdGaWx0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3QmluZGluZ0ZpbHRlcignaWREb3RUaGknLCBPcGVyYXRvci5lcXVhbCwgJ2lkRG90VGhpJyksXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBlbmFibGVDYWNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRoaXMuY2hlY2tIaWRkZW4oJ2lkRG90RGFuZ0t5VGhpJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuZ2V0RGF0YUNhY2hlKCk7XG4gICAgfVxuXG4gICAgY2hlY2tIaWRkZW4oZmllbGQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwRGVmYXVsdFNldHRpbmdzLnNvbWUocCA9PiBwLmZpZWxkID09IGZpZWxkKTtcbiAgICB9XG5cbiAgICBnZXRSZXF1aXJlZChmaWVsZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBEZWZhdWx0U2V0dGluZ3Muc29tZShwID0+IHAuZmllbGQgPT0gZmllbGQgJiYgcC5yZXF1aXJlZCk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YUNhY2hlKCkge1xuICAgICAgICBjb25zdCBzdHJpbmdEYXRhRGVmYXVsdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkRFRkFVTFRfREFUQSk7XG4gICAgICAgIGlmIChzdHJpbmdEYXRhRGVmYXVsdCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YUNhY2hlW2l0ZW0uZmllbGRdO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbaXRlbS5maWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgc2V0Q29kZUFuZExhYmVsKGZpZWxkcywgaXRlbVNvdXJjZSkge1xuICAgICAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbYCR7ZmllbGR9Y29kZWBdID0gaXRlbVNvdXJjZS5jb2RlO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhW2Ake2ZpZWxkfXRlbmBdID0gaXRlbVNvdXJjZS5sYWJlbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZUNvbW1vblNldHRpbmcoKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gYXdhaXQgdGhpcy5fZ2V0UmVzdWx0VmFsaWRhdGUoKTtcbiAgICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuO1xuICAgICAgICAvLyBDw6FjIMSRb+G6oW4gY29kZSBiw6puIGTGsOG7m2kgY8OzIHRo4buDIGtow7RuZyB04buRaSDGsHUgbmjGsG5nIG5o4bqxbSBt4bulYyDEkcOtY2ggxJHhu5NuZyBi4buZIGPhuqV1IGjDrG5oIGdp4buvYSBjw6FjIHBow6JuIGjhu4csXG4gICAgICAgIC8vIHRyw6FuaCBuaOG7r25nIGJ1ZyBn4bq3cCBs4bqhaSBxdcOhIG5oaeG7gXUgbOG6p24gdHJvbmcgcXXDoSB0csOsbmggdHJp4buDbiBraGFpXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEuaWRIZSkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gPERyb3Bkb3duQ29tcG9uZW50Pig8RHJvcGRvd25Db250cm9sU2NoZW1hPih0aGlzLnNldHRpbmcuc2NoZW1hLmZpbmQoaXRlbSA9PiBpdGVtLmZpZWxkID09ICdpZEhlJykpKS5fY29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgaXRlbUhlID0gY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbC5maW5kKGl0ZW0gPT4gaXRlbS52YWx1ZS5pZCA9PSB0aGlzLm1vZGVsLmRhdGEuaWRIZSkudmFsdWU7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGEuaWRIZSA9IGl0ZW1IZS5pZDtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5pZEhlRGFvVGFvID0gaXRlbUhlLmlkO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhLmNvZGVIZURhb1RhbyA9IGl0ZW1IZS5jb2RlO1xuXG4gICAgICAgICAgICB0aGlzLnNldENvZGVBbmRMYWJlbChbJ2lkSGUnLCAnaWRIZURhb1RhbycsICdjb2RlSGVEYW9UYW8nXSwgaXRlbUhlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEubmFtSG9jICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IDxEcm9wZG93bkNvbXBvbmVudD4oPERyb3Bkb3duQ29udHJvbFNjaGVtYT4odGhpcy5zZXR0aW5nLnNjaGVtYS5maW5kKGl0ZW0gPT4gaXRlbS5maWVsZCA9PSAnbmFtSG9jJykpKS5fY29tcG9uZW50O1xuICAgICAgICAgICAgY29uc3QgaXRlbU5hbUhvYyA9IGNvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWwuZmluZChpdGVtID0+IGl0ZW0udmFsdWUgPT0gdGhpcy5tb2RlbC5kYXRhLm5hbUhvYykudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnNldENvZGVBbmRMYWJlbChbJ25hbUhvYyddLCBpdGVtTmFtSG9jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGEuaWRIb2NLeSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSA8RHJvcGRvd25Db21wb25lbnQ+KDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+KHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChpdGVtID0+IGl0ZW0uZmllbGQgPT0gJ2lkSG9jS3knKSkpLl9jb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBpdGVtSG9jS3kgPSBjb21wb25lbnQuZGF0YVNvdXJjZUludGVybmFsLmZpbmQoaXRlbSA9PiBpdGVtLnZhbHVlID09IHRoaXMubW9kZWwuZGF0YS5pZEhvY0t5KS52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YS5jb2RlSG9jS3kgPSBpdGVtSG9jS3kuY29kZTtcblxuICAgICAgICAgICAgdGhpcy5zZXRDb2RlQW5kTGFiZWwoWydpZEhvY0t5JywgJ2NvZGVIb2NLeSddLCBpdGVtSG9jS3kpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdERhdGEgPSB7IC4uLnRoaXMubW9kZWwuZGF0YSwgc3luY1Byb2R1Y3Q6IHRydWUgfTtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiB0aGlzLm1vZGVsLmRhdGEpIHtcbiAgICAgICAgICAgIGRlZmF1bHREYXRhW2ZpZWxkXSA9IHRoaXMubW9kZWwuZGF0YVtmaWVsZF07XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGVEYXRhU291cmNlW2ZpZWxkXSkgdGhpcy5jYWNoZURhdGFTb3VyY2VbZmllbGRdID0gW107XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5jYWNoZURhdGFTb3VyY2VbZmllbGRdLmZpbmQocCA9PiBwLnZhbHVlID09PSB0aGlzLm1vZGVsLmRhdGFbZmllbGRdKTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdERhdGFbZmllbGQgKyAnY29kZSddID0gZGF0YS5jb2RlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHREYXRhW2ZpZWxkICsgJ3RlbiddID0gZGF0YS5sYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkRFRkFVTFRfREFUQSwgSlNPTi5zdHJpbmdpZnkoZGVmYXVsdERhdGEpKTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIHRoaXMuY2FuY2VsKG51bGwpO1xuICAgIH1cbiAgICBjYW5jZWwoZXZ0KSB7XG4gICAgICAgIHRoaXMub25IaWRlLmVtaXQoKTtcbiAgICB9XG59XG4iXX0=