sonamu 0.8.26 → 0.9.0

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 (684) hide show
  1. package/bin/cli.js +60 -13
  2. package/dist/_virtual/rolldown_runtime.js +39 -0
  3. package/dist/ai/agents/agent.d.ts +3 -3
  4. package/dist/ai/agents/agent.d.ts.map +1 -1
  5. package/dist/ai/agents/agent.js +76 -73
  6. package/dist/ai/agents/index.js +3 -3
  7. package/dist/ai/agents/types.d.ts +3 -3
  8. package/dist/ai/agents/types.d.ts.map +1 -1
  9. package/dist/ai/agents/types.js +1 -3
  10. package/dist/ai/index.js +3 -2
  11. package/dist/ai/providers/rtzr/api.js +25 -25
  12. package/dist/ai/providers/rtzr/error.js +25 -26
  13. package/dist/ai/providers/rtzr/index.js +5 -5
  14. package/dist/ai/providers/rtzr/model.d.ts +1 -1
  15. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/model.js +117 -133
  17. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  18. package/dist/ai/providers/rtzr/options.js +35 -41
  19. package/dist/ai/providers/rtzr/provider.d.ts +1 -1
  20. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  21. package/dist/ai/providers/rtzr/provider.js +53 -51
  22. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  23. package/dist/ai/providers/rtzr/utils.js +84 -84
  24. package/dist/api/base-frame.d.ts +2 -2
  25. package/dist/api/base-frame.d.ts.map +1 -1
  26. package/dist/api/base-frame.js +29 -19
  27. package/dist/api/caster.d.ts +1 -1
  28. package/dist/api/caster.d.ts.map +1 -1
  29. package/dist/api/caster.js +51 -61
  30. package/dist/api/code-converters.d.ts +4 -3
  31. package/dist/api/code-converters.d.ts.map +1 -1
  32. package/dist/api/code-converters.js +226 -249
  33. package/dist/api/config.d.ts +17 -17
  34. package/dist/api/config.d.ts.map +1 -1
  35. package/dist/api/config.js +37 -30
  36. package/dist/api/context.d.ts +10 -10
  37. package/dist/api/context.d.ts.map +1 -1
  38. package/dist/api/context.js +8 -2
  39. package/dist/api/decorators.d.ts +8 -8
  40. package/dist/api/decorators.d.ts.map +1 -1
  41. package/dist/api/decorators.js +245 -268
  42. package/dist/api/index.js +39 -7
  43. package/dist/api/secret.js +22 -15
  44. package/dist/api/sonamu.d.ts +15 -15
  45. package/dist/api/sonamu.d.ts.map +1 -1
  46. package/dist/api/sonamu.js +1012 -1131
  47. package/dist/api/validator.js +88 -79
  48. package/dist/auth/auth-generator.d.ts.map +1 -1
  49. package/dist/auth/auth-generator.js +203 -200
  50. package/dist/auth/better-auth-entities.d.ts +2 -2
  51. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  52. package/dist/auth/better-auth-entities.js +369 -429
  53. package/dist/auth/index.js +21 -6
  54. package/dist/auth/knex-adapter.d.ts +2 -2
  55. package/dist/auth/knex-adapter.d.ts.map +1 -1
  56. package/dist/auth/knex-adapter.js +153 -157
  57. package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
  58. package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
  59. package/dist/auth/plugins/entity-definitions/admin.js +58 -56
  60. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
  61. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
  62. package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
  63. package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
  64. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
  65. package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
  66. package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
  67. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  68. package/dist/auth/plugins/entity-definitions/index.js +26 -29
  69. package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
  70. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
  71. package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
  72. package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
  73. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
  74. package/dist/auth/plugins/entity-definitions/organization.js +362 -421
  75. package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
  76. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
  77. package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
  78. package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
  79. package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
  80. package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
  81. package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
  82. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
  83. package/dist/auth/plugins/entity-definitions/sso.js +94 -107
  84. package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
  85. package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
  86. package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
  87. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  88. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  89. package/dist/auth/plugins/entity-definitions/types.js +1 -10
  90. package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
  91. package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
  92. package/dist/auth/plugins/entity-definitions/username.js +31 -40
  93. package/dist/auth/plugins/index.js +12 -3
  94. package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
  95. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  96. package/dist/auth/plugins/wrappers/admin.js +28 -29
  97. package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
  98. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  99. package/dist/auth/plugins/wrappers/anonymous.js +23 -22
  100. package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
  101. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  102. package/dist/auth/plugins/wrappers/api-key.js +39 -34
  103. package/dist/auth/plugins/wrappers/index.js +11 -11
  104. package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
  105. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  106. package/dist/auth/plugins/wrappers/jwt.js +31 -26
  107. package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
  108. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  109. package/dist/auth/plugins/wrappers/organization.js +65 -62
  110. package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
  111. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  112. package/dist/auth/plugins/wrappers/passkey.js +33 -28
  113. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  114. package/dist/auth/plugins/wrappers/phone-number.js +26 -23
  115. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  116. package/dist/auth/plugins/wrappers/sso.js +37 -31
  117. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  118. package/dist/auth/plugins/wrappers/two-factor.js +31 -28
  119. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  120. package/dist/auth/plugins/wrappers/username.js +23 -23
  121. package/dist/bin/build-config.js +31 -31
  122. package/dist/bin/cli.js +1063 -1204
  123. package/dist/bin/fixture.d.ts.map +1 -1
  124. package/dist/bin/fixture.js +266 -259
  125. package/dist/bin/hmr-hook-register.d.ts.map +1 -1
  126. package/dist/bin/hmr-hook-register.js +19 -18
  127. package/dist/bin/test-command.d.ts.map +1 -1
  128. package/dist/bin/test-command.js +180 -177
  129. package/dist/bin/ts-loader-register.js +13 -6
  130. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  131. package/dist/bin/ts-loader-registration.js +28 -38
  132. package/dist/cache/cache-manager.d.ts +1 -1
  133. package/dist/cache/cache-manager.d.ts.map +1 -1
  134. package/dist/cache/cache-manager.js +20 -15
  135. package/dist/cache/decorator.d.ts +1 -1
  136. package/dist/cache/decorator.d.ts.map +1 -1
  137. package/dist/cache/decorator.js +84 -76
  138. package/dist/cache/drivers.js +21 -34
  139. package/dist/cache/index.js +10 -7
  140. package/dist/cache/types.d.ts +2 -2
  141. package/dist/cache/types.d.ts.map +1 -1
  142. package/dist/cache/types.js +1 -6
  143. package/dist/cache-control/cache-control.d.ts +2 -2
  144. package/dist/cache-control/cache-control.d.ts.map +1 -1
  145. package/dist/cache-control/cache-control.js +106 -122
  146. package/dist/cache-control/types.d.ts +2 -2
  147. package/dist/cache-control/types.d.ts.map +1 -1
  148. package/dist/cache-control/types.js +1 -19
  149. package/dist/compress/compress.d.ts +1 -1
  150. package/dist/compress/compress.d.ts.map +1 -1
  151. package/dist/compress/compress.js +58 -56
  152. package/dist/compress/index.js +7 -2
  153. package/dist/compress/types.js +1 -11
  154. package/dist/cone/cone-generator.d.ts +1 -1
  155. package/dist/cone/cone-generator.d.ts.map +1 -1
  156. package/dist/cone/cone-generator.js +216 -219
  157. package/dist/database/_batch_update.d.ts +1 -1
  158. package/dist/database/_batch_update.d.ts.map +1 -1
  159. package/dist/database/_batch_update.js +107 -102
  160. package/dist/database/base-model.d.ts +8 -9
  161. package/dist/database/base-model.d.ts.map +1 -1
  162. package/dist/database/base-model.js +371 -392
  163. package/dist/database/base-model.types.d.ts +5 -5
  164. package/dist/database/base-model.types.d.ts.map +1 -1
  165. package/dist/database/base-model.types.js +1 -20
  166. package/dist/database/db.d.ts +5 -2
  167. package/dist/database/db.d.ts.map +1 -1
  168. package/dist/database/db.js +185 -171
  169. package/dist/database/knex.d.ts +1 -1
  170. package/dist/database/knex.d.ts.map +1 -1
  171. package/dist/database/knex.js +48 -42
  172. package/dist/database/puri-subset.types.d.ts +6 -7
  173. package/dist/database/puri-subset.types.d.ts.map +1 -1
  174. package/dist/database/puri-subset.types.js +1 -16
  175. package/dist/database/puri-wrapper.d.ts +6 -6
  176. package/dist/database/puri-wrapper.d.ts.map +1 -1
  177. package/dist/database/puri-wrapper.js +99 -101
  178. package/dist/database/puri.d.ts +4 -5
  179. package/dist/database/puri.d.ts.map +1 -1
  180. package/dist/database/puri.js +1021 -1227
  181. package/dist/database/puri.types.d.ts +6 -6
  182. package/dist/database/puri.types.d.ts.map +1 -1
  183. package/dist/database/puri.types.js +15 -6
  184. package/dist/database/transaction-context.d.ts +2 -2
  185. package/dist/database/transaction-context.d.ts.map +1 -1
  186. package/dist/database/transaction-context.js +22 -13
  187. package/dist/database/upsert-builder.d.ts +3 -3
  188. package/dist/database/upsert-builder.d.ts.map +1 -1
  189. package/dist/database/upsert-builder.js +405 -465
  190. package/dist/dict/en.js +72 -74
  191. package/dist/dict/index.js +13 -13
  192. package/dist/dict/ko.js +72 -74
  193. package/dist/dict/rc-keys.js +150 -168
  194. package/dist/dict/sd.d.ts +3 -1
  195. package/dist/dict/sd.d.ts.map +1 -1
  196. package/dist/dict/sd.js +54 -40
  197. package/dist/dict/sonamu-dictionary.d.ts +1 -1
  198. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  199. package/dist/dict/sonamu-dictionary.js +887 -955
  200. package/dist/dict/types.js +1 -7
  201. package/dist/dict/utils.js +26 -24
  202. package/dist/entity/entity-manager.d.ts +9 -9
  203. package/dist/entity/entity-manager.d.ts.map +1 -1
  204. package/dist/entity/entity-manager.js +226 -223
  205. package/dist/entity/entity-template-cone.d.ts +1 -1
  206. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  207. package/dist/entity/entity-template-cone.js +152 -151
  208. package/dist/entity/entity.d.ts.map +1 -1
  209. package/dist/entity/entity.js +952 -1089
  210. package/dist/exceptions/error-handler.d.ts +1 -1
  211. package/dist/exceptions/error-handler.d.ts.map +1 -1
  212. package/dist/exceptions/error-handler.js +32 -27
  213. package/dist/exceptions/so-exceptions.d.ts +1 -1
  214. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  215. package/dist/exceptions/so-exceptions.js +61 -68
  216. package/dist/filter/index.js +9 -3
  217. package/dist/filter/types.js +92 -88
  218. package/dist/filter/utils.d.ts +1 -1
  219. package/dist/filter/utils.d.ts.map +1 -1
  220. package/dist/filter/utils.js +147 -161
  221. package/dist/index.js +87 -40
  222. package/dist/logger/category.d.ts.map +1 -1
  223. package/dist/logger/category.js +30 -29
  224. package/dist/logger/configure.d.ts.map +1 -1
  225. package/dist/logger/configure.js +83 -107
  226. package/dist/migration/code-generation.d.ts +2 -2
  227. package/dist/migration/code-generation.d.ts.map +1 -1
  228. package/dist/migration/code-generation.js +1385 -1578
  229. package/dist/migration/migration-set.d.ts +1 -1
  230. package/dist/migration/migration-set.d.ts.map +1 -1
  231. package/dist/migration/migration-set.js +177 -227
  232. package/dist/migration/migrator.d.ts +4 -3
  233. package/dist/migration/migrator.d.ts.map +1 -1
  234. package/dist/migration/migrator.js +340 -345
  235. package/dist/migration/postgresql-schema-reader.d.ts +2 -2
  236. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  237. package/dist/migration/postgresql-schema-reader.js +506 -564
  238. package/dist/migration/slack-confirm.d.ts +2 -2
  239. package/dist/migration/slack-confirm.d.ts.map +1 -1
  240. package/dist/migration/slack-confirm.js +205 -193
  241. package/dist/migration/types.d.ts +2 -2
  242. package/dist/migration/types.d.ts.map +1 -1
  243. package/dist/migration/types.js +1 -3
  244. package/dist/naite/messaging-types.d.ts +1 -0
  245. package/dist/naite/messaging-types.d.ts.map +1 -1
  246. package/dist/naite/messaging-types.js +1 -7
  247. package/dist/naite/naite-reporter.d.ts +2 -2
  248. package/dist/naite/naite-reporter.d.ts.map +1 -1
  249. package/dist/naite/naite-reporter.js +127 -120
  250. package/dist/naite/naite.d.ts +3 -2
  251. package/dist/naite/naite.d.ts.map +1 -1
  252. package/dist/naite/naite.js +266 -300
  253. package/dist/ssr/index.d.ts +2 -2
  254. package/dist/ssr/index.d.ts.map +1 -1
  255. package/dist/ssr/index.js +13 -3
  256. package/dist/ssr/registry.d.ts +1 -1
  257. package/dist/ssr/registry.d.ts.map +1 -1
  258. package/dist/ssr/registry.js +45 -37
  259. package/dist/ssr/renderer.d.ts +4 -4
  260. package/dist/ssr/renderer.d.ts.map +1 -1
  261. package/dist/ssr/renderer.js +84 -91
  262. package/dist/ssr/types.d.ts +2 -2
  263. package/dist/ssr/types.d.ts.map +1 -1
  264. package/dist/ssr/types.js +1 -3
  265. package/dist/storage/base-file.js +54 -41
  266. package/dist/storage/buffered-file.d.ts +2 -2
  267. package/dist/storage/buffered-file.d.ts.map +1 -1
  268. package/dist/storage/buffered-file.js +51 -44
  269. package/dist/storage/drivers.d.ts +2 -2
  270. package/dist/storage/drivers.d.ts.map +1 -1
  271. package/dist/storage/drivers.js +12 -7
  272. package/dist/storage/index.js +14 -7
  273. package/dist/storage/s3-driver.d.ts +2 -2
  274. package/dist/storage/s3-driver.d.ts.map +1 -1
  275. package/dist/storage/s3-driver.js +52 -48
  276. package/dist/storage/storage-manager.d.ts +2 -2
  277. package/dist/storage/storage-manager.d.ts.map +1 -1
  278. package/dist/storage/storage-manager.js +33 -25
  279. package/dist/storage/types.d.ts +2 -2
  280. package/dist/storage/types.d.ts.map +1 -1
  281. package/dist/storage/types.js +1 -5
  282. package/dist/storage/uploaded-file.d.ts +1 -1
  283. package/dist/storage/uploaded-file.d.ts.map +1 -1
  284. package/dist/storage/uploaded-file.js +45 -35
  285. package/dist/stream/index.js +7 -2
  286. package/dist/stream/sse.d.ts +2 -2
  287. package/dist/stream/sse.d.ts.map +1 -1
  288. package/dist/stream/sse.js +72 -67
  289. package/dist/syncer/api-parser.d.ts +1 -1
  290. package/dist/syncer/api-parser.d.ts.map +1 -1
  291. package/dist/syncer/api-parser.js +224 -245
  292. package/dist/syncer/checksum.d.ts +1 -1
  293. package/dist/syncer/checksum.d.ts.map +1 -1
  294. package/dist/syncer/checksum.js +86 -72
  295. package/dist/syncer/code-generator.d.ts +2 -2
  296. package/dist/syncer/code-generator.d.ts.map +1 -1
  297. package/dist/syncer/code-generator.js +154 -160
  298. package/dist/syncer/entity-operations.d.ts +1 -1
  299. package/dist/syncer/entity-operations.d.ts.map +1 -1
  300. package/dist/syncer/entity-operations.js +63 -54
  301. package/dist/syncer/file-patterns.d.ts +1 -1
  302. package/dist/syncer/file-patterns.d.ts.map +1 -1
  303. package/dist/syncer/file-patterns.js +38 -38
  304. package/dist/syncer/index.js +19 -8
  305. package/dist/syncer/module-loader.d.ts +5 -5
  306. package/dist/syncer/module-loader.d.ts.map +1 -1
  307. package/dist/syncer/module-loader.js +83 -78
  308. package/dist/syncer/syncer-actions.d.ts +2 -2
  309. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  310. package/dist/syncer/syncer-actions.js +76 -91
  311. package/dist/syncer/syncer.d.ts +7 -6
  312. package/dist/syncer/syncer.d.ts.map +1 -1
  313. package/dist/syncer/syncer.js +426 -492
  314. package/dist/tasks/decorator.d.ts +3 -3
  315. package/dist/tasks/decorator.d.ts.map +1 -1
  316. package/dist/tasks/decorator.js +32 -28
  317. package/dist/tasks/step-wrapper.d.ts +1 -1
  318. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  319. package/dist/tasks/step-wrapper.js +42 -41
  320. package/dist/tasks/workflow-manager.d.ts +2 -2
  321. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  322. package/dist/tasks/workflow-manager.js +192 -221
  323. package/dist/template/entity-converter.d.ts +1 -1
  324. package/dist/template/entity-converter.d.ts.map +1 -1
  325. package/dist/template/entity-converter.js +103 -103
  326. package/dist/template/helpers.d.ts.map +1 -1
  327. package/dist/template/helpers.js +163 -163
  328. package/dist/template/implementations/entity.template.d.ts +1 -1
  329. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  330. package/dist/template/implementations/entity.template.js +76 -85
  331. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  332. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  333. package/dist/template/implementations/entry-server.template.js +32 -27
  334. package/dist/template/implementations/generated.template.d.ts +1 -1
  335. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  336. package/dist/template/implementations/generated.template.js +254 -275
  337. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  338. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  339. package/dist/template/implementations/generated_http.template.js +114 -133
  340. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  341. package/dist/template/implementations/generated_sso.template.js +249 -275
  342. package/dist/template/implementations/init_types.template.d.ts +1 -1
  343. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  344. package/dist/template/implementations/init_types.template.js +40 -34
  345. package/dist/template/implementations/model.template.d.ts +1 -1
  346. package/dist/template/implementations/model.template.d.ts.map +1 -1
  347. package/dist/template/implementations/model.template.js +56 -53
  348. package/dist/template/implementations/model_test.template.d.ts +1 -1
  349. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  350. package/dist/template/implementations/model_test.template.js +32 -24
  351. package/dist/template/implementations/queries.template.d.ts +1 -1
  352. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  353. package/dist/template/implementations/queries.template.js +84 -89
  354. package/dist/template/implementations/sd.template.d.ts +1 -1
  355. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  356. package/dist/template/implementations/sd.template.js +137 -144
  357. package/dist/template/implementations/services.template.d.ts +1 -1
  358. package/dist/template/implementations/services.template.d.ts.map +1 -1
  359. package/dist/template/implementations/services.template.js +164 -189
  360. package/dist/template/implementations/view_form.template.d.ts +1 -1
  361. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  362. package/dist/template/implementations/view_form.template.js +258 -285
  363. package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
  364. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  365. package/dist/template/implementations/view_id_all_select.template.js +31 -25
  366. package/dist/template/implementations/view_list.template.d.ts +1 -1
  367. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  368. package/dist/template/implementations/view_list.template.js +304 -355
  369. package/dist/template/implementations/view_search_input.template.d.ts +1 -1
  370. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  371. package/dist/template/implementations/view_search_input.template.js +31 -27
  372. package/dist/template/index.js +21 -7
  373. package/dist/template/template-manager.d.ts +1 -1
  374. package/dist/template/template-manager.d.ts.map +1 -1
  375. package/dist/template/template-manager.js +132 -123
  376. package/dist/template/template-types.js +8 -6
  377. package/dist/template/template.d.ts +2 -2
  378. package/dist/template/template.d.ts.map +1 -1
  379. package/dist/template/template.js +73 -68
  380. package/dist/template/zod-converter.d.ts.map +1 -1
  381. package/dist/template/zod-converter.js +603 -657
  382. package/dist/testing/_relation-graph.d.ts +1 -1
  383. package/dist/testing/_relation-graph.d.ts.map +1 -1
  384. package/dist/testing/_relation-graph.js +93 -88
  385. package/dist/testing/bootstrap.d.ts +22 -13
  386. package/dist/testing/bootstrap.d.ts.map +1 -1
  387. package/dist/testing/bootstrap.js +114 -114
  388. package/dist/testing/data-explorer.d.ts +3 -3
  389. package/dist/testing/data-explorer.d.ts.map +1 -1
  390. package/dist/testing/data-explorer.js +237 -265
  391. package/dist/testing/dev-test-routes.d.ts +2 -2
  392. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  393. package/dist/testing/dev-test-routes.js +258 -249
  394. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  395. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  396. package/dist/testing/dev-vitest-manager.js +514 -539
  397. package/dist/testing/faker-mappings.js +422 -420
  398. package/dist/testing/fixture-generator.d.ts +3 -3
  399. package/dist/testing/fixture-generator.d.ts.map +1 -1
  400. package/dist/testing/fixture-generator.js +1216 -1346
  401. package/dist/testing/fixture-loader.js +26 -25
  402. package/dist/testing/fixture-manager.d.ts +3 -3
  403. package/dist/testing/fixture-manager.d.ts.map +1 -1
  404. package/dist/testing/fixture-manager.js +706 -776
  405. package/dist/testing/global-setup.js +53 -49
  406. package/dist/testing/index.js +19 -11
  407. package/dist/testing/naite-vitest-reporter.js +18 -13
  408. package/dist/testing/parallel-db-manager.d.ts +1 -1
  409. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  410. package/dist/testing/parallel-db-manager.js +63 -78
  411. package/dist/testing/vitest-helpers.d.ts +1 -1
  412. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  413. package/dist/testing/vitest-helpers.js +37 -33
  414. package/dist/types/types.d.ts +28 -28
  415. package/dist/types/types.d.ts.map +1 -1
  416. package/dist/types/types.js +764 -890
  417. package/dist/ui/ai-api.d.ts +1 -1
  418. package/dist/ui/ai-api.d.ts.map +1 -1
  419. package/dist/ui/ai-api.js +52 -42
  420. package/dist/ui/ai-client.d.ts +1 -2
  421. package/dist/ui/ai-client.d.ts.map +1 -1
  422. package/dist/ui/ai-client.js +353 -388
  423. package/dist/ui/api.d.ts +1 -1
  424. package/dist/ui/api.d.ts.map +1 -1
  425. package/dist/ui/api.js +903 -1145
  426. package/dist/ui/cdd-service.d.ts +1 -1
  427. package/dist/ui/cdd-service.d.ts.map +1 -1
  428. package/dist/ui/cdd-service.js +406 -407
  429. package/dist/ui/cdd-types.js +1 -3
  430. package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
  431. package/dist/ui-web/assets/index-DejDON8K.js +238 -0
  432. package/dist/ui-web/index.html +3 -3
  433. package/dist/utils/async-utils.js +57 -45
  434. package/dist/utils/console-util.d.ts.map +1 -1
  435. package/dist/utils/console-util.js +104 -87
  436. package/dist/utils/controller.js +26 -19
  437. package/dist/utils/esm-utils.js +49 -38
  438. package/dist/utils/formatter.d.ts +1 -2
  439. package/dist/utils/formatter.d.ts.map +1 -1
  440. package/dist/utils/formatter.js +89 -115
  441. package/dist/utils/fs-utils.d.ts.map +1 -1
  442. package/dist/utils/fs-utils.js +68 -65
  443. package/dist/utils/lodash-able.js +11 -4
  444. package/dist/utils/model.d.ts +1 -1
  445. package/dist/utils/model.d.ts.map +1 -1
  446. package/dist/utils/model.js +21 -19
  447. package/dist/utils/object-utils.js +148 -186
  448. package/dist/utils/path-utils.js +67 -57
  449. package/dist/utils/process-utils.d.ts.map +1 -1
  450. package/dist/utils/process-utils.js +37 -31
  451. package/dist/utils/sql-parser.d.ts +1 -1
  452. package/dist/utils/sql-parser.d.ts.map +1 -1
  453. package/dist/utils/sql-parser.js +40 -40
  454. package/dist/utils/type-utils.js +44 -43
  455. package/dist/utils/utils.d.ts +2 -3
  456. package/dist/utils/utils.d.ts.map +1 -1
  457. package/dist/utils/utils.js +81 -93
  458. package/dist/utils/zod-error.d.ts +1 -1
  459. package/dist/utils/zod-error.d.ts.map +1 -1
  460. package/dist/utils/zod-error.js +24 -17
  461. package/dist/vector/chunking.d.ts +1 -1
  462. package/dist/vector/chunking.d.ts.map +1 -1
  463. package/dist/vector/chunking.js +100 -94
  464. package/dist/vector/config.d.ts +1 -1
  465. package/dist/vector/config.d.ts.map +1 -1
  466. package/dist/vector/config.js +76 -78
  467. package/dist/vector/embedding.d.ts +1 -1
  468. package/dist/vector/embedding.d.ts.map +1 -1
  469. package/dist/vector/embedding.js +128 -125
  470. package/dist/vector/index.js +5 -5
  471. package/dist/vector/types.js +1 -5
  472. package/package.json +31 -36
  473. package/src/ai/agents/agent.ts +12 -5
  474. package/src/ai/agents/types.ts +5 -5
  475. package/src/ai/providers/rtzr/model.ts +8 -10
  476. package/src/ai/providers/rtzr/options.ts +2 -1
  477. package/src/ai/providers/rtzr/provider.ts +5 -3
  478. package/src/ai/providers/rtzr/utils.ts +2 -7
  479. package/src/api/__tests__/config.test.ts +15 -8
  480. package/src/api/base-frame.ts +5 -3
  481. package/src/api/caster.ts +7 -6
  482. package/src/api/code-converters.ts +23 -26
  483. package/src/api/config.ts +23 -17
  484. package/src/api/context.ts +18 -11
  485. package/src/api/decorators.ts +17 -18
  486. package/src/api/sonamu.ts +44 -49
  487. package/src/auth/auth-generator.ts +4 -6
  488. package/src/auth/better-auth-entities.ts +3 -2
  489. package/src/auth/knex-adapter.ts +6 -5
  490. package/src/auth/plugins/entity-definitions/admin.ts +1 -1
  491. package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
  492. package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
  493. package/src/auth/plugins/entity-definitions/index.ts +1 -1
  494. package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
  495. package/src/auth/plugins/entity-definitions/organization.ts +1 -1
  496. package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
  497. package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
  498. package/src/auth/plugins/entity-definitions/sso.ts +1 -1
  499. package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
  500. package/src/auth/plugins/entity-definitions/types.ts +1 -1
  501. package/src/auth/plugins/entity-definitions/username.ts +1 -1
  502. package/src/auth/plugins/wrappers/admin.ts +3 -1
  503. package/src/auth/plugins/wrappers/anonymous.ts +3 -1
  504. package/src/auth/plugins/wrappers/api-key.ts +3 -1
  505. package/src/auth/plugins/wrappers/jwt.ts +3 -1
  506. package/src/auth/plugins/wrappers/organization.ts +3 -1
  507. package/src/auth/plugins/wrappers/passkey.ts +3 -1
  508. package/src/auth/plugins/wrappers/phone-number.ts +3 -1
  509. package/src/auth/plugins/wrappers/sso.ts +2 -1
  510. package/src/auth/plugins/wrappers/two-factor.ts +3 -1
  511. package/src/auth/plugins/wrappers/username.ts +3 -1
  512. package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
  513. package/src/bin/build-config.ts +3 -3
  514. package/src/bin/cli.ts +27 -25
  515. package/src/bin/fixture.ts +4 -2
  516. package/src/bin/hmr-hook-register.ts +1 -0
  517. package/src/bin/test-command.ts +4 -2
  518. package/src/bin/ts-loader-registration.ts +6 -22
  519. package/src/cache/cache-manager.ts +2 -1
  520. package/src/cache/decorator.ts +2 -2
  521. package/src/cache/types.ts +3 -3
  522. package/src/cache-control/cache-control.ts +3 -2
  523. package/src/cache-control/types.ts +2 -2
  524. package/src/compress/compress.ts +1 -1
  525. package/src/cone/cone-generator.ts +5 -3
  526. package/src/database/_batch_update.ts +1 -1
  527. package/src/database/base-model.ts +20 -14
  528. package/src/database/base-model.types.ts +12 -11
  529. package/src/database/db.ts +56 -21
  530. package/src/database/knex.ts +2 -2
  531. package/src/database/puri-subset.test-d.ts +33 -32
  532. package/src/database/puri-subset.types.ts +6 -7
  533. package/src/database/puri-wrapper.ts +29 -26
  534. package/src/database/puri.ts +36 -34
  535. package/src/database/puri.types.test-d.ts +6 -5
  536. package/src/database/puri.types.ts +9 -12
  537. package/src/database/transaction-context.ts +2 -2
  538. package/src/database/upsert-builder.ts +17 -10
  539. package/src/dict/sd.ts +17 -4
  540. package/src/dict/sonamu-dictionary.ts +23 -17
  541. package/src/entity/entity-manager.ts +9 -7
  542. package/src/entity/entity-template-cone.ts +10 -3
  543. package/src/entity/entity.ts +20 -16
  544. package/src/exceptions/error-handler.ts +2 -1
  545. package/src/exceptions/so-exceptions.ts +1 -1
  546. package/src/filter/utils.ts +3 -2
  547. package/src/logger/category.ts +1 -0
  548. package/src/logger/configure.ts +5 -5
  549. package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
  550. package/src/migration/code-generation.ts +26 -25
  551. package/src/migration/migration-set.ts +16 -18
  552. package/src/migration/migrator.ts +38 -33
  553. package/src/migration/postgresql-schema-reader.ts +12 -12
  554. package/src/migration/slack-confirm.ts +5 -4
  555. package/src/migration/types.ts +2 -2
  556. package/src/naite/messaging-types.ts +1 -1
  557. package/src/naite/naite-reporter.ts +5 -3
  558. package/src/naite/naite.ts +12 -7
  559. package/src/shared/app.shared.ts.txt +2 -2
  560. package/src/shared/web.shared.ts.txt +2 -2
  561. package/src/skills/AGENTS.md +19 -18
  562. package/src/skills/commands/sonamu-skills.md +9 -9
  563. package/src/skills/sonamu/SKILL.md +111 -104
  564. package/src/skills/sonamu/ai-agents.md +27 -26
  565. package/src/skills/sonamu/api.md +81 -69
  566. package/src/skills/sonamu/auth-migration.md +13 -27
  567. package/src/skills/sonamu/auth-plugins.md +41 -31
  568. package/src/skills/sonamu/auth.md +30 -24
  569. package/src/skills/sonamu/cdd.md +26 -17
  570. package/src/skills/sonamu/cone.md +50 -50
  571. package/src/skills/sonamu/config.md +74 -51
  572. package/src/skills/sonamu/create-sonamu.md +31 -19
  573. package/src/skills/sonamu/database.md +43 -26
  574. package/src/skills/sonamu/entity-basic.md +61 -61
  575. package/src/skills/sonamu/entity-relations.md +84 -80
  576. package/src/skills/sonamu/entity-validation-checklist.md +19 -15
  577. package/src/skills/sonamu/fixture-cli.md +52 -30
  578. package/src/skills/sonamu/framework-change.md +9 -7
  579. package/src/skills/sonamu/frontend.md +64 -82
  580. package/src/skills/sonamu/i18n.md +45 -37
  581. package/src/skills/sonamu/migration.md +54 -31
  582. package/src/skills/sonamu/model.md +98 -66
  583. package/src/skills/sonamu/naite.md +34 -32
  584. package/src/skills/sonamu/project-init.md +28 -8
  585. package/src/skills/sonamu/puri.md +82 -91
  586. package/src/skills/sonamu/scaffolding.md +44 -32
  587. package/src/skills/sonamu/skill-contribution.md +50 -45
  588. package/src/skills/sonamu/subset.md +13 -13
  589. package/src/skills/sonamu/tasks.md +73 -58
  590. package/src/skills/sonamu/testing-devrunner.md +56 -36
  591. package/src/skills/sonamu/testing.md +23 -58
  592. package/src/skills/sonamu/upsert.md +32 -31
  593. package/src/skills/sonamu/vector.md +37 -36
  594. package/src/ssr/index.ts +2 -12
  595. package/src/ssr/registry.ts +1 -1
  596. package/src/ssr/renderer.ts +7 -5
  597. package/src/ssr/types.ts +2 -2
  598. package/src/storage/buffered-file.ts +4 -2
  599. package/src/storage/drivers.ts +3 -2
  600. package/src/storage/s3-driver.ts +7 -4
  601. package/src/storage/storage-manager.ts +3 -2
  602. package/src/storage/types.ts +3 -2
  603. package/src/storage/uploaded-file.ts +1 -1
  604. package/src/stream/sse.ts +2 -2
  605. package/src/syncer/api-parser.ts +8 -5
  606. package/src/syncer/checksum.ts +9 -5
  607. package/src/syncer/code-generator.ts +16 -8
  608. package/src/syncer/entity-operations.ts +5 -3
  609. package/src/syncer/file-patterns.ts +2 -1
  610. package/src/syncer/module-loader.ts +9 -6
  611. package/src/syncer/syncer-actions.ts +5 -3
  612. package/src/syncer/syncer.ts +18 -24
  613. package/src/tasks/decorator.ts +10 -8
  614. package/src/tasks/step-wrapper.ts +1 -1
  615. package/src/tasks/workflow-manager.ts +18 -15
  616. package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
  617. package/src/template/entity-converter.ts +4 -2
  618. package/src/template/generated.template.test-d.ts +2 -1
  619. package/src/template/helpers.ts +5 -2
  620. package/src/template/implementations/entity.template.ts +9 -8
  621. package/src/template/implementations/entry-server.template.ts +1 -1
  622. package/src/template/implementations/generated.template.ts +21 -29
  623. package/src/template/implementations/generated_http.template.ts +9 -6
  624. package/src/template/implementations/generated_sso.template.ts +6 -4
  625. package/src/template/implementations/init_types.template.ts +3 -2
  626. package/src/template/implementations/model.template.ts +4 -2
  627. package/src/template/implementations/model_test.template.ts +3 -2
  628. package/src/template/implementations/queries.template.ts +6 -14
  629. package/src/template/implementations/sd.template.ts +4 -2
  630. package/src/template/implementations/services.template.ts +7 -11
  631. package/src/template/implementations/view_form.template.ts +5 -3
  632. package/src/template/implementations/view_id_all_select.template.ts +3 -2
  633. package/src/template/implementations/view_list.template.ts +7 -5
  634. package/src/template/implementations/view_search_input.template.ts +3 -2
  635. package/src/template/template-manager.ts +4 -3
  636. package/src/template/template.ts +4 -3
  637. package/src/template/zod-converter.ts +10 -7
  638. package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
  639. package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
  640. package/src/testing/_relation-graph.ts +2 -2
  641. package/src/testing/bootstrap.ts +55 -27
  642. package/src/testing/data-explorer.ts +5 -4
  643. package/src/testing/dev-test-routes.ts +8 -5
  644. package/src/testing/dev-vitest-manager.ts +13 -12
  645. package/src/testing/fixture-generator.ts +11 -17
  646. package/src/testing/fixture-manager.ts +21 -17
  647. package/src/testing/parallel-db-manager.ts +2 -1
  648. package/src/testing/vitest-helpers.ts +2 -1
  649. package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
  650. package/src/types/types.ts +8 -8
  651. package/src/typings/knex.d.ts +4 -4
  652. package/src/ui/ai-api.ts +5 -3
  653. package/src/ui/ai-client.ts +6 -5
  654. package/src/ui/api.ts +25 -23
  655. package/src/ui/cdd-service.ts +12 -11
  656. package/src/utils/console-util.ts +3 -1
  657. package/src/utils/formatter.ts +94 -102
  658. package/src/utils/fs-utils.ts +2 -1
  659. package/src/utils/model.ts +2 -2
  660. package/src/utils/object-utils.ts +3 -3
  661. package/src/utils/process-utils.ts +2 -1
  662. package/src/utils/sql-parser.ts +10 -1
  663. package/src/utils/type-utils.ts +3 -3
  664. package/src/utils/utils.ts +9 -7
  665. package/src/utils/zod-error.ts +1 -1
  666. package/src/vector/chunking.ts +1 -1
  667. package/src/vector/config.ts +1 -1
  668. package/src/vector/embedding.ts +11 -9
  669. package/tsdown.api.config.ts +50 -0
  670. package/.swcrc.project-default +0 -18
  671. package/dist/api/__tests__/config.test.js +0 -189
  672. package/dist/bin/__tests__/test-command.test.js +0 -112
  673. package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
  674. package/dist/database/puri-subset.test-d.js +0 -89
  675. package/dist/database/puri.types.test-d.js +0 -129
  676. package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
  677. package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
  678. package/dist/template/generated.template.test-d.js +0 -24
  679. package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
  680. package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
  681. package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
  682. package/dist/typings/knex.d.js +0 -3
  683. package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
  684. package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
