@jigx/core-sdk 1.0.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 (902) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +87 -0
  3. package/dist/PACKAGE.d.ts +4 -0
  4. package/dist/PACKAGE.d.ts.map +1 -0
  5. package/dist/PACKAGE.js +5 -0
  6. package/dist/abstract/app-info.d.ts +8 -0
  7. package/dist/abstract/app-info.d.ts.map +1 -0
  8. package/dist/abstract/app-info.js +8 -0
  9. package/dist/abstract/app-name.d.ts +15 -0
  10. package/dist/abstract/app-name.d.ts.map +1 -0
  11. package/dist/abstract/app-name.js +28 -0
  12. package/dist/abstract/base-builder.d.ts +4 -0
  13. package/dist/abstract/base-builder.d.ts.map +1 -0
  14. package/dist/abstract/base-builder.js +3 -0
  15. package/dist/abstract/element-base-builder.d.ts +7 -0
  16. package/dist/abstract/element-base-builder.d.ts.map +1 -0
  17. package/dist/abstract/element-base-builder.js +11 -0
  18. package/dist/abstract/generic.d.ts +31 -0
  19. package/dist/abstract/generic.d.ts.map +1 -0
  20. package/dist/abstract/generic.js +2 -0
  21. package/dist/abstract/index.d.ts +12 -0
  22. package/dist/abstract/index.d.ts.map +1 -0
  23. package/dist/abstract/index.js +11 -0
  24. package/dist/abstract/register.d.ts +31 -0
  25. package/dist/abstract/register.d.ts.map +1 -0
  26. package/dist/abstract/register.js +48 -0
  27. package/dist/abstract/sdk.expression.d.ts +43 -0
  28. package/dist/abstract/sdk.expression.d.ts.map +1 -0
  29. package/dist/abstract/sdk.expression.js +175 -0
  30. package/dist/abstract/sdk.text.d.ts +23 -0
  31. package/dist/abstract/sdk.text.d.ts.map +1 -0
  32. package/dist/abstract/sdk.text.js +110 -0
  33. package/dist/abstract/sdk.types.d.ts +16 -0
  34. package/dist/abstract/sdk.types.d.ts.map +1 -0
  35. package/dist/abstract/sdk.types.js +88 -0
  36. package/dist/abstract/zod.strata.d.ts +17 -0
  37. package/dist/abstract/zod.strata.d.ts.map +1 -0
  38. package/dist/abstract/zod.strata.js +11 -0
  39. package/dist/abstract/zod.types.d.ts +1937 -0
  40. package/dist/abstract/zod.types.d.ts.map +1 -0
  41. package/dist/abstract/zod.types.js +848 -0
  42. package/dist/action/action-definition.builder.d.ts +16 -0
  43. package/dist/action/action-definition.builder.d.ts.map +1 -0
  44. package/dist/action/action-definition.builder.js +35 -0
  45. package/dist/action/action.descriptor.d.ts +8 -0
  46. package/dist/action/action.descriptor.d.ts.map +1 -0
  47. package/dist/action/action.descriptor.js +2 -0
  48. package/dist/action/index.d.ts +57 -0
  49. package/dist/action/index.d.ts.map +1 -0
  50. package/dist/action/index.js +48 -0
  51. package/dist/action/ja.abstract.d.ts +33 -0
  52. package/dist/action/ja.abstract.d.ts.map +1 -0
  53. package/dist/action/ja.abstract.js +58 -0
  54. package/dist/action/ja.action-definition.d.ts +11 -0
  55. package/dist/action/ja.action-definition.d.ts.map +1 -0
  56. package/dist/action/ja.action-definition.js +12 -0
  57. package/dist/action/ja.action-list.d.ts +9 -0
  58. package/dist/action/ja.action-list.d.ts.map +1 -0
  59. package/dist/action/ja.action-list.js +15 -0
  60. package/dist/action/ja.clear-queue.d.ts +9 -0
  61. package/dist/action/ja.clear-queue.d.ts.map +1 -0
  62. package/dist/action/ja.clear-queue.js +9 -0
  63. package/dist/action/ja.color.d.ts +3 -0
  64. package/dist/action/ja.color.d.ts.map +1 -0
  65. package/dist/action/ja.color.js +2 -0
  66. package/dist/action/ja.confirm.abstract.d.ts +16 -0
  67. package/dist/action/ja.confirm.abstract.d.ts.map +1 -0
  68. package/dist/action/ja.confirm.abstract.js +25 -0
  69. package/dist/action/ja.confirm.d.ts +23 -0
  70. package/dist/action/ja.confirm.d.ts.map +1 -0
  71. package/dist/action/ja.confirm.js +28 -0
  72. package/dist/action/ja.delete-queue-command.d.ts +9 -0
  73. package/dist/action/ja.delete-queue-command.d.ts.map +1 -0
  74. package/dist/action/ja.delete-queue-command.js +9 -0
  75. package/dist/action/ja.delete-sync-scope.d.ts +10 -0
  76. package/dist/action/ja.delete-sync-scope.d.ts.map +1 -0
  77. package/dist/action/ja.delete-sync-scope.js +14 -0
  78. package/dist/action/ja.delete-sync-status.d.ts +9 -0
  79. package/dist/action/ja.delete-sync-status.d.ts.map +1 -0
  80. package/dist/action/ja.delete-sync-status.js +9 -0
  81. package/dist/action/ja.evaluate.d.ts +12 -0
  82. package/dist/action/ja.evaluate.d.ts.map +1 -0
  83. package/dist/action/ja.evaluate.js +9 -0
  84. package/dist/action/ja.execute-action.d.ts +11 -0
  85. package/dist/action/ja.execute-action.d.ts.map +1 -0
  86. package/dist/action/ja.execute-action.js +15 -0
  87. package/dist/action/ja.execute-entities.d.ts +7 -0
  88. package/dist/action/ja.execute-entities.d.ts.map +1 -0
  89. package/dist/action/ja.execute-entities.js +8 -0
  90. package/dist/action/ja.execute-entity.abstract.d.ts +41 -0
  91. package/dist/action/ja.execute-entity.abstract.d.ts.map +1 -0
  92. package/dist/action/ja.execute-entity.abstract.js +104 -0
  93. package/dist/action/ja.execute-entity.d.ts +6 -0
  94. package/dist/action/ja.execute-entity.d.ts.map +1 -0
  95. package/dist/action/ja.execute-entity.dynamic-data.d.ts +6 -0
  96. package/dist/action/ja.execute-entity.dynamic-data.d.ts.map +1 -0
  97. package/dist/action/ja.execute-entity.dynamic-data.js +2 -0
  98. package/dist/action/ja.execute-entity.generic.d.ts +11 -0
  99. package/dist/action/ja.execute-entity.generic.d.ts.map +1 -0
  100. package/dist/action/ja.execute-entity.generic.js +2 -0
  101. package/dist/action/ja.execute-entity.js +8 -0
  102. package/dist/action/ja.execute-entity.sql.d.ts +12 -0
  103. package/dist/action/ja.execute-entity.sql.d.ts.map +1 -0
  104. package/dist/action/ja.execute-entity.sql.js +2 -0
  105. package/dist/action/ja.execute-sql.abstract.d.ts +6 -0
  106. package/dist/action/ja.execute-sql.abstract.d.ts.map +1 -0
  107. package/dist/action/ja.execute-sql.abstract.js +2 -0
  108. package/dist/action/ja.execute-sql.d.ts +16 -0
  109. package/dist/action/ja.execute-sql.d.ts.map +1 -0
  110. package/dist/action/ja.execute-sql.js +64 -0
  111. package/dist/action/ja.find-replace.d.ts +12 -0
  112. package/dist/action/ja.find-replace.d.ts.map +1 -0
  113. package/dist/action/ja.find-replace.js +22 -0
  114. package/dist/action/ja.generate-file.d.ts +11 -0
  115. package/dist/action/ja.generate-file.d.ts.map +1 -0
  116. package/dist/action/ja.generate-file.js +19 -0
  117. package/dist/action/ja.generate-pdf.d.ts +10 -0
  118. package/dist/action/ja.generate-pdf.d.ts.map +1 -0
  119. package/dist/action/ja.generate-pdf.js +10 -0
  120. package/dist/action/ja.go-back.d.ts +9 -0
  121. package/dist/action/ja.go-back.d.ts.map +1 -0
  122. package/dist/action/ja.go-back.js +11 -0
  123. package/dist/action/ja.go-to.d.ts +18 -0
  124. package/dist/action/ja.go-to.d.ts.map +1 -0
  125. package/dist/action/ja.go-to.js +41 -0
  126. package/dist/action/ja.in-background.d.ts +95 -0
  127. package/dist/action/ja.in-background.d.ts.map +1 -0
  128. package/dist/action/ja.in-background.factory.d.ts +88 -0
  129. package/dist/action/ja.in-background.factory.d.ts.map +1 -0
  130. package/dist/action/ja.in-background.factory.js +98 -0
  131. package/dist/action/ja.in-background.js +247 -0
  132. package/dist/action/ja.info-modal.d.ts +37 -0
  133. package/dist/action/ja.info-modal.d.ts.map +1 -0
  134. package/dist/action/ja.info-modal.js +61 -0
  135. package/dist/action/ja.jig-actions.d.ts +16 -0
  136. package/dist/action/ja.jig-actions.d.ts.map +1 -0
  137. package/dist/action/ja.jig-actions.js +35 -0
  138. package/dist/action/ja.on-button.factory.d.ts +89 -0
  139. package/dist/action/ja.on-button.factory.d.ts.map +1 -0
  140. package/dist/action/ja.on-button.factory.js +86 -0
  141. package/dist/action/ja.open-app-settings.d.ts +6 -0
  142. package/dist/action/ja.open-app-settings.d.ts.map +1 -0
  143. package/dist/action/ja.open-app-settings.js +8 -0
  144. package/dist/action/ja.open-map.abstract.d.ts +6 -0
  145. package/dist/action/ja.open-map.abstract.d.ts.map +1 -0
  146. package/dist/action/ja.open-map.abstract.js +2 -0
  147. package/dist/action/ja.open-map.d.ts +11 -0
  148. package/dist/action/ja.open-map.d.ts.map +1 -0
  149. package/dist/action/ja.open-map.js +25 -0
  150. package/dist/action/ja.open-media-picker.abstract.d.ts +8 -0
  151. package/dist/action/ja.open-media-picker.abstract.d.ts.map +1 -0
  152. package/dist/action/ja.open-media-picker.abstract.js +2 -0
  153. package/dist/action/ja.open-media-picker.d.ts +18 -0
  154. package/dist/action/ja.open-media-picker.d.ts.map +1 -0
  155. package/dist/action/ja.open-media-picker.js +46 -0
  156. package/dist/action/ja.open-scanner.d.ts +14 -0
  157. package/dist/action/ja.open-scanner.d.ts.map +1 -0
  158. package/dist/action/ja.open-scanner.js +23 -0
  159. package/dist/action/ja.open-url.d.ts +10 -0
  160. package/dist/action/ja.open-url.d.ts.map +1 -0
  161. package/dist/action/ja.open-url.js +13 -0
  162. package/dist/action/ja.print.d.ts +10 -0
  163. package/dist/action/ja.print.d.ts.map +1 -0
  164. package/dist/action/ja.print.js +17 -0
  165. package/dist/action/ja.reset-application-state.d.ts +9 -0
  166. package/dist/action/ja.reset-application-state.d.ts.map +1 -0
  167. package/dist/action/ja.reset-application-state.js +12 -0
  168. package/dist/action/ja.reset-component-state.d.ts +9 -0
  169. package/dist/action/ja.reset-component-state.d.ts.map +1 -0
  170. package/dist/action/ja.reset-component-state.js +13 -0
  171. package/dist/action/ja.reset-screen-state.d.ts +9 -0
  172. package/dist/action/ja.reset-screen-state.d.ts.map +1 -0
  173. package/dist/action/ja.reset-screen-state.js +12 -0
  174. package/dist/action/ja.reset-state.d.ts +9 -0
  175. package/dist/action/ja.reset-state.d.ts.map +1 -0
  176. package/dist/action/ja.reset-state.js +13 -0
  177. package/dist/action/ja.retry-queue-command.d.ts +9 -0
  178. package/dist/action/ja.retry-queue-command.d.ts.map +1 -0
  179. package/dist/action/ja.retry-queue-command.js +9 -0
  180. package/dist/action/ja.sdk.d.ts +4 -0
  181. package/dist/action/ja.sdk.d.ts.map +1 -0
  182. package/dist/action/ja.sdk.js +2 -0
  183. package/dist/action/ja.set-active-tab.d.ts +13 -0
  184. package/dist/action/ja.set-active-tab.d.ts.map +1 -0
  185. package/dist/action/ja.set-active-tab.js +29 -0
  186. package/dist/action/ja.set-application-state.d.ts +9 -0
  187. package/dist/action/ja.set-application-state.d.ts.map +1 -0
  188. package/dist/action/ja.set-application-state.js +17 -0
  189. package/dist/action/ja.set-screen-state.d.ts +9 -0
  190. package/dist/action/ja.set-screen-state.d.ts.map +1 -0
  191. package/dist/action/ja.set-screen-state.js +12 -0
  192. package/dist/action/ja.share.d.ts +12 -0
  193. package/dist/action/ja.share.d.ts.map +1 -0
  194. package/dist/action/ja.share.js +23 -0
  195. package/dist/action/ja.show-alert.d.ts +33 -0
  196. package/dist/action/ja.show-alert.d.ts.map +1 -0
  197. package/dist/action/ja.show-alert.js +61 -0
  198. package/dist/action/ja.start-location-sharing.abstract.d.ts +6 -0
  199. package/dist/action/ja.start-location-sharing.abstract.d.ts.map +1 -0
  200. package/dist/action/ja.start-location-sharing.abstract.js +2 -0
  201. package/dist/action/ja.start-location-sharing.d.ts +18 -0
  202. package/dist/action/ja.start-location-sharing.d.ts.map +1 -0
  203. package/dist/action/ja.start-location-sharing.js +33 -0
  204. package/dist/action/ja.start-sync-scope.d.ts +9 -0
  205. package/dist/action/ja.start-sync-scope.d.ts.map +1 -0
  206. package/dist/action/ja.start-sync-scope.js +18 -0
  207. package/dist/action/ja.stop-location-sharing.d.ts +6 -0
  208. package/dist/action/ja.stop-location-sharing.d.ts.map +1 -0
  209. package/dist/action/ja.stop-location-sharing.js +8 -0
  210. package/dist/action/ja.submit-form.abstract.d.ts +11 -0
  211. package/dist/action/ja.submit-form.abstract.d.ts.map +1 -0
  212. package/dist/action/ja.submit-form.abstract.js +2 -0
  213. package/dist/action/ja.submit-form.d.ts +31 -0
  214. package/dist/action/ja.submit-form.d.ts.map +1 -0
  215. package/dist/action/ja.submit-form.js +124 -0
  216. package/dist/action/ja.swipeable-action.d.ts +19 -0
  217. package/dist/action/ja.swipeable-action.d.ts.map +1 -0
  218. package/dist/action/ja.swipeable-action.js +25 -0
  219. package/dist/action/ja.sync-entities.abstract.d.ts +25 -0
  220. package/dist/action/ja.sync-entities.abstract.d.ts.map +1 -0
  221. package/dist/action/ja.sync-entities.abstract.js +2 -0
  222. package/dist/action/ja.sync-entities.d.ts +32 -0
  223. package/dist/action/ja.sync-entities.d.ts.map +1 -0
  224. package/dist/action/ja.sync-entities.js +142 -0
  225. package/dist/action/ja.update-profile.d.ts +12 -0
  226. package/dist/action/ja.update-profile.d.ts.map +1 -0
  227. package/dist/action/ja.update-profile.js +20 -0
  228. package/dist/application/application.sdk.d.ts +84 -0
  229. package/dist/application/application.sdk.d.ts.map +1 -0
  230. package/dist/application/application.sdk.js +217 -0
  231. package/dist/application/application.tab.d.ts +20 -0
  232. package/dist/application/application.tab.d.ts.map +1 -0
  233. package/dist/application/application.tab.js +45 -0
  234. package/dist/application/context.sdk.d.ts +48 -0
  235. package/dist/application/context.sdk.d.ts.map +1 -0
  236. package/dist/application/context.sdk.js +116 -0
  237. package/dist/application/index.d.ts +4 -0
  238. package/dist/application/index.d.ts.map +1 -0
  239. package/dist/application/index.js +4 -0
  240. package/dist/assets/example-extraction-cache.json +9 -0
  241. package/dist/assets/extracted-core-sdk-examples.yaml +44440 -0
  242. package/dist/assets/extracted-core-sdk-types.yaml +12100 -0
  243. package/dist/assets/stream-line-icons.csv +19281 -0
  244. package/dist/assets/type-extraction-cache.json +9 -0
  245. package/dist/builder/application-analyzer/application-analyzer.d.ts +42 -0
  246. package/dist/builder/application-analyzer/application-analyzer.d.ts.map +1 -0
  247. package/dist/builder/application-analyzer/application-analyzer.js +150 -0
  248. package/dist/builder/application-analyzer/create-application-analyzer.d.ts +17 -0
  249. package/dist/builder/application-analyzer/create-application-analyzer.d.ts.map +1 -0
  250. package/dist/builder/application-analyzer/create-application-analyzer.js +121 -0
  251. package/dist/builder/application-analyzer/index.d.ts +5 -0
  252. package/dist/builder/application-analyzer/index.d.ts.map +1 -0
  253. package/dist/builder/application-analyzer/index.js +5 -0
  254. package/dist/builder/application-analyzer/select-component-nodes.d.ts +7 -0
  255. package/dist/builder/application-analyzer/select-component-nodes.d.ts.map +1 -0
  256. package/dist/builder/application-analyzer/select-component-nodes.js +15 -0
  257. package/dist/builder/application-analyzer/select-datasource-node-by-id.d.ts +8 -0
  258. package/dist/builder/application-analyzer/select-datasource-node-by-id.d.ts.map +1 -0
  259. package/dist/builder/application-analyzer/select-datasource-node-by-id.js +20 -0
  260. package/dist/builder/application-analyzer/types.d.ts +60 -0
  261. package/dist/builder/application-analyzer/types.d.ts.map +1 -0
  262. package/dist/builder/application-analyzer/types.js +16 -0
  263. package/dist/builder/application-analyzer/utils.d.ts +3 -0
  264. package/dist/builder/application-analyzer/utils.d.ts.map +1 -0
  265. package/dist/builder/application-analyzer/utils.js +8 -0
  266. package/dist/builder/builder.d.ts +8 -0
  267. package/dist/builder/builder.d.ts.map +1 -0
  268. package/dist/builder/builder.js +54 -0
  269. package/dist/builder/index.d.ts +5 -0
  270. package/dist/builder/index.d.ts.map +1 -0
  271. package/dist/builder/index.js +4 -0
  272. package/dist/builder/transform-summary.d.ts +3 -0
  273. package/dist/builder/transform-summary.d.ts.map +1 -0
  274. package/dist/builder/transform-summary.js +39 -0
  275. package/dist/builder/types.d.ts +8 -0
  276. package/dist/builder/types.d.ts.map +1 -0
  277. package/dist/builder/types.js +2 -0
  278. package/dist/builder/validate-datasource-ids.d.ts +17 -0
  279. package/dist/builder/validate-datasource-ids.d.ts.map +1 -0
  280. package/dist/builder/validate-datasource-ids.js +51 -0
  281. package/dist/component/common/index.d.ts +22 -0
  282. package/dist/component/common/index.d.ts.map +1 -0
  283. package/dist/component/common/index.js +16 -0
  284. package/dist/component/common/jc.avatar-field.types.d.ts +9 -0
  285. package/dist/component/common/jc.avatar-field.types.d.ts.map +1 -0
  286. package/dist/component/common/jc.avatar-field.types.js +11 -0
  287. package/dist/component/common/jc.chart.common.abstract.d.ts +85 -0
  288. package/dist/component/common/jc.chart.common.abstract.d.ts.map +1 -0
  289. package/dist/component/common/jc.chart.common.abstract.js +2 -0
  290. package/dist/component/common/jc.chart.common.builders.d.ts +37 -0
  291. package/dist/component/common/jc.chart.common.builders.d.ts.map +1 -0
  292. package/dist/component/common/jc.chart.common.builders.js +81 -0
  293. package/dist/component/common/jc.component.types.d.ts +101 -0
  294. package/dist/component/common/jc.component.types.d.ts.map +1 -0
  295. package/dist/component/common/jc.component.types.js +144 -0
  296. package/dist/component/common/jc.context.d.ts +7 -0
  297. package/dist/component/common/jc.context.d.ts.map +1 -0
  298. package/dist/component/common/jc.context.js +2 -0
  299. package/dist/component/common/jc.element.types.d.ts +14 -0
  300. package/dist/component/common/jc.element.types.d.ts.map +1 -0
  301. package/dist/component/common/jc.element.types.js +13 -0
  302. package/dist/component/common/jc.field-base.builder.d.ts +21 -0
  303. package/dist/component/common/jc.field-base.builder.d.ts.map +1 -0
  304. package/dist/component/common/jc.field-base.builder.js +101 -0
  305. package/dist/component/common/jc.field-base.types.d.ts +28 -0
  306. package/dist/component/common/jc.field-base.types.d.ts.map +1 -0
  307. package/dist/component/common/jc.field-base.types.js +2 -0
  308. package/dist/component/common/jc.left-right.element.avatar.d.ts +11 -0
  309. package/dist/component/common/jc.left-right.element.avatar.d.ts.map +1 -0
  310. package/dist/component/common/jc.left-right.element.avatar.js +18 -0
  311. package/dist/component/common/jc.left-right.element.badge.d.ts +11 -0
  312. package/dist/component/common/jc.left-right.element.badge.d.ts.map +1 -0
  313. package/dist/component/common/jc.left-right.element.badge.js +17 -0
  314. package/dist/component/common/jc.left-right.element.button.d.ts +11 -0
  315. package/dist/component/common/jc.left-right.element.button.d.ts.map +1 -0
  316. package/dist/component/common/jc.left-right.element.button.js +14 -0
  317. package/dist/component/common/jc.left-right.element.checkbox.d.ts +13 -0
  318. package/dist/component/common/jc.left-right.element.checkbox.d.ts.map +1 -0
  319. package/dist/component/common/jc.left-right.element.checkbox.js +21 -0
  320. package/dist/component/common/jc.left-right.element.d.ts +31 -0
  321. package/dist/component/common/jc.left-right.element.d.ts.map +1 -0
  322. package/dist/component/common/jc.left-right.element.icon.d.ts +18 -0
  323. package/dist/component/common/jc.left-right.element.icon.d.ts.map +1 -0
  324. package/dist/component/common/jc.left-right.element.icon.js +32 -0
  325. package/dist/component/common/jc.left-right.element.image.d.ts +16 -0
  326. package/dist/component/common/jc.left-right.element.image.d.ts.map +1 -0
  327. package/dist/component/common/jc.left-right.element.image.js +29 -0
  328. package/dist/component/common/jc.left-right.element.js +2 -0
  329. package/dist/component/common/jc.left-right.element.progress.d.ts +11 -0
  330. package/dist/component/common/jc.left-right.element.progress.d.ts.map +1 -0
  331. package/dist/component/common/jc.left-right.element.progress.js +17 -0
  332. package/dist/component/common/jc.left-right.element.switch.d.ts +13 -0
  333. package/dist/component/common/jc.left-right.element.switch.d.ts.map +1 -0
  334. package/dist/component/common/jc.left-right.element.switch.js +21 -0
  335. package/dist/component/common/jc.left-right.element.value.d.ts +10 -0
  336. package/dist/component/common/jc.left-right.element.value.d.ts.map +1 -0
  337. package/dist/component/common/jc.left-right.element.value.js +12 -0
  338. package/dist/component/common/jc.picker-field-options.types.d.ts +13 -0
  339. package/dist/component/common/jc.picker-field-options.types.d.ts.map +1 -0
  340. package/dist/component/common/jc.picker-field-options.types.js +2 -0
  341. package/dist/component/common/jc.text.types.d.ts +6 -0
  342. package/dist/component/common/jc.text.types.d.ts.map +1 -0
  343. package/dist/component/common/jc.text.types.js +2 -0
  344. package/dist/component/common/jc.validation.d.ts +9 -0
  345. package/dist/component/common/jc.validation.d.ts.map +1 -0
  346. package/dist/component/common/jc.validation.js +48 -0
  347. package/dist/component/index.d.ts +86 -0
  348. package/dist/component/index.d.ts.map +1 -0
  349. package/dist/component/index.js +83 -0
  350. package/dist/component/jc.abstract.d.ts +32 -0
  351. package/dist/component/jc.abstract.d.ts.map +1 -0
  352. package/dist/component/jc.abstract.factory.d.ts +488 -0
  353. package/dist/component/jc.abstract.factory.d.ts.map +1 -0
  354. package/dist/component/jc.abstract.factory.js +757 -0
  355. package/dist/component/jc.abstract.js +53 -0
  356. package/dist/component/jc.abstract.utils.d.ts +3 -0
  357. package/dist/component/jc.abstract.utils.d.ts.map +1 -0
  358. package/dist/component/jc.abstract.utils.js +26 -0
  359. package/dist/component/jc.amount-control.d.ts +16 -0
  360. package/dist/component/jc.amount-control.d.ts.map +1 -0
  361. package/dist/component/jc.amount-control.js +36 -0
  362. package/dist/component/jc.avatar-field.d.ts +11 -0
  363. package/dist/component/jc.avatar-field.d.ts.map +1 -0
  364. package/dist/component/jc.avatar-field.js +27 -0
  365. package/dist/component/jc.avatar.d.ts +14 -0
  366. package/dist/component/jc.avatar.d.ts.map +1 -0
  367. package/dist/component/jc.avatar.js +26 -0
  368. package/dist/component/jc.banner.d.ts +81 -0
  369. package/dist/component/jc.banner.d.ts.map +1 -0
  370. package/dist/component/jc.banner.js +49 -0
  371. package/dist/component/jc.bar-chart.d.ts +23 -0
  372. package/dist/component/jc.bar-chart.d.ts.map +1 -0
  373. package/dist/component/jc.bar-chart.js +45 -0
  374. package/dist/component/jc.button.d.ts +20 -0
  375. package/dist/component/jc.button.d.ts.map +1 -0
  376. package/dist/component/jc.button.js +39 -0
  377. package/dist/component/jc.card.abstract.d.ts +14 -0
  378. package/dist/component/jc.card.abstract.d.ts.map +1 -0
  379. package/dist/component/jc.card.abstract.js +31 -0
  380. package/dist/component/jc.card.on-default.d.ts +91 -0
  381. package/dist/component/jc.card.on-default.d.ts.map +1 -0
  382. package/dist/component/jc.card.on-default.js +96 -0
  383. package/dist/component/jc.carousel.d.ts +31 -0
  384. package/dist/component/jc.carousel.d.ts.map +1 -0
  385. package/dist/component/jc.carousel.js +58 -0
  386. package/dist/component/jc.chat-message.d.ts +17 -0
  387. package/dist/component/jc.chat-message.d.ts.map +1 -0
  388. package/dist/component/jc.chat-message.js +32 -0
  389. package/dist/component/jc.chat.d.ts +23 -0
  390. package/dist/component/jc.chat.d.ts.map +1 -0
  391. package/dist/component/jc.chat.js +68 -0
  392. package/dist/component/jc.checkbox.d.ts +15 -0
  393. package/dist/component/jc.checkbox.d.ts.map +1 -0
  394. package/dist/component/jc.checkbox.js +38 -0
  395. package/dist/component/jc.choice-field-item.d.ts +15 -0
  396. package/dist/component/jc.choice-field-item.d.ts.map +1 -0
  397. package/dist/component/jc.choice-field-item.js +41 -0
  398. package/dist/component/jc.choice-field.d.ts +21 -0
  399. package/dist/component/jc.choice-field.d.ts.map +1 -0
  400. package/dist/component/jc.choice-field.js +34 -0
  401. package/dist/component/jc.count-down.d.ts +18 -0
  402. package/dist/component/jc.count-down.d.ts.map +1 -0
  403. package/dist/component/jc.count-down.js +55 -0
  404. package/dist/component/jc.count-up.d.ts +15 -0
  405. package/dist/component/jc.count-up.d.ts.map +1 -0
  406. package/dist/component/jc.count-up.js +42 -0
  407. package/dist/component/jc.custom-component.interop.d.ts +58 -0
  408. package/dist/component/jc.custom-component.interop.d.ts.map +1 -0
  409. package/dist/component/jc.custom-component.interop.js +115 -0
  410. package/dist/component/jc.date-picker.d.ts +15 -0
  411. package/dist/component/jc.date-picker.d.ts.map +1 -0
  412. package/dist/component/jc.date-picker.js +31 -0
  413. package/dist/component/jc.divider.d.ts +7 -0
  414. package/dist/component/jc.divider.d.ts.map +1 -0
  415. package/dist/component/jc.divider.js +8 -0
  416. package/dist/component/jc.dropdown.d.ts +20 -0
  417. package/dist/component/jc.dropdown.d.ts.map +1 -0
  418. package/dist/component/jc.dropdown.item.d.ts +22 -0
  419. package/dist/component/jc.dropdown.item.d.ts.map +1 -0
  420. package/dist/component/jc.dropdown.item.js +85 -0
  421. package/dist/component/jc.dropdown.js +33 -0
  422. package/dist/component/jc.duration-picker.d.ts +18 -0
  423. package/dist/component/jc.duration-picker.d.ts.map +1 -0
  424. package/dist/component/jc.duration-picker.js +35 -0
  425. package/dist/component/jc.email-field.d.ts +11 -0
  426. package/dist/component/jc.email-field.d.ts.map +1 -0
  427. package/dist/component/jc.email-field.js +19 -0
  428. package/dist/component/jc.entity-field.d.ts +23 -0
  429. package/dist/component/jc.entity-field.d.ts.map +1 -0
  430. package/dist/component/jc.entity-field.js +71 -0
  431. package/dist/component/jc.entity.d.ts +15 -0
  432. package/dist/component/jc.entity.d.ts.map +1 -0
  433. package/dist/component/jc.entity.js +27 -0
  434. package/dist/component/jc.event.d.ts +22 -0
  435. package/dist/component/jc.event.d.ts.map +1 -0
  436. package/dist/component/jc.event.js +68 -0
  437. package/dist/component/jc.expander.d.ts +49 -0
  438. package/dist/component/jc.expander.d.ts.map +1 -0
  439. package/dist/component/jc.expander.header.d.ts +25 -0
  440. package/dist/component/jc.expander.header.d.ts.map +1 -0
  441. package/dist/component/jc.expander.header.js +39 -0
  442. package/dist/component/jc.expander.js +53 -0
  443. package/dist/component/jc.field-row.d.ts +34 -0
  444. package/dist/component/jc.field-row.d.ts.map +1 -0
  445. package/dist/component/jc.field-row.entity.d.ts +12 -0
  446. package/dist/component/jc.field-row.entity.d.ts.map +1 -0
  447. package/dist/component/jc.field-row.entity.js +35 -0
  448. package/dist/component/jc.field-row.js +37 -0
  449. package/dist/component/jc.form.d.ts +98 -0
  450. package/dist/component/jc.form.d.ts.map +1 -0
  451. package/dist/component/jc.form.js +127 -0
  452. package/dist/component/jc.gallery-item.d.ts +12 -0
  453. package/dist/component/jc.gallery-item.d.ts.map +1 -0
  454. package/dist/component/jc.gallery-item.js +24 -0
  455. package/dist/component/jc.grid-item.d.ts +15 -0
  456. package/dist/component/jc.grid-item.d.ts.map +1 -0
  457. package/dist/component/jc.grid-item.js +31 -0
  458. package/dist/component/jc.grid.d.ts +16 -0
  459. package/dist/component/jc.grid.d.ts.map +1 -0
  460. package/dist/component/jc.grid.js +64 -0
  461. package/dist/component/jc.guards.d.ts +17 -0
  462. package/dist/component/jc.guards.d.ts.map +1 -0
  463. package/dist/component/jc.guards.js +14 -0
  464. package/dist/component/jc.icon.d.ts +19 -0
  465. package/dist/component/jc.icon.d.ts.map +1 -0
  466. package/dist/component/jc.icon.js +41 -0
  467. package/dist/component/jc.image.abstract.d.ts +28 -0
  468. package/dist/component/jc.image.abstract.d.ts.map +1 -0
  469. package/dist/component/jc.image.abstract.js +52 -0
  470. package/dist/component/jc.image.d.ts +5 -0
  471. package/dist/component/jc.image.d.ts.map +1 -0
  472. package/dist/component/jc.image.js +2 -0
  473. package/dist/component/jc.image.on-carousel.d.ts +23 -0
  474. package/dist/component/jc.image.on-carousel.d.ts.map +1 -0
  475. package/dist/component/jc.image.on-carousel.js +19 -0
  476. package/dist/component/jc.image.on-default.d.ts +25 -0
  477. package/dist/component/jc.image.on-default.d.ts.map +1 -0
  478. package/dist/component/jc.image.on-default.js +22 -0
  479. package/dist/component/jc.interactive-image.d.ts +41 -0
  480. package/dist/component/jc.interactive-image.d.ts.map +1 -0
  481. package/dist/component/jc.interactive-image.item.d.ts +24 -0
  482. package/dist/component/jc.interactive-image.item.d.ts.map +1 -0
  483. package/dist/component/jc.interactive-image.item.js +78 -0
  484. package/dist/component/jc.interactive-image.js +78 -0
  485. package/dist/component/jc.jig-header.d.ts +19 -0
  486. package/dist/component/jc.jig-header.d.ts.map +1 -0
  487. package/dist/component/jc.jig-header.js +42 -0
  488. package/dist/component/jc.jig-widget.d.ts +15 -0
  489. package/dist/component/jc.jig-widget.d.ts.map +1 -0
  490. package/dist/component/jc.jig-widget.js +41 -0
  491. package/dist/component/jc.jig.d.ts +11 -0
  492. package/dist/component/jc.jig.d.ts.map +1 -0
  493. package/dist/component/jc.jig.js +24 -0
  494. package/dist/component/jc.line-chart.d.ts +28 -0
  495. package/dist/component/jc.line-chart.d.ts.map +1 -0
  496. package/dist/component/jc.line-chart.js +45 -0
  497. package/dist/component/jc.list-item.d.ts +106 -0
  498. package/dist/component/jc.list-item.d.ts.map +1 -0
  499. package/dist/component/jc.list-item.js +274 -0
  500. package/dist/component/jc.list-item.standalone.d.ts +13 -0
  501. package/dist/component/jc.list-item.standalone.d.ts.map +1 -0
  502. package/dist/component/jc.list-item.standalone.js +10 -0
  503. package/dist/component/jc.list.abstract.d.ts +36 -0
  504. package/dist/component/jc.list.abstract.d.ts.map +1 -0
  505. package/dist/component/jc.list.abstract.js +2 -0
  506. package/dist/component/jc.list.d.ts +39 -0
  507. package/dist/component/jc.list.d.ts.map +1 -0
  508. package/dist/component/jc.list.js +95 -0
  509. package/dist/component/jc.location.d.ts +41 -0
  510. package/dist/component/jc.location.d.ts.map +1 -0
  511. package/dist/component/jc.location.js +63 -0
  512. package/dist/component/jc.marker-item.d.ts +29 -0
  513. package/dist/component/jc.marker-item.d.ts.map +1 -0
  514. package/dist/component/jc.marker-item.js +48 -0
  515. package/dist/component/jc.media-field.d.ts +13 -0
  516. package/dist/component/jc.media-field.d.ts.map +1 -0
  517. package/dist/component/jc.media-field.js +37 -0
  518. package/dist/component/jc.menu-item.d.ts +89 -0
  519. package/dist/component/jc.menu-item.d.ts.map +1 -0
  520. package/dist/component/jc.menu-item.js +65 -0
  521. package/dist/component/jc.number-field.d.ts +21 -0
  522. package/dist/component/jc.number-field.d.ts.map +1 -0
  523. package/dist/component/jc.number-field.js +33 -0
  524. package/dist/component/jc.pie-chart.d.ts +26 -0
  525. package/dist/component/jc.pie-chart.d.ts.map +1 -0
  526. package/dist/component/jc.pie-chart.js +45 -0
  527. package/dist/component/jc.product-item.amount.d.ts +17 -0
  528. package/dist/component/jc.product-item.amount.d.ts.map +1 -0
  529. package/dist/component/jc.product-item.amount.js +31 -0
  530. package/dist/component/jc.product-item.d.ts +30 -0
  531. package/dist/component/jc.product-item.d.ts.map +1 -0
  532. package/dist/component/jc.product-item.js +68 -0
  533. package/dist/component/jc.progress-bar.d.ts +45 -0
  534. package/dist/component/jc.progress-bar.d.ts.map +1 -0
  535. package/dist/component/jc.progress-bar.js +58 -0
  536. package/dist/component/jc.rating.d.ts +17 -0
  537. package/dist/component/jc.rating.d.ts.map +1 -0
  538. package/dist/component/jc.rating.js +38 -0
  539. package/dist/component/jc.section.abstract.d.ts +87 -0
  540. package/dist/component/jc.section.abstract.d.ts.map +1 -0
  541. package/dist/component/jc.section.abstract.js +33 -0
  542. package/dist/component/jc.section.on-default.d.ts +85 -0
  543. package/dist/component/jc.section.on-default.d.ts.map +1 -0
  544. package/dist/component/jc.section.on-default.js +85 -0
  545. package/dist/component/jc.section.on-entity.d.ts +11 -0
  546. package/dist/component/jc.section.on-entity.d.ts.map +1 -0
  547. package/dist/component/jc.section.on-entity.js +11 -0
  548. package/dist/component/jc.segmented-control.d.ts +23 -0
  549. package/dist/component/jc.segmented-control.d.ts.map +1 -0
  550. package/dist/component/jc.segmented-control.js +66 -0
  551. package/dist/component/jc.signature-field.d.ts +11 -0
  552. package/dist/component/jc.signature-field.d.ts.map +1 -0
  553. package/dist/component/jc.signature-field.js +18 -0
  554. package/dist/component/jc.slider.d.ts +36 -0
  555. package/dist/component/jc.slider.d.ts.map +1 -0
  556. package/dist/component/jc.slider.js +53 -0
  557. package/dist/component/jc.stage.d.ts +23 -0
  558. package/dist/component/jc.stage.d.ts.map +1 -0
  559. package/dist/component/jc.stage.js +31 -0
  560. package/dist/component/jc.step.d.ts +30 -0
  561. package/dist/component/jc.step.d.ts.map +1 -0
  562. package/dist/component/jc.step.js +35 -0
  563. package/dist/component/jc.stepper.d.ts +34 -0
  564. package/dist/component/jc.stepper.d.ts.map +1 -0
  565. package/dist/component/jc.stepper.js +59 -0
  566. package/dist/component/jc.story-group.d.ts +18 -0
  567. package/dist/component/jc.story-group.d.ts.map +1 -0
  568. package/dist/component/jc.story-group.js +27 -0
  569. package/dist/component/jc.summary.abstract.d.ts +15 -0
  570. package/dist/component/jc.summary.abstract.d.ts.map +1 -0
  571. package/dist/component/jc.summary.abstract.js +29 -0
  572. package/dist/component/jc.summary.card.d.ts +14 -0
  573. package/dist/component/jc.summary.card.d.ts.map +1 -0
  574. package/dist/component/jc.summary.card.js +36 -0
  575. package/dist/component/jc.summary.counter.d.ts +12 -0
  576. package/dist/component/jc.summary.counter.d.ts.map +1 -0
  577. package/dist/component/jc.summary.counter.js +28 -0
  578. package/dist/component/jc.summary.default.d.ts +16 -0
  579. package/dist/component/jc.summary.default.d.ts.map +1 -0
  580. package/dist/component/jc.summary.default.js +34 -0
  581. package/dist/component/jc.summary.progress.d.ts +46 -0
  582. package/dist/component/jc.summary.progress.d.ts.map +1 -0
  583. package/dist/component/jc.summary.progress.js +35 -0
  584. package/dist/component/jc.tab-button.d.ts +18 -0
  585. package/dist/component/jc.tab-button.d.ts.map +1 -0
  586. package/dist/component/jc.tab-button.js +43 -0
  587. package/dist/component/jc.text-field.d.ts +20 -0
  588. package/dist/component/jc.text-field.d.ts.map +1 -0
  589. package/dist/component/jc.text-field.js +49 -0
  590. package/dist/component/jc.text.d.ts +24 -0
  591. package/dist/component/jc.text.d.ts.map +1 -0
  592. package/dist/component/jc.text.js +44 -0
  593. package/dist/component/jc.titles.d.ts +19 -0
  594. package/dist/component/jc.titles.d.ts.map +1 -0
  595. package/dist/component/jc.titles.js +34 -0
  596. package/dist/component/jc.trend.d.ts +18 -0
  597. package/dist/component/jc.trend.d.ts.map +1 -0
  598. package/dist/component/jc.trend.js +31 -0
  599. package/dist/component/jc.types.d.ts +75 -0
  600. package/dist/component/jc.types.d.ts.map +1 -0
  601. package/dist/component/jc.types.js +74 -0
  602. package/dist/component/jc.video-player.abstract.d.ts +28 -0
  603. package/dist/component/jc.video-player.abstract.d.ts.map +1 -0
  604. package/dist/component/jc.video-player.abstract.js +38 -0
  605. package/dist/component/jc.video-player.d.ts +4 -0
  606. package/dist/component/jc.video-player.d.ts.map +1 -0
  607. package/dist/component/jc.video-player.js +2 -0
  608. package/dist/component/jc.video-player.on-jig.d.ts +25 -0
  609. package/dist/component/jc.video-player.on-jig.d.ts.map +1 -0
  610. package/dist/component/jc.video-player.on-jig.js +31 -0
  611. package/dist/component/jc.view.d.ts +158 -0
  612. package/dist/component/jc.view.d.ts.map +1 -0
  613. package/dist/component/jc.view.js +85 -0
  614. package/dist/component/jc.web-view.abstract.d.ts +15 -0
  615. package/dist/component/jc.web-view.abstract.d.ts.map +1 -0
  616. package/dist/component/jc.web-view.abstract.js +33 -0
  617. package/dist/component/jc.web-view.on-default.d.ts +5 -0
  618. package/dist/component/jc.web-view.on-default.d.ts.map +1 -0
  619. package/dist/component/jc.web-view.on-default.js +4 -0
  620. package/dist/component/jc.web-view.on-full.d.ts +10 -0
  621. package/dist/component/jc.web-view.on-full.d.ts.map +1 -0
  622. package/dist/component/jc.web-view.on-full.js +14 -0
  623. package/dist/database/database.abstract.d.ts +39 -0
  624. package/dist/database/database.abstract.d.ts.map +1 -0
  625. package/dist/database/database.abstract.js +42 -0
  626. package/dist/database/index.d.ts +2 -0
  627. package/dist/database/index.d.ts.map +1 -0
  628. package/dist/database/index.js +2 -0
  629. package/dist/datasource/datasource.abstract.d.ts +39 -0
  630. package/dist/datasource/datasource.abstract.d.ts.map +1 -0
  631. package/dist/datasource/datasource.abstract.js +47 -0
  632. package/dist/datasource/datasource.descriptor.d.ts +11 -0
  633. package/dist/datasource/datasource.descriptor.d.ts.map +1 -0
  634. package/dist/datasource/datasource.descriptor.js +2 -0
  635. package/dist/datasource/datasource.reference.d.ts +33 -0
  636. package/dist/datasource/datasource.reference.d.ts.map +1 -0
  637. package/dist/datasource/datasource.reference.js +66 -0
  638. package/dist/datasource/datasource.sdk.d.ts +7 -0
  639. package/dist/datasource/datasource.sdk.d.ts.map +1 -0
  640. package/dist/datasource/datasource.sdk.js +5 -0
  641. package/dist/datasource/datasource.sqlite.d.ts +88 -0
  642. package/dist/datasource/datasource.sqlite.d.ts.map +1 -0
  643. package/dist/datasource/datasource.sqlite.js +286 -0
  644. package/dist/datasource/datasource.static.d.ts +21 -0
  645. package/dist/datasource/datasource.static.d.ts.map +1 -0
  646. package/dist/datasource/datasource.static.js +30 -0
  647. package/dist/datasource/datasource.system.d.ts +18 -0
  648. package/dist/datasource/datasource.system.d.ts.map +1 -0
  649. package/dist/datasource/datasource.system.js +10 -0
  650. package/dist/datasource/entity.descriptor.d.ts +9 -0
  651. package/dist/datasource/entity.descriptor.d.ts.map +1 -0
  652. package/dist/datasource/entity.descriptor.js +2 -0
  653. package/dist/datasource/index.d.ts +11 -0
  654. package/dist/datasource/index.d.ts.map +1 -0
  655. package/dist/datasource/index.js +9 -0
  656. package/dist/datasource/sqlite-normalizer.d.ts +3 -0
  657. package/dist/datasource/sqlite-normalizer.d.ts.map +1 -0
  658. package/dist/datasource/sqlite-normalizer.js +194 -0
  659. package/dist/datasource/sqlite-validator.d.ts +28 -0
  660. package/dist/datasource/sqlite-validator.d.ts.map +1 -0
  661. package/dist/datasource/sqlite-validator.js +218 -0
  662. package/dist/function/function.abstract.d.ts +538 -0
  663. package/dist/function/function.abstract.d.ts.map +1 -0
  664. package/dist/function/function.abstract.js +271 -0
  665. package/dist/function/function.guard.d.ts +17 -0
  666. package/dist/function/function.guard.d.ts.map +1 -0
  667. package/dist/function/function.guard.js +62 -0
  668. package/dist/function/function.operation.d.ts +26 -0
  669. package/dist/function/function.operation.d.ts.map +1 -0
  670. package/dist/function/function.operation.js +118 -0
  671. package/dist/function/function.rest.continuation.d.ts +12 -0
  672. package/dist/function/function.rest.continuation.d.ts.map +1 -0
  673. package/dist/function/function.rest.continuation.js +24 -0
  674. package/dist/function/function.rest.d.ts +31 -0
  675. package/dist/function/function.rest.d.ts.map +1 -0
  676. package/dist/function/function.rest.error-builder.d.ts +38 -0
  677. package/dist/function/function.rest.error-builder.d.ts.map +1 -0
  678. package/dist/function/function.rest.error-builder.js +161 -0
  679. package/dist/function/function.rest.js +72 -0
  680. package/dist/function/function.rest.parameter-builder.d.ts +33 -0
  681. package/dist/function/function.rest.parameter-builder.d.ts.map +1 -0
  682. package/dist/function/function.rest.parameter-builder.js +81 -0
  683. package/dist/function/function.rest.types.d.ts +28 -0
  684. package/dist/function/function.rest.types.d.ts.map +1 -0
  685. package/dist/function/function.rest.types.js +2 -0
  686. package/dist/function/function.sdk.d.ts +10 -0
  687. package/dist/function/function.sdk.d.ts.map +1 -0
  688. package/dist/function/function.sdk.js +12 -0
  689. package/dist/function/function.soap.d.ts +19 -0
  690. package/dist/function/function.soap.d.ts.map +1 -0
  691. package/dist/function/function.soap.js +36 -0
  692. package/dist/function/function.soap.parameter-builder.d.ts +25 -0
  693. package/dist/function/function.soap.parameter-builder.d.ts.map +1 -0
  694. package/dist/function/function.soap.parameter-builder.js +41 -0
  695. package/dist/function/function.soap.types.d.ts +17 -0
  696. package/dist/function/function.soap.types.d.ts.map +1 -0
  697. package/dist/function/function.soap.types.js +2 -0
  698. package/dist/function/function.sql.d.ts +20 -0
  699. package/dist/function/function.sql.d.ts.map +1 -0
  700. package/dist/function/function.sql.js +53 -0
  701. package/dist/function/function.sql.parameter-builder.d.ts +24 -0
  702. package/dist/function/function.sql.parameter-builder.d.ts.map +1 -0
  703. package/dist/function/function.sql.parameter-builder.js +44 -0
  704. package/dist/function/function.sql.types.d.ts +20 -0
  705. package/dist/function/function.sql.types.d.ts.map +1 -0
  706. package/dist/function/function.sql.types.js +2 -0
  707. package/dist/function/function.types.d.ts +7 -0
  708. package/dist/function/function.types.d.ts.map +1 -0
  709. package/dist/function/function.types.js +2 -0
  710. package/dist/function/index.d.ts +17 -0
  711. package/dist/function/index.d.ts.map +1 -0
  712. package/dist/function/index.js +13 -0
  713. package/dist/icon/index.d.ts +3 -0
  714. package/dist/icon/index.d.ts.map +1 -0
  715. package/dist/icon/index.js +3 -0
  716. package/dist/icon/sdk.icon.d.ts +10 -0
  717. package/dist/icon/sdk.icon.d.ts.map +1 -0
  718. package/dist/icon/sdk.icon.data.d.ts +7 -0
  719. package/dist/icon/sdk.icon.data.d.ts.map +1 -0
  720. package/dist/icon/sdk.icon.data.js +19283 -0
  721. package/dist/icon/sdk.icon.js +27 -0
  722. package/dist/icon/sdk.icon.loader.d.ts +7 -0
  723. package/dist/icon/sdk.icon.loader.d.ts.map +1 -0
  724. package/dist/icon/sdk.icon.loader.js +15 -0
  725. package/dist/icon/sdk.icon.name.d.ts +7 -0
  726. package/dist/icon/sdk.icon.name.d.ts.map +1 -0
  727. package/dist/icon/sdk.icon.name.js +19305 -0
  728. package/dist/index.d.ts +14 -0
  729. package/dist/index.d.ts.map +1 -0
  730. package/dist/index.js +14 -0
  731. package/dist/jsonata/ast.d.ts +15 -0
  732. package/dist/jsonata/ast.d.ts.map +1 -0
  733. package/dist/jsonata/ast.js +118 -0
  734. package/dist/jsonata/base.d.ts +7 -0
  735. package/dist/jsonata/base.d.ts.map +1 -0
  736. package/dist/jsonata/base.js +43 -0
  737. package/dist/jsonata/builder.d.ts +28 -0
  738. package/dist/jsonata/builder.d.ts.map +1 -0
  739. package/dist/jsonata/builder.js +140 -0
  740. package/dist/jsonata/context.d.ts +10 -0
  741. package/dist/jsonata/context.d.ts.map +1 -0
  742. package/dist/jsonata/context.js +349 -0
  743. package/dist/jsonata/expression.d.ts +35 -0
  744. package/dist/jsonata/expression.d.ts.map +1 -0
  745. package/dist/jsonata/expression.js +498 -0
  746. package/dist/jsonata/index.d.ts +6 -0
  747. package/dist/jsonata/index.d.ts.map +1 -0
  748. package/dist/jsonata/index.js +6 -0
  749. package/dist/logger/index.d.ts +2 -0
  750. package/dist/logger/index.d.ts.map +1 -0
  751. package/dist/logger/index.js +2 -0
  752. package/dist/logger/logger.d.ts +14 -0
  753. package/dist/logger/logger.d.ts.map +1 -0
  754. package/dist/logger/logger.js +40 -0
  755. package/dist/runtime/auth.d.ts +19 -0
  756. package/dist/runtime/auth.d.ts.map +1 -0
  757. package/dist/runtime/auth.js +11 -0
  758. package/dist/runtime/index.d.ts +5 -0
  759. package/dist/runtime/index.d.ts.map +1 -0
  760. package/dist/runtime/index.js +3 -0
  761. package/dist/runtime/system.d.ts +27 -0
  762. package/dist/runtime/system.d.ts.map +1 -0
  763. package/dist/runtime/system.js +26 -0
  764. package/dist/screen/common/index.d.ts +9 -0
  765. package/dist/screen/common/index.d.ts.map +1 -0
  766. package/dist/screen/common/index.js +7 -0
  767. package/dist/screen/common/screen.badge.d.ts +8 -0
  768. package/dist/screen/common/screen.badge.d.ts.map +1 -0
  769. package/dist/screen/common/screen.badge.js +2 -0
  770. package/dist/screen/common/screen.bottom-sheet.d.ts +62 -0
  771. package/dist/screen/common/screen.bottom-sheet.d.ts.map +1 -0
  772. package/dist/screen/common/screen.bottom-sheet.js +31 -0
  773. package/dist/screen/common/screen.callback-actions.d.ts +7 -0
  774. package/dist/screen/common/screen.callback-actions.d.ts.map +1 -0
  775. package/dist/screen/common/screen.callback-actions.js +19 -0
  776. package/dist/screen/common/screen.input-definition.d.ts +108 -0
  777. package/dist/screen/common/screen.input-definition.d.ts.map +1 -0
  778. package/dist/screen/common/screen.input-definition.js +109 -0
  779. package/dist/screen/common/screen.placeholder.d.ts +20 -0
  780. package/dist/screen/common/screen.placeholder.d.ts.map +1 -0
  781. package/dist/screen/common/screen.placeholder.js +54 -0
  782. package/dist/screen/common/screen.preview.actions.d.ts +47 -0
  783. package/dist/screen/common/screen.preview.actions.d.ts.map +1 -0
  784. package/dist/screen/common/screen.preview.actions.js +122 -0
  785. package/dist/screen/common/screen.preview.d.ts +40 -0
  786. package/dist/screen/common/screen.preview.d.ts.map +1 -0
  787. package/dist/screen/common/screen.preview.js +87 -0
  788. package/dist/screen/common/screen.state.d.ts +7 -0
  789. package/dist/screen/common/screen.state.d.ts.map +1 -0
  790. package/dist/screen/common/screen.state.js +2 -0
  791. package/dist/screen/common/screen.summary.d.ts +14 -0
  792. package/dist/screen/common/screen.summary.d.ts.map +1 -0
  793. package/dist/screen/common/screen.summary.js +22 -0
  794. package/dist/screen/index.d.ts +16 -0
  795. package/dist/screen/index.d.ts.map +1 -0
  796. package/dist/screen/index.js +16 -0
  797. package/dist/screen/screen.abstract.d.ts +105 -0
  798. package/dist/screen/screen.abstract.d.ts.map +1 -0
  799. package/dist/screen/screen.abstract.js +175 -0
  800. package/dist/screen/screen.calendar.d.ts +22 -0
  801. package/dist/screen/screen.calendar.d.ts.map +1 -0
  802. package/dist/screen/screen.calendar.js +32 -0
  803. package/dist/screen/screen.default.d.ts +65 -0
  804. package/dist/screen/screen.default.d.ts.map +1 -0
  805. package/dist/screen/screen.default.js +68 -0
  806. package/dist/screen/screen.document.d.ts +58 -0
  807. package/dist/screen/screen.document.d.ts.map +1 -0
  808. package/dist/screen/screen.document.js +72 -0
  809. package/dist/screen/screen.full-screen.d.ts +23 -0
  810. package/dist/screen/screen.full-screen.d.ts.map +1 -0
  811. package/dist/screen/screen.full-screen.js +18 -0
  812. package/dist/screen/screen.gallery.d.ts +15 -0
  813. package/dist/screen/screen.gallery.d.ts.map +1 -0
  814. package/dist/screen/screen.gallery.js +14 -0
  815. package/dist/screen/screen.grid.base.d.ts +18 -0
  816. package/dist/screen/screen.grid.base.d.ts.map +1 -0
  817. package/dist/screen/screen.grid.base.js +17 -0
  818. package/dist/screen/screen.grid.dynamic.d.ts +18 -0
  819. package/dist/screen/screen.grid.dynamic.d.ts.map +1 -0
  820. package/dist/screen/screen.grid.dynamic.js +26 -0
  821. package/dist/screen/screen.grid.static.d.ts +14 -0
  822. package/dist/screen/screen.grid.static.d.ts.map +1 -0
  823. package/dist/screen/screen.grid.static.js +12 -0
  824. package/dist/screen/screen.guards.d.ts +41 -0
  825. package/dist/screen/screen.guards.d.ts.map +1 -0
  826. package/dist/screen/screen.guards.js +35 -0
  827. package/dist/screen/screen.list.d.ts +79 -0
  828. package/dist/screen/screen.list.d.ts.map +1 -0
  829. package/dist/screen/screen.list.js +123 -0
  830. package/dist/screen/screen.sdk.d.ts +13 -0
  831. package/dist/screen/screen.sdk.d.ts.map +1 -0
  832. package/dist/screen/screen.sdk.js +9 -0
  833. package/dist/screen/screen.tabs.d.ts +27 -0
  834. package/dist/screen/screen.tabs.d.ts.map +1 -0
  835. package/dist/screen/screen.tabs.instance.d.ts +34 -0
  836. package/dist/screen/screen.tabs.instance.d.ts.map +1 -0
  837. package/dist/screen/screen.tabs.instance.js +79 -0
  838. package/dist/screen/screen.tabs.js +35 -0
  839. package/dist/screen/screen.wizard.d.ts +12 -0
  840. package/dist/screen/screen.wizard.d.ts.map +1 -0
  841. package/dist/screen/screen.wizard.instance.d.ts +20 -0
  842. package/dist/screen/screen.wizard.instance.d.ts.map +1 -0
  843. package/dist/screen/screen.wizard.instance.js +40 -0
  844. package/dist/screen/screen.wizard.js +23 -0
  845. package/dist/utils/check.d.ts +3 -0
  846. package/dist/utils/check.d.ts.map +1 -0
  847. package/dist/utils/check.js +7 -0
  848. package/dist/utils/convert.d.ts +2 -0
  849. package/dist/utils/convert.d.ts.map +1 -0
  850. package/dist/utils/convert.js +8 -0
  851. package/dist/utils/dedent.d.ts +2 -0
  852. package/dist/utils/dedent.d.ts.map +1 -0
  853. package/dist/utils/dedent.js +28 -0
  854. package/dist/utils/index.d.ts +6 -0
  855. package/dist/utils/index.d.ts.map +1 -0
  856. package/dist/utils/index.js +5 -0
  857. package/dist/utils/types.d.ts +2 -0
  858. package/dist/utils/types.d.ts.map +1 -0
  859. package/dist/utils/types.js +2 -0
  860. package/dist/utils/utils.d.ts +9 -0
  861. package/dist/utils/utils.d.ts.map +1 -0
  862. package/dist/utils/utils.js +49 -0
  863. package/dist/widget/index.d.ts +12 -0
  864. package/dist/widget/index.d.ts.map +1 -0
  865. package/dist/widget/index.js +12 -0
  866. package/dist/widget/jw.abstract.d.ts +27 -0
  867. package/dist/widget/jw.abstract.d.ts.map +1 -0
  868. package/dist/widget/jw.abstract.js +36 -0
  869. package/dist/widget/jw.actions.d.ts +17 -0
  870. package/dist/widget/jw.actions.d.ts.map +1 -0
  871. package/dist/widget/jw.actions.js +30 -0
  872. package/dist/widget/jw.avatar.d.ts +19 -0
  873. package/dist/widget/jw.avatar.d.ts.map +1 -0
  874. package/dist/widget/jw.avatar.js +23 -0
  875. package/dist/widget/jw.chart.d.ts +18 -0
  876. package/dist/widget/jw.chart.d.ts.map +1 -0
  877. package/dist/widget/jw.chart.js +23 -0
  878. package/dist/widget/jw.group.d.ts +28 -0
  879. package/dist/widget/jw.group.d.ts.map +1 -0
  880. package/dist/widget/jw.group.js +35 -0
  881. package/dist/widget/jw.image.d.ts +27 -0
  882. package/dist/widget/jw.image.d.ts.map +1 -0
  883. package/dist/widget/jw.image.js +54 -0
  884. package/dist/widget/jw.list.d.ts +44 -0
  885. package/dist/widget/jw.list.d.ts.map +1 -0
  886. package/dist/widget/jw.list.js +44 -0
  887. package/dist/widget/jw.location.d.ts +41 -0
  888. package/dist/widget/jw.location.d.ts.map +1 -0
  889. package/dist/widget/jw.location.js +54 -0
  890. package/dist/widget/jw.sdk.d.ts +2 -0
  891. package/dist/widget/jw.sdk.d.ts.map +1 -0
  892. package/dist/widget/jw.sdk.js +2 -0
  893. package/dist/widget/jw.status.condition.d.ts +20 -0
  894. package/dist/widget/jw.status.condition.d.ts.map +1 -0
  895. package/dist/widget/jw.status.condition.js +27 -0
  896. package/dist/widget/jw.status.d.ts +8 -0
  897. package/dist/widget/jw.status.d.ts.map +1 -0
  898. package/dist/widget/jw.status.js +11 -0
  899. package/dist/widget/jw.value.d.ts +24 -0
  900. package/dist/widget/jw.value.d.ts.map +1 -0
  901. package/dist/widget/jw.value.js +51 -0
  902. package/package.json +94 -0
