@senior-gestao-pessoas/payroll-core 9.4.0-beccc0e0-72b8-4a99-8127-32ad8ca6ee41 → 9.4.0-db1d034b-8b09-472f-9726-7fd71af961f4

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 (39) hide show
  1. package/bundles/senior-gestao-pessoas-payroll-core.umd.js +921 -761
  2. package/bundles/senior-gestao-pessoas-payroll-core.umd.js.map +1 -1
  3. package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js +16 -1
  4. package/bundles/senior-gestao-pessoas-payroll-core.umd.min.js.map +1 -1
  5. package/components/historical-pix-account/historical-pix-account-base.d.ts +25 -0
  6. package/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.d.ts +8 -40
  7. package/components/historical-pix-account/historical-pix-account.component.d.ts +23 -6
  8. package/components/historical-pix-account/historical-pix-account.service.d.ts +1 -0
  9. package/components/historical-pix-account-list/historical-pix-account-list.component.d.ts +9 -1
  10. package/components/shared/index.d.ts +1 -0
  11. package/components/shared/shared-state.service.d.ts +14 -0
  12. package/esm2015/components/historical-pix-account/historical-pix-account-base.js +150 -0
  13. package/esm2015/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +29 -187
  14. package/esm2015/components/historical-pix-account/historical-pix-account.component.js +79 -18
  15. package/esm2015/components/historical-pix-account/historical-pix-account.module.js +5 -1
  16. package/esm2015/components/historical-pix-account/historical-pix-account.service.js +8 -1
  17. package/esm2015/components/historical-pix-account-list/historical-pix-account-list.component.js +38 -5
  18. package/esm2015/components/shared/index.js +2 -0
  19. package/esm2015/components/shared/shared-state.service.js +36 -0
  20. package/esm2015/public_api.js +2 -1
  21. package/esm2015/senior-gestao-pessoas-payroll-core.js +3 -2
  22. package/esm5/components/historical-pix-account/historical-pix-account-base.js +163 -0
  23. package/esm5/components/historical-pix-account/historical-pix-account-form/historical-pix-account-form.component.js +53 -201
  24. package/esm5/components/historical-pix-account/historical-pix-account.component.js +122 -48
  25. package/esm5/components/historical-pix-account/historical-pix-account.module.js +5 -1
  26. package/esm5/components/historical-pix-account/historical-pix-account.service.js +8 -1
  27. package/esm5/components/historical-pix-account-list/historical-pix-account-list.component.js +43 -5
  28. package/esm5/components/shared/index.js +2 -0
  29. package/esm5/components/shared/shared-state.service.js +37 -0
  30. package/esm5/public_api.js +2 -1
  31. package/esm5/senior-gestao-pessoas-payroll-core.js +3 -2
  32. package/fesm2015/senior-gestao-pessoas-payroll-core.js +576 -457
  33. package/fesm2015/senior-gestao-pessoas-payroll-core.js.map +1 -1
  34. package/fesm5/senior-gestao-pessoas-payroll-core.js +917 -758
  35. package/fesm5/senior-gestao-pessoas-payroll-core.js.map +1 -1
  36. package/package.json +1 -1
  37. package/public_api.d.ts +1 -0
  38. package/senior-gestao-pessoas-payroll-core.d.ts +2 -1
  39. package/senior-gestao-pessoas-payroll-core.metadata.json +1 -1
@@ -0,0 +1,25 @@
1
+ import { FormBuilder, FormGroup, ValidatorFn } from "@angular/forms";
2
+ export declare abstract class HistoricakPixAccountBase {
3
+ protected formBuilder: FormBuilder;
4
+ protected _paramsForm: FormGroup;
5
+ protected _defaultCpfNumber: string;
6
+ initialValidatorOfPercentage: ValidatorFn[];
7
+ pixAccountList: object[];
8
+ maxValuePercentage: number;
9
+ pixKeyType: string;
10
+ pixAccountFormGroup: FormGroup;
11
+ isShowPixKeyFieldValidatorMessage: boolean;
12
+ constructor(formBuilder: FormBuilder);
13
+ phoneMask(event: any): void;
14
+ onChangePixKeyType(item: any): void;
15
+ onClearPixKeyType(): void;
16
+ setDefaultCpfPixKey(): void;
17
+ protected createFormGroupBase(): void;
18
+ protected setValidatorsAccordingList(pixAccountList: object[], index?: number, isEditMode?: boolean): void;
19
+ protected beforeSetPixKeyTypeValidator(): void;
20
+ protected setPixKeyValidators(isEditMode: boolean): void;
21
+ protected validatePercentageValid(listValue: number[]): void;
22
+ private validateDuplicatePixKeyTypeBankAccount;
23
+ paramsForm: FormGroup;
24
+ defaultCpfNumber: string;
25
+ }
@@ -1,39 +1,32 @@
1
1
  import { OnInit, EventEmitter, ChangeDetectorRef, OnDestroy, AfterViewInit } from "@angular/core";
