brainloper-ui 14.0.17 → 14.0.18

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 (97) hide show
  1. package/esm2020/brainloper-ui.mjs +5 -0
  2. package/esm2020/public_api.mjs +53 -0
  3. package/esm2020/src/app/modules/brainloper-ui/brainloper-ui.module.mjs +305 -0
  4. package/esm2020/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.mjs +29 -0
  5. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.mjs +23 -0
  6. package/esm2020/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.mjs +83 -0
  7. package/esm2020/src/app/modules/brainloper-ui/components/carousel/carousel.component.mjs +31 -0
  8. package/esm2020/src/app/modules/brainloper-ui/components/combos/combos.component.mjs +176 -0
  9. package/esm2020/src/app/modules/brainloper-ui/components/data-table/data-table.component.mjs +691 -0
  10. package/esm2020/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.mjs +118 -0
  11. package/esm2020/src/app/modules/brainloper-ui/components/file-input/file-input.component.mjs +185 -0
  12. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.mjs +2 -0
  13. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.mjs +2 -0
  14. package/esm2020/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.mjs +2 -0
  15. package/esm2020/src/app/modules/brainloper-ui/components/filters/filters.component.mjs +222 -0
  16. package/esm2020/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.mjs +80 -0
  17. package/esm2020/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.mjs +81 -0
  18. package/esm2020/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.mjs +108 -0
  19. package/esm2020/src/app/modules/data/rolesAndPermissions.mjs +491 -0
  20. package/esm2020/src/app/modules/interfaces/buttons/button-icon.mjs +2 -0
  21. package/esm2020/src/app/modules/interfaces/buttons/button-lavel-edit.mjs +2 -0
  22. package/esm2020/src/app/modules/interfaces/combos/combos-configuration.mjs +2 -0
  23. package/esm2020/src/app/modules/interfaces/common/Permissions.mjs +8 -0
  24. package/esm2020/src/app/modules/interfaces/data-table/params.mjs +2 -0
  25. package/esm2020/src/app/modules/interfaces/data-table/rules.mjs +2 -0
  26. package/esm2020/src/app/modules/interfaces/data-table/table-columns.mjs +2 -0
  27. package/esm2020/src/app/modules/interfaces/data-table/table-configuration.mjs +2 -0
  28. package/esm2020/src/app/modules/interfaces/enum/enumActions.mjs +7 -0
  29. package/esm2020/src/app/modules/interfaces/enum/enumRules.mjs +8 -0
  30. package/esm2020/src/app/modules/interfaces/file-forms-service/file-forms-params.mjs +2 -0
  31. package/esm2020/src/app/modules/interfaces/file-forms-service/file-input-params.mjs +2 -0
  32. package/esm2020/src/app/modules/interfaces/filters/header-filters.mjs +2 -0
  33. package/esm2020/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.mjs +8 -0
  34. package/esm2020/src/app/modules/interfaces/report/template-pdf-ot.mjs +2 -0
  35. package/esm2020/src/app/modules/interfaces/report/template-pfd-fo.mjs +2 -0
  36. package/esm2020/src/app/modules/services/crypto.service.mjs +37 -0
  37. package/esm2020/src/app/modules/services/export-data.service.mjs +166 -0
  38. package/esm2020/src/app/modules/services/file-forms.service.mjs +24 -0
  39. package/esm2020/src/app/modules/services/functions.service.mjs +54 -0
  40. package/esm2020/src/app/modules/services/generate-pdf.service.mjs +58 -0
  41. package/esm2020/src/app/modules/services/http.service.mjs +154 -0
  42. package/esm2020/src/app/modules/services/loading/loading.component.mjs +28 -0
  43. package/esm2020/src/app/modules/services/local-storage.service.mjs +115 -0
  44. package/esm2020/src/app/modules/services/message.service.mjs +200 -0
  45. package/esm2020/src/app/modules/services/screen-size-util.mjs +6 -0
  46. package/esm2020/src/app/modules/services/session.service.mjs +42 -0
  47. package/fesm2015/brainloper-ui.mjs +3443 -0
  48. package/fesm2015/brainloper-ui.mjs.map +1 -0
  49. package/fesm2020/brainloper-ui.mjs +3404 -0
  50. package/fesm2020/brainloper-ui.mjs.map +1 -0
  51. package/index.d.ts +5 -0
  52. package/package.json +1 -5
  53. package/public_api.d.ts +52 -0
  54. package/src/app/modules/brainloper-ui/brainloper-ui.module.d.ts +73 -0
  55. package/src/app/modules/brainloper-ui/components/bread-crumb/bread-crumb.component.d.ts +13 -0
  56. package/src/app/modules/brainloper-ui/components/buttons/button-icon/button-icon.component.d.ts +10 -0
  57. package/src/app/modules/brainloper-ui/components/buttons/button-label/button-label.component.d.ts +24 -0
  58. package/src/app/modules/brainloper-ui/components/carousel/carousel.component.d.ts +12 -0
  59. package/src/app/modules/brainloper-ui/components/combos/combos.component.d.ts +46 -0
  60. package/src/app/modules/brainloper-ui/components/data-table/data-table.component.d.ts +121 -0
  61. package/src/app/modules/brainloper-ui/components/data-table/table-modal/table-modal.component.d.ts +21 -0
  62. package/src/app/modules/brainloper-ui/components/file-input/file-input.component.d.ts +42 -0
  63. package/src/app/modules/brainloper-ui/components/file-input/imagenes/doc.d.ts +2 -0
  64. package/src/app/modules/brainloper-ui/components/file-input/imagenes/fondoTransparente.d.ts +2 -0
  65. package/src/app/modules/brainloper-ui/components/file-input/imagenes/pdf.d.ts +2 -0
  66. package/src/app/modules/brainloper-ui/components/filters/filters.component.d.ts +30 -0
  67. package/src/app/modules/brainloper-ui/components/report/generate-pdf/generate-pdf.component.d.ts +35 -0
  68. package/src/app/modules/brainloper-ui/components/report/template-fuel/template-fuel.component.d.ts +36 -0
  69. package/src/app/modules/brainloper-ui/components/select-filter/select-filter.component.d.ts +26 -0
  70. package/src/app/modules/data/rolesAndPermissions.d.ts +2 -0
  71. package/src/app/modules/interfaces/buttons/button-icon.d.ts +9 -0
  72. package/src/app/modules/interfaces/buttons/button-lavel-edit.d.ts +6 -0
  73. package/src/app/modules/interfaces/combos/combos-configuration.d.ts +13 -0
  74. package/src/app/modules/interfaces/common/Permissions.d.ts +40 -0
  75. package/src/app/modules/interfaces/data-table/params.d.ts +7 -0
  76. package/src/app/modules/interfaces/data-table/rules.d.ts +8 -0
  77. package/src/app/modules/interfaces/data-table/table-columns.d.ts +25 -0
  78. package/src/app/modules/interfaces/data-table/table-configuration.d.ts +25 -0
  79. package/src/app/modules/interfaces/enum/enumActions.d.ts +5 -0
  80. package/src/app/modules/interfaces/enum/enumRules.d.ts +6 -0
  81. package/src/app/modules/interfaces/file-forms-service/file-forms-params.d.ts +4 -0
  82. package/src/app/modules/interfaces/file-forms-service/file-input-params.d.ts +13 -0
  83. package/src/app/modules/interfaces/filters/header-filters.d.ts +13 -0
  84. package/src/app/modules/interfaces/menu-break-crumb/menu-break-crumb.d.ts +10 -0
  85. package/src/app/modules/interfaces/report/template-pdf-ot.d.ts +19 -0
  86. package/src/app/modules/interfaces/report/template-pfd-fo.d.ts +20 -0
  87. package/src/app/modules/services/crypto.service.d.ts +10 -0
  88. package/src/app/modules/services/export-data.service.d.ts +18 -0
  89. package/src/app/modules/services/file-forms.service.d.ts +7 -0
  90. package/src/app/modules/services/functions.service.d.ts +13 -0
  91. package/src/app/modules/services/generate-pdf.service.d.ts +12 -0
  92. package/src/app/modules/services/http.service.d.ts +21 -0
  93. package/src/app/modules/services/loading/loading.component.d.ts +15 -0
  94. package/src/app/modules/services/local-storage.service.d.ts +49 -0
  95. package/src/app/modules/services/message.service.d.ts +23 -0
  96. package/src/app/modules/services/screen-size-util.d.ts +3 -0
  97. package/src/app/modules/services/session.service.d.ts +14 -0
