@seniorsistemas/components-ai 0.0.0-master-d4a804fe

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 (76) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/CONTRIBUTING.md +317 -0
  3. package/README.md +161 -0
  4. package/docs/API.md +486 -0
  5. package/docs/COMPONENTS.md +272 -0
  6. package/docs/EXAMPLES.md +559 -0
  7. package/docs/MIGRATION.md +367 -0
  8. package/esm2022/lib/angular-components.module.mjs +25 -0
  9. package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +121 -0
  10. package/esm2022/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.mjs +176 -0
  11. package/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +625 -0
  12. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-date.component.mjs +86 -0
  13. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-dropdown.component.mjs +103 -0
  14. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-lookup.component.mjs +599 -0
  15. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-number.component.mjs +92 -0
  16. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-text.component.mjs +163 -0
  17. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-textarea.component.mjs +81 -0
  18. package/esm2022/lib/components/dynamic-form/fields/dynamic-field-wrapper.component.mjs +93 -0
  19. package/esm2022/lib/components/dynamic-form/fields/index.mjs +8 -0
  20. package/esm2022/lib/components/dynamic-form/models/dynamic-form.models.mjs +2 -0
  21. package/esm2022/lib/components/export-dialog/export-dialog.component.mjs +219 -0
  22. package/esm2022/lib/config/translation.config.mjs +70 -0
  23. package/esm2022/lib/directives/cep-mask.directive.mjs +79 -0
  24. package/esm2022/lib/directives/document-mask.directive.mjs +62 -0
  25. package/esm2022/lib/directives/phone-mask.directive.mjs +59 -0
  26. package/esm2022/lib/interceptors/api.interceptor.mjs +55 -0
  27. package/esm2022/lib/models/base-entity.interface.mjs +2 -0
  28. package/esm2022/lib/models/entity-list.config.mjs +2 -0
  29. package/esm2022/lib/pipes/translate.pipe.mjs +74 -0
  30. package/esm2022/lib/services/auth.service.mjs +169 -0
  31. package/esm2022/lib/services/cookie.service.mjs +90 -0
  32. package/esm2022/lib/services/entity.service.mjs +208 -0
  33. package/esm2022/lib/services/mask.service.mjs +121 -0
  34. package/esm2022/lib/services/permission.service.mjs +180 -0
  35. package/esm2022/lib/services/senior-token.service.mjs +209 -0
  36. package/esm2022/lib/services/theme.service.mjs +85 -0
  37. package/esm2022/lib/services/translation.service.mjs +232 -0
  38. package/esm2022/public-api.mjs +90 -0
  39. package/esm2022/seniorsistemas-components-ai.mjs +5 -0
  40. package/fesm2022/seniorsistemas-components-ai.mjs +4006 -0
  41. package/fesm2022/seniorsistemas-components-ai.mjs.map +1 -0
  42. package/index.d.ts +5 -0
  43. package/lib/angular-components.module.d.ts +13 -0
  44. package/lib/components/breadcrumb/breadcrumb.component.d.ts +23 -0
  45. package/lib/components/bulk-delete-dialog/bulk-delete-dialog.component.d.ts +46 -0
  46. package/lib/components/dynamic-form/dynamic-form.component.d.ts +97 -0
  47. package/lib/components/dynamic-form/fields/dynamic-field-date.component.d.ts +16 -0
  48. package/lib/components/dynamic-form/fields/dynamic-field-dropdown.component.d.ts +17 -0
  49. package/lib/components/dynamic-form/fields/dynamic-field-lookup.component.d.ts +52 -0
  50. package/lib/components/dynamic-form/fields/dynamic-field-number.component.d.ts +16 -0
  51. package/lib/components/dynamic-form/fields/dynamic-field-text.component.d.ts +17 -0
  52. package/lib/components/dynamic-form/fields/dynamic-field-textarea.component.d.ts +16 -0
  53. package/lib/components/dynamic-form/fields/dynamic-field-wrapper.component.d.ts +20 -0
  54. package/lib/components/dynamic-form/fields/index.d.ts +7 -0
  55. package/lib/components/dynamic-form/models/dynamic-form.models.d.ts +178 -0
  56. package/lib/components/export-dialog/export-dialog.component.d.ts +56 -0
  57. package/lib/config/translation.config.d.ts +24 -0
  58. package/lib/directives/cep-mask.directive.d.ts +13 -0
  59. package/lib/directives/document-mask.directive.d.ts +19 -0
  60. package/lib/directives/phone-mask.directive.d.ts +11 -0
  61. package/lib/interceptors/api.interceptor.d.ts +2 -0
  62. package/lib/models/base-entity.interface.d.ts +7 -0
  63. package/lib/models/entity-list.config.d.ts +161 -0
  64. package/lib/pipes/translate.pipe.d.ts +21 -0
  65. package/lib/services/auth.service.d.ts +82 -0
  66. package/lib/services/cookie.service.d.ts +31 -0
  67. package/lib/services/entity.service.d.ts +99 -0
  68. package/lib/services/mask.service.d.ts +36 -0
  69. package/lib/services/permission.service.d.ts +91 -0
  70. package/lib/services/senior-token.service.d.ts +70 -0
  71. package/lib/services/theme.service.d.ts +16 -0
  72. package/lib/services/translation.service.d.ts +54 -0
  73. package/package.json +53 -0
  74. package/public-api.d.ts +17 -0
  75. package/src/lib/styles/entity-list.shared.scss +383 -0
  76. package/src/lib/styles/index.scss +10 -0
