@decohere/create 0.0.1-dev.48 → 0.0.1-dev.49

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 (124) hide show
  1. package/commonjs/src/cli.js +3 -3
  2. package/commonjs/src/resolve-launch.js +53 -0
  3. package/commonjs/src/runner.js +5 -45
  4. package/commonjs/src/version.js +1 -1
  5. package/es6/src/cli.js +3 -3
  6. package/es6/src/resolve-launch.js +46 -0
  7. package/es6/src/runner.js +8 -57
  8. package/es6/src/version.js +3 -3
  9. package/pack-builder-tgz.mjs +1 -1
  10. package/package.json +4 -11
  11. package/types/src/resolve-launch.d.ts +10 -0
  12. package/types/src/runner.d.ts +3 -13
  13. package/types/src/version.d.ts +0 -2
  14. package/commonjs/src/domain/prompt.js +0 -64
  15. package/commonjs/src/models/compose.model.js +0 -138
  16. package/commonjs/src/models/config-yaml.model.js +0 -88
  17. package/commonjs/src/models/const.js +0 -31
  18. package/commonjs/src/models/dev-container.model.js +0 -100
  19. package/commonjs/src/models/docker-image.model.js +0 -221
  20. package/commonjs/src/models/env-file.model.js +0 -47
  21. package/commonjs/src/models/gitignore.model.js +0 -31
  22. package/commonjs/src/models/launch-json.model.js +0 -74
  23. package/commonjs/src/models/package-json.model.js +0 -133
  24. package/commonjs/src/models/project.model.js +0 -134
  25. package/commonjs/src/models/source-file.js +0 -6
  26. package/commonjs/src/models/tsconfig.model.js +0 -34
  27. package/commonjs/src/models/vscode-settings.model.js +0 -31
  28. package/commonjs/src/program.js +0 -135
  29. package/commonjs/src/resolve-target-dir.js +0 -19
  30. package/commonjs/src/services/scaffold.service.js +0 -62
  31. package/commonjs/src/webapi/api-name.js +0 -95
  32. package/commonjs/src/webapi/const.js +0 -50
  33. package/commonjs/src/webapi/create-api.js +0 -285
  34. package/commonjs/src/webapi/features/auth.feature.js +0 -463
  35. package/commonjs/src/webapi/features/auth0-cli.js +0 -406
  36. package/commonjs/src/webapi/features/biome-format.js +0 -49
  37. package/commonjs/src/webapi/features/database.feature.js +0 -273
  38. package/commonjs/src/webapi/features/finalize.feature.js +0 -91
  39. package/commonjs/src/webapi/features/postman.feature.js +0 -319
  40. package/commonjs/src/webapi/models/api-package-json.model.js +0 -63
  41. package/commonjs/src/webapi/models/auth-config.model.js +0 -26
  42. package/commonjs/src/webapi/models/controller-source-file.model.js +0 -188
  43. package/commonjs/src/webapi/models/github-ci.model.js +0 -193
  44. package/commonjs/src/webapi/models/main-source-file.model.js +0 -165
  45. package/commonjs/src/webapi/models/production-dockerfile.model.js +0 -138
  46. package/commonjs/src/webapi/models/sample-files.model.js +0 -60
  47. package/commonjs/src/webapi/models/webapi-image.model.js +0 -22
  48. package/commonjs/src/webapi/postman/hello-openapi.js +0 -175
  49. package/commonjs/src/webapi/postman/local-view.js +0 -184
  50. package/commonjs/src/webapi/postman/openapi-to-postman.js +0 -202
  51. package/es6/src/domain/prompt.js +0 -43
  52. package/es6/src/models/compose.model.js +0 -132
  53. package/es6/src/models/config-yaml.model.js +0 -76
  54. package/es6/src/models/const.js +0 -21
  55. package/es6/src/models/dev-container.model.js +0 -90
  56. package/es6/src/models/docker-image.model.js +0 -185
  57. package/es6/src/models/env-file.model.js +0 -43
  58. package/es6/src/models/gitignore.model.js +0 -21
  59. package/es6/src/models/launch-json.model.js +0 -64
  60. package/es6/src/models/package-json.model.js +0 -129
  61. package/es6/src/models/project.model.js +0 -119
  62. package/es6/src/models/source-file.js +0 -3
  63. package/es6/src/models/tsconfig.model.js +0 -24
  64. package/es6/src/models/vscode-settings.model.js +0 -21
  65. package/es6/src/program.js +0 -76
  66. package/es6/src/resolve-target-dir.js +0 -9
  67. package/es6/src/services/scaffold.service.js +0 -52
  68. package/es6/src/webapi/api-name.js +0 -59
  69. package/es6/src/webapi/const.js +0 -20
  70. package/es6/src/webapi/create-api.js +0 -265
  71. package/es6/src/webapi/features/auth.feature.js +0 -412
  72. package/es6/src/webapi/features/auth0-cli.js +0 -348
  73. package/es6/src/webapi/features/biome-format.js +0 -42
  74. package/es6/src/webapi/features/database.feature.js +0 -263
  75. package/es6/src/webapi/features/finalize.feature.js +0 -81
  76. package/es6/src/webapi/features/postman.feature.js +0 -253
  77. package/es6/src/webapi/models/api-package-json.model.js +0 -58
  78. package/es6/src/webapi/models/auth-config.model.js +0 -22
  79. package/es6/src/webapi/models/controller-source-file.model.js +0 -179
  80. package/es6/src/webapi/models/github-ci.model.js +0 -186
  81. package/es6/src/webapi/models/main-source-file.model.js +0 -161
  82. package/es6/src/webapi/models/production-dockerfile.model.js +0 -126
  83. package/es6/src/webapi/models/sample-files.model.js +0 -42
  84. package/es6/src/webapi/models/webapi-image.model.js +0 -12
  85. package/es6/src/webapi/postman/hello-openapi.js +0 -168
  86. package/es6/src/webapi/postman/local-view.js +0 -169
  87. package/es6/src/webapi/postman/openapi-to-postman.js +0 -179
  88. package/types/src/domain/prompt.d.ts +0 -4
  89. package/types/src/models/compose.model.d.ts +0 -59
  90. package/types/src/models/config-yaml.model.d.ts +0 -27
  91. package/types/src/models/const.d.ts +0 -19
  92. package/types/src/models/dev-container.model.d.ts +0 -33
  93. package/types/src/models/docker-image.model.d.ts +0 -56
  94. package/types/src/models/env-file.model.d.ts +0 -15
  95. package/types/src/models/gitignore.model.d.ts +0 -6
  96. package/types/src/models/launch-json.model.d.ts +0 -7
  97. package/types/src/models/package-json.model.d.ts +0 -32
  98. package/types/src/models/project.model.d.ts +0 -60
  99. package/types/src/models/source-file.d.ts +0 -11
  100. package/types/src/models/tsconfig.model.d.ts +0 -5
  101. package/types/src/models/vscode-settings.model.d.ts +0 -7
  102. package/types/src/program.d.ts +0 -3
  103. package/types/src/resolve-target-dir.d.ts +0 -5
  104. package/types/src/services/scaffold.service.d.ts +0 -22
  105. package/types/src/webapi/api-name.d.ts +0 -14
  106. package/types/src/webapi/const.d.ts +0 -17
  107. package/types/src/webapi/create-api.d.ts +0 -15
  108. package/types/src/webapi/features/auth.feature.d.ts +0 -10
  109. package/types/src/webapi/features/auth0-cli.d.ts +0 -72
  110. package/types/src/webapi/features/biome-format.d.ts +0 -5
  111. package/types/src/webapi/features/database.feature.d.ts +0 -5
  112. package/types/src/webapi/features/finalize.feature.d.ts +0 -2
  113. package/types/src/webapi/features/postman.feature.d.ts +0 -16
  114. package/types/src/webapi/models/api-package-json.model.d.ts +0 -18
  115. package/types/src/webapi/models/auth-config.model.d.ts +0 -26
  116. package/types/src/webapi/models/controller-source-file.model.d.ts +0 -45
  117. package/types/src/webapi/models/github-ci.model.d.ts +0 -9
  118. package/types/src/webapi/models/main-source-file.model.d.ts +0 -54
  119. package/types/src/webapi/models/production-dockerfile.model.d.ts +0 -20
  120. package/types/src/webapi/models/sample-files.model.d.ts +0 -7
  121. package/types/src/webapi/models/webapi-image.model.d.ts +0 -5
  122. package/types/src/webapi/postman/hello-openapi.d.ts +0 -19
  123. package/types/src/webapi/postman/local-view.d.ts +0 -17
  124. package/types/src/webapi/postman/openapi-to-postman.d.ts +0 -62