2
2
  import { FormGroup, FormBuilder } from "@angular/forms";
3
3
  import { NumberLocaleOptions, CustomFieldsComponent } from "@seniorsistemas/angular-components";
4
- export declare class HistoricalPixAccountFormComponent implements OnInit, OnDestroy, AfterViewInit {
5
- private formBuilder;
4
+ import { SharedStateService } from "../../shared/shared-state.service";
5
+ import { HistoricakPixAccountBase } from "../historical-pix-account-base";
6
+ export declare class HistoricalPixAccountFormComponent extends HistoricakPixAccountBase implements OnInit, OnDestroy, AfterViewInit {
6
7
  private cd;
8
+ private sharedStateService;
7
9
  customFields: CustomFieldsComponent;
8
10
  currency: NumberLocaleOptions;
9
11
  customEntity: string;
10
12
  customService: string;
11
13
  withSideBar: boolean;
12
14
  isEditMode: boolean;
13
- paramsForm: FormGroup;
14
- defaultCpfNumber: string;
15
15
  visibleChange: EventEmitter<boolean>;
16
16
  pixAccountItemToList: EventEmitter<any>;
17
17
  private _visible;
18
18
  private ngUnsubscribe;
19
19
  private employeeId;
20
- private pixAccountList;
21
- private initialValidatorOfPercentage;
22
20
  labelBtnAdd: string;
23
- pixAccountFormGroup: FormGroup;
24
- maxValuePercentage: number;
25
21
  visibleBtnSave: boolean;
26
22
  isView: boolean;
27
- pixKeyType: string;
28
23
  isShowPixKeyFieldValidatorMessage: boolean;
29
- constructor(formBuilder: FormBuilder, cd: ChangeDetectorRef);
24
+ hideFields: import("rxjs").Observable<boolean>;
25
+ constructor(formBuilder: FormBuilder, cd: ChangeDetectorRef, sharedStateService: SharedStateService);
30
26
  ngOnInit(): void;
31
27
  ngAfterViewInit(): void;
32
28
  ngOnDestroy(): void;
33
29
  private registerSubjects;
34
- private createFormGroup;
35
- onChangePixKeyType(item: any): void;
36
- onClearPixKeyType(): void;
37
30
  visible: boolean;
38
31
  isEditAndViewValue: any;
39
32
  private formatPixKeyTelephoneNumber;
@@ -45,33 +38,8 @@ export declare class HistoricalPixAccountFormComponent implements OnInit, OnDest
45
38
  readonly percentagePlaceholder: string;
46
39
  readonly optionsPercentage: object;
47
40
  private getOptions;
48
- /**
49
- * O Input que recebe a lista do component pai e chama o método de validação passando a lista recebida.
50
- * @param pixAccountList
51
- */
52
41
  getListPixAccount: object[];
53
- /**
54
- * Recebe a lista de registros já inseridos na tabela adiciona em uma variável os valores que serão usados para
55
- * a validação dos campos "percentage" e "pixAccount".
56
- * Quando tem index significa que está em uma edição, os valores na posição do registro da edição (index) não serão adicionados
57
- * no array de comparação dos validators.
58
- * @param pixAccountList
59
- * @param index
60
- */
61
- private setValidatorsAccordingList;
62
- /**
63
- * Antes de setar o validator prepara as variáveis necessária para que seja feita a validação do campo.
64
- */
65
- setPixKeyValidators(isEditMode: boolean): void;
66
- /**
67
- * Este método calcula as parcentagens que já foram inseridas, e seta a diferença para chegar em
68
- * 100% na validação do campo "percentage" como um novo maxValue;
69
- * @param listValue
70
- */
71
- private validatePercentageValid;
72
42
  isViewMode: boolean;
73
- phoneMask(event: any): void;
74
- setDefaultCpfPixKey(): void;
75
- beforeSetPixKeyTypeValidator(): void;
76
- private validateDuplicatePixKeyTypeBankAccount;
43
+ paramsForm: FormGroup;
44
+ defaultCpfNumber: string;
77
45
  }
@@ -3,11 +3,15 @@ import { FormGroup, FormBuilder } from "@angular/forms";
3
3
  import { TranslateService } from "@ngx-translate/core";
4
4
  import { CustomFieldsComponent, NumberLocaleOptions } from "@seniorsistemas/angular-components";
5
5
  import { MessageService } from "primeng/api";
6
- export declare class HistoricalPixAccountComponent implements OnInit, OnDestroy, AfterViewInit, OnChanges {
6
+ import { SharedStateService } from "../shared/shared-state.service";
7
+ import { HistoricakPixAccountBase } from "./historical-pix-account-base";
8
+ import { HistoricalPixAccountService } from "./historical-pix-account.service";
9
+ export declare class HistoricalPixAccountComponent extends HistoricakPixAccountBase implements OnInit, OnDestroy, AfterViewInit, OnChanges {
7
10
  private translateService;
8
11
  private cd;
9
- private formBuilder;
10
12
  private messageService;
13
+ private sharedStateService;
14
+ private service;
11
15
  customFields: CustomFieldsComponent;
12
16
  formGroup: FormGroup;
13
17
  fieldFormGroup: string;
@@ -22,10 +26,10 @@ export declare class HistoricalPixAccountComponent implements OnInit, OnDestroy,
22
26
  customEntity: string;
23
27
  customService: string;
24
28
  withSideBar: boolean;
25
- paramsForm: FormGroup;
26
- defaultCpfNumber: string;
27
29
  permission: object;
28
30
  listDataReciever: any[];
31
+ addExistentHistoricData: any[];
32
+ getListPixAccount: object[];
29
33
  isViewModeActive: EventEmitter<any>;
30
34
  isEditModeActive: EventEmitter<any>;
31
35
  isDeleteModeActive: EventEmitter<any>;
@@ -43,28 +47,39 @@ export declare class HistoricalPixAccountComponent implements OnInit, OnDestroy,
43
47
  msgTotalLimitByPercentage: string;
44
48
  listData: object[];
45
49
  listDataNoPage: object[];
50
+ showButtonView: boolean;
51
+ showEditMode: boolean;
52
+ activeIndex: number;
53
+ hasRecordsPix: boolean;
54
+ firstPix: number;
55
+ maxValuePercentage: number;
56
+ hideFields: import("rxjs").Observable<boolean>;
57
+ suggestions: any[];
46
58
  cols: {
47
59
  label: any;
48
60
  field: string;
61
+ orderBy: string;
49
62
  }[];
50
63
  actions: (rowData: any, key: any) => {
51
64
  visible: boolean;
52
65
  label: any;
53
66
  command: () => void;
54
67
  }[];
55
- constructor(translateService: TranslateService, cd: ChangeDetectorRef, formBuilder: FormBuilder, messageService: MessageService);
68
+ constructor(translateService: TranslateService, cd: ChangeDetectorRef, formBuilder: FormBuilder, messageService: MessageService, sharedStateService: SharedStateService, service: HistoricalPixAccountService);
56
69
  ngOnInit(): void;
57
70
  ngOnChanges(changes: SimpleChanges): void;
58
71
  private createFormGroup;
59
72
  ngOnDestroy(): void;
60
73
  ngAfterViewInit(): void;
74
+ filterPixKeyType(event: any): void;
61
75
  onLazyLoad(event?: any): void;
62
76
  /**
63
77
  * Um Bug de CSS que acontece nas linhas da tabela, que resolve só atualizando qualquer parte do CSS da pagina.
64
78
  */
65
79
  private refreshCssInIE11;
66
80
  add(): void;
67
- private isNotAllowMessage;
81
+ addPix(): void;
82
+ deletePix(index: number): void;
68
83
  private deleteAnnuityItem;
69
84
  getHistoricalPixAccountList(): object[];
70
85
  addItemInList($event: any): void;
@@ -77,6 +92,8 @@ export declare class HistoricalPixAccountComponent implements OnInit, OnDestroy,
77
92
  displayDateChange: string;
78
93
  addListData: object[];
79
94
  visible: boolean;
95
+ paramsForm: FormGroup;
96
+ defaultCpfNumber: string;
80
97
  close(): void;
81
98
  getFormattedTelephoneNumber(telephoneNumber: string): string;
82
99
  getFormattedCpf(cpf: string): string;
@@ -5,4 +5,5 @@ export declare class HistoricalPixAccountService {
5
5
  private http;
6
6
  constructor(http: HttpClientService);
7
7
  query(path: string, body: object, service?: ServiceType): Observable<any>;
8
+ enumQuery(): Observable<any>;
8
9
  }
@@ -3,7 +3,9 @@ import { ActivatedRoute, Router } from "@angular/router";
3
3
  import { TranslateService } from "@ngx-translate/core";
4
4
  import { CustomFieldsComponent } from "@seniorsistemas/angular-components";
5
5
  import { ConfirmationService, MessageService } from "primeng/api";
6
+ import { Subject } from "rxjs";
6
7
  import { HistoricalPixAccountListService } from "./historical-pix-account-list.service";
8
+ import { SharedStateService } from "../shared/shared-state.service";
7
9
  export declare class HistoricalPixAccountListComponent implements OnInit, OnDestroy, AfterViewInit {
8
10
  private confirmationService;
9
11
  private translateService;
@@ -12,6 +14,7 @@ export declare class HistoricalPixAccountListComponent implements OnInit, OnDest
12
14
  private router;
13
15
  private messageService;
14
16
  private historicalPixAccountListService;
17
+ private sharedStateService;
15
18
  customFields: CustomFieldsComponent;
16
19
  permission: object;
17
20
  employeeId: string;
@@ -20,11 +23,14 @@ export declare class HistoricalPixAccountListComponent implements OnInit, OnDest
20
23
  endPoint: string;
21
24
  keyPayload: string;
22
25
  withSidebar: boolean;
26
+ hideField: boolean;
23
27
  isOnlyView: EventEmitter<any>;
24
28
  isOnlyEdit: EventEmitter<any>;
25
29
  enableView: EventEmitter<any>;
30
+ isEditJudicialDependentPix: EventEmitter<any>;
26
31
  private lastRecord;
27
32
  private ngUnsubscribe;
33
+ private _subscription;
28
34
  initParameters: any;
29
35
  loading: boolean;
30
36
  parameters: any;
@@ -32,7 +38,7 @@ export declare class HistoricalPixAccountListComponent implements OnInit, OnDest
32
38
  label: any;
33
39
  field: string;
34
40
  }[];
35
- constructor(confirmationService: ConfirmationService, translateService: TranslateService, activatedRoute: ActivatedRoute, cd: ChangeDetectorRef, router: Router, messageService: MessageService, historicalPixAccountListService: HistoricalPixAccountListService);
41
+ constructor(confirmationService: ConfirmationService, translateService: TranslateService, activatedRoute: ActivatedRoute, cd: ChangeDetectorRef, router: Router, messageService: MessageService, historicalPixAccountListService: HistoricalPixAccountListService, sharedStateService: SharedStateService);
36
42
  ngOnInit(): void;
37
43
  ngOnDestroy(): void;
38
44
  ngAfterViewInit(): void;
@@ -45,6 +51,8 @@ export declare class HistoricalPixAccountListComponent implements OnInit, OnDest
45
51
  add(): void;
46
52
  private isNotAllowMessage;
47
53
  private onGridLoad;
54
+ private unsubscribe;
55
+ hideFieldsOnAdd$: Subject<boolean>;
48
56
  private readonly isAllowToAddHistorical;
49
57
  private readonly isAllowToDeleteHistorical;
50
58
  private readonly isAllowToViewHistorical;
@@ -0,0 +1 @@
1
+ export * from './shared-state.service';
@@ -0,0 +1,14 @@
1
+ export declare class SharedStateService {
2
+ private hideFieldSubject;
3
+ hideField$: import("rxjs").Observable<boolean>;
4
+ private showButtonSubject;
5
+ showButton$: import("rxjs").Observable<boolean>;
6
+ private saveButtonSubject;
7
+ saveButton$: import("rxjs").Observable<boolean>;
8
+ private showEditMode;
9
+ showEditMode$: import("rxjs").Observable<boolean>;
10
+ setHideField(value: boolean): void;
11
+ setShowButton(value: boolean): void;
12
+ setSaveButton(value: boolean): void;
13
+ setShowEditMode(value: boolean): void;
14
+ }
@@ -0,0 +1,150 @@
1
+ import { FormGroup, Validators } from "@angular/forms";
2
+ import { GenericValidator } from "../utils/generic-validators";
3
+ import { FormatUtilsService } from "../utils/format-utils/format-utils.service";
4
+ export class HistoricakPixAccountBase {
5
+ constructor(formBuilder) {
6
+ this._paramsForm = new FormGroup({});
7
+ this._defaultCpfNumber = null;
8
+ this.initialValidatorOfPercentage = [Validators.required, Validators.min(0.01)];
9
+ this.pixAccountList = [];
10
+ this.maxValuePercentage = 100.00;
11
+ this.isShowPixKeyFieldValidatorMessage = false;
12
+ this.formBuilder = formBuilder;
13
+ this.createFormGroupBase();
14
+ }
15
+ phoneMask(event) {
16
+ console.log("phoneMaskEvent", event);
17
+ FormatUtilsService.formatTelephoneInputEvent(event);
18
+ }
19
+ onChangePixKeyType(item) {
20
+ console.log("onChangePixKeyType", item);
21
+ if (item.key) {
22
+ this.pixKeyType = item.key;
23
+ this.isShowPixKeyFieldValidatorMessage = true;
24
+ this.pixAccountFormGroup.get("pixKey").reset();
25
+ this.setPixKeyValidators(true);
26
+ if (item.key === "CPF") {
27
+ this.setDefaultCpfPixKey();
28
+ }
29
+ }
30
+ }
31
+ onClearPixKeyType() {
32
+ this.isShowPixKeyFieldValidatorMessage = false;
33
+ this.pixAccountFormGroup.get("pixKey").reset();
34
+ }
35
+ setDefaultCpfPixKey() {
36
+ if (this._defaultCpfNumber) {
37
+ this.pixAccountFormGroup.get("pixKey").setValue(this._defaultCpfNumber);
38
+ }
39
+ else {
40
+ const sheetDocument = this._paramsForm.get("sheetDocument");
41
+ if (sheetDocument) {
42
+ const cpf = sheetDocument.get("cpfNumber").value;
43
+ if (cpf) {
44
+ this.pixAccountFormGroup.get("pixKey").setValue(cpf);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ createFormGroupBase() {
50
+ this.pixAccountFormGroup = this.formBuilder.group({
51
+ id: this.formBuilder.control(null),
52
+ index: this.formBuilder.control(null),
53
+ employee: this.formBuilder.control({ value: { tableId: null }, disabled: true }),
54
+ dateChange: this.formBuilder.control(null),
55
+ pixKeyType: this.formBuilder.control(null, Validators.required),
56
+ pixKey: this.formBuilder.control(null),
57
+ percentage: this.formBuilder.control(null, Validators.compose([
58
+ ...this.initialValidatorOfPercentage,
59
+ Validators.max(this.maxValuePercentage),
60
+ ])),
61
+ externalId: this.formBuilder.control(null),
62
+ customFields: this.formBuilder.control(null),
63
+ });
64
+ }
65
+ setValidatorsAccordingList(pixAccountList, index = null, isEditMode = true) {
66
+ console.log("setValidatorsAccordingList", pixAccountList, index, isEditMode);
67
+ this.pixAccountList = pixAccountList && pixAccountList.length ? [...pixAccountList] : [];
68
+ const percentageIncluded = [];
69
+ this.pixAccountList.forEach((field, key) => {
70
+ if (field["percentage"] && key !== index) {
71
+ percentageIncluded.push(field["percentage"]);
72
+ }
73
+ });
74
+ this.beforeSetPixKeyTypeValidator();
75
+ this.setPixKeyValidators(isEditMode);
76
+ this.validatePercentageValid(percentageIncluded);
77
+ }
78
+ beforeSetPixKeyTypeValidator() {
79
+ const pixKeyType = this.pixAccountFormGroup.get("pixKeyType");
80
+ console.log("beforeSetPixKeyTypeValidator", this.pixAccountList, pixKeyType);
81
+ if (this.pixAccountList && this.pixAccountList.length && pixKeyType) {
82
+ pixKeyType.setValidators(Validators.compose([
83
+ Validators.required,
84
+ this.validateDuplicatePixKeyTypeBankAccount(this.pixAccountList),
85
+ ]));
86
+ }
87
+ else {
88
+ pixKeyType.setValidators(Validators.required);
89
+ }
90
+ }
91
+ setPixKeyValidators(isEditMode) {
92
+ const pixKey = this.pixAccountFormGroup.get("pixKey");
93
+ console.log("setPixKeyValidators", this.pixKeyType, isEditMode);
94
+ if (this.pixKeyType) {
95
+ switch (this.pixKeyType) {
96
+ case "TELEPHONE":
97
+ pixKey.setValidators(Validators.compose([Validators.required, GenericValidator.isValidPhoneNumber]));
98
+ break;
99
+ case "EMAIL":
100
+ pixKey.setValidators(Validators.compose([Validators.required, GenericValidator.isValidEmail]));
101
+ break;
102
+ case "CPF":
103
+ pixKey.setValidators(Validators.compose([Validators.required, GenericValidator.isValidCpf]));
104
+ break;
105
+ case "CNPJ":
106
+ pixKey.setValidators(Validators.compose([Validators.required, GenericValidator.isValidCnpj]));
107
+ break;
108
+ case "RANDOM_KEY":
109
+ pixKey.setValidators(Validators.required);
110
+ break;
111
+ default:
112
+ pixKey.setValidators(null);
113
+ }
114
+ if (isEditMode) {
115
+ pixKey.enable();
116
+ }
117
+ pixKey.updateValueAndValidity();
118
+ }
119
+ }
120
+ validatePercentageValid(listValue) {
121
+ const percentage = this.pixAccountFormGroup.get("percentage");
122
+ this.maxValuePercentage = listValue.reduce((acc, val) => acc - val, 100.00);
123
+ console.log("validatePercentageValid", this.maxValuePercentage);
124
+ percentage.setValidators(Validators.compose([
125
+ ...this.initialValidatorOfPercentage,
126
+ Validators.max(this.maxValuePercentage),
127
+ ]));
128
+ percentage.updateValueAndValidity();
129
+ }
130
+ validateDuplicatePixKeyTypeBankAccount(listCompare) {
131
+ return (control) => {
132
+ const value = control && control.value;
133
+ const isDuplicate = listCompare.some(field => value && field["pixKeyType"].key === 'BANK_ACCOUNT' && value.key === 'BANK_ACCOUNT');
134
+ return isDuplicate ? { pixKeyTypeBankAccountDuplicate: true } : null;
135
+ };
136
+ }
137
+ get paramsForm() {
138
+ return this._paramsForm;
139
+ }
140
+ set paramsForm(value) {
141
+ this._paramsForm = value;
142
+ }
143
+ get defaultCpfNumber() {
144
+ return this._defaultCpfNumber;
145
+ }
146
+ set defaultCpfNumber(value) {
147
+ this._defaultCpfNumber = value;
148
+ }
149
+ }
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yaWNhbC1waXgtYWNjb3VudC1iYXNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tcGVzc29hcy9wYXlyb2xsLWNvcmUvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2hpc3RvcmljYWwtcGl4LWFjY291bnQvaGlzdG9yaWNhbC1waXgtYWNjb3VudC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0MsU0FBUyxFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRWhGLE1BQU0sT0FBZ0Isd0JBQXdCO0lBWTFDLFlBQVksV0FBd0I7UUFWMUIsZ0JBQVcsR0FBYyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxzQkFBaUIsR0FBVyxJQUFJLENBQUM7UUFFcEMsaUNBQTRCLEdBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUYsbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFDOUIsdUJBQWtCLEdBQUcsTUFBTSxDQUFDO1FBRzVCLHNDQUFpQyxHQUFHLEtBQUssQ0FBQztRQUc3QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQVU7UUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVyQyxrQkFBa0IsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBUztRQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFv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RSw4QkFBOEIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pFLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLFVBQVUsQ0FBQyxLQUFnQjtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsZ0JBQWdCLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEdlbmVyaWNWYWxpZGF0b3IgfSBmcm9tIFwiLi4vdXRpbHMvZ2VuZXJpYy12YWxpZGF0b3JzXCI7XG5pbXBvcnQgeyBGb3JtYXRVdGlsc1NlcnZpY2UgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0LXV0aWxzL2Zvcm1hdC11dGlscy5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBIaXN0b3JpY2FrUGl4QWNjb3VudEJhc2Uge1xuICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXI7XG4gICAgcHJvdGVjdGVkIF9wYXJhbXNGb3JtOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRDcGZOdW1iZXI6IHN0cmluZyA9IG51bGw7XG5cbiAgICBwdWJsaWMgaW5pdGlhbFZhbGlkYXRvck9mUGVyY2VudGFnZTogVmFsaWRhdG9yRm5bXSA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjAxKV07XG4gICAgcHVibGljIHBpeEFjY291bnRMaXN0OiBvYmplY3RbXSA9IFtdO1xuICAgIHB1YmxpYyBtYXhWYWx1ZVBlcmNlbnRhZ2UgPSAxMDAuMDA7XG4gICAgcHVibGljIHBpeEtleVR5cGU6IHN0cmluZztcbiAgICBwdWJsaWMgcGl4QWNjb3VudEZvcm1Hcm91cDogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBpc1Nob3dQaXhLZXlGaWVsZFZhbGlkYXRvck1lc3NhZ2UgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge1xuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyID0gZm9ybUJ1aWxkZXI7XG4gICAgICAgIHRoaXMuY3JlYXRlRm9ybUdyb3VwQmFzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwaG9uZU1hc2soZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcInBob25lTWFza0V2ZW50XCIsIGV2ZW50KTtcblxuICAgICAgICBGb3JtYXRVdGlsc1NlcnZpY2UuZm9ybWF0VGVsZXBob25lSW5wdXRFdmVudChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2hhbmdlUGl4S2V5VHlwZShpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJvbkNoYW5nZVBpeEtleVR5cGVcIiwgaXRlbSk7XG5cbiAgICAgICAgaWYgKGl0ZW0ua2V5KSB7XG4gICAgICAgICAgICB0aGlzLnBpeEtleVR5cGUgPSBpdGVtLmtleTtcbiAgICAgICAgICAgIHRoaXMuaXNTaG93UGl4S2V5RmllbGRWYWxpZGF0b3JNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikucmVzZXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGl4S2V5VmFsaWRhdG9ycyh0cnVlKTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ID09PSBcIkNQRlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0Q3BmUGl4S2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25DbGVhclBpeEtleVR5cGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTaG93UGl4S2V5RmllbGRWYWxpZGF0b3JNZXNzYWdlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikucmVzZXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVmYXVsdENwZlBpeEtleSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHRDcGZOdW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikuc2V0VmFsdWUodGhpcy5fZGVmYXVsdENwZk51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzaGVldERvY3VtZW50ID0gdGhpcy5fcGFyYW1zRm9ybS5nZXQoXCJzaGVldERvY3VtZW50XCIpO1xuICAgICAgICAgICAgaWYgKHNoZWV0RG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcGYgPSBzaGVldERvY3VtZW50LmdldChcImNwZk51bWJlclwiKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY3BmKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwaXhLZXlcIikuc2V0VmFsdWUoY3BmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlRm9ybUdyb3VwQmFzZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waXhBY2NvdW50Rm9ybUdyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBpZDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpLFxuICAgICAgICAgICAgaW5kZXg6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKSxcbiAgICAgICAgICAgIGVtcGxveWVlOiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woeyB2YWx1ZTogeyB0YWJsZUlkOiBudWxsIH0sIGRpc2FibGVkOiB0cnVlIH0pLFxuICAgICAgICAgICAgZGF0ZUNoYW5nZTogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpLFxuICAgICAgICAgICAgcGl4S2V5VHlwZTogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgICAgICAgcGl4S2V5OiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCksXG4gICAgICAgICAgICBwZXJjZW50YWdlOiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmluaXRpYWxWYWxpZGF0b3JPZlBlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgodGhpcy5tYXhWYWx1ZVBlcmNlbnRhZ2UpLFxuICAgICAgICAgICAgXSkpLFxuICAgICAgICAgICAgZXh0ZXJuYWxJZDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpLFxuICAgICAgICAgICAgY3VzdG9tRmllbGRzOiB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRWYWxpZGF0b3JzQWNjb3JkaW5nTGlzdChwaXhBY2NvdW50TGlzdDogb2JqZWN0W10sIGluZGV4OiBudW1iZXIgPSBudWxsLCBpc0VkaXRNb2RlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcInNldFZhbGlkYXRvcnNBY2NvcmRpbmdMaXN0XCIsIHBpeEFjY291bnRMaXN0LCBpbmRleCwgaXNFZGl0TW9kZSk7XG5cbiAgICAgICAgdGhpcy5waXhBY2NvdW50TGlzdCA9IHBpeEFjY291bnRMaXN0ICYmIHBpeEFjY291bnRMaXN0Lmxlbmd0aCA/IFsuLi5waXhBY2NvdW50TGlzdF0gOiBbXTtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZUluY2x1ZGVkOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIHRoaXMucGl4QWNjb3VudExpc3QuZm9yRWFjaCgoZmllbGQ6IGFueSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGRbXCJwZXJjZW50YWdlXCJdICYmIGtleSAhPT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBwZXJjZW50YWdlSW5jbHVkZWQucHVzaChmaWVsZFtcInBlcmNlbnRhZ2VcIl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJlZm9yZVNldFBpeEtleVR5cGVWYWxpZGF0b3IoKTtcbiAgICAgICAgdGhpcy5zZXRQaXhLZXlWYWxpZGF0b3JzKGlzRWRpdE1vZGUpO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGVyY2VudGFnZVZhbGlkKHBlcmNlbnRhZ2VJbmNsdWRlZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJlZm9yZVNldFBpeEtleVR5cGVWYWxpZGF0b3IoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBpeEtleVR5cGUgPSB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5VHlwZVwiKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhcImJlZm9yZVNldFBpeEtleVR5cGVWYWxpZGF0b3JcIiwgdGhpcy5waXhBY2NvdW50TGlzdCwgcGl4S2V5VHlwZSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGl4QWNjb3VudExpc3QgJiYgdGhpcy5waXhBY2NvdW50TGlzdC5sZW5ndGggJiYgcGl4S2V5VHlwZSkge1xuICAgICAgICAgICAgcGl4S2V5VHlwZS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlRHVwbGljYXRlUGl4S2V5VHlwZUJhbmtBY2NvdW50KHRoaXMucGl4QWNjb3VudExpc3QpLFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGl4S2V5VHlwZS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldFBpeEtleVZhbGlkYXRvcnMoaXNFZGl0TW9kZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBwaXhLZXkgPSB0aGlzLnBpeEFjY291bnRGb3JtR3JvdXAuZ2V0KFwicGl4S2V5XCIpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFwic2V0UGl4S2V5VmFsaWRhdG9yc1wiLCB0aGlzLnBpeEtleVR5cGUsIGlzRWRpdE1vZGUpO1xuXG4gICAgICAgIGlmICh0aGlzLnBpeEtleVR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5waXhLZXlUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlRFTEVQSE9ORVwiOlxuICAgICAgICAgICAgICAgICAgICBwaXhLZXkuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIEdlbmVyaWNWYWxpZGF0b3IuaXNWYWxpZFBob25lTnVtYmVyXSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiRU1BSUxcIjpcbiAgICAgICAgICAgICAgICAgICAgcGl4S2V5LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRFbWFpbF0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNQRlwiOlxuICAgICAgICAgICAgICAgICAgICBwaXhLZXkuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIEdlbmVyaWNWYWxpZGF0b3IuaXNWYWxpZENwZl0pKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNOUEpcIjpcbiAgICAgICAgICAgICAgICAgICAgcGl4S2V5LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBHZW5lcmljVmFsaWRhdG9yLmlzVmFsaWRDbnBqXSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiUkFORE9NX0tFWVwiOlxuICAgICAgICAgICAgICAgICAgICBwaXhLZXkuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcGl4S2V5LnNldFZhbGlkYXRvcnMobnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0VkaXRNb2RlKSB7XG4gICAgICAgICAgICAgICAgcGl4S2V5LmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwaXhLZXkudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRlUGVyY2VudGFnZVZhbGlkKGxpc3RWYWx1ZTogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IHRoaXMucGl4QWNjb3VudEZvcm1Hcm91cC5nZXQoXCJwZXJjZW50YWdlXCIpO1xuICAgICAgICB0aGlzLm1heFZhbHVlUGVyY2VudGFnZSA9IGxpc3RWYWx1ZS5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgLSB2YWwsIDEwMC4wMCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJ2YWxpZGF0ZVBlcmNlbnRhZ2VWYWxpZFwiLCB0aGlzLm1heFZhbHVlUGVyY2VudGFnZSk7XG5cbiAgICAgICAgcGVyY2VudGFnZS5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICAuLi50aGlzLmluaXRpYWxWYWxpZGF0b3JPZlBlcmNlbnRhZ2UsXG4gICAgICAgICAgICBWYWxpZGF0b3JzLm1heCh0aGlzLm1heFZhbHVlUGVyY2VudGFnZSksXG4gICAgICAgIF0pKTtcbiAgICAgICAgcGVyY2VudGFnZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZUR1cGxpY2F0ZVBpeEtleVR5cGVCYW5rQWNjb3VudChsaXN0Q29tcGFyZTogb2JqZWN0W10pIHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0b3JzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbCAmJiBjb250cm9sLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBsaXN0Q29tcGFyZS5zb21lKGZpZWxkID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgJiYgZmllbGRbXCJwaXhLZXlUeXBlXCJdLmtleSA9PT0gJ0JBTktfQUNDT1VOVCcgJiYgdmFsdWUua2V5ID09PSAnQkFOS19BQ0NPVU5UJ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIGlzRHVwbGljYXRlID8geyBwaXhLZXlUeXBlQmFua0FjY291bnREdXBsaWNhdGU6IHRydWUgfSA6IG51bGw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJhbXNGb3JtKCk6IEZvcm1Hcm91cCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbXNGb3JtO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFyYW1zRm9ybSh2YWx1ZTogRm9ybUdyb3VwKSB7XG4gICAgICAgIHRoaXMuX3BhcmFtc0Zvcm0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRDcGZOdW1iZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRDcGZOdW1iZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkZWZhdWx0Q3BmTnVtYmVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdENwZk51bWJlciA9IHZhbHVlO1xuICAgIH1cbn1cbiJdfQ==