sonamu 0.6.0 → 0.7.1

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 (406) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +2 -1
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +6 -1
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +178 -409
  44. package/dist/api/config.d.ts +27 -13
  45. package/dist/api/config.d.ts.map +1 -1
  46. package/dist/api/config.js +19 -26
  47. package/dist/api/context.d.ts +4 -3
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +1 -1
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +111 -18
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +3 -3
  56. package/dist/api/sonamu.d.ts +7 -7
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +83 -51
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +5 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +5 -2
  65. package/dist/bin/cli.js +165 -64
  66. package/dist/bin/loader-register.d.ts +2 -0
  67. package/dist/bin/loader-register.d.ts.map +1 -0
  68. package/dist/bin/loader-register.js +34 -0
  69. package/dist/database/_batch_update.d.ts +5 -3
  70. package/dist/database/_batch_update.d.ts.map +1 -1
  71. package/dist/database/_batch_update.js +30 -13
  72. package/dist/database/base-model.d.ts +96 -10
  73. package/dist/database/base-model.d.ts.map +1 -1
  74. package/dist/database/base-model.js +232 -89
  75. package/dist/database/base-model.types.d.ts +93 -0
  76. package/dist/database/base-model.types.d.ts.map +1 -0
  77. package/dist/database/base-model.types.js +10 -0
  78. package/dist/database/code-generator.d.ts +1 -1
  79. package/dist/database/code-generator.d.ts.map +1 -1
  80. package/dist/database/code-generator.js +11 -10
  81. package/dist/database/db.d.ts +5 -6
  82. package/dist/database/db.d.ts.map +1 -1
  83. package/dist/database/db.js +22 -25
  84. package/dist/database/puri-subset.test-d.js +81 -0
  85. package/dist/database/puri-subset.types.d.ts +123 -0
  86. package/dist/database/puri-subset.types.d.ts.map +1 -0
  87. package/dist/database/puri-subset.types.js +16 -0
  88. package/dist/database/puri-wrapper.d.ts +13 -11
  89. package/dist/database/puri-wrapper.d.ts.map +1 -1
  90. package/dist/database/puri-wrapper.js +2 -2
  91. package/dist/database/puri.d.ts +25 -14
  92. package/dist/database/puri.d.ts.map +1 -1
  93. package/dist/database/puri.js +83 -21
  94. package/dist/database/puri.types.d.ts +21 -7
  95. package/dist/database/puri.types.d.ts.map +1 -1
  96. package/dist/database/puri.types.js +4 -1
  97. package/dist/database/transaction-context.d.ts +1 -1
  98. package/dist/database/transaction-context.d.ts.map +1 -1
  99. package/dist/database/transaction-context.js +1 -1
  100. package/dist/database/upsert-builder.d.ts +9 -3
  101. package/dist/database/upsert-builder.d.ts.map +1 -1
  102. package/dist/database/upsert-builder.js +227 -78
  103. package/dist/entity/entity-manager.d.ts +165 -2
  104. package/dist/entity/entity-manager.d.ts.map +1 -1
  105. package/dist/entity/entity-manager.js +26 -10
  106. package/dist/entity/entity.d.ts +5 -3
  107. package/dist/entity/entity.d.ts.map +1 -1
  108. package/dist/entity/entity.js +153 -54
  109. package/dist/exceptions/error-handler.d.ts +1 -1
  110. package/dist/exceptions/error-handler.d.ts.map +1 -1
  111. package/dist/exceptions/error-handler.js +1 -1
  112. package/dist/exceptions/so-exceptions.d.ts +1 -1
  113. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  114. package/dist/exceptions/so-exceptions.js +1 -1
  115. package/dist/file-storage/driver.d.ts +1 -1
  116. package/dist/file-storage/driver.d.ts.map +1 -1
  117. package/dist/file-storage/driver.js +1 -1
  118. package/dist/file-storage/file-storage.js +2 -2
  119. package/dist/index.d.ts +18 -11
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +19 -13
  122. package/dist/migration/code-generation.d.ts +1 -1
  123. package/dist/migration/code-generation.d.ts.map +1 -1
  124. package/dist/migration/code-generation.js +123 -67
  125. package/dist/migration/migration-set.d.ts +2 -10
  126. package/dist/migration/migration-set.d.ts.map +1 -1
  127. package/dist/migration/migration-set.js +67 -218
  128. package/dist/migration/migrator.d.ts +24 -73
  129. package/dist/migration/migrator.d.ts.map +1 -1
  130. package/dist/migration/migrator.js +121 -301
  131. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  132. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  133. package/dist/migration/postgresql-schema-reader.js +245 -0
  134. package/dist/migration/types.d.ts +6 -38
  135. package/dist/migration/types.d.ts.map +1 -1
  136. package/dist/migration/types.js +1 -1
  137. package/dist/naite/messaging-types.d.ts +43 -0
  138. package/dist/naite/messaging-types.d.ts.map +1 -0
  139. package/dist/naite/messaging-types.js +7 -0
  140. package/dist/naite/naite-reporter.d.ts +41 -0
  141. package/dist/naite/naite-reporter.d.ts.map +1 -0
  142. package/dist/naite/naite-reporter.js +102 -0
  143. package/dist/naite/naite.d.ts +91 -8
  144. package/dist/naite/naite.d.ts.map +1 -1
  145. package/dist/naite/naite.js +285 -41
  146. package/dist/stream/sse.d.ts +2 -2
  147. package/dist/stream/sse.d.ts.map +1 -1
  148. package/dist/stream/sse.js +1 -1
  149. package/dist/syncer/api-parser.d.ts +3 -13
  150. package/dist/syncer/api-parser.d.ts.map +1 -1
  151. package/dist/syncer/api-parser.js +67 -56
  152. package/dist/syncer/checksum.d.ts +2 -2
  153. package/dist/syncer/checksum.d.ts.map +1 -1
  154. package/dist/syncer/checksum.js +11 -11
  155. package/dist/syncer/code-generator.d.ts +3 -3
  156. package/dist/syncer/code-generator.d.ts.map +1 -1
  157. package/dist/syncer/code-generator.js +37 -17
  158. package/dist/syncer/entity-operations.d.ts +2 -2
  159. package/dist/syncer/entity-operations.d.ts.map +1 -1
  160. package/dist/syncer/entity-operations.js +9 -8
  161. package/dist/syncer/file-patterns.d.ts +1 -1
  162. package/dist/syncer/file-patterns.d.ts.map +1 -1
  163. package/dist/syncer/file-patterns.js +1 -1
  164. package/dist/syncer/index.d.ts +4 -4
  165. package/dist/syncer/index.d.ts.map +1 -1
  166. package/dist/syncer/index.js +5 -5
  167. package/dist/syncer/module-loader.d.ts +4 -4
  168. package/dist/syncer/module-loader.d.ts.map +1 -1
  169. package/dist/syncer/module-loader.js +17 -12
  170. package/dist/syncer/syncer.d.ts +31 -24
  171. package/dist/syncer/syncer.d.ts.map +1 -1
  172. package/dist/syncer/syncer.js +92 -45
  173. package/dist/template/entity-converter.d.ts +1 -1
  174. package/dist/template/entity-converter.d.ts.map +1 -1
  175. package/dist/template/entity-converter.js +15 -8
  176. package/dist/template/helpers.d.ts +2 -2
  177. package/dist/template/helpers.d.ts.map +1 -1
  178. package/dist/template/helpers.js +3 -3
  179. package/dist/template/implementations/entity.template.d.ts +2 -2
  180. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  181. package/dist/template/implementations/entity.template.js +4 -5
  182. package/dist/template/implementations/generated.template.d.ts +2 -3
  183. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  184. package/dist/template/implementations/generated.template.js +46 -29
  185. package/dist/template/implementations/generated_http.template.d.ts +2 -3
  186. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  187. package/dist/template/implementations/generated_http.template.js +9 -9
  188. package/dist/template/implementations/generated_sso.template.d.ts +3 -4
  189. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  190. package/dist/template/implementations/generated_sso.template.js +54 -25
  191. package/dist/template/implementations/init_types.template.d.ts +2 -2
  192. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  193. package/dist/template/implementations/init_types.template.js +2 -2
  194. package/dist/template/implementations/model.template.d.ts +2 -2
  195. package/dist/template/implementations/model.template.d.ts.map +1 -1
  196. package/dist/template/implementations/model.template.js +47 -37
  197. package/dist/template/implementations/model_test.template.d.ts +2 -2
  198. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  199. package/dist/template/implementations/model_test.template.js +2 -2
  200. package/dist/template/implementations/service.template.d.ts +4 -4
  201. package/dist/template/implementations/service.template.d.ts.map +1 -1
  202. package/dist/template/implementations/service.template.js +24 -16
  203. package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
  204. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
  205. package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
  206. package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
  207. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
  208. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  209. package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
  210. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  211. package/dist/template/implementations/view_enums_select.template.js +2 -2
  212. package/dist/template/implementations/view_form.template.d.ts +2 -2
  213. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  214. package/dist/template/implementations/view_form.template.js +4 -4
  215. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  216. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  217. package/dist/template/implementations/view_id_all_select.template.js +1 -1
  218. package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
  219. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  220. package/dist/template/implementations/view_id_async_select.template.js +1 -1
  221. package/dist/template/implementations/view_list.template.d.ts +2 -2
  222. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  223. package/dist/template/implementations/view_list.template.js +29 -19
  224. package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
  225. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
  226. package/dist/template/implementations/view_list_columns.template.js +1 -1
  227. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  228. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  229. package/dist/template/implementations/view_search_input.template.js +1 -1
  230. package/dist/template/index.d.ts +4 -2
  231. package/dist/template/index.d.ts.map +1 -1
  232. package/dist/template/index.js +5 -3
  233. package/dist/template/template-manager.d.ts +56 -0
  234. package/dist/template/template-manager.d.ts.map +1 -0
  235. package/dist/template/template-manager.js +125 -0
  236. package/dist/template/template-types.d.ts +16 -0
  237. package/dist/template/template-types.d.ts.map +1 -0
  238. package/dist/template/template-types.js +7 -0
  239. package/dist/template/template.d.ts +12 -2
  240. package/dist/template/template.d.ts.map +1 -1
  241. package/dist/template/template.js +19 -6
  242. package/dist/template/zod-converter.d.ts +40 -7
  243. package/dist/template/zod-converter.d.ts.map +1 -1
  244. package/dist/template/zod-converter.js +386 -58
  245. package/dist/testing/_relation-graph.d.ts +1 -1
  246. package/dist/testing/_relation-graph.d.ts.map +1 -1
  247. package/dist/testing/_relation-graph.js +12 -3
  248. package/dist/testing/fixture-manager.d.ts +42 -11
  249. package/dist/testing/fixture-manager.d.ts.map +1 -1
  250. package/dist/testing/fixture-manager.js +338 -236
  251. package/dist/types/types.d.ts +709 -104
  252. package/dist/types/types.d.ts.map +1 -1
  253. package/dist/types/types.js +309 -52
  254. package/dist/typings/knex.d.js +2 -2
  255. package/dist/utils/async-utils.d.ts.map +1 -1
  256. package/dist/utils/async-utils.js +3 -3
  257. package/dist/utils/console-util.js +1 -1
  258. package/dist/utils/controller.d.ts +1 -0
  259. package/dist/utils/controller.d.ts.map +1 -1
  260. package/dist/utils/controller.js +4 -1
  261. package/dist/utils/esm-utils.d.ts +0 -6
  262. package/dist/utils/esm-utils.d.ts.map +1 -1
  263. package/dist/utils/esm-utils.js +2 -9
  264. package/dist/utils/formatter.d.ts +3 -0
  265. package/dist/utils/formatter.d.ts.map +1 -0
  266. package/dist/utils/formatter.js +110 -0
  267. package/dist/utils/fs-utils.d.ts +1 -1
  268. package/dist/utils/fs-utils.d.ts.map +1 -1
  269. package/dist/utils/fs-utils.js +1 -1
  270. package/dist/utils/lodash-able.d.ts.map +1 -1
  271. package/dist/utils/lodash-able.js +1 -1
  272. package/dist/utils/object-utils.d.ts +44 -0
  273. package/dist/utils/object-utils.d.ts.map +1 -0
  274. package/dist/utils/object-utils.js +191 -0
  275. package/dist/utils/path-utils.d.ts +1 -1
  276. package/dist/utils/path-utils.d.ts.map +1 -1
  277. package/dist/utils/path-utils.js +3 -3
  278. package/dist/utils/process-utils.js +1 -1
  279. package/dist/utils/sql-parser.d.ts +5 -1
  280. package/dist/utils/sql-parser.d.ts.map +1 -1
  281. package/dist/utils/sql-parser.js +14 -3
  282. package/dist/utils/type-utils.d.ts +23 -0
  283. package/dist/utils/type-utils.d.ts.map +1 -0
  284. package/dist/utils/type-utils.js +45 -0
  285. package/dist/utils/utils.d.ts +7 -1
  286. package/dist/utils/utils.d.ts.map +1 -1
  287. package/dist/utils/utils.js +44 -5
  288. package/dist/utils/zod-error.d.ts +1 -1
  289. package/dist/utils/zod-error.d.ts.map +1 -1
  290. package/dist/utils/zod-error.js +1 -1
  291. package/package.json +55 -30
  292. package/src/ai/agents/agent.ts +87 -0
  293. package/src/ai/agents/index.ts +2 -0
  294. package/src/ai/agents/types.ts +47 -0
  295. package/src/ai/index.ts +1 -0
  296. package/src/ai/providers/rtzr/api.ts +37 -0
  297. package/src/ai/providers/rtzr/error.ts +34 -0
  298. package/src/ai/providers/rtzr/index.ts +4 -0
  299. package/src/ai/providers/rtzr/model.ts +201 -0
  300. package/src/ai/providers/rtzr/options.ts +49 -0
  301. package/src/ai/providers/rtzr/provider.ts +91 -0
  302. package/src/ai/providers/rtzr/utils.ts +127 -0
  303. package/src/api/base-frame.ts +4 -2
  304. package/src/api/caster.ts +17 -23
  305. package/src/api/code-converters.ts +176 -533
  306. package/src/api/config.ts +39 -56
  307. package/src/api/context.ts +7 -18
  308. package/src/api/decorators.ts +175 -46
  309. package/src/api/index.ts +2 -2
  310. package/src/api/sonamu.ts +133 -124
  311. package/src/api/validator.ts +83 -0
  312. package/src/bin/build-config.ts +7 -1
  313. package/src/bin/cli.ts +192 -110
  314. package/src/bin/loader-register.ts +38 -0
  315. package/src/database/_batch_update.ts +46 -31
  316. package/src/database/base-model.ts +390 -182
  317. package/src/database/base-model.types.ts +155 -0
  318. package/src/database/code-generator.ts +13 -32
  319. package/src/database/db.ts +36 -50
  320. package/src/database/puri-subset.test-d.ts +471 -0
  321. package/src/database/puri-subset.types.ts +195 -0
  322. package/src/database/puri-wrapper.ts +58 -67
  323. package/src/database/puri.ts +182 -126
  324. package/src/database/puri.types.ts +64 -31
  325. package/src/database/transaction-context.ts +1 -1
  326. package/src/database/upsert-builder.ts +261 -132
  327. package/src/entity/entity-manager.ts +36 -28
  328. package/src/entity/entity.ts +330 -249
  329. package/src/exceptions/error-handler.ts +3 -3
  330. package/src/exceptions/so-exceptions.ts +11 -11
  331. package/src/file-storage/driver.ts +5 -5
  332. package/src/file-storage/file-storage.ts +2 -2
  333. package/src/index.ts +18 -12
  334. package/src/migration/code-generation.ts +185 -172
  335. package/src/migration/migration-set.ts +80 -293
  336. package/src/migration/migrator.ts +182 -425
  337. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  338. package/src/migration/postgresql-schema-reader.ts +310 -0
  339. package/src/migration/types.ts +6 -39
  340. package/src/naite/messaging-types.ts +51 -0
  341. package/src/naite/naite-reporter.ts +128 -0
  342. package/src/naite/naite.ts +378 -33
  343. package/src/shared/web.shared.ts.txt +20 -24
  344. package/src/stream/sse.ts +5 -5
  345. package/src/syncer/api-parser.ts +52 -69
  346. package/src/syncer/checksum.ts +25 -37
  347. package/src/syncer/code-generator.ts +58 -62
  348. package/src/syncer/entity-operations.ts +12 -15
  349. package/src/syncer/file-patterns.ts +2 -2
  350. package/src/syncer/index.ts +4 -4
  351. package/src/syncer/module-loader.ts +28 -25
  352. package/src/syncer/syncer.ts +155 -162
  353. package/src/template/entity-converter.ts +18 -27
  354. package/src/template/helpers.ts +8 -11
  355. package/src/template/implementations/entity.template.ts +6 -6
  356. package/src/template/implementations/generated.template.ts +99 -99
  357. package/src/template/implementations/generated_http.template.ts +21 -54
  358. package/src/template/implementations/generated_sso.template.ts +78 -65
  359. package/src/template/implementations/init_types.template.ts +4 -6
  360. package/src/template/implementations/model.template.ts +47 -38
  361. package/src/template/implementations/model_test.template.ts +3 -3
  362. package/src/template/implementations/service.template.ts +56 -80
  363. package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
  364. package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
  365. package/src/template/implementations/view_enums_select.template.ts +3 -3
  366. package/src/template/implementations/view_form.template.ts +34 -75
  367. package/src/template/implementations/view_id_all_select.template.ts +2 -2
  368. package/src/template/implementations/view_id_async_select.template.ts +9 -23
  369. package/src/template/implementations/view_list.template.ts +54 -95
  370. package/src/template/implementations/view_list_columns.template.ts +4 -10
  371. package/src/template/implementations/view_search_input.template.ts +2 -2
  372. package/src/template/index.ts +4 -2
  373. package/src/template/template-manager.ts +166 -0
  374. package/src/template/template-types.ts +16 -0
  375. package/src/template/template.ts +29 -10
  376. package/src/template/zod-converter.ts +459 -101
  377. package/src/testing/_relation-graph.ts +18 -11
  378. package/src/testing/fixture-manager.ts +468 -362
  379. package/src/types/types.ts +516 -248
  380. package/src/typings/knex.d.ts +7 -9
  381. package/src/utils/async-utils.ts +8 -12
  382. package/src/utils/console-util.ts +1 -1
  383. package/src/utils/controller.ts +3 -0
  384. package/src/utils/esm-utils.ts +8 -18
  385. package/src/utils/formatter.ts +109 -0
  386. package/src/utils/fs-utils.ts +1 -1
  387. package/src/utils/lodash-able.ts +1 -4
  388. package/src/utils/object-utils.ts +217 -0
  389. package/src/utils/path-utils.ts +3 -6
  390. package/src/utils/process-utils.ts +1 -1
  391. package/src/utils/sql-parser.ts +23 -5
  392. package/src/utils/type-utils.ts +83 -0
  393. package/src/utils/utils.ts +58 -9
  394. package/src/utils/zod-error.ts +3 -3
  395. package/dist/bin/cli-wrapper.d.ts +0 -3
  396. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  397. package/dist/bin/cli-wrapper.js +0 -72
  398. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  399. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  400. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -39
  401. package/dist/entity/entity-utils.d.ts +0 -61
  402. package/dist/entity/entity-utils.d.ts.map +0 -1
  403. package/dist/entity/entity-utils.js +0 -210
  404. package/src/bin/cli-wrapper.ts +0 -82
  405. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  406. package/src/entity/entity-utils.ts +0 -291
