@kaspernj/api-maker 1.0.2052 → 1.0.2054

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 (946) hide show
  1. package/build/api.d.ts +19 -0
  2. package/build/api.d.ts.map +1 -0
  3. package/build/api.js +232 -116
  4. package/build/api.js.map +1 -0
  5. package/build/attribute-not-loaded-error.d.ts +3 -0
  6. package/build/attribute-not-loaded-error.d.ts.map +1 -0
  7. package/build/attribute-not-loaded-error.js +26 -2
  8. package/build/attribute-not-loaded-error.js.map +1 -0
  9. package/build/base-component.d.ts +4 -0
  10. package/build/base-component.d.ts.map +1 -0
  11. package/build/base-component.js +27 -5
  12. package/build/base-component.js.map +1 -0
  13. package/build/base-error.d.ts +31 -0
  14. package/build/base-error.d.ts.map +1 -0
  15. package/build/base-error.js +74 -31
  16. package/build/base-error.js.map +1 -0
  17. package/build/base-model/attribute.d.ts +45 -0
  18. package/build/base-model/attribute.d.ts.map +1 -0
  19. package/build/base-model/attribute.js +58 -24
  20. package/build/base-model/attribute.js.map +1 -0
  21. package/build/base-model/column.d.ts +17 -0
  22. package/build/base-model/column.d.ts.map +1 -0
  23. package/build/base-model/column.js +21 -10
  24. package/build/base-model/column.js.map +1 -0
  25. package/build/base-model/reflection.d.ts +22 -0
  26. package/build/base-model/reflection.d.ts.map +1 -0
  27. package/build/base-model/reflection.js +66 -14
  28. package/build/base-model/reflection.js.map +1 -0
  29. package/build/base-model/scope.d.ts +9 -0
  30. package/build/base-model/scope.d.ts.map +1 -0
  31. package/build/base-model/scope.js +51 -11
  32. package/build/base-model/scope.js.map +1 -0
  33. package/build/base-model.js +1282 -821
  34. package/build/base-model.js.map +1 -0
  35. package/build/bootstrap/attribute-row.d.ts +3 -0
  36. package/build/bootstrap/attribute-row.d.ts.map +1 -0
  37. package/build/bootstrap/attribute-row.js +178 -133
  38. package/build/bootstrap/attribute-row.js.map +1 -0
  39. package/build/bootstrap/attribute-rows.d.ts +3 -0
  40. package/build/bootstrap/attribute-rows.d.ts.map +1 -0
  41. package/build/bootstrap/attribute-rows.js +52 -31
  42. package/build/bootstrap/attribute-rows.js.map +1 -0
  43. package/build/bootstrap/card.d.ts +3 -0
  44. package/build/bootstrap/card.d.ts.map +1 -0
  45. package/build/bootstrap/card.js +163 -135
  46. package/build/bootstrap/card.js.map +1 -0
  47. package/build/bootstrap/checkbox.d.ts +3 -0
  48. package/build/bootstrap/checkbox.d.ts.map +1 -0
  49. package/build/bootstrap/checkbox.js +105 -97
  50. package/build/bootstrap/checkbox.js.map +1 -0
  51. package/build/bootstrap/checkboxes.d.ts +3 -0
  52. package/build/bootstrap/checkboxes.d.ts.map +1 -0
  53. package/build/bootstrap/checkboxes.js +206 -180
  54. package/build/bootstrap/checkboxes.js.map +1 -0
  55. package/build/bootstrap/index.d.ts +1 -0
  56. package/build/bootstrap/index.d.ts.map +1 -0
  57. package/build/bootstrap/index.js +1 -2
  58. package/build/bootstrap/index.js.map +1 -0
  59. package/build/bootstrap/input.d.ts +3 -0
  60. package/build/bootstrap/input.d.ts.map +1 -0
  61. package/build/bootstrap/input.js +135 -129
  62. package/build/bootstrap/input.js.map +1 -0
  63. package/build/bootstrap/invalid-feedback.d.ts +6 -0
  64. package/build/bootstrap/invalid-feedback.d.ts.map +1 -0
  65. package/build/bootstrap/invalid-feedback.js +51 -26
  66. package/build/bootstrap/invalid-feedback.js.map +1 -0
  67. package/build/bootstrap/paginate.d.ts +3 -0
  68. package/build/bootstrap/paginate.d.ts.map +1 -0
  69. package/build/bootstrap/paginate.js +165 -148
  70. package/build/bootstrap/paginate.js.map +1 -0
  71. package/build/bootstrap/radio-buttons.d.ts +3 -0
  72. package/build/bootstrap/radio-buttons.d.ts.map +1 -0
  73. package/build/bootstrap/radio-buttons.js +89 -72
  74. package/build/bootstrap/radio-buttons.js.map +1 -0
  75. package/build/bootstrap/select.d.ts +3 -0
  76. package/build/bootstrap/select.d.ts.map +1 -0
  77. package/build/bootstrap/select.js +103 -88
  78. package/build/bootstrap/select.js.map +1 -0
  79. package/build/bootstrap/sort-link.d.ts +3 -0
  80. package/build/bootstrap/sort-link.d.ts.map +1 -0
  81. package/build/bootstrap/sort-link.js +153 -129
  82. package/build/bootstrap/sort-link.js.map +1 -0
  83. package/build/cable-connection-pool.d.ts +27 -0
  84. package/build/cable-connection-pool.d.ts.map +1 -0
  85. package/build/cable-connection-pool.js +118 -123
  86. package/build/cable-connection-pool.js.map +1 -0
  87. package/build/cable-subscription-pool.d.ts +16 -0
  88. package/build/cable-subscription-pool.d.ts.map +1 -0
  89. package/build/cable-subscription-pool.js +211 -199
  90. package/build/cable-subscription-pool.js.map +1 -0
  91. package/build/cable-subscription.d.ts +7 -0
  92. package/build/cable-subscription.d.ts.map +1 -0
  93. package/build/cable-subscription.js +25 -20
  94. package/build/cable-subscription.js.map +1 -0
  95. package/build/cache-key-generator.d.ts +15 -0
  96. package/build/cache-key-generator.d.ts.map +1 -0
  97. package/build/cache-key-generator.js +86 -78
  98. package/build/cache-key-generator.js.map +1 -0
  99. package/build/can-can.d.ts +19 -0
  100. package/build/can-can.d.ts.map +1 -0
  101. package/build/can-can.js +243 -128
  102. package/build/can-can.js.map +1 -0
  103. package/build/channels-consumer.d.ts +3 -0
  104. package/build/channels-consumer.d.ts.map +1 -0
  105. package/build/channels-consumer.js +13 -8
  106. package/build/channels-consumer.js.map +1 -0
  107. package/build/collection-loader.d.ts +3 -0
  108. package/build/collection-loader.d.ts.map +1 -0
  109. package/build/collection-loader.js +70 -46
  110. package/build/collection-loader.js.map +1 -0
  111. package/build/collection.d.ts +213 -0
  112. package/build/collection.d.ts.map +1 -0
  113. package/build/collection.js +592 -306
  114. package/build/collection.js.map +1 -0
  115. package/build/command-submit-data.d.ts +54 -0
  116. package/build/command-submit-data.d.ts.map +1 -0
  117. package/build/command-submit-data.js +126 -80
  118. package/build/command-submit-data.js.map +1 -0
  119. package/build/commands-pool.d.ts +63 -0
  120. package/build/commands-pool.d.ts.map +1 -0
  121. package/build/commands-pool.js +281 -189
  122. package/build/commands-pool.js.map +1 -0
  123. package/build/compose.d.ts +2 -0
  124. package/build/compose.d.ts.map +1 -0
  125. package/build/compose.js +17 -8
  126. package/build/compose.js.map +1 -0
  127. package/build/config.d.ts +9 -0
  128. package/build/config.d.ts.map +1 -0
  129. package/build/config.js +105 -70
  130. package/build/config.js.map +1 -0
  131. package/build/custom-error.d.ts +8 -0
  132. package/build/custom-error.d.ts.map +1 -0
  133. package/build/custom-error.js +30 -4
  134. package/build/custom-error.js.map +1 -0
  135. package/build/data-set-to-attributes.d.ts +2 -0
  136. package/build/data-set-to-attributes.d.ts.map +1 -0
  137. package/build/data-set-to-attributes.js +45 -9
  138. package/build/data-set-to-attributes.js.map +1 -0
  139. package/build/deserializer.d.ts +4 -0
  140. package/build/deserializer.d.ts.map +1 -0
  141. package/build/deserializer.js +109 -54
  142. package/build/deserializer.js.map +1 -0
  143. package/build/destroy-error.d.ts +8 -0
  144. package/build/destroy-error.d.ts.map +1 -0
  145. package/build/destroy-error.js +30 -4
  146. package/build/destroy-error.js.map +1 -0
  147. package/build/devise.d.ts +20 -0
  148. package/build/devise.d.ts.map +1 -0
  149. package/build/devise.js +214 -123
  150. package/build/devise.js.map +1 -0
  151. package/build/draggable-sort/controller.d.ts +41 -0
  152. package/build/draggable-sort/controller.d.ts.map +1 -0
  153. package/build/draggable-sort/controller.js +130 -133
  154. package/build/draggable-sort/controller.js.map +1 -0
  155. package/build/draggable-sort/index.d.ts +3 -0
  156. package/build/draggable-sort/index.d.ts.map +1 -0
  157. package/build/draggable-sort/index.js +147 -111
  158. package/build/draggable-sort/index.js.map +1 -0
  159. package/build/draggable-sort/item.d.ts +3 -0
  160. package/build/draggable-sort/item.d.ts.map +1 -0
  161. package/build/draggable-sort/item.js +199 -183
  162. package/build/draggable-sort/item.js.map +1 -0
  163. package/build/error-logger.d.ts +20 -0
  164. package/build/error-logger.d.ts.map +1 -0
  165. package/build/error-logger.js +184 -92
  166. package/build/error-logger.js.map +1 -0
  167. package/build/error-messages.d.ts +18 -0
  168. package/build/error-messages.d.ts.map +1 -0
  169. package/build/error-messages.js +26 -13
  170. package/build/error-messages.js.map +1 -0
  171. package/build/event-connection.d.ts +12 -0
  172. package/build/event-connection.d.ts.map +1 -0
  173. package/build/event-connection.js +69 -31
  174. package/build/event-connection.js.map +1 -0
  175. package/build/event-emitter-listener.d.ts +8 -0
  176. package/build/event-emitter-listener.d.ts.map +1 -0
  177. package/build/event-emitter-listener.js +26 -14
  178. package/build/event-emitter-listener.js.map +1 -0
  179. package/build/event-model-class.d.ts +9 -0
  180. package/build/event-model-class.d.ts.map +1 -0
  181. package/build/event-model-class.js +50 -23
  182. package/build/event-model-class.js.map +1 -0
  183. package/build/events.d.ts +4 -0
  184. package/build/events.d.ts.map +1 -0
  185. package/build/events.js +9 -4
  186. package/build/events.js.map +1 -0
  187. package/build/form.d.ts +14 -0
  188. package/build/form.d.ts.map +1 -0
  189. package/build/form.js +169 -96
  190. package/build/form.js.map +1 -0
  191. package/build/history-expo.d.ts +6 -0
  192. package/build/history-expo.d.ts.map +1 -0
  193. package/build/history-expo.js +28 -19
  194. package/build/history-expo.js.map +1 -0
  195. package/build/history-react-native.d.ts +6 -0
  196. package/build/history-react-native.d.ts.map +1 -0
  197. package/build/history-react-native.js +29 -19
  198. package/build/history-react-native.js.map +1 -0
  199. package/build/history.d.ts +3 -0
  200. package/build/history.d.ts.map +1 -0
  201. package/build/history.js +5 -3
  202. package/build/history.js.map +1 -0
  203. package/build/index.d.ts +2 -0
  204. package/build/index.d.ts.map +1 -0
  205. package/build/index.js +6 -3
  206. package/build/index.js.map +1 -0
  207. package/build/inputs/attachment.d.ts +3 -0
  208. package/build/inputs/attachment.d.ts.map +1 -0
  209. package/build/inputs/attachment.js +125 -133
  210. package/build/inputs/attachment.js.map +1 -0
  211. package/build/inputs/auto-submit.d.ts +9 -0
  212. package/build/inputs/auto-submit.d.ts.map +1 -0
  213. package/build/inputs/auto-submit.js +71 -35
  214. package/build/inputs/auto-submit.js.map +1 -0
  215. package/build/inputs/checkbox.d.ts +3 -0
  216. package/build/inputs/checkbox.d.ts.map +1 -0
  217. package/build/inputs/checkbox.js +171 -136
  218. package/build/inputs/checkbox.js.map +1 -0
  219. package/build/inputs/checkboxes.d.ts +3 -0
  220. package/build/inputs/checkboxes.d.ts.map +1 -0
  221. package/build/inputs/checkboxes.js +161 -110
  222. package/build/inputs/checkboxes.js.map +1 -0
  223. package/build/inputs/id-for-component.d.ts +2 -0
  224. package/build/inputs/id-for-component.d.ts.map +1 -0
  225. package/build/inputs/id-for-component.js +53 -14
  226. package/build/inputs/id-for-component.js.map +1 -0
  227. package/build/inputs/input-wrapper.d.ts +3 -0
  228. package/build/inputs/input-wrapper.d.ts.map +1 -0
  229. package/build/inputs/input-wrapper.js +27 -18
  230. package/build/inputs/input-wrapper.js.map +1 -0
  231. package/build/inputs/input.d.ts +5 -0
  232. package/build/inputs/input.d.ts.map +1 -0
  233. package/build/inputs/input.js +250 -240
  234. package/build/inputs/input.js.map +1 -0
  235. package/build/inputs/money.d.ts +3 -0
  236. package/build/inputs/money.d.ts.map +1 -0
  237. package/build/inputs/money.js +189 -171
  238. package/build/inputs/money.js.map +1 -0
  239. package/build/inputs/name-for-component.d.ts +2 -0
  240. package/build/inputs/name-for-component.d.ts.map +1 -0
  241. package/build/inputs/name-for-component.js +48 -11
  242. package/build/inputs/name-for-component.js.map +1 -0
  243. package/build/inputs/select.d.ts +5 -0
  244. package/build/inputs/select.d.ts.map +1 -0
  245. package/build/inputs/select.js +128 -93
  246. package/build/inputs/select.js.map +1 -0
  247. package/build/instance-of-class-name.d.ts +3 -0
  248. package/build/instance-of-class-name.d.ts.map +1 -0
  249. package/build/instance-of-class-name.js +24 -21
  250. package/build/instance-of-class-name.js.map +1 -0
  251. package/build/is-expo.d.ts +3 -0
  252. package/build/is-expo.d.ts.map +1 -0
  253. package/build/is-expo.js +16 -20
  254. package/build/is-expo.js.map +1 -0
  255. package/build/key-value-store.d.ts +11 -0
  256. package/build/key-value-store.d.ts.map +1 -0
  257. package/build/key-value-store.js +133 -51
  258. package/build/key-value-store.js.map +1 -0
  259. package/build/link.d.ts +3 -0
  260. package/build/link.d.ts.map +1 -0
  261. package/build/link.js +120 -82
  262. package/build/link.js.map +1 -0
  263. package/build/logger.d.ts +13 -0
  264. package/build/logger.d.ts.map +1 -0
  265. package/build/logger.js +39 -29
  266. package/build/logger.js.map +1 -0
  267. package/build/merge-styles.d.ts +2 -0
  268. package/build/merge-styles.d.ts.map +1 -0
  269. package/build/merge-styles.js +16 -11
  270. package/build/merge-styles.js.map +1 -0
  271. package/build/modal.d.ts +3 -0
  272. package/build/modal.d.ts.map +1 -0
  273. package/build/modal.js +71 -38
  274. package/build/modal.js.map +1 -0
  275. package/build/model-class-require.d.ts +3 -0
  276. package/build/model-class-require.d.ts.map +1 -0
  277. package/build/model-class-require.js +47 -12
  278. package/build/model-class-require.js.map +1 -0
  279. package/build/model-events.d.ts +8 -0
  280. package/build/model-events.d.ts.map +1 -0
  281. package/build/model-events.js +39 -30
  282. package/build/model-events.js.map +1 -0
  283. package/build/model-name.d.ts +8 -0
  284. package/build/model-name.d.ts.map +1 -0
  285. package/build/model-name.js +66 -26
  286. package/build/model-name.js.map +1 -0
  287. package/build/model-prop-type.d.ts +21 -0
  288. package/build/model-prop-type.d.ts.map +1 -0
  289. package/build/model-prop-type.js +107 -98
  290. package/build/model-prop-type.js.map +1 -0
  291. package/build/model-recipes-loader.d.ts +10 -0
  292. package/build/model-recipes-loader.d.ts.map +1 -0
  293. package/build/model-recipes-loader.js +30 -31
  294. package/build/model-recipes-loader.js.map +1 -0
  295. package/build/model-recipes-model-loader.d.ts +202 -0
  296. package/build/model-recipes-model-loader.d.ts.map +1 -0
  297. package/build/model-recipes-model-loader.js +304 -344
  298. package/build/model-recipes-model-loader.js.map +1 -0
  299. package/build/models-response-reader.d.ts +9 -0
  300. package/build/models-response-reader.d.ts.map +1 -0
  301. package/build/models-response-reader.js +79 -39
  302. package/build/models-response-reader.js.map +1 -0
  303. package/build/models.d.ts +3 -0
  304. package/build/models.d.ts.map +1 -0
  305. package/build/models.js +11 -8
  306. package/build/models.js.map +1 -0
  307. package/build/money-formatter.d.ts +17 -0
  308. package/build/money-formatter.d.ts.map +1 -0
  309. package/build/money-formatter.js +93 -76
  310. package/build/money-formatter.js.map +1 -0
  311. package/build/not-loaded-error.d.ts +3 -0
  312. package/build/not-loaded-error.d.ts.map +1 -0
  313. package/build/not-loaded-error.js +26 -2
  314. package/build/not-loaded-error.js.map +1 -0
  315. package/build/params.d.ts +16 -0
  316. package/build/params.d.ts.map +1 -0
  317. package/build/params.js +73 -60
  318. package/build/params.js.map +1 -0
  319. package/build/preloaded.d.ts +8 -0
  320. package/build/preloaded.d.ts.map +1 -0
  321. package/build/preloaded.js +73 -36
  322. package/build/preloaded.js.map +1 -0
  323. package/build/resize-observer.d.ts +3 -0
  324. package/build/resize-observer.d.ts.map +1 -0
  325. package/build/resize-observer.js +13 -10
  326. package/build/resize-observer.js.map +1 -0
  327. package/build/rest-props-validator.d.ts +3 -0
  328. package/build/rest-props-validator.d.ts.map +1 -0
  329. package/build/rest-props-validator.js +9 -7
  330. package/build/rest-props-validator.js.map +1 -0
  331. package/build/result.d.ts +38 -0
  332. package/build/result.d.ts.map +1 -0
  333. package/build/result.js +43 -13
  334. package/build/result.js.map +1 -0
  335. package/build/router/route.d.ts +8 -0
  336. package/build/router/route.d.ts.map +1 -0
  337. package/build/router/route.js +322 -266
  338. package/build/router/route.js.map +1 -0
  339. package/build/router/switch.d.ts +4 -0
  340. package/build/router/switch.d.ts.map +1 -0
  341. package/build/router/switch.js +132 -70
  342. package/build/router/switch.js.map +1 -0
  343. package/build/router.d.ts +3 -0
  344. package/build/router.d.ts.map +1 -0
  345. package/build/router.js +94 -57
  346. package/build/router.js.map +1 -0
  347. package/build/routes-native.d.ts +24 -0
  348. package/build/routes-native.d.ts.map +1 -0
  349. package/build/routes-native.js +233 -198
  350. package/build/routes-native.js.map +1 -0
  351. package/build/routes.d.ts +10 -0
  352. package/build/routes.d.ts.map +1 -0
  353. package/build/routes.js +102 -48
  354. package/build/routes.js.map +1 -0
  355. package/build/run-last.d.ts +12 -0
  356. package/build/run-last.d.ts.map +1 -0
  357. package/build/run-last.js +40 -34
  358. package/build/run-last.js.map +1 -0
  359. package/build/serializer.d.ts +10 -0
  360. package/build/serializer.d.ts.map +1 -0
  361. package/build/serializer.js +73 -62
  362. package/build/serializer.js.map +1 -0
  363. package/build/services.d.ts +5 -0
  364. package/build/services.d.ts.map +1 -0
  365. package/build/services.js +30 -20
  366. package/build/services.js.map +1 -0
  367. package/build/session-status-updater.d.ts +21 -0
  368. package/build/session-status-updater.d.ts.map +1 -0
  369. package/build/session-status-updater.js +227 -130
  370. package/build/session-status-updater.js.map +1 -0
  371. package/build/source-maps-loader.js +279 -176
  372. package/build/source-maps-loader.js.map +1 -0
  373. package/build/super-admin/config-reader.d.ts +23 -0
  374. package/build/super-admin/config-reader.d.ts.map +1 -0
  375. package/build/super-admin/config-reader.js +116 -82
  376. package/build/super-admin/config-reader.js.map +1 -0
  377. package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts +3 -0
  378. package/build/super-admin/edit-page/edit-attribute-checkbox.d.ts.map +1 -0
  379. package/build/super-admin/edit-page/edit-attribute-checkbox.js +118 -83
  380. package/build/super-admin/edit-page/edit-attribute-checkbox.js.map +1 -0
  381. package/build/super-admin/edit-page/edit-attribute-content.d.ts +3 -0
  382. package/build/super-admin/edit-page/edit-attribute-content.d.ts.map +1 -0
  383. package/build/super-admin/edit-page/edit-attribute-content.js +79 -55
  384. package/build/super-admin/edit-page/edit-attribute-content.js.map +1 -0
  385. package/build/super-admin/edit-page/edit-attribute-input.d.ts +3 -0
  386. package/build/super-admin/edit-page/edit-attribute-input.d.ts.map +1 -0
  387. package/build/super-admin/edit-page/edit-attribute-input.js +119 -77
  388. package/build/super-admin/edit-page/edit-attribute-input.js.map +1 -0
  389. package/build/super-admin/edit-page/edit-attribute.d.ts +3 -0
  390. package/build/super-admin/edit-page/edit-attribute.d.ts.map +1 -0
  391. package/build/super-admin/edit-page/edit-attribute.js +105 -76
  392. package/build/super-admin/edit-page/edit-attribute.js.map +1 -0
  393. package/build/super-admin/edit-page.d.ts +3 -0
  394. package/build/super-admin/edit-page.d.ts.map +1 -0
  395. package/build/super-admin/edit-page.js +202 -120
  396. package/build/super-admin/edit-page.js.map +1 -0
  397. package/build/super-admin/has-edit-config.d.ts +3 -0
  398. package/build/super-admin/has-edit-config.d.ts.map +1 -0
  399. package/build/super-admin/has-edit-config.js +17 -11
  400. package/build/super-admin/has-edit-config.js.map +1 -0
  401. package/build/super-admin/index-page.d.ts +3 -0
  402. package/build/super-admin/index-page.d.ts.map +1 -0
  403. package/build/super-admin/index-page.js +45 -25
  404. package/build/super-admin/index-page.js.map +1 -0
  405. package/build/super-admin/index.d.ts +3 -0
  406. package/build/super-admin/index.d.ts.map +1 -0
  407. package/build/super-admin/index.js +254 -184
  408. package/build/super-admin/index.js.map +1 -0
  409. package/build/super-admin/layout/header/index.d.ts +3 -0
  410. package/build/super-admin/layout/header/index.d.ts.map +1 -0
  411. package/build/super-admin/layout/header/index.js +154 -155
  412. package/build/super-admin/layout/header/index.js.map +1 -0
  413. package/build/super-admin/layout/index.d.ts +3 -0
  414. package/build/super-admin/layout/index.d.ts.map +1 -0
  415. package/build/super-admin/layout/index.js +183 -160
  416. package/build/super-admin/layout/index.js.map +1 -0
  417. package/build/super-admin/layout/menu/index.d.ts +3 -0
  418. package/build/super-admin/layout/menu/index.d.ts.map +1 -0
  419. package/build/super-admin/layout/menu/index.js +191 -203
  420. package/build/super-admin/layout/menu/index.js.map +1 -0
  421. package/build/super-admin/layout/menu/menu-content.d.ts +3 -0
  422. package/build/super-admin/layout/menu/menu-content.d.ts.map +1 -0
  423. package/build/super-admin/layout/menu/menu-content.js +86 -45
  424. package/build/super-admin/layout/menu/menu-content.js.map +1 -0
  425. package/build/super-admin/layout/menu/menu-item.d.ts +3 -0
  426. package/build/super-admin/layout/menu/menu-item.d.ts.map +1 -0
  427. package/build/super-admin/layout/menu/menu-item.js +104 -83
  428. package/build/super-admin/layout/menu/menu-item.js.map +1 -0
  429. package/build/super-admin/layout/no-access.d.ts +3 -0
  430. package/build/super-admin/layout/no-access.d.ts.map +1 -0
  431. package/build/super-admin/layout/no-access.js +46 -27
  432. package/build/super-admin/layout/no-access.js.map +1 -0
  433. package/build/super-admin/model-class-table.d.ts +3 -0
  434. package/build/super-admin/model-class-table.d.ts.map +1 -0
  435. package/build/super-admin/model-class-table.js +132 -60
  436. package/build/super-admin/model-class-table.js.map +1 -0
  437. package/build/super-admin/models.d.ts +3 -0
  438. package/build/super-admin/models.d.ts.map +1 -0
  439. package/build/super-admin/models.js +43 -7
  440. package/build/super-admin/models.js.map +1 -0
  441. package/build/super-admin/show-nav.d.ts +3 -0
  442. package/build/super-admin/show-nav.d.ts.map +1 -0
  443. package/build/super-admin/show-nav.js +90 -51
  444. package/build/super-admin/show-nav.js.map +1 -0
  445. package/build/super-admin/show-page/belongs-to-attribute-row.d.ts +3 -0
  446. package/build/super-admin/show-page/belongs-to-attribute-row.d.ts.map +1 -0
  447. package/build/super-admin/show-page/belongs-to-attribute-row.js +77 -28
  448. package/build/super-admin/show-page/belongs-to-attribute-row.js.map +1 -0
  449. package/build/super-admin/show-page/index.d.ts +3 -0
  450. package/build/super-admin/show-page/index.d.ts.map +1 -0
  451. package/build/super-admin/show-page/index.js +202 -137
  452. package/build/super-admin/show-page/index.js.map +1 -0
  453. package/build/super-admin/show-reflection-actions.d.ts +3 -0
  454. package/build/super-admin/show-reflection-actions.d.ts.map +1 -0
  455. package/build/super-admin/show-reflection-actions.js +100 -46
  456. package/build/super-admin/show-reflection-actions.js.map +1 -0
  457. package/build/super-admin/show-reflection-link.d.ts +3 -0
  458. package/build/super-admin/show-reflection-link.d.ts.map +1 -0
  459. package/build/super-admin/show-reflection-link.js +101 -47
  460. package/build/super-admin/show-reflection-link.js.map +1 -0
  461. package/build/super-admin/show-reflection-page.d.ts +3 -0
  462. package/build/super-admin/show-reflection-page.d.ts.map +1 -0
  463. package/build/super-admin/show-reflection-page.js +98 -48
  464. package/build/super-admin/show-reflection-page.js.map +1 -0
  465. package/build/table/column-content.d.ts +25 -0
  466. package/build/table/column-content.d.ts.map +1 -0
  467. package/build/table/column-content.js +153 -115
  468. package/build/table/column-content.js.map +1 -0
  469. package/build/table/column-identifier.d.ts +2 -0
  470. package/build/table/column-identifier.d.ts.map +1 -0
  471. package/build/table/column-identifier.js +22 -16
  472. package/build/table/column-identifier.js.map +1 -0
  473. package/build/table/column-visible.d.ts +2 -0
  474. package/build/table/column-visible.d.ts.map +1 -0
  475. package/build/table/column-visible.js +12 -6
  476. package/build/table/column-visible.js.map +1 -0
  477. package/build/table/components/column.d.ts +3 -0
  478. package/build/table/components/column.d.ts.map +1 -0
  479. package/build/table/components/column.js +61 -21
  480. package/build/table/components/column.js.map +1 -0
  481. package/build/table/components/flat-list.d.ts +3 -0
  482. package/build/table/components/flat-list.d.ts.map +1 -0
  483. package/build/table/components/flat-list.js +61 -21
  484. package/build/table/components/flat-list.js.map +1 -0
  485. package/build/table/components/header.d.ts +3 -0
  486. package/build/table/components/header.d.ts.map +1 -0
  487. package/build/table/components/header.js +63 -26
  488. package/build/table/components/header.js.map +1 -0
  489. package/build/table/components/row.d.ts +3 -0
  490. package/build/table/components/row.d.ts.map +1 -0
  491. package/build/table/components/row.js +65 -26
  492. package/build/table/components/row.js.map +1 -0
  493. package/build/table/filters/attribute-element.d.ts +3 -0
  494. package/build/table/filters/attribute-element.d.ts.map +1 -0
  495. package/build/table/filters/attribute-element.js +63 -44
  496. package/build/table/filters/attribute-element.js.map +1 -0
  497. package/build/table/filters/filter-form.d.ts +3 -0
  498. package/build/table/filters/filter-form.d.ts.map +1 -0
  499. package/build/table/filters/filter-form.js +489 -453
  500. package/build/table/filters/filter-form.js.map +1 -0
  501. package/build/table/filters/filter.d.ts +3 -0
  502. package/build/table/filters/filter.d.ts.map +1 -0
  503. package/build/table/filters/filter.js +75 -90
  504. package/build/table/filters/filter.js.map +1 -0
  505. package/build/table/filters/index.d.ts +3 -0
  506. package/build/table/filters/index.d.ts.map +1 -0
  507. package/build/table/filters/index.js +143 -188
  508. package/build/table/filters/index.js.map +1 -0
  509. package/build/table/filters/load-search-modal.d.ts +3 -0
  510. package/build/table/filters/load-search-modal.d.ts.map +1 -0
  511. package/build/table/filters/load-search-modal.js +234 -169
  512. package/build/table/filters/load-search-modal.js.map +1 -0
  513. package/build/table/filters/reflection-element.d.ts +3 -0
  514. package/build/table/filters/reflection-element.d.ts.map +1 -0
  515. package/build/table/filters/reflection-element.js +55 -37
  516. package/build/table/filters/reflection-element.js.map +1 -0
  517. package/build/table/filters/save-search-modal.d.ts +3 -0
  518. package/build/table/filters/save-search-modal.d.ts.map +1 -0
  519. package/build/table/filters/save-search-modal.js +140 -85
  520. package/build/table/filters/save-search-modal.js.map +1 -0
  521. package/build/table/filters/scope-element.d.ts +3 -0
  522. package/build/table/filters/scope-element.d.ts.map +1 -0
  523. package/build/table/filters/scope-element.js +58 -42
  524. package/build/table/filters/scope-element.js.map +1 -0
  525. package/build/table/header-column-content.d.ts +3 -0
  526. package/build/table/header-column-content.d.ts.map +1 -0
  527. package/build/table/header-column-content.js +71 -68
  528. package/build/table/header-column-content.js.map +1 -0
  529. package/build/table/header-column.d.ts +3 -0
  530. package/build/table/header-column.d.ts.map +1 -0
  531. package/build/table/header-column.js +220 -143
  532. package/build/table/header-column.js.map +1 -0
  533. package/build/table/header-select.d.ts +3 -0
  534. package/build/table/header-select.d.ts.map +1 -0
  535. package/build/table/header-select.js +77 -105
  536. package/build/table/header-select.js.map +1 -0
  537. package/build/table/model-callback-args.d.ts +4 -0
  538. package/build/table/model-callback-args.d.ts.map +1 -0
  539. package/build/table/model-callback-args.js +43 -9
  540. package/build/table/model-callback-args.js.map +1 -0
  541. package/build/table/model-column.d.ts +3 -0
  542. package/build/table/model-column.d.ts.map +1 -0
  543. package/build/table/model-column.js +145 -99
  544. package/build/table/model-column.js.map +1 -0
  545. package/build/table/model-row.d.ts +3 -0
  546. package/build/table/model-row.d.ts.map +1 -0
  547. package/build/table/model-row.js +188 -190
  548. package/build/table/model-row.js.map +1 -0
  549. package/build/table/select-calculator.d.ts +2 -0
  550. package/build/table/select-calculator.d.ts.map +1 -0
  551. package/build/table/select-calculator.js +110 -59
  552. package/build/table/select-calculator.js.map +1 -0
  553. package/build/table/settings/column-row.d.ts +3 -0
  554. package/build/table/settings/column-row.d.ts.map +1 -0
  555. package/build/table/settings/column-row.js +188 -95
  556. package/build/table/settings/column-row.js.map +1 -0
  557. package/build/table/settings/download-action.d.ts +3 -0
  558. package/build/table/settings/download-action.d.ts.map +1 -0
  559. package/build/table/settings/download-action.js +75 -85
  560. package/build/table/settings/download-action.js.map +1 -0
  561. package/build/table/settings/index.d.ts +3 -0
  562. package/build/table/settings/index.d.ts.map +1 -0
  563. package/build/table/settings/index.js +103 -95
  564. package/build/table/settings/index.js.map +1 -0
  565. package/build/table/table-settings.d.ts +35 -0
  566. package/build/table/table-settings.d.ts.map +1 -0
  567. package/build/table/table-settings.js +336 -206
  568. package/build/table/table-settings.js.map +1 -0
  569. package/build/table/table.d.ts +3 -0
  570. package/build/table/table.d.ts.map +1 -0
  571. package/build/table/table.js +801 -964
  572. package/build/table/table.js.map +1 -0
  573. package/build/table/use-sorting.d.ts +21 -0
  574. package/build/table/use-sorting.d.ts.map +1 -0
  575. package/build/table/use-sorting.js +59 -31
  576. package/build/table/use-sorting.js.map +1 -0
  577. package/build/table/widths.d.ts +18 -0
  578. package/build/table/widths.d.ts.map +1 -0
  579. package/build/table/widths.js +75 -74
  580. package/build/table/widths.js.map +1 -0
  581. package/build/table/worker-plugins-check-all-checkbox.d.ts +3 -0
  582. package/build/table/worker-plugins-check-all-checkbox.d.ts.map +1 -0
  583. package/build/table/worker-plugins-check-all-checkbox.js +230 -121
  584. package/build/table/worker-plugins-check-all-checkbox.js.map +1 -0
  585. package/build/table/worker-plugins-checkbox.d.ts +3 -0
  586. package/build/table/worker-plugins-checkbox.d.ts.map +1 -0
  587. package/build/table/worker-plugins-checkbox.js +186 -112
  588. package/build/table/worker-plugins-checkbox.js.map +1 -0
  589. package/build/translated-attributes.d.ts +2 -0
  590. package/build/translated-attributes.d.ts.map +1 -0
  591. package/build/translated-attributes.js +13 -8
  592. package/build/translated-attributes.js.map +1 -0
  593. package/build/translated-collections.d.ts +4 -0
  594. package/build/translated-collections.d.ts.map +1 -0
  595. package/build/translated-collections.js +22 -12
  596. package/build/translated-collections.js.map +1 -0
  597. package/build/updated-attribute.d.ts +15 -0
  598. package/build/updated-attribute.d.ts.map +1 -0
  599. package/build/updated-attribute.js +144 -72
  600. package/build/updated-attribute.js.map +1 -0
  601. package/build/url-encode.d.ts +6 -0
  602. package/build/url-encode.d.ts.map +1 -0
  603. package/build/url-encode.js +22 -13
  604. package/build/url-encode.js.map +1 -0
  605. package/build/use-breakpoint.d.ts +3 -0
  606. package/build/use-breakpoint.d.ts.map +1 -0
  607. package/build/use-breakpoint.js +126 -75
  608. package/build/use-breakpoint.js.map +1 -0
  609. package/build/use-can-can.d.ts +8 -0
  610. package/build/use-can-can.d.ts.map +1 -0
  611. package/build/use-can-can.js +107 -52
  612. package/build/use-can-can.js.map +1 -0
  613. package/build/use-collection.d.ts +73 -0
  614. package/build/use-collection.d.ts.map +1 -0
  615. package/build/use-collection.js +366 -215
  616. package/build/use-collection.js.map +1 -0
  617. package/build/use-created-event.d.ts +19 -0
  618. package/build/use-created-event.d.ts.map +1 -0
  619. package/build/use-created-event.js +73 -50
  620. package/build/use-created-event.js.map +1 -0
  621. package/build/use-current-user-context.d.ts +12 -0
  622. package/build/use-current-user-context.d.ts.map +1 -0
  623. package/build/use-current-user-context.js +188 -0
  624. package/build/use-current-user-context.js.map +1 -0
  625. package/build/use-current-user.d.ts +14 -0
  626. package/build/use-current-user.d.ts.map +1 -0
  627. package/build/use-current-user.js +43 -119
  628. package/build/use-current-user.js.map +1 -0
  629. package/build/use-destroyed-event.d.ts +16 -0
  630. package/build/use-destroyed-event.d.ts.map +1 -0
  631. package/build/use-destroyed-event.js +78 -58
  632. package/build/use-destroyed-event.js.map +1 -0
  633. package/build/use-event-emitter.d.ts +9 -0
  634. package/build/use-event-emitter.d.ts.map +1 -0
  635. package/build/use-event-emitter.js +32 -25
  636. package/build/use-event-emitter.js.map +1 -0
  637. package/build/use-event-listener.d.ts +9 -0
  638. package/build/use-event-listener.d.ts.map +1 -0
  639. package/build/use-event-listener.js +36 -21
  640. package/build/use-event-listener.js.map +1 -0
  641. package/build/use-input.d.ts +31 -0
  642. package/build/use-input.d.ts.map +1 -0
  643. package/build/use-input.js +166 -134
  644. package/build/use-input.js.map +1 -0
  645. package/build/use-model-event.d.ts +17 -0
  646. package/build/use-model-event.d.ts.map +1 -0
  647. package/build/use-model-event.js +79 -58
  648. package/build/use-model-event.js.map +1 -0
  649. package/build/use-model.d.ts +30 -0
  650. package/build/use-model.d.ts.map +1 -0
  651. package/build/use-model.js +259 -159
  652. package/build/use-model.js.map +1 -0
  653. package/build/use-resize-observer.d.ts +8 -0
  654. package/build/use-resize-observer.d.ts.map +1 -0
  655. package/build/use-resize-observer.js +35 -22
  656. package/build/use-resize-observer.js.map +1 -0
  657. package/build/use-router.d.ts +8 -0
  658. package/build/use-router.d.ts.map +1 -0
  659. package/build/use-router.js +133 -100
  660. package/build/use-router.js.map +1 -0
  661. package/build/use-screen-layout.d.ts +3 -0
  662. package/build/use-screen-layout.d.ts.map +1 -0
  663. package/build/use-screen-layout.js +46 -37
  664. package/build/use-screen-layout.js.map +1 -0
  665. package/build/use-styles.d.ts +2 -0
  666. package/build/use-styles.d.ts.map +1 -0
  667. package/build/use-styles.js +99 -47
  668. package/build/use-styles.js.map +1 -0
  669. package/build/use-updated-event.d.ts +16 -0
  670. package/build/use-updated-event.d.ts.map +1 -0
  671. package/build/use-updated-event.js +79 -58
  672. package/build/use-updated-event.js.map +1 -0
  673. package/build/use-validation-errors.d.ts +7 -0
  674. package/build/use-validation-errors.d.ts.map +1 -0
  675. package/build/use-validation-errors.js +35 -29
  676. package/build/use-validation-errors.js.map +1 -0
  677. package/build/utils/button.d.ts +3 -0
  678. package/build/utils/button.d.ts.map +1 -0
  679. package/build/utils/button.js +143 -123
  680. package/build/utils/button.js.map +1 -0
  681. package/build/utils/card.d.ts +3 -0
  682. package/build/utils/card.d.ts.map +1 -0
  683. package/build/utils/card.js +107 -55
  684. package/build/utils/card.js.map +1 -0
  685. package/build/utils/checkbox.d.ts +3 -0
  686. package/build/utils/checkbox.d.ts.map +1 -0
  687. package/build/utils/checkbox.js +113 -77
  688. package/build/utils/checkbox.js.map +1 -0
  689. package/build/utils/checkboxes.d.ts +3 -0
  690. package/build/utils/checkboxes.d.ts.map +1 -0
  691. package/build/utils/checkboxes.js +184 -159
  692. package/build/utils/checkboxes.js.map +1 -0
  693. package/build/utils/default-style.d.ts +7 -0
  694. package/build/utils/default-style.d.ts.map +1 -0
  695. package/build/utils/default-style.js +129 -62
  696. package/build/utils/default-style.js.map +1 -0
  697. package/build/utils/header.d.ts +3 -0
  698. package/build/utils/header.d.ts.map +1 -0
  699. package/build/utils/header.js +37 -19
  700. package/build/utils/header.js.map +1 -0
  701. package/build/utils/icon.d.ts +3 -0
  702. package/build/utils/icon.d.ts.map +1 -0
  703. package/build/utils/icon.js +158 -96
  704. package/build/utils/icon.js.map +1 -0
  705. package/build/utils/invalid-feedback.d.ts +3 -0
  706. package/build/utils/invalid-feedback.d.ts.map +1 -0
  707. package/build/utils/invalid-feedback.js +43 -19
  708. package/build/utils/invalid-feedback.js.map +1 -0
  709. package/build/utils/modal.d.ts +3 -0
  710. package/build/utils/modal.d.ts.map +1 -0
  711. package/build/utils/modal.js +118 -61
  712. package/build/utils/modal.js.map +1 -0
  713. package/build/utils/text.d.ts +3 -0
  714. package/build/utils/text.d.ts.map +1 -0
  715. package/build/utils/text.js +37 -20
  716. package/build/utils/text.js.map +1 -0
  717. package/build/validation-error.d.ts +18 -0
  718. package/build/validation-error.d.ts.map +1 -0
  719. package/build/validation-error.js +94 -27
  720. package/build/validation-error.js.map +1 -0
  721. package/build/validation-errors.d.ts +58 -0
  722. package/build/validation-errors.d.ts.map +1 -0
  723. package/build/validation-errors.js +164 -94
  724. package/build/validation-errors.js.map +1 -0
  725. package/build/with-api-maker.d.ts +3 -0
  726. package/build/with-api-maker.d.ts.map +1 -0
  727. package/build/with-api-maker.js +73 -27
  728. package/build/with-api-maker.js.map +1 -0
  729. package/build/with-collection.d.ts +3 -0
  730. package/build/with-collection.d.ts.map +1 -0
  731. package/build/with-collection.js +64 -13
  732. package/build/with-collection.js.map +1 -0
  733. package/build/with-current-user.d.ts +3 -0
  734. package/build/with-current-user.d.ts.map +1 -0
  735. package/build/with-current-user.js +23 -9
  736. package/build/with-current-user.js.map +1 -0
  737. package/build/with-model.d.ts +3 -0
  738. package/build/with-model.d.ts.map +1 -0
  739. package/build/with-model.js +28 -14
  740. package/build/with-model.js.map +1 -0
  741. package/build/with-router.d.ts +3 -0
  742. package/build/with-router.d.ts.map +1 -0
  743. package/build/with-router.js +35 -21
  744. package/build/with-router.js.map +1 -0
  745. package/package.json +14 -8
  746. package/.eslintrc.js +0 -357
  747. package/android/build.gradle +0 -43
  748. package/android/src/main/AndroidManifest.xml +0 -2
  749. package/android/src/main/java/expo/modules/api_maker/ApiMakerModule.kt +0 -50
  750. package/android/src/main/java/expo/modules/api_maker/ApiMakerView.kt +0 -30
  751. package/expo-module.config.json +0 -17
  752. package/ios/ApiMaker.podspec +0 -29
  753. package/ios/ApiMakerModule.swift +0 -48
  754. package/ios/ApiMakerView.swift +0 -38
  755. package/src/api.js +0 -109
  756. package/src/attribute-not-loaded-error.js +0 -1
  757. package/src/base-component.jsx +0 -5
  758. package/src/base-error.js +0 -38
  759. package/src/base-model/attribute.js +0 -33
  760. package/src/base-model/column.js +0 -13
  761. package/src/base-model/reflection.js +0 -15
  762. package/src/base-model/scope.js +0 -12
  763. package/src/base-model.js +0 -1001
  764. package/src/bootstrap/attribute-row.jsx +0 -135
  765. package/src/bootstrap/attribute-rows.jsx +0 -27
  766. package/src/bootstrap/card.jsx +0 -149
  767. package/src/bootstrap/checkbox.jsx +0 -86
  768. package/src/bootstrap/checkboxes.jsx +0 -185
  769. package/src/bootstrap/index.js +0 -0
  770. package/src/bootstrap/input.jsx +0 -173
  771. package/src/bootstrap/invalid-feedback.jsx +0 -31
  772. package/src/bootstrap/paginate.jsx +0 -187
  773. package/src/bootstrap/radio-buttons.jsx +0 -87
  774. package/src/bootstrap/select.jsx +0 -110
  775. package/src/bootstrap/sort-link.jsx +0 -106
  776. package/src/cable-connection-pool.js +0 -127
  777. package/src/cable-subscription-pool.js +0 -189
  778. package/src/cable-subscription.js +0 -23
  779. package/src/cache-key-generator.js +0 -100
  780. package/src/can-can.js +0 -158
  781. package/src/channels-consumer.js +0 -10
  782. package/src/collection-loader.jsx +0 -60
  783. package/src/collection.js +0 -346
  784. package/src/command-submit-data.js +0 -103
  785. package/src/commands-pool.js +0 -212
  786. package/src/compose.js +0 -11
  787. package/src/config.js +0 -71
  788. package/src/custom-error.js +0 -7
  789. package/src/data-set-to-attributes.js +0 -13
  790. package/src/deserializer.js +0 -60
  791. package/src/destroy-error.js +0 -7
  792. package/src/devise.js +0 -151
  793. package/src/draggable-sort/controller.js +0 -137
  794. package/src/draggable-sort/index.jsx +0 -107
  795. package/src/draggable-sort/item.jsx +0 -171
  796. package/src/error-logger.js +0 -111
  797. package/src/error-messages.js +0 -15
  798. package/src/event-connection.jsx +0 -37
  799. package/src/event-emitter-listener.jsx +0 -13
  800. package/src/event-model-class.jsx +0 -28
  801. package/src/events.js +0 -7
  802. package/src/form.jsx +0 -109
  803. package/src/history-expo.js +0 -23
  804. package/src/history-react-native.js +0 -25
  805. package/src/history.js +0 -3
  806. package/src/index.js +0 -3
  807. package/src/inputs/attachment.jsx +0 -108
  808. package/src/inputs/auto-submit.js +0 -37
  809. package/src/inputs/checkbox.jsx +0 -125
  810. package/src/inputs/checkboxes.jsx +0 -116
  811. package/src/inputs/id-for-component.js +0 -15
  812. package/src/inputs/input-wrapper.jsx +0 -16
  813. package/src/inputs/input.jsx +0 -260
  814. package/src/inputs/money.jsx +0 -179
  815. package/src/inputs/name-for-component.js +0 -15
  816. package/src/inputs/select.jsx +0 -104
  817. package/src/instance-of-class-name.js +0 -29
  818. package/src/is-expo.js +0 -18
  819. package/src/key-value-store.js +0 -68
  820. package/src/link.jsx +0 -77
  821. package/src/logger.js +0 -38
  822. package/src/merge-styles.js +0 -15
  823. package/src/modal.jsx +0 -37
  824. package/src/model-class-require.js +0 -17
  825. package/src/model-events.js +0 -39
  826. package/src/model-name.js +0 -33
  827. package/src/model-prop-type.js +0 -124
  828. package/src/model-recipes-loader.js +0 -28
  829. package/src/model-recipes-model-loader.js +0 -350
  830. package/src/models-response-reader.js +0 -48
  831. package/src/models.js +0 -7
  832. package/src/models.js.erb +0 -19
  833. package/src/money-formatter.js +0 -100
  834. package/src/not-loaded-error.js +0 -1
  835. package/src/params.js +0 -66
  836. package/src/preloaded.js +0 -43
  837. package/src/resize-observer.jsx +0 -10
  838. package/src/rest-props-validator.js +0 -9
  839. package/src/result.js +0 -13
  840. package/src/router/route.jsx +0 -246
  841. package/src/router/switch.jsx +0 -76
  842. package/src/router.jsx +0 -47
  843. package/src/routes-native.js +0 -173
  844. package/src/routes.js +0 -58
  845. package/src/run-last.js +0 -39
  846. package/src/serializer.js +0 -76
  847. package/src/services.js +0 -23
  848. package/src/session-status-updater.js +0 -172
  849. package/src/source-maps-loader.js +0 -203
  850. package/src/super-admin/config-reader.jsx +0 -93
  851. package/src/super-admin/edit-page/edit-attribute-checkbox.jsx +0 -84
  852. package/src/super-admin/edit-page/edit-attribute-content.jsx +0 -57
  853. package/src/super-admin/edit-page/edit-attribute-input.jsx +0 -79
  854. package/src/super-admin/edit-page/edit-attribute.jsx +0 -84
  855. package/src/super-admin/edit-page.jsx +0 -117
  856. package/src/super-admin/has-edit-config.js +0 -15
  857. package/src/super-admin/index-page.jsx +0 -23
  858. package/src/super-admin/index.jsx +0 -219
  859. package/src/super-admin/layout/header/index.jsx +0 -144
  860. package/src/super-admin/layout/header/style.scss +0 -45
  861. package/src/super-admin/layout/index.jsx +0 -154
  862. package/src/super-admin/layout/menu/index.jsx +0 -173
  863. package/src/super-admin/layout/menu/menu-content.jsx +0 -43
  864. package/src/super-admin/layout/menu/menu-item.jsx +0 -70
  865. package/src/super-admin/layout/menu/style.scss +0 -11
  866. package/src/super-admin/layout/no-access.jsx +0 -26
  867. package/src/super-admin/model-class-table.jsx +0 -66
  868. package/src/super-admin/models.js +0 -11
  869. package/src/super-admin/show-nav.jsx +0 -45
  870. package/src/super-admin/show-page/belongs-to-attribute-row.jsx +0 -30
  871. package/src/super-admin/show-page/index.jsx +0 -141
  872. package/src/super-admin/show-reflection-actions.jsx +0 -51
  873. package/src/super-admin/show-reflection-link.jsx +0 -40
  874. package/src/super-admin/show-reflection-page.jsx +0 -49
  875. package/src/super-admin/stylesheets/variables.scss +0 -11
  876. package/src/table/column-content.jsx +0 -122
  877. package/src/table/column-identifier.js +0 -23
  878. package/src/table/column-visible.js +0 -7
  879. package/src/table/components/column.jsx +0 -19
  880. package/src/table/components/flat-list.jsx +0 -19
  881. package/src/table/components/header.jsx +0 -21
  882. package/src/table/components/row.jsx +0 -23
  883. package/src/table/filters/attribute-element.jsx +0 -47
  884. package/src/table/filters/filter-form.jsx +0 -448
  885. package/src/table/filters/filter.jsx +0 -74
  886. package/src/table/filters/index.jsx +0 -171
  887. package/src/table/filters/load-search-modal.jsx +0 -157
  888. package/src/table/filters/reflection-element.jsx +0 -38
  889. package/src/table/filters/save-search-modal.jsx +0 -74
  890. package/src/table/filters/scope-element.jsx +0 -44
  891. package/src/table/header-column-content.jsx +0 -55
  892. package/src/table/header-column.jsx +0 -129
  893. package/src/table/header-select.jsx +0 -78
  894. package/src/table/model-callback-args.js +0 -10
  895. package/src/table/model-column.jsx +0 -86
  896. package/src/table/model-row.jsx +0 -140
  897. package/src/table/select-calculator.js +0 -65
  898. package/src/table/settings/column-row.jsx +0 -93
  899. package/src/table/settings/download-action.jsx +0 -73
  900. package/src/table/settings/index.jsx +0 -66
  901. package/src/table/table-settings.js +0 -262
  902. package/src/table/table.jsx +0 -957
  903. package/src/table/use-sorting.js +0 -35
  904. package/src/table/variables.scss +0 -11
  905. package/src/table/widths.jsx +0 -87
  906. package/src/table/worker-plugins-check-all-checkbox.jsx +0 -112
  907. package/src/table/worker-plugins-checkbox.jsx +0 -104
  908. package/src/translated-attributes.js +0 -11
  909. package/src/translated-collections-data.js.erb +0 -5
  910. package/src/translated-collections.js +0 -13
  911. package/src/updated-attribute.jsx +0 -93
  912. package/src/url-encode.js +0 -18
  913. package/src/use-breakpoint.js +0 -100
  914. package/src/use-can-can.js +0 -55
  915. package/src/use-collection.js +0 -280
  916. package/src/use-created-event.js +0 -55
  917. package/src/use-current-user.js +0 -133
  918. package/src/use-destroyed-event.js +0 -60
  919. package/src/use-event-emitter.js +0 -25
  920. package/src/use-event-listener.js +0 -23
  921. package/src/use-input.js +0 -159
  922. package/src/use-model-event.js +0 -60
  923. package/src/use-model.js +0 -189
  924. package/src/use-resize-observer.js +0 -24
  925. package/src/use-router.jsx +0 -128
  926. package/src/use-screen-layout.js +0 -49
  927. package/src/use-styles.js +0 -66
  928. package/src/use-updated-event.js +0 -60
  929. package/src/use-validation-errors.js +0 -33
  930. package/src/utils/button.jsx +0 -127
  931. package/src/utils/card.jsx +0 -58
  932. package/src/utils/checkbox.jsx +0 -73
  933. package/src/utils/checkboxes.jsx +0 -157
  934. package/src/utils/default-style.jsx +0 -80
  935. package/src/utils/header.jsx +0 -14
  936. package/src/utils/icon.jsx +0 -81
  937. package/src/utils/invalid-feedback.jsx +0 -20
  938. package/src/utils/modal.jsx +0 -64
  939. package/src/utils/text.jsx +0 -15
  940. package/src/validation-error.js +0 -35
  941. package/src/validation-errors.js +0 -121
  942. package/src/with-api-maker.jsx +0 -31
  943. package/src/with-collection.jsx +0 -17
  944. package/src/with-current-user.jsx +0 -10
  945. package/src/with-model.jsx +0 -16
  946. package/src/with-router.jsx +0 -11