@@ -1,188 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: Object.getOwnPropertyDescriptor(all, name).get
9
- });
10
- }
11
- _export(exports, {
12
- get ControllerMethod () {
13
- return ControllerMethod;
14
- },
15
- get ControllerSourceFile () {
16
- return ControllerSourceFile;
17
- }
18
- });
19
- const _const = require("../../models/const.js");
20
- /** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
21
- _values = [];
22
- _types = [];
23
- add(name, typeOnly = false) {
24
- if (typeOnly) {
25
- // Value import already present — value wins, skip
26
- if (!this._values.includes(name) && !this._types.includes(name)) {
27
- this._types.push(name);
28
- }
29
- } else {
30
- // Promote: remove from types if it was previously type-only
31
- const typeIdx = this._types.indexOf(name);
32
- if (typeIdx !== -1) this._types.splice(typeIdx, 1);
33
- if (!this._values.includes(name)) this._values.push(name);
34
- }
35
- return this;
36
- }
37
- render(from) {
38
- const values = [
39
- ...this._values
40
- ].sort();
41
- const types = [
42
- ...this._types
43
- ].sort().map((n)=>`type ${n}`);
44
- return `import { ${[
45
- ...values,
46
- ...types
47
- ].join(", ")} } from "${from}";`;
48
- }
49
- }
50
- class ControllerMethod {
51
- name;
52
- _httpDecorator;
53
- _params;
54
- _extraDecorators = [];
55
- _body;
56
- _isAsync;
57
- constructor(name, _httpDecorator, _params, isAsync, body){
58
- this.name = name;
59
- this._httpDecorator = _httpDecorator;
60
- this._params = _params;
61
- this._isAsync = isAsync;
62
- this._body = body;
63
- }
64
- addDecorator(decorator) {
65
- this._extraDecorators.push(decorator);
66
- return this;
67
- }
68
- /** Replace the method body lines (used by features that extend generated behaviour). */ setBody(body) {
69
- this._body = body;
70
- return this;
71
- }
72
- setAsync(isAsync = true) {
73
- this._isAsync = isAsync;
74
- return this;
75
- }
76
- render() {
77
- const lines = [];
78
- for (const d of this._extraDecorators){
79
- lines.push(`\t${d}`);
80
- }
81
- lines.push(`\t${this._httpDecorator}`);
82
- const asyncKw = this._isAsync ? "async " : "";
83
- lines.push(`\tpublic ${asyncKw}${this.name}(${this._params}) {`);
84
- for (const line of this._body){
85
- lines.push(`\t\t${line}`);
86
- }
87
- lines.push("\t}");
88
- return lines;
89
- }
90
- }
91
- class ControllerSourceFile {
92
- key = _const.WELL_KNOWN_FILES.CONTROLLER_TS;
93
- _cortexImports = new ImportGroup().add("Controller").add("Delete").add("Field").add("Get").add("Param").add("Post").add("Put").add("Query");
94
- _extraImportGroups = new Map();
95
- _classDecorators = [];
96
- _ctorParams = [
97
- "private readonly sample: SampleService"
98
- ];
99
- _methods = new Map([
100
- [
101
- "getAll",
102
- new ControllerMethod("getAll", "@Get()", '@Query("filter") filter: string', true, [
103
- "const greeting = await this.sample.getGreeting();",
104
- "return { filter, message: greeting };"
105
- ])
106
- ],
107
- [
108
- "getOne",
109
- new ControllerMethod("getOne", '@Get("/:id")', '@Param("id") id: string', false, // biome-ignore lint/suspicious/noTemplateCurlyInString: template literal in generated code
110
- [
111
- "return { id, message: `Hello ${id}!` };"
112
- ])
113
- ],
114
- [
115
- "create",
116
- new ControllerMethod("create", "@Post()", "body: HelloBody", false, [
117
- "return { message: body.message };"
118
- ])
119
- ],
120
- [
121
- "update",
122
- new ControllerMethod("update", '@Put("/:id")', '@Param("id") id: string, body: HelloBody', false, [
123
- "return { id, message: body.message };"
124
- ])
125
- ],
126
- [
127
- "remove",
128
- new ControllerMethod("remove", '@Delete("/:id")', '@Param("id") id: string', false, [
129
- "return { id, deleted: true };"
130
- ])
131
- ]
132
- ]);
133
- /** Retrieve a method by name to mutate its decorators. */ getMethod(name) {
134
- const m = this._methods.get(name);
135
- if (m == null) throw new Error(`No method '${name}' on ControllerSourceFile`);
136
- return m;
137
- }
138
- /** Add a class-level decorator (e.g. `@Authorize`). */ addDecorator(decorator) {
139
- this._classDecorators.push(decorator);
140
- return this;
141
- }
142
- /** Add a named import from `@decohere/cortex`. */ addCortexImport(name, typeOnly = false) {
143
- this._cortexImports.add(name, typeOnly);
144
- return this;
145
- }
146
- /** Add a named import from any other module. */ addImport(name, from, typeOnly = false) {
147
- const group = this._extraImportGroups.get(from) ?? new ImportGroup();
148
- group.add(name, typeOnly);
149
- this._extraImportGroups.set(from, group);
150
- return this;
151
- }
152
- /** Add a constructor parameter (e.g. an injected dependency). */ addConstructorParam(param) {
153
- this._ctorParams.push(param);
154
- return this;
155
- }
156
- files() {
157
- const lines = [
158
- this._cortexImports.render("@decohere/cortex"),
159
- 'import { SampleService } from "../services/sample.service.js";'
160
- ];
161
- for (const [from, group] of this._extraImportGroups){
162
- lines.push(group.render(from));
163
- }
164
- lines.push("", "class HelloBody {", '\t@Field("body", "message")', "\tpublic message!: string;", "}", "");
165
- for (const d of this._classDecorators){
166
- lines.push(d);
167
- }
168
- lines.push('@Controller({ prefix: "/hello" })', "export class HelloController {", "");
169
- lines.push("\tpublic constructor(");
170
- for (const p of this._ctorParams){
171
- lines.push(`\t\t${p},`);
172
- }
173
- lines.push("\t) {}");
174
- lines.push("");
175
- for (const method of this._methods.values()){
176
- lines.push(...method.render(), "");
177
- }
178
- lines.push("}", "");
179
- return [
180
- {
181
- filePath: "src/controllers/hello.controller.ts",
182
- content: lines.join("\n")
183
- }
184
- ];
185
- }
186
- }
187
-
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9jb250cm9sbGVyLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKiBUcmFja3MgbmFtZWQgaW1wb3J0cyBmcm9tIGEgc2luZ2xlIG1vZHVsZSBwYXRoLCBzcGxpdCBpbnRvIHZhbHVlcyBhbmQgdHlwZXMuICovXG5jbGFzcyBJbXBvcnRHcm91cCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfdHlwZXM6IHN0cmluZ1tdID0gW107XG5cblx0cHVibGljIGFkZChuYW1lOiBzdHJpbmcsIHR5cGVPbmx5ID0gZmFsc2UpOiB0aGlzIHtcblx0XHRpZiAodHlwZU9ubHkpIHtcblx0XHRcdC8vIFZhbHVlIGltcG9ydCBhbHJlYWR5IHByZXNlbnQg4oCUIHZhbHVlIHdpbnMsIHNraXBcblx0XHRcdGlmICghdGhpcy5fdmFsdWVzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLl90eXBlcy5pbmNsdWRlcyhuYW1lKSkge1xuXHRcdFx0XHR0aGlzLl90eXBlcy5wdXNoKG5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBQcm9tb3RlOiByZW1vdmUgZnJvbSB0eXBlcyBpZiBpdCB3YXMgcHJldmlvdXNseSB0eXBlLW9ubHlcblx0XHRcdGNvbnN0IHR5cGVJZHggPSB0aGlzLl90eXBlcy5pbmRleE9mKG5hbWUpO1xuXHRcdFx0aWYgKHR5cGVJZHggIT09IC0xKSB0aGlzLl90eXBlcy5zcGxpY2UodHlwZUlkeCwgMSk7XG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSkgdGhpcy5fdmFsdWVzLnB1c2gobmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHJlbmRlcihmcm9tOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlcyA9IFsuLi50aGlzLl92YWx1ZXNdLnNvcnQoKTtcblx0XHRjb25zdCB0eXBlcyA9IFsuLi50aGlzLl90eXBlc10uc29ydCgpLm1hcCgobikgPT4gYHR5cGUgJHtufWApO1xuXHRcdHJldHVybiBgaW1wb3J0IHsgJHtbLi4udmFsdWVzLCAuLi50eXBlc10uam9pbihcIiwgXCIpfSB9IGZyb20gXCIke2Zyb219XCI7YDtcblx0fVxufVxuXG4vKipcbiAqIEEgY29udHJvbGxlciBtZXRob2QuIEZlYXR1cmVzIGNhbGwgYGFkZERlY29yYXRvcigpYCB0byBwcmVwZW5kIGRlY29yYXRvcnNcbiAqIGJlZm9yZSB0aGUgSFRUUCB2ZXJiIGRlY29yYXRvciAoZS5nLiBgQEFsbG93QW5vbnltb3VzYCBiZWZvcmUgYEBHZXQoKWApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbGxlck1ldGhvZCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2V4dHJhRGVjb3JhdG9yczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBfYm9keTogc3RyaW5nW107XG5cdHByaXZhdGUgX2lzQXN5bmM6IGJvb2xlYW47XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfaHR0cERlY29yYXRvcjogc3RyaW5nLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgX3BhcmFtczogc3RyaW5nLFxuXHRcdGlzQXN5bmM6IGJvb2xlYW4sXG5cdFx0Ym9keTogc3RyaW5nW10sXG5cdCkge1xuXHRcdHRoaXMuX2lzQXN5bmMgPSBpc0FzeW5jO1xuXHRcdHRoaXMuX2JvZHkgPSBib2R5O1xuXHR9XG5cblx0cHVibGljIGFkZERlY29yYXRvcihkZWNvcmF0b3I6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2V4dHJhRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogUmVwbGFjZSB0aGUgbWV0aG9kIGJvZHkgbGluZXMgKHVzZWQgYnkgZmVhdHVyZXMgdGhhdCBleHRlbmQgZ2VuZXJhdGVkIGJlaGF2aW91cikuICovXG5cdHB1YmxpYyBzZXRCb2R5KGJvZHk6IHN0cmluZ1tdKTogdGhpcyB7XG5cdFx0dGhpcy5fYm9keSA9IGJvZHk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0QXN5bmMoaXNBc3luYyA9IHRydWUpOiB0aGlzIHtcblx0XHR0aGlzLl9pc0FzeW5jID0gaXNBc3luYztcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZCBvZiB0aGlzLl9leHRyYURlY29yYXRvcnMpIHtcblx0XHRcdGxpbmVzLnB1c2goYFxcdCR7ZH1gKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChgXFx0JHt0aGlzLl9odHRwRGVjb3JhdG9yfWApO1xuXHRcdGNvbnN0IGFzeW5jS3cgPSB0aGlzLl9pc0FzeW5jID8gXCJhc3luYyBcIiA6IFwiXCI7XG5cdFx0bGluZXMucHVzaChgXFx0cHVibGljICR7YXN5bmNLd30ke3RoaXMubmFtZX0oJHt0aGlzLl9wYXJhbXN9KSB7YCk7XG5cdFx0Zm9yIChjb25zdCBsaW5lIG9mIHRoaXMuX2JvZHkpIHtcblx0XHRcdGxpbmVzLnB1c2goYFxcdFxcdCR7bGluZX1gKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChcIlxcdH1cIik7XG5cdFx0cmV0dXJuIGxpbmVzO1xuXHR9XG59XG5cbi8qKlxuICogTW9kZWwgZm9yIGBwcm9qZWN0cy9hcGkvc3JjL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIudHNgLlxuICpcbiAqIFByZS1pbml0aWFsaXNlZCB3aXRoIGFsbCByb3V0ZXMgYW5kIHRoZWlyIEhUVFAgZGVjb3JhdG9ycy4gRmVhdHVyZXMgbXV0YXRlXG4gKiB0aGUgbW9kZWwgdmlhIGBnZXRNZXRob2QobmFtZSkuYWRkRGVjb3JhdG9yKC4uLilgLCBgYWRkRGVjb3JhdG9yKC4uLilgIChjbGFzc1xuICogbGV2ZWwpLCBgYWRkQ29ydGV4SW1wb3J0KC4uLilgLCBgYWRkSW1wb3J0KC4uLilgLCBhbmQgYGFkZENvbnN0cnVjdG9yUGFyYW0oLi4uKWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sbGVyU291cmNlRmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5DT05UUk9MTEVSX1RTO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2NvcnRleEltcG9ydHMgPSBuZXcgSW1wb3J0R3JvdXAoKVxuXHRcdC5hZGQoXCJDb250cm9sbGVyXCIpXG5cdFx0LmFkZChcIkRlbGV0ZVwiKVxuXHRcdC5hZGQoXCJGaWVsZFwiKVxuXHRcdC5hZGQoXCJHZXRcIilcblx0XHQuYWRkKFwiUGFyYW1cIilcblx0XHQuYWRkKFwiUG9zdFwiKVxuXHRcdC5hZGQoXCJQdXRcIilcblx0XHQuYWRkKFwiUXVlcnlcIik7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfZXh0cmFJbXBvcnRHcm91cHMgPSBuZXcgTWFwPHN0cmluZywgSW1wb3J0R3JvdXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzRGVjb3JhdG9yczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfY3RvclBhcmFtczogc3RyaW5nW10gPSBbXCJwcml2YXRlIHJlYWRvbmx5IHNhbXBsZTogU2FtcGxlU2VydmljZVwiXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9tZXRob2RzID0gbmV3IE1hcDxzdHJpbmcsIENvbnRyb2xsZXJNZXRob2Q+KFtcblx0XHRbXG5cdFx0XHRcImdldEFsbFwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXCJnZXRBbGxcIiwgXCJAR2V0KClcIiwgJ0BRdWVyeShcImZpbHRlclwiKSBmaWx0ZXI6IHN0cmluZycsIHRydWUsIFtcblx0XHRcdFx0XCJjb25zdCBncmVldGluZyA9IGF3YWl0IHRoaXMuc2FtcGxlLmdldEdyZWV0aW5nKCk7XCIsXG5cdFx0XHRcdFwicmV0dXJuIHsgZmlsdGVyLCBtZXNzYWdlOiBncmVldGluZyB9O1wiLFxuXHRcdFx0XSksXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRcImdldE9uZVwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXG5cdFx0XHRcdFwiZ2V0T25lXCIsXG5cdFx0XHRcdCdAR2V0KFwiLzppZFwiKScsXG5cdFx0XHRcdCdAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nJyxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IHRlbXBsYXRlIGxpdGVyYWwgaW4gZ2VuZXJhdGVkIGNvZGVcblx0XHRcdFx0W1wicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGBIZWxsbyAke2lkfSFgIH07XCJdLFxuXHRcdFx0KSxcblx0XHRdLFxuXHRcdFtcblx0XHRcdFwiY3JlYXRlXCIsXG5cdFx0XHRuZXcgQ29udHJvbGxlck1ldGhvZChcImNyZWF0ZVwiLCBcIkBQb3N0KClcIiwgXCJib2R5OiBIZWxsb0JvZHlcIiwgZmFsc2UsIFtcblx0XHRcdFx0XCJyZXR1cm4geyBtZXNzYWdlOiBib2R5Lm1lc3NhZ2UgfTtcIixcblx0XHRcdF0pLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0XCJ1cGRhdGVcIixcblx0XHRcdG5ldyBDb250cm9sbGVyTWV0aG9kKFxuXHRcdFx0XHRcInVwZGF0ZVwiLFxuXHRcdFx0XHQnQFB1dChcIi86aWRcIiknLFxuXHRcdFx0XHQnQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZywgYm9keTogSGVsbG9Cb2R5Jyxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFtcInJldHVybiB7IGlkLCBtZXNzYWdlOiBib2R5Lm1lc3NhZ2UgfTtcIl0sXG5cdFx0XHQpLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0XCJyZW1vdmVcIixcblx0XHRcdG5ldyBDb250cm9sbGVyTWV0aG9kKFwicmVtb3ZlXCIsICdARGVsZXRlKFwiLzppZFwiKScsICdAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nJywgZmFsc2UsIFtcblx0XHRcdFx0XCJyZXR1cm4geyBpZCwgZGVsZXRlZDogdHJ1ZSB9O1wiLFxuXHRcdFx0XSksXG5cdFx0XSxcblx0XSk7XG5cblx0LyoqIFJldHJpZXZlIGEgbWV0aG9kIGJ5IG5hbWUgdG8gbXV0YXRlIGl0cyBkZWNvcmF0b3JzLiAqL1xuXHRwdWJsaWMgZ2V0TWV0aG9kKG5hbWU6IHN0cmluZyk6IENvbnRyb2xsZXJNZXRob2Qge1xuXHRcdGNvbnN0IG0gPSB0aGlzLl9tZXRob2RzLmdldChuYW1lKTtcblx0XHRpZiAobSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGhvZCAnJHtuYW1lfScgb24gQ29udHJvbGxlclNvdXJjZUZpbGVgKTtcblx0XHRyZXR1cm4gbTtcblx0fVxuXG5cdC8qKiBBZGQgYSBjbGFzcy1sZXZlbCBkZWNvcmF0b3IgKGUuZy4gYEBBdXRob3JpemVgKS4gKi9cblx0cHVibGljIGFkZERlY29yYXRvcihkZWNvcmF0b3I6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkIGEgbmFtZWQgaW1wb3J0IGZyb20gYEBkZWNvaGVyZS9jb3J0ZXhgLiAqL1xuXHRwdWJsaWMgYWRkQ29ydGV4SW1wb3J0KG5hbWU6IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdHRoaXMuX2NvcnRleEltcG9ydHMuYWRkKG5hbWUsIHR5cGVPbmx5KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGQgYSBuYW1lZCBpbXBvcnQgZnJvbSBhbnkgb3RoZXIgbW9kdWxlLiAqL1xuXHRwdWJsaWMgYWRkSW1wb3J0KG5hbWU6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0Y29uc3QgZ3JvdXAgPSB0aGlzLl9leHRyYUltcG9ydEdyb3Vwcy5nZXQoZnJvbSkgPz8gbmV3IEltcG9ydEdyb3VwKCk7XG5cdFx0Z3JvdXAuYWRkKG5hbWUsIHR5cGVPbmx5KTtcblx0XHR0aGlzLl9leHRyYUltcG9ydEdyb3Vwcy5zZXQoZnJvbSwgZ3JvdXApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZCBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlciAoZS5nLiBhbiBpbmplY3RlZCBkZXBlbmRlbmN5KS4gKi9cblx0cHVibGljIGFkZENvbnN0cnVjdG9yUGFyYW0ocGFyYW06IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2N0b3JQYXJhbXMucHVzaChwYXJhbSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG5cdFx0XHR0aGlzLl9jb3J0ZXhJbXBvcnRzLnJlbmRlcihcIkBkZWNvaGVyZS9jb3J0ZXhcIiksXG5cdFx0XHQnaW1wb3J0IHsgU2FtcGxlU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS5qc1wiOycsXG5cdFx0XTtcblxuXHRcdGZvciAoY29uc3QgW2Zyb20sIGdyb3VwXSBvZiB0aGlzLl9leHRyYUltcG9ydEdyb3Vwcykge1xuXHRcdFx0bGluZXMucHVzaChncm91cC5yZW5kZXIoZnJvbSkpO1xuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJjbGFzcyBIZWxsb0JvZHkge1wiLFxuXHRcdFx0J1xcdEBGaWVsZChcImJvZHlcIiwgXCJtZXNzYWdlXCIpJyxcblx0XHRcdFwiXFx0cHVibGljIG1lc3NhZ2UhOiBzdHJpbmc7XCIsXG5cdFx0XHRcIn1cIixcblx0XHRcdFwiXCIsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZCBvZiB0aGlzLl9jbGFzc0RlY29yYXRvcnMpIHtcblx0XHRcdGxpbmVzLnB1c2goZCk7XG5cdFx0fVxuXHRcdGxpbmVzLnB1c2goJ0BDb250cm9sbGVyKHsgcHJlZml4OiBcIi9oZWxsb1wiIH0pJywgXCJleHBvcnQgY2xhc3MgSGVsbG9Db250cm9sbGVyIHtcIiwgXCJcIik7XG5cblx0XHRsaW5lcy5wdXNoKFwiXFx0cHVibGljIGNvbnN0cnVjdG9yKFwiKTtcblx0XHRmb3IgKGNvbnN0IHAgb2YgdGhpcy5fY3RvclBhcmFtcykge1xuXHRcdFx0bGluZXMucHVzaChgXFx0XFx0JHtwfSxgKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChcIlxcdCkge31cIik7XG5cdFx0bGluZXMucHVzaChcIlwiKTtcblxuXHRcdGZvciAoY29uc3QgbWV0aG9kIG9mIHRoaXMuX21ldGhvZHMudmFsdWVzKCkpIHtcblx0XHRcdGxpbmVzLnB1c2goLi4ubWV0aG9kLnJlbmRlcigpLCBcIlwiKTtcblx0XHR9XG5cblx0XHRsaW5lcy5wdXNoKFwifVwiLCBcIlwiKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9jb250cm9sbGVycy9oZWxsby5jb250cm9sbGVyLnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IGxpbmVzLmpvaW4oXCJcXG5cIiksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDb250cm9sbGVyTWV0aG9kIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJJbXBvcnRHcm91cCIsIl92YWx1ZXMiLCJfdHlwZXMiLCJhZGQiLCJuYW1lIiwidHlwZU9ubHkiLCJpbmNsdWRlcyIsInB1c2giLCJ0eXBlSWR4IiwiaW5kZXhPZiIsInNwbGljZSIsInJlbmRlciIsImZyb20iLCJ2YWx1ZXMiLCJzb3J0IiwidHlwZXMiLCJtYXAiLCJuIiwiam9pbiIsIl9leHRyYURlY29yYXRvcnMiLCJfYm9keSIsIl9pc0FzeW5jIiwiX2h0dHBEZWNvcmF0b3IiLCJfcGFyYW1zIiwiaXNBc3luYyIsImJvZHkiLCJhZGREZWNvcmF0b3IiLCJkZWNvcmF0b3IiLCJzZXRCb2R5Iiwic2V0QXN5bmMiLCJsaW5lcyIsImQiLCJhc3luY0t3IiwibGluZSIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJDT05UUk9MTEVSX1RTIiwiX2NvcnRleEltcG9ydHMiLCJfZXh0cmFJbXBvcnRHcm91cHMiLCJNYXAiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX2N0b3JQYXJhbXMiLCJfbWV0aG9kcyIsImdldE1ldGhvZCIsIm0iLCJnZXQiLCJFcnJvciIsImFkZENvcnRleEltcG9ydCIsImFkZEltcG9ydCIsImdyb3VwIiwic2V0IiwiYWRkQ29uc3RydWN0b3JQYXJhbSIsInBhcmFtIiwiZmlsZXMiLCJwIiwibWV0aG9kIiwiZmlsZVBhdGgiLCJjb250ZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQWtDYUE7ZUFBQUE7O1FBdURBQztlQUFBQTs7O3VCQXpGb0I7QUFHakMsaUZBQWlGLEdBQ2pGLE1BQU1DO0lBQ1lDLFVBQW9CLEVBQUUsQ0FBQztJQUN2QkMsU0FBbUIsRUFBRSxDQUFDO0lBRWhDQyxJQUFJQyxJQUFZLEVBQUVDLFdBQVcsS0FBSyxFQUFRO1FBQ2hELElBQUlBLFVBQVU7WUFDYixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQ0osT0FBTyxDQUFDSyxRQUFRLENBQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDRixPQUFPO2dCQUNoRSxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ssSUFBSSxDQUFD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
@@ -1,193 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "GithubCiWorkflows", {
6
- enumerable: true,
7
- get: function() {
8
- return GithubCiWorkflows;
9
- }
10
- });
11
- const _const = require("../../models/const.js");
12
- class GithubCiWorkflows {
13
- key = _const.WELL_KNOWN_FILES.GITHUB_CI;
14
- files() {
15
- return [
16
- {
17
- filePath: ".github/actions/setup-node-pnpm/action.yml",
18
- content: `name: Setup Node + pnpm
19
- description: Install pnpm and Node, configure npm registry auth, install deps
20
- inputs:
21
- node-version:
22
- description: Node.js version
23
- required: false
24
- default: "24"
25
- pnpm-version:
26
- description: pnpm version
27
- required: false
28
- default: "10"
29
- install:
30
- description: Run pnpm install --frozen-lockfile
31
- required: false
32
- default: "true"
33
-
34
- runs:
35
- using: composite
36
- steps:
37
- - uses: pnpm/action-setup@v4
38
- with:
39
- version: \${{ inputs.pnpm-version }}
40
-
41
- - uses: actions/setup-node@v4
42
- with:
43
- node-version: \${{ inputs.node-version }}
44
- cache: pnpm
45
- cache-dependency-path: pnpm-lock.yaml
46
-
47
- - name: Configure npm auth
48
- shell: bash
49
- run: |
50
- if [[ -n "\${NODE_AUTH_TOKEN:-}" ]]; then
51
- echo "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}" >> .npmrc
52
- fi
53
-
54
- - name: Install dependencies
55
- if: inputs.install == 'true'
56
- shell: bash
57
- run: |
58
- if [[ -f pnpm-lock.yaml ]]; then
59
- pnpm install --frozen-lockfile
60
- else
61
- pnpm install
62
- fi
63
- `
64
- },
65
- {
66
- filePath: ".github/workflows/ci.yml",
67
- content: `name: CI
68
- on:
69
- push:
70
- branches:
71
- - "*"
72
- pull_request:
73
- workflow_dispatch:
74
- concurrency:
75
- group: ci-\${{ github.ref }}
76
- cancel-in-progress: true
77
- env:
78
- NODE_AUTH_TOKEN: \${{ secrets.NODE_AUTH_TOKEN }}
79
- SCRIBE_LOG_LEVEL: info
80
-
81
- jobs:
82
- lint:
83
- runs-on: ubuntu-latest
84
- timeout-minutes: 15
85
- permissions:
86
- contents: read
87
- steps:
88
- - uses: actions/checkout@v4
89
- with:
90
- fetch-depth: 1
91
-
92
- - uses: ./.github/actions/setup-node-pnpm
93
-
94
- - name: Lint and typecheck
95
- run: |
96
- set +e
97
- pnpm run lint:check &
98
- lint_pid=$!
99
- pnpm run typecheck &
100
- tsc_pid=$!
101
- wait "$lint_pid"
102
- lint_code=$?
103
- wait "$tsc_pid"
104
- tsc_code=$?
105
- set -e
106
- if [[ "$lint_code" -ne 0 || "$tsc_code" -ne 0 ]]; then
107
- exit 1
108
- fi
109
-
110
- test:
111
- runs-on: ubuntu-latest
112
- timeout-minutes: 20
113
- permissions:
114
- contents: read
115
- steps:
116
- - uses: actions/checkout@v4
117
- with:
118
- fetch-depth: 1
119
-
120
- - uses: ./.github/actions/setup-node-pnpm
121
-
122
- - name: Test
123
- run: pnpm test
124
-
125
- - name: Build (default branch)
126
- if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
127
- run: pnpm run build
128
-
129
- ci:
130
- needs: [lint, test]
131
- if: always()
132
- runs-on: ubuntu-latest
133
- timeout-minutes: 5
134
- steps:
135
- - name: Aggregate
136
- run: |
137
- if [[ "\${{ needs.lint.result }}" != "success" || "\${{ needs.test.result }}" != "success" ]]; then
138
- echo "CI failed (lint=\${{ needs.lint.result }} test=\${{ needs.test.result }})"
139
- exit 1
140
- fi
141
- echo "CI passed"
142
- `
143
- },
144
- {
145
- filePath: ".github/workflows/publish.yml",
146
- content: `name: Publish
147
-
148
- on:
149
- workflow_run:
150
- workflows: ["CI"]
151
- types: [completed]
152
-
153
- concurrency:
154
- group: publish-\${{ github.event.workflow_run.head_branch }}
155
- cancel-in-progress: false
156
-
157
- env:
158
- NODE_AUTH_TOKEN: \${{ secrets.NODE_AUTH_TOKEN }}
159
- SCRIBE_LOG_LEVEL: info
160
-
161
- jobs:
162
- publish:
163
- if: >
164
- github.event.workflow_run.conclusion == 'success' &&
165
- github.event.workflow_run.head_branch == github.event.repository.default_branch
166
- runs-on: ubuntu-latest
167
- timeout-minutes: 30
168
- permissions:
169
- contents: read
170
- id-token: write
171
- steps:
172
- - uses: actions/checkout@v4
173
- with:
174
- ref: \${{ github.event.workflow_run.head_sha }}
175
- fetch-depth: 1
176
-
177
- - uses: ./.github/actions/setup-node-pnpm
178
-
179
- - name: Build release
180
- run: pnpm run build
181
-
182
- - name: Publish packages
183
- run: pnpm exec forge publish --configuration release
184
- # Skips packages with "private": true (e.g. the webapi app).
185
- # Optional registry images: add \`pnpm exec forge docker --configuration release --push\`
186
- # after configuring GHCR/OIDC — not enabled by default (PaaS builds the Dockerfile).
187
- `
188
- }
189
- ];
190
- }
191
- }
192
-
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9naXRodWItY2kubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc291cmNlLWZpbGUuanNcIjtcblxuLyoqXG4gKiBNaW5pbWFsIEdpdEh1YiBBY3Rpb25zIGZvciBzY2FmZm9sZGVkIGFwcHM6IGxpbnQg4oilIHRlc3QsIGJ1aWxkIGdhdGUgb24gZGVmYXVsdCBicmFuY2gsXG4gKiBucG0gcHVibGlzaCBhZnRlciBDSSAoc2tpcHMgcHJpdmF0ZSBwYWNrYWdlcykuIE5vIGRlZmF1bHQgZm9yZ2UgZG9ja2VyIC0tcHVzaC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdGh1YkNpV29ya2Zsb3dzIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkdJVEhVQl9DSTtcblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIuZ2l0aHViL2FjdGlvbnMvc2V0dXAtbm9kZS1wbnBtL2FjdGlvbi55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IFNldHVwIE5vZGUgKyBwbnBtXG5kZXNjcmlwdGlvbjogSW5zdGFsbCBwbnBtIGFuZCBOb2RlLCBjb25maWd1cmUgbnBtIHJlZ2lzdHJ5IGF1dGgsIGluc3RhbGwgZGVwc1xuaW5wdXRzOlxuICBub2RlLXZlcnNpb246XG4gICAgZGVzY3JpcHRpb246IE5vZGUuanMgdmVyc2lvblxuICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgIGRlZmF1bHQ6IFwiMjRcIlxuICBwbnBtLXZlcnNpb246XG4gICAgZGVzY3JpcHRpb246IHBucG0gdmVyc2lvblxuICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgIGRlZmF1bHQ6IFwiMTBcIlxuICBpbnN0YWxsOlxuICAgIGRlc2NyaXB0aW9uOiBSdW4gcG5wbSBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG4gICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgZGVmYXVsdDogXCJ0cnVlXCJcblxucnVuczpcbiAgdXNpbmc6IGNvbXBvc2l0ZVxuICBzdGVwczpcbiAgICAtIHVzZXM6IHBucG0vYWN0aW9uLXNldHVwQHY0XG4gICAgICB3aXRoOlxuICAgICAgICB2ZXJzaW9uOiBcXCR7eyBpbnB1dHMucG5wbS12ZXJzaW9uIH19XG5cbiAgICAtIHVzZXM6IGFjdGlvbnMvc2V0dXAtbm9kZUB2NFxuICAgICAgd2l0aDpcbiAgICAgICAgbm9kZS12ZXJzaW9uOiBcXCR7eyBpbnB1dHMubm9kZS12ZXJzaW9uIH19XG4gICAgICAgIGNhY2hlOiBwbnBtXG4gICAgICAgIGNhY2hlLWRlcGVuZGVuY3ktcGF0aDogcG5wbS1sb2NrLnlhbWxcblxuICAgIC0gbmFtZTogQ29uZmlndXJlIG5wbSBhdXRoXG4gICAgICBzaGVsbDogYmFzaFxuICAgICAgcnVuOiB8XG4gICAgICAgIGlmIFtbIC1uIFwiXFwke05PREVfQVVUSF9UT0tFTjotfVwiIF1dOyB0aGVuXG4gICAgICAgICAgZWNobyBcIi8vcmVnaXN0cnkubnBtanMub3JnLzpfYXV0aFRva2VuPVxcJHtOT0RFX0FVVEhfVE9LRU59XCIgPj4gLm5wbXJjXG4gICAgICAgIGZpXG5cbiAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzXG4gICAgICBpZjogaW5wdXRzLmluc3RhbGwgPT0gJ3RydWUnXG4gICAgICBzaGVsbDogYmFzaFxuICAgICAgcnVuOiB8XG4gICAgICAgIGlmIFtbIC1mIHBucG0tbG9jay55YW1sIF1dOyB0aGVuXG4gICAgICAgICAgcG5wbSBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBwbnBtIGluc3RhbGxcbiAgICAgICAgZmlcbmAsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIuZ2l0aHViL3dvcmtmbG93cy9jaS55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IENJXG5vbjpcbiAgcHVzaDpcbiAgICBicmFuY2hlczpcbiAgICAgIC0gXCIqXCJcbiAgcHVsbF9yZXF1ZXN0OlxuICB3b3JrZmxvd19kaXNwYXRjaDpcbmNvbmN1cnJlbmN5OlxuICBncm91cDogY2ktXFwke3sgZ2l0aHViLnJlZiB9fVxuICBjYW5jZWwtaW4tcHJvZ3Jlc3M6IHRydWVcbmVudjpcbiAgTk9ERV9BVVRIX1RPS0VOOiBcXCR7eyBzZWNyZXRzLk5PREVfQVVUSF9UT0tFTiB9fVxuICBTQ1JJQkVfTE9HX0xFVkVMOiBpbmZvXG5cbmpvYnM6XG4gIGxpbnQ6XG4gICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdFxuICAgIHRpbWVvdXQtbWludXRlczogMTVcbiAgICBwZXJtaXNzaW9uczpcbiAgICAgIGNvbnRlbnRzOiByZWFkXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IExpbnQgYW5kIHR5cGVjaGVja1xuICAgICAgICBydW46IHxcbiAgICAgICAgICBzZXQgK2VcbiAgICAgICAgICBwbnBtIHJ1biBsaW50OmNoZWNrICZcbiAgICAgICAgICBsaW50X3BpZD0kIVxuICAgICAgICAgIHBucG0gcnVuIHR5cGVjaGVjayAmXG4gICAgICAgICAgdHNjX3BpZD0kIVxuICAgICAgICAgIHdhaXQgXCIkbGludF9waWRcIlxuICAgICAgICAgIGxpbnRfY29kZT0kP1xuICAgICAgICAgIHdhaXQgXCIkdHNjX3BpZFwiXG4gICAgICAgICAgdHNjX2NvZGU9JD9cbiAgICAgICAgICBzZXQgLWVcbiAgICAgICAgICBpZiBbWyBcIiRsaW50X2NvZGVcIiAtbmUgMCB8fCBcIiR0c2NfY29kZVwiIC1uZSAwIF1dOyB0aGVuXG4gICAgICAgICAgICBleGl0IDFcbiAgICAgICAgICBmaVxuXG4gIHRlc3Q6XG4gICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdFxuICAgIHRpbWVvdXQtbWludXRlczogMjBcbiAgICBwZXJtaXNzaW9uczpcbiAgICAgIGNvbnRlbnRzOiByZWFkXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IFRlc3RcbiAgICAgICAgcnVuOiBwbnBtIHRlc3RcblxuICAgICAgLSBuYW1lOiBCdWlsZCAoZGVmYXVsdCBicmFuY2gpXG4gICAgICAgIGlmOiBnaXRodWIucmVmID09IGZvcm1hdCgncmVmcy9oZWFkcy97MH0nLCBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5kZWZhdWx0X2JyYW5jaClcbiAgICAgICAgcnVuOiBwbnBtIHJ1biBidWlsZFxuXG4gIGNpOlxuICAgIG5lZWRzOiBbbGludCwgdGVzdF1cbiAgICBpZjogYWx3YXlzKClcbiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0XG4gICAgdGltZW91dC1taW51dGVzOiA1XG4gICAgc3RlcHM6XG4gICAgICAtIG5hbWU6IEFnZ3JlZ2F0ZVxuICAgICAgICBydW46IHxcbiAgICAgICAgICBpZiBbWyBcIlxcJHt7IG5lZWRzLmxpbnQucmVzdWx0IH19XCIgIT0gXCJzdWNjZXNzXCIgfHwgXCJcXCR7eyBuZWVkcy50ZXN0LnJlc3VsdCB9fVwiICE9IFwic3VjY2Vzc1wiIF1dOyB0aGVuXG4gICAgICAgICAgICBlY2hvIFwiQ0kgZmFpbGVkIChsaW50PVxcJHt7IG5lZWRzLmxpbnQucmVzdWx0IH19IHRlc3Q9XFwke3sgbmVlZHMudGVzdC5yZXN1bHQgfX0pXCJcbiAgICAgICAgICAgIGV4aXQgMVxuICAgICAgICAgIGZpXG4gICAgICAgICAgZWNobyBcIkNJIHBhc3NlZFwiXG5gLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IFB1Ymxpc2hcblxub246XG4gIHdvcmtmbG93X3J1bjpcbiAgICB3b3JrZmxvd3M6IFtcIkNJXCJdXG4gICAgdHlwZXM6IFtjb21wbGV0ZWRdXG5cbmNvbmN1cnJlbmN5OlxuICBncm91cDogcHVibGlzaC1cXCR7eyBnaXRodWIuZXZlbnQud29ya2Zsb3dfcnVuLmhlYWRfYnJhbmNoIH19XG4gIGNhbmNlbC1pbi1wcm9ncmVzczogZmFsc2VcblxuZW52OlxuICBOT0RFX0FVVEhfVE9LRU46IFxcJHt7IHNlY3JldHMuTk9ERV9BVVRIX1RPS0VOIH19XG4gIFNDUklCRV9MT0dfTEVWRUw6IGluZm9cblxuam9iczpcbiAgcHVibGlzaDpcbiAgICBpZjogPlxuICAgICAgZ2l0aHViLmV2ZW50LndvcmtmbG93X3J1bi5jb25jbHVzaW9uID09ICdzdWNjZXNzJyAmJlxuICAgICAgZ2l0aHViLmV2ZW50LndvcmtmbG93X3J1bi5oZWFkX2JyYW5jaCA9PSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5kZWZhdWx0X2JyYW5jaFxuICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3RcbiAgICB0aW1lb3V0LW1pbnV0ZXM6IDMwXG4gICAgcGVybWlzc2lvbnM6XG4gICAgICBjb250ZW50czogcmVhZFxuICAgICAgaWQtdG9rZW46IHdyaXRlXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICByZWY6IFxcJHt7IGdpdGh1Yi5ldmVudC53b3JrZmxvd19ydW4uaGVhZF9zaGEgfX1cbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IEJ1aWxkIHJlbGVhc2VcbiAgICAgICAgcnVuOiBwbnBtIHJ1biBidWlsZFxuXG4gICAgICAtIG5hbWU6IFB1Ymxpc2ggcGFja2FnZXNcbiAgICAgICAgcnVuOiBwbnBtIGV4ZWMgZm9yZ2UgcHVibGlzaCAtLWNvbmZpZ3VyYXRpb24gcmVsZWFzZVxuICAgICAgICAjIFNraXBzIHBhY2thZ2VzIHdpdGggXCJwcml2YXRlXCI6IHRydWUgKGUuZy4gdGhlIHdlYmFwaSBhcHApLlxuICAgICAgICAjIE9wdGlvbmFsIHJlZ2lzdHJ5IGltYWdlczogYWRkIFxcYHBucG0gZXhlYyBmb3JnZSBkb2NrZXIgLS1jb25maWd1cmF0aW9uIHJlbGVhc2UgLS1wdXNoXFxgXG4gICAgICAgICMgYWZ0ZXIgY29uZmlndXJpbmcgR0hDUi9PSURDIOKAlCBub3QgZW5hYmxlZCBieSBkZWZhdWx0IChQYWFTIGJ1aWxkcyB0aGUgRG9ja2VyZmlsZSkuXG5gLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiR2l0aHViQ2lXb3JrZmxvd3MiLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiR0lUSFVCX0NJIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiXSwibWFwcGluZ3MiOiI7Ozs7K0JBT2FBOzs7ZUFBQUE7Ozt1QkFQb0I7QUFPMUIsTUFBTUE7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLFNBQVMsQ0FBQztJQUUxQ0MsUUFBc0I7UUFDNUIsT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZDZCxDQUFDO1lBQ0U7WUFDQTtnQkFDQ0QsVUFBVTtnQkFDVkMsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyRWQsQ0FBQztZQUNFO1lBQ0E7Z0JBQ0NELFVBQVU7Z0JBQ1ZDLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5Q2QsQ0FBQztZQUNFO1NBQ0E7SUFDRjtBQUNEIn0=
@@ -1,165 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "MainSourceFile", {
6
- enumerable: true,
7
- get: function() {
8
- return MainSourceFile;
9
- }
10
- });
11
- const _const = require("../../models/const.js");
12
- /** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
13
- _values = [];
14
- _types = [];
15
- add(name, typeOnly = false) {
16
- if (typeOnly) {
17
- // Value import already present — value wins, skip
18
- if (!this._values.includes(name) && !this._types.includes(name)) {
19
- this._types.push(name);
20
- }
21
- } else {
22
- // Promote: remove from types if it was previously type-only
23
- const typeIdx = this._types.indexOf(name);
24
- if (typeIdx !== -1) this._types.splice(typeIdx, 1);
25
- if (!this._values.includes(name)) this._values.push(name);
26
- }
27
- return this;
28
- }
29
- render(from) {
30
- const values = [
31
- ...this._values
32
- ].sort();
33
- const types = [
34
- ...this._types
35
- ].sort().map((n)=>`type ${n}`);
36
- return `import { ${[
37
- ...values,
38
- ...types
39
- ].join(", ")} } from "${from}";`;
40
- }
41
- }
42
- class MainSourceFile {
43
- appName;
44
- key = _const.WELL_KNOWN_FILES.MAIN_TS;
45
- _sideEffectImports = [];
46
- _extraImports = new Map();
47
- _builderCalls = [];
48
- _entities = [];
49
- _repositories = [];
50
- _services = [];
51
- _dataSourceName;
52
- _typeOrmSeed;
53
- constructor(appName){
54
- this.appName = appName;
55
- }
56
- /** Adds a bare side-effect import, e.g. `@decohere/cortex/auth`. */ addSideEffectImport(path) {
57
- if (!this._sideEffectImports.includes(path)) this._sideEffectImports.push(path);
58
- return this;
59
- }
60
- /** Adds a named import, e.g. `import { Foo } from "bar"`. */ addImport(name, from, typeOnly = false) {
61
- const group = this._extraImports.get(from) ?? new ImportGroup();
62
- group.add(name, typeOnly);
63
- this._extraImports.set(from, group);
64
- return this;
65
- }
66
- /**
67
- * Adds a builder call inserted after `.withConfiguration()` and before
68
- * `.withServices()`. Pass the call without leading dot, e.g. `.withAuth()`.
69
- */ addBuilderCall(call) {
70
- this._builderCalls.push(call);
71
- return this;
72
- }
73
- /** Adds a TypeORM entity — import and entry in `withTypeOrm({ entities })`. */ addEntity(entity) {
74
- this._entities.push(entity);
75
- return this;
76
- }
77
- /** Adds a TypeORM repository — import and entry in `withTypeOrm({ repositories })`. */ addRepository(repo) {
78
- this._repositories.push(repo);
79
- return this;
80
- }
81
- /** Adds a service registered in `.withServices()`. */ addService(service) {
82
- this._services.push(service);
83
- return this;
84
- }
85
- /**
86
- * Datasource name passed to `withTypeOrm({ name })`. Must match
87
- * `database.dataSources[].name` in config.yaml.
88
- */ setDataSourceName(name) {
89
- this._dataSourceName = name;
90
- return this;
91
- }
92
- /**
93
- * Inline seed callback body for `withTypeOrm({ seed })`.
94
- * Receives `dataSource` in scope. Example: `await dataSource.getRepository(User).save(...)`.
95
- */ setTypeOrmSeed(seedBody) {
96
- this._typeOrmSeed = seedBody;
97
- return this;
98
- }
99
- files() {
100
- const imports = [
101
- 'import "@decohere/scribe-pino";',
102
- 'import "@decohere/cortex/http";'
103
- ];
104
- for (const path of this._sideEffectImports){
105
- imports.push(`import "${path}";`);
106
- }
107
- imports.push('import "@decohere/protocol";', 'import { YamlDataSource } from "@decohere/protocol";', 'import { Builder } from "@decohere/cortex";', 'import { FastifyProvider } from "@decohere/cortex/providers";', 'import { scribe } from "@decohere/scribe";', 'import { SampleService } from "./services/sample.service.js";');
108
- for (const e of this._entities){
109
- imports.push(`import { ${e.className} } from "${e.importPath}";`);
110
- }
111
- for (const r of this._repositories){
112
- imports.push(`import { ${r.className} } from "${r.importPath}";`);
113
- }
114
- for (const s of this._services){
115
- imports.push(`import { ${s.className} } from "${s.importPath}";`);
116
- }
117
- for (const [from, group] of this._extraImports){
118
- imports.push(group.render(from));
119
- }
120
- imports.push('import { HelloController } from "./controllers/hello.controller.js";');
121
- const serviceRegs = [
122
- "cb.registerSingleton(SampleService);",
123
- ...this._services.map((s)=>s.scope === "request" ? `cb.registerRequestScoped(${s.className});` : `cb.registerSingleton(${s.className});`)
124
- ].join(" ");
125
- const builderCalls = [
126
- `\t.withHttpProvider(FastifyProvider)`,
127
- `\t.withConfiguration(YamlDataSource)`,
128
- ...this._builderCalls.map((c)=>`\t${c}`),
129
- `\t.withServices((cb) => { ${serviceRegs} })`
130
- ];
131
- if (this._entities.length > 0) {
132
- const entities = this._entities.map((e)=>e.className).join(", ");
133
- const repos = this._repositories.map((r)=>r.className).join(", ");
134
- const named = this._dataSourceName != null ? `name: "${this._dataSourceName}", ` : "";
135
- if (this._typeOrmSeed) {
136
- builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}], seed: async (dataSource) => { ${this._typeOrmSeed} } })`);
137
- } else {
138
- builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}] })`);
139
- }
140
- }
141
- builderCalls.push(`\t.withControllers(HelloController)`);
142
- const content = [
143
- ...imports,
144
- "",
145
- "scribe.extend.withPinoPretty();",
146
- "",
147
- `const app = await Builder.create({ applicationName: "${this.appName}" })`,
148
- ...builderCalls,
149
- `\t.build();`,
150
- "",
151
- "await app.start({ port: Number(process.env.PORT) || 3000 });",
152
- "",
153
- "export default app;",
154
- ""
155
- ].join("\n");
156
- return [
157
- {
158
- filePath: "src/main.ts",
159
- content
160
- }
161
- ];
162
- }
163
- }
164
-
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFR5cGVPcm1JbXBvcnQgPSB7IGNsYXNzTmFtZTogc3RyaW5nOyBpbXBvcnRQYXRoOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIFNlcnZpY2VJbXBvcnQgPSBUeXBlT3JtSW1wb3J0ICYgeyBzY29wZT86IFwic2luZ2xldG9uXCIgfCBcInJlcXVlc3RcIiB9O1xuXG4vKiogVHJhY2tzIG5hbWVkIGltcG9ydHMgZnJvbSBhIHNpbmdsZSBtb2R1bGUgcGF0aCwgc3BsaXQgaW50byB2YWx1ZXMgYW5kIHR5cGVzLiAqL1xuY2xhc3MgSW1wb3J0R3JvdXAge1xuXHRwcml2YXRlIHJlYWRvbmx5IF92YWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX3R5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0aWYgKHR5cGVPbmx5KSB7XG5cdFx0XHQvLyBWYWx1ZSBpbXBvcnQgYWxyZWFkeSBwcmVzZW50IOKAlCB2YWx1ZSB3aW5zLCBza2lwXG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5fdHlwZXMuaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0dGhpcy5fdHlwZXMucHVzaChuYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUHJvbW90ZTogcmVtb3ZlIGZyb20gdHlwZXMgaWYgaXQgd2FzIHByZXZpb3VzbHkgdHlwZS1vbmx5XG5cdFx0XHRjb25zdCB0eXBlSWR4ID0gdGhpcy5fdHlwZXMuaW5kZXhPZihuYW1lKTtcblx0XHRcdGlmICh0eXBlSWR4ICE9PSAtMSkgdGhpcy5fdHlwZXMuc3BsaWNlKHR5cGVJZHgsIDEpO1xuXHRcdFx0aWYgKCF0aGlzLl92YWx1ZXMuaW5jbHVkZXMobmFtZSkpIHRoaXMuX3ZhbHVlcy5wdXNoKG5hbWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoZnJvbTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBbLi4udGhpcy5fdmFsdWVzXS5zb3J0KCk7XG5cdFx0Y29uc3QgdHlwZXMgPSBbLi4udGhpcy5fdHlwZXNdLnNvcnQoKS5tYXAoKG4pID0+IGB0eXBlICR7bn1gKTtcblx0XHRyZXR1cm4gYGltcG9ydCB7ICR7Wy4uLnZhbHVlcywgLi4udHlwZXNdLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHtmcm9tfVwiO2A7XG5cdH1cbn1cblxuLyoqXG4gKiBNb2RlbCBmb3IgYHByb2plY3RzL2FwaS9zcmMvbWFpbi50c2AuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIG1pbmltYWwgSFRUUCArIFlBTUwgY29uZmlnIHNldHVwLiBGZWF0dXJlcyBtdXRhdGUgdGhlIG1vZGVsXG4gKiBieSBjYWxsaW5nIGFkZFNpZGVFZmZlY3RJbXBvcnQgLyBhZGRJbXBvcnQgLyBhZGRCdWlsZGVyQ2FsbCAvIGFkZEVudGl0eSAvXG4gKiBhZGRSZXBvc2l0b3J5LiBmaWxlcygpIHJlbmRlcnMgd2hhdGV2ZXIgaGFzIGJlZW4gYWNjdW11bGF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYWluU291cmNlRmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX3NpZGVFZmZlY3RJbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRyYUltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgSW1wb3J0R3JvdXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2J1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfZW50aXRpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9yZXBvc2l0b3JpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogU2VydmljZUltcG9ydFtdID0gW107XG5cdHByaXZhdGUgX2RhdGFTb3VyY2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX3R5cGVPcm1TZWVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwTmFtZTogc3RyaW5nKSB7fVxuXG5cdC8qKiBBZGRzIGEgYmFyZSBzaWRlLWVmZmVjdCBpbXBvcnQsIGUuZy4gYEBkZWNvaGVyZS9jb3J0ZXgvYXV0aGAuICovXG5cdHB1YmxpYyBhZGRTaWRlRWZmZWN0SW1wb3J0KHBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGlmICghdGhpcy5fc2lkZUVmZmVjdEltcG9ydHMuaW5jbHVkZXMocGF0aCkpIHRoaXMuX3NpZGVFZmZlY3RJbXBvcnRzLnB1c2gocGF0aCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkcyBhIG5hbWVkIGltcG9ydCwgZS5nLiBgaW1wb3J0IHsgRm9vIH0gZnJvbSBcImJhclwiYC4gKi9cblx0cHVibGljIGFkZEltcG9ydChuYW1lOiBzdHJpbmcsIGZyb206IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdGNvbnN0IGdyb3VwID0gdGhpcy5fZXh0cmFJbXBvcnRzLmdldChmcm9tKSA/PyBuZXcgSW1wb3J0R3JvdXAoKTtcblx0XHRncm91cC5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHRoaXMuX2V4dHJhSW1wb3J0cy5zZXQoZnJvbSwgZ3JvdXApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBidWlsZGVyIGNhbGwgaW5zZXJ0ZWQgYWZ0ZXIgYC53aXRoQ29uZmlndXJhdGlvbigpYCBhbmQgYmVmb3JlXG5cdCAqIGAud2l0aFNlcnZpY2VzKClgLiBQYXNzIHRoZSBjYWxsIHdpdGhvdXQgbGVhZGluZyBkb3QsIGUuZy4gYC53aXRoQXV0aCgpYC5cblx0ICovXG5cdHB1YmxpYyBhZGRCdWlsZGVyQ2FsbChjYWxsOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9idWlsZGVyQ2FsbHMucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSBlbnRpdHkg4oCUIGltcG9ydCBhbmQgZW50cnkgaW4gYHdpdGhUeXBlT3JtKHsgZW50aXRpZXMgfSlgLiAqL1xuXHRwdWJsaWMgYWRkRW50aXR5KGVudGl0eTogVHlwZU9ybUltcG9ydCk6IHRoaXMge1xuXHRcdHRoaXMuX2VudGl0aWVzLnB1c2goZW50aXR5KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSByZXBvc2l0b3J5IOKAlCBpbXBvcnQgYW5kIGVudHJ5IGluIGB3aXRoVHlwZU9ybSh7IHJlcG9zaXRvcmllcyB9KWAuICovXG5cdHB1YmxpYyBhZGRSZXBvc2l0b3J5KHJlcG86IFR5cGVPcm1JbXBvcnQpOiB0aGlzIHtcblx0XHR0aGlzLl9yZXBvc2l0b3JpZXMucHVzaChyZXBvKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgc2VydmljZSByZWdpc3RlcmVkIGluIGAud2l0aFNlcnZpY2VzKClgLiAqL1xuXHRwdWJsaWMgYWRkU2VydmljZShzZXJ2aWNlOiBTZXJ2aWNlSW1wb3J0KTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBEYXRhc291cmNlIG5hbWUgcGFzc2VkIHRvIGB3aXRoVHlwZU9ybSh7IG5hbWUgfSlgLiBNdXN0IG1hdGNoXG5cdCAqIGBkYXRhYmFzZS5kYXRhU291cmNlc1tdLm5hbWVgIGluIGNvbmZpZy55YW1sLlxuXHQgKi9cblx0cHVibGljIHNldERhdGFTb3VyY2VOYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RhdGFTb3VyY2VOYW1lID0gbmFtZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmxpbmUgc2VlZCBjYWxsYmFjayBib2R5IGZvciBgd2l0aFR5cGVPcm0oeyBzZWVkIH0pYC5cblx0ICogUmVjZWl2ZXMgYGRhdGFTb3VyY2VgIGluIHNjb3BlLiBFeGFtcGxlOiBgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFVzZXIpLnNhdmUoLi4uKWAuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHlwZU9ybVNlZWQoc2VlZEJvZHk6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3R5cGVPcm1TZWVkID0gc2VlZEJvZHk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtcblx0XHRcdCdpbXBvcnQgXCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjsnLFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9jb3J0ZXgvaHR0cFwiOycsXG5cdFx0XTtcblxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLl9zaWRlRWZmZWN0SW1wb3J0cykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgXCIke3BhdGh9XCI7YCk7XG5cdFx0fVxuXG5cdFx0aW1wb3J0cy5wdXNoKFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9wcm90b2NvbFwiOycsXG5cdFx0XHQnaW1wb3J0IHsgWWFtbERhdGFTb3VyY2UgfSBmcm9tIFwiQGRlY29oZXJlL3Byb3RvY29sXCI7Jyxcblx0XHRcdCdpbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IEZhc3RpZnlQcm92aWRlciB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4L3Byb3ZpZGVyc1wiOycsXG5cdFx0XHQnaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IFNhbXBsZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS5qc1wiOycsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLl9lbnRpdGllcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke2UuY2xhc3NOYW1lfSB9IGZyb20gXCIke2UuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHIgb2YgdGhpcy5fcmVwb3NpdG9yaWVzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goYGltcG9ydCB7ICR7ci5jbGFzc05hbWV9IH0gZnJvbSBcIiR7ci5pbXBvcnRQYXRofVwiO2ApO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcyBvZiB0aGlzLl9zZXJ2aWNlcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke3MuY2xhc3NOYW1lfSB9IGZyb20gXCIke3MuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtmcm9tLCBncm91cF0gb2YgdGhpcy5fZXh0cmFJbXBvcnRzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goZ3JvdXAucmVuZGVyKGZyb20pKTtcblx0XHR9XG5cblx0XHRpbXBvcnRzLnB1c2goJ2ltcG9ydCB7IEhlbGxvQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIuanNcIjsnKTtcblxuXHRcdGNvbnN0IHNlcnZpY2VSZWdzID0gW1xuXHRcdFx0XCJjYi5yZWdpc3RlclNpbmdsZXRvbihTYW1wbGVTZXJ2aWNlKTtcIixcblx0XHRcdC4uLnRoaXMuX3NlcnZpY2VzLm1hcCgocykgPT5cblx0XHRcdFx0cy5zY29wZSA9PT0gXCJyZXF1ZXN0XCJcblx0XHRcdFx0XHQ/IGBjYi5yZWdpc3RlclJlcXVlc3RTY29wZWQoJHtzLmNsYXNzTmFtZX0pO2Bcblx0XHRcdFx0XHQ6IGBjYi5yZWdpc3RlclNpbmdsZXRvbigke3MuY2xhc3NOYW1lfSk7YCxcblx0XHRcdCksXG5cdFx0XS5qb2luKFwiIFwiKTtcblxuXHRcdGNvbnN0IGJ1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXG5cdFx0XHRgXFx0LndpdGhIdHRwUHJvdmlkZXIoRmFzdGlmeVByb3ZpZGVyKWAsXG5cdFx0XHRgXFx0LndpdGhDb25maWd1cmF0aW9uKFlhbWxEYXRhU291cmNlKWAsXG5cdFx0XHQuLi50aGlzLl9idWlsZGVyQ2FsbHMubWFwKChjKSA9PiBgXFx0JHtjfWApLFxuXHRcdFx0YFxcdC53aXRoU2VydmljZXMoKGNiKSA9PiB7ICR7c2VydmljZVJlZ3N9IH0pYCxcblx0XHRdO1xuXG5cdFx0aWYgKHRoaXMuX2VudGl0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXMubWFwKChlKSA9PiBlLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgcmVwb3MgPSB0aGlzLl9yZXBvc2l0b3JpZXMubWFwKChyKSA9PiByLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgbmFtZWQgPSB0aGlzLl9kYXRhU291cmNlTmFtZSAhPSBudWxsID8gYG5hbWU6IFwiJHt0aGlzLl9kYXRhU291cmNlTmFtZX1cIiwgYCA6IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5fdHlwZU9ybVNlZWQpIHtcblx0XHRcdFx0YnVpbGRlckNhbGxzLnB1c2goXG5cdFx0XHRcdFx0YFxcdC53aXRoVHlwZU9ybSh7ICR7bmFtZWR9ZW50aXRpZXM6IFske2VudGl0aWVzfV0sIHJlcG9zaXRvcmllczogWyR7cmVwb3N9XSwgc2VlZDogYXN5bmMgKGRhdGFTb3VyY2UpID0+IHsgJHt0aGlzLl90eXBlT3JtU2VlZH0gfSB9KWAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWlsZGVyQ2FsbHMucHVzaChcblx0XHRcdFx0XHRgXFx0LndpdGhUeXBlT3JtKHsgJHtuYW1lZH1lbnRpdGllczogWyR7ZW50aXRpZXN9XSwgcmVwb3NpdG9yaWVzOiBbJHtyZXBvc31dIH0pYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRidWlsZGVyQ2FsbHMucHVzaChgXFx0LndpdGhDb250cm9sbGVycyhIZWxsb0NvbnRyb2xsZXIpYCk7XG5cblx0XHRjb25zdCBjb250ZW50ID0gW1xuXHRcdFx0Li4uaW1wb3J0cyxcblx0XHRcdFwiXCIsXG5cdFx0XHRcInNjcmliZS5leHRlbmQud2l0aFBpbm9QcmV0dHkoKTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRgY29uc3QgYXBwID0gYXdhaXQgQnVpbGRlci5jcmVhdGUoeyBhcHBsaWNhdGlvbk5hbWU6IFwiJHt0aGlzLmFwcE5hbWV9XCIgfSlgLFxuXHRcdFx0Li4uYnVpbGRlckNhbGxzLFxuXHRcdFx0YFxcdC5idWlsZCgpO2AsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJhd2FpdCBhcHAuc3RhcnQoeyBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCB9KTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRcImV4cG9ydCBkZWZhdWx0IGFwcDtcIixcblx0XHRcdFwiXCIsXG5cdFx0XS5qb2luKFwiXFxuXCIpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL21haW4udHNcIixcblx0XHRcdFx0Y29udGVudCxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIk1haW5Tb3VyY2VGaWxlIiwiSW1wb3J0R3JvdXAiLCJfdmFsdWVzIiwiX3R5cGVzIiwiYWRkIiwibmFtZSIsInR5cGVPbmx5IiwiaW5jbHVkZXMiLCJwdXNoIiwidHlwZUlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJyZW5kZXIiLCJmcm9tIiwidmFsdWVzIiwic29ydCIsInR5cGVzIiwibWFwIiwibiIsImpvaW4iLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiTUFJTl9UUyIsIl9zaWRlRWZmZWN0SW1wb3J0cyIsIl9leHRyYUltcG9ydHMiLCJNYXAiLCJfYnVpbGRlckNhbGxzIiwiX2VudGl0aWVzIiwiX3JlcG9zaXRvcmllcyIsIl9zZXJ2aWNlcyIsIl9kYXRhU291cmNlTmFtZSIsIl90eXBlT3JtU2VlZCIsImFwcE5hbWUiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwicGF0aCIsImFkZEltcG9ydCIsImdyb3VwIiwiZ2V0Iiwic2V0IiwiYWRkQnVpbGRlckNhbGwiLCJjYWxsIiwiYWRkRW50aXR5IiwiZW50aXR5IiwiYWRkUmVwb3NpdG9yeSIsInJlcG8iLCJhZGRTZXJ2aWNlIiwic2VydmljZSIsInNldERhdGFTb3VyY2VOYW1lIiwic2V0VHlwZU9ybVNlZWQiLCJzZWVkQm9keSIsImZpbGVzIiwiaW1wb3J0cyIsImUiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiciIsInMiLCJzZXJ2aWNlUmVncyIsInNjb3BlIiwiYnVpbGRlckNhbGxzIiwiYyIsImxlbmd0aCIsImVudGl0aWVzIiwicmVwb3MiLCJuYW1lZCIsImNvbnRlbnQiLCJmaWxlUGF0aCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF3Q2FBOzs7ZUFBQUE7Ozt1QkF4Q29CO0FBTWpDLGlGQUFpRixHQUNqRixNQUFNQztJQUNZQyxVQUFvQixFQUFFLENBQUM7SUFDdkJDLFNBQW1CLEVBQUUsQ0FBQztJQUVoQ0MsSUFBSUMsSUFBWSxFQUFFQyxXQUFXLEtBQUssRUFBUTtRQUNoRCxJQUFJQSxVQUFVO1lBQ2Isa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUNKLE9BQU8sQ0FBQ0ssUUFBUSxDQUFDRixTQUFTLENBQUMsSUFBSSxDQUFDRixNQUFNLENBQUNJLFFBQVEsQ0FBQ0YsT0FBTztnQkFDaEUsSUFBSSxDQUFDRixNQUFNLENBQUNLLElBQUksQ0FBQ0g7WUFDbEI7UUFDRCxPQUFPO1lBQ04sNERBQTREO1lBQzVELE1BQU1JLFVBQVUsSUFBSSxDQUFDTixNQUFNLENBQUNPLE9BQU8sQ0FBQ0w7WUFDcEMsSUFBSUksWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDTixNQUFNLENBQUNRLE1BQU0sQ0FBQ0YsU0FBUztZQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDUCxPQUFPLENBQUNLLFFBQVEsQ0FBQ0YsT0FBTyxJQUFJLENBQUNILE9BQU8sQ0FBQ00sSUFBSSxDQUFDSDtRQUNyRDtRQUNBLE9BQU8sSUFBSTtJQUNaO0lBRU9PLE9BQU9DLElBQVksRUFBVTtRQUNuQyxNQUFNQyxTQUFTO2VBQUksSUFBSSxDQUFDWixPQUFPO1NBQUMsQ0FBQ2EsSUFBSTtRQUNyQyxNQUFNQyxRQUFRO2VBQUksSUFBSSxDQUFDYixNQUFNO1NBQUMsQ0FBQ1ksSUFBSSxHQUFHRSxHQUFHLENBQUMsQ0FBQ0MsSUFBTSxDQUFDLEtBQUssRUFBRUEsR0FBRztRQUM1RCxPQUFPLENBQUMsU0FBUyxFQUFFO2VBQUlKO2VBQVdFO1NBQU0sQ0FBQ0csSUFBSSxDQUFDLE1BQU0sU0FBUyxFQUFFTixLQUFLLEVBQUUsQ0FBQztJQUN4RTtBQUNEO0FBU08sTUFBTWI7O0lBQ0lvQixNQUFNQyx1QkFBZ0IsQ0FBQ0MsT0FBTyxDQUFDO0lBRTlCQyxxQkFBK0IsRUFBRSxDQUFDO0lBQ2xDQyxnQkFBZ0IsSUFBSUMsTUFBMkI7SUFDL0NDLGdCQUEwQixFQUFFLENBQUM7SUFDN0JDLFlBQTZCLEVBQUUsQ0FBQztJQUNoQ0MsZ0JBQWlDLEVBQUUsQ0FBQztJQUNwQ0MsWUFBNkIsRUFBRSxDQUFDO0lBQ3pDQyxnQkFBb0M7SUFDcENDLGFBQWlDO0lBRXpDLFlBQW1CLEFBQWlCQyxPQUFlLENBQUU7YUFBakJBLFVBQUFBO0lBQWtCO0lBRXRELGtFQUFrRSxHQUNsRSxBQUFPQyxvQkFBb0JDLElBQVksRUFBUTtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDWCxrQkFBa0IsQ0FBQ2hCLFFBQVEsQ0FBQzJCLE9BQU8sSUFBSSxDQUFDWCxrQkFBa0IsQ0FBQ2YsSUFBSSxDQUFDMEI7UUFDMUUsT0FBTyxJQUFJO0lBQ1o7SUFFQSwyREFBMkQsR0FDM0QsQUFBT0MsVUFBVTlCLElBQVksRUFBRVEsSUFBWSxFQUFFUCxXQUFXLEtBQUssRUFBUTtRQUNwRSxNQUFNOEIsUUFBUSxJQUFJLENBQUNaLGFBQWEsQ0FBQ2EsR0FBRyxDQUFDeEIsU0FBUyxJQUFJWjtRQUNsRG1DLE1BQU1oQyxHQUFHLENBQUNDLE1BQU1DO1FBQ2hCLElBQUksQ0FBQ2tCLGFBQWEsQ0FBQ2MsR0FBRyxDQUFDekIsTUFBTXVCO1FBQzdCLE9BQU8sSUFBSTtJQUNaO0lBRUE7OztFQUdDLEdBQ0QsQUFBT0csZUFBZUMsSUFBWSxFQUFRO1FBQ3pDLElBQUksQ0FBQ2QsYUFBYSxDQUFDbEIsSUFBSSxDQUFDZ0M7UUFDeEIsT0FBTyxJQUFJO0lBQ1o7SUFFQSw2RUFBNkUsR0FDN0UsQUFBT0MsVUFBVUMsTUFBcUIsRUFBUTtRQUM3QyxJQUFJLENBQUNmLFNBQVMsQ0FBQ25CLElBQUksQ0FBQ2tDO1FBQ3BCLE9BQU8sSUFBSTtJQUNaO0lBRUEscUZBQXFGLEdBQ3JGLEFBQU9DLGNBQWNDLElBQW1CLEVBQVE7UUFDL0MsSUFBSSxDQUFDaEIsYUFBYSxDQUFDcEIsSUFBSSxDQUFDb0M7UUFDeEIsT0FBTyxJQUFJO0lBQ1o7SUFFQSxvREFBb0QsR0FDcEQsQUFBT0MsV0FBV0MsT0FBc0IsRUFBUTtRQUMvQyxJQUFJLENBQUNqQixTQUFTLENBQUNyQixJQUFJLENBQUNzQztRQUNwQixPQUFPLElBQUk7SUFDWjtJQUVBOzs7RUFHQyxHQUNELEFBQU9DLGtCQUFrQjFDLElBQVksRUFBUTtRQUM1QyxJQUFJLENBQUN5QixlQUFlLEdBQUd6QjtRQUN2QixPQUFPLElBQUk7SUFDWjtJQUVBOzs7RUFHQyxHQUNELEFBQU8yQyxlQUFlQyxRQUFnQixFQUFRO1FBQzdDLElBQUksQ0FBQ2xCLFlBQVksR0FBR2tCO1FBQ3BCLE9BQU8sSUFBSTtJQUNaO0lBRU9DLFFBQXNCO1FBQzVCLE1BQU1DLFVBQW9CO1lBQ3pCO1lBQ0E7U0FDQTtRQUVELEtBQUssTUFBTWpCLFFBQVEsSUFBSSxDQUFDWCxrQkFBa0IsQ0FBRTtZQUMzQzRCLFFBQVEzQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUwQixLQUFLLEVBQUUsQ0FBQztRQUNqQztRQUVBaUIsUUFBUTNDLElBQUksQ0FDWCxnQ0FDQSx3REFDQSwrQ0FDQSxpRUFDQSw4Q0FDQTtRQUdELEtBQUssTUFBTTRDLEtBQUssSUFBSSxDQUFDekIsU0FBUyxDQUFFO1lBQy9Cd0IsUUFBUTNDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRTRDLEVBQUVDLFNBQVMsQ0FBQyxTQUFTLEVBQUVELEVBQUVFLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDakU7UUFFQSxLQUFLLE1BQU1DLEtBQUssSUFBSSxDQUFDM0IsYUFBYSxDQUFFO1lBQ25DdUIsUUFBUTNDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRStDLEVBQUVGLFNBQVMsQ0FBQyxTQUFTLEVBQUVFLEVBQUVELFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDakU7UUFFQSxLQUFLLE1BQU1FLEtBQUssSUFBSSxDQUFDM0IsU0FBUyxDQUFFO1lBQy9Cc0IsUUFBUTNDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRWdELEVBQUVILFNBQVMsQ0FBQyxTQUFTLEVBQUVHLEVBQUVGLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDakU7UUFFQSxLQUFLLE1BQU0sQ0FBQ3pDLE1BQU11QixNQUFNLElBQUksSUFBSSxDQUFDWixhQUFhLENBQUU7WUFDL0MyQixRQUFRM0MsSUFBSSxDQUFDNEIsTUFBTXhCLE1BQU0sQ0FBQ0M7UUFDM0I7UUFFQXNDLFFBQVEzQyxJQUFJLENBQUM7UUFFYixNQUFNaUQsY0FBYztZQUNuQjtlQUNHLElBQUksQ0FBQzVCLFNBQVMsQ0FBQ1osR0FBRyxDQUFDLENBQUN1QyxJQUN0QkEsRUFBRUUsS0FBSyxLQUFLLFlBQ1QsQ0FBQyx5QkFBeUIsRUFBRUYsRUFBRUgsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUMzQyxDQUFDLHFCQUFxQixFQUFFRyxFQUFFSCxTQUFTLENBQUMsRUFBRSxDQUFDO1NBRTNDLENBQUNsQyxJQUFJLENBQUM7UUFFUCxNQUFNd0MsZUFBeUI7WUFDOUIsQ0FBQyxvQ0FBb0MsQ0FBQztZQUN0QyxDQUFDLG9DQUFvQyxDQUFDO2VBQ25DLElBQUksQ0FBQ2pDLGFBQWEsQ0FBQ1QsR0FBRyxDQUFDLENBQUMyQyxJQUFNLENBQUMsRUFBRSxFQUFFQSxHQUFHO1lBQ3pDLENBQUMsMEJBQTBCLEVBQUVILFlBQVksR0FBRyxDQUFDO1NBQzdDO1FBRUQsSUFBSSxJQUFJLENBQUM5QixTQUFTLENBQUNrQyxNQUFNLEdBQUcsR0FBRztZQUM5QixNQUFNQyxXQUFXLElBQUksQ0FBQ25DLFNBQVMsQ0FBQ1YsR0FBRyxDQUFDLENBQUNtQyxJQUFNQSxFQUFFQyxTQUFTLEVBQUVsQyxJQUFJLENBQUM7WUFDN0QsTUFBTTRDLFFBQVEsSUFBSSxDQUFDbkMsYUFBYSxDQUFDWCxHQUFHLENBQUMsQ0FBQ3NDLElBQU1BLEVBQUVGLFNBQVMsRUFBRWxDLElBQUksQ0FBQztZQUM5RCxNQUFNNkMsUUFBUSxJQUFJLENBQUNsQyxlQUFlLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUNBLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRztZQUNuRixJQUFJLElBQUksQ0FBQ0MsWUFBWSxFQUFFO2dCQUN0QjRCLGFBQWFuRCxJQUFJLENBQ2hCLENBQUMsaUJBQWlCLEVBQUV3RCxNQUFNLFdBQVcsRUFBRUYsU0FBUyxrQkFBa0IsRUFBRUMsTUFBTSxpQ0FBaUMsRUFBRSxJQUFJLENBQUNoQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBRXZJLE9BQU87Z0JBQ040QixhQUFhbkQsSUFBSSxDQUNoQixDQUFDLGlCQUFpQixFQUFFd0QsTUFBTSxXQUFXLEVBQUVGLFNBQVMsa0JBQWtCLEVBQUVDLE1BQU0sSUFBSSxDQUFDO1lBRWpGO1FBQ0Q7UUFFQUosYUFBYW5ELElBQUksQ0FBQyxDQUFDLG1DQUFtQyxDQUFDO1FBRXZELE1BQU15RCxVQUFVO2VBQ1pkO1lBQ0g7WUFDQTtZQUNBO1lBQ0EsQ0FBQyxxREFBcUQsRUFBRSxJQUFJLENBQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDO2VBQ3ZFMkI7WUFDSCxDQUFDLFdBQVcsQ0FBQztZQUNiO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDQSxDQUFDeEMsSUFBSSxDQUFDO1FBRVAsT0FBTztZQUNOO2dCQUNDK0MsVUFBVTtnQkFDVkQ7WUFDRDtTQUNBO0lBQ0Y7QUFDRCJ9