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,101 +1,98 @@
1
+ import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
2
+ import { Template, init_template } from "../template.js";
3
+ import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName, init_helpers } from "../helpers.js";
4
+ import { z as z$1 } from "zod";
1
5
  import { unique } from "radashi";
2
- import { z } from "zod";
3
- import { EntityManager } from "../../entity/entity-manager.js";
4
- import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropFromColName } from "../helpers.js";
5
- import { Template } from "../template.js";
6
- export class Template__view_form extends Template {
7
- constructor(){
8
- super("view_form");
9
- }
10
- getTargetAndPath(names) {
11
- return {
12
- target: "web/src/routes/admin",
13
- path: `${names.fsPlural}/form.tsx`
14
- };
15
- }
16
- getRequiredDictKeys() {
17
- return [
18
- "entity.create",
19
- "entity.edit",
20
- "common.backToList",
21
- "form.createdAt",
22
- "common.save"
23
- ];
24
- }
25
- wrapFC(body, label) {
26
- return [
27
- `<div className="space-y-2">${label ? `\n <Label>${label}</Label>` : ""}`,
28
- ` ${body}`,
29
- `</div>`
30
- ].join("\n");
31
- }
32
- wrapFG(body, label) {
33
- return this.wrapFC(body, label);
34
- }
35
- renderColumnImport(entityId, col) {
36
- if (col.renderType === "enums") {
37
- const { id } = getEnumInfoFromColName(entityId, col.name);
38
- return {
39
- type: "enum",
40
- enumId: id
41
- };
42
- } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
43
- try {
44
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
45
- return {
46
- type: "fk",
47
- entityId: relProp.with
48
- };
49
- } catch {
50
- return null;
51
- }
52
- } else if (col.renderType === "array" && col.name.endsWith("_ids")) {
53
- // ManyToMany relation의 FK 배열
54
- try {
55
- const baseName = col.name.replace(/_ids$/, "");
56
- const relProp = getRelationPropFromColName(entityId, baseName);
57
- return {
58
- type: "fk",
59
- entityId: relProp.with
60
- };
61
- } catch {
62
- return null;
63
- }
64
- }
65
- return null;
66
- }
67
- renderColumn(entityId, col) {
68
- const regExpr = `{...register("${col.name}")}`;
69
- const placeholderName = getRelationNameFromColumnName(entityId, col.name);
70
- const placeholder = `{SD("entity.${entityId}.${placeholderName}")}`;
71
- switch(col.renderType){
72
- case "string-plain":
73
- if (col.zodType instanceof z.ZodString && (col.zodType.maxLength ?? 0) <= 256) {
74
- return `<Input className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
75
- } else {
76
- return `<Textarea className="text-xs bg-white" rows={4} placeholder=${placeholder} ${regExpr} />`;
77
- }
78
- case "datetime":
79
- return `<DateInput
6
+
7
+ //#region src/template/implementations/view_form.template.ts
8
+ init_entity_manager();
9
+ init_helpers();
10
+ init_template();
11
+ var Template__view_form = class extends Template {
12
+ constructor() {
13
+ super("view_form");
14
+ }
15
+ getTargetAndPath(names) {
16
+ return {
17
+ target: "web/src/routes/admin",
18
+ path: `${names.fsPlural}/form.tsx`
19
+ };
20
+ }
21
+ getRequiredDictKeys() {
22
+ return [
23
+ "entity.create",
24
+ "entity.edit",
25
+ "common.backToList",
26
+ "form.createdAt",
27
+ "common.save"
28
+ ];
29
+ }
30
+ wrapFC(body, label) {
31
+ return [
32
+ `<div className="space-y-2">${label ? `\n <Label>${label}</Label>` : ""}`,
33
+ ` ${body}`,
34
+ `</div>`
35
+ ].join("\n");
36
+ }
37
+ wrapFG(body, label) {
38
+ return this.wrapFC(body, label);
39
+ }
40
+ renderColumnImport(entityId, col) {
41
+ if (col.renderType === "enums") {
42
+ const { id } = getEnumInfoFromColName(entityId, col.name);
43
+ return {
44
+ type: "enum",
45
+ enumId: id
46
+ };
47
+ } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
48
+ try {
49
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
50
+ return {
51
+ type: "fk",
52
+ entityId: relProp.with
53
+ };
54
+ } catch {
55
+ return null;
56
+ }
57
+ } else if (col.renderType === "array" && col.name.endsWith("_ids")) {
58
+ try {
59
+ const baseName = col.name.replace(/_ids$/, "");
60
+ const relProp = getRelationPropFromColName(entityId, baseName);
61
+ return {
62
+ type: "fk",
63
+ entityId: relProp.with
64
+ };
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ renderColumn(entityId, col) {
72
+ const regExpr = `{...register("${col.name}")}`;
73
+ const placeholderName = getRelationNameFromColumnName(entityId, col.name);
74
+ const placeholder = `{SD("entity.${entityId}.${placeholderName}")}`;
75
+ switch (col.renderType) {
76
+ case "string-plain": if (col.zodType instanceof z$1.ZodString && (col.zodType.maxLength ?? 0) <= 256) {
77
+ return `<Input className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
78
+ } else {
79
+ return `<Textarea className="text-xs bg-white" rows={4} placeholder=${placeholder} ${regExpr} />`;
80
+ }
81
+ case "datetime": return `<DateInput
80
82
  className="h-8 text-xs bg-white"
81
83
  ${regExpr}
82
84
  />`;
83
- case "number-id":
84
- case "string-id":
85
- return `<input type="hidden" ${regExpr} />`;
86
- case "number-plain":
87
- return `<Input type="number" className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
88
- case "boolean":
89
- return `<Switch ${regExpr} />`;
90
- case "json-sonamufile":
91
- return `<FileInput
85
+ case "number-id":
86
+ case "string-id": return `<input type="hidden" ${regExpr} />`;
87
+ case "number-plain": return `<Input type="number" className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
88
+ case "boolean": return `<Switch ${regExpr} />`;
89
+ case "json-sonamufile": return `<FileInput
92
90
  uploadMode="lazy"
93
91
  viewMode="image"
94
92
  previewSize="md"
95
93
  ${regExpr}
96
94
  />`;
97
- case "json-sonamufile-array":
98
- return `<FileInput
95
+ case "json-sonamufile-array": return `<FileInput
99
96
  multiple={true}
100
97
  uploadMode="lazy"
101
98
  viewMode="image"
@@ -103,152 +100,136 @@ export class Template__view_form extends Template {
103
100
  maxFiles={10}
104
101
  ${regExpr}
105
102
  />`;
106
- case "enums":
107
- try {
108
- const { id } = getEnumInfoFromColName(entityId, col.name);
109
- return `<EnumSelect
103
+ case "enums": try {
104
+ const { id } = getEnumInfoFromColName(entityId, col.name);
105
+ return `<EnumSelect
110
106
  enum={${id}}
111
107
  labels={${id}Label}
112
108
  ${regExpr}
113
109
  />`;
114
- } catch {
115
- return `<Input className="h-8 text-xs bg-white" ${regExpr} />`;
116
- }
117
- case "number-fk_id":
118
- case "string-fk_id":
119
- try {
120
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
121
- return `<IdAsyncSelect
110
+ } catch {
111
+ return `<Input className="h-8 text-xs bg-white" ${regExpr} />`;
112
+ }
113
+ case "number-fk_id":
114
+ case "string-fk_id": try {
115
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
116
+ return `<IdAsyncSelect
122
117
  config={${relProp.with}AsyncIdConfig}
123
118
  subset="A"
124
119
  ${regExpr}
125
120
  />`;
126
- } catch {
127
- return `<Input type="number" className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
128
- }
129
- case "array":
130
- // ManyToMany relation의 FK 배열인지 확인
131
- if (col.name.endsWith("_ids")) {
132
- try {
133
- const baseName = col.name.replace(/_ids$/, "");
134
- const relProp = getRelationPropFromColName(entityId, baseName);
135
- return `<IdAsyncSelect
121
+ } catch {
122
+ return `<Input type="number" className="h-8 text-xs bg-white" placeholder=${placeholder} ${regExpr} />`;
123
+ }
124
+ case "array":
125
+ if (col.name.endsWith("_ids")) {
126
+ try {
127
+ const baseName = col.name.replace(/_ids$/, "");
128
+ const relProp = getRelationPropFromColName(entityId, baseName);
129
+ return `<IdAsyncSelect
136
130
  config={${relProp.with}AsyncIdConfig}
137
131
  subset="A"
138
132
  multiple
139
133
  ${regExpr}
140
134
  />`;
141
- } catch {
142
- return `<Input className="h-8 text-xs bg-white" placeholder="${col.name}" ${regExpr} />`;
143
- }
144
- }
145
- return `<Input className="h-8 text-xs bg-white" placeholder="${col.name}" ${regExpr} />`;
146
- case "object":
147
- return `<Input className="h-8 text-xs bg-white" placeholder="${col.name}" ${regExpr} />`;
148
- default:
149
- return `<Input className="h-8 text-xs bg-white" ${regExpr} />`;
150
- }
151
- }
152
- resolveDefaultValue(columns) {
153
- return columns.reduce((result, col)=>{
154
- if (col.optional) {
155
- return result;
156
- }
157
- let value;
158
- if (col.nullable === true) {
159
- value = null;
160
- } else if (col.zodType instanceof z.ZodNumber) {
161
- value = 0;
162
- } else if (col.zodType instanceof z.ZodEnum) {
163
- value = Object.keys(col.zodType.enum)[0];
164
- } else if (col.zodType instanceof z.ZodBoolean) {
165
- value = false;
166
- } else if (col.zodType instanceof z.core.$ZodString) {
167
- // NOTE: z.ZodString으로 비교하면 z.url(), z.email() 등의 타입에서 문제가 생기므로 z.core.$ZodString으로 비교함
168
- // FIXME: email이나 url 타입 등에 대한 처리가 필요함
169
- if (col.renderType === "string-datetime") {
170
- value = "now()";
171
- } else {
172
- value = "";
173
- }
174
- } else if (col.zodType instanceof z.ZodArray) {
175
- value = [];
176
- } else if (col.zodType instanceof z.ZodObject) {
177
- value = {};
178
- }
179
- result[col.name] = value;
180
- return result;
181
- }, {});
182
- }
183
- async render({ entityId }) {
184
- const entity = EntityManager.get(entityId);
185
- const names = EntityManager.getNamesFromId(entityId);
186
- // PK 타입 감지
187
- const pkType = entity.getPkType();
188
- const idTsType = pkType === "string" || pkType === "uuid" ? "string" : "number";
189
- const idZodType = pkType === "string" || pkType === "uuid" ? "z.string().optional()" : "z.number().optional()";
190
- // SaveParams 타입을 로드하여 saveParamsNode 생성
191
- const { loadTypes } = await import("../../syncer/module-loader.js");
192
- const loadedTypes = await loadTypes();
193
- const SaveParamsZodType = loadedTypes[`${entityId}SaveParams`];
194
- if (!SaveParamsZodType) {
195
- throw new Error(`SaveParams for ${entityId} not found. Did you run 'sonamu sync'?`);
196
- }
197
- // Zod 타입을 RenderingNode로 변환
198
- const { zodTypeToRenderingNode } = await import("../zod-converter.js");
199
- const saveParamsNode = zodTypeToRenderingNode(SaveParamsZodType);
200
- const columns = (saveParamsNode?.children ?? []).filter((col)=>col.name !== "id").map((col)=>{
201
- const propCandidate = entity.props.find((prop)=>prop.name === col.name);
202
- col.label = propCandidate?.desc ?? col.label;
203
- return col;
204
- });
205
- const defaultValue = this.resolveDefaultValue(columns);
206
- // enum과 FK에 대한 import 정보 수집
207
- const enumImports = new Set();
208
- const fkConfigImports = new Set();
209
- columns.forEach((col)=>{
210
- if (col.renderType === "enums") {
211
- try {
212
- const { id } = getEnumInfoFromColName(entityId, col.name);
213
- enumImports.add(id);
214
- } catch {}
215
- } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
216
- try {
217
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
218
- fkConfigImports.add(relProp.with);
219
- } catch {}
220
- } else if (col.renderType === "string-plain" && col.name.endsWith("_id") && col.name !== "id") {
221
- // string FK 처리 (자신의 PK인 id는 제외)
222
- try {
223
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
224
- fkConfigImports.add(relProp.with);
225
- } catch {}
226
- } else if (col.renderType === "array" && col.name.endsWith("_ids")) {
227
- // ManyToMany relation의 FK 배열
228
- try {
229
- const baseName = col.name.replace(/_ids$/, "");
230
- const relProp = getRelationPropFromColName(entityId, baseName);
231
- fkConfigImports.add(relProp.with);
232
- } catch {}
233
- }
234
- });
235
- return {
236
- ...this.getTargetAndPath(names),
237
- body: `
135
+ } catch {
136
+ return `<Input className="h-8 text-xs bg-white" placeholder="${col.name}" ${regExpr} />`;
137
+ }
138
+ }
139
+ return `<Input className="h-8 text-xs bg-white" placeholder="${col.name}" ${regExpr} />`;
140
+ case "object": return `<Input className="h-8 text-xs bg-white" placeholder="${col.name}" ${regExpr} />`;
141
+ default: return `<Input className="h-8 text-xs bg-white" ${regExpr} />`;
142
+ }
143
+ }
144
+ resolveDefaultValue(columns) {
145
+ return columns.reduce((result, col) => {
146
+ if (col.optional) {
147
+ return result;
148
+ }
149
+ let value;
150
+ if (col.nullable === true) {
151
+ value = null;
152
+ } else if (col.zodType instanceof z$1.ZodNumber) {
153
+ value = 0;
154
+ } else if (col.zodType instanceof z$1.ZodEnum) {
155
+ value = Object.keys(col.zodType.enum)[0];
156
+ } else if (col.zodType instanceof z$1.ZodBoolean) {
157
+ value = false;
158
+ } else if (col.zodType instanceof z$1.core.$ZodString) {
159
+ if (col.renderType === "string-datetime") {
160
+ value = "now()";
161
+ } else {
162
+ value = "";
163
+ }
164
+ } else if (col.zodType instanceof z$1.ZodArray) {
165
+ value = [];
166
+ } else if (col.zodType instanceof z$1.ZodObject) {
167
+ value = {};
168
+ }
169
+ result[col.name] = value;
170
+ return result;
171
+ }, {});
172
+ }
173
+ async render({ entityId }) {
174
+ const entity = EntityManager.get(entityId);
175
+ const names = EntityManager.getNamesFromId(entityId);
176
+ const pkType = entity.getPkType();
177
+ const idTsType = pkType === "string" || pkType === "uuid" ? "string" : "number";
178
+ const idZodType = pkType === "string" || pkType === "uuid" ? "z.string().optional()" : "z.number().optional()";
179
+ const { loadTypes } = await import("../../syncer/module-loader.js");
180
+ const loadedTypes = await loadTypes();
181
+ const SaveParamsZodType = loadedTypes[`${entityId}SaveParams`];
182
+ if (!SaveParamsZodType) {
183
+ throw new Error(`SaveParams for ${entityId} not found. Did you run 'sonamu sync'?`);
184
+ }
185
+ const { zodTypeToRenderingNode } = await import("../zod-converter.js");
186
+ const saveParamsNode = zodTypeToRenderingNode(SaveParamsZodType);
187
+ const columns = (saveParamsNode?.children ?? []).filter((col) => col.name !== "id").map((col) => {
188
+ const propCandidate = entity.props.find((prop) => prop.name === col.name);
189
+ col.label = propCandidate?.desc ?? col.label;
190
+ return col;
191
+ });
192
+ const defaultValue = this.resolveDefaultValue(columns);
193
+ const enumImports = new Set();
194
+ const fkConfigImports = new Set();
195
+ columns.forEach((col) => {
196
+ if (col.renderType === "enums") {
197
+ try {
198
+ const { id } = getEnumInfoFromColName(entityId, col.name);
199
+ enumImports.add(id);
200
+ } catch {}
201
+ } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
202
+ try {
203
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
204
+ fkConfigImports.add(relProp.with);
205
+ } catch {}
206
+ } else if (col.renderType === "string-plain" && col.name.endsWith("_id") && col.name !== "id") {
207
+ try {
208
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
209
+ fkConfigImports.add(relProp.with);
210
+ } catch {}
211
+ } else if (col.renderType === "array" && col.name.endsWith("_ids")) {
212
+ try {
213
+ const baseName = col.name.replace(/_ids$/, "");
214
+ const relProp = getRelationPropFromColName(entityId, baseName);
215
+ fkConfigImports.add(relProp.with);
216
+ } catch {}
217
+ }
218
+ });
219
+ return {
220
+ ...this.getTargetAndPath(names),
221
+ body: `
238
222
  import {
239
223
  Button,
240
224
  Card,
241
225
  CardContent,
242
226
  CardHeader,
243
227
  CardTitle,
244
- Input,${columns.some((col)=>col.renderType === "string-plain" && col.zodType instanceof z.ZodString && (col.zodType.maxLength ?? 0) > 256) ? "\n Textarea," : ""}${columns.some((col)=>col.renderType === "enums") ? "\n EnumSelect," : ""}${columns.some((col)=>col.renderType === "number-fk_id" || col.renderType === "string-fk_id" || col.renderType === "array" && col.name.endsWith("_ids")) ? "\n IdAsyncSelect," : ""}${columns.some((col)=>col.renderType === "boolean") ? "\n Switch," : ""}${columns.some((col)=>[
245
- "json-sonamufile",
246
- "json-sonamufile-array"
247
- ].includes(col.renderType)) ? "\n FileInput," : ""}${columns.some((col)=>[
248
- "string-datetime",
249
- "string-date",
250
- "datetime"
251
- ].includes(col.renderType)) ? "\n DateInput," : ""}
228
+ Input,${columns.some((col) => col.renderType === "string-plain" && col.zodType instanceof z$1.ZodString && (col.zodType.maxLength ?? 0) > 256) ? "\n Textarea," : ""}${columns.some((col) => col.renderType === "enums") ? "\n EnumSelect," : ""}${columns.some((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id" || col.renderType === "array" && col.name.endsWith("_ids")) ? "\n IdAsyncSelect," : ""}${columns.some((col) => col.renderType === "boolean") ? "\n Switch," : ""}${columns.some((col) => ["json-sonamufile", "json-sonamufile-array"].includes(col.renderType)) ? "\n FileInput," : ""}${columns.some((col) => [
229
+ "string-datetime",
230
+ "string-date",
231
+ "datetime"
232
+ ].includes(col.renderType)) ? "\n DateInput," : ""}
252
233
  } from "@sonamu-kit/react-components/components";
253
234
  import { useTypeForm } from "@sonamu-kit/react-components/lib";
254
235
  import { useQueryClient } from "@tanstack/react-query";
@@ -256,16 +237,16 @@ import { createFileRoute, useRouter } from "@tanstack/react-router";
256
237
  import { useEffect } from "react";
257
238
  import { z } from "zod";
258
239
  import { ${names.capital}Service } from "@/services/services.generated";
259
- import type { ${names.capital}SubsetA } from "@/services/sonamu.generated";${columns.filter((col)=>col.renderType === "enums").length > 0 ? "\nimport { " + unique(columns.filter((col)=>col.renderType === "enums").map((col)=>{
260
- try {
261
- const { id } = getEnumInfoFromColName(entityId, col.name);
262
- return `${id}, ${id}Label`;
263
- } catch {
264
- return "";
265
- }
266
- })).filter(Boolean).join(", ") + ' } from "@/services/sonamu.generated";' : ""}
240
+ import type { ${names.capital}SubsetA } from "@/services/sonamu.generated";${columns.filter((col) => col.renderType === "enums").length > 0 ? "\nimport { " + unique(columns.filter((col) => col.renderType === "enums").map((col) => {
241
+ try {
242
+ const { id } = getEnumInfoFromColName(entityId, col.name);
243
+ return `${id}, ${id}Label`;
244
+ } catch {
245
+ return "";
246
+ }
247
+ })).filter(Boolean).join(", ") + " } from \"@/services/sonamu.generated\";" : ""}
267
248
  import { defaultCatch } from "@/services/sonamu.shared";
268
- import { ${names.capital}SaveParams } from "@/services/${names.fs}/${names.fs}.types";${fkConfigImports.size > 0 ? `\nimport { ${Array.from(fkConfigImports).map((entity)=>`${entity}AsyncIdConfig`).join(", ")} } from "@/services/services.generated";` : ""}
249
+ import { ${names.capital}SaveParams } from "@/services/${names.fs}/${names.fs}.types";${fkConfigImports.size > 0 ? `\nimport { ${Array.from(fkConfigImports).map((entity$1) => `${entity$1}AsyncIdConfig`).join(", ")} } from "@/services/services.generated";` : ""}
269
250
  import { SD } from "@/i18n/sd.generated";
270
251
 
271
252
  import ArrowLeftIcon from "~icons/lucide/arrow-left";
@@ -295,17 +276,14 @@ export function ${names.capitalPlural}Form({ id, mode }: ${names.capitalPlural}F
295
276
  const router = useRouter();
296
277
  const queryClient = useQueryClient();
297
278
 
298
- const { form, setForm, register${columns.some((col)=>[
299
- "json-sonamufile",
300
- "json-sonamufile-array"
301
- ].includes(col.renderType)) ? ", submit" : ""} } = useTypeForm(${names.capital}SaveParams, ${JSON.stringify(defaultValue).replace(/"now\(\)"/g, '""')});
302
- ${(()=>{
303
- const hasDatetime = columns.some((col)=>col.renderType === "string-datetime");
304
- const hasDate = columns.some((col)=>col.renderType === "string-date");
305
- if (!hasDatetime && !hasDate) return "";
306
- let helpers = "\n";
307
- if (hasDatetime) {
308
- helpers += ` // datetime-local 형식으로 변환 (YYYY-MM-DDTHH:MM)
279
+ const { form, setForm, register${columns.some((col) => ["json-sonamufile", "json-sonamufile-array"].includes(col.renderType)) ? ", submit" : ""} } = useTypeForm(${names.capital}SaveParams, ${JSON.stringify(defaultValue).replace(/"now\(\)"/g, "\"\"")});
280
+ ${(() => {
281
+ const hasDatetime = columns.some((col) => col.renderType === "string-datetime");
282
+ const hasDate = columns.some((col) => col.renderType === "string-date");
283
+ if (!hasDatetime && !hasDate) return "";
284
+ let helpers = "\n";
285
+ if (hasDatetime) {
286
+ helpers += ` // datetime-local 형식으로 변환 (YYYY-MM-DDTHH:MM)
309
287
  const toDatetimeLocalString = (date: Date | string | null | undefined): string => {
310
288
  if (!date) return "";
311
289
  const d = typeof date === "string" ? new Date(date) : date;
@@ -318,9 +296,9 @@ ${(()=>{
318
296
  return new Date(value);
319
297
  };
320
298
  `;
321
- }
322
- if (hasDate) {
323
- helpers += ` // date 형식으로 변환 (YYYY-MM-DD)
299
+ }
300
+ if (hasDate) {
301
+ helpers += ` // date 형식으로 변환 (YYYY-MM-DD)
324
302
  const toDateString = (date: Date | string | null | undefined): string => {
325
303
  if (!date) return "";
326
304
  const d = typeof date === "string" ? new Date(date) : date;
@@ -333,43 +311,36 @@ ${(()=>{
333
311
  return new Date(value);
334
312
  };
335
313
  `;
336
- }
337
- return helpers;
338
- })()}
314
+ }
315
+ return helpers;
316
+ })()}
339
317
  useEffect(() => {
340
318
  if (id) {
341
319
  ${names.capital}Service.get${names.capital}("A", id).then((row) => {
342
320
  setForm((prevForm) => ({
343
321
  ...prevForm,
344
- ...row,${(()=>{
345
- // relation 필드들을 찾아서 변환 코드 생성
346
- // number FK, string FK (자신의 PK 제외), ManyToMany FK 배열만 필터링
347
- const relationFields = columns.filter((col)=>col.renderType === "number-fk_id" || col.renderType === "string-fk_id" || col.renderType === "array" && col.name.endsWith("_ids")).map((col)=>{
348
- // ManyToMany(array) 처리
349
- if (col.renderType === "array" && col.name.endsWith("_ids")) {
350
- const relationName = getRelationNameFromColumnName(entityId, col.name);
351
- return `\n ${col.name}: row.${relationName}?.map((r) => r.id) ?? [],`;
352
- }
353
- // FK(number, string) 처리
354
- const relationName = getRelationNameFromColumnName(entityId, col.name);
355
- if (col.nullable) {
356
- return `\n ${col.name}: row.${relationName}?.id ?? null,`;
357
- } else {
358
- return `\n ${col.name}: row.${relationName}?.id,`;
359
- }
360
- }).join("");
361
- return relationFields;
362
- })()}
322
+ ...row,${(() => {
323
+ const relationFields = columns.filter((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id" || col.renderType === "array" && col.name.endsWith("_ids")).map((col) => {
324
+ if (col.renderType === "array" && col.name.endsWith("_ids")) {
325
+ const relationName$1 = getRelationNameFromColumnName(entityId, col.name);
326
+ return `\n ${col.name}: row.${relationName$1}?.map((r) => r.id) ?? [],`;
327
+ }
328
+ const relationName = getRelationNameFromColumnName(entityId, col.name);
329
+ if (col.nullable) {
330
+ return `\n ${col.name}: row.${relationName}?.id ?? null,`;
331
+ } else {
332
+ return `\n ${col.name}: row.${relationName}?.id,`;
333
+ }
334
+ }).join("");
335
+ return relationFields;
336
+ })()}
363
337
  }));
364
338
  });
365
339
  }
366
340
  }, [id, setForm]);
367
341
 
368
342
  const saveMutation = ${names.capital}Service.useSaveMutation();
369
- const handleSubmit = ${columns.some((col)=>[
370
- "json-sonamufile",
371
- "json-sonamufile-array"
372
- ].includes(col.renderType)) ? `submit(async (form) => {
343
+ const handleSubmit = ${columns.some((col) => ["json-sonamufile", "json-sonamufile-array"].includes(col.renderType)) ? `submit(async (form) => {
373
344
  saveMutation.mutate(
374
345
  { spa: [form] },
375
346
  {
@@ -441,25 +412,25 @@ ${(()=>{
441
412
  </CardHeader>
442
413
  <CardContent className="p-6">
443
414
  <div className="space-y-6">
444
- ${columns.filter((col)=>col.name !== "created_at").map((col)=>{
445
- const label = (()=>{
446
- if (col.label.endsWith("Id")) {
447
- try {
448
- const entity = EntityManager.get(col.label.replace("Id", ""));
449
- return entity.title ?? col.label;
450
- } catch {
451
- return col.label;
452
- }
453
- }
454
- return col.label;
455
- })();
456
- const labelName = getRelationNameFromColumnName(entityId, col.name);
457
- return ` {/* ${label} */}
415
+ ${columns.filter((col) => col.name !== "created_at").map((col) => {
416
+ const label = (() => {
417
+ if (col.label.endsWith("Id")) {
418
+ try {
419
+ const entity$1 = EntityManager.get(col.label.replace("Id", ""));
420
+ return entity$1.title ?? col.label;
421
+ } catch {
422
+ return col.label;
423
+ }
424
+ }
425
+ return col.label;
426
+ })();
427
+ const labelName = getRelationNameFromColumnName(entityId, col.name);
428
+ return ` {/* ${label} */}
458
429
  <div className="space-y-2">
459
430
  <label className="block text-xs mb-1 text-gray-600">{SD("entity.${entityId}.${labelName}")}</label>
460
431
  ${this.renderColumn(entityId, col)}
461
432
  </div>`;
462
- }).join("\n\n")}
433
+ }).join("\n\n")}
463
434
 
464
435
  {/* Save Button */}
465
436
  <div className="flex items-center justify-between pt-4">
@@ -487,9 +458,11 @@ ${columns.filter((col)=>col.name !== "created_at").map((col)=>{
487
458
  );
488
459
  }
489
460
  `.trim(),
490
- importKeys: []
491
- };
492
- }
493
- }
461
+ importKeys: []
462
+ };
463
+ }
464
+ };
494
465
 
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19mb3JtLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgUmVuZGVyaW5nTm9kZSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lLFxuICBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZSxcbiAgZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUsXG59IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfZm9ybSBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2Zvcm1cIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9mb3JtLnRzeGAsXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldFJlcXVpcmVkRGljdEtleXMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICByZXR1cm4gW1wiZW50aXR5LmNyZWF0ZVwiLCBcImVudGl0eS5lZGl0XCIsIFwiY29tbW9uLmJhY2tUb0xpc3RcIiwgXCJmb3JtLmNyZWF0ZWRBdFwiLCBcImNvbW1vbi5zYXZlXCJdO1xuICB9XG5cbiAgd3JhcEZDKGJvZHk6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICBgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj4ke2xhYmVsID8gYFxcbiAgPExhYmVsPiR7bGFiZWx9PC9MYWJlbD5gIDogXCJcIn1gLFxuICAgICAgYCAgJHtib2R5fWAsXG4gICAgICBgPC9kaXY+YCxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgd3JhcEZHKGJvZHk6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLndyYXBGQyhib2R5LCBsYWJlbCk7XG4gIH1cblxuICByZW5kZXJDb2x1bW5JbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgY29sOiBSZW5kZXJpbmdOb2RlKSB7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwiZW51bVwiIGFzIGNvbnN0LCBlbnVtSWQ6IGlkIH07XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJma1wiIGFzIGNvbnN0LCBlbnRpdHlJZDogcmVsUHJvcC53aXRoIH07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkge1xuICAgICAgLy8gTWFueVRvTWFueSByZWxhdGlvbuydmCBGSyDrsLDsl7RcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvX2lkcyQvLCBcIlwiKTtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBiYXNlTmFtZSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiZmtcIiBhcyBjb25zdCwgZW50aXR5SWQ6IHJlbFByb3Aud2l0aCB9O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihlbnRpdHlJZDogc3RyaW5nLCBjb2w6IFJlbmRlcmluZ05vZGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ0V4cHIgPSBgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9YDtcbiAgICBjb25zdCBwbGFjZWhvbGRlck5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gYHtTRChcImVudGl0eS4ke2VudGl0eUlkfS4ke3BsYWNlaG9sZGVyTmFtZX1cIil9YDtcblxuICAgIHN3aXRjaCAoY29sLnJlbmRlclR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmctcGxhaW5cIjpcbiAgICAgICAgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcgJiYgKGNvbC56b2RUeXBlLm1heExlbmd0aCA/PyAwKSA8PSAyNTYpIHtcbiAgICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPSR7cGxhY2Vob2xkZXJ9ICR7cmVnRXhwcn0gLz5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPFRleHRhcmVhIGNsYXNzTmFtZT1cInRleHQteHMgYmctd2hpdGVcIiByb3dzPXs0fSBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfSAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XG4gICAgICAgIHJldHVybiBgPERhdGVJbnB1dFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8aW5wdXQgdHlwZT1cImhpZGRlblwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgY2FzZSBcIm51bWJlci1wbGFpblwiOlxuICAgICAgICByZXR1cm4gYDxJbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfSAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBgPFN3aXRjaCAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8RmlsZUlucHV0XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZE1vZGU9XCJsYXp5XCJcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGU9XCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdTaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICAke3JlZ0V4cHJ9XG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCI6XG4gICAgICAgIHJldHVybiBgPEZpbGVJbnB1dFxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZT17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkTW9kZT1cImxhenlcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZT1cImltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgcHJldmlld1NpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgIG1heEZpbGVzPXsxMH1cbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBgPEVudW1TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgZW51bT17JHtpZH19XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtpZH1MYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgICByZXR1cm4gYDxJZEFzeW5jU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZz17JHtyZWxQcm9wLndpdGh9QXN5bmNJZENvbmZpZ31cbiAgICAgICAgICAgICAgICAgICAgc3Vic2V0PVwiQVwiXG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8SW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9JHtwbGFjZWhvbGRlcn0gJHtyZWdFeHByfSAvPmA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAvLyBNYW55VG9NYW55IHJlbGF0aW9u7J2YIEZLIOuwsOyXtOyduOyngCDtmZXsnbhcbiAgICAgICAgaWYgKGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLnJlcGxhY2UoL19pZHMkLywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiBgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGA8SW5wdXQgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj1cIiR7Y29sLm5hbWV9XCIgJHtyZWdFeHByfSAvPmA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9XCIke2NvbC5uYW1lfVwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPVwiJHtjb2wubmFtZX1cIiAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgJHtyZWdFeHByfSAvPmA7XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZURlZmF1bHRWYWx1ZShjb2x1bW5zOiBSZW5kZXJpbmdOb2RlW10pOiBvYmplY3Qge1xuICAgIHJldHVybiBjb2x1bW5zLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGNvbCkgPT4ge1xuICAgICAgICBpZiAoY29sLm9wdGlvbmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgICAgICAgaWYgKGNvbC5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgICAgICAgdmFsdWUgPSBPYmplY3Qua2V5cyhjb2wuem9kVHlwZS5lbnVtKVswXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgICAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgICAgICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgICAgICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgICAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZGF0ZXRpbWVcIikge1xuICAgICAgICAgICAgdmFsdWUgPSBcIm5vdygpXCI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgICAgICAgdmFsdWUgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdFtjb2wubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKHsgZW50aXR5SWQgfTogVGVtcGxhdGVPcHRpb25zW1widmlld19mb3JtXCJdKSB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICAvLyBQSyDtg4DsnoUg6rCQ7KeAXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcbiAgICBjb25zdCBpZFpvZFR5cGUgPVxuICAgICAgcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInouc3RyaW5nKCkub3B0aW9uYWwoKVwiIDogXCJ6Lm51bWJlcigpLm9wdGlvbmFsKClcIjtcblxuICAgIC8vIFNhdmVQYXJhbXMg7YOA7J6F7J2EIOuhnOuTnO2VmOyXrCBzYXZlUGFyYW1zTm9kZSDsg53shLFcbiAgICBjb25zdCB7IGxvYWRUeXBlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vc3luY2VyL21vZHVsZS1sb2FkZXJcIik7XG4gICAgY29uc3QgbG9hZGVkVHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgICBjb25zdCBTYXZlUGFyYW1zWm9kVHlwZSA9IGxvYWRlZFR5cGVzW2Ake2VudGl0eUlkfVNhdmVQYXJhbXNgXTtcblxuICAgIGlmICghU2F2ZVBhcmFtc1pvZFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2F2ZVBhcmFtcyBmb3IgJHtlbnRpdHlJZH0gbm90IGZvdW5kLiBEaWQgeW91IHJ1biAnc29uYW11IHN5bmMnP2ApO1xuICAgIH1cblxuICAgIC8vIFpvZCDtg4DsnoXsnYQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZhcbiAgICBjb25zdCB7IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3pvZC1jb252ZXJ0ZXJcIik7XG4gICAgY29uc3Qgc2F2ZVBhcmFtc05vZGUgPSB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKFNhdmVQYXJhbXNab2RUeXBlKTtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSAoKHNhdmVQYXJhbXNOb2RlPy5jaGlsZHJlbiA/PyBbXSkgYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gXCJpZFwiKVxuICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BDYW5kaWRhdGUgPSBlbnRpdHkucHJvcHMuZmluZCgocHJvcCkgPT4gcHJvcC5uYW1lID09PSBjb2wubmFtZSk7XG4gICAgICAgIGNvbC5sYWJlbCA9IHByb3BDYW5kaWRhdGU/LmRlc2MgPz8gY29sLmxhYmVsO1xuICAgICAgICByZXR1cm4gY29sO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLnJlc29sdmVEZWZhdWx0VmFsdWUoY29sdW1ucyk7XG5cbiAgICAvLyBlbnVt6rO8IEZL7JeQIOuMgO2VnCBpbXBvcnQg7KCV67O0IOyImOynkVxuICAgIGNvbnN0IGVudW1JbXBvcnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZmtDb25maWdJbXBvcnRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgZW51bUltcG9ydHMuYWRkKGlkKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgICAgZmtDb25maWdJbXBvcnRzLmFkZChyZWxQcm9wLndpdGgpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctcGxhaW5cIiAmJlxuICAgICAgICBjb2wubmFtZS5lbmRzV2l0aChcIl9pZFwiKSAmJlxuICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiXG4gICAgICApIHtcbiAgICAgICAgLy8gc3RyaW5nIEZLIOyymOumrCAo7J6Q7Iug7J2YIFBL7J24IGlk64qUIOygnOyZuClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICAgIGZrQ29uZmlnSW1wb3J0cy5hZGQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkge1xuICAgICAgICAvLyBNYW55VG9NYW55IHJlbGF0aW9u7J2YIEZLIOuwsOyXtFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJhc2VOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvX2lkcyQvLCBcIlwiKTtcbiAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICBma0NvbmZpZ0ltcG9ydHMuYWRkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBDYXJkLFxuICBDYXJkQ29udGVudCxcbiAgQ2FyZEhlYWRlcixcbiAgQ2FyZFRpdGxlLFxuICBJbnB1dCwke2NvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctcGxhaW5cIiAmJiBjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kU3RyaW5nICYmIChjb2wuem9kVHlwZS5tYXhMZW5ndGggPz8gMCkgPiAyNTYpID8gXCJcXG4gIFRleHRhcmVhLFwiIDogXCJcIn0ke2NvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSA/IFwiXFxuICBFbnVtU2VsZWN0LFwiIDogXCJcIn0ke2NvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIiB8fCAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIiAmJiBjb2wubmFtZS5lbmRzV2l0aChcIl9pZHNcIikpKSA/IFwiXFxuICBJZEFzeW5jU2VsZWN0LFwiIDogXCJcIn0ke2NvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJib29sZWFuXCIpID8gXCJcXG4gIFN3aXRjaCxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gW1wianNvbi1zb25hbXVmaWxlXCIsIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCJdLmluY2x1ZGVzKGNvbC5yZW5kZXJUeXBlKSkgPyBcIlxcbiAgRmlsZUlucHV0LFwiIDogXCJcIn0ke2NvbHVtbnMuc29tZSgoY29sKSA9PiBbXCJzdHJpbmctZGF0ZXRpbWVcIiwgXCJzdHJpbmctZGF0ZVwiLCBcImRhdGV0aW1lXCJdLmluY2x1ZGVzKGNvbC5yZW5kZXJUeXBlKSkgPyBcIlxcbiAgRGF0ZUlucHV0LFwiIDogXCJcIn1cbn0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgdXNlVHlwZUZvcm0gfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9saWJcIjtcbmltcG9ydCB7IHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1xdWVyeVwiO1xuaW1wb3J0IHsgY3JlYXRlRmlsZVJvdXRlLCB1c2VSb3V0ZXIgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB0eXBlIHsgJHtuYW1lcy5jYXBpdGFsfVN1YnNldEEgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7JHtcbiAgICAgICAgY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikubGVuZ3RoID4gMFxuICAgICAgICAgID8gXCJcXG5pbXBvcnQgeyBcIiArXG4gICAgICAgICAgICB1bmlxdWUoXG4gICAgICAgICAgICAgIGNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpXG4gICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtpZH0sICR7aWR9TGFiZWxgO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgIC5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgJyB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjsnXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG5pbXBvcnQgeyBkZWZhdWx0Q2F0Y2ggfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9U2F2ZVBhcmFtcyB9IGZyb20gXCJAL3NlcnZpY2VzLyR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9LnR5cGVzXCI7JHtcbiAgICAgICAgZmtDb25maWdJbXBvcnRzLnNpemUgPiAwXG4gICAgICAgICAgPyBgXFxuaW1wb3J0IHsgJHtBcnJheS5mcm9tKGZrQ29uZmlnSW1wb3J0cylcbiAgICAgICAgICAgICAgLm1hcCgoZW50aXR5KSA9PiBgJHtlbnRpdHl9QXN5bmNJZENvbmZpZ2ApXG4gICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9IH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7YFxuICAgICAgICAgIDogXCJcIlxuICAgICAgfVxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiQC9pMThuL3NkLmdlbmVyYXRlZFwiO1xuXG5pbXBvcnQgQXJyb3dMZWZ0SWNvbiBmcm9tIFwifmljb25zL2x1Y2lkZS9hcnJvdy1sZWZ0XCI7XG5pbXBvcnQgU2F2ZUljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvc2F2ZVwiO1xuaW1wb3J0IEZvcm1JY29uIGZyb20gXCJ+aWNvbnMvbWRpL2Zvcm0tc2VsZWN0XCI7XG5cbmNvbnN0IGZvcm1TZWFyY2hTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiAke2lkWm9kVHlwZX0sXG59KTtcblxuZXhwb3J0IGNvbnN0IFJvdXRlID0gY3JlYXRlRmlsZVJvdXRlKFwiL2FkbWluLyR7bmFtZXMuZnNQbHVyYWx9L2Zvcm1cIikoe1xuICB2YWxpZGF0ZVNlYXJjaDogZm9ybVNlYXJjaFNjaGVtYSxcbiAgY29tcG9uZW50OiAke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybVBhZ2UsXG59KTtcblxuZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm1QYWdlKCkge1xuICBjb25zdCB7IGlkIH0gPSBSb3V0ZS51c2VTZWFyY2goKTtcbiAgcmV0dXJuIDwke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybSBpZD17aWR9IC8+O1xufVxuXG50eXBlICR7bmFtZXMuY2FwaXRhbFBsdXJhbH1Gb3JtUHJvcHMgPSB7XG4gIGlkPzogJHtpZFRzVHlwZX07XG4gIG1vZGU/OiBcInBhZ2VcIiB8IFwibW9kYWxcIjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiAke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybSh7IGlkLCBtb2RlIH06ICR7bmFtZXMuY2FwaXRhbFBsdXJhbH1Gb3JtUHJvcHMpIHtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICBjb25zdCB7IGZvcm0sIHNldEZvcm0sIHJlZ2lzdGVyJHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gW1wianNvbi1zb25hbXVmaWxlXCIsIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCJdLmluY2x1ZGVzKGNvbC5yZW5kZXJUeXBlKSkgPyBcIiwgc3VibWl0XCIgOiBcIlwifSB9ID0gdXNlVHlwZUZvcm0oJHtuYW1lcy5jYXBpdGFsfVNhdmVQYXJhbXMsICR7SlNPTi5zdHJpbmdpZnkoZGVmYXVsdFZhbHVlKS5yZXBsYWNlKC9cIm5vd1xcKFxcKVwiL2csICdcIlwiJyl9KTtcbiR7KCgpID0+IHtcbiAgY29uc3QgaGFzRGF0ZXRpbWUgPSBjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWRhdGV0aW1lXCIpO1xuICBjb25zdCBoYXNEYXRlID0gY29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRlXCIpO1xuICBpZiAoIWhhc0RhdGV0aW1lICYmICFoYXNEYXRlKSByZXR1cm4gXCJcIjtcblxuICBsZXQgaGVscGVycyA9IFwiXFxuXCI7XG4gIGlmIChoYXNEYXRldGltZSkge1xuICAgIGhlbHBlcnMgKz0gYCAgLy8gZGF0ZXRpbWUtbG9jYWwg7ZiV7Iud7Jy866GcIOuzgO2ZmCAoWVlZWS1NTS1ERFRISDpNTSlcbiAgY29uc3QgdG9EYXRldGltZUxvY2FsU3RyaW5nID0gKGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGQgPSB0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBEYXRlKGRhdGUpIDogZGF0ZTtcbiAgICByZXR1cm4gZC50b0lTT1N0cmluZygpLnNsaWNlKDAsIDE2KTtcbiAgfTtcblxuICAvLyBkYXRldGltZS1sb2NhbCDrrLjsnpDsl7TsnYQgRGF0ZeuhnCDrs4DtmZhcbiAgY29uc3QgZnJvbURhdGV0aW1lTG9jYWxTdHJpbmcgPSAodmFsdWU6IHN0cmluZyk6IERhdGUgfCBudWxsID0+IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9O1xuYDtcbiAgfVxuICBpZiAoaGFzRGF0ZSkge1xuICAgIGhlbHBlcnMgKz0gYCAgLy8gZGF0ZSDtmJXsi53snLzroZwg67OA7ZmYIChZWVlZLU1NLUREKVxuICBjb25zdCB0b0RhdGVTdHJpbmcgPSAoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICAgIGlmICghZGF0ZSkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgZCA9IHR5cGVvZiBkYXRlID09PSBcInN0cmluZ1wiID8gbmV3IERhdGUoZGF0ZSkgOiBkYXRlO1xuICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdO1xuICB9O1xuXG4gIC8vIGRhdGUg66y47J6Q7Je07J2EIERhdGXroZwg67OA7ZmYXG4gIGNvbnN0IGZyb21EYXRlU3RyaW5nID0gKHZhbHVlOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfTtcbmA7XG4gIH1cbiAgcmV0dXJuIGhlbHBlcnM7XG59KSgpfVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpZCkge1xuICAgICAgJHtuYW1lcy5jYXBpdGFsfVNlcnZpY2UuZ2V0JHtuYW1lcy5jYXBpdGFsfShcIkFcIiwgaWQpLnRoZW4oKHJvdykgPT4ge1xuICAgICAgICBzZXRGb3JtKChwcmV2Rm9ybSkgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2Rm9ybSxcbiAgICAgICAgICAuLi5yb3csJHsoKCkgPT4ge1xuICAgICAgICAgICAgLy8gcmVsYXRpb24g7ZWE65Oc65Ok7J2EIOywvuyVhOyEnCDrs4DtmZgg7L2U65OcIOyDneyEsVxuICAgICAgICAgICAgLy8gbnVtYmVyIEZLLCBzdHJpbmcgRksgKOyekOyLoOydmCBQSyDsoJzsmbgpLCBNYW55VG9NYW55IEZLIOuwsOyXtOunjCDtlYTthLDrp4FcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uRmllbGRzID0gY29sdW1uc1xuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChjb2wpID0+XG4gICAgICAgICAgICAgICAgICBjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fFxuICAgICAgICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIgfHxcbiAgICAgICAgICAgICAgICAgIChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWFueVRvTWFueShhcnJheSkg7LKY66asXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiYgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvbk5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcXG4gICAgICAgICAgJHtjb2wubmFtZX06IHJvdy4ke3JlbGF0aW9uTmFtZX0/Lm1hcCgocikgPT4gci5pZCkgPz8gW10sYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRksobnVtYmVyLCBzdHJpbmcpIOyymOumrFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uTmFtZSA9IGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5udWxsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcXG4gICAgICAgICAgJHtjb2wubmFtZX06IHJvdy4ke3JlbGF0aW9uTmFtZX0/LmlkID8/IG51bGwsYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcXG4gICAgICAgICAgJHtjb2wubmFtZX06IHJvdy4ke3JlbGF0aW9uTmFtZX0/LmlkLGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGlvbkZpZWxkcztcbiAgICAgICAgICB9KSgpfVxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtpZCwgc2V0Rm9ybV0pO1xuXG4gIGNvbnN0IHNhdmVNdXRhdGlvbiA9ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLnVzZVNhdmVNdXRhdGlvbigpO1xuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAke1xuICAgIGNvbHVtbnMuc29tZSgoY29sKSA9PiBbXCJqc29uLXNvbmFtdWZpbGVcIiwgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIl0uaW5jbHVkZXMoY29sLnJlbmRlclR5cGUpKVxuICAgICAgPyBgc3VibWl0KGFzeW5jIChmb3JtKSA9PiB7XG4gICAgc2F2ZU11dGF0aW9uLm11dGF0ZShcbiAgICAgIHsgc3BhOiBbZm9ybV0gfSxcbiAgICAgIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoe1xuICAgICAgICAgICAgcXVlcnlLZXk6IFtcIiR7bmFtZXMuY2FwaXRhbH1cIl0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAobW9kZSA9PT0gXCJtb2RhbFwiKSB7XG4gICAgICAgICAgICAvLyBtb2RhbCBtb2RlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZSh7IHRvOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogZGVmYXVsdENhdGNoLFxuICAgICAgfSxcbiAgICApO1xuICB9KWBcbiAgICAgIDogYCgpID0+IHtcbiAgICBzYXZlTXV0YXRpb24ubXV0YXRlKFxuICAgICAgeyBzcGE6IFtmb3JtXSB9LFxuICAgICAge1xuICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7XG4gICAgICAgICAgICBxdWVyeUtleTogW1wiJHtuYW1lcy5jYXBpdGFsfVwiXSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChtb2RlID09PSBcIm1vZGFsXCIpIHtcbiAgICAgICAgICAgIC8vIG1vZGFsIG1vZGVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm91dGVyLm5hdmlnYXRlKHsgdG86IFwiL2FkbWluLyR7bmFtZXMuZnNQbHVyYWx9XCIgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBkZWZhdWx0Q2F0Y2gsXG4gICAgICB9LFxuICAgICk7XG4gIH1gXG4gIH07XG5cbiAgY29uc3QgUEFHRSA9IHtcbiAgICB0aXRsZTogaWQgPyBTRChcImVudGl0eS5lZGl0XCIpKFNEKFwiZW50aXR5LiR7ZW50aXR5SWR9XCIpLCBpZCkgOiBTRChcImVudGl0eS5jcmVhdGVcIikoU0QoXCJlbnRpdHkuJHtlbnRpdHlJZH1cIikpLFxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYXgtdy1bMTgwMHB4XSBteC1hdXRvIHAtOFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNiBtYi04XCI+XG4gICAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICA8Rm9ybUljb24gY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBoLTVcIj57UEFHRS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHttb2RlICE9PSBcIm1vZGFsXCIgJiYgKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHJvdXRlci5uYXZpZ2F0ZSh7IHRvOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiIH0pfVxuICAgICAgICAgICAgICAgIGljb249ezxBcnJvd0xlZnRJY29uIC8+fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge1NEKFwiY29tbW9uLmJhY2tUb0xpc3RcIil9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBGb3JtIENhcmQgKi99XG4gICAgICAgICAgPENhcmQgY2xhc3NOYW1lPVwiYm9yZGVyLWJvcmRlci80MCBiZy1ncmF5LTUwIHNoYWRvdy1zbVwiPlxuICAgICAgICAgICAgPENhcmRIZWFkZXIgY2xhc3NOYW1lPVwicHgtNCBib3JkZXItYiBib3JkZXItZ3JheS0yMDAgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPENhcmRUaXRsZSBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZSBtLTBcIj5cbiAgICAgICAgICAgICAgICB7UEFHRS50aXRsZX1cbiAgICAgICAgICAgICAgPC9DYXJkVGl0bGU+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG4gICAgICAgICAgICA8Q2FyZENvbnRlbnQgY2xhc3NOYW1lPVwicC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02XCI+XG4ke2NvbHVtbnNcbiAgLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gXCJjcmVhdGVkX2F0XCIpXG4gIC5tYXAoKGNvbCkgPT4ge1xuICAgIGNvbnN0IGxhYmVsID0gKCgpID0+IHtcbiAgICAgIGlmIChjb2wubGFiZWwuZW5kc1dpdGgoXCJJZFwiKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGNvbC5sYWJlbC5yZXBsYWNlKFwiSWRcIiwgXCJcIikpO1xuICAgICAgICAgIHJldHVybiBlbnRpdHkudGl0bGUgPz8gY29sLmxhYmVsO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY29sLmxhYmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sLmxhYmVsO1xuICAgIH0pKCk7XG4gICAgY29uc3QgbGFiZWxOYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICByZXR1cm4gYCAgICAgICAgICAgICAgICB7LyogJHtsYWJlbH0gKi99XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIG1iLTEgdGV4dC1ncmF5LTYwMFwiPntTRChcImVudGl0eS4ke2VudGl0eUlkfS4ke2xhYmVsTmFtZX1cIil9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICR7dGhpcy5yZW5kZXJDb2x1bW4oZW50aXR5SWQsIGNvbCl9XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgfSlcbiAgLmpvaW4oXCJcXG5cXG5cIil9XG5cbiAgICAgICAgICAgICAgICB7LyogU2F2ZSBCdXR0b24gKi99XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHQtNFwiPlxuICAgICAgICAgICAgICAgICAge2Zvcm0uaWQgJiYgZm9ybS5jcmVhdGVkX2F0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJtci0yIHRleHQteHMgdGV4dC1ncmF5LTYwMFwiPntTRChcImZvcm0uY3JlYXRlZEF0XCIpfTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC1ncmF5LTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge1N0cmluZyhmb3JtLmNyZWF0ZWRfYXQpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTdWJtaXR9XG4gICAgICAgICAgICAgICAgICAgIGljb249ezxTYXZlSWNvbiAvPn1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge1NEKFwiY29tbW9uLnNhdmVcIil9XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInVuaXF1ZSIsInoiLCJFbnRpdHlNYW5hZ2VyIiwiZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSIsImdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lIiwiZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUiLCJUZW1wbGF0ZSIsIlRlbXBsYXRlX192aWV3X2Zvcm0iLCJnZXRUYXJnZXRBbmRQYXRoIiwibmFtZXMiLCJ0YXJnZXQiLCJwYXRoIiwiZnNQbHVyYWwiLCJnZXRSZXF1aXJlZERpY3RLZXlzIiwid3JhcEZDIiwiYm9keSIsImxhYmVsIiwiam9pbiIsIndyYXBGRyIsInJlbmRlckNvbHVtbkltcG9ydCIsImVudGl0eUlkIiwiY29sIiwicmVuZGVyVHlwZSIsImlkIiwibmFtZSIsInR5cGUiLCJlbnVtSWQiLCJyZWxQcm9wIiwicmVwbGFjZSIsIndpdGgiLCJlbmRzV2l0aCIsImJhc2VOYW1lIiwicmVuZGVyQ29sdW1uIiwicmVnRXhwciIsInBsYWNlaG9sZGVyTmFtZSIsInBsYWNlaG9sZGVyIiwiem9kVHlwZSIsIlpvZFN0cmluZyIsIm1heExlbmd0aCIsInJlc29sdmVEZWZhdWx0VmFsdWUiLCJjb2x1bW5zIiwicmVkdWNlIiwicmVzdWx0Iiwib3B0aW9uYWwiLCJ2YWx1ZSIsIm51bGxhYmxlIiwiWm9kTnVtYmVyIiwiWm9kRW51bSIsIk9iamVjdCIsImtleXMiLCJlbnVtIiwiWm9kQm9vbGVhbiIsImNvcmUiLCIkWm9kU3RyaW5nIiwiWm9kQXJyYXkiLCJab2RPYmplY3QiLCJyZW5kZXIiLCJlbnRpdHkiLCJnZXQiLCJnZXROYW1lc0Zyb21JZCIsInBrVHlwZSIsImdldFBrVHlwZSIsImlkVHNUeXBlIiwiaWRab2RUeXBlIiwibG9hZFR5cGVzIiwibG9hZGVkVHlwZXMiLCJTYXZlUGFyYW1zWm9kVHlwZSIsIkVycm9yIiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsInNhdmVQYXJhbXNOb2RlIiwiY2hpbGRyZW4iLCJmaWx0ZXIiLCJtYXAiLCJwcm9wQ2FuZGlkYXRlIiwicHJvcHMiLCJmaW5kIiwicHJvcCIsImRlc2MiLCJkZWZhdWx0VmFsdWUiLCJlbnVtSW1wb3J0cyIsIlNldCIsImZrQ29uZmlnSW1wb3J0cyIsImZvckVhY2giLCJhZGQiLCJzb21lIiwiaW5jbHVkZXMiLCJjYXBpdGFsIiwibGVuZ3RoIiwiQm9vbGVhbiIsImZzIiwic2l6ZSIsIkFycmF5IiwiZnJvbSIsImNhcGl0YWxQbHVyYWwiLCJKU09OIiwic3RyaW5naWZ5IiwiaGFzRGF0ZXRpbWUiLCJoYXNEYXRlIiwiaGVscGVycyIsInJlbGF0aW9uRmllbGRzIiwicmVsYXRpb25OYW1lIiwidGl0bGUiLCJsYWJlbE5hbWUiLCJ0cmltIiwiaW1wb3J0S2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsYUFBYSxRQUFnQyxpQ0FBOEI7QUFFcEYsU0FDRUMsc0JBQXNCLEVBQ3RCQyw2QkFBNkIsRUFDN0JDLDBCQUEwQixRQUNyQixnQkFBYTtBQUNwQixTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFFdkMsT0FBTyxNQUFNQyw0QkFBNEJEO0lBQ3ZDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBRSxpQkFBaUJDLEtBQXdCLEVBQUU7UUFDekMsT0FBTztZQUNMQyxRQUFRO1lBQ1JDLE1BQU0sR0FBR0YsTUFBTUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNwQztJQUNGO0lBRVNDLHNCQUF1QztRQUM5QyxPQUFPO1lBQUM7WUFBaUI7WUFBZTtZQUFxQjtZQUFrQjtTQUFjO0lBQy9GO0lBRUFDLE9BQU9DLElBQVksRUFBRUMsS0FBYyxFQUFVO1FBQzNDLE9BQU87WUFDTCxDQUFDLDJCQUEyQixFQUFFQSxRQUFRLENBQUMsV0FBVyxFQUFFQSxNQUFNLFFBQVEsQ0FBQyxHQUFHLElBQUk7WUFDMUUsQ0FBQyxFQUFFLEVBQUVELE1BQU07WUFDWCxDQUFDLE1BQU0sQ0FBQztTQUNULENBQUNFLElBQUksQ0FBQztJQUNUO0lBQ0FDLE9BQU9ILElBQVksRUFBRUMsS0FBYyxFQUFVO1FBQzNDLE9BQU8sSUFBSSxDQUFDRixNQUFNLENBQUNDLE1BQU1DO0lBQzNCO0lBRUFHLG1CQUFtQkMsUUFBZ0IsRUFBRUMsR0FBa0IsRUFBRTtRQUN2RCxJQUFJQSxJQUFJQyxVQUFVLEtB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
466
+ //#endregion
467
+ export { Template__view_form };
468
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19mb3JtLnRlbXBsYXRlLmpzIiwibmFtZXMiOlsieiIsInZhbHVlOiB1bmtub3duIiwiZW50aXR5IiwicmVsYXRpb25OYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy92aWV3X2Zvcm0udGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJpbmdOb2RlLCB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSxcbiAgZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUsXG4gIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lLFxufSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX192aWV3X2Zvcm0gZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwidmlld19mb3JtXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIndlYi9zcmMvcm91dGVzL2FkbWluXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc1BsdXJhbH0vZm9ybS50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVudGl0eS5jcmVhdGVcIiwgXCJlbnRpdHkuZWRpdFwiLCBcImNvbW1vbi5iYWNrVG9MaXN0XCIsIFwiZm9ybS5jcmVhdGVkQXRcIiwgXCJjb21tb24uc2F2ZVwiXTtcbiAgfVxuXG4gIHdyYXBGQyhib2R5OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgYDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+JHtsYWJlbCA/IGBcXG4gIDxMYWJlbD4ke2xhYmVsfTwvTGFiZWw+YCA6IFwiXCJ9YCxcbiAgICAgIGAgICR7Ym9keX1gLFxuICAgICAgYDwvZGl2PmAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHdyYXBGRyhib2R5OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy53cmFwRkMoYm9keSwgbGFiZWwpO1xuICB9XG5cbiAgcmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSkge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBjb25zdCB7IGlkIH0gPSBnZXRFbnVtSW5mb0Zyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImVudW1cIiBhcyBjb25zdCwgZW51bUlkOiBpZCB9O1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiZmtcIiBhcyBjb25zdCwgZW50aXR5SWQ6IHJlbFByb3Aud2l0aCB9O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIiAmJiBjb2wubmFtZS5lbmRzV2l0aChcIl9pZHNcIikpIHtcbiAgICAgIC8vIE1hbnlUb01hbnkgcmVsYXRpb27snZggRksg67Cw7Je0XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLnJlcGxhY2UoL19pZHMkLywgXCJcIik7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgYmFzZU5hbWUpO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImZrXCIgYXMgY29uc3QsIGVudGl0eUlkOiByZWxQcm9wLndpdGggfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZW5kZXJDb2x1bW4oZW50aXR5SWQ6IHN0cmluZywgY29sOiBSZW5kZXJpbmdOb2RlKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWdFeHByID0gYHsuLi5yZWdpc3RlcihcIiR7Y29sLm5hbWV9XCIpfWA7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJOYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IGB7U0QoXCJlbnRpdHkuJHtlbnRpdHlJZH0uJHtwbGFjZWhvbGRlck5hbWV9XCIpfWA7XG5cbiAgICBzd2l0Y2ggKGNvbC5yZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nLXBsYWluXCI6XG4gICAgICAgIGlmIChjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kU3RyaW5nICYmIChjb2wuem9kVHlwZS5tYXhMZW5ndGggPz8gMCkgPD0gMjU2KSB7XG4gICAgICAgICAgcmV0dXJuIGA8SW5wdXQgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfSAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYDxUZXh0YXJlYSBjbGFzc05hbWU9XCJ0ZXh0LXhzIGJnLXdoaXRlXCIgcm93cz17NH0gcGxhY2Vob2xkZXI9JHtwbGFjZWhvbGRlcn0gJHtyZWdFeHByfSAvPmA7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICByZXR1cm4gYDxEYXRlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAke3JlZ0V4cHJ9XG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLWlkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWlkXCI6XG4gICAgICAgIHJldHVybiBgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGNhc2UgXCJudW1iZXItcGxhaW5cIjpcbiAgICAgICAgcmV0dXJuIGA8SW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9JHtwbGFjZWhvbGRlcn0gJHtyZWdFeHByfSAvPmA7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gYDxTd2l0Y2ggJHtyZWdFeHByfSAvPmA7XG4gICAgICBjYXNlIFwianNvbi1zb25hbXVmaWxlXCI6XG4gICAgICAgIHJldHVybiBgPEZpbGVJbnB1dFxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRNb2RlPVwibGF6eVwiXG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlPVwiaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZT1cIm1kXCJcbiAgICAgICAgICAgICAgICAgICAgJHtyZWdFeHByfVxuICAgICAgICAgICAgICAgICAgLz5gO1xuICAgICAgY2FzZSBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiOlxuICAgICAgICByZXR1cm4gYDxGaWxlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGU9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZE1vZGU9XCJsYXp5XCJcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGU9XCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIHByZXZpZXdTaXplPVwibWRcIlxuICAgICAgICAgICAgICAgICAgICBtYXhGaWxlcz17MTB9XG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIGNhc2UgXCJlbnVtc1wiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7aWR9fVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7aWR9TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8SW5wdXQgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcIm51bWJlci1ma19pZFwiOlxuICAgICAgY2FzZSBcInN0cmluZy1ma19pZFwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgICAgcmV0dXJuIGA8SWRBc3luY1NlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjb25maWc9eyR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWd9XG4gICAgICAgICAgICAgICAgICAgIHN1YnNldD1cIkFcIlxuICAgICAgICAgICAgICAgICAgICAke3JlZ0V4cHJ9XG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBgPElucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPSR7cGxhY2Vob2xkZXJ9ICR7cmVnRXhwcn0gLz5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgLy8gTWFueVRvTWFueSByZWxhdGlvbuydmCBGSyDrsLDsl7Tsnbjsp4Ag7ZmV7J24XG4gICAgICAgIGlmIChjb2wubmFtZS5lbmRzV2l0aChcIl9pZHNcIikpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBjb2wubmFtZS5yZXBsYWNlKC9faWRzJC8sIFwiXCIpO1xuICAgICAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBiYXNlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gYDxJZEFzeW5jU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZz17JHtyZWxQcm9wLndpdGh9QXN5bmNJZENvbmZpZ31cbiAgICAgICAgICAgICAgICAgICAgc3Vic2V0PVwiQVwiXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICR7cmVnRXhwcn1cbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBgPElucHV0IGNsYXNzTmFtZT1cImgtOCB0ZXh0LXhzIGJnLXdoaXRlXCIgcGxhY2Vob2xkZXI9XCIke2NvbC5uYW1lfVwiICR7cmVnRXhwcn0gLz5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiIHBsYWNlaG9sZGVyPVwiJHtjb2wubmFtZX1cIiAke3JlZ0V4cHJ9IC8+YDtcbiAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgcmV0dXJuIGA8SW5wdXQgY2xhc3NOYW1lPVwiaC04IHRleHQteHMgYmctd2hpdGVcIiBwbGFjZWhvbGRlcj1cIiR7Y29sLm5hbWV9XCIgJHtyZWdFeHByfSAvPmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYDxJbnB1dCBjbGFzc05hbWU9XCJoLTggdGV4dC14cyBiZy13aGl0ZVwiICR7cmVnRXhwcn0gLz5gO1xuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVEZWZhdWx0VmFsdWUoY29sdW1uczogUmVuZGVyaW5nTm9kZVtdKTogb2JqZWN0IHtcbiAgICByZXR1cm4gY29sdW1ucy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBjb2wpID0+IHtcbiAgICAgICAgaWYgKGNvbC5vcHRpb25hbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWU6IHVua25vd247XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgPT09IHRydWUpIHtcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wuem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgICAgIHZhbHVlID0gT2JqZWN0LmtleXMoY29sLnpvZFR5cGUuZW51bSlbMF07XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5jb3JlLiRab2RTdHJpbmcpIHtcbiAgICAgICAgICAvLyBOT1RFOiB6LlpvZFN0cmluZ+ycvOuhnCDruYTqtZDtlZjrqbQgei51cmwoKSwgei5lbWFpbCgpIOuTseydmCDtg4DsnoXsl5DshJwg66y47KCc6rCAIOyDneq4sOuvgOuhnCB6LmNvcmUuJFpvZFN0cmluZ+ycvOuhnCDruYTqtZDtlahcbiAgICAgICAgICAvLyBGSVhNRTogZW1haWzsnbTrgpggdXJsIO2DgOyehSDrk7Hsl5Ag64yA7ZWcIOyymOumrOqwgCDtlYTsmpTtlahcbiAgICAgICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWRhdGV0aW1lXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gXCJub3coKVwiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNvbC56b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBcnJheSkge1xuICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRbY29sLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0sXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfZm9ybVwiXSkge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuXG4gICAgLy8gUEsg7YOA7J6FIOqwkOyngFxuICAgIGNvbnN0IHBrVHlwZSA9IGVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICBjb25zdCBpZFRzVHlwZSA9IHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiID8gXCJzdHJpbmdcIiA6IFwibnVtYmVyXCI7XG4gICAgY29uc3QgaWRab2RUeXBlID1cbiAgICAgIHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiID8gXCJ6LnN0cmluZygpLm9wdGlvbmFsKClcIiA6IFwiei5udW1iZXIoKS5vcHRpb25hbCgpXCI7XG5cbiAgICAvLyBTYXZlUGFyYW1zIO2DgOyeheydhCDroZzrk5ztlZjsl6wgc2F2ZVBhcmFtc05vZGUg7IOd7ISxXG4gICAgY29uc3QgeyBsb2FkVHlwZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL3N5bmNlci9tb2R1bGUtbG9hZGVyXCIpO1xuICAgIGNvbnN0IGxvYWRlZFR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gICAgY29uc3QgU2F2ZVBhcmFtc1pvZFR5cGUgPSBsb2FkZWRUeXBlc1tgJHtlbnRpdHlJZH1TYXZlUGFyYW1zYF07XG5cbiAgICBpZiAoIVNhdmVQYXJhbXNab2RUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhdmVQYXJhbXMgZm9yICR7ZW50aXR5SWR9IG5vdCBmb3VuZC4gRGlkIHlvdSBydW4gJ3NvbmFtdSBzeW5jJz9gKTtcbiAgICB9XG5cbiAgICAvLyBab2Qg7YOA7J6F7J2EIFJlbmRlcmluZ05vZGXroZwg67OA7ZmYXG4gICAgY29uc3QgeyB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi96b2QtY29udmVydGVyXCIpO1xuICAgIGNvbnN0IHNhdmVQYXJhbXNOb2RlID0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShTYXZlUGFyYW1zWm9kVHlwZSk7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gKHNhdmVQYXJhbXNOb2RlPy5jaGlsZHJlbiA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwiaWRcIilcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wQ2FuZGlkYXRlID0gZW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gY29sLm5hbWUpO1xuICAgICAgICBjb2wubGFiZWwgPSBwcm9wQ2FuZGlkYXRlPy5kZXNjID8/IGNvbC5sYWJlbDtcbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5yZXNvbHZlRGVmYXVsdFZhbHVlKGNvbHVtbnMpO1xuXG4gICAgLy8gZW51beqzvCBGS+yXkCDrjIDtlZwgaW1wb3J0IOygleuztCDsiJjsp5FcbiAgICBjb25zdCBlbnVtSW1wb3J0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGZrQ29uZmlnSW1wb3J0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGVudW1JbXBvcnRzLmFkZChpZCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICAgIGZrQ29uZmlnSW1wb3J0cy5hZGQocmVsUHJvcC53aXRoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLXBsYWluXCIgJiZcbiAgICAgICAgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRcIikgJiZcbiAgICAgICAgY29sLm5hbWUgIT09IFwiaWRcIlxuICAgICAgKSB7XG4gICAgICAgIC8vIHN0cmluZyBGSyDsspjrpqwgKOyekOyLoOydmCBQS+yduCBpZOuKlCDsoJzsmbgpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgICBma0NvbmZpZ0ltcG9ydHMuYWRkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIiAmJiBjb2wubmFtZS5lbmRzV2l0aChcIl9pZHNcIikpIHtcbiAgICAgICAgLy8gTWFueVRvTWFueSByZWxhdGlvbuydmCBGSyDrsLDsl7RcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLnJlcGxhY2UoL19pZHMkLywgXCJcIik7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBiYXNlTmFtZSk7XG4gICAgICAgICAgZmtDb25maWdJbXBvcnRzLmFkZChyZWxQcm9wLndpdGgpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKSxcbiAgICAgIGJvZHk6IGBcbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIENhcmRUaXRsZSxcbiAgSW5wdXQsJHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLXBsYWluXCIgJiYgY29sLnpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiAoY29sLnpvZFR5cGUubWF4TGVuZ3RoID8/IDApID4gMjU2KSA/IFwiXFxuICBUZXh0YXJlYSxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikgPyBcIlxcbiAgRW51bVNlbGVjdCxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIgfHwgKGNvbC5yZW5kZXJUeXBlID09PSBcImFycmF5XCIgJiYgY29sLm5hbWUuZW5kc1dpdGgoXCJfaWRzXCIpKSkgPyBcIlxcbiAgSWRBc3luY1NlbGVjdCxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiYm9vbGVhblwiKSA/IFwiXFxuICBTd2l0Y2gsXCIgOiBcIlwifSR7Y29sdW1ucy5zb21lKChjb2wpID0+IFtcImpzb24tc29uYW11ZmlsZVwiLCBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkpID8gXCJcXG4gIEZpbGVJbnB1dCxcIiA6IFwiXCJ9JHtjb2x1bW5zLnNvbWUoKGNvbCkgPT4gW1wic3RyaW5nLWRhdGV0aW1lXCIsIFwic3RyaW5nLWRhdGVcIiwgXCJkYXRldGltZVwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkpID8gXCJcXG4gIERhdGVJbnB1dCxcIiA6IFwiXCJ9XG59IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IHVzZVR5cGVGb3JtIH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvbGliXCI7XG5pbXBvcnQgeyB1c2VRdWVyeUNsaWVudCB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtcXVlcnlcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVSb3V0ZSwgdXNlUm91dGVyIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgdHlwZSB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LmdlbmVyYXRlZFwiOyR7XG4gICAgICAgIGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFwiXFxuaW1wb3J0IHsgXCIgK1xuICAgICAgICAgICAgdW5pcXVlKFxuICAgICAgICAgICAgICBjb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7aWR9LCAke2lkfUxhYmVsYDtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAuam9pbihcIiwgXCIpICtcbiAgICAgICAgICAgICcgfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7J1xuICAgICAgICAgIDogXCJcIlxuICAgICAgfVxuaW1wb3J0IHsgZGVmYXVsdENhdGNoIH0gZnJvbSBcIkAvc2VydmljZXMvc29uYW11LnNoYXJlZFwiO1xuaW1wb3J0IHsgJHtuYW1lcy5jYXBpdGFsfVNhdmVQYXJhbXMgfSBmcm9tIFwiQC9zZXJ2aWNlcy8ke25hbWVzLmZzfS8ke25hbWVzLmZzfS50eXBlc1wiOyR7XG4gICAgICAgIGZrQ29uZmlnSW1wb3J0cy5zaXplID4gMFxuICAgICAgICAgID8gYFxcbmltcG9ydCB7ICR7QXJyYXkuZnJvbShma0NvbmZpZ0ltcG9ydHMpXG4gICAgICAgICAgICAgIC5tYXAoKGVudGl0eSkgPT4gYCR7ZW50aXR5fUFzeW5jSWRDb25maWdgKVxuICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfSB9IGZyb20gXCJAL3NlcnZpY2VzL3NlcnZpY2VzLmdlbmVyYXRlZFwiO2BcbiAgICAgICAgICA6IFwiXCJcbiAgICAgIH1cbmltcG9ydCB7IFNEIH0gZnJvbSBcIkAvaTE4bi9zZC5nZW5lcmF0ZWRcIjtcblxuaW1wb3J0IEFycm93TGVmdEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvYXJyb3ctbGVmdFwiO1xuaW1wb3J0IFNhdmVJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NhdmVcIjtcbmltcG9ydCBGb3JtSWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtLXNlbGVjdFwiO1xuXG5jb25zdCBmb3JtU2VhcmNoU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogJHtpZFpvZFR5cGV9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBSb3V0ZSA9IGNyZWF0ZUZpbGVSb3V0ZShcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfS9mb3JtXCIpKHtcbiAgdmFsaWRhdGVTZWFyY2g6IGZvcm1TZWFyY2hTY2hlbWEsXG4gIGNvbXBvbmVudDogJHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm1QYWdlLFxufSk7XG5cbmZ1bmN0aW9uICR7bmFtZXMuY2FwaXRhbFBsdXJhbH1Gb3JtUGFnZSgpIHtcbiAgY29uc3QgeyBpZCB9ID0gUm91dGUudXNlU2VhcmNoKCk7XG4gIHJldHVybiA8JHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm0gaWQ9e2lkfSAvPjtcbn1cblxudHlwZSAke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybVByb3BzID0ge1xuICBpZD86ICR7aWRUc1R5cGV9O1xuICBtb2RlPzogXCJwYWdlXCIgfCBcIm1vZGFsXCI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsUGx1cmFsfUZvcm0oeyBpZCwgbW9kZSB9OiAke25hbWVzLmNhcGl0YWxQbHVyYWx9Rm9ybVByb3BzKSB7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgY29uc3QgeyBmb3JtLCBzZXRGb3JtLCByZWdpc3RlciR7Y29sdW1ucy5zb21lKChjb2wpID0+IFtcImpzb24tc29uYW11ZmlsZVwiLCBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSkpID8gXCIsIHN1Ym1pdFwiIDogXCJcIn0gfSA9IHVzZVR5cGVGb3JtKCR7bmFtZXMuY2FwaXRhbH1TYXZlUGFyYW1zLCAke0pTT04uc3RyaW5naWZ5KGRlZmF1bHRWYWx1ZSkucmVwbGFjZSgvXCJub3dcXChcXClcIi9nLCAnXCJcIicpfSk7XG4keygoKSA9PiB7XG4gIGNvbnN0IGhhc0RhdGV0aW1lID0gY29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiKTtcbiAgY29uc3QgaGFzRGF0ZSA9IGNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZGF0ZVwiKTtcbiAgaWYgKCFoYXNEYXRldGltZSAmJiAhaGFzRGF0ZSkgcmV0dXJuIFwiXCI7XG5cbiAgbGV0IGhlbHBlcnMgPSBcIlxcblwiO1xuICBpZiAoaGFzRGF0ZXRpbWUpIHtcbiAgICBoZWxwZXJzICs9IGAgIC8vIGRhdGV0aW1lLWxvY2FsIO2YleyLneycvOuhnCDrs4DtmZggKFlZWVktTU0tRERUSEg6TU0pXG4gIGNvbnN0IHRvRGF0ZXRpbWVMb2NhbFN0cmluZyA9IChkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBkID0gdHlwZW9mIGRhdGUgPT09IFwic3RyaW5nXCIgPyBuZXcgRGF0ZShkYXRlKSA6IGRhdGU7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxNik7XG4gIH07XG5cbiAgLy8gZGF0ZXRpbWUtbG9jYWwg66y47J6Q7Je07J2EIERhdGXroZwg67OA7ZmYXG4gIGNvbnN0IGZyb21EYXRldGltZUxvY2FsU3RyaW5nID0gKHZhbHVlOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCA9PiB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgfTtcbmA7XG4gIH1cbiAgaWYgKGhhc0RhdGUpIHtcbiAgICBoZWxwZXJzICs9IGAgIC8vIGRhdGUg7ZiV7Iud7Jy866GcIOuzgO2ZmCAoWVlZWS1NTS1ERClcbiAgY29uc3QgdG9EYXRlU3RyaW5nID0gKGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGQgPSB0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIiA/IG5ldyBEYXRlKGRhdGUpIDogZGF0ZTtcbiAgICByZXR1cm4gZC50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXTtcbiAgfTtcblxuICAvLyBkYXRlIOusuOyekOyXtOydhCBEYXRl66GcIOuzgO2ZmFxuICBjb25zdCBmcm9tRGF0ZVN0cmluZyA9ICh2YWx1ZTogc3RyaW5nKTogRGF0ZSB8IG51bGwgPT4ge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIH07XG5gO1xuICB9XG4gIHJldHVybiBoZWxwZXJzO1xufSkoKX1cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaWQpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmdldCR7bmFtZXMuY2FwaXRhbH0oXCJBXCIsIGlkKS50aGVuKChyb3cpID0+IHtcbiAgICAgICAgc2V0Rm9ybSgocHJldkZvcm0pID0+ICh7XG4gICAgICAgICAgLi4ucHJldkZvcm0sXG4gICAgICAgICAgLi4ucm93LCR7KCgpID0+IHtcbiAgICAgICAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOuTpOydhCDssL7slYTshJwg67OA7ZmYIOy9lOuTnCDsg53shLFcbiAgICAgICAgICAgIC8vIG51bWJlciBGSywgc3RyaW5nIEZLICjsnpDsi6DsnZggUEsg7KCc7Jm4KSwgTWFueVRvTWFueSBGSyDrsLDsl7Trp4wg7ZWE7YSw66eBXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbkZpZWxkcyA9IGNvbHVtbnNcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoY29sKSA9PlxuICAgICAgICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHxcbiAgICAgICAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1ma19pZFwiIHx8XG4gICAgICAgICAgICAgICAgICAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIiAmJiBjb2wubmFtZS5lbmRzV2l0aChcIl9pZHNcIikpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1hbnlUb01hbnkoYXJyYXkpIOyymOumrFxuICAgICAgICAgICAgICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmIGNvbC5uYW1lLmVuZHNXaXRoKFwiX2lkc1wiKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25OYW1lID0gZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxuICAgICAgICAgICR7Y29sLm5hbWV9OiByb3cuJHtyZWxhdGlvbk5hbWV9Py5tYXAoKHIpID0+IHIuaWQpID8/IFtdLGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEZLKG51bWJlciwgc3RyaW5nKSDsspjrpqxcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvbk5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjb2wubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxuICAgICAgICAgICR7Y29sLm5hbWV9OiByb3cuJHtyZWxhdGlvbk5hbWV9Py5pZCA/PyBudWxsLGA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxuICAgICAgICAgICR7Y29sLm5hbWV9OiByb3cuJHtyZWxhdGlvbk5hbWV9Py5pZCxgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oXCJcIik7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpb25GaWVsZHM7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbaWQsIHNldEZvcm1dKTtcblxuICBjb25zdCBzYXZlTXV0YXRpb24gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2VTYXZlTXV0YXRpb24oKTtcbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gJHtcbiAgICBjb2x1bW5zLnNvbWUoKGNvbCkgPT4gW1wianNvbi1zb25hbXVmaWxlXCIsIFwianNvbi1zb25hbXVmaWxlLWFycmF5XCJdLmluY2x1ZGVzKGNvbC5yZW5kZXJUeXBlKSlcbiAgICAgID8gYHN1Ym1pdChhc3luYyAoZm9ybSkgPT4ge1xuICAgIHNhdmVNdXRhdGlvbi5tdXRhdGUoXG4gICAgICB7IHNwYTogW2Zvcm1dIH0sXG4gICAgICB7XG4gICAgICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgICAgIHF1ZXJ5S2V5OiBbXCIke25hbWVzLmNhcGl0YWx9XCJdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKG1vZGUgPT09IFwibW9kYWxcIikge1xuICAgICAgICAgICAgLy8gbW9kYWwgbW9kZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3V0ZXIubmF2aWdhdGUoeyB0bzogXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH1cIiB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGRlZmF1bHRDYXRjaCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSlgXG4gICAgICA6IGAoKSA9PiB7XG4gICAgc2F2ZU11dGF0aW9uLm11dGF0ZShcbiAgICAgIHsgc3BhOiBbZm9ybV0gfSxcbiAgICAgIHtcbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoe1xuICAgICAgICAgICAgcXVlcnlLZXk6IFtcIiR7bmFtZXMuY2FwaXRhbH1cIl0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAobW9kZSA9PT0gXCJtb2RhbFwiKSB7XG4gICAgICAgICAgICAvLyBtb2RhbCBtb2RlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZSh7IHRvOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogZGVmYXVsdENhdGNoLFxuICAgICAgfSxcbiAgICApO1xuICB9YFxuICB9O1xuXG4gIGNvbnN0IFBBR0UgPSB7XG4gICAgdGl0bGU6IGlkID8gU0QoXCJlbnRpdHkuZWRpdFwiKShTRChcImVudGl0eS4ke2VudGl0eUlkfVwiKSwgaWQpIDogU0QoXCJlbnRpdHkuY3JlYXRlXCIpKFNEKFwiZW50aXR5LiR7ZW50aXR5SWR9XCIpKSxcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWF4LXctWzE4MDBweF0gbXgtYXV0byBwLThcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTYgbWItOFwiPlxuICAgICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPEZvcm1JY29uIGNsYXNzTmFtZT1cImgtNSB3LTVcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxnIGZvbnQtc2VtaWJvbGQgaC01XCI+e1BBR0UudGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7bW9kZSAhPT0gXCJtb2RhbFwiICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiByb3V0ZXIubmF2aWdhdGUoeyB0bzogXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH1cIiB9KX1cbiAgICAgICAgICAgICAgICBpY29uPXs8QXJyb3dMZWZ0SWNvbiAvPn1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtTRChcImNvbW1vbi5iYWNrVG9MaXN0XCIpfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICB7LyogRm9ybSBDYXJkICovfVxuICAgICAgICAgIDxDYXJkIGNsYXNzTmFtZT1cImJvcmRlci1ib3JkZXIvNDAgYmctZ3JheS01MCBzaGFkb3ctc21cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInB4LTQgYm9yZGVyLWIgYm9yZGVyLWdyYXktMjAwIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxDYXJkVGl0bGUgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSBsZWFkaW5nLW5vbmUgbS0wXCI+XG4gICAgICAgICAgICAgICAge1BBR0UudGl0bGV9XG4gICAgICAgICAgICAgIDwvQ2FyZFRpdGxlPlxuICAgICAgICAgICAgPC9DYXJkSGVhZGVyPlxuICAgICAgICAgICAgPENhcmRDb250ZW50IGNsYXNzTmFtZT1cInAtNlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNlwiPlxuJHtjb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwiY3JlYXRlZF9hdFwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBjb25zdCBsYWJlbCA9ICgoKSA9PiB7XG4gICAgICBpZiAoY29sLmxhYmVsLmVuZHNXaXRoKFwiSWRcIikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChjb2wubGFiZWwucmVwbGFjZShcIklkXCIsIFwiXCIpKTtcbiAgICAgICAgICByZXR1cm4gZW50aXR5LnRpdGxlID8/IGNvbC5sYWJlbDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGNvbC5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbC5sYWJlbDtcbiAgICB9KSgpO1xuICAgIGNvbnN0IGxhYmVsTmFtZSA9IGdldFJlbGF0aW9uTmFtZUZyb21Db2x1bW5OYW1lKGVudGl0eUlkLCBjb2wubmFtZSk7XG4gICAgcmV0dXJuIGAgICAgICAgICAgICAgICAgey8qICR7bGFiZWx9ICovfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC14cyBtYi0xIHRleHQtZ3JheS02MDBcIj57U0QoXCJlbnRpdHkuJHtlbnRpdHlJZH0uJHtsYWJlbE5hbWV9XCIpfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAke3RoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wpfVxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gIH0pXG4gIC5qb2luKFwiXFxuXFxuXCIpfVxuXG4gICAgICAgICAgICAgICAgey8qIFNhdmUgQnV0dG9uICovfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTRcIj5cbiAgICAgICAgICAgICAgICAgIHtmb3JtLmlkICYmIGZvcm0uY3JlYXRlZF9hdCAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwibXItMiB0ZXh0LXhzIHRleHQtZ3JheS02MDBcIj57U0QoXCJmb3JtLmNyZWF0ZWRBdFwiKX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtTdHJpbmcoZm9ybS5jcmVhdGVkX2F0KX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU3VibWl0fVxuICAgICAgICAgICAgICAgICAgICBpY29uPXs8U2F2ZUljb24gLz59XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtTRChcImNvbW1vbi5zYXZlXCIpfVxuICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9DYXJkQ29udGVudD5cbiAgICAgICAgICA8L0NhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7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