@@ -1,228 +1,214 @@
1
- import assert from "assert";
1
+ import { init_utils, nonNullable } from "../../utils/utils.js";
2
+ import { Sonamu } from "../../api/sonamu.js";
3
+ import { init_types, isVirtualCodeProp, isVirtualQueryProp } from "../../types/types.js";
4
+ import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
5
+ import { Naite, init_naite } from "../../naite/naite.js";
6
+ import { init_api } from "../../api/index.js";
7
+ import { Template, init_template } from "../template.js";
8
+ import { BUILT_IN_TYPES, init_zod_converter, propNodeToZodTypeDef, zodTypeToZodCode } from "../zod-converter.js";
2
9
  import { unique } from "radashi";
3
- import { Sonamu } from "../../api/index.js";
4
- import { EntityManager } from "../../entity/entity-manager.js";
5
- import { Naite } from "../../naite/naite.js";
6
- import { isVirtualCodeProp, isVirtualQueryProp } from "../../types/types.js";
7
- import { nonNullable } from "../../utils/utils.js";
8
- import { Template } from "../template.js";
9
- import { BUILT_IN_TYPES, propNodeToZodTypeDef, zodTypeToZodCode } from "../zod-converter.js";
10
- export class Template__generated extends Template {
11
- constructor(){
12
- super("generated");
13
- }
14
- getTargetAndPath() {
15
- const { dir } = Sonamu.config.api;
16
- return {
17
- target: `${dir}/src/application`,
18
- path: `sonamu.generated.ts`
19
- };
20
- }
21
- render() {
22
- const entityIds = EntityManager.getAllIds();
23
- const entities = entityIds.map((id)=>EntityManager.get(id));
24
- // 전체 SourceCode 생성
25
- const sourceCodes = entities.flatMap((entity)=>{
26
- return [
27
- this.getEnumsSourceCode(entity),
28
- this.getBaseSchemaSourceCode(entity),
29
- this.getBaseListParamsSourceCode(entity),
30
- this.getSubsetSourceCode(entity)
31
- ].filter(nonNullable);
32
- });
33
- Naite.t("Template__generated:sourceCodes", sourceCodes);
34
- // Sort
35
- const LABEL_KEY_ORDER = [
36
- "Enums",
37
- "BaseSchema",
38
- "BaseListParams",
39
- "Subsets",
40
- "SubsetQueries"
41
- ];
42
- sourceCodes.sort((a, b)=>{
43
- const [aKey] = a.label.split(":");
44
- const [bKey] = b.label.split(":");
45
- const aIndex = LABEL_KEY_ORDER.indexOf(aKey);
46
- const bIndex = LABEL_KEY_ORDER.indexOf(bKey);
47
- if (aIndex > bIndex) {
48
- return 1;
49
- } else if (aIndex < bIndex) {
50
- return -1;
51
- } else {
52
- return 0;
53
- }
54
- });
55
- const sourceCode = sourceCodes.reduce((result, ts)=>{
56
- if (ts === null) {
57
- return result;
58
- }
59
- return {
60
- lines: [
61
- ...result.lines,
62
- `// ${ts.label}`,
63
- ...ts.lines,
64
- ""
65
- ],
66
- importKeys: unique([
67
- ...result.importKeys,
68
- ...ts.importKeys
69
- ].sort())
70
- };
71
- }, {
72
- lines: [],
73
- importKeys: []
74
- });
75
- // .types.ts의 타입을 참조하는 경우 순환참조(상호참조) 발생하므로 타입을 가져와 인라인 처리
76
- const allTypeKeys = entities.flatMap((entity)=>Object.keys(entity.types));
77
- const cdImportKeys = sourceCode.importKeys.filter((importKey)=>allTypeKeys.includes(importKey));
78
- if (cdImportKeys.length > 0) {
79
- const customScalarLines = cdImportKeys.flatMap((importKey)=>{
80
- const entity = entities.find((entity)=>entity.types[importKey]);
81
- if (!entity) {
82
- throw new Error(`ZodType not found ${importKey}`);
83
- }
84
- const zodType = entity.types[importKey];
85
- assert(zodType);
86
- return [
87
- `// CustomScalar: ${importKey}`,
88
- `const ${importKey} = ${zodTypeToZodCode(zodType)};`,
89
- `type ${importKey} = z.infer<typeof ${importKey}>`,
90
- ""
91
- ];
92
- });
93
- sourceCode.lines = [
94
- ...customScalarLines,
95
- ...sourceCode.lines
96
- ];
97
- sourceCode.importKeys = sourceCode.importKeys.filter((importKey)=>!cdImportKeys.includes(importKey));
98
- }
99
- const body = sourceCode.lines.join("\n");
100
- Naite.t("Template__generated:body", body);
101
- // import
102
- // sourceCode.importKeys에 내장 타입의 스키마가 있으면 sonamu import에 추가
103
- const builtInSchemaNames = Object.values(BUILT_IN_TYPES).map((info)=>info.schemaName);
104
- const builtInSchemas = sourceCode.importKeys.filter((key)=>builtInSchemaNames.includes(key));
105
- const sonamuImports = [
106
- "zArrayable",
107
- "SQLDateTimeString",
108
- "SubsetQuery",
109
- "SonamuQueryMode",
110
- "ApplySonamuFilter",
111
- ...builtInSchemas
112
- ].filter((mod)=>body.includes(mod));
113
- return {
114
- ...this.getTargetAndPath(),
115
- body,
116
- importKeys: sourceCode.importKeys,
117
- customHeaders: [
118
- "/**",
119
- " * @generated",
120
- " * 직접 수정하지 마세요.",
121
- " */",
122
- "/** biome-ignore-all lint: generated는 무시 */",
123
- "/** biome-ignore-all assist: generated는 무시 */",
124
- "/** biome-ignore-all format: generated는 무시 */",
125
- "",
126
- `import { z } from 'zod';`,
127
- `import { ${sonamuImports.join(",")} } from "sonamu";`
128
- ]
129
- };
130
- }
131
- getEnumsSourceCode(entity) {
132
- if (Object.keys(entity.enumLabels).length === 0) {
133
- return null;
134
- }
135
- return {
136
- label: `Enums: ${entity.id}`,
137
- lines: [
138
- ...Object.entries(entity.enumLabels).filter(([_, enumLabel])=>Object.keys(enumLabel).length > 0).flatMap(([enumId, enumLabel])=>[
139
- `export const ${enumId} = z.enum([${Object.keys(enumLabel).map((el)=>`"${el}"`)}]).describe("${enumId}");`,
140
- `export type ${enumId} = z.infer<typeof ${enumId}>;`,
141
- `export const ${enumId}Label = ${JSON.stringify(enumLabel)};`
142
- ])
143
- ],
144
- importKeys: []
145
- };
146
- }
147
- getBaseSchemaSourceCode(entity, importKeys = []) {
148
- const schemaName = `${entity.names.module}BaseSchema`;
149
- const propNode = {
150
- nodeType: "object",
151
- children: entity.props.map((prop)=>{
152
- return {
153
- nodeType: "plain",
154
- prop
155
- };
156
- })
157
- };
158
- const schemaBody = (()=>{
159
- const result = propNodeToZodTypeDef(propNode, importKeys);
160
- if (result.endsWith(",")) {
161
- return result.slice(0, -1);
162
- }
163
- return result;
164
- })();
165
- // fulltext index에 포함된 컬럼들 추출
166
- // TODO: GIN/GiST 인덱스 생성된 컬럼 추출
167
- const fulltextColumns = [];
168
- // virtual props (virtualType: "code" 또는 undefined인 것만 포함)
169
- const virtualProps = entity.props.filter((prop)=>isVirtualCodeProp(prop)).map((prop)=>prop.name);
170
- // query virtual props (virtualType: "query"인 것만 포함)
171
- const virtualQueryProps = entity.props.filter((prop)=>isVirtualQueryProp(prop)).map((prop)=>prop.name);
172
- /**
173
- * hasDefault props
174
- * - nullable 또는 dbDefault가 있는 컬럼 (id 포함)
175
- * - relation이 아니거나, relation이어도 nullable이면 포함
176
- */ const hasDefaultColumns = entity.props.filter((prop)=>(prop.type !== "relation" || prop.nullable === true) && (prop.nullable === true || prop.type !== "relation" && prop.dbDefault !== undefined)).map((prop)=>prop.type === "relation" ? `${prop.name}_id` : prop.name).concat("id");
177
- /**
178
- * hasVector props
179
- * - vector 타입인 컬럼
180
- */ const hasVectorColumns = entity.props.filter((prop)=>prop.type === "vector" || prop.type === "vector[]").map((prop)=>prop.name);
181
- /**
182
- * generated props
183
- * - generated 속성이 있는 컬럼 (INSERT/UPDATE 제공 불가)
184
- */ const generatedColumns = entity.props.filter((prop)=>prop.type !== "relation" && (prop.generated !== undefined || prop.type === "searchText")).map((prop)=>prop.name);
185
- const hasMetadata = fulltextColumns.length > 0 || virtualProps.length > 0 || virtualQueryProps.length > 0 || hasDefaultColumns.length > 0 || generatedColumns.length > 0 || hasVectorColumns.length > 0;
186
- const lines = [
187
- `export const ${schemaName} = ${schemaBody};`,
188
- `export type ${schemaName} = z.infer<typeof ${schemaName}>` + (hasMetadata ? ` & {${(fulltextColumns.length > 0 ? `readonly __fulltext__: readonly [${fulltextColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (virtualProps.length > 0 ? `readonly __virtual__: readonly [${virtualProps.map((prop)=>`"${prop}"`).join(", ")}],` : "") + (virtualQueryProps.length > 0 ? `readonly __virtual_query__: readonly [${virtualQueryProps.map((prop)=>`"${prop}"`).join(", ")}],` : "") + (hasDefaultColumns.length > 0 ? `readonly __hasDefault__: readonly [${hasDefaultColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (generatedColumns.length > 0 ? `readonly __generated__: readonly [${generatedColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (hasVectorColumns.length > 0 ? `readonly __vector__: readonly [${hasVectorColumns.map((col)=>`"${col}"`).join(", ")}],` : "")}}` : "") + ";"
189
- ];
190
- return {
191
- label: `BaseSchema: ${entity.id}`,
192
- importKeys,
193
- lines
194
- };
195
- }
196
- getBaseListParamsSourceCode(entity) {
197
- // Prop 없는 MD인 경우 생성 제외
198
- if (entity.props.length === 0) {
199
- return null;
200
- } else if (entity.parentId !== undefined) {
201
- return null;
202
- }
203
- const schemaName = `${entity.names.module}BaseListParams`;
204
- const filterProps = entity.props.filter((prop)=>prop.toFilter === true);
205
- const propNodes = filterProps.map((prop)=>{
206
- return {
207
- nodeType: "plain",
208
- prop,
209
- children: []
210
- };
211
- });
212
- const importKeys = [];
213
- const filterBody = propNodes.map((propNode)=>propNodeToZodTypeDef(propNode, importKeys)).join("\n");
214
- // FilterQuery 타입을 위한 제외할 props 추출 (virtual만 제외)
215
- const excludedProps = entity.props.filter((p)=>p.type === "virtual").map((p)=>p.name);
216
- // numeric 타입인 props 추출
217
- const numericProps = entity.props.filter((p)=>p.type === "numeric");
218
- // ApplySonamuFilter 타입 인자 생성
219
- const entityType = `${entity.id}BaseSchema`;
220
- const numericKeysUnion = numericProps.length > 0 ? numericProps.map((prop)=>`"${prop.name}"`).join(" | ") : "never";
221
- const omitKeysUnion = excludedProps.length > 0 ? excludedProps.map((n)=>`"${n}"`).join(" | ") : "never";
222
- // PK 타입에 따른 id Zod 타입 결정
223
- const pkType = entity.getPkType();
224
- const idZodType = pkType === "string" || pkType === "uuid" ? "zArrayable(z.string())" : "zArrayable(z.number().int().positive())";
225
- const schemaBody = `
10
+ import assert from "assert";
11
+
12
+ //#region src/template/implementations/generated.template.ts
13
+ init_api();
14
+ init_entity_manager();
15
+ init_naite();
16
+ init_types();
17
+ init_utils();
18
+ init_template();
19
+ init_zod_converter();
20
+ var Template__generated = class extends Template {
21
+ constructor() {
22
+ super("generated");
23
+ }
24
+ getTargetAndPath() {
25
+ const { dir } = Sonamu.config.api;
26
+ return {
27
+ target: `${dir}/src/application`,
28
+ path: `sonamu.generated.ts`
29
+ };
30
+ }
31
+ render() {
32
+ const entityIds = EntityManager.getAllIds();
33
+ const entities = entityIds.map((id) => EntityManager.get(id));
34
+ const sourceCodes = entities.flatMap((entity) => {
35
+ return [
36
+ this.getEnumsSourceCode(entity),
37
+ this.getBaseSchemaSourceCode(entity),
38
+ this.getBaseListParamsSourceCode(entity),
39
+ this.getSubsetSourceCode(entity)
40
+ ].filter(nonNullable);
41
+ });
42
+ Naite.t("Template__generated:sourceCodes", sourceCodes);
43
+ const LABEL_KEY_ORDER = [
44
+ "Enums",
45
+ "BaseSchema",
46
+ "BaseListParams",
47
+ "Subsets",
48
+ "SubsetQueries"
49
+ ];
50
+ sourceCodes.sort((a, b) => {
51
+ const [aKey] = a.label.split(":");
52
+ const [bKey] = b.label.split(":");
53
+ const aIndex = LABEL_KEY_ORDER.indexOf(aKey);
54
+ const bIndex = LABEL_KEY_ORDER.indexOf(bKey);
55
+ if (aIndex > bIndex) {
56
+ return 1;
57
+ } else if (aIndex < bIndex) {
58
+ return -1;
59
+ } else {
60
+ return 0;
61
+ }
62
+ });
63
+ const sourceCode = sourceCodes.reduce((result, ts) => {
64
+ if (ts === null) {
65
+ return result;
66
+ }
67
+ return {
68
+ lines: [
69
+ ...result.lines,
70
+ `// ${ts.label}`,
71
+ ...ts.lines,
72
+ ""
73
+ ],
74
+ importKeys: unique([...result.importKeys, ...ts.importKeys].toSorted())
75
+ };
76
+ }, {
77
+ lines: [],
78
+ importKeys: []
79
+ });
80
+ const allTypeKeys = entities.flatMap((entity) => Object.keys(entity.types));
81
+ const cdImportKeys = sourceCode.importKeys.filter((importKey) => allTypeKeys.includes(importKey));
82
+ if (cdImportKeys.length > 0) {
83
+ const customScalarLines = cdImportKeys.flatMap((importKey) => {
84
+ const entity = entities.find((entity$1) => entity$1.types[importKey]);
85
+ if (!entity) {
86
+ throw new Error(`ZodType not found ${importKey}`);
87
+ }
88
+ const zodType = entity.types[importKey];
89
+ assert(zodType);
90
+ return [
91
+ `// CustomScalar: ${importKey}`,
92
+ `const ${importKey} = ${zodTypeToZodCode(zodType)};`,
93
+ `type ${importKey} = z.infer<typeof ${importKey}>`,
94
+ ""
95
+ ];
96
+ });
97
+ sourceCode.lines = [...customScalarLines, ...sourceCode.lines];
98
+ sourceCode.importKeys = sourceCode.importKeys.filter((importKey) => !cdImportKeys.includes(importKey));
99
+ }
100
+ const body = sourceCode.lines.join("\n");
101
+ Naite.t("Template__generated:body", body);
102
+ const builtInSchemaNames = Object.values(BUILT_IN_TYPES).map((info) => info.schemaName);
103
+ const builtInSchemas = sourceCode.importKeys.filter((key) => builtInSchemaNames.includes(key));
104
+ const sonamuImports = [
105
+ "zArrayable",
106
+ "SQLDateTimeString",
107
+ "SubsetQuery",
108
+ "SonamuQueryMode",
109
+ "ApplySonamuFilter",
110
+ ...builtInSchemas
111
+ ].filter((mod) => body.includes(mod));
112
+ return {
113
+ ...this.getTargetAndPath(),
114
+ body,
115
+ importKeys: sourceCode.importKeys,
116
+ customHeaders: [
117
+ "/**",
118
+ " * @generated",
119
+ " * 직접 수정하지 마세요.",
120
+ " */",
121
+ "/* oxlint-disable */",
122
+ "",
123
+ `import { z } from 'zod';`,
124
+ `import { ${sonamuImports.join(",")} } from "sonamu";`
125
+ ]
126
+ };
127
+ }
128
+ getEnumsSourceCode(entity) {
129
+ if (Object.keys(entity.enumLabels).length === 0) {
130
+ return null;
131
+ }
132
+ return {
133
+ label: `Enums: ${entity.id}`,
134
+ lines: Object.entries(entity.enumLabels).filter(([_, enumLabel]) => Object.keys(enumLabel).length > 0).flatMap(([enumId, enumLabel]) => [
135
+ `export const ${enumId} = z.enum([${Object.keys(enumLabel).map((el) => `"${el}"`)}]).describe("${enumId}");`,
136
+ `export type ${enumId} = z.infer<typeof ${enumId}>;`,
137
+ `export const ${enumId}Label = ${JSON.stringify(enumLabel)};`
138
+ ]),
139
+ importKeys: []
140
+ };
141
+ }
142
+ getBaseSchemaSourceCode(entity, importKeys = []) {
143
+ const schemaName = `${entity.names.module}BaseSchema`;
144
+ const propNode = {
145
+ nodeType: "object",
146
+ children: entity.props.map((prop) => {
147
+ return {
148
+ nodeType: "plain",
149
+ prop
150
+ };
151
+ })
152
+ };
153
+ const schemaBody = (() => {
154
+ const result = propNodeToZodTypeDef(propNode, importKeys);
155
+ if (result.endsWith(",")) {
156
+ return result.slice(0, -1);
157
+ }
158
+ return result;
159
+ })();
160
+ const fulltextColumns = [];
161
+ const virtualProps = entity.props.filter((prop) => isVirtualCodeProp(prop)).map((prop) => prop.name);
162
+ const virtualQueryProps = entity.props.filter((prop) => isVirtualQueryProp(prop)).map((prop) => prop.name);
163
+ /**
164
+ * hasDefault props
165
+ * - nullable 또는 dbDefault가 있는 컬럼 (id 포함)
166
+ * - relation이 아니거나, relation이어도 nullable이면 포함
167
+ */
168
+ const hasDefaultColumns = entity.props.filter((prop) => (prop.type !== "relation" || prop.nullable === true) && (prop.nullable === true || prop.type !== "relation" && prop.dbDefault !== undefined)).map((prop) => prop.type === "relation" ? `${prop.name}_id` : prop.name).concat("id");
169
+ /**
170
+ * hasVector props
171
+ * - vector 타입인 컬럼
172
+ */
173
+ const hasVectorColumns = entity.props.filter((prop) => prop.type === "vector" || prop.type === "vector[]").map((prop) => prop.name);
174
+ /**
175
+ * generated props
176
+ * - generated 속성이 있는 컬럼 (INSERT/UPDATE 시 값 제공 불가)
177
+ */
178
+ const generatedColumns = entity.props.filter((prop) => prop.type !== "relation" && (prop.generated !== undefined || prop.type === "searchText")).map((prop) => prop.name);
179
+ const hasMetadata = fulltextColumns.length > 0 || virtualProps.length > 0 || virtualQueryProps.length > 0 || hasDefaultColumns.length > 0 || generatedColumns.length > 0 || hasVectorColumns.length > 0;
180
+ const lines = [`export const ${schemaName} = ${schemaBody};`, `export type ${schemaName} = z.infer<typeof ${schemaName}>` + (hasMetadata ? ` & {${(fulltextColumns.length > 0 ? `readonly __fulltext__: readonly [${fulltextColumns.map((col) => `"${col}"`).join(", ")}],` : "") + (virtualProps.length > 0 ? `readonly __virtual__: readonly [${virtualProps.map((prop) => `"${prop}"`).join(", ")}],` : "") + (virtualQueryProps.length > 0 ? `readonly __virtual_query__: readonly [${virtualQueryProps.map((prop) => `"${prop}"`).join(", ")}],` : "") + (hasDefaultColumns.length > 0 ? `readonly __hasDefault__: readonly [${hasDefaultColumns.map((col) => `"${col}"`).join(", ")}],` : "") + (generatedColumns.length > 0 ? `readonly __generated__: readonly [${generatedColumns.map((col) => `"${col}"`).join(", ")}],` : "") + (hasVectorColumns.length > 0 ? `readonly __vector__: readonly [${hasVectorColumns.map((col) => `"${col}"`).join(", ")}],` : "")}}` : "") + ";"];
181
+ return {
182
+ label: `BaseSchema: ${entity.id}`,
183
+ importKeys,
184
+ lines
185
+ };
186
+ }
187
+ getBaseListParamsSourceCode(entity) {
188
+ if (entity.props.length === 0) {
189
+ return null;
190
+ } else if (entity.parentId !== undefined) {
191
+ return null;
192
+ }
193
+ const schemaName = `${entity.names.module}BaseListParams`;
194
+ const filterProps = entity.props.filter((prop) => prop.toFilter === true);
195
+ const propNodes = filterProps.map((prop) => {
196
+ return {
197
+ nodeType: "plain",
198
+ prop,
199
+ children: []
200
+ };
201
+ });
202
+ const importKeys = [];
203
+ const filterBody = propNodes.map((propNode) => propNodeToZodTypeDef(propNode, importKeys)).join("\n");
204
+ const excludedProps = entity.props.filter((p) => p.type === "virtual").map((p) => p.name);
205
+ const numericProps = entity.props.filter((p) => p.type === "numeric");
206
+ const entityType = `${entity.id}BaseSchema`;
207
+ const numericKeysUnion = numericProps.length > 0 ? numericProps.map((prop) => `"${prop.name}"`).join(" | ") : "never";
208
+ const omitKeysUnion = excludedProps.length > 0 ? excludedProps.map((n) => `"${n}"`).join(" | ") : "never";
209
+ const pkType = entity.getPkType();
210
+ const idZodType = pkType === "string" || pkType === "uuid" ? "zArrayable(z.string())" : "zArrayable(z.number().int().positive())";
211
+ const schemaBody = `
226
212
  z.object({
227
213
  num: z.number().int().nonnegative(),
228
214
  page: z.number().int().min(1),
@@ -234,55 +220,48 @@ z.object({
234
220
  sonamuFilter: z.custom<ApplySonamuFilter<${entityType}, ${omitKeysUnion}, ${numericKeysUnion}>>(),${filterBody}
235
221
  }).partial();
236
222
  `.trim();
237
- const lines = [
238
- `export const ${schemaName} = ${schemaBody};`,
239
- `export type ${schemaName} = z.infer<typeof ${schemaName}>;`
240
- ];
241
- return {
242
- label: `BaseListParams: ${entity.id}`,
243
- importKeys,
244
- lines
245
- };
246
- }
247
- getSubsetSourceCode(entity) {
248
- if (Object.keys(entity.subsets).length === 0) {
249
- return null;
250
- } else if (entity.parentId !== undefined) {
251
- return null;
252
- }
253
- const subsetKeys = Object.keys(entity.subsets);
254
- const importKeys = [];
255
- const lines = [
256
- ...subsetKeys.flatMap((subsetKey)=>{
257
- // 서브셋에서 FieldExpr[] 가져옴
258
- const fieldExprs = entity.subsets[subsetKey];
259
- // FieldExpr[]로 EntityPropNode[] 가져옴
260
- const propNodes = entity.fieldExprsToPropNodes(fieldExprs);
261
- const schemaName = `${entity.names.module}Subset${subsetKey}`;
262
- const propNode = {
263
- nodeType: "object",
264
- children: propNodes
265
- };
266
- // EntityPropNode[]로 ZodTypeDef(string)을 가져옴
267
- const body = propNodeToZodTypeDef(propNode, importKeys);
268
- return [
269
- `export const ${schemaName} = ${body.replace(/,$/, "")};`,
270
- `export type ${schemaName} = z.infer<typeof ${schemaName}>;`
271
- ];
272
- }),
273
- `export type ${entity.names.module}SubsetMapping = {`,
274
- ...subsetKeys.map((subsetKey)=>` ${subsetKey}: ${entity.names.module}Subset${subsetKey};`),
275
- "};",
276
- `export const ${entity.names.module}SubsetKey = z.enum([${subsetKeys.map((k)=>`"${k}"`).join(",")}]);`,
277
- `export type ${entity.names.module}SubsetKey = z.infer<typeof ${entity.names.module}SubsetKey>;`,
278
- ""
279
- ];
280
- return {
281
- label: `Subsets: ${entity.id}`,
282
- lines,
283
- importKeys: unique(importKeys)
284
- };
285
- }
286
- }
223
+ const lines = [`export const ${schemaName} = ${schemaBody};`, `export type ${schemaName} = z.infer<typeof ${schemaName}>;`];
224
+ return {
225
+ label: `BaseListParams: ${entity.id}`,
226
+ importKeys,
227
+ lines
228
+ };
229
+ }
230
+ getSubsetSourceCode(entity) {
231
+ if (Object.keys(entity.subsets).length === 0) {
232
+ return null;
233
+ } else if (entity.parentId !== undefined) {
234
+ return null;
235
+ }
236
+ const subsetKeys = Object.keys(entity.subsets);
237
+ const importKeys = [];
238
+ const lines = [
239
+ ...subsetKeys.flatMap((subsetKey) => {
240
+ const fieldExprs = entity.subsets[subsetKey];
241
+ const propNodes = entity.fieldExprsToPropNodes(fieldExprs);
242
+ const schemaName = `${entity.names.module}Subset${subsetKey}`;
243
+ const propNode = {
244
+ nodeType: "object",
245
+ children: propNodes
246
+ };
247
+ const body = propNodeToZodTypeDef(propNode, importKeys);
248
+ return [`export const ${schemaName} = ${body.replace(/,$/, "")};`, `export type ${schemaName} = z.infer<typeof ${schemaName}>;`];
249
+ }),
250
+ `export type ${entity.names.module}SubsetMapping = {`,
251
+ ...subsetKeys.map((subsetKey) => ` ${subsetKey}: ${entity.names.module}Subset${subsetKey};`),
252
+ "};",
253
+ `export const ${entity.names.module}SubsetKey = z.enum([${subsetKeys.map((k) => `"${k}"`).join(",")}]);`,
254
+ `export type ${entity.names.module}SubsetKey = z.infer<typeof ${entity.names.module}SubsetKey>;`,
255
+ ""
256
+ ];
257
+ return {
258
+ label: `Subsets: ${entity.id}`,
259
+ lines,
260
+ importKeys: unique(importKeys)
261
+ };
262
+ }
263
+ };
287
264
 
288
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlJbmRleCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgaXNWaXJ0dWFsQ29kZVByb3AsXG4gIGlzVmlydHVhbFF1ZXJ5UHJvcCxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBub25OdWxsYWJsZSB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IEJVSUxUX0lOX1RZUEVTLCBwcm9wTm9kZVRvWm9kVHlwZURlZiwgem9kVHlwZVRvWm9kQ29kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUNvZGUgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG59O1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIOyghOyytCBTb3VyY2VDb2RlIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzID0gZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmdldEVudW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOnNvdXJjZUNvZGVzXCIsIHNvdXJjZUNvZGVzKTtcblxuICAgIC8vIFNvcnRcbiAgICBjb25zdCBMQUJFTF9LRVlfT1JERVIgPSBbXCJFbnVtc1wiLCBcIkJhc2VTY2hlbWFcIiwgXCJCYXNlTGlzdFBhcmFtc1wiLCBcIlN1YnNldHNcIiwgXCJTdWJzZXRRdWVyaWVzXCJdO1xuICAgIHNvdXJjZUNvZGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IFthS2V5XSA9IGEubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgW2JLZXldID0gYi5sYWJlbC5zcGxpdChcIjpcIik7XG4gICAgICBjb25zdCBhSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihhS2V5KTtcbiAgICAgIGNvbnN0IGJJbmRleCA9IExBQkVMX0tFWV9PUkRFUi5pbmRleE9mKGJLZXkpO1xuICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYUluZGV4IDwgYkluZGV4KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lczogWy4uLnJlc3VsdC5saW5lcywgYC8vICR7dHMubGFiZWx9YCwgLi4udHMubGluZXMsIFwiXCJdLFxuICAgICAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShbLi4ucmVzdWx0LmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdLnNvcnQoKSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIC8vIC50eXBlcy50c+ydmCDtg4DsnoXsnYQg7LC47KGw7ZWY64qUIOqyveyasCDsiJztmZjssLjsobAo7IOB7Zi47LC47KGwKeqwgCDrsJzsg53tlZjrr4DroZwg7YOA7J6F7J2EIOqwgOyguOyZgCDsnbjrnbzsnbgg7LKY66asXG4gICAgY29uc3QgYWxsVHlwZUtleXMgPSBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IE9iamVjdC5rZXlzKGVudGl0eS50eXBlcykpO1xuICAgIGNvbnN0IGNkSW1wb3J0S2V5cyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGltcG9ydEtleSkgPT5cbiAgICAgIGFsbFR5cGVLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgKTtcbiAgICBpZiAoY2RJbXBvcnRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1c3RvbVNjYWxhckxpbmVzID0gY2RJbXBvcnRLZXlzLmZsYXRNYXAoKGltcG9ydEtleSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllcy5maW5kKChlbnRpdHkpID0+IGVudGl0eS50eXBlc1tpbXBvcnRLZXldKTtcbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFpvZFR5cGUgbm90IGZvdW5kICR7aW1wb3J0S2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XTtcbiAgICAgICAgYXNzZXJ0KHpvZFR5cGUpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYC8vIEN1c3RvbVNjYWxhcjogJHtpbXBvcnRLZXl9YCxcbiAgICAgICAgICBgY29uc3QgJHtpbXBvcnRLZXl9ID0gJHt6b2RUeXBlVG9ab2RDb2RlKHpvZFR5cGUpfTtgLFxuICAgICAgICAgIGB0eXBlICR7aW1wb3J0S2V5fSA9IHouaW5mZXI8dHlwZW9mICR7aW1wb3J0S2V5fT5gLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIHNvdXJjZUNvZGUubGluZXMgPSBbLi4uY3VzdG9tU2NhbGFyTGluZXMsIC4uLnNvdXJjZUNvZGUubGluZXNdO1xuICAgICAgc291cmNlQ29kZS5pbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcihcbiAgICAgICAgKGltcG9ydEtleSkgPT4gIWNkSW1wb3J0S2V5cy5pbmNsdWRlcyhpbXBvcnRLZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOmJvZHlcIiwgYm9keSk7XG5cbiAgICAvLyBpbXBvcnRcbiAgICAvLyBzb3VyY2VDb2RlLmltcG9ydEtleXPsl5Ag64K07J6lIO2DgOyeheydmCDsiqTtgqTrp4jqsIAg7J6I7Jy866m0IHNvbmFtdSBpbXBvcnTsl5Ag7LaU6rCAXG4gICAgY29uc3QgYnVpbHRJblNjaGVtYU5hbWVzID0gT2JqZWN0LnZhbHVlcyhCVUlMVF9JTl9UWVBFUykubWFwKFxuICAgICAgKGluZm8pID0+IGluZm8uc2NoZW1hTmFtZSBhcyBzdHJpbmcsXG4gICAgKTtcbiAgICBjb25zdCBidWlsdEluU2NoZW1hcyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGtleSkgPT4gYnVpbHRJblNjaGVtYU5hbWVzLmluY2x1ZGVzKGtleSkpO1xuICAgIGNvbnN0IHNvbmFtdUltcG9ydHMgPSBbXG4gICAgICBcInpBcnJheWFibGVcIixcbiAgICAgIFwiU1FMRGF0ZVRpbWVTdHJpbmdcIixcbiAgICAgIFwiU3Vic2V0UXVlcnlcIixcbiAgICAgIFwiU29uYW11UXVlcnlNb2RlXCIsXG4gICAgICBcIkFwcGx5U29uYW11RmlsdGVyXCIsXG4gICAgICAuLi5idWlsdEluU2NoZW1hcyxcbiAgICBdLmZpbHRlcigobW9kKSA9PiBib2R5LmluY2x1ZGVzKG1vZCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keSxcbiAgICAgIGltcG9ydEtleXM6IHNvdXJjZUNvZGUuaW1wb3J0S2V5cyxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcbiAgICAgICAgXCIvKipcIixcbiAgICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICAgIFwiICovXCIsXG4gICAgICAgIFwiLyoqIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVk64qUIOustOyLnCAqL1wiLFxuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGFzc2lzdDogZ2VuZXJhdGVk64qUIOustOyLnCAqL1wiLFxuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGZvcm1hdDogZ2VuZXJhdGVk64qUIOustOyLnCAqL1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBgaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11SW1wb3J0cy5qb2luKFwiLFwiKX0gfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGdldEVudW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEVudW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMoZW50aXR5LmVudW1MYWJlbHMpXG4gICAgICAgICAgLmZpbHRlcigoW18sIGVudW1MYWJlbF0pID0+IE9iamVjdC5rZXlzKGVudW1MYWJlbCkubGVuZ3RoID4gMClcbiAgICAgICAgICAuZmxhdE1hcCgoW2VudW1JZCwgZW51bUxhYmVsXSkgPT4gW1xuICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudW1JZH0gPSB6LmVudW0oWyR7T2JqZWN0LmtleXMoZW51bUxhYmVsKS5tYXAoXG4gICAgICAgICAgICAgIChlbCkgPT4gYFwiJHtlbH1cImAsXG4gICAgICAgICAgICApfV0pLmRlc2NyaWJlKFwiJHtlbnVtSWR9XCIpO2AsXG4gICAgICAgICAgICBgZXhwb3J0IHR5cGUgJHtlbnVtSWR9ID0gei5pbmZlcjx0eXBlb2YgJHtlbnVtSWR9PjtgLFxuICAgICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudW1JZH1MYWJlbCA9ICR7SlNPTi5zdHJpbmdpZnkoZW51bUxhYmVsKX07YCxcbiAgICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHksIGltcG9ydEtleXM6IHN0cmluZ1tdID0gW10pOiBTb3VyY2VDb2RlIHtcbiAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1CYXNlU2NoZW1hYDtcbiAgICBjb25zdCBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUgPSB7XG4gICAgICBub2RlVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuOiBlbnRpdHkucHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIixcbiAgICAgICAgICBwcm9wLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IHNjaGVtYUJvZHkgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpO1xuICAgICAgaWYgKHJlc3VsdC5lbmRzV2l0aChcIixcIikpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zbGljZSgwLCAtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkoKTtcblxuICAgIC8vIGZ1bGx0ZXh0IGluZGV47JeQIO2PrO2VqOuQnCDsu6zrn7zrk6Qg7LaU7LacXG4gICAgLy8gVE9ETzogR0lOL0dpU1Qg7J24642x7IqkIOyDneyEseuQnCDsu6zrn7wg7LaU7LacXG4gICAgY29uc3QgZnVsbHRleHRDb2x1bW5zOiBFbnRpdHlJbmRleFtcImNvbHVtbnNcIl1bXSA9IFtdO1xuXG4gICAgLy8gdmlydHVhbCBwcm9wcyAodmlydHVhbFR5cGU6IFwiY29kZVwiIOuYkOuKlCB1bmRlZmluZWTsnbgg6rKD66eMIO2PrO2VqClcbiAgICBjb25zdCB2aXJ0dWFsUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IGlzVmlydHVhbENvZGVQcm9wKHByb3ApKVxuICAgICAgLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKTtcblxuICAgIC8vIHF1ZXJ5IHZpcnR1YWwgcHJvcHMgKHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rKD66eMIO2PrO2VqClcbiAgICBjb25zdCB2aXJ0dWFsUXVlcnlQcm9wcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4gaXNWaXJ0dWFsUXVlcnlQcm9wKHByb3ApKVxuICAgICAgLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKTtcblxuICAgIC8qKlxuICAgICAqIGhhc0RlZmF1bHQgcHJvcHNcbiAgICAgKiAtIG51bGxhYmxlIOuYkOuKlCBkYkRlZmF1bHTqsIAg7J6I64qUIOy7rOufvCAoaWQg7Y+s7ZWoKVxuICAgICAqIC0gcmVsYXRpb27snbQg7JWE64uI6rGw64KYLCByZWxhdGlvbuydtOyWtOuPhCBudWxsYWJsZeydtOuptCDtj6ztlahcbiAgICAgKi9cbiAgICBjb25zdCBoYXNEZWZhdWx0Q29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgKHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiIHx8IHByb3AubnVsbGFibGUgPT09IHRydWUpICYmXG4gICAgICAgICAgKHByb3AubnVsbGFibGUgPT09IHRydWUgfHwgKHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiICYmIHByb3AuZGJEZWZhdWx0ICE9PSB1bmRlZmluZWQpKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHByb3ApID0+IChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiA/IGAke3Byb3AubmFtZX1faWRgIDogcHJvcC5uYW1lKSlcbiAgICAgIC5jb25jYXQoXCJpZFwiKTtcblxuICAgIC8qKlxuICAgICAqIGhhc1ZlY3RvciBwcm9wc1xuICAgICAqIC0gdmVjdG9yIO2DgOyeheyduCDsu6zrn7xcbiAgICAgKi9cbiAgICBjb25zdCBoYXNWZWN0b3JDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwcm9wKSA9PiBwcm9wLnR5cGUgPT09IFwidmVjdG9yXCIgfHwgcHJvcC50eXBlID09PSBcInZlY3RvcltdXCIpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVkIHByb3BzXG4gICAgICogLSBnZW5lcmF0ZWQg7IaN7ISx7J20IOyeiOuKlCDsu6zrn7wgKElOU0VSVC9VUERBVEUg7IucIOqwkiDsoJzqs7Ug67aI6rCAKVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZENvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgIHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiICYmIChwcm9wLmdlbmVyYXRlZCAhPT0gdW5kZWZpbmVkIHx8IHByb3AudHlwZSA9PT0gXCJzZWFyY2hUZXh0XCIpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gcHJvcC5uYW1lKTtcblxuICAgIGNvbnN0IGhhc01ldGFkYXRhID1cbiAgICAgIGZ1bGx0ZXh0Q29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICB2aXJ0dWFsUHJvcHMubGVuZ3RoID4gMCB8fFxuICAgICAgdmlydHVhbFF1ZXJ5UHJvcHMubGVuZ3RoID4gMCB8fFxuICAgICAgaGFzRGVmYXVsdENvbHVtbnMubGVuZ3RoID4gMCB8fFxuICAgICAgZ2VuZXJhdGVkQ29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICBoYXNWZWN0b3JDb2x1bW5zLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7c2NoZW1hQm9keX07YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT5gICtcbiAgICAgICAgKGhhc01ldGFkYXRhXG4gICAgICAgICAgPyBgICYgeyR7XG4gICAgICAgICAgICAgIChmdWxsdGV4dENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZnVsbHRleHRfXzogcmVhZG9ubHkgWyR7ZnVsbHRleHRDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2x9XCJgKVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAodmlydHVhbFByb3BzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX3ZpcnR1YWxfXzogcmVhZG9ubHkgWyR7dmlydHVhbFByb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wfVwiYCkuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAodmlydHVhbFF1ZXJ5UHJvcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fdmlydHVhbF9xdWVyeV9fOiByZWFkb25seSBbJHt2aXJ0dWFsUXVlcnlQcm9wcy5tYXAoKHByb3ApID0+IGBcIiR7cHJvcH1cImApLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKGhhc0RlZmF1bHRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX2hhc0RlZmF1bHRfXzogcmVhZG9ubHkgWyR7aGFzRGVmYXVsdENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAoaGFzVmVjdG9yQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192ZWN0b3JfXzogcmVhZG9ubHkgWyR7aGFzVmVjdG9yQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpXG4gICAgICAgICAgICB9fWBcbiAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgXCI7XCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VTY2hlbWE6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBpbXBvcnRLZXlzLFxuICAgICAgbGluZXMsXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICAvLyBQcm9wIOyXhuuKlCBNROyduCDqsr3smrAg7IOd7ISxIOygnOyZuFxuICAgIGlmIChlbnRpdHkucHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1CYXNlTGlzdFBhcmFtc2A7XG5cbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHByb3ApID0+IHByb3AudG9GaWx0ZXIgPT09IHRydWUpO1xuXG4gICAgY29uc3QgcHJvcE5vZGVzOiBFbnRpdHlQcm9wTm9kZVtdID0gZmlsdGVyUHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBmaWx0ZXJCb2R5ID0gcHJvcE5vZGVzXG4gICAgICAubWFwKChwcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBGaWx0ZXJRdWVyeSDtg4DsnoXsnYQg7JyE7ZWcIOygnOyZuO2VoCBwcm9wcyDstpTstpwgKHZpcnR1YWzrp4wg7KCc7Jm4KVxuICAgIGNvbnN0IGV4Y2x1ZGVkUHJvcHMgPSBlbnRpdHkucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmlydHVhbFwiKS5tYXAoKHApID0+IHAubmFtZSk7XG5cbiAgICAvLyBudW1lcmljIO2DgOyeheyduCBwcm9wcyDstpTstpxcbiAgICBjb25zdCBudW1lcmljUHJvcHMgPSBlbnRpdHkucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwibnVtZXJpY1wiKTtcblxuICAgIC8vIEFwcGx5U29uYW11RmlsdGVyIO2DgOyehSDsnbjsnpAg7IOd7ISxXG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGAke2VudGl0eS5pZH1CYXNlU2NoZW1hYDtcbiAgICBjb25zdCBudW1lcmljS2V5c1VuaW9uID1cbiAgICAgIG51bWVyaWNQcm9wcy5sZW5ndGggPiAwID8gbnVtZXJpY1Byb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wLm5hbWV9XCJgKS5qb2luKFwiIHwgXCIpIDogXCJuZXZlclwiO1xuICAgIGNvbnN0IG9taXRLZXlzVW5pb24gPVxuICAgICAgZXhjbHVkZWRQcm9wcy5sZW5ndGggPiAwID8gZXhjbHVkZWRQcm9wcy5tYXAoKG4pID0+IGBcIiR7bn1cImApLmpvaW4oXCIgfCBcIikgOiBcIm5ldmVyXCI7XG5cbiAgICAvLyBQSyDtg4DsnoXsl5Ag65Sw66W4IGlkIFpvZCDtg4DsnoUg6rKw7KCVXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkWm9kVHlwZSA9XG4gICAgICBwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIlxuICAgICAgICA/IFwiekFycmF5YWJsZSh6LnN0cmluZygpKVwiXG4gICAgICAgIDogXCJ6QXJyYXlhYmxlKHoubnVtYmVyKCkuaW50KCkucG9zaXRpdmUoKSlcIjtcblxuICAgIGNvbnN0IHNjaGVtYUJvZHkgPSBgXG56Lm9iamVjdCh7XG4gIG51bTogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxuICBwYWdlOiB6Lm51bWJlcigpLmludCgpLm1pbigxKSxcbiAgc2VhcmNoOiAke2VudGl0eS5pZH1TZWFyY2hGaWVsZCxcbiAga2V5d29yZDogei5zdHJpbmcoKSxcbiAgb3JkZXJCeTogJHtlbnRpdHkuaWR9T3JkZXJCeSxcbiAgcXVlcnlNb2RlOiBTb25hbXVRdWVyeU1vZGUsXG4gIGlkOiAke2lkWm9kVHlwZX0sXG4gIHNvbmFtdUZpbHRlcjogei5jdXN0b208QXBwbHlTb25hbXVGaWx0ZXI8JHtlbnRpdHlUeXBlfSwgJHtvbWl0S2V5c1VuaW9ufSwgJHtudW1lcmljS2V5c1VuaW9ufT4+KCksJHtmaWx0ZXJCb2R5fVxufSkucGFydGlhbCgpO1xuYC50cmltKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7c2NoZW1hQm9keX07YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT47YCxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgQmFzZUxpc3RQYXJhbXM6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBpbXBvcnRLZXlzLFxuICAgICAgbGluZXMsXG4gICAgfTtcbiAgfVxuXG4gIGdldFN1YnNldFNvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZW50aXR5LnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cyk7XG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICAuLi5zdWJzZXRLZXlzLmZsYXRNYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAvLyDshJzruIzshYvsl5DshJwgRmllbGRFeHByW10g6rCA7KC47Ji0XG4gICAgICAgIGNvbnN0IGZpZWxkRXhwcnMgPSBlbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuXG4gICAgICAgIC8vIEZpZWxkRXhwcltd66GcIEVudGl0eVByb3BOb2RlW10g6rCA7KC47Ji0XG4gICAgICAgIGNvbnN0IHByb3BOb2RlcyA9IGVudGl0eS5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZmllbGRFeHBycyk7XG4gICAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldCR7c3Vic2V0S2V5fWA7XG4gICAgICAgIGNvbnN0IHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSA9IHtcbiAgICAgICAgICBub2RlVHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBjaGlsZHJlbjogcHJvcE5vZGVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEVudGl0eVByb3BOb2RlW13roZwgWm9kVHlwZURlZihzdHJpbmcp7J2EIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBib2R5ID0gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtib2R5LnJlcGxhY2UoLywkLywgXCJcIil9O2AsXG4gICAgICAgICAgYGV4cG9ydCB0eXBlICR7c2NoZW1hTmFtZX0gPSB6LmluZmVyPHR5cGVvZiAke3NjaGVtYU5hbWV9PjtgLFxuICAgICAgICBdO1xuICAgICAgfSksXG4gICAgICBgZXhwb3J0IHR5cGUgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldE1hcHBpbmcgPSB7YCxcbiAgICAgIC4uLnN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IGAgICR7c3Vic2V0S2V5fTogJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldCR7c3Vic2V0S2V5fTtgKSxcbiAgICAgIFwifTtcIixcbiAgICAgIGBleHBvcnQgY29uc3QgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleSA9IHouZW51bShbJHtzdWJzZXRLZXlzXG4gICAgICAgIC5tYXAoKGspID0+IGBcIiR7a31cImApXG4gICAgICAgIC5qb2luKFwiLFwiKX1dKTtgLFxuICAgICAgYGV4cG9ydCB0eXBlICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXkgPSB6LmluZmVyPHR5cGVvZiAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5PjtgLFxuICAgICAgXCJcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgU3Vic2V0czogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGxpbmVzLFxuICAgICAgaW1wb3J0S2V5czogdW5pcXVlKGltcG9ydEtleXMpLFxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJ1bmlxdWUiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJpc1ZpcnR1YWxDb2RlUHJvcCIsImlzVmlydHVhbFF1ZXJ5UHJvcCIsIm5vbk51bGxhYmxlIiwiVGVtcGxhdGUiLCJCVUlMVF9JTl9UWVBFUyIsInByb3BOb2RlVG9ab2RUeXBlRGVmIiwiem9kVHlwZVRvWm9kQ29kZSIsIlRlbXBsYXRlX19nZW5lcmF0ZWQiLCJnZXRUYXJnZXRBbmRQYXRoIiwiZGlyIiwiY29uZmlnIiwiYXBpIiwidGFyZ2V0IiwicGF0aCIsInJlbmRlciIsImVudGl0eUlkcyIsImdldEFsbElkcyIsImVudGl0aWVzIiwibWFwIiwiaWQiLCJnZXQiLCJzb3VyY2VDb2RlcyIsImZsYXRNYXAiLCJlbnRpdHkiLCJnZXRFbnVtc1NvdXJjZUNvZGUiLCJnZXRCYXNlU2NoZW1hU291cmNlQ29kZSIsImdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZSIsImdldFN1YnNldFNvdXJjZUNvZGUiLCJmaWx0ZXIiLCJ0IiwiTEFCRUxfS0VZX09SREVSIiwic29ydCIsImEiLCJiIiwiYUtleSIsImxhYmVsIiwic3BsaXQiLCJiS2V5IiwiYUluZGV4IiwiaW5kZXhPZiIsImJJbmRleCIsInNvdXJjZUNvZGUiLCJyZWR1Y2UiLCJyZXN1bHQiLCJ0cyIsImxpbmVzIiwiaW1wb3J0S2V5cyIsImFsbFR5cGVLZXlzIiwiT2JqZWN0Iiwia2V5cyIsInR5cGVzIiwiY2RJbXBvcnRLZXlzIiwiaW1wb3J0S2V5IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJjdXN0b21TY2FsYXJMaW5lcyIsImZpbmQiLCJFcnJvciIsInpvZFR5cGUiLCJib2R5Iiwiam9pbiIsImJ1aWx0SW5TY2hlbWFOYW1lcyIsInZhbHVlcyIsImluZm8iLCJzY2hlbWFOYW1lIiwiYnVpbHRJblNjaGVtYXMiLCJrZXkiLCJzb25hbXVJbXBvcnRzIiwibW9kIiwiY3VzdG9tSGVhZGVycyIsImVudW1MYWJlbHMiLCJlbnRyaWVzIiwiXyIsImVudW1MYWJlbCIsImVudW1JZCIsImVsIiwiSlNPTiIsInN0cmluZ2lmeSIsIm5hbWVzIiwibW9kdWxlIiwicHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwicHJvcHMiLCJwcm9wIiwic2NoZW1hQm9keSIsImVuZHNXaXRoIiwic2xpY2UiLCJmdWxsdGV4dENvbHVtbnMiLCJ2aXJ0dWFsUHJvcHMiLCJuYW1lIiwidmlydHVhbFF1ZXJ5UHJvcHMiLCJoYXNEZWZhdWx0Q29sdW1ucyIsInR5cGUiLCJudWxsYWJsZSIsImRiRGVmYXVsdCIsInVuZGVmaW5lZCIsImNvbmNhdCIsImhhc1ZlY3RvckNvbHVtbnMiLCJnZW5lcmF0ZWRDb2x1bW5zIiwiZ2VuZXJhdGVkIiwiaGFzTWV0YWRhdGEiLCJjb2wiLCJwYXJlbnRJZCIsImZpbHRlclByb3BzIiwidG9GaWx0ZXIiLCJwcm9wTm9kZXMiLCJmaWx0ZXJCb2R5IiwiZXhjbHVkZWRQcm9wcyIsInAiLCJudW1lcmljUHJvcHMiLCJlbnRpdHlUeXBlIiwibnVtZXJpY0tleXNVbmlvbiIsIm9taXRLZXlzVW5pb24iLCJuIiwicGtUeXBlIiwiZ2V0UGtUeXBlIiwiaWRab2RUeXBlIiwidHJpbSIsInN1YnNldHMiLCJzdWJzZXRLZXlzIiwic3Vic2V0S2V5IiwiZmllbGRFeHBycyIsImZpZWxkRXhwcnNUb1Byb3BOb2RlcyIsInJlcGxhY2UiLCJrIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FBU0MsTUFBTSxRQUFRLHFCQUFZO0FBRW5DLFNBQVNDLGFBQWEsUUFBUSxpQ0FBOEI7QUFDNUQsU0FBU0MsS0FBSyxRQUFRLHVCQUFvQjtBQUMxQyxTQUdFQyxpQkFBaUIsRUFDakJDLGtCQUFrQixRQUNiLHVCQUFvQjtBQUMzQixTQUFTQyxXQUFXLFFBQVEsdUJBQW9CO0FBQ2hELFNBQVNDLFFBQVEsUUFBUSxpQkFBYztBQUN2QyxTQUFTQyxjQUFjLEVBQUVDLG9CQUFvQixFQUFFQyxnQkFBZ0IsUUFBUSxzQkFBbUI7QUFPMUYsT0FBTyxNQUFNQyw0QkFBNEJKO0lBQ3ZDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBSyxtQkFBbUI7UUFDakIsTUFBTSxFQUFFQyxHQUFHLEVBQUUsR0FBR1osT0FBT2EsTUFBTSxDQUFDQyxHQUFHO1FBQ2pDLE9BQU87WUFDTEMsUUFBUSxHQUFHSCxJQUFJLGdCQUFnQixDQUFDO1lBQ2hDSSxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDN0I7SUFDRjtJQUNBQyxTQUFTO1FBQ1AsTUFBTUMsWUFBWWpCLGNBQWNrQixTQUFTO1FBQ3pDLE1BQU1DLFdBQVdGLFVBQVVHLEdBQUcsQ0FBQyxDQUFDQyxLQUFPckIsY0FBY3NCLEdBQUcsQ0FBQ0Q7UUFFekQsbUJBQW1CO1FBQ25CLE1BQU1FLGNBQWNKLFNBQVNLLE9BQU8sQ0FBQyxDQUFDQztZQUNwQyxPQUFPO2dCQUNMLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNEO2dCQUN4QixJQUFJLENBQUNFLHVCQUF1QixDQUFDRjtnQkFDN0IsSUFBSSxDQUFDRywyQkFBMkIsQ0FBQ0g7Z0JBQ2pDLElBQUksQ0FBQ0ksbUJBQW1CLENBQUNKO2FBQzFCLENBQUNLLE1BQU0sQ0FBQzFCO1FBQ1g7UUFDQUgsTUFBTThCLENBQUMsQ0FBQyxtQ0FBbUNSO1FBRTNDLE9BQU87UUFDUCxNQUFNUyxrQkFBa0I7WUFBQztZQUFTO1lBQWM7WUFBa0I7WUFBVztTQUFnQjtRQUM3RlQsWUFBWVUsSUFBSSxDQUFDLENBQUNDLEdBQUdDO1lBQ25CLE1BQU0sQ0FBQ0MsS0FBSyxHQUFHRixFQUFFRyxLQUFLLENBQUNDLEtBQUssQ0FBQztZQUM3QixNQUFNLENBQUNDLEtBQUssR0FBR0osRUFBRUUsS0FBSyxDQUFDQyxLQUFLLENBQUM7WUFDN0IsTUFBTUUsU0FBU1IsZ0JBQWdCUyxPQUFPLENBQUNMO1lBQ3ZDLE1BQU1NLFNBQVNWLGdCQUFnQlMsT0FBTyxDQUFDRjtZQUN2QyxJQUFJQyxTQUFTRSxRQUFRO2dCQUNuQixPQUFPO1lBQ1QsT0FBTyxJQUFJRixTQUFTRSxRQUFRO2dCQUMxQixPQUFPLENBQUM7WUFDVixPQUFPO2dCQUNMLE9BQU87WUFDVDtRQUNGO1FBRUEsTUFBTUMsYUFBYXBCLFlBQVlxQixNQUFNLENBQ25DLENBQUNDLFFBQVFDO1lBQ1AsSUFBSUEsT0FBTyxNQUFNO2dCQUNmLE9BQU9EO1lBQ1Q7WUFDQSxPQUFPO2dCQUNMRSxPQUFPO3VCQUFJRixPQUFPRSxLQUFLO29CQUFFLENBQUMsR0FBRyxFQUFFRCxHQUFHVCxLQUFLLEVBQUU7dUJBQUtTLEdBQUdDLEtBQUs7b0JBQUU7aUJBQUc7Z0JBQzNEQyxZQUFZbEQsT0FBTzt1QkFBSStDLE9BQU9HLFVBQVU7dUJBQUtGLEdBQUdFLFVBQVU7aUJBQUMsQ0FBQ2YsSUFBSTtZQUNsRTtRQUNGLEdBQ0E7WUFDRWMsT0FBTyxFQUFFO1lBQ1RDLFlBQVksRUFBRTtRQUNoQjtRQUdGLDBEQUEwRDtRQUMxRCxNQUFNQyxjQUFjOUIsU0FBU0ssT0FBTyxDQUFDLENBQUNDLFNBQVd5QixPQUFPQyxJQUFJLENBQUMxQixPQUFPMkIsS0FBSztRQUN6RSxNQUFNQyxlQUFlVixXQUFXSyxVQUFVLENBQUNsQixNQUFNLENBQUMsQ0FBQ3dCLFlBQ2pETCxZQUFZTSxRQUFRLENBQUNEO1FBRXZCLElBQUlELGFBQWFHLE1BQU0sR0FBRyxHQUFHO1lBQzNCLE1BQU1DLG9CQUFvQkosYUFBYTdCLE9BQU8sQ0FBQyxDQUFDOEI7Z0JBQzlDLE1BQU03QixTQUFTTixTQUFTdUMsSUFBSSxDQUFDLENBQUNqQyxTQUFXQSxPQUFPMkIsS0FBSyxDQUFDRSxVQUFVO2dCQUNoRSxJQUFJLENBQUM3QixRQUFRO29CQUNYLE1BQU0sSUFBSWtDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRUwsV0FBVztnQkFDbEQ7Z0JBQ0EsTUFBTU0sVUFBVW5DLE9BQU8yQixLQUFLLENBQUNFLFVBQVU7Z0JBQ3ZDekQsT0FBTytEO2dCQUVQLE9BQU87b0JBQ0wsQ0FBQyxpQkFBaUIsRUFBRU4sV0FBVztvQkFDL0IsQ0FBQyxNQUFNLEVBQUVBLFVBQVUsR0FBRyxFQUFFOUMsaUJBQWlCb0QsU0FBUyxDQUFDLENBQUM7b0JBQ3BELENBQUMsS0FBSyxFQUFFTixVQUFVLGtCQUFrQixFQUFFQSxVQUFVLENBQUMsQ0FBQztvQkFDbEQ7aUJBQ0Q7WUFDSDtZQUNBWCxXQUFXSSxLQUFLLEdBQUc7bUJBQUlVO21CQUFzQmQsV0FBV0ksS0FBSzthQUFDO1lBQzlESixXQUFXSyxVQUFVLEdBQUdMLFdBQVdLLFVBQVUsQ0FBQ2xCLE1BQU0sQ0FDbEQsQ0FBQ3dCLFlBQWMsQ0FBQ0QsYUFBYUUsUUFBUSxDQUFDRDtRQUUxQztRQUVBLE1BQU1PLE9BQU9sQixXQUFXSSxLQUFLLENBQUNlLElBQUksQ0FBQztRQUNuQzdELE1BQU04QixDQUFDLENBQUMsNEJBQTRCOEI7UUFFcEMsU0FBUztRQUNULDJEQUEyRDtRQUMzRCxNQUFNRSxxQkFBcUJiLE9BQU9jLE1BQU0sQ0FBQzFELGdCQUFnQmMsR0FBRyxDQUMxRCxDQUFDNkMsT0FBU0EsS0FBS0MsVUFBVTtRQUUzQixNQUFNQyxpQkFBaUJ4QixXQUFXSyxVQUFVLENBQUNsQixNQUFNLENBQUMsQ0FBQ3NDLE1BQVFMLG1CQUFtQlIsUUFBUSxDQUFDYTtRQUN6RixNQUFNQyxnQkFBZ0I7WUFDcEI7WUFDQTtZQUNBO1lBQ0E7WUFDQTtlQUNHRjtTQUNKLENBQUNyQyxNQUFNLENBQUMsQ0FBQ3dDLE1BQVFULEtBQUtOLFFBQVEsQ0FBQ2U7UUFFaEMsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDNUQsZ0JBQWdCLEVBQUU7WUFDMUJtRDtZQUNBYixZQUFZTCxXQUFXSyxVQUFVO1lBQ2pDdUIsZUFBZTtnQkFDYjtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQSxDQUFDLHdCQUF3QixDQUFDO2dCQUMxQixDQUFDLFNBQVMsRUFBRUYsY0FBY1AsSUFBSSxDQUFDLEtBQUssaUJBQWlCLENBQUM7YUFDdkQ7UUFDSDtJQUNGO0lBRUFwQyxtQkFBbUJELE1BQWMsRUFBcUI7UUFDcEQsSUFBSXlCLE9BQU9DLElBQUksQ0FBQzFCLE9BQU8rQyxVQUFVLEVBQUVoQixNQUFNLEtBQUssR0FBRztZQUMvQyxPQUFPO1FBQ1Q7UUFDQSxPQUFPO1lBQ0xuQixPQUFPLENBQUMsT0FBTyxFQUFFWixPQUFPSixFQUFFLEVBQUU7WUFDNUIwQixPQUFPO21CQUNGRyxPQUFPdUIsT0FBTyxDQUFDaEQsT0FBTytDLFVBQVUsRUFDaEMxQyxNQUFNLENBQUMsQ0FBQyxDQUFDNEMsR0FBR0MsVUFBVSxHQUFLekIsT0FBT0MsSUFBSSxDQUFDd0IsV0FBV25CLE1BQU0sR0FBRyxHQUMzRGhDLE9BQU8sQ0FBQyxDQUFDLENBQUNvRCxRQUFRRCxVQUFVLEdBQUs7d0JBQ2hDLENBQUMsYUFBYSxFQUFFQyxPQUFPLFdBQVcsRUFBRTFCLE9BQU9DLElBQUksQ0FBQ3dCLFdBQVd2RCxHQUFHLENBQzVELENBQUN5RCxLQUFPLENBQUMsQ0FBQyxFQUFFQSxHQUFHLENBQUMsQ0FBQyxFQUNqQixhQUFhLEVBQUVELE9BQU8sR0FBRyxDQUFDO3dCQUM1QixDQUFDLFlBQVksRUFBRUEsT0FBTyxrQkFBa0IsRUFBRUEsT0FBTyxFQUFFLENBQUM7d0JBQ3BELENBQUMsYUFBYSxFQUFFQSxPQUFPLFFBQVEsRUFBRUUsS0FBS0MsU0FBUyxDQUFDSixXQUFXLENBQUMsQ0FBQztxQkFDOUQ7YUFDSjtZQUNEM0IsWUFBWSxFQUFFO1FBQ2hCO0lBQ0Y7SUFFQXJCLHdCQUF3QkYsTUFBYyxFQUFFdUIsYUFBdUIsRUFBRSxFQUFjO1FBQzdFLE1BQU1rQixhQUFhLEdBQUd6QyxPQUFPdUQsS0FBSyxDQUFDQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3JELE1BQU1DLFdBQTJCO1lBQy9CQyxVQUFVO1lBQ1ZDLFVBQVUzRCxPQUFPNEQsS0FBSyxDQUFDakUsR0FBRyxDQUFDLENBQUNrRTtnQkFDMUIsT0FBTztvQkFDTEgsVUFBVTtvQkFDVkc7Z0JBQ0Y7WUFDRjtRQUNGO1FBRUEsTUFBTUMsYUFBYSxBQUFDLENBQUE7WUFDbEIsTUFBTTFDLFNBQVN0QyxxQkFBcUIyRSxVQUFVbEM7WUFDOUMsSUFBSUgsT0FBTzJDLFFBQVEsQ0FBQyxNQUFNO2dCQUN4QixPQUFPM0MsT0FBTzRDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDMUI7WUFFQSxPQUFPNUM7UUFDVCxDQUFBO1FBRUEsNkJBQTZCO1FBQzdCLCtCQUErQjtRQUMvQixNQUFNNkMsa0JBQTRDLEVBQUU7UUFFcEQsMERBQTBEO1FBQzFELE1BQU1DLGVBQWVsRSxPQUFPNEQsS0FBSyxDQUM5QnZELE1BQU0sQ0FBQyxDQUFDd0QsT0FBU3BGLGtCQUFrQm9GLE9BQ25DbEUsR0FBRyxDQUFDLENBQUNrRSxPQUFTQSxLQUFLTSxJQUFJO1FBRTFCLG9EQUFvRDtRQUNwRCxNQUFNQyxvQkFBb0JwRSxPQUFPNEQsS0FBSyxDQUNuQ3ZELE1BQU0sQ0FBQyxDQUFDd0QsT0FBU25GLG1CQUFtQm1GLE9BQ3BDbEUsR0FBRyxDQUFDLENBQUNrRSxPQUFTQSxLQUFLTSxJQUFJO1FBRTFCOzs7O0tBSUMsR0FDRCxNQUFNRSxvQkFBb0JyRSxPQUFPNEQsS0FBSyxDQUNuQ3ZELE1BQU0sQ0FDTCxDQUFDd0QsT0FDQyxBQUFDQSxDQUFBQSxLQUFLUyxJQUFJLEtBQUssY0FBY1QsS0FBS1UsUUFBUSxLQUFLLElBQUcsS0FDakRWLENBQUFBLEtBQUtVLFFBQVEsS0FBSyxRQUFTVixLQUFLUyxJQUFJLEtBQUssY0FBY1QsS0FBS1csU0FBUyxLQUFLQyxTQUFTLEdBRXZGOUUsR0FBRyxDQUFDLENBQUNrRSxPQUFVQSxLQUFLUyxJQUFJLEtBQUssYUFBYSxHQUFHVCxLQUFLTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUdOLEtBQUtNLElBQUksRUFDdkVPLE1BQU0sQ0FBQztRQUVWOzs7S0FHQyxHQUNELE1BQU1DLG1CQUFtQjNFLE9BQU80RCxLQUFLLENBQ2xDdkQsTUFBTSxDQUFDLENBQUN3RCxPQUFTQSxLQUFLUyxJQUFJLEtBQUssWUFBWVQsS0FBS1MsSUFBSSxLQUFLLFlBQ3pEM0UsR0FBRyxDQUFDLENBQUNrRSxPQUFTQSxLQUFLTSxJQUFJO1FBRTFCOzs7S0FHQyxHQUNELE1BQU1TLG1CQUFtQjVFLE9BQU80RCxLQUFLLENBQ2xDdkQsTUFBTSxDQUNMLENBQUN3RCxPQUNDQSxLQUFLUyxJQUFJLEtBQUssY0FBZVQsQ0FBQUEsS0FBS2dCLFNBQVMsS0FBS0osYUFBYVosS0FBS1MsSUFBSSxLQUFLLFlBQVcsR0FFekYzRSxHQUFHLENBQUMsQ0FBQ2tFLE9BQVNBLEtBQUtNLElBQUk7UUFFMUIsTUFBTVcsY0FDSmIsZ0JBQWdCbEMsTUFBTSxHQUFHLEtBQ3pCbUMsYUFBYW5DLE1BQU0sR0FBRyxLQUN0QnFDLGtCQUFrQnJDLE1BQU0sR0FBRyxLQUMzQnNDLGtCQUFrQnRDLE1BQU0sR0FBRyxLQUMzQjZDLGlCQUFpQjdDLE1BQU0sR0FBRyxLQUMxQjRDLGlCQUFpQjVDLE1BQU0sR0FBRztRQUU1QixNQUFNVCxRQUFRO1lBQ1osQ0FBQyxhQUFhLEVBQUVtQixXQUFXLEdBQUcsRUFBRXFCLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLENBQUMsWUFBWSxFQUFFckIsV0FBVyxrQkFBa0IsRUFBRUEsV0FBVyxDQUFDLENBQUMsR0FDeERxQyxDQUFBQSxjQUNHLENBQUMsSUFBSSxFQUNILEFBQUNiLENBQUFBLGdCQUFnQmxDLE1BQU0sR0FBRyxJQUN0QixDQUFDLGlDQUFpQyxFQUFFa0MsZ0JBQ2pDdEUsR0FBRyxDQUFDLENBQUNvRixNQUFRLENBQUMsQ0FBQyxFQUFFQSxJQUFJLENBQUMsQ0FBQyxFQUN2QjFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUNqQixFQUFDLElBQ0o2QixDQUFBQSxhQUFhbkMsTUFBTSxHQUFHLElBQ25CLENBQUMsZ0NBQWdDLEVBQUVtQyxhQUFhdkUsR0FBRyxDQUFDLENBQUNrRSxPQUFTLENBQUMsQ0FBQyxFQUFFQSxLQUFLLENBQUMsQ0FBQyxFQUFFeEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQ3pGLEVBQUMsSUFDSitCLENBQUFBLGtCQUFrQnJDLE1BQU0sR0FBRyxJQUN4QixDQUFDLHNDQUFzQyxFQUFFcUMsa0JBQWtCekUsR0FBRyxDQUFDLENBQUNrRSxPQUFTLENBQUMsQ0FBQyxFQUFFQSxLQUFLLENBQUMsQ0FBQyxFQUFFeEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQ3BHLEVBQUMsSUFDSmdDLENBQUFBLGtCQUFrQnRDLE1BQU0sR0FBRyxJQUN4QixDQUFDLG1DQUFtQyxFQUFFc0Msa0JBQ25DMUUsR0FBRyxDQUFDLENBQUNvRixNQUFRLENBQUMsQ0FBQyxFQUFFQSxJQUFJLENBQUMsQ0FBQyxFQUN2QjFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUNqQixFQUFDLElBRUh1QyxDQUFBQSxpQkFBaUI3QyxNQUFNLEdBQUcsSUFDdEIsQ0FBQyxrQ0FBa0MsRUFBRTZDLGlCQUNsQ2pGLEdBQUcsQ0FBQyxDQUFDb0YsTUFBUSxDQUFDLENBQUMsRUFBRUEsSUFBSSxDQUFDLENBQUMsRUFDdkIxQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FDakIsRUFBQyxJQUVOc0MsQ0FBQUEsaUJBQWlCNUMsTUFBTSxHQUFHLElBQ3ZCLENBQUMsK0JBQStCLEVBQUU0QyxpQkFDL0JoRixHQUFHLENBQUMsQ0FBQ29GLE1BQVEsQ0FBQyxDQUFDLEVBQUVBLElBQUksQ0FBQyxDQUFDLEVBQ3ZCMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQ2pCLEVBQUMsRUFDTixDQUFDLENBQUMsR0FDSCxFQUFDLElBQ0w7U0FDSDtRQUVELE9BQU87WUFDTHpCLE9BQU8sQ0FBQyxZQUFZLEVBQUVaLE9BQU9KLEVBQUUsRUFBRTtZQUNqQzJCO1lBQ0FEO1FBQ0Y7SUFDRjtJQUVBbkIsNEJBQTRCSCxNQUFjLEVBQXFCO1FBQzdELHVCQUF1QjtRQUN2QixJQUFJQSxPQUFPNEQsS0FBSyxDQUFDN0IsTUFBTSxLQUFLLEdBQUc7WUFDN0IsT0FBTztRQUNULE9BQU8sSUFBSS9CLE9BQU9nRixRQUFRLEtBQUtQLFdBQVc7WUFDeEMsT0FBTztRQUNUO1FBRUEsTUFBTWhDLGFBQWEsR0FBR3pDLE9BQU91RCxLQUFLLENBQUNDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFFekQsTUFBTXlCLGNBQWNqRixPQUFPNEQsS0FBSyxDQUFDdkQsTUFBTSxDQUFDLENBQUN3RCxPQUFTQSxLQUFLcUIsUUFBUSxLQUFLO1FBRXBFLE1BQU1DLFlBQThCRixZQUFZdEYsR0FBRyxDQUFDLENBQUNrRTtZQUNuRCxPQUFPO2dCQUNMSCxVQUFVO2dCQUNWRztnQkFDQUYsVUFBVSxFQUFFO1lBQ2Q7UUFDRjtRQUVBLE1BQU1wQyxhQUF1QixFQUFFO1FBQy9CLE1BQU02RCxhQUFhRCxVQUNoQnhGLEdBQUcsQ0FBQyxDQUFDOEQsV0FBYTNFLHFCQUFxQjJFLFVBQVVsQyxhQUNqRGMsSUFBSSxDQUFDO1FBRVIsZ0RBQWdEO1FBQ2hELE1BQU1nRCxnQkFBZ0JyRixPQUFPNEQsS0FBSyxDQUFDdkQsTUFBTSxDQUFDLENBQUNpRixJQUFNQSxFQUFFaEIsSUFBSSxLQUFLLFdBQVczRSxHQUFHLENBQUMsQ0FBQzJGLElBQU1BLEVBQUVuQixJQUFJO1FBRXhGLHVCQUF1QjtRQUN2QixNQUFNb0IsZUFBZXZGLE9BQU80RCxLQUFLLENBQUN2RCxNQUFNLENBQUMsQ0FBQ2lGLElBQU1BLEVBQUVoQixJQUFJLEtBQUs7UUFFM0QsNkJBQTZCO1FBQzdCLE1BQU1rQixhQUFhLEdBQUd4RixPQUFPSixFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzNDLE1BQU02RixtQkFDSkYsYUFBYXhELE1BQU0sR0FBRyxJQUFJd0QsYUFBYTVGLEdBQUcsQ0FBQyxDQUFDa0UsT0FBUyxDQUFDLENBQUMsRUFBRUEsS0FBS00sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFOUIsSUFBSSxDQUFDLFNBQVM7UUFDdkYsTUFBTXFELGdCQUNKTCxjQUFjdEQsTUFBTSxHQUFHLElBQUlzRCxjQUFjMUYsR0FBRyxDQUFDLENBQUNnRyxJQUFNLENBQUMsQ0FBQyxFQUFFQSxFQUFFLENBQUMsQ0FBQyxFQUFFdEQsSUFBSSxDQUFDLFNBQVM7UUFFOUUseUJBQXlCO1FBQ3pCLE1BQU11RCxTQUFTNUYsT0FBTzZGLFNBQVM7UUFDL0IsTUFBTUMsWUFDSkYsV0FBVyxZQUFZQSxXQUFXLFNBQzlCLDJCQUNBO1FBRU4sTUFBTTlCLGFBQWEsQ0FBQzs7OztVQUlkLEVBQUU5RCxPQUFPSixFQUFFLENBQUM7O1dBRVgsRUFBRUksT0FBT0osRUFBRSxDQUFDOztNQUVqQixFQUFFa0csVUFBVTsyQ0FDeUIsRUFBRU4sV0FBVyxFQUFFLEVBQUVFLGNBQWMsRUFBRSxFQUFFRCxpQkFBaUIsS0FBSyxFQUFFTCxXQUFXOztBQUVqSCxDQUFDLENBQUNXLElBQUk7UUFFRixNQUFNekUsUUFBUTtZQUNaLENBQUMsYUFBYSxFQUFFbUIsV0FBVyxHQUFHLEVBQUVxQixXQUFXLENBQUMsQ0FBQztZQUM3QyxDQUFDLFlBQVksRUFBRXJCLFdBQVcsa0JBQWtCLEVBQUVBLFdBQVcsRUFBRSxDQUFDO1NBQzdEO1FBRUQsT0FBTztZQUNMN0IsT0FBTyxDQUFDLGdCQUFnQixFQUFFWixPQUFPSixFQUFFLEVBQUU7WUFDckMyQjtZQUNBRDtRQUNGO0lBQ0Y7SUFFQWxCLG9CQUFvQkosTUFBYyxFQUFxQjtRQUNyRCxJQUFJeUIsT0FBT0MsSUFBSSxDQUFDMUIsT0FBT2dHLE9BQU8sRUFBRWpFLE1BQU0sS0FBSyxHQUFHO1lBQzVDLE9BQU87UUFDVCxPQUFPLElBQUkvQixPQUFPZ0YsUUFBUSxLQUFLUCxXQUFXO1lBQ3hDLE9BQU87UUFDVDtRQUVBLE1BQU13QixhQUFheEUsT0FBT0MsSUFBSSxDQUFDMUIsT0FBT2dHLE9BQU87UUFDN0MsTUFBTXpFLGFBQXVCLEVBQUU7UUFDL0IsTUFBTUQsUUFBa0I7ZUFDbkIyRSxXQUFXbEcsT0FBTyxDQUFDLENBQUNtRztnQkFDckIsd0JBQXdCO2dCQUN4QixNQUFNQyxhQUFhbkcsT0FBT2dHLE9BQU8sQ0FBQ0UsVUFBVTtnQkFFNUMsb0NBQW9DO2dCQUNwQyxNQUFNZixZQUFZbkYsT0FBT29HLHFCQUFxQixDQUFDRDtnQkFDL0MsTUFBTTFELGFBQWEsR0FBR3pDLE9BQU91RCxLQUFLLENBQUNDLE1BQU0sQ0FBQyxNQUFNLEVBQUUwQyxXQUFXO2dCQUM3RCxNQUFNekMsV0FBMkI7b0JBQy9CQyxVQUFVO29CQUNWQyxVQUFVd0I7Z0JBQ1o7Z0JBRUEsNENBQTRDO2dCQUM1QyxNQUFNL0MsT0FBT3RELHFCQUFxQjJFLFVBQVVsQztnQkFFNUMsT0FBTztvQkFDTCxDQUFDLGFBQWEsRUFBRWtCLFdBQVcsR0FBRyxFQUFFTCxLQUFLaUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7b0JBQ3pELENBQUMsWUFBWSxFQUFFNUQsV0FBVyxrQkFBa0IsRUFBRUEsV0FBVyxFQUFFLENBQUM7aUJBQzdEO1lBQ0g7WUFDQSxDQUFDLFlBQVksRUFBRXpDLE9BQU91RCxLQUFLLENBQUNDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztlQUNsRHlDLFdBQVd0RyxHQUFHLENBQUMsQ0FBQ3VHLFlBQWMsQ0FBQyxFQUFFLEVBQUVBLFVBQVUsRUFBRSxFQUFFbEcsT0FBT3VELEtBQUssQ0FBQ0MsTUFBTSxDQUFDLE1BQU0sRUFBRTBDLFVBQVUsQ0FBQyxDQUFDO1lBQzVGO1lBQ0EsQ0FBQyxhQUFhLEVBQUVsRyxPQUFPdUQsS0FBSyxDQUFDQyxNQUFNLENBQUMsb0JBQW9CLEVBQUV5QyxXQUN2RHRHLEdBQUcsQ0FBQyxDQUFDMkcsSUFBTSxDQUFDLENBQUMsRUFBRUEsRUFBRSxDQUFDLENBQUMsRUFDbkJqRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDakIsQ0FBQyxZQUFZLEVBQUVyQyxPQUFPdUQsS0FBSyxDQUFDQyxNQUFNLENBQUMsMkJBQTJCLEVBQUV4RCxPQUFPdUQsS0FBSyxDQUFDQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ2hHO1NBQ0Q7UUFFRCxPQUFPO1lBQ0w1QyxPQUFPLENBQUMsU0FBUyxFQUFFWixPQUFPSixFQUFFLEVBQUU7WUFDOUIwQjtZQUNBQyxZQUFZbEQsT0FBT2tEO1FBQ3JCO0lBQ0Y7QUFDRiJ9
265
+ //#endregion
266
+ export { Template__generated };
267
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkLnRlbXBsYXRlLmpzIiwibmFtZXMiOlsiZW50aXR5IiwicHJvcE5vZGU6IEVudGl0eVByb3BOb2RlIiwiZnVsbHRleHRDb2x1bW5zOiBFbnRpdHlJbmRleFtcImNvbHVtbnNcIl1bXSIsInByb3BOb2RlczogRW50aXR5UHJvcE5vZGVbXSIsImltcG9ydEtleXM6IHN0cmluZ1tdIiwibGluZXM6IHN0cmluZ1tdIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9nZW5lcmF0ZWQudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgaXNWaXJ0dWFsQ29kZVByb3AsIGlzVmlydHVhbFF1ZXJ5UHJvcCB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlQcm9wTm9kZSB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFUywgcHJvcE5vZGVUb1pvZFR5cGVEZWYsIHpvZFR5cGVUb1pvZENvZGUgfSBmcm9tIFwiLi4vem9kLWNvbnZlcnRlclwiO1xuXG5leHBvcnQgdHlwZSBTb3VyY2VDb2RlID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBsaW5lczogc3RyaW5nW107XG4gIGltcG9ydEtleXM6IHN0cmluZ1tdO1xufTtcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fZ2VuZXJhdGVkIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImdlbmVyYXRlZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgY29uc3QgeyBkaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGBzb25hbXUuZ2VuZXJhdGVkLnRzYCxcbiAgICB9O1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGVudGl0aWVzID0gZW50aXR5SWRzLm1hcCgoaWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGlkKSk7XG5cbiAgICAvLyDsoITssrQgU291cmNlQ29kZSDsg53shLFcbiAgICBjb25zdCBzb3VyY2VDb2RlcyA9IGVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT4ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy5nZXRFbnVtc1NvdXJjZUNvZGUoZW50aXR5KSxcbiAgICAgICAgdGhpcy5nZXRCYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldFN1YnNldFNvdXJjZUNvZGUoZW50aXR5KSxcbiAgICAgIF0uZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgICB9KTtcbiAgICBOYWl0ZS50KFwiVGVtcGxhdGVfX2dlbmVyYXRlZDpzb3VyY2VDb2Rlc1wiLCBzb3VyY2VDb2Rlcyk7XG5cbiAgICAvLyBTb3J0XG4gICAgY29uc3QgTEFCRUxfS0VZX09SREVSID0gW1wiRW51bXNcIiwgXCJCYXNlU2NoZW1hXCIsIFwiQmFzZUxpc3RQYXJhbXNcIiwgXCJTdWJzZXRzXCIsIFwiU3Vic2V0UXVlcmllc1wiXTtcbiAgICBzb3VyY2VDb2Rlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBbYUtleV0gPSBhLmxhYmVsLnNwbGl0KFwiOlwiKTtcbiAgICAgIGNvbnN0IFtiS2V5XSA9IGIubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgYUluZGV4ID0gTEFCRUxfS0VZX09SREVSLmluZGV4T2YoYUtleSk7XG4gICAgICBjb25zdCBiSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihiS2V5KTtcbiAgICAgIGlmIChhSW5kZXggPiBiSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGFJbmRleCA8IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzb3VyY2VDb2Rlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB0cykgPT4ge1xuICAgICAgICBpZiAodHMgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZXM6IFsuLi5yZXN1bHQubGluZXMsIGAvLyAke3RzLmxhYmVsfWAsIC4uLnRzLmxpbmVzLCBcIlwiXSxcbiAgICAgICAgICBpbXBvcnRLZXlzOiB1bmlxdWUoWy4uLnJlc3VsdC5pbXBvcnRLZXlzLCAuLi50cy5pbXBvcnRLZXlzXS50b1NvcnRlZCgpKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxpbmVzOiBbXSxcbiAgICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICB9IGFzIE9taXQ8U291cmNlQ29kZSwgXCJsYWJlbFwiPixcbiAgICApO1xuXG4gICAgLy8gLnR5cGVzLnRz7J2YIO2DgOyeheydhCDssLjsobDtlZjripQg6rK97JqwIOyInO2ZmOywuOyhsCjsg4HtmLjssLjsobAp6rCAIOuwnOyDne2VmOuvgOuhnCDtg4DsnoXsnYQg6rCA7KC47JmAIOyduOudvOyduCDsspjrpqxcbiAgICBjb25zdCBhbGxUeXBlS2V5cyA9IGVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT4gT2JqZWN0LmtleXMoZW50aXR5LnR5cGVzKSk7XG4gICAgY29uc3QgY2RJbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcigoaW1wb3J0S2V5KSA9PlxuICAgICAgYWxsVHlwZUtleXMuaW5jbHVkZXMoaW1wb3J0S2V5KSxcbiAgICApO1xuICAgIGlmIChjZEltcG9ydEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VzdG9tU2NhbGFyTGluZXMgPSBjZEltcG9ydEtleXMuZmxhdE1hcCgoaW1wb3J0S2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IGVudGl0aWVzLmZpbmQoKGVudGl0eSkgPT4gZW50aXR5LnR5cGVzW2ltcG9ydEtleV0pO1xuICAgICAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWm9kVHlwZSBub3QgZm91bmQgJHtpbXBvcnRLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgem9kVHlwZSA9IGVudGl0eS50eXBlc1tpbXBvcnRLZXldO1xuICAgICAgICBhc3NlcnQoem9kVHlwZSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgLy8gQ3VzdG9tU2NhbGFyOiAke2ltcG9ydEtleX1gLFxuICAgICAgICAgIGBjb25zdCAke2ltcG9ydEtleX0gPSAke3pvZFR5cGVUb1pvZENvZGUoem9kVHlwZSl9O2AsXG4gICAgICAgICAgYHR5cGUgJHtpbXBvcnRLZXl9ID0gei5pbmZlcjx0eXBlb2YgJHtpbXBvcnRLZXl9PmAsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXTtcbiAgICAgIH0pO1xuICAgICAgc291cmNlQ29kZS5saW5lcyA9IFsuLi5jdXN0b21TY2FsYXJMaW5lcywgLi4uc291cmNlQ29kZS5saW5lc107XG4gICAgICBzb3VyY2VDb2RlLmltcG9ydEtleXMgPSBzb3VyY2VDb2RlLmltcG9ydEtleXMuZmlsdGVyKFxuICAgICAgICAoaW1wb3J0S2V5KSA9PiAhY2RJbXBvcnRLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgTmFpdGUudChcIlRlbXBsYXRlX19nZW5lcmF0ZWQ6Ym9keVwiLCBib2R5KTtcblxuICAgIC8vIGltcG9ydFxuICAgIC8vIHNvdXJjZUNvZGUuaW1wb3J0S2V5c+yXkCDrgrTsnqUg7YOA7J6F7J2YIOyKpO2CpOuniOqwgCDsnojsnLzrqbQgc29uYW11IGltcG9ydOyXkCDstpTqsIBcbiAgICBjb25zdCBidWlsdEluU2NoZW1hTmFtZXMgPSBPYmplY3QudmFsdWVzKEJVSUxUX0lOX1RZUEVTKS5tYXAoXG4gICAgICAoaW5mbykgPT4gaW5mby5zY2hlbWFOYW1lIGFzIHN0cmluZyxcbiAgICApO1xuICAgIGNvbnN0IGJ1aWx0SW5TY2hlbWFzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcigoa2V5KSA9PiBidWlsdEluU2NoZW1hTmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgY29uc3Qgc29uYW11SW1wb3J0cyA9IFtcbiAgICAgIFwiekFycmF5YWJsZVwiLFxuICAgICAgXCJTUUxEYXRlVGltZVN0cmluZ1wiLFxuICAgICAgXCJTdWJzZXRRdWVyeVwiLFxuICAgICAgXCJTb25hbXVRdWVyeU1vZGVcIixcbiAgICAgIFwiQXBwbHlTb25hbXVGaWx0ZXJcIixcbiAgICAgIC4uLmJ1aWx0SW5TY2hlbWFzLFxuICAgIF0uZmlsdGVyKChtb2QpID0+IGJvZHkuaW5jbHVkZXMobW9kKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKlwiLFxuICAgICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgICAgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgICAgXCIgKi9cIixcbiAgICAgICAgXCIvKiBveGxpbnQtZGlzYWJsZSAqL1wiLFxuICAgICAgICBcIlwiLFxuICAgICAgICBgaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7YCxcbiAgICAgICAgYGltcG9ydCB7ICR7c29uYW11SW1wb3J0cy5qb2luKFwiLFwiKX0gfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGdldEVudW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEVudW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgbGluZXM6IE9iamVjdC5lbnRyaWVzKGVudGl0eS5lbnVtTGFiZWxzKVxuICAgICAgICAuZmlsdGVyKChbXywgZW51bUxhYmVsXSkgPT4gT2JqZWN0LmtleXMoZW51bUxhYmVsKS5sZW5ndGggPiAwKVxuICAgICAgICAuZmxhdE1hcCgoW2VudW1JZCwgZW51bUxhYmVsXSkgPT4gW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9ID0gei5lbnVtKFske09iamVjdC5rZXlzKGVudW1MYWJlbCkubWFwKFxuICAgICAgICAgICAgKGVsKSA9PiBgXCIke2VsfVwiYCxcbiAgICAgICAgICApfV0pLmRlc2NyaWJlKFwiJHtlbnVtSWR9XCIpO2AsXG4gICAgICAgICAgYGV4cG9ydCB0eXBlICR7ZW51bUlkfSA9IHouaW5mZXI8dHlwZW9mICR7ZW51bUlkfT47YCxcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7ZW51bUlkfUxhYmVsID0gJHtKU09OLnN0cmluZ2lmeShlbnVtTGFiZWwpfTtgLFxuICAgICAgICBdKSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgIH07XG4gIH1cblxuICBnZXRCYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSwgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXSk6IFNvdXJjZUNvZGUge1xuICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfUJhc2VTY2hlbWFgO1xuICAgIGNvbnN0IHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSA9IHtcbiAgICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgY2hpbGRyZW46IGVudGl0eS5wcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2NoZW1hQm9keSA9ICgoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cyk7XG4gICAgICBpZiAocmVzdWx0LmVuZHNXaXRoKFwiLFwiKSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnNsaWNlKDAsIC0xKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSgpO1xuXG4gICAgLy8gZnVsbHRleHQgaW5kZXjsl5Ag7Y+s7ZWo65CcIOy7rOufvOuTpCDstpTstpxcbiAgICAvLyBUT0RPOiBHSU4vR2lTVCDsnbjrjbHsiqQg7IOd7ISx65CcIOy7rOufvCDstpTstpxcbiAgICBjb25zdCBmdWxsdGV4dENvbHVtbnM6IEVudGl0eUluZGV4W1wiY29sdW1uc1wiXVtdID0gW107XG5cbiAgICAvLyB2aXJ0dWFsIHByb3BzICh2aXJ0dWFsVHlwZTogXCJjb2RlXCIg65iQ64qUIHVuZGVmaW5lZOyduCDqsoPrp4wg7Y+s7ZWoKVxuICAgIGNvbnN0IHZpcnR1YWxQcm9wcyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4gaXNWaXJ0dWFsQ29kZVByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLy8gcXVlcnkgdmlydHVhbCBwcm9wcyAodmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsoPrp4wg7Y+s7ZWoKVxuICAgIGNvbnN0IHZpcnR1YWxRdWVyeVByb3BzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwcm9wKSA9PiBpc1ZpcnR1YWxRdWVyeVByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogaGFzRGVmYXVsdCBwcm9wc1xuICAgICAqIC0gbnVsbGFibGUg65iQ64qUIGRiRGVmYXVsdOqwgCDsnojripQg7Lus65+8IChpZCDtj6ztlagpXG4gICAgICogLSByZWxhdGlvbuydtCDslYTri4jqsbDrgpgsIHJlbGF0aW9u7J207Ja064+EIG51bGxhYmxl7J2066m0IO2PrO2VqFxuICAgICAqL1xuICAgIGNvbnN0IGhhc0RlZmF1bHRDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkgJiZcbiAgICAgICAgICAocHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSB8fCAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7cHJvcC5uYW1lfV9pZGAgOiBwcm9wLm5hbWUpKVxuICAgICAgLmNvbmNhdChcImlkXCIpO1xuXG4gICAgLyoqXG4gICAgICogaGFzVmVjdG9yIHByb3BzXG4gICAgICogLSB2ZWN0b3Ig7YOA7J6F7J24IOy7rOufvFxuICAgICAqL1xuICAgIGNvbnN0IGhhc1ZlY3RvckNvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JcIiB8fCBwcm9wLnR5cGUgPT09IFwidmVjdG9yW11cIilcbiAgICAgIC5tYXAoKHByb3ApID0+IHByb3AubmFtZSk7XG5cbiAgICAvKipcbiAgICAgKiBnZW5lcmF0ZWQgcHJvcHNcbiAgICAgKiAtIGdlbmVyYXRlZCDsho3shLHsnbQg7J6I64qUIOy7rOufvCAoSU5TRVJUL1VQREFURSDsi5wg6rCSIOygnOqztSDrtojqsIApXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgcHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgKHByb3AuZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgfHwgcHJvcC50eXBlID09PSBcInNlYXJjaFRleHRcIiksXG4gICAgICApXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgY29uc3QgaGFzTWV0YWRhdGEgPVxuICAgICAgZnVsbHRleHRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHZpcnR1YWxQcm9wcy5sZW5ndGggPiAwIHx8XG4gICAgICB2aXJ0dWFsUXVlcnlQcm9wcy5sZW5ndGggPiAwIHx8XG4gICAgICBoYXNEZWZhdWx0Q29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIGhhc1ZlY3RvckNvbHVtbnMubGVuZ3RoID4gMDtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fTtgLFxuICAgICAgYGV4cG9ydCB0eXBlICR7c2NoZW1hTmFtZX0gPSB6LmluZmVyPHR5cGVvZiAke3NjaGVtYU5hbWV9PmAgK1xuICAgICAgICAoaGFzTWV0YWRhdGFcbiAgICAgICAgICA/IGAgJiB7JHtcbiAgICAgICAgICAgICAgKGZ1bGx0ZXh0Q29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX19mdWxsdGV4dF9fOiByZWFkb25seSBbJHtmdWxsdGV4dENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgICh2aXJ0dWFsUHJvcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fdmlydHVhbF9fOiByZWFkb25seSBbJHt2aXJ0dWFsUHJvcHMubWFwKChwcm9wKSA9PiBgXCIke3Byb3B9XCJgKS5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgICh2aXJ0dWFsUXVlcnlQcm9wcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192aXJ0dWFsX3F1ZXJ5X186IHJlYWRvbmx5IFske3ZpcnR1YWxRdWVyeVByb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wfVwiYCkuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAoaGFzRGVmYXVsdENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9faGFzRGVmYXVsdF9fOiByZWFkb25seSBbJHtoYXNEZWZhdWx0Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKGdlbmVyYXRlZENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgIChoYXNWZWN0b3JDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX3ZlY3Rvcl9fOiByZWFkb25seSBbJHtoYXNWZWN0b3JDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2x9XCJgKVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIilcbiAgICAgICAgICAgIH19YFxuICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICBcIjtcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgQmFzZVNjaGVtYTogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGltcG9ydEtleXMsXG4gICAgICBsaW5lcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIC8vIFByb3Ag7JeG64qUIE1E7J24IOqyveyasCDsg53shLEg7KCc7Jm4XG4gICAgaWYgKGVudGl0eS5wcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZW50aXR5LnBhcmVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfUJhc2VMaXN0UGFyYW1zYDtcblxuICAgIGNvbnN0IGZpbHRlclByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcigocHJvcCkgPT4gcHJvcC50b0ZpbHRlciA9PT0gdHJ1ZSk7XG5cbiAgICBjb25zdCBwcm9wTm9kZXM6IEVudGl0eVByb3BOb2RlW10gPSBmaWx0ZXJQcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGZpbHRlckJvZHkgPSBwcm9wTm9kZXNcbiAgICAgIC5tYXAoKHByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cykpXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIC8vIEZpbHRlclF1ZXJ5IO2DgOyeheydhCDsnITtlZwg7KCc7Jm47ZWgIHByb3BzIOy2lOy2nCAodmlydHVhbOunjCDsoJzsmbgpXG4gICAgY29uc3QgZXhjbHVkZWRQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJ2aXJ0dWFsXCIpLm1hcCgocCkgPT4gcC5uYW1lKTtcblxuICAgIC8vIG51bWVyaWMg7YOA7J6F7J24IHByb3BzIOy2lOy2nFxuICAgIGNvbnN0IG51bWVyaWNQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJudW1lcmljXCIpO1xuXG4gICAgLy8gQXBwbHlTb25hbXVGaWx0ZXIg7YOA7J6FIOyduOyekCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlUeXBlID0gYCR7ZW50aXR5LmlkfUJhc2VTY2hlbWFgO1xuICAgIGNvbnN0IG51bWVyaWNLZXlzVW5pb24gPVxuICAgICAgbnVtZXJpY1Byb3BzLmxlbmd0aCA+IDAgPyBudW1lcmljUHJvcHMubWFwKChwcm9wKSA9PiBgXCIke3Byb3AubmFtZX1cImApLmpvaW4oXCIgfCBcIikgOiBcIm5ldmVyXCI7XG4gICAgY29uc3Qgb21pdEtleXNVbmlvbiA9XG4gICAgICBleGNsdWRlZFByb3BzLmxlbmd0aCA+IDAgPyBleGNsdWRlZFByb3BzLm1hcCgobikgPT4gYFwiJHtufVwiYCkuam9pbihcIiB8IFwiKSA6IFwibmV2ZXJcIjtcblxuICAgIC8vIFBLIO2DgOyeheyXkCDrlLDrpbggaWQgWm9kIO2DgOyehSDqsrDsoJVcbiAgICBjb25zdCBwa1R5cGUgPSBlbnRpdHkuZ2V0UGtUeXBlKCk7XG4gICAgY29uc3QgaWRab2RUeXBlID1cbiAgICAgIHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiXG4gICAgICAgID8gXCJ6QXJyYXlhYmxlKHouc3RyaW5nKCkpXCJcbiAgICAgICAgOiBcInpBcnJheWFibGUoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKVwiO1xuXG4gICAgY29uc3Qgc2NoZW1hQm9keSA9IGBcbnoub2JqZWN0KHtcbiAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gIHBhZ2U6IHoubnVtYmVyKCkuaW50KCkubWluKDEpLFxuICBzZWFyY2g6ICR7ZW50aXR5LmlkfVNlYXJjaEZpZWxkLFxuICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICBvcmRlckJ5OiAke2VudGl0eS5pZH1PcmRlckJ5LFxuICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgaWQ6ICR7aWRab2RUeXBlfSxcbiAgc29uYW11RmlsdGVyOiB6LmN1c3RvbTxBcHBseVNvbmFtdUZpbHRlcjwke2VudGl0eVR5cGV9LCAke29taXRLZXlzVW5pb259LCAke251bWVyaWNLZXlzVW5pb259Pj4oKSwke2ZpbHRlckJvZHl9XG59KS5wYXJ0aWFsKCk7XG5gLnRyaW0oKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fTtgLFxuICAgICAgYGV4cG9ydCB0eXBlICR7c2NoZW1hTmFtZX0gPSB6LmluZmVyPHR5cGVvZiAke3NjaGVtYU5hbWV9PjtgLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBCYXNlTGlzdFBhcmFtczogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGltcG9ydEtleXMsXG4gICAgICBsaW5lcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChlbnRpdHkucGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKTtcbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgIC4uLnN1YnNldEtleXMuZmxhdE1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgIC8vIOyEnOu4jOyFi+yXkOyEnCBGaWVsZEV4cHJbXSDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgZmllbGRFeHBycyA9IGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG5cbiAgICAgICAgLy8gRmllbGRFeHByW13roZwgRW50aXR5UHJvcE5vZGVbXSDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgcHJvcE5vZGVzID0gZW50aXR5LmZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzKTtcbiAgICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0JHtzdWJzZXRLZXl9YDtcbiAgICAgICAgY29uc3QgcHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgICAgICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIGNoaWxkcmVuOiBwcm9wTm9kZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRW50aXR5UHJvcE5vZGVbXeuhnCBab2RUeXBlRGVmKHN0cmluZynsnYQg6rCA7KC47Ji0XG4gICAgICAgIGNvbnN0IGJvZHkgPSBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZSwgaW1wb3J0S2V5cyk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7c2NoZW1hTmFtZX0gPSAke2JvZHkucmVwbGFjZSgvLCQvLCBcIlwiKX07YCxcbiAgICAgICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+O2AsXG4gICAgICAgIF07XG4gICAgICB9KSxcbiAgICAgIGBleHBvcnQgdHlwZSAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0TWFwcGluZyA9IHtgLFxuICAgICAgLi4uc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4gYCAgJHtzdWJzZXRLZXl9OiAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0JHtzdWJzZXRLZXl9O2ApLFxuICAgICAgXCJ9O1wiLFxuICAgICAgYGV4cG9ydCBjb25zdCAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5ID0gei5lbnVtKFske3N1YnNldEtleXNcbiAgICAgICAgLm1hcCgoaykgPT4gYFwiJHtrfVwiYClcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pO2AsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleSA9IHouaW5mZXI8dHlwZW9mICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXk+O2AsXG4gICAgICBcIlwiLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBTdWJzZXRzOiAke2VudGl0eS5pZH1gLFxuICAgICAgbGluZXMsXG4gICAgICBpbXBvcnRLZXlzOiB1bmlxdWUoaW1wb3J0S2V5cyksXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7VUFJbUM7cUJBRXlCO1lBQ2xCO1lBQ2dDO1lBRTFCO2VBQ1Q7b0JBQ21EO0FBTzFGLElBQWEsc0JBQWIsY0FBeUMsU0FBUztDQUNoRCxjQUFjO0FBQ1osUUFBTSxZQUFZOztDQUdwQixtQkFBbUI7RUFDakIsTUFBTSxFQUFFLFFBQVEsT0FBTyxPQUFPO0FBQzlCLFNBQU87R0FDTCxRQUFRLEdBQUcsSUFBSTtHQUNmLE1BQU07R0FDUDs7Q0FFSCxTQUFTO0VBQ1AsTUFBTSxZQUFZLGNBQWMsV0FBVztFQUMzQyxNQUFNLFdBQVcsVUFBVSxLQUFLLE9BQU8sY0FBYyxJQUFJLEdBQUcsQ0FBQztFQUc3RCxNQUFNLGNBQWMsU0FBUyxTQUFTLFdBQVc7QUFDL0MsVUFBTztJQUNMLEtBQUssbUJBQW1CLE9BQU87SUFDL0IsS0FBSyx3QkFBd0IsT0FBTztJQUNwQyxLQUFLLDRCQUE0QixPQUFPO0lBQ3hDLEtBQUssb0JBQW9CLE9BQU87SUFDakMsQ0FBQyxPQUFPLFlBQVk7SUFDckI7QUFDRixRQUFNLEVBQUUsbUNBQW1DLFlBQVk7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