@checkdigit/eslint-athena-plugin 1.0.0-PR.2-dcdf

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 (66) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +17 -0
  3. package/SECURITY.md +13 -0
  4. package/dist-mjs/athena/api-locator.mjs +66 -0
  5. package/dist-mjs/athena/api-matcher.mjs +206 -0
  6. package/dist-mjs/athena/athena.mjs +165 -0
  7. package/dist-mjs/athena/column.mjs +1 -0
  8. package/dist-mjs/athena/context.mjs +21 -0
  9. package/dist-mjs/athena/index.mjs +1 -0
  10. package/dist-mjs/athena/service-table.mjs +45 -0
  11. package/dist-mjs/athena/sql-file.mjs +123 -0
  12. package/dist-mjs/athena/types.mjs +1 -0
  13. package/dist-mjs/athena/validate.mjs +619 -0
  14. package/dist-mjs/athena/visitor.mjs +291 -0
  15. package/dist-mjs/get-documentation-url.mjs +9 -0
  16. package/dist-mjs/index.mjs +56 -0
  17. package/dist-mjs/openapi/deref-schema.mjs +20 -0
  18. package/dist-mjs/openapi/generate-schema.mjs +375 -0
  19. package/dist-mjs/openapi/service-schema-generator.mjs +176 -0
  20. package/dist-mjs/peggy/athena-peggy.mjs +20700 -0
  21. package/dist-mjs/service.mjs +9 -0
  22. package/dist-mjs/sql-parser.mjs +28 -0
  23. package/dist-types/athena/api-locator.d.ts +2 -0
  24. package/dist-types/athena/api-matcher.d.ts +14 -0
  25. package/dist-types/athena/athena.d.ts +5 -0
  26. package/dist-types/athena/column.d.ts +1 -0
  27. package/dist-types/athena/context.d.ts +21 -0
  28. package/dist-types/athena/index.d.ts +8 -0
  29. package/dist-types/athena/service-table.d.ts +8 -0
  30. package/dist-types/athena/sql-file.d.ts +5 -0
  31. package/dist-types/athena/types.d.ts +493 -0
  32. package/dist-types/athena/validate.d.ts +14 -0
  33. package/dist-types/athena/visitor.d.ts +75 -0
  34. package/dist-types/get-documentation-url.d.ts +1 -0
  35. package/dist-types/index.d.ts +5 -0
  36. package/dist-types/openapi/deref-schema.d.ts +1 -0
  37. package/dist-types/openapi/generate-schema.d.ts +33 -0
  38. package/dist-types/openapi/service-schema-generator.d.ts +5 -0
  39. package/dist-types/peggy/athena-peggy.d.ts +13 -0
  40. package/dist-types/service.d.ts +2 -0
  41. package/dist-types/sql-parser.d.ts +25 -0
  42. package/package.json +1 -0
  43. package/src/api/v1/swagger.yml +619 -0
  44. package/src/api/v2/swagger.yml +477 -0
  45. package/src/athena/api-locator.ts +78 -0
  46. package/src/athena/api-matcher.ts +323 -0
  47. package/src/athena/athena.ts +224 -0
  48. package/src/athena/column.ts +4 -0
  49. package/src/athena/context.ts +47 -0
  50. package/src/athena/index.ts +13 -0
  51. package/src/athena/service-table.ts +78 -0
  52. package/src/athena/sql-file.ts +161 -0
  53. package/src/athena/types.ts +568 -0
  54. package/src/athena/validate.ts +902 -0
  55. package/src/athena/visitor.ts +406 -0
  56. package/src/get-documentation-url.ts +7 -0
  57. package/src/index.ts +67 -0
  58. package/src/openapi/deref-schema.ts +20 -0
  59. package/src/openapi/generate-schema.ts +553 -0
  60. package/src/openapi/service-schema-generator.ts +241 -0
  61. package/src/peggy/athena-peggy.ts +22149 -0
  62. package/src/peggy/athena.peggy +2971 -0
  63. package/src/service.ts +11 -0
  64. package/src/services/eslintAthenaPlugin/v1/swagger.schema.deref.json +1931 -0
  65. package/src/services/eslintAthenaPlugin/v2/swagger.schema.deref.json +978 -0
  66. package/src/sql-parser.ts +53 -0