@@ -0,0 +1,219 @@
1
+ import { Component, EventEmitter, Input, Output, Optional, Inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { DialogModule } from 'primeng/dialog';
5
+ import { ButtonModule } from 'primeng/button';
6
+ import { RadioButtonModule } from 'primeng/radiobutton';
7
+ import { CheckboxModule } from 'primeng/checkbox';
8
+ import { DividerModule } from 'primeng/divider';
9
+ import * as XLSX from 'xlsx';
10
+ import { jsPDF } from 'jspdf';
11
+ import autoTable from 'jspdf-autotable';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/common";
14
+ import * as i2 from "@angular/forms";
15
+ import * as i3 from "primeng/dialog";
16
+ import * as i4 from "primeng/api";
17
+ import * as i5 from "primeng/button";
18
+ import * as i6 from "primeng/radiobutton";
19
+ import * as i7 from "primeng/checkbox";
20
+ export class ExportDialogComponent {
21
+ translationService;
22
+ visible = false;
23
+ allRecords = [];
24
+ selectedRecords = [];
25
+ statusLabels;
26
+ translationPrefix = 'crmx.business';
27
+ set availableColumns(columns) {
28
+ if (columns && columns.length > 0) {
29
+ this.columns = columns;
30
+ }
31
+ }
32
+ visibleChange = new EventEmitter();
33
+ exportFormat = 'xlsx';
34
+ exportScope = 'all';
35
+ formats = [];
36
+ scopes = [];
37
+ columns = [];
38
+ constructor(translationService) {
39
+ this.translationService = translationService;
40
+ this.initializeFormats();
41
+ this.initializeScopes();
42
+ }
43
+ ngOnChanges() {
44
+ this.initializeFormats();
45
+ this.initializeScopes();
46
+ }
47
+ t(key) {
48
+ if (this.translationService) {
49
+ return this.translationService.translate(`${this.translationPrefix}.${key}`);
50
+ }
51
+ return key;
52
+ }
53
+ initializeFormats() {
54
+ this.formats = [
55
+ {
56
+ value: 'xlsx',
57
+ label: 'Excel',
58
+ icon: 'pi-file-excel',
59
+ description: this.t('export_excel_description')
60
+ },
61
+ {
62
+ value: 'pdf',
63
+ label: 'PDF',
64
+ icon: 'pi-file-pdf',
65
+ description: this.t('export_pdf_description')
66
+ }
67
+ ];
68
+ }
69
+ initializeScopes() {
70
+ this.scopes = [
71
+ {
72
+ value: 'all',
73
+ label: this.t('export_all_records'),
74
+ icon: 'pi-list',
75
+ description: this.t('export_all_records_description')
76
+ },
77
+ {
78
+ value: 'selected',
79
+ label: this.t('export_selected_records'),
80
+ icon: 'pi-check-square',
81
+ description: this.t('export_selected_records_description')
82
+ }
83
+ ];
84
+ }
85
+ get recordsToExport() {
86
+ return this.exportScope === 'all' ? this.allRecords : this.selectedRecords;
87
+ }
88
+ get selectedColumnsCount() {
89
+ return this.columns.filter(col => col.selected).length;
90
+ }
91
+ get canExport() {
92
+ return this.selectedColumnsCount > 0 && this.recordsToExport.length > 0;
93
+ }
94
+ onHide() {
95
+ this.visibleChange.emit(false);
96
+ }
97
+ selectAllColumns() {
98
+ this.columns.forEach(col => col.selected = true);
99
+ }
100
+ deselectAllColumns() {
101
+ this.columns.forEach(col => col.selected = false);
102
+ }
103
+ export() {
104
+ if (!this.canExport)
105
+ return;
106
+ if (this.exportFormat === 'xlsx') {
107
+ this.exportToExcel();
108
+ }
109
+ else {
110
+ this.exportToPDF();
111
+ }
112
+ this.onHide();
113
+ }
114
+ exportToExcel() {
115
+ const selectedColumns = this.columns.filter(col => col.selected);
116
+ const data = this.recordsToExport.map(record => {
117
+ const row = {};
118
+ selectedColumns.forEach(col => {
119
+ if (col.field === 'status' && record.status && this.statusLabels) {
120
+ row[col.header] = this.statusLabels[record.status];
121
+ }
122
+ else {
123
+ row[col.header] = record[col.field];
124
+ }
125
+ });
126
+ return row;
127
+ });
128
+ const worksheet = XLSX.utils.json_to_sheet(data);
129
+ const workbook = XLSX.utils.book_new();
130
+ XLSX.utils.book_append_sheet(workbook, worksheet, this.t('export_data_sheet_name'));
131
+ // Ajustar largura das colunas
132
+ const maxWidth = 30;
133
+ const colWidths = selectedColumns.map(col => ({
134
+ wch: Math.min(col.header.length + 5, maxWidth)
135
+ }));
136
+ worksheet['!cols'] = colWidths;
137
+ const fileName = `export-${new Date().getTime()}.xlsx`;
138
+ XLSX.writeFile(workbook, fileName);
139
+ }
140
+ exportToPDF() {
141
+ const doc = new jsPDF();
142
+ const selectedColumns = this.columns.filter(col => col.selected);
143
+ // Título
144
+ doc.setFontSize(18);
145
+ doc.setTextColor(18, 168, 133);
146
+ doc.text(this.t('export_pdf_title'), 14, 20);
147
+ // Subtítulo
148
+ doc.setFontSize(10);
149
+ doc.setTextColor(100);
150
+ doc.text(`${this.t('export_exported_at')}: ${new Date().toLocaleString('pt-BR')}`, 14, 28);
151
+ doc.text(`${this.t('export_total_records')}: ${this.recordsToExport.length}`, 14, 34);
152
+ // Preparar dados
153
+ const headers = selectedColumns.map(col => col.header);
154
+ const data = this.recordsToExport.map(record => {
155
+ return selectedColumns.map(col => {
156
+ if (col.field === 'status' && record.status && this.statusLabels) {
157
+ return this.statusLabels[record.status];
158
+ }
159
+ return String(record[col.field] || '');
160
+ });
161
+ });
162
+ // Tabela
163
+ autoTable(doc, {
164
+ head: [headers],
165
+ body: data,
166
+ startY: 40,
167
+ theme: 'grid',
168
+ headStyles: {
169
+ fillColor: [18, 168, 133],
170
+ textColor: [255, 255, 255],
171
+ fontStyle: 'bold',
172
+ halign: 'center'
173
+ },
174
+ styles: {
175
+ fontSize: 9,
176
+ cellPadding: 3
177
+ },
178
+ alternateRowStyles: {
179
+ fillColor: [248, 255, 254]
180
+ }
181
+ });
182
+ const fileName = `export-${new Date().getTime()}.pdf`;
183
+ doc.save(fileName);
184
+ }
185
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExportDialogComponent, deps: [{ token: 'TranslationService', optional: true }], target: i0.ɵɵFactoryTarget.Component });
186
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ExportDialogComponent, isStandalone: true, selector: "sia-export-dialog", inputs: { visible: "visible", allRecords: "allRecords", selectedRecords: "selectedRecords", statusLabels: "statusLabels", translationPrefix: "translationPrefix", availableColumns: "availableColumns" }, outputs: { visibleChange: "visibleChange" }, usesOnChanges: true, ngImport: i0, template: "<p-dialog\n [(visible)]=\"visible\"\n (onHide)=\"onHide()\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '700px' }\"\n styleClass=\"export-dialog\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"custom-header\">\n <i class=\"pi pi-download header-icon\"></i>\n <span>{{ t('export_data_title') }}</span>\n </div>\n </ng-template>\n\n <div class=\"export-content\">\n <!-- Formato de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-file\"></i>\n </div>\n <h3>{{ t('export_format_title') }}</h3>\n </div>\n <div class=\"format-options\">\n <div\n *ngFor=\"let format of formats\"\n class=\"format-card\"\n [class.selected]=\"exportFormat === format.value\"\n (click)=\"exportFormat = format.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"format.value\"\n [(ngModel)]=\"exportFormat\"\n [inputId]=\"format.value\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\" [class.excel]=\"format.value === 'xlsx'\" [class.pdf]=\"format.value === 'pdf'\">\n <i class=\"pi\" [ngClass]=\"format.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"format.value\" class=\"card-label\">{{ format.label }}</label>\n <span class=\"card-description\">{{ format.description }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Escopo de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-filter\"></i>\n </div>\n <h3>{{ t('export_scope_title') }}</h3>\n </div>\n <div class=\"scope-options\">\n <div\n *ngFor=\"let scope of scopes\"\n class=\"scope-card\"\n [class.selected]=\"exportScope === scope.value\"\n [class.disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n (click)=\"scope.value === 'selected' && selectedRecords.length === 0 ? null : exportScope = scope.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"scope.value\"\n [(ngModel)]=\"exportScope\"\n [inputId]=\"scope.value\"\n [disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\">\n <i class=\"pi\" [ngClass]=\"scope.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"scope.value\" class=\"card-label\">{{ scope.label }}</label>\n <span class=\"card-description\">{{ scope.description }}</span>\n <span class=\"card-count\">\n <i class=\"pi pi-circle-fill\"></i>\n {{ scope.value === 'all' ? allRecords.length : selectedRecords.length }} {{ t('export_records_count') }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sele\u00E7\u00E3o de Colunas -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-table\"></i>\n </div>\n <h3>{{ t('export_columns_title') }}</h3>\n <div class=\"column-actions\">\n <button type=\"button\" class=\"action-link\" (click)=\"selectAllColumns()\">\n {{ t('export_select_all_columns') }}\n </button>\n <span class=\"separator\">|</span>\n <button type=\"button\" class=\"action-link\" (click)=\"deselectAllColumns()\">\n {{ t('export_clear_selection') }}\n </button>\n </div>\n </div>\n <div class=\"columns-grid\">\n <div\n *ngFor=\"let column of columns\"\n class=\"column-item\"\n [class.selected]=\"column.selected\"\n (click)=\"column.selected = !column.selected\"\n >\n <p-checkbox\n [(ngModel)]=\"column.selected\"\n [binary]=\"true\"\n [inputId]=\"column.field\"\n ></p-checkbox>\n <label [for]=\"column.field\" class=\"column-label\">\n {{ column.header }}\n </label>\n </div>\n </div>\n <div class=\"columns-summary\">\n <i class=\"pi pi-info-circle\"></i>\n <span>{{ selectedColumnsCount }} {{ t('export_columns_summary') }} {{ columns.length }} {{ t('export_columns_selected') }}</span>\n </div>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button\n [label]=\"t('cancel')\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [text]=\"true\"\n (onClick)=\"onHide()\"\n ></p-button>\n <p-button\n [label]=\"t('export_button')\"\n icon=\"pi pi-download\"\n [disabled]=\"!canExport\"\n (onClick)=\"export()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n", styles: ["::ng-deep .export-dialog .p-dialog{border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d}::ng-deep .export-dialog .p-dialog-content{padding:0;background:#fff;max-height:70vh;overflow-y:auto}.custom-header{display:flex;align-items:center;gap:12px;font-size:18px;font-weight:600}.custom-header .header-icon{font-size:22px;color:var(--p-primary-500)}.export-content{padding:28px 32px}.export-section{margin-bottom:32px}.export-section:last-child{margin-bottom:0}.export-section .section-header{display:flex;align-items:center;gap:12px;margin-bottom:20px}.export-section .section-header .section-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.1),rgba(var(--p-primary-rgb),.15));border-radius:10px}.export-section .section-header .section-icon i{font-size:18px;color:var(--p-primary-500)}.export-section .section-header h3{margin:0;font-size:17px;font-weight:700;color:var(--neutral-color-800);flex:1}.export-section .section-header .column-actions{display:flex;align-items:center;gap:10px;font-size:13px}.export-section .section-header .column-actions .action-link{background:none;border:none;color:var(--p-primary-500);cursor:pointer;font-weight:600;padding:0;transition:all .2s;font-size:13px}.export-section .section-header .column-actions .action-link:hover{color:var(--p-primary-500)}.export-section .section-header .column-actions .separator{color:var(--neutral-color-300);font-weight:400}.format-options{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.format-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.format-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.format-card:hover{border-color:var(--p-primary-500);transform:translateY(-2px);box-shadow:0 8px 24px rgba(var(--p-primary-rgb),.15)}.format-card:hover:before{opacity:1}.format-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.format-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.format-card.selected .card-icon i{color:#fff}.format-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.format-card .card-icon{width:52px;height:52px;display:flex;align-items:center;justify-content:center;border-radius:12px;transition:all .3s;position:relative;z-index:1}.format-card .card-icon.excel{background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%)}.format-card .card-icon.excel i{color:#107c41;font-size:26px}.format-card .card-icon.pdf{background:linear-gradient(135deg,#fee8e8,#fdd4d4)}.format-card .card-icon.pdf i{color:#dc2626;font-size:26px}.format-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.format-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.format-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-options{display:flex;flex-direction:column;gap:14px}.scope-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.scope-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.scope-card:hover:not(.disabled){border-color:var(--p-primary-500);box-shadow:0 4px 16px rgba(var(--p-primary-rgb),.12)}.scope-card:hover:not(.disabled):before{opacity:1}.scope-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.scope-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.scope-card.selected .card-icon i{color:#fff}.scope-card.disabled{opacity:.5;cursor:not-allowed;background:#f9fafb}.scope-card.disabled:hover{border-color:#e5e7eb;box-shadow:none}.scope-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.scope-card .card-icon{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:12px;transition:all .3s;position:relative;z-index:1}.scope-card .card-icon i{font-size:22px;color:var(--p-primary-500);transition:all .3s}.scope-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.scope-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.scope-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-card .card-count{font-size:13px;font-weight:600;color:var(--p-primary-500);margin-top:6px;display:inline-flex;align-items:center;gap:6px}.scope-card .card-count i{font-size:6px}.columns-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}.column-item{display:flex;align-items:center;gap:12px;padding:16px;border:2px solid #e5e7eb;border-radius:10px;transition:all .2s;background:#fff;cursor:pointer}.column-item:hover{border-color:var(--p-primary-500);background:rgba(var(--p-primary-rgb),.03)}.column-item.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08))}.column-item ::ng-deep .p-checkbox .p-checkbox-box{width:20px;height:20px;border-width:2px}.column-item .column-label{font-size:14px;font-weight:600;color:var(--neutral-color-800);cursor:pointer;margin:0;-webkit-user-select:none;user-select:none}.columns-summary{display:flex;align-items:center;gap:10px;padding:14px 18px;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:10px;font-size:14px;color:var(--neutral-color-700);font-weight:600}.columns-summary i{color:var(--p-primary-500);font-size:18px}@media (max-width: 768px){::ng-deep .export-dialog .p-dialog{width:95vw!important;margin:0}.dialog-header{padding:28px 24px}.dialog-header .header-icon-wrapper{width:56px;height:56px}.dialog-header .header-icon-wrapper i{font-size:28px}.dialog-header .header-text h2{font-size:24px}.export-content{padding:24px}.format-options,.columns-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i3.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i6.RadioButton, selector: "p-radioButton, p-radiobutton, p-radio-button", inputs: ["value", "formControlName", "name", "disabled", "variant", "size", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "autofocus", "binary"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i7.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DividerModule }] });
187
+ }
188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ExportDialogComponent, decorators: [{
189
+ type: Component,
190
+ args: [{ selector: 'sia-export-dialog', standalone: true, imports: [
191
+ CommonModule,
192
+ FormsModule,
193
+ DialogModule,
194
+ ButtonModule,
195
+ RadioButtonModule,
196
+ CheckboxModule,
197
+ DividerModule
198
+ ], template: "<p-dialog\n [(visible)]=\"visible\"\n (onHide)=\"onHide()\"\n [modal]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '700px' }\"\n styleClass=\"export-dialog\"\n>\n <ng-template pTemplate=\"header\">\n <div class=\"custom-header\">\n <i class=\"pi pi-download header-icon\"></i>\n <span>{{ t('export_data_title') }}</span>\n </div>\n </ng-template>\n\n <div class=\"export-content\">\n <!-- Formato de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-file\"></i>\n </div>\n <h3>{{ t('export_format_title') }}</h3>\n </div>\n <div class=\"format-options\">\n <div\n *ngFor=\"let format of formats\"\n class=\"format-card\"\n [class.selected]=\"exportFormat === format.value\"\n (click)=\"exportFormat = format.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"format.value\"\n [(ngModel)]=\"exportFormat\"\n [inputId]=\"format.value\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\" [class.excel]=\"format.value === 'xlsx'\" [class.pdf]=\"format.value === 'pdf'\">\n <i class=\"pi\" [ngClass]=\"format.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"format.value\" class=\"card-label\">{{ format.label }}</label>\n <span class=\"card-description\">{{ format.description }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Escopo de Exporta\u00E7\u00E3o -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-filter\"></i>\n </div>\n <h3>{{ t('export_scope_title') }}</h3>\n </div>\n <div class=\"scope-options\">\n <div\n *ngFor=\"let scope of scopes\"\n class=\"scope-card\"\n [class.selected]=\"exportScope === scope.value\"\n [class.disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n (click)=\"scope.value === 'selected' && selectedRecords.length === 0 ? null : exportScope = scope.value\"\n >\n <div class=\"card-radio\">\n <p-radioButton\n [value]=\"scope.value\"\n [(ngModel)]=\"exportScope\"\n [inputId]=\"scope.value\"\n [disabled]=\"scope.value === 'selected' && selectedRecords.length === 0\"\n ></p-radioButton>\n </div>\n <div class=\"card-icon\">\n <i class=\"pi\" [ngClass]=\"scope.icon\"></i>\n </div>\n <div class=\"card-info\">\n <label [for]=\"scope.value\" class=\"card-label\">{{ scope.label }}</label>\n <span class=\"card-description\">{{ scope.description }}</span>\n <span class=\"card-count\">\n <i class=\"pi pi-circle-fill\"></i>\n {{ scope.value === 'all' ? allRecords.length : selectedRecords.length }} {{ t('export_records_count') }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sele\u00E7\u00E3o de Colunas -->\n <div class=\"export-section\">\n <div class=\"section-header\">\n <div class=\"section-icon\">\n <i class=\"pi pi-table\"></i>\n </div>\n <h3>{{ t('export_columns_title') }}</h3>\n <div class=\"column-actions\">\n <button type=\"button\" class=\"action-link\" (click)=\"selectAllColumns()\">\n {{ t('export_select_all_columns') }}\n </button>\n <span class=\"separator\">|</span>\n <button type=\"button\" class=\"action-link\" (click)=\"deselectAllColumns()\">\n {{ t('export_clear_selection') }}\n </button>\n </div>\n </div>\n <div class=\"columns-grid\">\n <div\n *ngFor=\"let column of columns\"\n class=\"column-item\"\n [class.selected]=\"column.selected\"\n (click)=\"column.selected = !column.selected\"\n >\n <p-checkbox\n [(ngModel)]=\"column.selected\"\n [binary]=\"true\"\n [inputId]=\"column.field\"\n ></p-checkbox>\n <label [for]=\"column.field\" class=\"column-label\">\n {{ column.header }}\n </label>\n </div>\n </div>\n <div class=\"columns-summary\">\n <i class=\"pi pi-info-circle\"></i>\n <span>{{ selectedColumnsCount }} {{ t('export_columns_summary') }} {{ columns.length }} {{ t('export_columns_selected') }}</span>\n </div>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <p-button\n [label]=\"t('cancel')\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [text]=\"true\"\n (onClick)=\"onHide()\"\n ></p-button>\n <p-button\n [label]=\"t('export_button')\"\n icon=\"pi pi-download\"\n [disabled]=\"!canExport\"\n (onClick)=\"export()\"\n ></p-button>\n </ng-template>\n</p-dialog>\n", styles: ["::ng-deep .export-dialog .p-dialog{border-radius:16px;overflow:hidden;box-shadow:0 20px 60px #0000004d}::ng-deep .export-dialog .p-dialog-content{padding:0;background:#fff;max-height:70vh;overflow-y:auto}.custom-header{display:flex;align-items:center;gap:12px;font-size:18px;font-weight:600}.custom-header .header-icon{font-size:22px;color:var(--p-primary-500)}.export-content{padding:28px 32px}.export-section{margin-bottom:32px}.export-section:last-child{margin-bottom:0}.export-section .section-header{display:flex;align-items:center;gap:12px;margin-bottom:20px}.export-section .section-header .section-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.1),rgba(var(--p-primary-rgb),.15));border-radius:10px}.export-section .section-header .section-icon i{font-size:18px;color:var(--p-primary-500)}.export-section .section-header h3{margin:0;font-size:17px;font-weight:700;color:var(--neutral-color-800);flex:1}.export-section .section-header .column-actions{display:flex;align-items:center;gap:10px;font-size:13px}.export-section .section-header .column-actions .action-link{background:none;border:none;color:var(--p-primary-500);cursor:pointer;font-weight:600;padding:0;transition:all .2s;font-size:13px}.export-section .section-header .column-actions .action-link:hover{color:var(--p-primary-500)}.export-section .section-header .column-actions .separator{color:var(--neutral-color-300);font-weight:400}.format-options{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.format-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.format-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.format-card:hover{border-color:var(--p-primary-500);transform:translateY(-2px);box-shadow:0 8px 24px rgba(var(--p-primary-rgb),.15)}.format-card:hover:before{opacity:1}.format-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.format-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.format-card.selected .card-icon i{color:#fff}.format-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.format-card .card-icon{width:52px;height:52px;display:flex;align-items:center;justify-content:center;border-radius:12px;transition:all .3s;position:relative;z-index:1}.format-card .card-icon.excel{background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%)}.format-card .card-icon.excel i{color:#107c41;font-size:26px}.format-card .card-icon.pdf{background:linear-gradient(135deg,#fee8e8,#fdd4d4)}.format-card .card-icon.pdf i{color:#dc2626;font-size:26px}.format-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.format-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.format-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-options{display:flex;flex-direction:column;gap:14px}.scope-card{display:flex;align-items:center;gap:16px;padding:20px;border:2px solid #e5e7eb;border-radius:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);background:#fff;position:relative;overflow:hidden}.scope-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.03),rgba(var(--p-primary-rgb),.06));opacity:0;transition:opacity .3s}.scope-card:hover:not(.disabled){border-color:var(--p-primary-500);box-shadow:0 4px 16px rgba(var(--p-primary-rgb),.12)}.scope-card:hover:not(.disabled):before{opacity:1}.scope-card.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08));box-shadow:0 0 0 4px rgba(var(--p-primary-rgb),.1)}.scope-card.selected .card-icon{background:linear-gradient(135deg,var(--p-primary-500) 0%,var(--p-primary-500) 100%);transform:scale(1.05)}.scope-card.selected .card-icon i{color:#fff}.scope-card.disabled{opacity:.5;cursor:not-allowed;background:#f9fafb}.scope-card.disabled:hover{border-color:#e5e7eb;box-shadow:none}.scope-card .card-radio ::ng-deep .p-radiobutton .p-radiobutton-box{width:20px;height:20px;border-width:2px}.scope-card .card-icon{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:12px;transition:all .3s;position:relative;z-index:1}.scope-card .card-icon i{font-size:22px;color:var(--p-primary-500);transition:all .3s}.scope-card .card-info{flex:1;display:flex;flex-direction:column;gap:4px;position:relative;z-index:1}.scope-card .card-label{font-size:16px;font-weight:700;color:var(--neutral-color-800);cursor:pointer;margin:0}.scope-card .card-description{font-size:13px;color:var(--neutral-color-600);line-height:1.4}.scope-card .card-count{font-size:13px;font-weight:600;color:var(--p-primary-500);margin-top:6px;display:inline-flex;align-items:center;gap:6px}.scope-card .card-count i{font-size:6px}.columns-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}.column-item{display:flex;align-items:center;gap:12px;padding:16px;border:2px solid #e5e7eb;border-radius:10px;transition:all .2s;background:#fff;cursor:pointer}.column-item:hover{border-color:var(--p-primary-500);background:rgba(var(--p-primary-rgb),.03)}.column-item.selected{border-color:var(--p-primary-500);background:linear-gradient(135deg,rgba(var(--p-primary-rgb),.05),rgba(var(--p-primary-rgb),.08))}.column-item ::ng-deep .p-checkbox .p-checkbox-box{width:20px;height:20px;border-width:2px}.column-item .column-label{font-size:14px;font-weight:600;color:var(--neutral-color-800);cursor:pointer;margin:0;-webkit-user-select:none;user-select:none}.columns-summary{display:flex;align-items:center;gap:10px;padding:14px 18px;background:linear-gradient(135deg,var(--p-primary-50) 0%,var(--p-primary-100) 100%);border-radius:10px;font-size:14px;color:var(--neutral-color-700);font-weight:600}.columns-summary i{color:var(--p-primary-500);font-size:18px}@media (max-width: 768px){::ng-deep .export-dialog .p-dialog{width:95vw!important;margin:0}.dialog-header{padding:28px 24px}.dialog-header .header-icon-wrapper{width:56px;height:56px}.dialog-header .header-icon-wrapper i{font-size:28px}.dialog-header .header-text h2{font-size:24px}.export-content{padding:24px}.format-options,.columns-grid{grid-template-columns:1fr}}\n"] }]
199
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
200
+ type: Optional
201
+ }, {
202
+ type: Inject,
203
+ args: ['TranslationService']
204
+ }] }], propDecorators: { visible: [{
205
+ type: Input
206
+ }], allRecords: [{
207
+ type: Input
208
+ }], selectedRecords: [{
209
+ type: Input
210
+ }], statusLabels: [{
211
+ type: Input
212
+ }], translationPrefix: [{
213
+ type: Input
214
+ }], availableColumns: [{
215
+ type: Input
216
+ }], visibleChange: [{
217
+ type: Output
218
+ }] } });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLWFpL3NyYy9saWIvY29tcG9uZW50cy9leHBvcnQtZGlhbG9nL2V4cG9ydC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMvZXhwb3J0LWRpYWxvZy9leHBvcnQtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sU0FBUyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUEwQ3hDLE1BQU0sT0FBTyxxQkFBcUI7SUFvQjhCO0lBbkJyRCxPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLFVBQVUsR0FBVSxFQUFFLENBQUM7SUFD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aVdBQ2pCLGNBQWMsa2NBQ2QsYUFBYTs7NEZBS0oscUJBQXFCO2tCQWZqQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QsYUFBYTtxQkFDZDs7MEJBd0JZLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0JBQW9CO3lDQW5CM0MsT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBS0ksYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBPcHRpb25hbCwgSW5qZWN0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFJhZGlvQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9yYWRpb2J1dHRvbic7XG5pbXBvcnQgeyBDaGVja2JveE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xuaW1wb3J0IHsgRGl2aWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGl2aWRlcic7XG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xuaW1wb3J0IHsganNQREYgfSBmcm9tICdqc3BkZic7XG5pbXBvcnQgYXV0b1RhYmxlIGZyb20gJ2pzcGRmLWF1dG90YWJsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uT3B0aW9uIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGVhZGVyOiBzdHJpbmc7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRXhwb3J0Rm9ybWF0IHtcbiAgdmFsdWU6ICd4bHN4JyB8ICdwZGYnO1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBFeHBvcnRTY29wZSB7XG4gIHZhbHVlOiAnYWxsJyB8ICdzZWxlY3RlZCc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLy8gSW50ZXJmYWNlIHBhcmEgbyBzZXJ2acOnbyBkZSB0cmFkdcOnw6NvIChkdWNrIHR5cGluZylcbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25TZXJ2aWNlIHtcbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpYS1leHBvcnQtZGlhbG9nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBEaWFsb2dNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFJhZGlvQnV0dG9uTW9kdWxlLFxuICAgIENoZWNrYm94TW9kdWxlLFxuICAgIERpdmlkZXJNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2V4cG9ydC1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZXhwb3J0LWRpYWxvZy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgRXhwb3J0RGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxSZWNvcmRzOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZFJlY29yZHM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIHN0YXR1c0xhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uUHJlZml4OiBzdHJpbmcgPSAnY3JteC5idXNpbmVzcyc7XG4gIEBJbnB1dCgpIHNldCBhdmFpbGFibGVDb2x1bW5zKGNvbHVtbnM6IENvbHVtbk9wdGlvbltdKSB7XG4gICAgaWYgKGNvbHVtbnMgJiYgY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KCkgdmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBleHBvcnRGb3JtYXQ6ICd4bHN4JyB8ICdwZGYnID0gJ3hsc3gnO1xuICBleHBvcnRTY29wZTogJ2FsbCcgfCAnc2VsZWN0ZWQnID0gJ2FsbCc7XG5cbiAgZm9ybWF0czogRXhwb3J0Rm9ybWF0W10gPSBbXTtcbiAgc2NvcGVzOiBFeHBvcnRTY29wZVtdID0gW107XG4gIGNvbHVtbnM6IENvbHVtbk9wdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdCgnVHJhbnNsYXRpb25TZXJ2aWNlJykgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U/OiBUcmFuc2xhdGlvblNlcnZpY2UpIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtYXRzKCk7XG4gICAgdGhpcy5pbml0aWFsaXplU2NvcGVzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtYXRzKCk7XG4gICAgdGhpcy5pbml0aWFsaXplU2NvcGVzKCk7XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50cmFuc2xhdGlvblNlcnZpY2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoYCR7dGhpcy50cmFuc2xhdGlvblByZWZpeH0uJHtrZXl9YCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVGb3JtYXRzKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybWF0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6ICd4bHN4JyxcbiAgICAgICAgbGFiZWw6ICdFeGNlbCcsXG4gICAgICAgIGljb246ICdwaS1maWxlLWV4Y2VsJyxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudCgnZXhwb3J0X2V4Y2VsX2Rlc2NyaXB0aW9uJylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiAncGRmJyxcbiAgICAgICAgbGFiZWw6ICdQREYnLFxuICAgICAgICBpY29uOiAncGktZmlsZS1wZGYnLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy50KCdleHBvcnRfcGRmX2Rlc2NyaXB0aW9uJylcbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2NvcGVzKCk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGVzID0gW1xuICAgICAge1xuICAgICAgICB2YWx1ZTogJ2FsbCcsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2V4cG9ydF9hbGxfcmVjb3JkcycpLFxuICAgICAgICBpY29uOiAncGktbGlzdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnQoJ2V4cG9ydF9hbGxfcmVjb3Jkc19kZXNjcmlwdGlvbicpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogJ3NlbGVjdGVkJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnZXhwb3J0X3NlbGVjdGVkX3JlY29yZHMnKSxcbiAgICAgICAgaWNvbjogJ3BpLWNoZWNrLXNxdWFyZScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnQoJ2V4cG9ydF9zZWxlY3RlZF9yZWNvcmRzX2Rlc2NyaXB0aW9uJylcbiAgICAgIH1cbiAgICBdO1xuICB9XG5cbiAgZ2V0IHJlY29yZHNUb0V4cG9ydCgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0U2NvcGUgPT09ICdhbGwnID8gdGhpcy5hbGxSZWNvcmRzIDogdGhpcy5zZWxlY3RlZFJlY29yZHM7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb2x1bW5zQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLnNlbGVjdGVkKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgY2FuRXhwb3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ29sdW1uc0NvdW50ID4gMCAmJiB0aGlzLnJlY29yZHNUb0V4cG9ydC5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25IaWRlKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHNlbGVjdEFsbENvbHVtbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IGNvbC5zZWxlY3RlZCA9IHRydWUpO1xuICB9XG5cbiAgZGVzZWxlY3RBbGxDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiBjb2wuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gIH1cblxuICBleHBvcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbkV4cG9ydCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZXhwb3J0Rm9ybWF0ID09PSAneGxzeCcpIHtcbiAgICAgIHRoaXMuZXhwb3J0VG9FeGNlbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cG9ydFRvUERGKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkhpZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwb3J0VG9FeGNlbCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuc2VsZWN0ZWQpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlY29yZHNUb0V4cG9ydC5tYXAocmVjb3JkID0+IHtcbiAgICAgIGNvbnN0IHJvdzogYW55ID0ge307XG4gICAgICBzZWxlY3RlZENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICBpZiAoY29sLmZpZWxkID09PSAnc3RhdHVzJyAmJiByZWNvcmQuc3RhdHVzICYmIHRoaXMuc3RhdHVzTGFiZWxzKSB7XG4gICAgICAgICAgcm93W2NvbC5oZWFkZXJdID0gdGhpcy5zdGF0dXNMYWJlbHNbcmVjb3JkLnN0YXR1c107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcm93W2NvbC5oZWFkZXJdID0gcmVjb3JkW2NvbC5maWVsZF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJvdztcbiAgICB9KTtcblxuICAgIGNvbnN0IHdvcmtzaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChkYXRhKTtcbiAgICBjb25zdCB3b3JrYm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcbiAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdvcmtib29rLCB3b3Jrc2hlZXQsIHRoaXMudCgnZXhwb3J0X2RhdGFfc2hlZXRfbmFtZScpKTtcblxuICAgIC8vIEFqdXN0YXIgbGFyZ3VyYSBkYXMgY29sdW5hc1xuICAgIGNvbnN0IG1heFdpZHRoID0gMzA7XG4gICAgY29uc3QgY29sV2lkdGhzID0gc2VsZWN0ZWRDb2x1bW5zLm1hcChjb2wgPT4gKHtcbiAgICAgIHdjaDogTWF0aC5taW4oY29sLmhlYWRlci5sZW5ndGggKyA1LCBtYXhXaWR0aClcbiAgICB9KSk7XG4gICAgd29ya3NoZWV0WychY29scyddID0gY29sV2lkdGhzO1xuXG4gICAgY29uc3QgZmlsZU5hbWUgPSBgZXhwb3J0LSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9Lnhsc3hgO1xuICAgIFhMU1gud3JpdGVGaWxlKHdvcmtib29rLCBmaWxlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGV4cG9ydFRvUERGKCk6IHZvaWQge1xuICAgIGNvbnN0IGRvYyA9IG5ldyBqc1BERigpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5zZWxlY3RlZCk7XG5cbiAgICAvLyBUw610dWxvXG4gICAgZG9jLnNldEZvbnRTaXplKDE4KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKDE4LCAxNjgsIDEzMyk7XG4gICAgZG9jLnRleHQodGhpcy50KCdleHBvcnRfcGRmX3RpdGxlJyksIDE0LCAyMCk7XG5cbiAgICAvLyBTdWJ0w610dWxvXG4gICAgZG9jLnNldEZvbnRTaXplKDEwKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKDEwMCk7XG4gICAgZG9jLnRleHQoYCR7dGhpcy50KCdleHBvcnRfZXhwb3J0ZWRfYXQnKX06ICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygncHQtQlInKX1gLCAxNCwgMjgpO1xuICAgIGRvYy50ZXh0KGAke3RoaXMudCgnZXhwb3J0X3RvdGFsX3JlY29yZHMnKX06ICR7dGhpcy5yZWNvcmRzVG9FeHBvcnQubGVuZ3RofWAsIDE0LCAzNCk7XG5cbiAgICAvLyBQcmVwYXJhciBkYWRvc1xuICAgIGNvbnN0IGhlYWRlcnMgPSBzZWxlY3RlZENvbHVtbnMubWFwKGNvbCA9PiBjb2wuaGVhZGVyKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNvcmRzVG9FeHBvcnQubWFwKHJlY29yZCA9PiB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRDb2x1bW5zLm1hcChjb2wgPT4ge1xuICAgICAgICBpZiAoY29sLmZpZWxkID09PSAnc3RhdHVzJyAmJiByZWNvcmQuc3RhdHVzICYmIHRoaXMuc3RhdHVzTGFiZWxzKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzTGFiZWxzW3JlY29yZC5zdGF0dXNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcocmVjb3JkW2NvbC5maWVsZF0gfHwgJycpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUYWJlbGFcbiAgICBhdXRvVGFibGUoZG9jLCB7XG4gICAgICBoZWFkOiBbaGVhZGVyc10sXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgc3RhcnRZOiA0MCxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgICBoZWFkU3R5bGVzOiB7XG4gICAgICAgIGZpbGxDb2xvcjogWzE4LCAxNjgsIDEzM10sXG4gICAgICAgIHRleHRDb2xvcjogWzI1NSwgMjU1LCAyNTVdLFxuICAgICAgICBmb250U3R5bGU6ICdib2xkJyxcbiAgICAgICAgaGFsaWduOiAnY2VudGVyJ1xuICAgICAgfSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250U2l6ZTogOSxcbiAgICAgICAgY2VsbFBhZGRpbmc6IDNcbiAgICAgIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHtcbiAgICAgICAgZmlsbENvbG9yOiBbMjQ4LCAyNTUsIDI1NF1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbGVOYW1lID0gYGV4cG9ydC0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfS5wZGZgO1xuICAgIGRvYy5zYXZlKGZpbGVOYW1lKTtcbiAgfVxufVxuIiwiPHAtZGlhbG9nXG4gIFsodmlzaWJsZSldPVwidmlzaWJsZVwiXG4gIChvbkhpZGUpPVwib25IaWRlKClcIlxuICBbbW9kYWxdPVwidHJ1ZVwiXG4gIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICBbcmVzaXphYmxlXT1cImZhbHNlXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICc3MDBweCcgfVwiXG4gIHN0eWxlQ2xhc3M9XCJleHBvcnQtZGlhbG9nXCJcbj5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjdXN0b20taGVhZGVyXCI+XG4gICAgICA8aSBjbGFzcz1cInBpIHBpLWRvd25sb2FkIGhlYWRlci1pY29uXCI+PC9pPlxuICAgICAgPHNwYW4+e3sgdCgnZXhwb3J0X2RhdGFfdGl0bGUnKSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8ZGl2IGNsYXNzPVwiZXhwb3J0LWNvbnRlbnRcIj5cbiAgICA8IS0tIEZvcm1hdG8gZGUgRXhwb3J0YcOnw6NvIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJleHBvcnQtc2VjdGlvblwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWljb25cIj5cbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWZpbGVcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aDM+e3sgdCgnZXhwb3J0X2Zvcm1hdF90aXRsZScpIH19PC9oMz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm1hdC1vcHRpb25zXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZm9ybWF0IG9mIGZvcm1hdHNcIlxuICAgICAgICAgIGNsYXNzPVwiZm9ybWF0LWNhcmRcIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJleHBvcnRGb3JtYXQgPT09IGZvcm1hdC52YWx1ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImV4cG9ydEZvcm1hdCA9IGZvcm1hdC52YWx1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1yYWRpb1wiPlxuICAgICAgICAgICAgPHAtcmFkaW9CdXR0b25cbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm1hdC52YWx1ZVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXhwb3J0Rm9ybWF0XCJcbiAgICAgICAgICAgICAgW2lucHV0SWRdPVwiZm9ybWF0LnZhbHVlXCJcbiAgICAgICAgICAgID48L3AtcmFkaW9CdXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaWNvblwiIFtjbGFzcy5leGNlbF09XCJmb3JtYXQudmFsdWUgPT09ICd4bHN4J1wiIFtjbGFzcy5wZGZdPVwiZm9ybWF0LnZhbHVlID09PSAncGRmJ1wiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaVwiIFtuZ0NsYXNzXT1cImZvcm1hdC5pY29uXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWluZm9cIj5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImZvcm1hdC52YWx1ZVwiIGNsYXNzPVwiY2FyZC1sYWJlbFwiPnt7IGZvcm1hdC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtZGVzY3JpcHRpb25cIj57eyBmb3JtYXQuZGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEVzY29wbyBkZSBFeHBvcnRhw6fDo28gLS0+XG4gICAgPGRpdiBjbGFzcz1cImV4cG9ydC1zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taWNvblwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktZmlsdGVyXCI+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGgzPnt7IHQoJ2V4cG9ydF9zY29wZV90aXRsZScpIH19PC9oMz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjb3BlLW9wdGlvbnNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBzY29wZSBvZiBzY29wZXNcIlxuICAgICAgICAgIGNsYXNzPVwic2NvcGUtY2FyZFwiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImV4cG9ydFNjb3BlID09PSBzY29wZS52YWx1ZVwiXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInNjb3BlLnZhbHVlID09PSAnc2VsZWN0ZWQnICYmIHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGggPT09IDBcIlxuICAgICAgICAgIChjbGljayk9XCJzY29wZS52YWx1ZSA9PT0gJ3NlbGVjdGVkJyAmJiBzZWxlY3RlZFJlY29yZHMubGVuZ3RoID09PSAwID8gbnVsbCA6IGV4cG9ydFNjb3BlID0gc2NvcGUudmFsdWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtcmFkaW9cIj5cbiAgICAgICAgICAgIDxwLXJhZGlvQnV0dG9uXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzY29wZS52YWx1ZVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXhwb3J0U2NvcGVcIlxuICAgICAgICAgICAgICBbaW5wdXRJZF09XCJzY29wZS52YWx1ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzY29wZS52YWx1ZSA9PT0gJ3NlbGVjdGVkJyAmJiBzZWxlY3RlZFJlY29yZHMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgID48L3AtcmFkaW9CdXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaWNvblwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaVwiIFtuZ0NsYXNzXT1cInNjb3BlLmljb25cIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaW5mb1wiPlxuICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwic2NvcGUudmFsdWVcIiBjbGFzcz1cImNhcmQtbGFiZWxcIj57eyBzY29wZS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtZGVzY3JpcHRpb25cIj57eyBzY29wZS5kZXNjcmlwdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1jb3VudFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNpcmNsZS1maWxsXCI+PC9pPlxuICAgICAgICAgICAgICB7eyBzY29wZS52YWx1ZSA9PT0gJ2FsbCcgPyBhbGxSZWNvcmRzLmxlbmd0aCA6IHNlbGVjdGVkUmVjb3Jkcy5sZW5ndGggfX0ge3sgdCgnZXhwb3J0X3JlY29yZHNfY291bnQnKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTZWxlw6fDo28gZGUgQ29sdW5hcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZXhwb3J0LXNlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1pY29uXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS10YWJsZVwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoMz57eyB0KCdleHBvcnRfY29sdW1uc190aXRsZScpIH19PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhY3Rpb24tbGlua1wiIChjbGljayk9XCJzZWxlY3RBbGxDb2x1bW5zKClcIj5cbiAgICAgICAgICAgIHt7IHQoJ2V4cG9ydF9zZWxlY3RfYWxsX2NvbHVtbnMnKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VwYXJhdG9yXCI+fDwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFjdGlvbi1saW5rXCIgKGNsaWNrKT1cImRlc2VsZWN0QWxsQ29sdW1ucygpXCI+XG4gICAgICAgICAgICB7eyB0KCdleHBvcnRfY2xlYXJfc2VsZWN0aW9uJykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zLWdyaWRcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiXG4gICAgICAgICAgY2xhc3M9XCJjb2x1bW4taXRlbVwiXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImNvbHVtbi5zZWxlY3RlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbHVtbi5zZWxlY3RlZCA9ICFjb2x1bW4uc2VsZWN0ZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uLnNlbGVjdGVkXCJcbiAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICAgICAgICBbaW5wdXRJZF09XCJjb2x1bW4uZmllbGRcIlxuICAgICAgICAgID48L3AtY2hlY2tib3g+XG4gICAgICAgICAgPGxhYmVsIFtmb3JdPVwiY29sdW1uLmZpZWxkXCIgY2xhc3M9XCJjb2x1bW4tbGFiZWxcIj5cbiAgICAgICAgICAgIHt7IGNvbHVtbi5oZWFkZXIgfX1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMtc3VtbWFyeVwiPlxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICA8c3Bhbj57eyBzZWxlY3RlZENvbHVtbnNDb3VudCB9fSB7eyB0KCdleHBvcnRfY29sdW1uc19zdW1tYXJ5JykgfX0ge3sgY29sdW1ucy5sZW5ndGggfX0ge3sgdCgnZXhwb3J0X2NvbHVtbnNfc2VsZWN0ZWQnKSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgPHAtYnV0dG9uXG4gICAgICBbbGFiZWxdPVwidCgnY2FuY2VsJylcIlxuICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgKG9uQ2xpY2spPVwib25IaWRlKClcIlxuICAgID48L3AtYnV0dG9uPlxuICAgIDxwLWJ1dHRvblxuICAgICAgW2xhYmVsXT1cInQoJ2V4cG9ydF9idXR0b24nKVwiXG4gICAgICBpY29uPVwicGkgcGktZG93bmxvYWRcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYW5FeHBvcnRcIlxuICAgICAgKG9uQ2xpY2spPVwiZXhwb3J0KClcIlxuICAgID48L3AtYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLWRpYWxvZz5cbiJdfQ==
@@ -0,0 +1,70 @@
1
+ export const SUPPORTED_LANGUAGES = [
2
+ {
3
+ code: 'pt-BR',
4
+ name: 'Português (Brasil)',
5
+ flag: '🇧🇷',
6
+ aliases: ['pt', 'pt_BR', 'portuguese', 'br']
7
+ },
8
+ {
9
+ code: 'en-US',
10
+ name: 'English (US)',
11
+ flag: '🇺🇸',
12
+ aliases: ['en', 'en_US', 'english', 'us']
13
+ },
14
+ {
15
+ code: 'es-ES',
16
+ name: 'Español (España)',
17
+ flag: '🇪🇸',
18
+ aliases: ['es', 'es_ES', 'spanish', 'spain']
19
+ }
20
+ ];
21
+ export const DEFAULT_LANGUAGE = 'pt-BR';
22
+ export const TRANSLATION_CONFIG = {
23
+ supportedLanguages: SUPPORTED_LANGUAGES,
24
+ defaultLanguage: DEFAULT_LANGUAGE,
25
+ fallbackLanguage: 'pt-BR',
26
+ storageKey: 'selectedLanguage',
27
+ assetsPath: './app/locale'
28
+ };
29
+ /**
30
+ * Mapeia um locale do token Senior para um código de idioma suportado
31
+ */
32
+ export function mapTokenLocaleToLanguage(tokenLocale) {
33
+ if (!tokenLocale)
34
+ return null;
35
+ // Normalizar o locale (remover case sensitivity e caracteres especiais)
36
+ const normalizedLocale = tokenLocale.toLowerCase().replace(/[_-]/g, '');
37
+ // Procurar correspondência exata primeiro
38
+ for (const lang of SUPPORTED_LANGUAGES) {
39
+ if (lang.code.toLowerCase().replace(/[_-]/g, '') === normalizedLocale) {
40
+ return lang.code;
41
+ }
42
+ }
43
+ // Procurar por aliases
44
+ for (const lang of SUPPORTED_LANGUAGES) {
45
+ if (lang.aliases) {
46
+ for (const alias of lang.aliases) {
47
+ if (alias.toLowerCase().replace(/[_-]/g, '') === normalizedLocale) {
48
+ return lang.code;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ // Tentar correspondência parcial (apenas o idioma, ignorando país)
54
+ const languageOnly = normalizedLocale.substring(0, 2);
55
+ for (const lang of SUPPORTED_LANGUAGES) {
56
+ const langCode = lang.code.toLowerCase().substring(0, 2);
57
+ if (langCode === languageOnly) {
58
+ return lang.code;
59
+ }
60
+ }
61
+ console.warn(`Unsupported locale from token: ${tokenLocale}`);
62
+ return null;
63
+ }
64
+ /**
65
+ * Obtém informações de um idioma pelo código
66
+ */
67
+ export function getLanguageInfo(code) {
68
+ return SUPPORTED_LANGUAGES.find(lang => lang.code === code) || null;
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb24uY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbmZpZy90cmFuc2xhdGlvbi5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQXFCO0lBQ25EO1FBQ0UsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLElBQUksRUFBRSxNQUFNO1FBQ1osT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDO0tBQzdDO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsT0FBTztRQUNiLElBQUksRUFBRSxjQUFjO1FBQ3BCLElBQUksRUFBRSxNQUFNO1FBQ1osT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDO0tBQzFDO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsT0FBTztRQUNiLElBQUksRUFBRSxrQkFBa0I7UUFDeEIsSUFBSSxFQUFFLE1BQU07UUFDWixPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUM7S0FDN0M7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLGtCQUFrQixFQUFFLG1CQUFtQjtJQUN2QyxlQUFlLEVBQUUsZ0JBQWdCO0lBQ2pDLGdCQUFnQixFQUFFLE9BQU87SUFDekIsVUFBVSxFQUFFLGtCQUFrQjtJQUM5QixVQUFVLEVBQUUsY0FBYztDQUMzQixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsV0FBbUI7SUFDMUQsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUU5Qix3RUFBd0U7SUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV4RSwwQ0FBMEM7SUFDMUMsS0FBSyxNQUFNLElBQUksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLGdCQUFnQixFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN2QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO29CQUNsRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ25CLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxLQUFLLE1BQU0sSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELElBQUksUUFBUSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDOUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQVk7SUFDMUMsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBMYW5ndWFnZUNvbmZpZyB7XG4gIGNvZGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBmbGFnOiBzdHJpbmc7XG4gIHJ0bD86IGJvb2xlYW47XG4gIGFsaWFzZXM/OiBzdHJpbmdbXTsgLy8gQWxpYXNlcyBwYXJhIGNvbXBhdGliaWxpZGFkZVxufVxuXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX0xBTkdVQUdFUzogTGFuZ3VhZ2VDb25maWdbXSA9IFtcbiAgeyBcbiAgICBjb2RlOiAncHQtQlInLCBcbiAgICBuYW1lOiAnUG9ydHVndcOqcyAoQnJhc2lsKScsIFxuICAgIGZsYWc6ICfwn4en8J+HtycsXG4gICAgYWxpYXNlczogWydwdCcsICdwdF9CUicsICdwb3J0dWd1ZXNlJywgJ2JyJ10gXG4gIH0sXG4gIHsgXG4gICAgY29kZTogJ2VuLVVTJywgXG4gICAgbmFtZTogJ0VuZ2xpc2ggKFVTKScsIFxuICAgIGZsYWc6ICfwn4e68J+HuCcsXG4gICAgYWxpYXNlczogWydlbicsICdlbl9VUycsICdlbmdsaXNoJywgJ3VzJ10gXG4gIH0sXG4gIHsgXG4gICAgY29kZTogJ2VzLUVTJywgXG4gICAgbmFtZTogJ0VzcGHDsW9sIChFc3Bhw7FhKScsIFxuICAgIGZsYWc6ICfwn4eq8J+HuCcsXG4gICAgYWxpYXNlczogWydlcycsICdlc19FUycsICdzcGFuaXNoJywgJ3NwYWluJ10gXG4gIH1cbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xBTkdVQUdFID0gJ3B0LUJSJztcblxuZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0NPTkZJRyA9IHtcbiAgc3VwcG9ydGVkTGFuZ3VhZ2VzOiBTVVBQT1JURURfTEFOR1VBR0VTLFxuICBkZWZhdWx0TGFuZ3VhZ2U6IERFRkFVTFRfTEFOR1VBR0UsXG4gIGZhbGxiYWNrTGFuZ3VhZ2U6ICdwdC1CUicsXG4gIHN0b3JhZ2VLZXk6ICdzZWxlY3RlZExhbmd1YWdlJyxcbiAgYXNzZXRzUGF0aDogJy4vYXBwL2xvY2FsZSdcbn07XG5cbi8qKlxuICogTWFwZWlhIHVtIGxvY2FsZSBkbyB0b2tlbiBTZW5pb3IgcGFyYSB1bSBjw7NkaWdvIGRlIGlkaW9tYSBzdXBvcnRhZG9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRva2VuTG9jYWxlVG9MYW5ndWFnZSh0b2tlbkxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghdG9rZW5Mb2NhbGUpIHJldHVybiBudWxsO1xuICBcbiAgLy8gTm9ybWFsaXphciBvIGxvY2FsZSAocmVtb3ZlciBjYXNlIHNlbnNpdGl2aXR5IGUgY2FyYWN0ZXJlcyBlc3BlY2lhaXMpXG4gIGNvbnN0IG5vcm1hbGl6ZWRMb2NhbGUgPSB0b2tlbkxvY2FsZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1tfLV0vZywgJycpO1xuICBcbiAgLy8gUHJvY3VyYXIgY29ycmVzcG9uZMOqbmNpYSBleGF0YSBwcmltZWlyb1xuICBmb3IgKGNvbnN0IGxhbmcgb2YgU1VQUE9SVEVEX0xBTkdVQUdFUykge1xuICAgIGlmIChsYW5nLmNvZGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXy1dL2csICcnKSA9PT0gbm9ybWFsaXplZExvY2FsZSkge1xuICAgICAgcmV0dXJuIGxhbmcuY29kZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIFByb2N1cmFyIHBvciBhbGlhc2VzXG4gIGZvciAoY29uc3QgbGFuZyBvZiBTVVBQT1JURURfTEFOR1VBR0VTKSB7XG4gICAgaWYgKGxhbmcuYWxpYXNlcykge1xuICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiBsYW5nLmFsaWFzZXMpIHtcbiAgICAgICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW18tXS9nLCAnJykgPT09IG5vcm1hbGl6ZWRMb2NhbGUpIHtcbiAgICAgICAgICByZXR1cm4gbGFuZy5jb2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvLyBUZW50YXIgY29ycmVzcG9uZMOqbmNpYSBwYXJjaWFsIChhcGVuYXMgbyBpZGlvbWEsIGlnbm9yYW5kbyBwYcOtcylcbiAgY29uc3QgbGFuZ3VhZ2VPbmx5ID0gbm9ybWFsaXplZExvY2FsZS5zdWJzdHJpbmcoMCwgMik7XG4gIGZvciAoY29uc3QgbGFuZyBvZiBTVVBQT1JURURfTEFOR1VBR0VTKSB7XG4gICAgY29uc3QgbGFuZ0NvZGUgPSBsYW5nLmNvZGUudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMCwgMik7XG4gICAgaWYgKGxhbmdDb2RlID09PSBsYW5ndWFnZU9ubHkpIHtcbiAgICAgIHJldHVybiBsYW5nLmNvZGU7XG4gICAgfVxuICB9XG4gIFxuICBjb25zb2xlLndhcm4oYFVuc3VwcG9ydGVkIGxvY2FsZSBmcm9tIHRva2VuOiAke3Rva2VuTG9jYWxlfWApO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBPYnTDqW0gaW5mb3JtYcOnw7VlcyBkZSB1bSBpZGlvbWEgcGVsbyBjw7NkaWdvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYW5ndWFnZUluZm8oY29kZTogc3RyaW5nKTogTGFuZ3VhZ2VDb25maWcgfCBudWxsIHtcbiAgcmV0dXJuIFNVUFBPUlRFRF9MQU5HVUFHRVMuZmluZChsYW5nID0+IGxhbmcuY29kZSA9PT0gY29kZSkgfHwgbnVsbDtcbn1cbiJdfQ==
@@ -0,0 +1,79 @@
1
+ import { Directive, HostListener } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class CepMaskDirective {
4
+ el;
5
+ constructor(el) {
6
+ this.el = el;
7
+ }
8
+ onKeyPress(event) {
9
+ // Permite apenas números
10
+ const charCode = event.which ? event.which : event.keyCode;
11
+ if (charCode > 31 && (charCode < 48 || charCode > 57)) {
12
+ event.preventDefault();
13
+ return false;
14
+ }
15
+ return true;
16
+ }
17
+ onInput(event) {
18
+ const value = event.target.value;
19
+ this.applyCepMask(value);
20
+ }
21
+ onBlur(event) {
22
+ const value = event.target.value;
23
+ this.applyCepMask(value);
24
+ }
25
+ onPaste(event) {
26
+ event.preventDefault();
27
+ const pastedText = event.clipboardData?.getData('text') || '';
28
+ const numbers = pastedText.replace(/\D/g, '');
29
+ this.applyCepMask(numbers);
30
+ }
31
+ applyCepMask(value) {
32
+ if (!value) {
33
+ this.el.nativeElement.value = '';
34
+ return;
35
+ }
36
+ // Remove todos os caracteres não numéricos
37
+ const numbers = value.replace(/\D/g, '');
38
+ // Limita a 8 dígitos
39
+ const limitedNumbers = numbers.substring(0, 8);
40
+ // Aplica a máscara 00000-000
41
+ let maskedValue = '';
42
+ if (limitedNumbers.length === 0) {
43
+ maskedValue = '';
44
+ }
45
+ else if (limitedNumbers.length <= 5) {
46
+ maskedValue = limitedNumbers;
47
+ }
48
+ else {
49
+ maskedValue = limitedNumbers.replace(/(\d{5})(\d{0,3})/, '$1-$2');
50
+ }
51
+ // Atualizar o valor do input
52
+ this.el.nativeElement.value = maskedValue;
53
+ // Disparar evento de input para atualizar o FormControl
54
+ const inputEvent = new Event('input', { bubbles: true });
55
+ this.el.nativeElement.dispatchEvent(inputEvent);
56
+ }
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CepMaskDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
58
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: CepMaskDirective, isStandalone: true, selector: "[siaCepMask]", host: { listeners: { "keypress": "onKeyPress($event)", "input": "onInput($event)", "blur": "onBlur($event)", "paste": "onPaste($event)" } }, ngImport: i0 });
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CepMaskDirective, decorators: [{
61
+ type: Directive,
62
+ args: [{
63
+ selector: '[siaCepMask]',
64
+ standalone: true
65
+ }]
66
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { onKeyPress: [{
67
+ type: HostListener,
68
+ args: ['keypress', ['$event']]
69
+ }], onInput: [{
70
+ type: HostListener,
71
+ args: ['input', ['$event']]
72
+ }], onBlur: [{
73
+ type: HostListener,
74
+ args: ['blur', ['$event']]
75
+ }], onPaste: [{
76
+ type: HostListener,
77
+ args: ['paste', ['$event']]
78
+ }] } });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VwLW1hc2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2RpcmVjdGl2ZXMvY2VwLW1hc2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU1wRSxNQUFNLE9BQU8sZ0JBQWdCO0lBRVA7SUFBcEIsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7SUFBRyxDQUFDO0lBR3RDLFVBQVUsQ0FBQyxLQUFvQjtRQUM3Qix5QkFBeUI7UUFDekIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUMzRCxJQUFJLFFBQVEsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3RELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFHRCxPQUFPLENBQUMsS0FBVTtRQUNoQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFHRCxNQUFNLENBQUMsS0FBVTtRQUNmLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUdELE9BQU8sQ0FBQyxLQUFxQjtRQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLFlBQVksQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakMsT0FBTztRQUNULENBQUM7UUFFRCwyQ0FBMkM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekMscUJBQXFCO1FBQ3JCLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRS9DLDZCQUE2QjtRQUM3QixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxXQUFXLEdBQUcsY0FBYyxDQUFDO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBRTFDLHdEQUF3RDtRQUN4RCxNQUFNLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsQ0FBQzt3R0EvRFUsZ0JBQWdCOzRGQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBSjVCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjsrRUFNQyxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVlwQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU9qQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU9oQyxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NpYUNlcE1hc2tdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBDZXBNYXNrRGlyZWN0aXZlIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXByZXNzJywgWyckZXZlbnQnXSlcbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vIFBlcm1pdGUgYXBlbmFzIG7Dum1lcm9zXG4gICAgY29uc3QgY2hhckNvZGUgPSBldmVudC53aGljaCA/IGV2ZW50LndoaWNoIDogZXZlbnQua2V5Q29kZTtcbiAgICBpZiAoY2hhckNvZGUgPiAzMSAmJiAoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gIG9uSW5wdXQoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuYXBwbHlDZXBNYXNrKHZhbHVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICBvbkJsdXIoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuYXBwbHlDZXBNYXNrKHZhbHVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJywgWyckZXZlbnQnXSlcbiAgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHBhc3RlZFRleHQgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0JykgfHwgJyc7XG4gICAgY29uc3QgbnVtYmVycyA9IHBhc3RlZFRleHQucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICB0aGlzLmFwcGx5Q2VwTWFzayhudW1iZXJzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDZXBNYXNrKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdG9kb3Mgb3MgY2FyYWN0ZXJlcyBuw6NvIG51bcOpcmljb3NcbiAgICBjb25zdCBudW1iZXJzID0gdmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICBcbiAgICAvLyBMaW1pdGEgYSA4IGTDrWdpdG9zXG4gICAgY29uc3QgbGltaXRlZE51bWJlcnMgPSBudW1iZXJzLnN1YnN0cmluZygwLCA4KTtcbiAgICBcbiAgICAvLyBBcGxpY2EgYSBtw6FzY2FyYSAwMDAwMC0wMDBcbiAgICBsZXQgbWFza2VkVmFsdWUgPSAnJztcbiAgICBpZiAobGltaXRlZE51bWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBtYXNrZWRWYWx1ZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAobGltaXRlZE51bWJlcnMubGVuZ3RoIDw9IDUpIHtcbiAgICAgIG1hc2tlZFZhbHVlID0gbGltaXRlZE51bWJlcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hc2tlZFZhbHVlID0gbGltaXRlZE51bWJlcnMucmVwbGFjZSgvKFxcZHs1fSkoXFxkezAsM30pLywgJyQxLSQyJyk7XG4gICAgfVxuXG4gICAgLy8gQXR1YWxpemFyIG8gdmFsb3IgZG8gaW5wdXRcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBtYXNrZWRWYWx1ZTtcbiAgICBcbiAgICAvLyBEaXNwYXJhciBldmVudG8gZGUgaW5wdXQgcGFyYSBhdHVhbGl6YXIgbyBGb3JtQ29udHJvbFxuICAgIGNvbnN0IGlucHV0RXZlbnQgPSBuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pO1xuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGlucHV0RXZlbnQpO1xuICB9XG59Il19
@@ -0,0 +1,62 @@
1
+ import { Directive, HostListener, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ import * as i2 from "../services/mask.service";
5
+ export class DocumentMaskDirective {
6
+ el;
7
+ control;
8
+ maskService;
9
+ documentType = 'auto';
10
+ allowAlphanumeric = false;
11
+ typePerson;
12
+ constructor(el, control, maskService) {
13
+ this.el = el;
14
+ this.control = control;
15
+ this.maskService = maskService;
16
+ }
17
+ ngOnInit() {
18
+ // Aplicar máscara inicial se já houver valor
19
+ if (this.control.value) {
20
+ this.applyMask(this.control.value);
21
+ }
22
+ }
23
+ onInput(event) {
24
+ const value = event.target.value;
25
+ this.applyMask(value);
26
+ }
27
+ onBlur(event) {
28
+ const value = event.target.value;
29
+ this.applyMask(value);
30
+ }
31
+ applyMask(value) {
32
+ if (!value) {
33
+ this.control.control?.setValue('', { emitEvent: false });
34
+ return;
35
+ }
36
+ const masked = this.maskService.applyDocumentMask(value, this.typePerson || 'JURIDICAL_PERSON');
37
+ this.control.control?.setValue(masked, { emitEvent: false });
38
+ this.el.nativeElement.value = masked;
39
+ }
40
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DocumentMaskDirective, deps: [{ token: i0.ElementRef }, { token: i1.NgControl }, { token: i2.MaskService }], target: i0.ɵɵFactoryTarget.Directive });
41
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: DocumentMaskDirective, isStandalone: true, selector: "[siaDocumentMask]", inputs: { documentType: "documentType", allowAlphanumeric: "allowAlphanumeric", typePerson: "typePerson" }, host: { listeners: { "input": "onInput($event)", "blur": "onBlur($event)" } }, ngImport: i0 });
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DocumentMaskDirective, decorators: [{
44
+ type: Directive,
45
+ args: [{
46
+ selector: '[siaDocumentMask]',
47
+ standalone: true
48
+ }]
49
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.NgControl }, { type: i2.MaskService }], propDecorators: { documentType: [{
50
+ type: Input
51
+ }], allowAlphanumeric: [{
52
+ type: Input
53
+ }], typePerson: [{
54
+ type: Input
55
+ }], onInput: [{
56
+ type: HostListener,
57
+ args: ['input', ['$event']]
58
+ }], onBlur: [{
59
+ type: HostListener,
60
+ args: ['blur', ['$event']]
61
+ }] } });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLWFpL3NyYy9saWIvZGlyZWN0aXZlcy9kb2N1bWVudC1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7Ozs7QUFRbkYsTUFBTSxPQUFPLHFCQUFxQjtJQU10QjtJQUNBO0lBQ0E7SUFQRCxZQUFZLEdBQTRCLE1BQU0sQ0FBQztJQUMvQyxpQkFBaUIsR0FBWSxLQUFLLENBQUM7SUFDbkMsVUFBVSxDQUFnRDtJQUVuRSxZQUNVLEVBQWMsRUFDZCxPQUFrQixFQUNsQixXQUF3QjtRQUZ4QixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsWUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUMvQixDQUFDO0lBRUosUUFBUTtRQUNOLDZDQUE2QztRQUM3QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBR0QsT0FBTyxDQUFDLEtBQVU7UUFDaEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBR0QsTUFBTSxDQUFDLEtBQVU7UUFDZixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7SUFDdkMsQ0FBQzt3R0F2Q1UscUJBQXFCOzRGQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBSmpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO2lJQUVVLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBZ0JOLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBT2pDLE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWFza1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tYXNrLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2lhRG9jdW1lbnRNYXNrXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgRG9jdW1lbnRNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZG9jdW1lbnRUeXBlOiAnY3BmJyB8ICdjbnBqJyB8ICdhdXRvJyA9ICdhdXRvJztcbiAgQElucHV0KCkgYWxsb3dBbHBoYW51bWVyaWM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdHlwZVBlcnNvbj86ICdOQVRVUkFMX1BFUlNPTicgfCAnSlVSSURJQ0FMX1BFUlNPTicgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgcHJpdmF0ZSBtYXNrU2VydmljZTogTWFza1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIEFwbGljYXIgbcOhc2NhcmEgaW5pY2lhbCBzZSBqw6EgaG91dmVyIHZhbG9yXG4gICAgaWYgKHRoaXMuY29udHJvbC52YWx1ZSkge1xuICAgICAgdGhpcy5hcHBseU1hc2sodGhpcy5jb250cm9sLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gIG9uSW5wdXQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuYXBwbHlNYXNrKHZhbHVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICBvbkJsdXIoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuYXBwbHlNYXNrKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlNYXNrKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnRyb2wuY29udHJvbD8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tTZXJ2aWNlLmFwcGx5RG9jdW1lbnRNYXNrKHZhbHVlLCB0aGlzLnR5cGVQZXJzb24gfHwgJ0pVUklESUNBTF9QRVJTT04nKTtcbiAgICB0aGlzLmNvbnRyb2wuY29udHJvbD8uc2V0VmFsdWUobWFza2VkLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbWFza2VkO1xuICB9XG59XG4iXX0=