@@ -1,17 +1,34 @@
1
- import z from "zod";
2
- import { EntityManager } from "../entity/entity-manager.js";
3
- import { isBelongsToOneRelationProp, isBigIntegerProp, isBooleanProp, isDateProp, isDateTimeProp, isDecimalProp, isDoubleProp, isEnumProp, isFloatProp, isIntegerProp, isJsonProp, isOneToOneRelationProp, isRelationProp, isStringProp, isTextProp, isTimeProp, isTimestampProp, isUuidProp, isVirtualProp } from "../types/types.js";
1
+ /**
2
+ * zod-converter 구성
3
+ * 1. 유틸리티
4
+ * - getZodTypeById
5
+ *
6
+ * 2. Zod 타입 변환 (EntityProp -> ZodType)
7
+ * - propToZodType
8
+ *
9
+ * 3. EntityProp/Node -> Zod 코드 문자열
10
+ * - propToZodTypeDef
11
+ * - propNodeToZodTypeDef
12
+ *
13
+ * 4. Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환 (ZodType -> ZodCode)
14
+ * - zodTypeToZodCode
15
+ *
16
+ * 5. Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환 (ZodType -> RenderingNode)
17
+ * - zodTypeToRenderingNode
18
+ * - resolveRenderType
19
+ */ import inflection from "inflection";
4
20
  import path from "path";
