bways-report 0.1.6 → 0.1.8

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 (98) hide show
  1. package/README.md +293 -464
  2. package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
  3. package/esm2022/lib/core/index.mjs +2 -1
  4. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  5. package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
  6. package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
  16. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
  17. package/esm2022/lib/data-access/adapters/index.mjs +8 -1
  18. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  19. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
  21. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
  22. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  26. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
  27. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
  30. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
  31. package/esm2022/lib/features/designer/designer.component.mjs +276 -21
  32. package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
  33. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
  34. package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
  35. package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
  36. package/esm2022/lib/features/embed/index.mjs +5 -0
  37. package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
  38. package/esm2022/lib/features/index.mjs +2 -1
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
  40. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
  41. package/esm2022/lib/features/routing/index.mjs +2 -2
  42. package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
  43. package/esm2022/lib/features/routing/report-routes.mjs +42 -1
  44. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
  45. package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
  46. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
  48. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
  49. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
  50. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  51. package/esm2022/lib/primitives/components/index.mjs +2 -1
  52. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
  53. package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
  54. package/esm2022/lib/provide-reporting.mjs +137 -7
  55. package/fesm2022/bways-report.mjs +4286 -859
  56. package/fesm2022/bways-report.mjs.map +1 -1
  57. package/lib/core/config/bways-report-config.d.ts +161 -0
  58. package/lib/core/index.d.ts +1 -0
  59. package/lib/core/models/report-definition.model.d.ts +16 -0
  60. package/lib/core/services/report-session-context.service.d.ts +1 -0
  61. package/lib/core/tokens/reporting-config.token.d.ts +16 -0
  62. package/lib/core/utils/data-normalization.util.d.ts +10 -0
  63. package/lib/core/utils/report-parameter.util.d.ts +18 -1
  64. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
  65. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
  66. package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
  67. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
  68. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
  69. package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -0
  71. package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
  72. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
  73. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
  74. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
  75. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
  76. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
  77. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
  78. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
  79. package/lib/features/designer/designer.component.d.ts +15 -0
  80. package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
  81. package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
  82. package/lib/features/embed/bways-report-page.component.d.ts +61 -0
  83. package/lib/features/embed/index.d.ts +4 -0
  84. package/lib/features/embed/inject-report-menu.d.ts +44 -0
  85. package/lib/features/index.d.ts +1 -0
  86. package/lib/features/persistence/services/report-store.service.d.ts +5 -0
  87. package/lib/features/routing/index.d.ts +1 -1
  88. package/lib/features/routing/models/report-route.models.d.ts +3 -0
  89. package/lib/features/routing/report-routes.d.ts +40 -0
  90. package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
  91. package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
  92. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
  93. package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
  97. package/lib/provide-reporting.d.ts +22 -6
  98. package/package.json +1 -1
@@ -75,20 +75,136 @@ export function resolveCanvasFieldValue(formValues, inner) {
75
75
  }
76
76
  return undefined;
77
77
  }
78
+ /**
79
+ * Sanitizes T-SQL parameter literals copied from SSMS, profilers, or SQL scripts:
80
+ * - Strips outer double quotes: "..."
81
+ * - Strips outer T-SQL quotes: N'...' or '...'
82
+ * - Unescapes doubled single quotes: '' -> '
83
+ */
84
+ export function sanitizeSqlParamLiteral(val) {
85
+ if (typeof val !== 'string')
86
+ return val;
87
+ let s = val.trim();
88
+ if (s.startsWith('"') && s.endsWith('"') && s.length >= 2) {
89
+ s = s.substring(1, s.length - 1).trim();
90
+ }
91
+ const isQuotedSqlLiteral = ((s.startsWith("N'") || s.startsWith("n'")) && s.endsWith("'") && s.length >= 3) ||
92
+ (s.startsWith("'") && s.endsWith("'") && s.length >= 2);
93
+ if (isQuotedSqlLiteral) {
94
+ const prefixLen = (s.startsWith("N'") || s.startsWith("n'")) ? 2 : 1;
95
+ s = s.substring(prefixLen, s.length - 1);
96
+ if (s.includes("''")) {
97
+ s = s.replace(/''/g, "'");
98
+ }
99
+ }
100
+ else if (s.includes("'' ''") || s.includes("''''") || /''[a-zA-Z0-9_\s|-]+''/.test(s)) {
101
+ s = s.replace(/''/g, "'");
102
+ }
103
+ return s;
104
+ }
105
+ /**
106
+ * Parses an SSMS / T-SQL EXEC statement such as:
107
+ * exec Get_HelpList @chrCOMPANYID=N'101',@chrTableName=N'MSTACCTGLSUB',@intExecFlag=1
108
+ * Extracts procedure name and unescapes parameter values.
109
+ */
110
+ export function parseSqlExecStatement(sql) {
111
+ if (!sql || typeof sql !== 'string')
112
+ return null;
113
+ const trimmed = sql.trim();
114
+ const execMatch = trimmed.match(/^(?:exec(?:ute)?\s+)(?:(?:\[?[\w]+\]?\.)?\[?([\w]+)\]?)\s*(.*)$/is);
115
+ if (!execMatch && !trimmed.startsWith('@'))
116
+ return null;
117
+ const procedureName = execMatch ? execMatch[1] : undefined;
118
+ const paramPart = execMatch ? execMatch[2] : trimmed;
119
+ const parameters = {};
120
+ if (!paramPart)
121
+ return { procedureName, parameters };
122
+ let i = 0;
123
+ const len = paramPart.length;
124
+ while (i < len) {
125
+ while (i < len && (paramPart[i] === ' ' || paramPart[i] === '\t' || paramPart[i] === '\r' || paramPart[i] === '\n' || paramPart[i] === ',')) {
126
+ i++;
127
+ }
128
+ if (i >= len)
129
+ break;
130
+ if (paramPart[i] !== '@') {
131
+ i++;
132
+ continue;
133
+ }
134
+ const keyStart = i;
135
+ while (i < len && paramPart[i] !== '=' && paramPart[i] !== ' ' && paramPart[i] !== '\t') {
136
+ i++;
137
+ }
138
+ const paramKey = paramPart.slice(keyStart, i).trim();
139
+ while (i < len && (paramPart[i] === ' ' || paramPart[i] === '\t' || paramPart[i] === '=')) {
140
+ i++;
141
+ }
142
+ let valStr = '';
143
+ if (i < len && (paramPart[i] === "'" || (paramPart[i] === 'N' && paramPart[i + 1] === "'") || (paramPart[i] === 'n' && paramPart[i + 1] === "'"))) {
144
+ const isN = paramPart[i] === 'N' || paramPart[i] === 'n';
145
+ i += isN ? 2 : 1;
146
+ let inQuote = true;
147
+ let quoteVal = '';
148
+ while (i < len && inQuote) {
149
+ if (paramPart[i] === "'") {
150
+ if (i + 1 < len && paramPart[i + 1] === "'") {
151
+ quoteVal += "'";
152
+ i += 2;
153
+ }
154
+ else {
155
+ inQuote = false;
156
+ i++;
157
+ }
158
+ }
159
+ else {
160
+ quoteVal += paramPart[i];
161
+ i++;
162
+ }
163
+ }
164
+ valStr = quoteVal;
165
+ }
166
+ else {
167
+ const valStart = i;
168
+ while (i < len && paramPart[i] !== ',' && paramPart[i] !== '\r' && paramPart[i] !== '\n') {
169
+ i++;
170
+ }
171
+ valStr = paramPart.slice(valStart, i).trim();
172
+ }
173
+ const cleanKey = paramKey.replace(/^@/, '');
174
+ if (cleanKey) {
175
+ if (/^-?\d+$/.test(valStr)) {
176
+ parameters[paramKey] = parseInt(valStr, 10);
177
+ }
178
+ else if (/^-?\d+\.\d+$/.test(valStr)) {
179
+ parameters[paramKey] = parseFloat(valStr);
180
+ }
181
+ else if (valStr.toLowerCase() === 'true') {
182
+ parameters[paramKey] = true;
183
+ }
184
+ else if (valStr.toLowerCase() === 'false') {
185
+ parameters[paramKey] = false;
186
+ }
187
+ else {
188
+ parameters[paramKey] = valStr;
189
+ }
190
+ }
191
+ }
192
+ return { procedureName, parameters };
193
+ }
78
194
  /**
79
195
  * Resolves one raw mapping value against session + canvas form values.
80
196
  * - `{{session.branchId}}` -> session value (case-insensitive)
81
197
  * - `{{context.today}}` -> computed date
82
198
  * - `{{fromDate}}` -> value of canvas field with key `fromDate` (case-insensitive)
83
199
  * - `{{dateRange.from}}` -> value of nested from property
84
- * - anything else -> returned unchanged (fixed value)
200
+ * - anything else -> sanitized literal value (fixed value)
85
201
  */