@@ -0,0 +1,291 @@
1
+ // src/athena/visitor.ts
2
+ function hasNodeType(node, type) {
3
+ return typeof node === "object" && node !== null && node.type === type;
4
+ }
5
+ function isUnnestFrom(node) {
6
+ return hasNodeType(node, "unnest");
7
+ }
8
+ function isDual(node) {
9
+ return hasNodeType(node, "dual");
10
+ }
11
+ function isValuesFrom(node) {
12
+ if (typeof node !== "object" || node === null) {
13
+ return false;
14
+ }
15
+ return hasNodeType(node.expr, "values");
16
+ }
17
+ function isTableExpr(node) {
18
+ if (typeof node !== "object" || node === null) {
19
+ return false;
20
+ }
21
+ const expr = node.expr;
22
+ return typeof expr === "object" && expr !== null && "ast" in expr;
23
+ }
24
+ function isRegularFromItem(node) {
25
+ return typeof node === "object" && node !== null && !isUnnestFrom(node) && !isDual(node) && !isTableExpr(node);
26
+ }
27
+ function isJoin(node) {
28
+ return isRegularFromItem(node) && "join" in node;
29
+ }
30
+ function isBaseFrom(node) {
31
+ return isRegularFromItem(node) && !isJoin(node) && "table" in node;
32
+ }
33
+ function hasArrayIndex(node) {
34
+ const typed = node;
35
+ return Array.isArray(typed.array_index) && typed.array_index.length > 0;
36
+ }
37
+ function walkExpr(node, visitor) {
38
+ if (typeof node !== "object" || node === null) {
39
+ return;
40
+ }
41
+ const typed = node;
42
+ switch (typed["type"]) {
43
+ case "select": {
44
+ walk(node, visitor);
45
+ break;
46
+ }
47
+ case "expr": {
48
+ walkExpr(node.expr, visitor);
49
+ break;
50
+ }
51
+ case "binary_expr": {
52
+ const bin = node;
53
+ visitor.visitBinary?.(bin);
54
+ walkExpr(bin.left, visitor);
55
+ walkExpr(bin.right, visitor);
56
+ break;
57
+ }
58
+ case "column_ref": {
59
+ visitor.visitColumnRef?.(node);
60
+ break;
61
+ }
62
+ case "function": {
63
+ const fn = node;
64
+ visitor.visitFunction?.(fn);
65
+ if (fn.args !== void 0) {
66
+ walkExpr(fn.args, visitor);
67
+ }
68
+ break;
69
+ }
70
+ case "aggr_func": {
71
+ const agg = node;
72
+ visitor.visitAggrFunc?.(agg);
73
+ walkExpr(agg.args.expr, visitor);
74
+ break;
75
+ }
76
+ case "cast": {
77
+ const cast = node;
78
+ visitor.visitCast?.(cast);
79
+ walkExpr(cast.expr, visitor);
80
+ break;
81
+ }
82
+ case "case": {
83
+ const caseNode = node;
84
+ visitor.visitCase?.(caseNode);
85
+ for (const arm of caseNode.args) {
86
+ if ("cond" in arm) {
87
+ walkExpr(arm.cond, visitor);
88
+ }
89
+ walkExpr(arm.result, visitor);
90
+ }
91
+ break;
92
+ }
93
+ case "expr_list": {
94
+ const list = node;
95
+ visitor.visitExprList?.(list);
96
+ for (const item of list.value) {
97
+ walkExpr(item, visitor);
98
+ }
99
+ break;
100
+ }
101
+ case "array": {
102
+ walkExpr(node.expr_list, visitor);
103
+ break;
104
+ }
105
+ default: {
106
+ if (typed["type"] === void 0 && "expr" in typed) {
107
+ walkExpr(typed["expr"], visitor);
108
+ } else {
109
+ visitor.visitValue?.(node);
110
+ }
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ function walkFrom(node, visitor) {
116
+ if (isDual(node)) {
117
+ return;
118
+ }
119
+ if (isUnnestFrom(node)) {
120
+ visitor.visitUnnest?.(node);
121
+ return;
122
+ }
123
+ if (isTableExpr(node)) {
124
+ visitor.visitTableExpr?.(node);
125
+ walk(node.expr.ast, visitor);
126
+ return;
127
+ }
128
+ if (isJoin(node)) {
129
+ visitor.visitJoin?.(node);
130
+ if (node.on !== void 0) {
131
+ walkExpr(node.on, visitor);
132
+ }
133
+ return;
134
+ }
135
+ if (isValuesFrom(node)) {
136
+ return;
137
+ }
138
+ visitor.visitBaseFrom?.(node);
139
+ }
140
+ function fromClauseItems(select) {
141
+ if (Array.isArray(select.from)) {
142
+ return select.from;
143
+ }
144
+ if (select.from !== null) {
145
+ return [select.from];
146
+ }
147
+ return [];
148
+ }
149
+ function walk(node, visitor) {
150
+ if (typeof node !== "object" || node === null) {
151
+ return;
152
+ }
153
+ const typed = node;
154
+ if (typed["type"] === "select") {
155
+ const sel = node;
156
+ visitor.visitSelect?.(sel);
157
+ for (const withItem of sel.with ?? []) {
158
+ visitor.visitWith?.(withItem);
159
+ walk(withItem.stmt.ast, visitor);
160
+ }
161
+ for (const fromItem of fromClauseItems(sel)) {
162
+ walkFrom(fromItem, visitor);
163
+ }
164
+ for (const col of sel.columns) {
165
+ walkExpr(col, visitor);
166
+ }
167
+ if (sel.where !== null) {
168
+ walkExpr(sel.where, visitor);
169
+ }
170
+ if (sel._next !== void 0) {
171
+ walk(sel._next, visitor);
172
+ }
173
+ } else {
174
+ walkExpr(node, visitor);
175
+ }
176
+ }
177
+ function containsLambda(expr) {
178
+ let found = false;
179
+ walkExpr(expr, {
180
+ visitBinary(node) {
181
+ if (node.operator === "->") {
182
+ found = true;
183
+ }
184
+ }
185
+ });
186
+ return found;
187
+ }
188
+ function extractColumnRefs(expr) {
189
+ const refs = [];
190
+ walkExpr(expr, {
191
+ visitColumnRef(node) {
192
+ refs.push(node);
193
+ }
194
+ });
195
+ return refs;
196
+ }
197
+ function extractJsonExtractCalls(expr) {
198
+ const calls = [];
199
+ walkExpr(expr, {
200
+ visitFunction(node) {
201
+ const fnName = node.name.name[0]?.value;
202
+ if (fnName !== "json_extract_scalar" && fnName !== "json_extract") {
203
+ return;
204
+ }
205
+ const sourceArg = node.args?.value[0];
206
+ const pathArg = node.args?.value[1];
207
+ if (sourceArg === void 0 || pathArg === void 0) {
208
+ return;
209
+ }
210
+ const sourceRefs = extractColumnRefs(sourceArg);
211
+ if (sourceRefs.length !== 1) {
212
+ return;
213
+ }
214
+ const [ref] = sourceRefs;
215
+ const path = pathArg.value;
216
+ if (ref === void 0 || typeof path !== "string") {
217
+ return;
218
+ }
219
+ calls.push({ ref, path, fnNode: node });
220
+ }
221
+ });
222
+ return calls;
223
+ }
224
+ function extractJsonExtractPath(expr) {
225
+ return extractJsonExtractCalls(expr)[0]?.path;
226
+ }
227
+ function extractBracketAccessorPath(expr) {
228
+ let path;
229
+ walkExpr(expr, {
230
+ visitColumnRef(node) {
231
+ if (path !== void 0 || !hasArrayIndex(node)) {
232
+ return;
233
+ }
234
+ const indexValue = node.array_index[0]?.index.value;
235
+ if (typeof indexValue === "string") {
236
+ path = `$["${indexValue}"]`;
237
+ }
238
+ }
239
+ });
240
+ return path;
241
+ }
242
+ function hasFunctionCalls(expr) {
243
+ let found = false;
244
+ walkExpr(expr, {
245
+ visitFunction() {
246
+ found = true;
247
+ },
248
+ visitAggrFunc() {
249
+ found = true;
250
+ }
251
+ });
252
+ return found;
253
+ }
254
+ function containsCastToType(expr, dataType) {
255
+ let found = false;
256
+ walkExpr(expr, {
257
+ visitCast(node) {
258
+ const target = node.target?.[0];
259
+ if (target?.dataType === dataType) {
260
+ found = true;
261
+ }
262
+ }
263
+ });
264
+ return found;
265
+ }
266
+ function containsCastToArray(expr) {
267
+ return containsCastToType(expr, "ARRAY");
268
+ }
269
+ function containsCastToMap(expr) {
270
+ return containsCastToType(expr, "MAP");
271
+ }
272
+ export {
273
+ containsCastToArray,
274
+ containsCastToMap,
275
+ containsLambda,
276
+ extractBracketAccessorPath,
277
+ extractColumnRefs,
278
+ extractJsonExtractCalls,
279
+ extractJsonExtractPath,
280
+ fromClauseItems,
281
+ hasArrayIndex,
282
+ hasFunctionCalls,
283
+ isBaseFrom,
284
+ isDual,
285
+ isJoin,
286
+ isTableExpr,
287
+ isUnnestFrom,
288
+ isValuesFrom,
289
+ walk
290
+ };
291
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92aXNpdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQW9FQSxTQUFTLFlBQVksTUFBZSxNQUF1QjtBQUN6RCxTQUNFLE9BQU8sU0FBUyxZQUNoQixTQUFTLFFBQ1IsS0FBNEIsU0FBUztBQUUxQztBQUVPLFNBQVMsYUFBYSxNQUFtQztBQUM5RCxTQUFPLFlBQVksTUFBTSxRQUFRO0FBQ25DO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQU8sWUFBWSxNQUFNLE1BQU07QUFDakM7QUFFTyxTQUFTLGFBQWEsTUFBbUM7QUFDOUQsTUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLFlBQWEsS0FBNEIsTUFBTSxRQUFRO0FBQ2hFO0FBRU8sU0FBUyxZQUFZLE1BQWtDO0FBQzVELE1BQUksT0FBTyxTQUFTLFlBQVksU0FBUyxNQUFNO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxPQUFRLEtBQTRCO0FBQzFDLFNBQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFRLFNBQVM7QUFDL0Q7QUFFQSxTQUFTLGtCQUFrQixNQUF3QjtBQUNqRCxTQUNFLE9BQU8sU0FBUyxZQUNoQixTQUFTLFFBQ1QsQ0FBQyxhQUFhLElBQUksS0FDbEIsQ0FBQyxPQUFPLElBQUksS0FDWixDQUFDLFlBQVksSUFBSTtBQUVyQjtBQUVPLFNBQVMsT0FBTyxNQUE2QjtBQUNsRCxTQUFPLGtCQUFrQixJQUFJLEtBQUssVUFBVztBQUMvQztBQUVPLFNBQVMsV0FBVyxNQUFpQztBQUMxRCxTQUNFLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxXQUFZO0FBRTVEO0FBRU8sU0FBUyxjQUFjLE1BQWlEO0FBQzdFLFFBQU0sUUFBUTtBQUNkLFNBQU8sTUFBTSxRQUFRLE1BQU0sV0FBVyxLQUFLLE1BQU0sWUFBWSxTQUFTO0FBQ3hFO0FBT0EsU0FBUyxTQUFTLE1B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
@@ -0,0 +1,9 @@
1
+ // src/get-documentation-url.ts
2
+ import packageJson from "../package.json" with { type: "json" };
3
+ function getDocumentationUrl(ruleId) {
4
+ return `${packageJson.repository.url}/blob/v${packageJson.version}/docs/rules/${ruleId}.md`;
5
+ }
6
+ export {
7
+ getDocumentationUrl as default
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2dldC1kb2N1bWVudGF0aW9uLXVybC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFFQSxPQUFPLGlCQUFpQixrQkFBa0IsS0FBSyxFQUFFLE1BQU0sT0FBTztBQUUvQyxTQUFSLG9CQUFxQyxRQUF3QjtBQUNsRSxTQUFPLEdBQUcsWUFBWSxXQUFXLEdBQUcsVUFBVSxZQUFZLE9BQU8sZUFBZSxNQUFNO0FBQ3hGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,56 @@
1
+ // src/index.ts
2
+ import athena, { ruleId as athenaRuleId } from "./athena/athena.mjs";
3
+ import sqlFile, { ruleId as sqlFileRuleId } from "./athena/sql-file.mjs";
4
+ import { parseForESLint } from "./sql-parser.mjs";
5
+ var rules = {
6
+ [athenaRuleId]: athena,
7
+ [sqlFileRuleId]: sqlFile
8
+ };
9
+ var plugin = {
10
+ rules
11
+ };
12
+ var configs = {
13
+ all: [
14
+ {
15
+ files: ["**/*.ts"],
16
+ plugins: {
17
+ "@checkdigit": plugin
18
+ },
19
+ rules: {
20
+ [`@checkdigit/${athenaRuleId}`]: "error"
21
+ }
22
+ },
23
+ {
24
+ files: ["**/*.sql"],
25
+ plugins: { "@checkdigit": plugin },
26
+ languageOptions: { parser: { parseForESLint } },
27
+ rules: { [`@checkdigit/${sqlFileRuleId}`]: "error" }
28
+ }
29
+ ],
30
+ recommended: [
31
+ {
32
+ files: ["**/*.ts"],
33
+ plugins: {
34
+ "@checkdigit": plugin
35
+ },
36
+ rules: {
37
+ [`@checkdigit/${athenaRuleId}`]: "off"
38
+ }
39
+ },
40
+ {
41
+ files: ["**/*.sql"],
42
+ plugins: { "@checkdigit": plugin },
43
+ languageOptions: { parser: { parseForESLint } },
44
+ rules: { [`@checkdigit/${sqlFileRuleId}`]: "off" }
45
+ }
46
+ ]
47
+ };
48
+ var defaultToExport = {
49
+ ...plugin,
50
+ configs
51
+ };
52
+ var index_default = defaultToExport;
53
+ export {
54
+ index_default as default
55
+ };
56
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQVVBLE9BQU8sVUFBVSxVQUFVLG9CQUFvQjtBQUMvQyxPQUFPLFdBQVcsVUFBVSxxQkFBcUI7QUFDakQsU0FBUyxzQkFBc0I7QUFFL0IsSUFBTSxRQUFzRDtBQUFBLEVBQzFELENBQUMsWUFBWSxHQUFHO0FBQUEsRUFDaEIsQ0FBQyxhQUFhLEdBQUc7QUFDbkI7QUFFQSxJQUFNLFNBQXFDO0FBQUEsRUFDekM7QUFDRjtBQUVBLElBQU0sVUFBd0Q7QUFBQSxFQUM1RCxLQUFLO0FBQUEsSUFDSDtBQUFBLE1BQ0UsT0FBTyxDQUFDLFNBQVM7QUFBQSxNQUNqQixTQUFTO0FBQUEsUUFDUCxlQUFlO0FBQUEsTUFDakI7QUFBQSxNQUNBLE9BQU87QUFBQSxRQUNMLENBQUMsZUFBZSxZQUFZLEVBQUUsR0FBRztBQUFBLE1BQ25DO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLE9BQU8sQ0FBQyxVQUFVO0FBQUEsTUFDbEIsU0FBUyxFQUFFLGVBQWUsT0FBTztBQUFBLE1BQ2pDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7QUFBQSxNQUM5QyxPQUFPLEVBQUUsQ0FBQyxlQUFlLGFBQWEsRUFBRSxHQUFHLFFBQVE7QUFBQSxJQUNyRDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGFBQWE7QUFBQSxJQUNYO0FBQUEsTUFDRSxPQUFPLENBQUMsU0FBUztBQUFBLE1BQ2pCLFNBQVM7QUFBQSxRQUNQLGVBQWU7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQ0wsQ0FBQyxlQUFlLFlBQVksRUFBRSxHQUFHO0FBQUEsTUFDbkM7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsT0FBTyxDQUFDLFVBQVU7QUFBQSxNQUNsQixTQUFTLEVBQUUsZUFBZSxPQUFPO0FBQUEsTUFDakMsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTtBQUFBLE1BQzlDLE9BQU8sRUFBRSxDQUFDLGVBQWUsYUFBYSxFQUFFLEdBQUcsTUFBTTtBQUFBLElBQ25EO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTSxrQkFFRjtBQUFBLEVBQ0YsR0FBRztBQUFBLEVBQ0g7QUFDRjtBQUNBLElBQU8sZ0JBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,20 @@
1
+ // src/openapi/deref-schema.ts
2
+ import { promises as fs } from "node:fs";
3
+ import { dereference } from "@apidevtools/json-schema-ref-parser";
4
+ async function derefSchema(schemaFileName) {
5
+ const schemaFile = await fs.readFile(`${schemaFileName}.json`, "utf-8");
6
+ const adjustedSchemaFileForDeref = schemaFile.replace(
7
+ /"\$ref": ".*\/definitions\//gu,
8
+ '"$ref": "#/definitions/'
9
+ );
10
+ const json = JSON.parse(adjustedSchemaFileForDeref);
11
+ const deref = await dereference(json);
12
+ await fs.writeFile(
13
+ `${schemaFileName}.deref.json`,
14
+ JSON.stringify(deref, void 0, 2)
15
+ );
16
+ }
17
+ export {
18
+ derefSchema
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZW5hcGkvZGVyZWYtc2NoZW1hLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsWUFBWSxVQUFVO0FBRS9CLFNBQVMsbUJBQW1CO0FBRTVCLGVBQXNCLFlBQVksZ0JBQXVDO0FBQ3ZFLFFBQU0sYUFBYSxNQUFNLEdBQUcsU0FBUyxHQUFHLGNBQWMsU0FBUyxPQUFPO0FBQ3RFLFFBQU0sNkJBQTZCLFdBQVc7QUFBQSxJQUM1QztBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxPQUFPLEtBQUssTUFBTSwwQkFBMEI7QUFDbEQsUUFBTSxRQUFRLE1BQU0sWUFBWSxJQUFJO0FBQ3BDLFFBQU0sR0FBRztBQUFBLElBQ1AsR0FBRyxjQUFjO0FBQUEsSUFDakIsS0FBSyxVQUFVLE9BQU8sUUFBVyxDQUFDO0FBQUEsRUFDcEM7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K