@@ -0,0 +1,194 @@
1
+ import SqliteParser from 'node-sql-parser/build/sqlite.js';
2
+ const SqlParserClass = SqliteParser.Parser;
3
+ const SQLITE_OPT = { database: 'SQLite' };
4
+ const TSQL_OPT = { database: 'TransactSQL' };
5
+ const sqlParser = new SqlParserClass();
6
+ function bracketsToBackticks(query) {
7
+ let result = '';
8
+ let i = 0;
9
+ let inSingleQuote = false;
10
+ let inDoubleQuote = false;
11
+ let inBacktick = false;
12
+ let inLineComment = false;
13
+ let inBlockComment = false;
14
+ while (i < query.length) {
15
+ const char = query[i];
16
+ const next = i + 1 < query.length ? query[i + 1] : '';
17
+ if (inLineComment) {
18
+ result += char;
19
+ if (char === '\n') {
20
+ inLineComment = false;
21
+ }
22
+ i += 1;
23
+ continue;
24
+ }
25
+ if (inBlockComment) {
26
+ result += char;
27
+ if (char === '*' && next === '/') {
28
+ result += next;
29
+ inBlockComment = false;
30
+ i += 2;
31
+ }
32
+ else {
33
+ i += 1;
34
+ }
35
+ continue;
36
+ }
37
+ if (inSingleQuote) {
38
+ result += char;
39
+ if (char === "'" && next === "'") {
40
+ result += next;
41
+ i += 2;
42
+ }
43
+ else if (char === "'") {
44
+ inSingleQuote = false;
45
+ i += 1;
46
+ }
47
+ else {
48
+ i += 1;
49
+ }
50
+ continue;
51
+ }
52
+ if (inDoubleQuote) {
53
+ result += char;
54
+ if (char === '"' && next === '"') {
55
+ result += next;
56
+ i += 2;
57
+ }
58
+ else if (char === '"') {
59
+ inDoubleQuote = false;
60
+ i += 1;
61
+ }
62
+ else {
63
+ i += 1;
64
+ }
65
+ continue;
66
+ }
67
+ if (inBacktick) {
68
+ result += char;
69
+ if (char === '`' && next === '`') {
70
+ result += next;
71
+ i += 2;
72
+ }
73
+ else if (char === '`') {
74
+ inBacktick = false;
75
+ i += 1;
76
+ }
77
+ else {
78
+ i += 1;
79
+ }
80
+ continue;
81
+ }
82
+ if (char === '-' && next === '-') {
83
+ result += char + next;
84
+ inLineComment = true;
85
+ i += 2;
86
+ continue;
87
+ }
88
+ if (char === '/' && next === '*') {
89
+ result += char + next;
90
+ inBlockComment = true;
91
+ i += 2;
92
+ continue;
93
+ }
94
+ if (char === "'") {
95
+ result += char;
96
+ inSingleQuote = true;
97
+ i += 1;
98
+ continue;
99
+ }
100
+ if (char === '"') {
101
+ result += char;
102
+ inDoubleQuote = true;
103
+ i += 1;
104
+ continue;
105
+ }
106
+ if (char === '`') {
107
+ result += char;
108
+ inBacktick = true;
109
+ i += 1;
110
+ continue;
111
+ }
112
+ if (char === '[') {
113
+ let inner = '';
114
+ let j = i + 1;
115
+ let closed = false;
116
+ while (j < query.length) {
117
+ if (query[j] === ']') {
118
+ if (j + 1 < query.length && query[j + 1] === ']') {
119
+ inner += ']';
120
+ j += 2;
121
+ }
122
+ else {
123
+ closed = true;
124
+ j += 1;
125
+ break;
126
+ }
127
+ }
128
+ else {
129
+ inner += query[j];
130
+ j += 1;
131
+ }
132
+ }
133
+ if (closed) {
134
+ result += '`' + inner + '`';
135
+ i = j;
136
+ continue;
137
+ }
138
+ result += char;
139
+ i += 1;
140
+ continue;
141
+ }
142
+ result += char;
143
+ i += 1;
144
+ }
145
+ return result;
146
+ }
147
+ function makeJsonExtractNode(path) {
148
+ return {
149
+ type: 'function',
150
+ name: { name: [{ type: 'default', value: 'json_extract' }] },
151
+ args: {
152
+ type: 'expr_list',
153
+ value: [
154
+ { type: 'column_ref', table: null, column: 'data', collate: null },
155
+ { type: 'single_quote_string', value: path },
156
+ ],
157
+ },
158
+ over: null,
159
+ };
160
+ }
161
+ function expandShorthandInAst(node) {
162
+ if (node === null || typeof node !== 'object')
163
+ return node;
164
+ const obj = node;
165
+ if (obj.type === 'single_quote_string' &&
166
+ typeof obj.value === 'string' &&
167
+ obj.value.startsWith('$.')) {
168
+ return makeJsonExtractNode(obj.value);
169
+ }
170
+ if (obj.type === 'function') {
171
+ const nameArr = obj.name?.name;
172
+ if (nameArr?.[0]?.value === 'json_extract')
173
+ return node;
174
+ }
175
+ const result = {};
176
+ for (const [key, val] of Object.entries(obj)) {
177
+ result[key] = Array.isArray(val) ? val.map(expandShorthandInAst) : expandShorthandInAst(val);
178
+ }
179
+ return result;
180
+ }
181
+ function lowercaseIdentifiers(query) {
182
+ const parts = query.split(/(\'(?:[^\']|\'\')*\')/g);
183
+ return parts.map((part, i) => (i % 2 === 0 ? part.toLowerCase() : part)).join('');
184
+ }
185
+ export function normalizeQuery(query) {
186
+ const preprocessed = bracketsToBackticks(query);
187
+ const ast = sqlParser.astify(preprocessed, SQLITE_OPT);
188
+ const transformed = Array.isArray(ast) ? ast.map(expandShorthandInAst) : expandShorthandInAst(ast);
189
+ return sqlParser.sqlify(transformed, TSQL_OPT);
190
+ }
191
+ export function queriesEquivalent(a, b) {
192
+ return lowercaseIdentifiers(normalizeQuery(a)) === lowercaseIdentifiers(normalizeQuery(b));
193
+ }
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLW5vcm1hbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNvdXJjZS9zcWxpdGUtbm9ybWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFlBQVksTUFBTSxpQ0FBaUMsQ0FBQTtBQUUxRCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFBO0FBTTFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFBO0FBQ3pDLE1BQU0sUUFBUSxHQUFHLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFBO0FBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUE7QUFHdEMsU0FBUyxtQkFBbUIsQ0FBQyxLQUFhLEVBQVU7SUFDbEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRVQsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFBO0lBQ3pCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQTtJQUN6QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUE7SUFDdEIsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFBO0lBQ3pCLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUUxQixPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBR3JELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLElBQUksQ0FBQTtZQUNkLElBQUksSUFBSSxLQUFLLElBQUksRUFB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QVU7SUFDcEQsTUFBTSxZQUFZLEdBQVcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsTUFBTSxHQUFHLEdBQWdCLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEcsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQTBCLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFBQSxDQUM5RDtBQWFELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFXO0lBQy9ELE9BQU8sb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFBQSxDQUMzRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQVNUIH0gZnJvbSAnbm9kZS1zcWwtcGFyc2VyJ1xuaW1wb3J0IFNxbGl0ZVBhcnNlciBmcm9tICdub2RlLXNxbC1wYXJzZXIvYnVpbGQvc3FsaXRlLmpzJ1xuXG5jb25zdCBTcWxQYXJzZXJDbGFzcyA9IFNxbGl0ZVBhcnNlci5QYXJzZXJcblxuLy8gVXNlIFNRTGl0ZSBncmFtbWFyIGZvciBwYXJzaW5nOyBvdXRwdXQgd2l0aCBUcmFuc2FjdFNRTCBicmFja2V0IHF1b3RpbmcuXG4vLyBUaGUgU1FMaXRlIGJ1aWxkIGRvZXMgbm90IGFjY2VwdCBbYnJhY2tldF0gcXVvdGluZyBhcyBpbnB1dCwgc28gd2UgcHJlLXByb2Nlc3Ncbi8vIFtmb29dIOKGkiBgZm9vYCAoYmFja3RpY2spLCB3aGljaCB0aGUgU1FMaXRlIGdyYW1tYXIgYWNjZXB0cyBhbmQgbm9ybWFsaXplcyB0byBcImZvb1wiLlxuLy8gc3FsaWZ5IHdpdGggVHJhbnNhY3RTUUwgb3B0cyB0aGVuIHJlLWVtaXRzIGFsbCBpZGVudGlmaWVycyBhcyBbZm9vXS5cbmNvbnN0IFNRTElURV9PUFQgPSB7IGRhdGFiYXNlOiAnU1FMaXRlJyB9XG5jb25zdCBUU1FMX09QVCA9IHsgZGF0YWJhc2U6ICdUcmFuc2FjdFNRTCcgfVxuY29uc3Qgc3FsUGFyc2VyID0gbmV3IFNxbFBhcnNlckNsYXNzKClcblxuLyoqIENvbnZlcnQgW2JyYWNrZXRdIGlkZW50aWZpZXJzIHRvIGJhY2t0aWNrIHNvIHRoZSBTUUxpdGUgcGFyc2VyIGFjY2VwdHMgdGhlbS4gKi9cbmZ1bmN0aW9uIGJyYWNrZXRzVG9CYWNrdGlja3MocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJ1xuICBsZXQgaSA9IDBcblxuICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlXG4gIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2VcbiAgbGV0IGluQmFja3RpY2sgPSBmYWxzZVxuICBsZXQgaW5MaW5lQ29tbWVudCA9IGZhbHNlXG4gIGxldCBpbkJsb2NrQ29tbWVudCA9IGZhbHNlXG5cbiAgd2hpbGUgKGkgPCBxdWVyeS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gcXVlcnlbaV1cbiAgICBjb25zdCBuZXh0ID0gaSArIDEgPCBxdWVyeS5sZW5ndGggPyBxdWVyeVtpICsgMV0gOiAnJ1xuXG4gICAgLy8gSGFuZGxlIGVuZCBvZiBsaW5lIGNvbW1lbnRcbiAgICBpZiAoaW5MaW5lQ29tbWVudCkge1xuICAgICAgcmVzdWx0ICs9IGNoYXJcbiAgICAgIGlmIChjaGFyID09PSAnXFxuJykge1xuICAgICAgICBpbkxpbmVDb21tZW50ID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIGkgKz0gMVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZW5kIG9mIGJsb2NrIGNvbW1lbnRcbiAgICBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgIHJlc3VsdCArPSBjaGFyXG4gICAgICBpZiAoY2hhciA9PT0gJyonICYmIG5leHQgPT09ICcvJykge1xuICAgICAgICByZXN1bHQgKz0gbmV4dFxuICAgICAgICBpbkJsb2NrQ29tbWVudCA9IGZhbHNlXG4gICAgICAgIGkgKz0gMlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaSArPSAxXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzaW5nbGUtcXVvdGVkIHN0cmluZ3MsIHByZXNlcnZpbmcgY29udGVudCB2ZXJiYXRpbS5cbiAgICBpZiAoaW5TaW5nbGVRdW90ZSkge1xuICAgICAgcmVzdWx0ICs9IGNoYXJcbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiBuZXh0ID09PSBcIidcIikge1xuICAgICAgICAvLyBFc2NhcGVkIHNpbmdsZSBxdW90ZTogY29uc3VtZSBib3RoIHF1b3Rlcy5cbiAgICAgICAgcmVzdWx0ICs9IG5leHRcbiAgICAgICAgaSArPSAyXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSBmYWxzZVxuICAgICAgICBpICs9IDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkgKz0gMVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZG91YmxlLXF1b3RlZCBpZGVudGlmaWVycy9zdHJpbmdzLlxuICAgIGlmIChpbkRvdWJsZVF1b3RlKSB7XG4gICAgICByZXN1bHQgKz0gY2hhclxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgbmV4dCA9PT0gJ1wiJykge1xuICAgICAgICAvLyBFc2NhcGVkIGRvdWJsZSBxdW90ZTogY29uc3VtZSBib3RoIHF1b3Rlcy5cbiAgICAgICAgcmVzdWx0ICs9IG5leHRcbiAgICAgICAgaSArPSAyXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgaW5Eb3VibGVRdW90ZSA9IGZhbHNlXG4gICAgICAgIGkgKz0gMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaSArPSAxXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBiYWNrdGljay1xdW90ZWQgaWRlbnRpZmllcnMuXG4gICAgaWYgKGluQmFja3RpY2spIHtcbiAgICAgIHJlc3VsdCArPSBjaGFyXG4gICAgICBpZiAoY2hhciA9PT0gJ2AnICYmIG5leHQgPT09ICdgJykge1xuICAgICAgICAvLyBFc2NhcGVkIGJhY2t0aWNrOiBjb25zdW1lIGJvdGggYmFja3RpY2tzLlxuICAgICAgICByZXN1bHQgKz0gbmV4dFxuICAgICAgICBpICs9IDJcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ2AnKSB7XG4gICAgICAgIGluQmFja3RpY2sgPSBmYWxzZVxuICAgICAgICBpICs9IDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkgKz0gMVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBXZSBhcmUgbm90IGN1cnJlbnRseSBpbnNpZGUgYSBzdHJpbmcgb3IgY29tbWVudC5cbiAgICAvLyBDaGVjayBmb3Igc3RhcnQgb2YgY29tbWVudHMgZmlyc3QuXG4gICAgaWYgKGNoYXIgPT09ICctJyAmJiBuZXh0ID09PSAnLScpIHtcbiAgICAgIHJlc3VsdCArPSBjaGFyICsgbmV4dFxuICAgICAgaW5MaW5lQ29tbWVudCA9IHRydWVcbiAgICAgIGkgKz0gMlxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcqJykge1xuICAgICAgcmVzdWx0ICs9IGNoYXIgKyBuZXh0XG4gICAgICBpbkJsb2NrQ29tbWVudCA9IHRydWVcbiAgICAgIGkgKz0gMlxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igc3RhcnQgb2Ygc3RyaW5ncyAvIHF1b3RlZCBpZGVudGlmaWVycy5cbiAgICBpZiAoY2hhciA9PT0gXCInXCIpIHtcbiAgICAgIHJlc3VsdCArPSBjaGFyXG4gICAgICBpblNpbmdsZVF1b3RlID0gdHJ1ZVxuICAgICAgaSArPSAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnXCInKSB7XG4gICAgICByZXN1bHQgKz0gY2hhclxuICAgICAgaW5Eb3VibGVRdW90ZSA9IHRydWVcbiAgICAgIGkgKz0gMVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJ2AnKSB7XG4gICAgICByZXN1bHQgKz0gY2hhclxuICAgICAgaW5CYWNrdGljayA9IHRydWVcbiAgICAgIGkgKz0gMVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIFticmFja2V0XSDihpIgYGJhY2t0aWNrYCByZXBsYWNlbWVudCBvbmx5IG91dHNpZGUgbGl0ZXJhbHMvY29tbWVudHMuXG4gICAgLy8gSGFuZGxlIF1dIGFzIGVzY2FwZWQgXSBpbnNpZGUgYnJhY2tldC1xdW90ZWQgaWRlbnRpZmllcnMgKGxpa2UgJycgaW4gc3RyaW5ncykuXG4gICAgaWYgKGNoYXIgPT09ICdbJykge1xuICAgICAgbGV0IGlubmVyID0gJydcbiAgICAgIGxldCBqID0gaSArIDFcbiAgICAgIGxldCBjbG9zZWQgPSBmYWxzZVxuICAgICAgd2hpbGUgKGogPCBxdWVyeS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHF1ZXJ5W2pdID09PSAnXScpIHtcbiAgICAgICAgICBpZiAoaiArIDEgPCBxdWVyeS5sZW5ndGggJiYgcXVlcnlbaiArIDFdID09PSAnXScpIHtcbiAgICAgICAgICAgIC8vIEVzY2FwZWQgXV0g4oaSIGxpdGVyYWwgXVxuICAgICAgICAgICAgaW5uZXIgKz0gJ10nXG4gICAgICAgICAgICBqICs9IDJcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2xvc2luZyBicmFja2V0XG4gICAgICAgICAgICBjbG9zZWQgPSB0cnVlXG4gICAgICAgICAgICBqICs9IDFcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlubmVyICs9IHF1ZXJ5W2pdXG4gICAgICAgICAgaiArPSAxXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZWQpIHtcbiAgICAgICAgcmVzdWx0ICs9ICdgJyArIGlubmVyICsgJ2AnXG4gICAgICAgIGkgPSBqXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICAvLyBObyBtYXRjaGluZyAnXScgZm91bmQg4oCUIHRyZWF0IGFzIGEgbm9ybWFsIGNoYXJhY3Rlci5cbiAgICAgIHJlc3VsdCArPSBjaGFyXG4gICAgICBpICs9IDFcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdDogY29weSBjaGFyYWN0ZXIgYXMtaXMuXG4gICAgcmVzdWx0ICs9IGNoYXJcbiAgICBpICs9IDFcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqIEJ1aWxkIGEganNvbl9leHRyYWN0KGRhdGEsIHBhdGgpIEFTVCBmdW5jdGlvbi1jYWxsIG5vZGUuICovXG5mdW5jdGlvbiBtYWtlSnNvbkV4dHJhY3ROb2RlKHBhdGg6IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICBuYW1lOiB7IG5hbWU6IFt7IHR5cGU6ICdkZWZhdWx0JywgdmFsdWU6ICdqc29uX2V4dHJhY3QnIH1dIH0sXG4gICAgYXJnczoge1xuICAgICAgdHlwZTogJ2V4cHJfbGlzdCcsXG4gICAgICB2YWx1ZTogW1xuICAgICAgICB7IHR5cGU6ICdjb2x1bW5fcmVmJywgdGFibGU6IG51bGwsIGNvbHVtbjogJ2RhdGEnLCBjb2xsYXRlOiBudWxsIH0sXG4gICAgICAgIHsgdHlwZTogJ3NpbmdsZV9xdW90ZV9zdHJpbmcnLCB2YWx1ZTogcGF0aCB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIG92ZXI6IG51bGwsXG4gIH1cbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSB3YWxrIGFuIEFTVCBub2RlIHRyZWUsIHJlcGxhY2luZyBiYXJlIGAnJC5wYXRoJ2Agc3RyaW5nLWxpdGVyYWxcbiAqIG5vZGVzIHdpdGgganNvbl9leHRyYWN0IGZ1bmN0aW9uLWNhbGwgbm9kZXMuIEV4aXN0aW5nIGpzb25fZXh0cmFjdCBjYWxscyBhcmVcbiAqIGxlZnQgdW50b3VjaGVkIHNvIHNob3J0aGFuZCBpcyBuZXZlciBkb3VibGUtZXhwYW5kZWQuXG4gKi9cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZEluQXN0KG5vZGU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKG5vZGUgPT09IG51bGwgfHwgdHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSByZXR1cm4gbm9kZVxuXG4gIGNvbnN0IG9iaiA9IG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAvLyBCYXJlIHNob3J0aGFuZDogc2luZ2xlX3F1b3RlX3N0cmluZyB3aG9zZSB2YWx1ZSBzdGFydHMgd2l0aCAnJC4nXG4gIGlmIChcbiAgICBvYmoudHlwZSA9PT0gJ3NpbmdsZV9xdW90ZV9zdHJpbmcnICYmXG4gICAgdHlwZW9mIG9iai52YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICBvYmoudmFsdWUuc3RhcnRzV2l0aCgnJC4nKVxuICApIHtcbiAgICByZXR1cm4gbWFrZUpzb25FeHRyYWN0Tm9kZShvYmoudmFsdWUpXG4gIH1cblxuICAvLyBTa2lwIGFyZ3Mgb2YgZXhpc3RpbmcganNvbl9leHRyYWN0IGNhbGxzIOKAlCB0aGV5IGFyZSBhbHJlYWR5IGV4cGFuZGVkLlxuICBpZiAob2JqLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBuYW1lQXJyID0gKG9iai5uYW1lIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8ubmFtZSBhc1xuICAgICAgfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgaWYgKG5hbWVBcnI/LlswXT8udmFsdWUgPT09ICdqc29uX2V4dHJhY3QnKSByZXR1cm4gbm9kZVxuICB9XG5cbiAgLy8gUmVjdXJzZSBpbnRvIGFsbCBjaGlsZCBwcm9wZXJ0aWVzLlxuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICByZXN1bHRba2V5XSA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbC5tYXAoZXhwYW5kU2hvcnRoYW5kSW5Bc3QpIDogZXhwYW5kU2hvcnRoYW5kSW5Bc3QodmFsKVxuICB9XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBMb3dlcmNhc2Ugbm9uLWxpdGVyYWwgY29udGVudCBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLlxuICogU2luZ2xlLXF1b3RlZCBzdHJpbmcgbGl0ZXJhbHMgYXJlIHByZXNlcnZlZCB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gbG93ZXJjYXNlSWRlbnRpZmllcnMocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzID0gcXVlcnkuc3BsaXQoLyhcXCcoPzpbXlxcJ118XFwnXFwnKSpcXCcpL2cpXG4gIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQsIGkpID0+IChpICUgMiA9PT0gMCA/IHBhcnQudG9Mb3dlckNhc2UoKSA6IHBhcnQpKS5qb2luKCcnKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIFNRTCBxdWVyeSB0byBhIGNhbm9uaWNhbCwgcmV1c2FibGUgZm9ybS5cbiAqXG4gKiBBcHBsaWVzIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtYXRpb25zOlxuICogMS4gQ29udmVydCBgW2JyYWNrZXRdYCBpZGVudGlmaWVycyB0byBiYWNrdGljayBmb3IgcGFyc2VyIGlucHV0XG4gKiAyLiBQYXJzZSB3aXRoIHRoZSBTUUxpdGUgZ3JhbW1hciAoc3RyaXBzIGNvbW1lbnRzLCB2YWxpZGF0ZXMgc3RydWN0dXJlKVxuICogMy4gRXhwYW5kIGAnJC5wYXRoJ2Agc2hvcnRoYW5kIHRvIGBqc29uX2V4dHJhY3QoZGF0YSwgJyQucGF0aCcpYCB2aWEgQVNUIHdhbGtcbiAqIDQuIFJlLWVtaXQgd2l0aCBUcmFuc2FjdFNRTCBicmFja2V0IHF1b3Rpbmcg4oCUIGFsbCBpZGVudGlmaWVycyBiZWNvbWUgYFtuYW1lXWBcbiAqICAgIGFuZCBTUUwga2V5d29yZHMgYXJlIHVwcGVyY2FzZWRcbiAqXG4gKiBUaGUgcmVzdWx0IGlzIHZhbGlkIFNRTCBzdWl0YWJsZSBmb3IgcmV1c2UuIFVzZSBgcXVlcmllc0VxdWl2YWxlbnRgIGZvclxuICogY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLlxuICpcbiAqIEBwYXJhbSBxdWVyeSAtIFNRTCBxdWVyeSB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIENhbm9uaWNhbCBmb3JtIG9mIHRoZSBxdWVyeVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUXVlcnkocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByZXByb2Nlc3NlZDogc3RyaW5nID0gYnJhY2tldHNUb0JhY2t0aWNrcyhxdWVyeSlcbiAgY29uc3QgYXN0OiBBU1QgfCBBU1RbXSA9IHNxbFBhcnNlci5hc3RpZnkocHJlcHJvY2Vzc2VkLCBTUUxJVEVfT1BUKVxuICBjb25zdCB0cmFuc2Zvcm1lZCA9IEFycmF5LmlzQXJyYXkoYXN0KSA/IGFzdC5tYXAoZXhwYW5kU2hvcnRoYW5kSW5Bc3QpIDogZXhwYW5kU2hvcnRoYW5kSW5Bc3QoYXN0KVxuICByZXR1cm4gc3FsUGFyc2VyLnNxbGlmeSh0cmFuc2Zvcm1lZCBhcyBBU1QgfCBBU1RbXSwgVFNRTF9PUFQpXG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gU1FMIHF1ZXJpZXMgZm9yIHNlbWFudGljIGVxdWl2YWxlbmNlLlxuICpcbiAqIElnbm9yZXMgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSwga2V5d29yZCBjYXNlLCBpZGVudGlmaWVyIGNhc2UsIHNxdWFyZVxuICogYnJhY2tldCBxdW90aW5nLCBhbmQgdGhlIGAnJC5wYXRoJ2AganNvbl9leHRyYWN0IHNob3J0aGFuZC4gU3RyaW5nIGxpdGVyYWxcbiAqIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUgKGAnQWN0aXZlJ2Ag4omgIGAnYWN0aXZlJ2ApLlxuICpcbiAqIEBwYXJhbSBhIC0gRmlyc3QgU1FMIHF1ZXJ5XG4gKiBAcGFyYW0gYiAtIFNlY29uZCBTUUwgcXVlcnlcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXJpZXMgYXJlIHNlbWFudGljYWxseSBlcXVpdmFsZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWVyaWVzRXF1aXZhbGVudChhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbG93ZXJjYXNlSWRlbnRpZmllcnMobm9ybWFsaXplUXVlcnkoYSkpID09PSBsb3dlcmNhc2VJZGVudGlmaWVycyhub3JtYWxpemVRdWVyeShiKSlcbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import Database from 'better-sqlite3';
2
+ export interface MultiTableValidationResult {
3
+ readonly db: Database.Database;
4
+ readonly tables: Map<string, {
5
+ readonly safeName: string;
6
+ readonly normalizedName: string;
7
+ }>;
8
+ }
9
+ export declare function validateColumnName(name: string): void;
10
+ export declare function validateTableName(name: string): string;
11
+ declare function safeTableName(tableName: string): string;
12
+ export declare const __testOnly__: {
13
+ readonly safeTableName: typeof safeTableName;
14
+ };
15
+ export declare function replaceParameters(query: string): string;
16
+ export declare function replaceTableName(query: string, originalName: string, safeName: string): string;
17
+ export declare function createValidationDatabase(tableNames: string[], options?: {
18
+ additionalColumns?: string[];
19
+ }): MultiTableValidationResult;
20
+ export declare function stripSqlComments(query: string): string;
21
+ export declare function validateSelectQuery(db: Database.Database, query: string): Database.Statement;
22
+ export declare function extractColumns(stmt: Database.Statement): string[];
23
+ export declare function validateRequiredColumns(columns: string[], requiredColumns: string[]): {
24
+ isValid: boolean;
25
+ missing: string[];
26
+ };
27
+ export {};
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsaXRlLXZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFzb3VyY2Uvc3FsaXRlLXZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQTtBQWtHckMsTUFBTSxXQUFXLDBCQUEwQjtJQUN6QyxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUE7SUFDOUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFO1FBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFBQyxRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FBQTtDQUM3RjtBQThCRCx3QkFBZ0Isa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBbURyRDtBQXNDRCx3QkFBZ0IsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBMER0RDtBQWVELGlCQUFTLGFBQWEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FRaEQ7QUFNRCxlQUFPLE1BQU0sWUFBWTs7Q0FFZixDQUFBO0FBU1Ysd0JBQWdCLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUt2RDtBQVlELHdCQUFnQixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBd0I5RjtBQTJCRCx3QkFBZ0Isd0JBQXdCLENBQ3RDLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFDcEIsT0FBTyxHQUFFO0lBQ1AsaUJBQWlCLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQTtDQUN4QixHQUNMLDBCQUEwQixDQStDNUI7QUFrQkQsd0JBQWdCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUV0RDtBQXdCRCx3QkFBZ0IsbUJBQW1CLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQWdDNUY7QUFRRCx3QkFBZ0IsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUVqRTtBQWtCRCx3QkFBZ0IsdUJBQXVCLENBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFDakIsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUN4QjtJQUNELE9BQU8sRUFBRSxPQUFPLENBQUE7SUFDaEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFBO0NBQ2xCLENBUUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGF0YWJhc2UgZnJvbSAnYmV0dGVyLXNxbGl0ZTMnXG5pbXBvcnQge1xuICBDb21tb25OYW1lTWl4ZWRSZWdleCxcbiAgaXNTcWxpdGVTeXN0ZW1UYWJsZSxcbiAgdHlwZSBTeXN0ZW1TcWxpdGVUYWJsZU5hbWUsXG59IGZyb20gJy4uL2Fic3RyYWN0L3pvZC50eXBlcy5qcydcblxuLyoqXG4gKiBTUUxpdGUgU2VjdXJpdHkgVmFsaWRhdGlvbiBVdGlsaXRpZXNcbiAqXG4gKiBUaGlzIG1vZHVsZSBsZXZlcmFnZXMgU1FMaXRlJ3MgYnVpbHQtaW4gc2VjdXJpdHkgZmVhdHVyZXMgZm9yIHZhbGlkYXRpb246XG4gKlxuICogMS4gKipTUUxpdGUncyBIYXJkZW5lZCBQYXJzZXIqKiAoZGIucHJlcGFyZSgpKVxuICogICAgLSBCYXR0bGUtdGVzdGVkIFNRTCBwYXJzZXIgdXNlZCBieSBtaWxsaW9ucyBvZiBhcHBsaWNhdGlvbnNcbiAqICAgIC0gVmFsaWRhdGVzIHF1ZXJ5IHN5bnRheCB3aXRob3V0IGV4ZWN1dGlvblxuICogICAgLSBSZWZlcmVuY2U6IGh0dHBzOi8vc3FsaXRlLm9yZy9sYW5nLmh0bWwsIGh0dHBzOi8vc3FsaXRlLm9yZy9zZWN1cml0eS5odG1sXG4gKlxuICogMi4gKipiZXR0ZXItc3FsaXRlMyBNdWx0aXBsZSBTdGF0ZW1lbnQgUHJvdGVjdGlvbioqXG4gKiAgICAtIFByZXBhcmVkIHN0YXRlbWVudHMgKGRiLnByZXBhcmUpIGJsb2NrIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzXG4gKiAgICAtIFByZXZlbnRzIGluamVjdGlvbiB2aWEgc3RhdGVtZW50IGNoYWluaW5nOiBgJzsgRFJPUCBUQUJMRSB1c2VyczsgLS1gXG4gKiAgICAtIFRocm93cyBSYW5nZUVycm9yIGlmIG11bHRpcGxlIHN0YXRlbWVudHMgZGV0ZWN0ZWRcbiAqXG4gKiAzLiAqKlNRTGl0ZSBCcmFja2V0LVF1b3RpbmcqKiAoW2lkZW50aWZpZXJdKVxuICogICAgLSBTYWZlIGlkZW50aWZpZXIgcXVvdGluZyBtZWNoYW5pc20gYnVpbHQgaW50byBTUUxpdGVcbiAqICAgIC0gUHJvdGVjdHMgYWdhaW5zdCByZXNlcnZlZCBrZXl3b3JkcyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gKiAgICAtIFN1cHBvcnRzIGVzY2FwZSB2aWEgXV0gZm9yIGxpdGVyYWwgXSBjaGFyYWN0ZXJcbiAqXG4gKiA0LiAqKlNRTGl0ZSBFeHByZXNzaW9uIExpbWl0cyoqIChTUUxJVEVfTElNSVRfRVhQUl9ERVBUSCA9IDEwMDApXG4gKiAgICAtIEJ1aWx0LWluIERvUyBwcm90ZWN0aW9uIGFnYWluc3QgZGVlcGx5IG5lc3RlZCBleHByZXNzaW9uc1xuICogICAgLSBSZWZlcmVuY2U6IGh0dHBzOi8vc3FsaXRlLm9yZy9saW1pdHMuaHRtbFxuICpcbiAqIDUuICoqUHJlcGFyZWQgU3RhdGVtZW50IFBhcmFtZXRlciBCaW5kaW5nKipcbiAqICAgIC0gYmV0dGVyLXNxbGl0ZTMgYXV0b21hdGljYWxseSBlc2NhcGVzIGJvdW5kIHBhcmFtZXRlcnNcbiAqICAgIC0gUHJldmVudHMgaW5qZWN0aW9uIGJ5IHNlcGFyYXRpbmcgY29kZSBmcm9tIGRhdGFcbiAqXG4gKiBBZGRpdGlvbmFsIGxheWVyczogQ3VzdG9tIHZhbGlkYXRpb24gKHZhbGlkYXRlVGFibGVOYW1lLCB2YWxpZGF0ZUNvbHVtbk5hbWUpXG4gKiBwcm92aWRlcyBhbGxvd2xpc3QtYmFzZWQgaWRlbnRpZmllciB2YWxpZGF0aW9uIGJlZm9yZSB1c2luZyBTUUxpdGUgZmVhdHVyZXMuXG4gKi9cblxuY29uc3QgQ09MVU1OX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOV8gLi1dezAsMTI3fSQvXG5jb25zdCBDT0xVTU5fRk9SQklEREVOX0NIQVJTID0gL1snXCJgOygpXFxcXF0vXG5jb25zdCBERUZBVUxUX1NDSEVNQSA9ICdkZWZhdWx0J1xuY29uc3QgU0NIRU1BX1NFUEFSQVRPUiA9ICcvJ1xuY29uc3QgTUFYX1BPU1RfRVNDQVBFID0gODBcbmNvbnN0IFJFU0VSVkVEX0NPTFVNTlMgPSBuZXcgU2V0KFsnaWQnLCAnZGF0YSddKVxuY29uc3QgVEFCTEVfVFJBTlNGT1JNQVRJT05TOiBBcnJheTxbUmVnRXhwLCBzdHJpbmddPiA9IFtcbiAgWy9cXC8vZywgJ19fanhfXyddLFxuICBbLy0vZywgJ19qeF8nXSxcbl1cbmNvbnN0IEJMT0NLX0NPTU1FTlRfUkVHRVggPSAvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nXG5jb25zdCBMSU5FX0NPTU1FTlRfUkVHRVggPSAvLS1bXlxcbl0qL2dcblxuLyoqXG4gKiBNYXRjaGVzIGV4dGVybmFsIHBhY2thZ2UgdGFibGUgZm9ybWF0OiBbcGFja2FnZU5hbWVdLlt0YWJsZU5hbWVdXG4gKlxuICogRXhhbXBsZTogXCJbbXlQYWNrYWdlXS5bbXlUYWJsZV1cIlxuICogLSBHcm91cCAxOiBwYWNrYWdlTmFtZSAoY2hhcmFjdGVycyBiZXR3ZWVuIGZpcnN0IHBhaXIgb2YgYnJhY2tldHMpXG4gKiAtIEdyb3VwIDI6IHRhYmxlTmFtZSAoY2hhcmFjdGVycyBiZXR3ZWVuIHNlY29uZCBwYWlyIG9mIGJyYWNrZXRzKVxuICovXG5jb25zdCBFWFRFUk5BTF9QQUNLQUdFX1RBQkxFX1BBVFRFUk4gPSAvXlxcWyhbXlxcXV0rKVxcXVxcLlxcWyhbXlxcXV0rKVxcXSQvXG5cbi8qKlxuICogU3lzdGVtIHRhYmxlIHNjaGVtYXMgZnJvbSBwbGF0Zm9ybSBkYXRhYmFzZSBtaWdyYXRpb25zLlxuICogU291cmNlOiBqaWd4L3BhY2thZ2VzL2RhdGFzdG9yZS9zcmMvZGF0YWJhc2UvbWlncmF0aW9ucy9zb2x1dGlvbi9cbiAqXG4gKiBUaGVzZSBzY2hlbWFzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhY2N1cmF0ZSB2YWxpZGF0aW9uIGRhdGFiYXNlcyBmb3Igc3lzdGVtIHRhYmxlcy5cbiAqL1xuY29uc3QgU1lTVEVNX1RBQkxFX1NDSEVNQVM6IFJlY29yZDxTeXN0ZW1TcWxpdGVUYWJsZU5hbWUsIHN0cmluZz4gPSB7XG4gIC8vIFNvdXJjZTogMDAzX3N5bmNfc3RhdHVzX2FuZF9zY29wZS5zcWwudHNcbiAgX3N5bmNTY29wZTogYFxuICAgIFtpZF0gICAgICAgICAgICBURVhUIE5PVCBOVUxMIFBSSU1BUlkgS0VZLFxuICAgIFt0aW1lc3RhbXBdICAgICBJTlRFR0VSLFxuICAgIFtzdGF0ZV0gICAgICAgICBURVhULFxuICAgIFtub3RTdGFydGVkXSAgICBJTlRFR0VSIERFRkFVTFQoMCksXG4gICAgW3N5bmNpbmddICAgICAgIElOVEVHRVIgREVGQVVMVCgwKSxcbiAgICBbc3luY2VkXSAgICAgICAgSU5URUdFUiBERUZBVUxUKDApLFxuICAgIFtmYWlsZWRdICAgICAgICBJTlRFR0VSIERFRkFVTFQoMCksXG4gICAgW2xhc3RTdGFydGVkQXRdIElOVEVHRVIgTlVMTCxcbiAgICBbbGFzdEZhaWxlZEF0XSAgSU5URUdFUiBOVUxMLFxuICAgIFtsYXN0U3luY2VkQXRdICBJTlRFR0VSIE5VTEwsXG4gICAgW2RldGFpbHNdICAgICAgIFRFWFQgTlVMTFxuICBgLFxuICAvLyBTb3VyY2U6IDAwMV9pbml0aWFsLnNxbC50c1xuICBfY29tbWFuZFF1ZXVlOiBgXG4gICAgW2lkXSAgICAgICAgIElOVEVHRVIgTk9UIE5VTEwgUFJJTUFSWSBLRVksXG4gICAgW3F1ZXVlXSAgICAgIFRFWFQgTk9UIE5VTEwsXG4gICAgW3R5cGVdICAgICAgIFRFWFQgTk9UIE5VTEwsXG4gICAgW3BheWxvYWRdICAgIFRFWFQgTlVMTCxcbiAgICBbc3RhdGVdICAgICAgVEVYVCBOVUxMLFxuICAgIFtlcnJvcl0gICAgICBURVhUIE5VTEwsXG4gICAgW3JldHJ5Q291bnRdIElOVEVHRVIgTlVMTCxcbiAgICBbcmV0cnlBZnRlcl0gSU5URUdFUiBOVUxMXG4gIGAsXG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIGNyZWF0ZVZhbGlkYXRpb25EYXRhYmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpVGFibGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgcmVhZG9ubHkgZGI6IERhdGFiYXNlLkRhdGFiYXNlXG4gIHJlYWRvbmx5IHRhYmxlczogTWFwPHN0cmluZywgeyByZWFkb25seSBzYWZlTmFtZTogc3RyaW5nOyByZWFkb25seSBub3JtYWxpemVkTmFtZTogc3RyaW5nIH0+XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIGNvbHVtbiBuYW1lIGlzIGEgc2FmZSBTUUwgaWRlbnRpZmllci5cbiAqIFByZXZlbnRzIFNRTCBpbmplY3Rpb24gYnkgZW5zdXJpbmcgY29sdW1uIG5hbWVzIGZvbGxvdyBzdHJpY3QgcnVsZXMuXG4gKlxuICogUnVsZXM6XG4gKiAtIENhbm5vdCBiZSBlbXB0eVxuICogLSBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKGEteiwgQS1aKSBvciB1bmRlcnNjb3JlXG4gKiAtIENhbiBjb250YWluIHByaW50YWJsZSBBU0NJSTogbGV0dGVycywgbnVtYmVycywgdW5kZXJzY29yZSwgaHlwaGVuLCBwZXJpb2QsIHNwYWNlXG4gKiAtIE1heGltdW0gMTI4IGNoYXJhY3RlcnMgdG90YWwgKDEgc3RhcnQgY2hhcmFjdGVyICsgdXAgdG8gMTI3IGFkZGl0aW9uYWwgY2hhcmFjdGVycylcbiAqIC0gQ2Fubm90IGNvbnRhaW4gZGFuZ2Vyb3VzIHNlcXVlbmNlczogLS0sIC8qLCAqXFwvXG4gKiAtIENhbm5vdCBjb250YWluIGluamVjdGlvbiBjaGFyYWN0ZXJzOiBxdW90ZXMsIHNlbWljb2xvbnMsIHBhcmVudGhlc2VzLCBiYWNrc2xhc2hlc1xuICogLSBTUUwgcmVzZXJ2ZWQga2V5d29yZHMgYXJlIGFsbG93ZWQgKHdpbGwgYmUgYXV0b21hdGljYWxseSBxdW90ZWQgd2l0aCBicmFja2V0cylcbiAqXG4gKiBAcGFyYW0gbmFtZSAtIENvbHVtbiBuYW1lIHRvIHZhbGlkYXRlXG4gKiBAdGhyb3dzIEVycm9yIGlmIGNvbHVtbiBuYW1lIGlzIGludmFsaWQgb3IgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhbGlkYXRlQ29sdW1uTmFtZSgndXNlcl9pZCcpICAgICAgLy8g4pyFIFZhbGlkXG4gKiB2YWxpZGF0ZUNvbHVtbk5hbWUoJ0ZpcnN0IE5hbWUnKSAgIC8vIOKchSBWYWxpZCAoc3BhY2UgYWxsb3dlZClcbiAqIHZhbGlkYXRlQ29sdW1uTmFtZSgnY3JlYXRlZC1hdCcpICAgLy8g4pyFIFZhbGlkIChoeXBoZW4gYWxsb3dlZClcbiAqIHZhbGlkYXRlQ29sdW1uTmFtZSgndXNlci5lbWFpbCcpICAgLy8g4pyFIFZhbGlkIChwZXJpb2QgYWxsb3dlZClcbiAqIHZhbGlkYXRlQ29sdW1uTmFtZSgnc2VsZWN0JykgICAgICAgLy8g4pyFIFZhbGlkIChrZXl3b3JkLCB3aWxsIGJlIHF1b3RlZCBhcyBbc2VsZWN0XSlcbiAqIHZhbGlkYXRlQ29sdW1uTmFtZSgnZm9vLS1iYXInKSAgICAgLy8g4p2MIFRocm93cyAoLS0gaXMgU1FMIGNvbW1lbnQgbWFya2VyKVxuICogdmFsaWRhdGVDb2x1bW5OYW1lKCcxMjNhYmMnKSAgICAgICAvLyDinYwgVGhyb3dzIChzdGFydHMgd2l0aCBudW1iZXIpXG4gKiB2YWxpZGF0ZUNvbHVtbk5hbWUoJ3g7IERST1AnKSAgICAgIC8vIOKdjCBUaHJvd3MgKGNvbnRhaW5zIHNlbWljb2xvbilcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb2x1bW5OYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAvLyBDaGVjayBmb3Igbm9uLXN0cmluZyB2YWx1ZXNcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ29sdW1uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgZ290OiAke3R5cGVvZiBuYW1lfWApXG4gIH1cblxuICAvLyBDaGVjayBmb3IgZW1wdHkgc3RyaW5nXG4gIGlmIChuYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ29sdW1uIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKVxuICB9XG5cbiAgLy8gUmVqZWN0IGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICBpZiAoaGFzT3V0ZXJXaGl0ZXNwYWNlKG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbHVtbiBuYW1lICcke25hbWV9JzogY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXNgKVxuICB9XG5cbiAgLy8gQmxvY2sgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgKG9ubHkgcHJpbnRhYmxlIEFTQ0lJIGFsbG93ZWQgZm9yIHNlY3VyaXR5L2NvbXBhdGliaWxpdHkpXG5cbiAgaWYgKC9bXlxceDIwLVxceDdFXS8udGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb2x1bW4gbmFtZSAnJHtuYW1lfSc6IG9ubHkgQVNDSUkgY2hhcmFjdGVycyBhcmUgYWxsb3dlZGApXG4gIH1cblxuICAvLyBWYWxpZGF0ZSBiYXNpYyBwYXR0ZXJuOiBsZXR0ZXIvdW5kZXJzY29yZSBmb2xsb3dlZCBieSBzYWZlIGNoYXJhY3RlcnMsIG1heCAxMjggY2hhcnNcbiAgLy8gQWxsb3dzOiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmUsIGh5cGhlbiwgcGVyaW9kLCBzcGFjZVxuICBpZiAoIUNPTFVNTl9OQU1FX1BBVFRFUk4udGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbHVtbiBuYW1lOiBtdXN0IHN0YXJ0IHdpdGggbGV0dGVyIG9yIHVuZGVyc2NvcmUsIGNvbnRhaW4gb25seSBsZXR0ZXJzL251bWJlcnMvc3BhY2VzL2h5cGhlbnMvcGVyaW9kcy91bmRlcnNjb3JlcywgbWF4IDEyOCBjaGFyc2AsXG4gICAgKVxuICB9XG5cbiAgLy8gQmxvY2sgU1FMIGNvbW1lbnQgbWFya2VycyAoZXZlbiB0aG91Z2ggd2UgYnJhY2tldC1xdW90ZSwgZGVmZW5zZS1pbi1kZXB0aClcbiAgZW5zdXJlRG9lc05vdENvbnRhaW4oXG4gICAgbmFtZSxcbiAgICAnLS0nLFxuICAgIGBJbnZhbGlkIGNvbHVtbiBuYW1lICcke25hbWV9JzogY2Fubm90IGNvbnRhaW4gLS0gKFNRTCBjb21tZW50IG1hcmtlcilgLFxuICApXG4gIGVuc3VyZURvZXNOb3RDb250YWluQW55KFxuICAgIG5hbWUsXG4gICAgWycvKicsICcqLyddLFxuICAgIGBJbnZhbGlkIGNvbHVtbiBuYW1lICcke25hbWV9JzogY2Fubm90IGNvbnRhaW4gLyogb3IgKi8gKFNRTCBjb21tZW50IG1hcmtlcnMpYCxcbiAgKVxuXG4gIC8vIEJsb2NrIFNRTCBpbmplY3Rpb24gY2hhcmFjdGVyc1xuICBpZiAoQ09MVU1OX0ZPUkJJRERFTl9DSEFSUy50ZXN0KG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgY29sdW1uIG5hbWUgJyR7bmFtZX0nOiBjYW5ub3QgY29udGFpbiBxdW90ZXMgKCcsIFwiLCBcXGApLCBzZW1pY29sb25zLCBwYXJlbnRoZXNlcywgb3IgYmFja3NsYXNoZXNgLFxuICAgIClcbiAgfVxuXG4gIC8vIE5vdGU6IFNRTCByZXNlcnZlZCBrZXl3b3JkcyAoU0VMRUNULCBXSEVSRSwgZXRjLikgcGFzcyB2YWxpZGF0aW9uXG4gIC8vIFRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgcXVvdGVkIHdpdGggYnJhY2tldHMgW2tleXdvcmRdIGR1cmluZyB0YWJsZSBjcmVhdGlvblxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSB0YWJsZSBuYW1lIGlzIGEgc2FmZSBTUUwgaWRlbnRpZmllci5cbiAqIFByZXZlbnRzIFNRTCBpbmplY3Rpb24gYnkgZW5zdXJpbmcgdGFibGUgbmFtZXMgZm9sbG93IHN0cmljdCBydWxlcy5cbiAqIFZhbGlkYXRlZCBuYW1lcyBhcmUgdXNlZCB3aXRoIFNRTGl0ZSdzIGJyYWNrZXQtcXVvdGluZyBzeW50YXggW25hbWVdIGZvciBzYWZlIGhhbmRsaW5nLlxuICpcbiAqIElNUE9SVEFOVDogVGhpcyB2YWxpZGF0ZXMgU1RSVUNUVVJBTC9NRVRBIGlkZW50aWZpZXJzICh0YWJsZSBuYW1lcyksIE5PVCBkYXRhIGlkZW50aWZpZXJzLlxuICogRGF0YSByb3cgaWRlbnRpZmllcnMgKFJJRCkgdXNlIHNlcGFyYXRlIHZhbGlkYXRpb24gd2l0aCA2NC1jaGFyIGxpbWl0IGZvciBwYXlsb2FkIGRhdGEuXG4gKlxuICogVmFsaWRhdGlvbiBvY2N1cnMgYXQgVFdPIHN0YWdlczpcbiAqIDEuIFBSRS1UUkFOU0ZPUk1BVElPTjogSW5wdXQgdmFsaWRhdGlvbiAoc3RydWN0dXJhbCBjb3JyZWN0bmVzcylcbiAqIDIuIFBPU1QtVFJBTlNGT1JNQVRJT046IEFmdGVyIGVzY2FwaW5nICgvIOKGkiBfX2p4X18sIC0g4oaSIF9qeF8pIHRvIGVuc3VyZSBTUUxpdGUgY29tcGF0aWJpbGl0eVxuICpcbiAqIFJ1bGVzIChwcmUtdHJhbnNmb3JtYXRpb24pOlxuICogLSBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKGEteiwgQS1aKVxuICogLSBDYW4gY29udGFpbiBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlcywgZm9yd2FyZCBzbGFzaGVzLCBoeXBoZW5zXG4gKiAtIE1heGltdW0gNTggY2hhcmFjdGVycyAoZGVmYXVsdC8gcHJlZml4IDggY2hhcnMgKyB0YWJsZSBuYW1lIDUwIGNoYXJzKVxuICogLSBDYW5ub3QgY29udGFpbiBicmFja2V0cyBdIHdoaWNoIGNvdWxkIGVzY2FwZSBicmFja2V0LXF1b3RpbmdcbiAqIC0gQ2Fubm90IGJlIGVtcHR5XG4gKlxuICogUnVsZXMgKHBvc3QtdHJhbnNmb3JtYXRpb24pOlxuICogLSBUcmFuc2Zvcm1lZCBuYW1lIG11c3Qgbm90IGV4Y2VlZCA4MCBjaGFyYWN0ZXJzXG4gKiAtIFByZXZlbnRzIFNRTGl0ZSBpZGVudGlmaWVyIG92ZXJmbG93IGFmdGVyIGVzY2FwaW5nXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUYWJsZSBuYW1lIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBTYWZlIHRhYmxlIG5hbWUgZm9yIFNRTGl0ZSAoZS5nLiwgJ2RlZmF1bHRfX2p4X19leHBlbnNlcycsICdmb29fanhfYmFyJylcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGFibGUgbmFtZSBpcyBpbnZhbGlkIG9yIHBvdGVudGlhbGx5IGRhbmdlcm91c1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzYWZlID0gdmFsaWRhdGVUYWJsZU5hbWUoJ3VzZXJzJykgICAgICAgICAgIC8vIFJldHVybnMgJ3VzZXJzJ1xuICogY29uc3Qgc2FmZSA9IHZhbGlkYXRlVGFibGVOYW1lKCdkZWZhdWx0L29yZGVycycpICAvLyBSZXR1cm5zICdkZWZhdWx0X19qeF9fb3JkZXJzJ1xuICogY29uc3Qgc2FmZSA9IHZhbGlkYXRlVGFibGVOYW1lKCdmb28tYmFyJykgICAgICAgICAvLyBSZXR1cm5zICdmb29fanhfYmFyJ1xuICogdmFsaWRhdGVUYWJsZU5hbWUoJ3Rlc3RdIERST1AnKSAgICAgICAgICAgICAgICAgICAvLyBUaHJvd3MgKGJyYWNrZXQgZXNjYXBlKVxuICogdmFsaWRhdGVUYWJsZU5hbWUoJzEyM2FiYycpICAgICAgICAgICAgICAgICAgICAgICAvLyBUaHJvd3MgKHN0YXJ0cyB3aXRoIG51bWJlcilcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVUYWJsZU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQ2hlY2sgZm9yIGVtcHR5IG9yIG5vbi1zdHJpbmcgdmFsdWVzXG4gIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGdvdDogJHt0eXBlb2YgbmFtZX1gKVxuICB9XG5cbiAgLy8gUmVqZWN0IGJyYWNrZXQgY2hhcmFjdGVycyB0aGF0IGNvdWxkIGVzY2FwZSBTUUxpdGUncyBicmFja2V0LXF1b3RpbmdcbiAgLy8gU1FMaXRlIHVzZXMgW25hbWVdIGZvciBpZGVudGlmaWVycywgYW5kIF0gd291bGQgY2xvc2UgdGhlIGJyYWNrZXQgZWFybHlcbiAgLy8gQWxsb3dzIHVzIHRvIHNhZmVseSB1c2UgdmFsaWRhdGVkIG5hbWVzIGluIENSRUFURSBUQUJMRSBbJHtuYW1lfV0gc3RhdGVtZW50c1xuICBpZiAobmFtZS5pbmNsdWRlcygnXScpIHx8IG5hbWUuaW5jbHVkZXMoJ1snKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHRhYmxlIG5hbWUgJyR7bmFtZX0nOiBjYW5ub3QgY29udGFpbiBicmFja2V0cyBbIG9yIF0gKGJyYWNrZXQgZXNjYXBlIHZ1bG5lcmFiaWxpdHkpYCxcbiAgICApXG4gIH1cblxuICAvLyBCbG9jayBTUUwgY29tbWVudCBtYXJrZXJzIChkZWZlbnNlLWluLWRlcHRoIGV2ZW4gd2l0aCBicmFja2V0LXF1b3RpbmcpXG4gIGVuc3VyZURvZXNOb3RDb250YWluKFxuICAgIG5hbWUsXG4gICAgJy0tJyxcbiAgICBgSW52YWxpZCB0YWJsZSBuYW1lICcke25hbWV9JzogY2Fubm90IGNvbnRhaW4gLS0gKFNRTCBjb21tZW50IG1hcmtlcilgLFxuICApXG5cbiAgY29uc3QgeyB0YWJsZU5hbWUsIGhhc1NjaGVtYSB9ID0gZXh0cmFjdFRhYmxlTmFtZShuYW1lKVxuXG4gIC8vIEFsbG93IHdoaXRlbGlzdGVkIHN5c3RlbSB0YWJsZXMgKGUuZy4sIF9zeW5jU2NvcGUsIF9jb21tYW5kUXVldWUpXG4gIGlmIChpc1NxbGl0ZVN5c3RlbVRhYmxlKHRhYmxlTmFtZSkpIHtcbiAgICAvLyBTeXN0ZW0gdGFibGVzIGJ5cGFzcyBDb21tb25OYW1lTWl4ZWRSZWdleCB2YWxpZGF0aW9uIGJ1dCBzdGlsbCBnZXQgdHJhbnNmb3JtZWRcbiAgICBjb25zdCB0cmFuc2Zvcm1lZE5hbWUgPSBzYWZlVGFibGVOYW1lKG5hbWUpXG4gICAgaWYgKHRyYW5zZm9ybWVkTmFtZS5sZW5ndGggPiBNQVhfUE9TVF9FU0NBUEUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgdGFibGUgbmFtZSAnJHtuYW1lfSc6IGFmdGVyIHRyYW5zZm9ybWF0aW9uIGJlY29tZXMgJyR7dHJhbnNmb3JtZWROYW1lfScgKCR7U3RyaW5nKHRyYW5zZm9ybWVkTmFtZS5sZW5ndGgpfSBjaGFycywgbWF4ICR7U3RyaW5nKE1BWF9QT1NUX0VTQ0FQRSl9KWAsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lZE5hbWVcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRhYmxlIG5hbWUgbWF0Y2hlcyBDb21tb25OYW1lTWl4ZWRSZWdleFxuICAvLyAoMi01MCBjaGFycywgYWxwaGFudW1lcmljL2h5cGhlbnMvdW5kZXJzY29yZXMsIHN0YXJ0cy9lbmRzIHdpdGggbGV0dGVyIG9yIG51bWJlcilcbiAgaWYgKCFDb21tb25OYW1lTWl4ZWRSZWdleC50ZXN0KHRhYmxlTmFtZSkpIHtcbiAgICBjb25zdCBwYXJ0ID0gaGFzU2NoZW1hID8gYHRhYmxlIHBhcnQgJyR7dGFibGVOYW1lfSdgIDogYG5hbWVgXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgdGFibGUgbmFtZSAnJHtuYW1lfSc6ICR7cGFydH0gbXVzdCBiZSAyLTUwIGNoYXJhY3RlcnMsIHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGNvbnRhaW4gb25seSBsZXR0ZXJzL251bWJlcnMvaHlwaGVucy91bmRlcnNjb3JlcywgYW5kIGVuZCB3aXRoIGEgbGV0dGVyIG9yIG51bWJlcmAsXG4gICAgKVxuICB9XG5cbiAgLy8gUE9TVC1UUkFOU0ZPUk1BVElPTiBWQUxJREFUSU9OOiBFbnN1cmUgdHJhbnNmb3JtZWQgbmFtZSBkb2Vzbid0IGV4Y2VlZCBsaW1pdFxuICAvLyBUcmFuc2Zvcm1hdGlvbiBleHBhbmRzIGNoYXJhY3RlcnM6IC8g4oaSIF9fanhfXyAoMSDihpIgNSBjaGFycyksIC0g4oaSIF9qeF8gKDEg4oaSIDQgY2hhcnMpXG4gIC8vIEV4YW1wbGU6ICdkZWZhdWx0L2Zvby1iYXInICgxNSBjaGFycykg4oaSICdkZWZhdWx0X19qeF9fZm9vX2p4X2JhcicgKDIzIGNoYXJzKVxuICAvLyBMaW1pdCBhY2NvdW50cyBmb3IgYnJhY2tldC1xdW90aW5nIFtuYW1lXSBhZGRlZCBkdXJpbmcgQ1JFQVRFIFRBQkxFXG4gIC8vIE1heDogNTggY2hhcnMgKGRlZmF1bHQvICsgNTAgY2hhciB0YWJsZSBuYW1lKSArIGV4cGFuc2lvbiArIDIgYnJhY2tldHNcbiAgY29uc3QgdHJhbnNmb3JtZWROYW1lID0gc2FmZVRhYmxlTmFtZShuYW1lKVxuICBpZiAodHJhbnNmb3JtZWROYW1lLmxlbmd0aCA+IE1BWF9QT1NUX0VTQ0FQRSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHRhYmxlIG5hbWUgJyR7bmFtZX0nOiBhZnRlciB0cmFuc2Zvcm1hdGlvbiBiZWNvbWVzICcke3RyYW5zZm9ybWVkTmFtZX0nICgke1N0cmluZyh0cmFuc2Zvcm1lZE5hbWUubGVuZ3RoKX0gY2hhcnMsIG1heCAke1N0cmluZyhNQVhfUE9TVF9FU0NBUEUpfSlgLFxuICAgIClcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1lZE5hbWVcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGFibGUgbmFtZSB0byBiZSBTUUxpdGUgcGFyc2VyLWNvbXBhdGlibGUuXG4gKiAtICcvJyAtPiAnX19qeF9fJyAoZS5nLiwgZGVmYXVsdC9leHBlbnNlcylcbiAqIC0gJy0nIC0+ICdfanhfJyAoZS5nLiwgZm9vLWJhcilcbiAqXG4gKiBJbnRlcm5hbCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB1c2VkIGJ5IHZhbGlkYXRlVGFibGVOYW1lKCkuXG4gKiBFeHRlcm5hbCBjYWxsZXJzIHNob3VsZCB1c2UgdmFsaWRhdGVUYWJsZU5hbWUoKSB3aGljaCB2YWxpZGF0ZXMgQU5EIHRyYW5zZm9ybXMuXG4gKlxuICogQHBhcmFtIHRhYmxlTmFtZSAtIE9yaWdpbmFsIHRhYmxlIG5hbWUgKGUuZy4sICdkZWZhdWx0L2V4cGVuc2VzJywgJ2Zvby1iYXInKVxuICogQHJldHVybnMgU2FmZSB0YWJsZSBuYW1lIGZvciBTUUxpdGUgKGUuZy4sICdkZWZhdWx0X19qeF9fZXhwZW5zZXMnLCAnZm9vX2p4X2JhcicpXG4gKlxuICogQGludGVybmFsIC0gQWNjZXNzIHZpYSBfX3Rlc3RPbmx5X18gZXhwb3J0IGZvciB0ZXN0aW5nXG4gKi9cbmZ1bmN0aW9uIHNhZmVUYWJsZU5hbWUodGFibGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBuZWVkc1RyYW5zZm9ybSA9IFRBQkxFX1RSQU5TRk9STUFUSU9OUy5zb21lKChbcGF0dGVybl0pID0+IHBhdHRlcm4udGVzdCh0YWJsZU5hbWUpKVxuICBpZiAoIW5lZWRzVHJhbnNmb3JtKSByZXR1cm4gdGFibGVOYW1lXG5cbiAgcmV0dXJuIFRBQkxFX1RSQU5TRk9STUFUSU9OUy5yZWR1Y2UoXG4gICAgKGN1cnJlbnQsIFtwYXR0ZXJuLCByZXBsYWNlbWVudF0pID0+IGN1cnJlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCksXG4gICAgdGFibGVOYW1lLFxuICApXG59XG5cbi8qKlxuICogVGVzdGluZy1vbmx5IGV4cG9ydHMgLSBub3QgcGFydCBvZiBwdWJsaWMgQVBJXG4gKiBBY2Nlc3MgaW50ZXJuYWwgZnVuY3Rpb25zIGZvciB1bml0IHRlc3RpbmcgdHJhbnNmb3JtYXRpb24gbG9naWNcbiAqL1xuZXhwb3J0IGNvbnN0IF9fdGVzdE9ubHlfXyA9IHtcbiAgc2FmZVRhYmxlTmFtZSxcbn0gYXMgY29uc3RcblxuLyoqXG4gKiBSZXBsYWNlIHF1ZXJ5IHBhcmFtZXRlcnMgKCRwYXJhbSBvciBAcGFyYW0pIHdpdGggJz8nIHBsYWNlaG9sZGVycyBmb3IgdmFsaWRhdGlvbi5cbiAqIFNRTGl0ZSdzIHBhcnNlciByZXF1aXJlcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHF1ZXJ5IHByZXBhcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBxdWVyeSAtIFNRTCBxdWVyeSB3aXRoIG5hbWVkIHBhcmFtZXRlcnNcbiAqIEByZXR1cm5zIFF1ZXJ5IHdpdGggcG9zaXRpb25hbCBwbGFjZWhvbGRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VQYXJhbWV0ZXJzKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBTUUxpdGUncyBwYXJzZXIgZG9lcyBub3Qgc3VwcG9ydCBuYW1lZCBwYXJhbWV0ZXJzIGxpa2UgJHBhcmFtIG9yIEBwYXJhbSBpbiB0aGUgc2FtZSB3YXkgYXMgb3RoZXIgZGF0YWJhc2VzLlxuICAvLyBUbyB2YWxpZGF0ZSB0aGUgcXVlcnkgc3ludGF4IHdpdGhvdXQgcHJvdmlkaW5nIHBhcmFtZXRlciB2YWx1ZXMsIHdlIHJlcGxhY2UgJHBhcmFtIGFuZCBAcGFyYW0gd2l0aCAnPycuXG4gIC8vIFRoaXMgZW5zdXJlcyBjb21wYXRpYmlsaXR5IHdpdGggU1FMaXRlJ3MgcGFyc2VyIGR1cmluZyBxdWVyeSB2YWxpZGF0aW9uLlxuICByZXR1cm4gcXVlcnkucmVwbGFjZSgvWyRAXShcXHcrKS9nLCAnPycpXG59XG5cbi8qKlxuICogUmVwbGFjZSB0YWJsZSBuYW1lcyBpbiBxdWVyeSB3aXRoIHNhZmUgbmFtZXMgZm9yIHZhbGlkYXRpb24uXG4gKlxuICogU2VjdXJpdHk6IEd1YXJkcyBhZ2FpbnN0IGVtcHR5IHN0cmluZyB3aGljaCB3b3VsZCBjYXVzZSByZWdleCB0byBtYXRjaCBlbnRpcmUgcXVlcnkuXG4gKlxuICogQHBhcmFtIHF1ZXJ5IC0gT3JpZ2luYWwgU1FMIHF1ZXJ5XG4gKiBAcGFyYW0gb3JpZ2luYWxOYW1lIC0gT3JpZ2luYWwgdGFibGUgbmFtZVxuICogQHBhcmFtIHNhZmVOYW1lIC0gU2FmZSB0YWJsZSBuYW1lXG4gKiBAcmV0dXJucyBRdWVyeSB3aXRoIHJlcGxhY2VkIHRhYmxlIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFibGVOYW1lKHF1ZXJ5OiBzdHJpbmcsIG9yaWdpbmFsTmFtZTogc3RyaW5nLCBzYWZlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gR3VhcmQgYWdhaW5zdCBlbXB0eSBpbnB1dHMgd2hpY2ggd291bGQgY2F1c2UgcmVnZXggaXNzdWVzXG4gIGlmICghcXVlcnkgfHwgIW9yaWdpbmFsTmFtZSB8fCAhc2FmZU5hbWUgfHwgb3JpZ2luYWxOYW1lID09PSBzYWZlTmFtZSkge1xuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgb3JpZ2luYWxOYW1lIGlzIGFscmVhZHkgYnJhY2tldGVkIChlLmcuLCBbcGFja2FnZV0uW3RhYmxlXSlcbiAgLy8gRm9yIHRoZXNlLCBkbyBhIGRpcmVjdCByZXBsYWNlbWVudCB3aXRob3V0IGFkZGluZyBtb3JlIGJyYWNrZXRzXG4gIGlmIChvcmlnaW5hbE5hbWUuc3RhcnRzV2l0aCgnWycpICYmIG9yaWdpbmFsTmFtZS5lbmRzV2l0aCgnXScpKSB7XG4gICAgY29uc3QgZXNjYXBlZE5hbWUgPSBlc2NhcGVSZWdFeHAob3JpZ2luYWxOYW1lKVxuICAgIHJldHVybiBxdWVyeS5yZXBsYWNlKG5ldyBSZWdFeHAoZXNjYXBlZE5hbWUsICdnJyksIGBbJHtzYWZlTmFtZX1dYClcbiAgfVxuXG4gIC8vIEVzY2FwZSBzcGVjaWFsIHJlZ2V4IGNoYXJhY3RlcnMgaW4gdGFibGUgbmFtZVxuICBjb25zdCBlc2NhcGVkTmFtZSA9IGVzY2FwZVJlZ0V4cChvcmlnaW5hbE5hbWUpXG5cbiAgLy8gUmVwbGFjZSB1bnF1b3RlZCB0YWJsZS1uYW1lIHdpdGggc2FmZS1uYW1lICh1c2luZyB3b3JkIGJvdW5kYXJpZXMpXG4gIHJldHVybiAoXG4gICAgcXVlcnlcbiAgICAgIC8vIFJlcGxhY2UgW3RhYmxlLW5hbWVdIHdpdGggW3NhZmUtbmFtZV0gKGZvciBTUUwtZXNjYXBlZCBuYW1lcylcbiAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFxbJHtlc2NhcGVkTmFtZX1cXFxcXWAsICdnJyksIGBbJHtzYWZlTmFtZX1dYClcbiAgICAgIC8vIFJlcGxhY2UgdW5xdW90ZWQgdGFibGUtbmFtZSB3aXRoIHNhZmUtbmFtZSAodXNpbmcgd29yZCBib3VuZGFyaWVzKVxuICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXGIke2VzY2FwZWROYW1lfVxcXFxiYCwgJ2cnKSwgc2FmZU5hbWUpXG4gIClcbn1cblxuLyoqXG4gKiBDcmVhdGUgaW4tbWVtb3J5IFNRTGl0ZSBkYXRhYmFzZSB3aXRoIHRhYmxlcyBmb3IgdmFsaWRhdGlvbi5cbiAqIENyZWF0ZXMgdGFibGVzIHdpdGggc3RhbmRhcmQgSmlneCBzY2hlbWEgKGlkLCBkYXRhKSBwbHVzIG9wdGlvbmFsIGFkZGl0aW9uYWwgY29sdW1ucy5cbiAqXG4gKiBAcGFyYW0gdGFibGVOYW1lcyAtIEFycmF5IG9mIHRhYmxlIG5hbWVzIHRvIGNyZWF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBTY2hlbWEgb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMuYWRkaXRpb25hbENvbHVtbnMgLSBBZGRpdGlvbmFsIGNvbHVtbiBuYW1lcyB0byBpbmNsdWRlIChhbGwgY3JlYXRlZCBhcyBURVhUKVxuICogQHJldHVybnMgRGF0YWJhc2UgaW5zdGFuY2Ugd2l0aCB0YWJsZSBpbmZvIG1hcCAoY2FsbGVyIG11c3QgY2xvc2UgaXQpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFNpbmdsZSB0YWJsZVxuICogY29uc3QgeyBkYiwgdGFibGVzIH0gPSBjcmVhdGVWYWxpZGF0aW9uRGF0YWJhc2UoWyd1c2VycyddKVxuICogdGFibGVzLmdldCgndXNlcnMnKSAvLyB7IHNhZmVOYW1lOiAndXNlcnMnLCBub3JtYWxpemVkTmFtZTogJ3VzZXJzJyB9XG4gKlxuICogLy8gTXVsdGlwbGUgdGFibGVzXG4gKiBjb25zdCB7IGRiLCB0YWJsZXMgfSA9IGNyZWF0ZVZhbGlkYXRpb25EYXRhYmFzZShbJ3VzZXJzJywgJ2RlZmF1bHQvb3JkZXJzJ10pXG4gKiB0YWJsZXMuZ2V0KCdkZWZhdWx0L29yZGVycycpIC8vIHsgc2FmZU5hbWU6ICdkZWZhdWx0X19qeF9fb3JkZXJzJywgbm9ybWFsaXplZE5hbWU6ICdkZWZhdWx0L29yZGVycycgfVxuICpcbiAqIC8vIFdpdGggYWRkaXRpb25hbCBjb2x1bW5zXG4gKiBjb25zdCB7IGRiLCB0YWJsZXMgfSA9IGNyZWF0ZVZhbGlkYXRpb25EYXRhYmFzZShbJ2l0ZW1zJ10sIHtcbiAqICAgYWRkaXRpb25hbENvbHVtbnM6IFsnbmFtZScsICd2YWx1ZScsICdsYWJlbCcsICdpY29uJ11cbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZhbGlkYXRpb25EYXRhYmFzZShcbiAgdGFibGVOYW1lczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IHtcbiAgICBhZGRpdGlvbmFsQ29sdW1ucz86IHN0cmluZ1tdXG4gIH0gPSB7fSxcbik6IE11bHRpVGFibGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgY29uc3QgZGIgPSBuZXcgRGF0YWJhc2UoJzptZW1vcnk6JylcbiAgY29uc3QgeyBhZGRpdGlvbmFsQ29sdW1ucyA9IFtdIH0gPSBvcHRpb25zXG4gIGNvbnN0IGNvbHVtbnMgPSBidWlsZENvbHVtbkRlZmluaXRpb25zKGFkZGl0aW9uYWxDb2x1bW5zKVxuICBjb25zdCB0YWJsZXMgPSBuZXcgTWFwPHN0cmluZywgeyByZWFkb25seSBzYWZlTmFtZTogc3RyaW5nOyByZWFkb25seSBub3JtYWxpemVkTmFtZTogc3RyaW5nIH0+KClcblxuICBmb3IgKGNvbnN0IHRhYmxlTmFtZSBvZiB0YWJsZU5hbWVzKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGV4dGVybmFsIHBhY2thZ2UgZm9ybWF0OiBbcGFja2FnZV0uW3RhYmxlXVxuICAgIGNvbnN0IHBhY2thZ2VNYXRjaCA9IEVYVEVSTkFMX1BBQ0tBR0VfVEFCTEVfUEFUVEVSTi5leGVjKHRhYmxlTmFtZSlcbiAgICBpZiAocGFja2FnZU1hdGNoKSB7XG4gICAgICAvLyBFeHRlcm5hbCBwYWNrYWdlIHRhYmxlIC0gY3JlYXRlIHdpdGggcGFja2FnZV90YWJsZSBmb3JtYXQgZm9yIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IFssIHBhY2thZ2VOYW1lLCBlbnRpdHlOYW1lXSA9IHBhY2thZ2VNYXRjaFxuICAgICAgY29uc3Qgc2FmZU5hbWUgPSBgJHtwYWNrYWdlTmFtZS5yZXBsYWNlKC8tL2csICdfJyl9XyR7ZW50aXR5TmFtZX1gXG4gICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGJyYWNrZXRlZCBmb3JtYXQgYXMgbm9ybWFsaXplZE5hbWUgZm9yIHF1ZXJ5IHJlcGxhY2VtZW50XG4gICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRhYmxlTmFtZVxuXG4gICAgICBkYi5leGVjKGBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBbJHtzYWZlTmFtZX1dICgke2NvbHVtbnMuam9pbignLCAnKX0pYClcbiAgICAgIHRhYmxlcy5zZXQodGFibGVOYW1lLCB7IHNhZmVOYW1lLCBub3JtYWxpemVkTmFtZSB9KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHN0cmlwV3JhcHBpbmdCcmFja2V0cyh0YWJsZU5hbWUpXG5cbiAgICAvLyBTeXN0ZW0gdGFibGVzIGJ5cGFzcyBuYW1lIHZhbGlkYXRpb24gYW5kIHVzZSBwbGF0Zm9ybSBzY2hlbWFzXG4gICAgaWYgKGlzU3FsaXRlU3lzdGVtVGFibGUobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IG5vcm1hbGl6ZWROYW1lIC8vIFN5c3RlbSB0YWJsZXMgZG9uJ3QgbmVlZCB0cmFuc2Zvcm1hdGlvblxuICAgICAgY29uc3Qgc2NoZW1hID0gU1lTVEVNX1RBQkxFX1NDSEVNQVNbbm9ybWFsaXplZE5hbWVdXG4gICAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN5c3RlbSB0YWJsZSAnJHtub3JtYWxpemVkTmFtZX0nIGlzIHdoaXRlbGlzdGVkIGJ1dCBtaXNzaW5nIHNjaGVtYSBkZWZpbml0aW9uLiBgICtcbiAgICAgICAgICAgIGBBZGQgc2NoZW1hIHRvIFNZU1RFTV9UQUJMRV9TQ0hFTUFTIChzb3VyY2U6IGppZ3gvcGFja2FnZXMvZGF0YXN0b3JlL3NyYy9kYXRhYmFzZS9taWdyYXRpb25zL3NvbHV0aW9uLylgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBkYi5leGVjKGBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBbJHtzYWZlTmFtZX1dICgke3NjaGVtYX0pYClcbiAgICAgIHRhYmxlcy5zZXQodGFibGVOYW1lLCB7IHNhZmVOYW1lLCBub3JtYWxpemVkTmFtZSB9KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBzYWZlTmFtZSA9IHZhbGlkYXRlVGFibGVOYW1lKG5vcm1hbGl6ZWROYW1lKVxuXG4gICAgZGIuZXhlYyhgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgWyR7c2FmZU5hbWV9XSAoJHtjb2x1bW5zLmpvaW4oJywgJyl9KWApXG5cbiAgICAvLyBTdG9yZSBtYXBwaW5nIHdpdGggb3JpZ2luYWwgdGFibGUgbmFtZSBhcyBrZXlcbiAgICB0YWJsZXMuc2V0KHRhYmxlTmFtZSwgeyBzYWZlTmFtZSwgbm9ybWFsaXplZE5hbWUgfSlcbiAgfVxuXG4gIHJldHVybiB7IGRiLCB0YWJsZXMgfVxufVxuXG4vKipcbiAqIFN0cmlwIFNRTCBjb21tZW50cyBmcm9tIHF1ZXJ5IHRvIHByZXZlbnQgY29tbWVudC1iYXNlZCBieXBhc3Nlcy5cbiAqIFJlbW92ZXMgYm90aCBsaW5lIGNvbW1lbnRzICgtLSkgYW5kIGJsb2NrIGNvbW1lbnRzIChzbGFzaC1zdGFyIG5vdGF0aW9uKS5cbiAqXG4gKiBAcGFyYW0gcXVlcnkgLSBTUUwgcXVlcnkgd2l0aCBwb3RlbnRpYWwgY29tbWVudHNcbiAqIEByZXR1cm5zIFF1ZXJ5IHdpdGggY29tbWVudHMgcmVtb3ZlZFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBzdHJpcFNxbENvbW1lbnRzKCcvKiBjb21tZW50ICpcXC8gU0VMRUNUICogRlJPTSB1c2VycycpXG4gKiAvLyBSZXR1cm5zOiAnIFNFTEVDVCAqIEZST00gdXNlcnMnXG4gKlxuICogc3RyaXBTcWxDb21tZW50cygnLS0gY29tbWVudFxcblNFTEVDVCAqIEZST00gdXNlcnMnKVxuICogLy8gUmV0dXJuczogJ1xcblNFTEVDVCAqIEZST00gdXNlcnMnXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwU3FsQ29tbWVudHMocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBxdWVyeS5yZXBsYWNlKEJMT0NLX0NPTU1FTlRfUkVHRVgsICcgJykucmVwbGFjZShMSU5FX0NPTU1FTlRfUkVHRVgsICcgJylcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBTUUwgU0VMRUNUIHF1ZXJ5IHN5bnRheCBhbmQgcmV0dXJuIHByZXBhcmVkIHN0YXRlbWVudC5cbiAqIFRocm93cyBlcnJvciBpZiBxdWVyeSBpcyBpbnZhbGlkIG9yIG5vdCBhIFNFTEVDVC5cbiAqXG4gKiBTZWN1cml0eTogQmxvY2tzIFBSQUdNQSBjb21tYW5kcyBhbmQgbm9uLVNFTEVDVCBzdGF0ZW1lbnRzIHRvIHByZXZlbnRcbiAqIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmUgYW5kIHVuYXV0aG9yaXplZCBkYXRhYmFzZSBvcGVyYXRpb25zLlxuICogU3RyaXBzIGNvbW1lbnRzIGJlZm9yZSBjaGVja2luZyB0byBwcmV2ZW50IGNvbW1lbnQtYmFzZWQgYnlwYXNzZXMuXG4gKlxuICogQHBhcmFtIGRiIC0gU1FMaXRlIGRhdGFiYXNlIGluc3RhbmNlXG4gKiBAcGFyYW0gcXVlcnkgLSBTUUwgcXVlcnkgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIFByZXBhcmVkIHN0YXRlbWVudFxuICogQHRocm93cyBFcnJvciBpZiBxdWVyeSBpcyBpbnZhbGlkLCBub3QgU0VMRUNULCBvciBpcyBQUkFHTUFcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdmFsaWRhdGVTZWxlY3RRdWVyeShkYiwgJ1NFTEVDVCAqIEZST00gdXNlcnMnKSAgICAgICAgICAgLy8g4pyFIEFsbG93ZWRcbiAqIHZhbGlkYXRlU2VsZWN0UXVlcnkoZGIsICdTRUxFQ1QgKiBGUk9NIHVzZXJzIFdIRVJFIGlkPTEnKSAvLyDinIUgQWxsb3dlZFxuICogdmFsaWRhdGVTZWxlY3RRdWVyeShkYiwgJ0lOU0VSVCBJTlRPIHVzZXJzIC4uLicpICAgICAgICAgIC8vIOKdjCBUaHJvd3NcbiAqIHZhbGlkYXRlU2VsZWN0UXVlcnkoZGIsICdQUkFHTUEgdGFibGVfaW5mbyh1c2VycyknKSAgICAgICAvLyDinYwgVGhyb3dzIChpbmZvIGRpc2Nsb3N1cmUpXG4gKiB2YWxpZGF0ZVNlbGVjdFF1ZXJ5KGRiLCAnLyogY29tbWVudCAqXFwvIFBSQUdNQSAuLi4nKSAgICAgIC8vIOKdjCBUaHJvd3MgKGNvbW1lbnQgc3RyaXBwZWQgZmlyc3QpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VsZWN0UXVlcnkoZGI6IERhdGFiYXNlLkRhdGFiYXNlLCBxdWVyeTogc3RyaW5nKTogRGF0YWJhc2UuU3RhdGVtZW50IHtcbiAgLy8gVHJpbSBhbmQgbm9ybWFsaXplIHdoaXRlc3BhY2UgZm9yIGNoZWNraW5nXG4gIGNvbnN0IHRyaW1tZWQgPSBxdWVyeS50cmltKClcblxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IGNhbm5vdCBiZSBlbXB0eScpXG4gIH1cblxuICAvLyBTdHJpcCBjb21tZW50cyBiZWZvcmUgY2hlY2tpbmcgZm9yIFBSQUdNQSB0byBwcmV2ZW50IGNvbW1lbnQtYmFzZWQgYnlwYXNzZXNcbiAgLy8gRXhhbXBsZXMgb2YgYnlwYXNzZXM6IC8qIGNvbW1lbnQgKi8gUFJBR01BLCAtLSBjb21tZW50XFxuUFJBR01BXG4gIGNvbnN0IG5vQ29tbWVudHMgPSBzdHJpcFNxbENvbW1lbnRzKHRyaW1tZWQpLnRyaW0oKVxuXG4gIC8vIEJsb2NrIFBSQUdNQSBjb21tYW5kcyBleHBsaWNpdGx5ICh0aGV5IGFyZSBtYXJrZWQgYXMgXCJyZWFkZXJcIiBidXQgZXhwb3NlIHN5c3RlbSBpbmZvKVxuICAvLyBQUkFHTUEgY2FuIGxlYWsgZGF0YWJhc2Ugc2NoZW1hLCB0YWJsZSBzdHJ1Y3R1cmUsIGFuZCBjb25maWd1cmF0aW9uXG4gIC8vIEV4YW1wbGVzOiBQUkFHTUEgdGFibGVfaW5mbygpLCBQUkFHTUEgZGF0YWJhc2VfbGlzdCwgUFJBR01BIHNjaGVtYS50YWJsZV9pbmZvKClcbiAgY29uc3QgdXBwZXJRdWVyeSA9IG5vQ29tbWVudHMudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXJRdWVyeS5zdGFydHNXaXRoKCdQUkFHTUEnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUFJBR01BIGNvbW1hbmRzIGFyZSBub3QgYWxsb3dlZCBpbiBkYXRhc291cmNlcycpXG4gIH1cblxuICAvLyBWYWxpZGF0ZSBxdWVyeSBzeW50YXggd2l0aG91dCBleGVjdXRpbmcgLSBqdXN0IHByZXBhcmUgdGhlIHN0YXRlbWVudFxuICAvLyBVc2VzIFNRTGl0ZSdzIGhhcmRlbmVkIHBhcnNlciAoYmF0dGxlLXRlc3RlZCBvdmVyIGRlY2FkZXMpIHRvIHZhbGlkYXRlIHN5bnRheFxuICAvLyBUaGlzIGNoZWNrcyBTUUwgc3ludGF4IHdpdGhvdXQgbmVlZGluZyBwYXJhbWV0ZXIgdmFsdWVzXG4gIGNvbnN0IHN0bXQgPSBkYi5wcmVwYXJlKHF1ZXJ5KVxuXG4gIC8vIEVuc3VyZSBpdCdzIGEgU0VMRUNUIHF1ZXJ5IChyZWFkZXIgPSB0cnVlIG1lYW5zIHJlYWQtb25seSlcbiAgLy8gTm90ZTogUFJBR01BIGlzIGFsc28gbWFya2VkIGFzIHJlYWRlciwgaGVuY2UgdGhlIGV4cGxpY2l0IGNoZWNrIGFib3ZlXG4gIGlmICghc3RtdC5yZWFkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgU0VMRUNUIHF1ZXJpZXMgYXJlIGFsbG93ZWQgaW4gZGF0YXNvdXJjZXMnKVxuICB9XG5cbiAgcmV0dXJuIHN0bXRcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGNvbHVtbiBuYW1lcyBmcm9tIHByZXBhcmVkIHN0YXRlbWVudC5cbiAqXG4gKiBAcGFyYW0gc3RtdCAtIFByZXBhcmVkIFNRTGl0ZSBzdGF0ZW1lbnRcbiAqIEByZXR1cm5zIEFycmF5IG9mIGxvd2VyY2FzZSBjb2x1bW4gbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDb2x1bW5zKHN0bXQ6IERhdGFiYXNlLlN0YXRlbWVudCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHN0bXQuY29sdW1ucygpLm1hcCgoY29sKSA9PiBjb2wubmFtZS50b0xvd2VyQ2FzZSgpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgcXVlcnkgcmV0dXJucyByZXF1aXJlZCBjb2x1bW5zLlxuICpcbiAqIEBwYXJhbSBjb2x1bW5zIC0gQ29sdW1uIG5hbWVzIGZyb20gcXVlcnkgKGxvd2VyY2FzZSlcbiAqIEBwYXJhbSByZXF1aXJlZENvbHVtbnMgLSBSZXF1aXJlZCBjb2x1bW4gbmFtZXMgKGxvd2VyY2FzZSlcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHZhbGlkYXRpb24gcmVzdWx0IGFuZCBtaXNzaW5nIGNvbHVtbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVmFsaWRhdGUgZHJvcGRvd24gY29sdW1uc1xuICogY29uc3QgcmVzdWx0ID0gdmFsaWRhdGVSZXF1aXJlZENvbHVtbnMoY29sdW1ucywgWyd2YWx1ZScsICdsYWJlbCddKVxuICpcbiAqIC8vIFZhbGlkYXRlIGN1c3RvbSBjb2x1bW5zXG4gKiBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZVJlcXVpcmVkQ29sdW1ucyhjb2x1bW5zLCBbJ2lkJywgJ25hbWUnLCAnZW1haWwnXSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSZXF1aXJlZENvbHVtbnMoXG4gIGNvbHVtbnM6IHN0cmluZ1tdLFxuICByZXF1aXJlZENvbHVtbnM6IHN0cmluZ1tdLFxuKToge1xuICBpc1ZhbGlkOiBib29sZWFuXG4gIG1pc3Npbmc6IHN0cmluZ1tdXG59IHtcbiAgY29uc3QgY29sdW1uU2V0ID0gbmV3IFNldChjb2x1bW5zKVxuICBjb25zdCBtaXNzaW5nID0gcmVxdWlyZWRDb2x1bW5zLmZpbHRlcigocmVxdWlyZWQpID0+ICFjb2x1bW5TZXQuaGFzKHJlcXVpcmVkKSlcblxuICByZXR1cm4ge1xuICAgIGlzVmFsaWQ6IG1pc3NpbmcubGVuZ3RoID09PSAwLFxuICAgIG1pc3NpbmcsXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzT3V0ZXJXaGl0ZXNwYWNlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlLnRyaW0oKSAhPT0gdmFsdWVcbn1cblxuZnVuY3Rpb24gZW5zdXJlRG9lc05vdENvbnRhaW4odmFsdWU6IHN0cmluZywgdG9rZW46IHN0cmluZywgZXJyb3JNZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKHRva2VuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gIH1cbn1cblxuZnVuY3Rpb24gZW5zdXJlRG9lc05vdENvbnRhaW5BbnkodmFsdWU6IHN0cmluZywgdG9rZW5zOiBzdHJpbmdbXSwgZXJyb3JNZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHRva2Vucy5zb21lKCh0b2tlbikgPT4gdmFsdWUuaW5jbHVkZXModG9rZW4pKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRhYmxlTmFtZShuYW1lOiBzdHJpbmcpOiB7IHRhYmxlTmFtZTogc3RyaW5nOyBoYXNTY2hlbWE6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdChTQ0hFTUFfU0VQQVJBVE9SKVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4geyB0YWJsZU5hbWU6IG5hbWUsIGhhc1NjaGVtYTogZmFsc2UgfVxuICB9XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IFtzY2hlbWEsIHRhYmxlXSA9IHBhcnRzXG5cbiAgICBpZiAoc2NoZW1hICE9PSBERUZBVUxUX1NDSEVNQSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCB0YWJsZSBuYW1lICcke25hbWV9Jzogc2NoZW1hIG11c3QgYmUgJyR7REVGQVVMVF9TQ0hFTUF9JywgZ290ICcke3NjaGVtYX0nYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4geyB0YWJsZU5hbWU6IHRhYmxlLCBoYXNTY2hlbWE6IHRydWUgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhYmxlIG5hbWUgJyR7bmFtZX0nOiBjYW5ub3QgY29udGFpbiBtdWx0aXBsZSAnLycgc2VwYXJhdG9yc2ApXG59XG5cbmZ1bmN0aW9uIHN0cmlwV3JhcHBpbmdCcmFja2V0cyhuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKCdbJykgJiYgbmFtZS5lbmRzV2l0aCgnXScpID8gbmFtZS5zbGljZSgxLCAtMSkgOiBuYW1lXG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29sdW1uRGVmaW5pdGlvbnMoYWRkaXRpb25hbENvbHVtbnM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCB1bmlxdWVDb2x1bW5zID0gQXJyYXkuZnJvbShuZXcgU2V0KGFkZGl0aW9uYWxDb2x1bW5zKSkuZmlsdGVyKFxuICAgIChjb2x1bW4pID0+ICFSRVNFUlZFRF9DT0xVTU5TLmhhcyhjb2x1bW4pLFxuICApXG5cbiAgY29uc3QgdmFsaWRhdGVkQ29sdW1ucyA9IHVuaXF1ZUNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICB2YWxpZGF0ZUNvbHVtbk5hbWUoY29sdW1uKVxuICAgIHJldHVybiBgWyR7Y29sdW1ufV0gVEVYVGBcbiAgfSlcblxuICByZXR1cm4gWydpZCBURVhUIFBSSU1BUlkgS0VZJywgJ2RhdGEgVEVYVCcsICdmaWxlIFRFWFQnLCAuLi52YWxpZGF0ZWRDb2x1bW5zXVxufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpXG59XG4iXX0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-validator.d.ts","sourceRoot":"","sources":["../../src/datasource/sqlite-validator.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAkGrC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7F;AA8BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAmDrD;AAsCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0DtD;AAeD,iBAAS,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQhD;AAMD,eAAO,MAAM,YAAY;;CAEf,CAAA;AASV,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKvD;AAYD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwB9F;AA2BD,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,GAAE;IACP,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB,GACL,0BAA0B,CA+C5B;AAkBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAwBD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAgC5F;AAQD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,GAAG,MAAM,EAAE,CAEjE;AAkBD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EAAE,EACjB,eAAe,EAAE,MAAM,EAAE,GACxB;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAQA","sourcesContent":["import Database from 'better-sqlite3'\nimport {\n CommonNameMixedRegex,\n isSqliteSystemTable,\n type SystemSqliteTableName,\n} from '../abstract/zod.types.js'\n\n/**\n * SQLite Security Validation Utilities\n *\n * This module leverages SQLite's built-in security features for validation:\n *\n * 1. **SQLite's Hardened Parser** (db.prepare())\n * - Battle-tested SQL parser used by millions of applications\n * - Validates query syntax without execution\n * - Reference: https://sqlite.org/lang.html, https://sqlite.org/security.html\n *\n * 2. **better-sqlite3 Multiple Statement Protection**\n * - Prepared statements (db.prepare) block multiple SQL statements\n * - Prevents injection via statement chaining: `'; DROP TABLE users; --`\n * - Throws RangeError if multiple statements detected\n *\n * 3. **SQLite Bracket-Quoting** ([identifier])\n * - Safe identifier quoting mechanism built into SQLite\n * - Protects against reserved keywords and special characters\n * - Supports escape via ]] for literal ] character\n *\n * 4. **SQLite Expression Limits** (SQLITE_LIMIT_EXPR_DEPTH = 1000)\n * - Built-in DoS protection against deeply nested expressions\n * - Reference: https://sqlite.org/limits.html\n *\n * 5. **Prepared Statement Parameter Binding**\n * - better-sqlite3 automatically escapes bound parameters\n * - Prevents injection by separating code from data\n *\n * Additional layers: Custom validation (validateTableName, validateColumnName)\n * provides allowlist-based identifier validation before using SQLite features.\n */\n\nconst COLUMN_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_ .-]{0,127}$/\nconst COLUMN_FORBIDDEN_CHARS = /['\"`;()\\\\]/\nconst DEFAULT_SCHEMA = 'default'\nconst SCHEMA_SEPARATOR = '/'\nconst MAX_POST_ESCAPE = 80\nconst RESERVED_COLUMNS = new Set(['id', 'data'])\nconst TABLE_TRANSFORMATIONS: Array<[RegExp, string]> = [\n [/\\//g, '__jx__'],\n [/-/g, '_jx_'],\n]\nconst BLOCK_COMMENT_REGEX = /\\/\\*[\\s\\S]*?\\*\\//g\nconst LINE_COMMENT_REGEX = /--[^\\n]*/g\n\n/**\n * Matches external package table format: [packageName].[tableName]\n *\n * Example: \"[myPackage].[myTable]\"\n * - Group 1: packageName (characters between first pair of brackets)\n * - Group 2: tableName (characters between second pair of brackets)\n */\nconst EXTERNAL_PACKAGE_TABLE_PATTERN = /^\\[([^\\]]+)\\]\\.\\[([^\\]]+)\\]$/\n\n/**\n * System table schemas from platform database migrations.\n * Source: jigx/packages/datastore/src/database/migrations/solution/\n *\n * These schemas are used to create accurate validation databases for system tables.\n */\nconst SYSTEM_TABLE_SCHEMAS: Record<SystemSqliteTableName, string> = {\n // Source: 003_sync_status_and_scope.sql.ts\n _syncScope: `\n [id] TEXT NOT NULL PRIMARY KEY,\n [timestamp] INTEGER,\n [state] TEXT,\n [notStarted] INTEGER DEFAULT(0),\n [syncing] INTEGER DEFAULT(0),\n [synced] INTEGER DEFAULT(0),\n [failed] INTEGER DEFAULT(0),\n [lastStartedAt] INTEGER NULL,\n [lastFailedAt] INTEGER NULL,\n [lastSyncedAt] INTEGER NULL,\n [details] TEXT NULL\n `,\n // Source: 001_initial.sql.ts\n _commandQueue: `\n [id] INTEGER NOT NULL PRIMARY KEY,\n [queue] TEXT NOT NULL,\n [type] TEXT NOT NULL,\n [payload] TEXT NULL,\n [state] TEXT NULL,\n [error] TEXT NULL,\n [retryCount] INTEGER NULL,\n [retryAfter] INTEGER NULL\n `,\n}\n\n/**\n * Return type for createValidationDatabase\n */\nexport interface MultiTableValidationResult {\n readonly db: Database.Database\n readonly tables: Map<string, { readonly safeName: string; readonly normalizedName: string }>\n}\n\n/**\n * Validate that a column name is a safe SQL identifier.\n * Prevents SQL injection by ensuring column names follow strict rules.\n *\n * Rules:\n * - Cannot be empty\n * - Must start with a letter (a-z, A-Z) or underscore\n * - Can contain printable ASCII: letters, numbers, underscore, hyphen, period, space\n * - Maximum 128 characters total (1 start character + up to 127 additional characters)\n * - Cannot contain dangerous sequences: --, /*, *\\/\n * - Cannot contain injection characters: quotes, semicolons, parentheses, backslashes\n * - SQL reserved keywords are allowed (will be automatically quoted with brackets)\n *\n * @param name - Column name to validate\n * @throws Error if column name is invalid or potentially dangerous\n *\n * @example\n * ```typescript\n * validateColumnName('user_id') // ✅ Valid\n * validateColumnName('First Name') // ✅ Valid (space allowed)\n * validateColumnName('created-at') // ✅ Valid (hyphen allowed)\n * validateColumnName('user.email') // ✅ Valid (period allowed)\n * validateColumnName('select') // ✅ Valid (keyword, will be quoted as [select])\n * validateColumnName('foo--bar') // ❌ Throws (-- is SQL comment marker)\n * validateColumnName('123abc') // ❌ Throws (starts with number)\n * validateColumnName('x; DROP') // ❌ Throws (contains semicolon)\n * ```\n */\nexport function validateColumnName(name: string): void {\n // Check for non-string values\n if (typeof name !== 'string') {\n throw new Error(`Column name must be a string, got: ${typeof name}`)\n }\n\n // Check for empty string\n if (name === '') {\n throw new Error('Column name must be a non-empty string')\n }\n\n // Reject leading/trailing whitespace\n if (hasOuterWhitespace(name)) {\n throw new Error(`Invalid column name '${name}': cannot have leading or trailing spaces`)\n }\n\n // Block non-ASCII characters (only printable ASCII allowed for security/compatibility)\n\n if (/[^\\x20-\\x7E]/.test(name)) {\n throw new Error(`Invalid column name '${name}': only ASCII characters are allowed`)\n }\n\n // Validate basic pattern: letter/underscore followed by safe characters, max 128 chars\n // Allows: letters, digits, underscore, hyphen, period, space\n if (!COLUMN_NAME_PATTERN.test(name)) {\n throw new Error(\n `Invalid column name: must start with letter or underscore, contain only letters/numbers/spaces/hyphens/periods/underscores, max 128 chars`,\n )\n }\n\n // Block SQL comment markers (even though we bracket-quote, defense-in-depth)\n ensureDoesNotContain(\n name,\n '--',\n `Invalid column name '${name}': cannot contain -- (SQL comment marker)`,\n )\n ensureDoesNotContainAny(\n name,\n ['/*', '*/'],\n `Invalid column name '${name}': cannot contain /* or */ (SQL comment markers)`,\n )\n\n // Block SQL injection characters\n if (COLUMN_FORBIDDEN_CHARS.test(name)) {\n throw new Error(\n `Invalid column name '${name}': cannot contain quotes (', \", \\`), semicolons, parentheses, or backslashes`,\n )\n }\n\n // Note: SQL reserved keywords (SELECT, WHERE, etc.) pass validation\n // They are automatically quoted with brackets [keyword] during table creation\n}\n\n/**\n * Validate that a table name is a safe SQL identifier.\n * Prevents SQL injection by ensuring table names follow strict rules.\n * Validated names are used with SQLite's bracket-quoting syntax [name] for safe handling.\n *\n * IMPORTANT: This validates STRUCTURAL/META identifiers (table names), NOT data identifiers.\n * Data row identifiers (RID) use separate validation with 64-char limit for payload data.\n *\n * Validation occurs at TWO stages:\n * 1. PRE-TRANSFORMATION: Input validation (structural correctness)\n * 2. POST-TRANSFORMATION: After escaping (/ → __jx__, - → _jx_) to ensure SQLite compatibility\n *\n * Rules (pre-transformation):\n * - Must start with a letter (a-z, A-Z)\n * - Can contain letters, numbers, underscores, forward slashes, hyphens\n * - Maximum 58 characters (default/ prefix 8 chars + table name 50 chars)\n * - Cannot contain brackets ] which could escape bracket-quoting\n * - Cannot be empty\n *\n * Rules (post-transformation):\n * - Transformed name must not exceed 80 characters\n * - Prevents SQLite identifier overflow after escaping\n *\n * @param name - Table name to validate\n * @returns Safe table name for SQLite (e.g., 'default__jx__expenses', 'foo_jx_bar')\n * @throws Error if table name is invalid or potentially dangerous\n *\n * @example\n * ```typescript\n * const safe = validateTableName('users') // Returns 'users'\n * const safe = validateTableName('default/orders') // Returns 'default__jx__orders'\n * const safe = validateTableName('foo-bar') // Returns 'foo_jx_bar'\n * validateTableName('test] DROP') // Throws (bracket escape)\n * validateTableName('123abc') // Throws (starts with number)\n * ```\n */\nexport function validateTableName(name: string): string {\n // Check for empty or non-string values\n if (!name || typeof name !== 'string') {\n throw new Error(`Table name must be a non-empty string, got: ${typeof name}`)\n }\n\n // Reject bracket characters that could escape SQLite's bracket-quoting\n // SQLite uses [name] for identifiers, and ] would close the bracket early\n // Allows us to safely use validated names in CREATE TABLE [${name}] statements\n if (name.includes(']') || name.includes('[')) {\n throw new Error(\n `Invalid table name '${name}': cannot contain brackets [ or ] (bracket escape vulnerability)`,\n )\n }\n\n // Block SQL comment markers (defense-in-depth even with bracket-quoting)\n ensureDoesNotContain(\n name,\n '--',\n `Invalid table name '${name}': cannot contain -- (SQL comment marker)`,\n )\n\n const { tableName, hasSchema } = extractTableName(name)\n\n // Allow whitelisted system tables (e.g., _syncScope, _commandQueue)\n if (isSqliteSystemTable(tableName)) {\n // System tables bypass CommonNameMixedRegex validation but still get transformed\n const transformedName = safeTableName(name)\n if (transformedName.length > MAX_POST_ESCAPE) {\n throw new Error(\n `Invalid table name '${name}': after transformation becomes '${transformedName}' (${String(transformedName.length)} chars, max ${String(MAX_POST_ESCAPE)})`,\n )\n }\n return transformedName\n }\n\n // Validate table name matches CommonNameMixedRegex\n // (2-50 chars, alphanumeric/hyphens/underscores, starts/ends with letter or number)\n if (!CommonNameMixedRegex.test(tableName)) {\n const part = hasSchema ? `table part '${tableName}'` : `name`\n throw new Error(\n `Invalid table name '${name}': ${part} must be 2-50 characters, start with a letter, contain only letters/numbers/hyphens/underscores, and end with a letter or number`,\n )\n }\n\n // POST-TRANSFORMATION VALIDATION: Ensure transformed name doesn't exceed limit\n // Transformation expands characters: / → __jx__ (1 → 5 chars), - → _jx_ (1 → 4 chars)\n // Example: 'default/foo-bar' (15 chars) → 'default__jx__foo_jx_bar' (23 chars)\n // Limit accounts for bracket-quoting [name] added during CREATE TABLE\n // Max: 58 chars (default/ + 50 char table name) + expansion + 2 brackets\n const transformedName = safeTableName(name)\n if (transformedName.length > MAX_POST_ESCAPE) {\n throw new Error(\n `Invalid table name '${name}': after transformation becomes '${transformedName}' (${String(transformedName.length)} chars, max ${String(MAX_POST_ESCAPE)})`,\n )\n }\n\n return transformedName\n}\n\n/**\n * Transform table name to be SQLite parser-compatible.\n * - '/' -> '__jx__' (e.g., default/expenses)\n * - '-' -> '_jx_' (e.g., foo-bar)\n *\n * Internal transformation function used by validateTableName().\n * External callers should use validateTableName() which validates AND transforms.\n *\n * @param tableName - Original table name (e.g., 'default/expenses', 'foo-bar')\n * @returns Safe table name for SQLite (e.g., 'default__jx__expenses', 'foo_jx_bar')\n *\n * @internal - Access via __testOnly__ export for testing\n */\nfunction safeTableName(tableName: string): string {\n const needsTransform = TABLE_TRANSFORMATIONS.some(([pattern]) => pattern.test(tableName))\n if (!needsTransform) return tableName\n\n return TABLE_TRANSFORMATIONS.reduce(\n (current, [pattern, replacement]) => current.replace(pattern, replacement),\n tableName,\n )\n}\n\n/**\n * Testing-only exports - not part of public API\n * Access internal functions for unit testing transformation logic\n */\nexport const __testOnly__ = {\n safeTableName,\n} as const\n\n/**\n * Replace query parameters ($param or @param) with '?' placeholders for validation.\n * SQLite's parser requires positional parameters for query preparation.\n *\n * @param query - SQL query with named parameters\n * @returns Query with positional placeholders\n */\nexport function replaceParameters(query: string): string {\n // SQLite's parser does not support named parameters like $param or @param in the same way as other databases.\n // To validate the query syntax without providing parameter values, we replace $param and @param with '?'.\n // This ensures compatibility with SQLite's parser during query validation.\n return query.replace(/[$@](\\w+)/g, '?')\n}\n\n/**\n * Replace table names in query with safe names for validation.\n *\n * Security: Guards against empty string which would cause regex to match entire query.\n *\n * @param query - Original SQL query\n * @param originalName - Original table name\n * @param safeName - Safe table name\n * @returns Query with replaced table names\n */\nexport function replaceTableName(query: string, originalName: string, safeName: string): string {\n // Guard against empty inputs which would cause regex issues\n if (!query || !originalName || !safeName || originalName === safeName) {\n return query\n }\n\n // Check if originalName is already bracketed (e.g., [package].[table])\n // For these, do a direct replacement without adding more brackets\n if (originalName.startsWith('[') && originalName.endsWith(']')) {\n const escapedName = escapeRegExp(originalName)\n return query.replace(new RegExp(escapedName, 'g'), `[${safeName}]`)\n }\n\n // Escape special regex characters in table name\n const escapedName = escapeRegExp(originalName)\n\n // Replace unquoted table-name with safe-name (using word boundaries)\n return (\n query\n // Replace [table-name] with [safe-name] (for SQL-escaped names)\n .replace(new RegExp(`\\\\[${escapedName}\\\\]`, 'g'), `[${safeName}]`)\n // Replace unquoted table-name with safe-name (using word boundaries)\n .replace(new RegExp(`\\\\b${escapedName}\\\\b`, 'g'), safeName)\n )\n}\n\n/**\n * Create in-memory SQLite database with tables for validation.\n * Creates tables with standard Jigx schema (id, data) plus optional additional columns.\n *\n * @param tableNames - Array of table names to create\n * @param options - Schema options\n * @param options.additionalColumns - Additional column names to include (all created as TEXT)\n * @returns Database instance with table info map (caller must close it)\n *\n * @example\n * ```typescript\n * // Single table\n * const { db, tables } = createValidationDatabase(['users'])\n * tables.get('users') // { safeName: 'users', normalizedName: 'users' }\n *\n * // Multiple tables\n * const { db, tables } = createValidationDatabase(['users', 'default/orders'])\n * tables.get('default/orders') // { safeName: 'default__jx__orders', normalizedName: 'default/orders' }\n *\n * // With additional columns\n * const { db, tables } = createValidationDatabase(['items'], {\n * additionalColumns: ['name', 'value', 'label', 'icon']\n * })\n * ```\n */\nexport function createValidationDatabase(\n tableNames: string[],\n options: {\n additionalColumns?: string[]\n } = {},\n): MultiTableValidationResult {\n const db = new Database(':memory:')\n const { additionalColumns = [] } = options\n const columns = buildColumnDefinitions(additionalColumns)\n const tables = new Map<string, { readonly safeName: string; readonly normalizedName: string }>()\n\n for (const tableName of tableNames) {\n // Check for external package format: [package].[table]\n const packageMatch = EXTERNAL_PACKAGE_TABLE_PATTERN.exec(tableName)\n if (packageMatch) {\n // External package table - create with package_table format for validation\n const [, packageName, entityName] = packageMatch\n const safeName = `${packageName.replace(/-/g, '_')}_${entityName}`\n // Use the original bracketed format as normalizedName for query replacement\n const normalizedName = tableName\n\n db.exec(`CREATE TABLE IF NOT EXISTS [${safeName}] (${columns.join(', ')})`)\n tables.set(tableName, { safeName, normalizedName })\n continue\n }\n\n const normalizedName = stripWrappingBrackets(tableName)\n\n // System tables bypass name validation and use platform schemas\n if (isSqliteSystemTable(normalizedName)) {\n const safeName = normalizedName // System tables don't need transformation\n const schema = SYSTEM_TABLE_SCHEMAS[normalizedName]\n if (!schema) {\n throw new Error(\n `System table '${normalizedName}' is whitelisted but missing schema definition. ` +\n `Add schema to SYSTEM_TABLE_SCHEMAS (source: jigx/packages/datastore/src/database/migrations/solution/)`,\n )\n }\n db.exec(`CREATE TABLE IF NOT EXISTS [${safeName}] (${schema})`)\n tables.set(tableName, { safeName, normalizedName })\n continue\n }\n\n const safeName = validateTableName(normalizedName)\n\n db.exec(`CREATE TABLE IF NOT EXISTS [${safeName}] (${columns.join(', ')})`)\n\n // Store mapping with original table name as key\n tables.set(tableName, { safeName, normalizedName })\n }\n\n return { db, tables }\n}\n\n/**\n * Strip SQL comments from query to prevent comment-based bypasses.\n * Removes both line comments (--) and block comments (slash-star notation).\n *\n * @param query - SQL query with potential comments\n * @returns Query with comments removed\n *\n * @example\n * ```typescript\n * stripSqlComments('/* comment *\\/ SELECT * FROM users')\n * // Returns: ' SELECT * FROM users'\n *\n * stripSqlComments('-- comment\\nSELECT * FROM users')\n * // Returns: '\\nSELECT * FROM users'\n * ```\n */\nexport function stripSqlComments(query: string): string {\n return query.replace(BLOCK_COMMENT_REGEX, ' ').replace(LINE_COMMENT_REGEX, ' ')\n}\n\n/**\n * Validate SQL SELECT query syntax and return prepared statement.\n * Throws error if query is invalid or not a SELECT.\n *\n * Security: Blocks PRAGMA commands and non-SELECT statements to prevent\n * information disclosure and unauthorized database operations.\n * Strips comments before checking to prevent comment-based bypasses.\n *\n * @param db - SQLite database instance\n * @param query - SQL query to validate\n * @returns Prepared statement\n * @throws Error if query is invalid, not SELECT, or is PRAGMA\n *\n * @example\n * ```typescript\n * validateSelectQuery(db, 'SELECT * FROM users') // ✅ Allowed\n * validateSelectQuery(db, 'SELECT * FROM users WHERE id=1') // ✅ Allowed\n * validateSelectQuery(db, 'INSERT INTO users ...') // ❌ Throws\n * validateSelectQuery(db, 'PRAGMA table_info(users)') // ❌ Throws (info disclosure)\n * validateSelectQuery(db, '/* comment *\\/ PRAGMA ...') // ❌ Throws (comment stripped first)\n * ```\n */\nexport function validateSelectQuery(db: Database.Database, query: string): Database.Statement {\n // Trim and normalize whitespace for checking\n const trimmed = query.trim()\n\n if (!trimmed) {\n throw new Error('Query cannot be empty')\n }\n\n // Strip comments before checking for PRAGMA to prevent comment-based bypasses\n // Examples of bypasses: /* comment */ PRAGMA, -- comment\\nPRAGMA\n const noComments = stripSqlComments(trimmed).trim()\n\n // Block PRAGMA commands explicitly (they are marked as \"reader\" but expose system info)\n // PRAGMA can leak database schema, table structure, and configuration\n // Examples: PRAGMA table_info(), PRAGMA database_list, PRAGMA schema.table_info()\n const upperQuery = noComments.toUpperCase()\n if (upperQuery.startsWith('PRAGMA')) {\n throw new Error('PRAGMA commands are not allowed in datasources')\n }\n\n // Validate query syntax without executing - just prepare the statement\n // Uses SQLite's hardened parser (battle-tested over decades) to validate syntax\n // This checks SQL syntax without needing parameter values\n const stmt = db.prepare(query)\n\n // Ensure it's a SELECT query (reader = true means read-only)\n // Note: PRAGMA is also marked as reader, hence the explicit check above\n if (!stmt.reader) {\n throw new Error('Only SELECT queries are allowed in datasources')\n }\n\n return stmt\n}\n\n/**\n * Extract column names from prepared statement.\n *\n * @param stmt - Prepared SQLite statement\n * @returns Array of lowercase column names\n */\nexport function extractColumns(stmt: Database.Statement): string[] {\n return stmt.columns().map((col) => col.name.toLowerCase())\n}\n\n/**\n * Validate that query returns required columns.\n *\n * @param columns - Column names from query (lowercase)\n * @param requiredColumns - Required column names (lowercase)\n * @returns Object with validation result and missing columns\n *\n * @example\n * ```typescript\n * // Validate dropdown columns\n * const result = validateRequiredColumns(columns, ['value', 'label'])\n *\n * // Validate custom columns\n * const result = validateRequiredColumns(columns, ['id', 'name', 'email'])\n * ```\n */\nexport function validateRequiredColumns(\n columns: string[],\n requiredColumns: string[],\n): {\n isValid: boolean\n missing: string[]\n} {\n const columnSet = new Set(columns)\n const missing = requiredColumns.filter((required) => !columnSet.has(required))\n\n return {\n isValid: missing.length === 0,\n missing,\n }\n}\n\nfunction hasOuterWhitespace(value: string): boolean {\n return value.trim() !== value\n}\n\nfunction ensureDoesNotContain(value: string, token: string, errorMessage: string): void {\n if (value.includes(token)) {\n throw new Error(errorMessage)\n }\n}\n\nfunction ensureDoesNotContainAny(value: string, tokens: string[], errorMessage: string): void {\n if (tokens.some((token) => value.includes(token))) {\n throw new Error(errorMessage)\n }\n}\n\nfunction extractTableName(name: string): { tableName: string; hasSchema: boolean } {\n const parts = name.split(SCHEMA_SEPARATOR)\n\n if (parts.length === 1) {\n return { tableName: name, hasSchema: false }\n }\n\n if (parts.length === 2) {\n const [schema, table] = parts\n\n if (schema !== DEFAULT_SCHEMA) {\n throw new Error(\n `Invalid table name '${name}': schema must be '${DEFAULT_SCHEMA}', got '${schema}'`,\n )\n }\n\n return { tableName: table, hasSchema: true }\n }\n\n throw new Error(`Invalid table name '${name}': cannot contain multiple '/' separators`)\n}\n\nfunction stripWrappingBrackets(name: string): string {\n return name.startsWith('[') && name.endsWith(']') ? name.slice(1, -1) : name\n}\n\nfunction buildColumnDefinitions(additionalColumns: string[]): string[] {\n const uniqueColumns = Array.from(new Set(additionalColumns)).filter(\n (column) => !RESERVED_COLUMNS.has(column),\n )\n\n const validatedColumns = uniqueColumns.map((column) => {\n validateColumnName(column)\n return `[${column}] TEXT`\n })\n\n return ['id TEXT PRIMARY KEY', 'data TEXT', 'file TEXT', ...validatedColumns]\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n"]}