5
- import { createImportUrl } from "../utils/esm-utils.js";
21
+ import { z } from "zod";
6
22
  import { Sonamu } from "../api/sonamu.js";
7
- import inflection from "inflection";
8
- import { getTextTypeLength } from "../api/index.js";
23
+ import { EntityManager } from "../entity/entity-manager.js";
24
+ import { isBelongsToOneRelationProp, isBigIntegerArrayProp, isBigIntegerSingleProp, isBooleanArrayProp, isBooleanSingleProp, isDateArrayProp, isDateSingleProp, isEnumArrayProp, isEnumSingleProp, isIntegerArrayProp, isIntegerSingleProp, isJsonProp, isNumberArrayProp, isNumberSingleProp, isNumericArrayProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isStringArrayProp, isStringSingleProp, isUuidArrayProp, isUuidSingleProp, isVirtualProp } from "../types/types.js";
25
+ import { createImportUrl } from "../utils/esm-utils.js";
9
26
  /**
10
27
  * Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
11
28
  * dist 디렉토리에서 ESM으로 import하여 가져옵니다.
12
29
  */ export async function getZodTypeById(zodTypeId) {
13
30
  const modulePath = EntityManager.getModulePath(zodTypeId);
14
- const moduleAbsPath = path.join(Sonamu.apiRootPath, "dist", "application", modulePath + ".js");
31
+ const moduleAbsPath = path.join(Sonamu.apiRootPath, "dist", "application", `${modulePath}.js`);
15
32
  const importUrl = createImportUrl(moduleAbsPath);
16
33
  const imported = await import(importUrl);
17
34
  if (!imported[zodTypeId]) {
@@ -19,6 +36,367 @@ import { getTextTypeLength } from "../api/index.js";
19
36
  }
20
37
  return imported[zodTypeId].describe(zodTypeId);
21
38
  }