86
202
  export function resolveParameterValue(raw, session, formValues) {
87
203
  if (typeof raw !== 'string')
88
204
  return raw;
89
205
  const m = TOKEN_RE.exec(raw);
90
206
  if (!m)
91
- return raw;
207
+ return sanitizeSqlParamLiteral(raw);
92
208
  const inner = m[1];
93
209
  if (inner.startsWith('session.')) {
94
210
  const sessionKey = inner.slice(8);
@@ -177,4 +293,4 @@ export function toFieldKey(paramName) {
177
293
  const clean = stripped.replace(/[^a-zA-Z0-9]+(.)?/g, (_m, c) => (c ? c.toUpperCase() : ''));
178
294
  return clean ? clean.charAt(0).toLowerCase() + clean.slice(1) : paramName;
179
295
  }
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBhcmFtZXRlci51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvY29yZS91dGlscy9yZXBvcnQtcGFyYW1ldGVyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJcEUsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUM7QUFFekMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBTyxFQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBRXpHLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBVztJQUM5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLFFBQVEsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDMUIsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxLQUFLLGNBQWM7WUFDakIsT0FBTyxHQUFHLEdBQUcsQ0FB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RCxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoSCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydERlZmluaXRpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVwb3J0LWRhdGFzb3VyY2UubW9kZWwnO1xuaW1wb3J0IHsgZ2V0RmllbGRDYXNlSW5zZW5zaXRpdmUgfSBmcm9tICcuL2RhdGEtbm9ybWFsaXphdGlvbi51dGlsJztcblxuZXhwb3J0IHR5cGUgUGFyYW1ldGVyTWFwcGluZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuY29uc3QgVE9LRU5fUkUgPSAvXlxce1xce1xccyooLis/KVxccypcXH1cXH0kLztcblxuY29uc3QgcGFkID0gKG46IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbmNvbnN0IGZvcm1hdFlNRCA9IChkOiBEYXRlKTogc3RyaW5nID0+IGAke2QuZ2V0RnVsbFllYXIoKX0tJHtwYWQoZC5nZXRNb250aCgpICsgMSl9LSR7cGFkKGQuZ2V0RGF0ZSgpKX1gO1xuXG4vKiogUmVzb2x2ZXMgYHt7Y29udGV4dC54eHh9fWAgcHJlc2V0cyBzdWNoIGFzIHRvZGF5IC8gc3RhcnRPZk1vbnRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZXh0UHJlc2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgc3dpdGNoIChrZXkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ3llc3RlcmRheSc6IHtcbiAgICAgIGNvbnN0IHkgPSBuZXcgRGF0ZShub3cpO1xuICAgICAgeS5zZXREYXRlKHkuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICByZXR1cm4gZm9ybWF0WU1EKHkpO1xuICAgIH1cbiAgICBjYXNlICdzdGFydG9mbW9udGgnOlxuICAgICAgcmV0dXJuIGAke25vdy5nZXRGdWxsWWVhcigpfS0ke3BhZChub3cuZ2V0TW9udGgoKSArIDEpfS0wMWA7XG4gICAgY2FzZSAnZW5kb2Ztb250aCc6XG4gICAgICByZXR1cm4gZm9ybWF0WU1EKG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSArIDEsIDApKTtcbiAgICBjYXNlICdzdGFydG9meWVhcic6XG4gICAgICByZXR1cm4gYCR7bm93LmdldEZ1bGxZZWFyKCl9LTAxLTAxYDtcbiAgICBjYXNlICd0b2RheSc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRZTUQobm93KTtcbiAgfVxufVxuXG4vKipcbiAqIExvb2tzIHVwIGEgZmllbGQgdmFsdWUgZnJvbSBmb3JtVmFsdWVzIHN1cHBvcnRpbmcgZGlyZWN0IG5hbWVzLCBkb3QgcGF0aHMgKGEuYiksXG4gKiBhbmQgY29tcG91bmQgZGF0ZSByYW5nZXMgKGUuZy4gZGF0ZVJhbmdlLmZyb20sIGRhdGVSYW5nZV9mcm9tLCBkYXRlUmFuZ2VGcm9tKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDYW52YXNGaWVsZFZhbHVlKFxuICBmb3JtVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5uZXI6IHN0cmluZ1xuKTogdW5rbm93biB7XG4gIC8vIDEuIERpcmVjdCBjYXNlLWluc2Vuc2l0aXZlIGxvb2t1cFxuICBjb25zdCBkaXJlY3QgPSBnZXRGaWVsZENhc2VJbnNlbnNpdGl2ZShmb3JtVmFsdWVzLCBpbm5lcik7XG4gIGlmIChkaXJlY3QgIT09IHVuZGVmaW5lZCAmJiBkaXJlY3QgIT09IG51bGwpIHtcbiAgICByZXR1cm4gZGlyZWN0O1xuICB9XG5cbiAgLy8gMi4gRG90LXBhdGggbG9va3VwIChlLmcuIGRhdGVSYW5nZS5mcm9tIG9yIHVzZXIuYWRkcmVzcy5jaXR5KVxuICBpZiAoaW5uZXIuaW5jbHVkZXMoJy4nKSkge1xuICAgIGNvbnN0IHBhcnRzID0gaW5uZXIuc3BsaXQoJy4nKTtcbiAgICBsZXQgY3VycjogdW5rbm93biA9IGZvcm1WYWx1ZXM7XG4gICAgZm9yIChjb25zdCBwIG9mIHBhcnRzKSB7XG4gICAgICBpZiAoY3VyciAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY3VyciA9IGdldEZpZWxkQ2FzZUluc2Vuc2l0aXZlKGN1cnIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VyciA9IHVuZGVmaW5lZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyICE9PSB1bmRlZmluZWQgJiYgY3VyciAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN1cnI7XG4gICAgfVxuICB9XG5cbiAgLy8gMy4gQ29tcG91bmQgZGF0ZSByYW5nZSBtYXRjaGluZyAoZS5nLiBkYXRlUmFuZ2VfZnJvbSwgZGF0ZVJhbmdlRnJvbSwgZnJvbURhdGUsIHRvRGF0ZSlcbiAgY29uc3QgbG93ZXJJbm5lciA9IGlubmVyLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGlzRnJvbSA9XG4gICAgbG93ZXJJbm5lci5lbmRzV2l0aCgnX2Zyb20nKSB8fFxuICAgIGxvd2VySW5uZXIuZW5kc1dpdGgoJ2Zyb20nKSB8fFxuICAgIGxvd2VySW5uZXIuc3RhcnRzV2l0aCgnZnJvbScpIHx8XG4gICAgbG93ZXJJbm5lci5zdGFydHNXaXRoKCdmcm9tXycpO1xuXG4gIGNvbnN0IGlzVG8gPVxuICAgICFpc0Zyb20gJiZcbiAgICAobG93ZXJJbm5lci5lbmRzV2l0aCgnX3RvJykgfHxcbiAgICAgIGxvd2VySW5uZXIuZW5kc1dpdGgoJ3RvJykgfHxcbiAgICAgIGxvd2VySW5uZXIuc3RhcnRzV2l0aCgndG8nKSB8fFxuICAgICAgbG93ZXJJbm5lci5zdGFydHNXaXRoKCd0b18nKSk7XG5cbiAgaWYgKGlzRnJvbSB8fCBpc1RvKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGZvcm1WYWx1ZXMpKSB7XG4gICAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICdmcm9tJyBpbiAodmFsIGFzIGFueSkgJiYgJ3RvJyBpbiAodmFsIGFzIGFueSkpIHtcbiAgICAgICAgY29uc3QgcmFuZ2VPYmogPSB2YWwgYXMgeyBmcm9tOiB1bmtub3duOyB0bzogdW5rbm93biB9O1xuICAgICAgICBjb25zdCBjbGVhbklubmVyID0gbG93ZXJJbm5lclxuICAgICAgICAgIC5yZXBsYWNlKC9eZnJvbV8/fF50b18/fF9mcm9tJHxfdG8kfGZyb20kfHRvJC8sICcnKVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY2xlYW5Jbm5lciA9PT0gJycgfHwga2V5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY2xlYW5Jbm5lcikgfHwgY2xlYW5Jbm5lci5pbmNsdWRlcyhrZXkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICByZXR1cm4gaXNGcm9tID8gcmFuZ2VPYmouZnJvbSA6IHJhbmdlT2JqLnRvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgcmF3IG1hcHBpbmcgdmFsdWUgYWdhaW5zdCBzZXNzaW9uICsgY2FudmFzIGZvcm0gdmFsdWVzLlxuICogLSBge3tzZXNzaW9uLmJyYW5jaElkfX1gICAtPiBzZXNzaW9uIHZhbHVlIChjYXNlLWluc2Vuc2l0aXZlKVxuICogLSBge3tjb250ZXh0LnRvZGF5fX1gICAgICAtPiBjb21wdXRlZCBkYXRlXG4gKiAtIGB7e2Zyb21EYXRlfX1gICAgICAgICAgIC0+IHZhbHVlIG9mIGNhbnZhcyBmaWVsZCB3aXRoIGtleSBgZnJvbURhdGVgIChjYXNlLWluc2Vuc2l0aXZlKVxuICogLSBge3tkYXRlUmFuZ2UuZnJvbX19YCAgICAtPiB2YWx1ZSBvZiBuZXN0ZWQgZnJvbSBwcm9wZXJ0eVxuICogLSBhbnl0aGluZyBlbHNlICAgICAgICAgICAtPiByZXR1cm5lZCB1bmNoYW5nZWQgKGZpeGVkIHZhbHVlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhcmFtZXRlclZhbHVlKFxuICByYXc6IHVua25vd24sXG4gIHNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBmb3JtVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgcmF3ICE9PSAnc3RyaW5nJykgcmV0dXJuIHJhdztcbiAgY29uc3QgbSA9IFRPS0VOX1JFLmV4ZWMocmF3KTtcbiAgaWYgKCFtKSByZXR1cm4gcmF3O1xuICBjb25zdCBpbm5lciA9IG1bMV07XG4gIGlmIChpbm5lci5zdGFydHNXaXRoKCdzZXNzaW9uLicpKSB7XG4gICAgY29uc3Qgc2Vzc2lvbktleSA9IGlubmVyLnNsaWNlKDgpO1xuICAgIGNvbnN0IHZhbCA9IGdldEZpZWxkQ2FzZUluc2Vuc2l0aXZlKHNlc3Npb24sIHNlc3Npb25LZXkpO1xuICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwgPyB2YWwgOiAnJztcbiAgfVxuICBpZiAoaW5uZXIuc3RhcnRzV2l0aCgnY29udGV4dC4nKSkge1xuICAgIHJldHVybiByZXNvbHZlQ29udGV4dFByZXNldChpbm5lci5zbGljZSg4KSk7XG4gIH1cbiAgY29uc3QgdiA9IHJlc29sdmVDYW52YXNGaWVsZFZhbHVlKGZvcm1WYWx1ZXMsIGlubmVyKTtcbiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsID8gdiA6ICcnO1xufVxuXG4vKiogUmVzb2x2ZXMgZXZlcnkgbWFwcGluZyBpbnRvIGNvbmNyZXRlIHZhbHVlcyAoZGUtZHVwbGljYXRpbmcgYEBuYW1lYCAvIGBuYW1lYCkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhcmFtZXRlck1hcHBpbmdzKFxuICBtYXBwaW5nczogUGFyYW1ldGVyTWFwcGluZ3MgfCB1bmRlZmluZWQsXG4gIHNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBmb3JtVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcmF3XSBvZiBPYmplY3QuZW50cmllcyhtYXBwaW5ncyA/PyB7fSkpIHtcbiAgICBjb25zdCB2YWwgPSByZXNvbHZlUGFyYW1ldGVyVmFsdWUocmF3LCBzZXNzaW9uLCBmb3JtVmFsdWVzKTtcbiAgICBjb25zdCBjbGVhbktleSA9IGtleS5yZXBsYWNlKC9eQC8sICcnKTtcbiAgICBvdXRbY2xlYW5LZXldID0gdmFsO1xuICAgIG91dFtgQCR7Y2xlYW5LZXl9YF0gPSB2YWw7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGNhbnZhcyBmaWVsZCBrZXlzIHJlZmVyZW5jZWQgYnkgbWFwcGluZ3MgdGhhdCBjdXJyZW50bHkgaGF2ZSBubyB2YWx1ZS5cbiAqIFNlc3Npb24gLyBjb250ZXh0IC8gZml4ZWQgdmFsdWVzIG5ldmVyIGJsb2NrIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNaXNzaW5nQ2FudmFzRmllbGRzKFxuICBtYXBwaW5nczogUGFyYW1ldGVyTWFwcGluZ3MgfCB1bmRlZmluZWQsXG4gIGZvcm1WYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1pc3NpbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCByYXcgb2YgT2JqZWN0LnZhbHVlcyhtYXBwaW5ncyA/PyB7fSkpIHtcbiAgICBpZiAodHlwZW9mIHJhdyAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG0gPSBUT0tFTl9SRS5leGVjKHJhdyk7XG4gICAgaWYgKCFtKSBjb250aW51ZTtcbiAgICBjb25zdCBpbm5lciA9IG1bMV07XG4gICAgaWYgKGlubmVyLnN0YXJ0c1dpdGgoJ3Nlc3Npb24uJykgfHwgaW5uZXIuc3RhcnRzV2l0aCgnY29udGV4dC4nKSkgY29udGludWU7XG4gICAgY29uc3QgdiA9IHJlc29sdmVDYW52YXNGaWVsZFZhbHVlKGZvcm1WYWx1ZXMsIGlubmVyKTtcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwgfHwgKHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2LnRyaW0oKSA9PT0gJycpKSB7XG4gICAgICBtaXNzaW5nLmFkZChpbm5lcik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodikgJiYgJ2Zyb20nIGluICh2IGFzIGFueSkpIHtcbiAgICAgIGNvbnN0IHIgPSB2IGFzIHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmcgfTtcbiAgICAgIGlmICghci5mcm9tICYmICFyLnRvKSB7XG4gICAgICAgIG1pc3NpbmcuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5taXNzaW5nXTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgZGF0YSBzb3VyY2UgdGhlIHJlc3VsdCBncmlkIHNob3VsZCBydW46XG4gKiAxLiB0aGUgb25lIHJlZmVyZW5jZWQgYnkgYGdyaWQuZGF0YVNvdXJjZUlkYFxuICogMi4gb3RoZXJ3aXNlIHRoZSBmaXJzdCBkZWNsYXJlZCBkYXRhIHNvdXJjZVxuICogMy4gb3RoZXJ3aXNlIGEgcHJvY2VkdXJlL3RhYmxlIGJvdW5kIHRvIGEgY29tcG9uZW50IChsZWdhY3kgcmVwb3J0cylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFeGVjdXRpb25EYXRhU291cmNlKGRlZjogUmVwb3J0RGVmaW5pdGlvbik6IFJlcG9ydERhdGFTb3VyY2VEZWZpbml0aW9uIHwgbnVsbCB7XG4gIGNvbnN0IHNvdXJjZXMgPSBkZWYuZGF0YVNvdXJjZXMgPz8gW107XG4gIGNvbnN0IGJ5SWQgPSBzb3VyY2VzLmZpbmQoKGQpID0+IGQuaWQgPT09IGRlZi5ncmlkPy5kYXRhU291cmNlSWQpO1xuICBpZiAoYnlJZCkgcmV0dXJuIGJ5SWQ7XG4gIGlmIChzb3VyY2VzLmxlbmd0aCA+IDApIHJldHVybiBzb3VyY2VzWzBdO1xuXG4gIGNvbnN0IGNvbXAgPSBkZWYuY29tcG9uZW50cy5maW5kKChjKSA9PiBjLmRhdGFTb3VyY2U/LmVudGl0eU5hbWUpO1xuICBjb25zdCBjZHMgPSBjb21wPy5kYXRhU291cmNlO1xuICBpZiAoY2RzPy5lbnRpdHlOYW1lKSB7XG4gICAgY29uc3QgaXNUYWJsZSA9IGNkcy5zb3VyY2VUeXBlID09PSAndGFibGUnO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogYHNwLSR7Y2RzLmVudGl0eU5hbWV9YCxcbiAgICAgIG5hbWU6IGNkcy5lbnRpdHlOYW1lLFxuICAgICAgZW5kcG9pbnQ6IGNkcy5lbnRpdHlOYW1lLFxuICAgICAgc2NoZW1hOiBjZHMuc2NoZW1hIHx8ICdkYm8nLFxuICAgICAgdHlwZTogaXNUYWJsZSA/ICd0YWJsZScgOiAnc3RvcmVkX3Byb2NlZHVyZScsXG4gICAgICBtZXRob2Q6IGlzVGFibGUgPyAnR0VUJyA6ICdTVE9SRURfUFJPQ0VEVVJFJyxcbiAgICAgIHBhcmFtZXRlck1hcHBpbmdzOiBjZHMucGFyYW1ldGVyTWFwcGluZ3MsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIFN0cmlwcyBTUUwgU2VydmVyIEh1bmdhcmlhbiBwcmVmaXhlczogYEBjaHJGcm9tRGF0ZWAgLT4gYGZyb21EYXRlYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0ZpZWxkS2V5KHBhcmFtTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaXBwZWQgPSBwYXJhbU5hbWVcbiAgICAucmVwbGFjZSgvXkArLywgJycpXG4gICAgLnJlcGxhY2UoL14oY2hyfGludHx2Y2hyfG5jaHJ8ZHR8c3RyfG51bXxiaXR8ZGVjfGZsdCkoPz1bQS1aX10pLywgJycpO1xuICBjb25zdCBjbGVhbiA9IHN0cmlwcGVkLnJlcGxhY2UoL1teYS16QS1aMC05XSsoLik/L2csIChfbSwgYzogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiAoYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnKSk7XG4gIHJldHVybiBjbGVhbiA/IGNsZWFuLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgY2xlYW4uc2xpY2UoMSkgOiBwYXJhbU5hbWU7XG59XG4iXX0=
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBhcmFtZXRlci51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvY29yZS91dGlscy9yZXBvcnQtcGFyYW1ldGVyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJcEUsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUM7QUFFekMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBTyxFQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBRXpHLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBVztJQUM5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLFFBQVEsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDMUIsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxLQUFLLGNBQWM7WUFDakIsT0FBTyxHQUFHLEdBQUcsQ0FB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Q0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtZQUM1QyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsaUJBQWlCO1NBQ3pDLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxVQUFVLENBQUMsU0FBaUI7SUFDMUMsTUFBTSxRQUFRLEdBQUcsU0FBUztTQUN2QixPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztTQUNsQixPQUFPLENBQUMsdURBQXVELEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hILE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uL21vZGVscy9yZXBvcnQtZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB9IGZyb20gJy4uL21vZGVscy9yZXBvcnQtZGF0YXNvdXJjZS5tb2RlbCc7XG5pbXBvcnQgeyBnZXRGaWVsZENhc2VJbnNlbnNpdGl2ZSB9IGZyb20gJy4vZGF0YS1ub3JtYWxpemF0aW9uLnV0aWwnO1xuXG5leHBvcnQgdHlwZSBQYXJhbWV0ZXJNYXBwaW5ncyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuXG5jb25zdCBUT0tFTl9SRSA9IC9eXFx7XFx7XFxzKiguKz8pXFxzKlxcfVxcfSQvO1xuXG5jb25zdCBwYWQgPSAobjogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyhuKS5wYWRTdGFydCgyLCAnMCcpO1xuY29uc3QgZm9ybWF0WU1EID0gKGQ6IERhdGUpOiBzdHJpbmcgPT4gYCR7ZC5nZXRGdWxsWWVhcigpfS0ke3BhZChkLmdldE1vbnRoKCkgKyAxKX0tJHtwYWQoZC5nZXREYXRlKCkpfWA7XG5cbi8qKiBSZXNvbHZlcyBge3tjb250ZXh0Lnh4eH19YCBwcmVzZXRzIHN1Y2ggYXMgdG9kYXkgLyBzdGFydE9mTW9udGguICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbnRleHRQcmVzZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBzd2l0Y2ggKGtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAneWVzdGVyZGF5Jzoge1xuICAgICAgY29uc3QgeSA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICB5LnNldERhdGUoeS5nZXREYXRlKCkgLSAxKTtcbiAgICAgIHJldHVybiBmb3JtYXRZTUQoeSk7XG4gICAgfVxuICAgIGNhc2UgJ3N0YXJ0b2Ztb250aCc6XG4gICAgICByZXR1cm4gYCR7bm93LmdldEZ1bGxZZWFyKCl9LSR7cGFkKG5vdy5nZXRNb250aCgpICsgMSl9LTAxYDtcbiAgICBjYXNlICdlbmRvZm1vbnRoJzpcbiAgICAgIHJldHVybiBmb3JtYXRZTUQobmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpICsgMSwgMCkpO1xuICAgIGNhc2UgJ3N0YXJ0b2Z5ZWFyJzpcbiAgICAgIHJldHVybiBgJHtub3cuZ2V0RnVsbFllYXIoKX0tMDEtMDFgO1xuICAgIGNhc2UgJ3RvZGF5JzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZvcm1hdFlNRChub3cpO1xuICB9XG59XG5cbi8qKlxuICogTG9va3MgdXAgYSBmaWVsZCB2YWx1ZSBmcm9tIGZvcm1WYWx1ZXMgc3VwcG9ydGluZyBkaXJlY3QgbmFtZXMsIGRvdCBwYXRocyAoYS5iKSxcbiAqIGFuZCBjb21wb3VuZCBkYXRlIHJhbmdlcyAoZS5nLiBkYXRlUmFuZ2UuZnJvbSwgZGF0ZVJhbmdlX2Zyb20sIGRhdGVSYW5nZUZyb20pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNhbnZhc0ZpZWxkVmFsdWUoXG4gIGZvcm1WYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpbm5lcjogc3RyaW5nXG4pOiB1bmtub3duIHtcbiAgLy8gMS4gRGlyZWN0IGNhc2UtaW5zZW5zaXRpdmUgbG9va3VwXG4gIGNvbnN0IGRpcmVjdCA9IGdldEZpZWxkQ2FzZUluc2Vuc2l0aXZlKGZvcm1WYWx1ZXMsIGlubmVyKTtcbiAgaWYgKGRpcmVjdCAhPT0gdW5kZWZpbmVkICYmIGRpcmVjdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBkaXJlY3Q7XG4gIH1cblxuICAvLyAyLiBEb3QtcGF0aCBsb29rdXAgKGUuZy4gZGF0ZVJhbmdlLmZyb20gb3IgdXNlci5hZGRyZXNzLmNpdHkpXG4gIGlmIChpbm5lci5pbmNsdWRlcygnLicpKSB7XG4gICAgY29uc3QgcGFydHMgPSBpbm5lci5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyOiB1bmtub3duID0gZm9ybVZhbHVlcztcbiAgICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHtcbiAgICAgIGlmIChjdXJyICYmIHR5cGVvZiBjdXJyID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjdXJyID0gZ2V0RmllbGRDYXNlSW5zZW5zaXRpdmUoY3VyciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnIgIT09IHVuZGVmaW5lZCAmJiBjdXJyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY3VycjtcbiAgICB9XG4gIH1cblxuICAvLyAzLiBDb21wb3VuZCBkYXRlIHJhbmdlIG1hdGNoaW5nIChlLmcuIGRhdGVSYW5nZV9mcm9tLCBkYXRlUmFuZ2VGcm9tLCBmcm9tRGF0ZSwgdG9EYXRlKVxuICBjb25zdCBsb3dlcklubmVyID0gaW5uZXIudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgaXNGcm9tID1cbiAgICBsb3dlcklubmVyLmVuZHNXaXRoKCdfZnJvbScpIHx8XG4gICAgbG93ZXJJbm5lci5lbmRzV2l0aCgnZnJvbScpIHx8XG4gICAgbG93ZXJJbm5lci5zdGFydHNXaXRoKCdmcm9tJykgfHxcbiAgICBsb3dlcklubmVyLnN0YXJ0c1dpdGgoJ2Zyb21fJyk7XG5cbiAgY29uc3QgaXNUbyA9XG4gICAgIWlzRnJvbSAmJlxuICAgIChsb3dlcklubmVyLmVuZHNXaXRoKCdfdG8nKSB8fFxuICAgICAgbG93ZXJJbm5lci5lbmRzV2l0aCgndG8nKSB8fFxuICAgICAgbG93ZXJJbm5lci5zdGFydHNXaXRoKCd0bycpIHx8XG4gICAgICBsb3dlcklubmVyLnN0YXJ0c1dpdGgoJ3RvXycpKTtcblxuICBpZiAoaXNGcm9tIHx8IGlzVG8pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoZm9ybVZhbHVlcykpIHtcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgJ2Zyb20nIGluICh2YWwgYXMgYW55KSAmJiAndG8nIGluICh2YWwgYXMgYW55KSkge1xuICAgICAgICBjb25zdCByYW5nZU9iaiA9IHZhbCBhcyB7IGZyb206IHVua25vd247IHRvOiB1bmtub3duIH07XG4gICAgICAgIGNvbnN0IGNsZWFuSW5uZXIgPSBsb3dlcklubmVyXG4gICAgICAgICAgLnJlcGxhY2UoL15mcm9tXz98XnRvXz98X2Zyb20kfF90byR8ZnJvbSR8dG8kLywgJycpXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjbGVhbklubmVyID09PSAnJyB8fCBrZXkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjbGVhbklubmVyKSB8fCBjbGVhbklubmVyLmluY2x1ZGVzKGtleS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgIHJldHVybiBpc0Zyb20gPyByYW5nZU9iai5mcm9tIDogcmFuZ2VPYmoudG87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNhbml0aXplcyBULVNRTCBwYXJhbWV0ZXIgbGl0ZXJhbHMgY29waWVkIGZyb20gU1NNUywgcHJvZmlsZXJzLCBvciBTUUwgc2NyaXB0czpcbiAqIC0gU3RyaXBzIG91dGVyIGRvdWJsZSBxdW90ZXM6IFwiLi4uXCJcbiAqIC0gU3RyaXBzIG91dGVyIFQtU1FMIHF1b3RlczogTicuLi4nIG9yICcuLi4nXG4gKiAtIFVuZXNjYXBlcyBkb3VibGVkIHNpbmdsZSBxdW90ZXM6ICcnIC0+ICdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplU3FsUGFyYW1MaXRlcmFsKHZhbDogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHJldHVybiB2YWw7XG4gIGxldCBzID0gdmFsLnRyaW0oKTtcbiAgaWYgKHMuc3RhcnRzV2l0aCgnXCInKSAmJiBzLmVuZHNXaXRoKCdcIicpICYmIHMubGVuZ3RoID49IDIpIHtcbiAgICBzID0gcy5zdWJzdHJpbmcoMSwgcy5sZW5ndGggLSAxKS50cmltKCk7XG4gIH1cbiAgY29uc3QgaXNRdW90ZWRTcWxMaXRlcmFsID1cbiAgICAoKHMuc3RhcnRzV2l0aChcIk4nXCIpIHx8IHMuc3RhcnRzV2l0aChcIm4nXCIpKSAmJiBzLmVuZHNXaXRoKFwiJ1wiKSAmJiBzLmxlbmd0aCA+PSAzKSB8fFxuICAgIChzLnN0YXJ0c1dpdGgoXCInXCIpICYmIHMuZW5kc1dpdGgoXCInXCIpICYmIHMubGVuZ3RoID49IDIpO1xuXG4gIGlmIChpc1F1b3RlZFNxbExpdGVyYWwpIHtcbiAgICBjb25zdCBwcmVmaXhMZW4gPSAocy5zdGFydHNXaXRoKFwiTidcIikgfHwgcy5zdGFydHNXaXRoKFwibidcIikpID8gMiA6IDE7XG4gICAgcyA9IHMuc3Vic3RyaW5nKHByZWZpeExlbiwgcy5sZW5ndGggLSAxKTtcbiAgICBpZiAocy5pbmNsdWRlcyhcIicnXCIpKSB7XG4gICAgICBzID0gcy5yZXBsYWNlKC8nJy9nLCBcIidcIik7XG4gICAgfVxuICB9IGVsc2UgaWYgKHMuaW5jbHVkZXMoXCInJyAnJ1wiKSB8fCBzLmluY2x1ZGVzKFwiJycnJ1wiKSB8fCAvJydbYS16QS1aMC05X1xcc3wtXSsnJy8udGVzdChzKSkge1xuICAgIHMgPSBzLnJlcGxhY2UoLycnL2csIFwiJ1wiKTtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRTcWxFeGVjIHtcbiAgcHJvY2VkdXJlTmFtZT86IHN0cmluZztcbiAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG59XG5cbi8qKlxuICogUGFyc2VzIGFuIFNTTVMgLyBULVNRTCBFWEVDIHN0YXRlbWVudCBzdWNoIGFzOlxuICogZXhlYyBHZXRfSGVscExpc3QgQGNockNPTVBBTllJRD1OJzEwMScsQGNoclRhYmxlTmFtZT1OJ01TVEFDQ1RHTFNVQicsQGludEV4ZWNGbGFnPTFcbiAqIEV4dHJhY3RzIHByb2NlZHVyZSBuYW1lIGFuZCB1bmVzY2FwZXMgcGFyYW1ldGVyIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3FsRXhlY1N0YXRlbWVudChzcWw6IHN0cmluZyk6IFBhcnNlZFNxbEV4ZWMgfCBudWxsIHtcbiAgaWYgKCFzcWwgfHwgdHlwZW9mIHNxbCAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuICBjb25zdCB0cmltbWVkID0gc3FsLnRyaW0oKTtcbiAgY29uc3QgZXhlY01hdGNoID0gdHJpbW1lZC5tYXRjaCgvXig/OmV4ZWMoPzp1dGUpP1xccyspKD86KD86XFxbP1tcXHddK1xcXT9cXC4pP1xcWz8oW1xcd10rKVxcXT8pXFxzKiguKikkL2lzKTtcbiAgaWYgKCFleGVjTWF0Y2ggJiYgIXRyaW1tZWQuc3RhcnRzV2l0aCgnQCcpKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBwcm9jZWR1cmVOYW1lID0gZXhlY01hdGNoID8gZXhlY01hdGNoWzFdIDogdW5kZWZpbmVkO1xuICBjb25zdCBwYXJhbVBhcnQgPSBleGVjTWF0Y2ggPyBleGVjTWF0Y2hbMl0gOiB0cmltbWVkO1xuXG4gIGNvbnN0IHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ID0ge307XG4gIGlmICghcGFyYW1QYXJ0KSByZXR1cm4geyBwcm9jZWR1cmVOYW1lLCBwYXJhbWV0ZXJzIH07XG5cbiAgbGV0IGkgPSAwO1xuICBjb25zdCBsZW4gPSBwYXJhbVBhcnQubGVuZ3RoO1xuXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgd2hpbGUgKGkgPCBsZW4gJiYgKHBhcmFtUGFydFtpXSA9PT0gJyAnIHx8IHBhcmFtUGFydFtpXSA9PT0gJ1xcdCcgfHwgcGFyYW1QYXJ0W2ldID09PSAnXFxyJyB8fCBwYXJhbVBhcnRbaV0gPT09ICdcXG4nIHx8IHBhcmFtUGFydFtpXSA9PT0gJywnKSkge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBpZiAoaSA+PSBsZW4pIGJyZWFrO1xuXG4gICAgaWYgKHBhcmFtUGFydFtpXSAhPT0gJ0AnKSB7XG4gICAgICBpKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlTdGFydCA9IGk7XG4gICAgd2hpbGUgKGkgPCBsZW4gJiYgcGFyYW1QYXJ0W2ldICE9PSAnPScgJiYgcGFyYW1QYXJ0W2ldICE9PSAnICcgJiYgcGFyYW1QYXJ0W2ldICE9PSAnXFx0Jykge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbUtleSA9IHBhcmFtUGFydC5zbGljZShrZXlTdGFydCwgaSkudHJpbSgpO1xuXG4gICAgd2hpbGUgKGkgPCBsZW4gJiYgKHBhcmFtUGFydFtpXSA9PT0gJyAnIHx8IHBhcmFtUGFydFtpXSA9PT0gJ1xcdCcgfHwgcGFyYW1QYXJ0W2ldID09PSAnPScpKSB7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgbGV0IHZhbFN0ciA9ICcnO1xuICAgIGlmIChpIDwgbGVuICYmIChwYXJhbVBhcnRbaV0gPT09IFwiJ1wiIHx8IChwYXJhbVBhcnRbaV0gPT09ICdOJyAmJiBwYXJhbVBhcnRbaSArIDFdID09PSBcIidcIikgfHwgKHBhcmFtUGFydFtpXSA9PT0gJ24nICYmIHBhcmFtUGFydFtpICsgMV0gPT09IFwiJ1wiKSkpIHtcbiAgICAgIGNvbnN0IGlzTiA9IHBhcmFtUGFydFtpXSA9PT0gJ04nIHx8IHBhcmFtUGFydFtpXSA9PT0gJ24nO1xuICAgICAgaSArPSBpc04gPyAyIDogMTtcbiAgICAgIGxldCBpblF1b3RlID0gdHJ1ZTtcbiAgICAgIGxldCBxdW90ZVZhbCA9ICcnO1xuICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgaW5RdW90ZSkge1xuICAgICAgICBpZiAocGFyYW1QYXJ0W2ldID09PSBcIidcIikge1xuICAgICAgICAgIGlmIChpICsgMSA8IGxlbiAmJiBwYXJhbVBhcnRbaSArIDFdID09PSBcIidcIikge1xuICAgICAgICAgICAgcXVvdGVWYWwgKz0gXCInXCI7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluUXVvdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVvdGVWYWwgKz0gcGFyYW1QYXJ0W2ldO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFsU3RyID0gcXVvdGVWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbFN0YXJ0ID0gaTtcbiAgICAgIHdoaWxlIChpIDwgbGVuICYmIHBhcmFtUGFydFtpXSAhPT0gJywnICYmIHBhcmFtUGFydFtpXSAhPT0gJ1xccicgJiYgcGFyYW1QYXJ0W2ldICE9PSAnXFxuJykge1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICB2YWxTdHIgPSBwYXJhbVBhcnQuc2xpY2UodmFsU3RhcnQsIGkpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBjb25zdCBjbGVhbktleSA9IHBhcmFtS2V5LnJlcGxhY2UoL15ALywgJycpO1xuICAgIGlmIChjbGVhbktleSkge1xuICAgICAgaWYgKC9eLT9cXGQrJC8udGVzdCh2YWxTdHIpKSB7XG4gICAgICAgIHBhcmFtZXRlcnNbcGFyYW1LZXldID0gcGFyc2VJbnQodmFsU3RyLCAxMCk7XG4gICAgICB9IGVsc2UgaWYgKC9eLT9cXGQrXFwuXFxkKyQvLnRlc3QodmFsU3RyKSkge1xuICAgICAgICBwYXJhbWV0ZXJzW3BhcmFtS2V5XSA9IHBhcnNlRmxvYXQodmFsU3RyKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsU3RyLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJykge1xuICAgICAgICBwYXJhbWV0ZXJzW3BhcmFtS2V5XSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbFN0ci50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHBhcmFtZXRlcnNbcGFyYW1LZXldID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbWV0ZXJzW3BhcmFtS2V5XSA9IHZhbFN0cjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBwcm9jZWR1cmVOYW1lLCBwYXJhbWV0ZXJzIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgb25lIHJhdyBtYXBwaW5nIHZhbHVlIGFnYWluc3Qgc2Vzc2lvbiArIGNhbnZhcyBmb3JtIHZhbHVlcy5cbiAqIC0gYHt7c2Vzc2lvbi5icmFuY2hJZH19YCAgLT4gc2Vzc2lvbiB2YWx1ZSAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAqIC0gYHt7Y29udGV4dC50b2RheX19YCAgICAgLT4gY29tcHV0ZWQgZGF0ZVxuICogLSBge3tmcm9tRGF0ZX19YCAgICAgICAgICAtPiB2YWx1ZSBvZiBjYW52YXMgZmllbGQgd2l0aCBrZXkgYGZyb21EYXRlYCAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAqIC0gYHt7ZGF0ZVJhbmdlLmZyb219fWAgICAgLT4gdmFsdWUgb2YgbmVzdGVkIGZyb20gcHJvcGVydHlcbiAqIC0gYW55dGhpbmcgZWxzZSAgICAgICAgICAgLT4gc2FuaXRpemVkIGxpdGVyYWwgdmFsdWUgKGZpeGVkIHZhbHVlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhcmFtZXRlclZhbHVlKFxuICByYXc6IHVua25vd24sXG4gIHNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBmb3JtVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgcmF3ICE9PSAnc3RyaW5nJykgcmV0dXJuIHJhdztcbiAgY29uc3QgbSA9IFRPS0VOX1JFLmV4ZWMocmF3KTtcbiAgaWYgKCFtKSByZXR1cm4gc2FuaXRpemVTcWxQYXJhbUxpdGVyYWwocmF3KTtcbiAgY29uc3QgaW5uZXIgPSBtWzFdO1xuICBpZiAoaW5uZXIuc3RhcnRzV2l0aCgnc2Vzc2lvbi4nKSkge1xuICAgIGNvbnN0IHNlc3Npb25LZXkgPSBpbm5lci5zbGljZSg4KTtcbiAgICBjb25zdCB2YWwgPSBnZXRGaWVsZENhc2VJbnNlbnNpdGl2ZShzZXNzaW9uLCBzZXNzaW9uS2V5KTtcbiAgICByZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBudWxsID8gdmFsIDogJyc7XG4gIH1cbiAgaWYgKGlubmVyLnN0YXJ0c1dpdGgoJ2NvbnRleHQuJykpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUNvbnRleHRQcmVzZXQoaW5uZXIuc2xpY2UoOCkpO1xuICB9XG4gIGNvbnN0IHYgPSByZXNvbHZlQ2FudmFzRmllbGRWYWx1ZShmb3JtVmFsdWVzLCBpbm5lcik7XG4gIHJldHVybiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCA/IHYgOiAnJztcbn1cblxuLyoqIFJlc29sdmVzIGV2ZXJ5IG1hcHBpbmcgaW50byBjb25jcmV0ZSB2YWx1ZXMgKGRlLWR1cGxpY2F0aW5nIGBAbmFtZWAgLyBgbmFtZWApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXJhbWV0ZXJNYXBwaW5ncyhcbiAgbWFwcGluZ3M6IFBhcmFtZXRlck1hcHBpbmdzIHwgdW5kZWZpbmVkLFxuICBzZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZm9ybVZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHJhd10gb2YgT2JqZWN0LmVudHJpZXMobWFwcGluZ3MgPz8ge30pKSB7XG4gICAgY29uc3QgdmFsID0gcmVzb2x2ZVBhcmFtZXRlclZhbHVlKHJhdywgc2Vzc2lvbiwgZm9ybVZhbHVlcyk7XG4gICAgY29uc3QgY2xlYW5LZXkgPSBrZXkucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgb3V0W2NsZWFuS2V5XSA9IHZhbDtcbiAgICBvdXRbYEAke2NsZWFuS2V5fWBdID0gdmFsO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBjYW52YXMgZmllbGQga2V5cyByZWZlcmVuY2VkIGJ5IG1hcHBpbmdzIHRoYXQgY3VycmVudGx5IGhhdmUgbm8gdmFsdWUuXG4gKiBTZXNzaW9uIC8gY29udGV4dCAvIGZpeGVkIHZhbHVlcyBuZXZlciBibG9jayBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTWlzc2luZ0NhbnZhc0ZpZWxkcyhcbiAgbWFwcGluZ3M6IFBhcmFtZXRlck1hcHBpbmdzIHwgdW5kZWZpbmVkLFxuICBmb3JtVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nW10ge1xuICBjb25zdCBtaXNzaW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcmF3IG9mIE9iamVjdC52YWx1ZXMobWFwcGluZ3MgPz8ge30pKSB7XG4gICAgaWYgKHR5cGVvZiByYXcgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBjb25zdCBtID0gVE9LRU5fUkUuZXhlYyhyYXcpO1xuICAgIGlmICghbSkgY29udGludWU7XG4gICAgY29uc3QgaW5uZXIgPSBtWzFdO1xuICAgIGlmIChpbm5lci5zdGFydHNXaXRoKCdzZXNzaW9uLicpIHx8IGlubmVyLnN0YXJ0c1dpdGgoJ2NvbnRleHQuJykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHYgPSByZXNvbHZlQ2FudmFzRmllbGRWYWx1ZShmb3JtVmFsdWVzLCBpbm5lcik7XG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsIHx8ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi50cmltKCkgPT09ICcnKSkge1xuICAgICAgbWlzc2luZy5hZGQoaW5uZXIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHYpICYmICdmcm9tJyBpbiAodiBhcyBhbnkpKSB7XG4gICAgICBjb25zdCByID0gdiBhcyB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH07XG4gICAgICBpZiAoIXIuZnJvbSAmJiAhci50bykge1xuICAgICAgICBtaXNzaW5nLmFkZChpbm5lcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ubWlzc2luZ107XG59XG5cbi8qKlxuICogUGlja3MgdGhlIGRhdGEgc291cmNlIHRoZSByZXN1bHQgZ3JpZCBzaG91bGQgcnVuOlxuICogMS4gdGhlIG9uZSByZWZlcmVuY2VkIGJ5IGBncmlkLmRhdGFTb3VyY2VJZGBcbiAqIDIuIG90aGVyd2lzZSB0aGUgZmlyc3QgZGVjbGFyZWQgZGF0YSBzb3VyY2VcbiAqIDMuIG90aGVyd2lzZSBhIHByb2NlZHVyZS90YWJsZSBib3VuZCB0byBhIGNvbXBvbmVudCAobGVnYWN5IHJlcG9ydHMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRXhlY3V0aW9uRGF0YVNvdXJjZShkZWY6IFJlcG9ydERlZmluaXRpb24pOiBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbiB8IG51bGwge1xuICBjb25zdCBzb3VyY2VzID0gZGVmLmRhdGFTb3VyY2VzID8/IFtdO1xuICBjb25zdCBieUlkID0gc291cmNlcy5maW5kKChkKSA9PiBkLmlkID09PSBkZWYuZ3JpZD8uZGF0YVNvdXJjZUlkKTtcbiAgaWYgKGJ5SWQpIHJldHVybiBieUlkO1xuICBpZiAoc291cmNlcy5sZW5ndGggPiAwKSByZXR1cm4gc291cmNlc1swXTtcblxuICBjb25zdCBjb21wID0gZGVmLmNvbXBvbmVudHMuZmluZCgoYykgPT4gYy5kYXRhU291cmNlPy5lbnRpdHlOYW1lKTtcbiAgY29uc3QgY2RzID0gY29tcD8uZGF0YVNvdXJjZTtcbiAgaWYgKGNkcz8uZW50aXR5TmFtZSkge1xuICAgIGNvbnN0IGlzVGFibGUgPSBjZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJztcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGBzcC0ke2Nkcy5lbnRpdHlOYW1lfWAsXG4gICAgICBuYW1lOiBjZHMuZW50aXR5TmFtZSxcbiAgICAgIGVuZHBvaW50OiBjZHMuZW50aXR5TmFtZSxcbiAgICAgIHNjaGVtYTogY2RzLnNjaGVtYSB8fCAnZGJvJyxcbiAgICAgIHR5cGU6IGlzVGFibGUgPyAndGFibGUnIDogJ3N0b3JlZF9wcm9jZWR1cmUnLFxuICAgICAgbWV0aG9kOiBpc1RhYmxlID8gJ0dFVCcgOiAnU1RPUkVEX1BST0NFRFVSRScsXG4gICAgICBwYXJhbWV0ZXJNYXBwaW5nczogY2RzLnBhcmFtZXRlck1hcHBpbmdzLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBTdHJpcHMgU1FMIFNlcnZlciBIdW5nYXJpYW4gcHJlZml4ZXM6IGBAY2hyRnJvbURhdGVgIC0+IGBmcm9tRGF0ZWAuICovXG5leHBvcnQgZnVuY3Rpb24gdG9GaWVsZEtleShwYXJhbU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmlwcGVkID0gcGFyYW1OYW1lXG4gICAgLnJlcGxhY2UoL15AKy8sICcnKVxuICAgIC5yZXBsYWNlKC9eKGNocnxpbnR8dmNocnxuY2hyfGR0fHN0cnxudW18Yml0fGRlY3xmbHQpKD89W0EtWl9dKS8sICcnKTtcbiAgY29uc3QgY2xlYW4gPSBzdHJpcHBlZC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rKC4pPy9nLCAoX20sIGM6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gKGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJykpO1xuICByZXR1cm4gY2xlYW4gPyBjbGVhbi5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGNsZWFuLnNsaWNlKDEpIDogcGFyYW1OYW1lO1xufVxuIl19
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Endpoint-based data source adapter.
3
+ *
4
+ * Calls the `executeEndpoint` directly with a normalized payload.
5
+ * Replaces the `apiBaseUrl + /execute` pattern.
6
+ */
7
+ import { inject, Injectable } from '@angular/core';
8
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
9
+ import { throwError } from 'rxjs';
10
+ import { catchError, map } from 'rxjs/operators';
11
+ import { ReportDataSourceAdapter } from '../contracts/data-source.contract';
12
+ import { ReportSessionContextService } from '../../core/services/report-session-context.service';
13
+ import { extractRowArray } from '../../core/utils/data-normalization.util';
14
+ import { BWAYS_REPORT_ENDPOINTS } from './endpoint-tokens';
15
+ import * as i0 from "@angular/core";
16
+ export class EndpointDataSourceAdapter extends ReportDataSourceAdapter {
17
+ http = inject(HttpClient);
18
+ endpoints = inject(BWAYS_REPORT_ENDPOINTS);
19
+ sessionService = inject(ReportSessionContextService, { optional: true });
20
+ execute(dataSource, parameters) {
21
+ const session = this.sessionService?.sessionContext() ?? {};
22
+ let headers = new HttpHeaders();
23
+ if (session['companyId'] !== undefined && session['companyId'] !== null) {
24
+ headers = headers.set('X-Company-Id', String(session['companyId']));
25
+ }
26
+ if (session['branchId'] !== undefined && session['branchId'] !== null) {
27
+ headers = headers.set('X-Branch-Id', String(session['branchId']));
28
+ }
29
+ const kind = this.resolveKind(dataSource);
30
+ const payload = {
31
+ kind,
32
+ name: dataSource.endpoint || dataSource.name,
33
+ schema: dataSource.schema ?? 'dbo',
34
+ parameters: { ...parameters },
35
+ dataSource: {
36
+ id: dataSource.id || dataSource.name,
37
+ type: kind === 'procedure' ? 'stored_procedure' : (dataSource.type || 'table'),
38
+ name: dataSource.endpoint || dataSource.name,
39
+ schema: dataSource.schema ?? 'dbo',
40
+ },
41
+ sessionContext: session,
42
+ };
43
+ return this.http
44
+ .post(this.endpoints.executeEndpoint, payload, { headers })
45
+ .pipe(map((response) => extractRowArray(response)), catchError((err) => {
46
+ const msg = err?.error?.message || err?.message || 'Report execution failed';
47
+ return throwError(() => new Error(Array.isArray(msg) ? msg.join(', ') : msg));
48
+ }));
49
+ }
50
+ resolveKind(ds) {
51
+ if (ds.method === 'STORED_PROCEDURE')
52
+ return 'procedure';
53
+ if (ds.type === 'stored_procedure')
54
+ return 'procedure';
55
+ if (ds.type === 'table' || ds.type === 'view')
56
+ return 'table';
57
+ // Heuristic: names starting with usp_ / sp_ are procedures
58
+ const name = (ds.endpoint || ds.name || '').toLowerCase();
59
+ if (name.startsWith('usp_') || name.startsWith('sp_'))
60
+ return 'procedure';
61
+ return 'table';
62
+ }
63
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointDataSourceAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
64
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointDataSourceAdapter });
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointDataSourceAdapter, decorators: [{
67
+ type: Injectable
68
+ }] });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQtZGF0YXNvdXJjZS5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZGF0YS1hY2Nlc3MvYWRhcHRlcnMvZW5kcG9pbnQtZGF0YXNvdXJjZS5hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFNUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDakcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQWUzRCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsdUJBQXVCO0lBQ25ELElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUIsU0FBUyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzNDLGNBQWMsR0FBRyxNQUFNLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUxRixPQUFPLENBQ0wsVUFBc0MsRUFDdEMsVUFBbUM7UUFFbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFNUQsSUFBSSxP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QUFVLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDMUUsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzt3R0FyRFUseUJBQXlCOzRHQUF6Qix5QkFBeUI7OzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVuZHBvaW50LWJhc2VkIGRhdGEgc291cmNlIGFkYXB0ZXIuXG4gKlxuICogQ2FsbHMgdGhlIGBleGVjdXRlRW5kcG9pbnRgIGRpcmVjdGx5IHdpdGggYSBub3JtYWxpemVkIHBheWxvYWQuXG4gKiBSZXBsYWNlcyB0aGUgYGFwaUJhc2VVcmwgKyAvZXhlY3V0ZWAgcGF0dGVybi5cbiAqL1xuXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YVNvdXJjZUFkYXB0ZXIgfSBmcm9tICcuLi9jb250cmFjdHMvZGF0YS1zb3VyY2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZGF0YXNvdXJjZS5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3JlcG9ydC1zZXNzaW9uLWNvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBleHRyYWN0Um93QXJyYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2RhdGEtbm9ybWFsaXphdGlvbi51dGlsJztcbmltcG9ydCB7IEJXQVlTX1JFUE9SVF9FTkRQT0lOVFMgfSBmcm9tICcuL2VuZHBvaW50LXRva2Vucyc7XG5cbi8qKlxuICogUmVxdWVzdCBwYXlsb2FkIGZvciB0aGUgc2ltcGxpZmllZCBleGVjdXRlIGVuZHBvaW50LlxuICovXG5pbnRlcmZhY2UgRW5kcG9pbnRFeGVjdXRlUGF5bG9hZCB7XG4gIGtpbmQ6ICdwcm9jZWR1cmUnIHwgJ3RhYmxlJztcbiAgbmFtZTogc3RyaW5nO1xuICBzY2hlbWE6IHN0cmluZztcbiAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbHVtbnM/OiBzdHJpbmdbXTtcbiAgdG9wPzogbnVtYmVyO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRW5kcG9pbnREYXRhU291cmNlQWRhcHRlciBleHRlbmRzIFJlcG9ydERhdGFTb3VyY2VBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50cyA9IGluamVjdChCV0FZU19SRVBPUlRfRU5EUE9JTlRTKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uU2VydmljZSA9IGluamVjdChSZXBvcnRTZXNzaW9uQ29udGV4dFNlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgZXhlY3V0ZShcbiAgICBkYXRhU291cmNlOiBSZXBvcnREYXRhU291cmNlRGVmaW5pdGlvbixcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBPYnNlcnZhYmxlPHVua25vd25bXT4ge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25TZXJ2aWNlPy5zZXNzaW9uQ29udGV4dCgpID8/IHt9O1xuXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBpZiAoc2Vzc2lvblsnY29tcGFueUlkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydjb21wYW55SWQnXSAhPT0gbnVsbCkge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdYLUNvbXBhbnktSWQnLCBTdHJpbmcoc2Vzc2lvblsnY29tcGFueUlkJ10pKTtcbiAgICB9XG4gICAgaWYgKHNlc3Npb25bJ2JyYW5jaElkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydicmFuY2hJZCddICE9PSBudWxsKSB7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ1gtQnJhbmNoLUlkJywgU3RyaW5nKHNlc3Npb25bJ2JyYW5jaElkJ10pKTtcbiAgICB9XG5cbiAgICBjb25zdCBraW5kID0gdGhpcy5yZXNvbHZlS2luZChkYXRhU291cmNlKTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAga2luZCxcbiAgICAgIG5hbWU6IGRhdGFTb3VyY2UuZW5kcG9pbnQgfHwgZGF0YVNvdXJjZS5uYW1lLFxuICAgICAgc2NoZW1hOiBkYXRhU291cmNlLnNjaGVtYSA/PyAnZGJvJyxcbiAgICAgIHBhcmFtZXRlcnM6IHsgLi4ucGFyYW1ldGVycyB9LFxuICAgICAgZGF0YVNvdXJjZToge1xuICAgICAgICBpZDogZGF0YVNvdXJjZS5pZCB8fCBkYXRhU291cmNlLm5hbWUsXG4gICAgICAgIHR5cGU6IGtpbmQgPT09ICdwcm9jZWR1cmUnID8gJ3N0b3JlZF9wcm9jZWR1cmUnIDogKGRhdGFTb3VyY2UudHlwZSB8fCAndGFibGUnKSxcbiAgICAgICAgbmFtZTogZGF0YVNvdXJjZS5lbmRwb2ludCB8fCBkYXRhU291cmNlLm5hbWUsXG4gICAgICAgIHNjaGVtYTogZGF0YVNvdXJjZS5zY2hlbWEgPz8gJ2RibycsXG4gICAgICB9LFxuICAgICAgc2Vzc2lvbkNvbnRleHQ6IHNlc3Npb24sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PHVua25vd24+KHRoaXMuZW5kcG9pbnRzLmV4ZWN1dGVFbmRwb2ludCwgcGF5bG9hZCwgeyBoZWFkZXJzIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gZXh0cmFjdFJvd0FycmF5KHJlc3BvbnNlKSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8ICdSZXBvcnQgZXhlY3V0aW9uIGZhaWxlZCc7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKEFycmF5LmlzQXJyYXkobXNnKSA/IG1zZy5qb2luKCcsICcpIDogbXNnKSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlS2luZChkczogUmVwb3J0RGF0YVNvdXJjZURlZmluaXRpb24pOiAncHJvY2VkdXJlJyB8ICd0YWJsZScge1xuICAgIGlmIChkcy5tZXRob2QgPT09ICdTVE9SRURfUFJPQ0VEVVJFJykgcmV0dXJuICdwcm9jZWR1cmUnO1xuICAgIGlmIChkcy50eXBlID09PSAnc3RvcmVkX3Byb2NlZHVyZScpIHJldHVybiAncHJvY2VkdXJlJztcbiAgICBpZiAoZHMudHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy50eXBlID09PSAndmlldycpIHJldHVybiAndGFibGUnO1xuICAgIC8vIEhldXJpc3RpYzogbmFtZXMgc3RhcnRpbmcgd2l0aCB1c3BfIC8gc3BfIGFyZSBwcm9jZWR1cmVzXG4gICAgY29uc3QgbmFtZSA9IChkcy5lbmRwb2ludCB8fCBkcy5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ3VzcF8nKSB8fCBuYW1lLnN0YXJ0c1dpdGgoJ3NwXycpKSByZXR1cm4gJ3Byb2NlZHVyZSc7XG4gICAgcmV0dXJuICd0YWJsZSc7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Endpoint-based lookup adapter.
3
+ *
4
+ * Reuses the `executeEndpoint` to fetch dropdown option rows.
5
+ * No separate lookup endpoint is needed — we just POST to the
6
+ * same execute endpoint with the table/SP that backs the dropdown.
7
+ */
8
+ import { inject, Injectable } from '@angular/core';
9
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
10
+ import { of, throwError } from 'rxjs';
11
+ import { catchError, finalize, map, shareReplay, tap } from 'rxjs/operators';
12
+ import { ReportLookupAdapter, } from '../contracts/lookup.contract';
13
+ import { ReportSessionContextService } from '../../core/services/report-session-context.service';
14
+ import { extractLookupOptionItem, extractRowArray } from '../../core/utils/data-normalization.util';
15
+ import { BWAYS_REPORT_ENDPOINTS } from './endpoint-tokens';
16
+ import * as i0 from "@angular/core";
17
+ export class EndpointLookupAdapter extends ReportLookupAdapter {
18
+ http = inject(HttpClient);
19
+ endpoints = inject(BWAYS_REPORT_ENDPOINTS);
20
+ sessionService = inject(ReportSessionContextService, { optional: true });
21
+ cache = new Map();
22
+ inFlight = new Map();
23
+ fetchOptions(request) {
24
+ const cacheKey = this.generateCacheKey(request);
25
+ const cached = this.cache.get(cacheKey);
26
+ const now = Date.now();
27
+ if (cached && cached.expiresAt > now) {
28
+ return of(cached.data);
29
+ }
30
+ const running = this.inFlight.get(cacheKey);
31
+ if (running) {
32
+ return running;
33
+ }
34
+ const session = this.sessionService?.sessionContext() ?? {};
35
+ let headers = new HttpHeaders();
36
+ if (session['companyId'] !== undefined && session['companyId'] !== null) {
37
+ headers = headers.set('X-Company-Id', String(session['companyId']));
38
+ }
39
+ if (session['branchId'] !== undefined && session['branchId'] !== null) {
40
+ headers = headers.set('X-Branch-Id', String(session['branchId']));
41
+ }
42
+ const kind = request.sourceType === 'procedure' ? 'procedure' : 'table';
43
+ const targetUrl = this.endpoints.lookupEndpoint || this.endpoints.executeEndpoint;
44
+ const payload = {
45
+ // Lookup contract fields (used by /api/reporting/lookup)
46
+ entityName: request.entityName ?? '',
47
+ sourceType: request.sourceType ?? (kind === 'procedure' ? 'stored_procedure' : 'table'),
48
+ schema: request.schema ?? 'dbo',
49
+ valueField: request.valueField,
50
+ displayField: request.displayField,
51
+ filter: request.filter,
52
+ limit: request.limit ?? 500,
53
+ // Execute simplified contract fields
54
+ kind,
55
+ name: request.entityName ?? '',
56
+ columns: [request.valueField, request.displayField].filter(Boolean),
57
+ top: request.limit ?? 500,
58
+ // Execute rich contract fields (prevents "dataSource should not be empty")
59
+ dataSource: {
60
+ id: request.entityName ?? 'ds-lookup',
61
+ type: kind === 'procedure' ? 'stored_procedure' : 'table',
62
+ name: request.entityName ?? '',
63
+ schema: request.schema ?? 'dbo',
64
+ },
65
+ parameters: request.parameters ?? {},
66
+ sessionContext: session,
67
+ };
68
+ const obs$ = this.http
69
+ .post(targetUrl, payload, { headers })
70
+ .pipe(map((response) => {
71
+ const rawItems = extractRowArray(response);
72
+ return rawItems.map((r) => extractLookupOptionItem(r, request.valueField, request.displayField));
73
+ }), tap((items) => {
74
+ if (items.length > 0) {
75
+ this.cache.set(cacheKey, {
76
+ expiresAt: Date.now() + 600_000,
77
+ data: items,
78
+ });
79
+ }
80
+ }), catchError((err) => {
81
+ const msg = err?.error?.message || err?.message || 'Lookup request failed';
82
+ return throwError(() => new Error(Array.isArray(msg) ? msg.join(', ') : msg));
83
+ }), finalize(() => {
84
+ this.inFlight.delete(cacheKey);
85
+ }), shareReplay({ bufferSize: 1, refCount: true }));
86
+ this.inFlight.set(cacheKey, obs$);
87
+ return obs$;
88
+ }
89
+ generateCacheKey(req) {
90
+ return `${req.sourceType}:${req.entityName}:${req.valueField}:${req.displayField}:${JSON.stringify(req.filter ?? {})}:${JSON.stringify(req.parameters ?? {})}`;
91
+ }
92
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointLookupAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
93
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointLookupAdapter });
94
+ }
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointLookupAdapter, decorators: [{
96
+ type: Injectable
97
+ }] });
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQtbG9va3VwLmFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9kYXRhLWFjY2Vzcy9hZGFwdGVycy9lbmRwb2ludC1sb29rdXAuYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUdMLG1CQUFtQixHQUNwQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFRM0QsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG1CQUFtQjtJQUMzQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFCLFNBQVMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMzQyxjQUFjLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFekUsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQ3RDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFB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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsRUFDRixXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUMvQyxDQUFDO1FBRUosSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEdBQXVCO1FBQzlDLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNqSyxDQUFDO3dHQTdGVSxxQkFBcUI7NEdBQXJCLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFEakMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5kcG9pbnQtYmFzZWQgbG9va3VwIGFkYXB0ZXIuXG4gKlxuICogUmV1c2VzIHRoZSBgZXhlY3V0ZUVuZHBvaW50YCB0byBmZXRjaCBkcm9wZG93biBvcHRpb24gcm93cy5cbiAqIE5vIHNlcGFyYXRlIGxvb2t1cCBlbmRwb2ludCBpcyBuZWVkZWQg4oCUIHdlIGp1c3QgUE9TVCB0byB0aGVcbiAqIHNhbWUgZXhlY3V0ZSBlbmRwb2ludCB3aXRoIHRoZSB0YWJsZS9TUCB0aGF0IGJhY2tzIHRoZSBkcm9wZG93bi5cbiAqL1xuXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCBtYXAsIHNoYXJlUmVwbGF5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBMb29rdXBPcHRpb25JdGVtLFxuICBMb29rdXBRdWVyeVJlcXVlc3QsXG4gIFJlcG9ydExvb2t1cEFkYXB0ZXIsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9sb29rdXAuY29udHJhY3QnO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZXh0cmFjdExvb2t1cE9wdGlvbkl0ZW0sIGV4dHJhY3RSb3dBcnJheSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZGF0YS1ub3JtYWxpemF0aW9uLnV0aWwnO1xuaW1wb3J0IHsgQldBWVNfUkVQT1JUX0VORFBPSU5UUyB9IGZyb20gJy4vZW5kcG9pbnQtdG9rZW5zJztcblxuaW50ZXJmYWNlIENhY2hlRW50cnkge1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgZGF0YTogTG9va3VwT3B0aW9uSXRlbVtdO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRMb29rdXBBZGFwdGVyIGV4dGVuZHMgUmVwb3J0TG9va3VwQWRhcHRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludHMgPSBpbmplY3QoQldBWVNfUkVQT1JUX0VORFBPSU5UUyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVFbnRyeT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPExvb2t1cE9wdGlvbkl0ZW1bXT4+KCk7XG5cbiAgZmV0Y2hPcHRpb25zKHJlcXVlc3Q6IExvb2t1cFF1ZXJ5UmVxdWVzdCk6IE9ic2VydmFibGU8TG9va3VwT3B0aW9uSXRlbVtdPiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkocmVxdWVzdCk7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5jYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC5leHBpcmVzQXQgPiBub3cpIHtcbiAgICAgIHJldHVybiBvZihjYWNoZWQuZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVubmluZyA9IHRoaXMuaW5GbGlnaHQuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAocnVubmluZykge1xuICAgICAgcmV0dXJuIHJ1bm5pbmc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvblNlcnZpY2U/LnNlc3Npb25Db250ZXh0KCkgPz8ge307XG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBpZiAoc2Vzc2lvblsnY29tcGFueUlkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydjb21wYW55SWQnXSAhPT0gbnVsbCkge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdYLUNvbXBhbnktSWQnLCBTdHJpbmcoc2Vzc2lvblsnY29tcGFueUlkJ10pKTtcbiAgICB9XG4gICAgaWYgKHNlc3Npb25bJ2JyYW5jaElkJ10gIT09IHVuZGVmaW5lZCAmJiBzZXNzaW9uWydicmFuY2hJZCddICE9PSBudWxsKSB7XG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ1gtQnJhbmNoLUlkJywgU3RyaW5nKHNlc3Npb25bJ2JyYW5jaElkJ10pKTtcbiAgICB9XG5cbiAgICBjb25zdCBraW5kID0gcmVxdWVzdC5zb3VyY2VUeXBlID09PSAncHJvY2VkdXJlJyA/ICdwcm9jZWR1cmUnIDogJ3RhYmxlJztcbiAgICBjb25zdCB0YXJnZXRVcmwgPSB0aGlzLmVuZHBvaW50cy5sb29rdXBFbmRwb2ludCB8fCB0aGlzLmVuZHBvaW50cy5leGVjdXRlRW5kcG9pbnQ7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIC8vIExvb2t1cCBjb250cmFjdCBmaWVsZHMgKHVzZWQgYnkgL2FwaS9yZXBvcnRpbmcvbG9va3VwKVxuICAgICAgZW50aXR5TmFtZTogcmVxdWVzdC5lbnRpdHlOYW1lID8/ICcnLFxuICAgICAgc291cmNlVHlwZTogcmVxdWVzdC5zb3VyY2VUeXBlID8/IChraW5kID09PSAncHJvY2VkdXJlJyA/ICdzdG9yZWRfcHJvY2VkdXJlJyA6ICd0YWJsZScpLFxuICAgICAgc2NoZW1hOiByZXF1ZXN0LnNjaGVtYSA/PyAnZGJvJyxcbiAgICAgIHZhbHVlRmllbGQ6IHJlcXVlc3QudmFsdWVGaWVsZCxcbiAgICAgIGRpc3BsYXlGaWVsZDogcmVxdWVzdC5kaXNwbGF5RmllbGQsXG4gICAgICBmaWx0ZXI6IHJlcXVlc3QuZmlsdGVyLFxuICAgICAgbGltaXQ6IHJlcXVlc3QubGltaXQgPz8gNTAwLFxuXG4gICAgICAvLyBFeGVjdXRlIHNpbXBsaWZpZWQgY29udHJhY3QgZmllbGRzXG4gICAgICBraW5kLFxuICAgICAgbmFtZTogcmVxdWVzdC5lbnRpdHlOYW1lID8/ICcnLFxuICAgICAgY29sdW1uczogW3JlcXVlc3QudmFsdWVGaWVsZCwgcmVxdWVzdC5kaXNwbGF5RmllbGRdLmZpbHRlcihCb29sZWFuKSxcbiAgICAgIHRvcDogcmVxdWVzdC5saW1pdCA/PyA1MDAsXG5cbiAgICAgIC8vIEV4ZWN1dGUgcmljaCBjb250cmFjdCBmaWVsZHMgKHByZXZlbnRzIFwiZGF0YVNvdXJjZSBzaG91bGQgbm90IGJlIGVtcHR5XCIpXG4gICAgICBkYXRhU291cmNlOiB7XG4gICAgICAgIGlkOiByZXF1ZXN0LmVudGl0eU5hbWUgPz8gJ2RzLWxvb2t1cCcsXG4gICAgICAgIHR5cGU6IGtpbmQgPT09ICdwcm9jZWR1cmUnID8gJ3N0b3JlZF9wcm9jZWR1cmUnIDogJ3RhYmxlJyxcbiAgICAgICAgbmFtZTogcmVxdWVzdC5lbnRpdHlOYW1lID8/ICcnLFxuICAgICAgICBzY2hlbWE6IHJlcXVlc3Quc2NoZW1hID8/ICdkYm8nLFxuICAgICAgfSxcbiAgICAgIHBhcmFtZXRlcnM6IHJlcXVlc3QucGFyYW1ldGVycyA/PyB7fSxcbiAgICAgIHNlc3Npb25Db250ZXh0OiBzZXNzaW9uLFxuICAgIH07XG5cbiAgICBjb25zdCBvYnMkID0gdGhpcy5odHRwXG4gICAgICAucG9zdDx1bmtub3duPih0YXJnZXRVcmwsIHBheWxvYWQsIHsgaGVhZGVycyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IGV4dHJhY3RSb3dBcnJheShyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCgocjogYW55KSA9PlxuICAgICAgICAgICAgZXh0cmFjdExvb2t1cE9wdGlvbkl0ZW0ociwgcmVxdWVzdC52YWx1ZUZpZWxkLCByZXF1ZXN0LmRpc3BsYXlGaWVsZClcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKChpdGVtcykgPT4ge1xuICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChjYWNoZUtleSwge1xuICAgICAgICAgICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyA2MDBfMDAwLFxuICAgICAgICAgICAgICBkYXRhOiBpdGVtcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyPy5tZXNzYWdlIHx8ICdMb29rdXAgcmVxdWVzdCBmYWlsZWQnO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihBcnJheS5pc0FycmF5KG1zZykgPyBtc2cuam9pbignLCAnKSA6IG1zZykpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5GbGlnaHQuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgICAgfSksXG4gICAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSlcbiAgICAgICk7XG5cbiAgICB0aGlzLmluRmxpZ2h0LnNldChjYWNoZUtleSwgb2JzJCk7XG4gICAgcmV0dXJuIG9icyQ7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQ2FjaGVLZXkocmVxOiBMb29rdXBRdWVyeVJlcXVlc3QpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtyZXEuc291cmNlVHlwZX06JHtyZXEuZW50aXR5TmFtZX06JHtyZXEudmFsdWVGaWVsZH06JHtyZXEuZGlzcGxheUZpZWxkfToke0pTT04uc3RyaW5naWZ5KHJlcS5maWx0ZXIgPz8ge30pfToke0pTT04uc3RyaW5naWZ5KHJlcS5wYXJhbWV0ZXJzID8/IHt9KX1gO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Endpoint-based master data adapter.
3
+ *
4
+ * Reuses the `executeEndpoint` to fetch master/lookup data.
5
+ * The master data name is treated as a table name.
6
+ */
7
+ import { inject, Injectable } from '@angular/core';
8
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
9
+ import { of } from 'rxjs';
10
+ import { catchError, map } from 'rxjs/operators';
11
+ import { MasterDataProvider, } from '../contracts/master-data.provider';
12
+ import { ReportSessionContextService } from '../../core/services/report-session-context.service';
13
+ import { extractRowArray } from '../../core/utils/data-normalization.util';
14
+ import { BWAYS_REPORT_ENDPOINTS } from './endpoint-tokens';
15
+ import * as i0 from "@angular/core";
16
+ export class EndpointMasterDataAdapter extends MasterDataProvider {
17
+ http = inject(HttpClient);
18
+ endpoints = inject(BWAYS_REPORT_ENDPOINTS);
19
+ sessionService = inject(ReportSessionContextService, { optional: true });
20
+ getMasterData(masterName, options) {
21
+ const session = this.sessionService?.sessionContext() ?? {};
22
+ let headers = new HttpHeaders();
23
+ if (session['companyId'] !== undefined && session['companyId'] !== null) {
24
+ headers = headers.set('X-Company-Id', String(session['companyId']));
25
+ }
26
+ if (session['branchId'] !== undefined && session['branchId'] !== null) {
27
+ headers = headers.set('X-Branch-Id', String(session['branchId']));
28
+ }
29
+ const payload = {
30
+ kind: 'table',
31
+ name: masterName,
32
+ schema: 'dbo',
33
+ parameters: options?.filter ?? {},
34
+ top: options?.limit ?? 500,
35
+ };
36
+ return this.http
37
+ .post(this.endpoints.executeEndpoint, payload, { headers })
38
+ .pipe(map((response) => {
39
+ const rows = extractRowArray(response);
40
+ return rows.map((r) => {
41
+ // Try to extract value/label from common patterns
42
+ const value = r?.id ?? r?.value ?? r?.code ?? Object.values(r ?? {})[0];
43
+ const label = r?.name ?? r?.label ?? r?.title ?? r?.description ?? String(value ?? '');
44
+ return { value, label, ...r };
45
+ });
46
+ }), catchError((err) => {
47
+ console.warn(`[EndpointMasterDataAdapter] Failed to fetch master data "${masterName}":`, err);
48
+ return of([]);
49
+ }));
50
+ }
51
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointMasterDataAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
52
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointMasterDataAdapter });
53
+ }
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EndpointMasterDataAdapter, decorators: [{
55
+ type: Injectable
56
+ }] });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQtbWFzdGVyZGF0YS5hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZGF0YS1hY2Nlc3MvYWRhcHRlcnMvZW5kcG9pbnQtbWFzdGVyZGF0YS5hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQWMsRUFBRSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUdMLGtCQUFrQixHQUNuQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFHM0QsTUFBTSxPQUFPLHlCQUEwQixTQUFRLGtCQUFrQjtJQUM5QyxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFCLFNBQVMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMzQyxjQUFjLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFMUYsYUFBYSxDQUNYLFVBQWtCLEVBQ2xCLE9BQTJCO1FBRTNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO1FBRTVELElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN4RSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxPQUFnQjtZQUN0QixJQUFJLEVBQUUsVUFBVTtZQUNoQixNQUFNLEVBQUUsS0FBSztZQUNiLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLEVBQUU7WUFDakMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksR0FBRztTQUMzQixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLElBQUksQ0FBVSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQzthQUNuRSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ3pCLGtEQUFrRDtnQkFDbEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxXQUFXLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdkYsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQW9CLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLDREQUE0RCxVQUFVLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5RixPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQzt3R0E1Q1UseUJBQXlCOzRHQUF6Qix5QkFBeUI7OzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVuZHBvaW50LWJhc2VkIG1hc3RlciBkYXRhIGFkYXB0ZXIuXG4gKlxuICogUmV1c2VzIHRoZSBgZXhlY3V0ZUVuZHBvaW50YCB0byBmZXRjaCBtYXN0ZXIvbG9va3VwIGRhdGEuXG4gKiBUaGUgbWFzdGVyIGRhdGEgbmFtZSBpcyB0cmVhdGVkIGFzIGEgdGFibGUgbmFtZS5cbiAqL1xuXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIE1hc3RlckRhdGFJdGVtLFxuICBNYXN0ZXJEYXRhT3B0aW9ucyxcbiAgTWFzdGVyRGF0YVByb3ZpZGVyLFxufSBmcm9tICcuLi9jb250cmFjdHMvbWFzdGVyLWRhdGEucHJvdmlkZXInO1xuaW1wb3J0IHsgUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9yZXBvcnQtc2Vzc2lvbi1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZXh0cmFjdFJvd0FycmF5IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9kYXRhLW5vcm1hbGl6YXRpb24udXRpbCc7XG5pbXBvcnQgeyBCV0FZU19SRVBPUlRfRU5EUE9JTlRTIH0gZnJvbSAnLi9lbmRwb2ludC10b2tlbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRW5kcG9pbnRNYXN0ZXJEYXRhQWRhcHRlciBleHRlbmRzIE1hc3RlckRhdGFQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludHMgPSBpbmplY3QoQldBWVNfUkVQT1JUX0VORFBPSU5UUyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGdldE1hc3RlckRhdGEoXG4gICAgbWFzdGVyTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBNYXN0ZXJEYXRhT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPE1hc3RlckRhdGFJdGVtW10+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9uU2VydmljZT8uc2Vzc2lvbkNvbnRleHQoKSA/PyB7fTtcblxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgaWYgKHNlc3Npb25bJ2NvbXBhbnlJZCddICE9PSB1bmRlZmluZWQgJiYgc2Vzc2lvblsnY29tcGFueUlkJ10gIT09IG51bGwpIHtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnWC1Db21wYW55LUlkJywgU3RyaW5nKHNlc3Npb25bJ2NvbXBhbnlJZCddKSk7XG4gICAgfVxuICAgIGlmIChzZXNzaW9uWydicmFuY2hJZCddICE9PSB1bmRlZmluZWQgJiYgc2Vzc2lvblsnYnJhbmNoSWQnXSAhPT0gbnVsbCkge1xuICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdYLUJyYW5jaC1JZCcsIFN0cmluZyhzZXNzaW9uWydicmFuY2hJZCddKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGtpbmQ6ICd0YWJsZScgYXMgY29uc3QsXG4gICAgICBuYW1lOiBtYXN0ZXJOYW1lLFxuICAgICAgc2NoZW1hOiAnZGJvJyxcbiAgICAgIHBhcmFtZXRlcnM6IG9wdGlvbnM/LmZpbHRlciA/PyB7fSxcbiAgICAgIHRvcDogb3B0aW9ucz8ubGltaXQgPz8gNTAwLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdDx1bmtub3duPih0aGlzLmVuZHBvaW50cy5leGVjdXRlRW5kcG9pbnQsIHBheWxvYWQsIHsgaGVhZGVycyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBjb25zdCByb3dzID0gZXh0cmFjdFJvd0FycmF5KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm4gcm93cy5tYXAoKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIGV4dHJhY3QgdmFsdWUvbGFiZWwgZnJvbSBjb21tb24gcGF0dGVybnNcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcj8uaWQgPz8gcj8udmFsdWUgPz8gcj8uY29kZSA/PyBPYmplY3QudmFsdWVzKHIgPz8ge30pWzBdO1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSByPy5uYW1lID8/IHI/LmxhYmVsID8/IHI/LnRpdGxlID8/IHI/LmRlc2NyaXB0aW9uID8/IFN0cmluZyh2YWx1ZSA/PyAnJyk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZSwgbGFiZWwsIC4uLnIgfSBhcyBNYXN0ZXJEYXRhSXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW0VuZHBvaW50TWFzdGVyRGF0YUFkYXB0ZXJdIEZhaWxlZCB0byBmZXRjaCBtYXN0ZXIgZGF0YSBcIiR7bWFzdGVyTmFtZX1cIjpgLCBlcnIpO1xuICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG59XG4iXX0=