@@ -0,0 +1,108 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ import * as i2 from "@angular/common";
5
+ import * as i3 from "@angular/material/progress-spinner";
6
+ import * as i4 from "@angular/material/input";
7
+ export class SelectFilterComponent {
8
+ constructor(fb) {
9
+ this.showSpinner = true;
10
+ this.noResultsMessage = 'No results';
11
+ this.noResults = false;
12
+ this.localSpinner = false;
13
+ this.filteredReturn = new EventEmitter();
14
+ this.filteredItems = [];
15
+ this.searchForm = fb.group({
16
+ value: ''
17
+ });
18
+ }
19
+ ngOnInit() {
20
+ this.searchFormValueChangesSubscription = this.searchForm.valueChanges.subscribe(value => {
21
+ const searchValue = value['value'] ? value['value'].toLowerCase() : '';
22
+ if (this.showSpinner) {
23
+ this.localSpinner = true;
24
+ }
25
+ if (searchValue) {
26
+ if (this.displayMember == null) {
27
+ this.filteredItems = this.array.filter(name => name.toLowerCase().includes(searchValue));
28
+ }
29
+ else if (this.hasGroup && this.groupArrayName && this.displayMember) {
30
+ this.filteredItems = this.array.map(a => {
31
+ const objCopy = { ...a };
32
+ objCopy[this.groupArrayName] = objCopy[this.groupArrayName].filter(g => g[this.displayMember].toLowerCase().includes(searchValue));
33
+ return objCopy;
34
+ }).filter(x => x[this.groupArrayName].length > 0);
35
+ }
36
+ else {
37
+ this.filteredItems = this.array.filter(name => name[this.displayMember].toLowerCase().includes(searchValue));
38
+ }
39
+ this.noResults = this.filteredItems.length === 0;
40
+ }
41
+ else {
42
+ this.filteredItems = [...this.array];
43
+ this.noResults = false;
44
+ }
45
+ this.filteredReturn.emit(this.filteredItems);
46
+ setTimeout(() => {
47
+ if (this.showSpinner) {
48
+ this.localSpinner = false;
49
+ }
50
+ }, 2000);
51
+ });
52
+ setTimeout(() => {
53
+ this.input.nativeElement.focus();
54
+ }, 500);
55
+ if (!this.placeholder) {
56
+ this.placeholder = 'Search...';
57
+ }
58
+ }
59
+ handleKeydown(event) {
60
+ const isAlphanumeric = (event.key && event.key.length === 1) ||
61
+ (event.code >= 'KeyA' && event.code <= 'KeyZ') ||
62
+ (event.code >= 'Digit0' && event.code <= 'Digit9') ||
63
+ (event.code === 'Space');
64
+ if (isAlphanumeric) {
65
+ event.stopPropagation();
66
+ }
67
+ }
68
+ ngOnDestroy() {
69
+ this.filteredReturn.emit(this.array);
70
+ this.searchFormValueChangesSubscription.unsubscribe();
71
+ }
72
+ }
73
+ SelectFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectFilterComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
74
+ SelectFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SelectFilterComponent, selector: "app-select-filter", inputs: { array: "array", placeholder: "placeholder", color: "color", displayMember: "displayMember", showSpinner: "showSpinner", noResultsMessage: "noResultsMessage", hasGroup: "hasGroup", groupArrayName: "groupArrayName" }, outputs: { filteredReturn: "filteredReturn" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, static: true }], ngImport: i0, template: "<form [formGroup]=\"searchForm\" class=\"mat-filter\" [ngStyle]=\"{'background-color': color ? color : 'white'}\">\n <div>\n <input #input class=\"mat-filter-input\" matInput placeholder=\"{{placeholder}}\" formControlName=\"value\" (keydown)=\"handleKeydown($event)\">\n <mat-spinner *ngIf=\"localSpinner\" class=\"spinner\" diameter=\"16\"></mat-spinner>\n </div>\n <div *ngIf=\"noResults\"\n class=\"noResultsMessage\">\n {{noResultsMessage}}\n</div>\n</form>\n", styles: [".mat-filter{position:sticky;top:0;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:gray;z-index:100;font-size:inherit;box-shadow:none;border-radius:0;padding:16px;box-sizing:border-box}.mat-filter-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;border:0;background-color:transparent;background-color:initial;color:gray;width:100%}.spinner{position:absolute;right:16px;top:calc(50% - 8px)}.noResultsMessage{margin-top:10px;font-family:Roboto,Helvetica Neue,sans-serif;font-size:16px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectFilterComponent, decorators: [{
76
+ type: Component,
77
+ args: [{ selector: 'app-select-filter', template: "<form [formGroup]=\"searchForm\" class=\"mat-filter\" [ngStyle]=\"{'background-color': color ? color : 'white'}\">\n <div>\n <input #input class=\"mat-filter-input\" matInput placeholder=\"{{placeholder}}\" formControlName=\"value\" (keydown)=\"handleKeydown($event)\">\n <mat-spinner *ngIf=\"localSpinner\" class=\"spinner\" diameter=\"16\"></mat-spinner>\n </div>\n <div *ngIf=\"noResults\"\n class=\"noResultsMessage\">\n {{noResultsMessage}}\n</div>\n</form>\n", styles: [".mat-filter{position:sticky;top:0;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:gray;z-index:100;font-size:inherit;box-shadow:none;border-radius:0;padding:16px;box-sizing:border-box}.mat-filter-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;border:0;background-color:transparent;background-color:initial;color:gray;width:100%}.spinner{position:absolute;right:16px;top:calc(50% - 8px)}.noResultsMessage{margin-top:10px;font-family:Roboto,Helvetica Neue,sans-serif;font-size:16px}\n"] }]
78
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { input: [{
79
+ type: ViewChild,
80
+ args: ['input', { static: true }]
81
+ }], array: [{
82
+ type: Input,
83
+ args: ['array']
84
+ }], placeholder: [{
85
+ type: Input,
86
+ args: ['placeholder']
87
+ }], color: [{
88
+ type: Input,
89
+ args: ['color']
90
+ }], displayMember: [{
91
+ type: Input,
92
+ args: ['displayMember']
93
+ }], showSpinner: [{
94
+ type: Input,
95
+ args: ['showSpinner']
96
+ }], noResultsMessage: [{
97
+ type: Input,
98
+ args: ['noResultsMessage']
99
+ }], hasGroup: [{
100
+ type: Input,
101
+ args: ['hasGroup']
102
+ }], groupArrayName: [{
103
+ type: Input,
104
+ args: ['groupArrayName']
105
+ }], filteredReturn: [{
106
+ type: Output
107
+ }] } });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL3NlbGVjdC1maWx0ZXIvc2VsZWN0LWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYnJhaW5sb3Blci11aS9jb21wb25lbnRzL3NlbGVjdC1maWx0ZXIvc2VsZWN0LWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQWdCckcsTUFBTSxPQUFPLHFCQUFxQjtJQXNCaEMsWUFBWSxFQUFlO1FBYkwsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDZCxxQkFBZ0IsR0FBRyxZQUFZLENBQUM7UUFJM0QsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNYLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUU1QyxrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUk3QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDekIsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckYsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxD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UUFBUSxDQUFDO1lBQ2xELENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQztRQUU3QixJQUFJLGNBQWMsRUFBRTtZQUNoQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRUMsV0FBVztRQUNULElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEQsQ0FBQzs7a0hBeEZVLHFCQUFxQjtzR0FBckIscUJBQXFCLHdiQ2hCbEMsOGRBVUE7MkZETWEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjtrR0FPUyxLQUFLO3NCQUExQyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBCLEtBQUs7c0JBQXBCLEtBQUs7dUJBQUMsT0FBTztnQkFDUSxXQUFXO3NCQUFoQyxLQUFLO3VCQUFDLGFBQWE7Z0JBQ0osS0FBSztzQkFBcEIsS0FBSzt1QkFBQyxPQUFPO2dCQUNVLGFBQWE7c0JBQXBDLEtBQUs7dUJBQUMsZUFBZTtnQkFDQSxXQUFXO3NCQUFoQyxLQUFLO3VCQUFDLGFBQWE7Z0JBQ08sZ0JBQWdCO3NCQUExQyxLQUFLO3VCQUFDLGtCQUFrQjtnQkFDTixRQUFRO3NCQUExQixLQUFLO3VCQUFDLFVBQVU7Z0JBQ1EsY0FBYztzQkFBdEMsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBS2IsY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBBLFxuICBaLFxuICBaRVJPLFxuICBOSU5FLFxuICBTUEFDRSwgRU5ELCBIT01FLFxufSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2VsZWN0LWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LWZpbHRlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdEZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95ICB7XG5cbiAgcHJpdmF0ZSBzZWFyY2hGb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyBzdGF0aWM6IHRydWUgfSkgaW5wdXQ7XG5cbiAgQElucHV0KCdhcnJheScpIGFycmF5OiBhbnk7XG4gIEBJbnB1dCgncGxhY2Vob2xkZXInKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoJ2NvbG9yJykgY29sb3I6IHN0cmluZztcbiAgQElucHV0KCdkaXNwbGF5TWVtYmVyJykgZGlzcGxheU1lbWJlcjogc3RyaW5nO1xuICBASW5wdXQoJ3Nob3dTcGlubmVyJykgc2hvd1NwaW5uZXIgPSB0cnVlO1xuICBASW5wdXQoJ25vUmVzdWx0c01lc3NhZ2UnKSBub1Jlc3VsdHNNZXNzYWdlID0gJ05vIHJlc3VsdHMnO1xuICBASW5wdXQoJ2hhc0dyb3VwJykgaGFzR3JvdXA6IGJvb2xlYW47XG4gIEBJbnB1dCgnZ3JvdXBBcnJheU5hbWUnKSBncm91cEFycmF5TmFtZTogc3RyaW5nO1xuXG4gIG5vUmVzdWx0cyA9IGZhbHNlO1xuXG4gIGxvY2FsU3Bpbm5lciA9IGZhbHNlO1xuICBAT3V0cHV0KCkgZmlsdGVyZWRSZXR1cm4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwdWJsaWMgZmlsdGVyZWRJdGVtczogYW55ID0gW107XG4gIHB1YmxpYyBzZWFyY2hGb3JtOiBGb3JtR3JvdXA7XG5cbiAgY29uc3RydWN0b3IoZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5zZWFyY2hGb3JtID0gZmIuZ3JvdXAoe1xuICAgICAgdmFsdWU6ICcnXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNlYXJjaEZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLnNlYXJjaEZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFZhbHVlID0gdmFsdWVbJ3ZhbHVlJ10gPyB2YWx1ZVsndmFsdWUnXS50b0xvd2VyQ2FzZSgpIDogJyc7XG4gICAgICAgIGlmICh0aGlzLnNob3dTcGlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3Bpbm5lciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlNZW1iZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuYXJyYXkuZmlsdGVyKG5hbWUgPT4gbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzR3JvdXAgJiYgdGhpcy5ncm91cEFycmF5TmFtZSAmJiB0aGlzLmRpc3BsYXlNZW1iZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLmFycmF5Lm1hcChhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqQ29weSA9IHsgLi4uYSB9O1xuICAgICAgICAgICAgICAgICAgICBvYmpDb3B5W3RoaXMuZ3JvdXBBcnJheU5hbWVdID0gb2JqQ29weVt0aGlzLmdyb3VwQXJyYXlOYW1lXS5maWx0ZXIoZyA9PiBnW3RoaXMuZGlzcGxheU1lbWJlcl0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqQ29weTtcbiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiB4W3RoaXMuZ3JvdXBBcnJheU5hbWVdLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLmFycmF5LmZpbHRlcihuYW1lID0+IG5hbWVbdGhpcy5kaXNwbGF5TWVtYmVyXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFZhbHVlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubm9SZXN1bHRzID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFsuLi50aGlzLmFycmF5XTtcbiAgICAgICAgICAgIHRoaXMubm9SZXN1bHRzID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlcmVkUmV0dXJuLmVtaXQodGhpcy5maWx0ZXJlZEl0ZW1zKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dTcGlubmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbFNwaW5uZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwMCk7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSwgNTAwKTtcblxuICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gJ1NlYXJjaC4uLic7XG4gICAgfVxufVxuXG5cblxuICBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgaXNBbHBoYW51bWVyaWMgPSAoZXZlbnQua2V5ICYmIGV2ZW50LmtleS5sZW5ndGggPT09IDEpIHx8XG4gICAgICAgIChldmVudC5jb2RlID49ICdLZXlBJyAmJiBldmVudC5jb2RlIDw9ICdLZXlaJykgfHxcbiAgICAgICAgKGV2ZW50LmNvZGUgPj0gJ0RpZ2l0MCcgJiYgZXZlbnQuY29kZSA8PSAnRGlnaXQ5JykgfHxcbiAgICAgICAgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpO1xuXG4gICAgaWYgKGlzQWxwaGFudW1lcmljKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbn1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmZpbHRlcmVkUmV0dXJuLmVtaXQodGhpcy5hcnJheSk7XG4gICAgdGhpcy5zZWFyY2hGb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJzZWFyY2hGb3JtXCIgY2xhc3M9XCJtYXQtZmlsdGVyXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogY29sb3IgPyBjb2xvciA6ICd3aGl0ZSd9XCI+XG4gIDxkaXY+XG4gIDxpbnB1dCAjaW5wdXQgY2xhc3M9XCJtYXQtZmlsdGVyLWlucHV0XCIgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlaG9sZGVyfX1cIiBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiIChrZXlkb3duKT1cImhhbmRsZUtleWRvd24oJGV2ZW50KVwiPlxuICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImxvY2FsU3Bpbm5lclwiIGNsYXNzPVwic3Bpbm5lclwiIGRpYW1ldGVyPVwiMTZcIj48L21hdC1zcGlubmVyPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIm5vUmVzdWx0c1wiXG4gICAgIGNsYXNzPVwibm9SZXN1bHRzTWVzc2FnZVwiPlxuICB7e25vUmVzdWx0c01lc3NhZ2V9fVxuPC9kaXY+XG48L2Zvcm0+XG4iXX0=