39
+ /**
40
+ * EntityProp을 Zod 타입으로 변환합니다.
41
+ * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
42
+ */ export async function propToZodType(prop) {
43
+ let zodType = z.unknown();
44
+ if (isIntegerSingleProp(prop)) {
45
+ zodType = z.number().int();
46
+ } else if (isIntegerArrayProp(prop)) {
47
+ zodType = z.number().int().array();
48
+ } else if (isBigIntegerSingleProp(prop)) {
49
+ zodType = z.bigint();
50
+ } else if (isBigIntegerArrayProp(prop)) {
51
+ zodType = z.bigint().array();
52
+ } else if (isEnumSingleProp(prop)) {
53
+ zodType = await getZodTypeById(prop.id);
54
+ } else if (isEnumArrayProp(prop)) {
55
+ zodType = (await getZodTypeById(prop.id)).array();
56
+ } else if (isStringSingleProp(prop)) {
57
+ if (prop.length) {
58
+ zodType = z.string().max(prop.length);
59
+ } else {
60
+ zodType = z.string();
61
+ }
62
+ } else if (isStringArrayProp(prop)) {
63
+ if (prop.length) {
64
+ zodType = z.string().max(prop.length).array();
65
+ } else {
66
+ zodType = z.string().array();
67
+ }
68
+ } else if (isNumberSingleProp(prop)) {
69
+ zodType = z.number();
70
+ } else if (isNumberArrayProp(prop)) {
71
+ zodType = z.number().array();
72
+ } else if (isNumericSingleProp(prop)) {
73
+ zodType = z.string();
74
+ } else if (isNumericArrayProp(prop)) {
75
+ zodType = z.string().array();
76
+ } else if (isBooleanSingleProp(prop)) {
77
+ zodType = z.boolean();
78
+ } else if (isBooleanArrayProp(prop)) {
79
+ zodType = z.boolean().array();
80
+ } else if (isDateSingleProp(prop)) {
81
+ zodType = z.date();
82
+ } else if (isDateArrayProp(prop)) {
83
+ zodType = z.date().array();
84
+ } else if (isUuidSingleProp(prop)) {
85
+ zodType = z.uuid();
86
+ } else if (isUuidArrayProp(prop)) {
87
+ zodType = z.uuid().array();
88
+ } else if (isJsonProp(prop)) {
89
+ zodType = await getZodTypeById(prop.id);
90
+ } else if (isVirtualProp(prop)) {
91
+ zodType = await getZodTypeById(prop.id);
92
+ } else if (isRelationProp(prop)) {
93
+ if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
94
+ zodType = z.number().int();
95
+ }
96
+ } else {
97
+ throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
98
+ }
99
+ if (prop.unsigned) {
100
+ zodType = zodType.nonnegative();
101
+ }
102
+ if (prop.nullable) {
103
+ zodType = zodType.nullable();
104
+ }
105
+ return zodType;
106
+ }
107
+ /**
108
+ * EntityProp을 Zod 타입 정의 코드 문자열로 변환합니다.
109
+ */ export function propToZodTypeDef(prop, injectImportKeys) {
110
+ let stmt;
111
+ if (isIntegerSingleProp(prop)) {
112
+ stmt = `${prop.name}: z.int()`;
113
+ } else if (isIntegerArrayProp(prop)) {
114
+ stmt = `${prop.name}: z.int().array()`;
115
+ } else if (isBigIntegerSingleProp(prop)) {
116
+ stmt = `${prop.name}: z.bigint()`;
117
+ } else if (isBigIntegerArrayProp(prop)) {
118
+ stmt = `${prop.name}: z.bigint().array()`;
119
+ } else if (isEnumSingleProp(prop)) {
120
+ stmt = `${prop.name}: ${prop.id}`;
121
+ injectImportKeys.push(prop.id);
122
+ } else if (isEnumArrayProp(prop)) {
123
+ stmt = `${prop.name}: ${prop.id}.array()`;
124
+ injectImportKeys.push(prop.id);
125
+ } else if (isStringSingleProp(prop)) {
126
+ if (prop.length) {
127
+ stmt = `${prop.name}: z.string().max(${prop.length})`;
128
+ } else {
129
+ stmt = `${prop.name}: z.string()`;
130
+ }
131
+ } else if (isStringArrayProp(prop)) {
132
+ if (prop.length) {
133
+ stmt = `${prop.name}: z.string().max(${prop.length}).array()`;
134
+ } else {
135
+ stmt = `${prop.name}: z.string().array()`;
136
+ }
137
+ } else if (isNumberSingleProp(prop)) {
138
+ stmt = `${prop.name}: z.number()`;
139
+ } else if (isNumberArrayProp(prop)) {
140
+ stmt = `${prop.name}: z.number().array()`;
141
+ } else if (isNumericSingleProp(prop)) {
142
+ stmt = `${prop.name}: z.string()`;
143
+ } else if (isNumericArrayProp(prop)) {
144
+ stmt = `${prop.name}: z.string().array()`;
145
+ } else if (isDateSingleProp(prop)) {
146
+ stmt = `${prop.name}: z.date()`;
147
+ } else if (isDateArrayProp(prop)) {
148
+ stmt = `${prop.name}: z.date().array()`;
149
+ } else if (isBooleanSingleProp(prop)) {
150
+ stmt = `${prop.name}: z.boolean()`;
151
+ } else if (isBooleanArrayProp(prop)) {
152
+ stmt = `${prop.name}: z.boolean().array()`;
153
+ } else if (isUuidSingleProp(prop)) {
154
+ stmt = `${prop.name}: z.uuid()`;
155
+ } else if (isUuidArrayProp(prop)) {
156
+ stmt = `${prop.name}: z.uuid().array()`;
157
+ } else if (isJsonProp(prop)) {
158
+ stmt = `${prop.name}: ${prop.id}`;
159
+ injectImportKeys.push(prop.id);
160
+ } else if (isVirtualProp(prop)) {
161
+ stmt = `${prop.name}: ${prop.id}`;
162
+ injectImportKeys.push(prop.id);
163
+ } else if (isRelationProp(prop)) {
164
+ if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
165
+ stmt = `${prop.name}_id: z.int()`;
166
+ } else {
167
+ // 그외 relation 케이스 제외
168
+ return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
169
+ }
170
+ } else {
171
+ return "// unable to resolve";
172
+ }
173
+ if (prop.unsigned) {
174
+ stmt += ".nonnegative()";
175
+ }
176
+ if (prop.nullable) {
177
+ stmt += ".nullable()";
178
+ }
179
+ return `${stmt},`;
180
+ }
181
+ /**
182
+ * EntityPropNode를 Zod 타입 정의 코드 문자열로 변환합니다.
183
+ * plain, array, object 노드 타입을 재귀적으로 처리하여 중첩 구조를 지원합니다.
184
+ */ export function propNodeToZodTypeDef(propNode, injectImportKeys) {
185
+ if (propNode.nodeType === "plain") {
186
+ return propToZodTypeDef(propNode.prop, injectImportKeys);
187
+ } else if (propNode.nodeType === "array") {
188
+ return [
189
+ propNode.prop ? `${propNode.prop.name}: ` : "",
190
+ "z.array(z.object({",
191
+ propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
192
+ "",
193
+ "})),"
194
+ ].join("\n");
195
+ } else if (propNode.nodeType === "object") {
196
+ return [
197
+ propNode.prop ? `${propNode.prop.name}: ` : "",
198
+ "z.object({",
199
+ propNode.children.map((childPropNode)=>propNodeToZodTypeDef(childPropNode, injectImportKeys)).join("\n"),
200
+ "",
201
+ `})${propNode.prop?.nullable ? ".nullable()" : ""},`
202
+ ].join("\n");
203
+ } else {
204
+ throw Error;
205
+ }
206
+ }
207
+ export function zodTypeToTsTypeDef(zt) {
208
+ switch(zt.def.type){
209
+ case "string":
210
+ case "number":
211
+ case "boolean":
212
+ case "bigint":
213
+ case "date":
214
+ case "null":
215
+ case "undefined":
216
+ case "any":
217
+ case "unknown":
218
+ case "never":
219
+ return zt.def.type;
220
+ case "nullable":
221
+ return `${zodTypeToTsTypeDef(zt.def.innerType)} | null`;
222
+ case "default":
223
+ return zodTypeToTsTypeDef(zt.def.innerType);
224
+ case "record":
225
+ {
226
+ const recordType = zt;
227
+ return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
228
+ }
229
+ case "literal":
230
+ return Array.from(zt.values).map((value)=>{
231
+ if (typeof value === "string") {
232
+ return `"${value}"`;
233
+ }
234
+ if (value === null) {
235
+ return `null`;
236
+ }
237
+ if (value === undefined) {
238
+ return `undefined`;
239
+ }
240
+ return `${value}`;
241
+ }).join(" | ");
242
+ case "union":
243
+ return `${zt.options.map((option)=>zodTypeToTsTypeDef(option)).join(" | ")}`;
244
+ case "enum":
245
+ return `${zt.options.map((val)=>`"${val}"`).join(" | ")}`;
246
+ case "array":
247
+ return `${zodTypeToTsTypeDef(zt.element)}[]`;
248
+ case "object":
249
+ {
250
+ const shape = zt.shape;
251
+ return [
252
+ "{",
253
+ ...Object.keys(shape).map((key)=>{
254
+ if (shape[key].def.type === "optional") {
255
+ return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
256
+ } else {
257
+ return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
258
+ }
259
+ }),
260
+ "}"
261
+ ].join("\n");
262
+ }
263
+ case "optional":
264
+ return `${zodTypeToTsTypeDef(zt.def.innerType)} | undefined`;
265
+ case "template_literal":
266
+ {
267
+ const def = zt.def;
268
+ // 빈 template literal은 string으로 폴백
269
+ if (!def.parts || def.parts.length === 0) {
270
+ return "string";
271
+ }
272
+ // 각 part를 TypeScript 타입 문자열로 변환
273
+ const parts = def.parts.map((part)=>{
274
+ // 리터럴 값 (string, number, boolean, null, undefined)
275
+ if (typeof part === "string") {
276
+ return `${part}`;
277
+ }
278
+ // ZodType - 재귀적으로 변환
279
+ if (part && typeof part === "object" && part._zod) {
280
+ const innerType = zodTypeToTsTypeDef(part);
281
+ return `\${${innerType}}`;
282
+ }
283
+ // 폴백
284
+ return `\${string}`;
285
+ });
286
+ return `\`${parts.join("")}\``;
287
+ }
288
+ case "file":
289
+ return "File";
290
+ default:
291
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
292
+ }
293
+ }
294
+ /**
295
+ * Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
296
+ */ export function zodTypeToZodCode(zt) {
297
+ switch(zt.def.type){
298
+ case "string":
299
+ return "z.string()";
300
+ case "number":
301
+ return "z.number()";
302
+ case "bigint":
303
+ return "z.bigint()";
304
+ case "boolean":
305
+ return "z.boolean()";
306
+ case "date":
307
+ return "z.date()";
308
+ case "null":
309
+ return "z.null()";
310
+ case "undefined":
311
+ return "z.undefined()";
312
+ case "any":
313
+ return "z.any()";
314
+ case "unknown":
315
+ return "z.unknown()";
316
+ case "never":
317
+ return "z.never()";
318
+ case "nullable":
319
+ return `${zodTypeToZodCode(zt.def.innerType)}.nullable()`;
320
+ case "default":
321
+ {
322
+ const zDefaultDef = zt.def;
323
+ return `${zodTypeToZodCode(zDefaultDef.innerType)}.default(${zDefaultDef.defaultValue})`;
324
+ }
325
+ case "record":
326
+ {
327
+ const zRecordDef = zt.def;
328
+ return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(zRecordDef.valueType)})`;
329
+ }
330
+ case "literal":
331
+ {
332
+ const items = Array.from(zt.values).map((value)=>{
333
+ if (typeof value === "string") {
334
+ return `"${value}"`;
335
+ }
336
+ if (value === null) {
337
+ return `null`;
338
+ }
339
+ if (value === undefined) {
340
+ return `undefined`;
341
+ }
342
+ return `${value}`;
343
+ });
344
+ if (items.length === 1) {
345
+ return `z.literal(${items[0]})`;
346
+ }
347
+ return `z.literal([${items.join(", ")}])`;
348
+ }
349
+ case "union":
350
+ return `z.union([${zt.def.options.map((option)=>zodTypeToZodCode(option)).join(",")}])`;
351
+ case "enum":
352
+ // NOTE: z.enum(["A", "B"])도 z.enum({ A: "A", B: "B" })로 처리됨.
353
+ return `z.enum({${Object.entries(zt.def.entries).map(([key, val])=>typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`).join(", ")}})`;
354
+ case "array":
355
+ return `z.array(${zodTypeToZodCode(zt.def.element)})`;
356
+ case "object":
357
+ {
358
+ const shape = zt.shape;
359
+ return [
360
+ "z.object({",
361
+ ...Object.keys(shape).map((key)=>`${key}: ${zodTypeToZodCode(shape[key])},`),
362
+ "})"
363
+ ].join("\n");
364
+ }
365
+ case "optional":
366
+ return `${zodTypeToZodCode(zt.def.innerType)}.optional()`;
367
+ case "file":
368
+ return `z.file()`;
369
+ case "template_literal":
370
+ {
371
+ const def = zt.def;
372
+ // 빈 template literal
373
+ if (!def.parts || def.parts.length === 0) {
374
+ return "z.templateLiteral([])";
375
+ }
376
+ // 각 part를 Zod 코드 문자열로 변환
377
+ const parts = def.parts.map((part)=>{
378
+ // 문자열 리터럴
379
+ if (typeof part === "string") {
380
+ return `"${part}"`;
381
+ }
382
+ // ZodType - 재귀적으로 변환
383
+ if (part && typeof part === "object" && part._zod) {
384
+ return zodTypeToZodCode(part);
385
+ }
386
+ // 폴백
387
+ return "z.string()";
388
+ });
389
+ return `z.templateLiteral([${parts.join(", ")}])`;
390
+ }
391
+ case "intersection":
392
+ {
393
+ const zIntersectionDef = zt.def;
394
+ return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
395
+ }
396
+ default:
397
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
398
+ }
399
+ }
22
400
  /**
23
401
  * Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
24
402
  * 재귀적으로 중첩된 타입들을 처리합니다.
@@ -112,55 +490,5 @@ import { getTextTypeLength } from "../api/index.js";
112
490
  throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
113
491
  }
114
492
  }
115
- /**
116
- * EntityProp을 Zod 타입으로 변환합니다.
117
- * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
118
- */ export async function propToZodType(prop) {
119
- let zodType = z.unknown();
120
- if (isIntegerProp(prop)) {
121
- zodType = z.number().int();
122
- } else if (isBigIntegerProp(prop)) {
123
- zodType = z.bigint();
124
- } else if (isTextProp(prop)) {
125
- zodType = z.string().max(getTextTypeLength(prop.textType));
126
- } else if (isEnumProp(prop)) {
127
- zodType = await getZodTypeById(prop.id);
128
- } else if (isStringProp(prop)) {
129
- zodType = z.string().max(prop.length);
130
- } else if (isFloatProp(prop) || isDoubleProp(prop)) {
131
- zodType = z.number();
132
- } else if (isDecimalProp(prop)) {
133
- zodType = z.string();
134
- } else if (isBooleanProp(prop)) {
135
- zodType = z.boolean();
136
- } else if (isDateProp(prop)) {
137
- zodType = z.string().length(10);
138
- } else if (isTimeProp(prop)) {
139
- zodType = z.string().length(8);
140
- } else if (isDateTimeProp(prop)) {
141
- zodType = z.date();
142
- } else if (isTimestampProp(prop)) {
143
- zodType = z.date();
144
- } else if (isJsonProp(prop)) {
145
- zodType = await getZodTypeById(prop.id);
146
- } else if (isUuidProp(prop)) {
147
- zodType = z.uuid();
148
- } else if (isVirtualProp(prop)) {
149
- zodType = await getZodTypeById(prop.id);
150
- } else if (isRelationProp(prop)) {
151
- if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
152
- zodType = z.number().int();
153
- }
154
- } else {
155
- throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
156
- }
157
- if (prop.unsigned) {
158
- zodType = zodType.nonnegative();
159
- }
160
- if (prop.nullable) {
161
- zodType = zodType.nullable();
162
- }
163
- return zodType;
164
- }
165
493
 
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB6IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBFbnRpdHlQcm9wLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNCaWdJbnRlZ2VyUHJvcCxcbiAgaXNCb29sZWFuUHJvcCxcbiAgaXNEYXRlUHJvcCxcbiAgaXNEYXRlVGltZVByb3AsXG4gIGlzRGVjaW1hbFByb3AsXG4gIGlzRG91YmxlUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNGbG9hdFByb3AsXG4gIGlzSW50ZWdlclByb3AsXG4gIGlzSnNvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVGV4dFByb3AsXG4gIGlzVGltZVByb3AsXG4gIGlzVGltZXN0YW1wUHJvcCxcbiAgaXNVdWlkUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgUmVuZGVyaW5nTm9kZSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBnZXRUZXh0VHlwZUxlbmd0aCB9IGZyb20gXCIuLi9hcGlcIjtcblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIFwiZGlzdFwiLFxuICAgIFwiYXBwbGljYXRpb25cIixcbiAgICBtb2R1bGVQYXRoICsgXCIuanNcIlxuICApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlPGFueT4sXG4gIGJhc2VLZXk6IHN0cmluZyA9IFwicm9vdFwiXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RPYmplY3QpIHtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gT2JqZWN0LmtleXMoem9kVHlwZS5zaGFwZSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlLnNoYXBlW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID0gKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU8YW55Pj4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoXG4gICAgICAob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSlcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgICh6b2RUeXBlIGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleVxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgKHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5XG4gICAgICApLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKFxuICBrZXk6IHN0cmluZyxcbiAgem9kVHlwZTogei5ab2RUeXBlQW55XG4pOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSBwcm9w7J2YIO2DgOyeheyXkCDrlLDrnbwg7KCB7KCI7ZWcIFpvZCB2YWxpZGF0b3Lrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcFRvWm9kVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgbGV0IHpvZFR5cGU6IHouWm9kVHlwZUFueSA9IHoudW5rbm93bigpO1xuICBpZiAoaXNJbnRlZ2VyUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc1RleHRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KGdldFRleHRUeXBlTGVuZ3RoKHByb3AudGV4dFR5cGUpKTtcbiAgfSBlbHNlIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gIH0gZWxzZSBpZiAoaXNGbG9hdFByb3AocHJvcCkgfHwgaXNEb3VibGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNEZWNpbWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCgxMCk7XG4gIH0gZWxzZSBpZiAoaXNUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmxlbmd0aCg4KTtcbiAgfSBlbHNlIGlmIChpc0RhdGVUaW1lUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc1RpbWVzdGFtcFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoXG4gICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcHJvcOydhCB6b2RUeXBl7Jy866GcIOuzgO2ZmO2VmOuKlOuNsCDsi6TtjKggJHtwcm9wfX1gKTtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHpvZFR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZE51bWJlcikubm9ubmVnYXRpdmUoKTtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHpvZFR5cGUgPSB6b2RUeXBlLm51bGxhYmxlKCk7XG4gIH1cblxuICByZXR1cm4gem9kVHlwZTtcbn1cbiJdLCJuYW1lcyI6WyJ6IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyUHJvcCIsImlzQm9vbGVhblByb3AiLCJpc0RhdGVQcm9wIiwiaXNEYXRlVGltZVByb3AiLCJpc0RlY2ltYWxQcm9wIiwiaXNEb3VibGVQcm9wIiwiaXNFbnVtUHJvcCIsImlzRmxvYXRQcm9wIiwiaXNJbnRlZ2VyUHJvcCIsImlzSnNvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1N0cmluZ1Byb3AiLCJpc1RleHRQcm9wIiwiaXNUaW1lUHJvcCIsImlzVGltZXN0YW1wUHJvcCIsImlzVXVpZFByb3AiLCJpc1ZpcnR1YWxQcm9wIiwicGF0aCIsImNyZWF0ZUltcG9ydFVybCIsIlNvbmFtdSIsImluZmxlY3Rpb24iLCJnZXRUZXh0VHlwZUxlbmd0aCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsInpvZFR5cGUiLCJiYXNlS2V5IiwiZGVmIiwibmFtZSIsImxhYmVsIiwiY2FtZWxpemUiLCJab2RPYmplY3QiLCJjb2x1bW5LZXlzIiwiT2JqZWN0Iiwia2V5cyIsInNoYXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJrZXkiLCJpbm5lclR5cGUiLCJyZW5kZXJUeXBlIiwiWm9kQXJyYXkiLCJlbGVtZW50IiwiWm9kU3RyaW5nIiwiaW5jbHVkZXMiLCJab2RVbmlvbiIsIm9wdGlvbk5vZGVzIiwib3B0aW9ucyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsIm51bGxhYmxlIiwicmVzb2x2ZVJlbmRlclR5cGUiLCJab2REYXRlIiwiZGVzY3JpcHRpb24iLCJlbmRzV2l0aCIsIlpvZE51bWJlciIsIlpvZEJvb2xlYW4iLCJab2RFbnVtIiwiWm9kUmVjb3JkIiwiWm9kQW55IiwiWm9kVW5rbm93biIsIlpvZExpdGVyYWwiLCJ0eXBlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ1bmtub3duIiwibnVtYmVyIiwiaW50IiwiYmlnaW50Iiwic3RyaW5nIiwibWF4IiwidGV4dFR5cGUiLCJpZCIsImxlbmd0aCIsImJvb2xlYW4iLCJkYXRlIiwidXVpZCIsImhhc0pvaW5Db2x1bW4iLCJ1bnNpZ25lZCIsIm5vbm5lZ2F0aXZlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxPQUFPLE1BQU07QUFDcEIsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUVFQywwQkFBMEIsRUFDMUJDLGdCQUFnQixFQUNoQkMsYUFBYSxFQUNiQyxVQUFVLEVBQ1ZDLGNBQWMsRUFDZEMsYUFBYSxFQUNiQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsV0FBVyxFQUNYQyxhQUFhLEVBQ2JDLFVBQVUsRUFD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
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0JpZ0ludGVnZXJBcnJheVByb3AsXG4gIGlzQmlnSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzQm9vbGVhbkFycmF5UHJvcCxcbiAgaXNCb29sZWFuU2luZ2xlUHJvcCxcbiAgaXNEYXRlQXJyYXlQcm9wLFxuICBpc0RhdGVTaW5nbGVQcm9wLFxuICBpc0VudW1BcnJheVByb3AsXG4gIGlzRW51bVNpbmdsZVByb3AsXG4gIGlzSW50ZWdlckFycmF5UHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNKc29uUHJvcCxcbiAgaXNOdW1iZXJBcnJheVByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNOdW1lcmljQXJyYXlQcm9wLFxuICBpc051bWVyaWNTaW5nbGVQcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdBcnJheVByb3AsXG4gIGlzU3RyaW5nU2luZ2xlUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0PCRab2RMb29zZVNoYXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDxzdHJpbmc+O1xuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJhcHBsaWNhdGlvblwiLCBgJHttb2R1bGVQYXRofS5qc2ApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDqsIEgcHJvcOydmCDtg4DsnoXsl5Ag65Sw6528IOyggeygiO2VnCBab2QgdmFsaWRhdG9y66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3BUb1pvZFR5cGUocHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGxldCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkgPSB6LnVua25vd24oKTtcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IChhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKSkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKS5hcnJheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5pbnQoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOq3uOyZuCByZWxhdGlvbiDsvIDsnbTsiqQg7KCc7Jm4XG4gICAgICByZXR1cm4gYC8vICR7cHJvcC5uYW1lfTogJHtwcm9wLnJlbGF0aW9uVHlwZX0gJHtwcm9wLndpdGh9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiLy8gdW5hYmxlIHRvIHJlc29sdmVcIjtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHN0bXQgKz0gXCIubm9ubmVnYXRpdmUoKVwiO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgc3RtdCArPSBcIi5udWxsYWJsZSgpXCI7XG4gIH1cblxuICByZXR1cm4gYCR7c3RtdH0sYDtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9wTm9kZeulvCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHBsYWluLCBhcnJheSwgb2JqZWN0IOuFuOuTnCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIOyymOumrO2VmOyXrCDspJHssqkg6rWs7KGw66W8IOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA/IFwiLm51bGxhYmxlKClcIiA6IFwiXCJ9LGAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9Uc1R5cGVEZWYoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImFueVwiOlxuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4genQuZGVmLnR5cGU7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZi5pbm5lclR5cGUpO1xuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgcmVjb3JkVHlwZSA9IHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsKS52YWx1ZXMpXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIntcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHNoYXBlW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldLmRlZi5pbm5lclR5cGUpfSxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpfSB8IHVuZGVmaW5lZGA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgICAgcmV0dXJuIGBcXCR7JHtpbm5lclR5cGV9fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIGBcXCR7c3RyaW5nfWA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGBcXGAke3BhcnRzLmpvaW4oXCJcIil9XFxgYDtcbiAgICB9XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBcIkZpbGVcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9ab2RDb2RlKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcInoubnVtYmVyKClcIjtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gXCJ6LmJpZ2ludCgpXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcInouYm9vbGVhbigpXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInouZGF0ZSgpXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcInoubnVsbCgpXCI7XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgcmV0dXJuIFwiei51bmRlZmluZWQoKVwiO1xuICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgIHJldHVybiBcInouYW55KClcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiBcInoubmV2ZXIoKVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPSAoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+KS52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFskeyh6dCBhcyBBbnlab2RVbmlvbikuZGVmLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoKHp0IGFzIHouWm9kRW51bSkuZGVmLmVudHJpZXMpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbF0pID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50KX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSl9LGApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSl9Lm9wdGlvbmFsKClgO1xuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gYHouZmlsZSgpYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFsXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInoudGVtcGxhdGVMaXRlcmFsKFtdKVwiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrrLjsnpDsl7Qg66as7YSw65+0XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPSAoenQgYXMgei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlLCB6LlpvZFR5cGU+KS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLmxlZnQpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbktleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGUuc2hhcGVba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZEFycmF5PHouWm9kVHlwZUFueT4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoKG9wdCkgPT5cbiAgICAgIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSxcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKGtleTogc3RyaW5nLCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyQXJyYXlQcm9wIiwiaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCIsImlzQm9vbGVhbkFycmF5UHJvcCIsImlzQm9vbGVhblNpbmdsZVByb3AiLCJpc0RhdGVBcnJheVByb3AiLCJpc0RhdGVTaW5nbGVQcm9wIiwiaXNFbnVtQXJyYXlQcm9wIiwiaXNFbnVtU2luZ2xlUHJvcCIsImlzSW50ZWdlckFycmF5UHJvcCIsImlzSW50ZWdlclNpbmdsZVByb3AiLCJpc0pzb25Qcm9wIiwiaXNOdW1iZXJBcnJheVByb3AiLCJpc051bWJlclNpbmdsZVByb3AiLCJpc051bWVyaWNBcnJheVByb3AiLCJpc051bWVyaWNTaW5nbGVQcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNTdHJpbmdBcnJheVByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1V1aWRBcnJheVByb3AiLCJpc1V1aWRTaW5nbGVQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsImNyZWF0ZUltcG9ydFVybCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ6b2RUeXBlIiwidW5rbm93biIsIm51bWJlciIsImludCIsImFycmF5IiwiYmlnaW50IiwiaWQiLCJsZW5ndGgiLCJzdHJpbmciLCJtYXgiLCJib29sZWFuIiwiZGF0ZSIsInV1aWQiLCJoYXNKb2luQ29sdW1uIiwidW5zaWduZWQiLCJub25uZWdhdGl2ZSIsIm51bGxhYmxlIiwicHJvcFRvWm9kVHlwZURlZiIsImluamVjdEltcG9ydEtleXMiLCJzdG10IiwibmFtZSIsInB1c2giLCJyZWxhdGlvblR5cGUiLCJ3aXRoIiwicHJvcE5vZGVUb1pvZFR5cGVEZWYiLCJwcm9wTm9kZSIsIm5vZGVUeXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJjaGlsZFByb3BOb2RlIiwiem9kVHlwZVRvVHNUeXBlRGVmIiwienQiLCJkZWYiLCJ0eXBlIiwiaW5uZXJUeXBlIiwicmVjb3JkVHlwZSIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJBcnJheSIsImZyb20iLCJ2YWx1ZXMiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIm9wdGlvbnMiLCJvcHRpb24iLCJ2YWwiLCJlbGVtZW50Iiwic2hhcGUiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwicGFydHMiLCJwYXJ0IiwiX3pvZCIsInpvZFR5cGVUb1pvZENvZGUiLCJ6RGVmYXVsdERlZiIsImRlZmF1bHRWYWx1ZSIsInpSZWNvcmREZWYiLCJpdGVtcyIsImVudHJpZXMiLCJ6SW50ZXJzZWN0aW9uRGVmIiwibGVmdCIsInJpZ2h0Iiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsImJhc2VLZXkiLCJsYWJlbCIsImNhbWVsaXplIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsInJlbmRlclR5cGUiLCJab2RBcnJheSIsIlpvZFN0cmluZyIsImluY2x1ZGVzIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImRlc2NyaXB0aW9uIiwiZW5kc1dpdGgiLCJab2ROdW1iZXIiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUdFQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsc0JBQXNCLEVBQ3RCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsVUFBVSxFQUNWQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUIsRUFDbkJDLHNCQUFzQixFQUN0QkMsY0FBYyxFQUNkQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGFBQWEsUUFFUixvQkFBaUI7QUFDeEIsU0FBU0Ms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
@@ -1,4 +1,4 @@
1
- import { FixtureRecord } from "../types/types";
1
+ import type { FixtureRecord } from "../types/types";
2
2
  export declare class RelationGraph {
3
3
  private graph;
4
4
  buildGraph(fixtures: FixtureRecord[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"_relation-graph.d.ts","sourceRoot":"","sources":["../../src/testing/_relation-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAUzE,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAwC;IAErD,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IA8C3C,iBAAiB,IAAI,MAAM,EAAE;CAmD9B"}
1
+ {"version":3,"file":"_relation-graph.d.ts","sourceRoot":"","sources":["../../src/testing/_relation-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,aAAa,EAAgB,MAAM,gBAAgB,CAAC;AAS9E,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAwC;IAErD,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IA+C3C,iBAAiB,IAAI,MAAM,EAAE;CAyD9B"}