@@ -1,828 +1,1289 @@
1
- import Attribute from "./base-model/attribute";
2
- import AttributeNotLoadedError from "./attribute-not-loaded-error";
3
- import CacheKeyGenerator from "./cache-key-generator";
4
- import Collection from "./collection";
5
- import CommandsPool from "./commands-pool";
6
- import Config from "./config";
7
- import CustomError from "./custom-error";
8
- import { digg } from "diggerize";
9
- import FormDataObjectizer from "form-data-objectizer";
10
- import * as inflection from "inflection";
11
- import ModelName from "./model-name";
12
- import NotLoadedError from "./not-loaded-error";
13
- import objectToFormData from "object-to-formdata";
14
- import Reflection from "./base-model/reflection";
15
- import Scope from "./base-model/scope";
16
- import Services from "./services";
17
- import ValidationError from "./validation-error";
18
- import { ValidationErrors } from "./validation-errors";
19
- const objectToUnderscore = object => {
20
- const newObject = {};
21
- for (const key in object) {
22
- const underscoreKey = inflection.underscore(key);
23
- newObject[underscoreKey] = object[key];
24
- }
25
- return newObject;
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
26
12
  };
27
- export default class BaseModel {
28
- static apiMakerType = "BaseModel";
29
- static attributes() {
30
- const attributes = digg(this.modelClassData(), "attributes");
31
- const result = [];
32
- for (const attributeKey in attributes) {
33
- const attributeData = attributes[attributeKey];
34
- const attribute = new Attribute(attributeData);
35
- result.push(attribute);
36
- }
37
- return result;
38
- }
39
- static hasAttribute(attributeName) {
40
- const attributes = digg(this.modelClassData(), "attributes");
41
- const lowerCaseAttributeName = inflection.underscore(attributeName);
42
- if (lowerCaseAttributeName in attributes) return true;
43
- return false;
44
- }
45
- static modelClassData() {
46
- throw new Error("modelClassData should be overriden by child");
47
- }
48
- static newCustomEvent = validationErrors => {
49
- return new CustomEvent("validation-errors", {
50
- detail: validationErrors
51
- });
52
- };
53
- static sendValidationErrorsEvent = (validationErrors, options) => {
54
- if (options && options.form) {
55
- const event = BaseModel.newCustomEvent(validationErrors);
56
- options.form.dispatchEvent(event);
57
- }
58
- };
59
- static async find(id) {
60
- const query = {};
61
- query[`${this.primaryKey()}_eq`] = id;
62
- const model = await this.ransack(query).first();
63
- if (model) {
64
- return model;
65
- } else {
66
- throw new CustomError("Record not found");
67
- }
68
- }
69
- static async findOrCreateBy(findOrCreateByArgs, args = {}) {
70
- const result = await Services.current().sendRequest("Models::FindOrCreateBy", {
71
- additional_data: args.additionalData,
72
- find_or_create_by_args: findOrCreateByArgs,
73
- resource_name: digg(this.modelClassData(), "name")
74
- });
75
- const model = digg(result, "model");
76
- return model;
77
- }
78
- static modelName() {
79
- return new ModelName({
80
- modelClassData: this.modelClassData()
81
- });
82
- }
83
- static primaryKey() {
84
- return digg(this.modelClassData(), "primaryKey");
85
- }
86
- static ransack(query = {}) {
87
- return new Collection({
88
- modelClass: this
89
- }, {
90
- ransack: query
91
- });
92
- }
93
- static select(select) {
94
- return this.ransack().select(select);
95
- }
96
- static ransackableAssociations() {
97
- const relationships = digg(this.modelClassData(), "ransackable_associations");
98
- const reflections = [];
99
- for (const relationshipData of relationships) {
100
- reflections.push(new Reflection(relationshipData));
101
- }
102
- return reflections;
103
- }
104
- static ransackableAttributes() {
105
- const attributes = digg(this.modelClassData(), "ransackable_attributes");
106
- const result = [];
107
- for (const attributeData of attributes) {
108
- result.push(new Attribute(attributeData));
109
- }
110
- return result;
111
- }
112
- static ransackableScopes() {
113
- const ransackableScopes = digg(this.modelClassData(), "ransackable_scopes");
114
- const result = [];
115
- for (const scopeData of ransackableScopes) {
116
- const scope = new Scope(scopeData);
117
- result.push(scope);
118
- }
119
- return result;
120
- }
121
- static reflections() {
122
- const relationships = digg(this.modelClassData(), "relationships");
123
- const reflections = [];
124
- for (const relationshipData of relationships) {
125
- const reflection = new Reflection(relationshipData);
126
- reflections.push(reflection);
127
- }
128
- return reflections;
129
- }
130
- static reflection(name) {
131
- const foundReflection = this.reflections().find(reflection => reflection.name() == name);
132
- if (!foundReflection) {
133
- throw new Error(`No such reflection: ${name} in ${this.reflections().map(reflection => reflection.name()).join(", ")}`);
134
- }
135
- return foundReflection;
136
- }
137
- static _token() {
138
- const csrfTokenElement = document.querySelector("meta[name='csrf-token']");
139
- if (csrfTokenElement) {
140
- return csrfTokenElement.getAttribute("content");
141
- }
142
- }
143
- constructor(args = {}) {
144
- this.changes = {};
145
- this.newRecord = args.isNewRecord;
146
- this.relationshipsCache = {};
147
- this.relationships = {};
148
- if (args && args.data && args.data.a) {
149
- this._readModelDataFromArgs(args);
150
- } else if (args.a) {
151
- this.abilities = args.b || {};
152
- this.modelData = objectToUnderscore(args.a);
153
- } else if (args) {
154
- this.abilities = {};
155
- this.modelData = objectToUnderscore(args);
156
- } else {
157
- this.abilities = {};
158
- this.modelData = {};
159
- }
160
- }
161
- assignAttributes(newAttributes) {
162
- for (const key in newAttributes) {
163
- const newValue = newAttributes[key];
164
- const attributeUnderscore = inflection.underscore(key);
165
- let applyChange = true;
166
- let deleteChange = false;
167
- if (this.isAttributeLoaded(key)) {
168
- const oldValue = this.readAttribute(key);
169
- const originalValue = this.modelData[attributeUnderscore];
170
- if (newValue == oldValue) {
171
- applyChange = false;
172
- } else if (newValue == originalValue) {
173
- applyChange = false;
174
- deleteChange = true;
175
- }
176
- }
177
- if (applyChange) {
178
- this.changes[attributeUnderscore] = newValue;
179
- } else if (deleteChange) {
180
- delete this.changes[attributeUnderscore];
181
- }
182
- }
183
- }
184
- attributes() {
185
- const result = {};
186
- for (const key in this.modelData) {
187
- result[key] = this.modelData[key];
188
- }
189
- for (const key in this.changes) {
190
- result[key] = this.changes[key];
191
- }
192
- return result;
193
- }
194
- can(givenAbilityName) {
195
- const abilityName = inflection.underscore(givenAbilityName);
196
- if (!(abilityName in this.abilities)) {
197
- throw new Error(`Ability ${abilityName} hasn't been loaded for ${digg(this.modelClassData(), "name")}`);
198
- }
199
- return this.abilities[abilityName];
200
- }
201
- clone() {
202
- const clone = new this.constructor();
203
- clone.abilities = {
204
- ...this.abilities
205
- };
206
- clone.modelData = {
207
- ...this.modelData
208
- };
209
- clone.relationships = {
210
- ...this.relationships
211
- };
212
- clone.relationshipsCache = {
213
- ...this.relationshipsCache
214
- };
215
- return clone;
216
- }
217
- cacheKey() {
218
- if (this.isPersisted()) {
219
- const keyParts = [this.modelClassData().paramKey, this.primaryKey()];
220
- if ("updated_at" in this.modelData) {
221
- const updatedAt = this.updatedAt();
222
- if (typeof updatedAt != "object") {
223
- throw new Error(`updatedAt wasn't an object: ${typeof updatedAt}`);
224
- } else if (!("getTime" in updatedAt)) {
225
- throw new Error(`updatedAt didn't support getTime with class: ${updatedAt.constructor && updatedAt.constructor.name}`);
226
- }
227
- keyParts.push(`updatedAt-${this.updatedAt().getTime()}`);
228
- }
229
- return keyParts.join("-");
230
- } else {
231
- return this.uniqueKey();
232
- }
233
- }
234
- localCacheKey() {
235
- const cacheKeyGenerator = new CacheKeyGenerator(this);
236
- return cacheKeyGenerator.local();
237
- }
238
- fullCacheKey() {
239
- const cacheKeyGenerator = new CacheKeyGenerator(this);
240
- return cacheKeyGenerator.cacheKey();
241
- }
242
- static all() {
243
- return this.ransack();
244
- }
245
- async create(attributes, options) {
246
- if (attributes) this.assignAttributes(attributes);
247
- const paramKey = this.modelClassData().paramKey;
248
- const modelData = this.getAttributes();
249
- const dataToUse = {};
250
- dataToUse[paramKey] = modelData;
251
- let response;
252
- try {
253
- response = await CommandsPool.addCommand({
254
- args: {
255
- save: dataToUse
256
- },
257
- command: `${this.modelClassData().collectionName}-create`,
258
- collectionName: this.modelClassData().collectionName,
259
- primaryKey: this.primaryKey(),
260
- type: "create"
261
- }, {});
262
- } catch (error) {
263
- BaseModel.parseValidationErrors({
264
- error,
265
- model: this,
266
- options
267
- });
268
- throw error;
269
- }
270
- if (response.model) {
271
- this._refreshModelFromResponse(response);
272
- this.changes = {};
273
- }
274
- return {
275
- model: this,
276
- response
277
- };
278
- }
279
- async createRaw(rawData, options = {}) {
280
- const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
281
- let response;
282
- try {
283
- response = await CommandsPool.addCommand({
284
- args: {
285
- save: objectData
286
- },
287
- command: `${this.modelClassData().collectionName}-create`,
288
- collectionName: this.modelClassData().collectionName,
289
- primaryKey: this.primaryKey(),
290
- type: "create"
291
- }, {});
292
- } catch (error) {
293
- BaseModel.parseValidationErrors({
294
- error,
295
- model: this,
296
- options
297
- });
298
- throw error;
299
- }
300
- if (response.model) {
301
- this._refreshModelDataFromResponse(response);
302
- this.changes = {};
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
303
18
  }
304
- return {
305
- model: this,
306
- response
307
- };
308
- }
309
- async destroy() {
310
- const response = await CommandsPool.addCommand({
311
- args: {
312
- query_params: this.collection && this.collection.params()
313
- },
314
- command: `${this.modelClassData().collectionName}-destroy`,
315
- collectionName: this.modelClassData().collectionName,
316
- primaryKey: this.primaryKey(),
317
- type: "destroy"
318
- }, {});
319
- if (response.success) {
320
- if (response.model) {
321
- this._refreshModelDataFromResponse(response);
322
- this.changes = {};
323
- }
324
- return {
325
- model: this,
326
- response
327
- };
328
- } else {
329
- this.handleResponseError(response);
330
- }
331
- }
332
- async ensureAbilities(listOfAbilities) {
333
- // Populate an array with a list of abilities currently not loaded
334
- const abilitiesToLoad = [];
335
- for (const abilityInList of listOfAbilities) {
336
- if (!(abilityInList in this.abilities)) {
337
- abilitiesToLoad.push(abilityInList);
338
- }
339
- }
340
-
341
- // Load the missing abilities if any
342
- if (abilitiesToLoad.length > 0) {
343
- const primaryKeyName = this.constructor.primaryKey();
344
- const ransackParams = {};
345
- ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
346
- const abilitiesParams = {};
347
- abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
348
- const anotherModel = await this.constructor.ransack(ransackParams).abilities(abilitiesParams).first();
349
- if (!anotherModel) {
350
- throw new Error(`Could not look up the same model ${this.primaryKey()} with abilities: ${abilitiesToLoad.join(", ")}`);
351
- }
352
- const newAbilities = anotherModel.abilities;
353
- for (const newAbility in newAbilities) {
354
- this.abilities[newAbility] = newAbilities[newAbility];
355
- }
356
- }
357
- }
358
- getAttributes = () => Object.assign(this.modelData, this.changes);
359
- handleResponseError(response) {
360
- BaseModel.parseValidationErrors({
361
- model: this,
362
- response
363
- });
364
- throw new new CustomError("Response wasn't successful", {
365
- model: this,
366
- response
367
- })();
368
- }
369
- identifierKey() {
370
- if (!this._identifierKey) this._identifierKey = this.isPersisted() ? this.primaryKey() : this.uniqueKey();
371
- return this._identifierKey;
372
- }
373
- isAssociationLoaded = associationName => this.isAssociationLoadedUnderscore(inflection.underscore(associationName));
374
- isAssociationLoadedUnderscore(associationNameUnderscore) {
375
- if (associationNameUnderscore in this.relationshipsCache) return true;
376
- return false;
377
- }
378
- isAssociationPresent(associationName) {
379
- if (this.isAssociationLoaded(associationName)) return true;
380
- if (associationName in this.relationships) return true;
381
- return false;
382
- }
383
- static parseValidationErrors({
384
- error,
385
- model,
386
- options
387
- }) {
388
- if (!(error instanceof ValidationError)) return;
389
- if (!error.args.response.validation_errors) return;
390
- const validationErrors = new ValidationErrors({
391
- model,
392
- validationErrors: digg(error, "args", "response", "validation_errors")
393
- });
394
- BaseModel.sendValidationErrorsEvent(validationErrors, options);
395
- if (!options || options.throwValidationError != false) {
396
- throw error;
397
- }
398
- }
399
- static humanAttributeName(attributeName) {
400
- const keyName = digg(this.modelClassData(), "i18nKey");
401
- const i18n = Config.getI18n();
402
- if (i18n) return i18n.t(`activerecord.attributes.${keyName}.${BaseModel.snakeCase(attributeName)}`, {
403
- defaultValue: attributeName
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
47
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
48
+ return new (P || (P = Promise))(function (resolve, reject) {
49
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
50
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
51
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
52
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
404
53
  });
405
- return inflection.humanize(attributeName);
406
- }
407
- isAttributeChanged(attributeName) {
408
- const attributeNameUnderscore = inflection.underscore(attributeName);
409
- const attributeData = this.modelClassData().attributes.find(attribute => digg(attribute, "name") == attributeNameUnderscore);
410
- if (!attributeData) {
411
- const attributeNames = this.modelClassData().attributes.map(attribute => digg(attribute, "name"));
412
- throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
413
- }
414
- if (!(attributeNameUnderscore in this.changes)) return false;
415
- const oldValue = this.modelData[attributeNameUnderscore];
416
- const newValue = this.changes[attributeNameUnderscore];
417
- const changedMethod = this[`_is${inflection.camelize(attributeData.type, true)}Changed`];
418
- if (!changedMethod) throw new Error(`Don't know how to handle type: ${attributeData.type}`);
419
- return changedMethod(oldValue, newValue);
420
- }
421
- isChanged() {
422
- const keys = Object.keys(this.changes);
423
- if (keys.length > 0) {
424
- return true;
425
- } else {
426
- return false;
427
- }
428
- }
429
- isNewRecord() {
430
- if (this.newRecord !== undefined) {
431
- return this.newRecord;
432
- } else if ("id" in this.modelData && this.modelData.id) {
433
- return false;
434
- } else {
435
- return true;
436
- }
437
- }
438
- isPersisted = () => !this.isNewRecord();
439
- static snakeCase = string => inflection.underscore(string);
440
- savedChangeToAttribute(attributeName) {
441
- if (!this.previousModelData) return false;
442
- const attributeNameUnderscore = inflection.underscore(attributeName);
443
- const attributeData = this.modelClassData().attributes.find(attribute => attribute.name == attributeNameUnderscore);
444
- if (!attributeData) {
445
- const attributeNames = this.modelClassData().attributes.map(attribute => attribute.name);
446
- throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
447
- }
448
- if (!(attributeNameUnderscore in this.previousModelData)) return true;
449
- const oldValue = this.previousModelData[attributeNameUnderscore];
450
- const newValue = this.modelData[attributeNameUnderscore];
451
- const changedMethodName = `_is${inflection.camelize(attributeData.type)}Changed`;
452
- const changedMethod = this[changedMethodName];
453
- if (!changedMethod) throw new Error(`Don't know how to handle type: ${attributeData.type}`);
454
- return changedMethod(oldValue, newValue);
455
- }
456
- setNewModel(model) {
457
- this.setNewModelData(model);
458
- for (const relationshipName in model.relationships) {
459
- this.relationships[relationshipName] = model.relationships[relationshipName];
460
- }
461
- for (const relationshipCacheName in model.relationshipsCache) {
462
- this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[name];
463
- }
464
- }
465
- setNewModelData(model) {
466
- if (!("modelData" in model)) throw new Error(`No modelData in model: ${JSON.stringify(model)}`);
467
- this.previousModelData = Object.assign({}, digg(this, "modelData"));
468
- for (const attributeName in model.modelData) {
469
- this.modelData[attributeName] = model.modelData[attributeName];
470
- }
471
- }
472
- _isDateChanged(oldValue, newValue) {
473
- if (Date.parse(oldValue) != Date.parse(newValue)) return true;
474
- }
475
- _isIntegerChanged(oldValue, newValue) {
476
- if (parseInt(oldValue, 10) != parseInt(newValue, 10)) return true;
477
- }
478
- _isStringChanged(oldValue, newValue) {
479
- const oldConvertedValue = `${oldValue}`;
480
- const newConvertedValue = `${newValue}`;
481
- if (oldConvertedValue != newConvertedValue) return true;
482
- }
483
- modelClassData = () => this.constructor.modelClassData();
484
- async reload() {
485
- const params = this.collection && this.collection.params();
486
- const ransackParams = {};
487
- ransackParams[`${this.constructor.primaryKey()}_eq`] = this.primaryKey();
488
- let query = this.constructor.ransack(ransackParams);
489
- if (params) {
490
- if (params.preload) {
491
- query.queryArgs.preload = params.preload;
492
- }
493
- if (params.select) {
494
- query.queryArgs.select = params.select;
495
- }
496
- if (params.select_columns) {
497
- query.queryArgs.selectColumns = params.select_columns;
498
- }
499
- }
500
- const model = await query.first();
501
- this.setNewModel(model);
502
- this.changes = {};
503
- }
504
- save() {
505
- if (this.isNewRecord()) {
506
- return this.create();
507
- } else {
508
- return this.update();
509
- }
510
- }
511
- saveRaw(rawData, options = {}) {
512
- if (this.isNewRecord()) {
513
- return this.createRaw(rawData, options);
514
- } else {
515
- return this.updateRaw(rawData, options);
516
- }
517
- }
518
- async update(newAttributes, options) {
519
- if (newAttributes) {
520
- this.assignAttributes(newAttributes);
521
- }
522
- if (Object.keys(this.changes).length == 0) {
523
- return {
524
- model: this
525
- };
54
+ };
55
+ var __generator = (this && this.__generator) || function (thisArg, body) {
56
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
57
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
58
+ function verb(n) { return function (v) { return step([n, v]); }; }
59
+ function step(op) {
60
+ if (f) throw new TypeError("Generator is already executing.");
61
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
62
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
63
+ if (y = 0, t) op = [op[0] & 2, t.value];
64
+ switch (op[0]) {
65
+ case 0: case 1: t = op; break;
66
+ case 4: _.label++; return { value: op[1], done: false };
67
+ case 5: _.label++; y = op[1]; op = [0]; continue;
68
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
69
+ default:
70
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
71
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
72
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
73
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
74
+ if (t[2]) _.ops.pop();
75
+ _.trys.pop(); continue;
76
+ }
77
+ op = body.call(thisArg, _);
78
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
79
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
526
80
  }
527
- const paramKey = this.modelClassData().paramKey;
528
- const modelData = this.changes;
529
- const dataToUse = {};
530
- dataToUse[paramKey] = modelData;
531
- let response;
532
- try {
533
- response = await CommandsPool.addCommand({
534
- args: {
535
- query_params: this.collection && this.collection.params(),
536
- save: dataToUse
537
- },
538
- command: `${this.modelClassData().collectionName}-update`,
539
- collectionName: this.modelClassData().collectionName,
540
- primaryKey: this.primaryKey(),
541
- type: "update"
542
- }, {});
543
- } catch (error) {
544
- BaseModel.parseValidationErrors({
545
- error,
546
- model: this,
547
- options
548
- });
549
- throw error;
81
+ };
82
+ var __importDefault = (this && this.__importDefault) || function (mod) {
83
+ return (mod && mod.__esModule) ? mod : { "default": mod };
84
+ };
85
+ Object.defineProperty(exports, "__esModule", { value: true });
86
+ var attribute_1 = __importDefault(require("./base-model/attribute"));
87
+ var attribute_not_loaded_error_1 = __importDefault(require("./attribute-not-loaded-error"));
88
+ var cache_key_generator_1 = __importDefault(require("./cache-key-generator"));
89
+ var collection_js_1 = __importDefault(require("./collection.js"));
90
+ var commands_pool_js_1 = __importDefault(require("./commands-pool.js"));
91
+ var config_js_1 = __importDefault(require("./config.js"));
92
+ var custom_error_js_1 = __importDefault(require("./custom-error.js"));
93
+ var diggerize_1 = require("diggerize");
94
+ var form_data_objectizer_1 = __importDefault(require("form-data-objectizer"));
95
+ var inflection = __importStar(require("inflection"));
96
+ var model_name_1 = __importDefault(require("./model-name"));
97
+ var not_loaded_error_1 = __importDefault(require("./not-loaded-error"));
98
+ var object_to_formdata_1 = __importDefault(require("object-to-formdata"));
99
+ var reflection_1 = __importDefault(require("./base-model/reflection"));
100
+ var scope_1 = __importDefault(require("./base-model/scope"));
101
+ var services_js_1 = __importDefault(require("./services.js"));
102
+ var validation_error_js_1 = __importDefault(require("./validation-error.js"));
103
+ var validation_errors_js_1 = require("./validation-errors.js");
104
+ /**
105
+ * @typedef {object} ModelClassDataType
106
+ * @property {import("./base-model/attribute.js").AttributeArgType[]} attributes
107
+ * @property {string} collectionName
108
+ * @property {string} name
109
+ * @property {string} paramKey
110
+ * @property {string} primaryKey
111
+ * @property {object} ransackable_attributes
112
+ */
113
+ /**
114
+ * @typedef {object} ParseValidationErrorsOptions
115
+ * @property {object} [form]
116
+ * @property {boolean} [throwValidationError]
117
+ */
118
+ function objectToUnderscore(object) {
119
+ var newObject = {};
120
+ for (var key in object) {
121
+ var underscoreKey = inflection.underscore(key);
122
+ newObject[underscoreKey] = object[key];
550
123
  }
551
- if (response.success) {
552
- if (response.model) {
553
- this._refreshModelFromResponse(response);
124
+ return newObject;
125
+ }
126
+ var BaseModel = /** @class */ (function () {
127
+ function BaseModel(args) {
128
+ if (args === void 0) { args = {}; }
129
+ this._callMemberCommand = function (args, commandArgs) { return commands_pool_js_1.default.addCommand(args, commandArgs); };
554
130
  this.changes = {};
555
- }
556
- return {
557
- response,
558
- model: this
559
- };
560
- } else {
561
- this.handleResponseError(response);
562
- }
563
- }
564
- _refreshModelFromResponse(response) {
565
- let newModel = digg(response, "model");
566
- if (Array.isArray(newModel)) newModel = newModel[0];
567
- this.setNewModel(newModel);
568
- }
569
- _refreshModelDataFromResponse(response) {
570
- let newModel = digg(response, "model");
571
- if (Array.isArray(newModel)) newModel = newModel[0];
572
- this.setNewModelData(newModel);
573
- }
574
- static _objectDataFromGivenRawData(rawData, options) {
575
- if (rawData instanceof FormData || rawData.nodeName == "FORM") {
576
- const formData = FormDataObjectizer.formDataFromObject(rawData, options);
577
- return FormDataObjectizer.toObject(formData);
578
- }
579
- return rawData;
580
- }
581
- async updateRaw(rawData, options = {}) {
582
- const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
583
- let response;
584
- try {
585
- response = await CommandsPool.addCommand({
586
- args: {
587
- query_params: this.collection && this.collection.params(),
588
- save: objectData,
589
- simple_model_errors: options?.simpleModelErrors
590
- },
591
- command: `${this.modelClassData().collectionName}-update`,
592
- collectionName: this.modelClassData().collectionName,
593
- primaryKey: this.primaryKey(),
594
- type: "update"
595
- }, {});
596
- } catch (error) {
597
- BaseModel.parseValidationErrors({
598
- error,
599
- model: this,
600
- options
601
- });
602
- throw error;
603
- }
604
- if (response.model) {
605
- this._refreshModelFromResponse(response);
606
- this.changes = {};
607
- }
608
- return {
609
- response,
610
- model: this
611
- };
612
- }
613
- isValid() {
614
- throw new Error("Not implemented yet");
615
- }
616
- async isValidOnServer() {
617
- const modelData = this.getAttributes();
618
- const paramKey = this.modelClassData().paramKey;
619
- const dataToUse = {};
620
- dataToUse[paramKey] = modelData;
621
- const response = await CommandsPool.addCommand({
622
- args: {
623
- save: dataToUse
624
- },
625
- command: `${this.modelClassData().collectionName}-valid`,
626
- collectionName: this.modelClassData().collectionName,
627
- primaryKey: this.primaryKey(),
628
- type: "valid"
629
- }, {});
630
- return {
631
- valid: response.valid,
632
- errors: response.errors
633
- };
634
- }
635
- modelClass = () => this.constructor;
636
- preloadRelationship(relationshipName, model) {
637
- this.relationshipsCache[BaseModel.snakeCase(relationshipName)] = model;
638
- this.relationships[BaseModel.snakeCase(relationshipName)] = model;
639
- }
640
- markForDestruction() {
641
- this._markedForDestruction = true;
642
- }
643
- markedForDestruction = () => this._markedForDestruction;
644
- uniqueKey() {
645
- if (!this.uniqueKeyValue) {
646
- const min = 5000000000000000;
647
- const max = 9007199254740991;
648
- const randomBetween = Math.floor(Math.random() * (max - min + 1) + min);
649
- this.uniqueKeyValue = randomBetween;
650
- }
651
- return this.uniqueKeyValue;
652
- }
653
- static async _callCollectionCommand(args, commandArgs) {
654
- const formOrDataObject = args.args;
655
- try {
656
- return await CommandsPool.addCommand(args, commandArgs);
657
- } catch (error) {
658
- let form;
659
- if (commandArgs.form) {
660
- form = commandArgs.form;
661
- } else if (formOrDataObject?.nodeName == "FORM") {
662
- form = formOrDataObject;
663
- }
664
- if (form) BaseModel.parseValidationErrors({
665
- error,
666
- options: {
667
- form
668
- }
669
- });
670
- throw error;
671
- }
672
- }
673
- _callMemberCommand = (args, commandArgs) => CommandsPool.addCommand(args, commandArgs);
674
- static _postDataFromArgs(args) {
675
- let postData;
676
- if (args) {
677
- if (args instanceof FormData) {
678
- postData = args;
679
- } else {
680
- postData = objectToFormData.serialize(args, {}, null, "args");
681
- }
682
- } else {
683
- postData = new FormData();
684
- }
685
- return postData;
686
- }
687
- readAttribute(attributeName) {
688
- const attributeNameUnderscore = inflection.underscore(attributeName);
689
- return this.readAttributeUnderscore(attributeNameUnderscore);
690
- }
691
- readAttributeUnderscore(attributeName) {
692
- if (attributeName in this.changes) {
693
- return this.changes[attributeName];
694
- } else if (attributeName in this.modelData) {
695
- return this.modelData[attributeName];
696
- } else if (this.isNewRecord()) {
697
- // Return null if this is a new record and the attribute name is a recognized attribute
698
- const attributes = digg(this.modelClassData(), "attributes");
699
- if (attributeName in attributes) return null;
700
- }
701
- if (this.isPersisted()) {
702
- throw new AttributeNotLoadedError(`No such attribute: ${digg(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
703
- }
704
- }
705
- isAttributeLoaded(attributeName) {
706
- const attributeNameUnderscore = inflection.underscore(attributeName);
707
- if (attributeNameUnderscore in this.changes) return true;
708
- if (attributeNameUnderscore in this.modelData) return true;
709
- return false;
710
- }
711
- _isPresent(value) {
712
- if (!value) {
713
- return false;
714
- } else if (typeof value == "string" && value.match(/^\s*$/)) {
715
- return false;
716
- }
717
- return true;
718
- }
719
- async _loadBelongsToReflection(args, queryArgs = {}) {
720
- if (args.reflectionName in this.relationships) {
721
- return this.relationships[args.reflectionName];
722
- } else if (args.reflectionName in this.relationshipsCache) {
723
- return this.relationshipsCache[args.reflectionName];
724
- } else {
725
- const collection = new Collection(args, queryArgs);
726
- const model = await collection.first();
727
- this.relationshipsCache[args.reflectionName] = model;
728
- return model;
729
- }
730
- }
731
- _readBelongsToReflection({
732
- reflectionName
733
- }) {
734
- if (reflectionName in this.relationships) {
735
- return this.relationships[reflectionName];
736
- } else if (reflectionName in this.relationshipsCache) {
737
- return this.relationshipsCache[reflectionName];
738
- }
739
- if (this.isNewRecord()) return null;
740
- const loadedRelationships = Object.keys(this.relationshipsCache);
741
- const modelClassName = digg(this.modelClassData(), "name");
742
- throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
743
- }
744
- async _loadHasManyReflection(args, queryArgs = {}) {
745
- if (args.reflectionName in this.relationships) {
746
- return this.relationships[args.reflectionName];
747
- } else if (args.reflectionName in this.relationshipsCache) {
748
- return this.relationshipsCache[args.reflectionName];
749
- }
750
- const collection = new Collection(args, queryArgs);
751
- const models = await collection.toArray();
752
- this.relationshipsCache[args.reflectionName] = models;
753
- return models;
754
- }
755
- async _loadHasOneReflection(args, queryArgs = {}) {
756
- if (args.reflectionName in this.relationships) {
757
- return this.relationships[args.reflectionName];
758
- } else if (args.reflectionName in this.relationshipsCache) {
759
- return this.relationshipsCache[args.reflectionName];
760
- } else {
761
- const collection = new Collection(args, queryArgs);
762
- const model = await collection.first();
763
- this.relationshipsCache[args.reflectionName] = model;
764
- return model;
765
- }
766
- }
767
- _readHasOneReflection({
768
- reflectionName
769
- }) {
770
- if (reflectionName in this.relationships) {
771
- return this.relationships[reflectionName];
772
- } else if (reflectionName in this.relationshipsCache) {
773
- return this.relationshipsCache[reflectionName];
774
- }
775
- if (this.isNewRecord()) {
776
- return null;
777
- }
778
- const loadedRelationships = Object.keys(this.relationshipsCache);
779
- const modelClassName = digg(this.modelClassData(), "name");
780
- throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
781
- }
782
- _readModelDataFromArgs(args) {
783
- this.abilities = args.data.b || {};
784
- this.collection = args.collection;
785
- this.modelData = objectToUnderscore(args.data.a);
786
- this.preloadedRelationships = args.data.r;
787
- }
788
- _readPreloadedRelationships(preloaded) {
789
- if (!this.preloadedRelationships) {
790
- return;
791
- }
792
- const relationships = digg(this.modelClassData(), "relationships");
793
- for (const relationshipName in this.preloadedRelationships) {
794
- const relationshipData = this.preloadedRelationships[relationshipName];
795
- const relationshipClassData = relationships.find(relationship => digg(relationship, "name") == relationshipName);
796
- if (!relationshipClassData) {
797
- const modelName = digg(this.modelClassData(), "name");
798
- const relationshipsList = relationships.map(relationship => relationship.name).join(", ");
799
- throw new Error(`Could not find the relation ${relationshipName} on the ${modelName} model: ${relationshipsList}`);
800
- }
801
- const relationshipType = digg(relationshipClassData, "collectionName");
802
- if (relationshipName in this.relationshipsCache) {
803
- throw new Error(`${relationshipName} has already been loaded`);
804
- }
805
- if (!relationshipClassData) {
806
- throw new Error(`No relationship on ${digg(this.modelClassData(), "name")} by that name: ${relationshipName}`);
807
- }
808
- if (!relationshipData) {
809
- this.relationshipsCache[relationshipName] = null;
810
- this.relationships[relationshipName] = null;
811
- } else if (Array.isArray(relationshipData)) {
812
- this.relationshipsCache[relationshipName] = [];
813
- this.relationships[relationshipName] = [];
814
- for (const relationshipId of relationshipData) {
815
- const model = preloaded.getModel(relationshipType, relationshipId);
816
- this.relationshipsCache[relationshipName].push(model);
817
- this.relationships[relationshipName].push(model);
818
- }
819
- } else {
820
- const model = preloaded.getModel(relationshipType, relationshipData);
821
- this.relationshipsCache[relationshipName] = model;
822
- this.relationships[relationshipName] = model;
823
- }
131
+ this.newRecord = args.isNewRecord;
132
+ this.relationshipsCache = {};
133
+ this.relationships = {};
134
+ if (args && args.data && args.data.a) {
135
+ this._readModelDataFromArgs(args);
136
+ }
137
+ else if (args.a) {
138
+ this.abilities = args.b || {};
139
+ this.modelData = objectToUnderscore(args.a);
140
+ }
141
+ else if (args) {
142
+ this.abilities = {};
143
+ this.modelData = objectToUnderscore(args);
144
+ }
145
+ else {
146
+ this.abilities = {};
147
+ this.modelData = {};
148
+ }
824
149
  }
825
- }
826
- primaryKey = () => this.readAttributeUnderscore(this.constructor.primaryKey());
827
- }
828
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBdHRyaWJ1dGUiLCJBdHRyaWJ1dGVOb3RMb2FkZWRFcnJvciIsIkNhY2hlS2V5R2VuZXJhdG9yIiwiQ29sbGVjdGlvbiIsIkNvbW1hbmRzUG9vbCIsIkNvbmZpZyIsIkN1c3RvbUVycm9yIiwiZGlnZyIsIkZvcm1EYXRhT2JqZWN0aXplciIsImluZmxlY3Rpb24iLCJNb2RlbE5hbWUiLCJOb3RMb2FkZWRFcnJvciIsIm9iamVjdFRvRm9ybURhdGEiLCJSZWZsZWN0aW9uIiwiU2NvcGUiLCJTZXJ2aWNlcyIsIlZhbGlkYXRpb25FcnJvciIsIlZhbGlkYXRpb25FcnJvcnMiLCJvYmplY3RUb1VuZGVyc2NvcmUiLCJvYmplY3QiLCJuZXdPYmplY3QiLCJrZXkiLCJ1bmRlcnNjb3JlS2V5IiwidW5kZXJzY29yZSIsIkJhc2VNb2RlbCIsImFwaU1ha2VyVHlwZSIsImF0dHJpYnV0ZXMiLCJtb2RlbENsYXNzRGF0YSIsInJlc3VsdCIsImF0dHJpYnV0ZUtleSIsImF0dHJpYnV0ZURhdGEiLCJhdHRyaWJ1dGUiLCJwdXNoIiwiaGFzQXR0cmlidXRlIiwiYXR0cmlidXRlTmFtZSIsImxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUiLCJFcnJvciIsIm5ld0N1c3RvbUV2ZW50IiwidmFsaWRhdGlvbkVycm9ycyIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwic2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCIsIm9wdGlvbnMiLCJmb3JtIiwiZXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiZmluZCIsImlkIiwicXVlcnkiLCJwcmltYXJ5S2V5IiwibW9kZWwiLCJyYW5zYWNrIiwiZmlyc3QiLCJmaW5kT3JDcmVhdGVCeSIsImZpbmRPckNyZWF0ZUJ5QXJncyIsImFyZ3MiLCJjdXJyZW50Iiwic2VuZFJlcXVlc3QiLCJhZGRpdGlvbmFsX2RhdGEiLCJhZGRpdGlvbmFsRGF0YSIsImZpbmRfb3JfY3JlYXRlX2J5X2FyZ3MiLCJyZXNvdXJjZV9uYW1lIiwibW9kZWxOYW1lIiwibW9kZWxDbGFzcyIsInNlbGVjdCIsInJhbnNhY2thYmxlQXNzb2NpYXRpb25zIiwicmVsYXRpb25zaGlwcyIsInJlZmxlY3Rpb25zIiwicmVsYXRpb25zaGlwRGF0YSIsInJhbnNhY2thYmxlQXR0cmlidXRlcyIsInJhbnNhY2thYmxlU2NvcGVzIiwic2NvcGVEYXRhIiwic2NvcGUiLCJyZWZsZWN0aW9uIiwibmFtZSIsImZvdW5kUmVmbGVjdGlvbiIsIm1hcCIsImpvaW4iLCJfdG9rZW4iLCJjc3JmVG9rZW5FbGVtZW50IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0QXR0cmlidXRlIiwiY29uc3RydWN0b3IiLCJjaGFuZ2VzIiwibmV3UmVjb3JkIiwiaXNOZXdSZWNvcmQiLCJyZWxhdGlvbnNoaXBzQ2FjaGUiLCJkYXRhIiwiYSIsIl9yZWFkTW9kZWxEYXRhRnJvbUFyZ3MiLCJhYmlsaXRpZXMiLCJiIiwibW9kZWxEYXRhIiwiYXNzaWduQXR0cmlidXRlcyIsIm5ld0F0dHJpYnV0ZXMiLCJuZXdWYWx1ZSIsImF0dHJpYnV0ZVVuZGVyc2NvcmUiLCJhcHBseUNoYW5nZSIsImRlbGV0ZUNoYW5nZSIsImlzQXR0cmlidXRlTG9hZGVkIiwib2xkVmFsdWUiLCJyZWFkQXR0cmlidXRlIiwib3JpZ2luYWxWYWx1ZSIsImNhbiIsImdpdmVuQWJpbGl0eU5hbWUiLCJhYmlsaXR5TmFtZSIsImNsb25lIiwiY2FjaGVLZXkiLCJpc1BlcnNpc3RlZCIsImtleVBhcnRzIiwicGFyYW1LZXkiLCJ1cGRhdGVkQXQiLCJnZXRUaW1lIiwidW5pcXVlS2V5IiwibG9jYWxDYWNoZUtleSIsImNhY2hlS2V5R2VuZXJhdG9yIiwibG9jYWwiLCJmdWxsQ2FjaGVLZXkiLCJhbGwiLCJjcmVhdGUiLCJnZXRBdHRyaWJ1dGVzIiwiZGF0YVRvVXNlIiwicmVzcG9uc2UiLCJhZGRDb21tYW5kIiwic2F2ZSIsImNvbW1hbmQiLCJjb2xsZWN0aW9uTmFtZSIsInR5cGUiLCJlcnJvciIsInBhcnNlVmFsaWRhdGlvbkVycm9ycyIsIl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UiLCJjcmVhdGVSYXciLCJyYXdEYXRhIiwib2JqZWN0RGF0YSIsIl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YSIsIl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlIiwiZGVzdHJveSIsInF1ZXJ5X3BhcmFtcyIsImNvbGxlY3Rpb24iLCJwYXJhbXMiLCJzdWNjZXNzIiwiaGFuZGxlUmVzcG9uc2VFcnJvciIsImVuc3VyZUFiaWxpdGllcyIsImxpc3RPZkFiaWxpdGllcyIsImFiaWxpdGllc1RvTG9hZCIsImFiaWxpdHlJbkxpc3QiLCJsZW5ndGgiLCJwcmltYXJ5S2V5TmFtZSIsInJhbnNhY2tQYXJhbXMiLCJhYmlsaXRpZXNQYXJhbXMiLCJhbm90aGVyTW9kZWwiLCJuZXdBYmlsaXRpZXMiLCJuZXdBYmlsaXR5IiwiT2JqZWN0IiwiYXNzaWduIiwiaWRlbnRpZmllcktleSIsIl9pZGVudGlmaWVyS2V5IiwiaXNBc3NvY2lhdGlvbkxvYWRlZCIsImFzc29jaWF0aW9uTmFtZSIsImlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlIiwiYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSIsImlzQXNzb2NpYXRpb25QcmVzZW50IiwidmFsaWRhdGlvbl9lcnJvcnMiLCJ0aHJvd1ZhbGlkYXRpb25FcnJvciIsImh1bWFuQXR0cmlidXRlTmFtZSIsImtleU5hbWUiLCJpMThuIiwiZ2V0STE4biIsInQiLCJzbmFrZUNhc2UiLCJkZWZhdWx0VmFsdWUiLCJodW1hbml6ZSIsImlzQXR0cmlidXRlQ2hhbmdlZCIsImF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIiwiYXR0cmlidXRlTmFtZXMiLCJjaGFuZ2VkTWV0aG9kIiwiY2FtZWxpemUiLCJpc0NoYW5nZWQiLCJrZXlzIiwidW5kZWZpbmVkIiwic3RyaW5nIiwic2F2ZWRDaGFuZ2VUb0F0dHJpYnV0ZSIsInByZXZpb3VzTW9kZWxEYXRhIiwiY2hhbmdlZE1ldGhvZE5hbWUiLCJzZXROZXdNb2RlbCIsInNldE5ld01vZGVsRGF0YSIsInJlbGF0aW9uc2hpcE5hbWUiLCJyZWxhdGlvbnNoaXBDYWNoZU5hbWUiLCJKU09OIiwic3RyaW5naWZ5IiwiX2lzRGF0ZUNoYW5nZWQiLCJEYXRlIiwicGFyc2UiLCJfaXNJbnRlZ2VyQ2hhbmdlZCIsInBhcnNlSW50IiwiX2lzU3RyaW5nQ2hhbmdlZCIsIm9sZENvbnZlcnRlZFZhbHVlIiwibmV3Q29udmVydGVkVmFsdWUiLCJyZWxvYWQiLCJwcmVsb2FkIiwicXVlcnlBcmdzIiwic2VsZWN0X2NvbHVtbnMiLCJzZWxlY3RDb2x1bW5zIiwidXBkYXRlIiwic2F2ZVJhdyIsInVwZGF0ZVJhdyIsIm5ld01vZGVsIiwiQXJyYXkiLCJpc0FycmF5IiwiRm9ybURhdGEiLCJub2RlTmFtZSIsImZvcm1EYXRhIiwiZm9ybURhdGFGcm9tT2JqZWN0IiwidG9PYmplY3QiLCJzaW1wbGVfbW9kZWxfZXJyb3JzIiwic2ltcGxlTW9kZWxFcnJvcnMiLCJpc1ZhbGlkIiwiaXNWYWxpZE9uU2VydmVyIiwidmFsaWQiLCJlcnJvcnMiLCJwcmVsb2FkUmVsYXRpb25zaGlwIiwibWFya0ZvckRlc3RydWN0aW9uIiwiX21hcmtlZEZvckRlc3RydWN0aW9uIiwibWFya2VkRm9yRGVzdHJ1Y3Rpb24iLCJ1bmlxdWVLZXlWYWx1ZSIsIm1pbiIsIm1heCIsInJhbmRvbUJldHdlZW4iLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJfY2FsbENvbGxlY3Rpb25Db21tYW5kIiwiY29tbWFuZEFyZ3MiLCJmb3JtT3JEYXRhT2JqZWN0IiwiX2NhbGxNZW1iZXJDb21tYW5kIiwiX3Bvc3REYXRhRnJvbUFyZ3MiLCJwb3N0RGF0YSIsInNlcmlhbGl6ZSIsInJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlIiwiX2lzUHJlc2VudCIsInZhbHVlIiwibWF0Y2giLCJfbG9hZEJlbG9uZ3NUb1JlZmxlY3Rpb24iLCJyZWZsZWN0aW9uTmFtZSIsIl9yZWFkQmVsb25nc1RvUmVmbGVjdGlvbiIsImxvYWRlZFJlbGF0aW9uc2hpcHMiLCJtb2RlbENsYXNzTmFtZSIsIl9sb2FkSGFzTWFueVJlZmxlY3Rpb24iLCJtb2RlbHMiLCJ0b0FycmF5IiwiX2xvYWRIYXNPbmVSZWZsZWN0aW9uIiwiX3JlYWRIYXNPbmVSZWZsZWN0aW9uIiwicHJlbG9hZGVkUmVsYXRpb25zaGlwcyIsInIiLCJfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMiLCJwcmVsb2FkZWQiLCJyZWxhdGlvbnNoaXBDbGFzc0RhdGEiLCJyZWxhdGlvbnNoaXAiLCJyZWxhdGlvbnNoaXBzTGlzdCIsInJlbGF0aW9uc2hpcFR5cGUiLCJyZWxhdGlvbnNoaXBJZCIsImdldE1vZGVsIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtbW9kZWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEF0dHJpYnV0ZSBmcm9tIFwiLi9iYXNlLW1vZGVsL2F0dHJpYnV0ZVwiXG5pbXBvcnQgQXR0cmlidXRlTm90TG9hZGVkRXJyb3IgZnJvbSBcIi4vYXR0cmlidXRlLW5vdC1sb2FkZWQtZXJyb3JcIlxuaW1wb3J0IENhY2hlS2V5R2VuZXJhdG9yIGZyb20gXCIuL2NhY2hlLWtleS1nZW5lcmF0b3JcIlxuaW1wb3J0IENvbGxlY3Rpb24gZnJvbSBcIi4vY29sbGVjdGlvblwiXG5pbXBvcnQgQ29tbWFuZHNQb29sIGZyb20gXCIuL2NvbW1hbmRzLXBvb2xcIlxuaW1wb3J0IENvbmZpZyBmcm9tIFwiLi9jb25maWdcIlxuaW1wb3J0IEN1c3RvbUVycm9yIGZyb20gXCIuL2N1c3RvbS1lcnJvclwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IEZvcm1EYXRhT2JqZWN0aXplciBmcm9tIFwiZm9ybS1kYXRhLW9iamVjdGl6ZXJcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxOYW1lIGZyb20gXCIuL21vZGVsLW5hbWVcIlxuaW1wb3J0IE5vdExvYWRlZEVycm9yIGZyb20gXCIuL25vdC1sb2FkZWQtZXJyb3JcIlxuaW1wb3J0IG9iamVjdFRvRm9ybURhdGEgZnJvbSBcIm9iamVjdC10by1mb3JtZGF0YVwiXG5pbXBvcnQgUmVmbGVjdGlvbiBmcm9tIFwiLi9iYXNlLW1vZGVsL3JlZmxlY3Rpb25cIlxuaW1wb3J0IFNjb3BlIGZyb20gXCIuL2Jhc2UtbW9kZWwvc2NvcGVcIlxuaW1wb3J0IFNlcnZpY2VzIGZyb20gXCIuL3NlcnZpY2VzXCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvclwiXG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcnN9IGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3JzXCJcblxuY29uc3Qgb2JqZWN0VG9VbmRlcnNjb3JlID0gKG9iamVjdCkgPT4ge1xuICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiQmFzZU1vZGVsXCJcblxuICBzdGF0aWMgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZUtleSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gYXR0cmlidXRlc1thdHRyaWJ1dGVLZXldXG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpXG5cbiAgICAgIHJlc3VsdC5wdXNoKGF0dHJpYnV0ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBzdGF0aWMgaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChsb3dlckNhc2VBdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHN0YXRpYyBtb2RlbENsYXNzRGF0YSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJtb2RlbENsYXNzRGF0YSBzaG91bGQgYmUgb3ZlcnJpZGVuIGJ5IGNoaWxkXCIpXG4gIH1cblxuICBzdGF0aWMgbmV3Q3VzdG9tRXZlbnQgPSAodmFsaWRhdGlvbkVycm9ycykgPT4ge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ2YWxpZGF0aW9uLWVycm9yc1wiLCB7ZGV0YWlsOiB2YWxpZGF0aW9uRXJyb3JzfSlcbiAgfVxuXG4gIHN0YXRpYyBzZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50ID0gKHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpID0+IHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcm0pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gQmFzZU1vZGVsLm5ld0N1c3RvbUV2ZW50KHZhbGlkYXRpb25FcnJvcnMpXG4gICAgICBvcHRpb25zLmZvcm0uZGlzcGF0Y2hFdmVudChldmVudClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZmluZChpZCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0ge31cblxuICAgIHF1ZXJ5W2Ake3RoaXMucHJpbWFyeUtleSgpfV9lcWBdID0gaWRcblxuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5yYW5zYWNrKHF1ZXJ5KS5maXJzdCgpXG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZWNvcmQgbm90IGZvdW5kXCIpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGZpbmRPckNyZWF0ZUJ5KGZpbmRPckNyZWF0ZUJ5QXJncywgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgU2VydmljZXMuY3VycmVudCgpLnNlbmRSZXF1ZXN0KFwiTW9kZWxzOjpGaW5kT3JDcmVhdGVCeVwiLCB7XG4gICAgICBhZGRpdGlvbmFsX2RhdGE6IGFyZ3MuYWRkaXRpb25hbERhdGEsXG4gICAgICBmaW5kX29yX2NyZWF0ZV9ieV9hcmdzOiBmaW5kT3JDcmVhdGVCeUFyZ3MsXG4gICAgICByZXNvdXJjZV9uYW1lOiBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgfSlcbiAgICBjb25zdCBtb2RlbCA9IGRpZ2cocmVzdWx0LCBcIm1vZGVsXCIpXG5cbiAgICByZXR1cm4gbW9kZWxcbiAgfVxuXG4gIHN0YXRpYyBtb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbE5hbWUoe21vZGVsQ2xhc3NEYXRhOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCl9KVxuICB9XG5cbiAgc3RhdGljIHByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInByaW1hcnlLZXlcIilcbiAgfVxuXG4gIHN0YXRpYyByYW5zYWNrKHF1ZXJ5ID0ge30pIHtcbiAgICByZXR1cm4gbmV3IENvbGxlY3Rpb24oe21vZGVsQ2xhc3M6IHRoaXN9LCB7cmFuc2FjazogcXVlcnl9KVxuICB9XG5cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKCkuc2VsZWN0KHNlbGVjdClcbiAgfVxuXG4gIHN0YXRpYyByYW5zYWNrYWJsZUFzc29jaWF0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmFuc2Fja2FibGVfYXNzb2NpYXRpb25zXCIpXG4gICAgY29uc3QgcmVmbGVjdGlvbnMgPSBbXVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBEYXRhIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gobmV3IFJlZmxlY3Rpb24ocmVsYXRpb25zaGlwRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmxlY3Rpb25zXG4gIH1cblxuICBzdGF0aWMgcmFuc2Fja2FibGVBdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGF0YSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHN0YXRpYyByYW5zYWNrYWJsZVNjb3BlcygpIHtcbiAgICBjb25zdCByYW5zYWNrYWJsZVNjb3BlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJhbnNhY2thYmxlX3Njb3Blc1wiKVxuICAgIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlRGF0YSBvZiByYW5zYWNrYWJsZVNjb3Blcykge1xuICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUoc2NvcGVEYXRhKVxuXG4gICAgICByZXN1bHQucHVzaChzY29wZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBzdGF0aWMgcmVmbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gocmVmbGVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIHN0YXRpYyByZWZsZWN0aW9uKG5hbWUpIHtcbiAgICBjb25zdCBmb3VuZFJlZmxlY3Rpb24gPSB0aGlzLnJlZmxlY3Rpb25zKCkuZmluZCgocmVmbGVjdGlvbikgPT4gcmVmbGVjdGlvbi5uYW1lKCkgPT0gbmFtZSlcblxuICAgIGlmICghZm91bmRSZWZsZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcmVmbGVjdGlvbjogJHtuYW1lfSBpbiAke3RoaXMucmVmbGVjdGlvbnMoKS5tYXAoKHJlZmxlY3Rpb24pID0+IHJlZmxlY3Rpb24ubmFtZSgpKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmRSZWZsZWN0aW9uXG4gIH1cblxuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB0aGlzLm5ld1JlY29yZCA9IGFyZ3MuaXNOZXdSZWNvcmRcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHt9XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzID0ge31cblxuICAgIGlmIChhcmdzICYmIGFyZ3MuZGF0YSAmJiBhcmdzLmRhdGEuYSkge1xuICAgICAgdGhpcy5fcmVhZE1vZGVsRGF0YUZyb21BcmdzKGFyZ3MpXG4gICAgfSBlbHNlIGlmIChhcmdzLmEpIHtcbiAgICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5iIHx8IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmEpXG4gICAgfSBlbHNlIGlmIChhcmdzKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IHt9XG4gICAgfVxuICB9XG5cbiAgYXNzaWduQXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV3QXR0cmlidXRlcykge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXdBdHRyaWJ1dGVzW2tleV1cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgICBsZXQgYXBwbHlDaGFuZ2UgPSB0cnVlXG4gICAgICBsZXQgZGVsZXRlQ2hhbmdlID0gZmFsc2VcblxuICAgICAgaWYgKHRoaXMuaXNBdHRyaWJ1dGVMb2FkZWQoa2V5KSkge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMucmVhZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVVbmRlcnNjb3JlXVxuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBvbGRWYWx1ZSkge1xuICAgICAgICAgIGFwcGx5Q2hhbmdlID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZSA9PSBvcmlnaW5hbFZhbHVlKSB7XG4gICAgICAgICAgYXBwbHlDaGFuZ2UgPSBmYWxzZVxuICAgICAgICAgIGRlbGV0ZUNoYW5nZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYXBwbHlDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZVVuZGVyc2NvcmVdID0gbmV3VmFsdWVcbiAgICAgIH0gZWxzZSBpZiAoZGVsZXRlQ2hhbmdlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNoYW5nZXNbYXR0cmlidXRlVW5kZXJzY29yZV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLm1vZGVsRGF0YVtrZXldXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jaGFuZ2VzKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMuY2hhbmdlc1trZXldXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY2FuKGdpdmVuQWJpbGl0eU5hbWUpIHtcbiAgICBjb25zdCBhYmlsaXR5TmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShnaXZlbkFiaWxpdHlOYW1lKVxuXG4gICAgaWYgKCEoYWJpbGl0eU5hbWUgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFiaWxpdHkgJHthYmlsaXR5TmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIGZvciAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hYmlsaXRpZXNbYWJpbGl0eU5hbWVdXG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICBjb25zdCBjbG9uZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKClcblxuICAgIGNsb25lLmFiaWxpdGllcyA9IHsuLi50aGlzLmFiaWxpdGllc31cbiAgICBjbG9uZS5tb2RlbERhdGEgPSB7Li4udGhpcy5tb2RlbERhdGF9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwcyA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHN9XG4gICAgY2xvbmUucmVsYXRpb25zaGlwc0NhY2hlID0gey4uLnRoaXMucmVsYXRpb25zaGlwc0NhY2hlfVxuXG4gICAgcmV0dXJuIGNsb25lXG4gIH1cblxuICBjYWNoZUtleSgpIHtcbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICBjb25zdCBrZXlQYXJ0cyA9IFtcbiAgICAgICAgdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5LFxuICAgICAgICB0aGlzLnByaW1hcnlLZXkoKVxuICAgICAgXVxuXG4gICAgICBpZiAoXCJ1cGRhdGVkX2F0XCIgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQoKVxuXG4gICAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEF0ICE9IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCB3YXNuJ3QgYW4gb2JqZWN0OiAke3R5cGVvZiB1cGRhdGVkQXR9YClcbiAgICAgICAgfSBlbHNlIGlmICghKFwiZ2V0VGltZVwiIGluIHVwZGF0ZWRBdCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVwZGF0ZWRBdCBkaWRuJ3Qgc3VwcG9ydCBnZXRUaW1lIHdpdGggY2xhc3M6ICR7dXBkYXRlZEF0LmNvbnN0cnVjdG9yICYmIHVwZGF0ZWRBdC5jb25zdHJ1Y3Rvci5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBrZXlQYXJ0cy5wdXNoKGB1cGRhdGVkQXQtJHt0aGlzLnVwZGF0ZWRBdCgpLmdldFRpbWUoKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5UGFydHMuam9pbihcIi1cIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudW5pcXVlS2V5KClcbiAgICB9XG4gIH1cblxuICBsb2NhbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IubG9jYWwoKVxuICB9XG5cbiAgZnVsbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IuY2FjaGVLZXkoKVxuICB9XG5cbiAgc3RhdGljIGFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKClcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKGF0dHJpYnV0ZXMpIHRoaXMuYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5nZXRBdHRyaWJ1dGVzKClcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWNyZWF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcImNyZWF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBvYmplY3REYXRhID0gQmFzZU1vZGVsLl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgYXJnczoge3F1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKX0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tZGVzdHJveWAsXG4gICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICB0eXBlOiBcImRlc3Ryb3lcIlxuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKVxuXG4gICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVuc3VyZUFiaWxpdGllcyhsaXN0T2ZBYmlsaXRpZXMpIHtcbiAgICAvLyBQb3B1bGF0ZSBhbiBhcnJheSB3aXRoIGEgbGlzdCBvZiBhYmlsaXRpZXMgY3VycmVudGx5IG5vdCBsb2FkZWRcbiAgICBjb25zdCBhYmlsaXRpZXNUb0xvYWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhYmlsaXR5SW5MaXN0IG9mIGxpc3RPZkFiaWxpdGllcykge1xuICAgICAgaWYgKCEoYWJpbGl0eUluTGlzdCBpbiB0aGlzLmFiaWxpdGllcykpIHtcbiAgICAgICAgYWJpbGl0aWVzVG9Mb2FkLnB1c2goYWJpbGl0eUluTGlzdClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIHRoZSBtaXNzaW5nIGFiaWxpdGllcyBpZiBhbnlcbiAgICBpZiAoYWJpbGl0aWVzVG9Mb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHByaW1hcnlLZXlOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgICAgcmFuc2Fja1BhcmFtc1tgJHtwcmltYXJ5S2V5TmFtZX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICAgIGNvbnN0IGFiaWxpdGllc1BhcmFtcyA9IHt9XG4gICAgICBhYmlsaXRpZXNQYXJhbXNbZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKV0gPSBhYmlsaXRpZXNUb0xvYWRcblxuICAgICAgY29uc3QgYW5vdGhlck1vZGVsID0gYXdhaXQgdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgICAucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuICAgICAgICAuYWJpbGl0aWVzKGFiaWxpdGllc1BhcmFtcylcbiAgICAgICAgLmZpcnN0KClcblxuICAgICAgaWYgKCFhbm90aGVyTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9vayB1cCB0aGUgc2FtZSBtb2RlbCAke3RoaXMucHJpbWFyeUtleSgpfSB3aXRoIGFiaWxpdGllczogJHthYmlsaXRpZXNUb0xvYWQuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0FiaWxpdGllcyA9IGFub3RoZXJNb2RlbC5hYmlsaXRpZXNcbiAgICAgIGZvciAoY29uc3QgbmV3QWJpbGl0eSBpbiBuZXdBYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy5hYmlsaXRpZXNbbmV3QWJpbGl0eV0gPSBuZXdBYmlsaXRpZXNbbmV3QWJpbGl0eV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVzID0gKCkgPT4gT2JqZWN0LmFzc2lnbih0aGlzLm1vZGVsRGF0YSwgdGhpcy5jaGFuZ2VzKVxuXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHttb2RlbDogdGhpcywgcmVzcG9uc2V9KVxuICAgIHRocm93IG5ldyBuZXcgQ3VzdG9tRXJyb3IoXCJSZXNwb25zZSB3YXNuJ3Qgc3VjY2Vzc2Z1bFwiLCB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgfVxuXG4gIGlkZW50aWZpZXJLZXkoKSB7XG4gICAgaWYgKCF0aGlzLl9pZGVudGlmaWVyS2V5KSB0aGlzLl9pZGVudGlmaWVyS2V5ID0gdGhpcy5pc1BlcnNpc3RlZCgpID8gdGhpcy5wcmltYXJ5S2V5KCkgOiB0aGlzLnVuaXF1ZUtleSgpXG5cbiAgICByZXR1cm4gdGhpcy5faWRlbnRpZmllcktleVxuICB9XG5cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZCA9IChhc3NvY2lhdGlvbk5hbWUpID0+IHRoaXMuaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGFzc29jaWF0aW9uTmFtZSkpXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlIChhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSB7XG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpc0Fzc29jaWF0aW9uUHJlc2VudChhc3NvY2lhdGlvbk5hbWUpIHtcbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkpIHJldHVybiB0cnVlXG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBzdGF0aWMgcGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWwsIG9wdGlvbnN9KSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSByZXR1cm5cbiAgICBpZiAoIWVycm9yLmFyZ3MucmVzcG9uc2UudmFsaWRhdGlvbl9lcnJvcnMpIHJldHVyblxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhlcnJvciwgXCJhcmdzXCIsIFwicmVzcG9uc2VcIiwgXCJ2YWxpZGF0aW9uX2Vycm9yc1wiKVxuICAgIH0pXG5cbiAgICBCYXNlTW9kZWwuc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKVxuXG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3IgIT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGh1bWFuQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3Qga2V5TmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImkxOG5LZXlcIilcbiAgICBjb25zdCBpMThuID0gQ29uZmlnLmdldEkxOG4oKVxuXG4gICAgaWYgKGkxOG4pIHJldHVybiBpMThuLnQoYGFjdGl2ZXJlY29yZC5hdHRyaWJ1dGVzLiR7a2V5TmFtZX0uJHtCYXNlTW9kZWwuc25ha2VDYXNlKGF0dHJpYnV0ZU5hbWUpfWAsIHtkZWZhdWx0VmFsdWU6IGF0dHJpYnV0ZU5hbWV9KVxuXG4gICAgcmV0dXJuIGluZmxlY3Rpb24uaHVtYW5pemUoYXR0cmlidXRlTmFtZSlcbiAgfVxuXG4gIGlzQXR0cmlidXRlQ2hhbmdlZChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSwgdHJ1ZSl9Q2hhbmdlZGBdXG5cbiAgICBpZiAoIWNoYW5nZWRNZXRob2QpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0eXBlOiAke2F0dHJpYnV0ZURhdGEudHlwZX1gKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRNZXRob2Qob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICB9XG5cbiAgaXNDaGFuZ2VkKCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpXG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpc05ld1JlY29yZCgpIHtcbiAgICBpZiAodGhpcy5uZXdSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubmV3UmVjb3JkXG4gICAgfSBlbHNlIGlmIChcImlkXCIgaW4gdGhpcy5tb2RlbERhdGEgJiYgdGhpcy5tb2RlbERhdGEuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlzUGVyc2lzdGVkID0gKCkgPT4gIXRoaXMuaXNOZXdSZWNvcmQoKVxuXG4gIHN0YXRpYyBzbmFrZUNhc2UgPSAoc3RyaW5nKSA9PiBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoc3RyaW5nKVxuXG4gIHNhdmVkQ2hhbmdlVG9BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICghdGhpcy5wcmV2aW91c01vZGVsRGF0YSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5wcmV2aW91c01vZGVsRGF0YSkpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnByZXZpb3VzTW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZE5hbWUgPSBgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSl9Q2hhbmdlZGBcbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tjaGFuZ2VkTWV0aG9kTmFtZV1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICBzZXROZXdNb2RlbChtb2RlbCkge1xuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG1vZGVsKVxuXG4gICAgZm9yKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwcykge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgIH1cblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBDYWNoZU5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBDYWNoZU5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlW25hbWVdXG4gICAgfVxuICB9XG5cbiAgc2V0TmV3TW9kZWxEYXRhKG1vZGVsKSB7XG4gICAgaWYgKCEoXCJtb2RlbERhdGFcIiBpbiBtb2RlbCkpIHRocm93IG5ldyBFcnJvcihgTm8gbW9kZWxEYXRhIGluIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KG1vZGVsKX1gKVxuXG4gICAgdGhpcy5wcmV2aW91c01vZGVsRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRpZ2codGhpcywgXCJtb2RlbERhdGFcIikpXG5cbiAgICBmb3IoY29uc3QgYXR0cmlidXRlTmFtZSBpbiBtb2RlbC5tb2RlbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbW9kZWwubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfVxuICB9XG5cbiAgX2lzRGF0ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgaWYgKERhdGUucGFyc2Uob2xkVmFsdWUpICE9IERhdGUucGFyc2UobmV3VmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9pc0ludGVnZXJDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChwYXJzZUludChvbGRWYWx1ZSwgMTApICE9IHBhcnNlSW50KG5ld1ZhbHVlLCAxMCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbW9kZWxDbGFzc0RhdGEgPSAoKSA9PiB0aGlzLmNvbnN0cnVjdG9yLm1vZGVsQ2xhc3NEYXRhKClcblxuICBhc3luYyByZWxvYWQoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKVxuICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgIHJhbnNhY2tQYXJhbXNbYCR7dGhpcy5jb25zdHJ1Y3Rvci5wcmltYXJ5S2V5KCl9X2VxYF0gPSB0aGlzLnByaW1hcnlLZXkoKVxuXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5jb25zdHJ1Y3Rvci5yYW5zYWNrKHJhbnNhY2tQYXJhbXMpXG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBpZiAocGFyYW1zLnByZWxvYWQpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnByZWxvYWQgPSBwYXJhbXMucHJlbG9hZFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0ID0gcGFyYW1zLnNlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdF9jb2x1bW5zKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3RDb2x1bW5zID0gcGFyYW1zLnNlbGVjdF9jb2x1bW5zXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCBxdWVyeS5maXJzdCgpXG4gICAgdGhpcy5zZXROZXdNb2RlbChtb2RlbClcbiAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICB9XG5cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGUoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIHNhdmVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShuZXdBdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzKVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5jaGFuZ2VzXG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IGRhdGFUb1VzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG5ld01vZGVsKVxuICB9XG5cbiAgc3RhdGljIF9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKHJhd0RhdGEgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fCByYXdEYXRhLm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IEZvcm1EYXRhT2JqZWN0aXplci5mb3JtRGF0YUZyb21PYmplY3QocmF3RGF0YSwgb3B0aW9ucylcblxuICAgICAgcmV0dXJuIEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChmb3JtRGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3RGF0YVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IG9iamVjdERhdGEgPSBCYXNlTW9kZWwuX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGEsXG4gICAgICAgICAgICBzaW1wbGVfbW9kZWxfZXJyb3JzOiBvcHRpb25zPy5zaW1wbGVNb2RlbEVycm9yc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZCB5ZXRcIilcbiAgfVxuXG4gIGFzeW5jIGlzVmFsaWRPblNlcnZlcigpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tdmFsaWRgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJ2YWxpZFwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICByZXR1cm4ge3ZhbGlkOiByZXNwb25zZS52YWxpZCwgZXJyb3JzOiByZXNwb25zZS5lcnJvcnN9XG4gIH1cblxuICBtb2RlbENsYXNzID0gKCkgPT4gdGhpcy5jb25zdHJ1Y3RvclxuXG4gIHByZWxvYWRSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwTmFtZSwgbW9kZWwpIHtcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtCYXNlTW9kZWwuc25ha2VDYXNlKHJlbGF0aW9uc2hpcE5hbWUpXSA9IG1vZGVsXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzW0Jhc2VNb2RlbC5zbmFrZUNhc2UocmVsYXRpb25zaGlwTmFtZSldID0gbW9kZWxcbiAgfVxuXG4gIG1hcmtGb3JEZXN0cnVjdGlvbigpIHtcbiAgICB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiA9IHRydWVcbiAgfVxuXG4gIG1hcmtlZEZvckRlc3RydWN0aW9uID0gKCkgPT4gdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb25cblxuICB1bmlxdWVLZXkoKSB7XG4gICAgaWYgKCF0aGlzLnVuaXF1ZUtleVZhbHVlKSB7XG4gICAgICBjb25zdCBtaW4gPSA1MDAwMDAwMDAwMDAwMDAwXG4gICAgICBjb25zdCBtYXggPSA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICBjb25zdCByYW5kb21CZXR3ZWVuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKVxuICAgICAgdGhpcy51bmlxdWVLZXlWYWx1ZSA9IHJhbmRvbUJldHdlZW5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51bmlxdWVLZXlWYWx1ZVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0Py5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgX2NhbGxNZW1iZXJDb21tYW5kID0gKGFyZ3MsIGNvbW1hbmRBcmdzKSA9PiBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChhcmdzLCBjb21tYW5kQXJncylcblxuICBzdGF0aWMgX3Bvc3REYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIGxldCBwb3N0RGF0YVxuXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgcG9zdERhdGEgPSBhcmdzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3N0RGF0YSA9IG9iamVjdFRvRm9ybURhdGEuc2VyaWFsaXplKGFyZ3MsIHt9LCBudWxsLCBcImFyZ3NcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdERhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIH1cblxuICAgIHJldHVybiBwb3N0RGF0YVxuICB9XG5cbiAgcmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuICB9XG5cbiAgcmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHtcbiAgICAgIC8vIFJldHVybiBudWxsIGlmIHRoaXMgaXMgYSBuZXcgcmVjb3JkIGFuZCB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYSByZWNvZ25pemVkIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImF0dHJpYnV0ZXNcIilcblxuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlTm90TG9hZGVkRXJyb3IoYE5vIHN1Y2ggYXR0cmlidXRlOiAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9IyR7YXR0cmlidXRlTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbERhdGEpfWApXG4gICAgfVxuICB9XG5cbiAgaXNBdHRyaWJ1dGVMb2FkZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLm1vZGVsRGF0YSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIF9pc1ByZXNlbnQodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiICYmIHZhbHVlLm1hdGNoKC9eXFxzKiQvKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIF9sb2FkQmVsb25nc1RvUmVmbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MgPSB7fSkge1xuICAgIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IGNvbGxlY3Rpb24uZmlyc3QoKVxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRCZWxvbmdzVG9SZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbG9hZGVkUmVsYXRpb25zaGlwcyA9IE9iamVjdC5rZXlzKHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKVxuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuXG4gICAgdGhyb3cgbmV3IE5vdExvYWRlZEVycm9yKGAke21vZGVsQ2xhc3NOYW1lfSMke3JlZmxlY3Rpb25OYW1lfSBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0LiBPbmx5IHRoZXNlIHdlcmUgbG9hZGVkOiAke2xvYWRlZFJlbGF0aW9uc2hpcHMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICBhc3luYyBfbG9hZEhhc01hbnlSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IGNvbGxlY3Rpb24udG9BcnJheSgpXG5cbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsc1xuXG4gICAgcmV0dXJuIG1vZGVsc1xuICB9XG5cbiAgYXN5bmMgX2xvYWRIYXNPbmVSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncylcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgY29sbGVjdGlvbi5maXJzdCgpXG5cbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcblxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRIYXNPbmVSZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgdGhpcy5hYmlsaXRpZXMgPSBhcmdzLmRhdGEuYiB8fCB7fVxuICAgIHRoaXMuY29sbGVjdGlvbiA9IGFyZ3MuY29sbGVjdGlvblxuICAgIHRoaXMubW9kZWxEYXRhID0gb2JqZWN0VG9VbmRlcnNjb3JlKGFyZ3MuZGF0YS5hKVxuICAgIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IGFyZ3MuZGF0YS5yXG4gIH1cblxuICBfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMocHJlbG9hZGVkKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyZWxhdGlvbnNoaXBzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBEYXRhID0gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBDbGFzc0RhdGEgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gZGlnZyhyZWxhdGlvbnNoaXAsIFwibmFtZVwiKSA9PSByZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNMaXN0ID0gcmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpLmpvaW4oXCIsIFwiKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7cmVsYXRpb25zaGlwTmFtZX0gb24gdGhlICR7bW9kZWxOYW1lfSBtb2RlbDogJHtyZWxhdGlvbnNoaXBzTGlzdH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUeXBlID0gZGlnZyhyZWxhdGlvbnNoaXBDbGFzc0RhdGEsIFwiY29sbGVjdGlvbk5hbWVcIilcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0aW9uc2hpcE5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkYClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWxhdGlvbnNoaXAgb24gJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSBieSB0aGF0IG5hbWU6ICR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBEYXRhKSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBJZCBvZiByZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwSWQpXG5cbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBEYXRhKVxuXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmltYXJ5S2V5ID0gKCkgPT4gdGhpcy5yZWFkQXR0cmlidXRlVW5kZXJzY29yZSh0aGlzLmNvbnN0cnVjdG9yLnByaW1hcnlLZXkoKSlcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsU0FBUyxNQUFNLHdCQUF3QjtBQUM5QyxPQUFPQyx1QkFBdUIsTUFBTSw4QkFBOEI7QUFDbEUsT0FBT0MsaUJBQWlCLE1BQU0sdUJBQXVCO0FBQ3JELE9BQU9DLFVBQVUsTUFBTSxjQUFjO0FBQ3JDLE9BQU9DLFlBQVksTUFBTSxpQkFBaUI7QUFDMUMsT0FBT0MsTUFBTSxNQUFNLFVBQVU7QUFDN0IsT0FBT0MsV0FBVyxNQUFNLGdCQUFnQjtBQUN4QyxTQUFRQyxJQUFJLFFBQU8sV0FBVztBQUM5QixPQUFPQyxrQkFBa0IsTUFBTSxzQkFBc0I7QUFDckQsT0FBTyxLQUFLQyxVQUFVLE1BQU0sWUFBWTtBQUN4QyxPQUFPQyxTQUFTLE1BQU0sY0FBYztBQUNwQyxPQUFPQyxjQUFjLE1BQU0sb0JBQW9CO0FBQy9DLE9BQU9DLGdCQUFnQixNQUFNLG9CQUFvQjtBQUNqRCxPQUFPQyxVQUFVLE1BQU0seUJBQXlCO0FBQ2hELE9BQU9DLEtBQUssTUFBTSxvQkFBb0I7QUFDdEMsT0FBT0MsUUFBUSxNQUFNLFlBQVk7QUFDakMsT0FBT0MsZUFBZSxNQUFNLG9CQUFvQjtBQUNoRCxTQUFRQyxnQkFBZ0IsUUFBTyxxQkFBcUI7QUFFcEQsTUFBTUMsa0JBQWtCLEdBQUlDLE1BQU0sSUFBSztFQUNyQyxNQUFNQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0VBRXBCLEtBQUssTUFBTUMsR0FB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
150
+ /** @returns {Attribute[]} */
151
+ BaseModel.attributes = function () {
152
+ var attributes = this.modelClassData().attributes;
153
+ var result = [];
154
+ for (var attributeKey in attributes) {
155
+ var attributeData = attributes[attributeKey];
156
+ var attribute = new attribute_1.default(attributeData);
157
+ result.push(attribute);
158
+ }
159
+ return result;
160
+ };
161
+ /** @returns {boolean} */
162
+ BaseModel.hasAttribute = function (attributeName) {
163
+ var attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
164
+ var lowerCaseAttributeName = inflection.underscore(attributeName);
165
+ if (lowerCaseAttributeName in attributes)
166
+ return true;
167
+ return false;
168
+ };
169
+ /**
170
+ * @interface
171
+ * @returns {ModelClassDataType}
172
+ */
173
+ BaseModel.modelClassData = function () {
174
+ throw new Error("modelClassData should be overriden by child");
175
+ };
176
+ /**
177
+ * @param {ValidationErrors} validationErrors
178
+ * @param {object} [options]
179
+ * @param {object} [options.form]
180
+ * @param {boolean} [options.throwValidationError]
181
+ */
182
+ BaseModel.sendValidationErrorsEvent = function (validationErrors, options) {
183
+ if (options && options.form) {
184
+ var event_1 = BaseModel.newCustomEvent(validationErrors);
185
+ options.form.dispatchEvent(event_1);
186
+ }
187
+ };
188
+ /**
189
+ * @template {typeof BaseModel} T
190
+ * @this {T}
191
+ * @param {number | string} id
192
+ * @returns {Promise<InstanceType<T>>}
193
+ */
194
+ BaseModel.find = function (id) {
195
+ return __awaiter(this, void 0, void 0, function () {
196
+ var query, model;
197
+ return __generator(this, function (_a) {
198
+ switch (_a.label) {
199
+ case 0:
200
+ query = {};
201
+ query["".concat(this.primaryKey(), "_eq")] = id;
202
+ return [4 /*yield*/, this.ransack(query).first()];
203
+ case 1:
204
+ model = (_a.sent());
205
+ if (model) {
206
+ return [2 /*return*/, model];
207
+ }
208
+ else {
209
+ throw new custom_error_js_1.default("Record not found");
210
+ }
211
+ return [2 /*return*/];
212
+ }
213
+ });
214
+ });
215
+ };
216
+ /**
217
+ * @template {typeof BaseModel} T
218
+ * @this {T}
219
+ * @param {Record<string, any>} findOrCreateByArgs
220
+ * @returns {Promise<InstanceType<T>>}
221
+ */
222
+ BaseModel.findOrCreateBy = function (findOrCreateByArgs_1) {
223
+ return __awaiter(this, arguments, void 0, function (findOrCreateByArgs, args) {
224
+ var result, model;
225
+ if (args === void 0) { args = {}; }
226
+ return __generator(this, function (_a) {
227
+ switch (_a.label) {
228
+ case 0: return [4 /*yield*/, services_js_1.default.current().sendRequest("Models::FindOrCreateBy", {
229
+ additional_data: args.additionalData,
230
+ find_or_create_by_args: findOrCreateByArgs,
231
+ resource_name: (0, diggerize_1.digg)(this.modelClassData(), "name")
232
+ })];
233
+ case 1:
234
+ result = _a.sent();
235
+ model = ((0, diggerize_1.digg)(result, "model"));
236
+ return [2 /*return*/, model];
237
+ }
238
+ });
239
+ });
240
+ };
241
+ /** @returns {ModelName} */
242
+ BaseModel.modelName = function () {
243
+ return new model_name_1.default({ modelClassData: this.modelClassData() });
244
+ };
245
+ /** @returns {string} */
246
+ BaseModel.primaryKey = function () {
247
+ return (0, diggerize_1.digg)(this.modelClassData(), "primaryKey");
248
+ };
249
+ /**
250
+ * @template {typeof BaseModel} MC
251
+ * @this {MC}
252
+ * @param {Record<string, any>} [query]
253
+ * @returns {import("./collection.js").default<MC>}
254
+ */
255
+ BaseModel.ransack = function (query) {
256
+ if (query === void 0) { query = {}; }
257
+ var ModelClass = /** @type {MC} */ (this);
258
+ return new collection_js_1.default({ modelClass: ModelClass }, { ransack: query });
259
+ };
260
+ /**
261
+ * @template {typeof BaseModel} MC
262
+ * @this {MC}
263
+ * @param {Record<string, any>} [select]
264
+ * @returns {import("./collection.js").default<MC>}
265
+ */
266
+ BaseModel.select = function (select) {
267
+ return this.ransack().select(select);
268
+ };
269
+ /** @returns {Reflection[]} */
270
+ BaseModel.ransackableAssociations = function () {
271
+ var relationships = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_associations");
272
+ var reflections = [];
273
+ for (var _i = 0, relationships_1 = relationships; _i < relationships_1.length; _i++) {
274
+ var relationshipData = relationships_1[_i];
275
+ reflections.push(new reflection_1.default(relationshipData));
276
+ }
277
+ return reflections;
278
+ };
279
+ /** @returns {Attribute[]} */
280
+ BaseModel.ransackableAttributes = function () {
281
+ var attributes = this.modelClassData().ransackable_attributes;
282
+ var result = [];
283
+ for (var _i = 0, attributes_1 = attributes; _i < attributes_1.length; _i++) {
284
+ var attributeData = attributes_1[_i];
285
+ result.push(new attribute_1.default(attributeData));
286
+ }
287
+ return result;
288
+ };
289
+ /** @returns {Scope[]} */
290
+ BaseModel.ransackableScopes = function () {
291
+ var ransackableScopes = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_scopes");
292
+ var result = [];
293
+ for (var _i = 0, ransackableScopes_1 = ransackableScopes; _i < ransackableScopes_1.length; _i++) {
294
+ var scopeData = ransackableScopes_1[_i];
295
+ var scope = new scope_1.default(scopeData);
296
+ result.push(scope);
297
+ }
298
+ return result;
299
+ };
300
+ /** @returns {Reflection[]} */
301
+ BaseModel.reflections = function () {
302
+ var relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
303
+ var reflections = [];
304
+ for (var _i = 0, relationships_2 = relationships; _i < relationships_2.length; _i++) {
305
+ var relationshipData = relationships_2[_i];
306
+ var reflection = new reflection_1.default(relationshipData);
307
+ reflections.push(reflection);
308
+ }
309
+ return reflections;
310
+ };
311
+ /** @returns {Reflection} */
312
+ BaseModel.reflection = function (name) {
313
+ var foundReflection = this.reflections().find(function (reflection) { return reflection.name() == name; });
314
+ if (!foundReflection) {
315
+ throw new Error("No such reflection: ".concat(name, " in ").concat(this.reflections().map(function (reflection) { return reflection.name(); }).join(", ")));
316
+ }
317
+ return foundReflection;
318
+ };
319
+ /**
320
+ * @returns {string}
321
+ */
322
+ BaseModel._token = function () {
323
+ var csrfTokenElement = document.querySelector("meta[name='csrf-token']");
324
+ if (csrfTokenElement) {
325
+ return csrfTokenElement.getAttribute("content");
326
+ }
327
+ };
328
+ /**
329
+ * @param {Record<string, any>} newAttributes
330
+ * @returns {void}
331
+ */
332
+ BaseModel.prototype.assignAttributes = function (newAttributes) {
333
+ for (var key in newAttributes) {
334
+ var newValue = newAttributes[key];
335
+ var attributeUnderscore = inflection.underscore(key);
336
+ var applyChange = true;
337
+ var deleteChange = false;
338
+ if (this.isAttributeLoaded(key)) {
339
+ var oldValue = this.readAttribute(key);
340
+ var originalValue = this.modelData[attributeUnderscore];
341
+ if (newValue == oldValue) {
342
+ applyChange = false;
343
+ }
344
+ else if (newValue == originalValue) {
345
+ applyChange = false;
346
+ deleteChange = true;
347
+ }
348
+ }
349
+ if (applyChange) {
350
+ this.changes[attributeUnderscore] = newValue;
351
+ }
352
+ else if (deleteChange) {
353
+ delete this.changes[attributeUnderscore];
354
+ }
355
+ }
356
+ };
357
+ /** @returns {Record<string, any>} */
358
+ BaseModel.prototype.attributes = function () {
359
+ var result = {};
360
+ for (var key in this.modelData) {
361
+ result[key] = this.modelData[key];
362
+ }
363
+ for (var key in this.changes) {
364
+ result[key] = this.changes[key];
365
+ }
366
+ return result;
367
+ };
368
+ /**
369
+ * @param {string} givenAbilityName
370
+ * @returns {boolean}
371
+ */
372
+ BaseModel.prototype.can = function (givenAbilityName) {
373
+ var abilityName = inflection.underscore(givenAbilityName);
374
+ if (!(abilityName in this.abilities)) {
375
+ throw new Error("Ability ".concat(abilityName, " hasn't been loaded for ").concat((0, diggerize_1.digg)(this.modelClassData(), "name")));
376
+ }
377
+ return this.abilities[abilityName];
378
+ };
379
+ /**
380
+ * @template {BaseModel} Self
381
+ * @this {Self}
382
+ * @returns {Self}
383
+ */
384
+ BaseModel.prototype.clone = function () {
385
+ var ModelClass = /** @type {new (...args: any[]) => Self} */ (this.constructor);
386
+ var clone = new ModelClass();
387
+ clone.abilities = __assign({}, this.abilities);
388
+ clone.modelData = __assign({}, this.modelData);
389
+ clone.relationships = __assign({}, this.relationships);
390
+ clone.relationshipsCache = __assign({}, this.relationshipsCache);
391
+ return clone;
392
+ };
393
+ /** @returns {number | string} */
394
+ BaseModel.prototype.cacheKey = function () {
395
+ if (this.isPersisted()) {
396
+ var keyParts = [
397
+ this.modelClassData().paramKey,
398
+ this.primaryKey()
399
+ ];
400
+ if ("updated_at" in this.modelData) {
401
+ // @ts-expect-error
402
+ var updatedAt = this.updatedAt();
403
+ if (typeof updatedAt != "object") {
404
+ throw new Error("updatedAt wasn't an object: ".concat(typeof updatedAt));
405
+ }
406
+ else if (!("getTime" in updatedAt)) {
407
+ throw new Error("updatedAt didn't support getTime with class: ".concat(updatedAt.constructor && updatedAt.constructor.name));
408
+ }
409
+ // @ts-expect-error
410
+ keyParts.push("updatedAt-".concat(this.updatedAt().getTime()));
411
+ }
412
+ return keyParts.join("-");
413
+ }
414
+ else {
415
+ return this.uniqueKey();
416
+ }
417
+ };
418
+ /** @returns {string} */
419
+ BaseModel.prototype.localCacheKey = function () {
420
+ var cacheKeyGenerator = new cache_key_generator_1.default(this);
421
+ return cacheKeyGenerator.local();
422
+ };
423
+ /** @returns {string} */
424
+ BaseModel.prototype.fullCacheKey = function () {
425
+ var cacheKeyGenerator = new cache_key_generator_1.default(this);
426
+ return cacheKeyGenerator.cacheKey();
427
+ };
428
+ /**
429
+ * @template {typeof BaseModel} MC
430
+ * @this {MC}
431
+ * @returns {Collection<MC>}
432
+ */
433
+ BaseModel.all = function () {
434
+ return this.ransack();
435
+ };
436
+ /**
437
+ * @param {Record<string, any>} [attributes]
438
+ * @param {object} [options]
439
+ * @returns {Promise<{
440
+ * model: BaseModel,
441
+ * response: object
442
+ * }>}
443
+ */
444
+ BaseModel.prototype.create = function (attributes, options) {
445
+ return __awaiter(this, void 0, void 0, function () {
446
+ var paramKey, modelData, dataToUse, response, error_1;
447
+ return __generator(this, function (_a) {
448
+ switch (_a.label) {
449
+ case 0:
450
+ if (attributes)
451
+ this.assignAttributes(attributes);
452
+ paramKey = this.modelClassData().paramKey;
453
+ modelData = this.getAttributes();
454
+ dataToUse = {};
455
+ dataToUse[paramKey] = modelData;
456
+ _a.label = 1;
457
+ case 1:
458
+ _a.trys.push([1, 3, , 4]);
459
+ return [4 /*yield*/, commands_pool_js_1.default.addCommand({
460
+ args: {
461
+ save: dataToUse
462
+ },
463
+ command: "".concat(this.modelClassData().collectionName, "-create"),
464
+ collectionName: this.modelClassData().collectionName,
465
+ primaryKey: this.primaryKey(),
466
+ type: "create"
467
+ }, {})];
468
+ case 2:
469
+ response = _a.sent();
470
+ return [3 /*break*/, 4];
471
+ case 3:
472
+ error_1 = _a.sent();
473
+ BaseModel.parseValidationErrors({ error: error_1, model: this, options: options });
474
+ throw error_1;
475
+ case 4:
476
+ if (response.model) {
477
+ this._refreshModelFromResponse(response);
478
+ this.changes = {};
479
+ }
480
+ return [2 /*return*/, { model: this, response: response }];
481
+ }
482
+ });
483
+ });
484
+ };
485
+ /**
486
+ * @param {FormData | Record<string, any>} rawData
487
+ * @param {object} [options]
488
+ */
489
+ BaseModel.prototype.createRaw = function (rawData_1) {
490
+ return __awaiter(this, arguments, void 0, function (rawData, options) {
491
+ var objectData, response, error_2;
492
+ if (options === void 0) { options = {}; }
493
+ return __generator(this, function (_a) {
494
+ switch (_a.label) {
495
+ case 0:
496
+ objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
497
+ _a.label = 1;
498
+ case 1:
499
+ _a.trys.push([1, 3, , 4]);
500
+ return [4 /*yield*/, commands_pool_js_1.default.addCommand({
501
+ args: {
502
+ save: objectData
503
+ },
504
+ command: "".concat(this.modelClassData().collectionName, "-create"),
505
+ collectionName: this.modelClassData().collectionName,
506
+ primaryKey: this.primaryKey(),
507
+ type: "create"
508
+ }, {})];
509
+ case 2:
510
+ response = _a.sent();
511
+ return [3 /*break*/, 4];
512
+ case 3:
513
+ error_2 = _a.sent();
514
+ BaseModel.parseValidationErrors({ error: error_2, model: this, options: options });
515
+ throw error_2;
516
+ case 4:
517
+ if (response.model) {
518
+ this._refreshModelDataFromResponse(response);
519
+ this.changes = {};
520
+ }
521
+ return [2 /*return*/, { model: this, response: response }];
522
+ }
523
+ });
524
+ });
525
+ };
526
+ /** @returns {Promise<{model: BaseModel, response: object}>} */
527
+ BaseModel.prototype.destroy = function () {
528
+ return __awaiter(this, void 0, void 0, function () {
529
+ var response;
530
+ return __generator(this, function (_a) {
531
+ switch (_a.label) {
532
+ case 0: return [4 /*yield*/, commands_pool_js_1.default.addCommand({
533
+ args: { query_params: this.collection && this.collection.params() },
534
+ command: "".concat(this.modelClassData().collectionName, "-destroy"),
535
+ collectionName: this.modelClassData().collectionName,
536
+ primaryKey: this.primaryKey(),
537
+ type: "destroy"
538
+ }, {})];
539
+ case 1:
540
+ response = _a.sent();
541
+ if (response.success) {
542
+ if (response.model) {
543
+ this._refreshModelDataFromResponse(response);
544
+ this.changes = {};
545
+ }
546
+ return [2 /*return*/, { model: this, response: response }];
547
+ }
548
+ else {
549
+ this.handleResponseError(response);
550
+ }
551
+ return [2 /*return*/];
552
+ }
553
+ });
554
+ });
555
+ };
556
+ BaseModel.prototype.ensureAbilities = function (listOfAbilities) {
557
+ return __awaiter(this, void 0, void 0, function () {
558
+ var abilitiesToLoad, _i, listOfAbilities_1, abilityInList, primaryKeyName, ransackParams, abilitiesParams, anotherModel, newAbilities, newAbility;
559
+ return __generator(this, function (_a) {
560
+ switch (_a.label) {
561
+ case 0:
562
+ abilitiesToLoad = [];
563
+ for (_i = 0, listOfAbilities_1 = listOfAbilities; _i < listOfAbilities_1.length; _i++) {
564
+ abilityInList = listOfAbilities_1[_i];
565
+ if (!(abilityInList in this.abilities)) {
566
+ abilitiesToLoad.push(abilityInList);
567
+ }
568
+ }
569
+ if (!(abilitiesToLoad.length > 0)) return [3 /*break*/, 2];
570
+ primaryKeyName = this.modelClass().primaryKey();
571
+ ransackParams = {};
572
+ ransackParams["".concat(primaryKeyName, "_eq")] = this.primaryKey();
573
+ abilitiesParams = {};
574
+ abilitiesParams[(0, diggerize_1.digg)(this.modelClassData(), "name")] = abilitiesToLoad;
575
+ return [4 /*yield*/, this.modelClass()
576
+ .ransack(ransackParams)
577
+ .abilities(abilitiesParams)
578
+ .first()];
579
+ case 1:
580
+ anotherModel = _a.sent();
581
+ if (!anotherModel) {
582
+ throw new Error("Could not look up the same model ".concat(this.primaryKey(), " with abilities: ").concat(abilitiesToLoad.join(", ")));
583
+ }
584
+ newAbilities = anotherModel.abilities;
585
+ for (newAbility in newAbilities) {
586
+ this.abilities[newAbility] = newAbilities[newAbility];
587
+ }
588
+ _a.label = 2;
589
+ case 2: return [2 /*return*/];
590
+ }
591
+ });
592
+ });
593
+ };
594
+ /**
595
+ * @returns {Record<string, any>}
596
+ */
597
+ BaseModel.prototype.getAttributes = function () { return Object.assign(this.modelData, this.changes); };
598
+ BaseModel.prototype.handleResponseError = function (response) {
599
+ // @ts-expect-error
600
+ BaseModel.parseValidationErrors({ model: this, response: response });
601
+ throw new custom_error_js_1.default("Response wasn't successful", { model: this, response: response });
602
+ };
603
+ /**
604
+ * @returns {number | string}
605
+ */
606
+ BaseModel.prototype.identifierKey = function () {
607
+ if (!this._identifierKey)
608
+ this._identifierKey = this.isPersisted() ? this.primaryKey() : this.uniqueKey();
609
+ return this._identifierKey;
610
+ };
611
+ /**
612
+ * @returns {boolean}
613
+ */
614
+ BaseModel.prototype.isAssociationLoaded = function (associationName) { return this.isAssociationLoadedUnderscore(inflection.underscore(associationName)); };
615
+ /**
616
+ * @returns {boolean}
617
+ */
618
+ BaseModel.prototype.isAssociationLoadedUnderscore = function (associationNameUnderscore) {
619
+ if (associationNameUnderscore in this.relationshipsCache)
620
+ return true;
621
+ return false;
622
+ };
623
+ /**
624
+ * @returns {boolean}
625
+ */
626
+ BaseModel.prototype.isAssociationPresent = function (associationName) {
627
+ if (this.isAssociationLoaded(associationName))
628
+ return true;
629
+ if (associationName in this.relationships)
630
+ return true;
631
+ return false;
632
+ };
633
+ /**
634
+ * @param {object} args
635
+ * @param {any} args.error
636
+ * @param {BaseModel} [args.model]
637
+ * @param {ParseValidationErrorsOptions} args.options
638
+ */
639
+ BaseModel.parseValidationErrors = function (_a) {
640
+ var error = _a.error, model = _a.model, options = _a.options;
641
+ if (!(error instanceof validation_error_js_1.default))
642
+ return;
643
+ if (!error.args.response.validation_errors)
644
+ return;
645
+ var validationErrors = new validation_errors_js_1.ValidationErrors({
646
+ model: model,
647
+ validationErrors: (0, diggerize_1.digg)(error, "args", "response", "validation_errors")
648
+ });
649
+ BaseModel.sendValidationErrorsEvent(validationErrors, options);
650
+ if (!options || options.throwValidationError != false) {
651
+ throw error;
652
+ }
653
+ };
654
+ BaseModel.humanAttributeName = function (attributeName) {
655
+ var keyName = (0, diggerize_1.digg)(this.modelClassData(), "i18nKey");
656
+ // @ts-expect-error
657
+ var i18n = config_js_1.default.getI18n();
658
+ if (i18n)
659
+ return i18n.t("activerecord.attributes.".concat(keyName, ".").concat(BaseModel.snakeCase(attributeName)), { defaultValue: attributeName });
660
+ return inflection.humanize(attributeName);
661
+ };
662
+ /**
663
+ * @param {string} attributeName
664
+ * @returns {boolean}
665
+ */
666
+ BaseModel.prototype.isAttributeChanged = function (attributeName) {
667
+ var attributeNameUnderscore = inflection.underscore(attributeName);
668
+ var attributeData = this.modelClassData().attributes.find(function (attribute) { return (0, diggerize_1.digg)(attribute, "name") == attributeNameUnderscore; });
669
+ if (!attributeData) {
670
+ var attributeNames = this.modelClassData().attributes.map(function (attribute) { return (0, diggerize_1.digg)(attribute, "name"); });
671
+ throw new Error("Couldn't find an attribute by that name: \"".concat(attributeName, "\" in: ").concat(attributeNames.join(", ")));
672
+ }
673
+ if (!(attributeNameUnderscore in this.changes))
674
+ return false;
675
+ var oldValue = this.modelData[attributeNameUnderscore];
676
+ var newValue = this.changes[attributeNameUnderscore];
677
+ var changedMethod = this["_is".concat(inflection.camelize(attributeData.type, true), "Changed")];
678
+ if (!changedMethod)
679
+ throw new Error("Don't know how to handle type: ".concat(attributeData.type));
680
+ return changedMethod(oldValue, newValue);
681
+ };
682
+ /**
683
+ * @returns {boolean}
684
+ */
685
+ BaseModel.prototype.isChanged = function () {
686
+ var keys = Object.keys(this.changes);
687
+ if (keys.length > 0) {
688
+ return true;
689
+ }
690
+ else {
691
+ return false;
692
+ }
693
+ };
694
+ /**
695
+ * @returns {boolean}
696
+ */
697
+ BaseModel.prototype.isNewRecord = function () {
698
+ if (this.newRecord !== undefined) {
699
+ return this.newRecord;
700
+ }
701
+ else if ("id" in this.modelData && this.modelData.id) {
702
+ return false;
703
+ }
704
+ else {
705
+ return true;
706
+ }
707
+ };
708
+ /**
709
+ * @returns {boolean}
710
+ */
711
+ BaseModel.prototype.isPersisted = function () { return !this.isNewRecord(); };
712
+ /**
713
+ * @param {string} string
714
+ * @returns {string}
715
+ */
716
+ BaseModel.snakeCase = function (string) { return inflection.underscore(string); };
717
+ /**
718
+ * @param {string} attributeName
719
+ * @returns {boolean}
720
+ */
721
+ BaseModel.prototype.savedChangeToAttribute = function (attributeName) {
722
+ if (!this.previousModelData)
723
+ return false;
724
+ var attributeNameUnderscore = inflection.underscore(attributeName);
725
+ var attributeData = this.modelClassData().attributes.find(function (attribute) { return attribute.name == attributeNameUnderscore; });
726
+ if (!attributeData) {
727
+ var attributeNames = this.modelClassData().attributes.map(function (attribute) { return attribute.name; });
728
+ throw new Error("Couldn't find an attribute by that name: \"".concat(attributeName, "\" in: ").concat(attributeNames.join(", ")));
729
+ }
730
+ if (!(attributeNameUnderscore in this.previousModelData))
731
+ return true;
732
+ var oldValue = this.previousModelData[attributeNameUnderscore];
733
+ var newValue = this.modelData[attributeNameUnderscore];
734
+ var changedMethodName = "_is".concat(inflection.camelize(attributeData.type), "Changed");
735
+ var changedMethod = this[changedMethodName];
736
+ if (!changedMethod)
737
+ throw new Error("Don't know how to handle type: ".concat(attributeData.type));
738
+ return changedMethod(oldValue, newValue);
739
+ };
740
+ /**
741
+ * @param {BaseModel} model
742
+ * @returns {void}
743
+ */
744
+ BaseModel.prototype.setNewModel = function (model) {
745
+ this.setNewModelData(model);
746
+ for (var relationshipName in model.relationships) {
747
+ this.relationships[relationshipName] = model.relationships[relationshipName];
748
+ }
749
+ for (var relationshipCacheName in model.relationshipsCache) {
750
+ this.relationshipsCache[relationshipCacheName] = model.relationshipsCache[name];
751
+ }
752
+ };
753
+ BaseModel.prototype.setNewModelData = function (model) {
754
+ if (!("modelData" in model))
755
+ throw new Error("No modelData in model: ".concat(JSON.stringify(model)));
756
+ this.previousModelData = Object.assign({}, (0, diggerize_1.digg)(this, "modelData"));
757
+ for (var attributeName in model.modelData) {
758
+ this.modelData[attributeName] = model.modelData[attributeName];
759
+ }
760
+ };
761
+ BaseModel.prototype._isDateChanged = function (oldValue, newValue) {
762
+ if (Date.parse(oldValue) != Date.parse(newValue))
763
+ return true;
764
+ };
765
+ BaseModel.prototype._isIntegerChanged = function (oldValue, newValue) {
766
+ if (parseInt(oldValue, 10) != parseInt(newValue, 10))
767
+ return true;
768
+ };
769
+ BaseModel.prototype._isStringChanged = function (oldValue, newValue) {
770
+ var oldConvertedValue = "".concat(oldValue);
771
+ var newConvertedValue = "".concat(newValue);
772
+ if (oldConvertedValue != newConvertedValue)
773
+ return true;
774
+ };
775
+ /** @returns {ModelClassDataType} */
776
+ BaseModel.prototype.modelClassData = function () { return this.modelClass().modelClassData(); };
777
+ /**
778
+ * @returns {Promise<void>}
779
+ */
780
+ BaseModel.prototype.reload = function () {
781
+ return __awaiter(this, void 0, void 0, function () {
782
+ var params, ransackParams, query, model;
783
+ return __generator(this, function (_a) {
784
+ switch (_a.label) {
785
+ case 0:
786
+ params = this.collection && this.collection.params();
787
+ ransackParams = {};
788
+ ransackParams["".concat(this.modelClass().primaryKey(), "_eq")] = this.primaryKey();
789
+ query = this.modelClass().ransack(ransackParams);
790
+ if (params) {
791
+ if (params.preload) {
792
+ query.queryArgs.preload = params.preload;
793
+ }
794
+ if (params.select) {
795
+ query.queryArgs.select = params.select;
796
+ }
797
+ if (params.select_columns) {
798
+ query.queryArgs.selectColumns = params.select_columns;
799
+ }
800
+ }
801
+ return [4 /*yield*/, query.first()];
802
+ case 1:
803
+ model = _a.sent();
804
+ this.setNewModel(model);
805
+ this.changes = {};
806
+ return [2 /*return*/];
807
+ }
808
+ });
809
+ });
810
+ };
811
+ /**
812
+ * @returns {Promise<{model: BaseModel, response?: object}>}
813
+ */
814
+ BaseModel.prototype.save = function () {
815
+ if (this.isNewRecord()) {
816
+ return this.create();
817
+ }
818
+ else {
819
+ return this.update();
820
+ }
821
+ };
822
+ /**
823
+ * @returns {Promise<{model: BaseModel, response: object}>}
824
+ */
825
+ BaseModel.prototype.saveRaw = function (rawData, options) {
826
+ if (options === void 0) { options = {}; }
827
+ if (this.isNewRecord()) {
828
+ return this.createRaw(rawData, options);
829
+ }
830
+ else {
831
+ return this.updateRaw(rawData, options);
832
+ }
833
+ };
834
+ /**
835
+ * @param {Record<string, any>} [newAttributes]
836
+ * @param {ParseValidationErrorsOptions} [options]
837
+ * @returns {Promise<{
838
+ * model: BaseModel,
839
+ * response?: object
840
+ * }>}
841
+ */
842
+ BaseModel.prototype.update = function (newAttributes, options) {
843
+ return __awaiter(this, void 0, void 0, function () {
844
+ var paramKey, modelData, dataToUse, response, error_3;
845
+ return __generator(this, function (_a) {
846
+ switch (_a.label) {
847
+ case 0:
848
+ if (newAttributes) {
849
+ this.assignAttributes(newAttributes);
850
+ }
851
+ if (Object.keys(this.changes).length == 0) {
852
+ return [2 /*return*/, { model: this }];
853
+ }
854
+ paramKey = this.modelClassData().paramKey;
855
+ modelData = this.changes;
856
+ dataToUse = {};
857
+ dataToUse[paramKey] = modelData;
858
+ _a.label = 1;
859
+ case 1:
860
+ _a.trys.push([1, 3, , 4]);
861
+ return [4 /*yield*/, commands_pool_js_1.default.addCommand({
862
+ args: {
863
+ query_params: this.collection && this.collection.params(),
864
+ save: dataToUse
865
+ },
866
+ command: "".concat(this.modelClassData().collectionName, "-update"),
867
+ collectionName: this.modelClassData().collectionName,
868
+ primaryKey: this.primaryKey(),
869
+ type: "update"
870
+ }, {})];
871
+ case 2:
872
+ response = _a.sent();
873
+ return [3 /*break*/, 4];
874
+ case 3:
875
+ error_3 = _a.sent();
876
+ BaseModel.parseValidationErrors({ error: error_3, model: this, options: options });
877
+ throw error_3;
878
+ case 4:
879
+ if (response.success) {
880
+ if (response.model) {
881
+ this._refreshModelFromResponse(response);
882
+ this.changes = {};
883
+ }
884
+ return [2 /*return*/, { response: response, model: this }];
885
+ }
886
+ else {
887
+ this.handleResponseError(response);
888
+ }
889
+ return [2 /*return*/];
890
+ }
891
+ });
892
+ });
893
+ };
894
+ BaseModel.prototype._refreshModelFromResponse = function (response) {
895
+ var newModel = (0, diggerize_1.digg)(response, "model");
896
+ if (Array.isArray(newModel))
897
+ newModel = newModel[0];
898
+ this.setNewModel(newModel);
899
+ };
900
+ BaseModel.prototype._refreshModelDataFromResponse = function (response) {
901
+ var newModel = (0, diggerize_1.digg)(response, "model");
902
+ if (Array.isArray(newModel))
903
+ newModel = newModel[0];
904
+ this.setNewModelData(newModel);
905
+ };
906
+ /**
907
+ * @param {FormData | Record<string, any>} rawData
908
+ * @param {object} options
909
+ * @returns {Record<string, any>}
910
+ */
911
+ BaseModel._objectDataFromGivenRawData = function (rawData, options) {
912
+ if (rawData instanceof FormData || rawData.nodeName == "FORM") {
913
+ var formData = form_data_objectizer_1.default.formDataFromObject(rawData, options);
914
+ return form_data_objectizer_1.default.toObject(formData);
915
+ }
916
+ return rawData;
917
+ };
918
+ BaseModel.prototype.updateRaw = function (rawData_1) {
919
+ return __awaiter(this, arguments, void 0, function (rawData, options) {
920
+ var objectData, response, error_4;
921
+ if (options === void 0) { options = {}; }
922
+ return __generator(this, function (_a) {
923
+ switch (_a.label) {
924
+ case 0:
925
+ objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
926
+ _a.label = 1;
927
+ case 1:
928
+ _a.trys.push([1, 3, , 4]);
929
+ return [4 /*yield*/, commands_pool_js_1.default.addCommand({
930
+ args: {
931
+ query_params: this.collection && this.collection.params(),
932
+ save: objectData,
933
+ simple_model_errors: options === null || options === void 0 ? void 0 : options.simpleModelErrors
934
+ },
935
+ command: "".concat(this.modelClassData().collectionName, "-update"),
936
+ collectionName: this.modelClassData().collectionName,
937
+ primaryKey: this.primaryKey(),
938
+ type: "update"
939
+ }, {})];
940
+ case 2:
941
+ response = _a.sent();
942
+ return [3 /*break*/, 4];
943
+ case 3:
944
+ error_4 = _a.sent();
945
+ BaseModel.parseValidationErrors({ error: error_4, model: this, options: options });
946
+ throw error_4;
947
+ case 4:
948
+ if (response.model) {
949
+ this._refreshModelFromResponse(response);
950
+ this.changes = {};
951
+ }
952
+ return [2 /*return*/, { response: response, model: this }];
953
+ }
954
+ });
955
+ });
956
+ };
957
+ BaseModel.prototype.isValid = function () {
958
+ throw new Error("Not implemented yet");
959
+ };
960
+ BaseModel.prototype.isValidOnServer = function () {
961
+ return __awaiter(this, void 0, void 0, function () {
962
+ var modelData, paramKey, dataToUse, response;
963
+ return __generator(this, function (_a) {
964
+ switch (_a.label) {
965
+ case 0:
966
+ modelData = this.getAttributes();
967
+ paramKey = this.modelClassData().paramKey;
968
+ dataToUse = {};
969
+ dataToUse[paramKey] = modelData;
970
+ return [4 /*yield*/, commands_pool_js_1.default.addCommand({
971
+ args: {
972
+ save: dataToUse
973
+ },
974
+ command: "".concat(this.modelClassData().collectionName, "-valid"),
975
+ collectionName: this.modelClassData().collectionName,
976
+ primaryKey: this.primaryKey(),
977
+ type: "valid"
978
+ }, {})];
979
+ case 1:
980
+ response = _a.sent();
981
+ return [2 /*return*/, { valid: response.valid, errors: response.errors }];
982
+ }
983
+ });
984
+ });
985
+ };
986
+ /**
987
+ * @template {BaseModel} Self
988
+ * @this {Self}
989
+ * @returns {typeof BaseModel & (new (...args: any[]) => Self)}
990
+ */
991
+ BaseModel.prototype.modelClass = function () {
992
+ return /** @type {any} */ (this.constructor);
993
+ };
994
+ BaseModel.prototype.preloadRelationship = function (relationshipName, model) {
995
+ this.relationshipsCache[BaseModel.snakeCase(relationshipName)] = model;
996
+ this.relationships[BaseModel.snakeCase(relationshipName)] = model;
997
+ };
998
+ /**
999
+ * @returns {void}
1000
+ */
1001
+ BaseModel.prototype.markForDestruction = function () {
1002
+ this._markedForDestruction = true;
1003
+ };
1004
+ /**
1005
+ * @returns {boolean}
1006
+ */
1007
+ BaseModel.prototype.markedForDestruction = function () { return this._markedForDestruction || false; };
1008
+ /**
1009
+ * @returns {number}
1010
+ */
1011
+ BaseModel.prototype.uniqueKey = function () {
1012
+ if (!this.uniqueKeyValue) {
1013
+ var min = 5000000000000000;
1014
+ var max = 9007199254740991;
1015
+ var randomBetween = Math.floor(Math.random() * (max - min + 1) + min);
1016
+ this.uniqueKeyValue = randomBetween;
1017
+ }
1018
+ return this.uniqueKeyValue;
1019
+ };
1020
+ BaseModel._callCollectionCommand = function (args, commandArgs) {
1021
+ return __awaiter(this, void 0, void 0, function () {
1022
+ var formOrDataObject, error_5, form;
1023
+ return __generator(this, function (_a) {
1024
+ switch (_a.label) {
1025
+ case 0:
1026
+ formOrDataObject = args.args;
1027
+ _a.label = 1;
1028
+ case 1:
1029
+ _a.trys.push([1, 3, , 4]);
1030
+ return [4 /*yield*/, commands_pool_js_1.default.addCommand(args, commandArgs)];
1031
+ case 2: return [2 /*return*/, _a.sent()];
1032
+ case 3:
1033
+ error_5 = _a.sent();
1034
+ form = void 0;
1035
+ if (commandArgs.form) {
1036
+ form = commandArgs.form;
1037
+ }
1038
+ else if ((formOrDataObject === null || formOrDataObject === void 0 ? void 0 : formOrDataObject.nodeName) == "FORM") {
1039
+ form = formOrDataObject;
1040
+ }
1041
+ if (form)
1042
+ BaseModel.parseValidationErrors({ error: error_5, options: { form: form } });
1043
+ throw error_5;
1044
+ case 4: return [2 /*return*/];
1045
+ }
1046
+ });
1047
+ });
1048
+ };
1049
+ BaseModel._postDataFromArgs = function (args) {
1050
+ var postData;
1051
+ if (args) {
1052
+ if (args instanceof FormData) {
1053
+ postData = args;
1054
+ }
1055
+ else {
1056
+ postData = object_to_formdata_1.default.serialize(args, {}, null, "args");
1057
+ }
1058
+ }
1059
+ else {
1060
+ postData = new FormData();
1061
+ }
1062
+ return postData;
1063
+ };
1064
+ /**
1065
+ * @param {string} attributeName
1066
+ * @returns {any}
1067
+ */
1068
+ BaseModel.prototype.readAttribute = function (attributeName) {
1069
+ var attributeNameUnderscore = inflection.underscore(attributeName);
1070
+ return this.readAttributeUnderscore(attributeNameUnderscore);
1071
+ };
1072
+ /**
1073
+ * @param {string} attributeName
1074
+ * @returns {any}
1075
+ */
1076
+ BaseModel.prototype.readAttributeUnderscore = function (attributeName) {
1077
+ if (attributeName in this.changes) {
1078
+ return this.changes[attributeName];
1079
+ }
1080
+ else if (attributeName in this.modelData) {
1081
+ return this.modelData[attributeName];
1082
+ }
1083
+ else if (this.isNewRecord()) {
1084
+ // Return null if this is a new record and the attribute name is a recognized attribute
1085
+ var attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
1086
+ if (attributeName in attributes)
1087
+ return null;
1088
+ }
1089
+ if (this.isPersisted()) {
1090
+ throw new attribute_not_loaded_error_1.default("No such attribute: ".concat((0, diggerize_1.digg)(this.modelClassData(), "name"), "#").concat(attributeName, ": ").concat(JSON.stringify(this.modelData)));
1091
+ }
1092
+ };
1093
+ /**
1094
+ * @returns {boolean}
1095
+ */
1096
+ BaseModel.prototype.isAttributeLoaded = function (attributeName) {
1097
+ var attributeNameUnderscore = inflection.underscore(attributeName);
1098
+ if (attributeNameUnderscore in this.changes)
1099
+ return true;
1100
+ if (attributeNameUnderscore in this.modelData)
1101
+ return true;
1102
+ return false;
1103
+ };
1104
+ BaseModel.prototype._isPresent = function (value) {
1105
+ if (!value) {
1106
+ return false;
1107
+ }
1108
+ else if (typeof value == "string" && value.match(/^\s*$/)) {
1109
+ return false;
1110
+ }
1111
+ return true;
1112
+ };
1113
+ BaseModel.prototype._loadBelongsToReflection = function (args_1) {
1114
+ return __awaiter(this, arguments, void 0, function (args, queryArgs) {
1115
+ var collection, model;
1116
+ if (queryArgs === void 0) { queryArgs = {}; }
1117
+ return __generator(this, function (_a) {
1118
+ switch (_a.label) {
1119
+ case 0:
1120
+ if (!(args.reflectionName in this.relationships)) return [3 /*break*/, 1];
1121
+ return [2 /*return*/, this.relationships[args.reflectionName]];
1122
+ case 1:
1123
+ if (!(args.reflectionName in this.relationshipsCache)) return [3 /*break*/, 2];
1124
+ return [2 /*return*/, this.relationshipsCache[args.reflectionName]];
1125
+ case 2:
1126
+ collection = new collection_js_1.default(args, queryArgs);
1127
+ return [4 /*yield*/, collection.first()];
1128
+ case 3:
1129
+ model = _a.sent();
1130
+ this.relationshipsCache[args.reflectionName] = model;
1131
+ return [2 /*return*/, model];
1132
+ }
1133
+ });
1134
+ });
1135
+ };
1136
+ BaseModel.prototype._readBelongsToReflection = function (_a) {
1137
+ var reflectionName = _a.reflectionName;
1138
+ if (reflectionName in this.relationships) {
1139
+ return this.relationships[reflectionName];
1140
+ }
1141
+ else if (reflectionName in this.relationshipsCache) {
1142
+ return this.relationshipsCache[reflectionName];
1143
+ }
1144
+ if (this.isNewRecord())
1145
+ return null;
1146
+ var loadedRelationships = Object.keys(this.relationshipsCache);
1147
+ var modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
1148
+ throw new not_loaded_error_1.default("".concat(modelClassName, "#").concat(reflectionName, " hasn't been loaded yet. Only these were loaded: ").concat(loadedRelationships.join(", ")));
1149
+ };
1150
+ /**
1151
+ * @template {typeof import("./base-model.js").default} AssocMC
1152
+ * @param {import("./collection.js").CollectionArgsType<AssocMC>} args
1153
+ * @param {import("./collection.js").QueryArgsType} queryArgs
1154
+ * @returns {Promise<Array<InstanceType<AssocMC>>>}
1155
+ */
1156
+ BaseModel.prototype._loadHasManyReflection = function (args_1) {
1157
+ return __awaiter(this, arguments, void 0, function (args, queryArgs) {
1158
+ var collection, models;
1159
+ if (queryArgs === void 0) { queryArgs = {}; }
1160
+ return __generator(this, function (_a) {
1161
+ switch (_a.label) {
1162
+ case 0:
1163
+ if (args.reflectionName in this.relationships) {
1164
+ return [2 /*return*/, this.relationships[args.reflectionName]];
1165
+ }
1166
+ else if (args.reflectionName in this.relationshipsCache) {
1167
+ return [2 /*return*/, this.relationshipsCache[args.reflectionName]];
1168
+ }
1169
+ collection = new collection_js_1.default(args, queryArgs);
1170
+ return [4 /*yield*/, collection.toArray()];
1171
+ case 1:
1172
+ models = _a.sent();
1173
+ this.relationshipsCache[args.reflectionName] = models;
1174
+ return [2 /*return*/, models];
1175
+ }
1176
+ });
1177
+ });
1178
+ };
1179
+ /**
1180
+ * @template {typeof import("./base-model.js").default} AssocMC
1181
+ * @param {import("./collection.js").CollectionArgsType<AssocMC>} args
1182
+ * @param {import("./collection.js").QueryArgsType} queryArgs
1183
+ * @returns {Promise<InstanceType<AssocMC>>}
1184
+ */
1185
+ BaseModel.prototype._loadHasOneReflection = function (args_1) {
1186
+ return __awaiter(this, arguments, void 0, function (args, queryArgs) {
1187
+ var collection, model;
1188
+ if (queryArgs === void 0) { queryArgs = {}; }
1189
+ return __generator(this, function (_a) {
1190
+ switch (_a.label) {
1191
+ case 0:
1192
+ if (!(args.reflectionName in this.relationships)) return [3 /*break*/, 1];
1193
+ return [2 /*return*/, this.relationships[args.reflectionName]];
1194
+ case 1:
1195
+ if (!(args.reflectionName in this.relationshipsCache)) return [3 /*break*/, 2];
1196
+ return [2 /*return*/, this.relationshipsCache[args.reflectionName]];
1197
+ case 2:
1198
+ collection = new collection_js_1.default(args, queryArgs);
1199
+ return [4 /*yield*/, collection.first()];
1200
+ case 3:
1201
+ model = _a.sent();
1202
+ this.relationshipsCache[args.reflectionName] = model;
1203
+ return [2 /*return*/, model];
1204
+ }
1205
+ });
1206
+ });
1207
+ };
1208
+ BaseModel.prototype._readHasOneReflection = function (_a) {
1209
+ var reflectionName = _a.reflectionName;
1210
+ if (reflectionName in this.relationships) {
1211
+ return this.relationships[reflectionName];
1212
+ }
1213
+ else if (reflectionName in this.relationshipsCache) {
1214
+ return this.relationshipsCache[reflectionName];
1215
+ }
1216
+ if (this.isNewRecord()) {
1217
+ return null;
1218
+ }
1219
+ var loadedRelationships = Object.keys(this.relationshipsCache);
1220
+ var modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
1221
+ throw new not_loaded_error_1.default("".concat(modelClassName, "#").concat(reflectionName, " hasn't been loaded yet. Only these were loaded: ").concat(loadedRelationships.join(", ")));
1222
+ };
1223
+ BaseModel.prototype._readModelDataFromArgs = function (args) {
1224
+ this.abilities = args.data.b || {};
1225
+ this.collection = args.collection;
1226
+ this.modelData = objectToUnderscore(args.data.a);
1227
+ this.preloadedRelationships = args.data.r;
1228
+ };
1229
+ BaseModel.prototype._readPreloadedRelationships = function (preloaded) {
1230
+ if (!this.preloadedRelationships) {
1231
+ return;
1232
+ }
1233
+ var relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
1234
+ var _loop_1 = function (relationshipName) {
1235
+ var relationshipData = this_1.preloadedRelationships[relationshipName];
1236
+ var relationshipClassData = relationships.find(function (relationship) { return (0, diggerize_1.digg)(relationship, "name") == relationshipName; });
1237
+ if (!relationshipClassData) {
1238
+ var modelName = (0, diggerize_1.digg)(this_1.modelClassData(), "name");
1239
+ var relationshipsList = relationships.map(function (relationship) { return relationship.name; }).join(", ");
1240
+ throw new Error("Could not find the relation ".concat(relationshipName, " on the ").concat(modelName, " model: ").concat(relationshipsList));
1241
+ }
1242
+ var relationshipType = (0, diggerize_1.digg)(relationshipClassData, "collectionName");
1243
+ if (relationshipName in this_1.relationshipsCache) {
1244
+ throw new Error("".concat(relationshipName, " has already been loaded"));
1245
+ }
1246
+ if (!relationshipClassData) {
1247
+ throw new Error("No relationship on ".concat((0, diggerize_1.digg)(this_1.modelClassData(), "name"), " by that name: ").concat(relationshipName));
1248
+ }
1249
+ if (!relationshipData) {
1250
+ this_1.relationshipsCache[relationshipName] = null;
1251
+ this_1.relationships[relationshipName] = null;
1252
+ }
1253
+ else if (Array.isArray(relationshipData)) {
1254
+ this_1.relationshipsCache[relationshipName] = [];
1255
+ this_1.relationships[relationshipName] = [];
1256
+ for (var _i = 0, relationshipData_1 = relationshipData; _i < relationshipData_1.length; _i++) {
1257
+ var relationshipId = relationshipData_1[_i];
1258
+ var model = preloaded.getModel(relationshipType, relationshipId);
1259
+ this_1.relationshipsCache[relationshipName].push(model);
1260
+ this_1.relationships[relationshipName].push(model);
1261
+ }
1262
+ }
1263
+ else {
1264
+ var model = preloaded.getModel(relationshipType, relationshipData);
1265
+ this_1.relationshipsCache[relationshipName] = model;
1266
+ this_1.relationships[relationshipName] = model;
1267
+ }
1268
+ };
1269
+ var this_1 = this;
1270
+ for (var relationshipName in this.preloadedRelationships) {
1271
+ _loop_1(relationshipName);
1272
+ }
1273
+ };
1274
+ /**
1275
+ * @returns {number|string}
1276
+ */
1277
+ BaseModel.prototype.primaryKey = function () { return this.readAttributeUnderscore(this.modelClass().primaryKey()); };
1278
+ BaseModel.apiMakerType = "BaseModel";
1279
+ /**
1280
+ * @param {ValidationErrors} validationErrors
1281
+ * @returns {CustomEvent}
1282
+ */
1283
+ BaseModel.newCustomEvent = function (validationErrors) {
1284
+ return new CustomEvent("validation-errors", { detail: validationErrors });
1285
+ };
1286
+ return BaseModel;
1287
+ }());
1288
+ exports.default = BaseModel;
1289
+ //# sourceMappingURL=base-model.js.map