@nlabs/metropolisjs 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.github/copilot-instructions.md +167 -0
  2. package/AGENTS.md +13 -0
  3. package/CHANGELOG.md +112 -0
  4. package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
  5. package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
  6. package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
  7. package/README.md +1123 -112
  8. package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
  9. package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
  10. package/docs/ACTIONS.md +63 -0
  11. package/docs/COLLECTIONS.md +1038 -0
  12. package/docs/CONNECTIONS.md +1367 -0
  13. package/docs/CRUD_INTEGRATION.md +702 -0
  14. package/examples/connections-usage.tsx +909 -0
  15. package/examples/content-actions-usage.ts +144 -0
  16. package/examples/crud-usage.tsx +847 -0
  17. package/examples/extensibility-usage.tsx +889 -0
  18. package/examples/i18n-import-examples.ts +86 -0
  19. package/examples/i18n-namespace-usage.ts +118 -0
  20. package/examples/i18next-singleton-demo.ts +187 -0
  21. package/examples/permission-system-usage.tsx +415 -0
  22. package/examples/project-details.tsx +397 -0
  23. package/examples/shared-i18n-usage.tsx +203 -0
  24. package/examples/signup-error-handling.ts +100 -0
  25. package/examples/translation-types.ts +86 -0
  26. package/examples/translation-usage.tsx +336 -0
  27. package/index.js +1 -0
  28. package/jest.config.mjs +28 -0
  29. package/lex.config.mjs +11 -2
  30. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
  31. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
  32. package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
  33. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
  34. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
  35. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
  36. package/lib/actions/appActions/appActions.d.ts +29 -0
  37. package/lib/actions/appActions/appActions.d.ts.map +1 -0
  38. package/lib/actions/appActions/appActions.js +159 -0
  39. package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
  40. package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
  41. package/lib/actions/connectionActions/connectionActions.js +131 -0
  42. package/lib/actions/contentActions/contentActions.d.ts +34 -0
  43. package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
  44. package/lib/actions/contentActions/contentActions.js +314 -0
  45. package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
  46. package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
  47. package/lib/actions/conversationActions/conversationActions.js +225 -0
  48. package/lib/actions/eventActions/eventActions.d.ts +27 -7
  49. package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
  50. package/lib/actions/eventActions/eventActions.js +436 -2
  51. package/lib/actions/groupActions/groupActions.d.ts +30 -0
  52. package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
  53. package/lib/actions/groupActions/groupActions.js +229 -0
  54. package/lib/actions/imageActions/imageActions.d.ts +16 -10
  55. package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
  56. package/lib/actions/imageActions/imageActions.js +593 -2
  57. package/lib/actions/index.d.ts +21 -9
  58. package/lib/actions/index.d.ts.map +1 -0
  59. package/lib/actions/index.js +22 -2
  60. package/lib/actions/locationActions/locationActions.d.ts +11 -9
  61. package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
  62. package/lib/actions/locationActions/locationActions.js +388 -2
  63. package/lib/actions/messageActions/messageActions.d.ts +16 -32
  64. package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
  65. package/lib/actions/messageActions/messageActions.js +235 -2
  66. package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
  67. package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
  68. package/lib/actions/permissionActions/permissionActions.js +330 -0
  69. package/lib/actions/personaActions/personaActions.d.ts +65 -0
  70. package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
  71. package/lib/actions/personaActions/personaActions.js +572 -0
  72. package/lib/actions/postActions/postActions.d.ts +12 -32
  73. package/lib/actions/postActions/postActions.d.ts.map +1 -0
  74. package/lib/actions/postActions/postActions.js +447 -2
  75. package/lib/actions/reactionActions/reactionActions.d.ts +13 -27
  76. package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
  77. package/lib/actions/reactionActions/reactionActions.js +413 -2
  78. package/lib/actions/sseActions/sseActions.d.ts +1 -0
  79. package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
  80. package/lib/actions/sseActions/sseActions.js +148 -2
  81. package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
  82. package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
  83. package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
  84. package/lib/actions/tagActions/tagActions.d.ts +13 -31
  85. package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
  86. package/lib/actions/tagActions/tagActions.js +347 -2
  87. package/lib/actions/translationActions/translationActions.d.ts +38 -0
  88. package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
  89. package/lib/actions/translationActions/translationActions.js +189 -0
  90. package/lib/actions/userActions/userActions.d.ts +44 -95
  91. package/lib/actions/userActions/userActions.d.ts.map +1 -0
  92. package/lib/actions/userActions/userActions.js +870 -2
  93. package/lib/actions/videoActions/videoActions.d.ts +41 -0
  94. package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
  95. package/lib/actions/videoActions/videoActions.js +532 -0
  96. package/lib/actions/websocketActions/websocketActions.d.ts +20 -21
  97. package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
  98. package/lib/actions/websocketActions/websocketActions.js +377 -2
  99. package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
  100. package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
  101. package/lib/adapters/appAdapter/appAdapter.js +90 -0
  102. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +3 -2
  103. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
  104. package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -2
  105. package/lib/adapters/contentAdapter/contentAdapter.d.ts +3 -2
  106. package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
  107. package/lib/adapters/contentAdapter/contentAdapter.js +107 -2
  108. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +3 -2
  109. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
  110. package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -2
  111. package/lib/adapters/eventAdapter/eventAdapter.d.ts +5 -2
  112. package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
  113. package/lib/adapters/eventAdapter/eventAdapter.js +162 -2
  114. package/lib/adapters/fileAdapter/fileAdapter.d.ts +3 -2
  115. package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
  116. package/lib/adapters/fileAdapter/fileAdapter.js +118 -2
  117. package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
  118. package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
  119. package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
  120. package/lib/adapters/imageAdapter/imageAdapter.d.ts +9 -2
  121. package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
  122. package/lib/adapters/imageAdapter/imageAdapter.js +134 -2
  123. package/lib/adapters/index.d.ts +34 -16
  124. package/lib/adapters/index.d.ts.map +1 -0
  125. package/lib/adapters/index.js +19 -2
  126. package/lib/adapters/locationAdapter/locationAdapter.d.ts +3 -2
  127. package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
  128. package/lib/adapters/locationAdapter/locationAdapter.js +95 -2
  129. package/lib/adapters/messageAdapter/messageAdapter.d.ts +23 -19
  130. package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
  131. package/lib/adapters/messageAdapter/messageAdapter.js +82 -2
  132. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
  133. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
  134. package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
  135. package/lib/adapters/personaAdapter/personaAdapter.d.ts +28 -2
  136. package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
  137. package/lib/adapters/personaAdapter/personaAdapter.js +161 -2
  138. package/lib/adapters/postAdapter/postAdapter.d.ts +3 -2
  139. package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
  140. package/lib/adapters/postAdapter/postAdapter.js +115 -2
  141. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +5 -2
  142. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
  143. package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -2
  144. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +3 -2
  145. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
  146. package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -2
  147. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +3 -2
  148. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
  149. package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -2
  150. package/lib/adapters/tagAdapter/tagAdapter.d.ts +3 -2
  151. package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
  152. package/lib/adapters/tagAdapter/tagAdapter.js +98 -2
  153. package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
  154. package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
  155. package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
  156. package/lib/adapters/userAdapter/userAdapter.d.ts +18 -6
  157. package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
  158. package/lib/adapters/userAdapter/userAdapter.js +302 -2
  159. package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
  160. package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
  161. package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
  162. package/lib/config/index.d.ts +19 -6
  163. package/lib/config/index.d.ts.map +1 -0
  164. package/lib/config/index.js +97 -2
  165. package/lib/constants/Collections.d.ts +44 -0
  166. package/lib/constants/Collections.d.ts.map +1 -0
  167. package/lib/constants/Collections.js +40 -0
  168. package/lib/constants/MetropolisConstants.d.ts +1 -0
  169. package/lib/constants/MetropolisConstants.d.ts.map +1 -0
  170. package/lib/constants/MetropolisConstants.js +15 -2
  171. package/lib/graphql/message.d.ts +1 -0
  172. package/lib/graphql/message.d.ts.map +1 -0
  173. package/lib/graphql/message.js +6 -4
  174. package/lib/graphql/notification.d.ts +1 -0
  175. package/lib/graphql/notification.d.ts.map +1 -0
  176. package/lib/graphql/notification.js +6 -4
  177. package/lib/graphql/session.d.ts +1 -0
  178. package/lib/graphql/session.d.ts.map +1 -0
  179. package/lib/graphql/session.js +4 -3
  180. package/lib/index.d.ts +45 -22
  181. package/lib/index.d.ts.map +1 -0
  182. package/lib/index.js +248 -2
  183. package/lib/stores/appStore.d.ts +1 -0
  184. package/lib/stores/appStore.d.ts.map +1 -0
  185. package/lib/stores/appStore.js +23 -2
  186. package/lib/stores/contentStore.d.ts +36 -0
  187. package/lib/stores/contentStore.d.ts.map +1 -0
  188. package/lib/stores/contentStore.js +139 -0
  189. package/lib/stores/conversationStore.d.ts +38 -0
  190. package/lib/stores/conversationStore.d.ts.map +1 -0
  191. package/lib/stores/conversationStore.js +117 -0
  192. package/lib/stores/eventStore.d.ts +4 -1
  193. package/lib/stores/eventStore.d.ts.map +1 -0
  194. package/lib/stores/eventStore.js +47 -2
  195. package/lib/stores/groupStore.d.ts +37 -0
  196. package/lib/stores/groupStore.d.ts.map +1 -0
  197. package/lib/stores/groupStore.js +68 -0
  198. package/lib/stores/imageStore.d.ts +6 -1
  199. package/lib/stores/imageStore.d.ts.map +1 -0
  200. package/lib/stores/imageStore.js +53 -2
  201. package/lib/stores/index.d.ts +20 -11
  202. package/lib/stores/index.d.ts.map +1 -0
  203. package/lib/stores/index.js +24 -2
  204. package/lib/stores/locationStore.d.ts +2 -1
  205. package/lib/stores/locationStore.d.ts.map +1 -0
  206. package/lib/stores/locationStore.js +42 -2
  207. package/lib/stores/messageStore.d.ts +19 -4
  208. package/lib/stores/messageStore.d.ts.map +1 -0
  209. package/lib/stores/messageStore.js +137 -2
  210. package/lib/stores/notificationStore.d.ts +33 -0
  211. package/lib/stores/notificationStore.d.ts.map +1 -0
  212. package/lib/stores/notificationStore.js +55 -0
  213. package/lib/stores/permissionStore.d.ts +37 -0
  214. package/lib/stores/permissionStore.d.ts.map +1 -0
  215. package/lib/stores/permissionStore.js +117 -0
  216. package/lib/stores/personaStore.d.ts +26 -0
  217. package/lib/stores/personaStore.d.ts.map +1 -0
  218. package/lib/stores/personaStore.js +118 -0
  219. package/lib/stores/postStore.d.ts +2 -1
  220. package/lib/stores/postStore.d.ts.map +1 -0
  221. package/lib/stores/postStore.js +53 -2
  222. package/lib/stores/reactionStore.d.ts +1 -0
  223. package/lib/stores/reactionStore.d.ts.map +1 -0
  224. package/lib/stores/reactionStore.js +28 -2
  225. package/lib/stores/subscriptionStore.d.ts +41 -0
  226. package/lib/stores/subscriptionStore.d.ts.map +1 -0
  227. package/lib/stores/subscriptionStore.js +85 -0
  228. package/lib/stores/tagStore.d.ts +8 -5
  229. package/lib/stores/tagStore.d.ts.map +1 -0
  230. package/lib/stores/tagStore.js +87 -2
  231. package/lib/stores/translationStore.d.ts +42 -0
  232. package/lib/stores/translationStore.d.ts.map +1 -0
  233. package/lib/stores/translationStore.js +122 -0
  234. package/lib/stores/userStore.d.ts +5 -4
  235. package/lib/stores/userStore.d.ts.map +1 -0
  236. package/lib/stores/userStore.js +319 -2
  237. package/lib/stores/videoStore.d.ts +39 -0
  238. package/lib/stores/videoStore.d.ts.map +1 -0
  239. package/lib/stores/videoStore.js +132 -0
  240. package/lib/stores/websocketStore.d.ts +1 -0
  241. package/lib/stores/websocketStore.d.ts.map +1 -0
  242. package/lib/stores/websocketStore.js +51 -2
  243. package/lib/types/apps.types.d.ts +17 -0
  244. package/lib/types/apps.types.d.ts.map +1 -0
  245. package/lib/types/apps.types.js +6 -0
  246. package/lib/types/common.types.d.ts +31 -0
  247. package/lib/types/common.types.d.ts.map +1 -0
  248. package/lib/types/common.types.js +6 -0
  249. package/lib/types/conversations.types.d.ts +17 -0
  250. package/lib/types/conversations.types.d.ts.map +1 -0
  251. package/lib/types/conversations.types.js +6 -0
  252. package/lib/types/edges.types.d.ts +38 -0
  253. package/lib/types/edges.types.d.ts.map +1 -0
  254. package/lib/types/edges.types.js +6 -0
  255. package/lib/types/groups.types.d.ts +19 -0
  256. package/lib/types/groups.types.d.ts.map +1 -0
  257. package/lib/types/groups.types.js +6 -0
  258. package/lib/types/index.d.ts +12 -0
  259. package/lib/types/index.d.ts.map +1 -0
  260. package/lib/types/index.js +12 -0
  261. package/lib/types/subscriptions.types.d.ts +32 -0
  262. package/lib/types/subscriptions.types.d.ts.map +1 -0
  263. package/lib/types/subscriptions.types.js +6 -0
  264. package/lib/types/videos.types.d.ts +61 -0
  265. package/lib/types/videos.types.d.ts.map +1 -0
  266. package/lib/types/videos.types.js +6 -0
  267. package/lib/utils/MetropolisProvider.d.ts +39 -15
  268. package/lib/utils/MetropolisProvider.d.ts.map +1 -0
  269. package/lib/utils/MetropolisProvider.js +31 -2
  270. package/lib/utils/actionFactory.d.ts +21 -19
  271. package/lib/utils/actionFactory.d.ts.map +1 -0
  272. package/lib/utils/actionFactory.js +95 -2
  273. package/lib/utils/api.d.ts +5 -4
  274. package/lib/utils/api.d.ts.map +1 -0
  275. package/lib/utils/api.js +252 -6
  276. package/lib/utils/app.d.ts +1 -0
  277. package/lib/utils/app.d.ts.map +1 -0
  278. package/lib/utils/app.js +15 -2
  279. package/lib/utils/baseActionFactory.d.ts +5 -23
  280. package/lib/utils/baseActionFactory.d.ts.map +1 -0
  281. package/lib/utils/baseActionFactory.js +72 -2
  282. package/lib/utils/configUtils.d.ts +11 -0
  283. package/lib/utils/configUtils.d.ts.map +1 -0
  284. package/lib/utils/configUtils.js +20 -0
  285. package/lib/utils/dateUtils.d.ts +1 -0
  286. package/lib/utils/dateUtils.d.ts.map +1 -0
  287. package/lib/utils/dateUtils.js +11 -2
  288. package/lib/utils/file.d.ts +3 -1
  289. package/lib/utils/file.d.ts.map +1 -0
  290. package/lib/utils/file.js +156 -2
  291. package/lib/utils/i18n.d.ts +7 -0
  292. package/lib/utils/i18n.d.ts.map +1 -0
  293. package/lib/utils/i18n.js +96 -0
  294. package/lib/utils/index.d.ts +20 -0
  295. package/lib/utils/index.d.ts.map +1 -0
  296. package/lib/utils/index.js +26 -0
  297. package/lib/utils/location.d.ts +4 -3
  298. package/lib/utils/location.d.ts.map +1 -0
  299. package/lib/utils/location.js +82 -2
  300. package/lib/utils/permissionUtils.d.ts +22 -0
  301. package/lib/utils/permissionUtils.d.ts.map +1 -0
  302. package/lib/utils/permissionUtils.js +72 -0
  303. package/lib/utils/requestCache.d.ts +8 -0
  304. package/lib/utils/requestCache.d.ts.map +1 -0
  305. package/lib/utils/requestCache.js +53 -0
  306. package/lib/utils/session.d.ts +14 -0
  307. package/lib/utils/session.d.ts.map +1 -0
  308. package/lib/utils/session.js +107 -0
  309. package/lib/utils/useConversationTyping.d.ts +26 -0
  310. package/lib/utils/useConversationTyping.d.ts.map +1 -0
  311. package/lib/utils/useConversationTyping.js +117 -0
  312. package/lib/utils/useMetropolis.d.ts +67 -12
  313. package/lib/utils/useMetropolis.d.ts.map +1 -0
  314. package/lib/utils/useMetropolis.js +311 -2
  315. package/lib/utils/useTranslations.d.ts +16 -0
  316. package/lib/utils/useTranslations.d.ts.map +1 -0
  317. package/lib/utils/useTranslations.js +105 -0
  318. package/lib/utils/validatorFactory.d.ts +3 -2
  319. package/lib/utils/validatorFactory.d.ts.map +1 -0
  320. package/lib/utils/validatorFactory.js +95 -2
  321. package/package.json +58 -17
  322. package/temp_signin.ts +73 -0
  323. package/lib/actions/profileActions/profileActions.d.ts +0 -50
  324. package/lib/actions/profileActions/profileActions.js +0 -2
  325. package/lib/adapters/profileAdapter/profileAdapter.d.ts +0 -32
  326. package/lib/adapters/profileAdapter/profileAdapter.js +0 -2
  327. package/lib/stores/profileStore.d.ts +0 -24
  328. package/lib/stores/profileStore.js +0 -2
  329. /package/{FACTORY_PATTERN_GUIDE.md → factoryPatternGuide.md} +0 -0
@@ -1,2 +1,593 @@
1
- import{parseString as h}from"@nlabs/utils";import{validateImageInput as S}from"../../adapters/imageAdapter/imageAdapter";import{Config as w}from"../../config";import{IMAGE_CONSTANTS as o}from"../../stores/imageStore";import{appMutation as _,appQuery as T,uploadImage as E}from"../../utils/api";import{convertFileToBase64 as b}from"../../utils/file";const u="images",C=(e,d)=>S(e),A=(e,d)=>(p,y)=>{const g={...d,...y};let I=C(p,g);return e&&(I=e(I,g)),g?.customValidation&&(I=g.customValidation(I)),I},q=(e,d)=>{let p=d?.imageAdapterOptions||{},y=d?.imageAdapter,g=A(y,p);const I=i=>{y=i,g=A(y,p)},O=i=>{p={...p,...i},g=A(y,p)},R=async(i,s="image")=>{try{const t=g(i,p),{base64:n,description:a,itemId:r}=t,m={base64:n,description:a?h(a,500):void 0,fileType:"image/jpeg",itemId:r,itemType:s},{image:c}=await E(e,m);return await e.dispatch({image:c,type:o.ADD_ITEM_SUCCESS}),c}catch(t){throw e.dispatch({error:t,type:o.ADD_ITEM_ERROR}),t}};return{add:R,delete:async(i,s=[])=>{try{const t={imageId:{type:"ID!",value:i}},n=(r={})=>{const{deleteImage:m={}}=r;return e.dispatch({image:m,type:o.REMOVE_ITEM_SUCCESS})},{deleteImage:a}=await _(e,"deleteImage",u,t,["id",...s],{onSuccess:n});return a}catch(t){throw e.dispatch({error:t,type:o.REMOVE_ITEM_ERROR}),t}},update:async(i,s="image")=>{try{const t=g(i,p),{base64:n,description:a,itemId:r}=t,m={base64:n,description:a?h(a,500):void 0,fileType:"image/jpeg",itemId:r,itemType:s},{image:c}=await E(e,m);return await e.dispatch({image:c,type:o.ADD_ITEM_SUCCESS}),c}catch(t){throw e.dispatch({error:t,type:o.ADD_ITEM_ERROR}),t}},upload:async(i,s,t="users")=>{try{const n=await Promise.all(i.map(async a=>{const r=await b(a,w.get("app.images.maxImageSize")),{type:m}=a;return R({base64:r,fileType:m,itemId:s},t)}));return await e.dispatch({images:n,type:o.UPLOAD_ITEM_SUCCESS}),n}catch(n){throw e.dispatch({error:n,type:o.UPLOAD_ITEM_ERROR}),n}},countByItem:async i=>{try{const s={itemId:{type:"String!",value:i}},t=(a={})=>{const{imageCount:r=0}=a;return e.dispatch({itemId:i,count:r,type:o.GET_COUNT_SUCCESS})},{imageCount:n}=await T(e,"imageCount",u,s,["count"],{onSuccess:t});return n}catch(s){throw e.dispatch({error:s,type:o.GET_COUNT_ERROR}),s}},listByItem:async(i,s=0,t=10,n=[])=>{try{const a={from:{type:"Int",value:s},itemId:{type:"ID!",value:i},to:{type:"Int",value:t}},r=(c={})=>{const{imagesByItem:l=[]}=c;return e.dispatch({itemId:i,list:l,type:o.GET_LIST_SUCCESS})},{imagesByItem:m}=await T(e,"imagesByItem",u,a,["color","description","height","imageId","imageUrl","likeCount","thumbUrl","width",...n],{onSuccess:r});return m}catch(a){throw e.dispatch({error:a,type:o.GET_LIST_ERROR}),a}},listByReactions:async(i,s=0,t=10,n=[])=>{try{const a={from:{type:"Int",value:s},reactions:{type:"ReactionInput!",value:i},to:{type:"Int",value:t}},r=(c={})=>{const{imagesByReactions:l=[]}=c;return e.dispatch({list:l,type:o.GET_LIST_SUCCESS})},{imagesByReactions:m}=await T(e,"imagesByReactions",u,a,["color","description","height","imageId","imageUrl","likeCount","thumbUrl","width",...n],{onSuccess:r});return m}catch(a){throw e.dispatch({error:a,type:o.GET_LIST_ERROR}),a}},updateImageAdapter:I,updateImageAdapterOptions:O}};export{q as createImageActions};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FjdGlvbnMvaW1hZ2VBY3Rpb25zL2ltYWdlQWN0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscyc7XG5cbmltcG9ydCB7dmFsaWRhdGVJbWFnZUlucHV0fSBmcm9tICcuLi8uLi9hZGFwdGVycy9pbWFnZUFkYXB0ZXIvaW1hZ2VBZGFwdGVyJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHtJTUFHRV9DT05TVEFOVFN9IGZyb20gJy4uLy4uL3N0b3Jlcy9pbWFnZVN0b3JlJztcbmltcG9ydCB7YXBwTXV0YXRpb24sIGFwcFF1ZXJ5LCB1cGxvYWRJbWFnZX0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpJztcbmltcG9ydCB7Y29udmVydEZpbGVUb0Jhc2U2NH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZSc7XG5cbmltcG9ydCB0eXBlIHtGbHV4RnJhbWV3b3JrfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlVHlwZX0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvaW1hZ2VBZGFwdGVyL2ltYWdlQWRhcHRlcic7XG5pbXBvcnQgdHlwZSB7QXBpUmVzdWx0c1R5cGUsIFJlYWt0b3JEYkNvbGxlY3Rpb259IGZyb20gJy4uLy4uL3V0aWxzL2FwaSc7XG5cbmNvbnN0IERBVEFfVFlQRTogUmVha3RvckRiQ29sbGVjdGlvbiA9ICdpbWFnZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlQWRhcHRlck9wdGlvbnMge1xuICBzdHJpY3Q/OiBib29sZWFuO1xuICBhbGxvd1BhcnRpYWw/OiBib29sZWFuO1xuICBlbnZpcm9ubWVudD86ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbicgfCAndGVzdCc7XG4gIGN1c3RvbVZhbGlkYXRpb24/OiAoaW5wdXQ6IHVua25vd24pID0+IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VBY3Rpb25zT3B0aW9ucyB7XG4gIGltYWdlQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgaW1hZ2VBZGFwdGVyT3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCB0eXBlIEltYWdlQXBpUmVzdWx0c1R5cGUgPSB7XG4gIGFkZEltYWdlOiBJbWFnZVR5cGU7XG4gIGRlbGV0ZUltYWdlOiBJbWFnZVR5cGU7XG4gIGltYWdlOiBJbWFnZVR5cGU7XG4gIHVwZGF0ZUltYWdlOiBJbWFnZVR5cGU7XG4gIHVwbG9hZEZpbGVJbWFnZXM6IEltYWdlVHlwZVtdO1xuICBnZXRJbWFnZUNvdW50OiBudW1iZXI7XG4gIGdldEltYWdlc0J5SXRlbTogSW1hZ2VUeXBlW107XG4gIGdldEltYWdlc0J5UmVhY3Rpb25zOiBJbWFnZVR5cGVbXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VBY3Rpb25zIHtcbiAgYWRkOiAoaW1hZ2U6IFBhcnRpYWw8SW1hZ2VUeXBlPiwgdHlwZT86IHN0cmluZykgPT4gUHJvbWlzZTxJbWFnZVR5cGU+O1xuICBkZWxldGU6IChpbWFnZUlkOiBzdHJpbmcsIGltYWdlUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxJbWFnZVR5cGU+O1xuICB1cGRhdGU6IChpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LCB0eXBlPzogc3RyaW5nKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIHVwbG9hZDogKGltYWdlRmlsZXM6IEZpbGVbXSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlPzogc3RyaW5nKSA9PiBQcm9taXNlPEltYWdlVHlwZVtdPjtcbiAgY291bnRCeUl0ZW06IChpdGVtSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxudW1iZXI+O1xuICBsaXN0QnlJdGVtOiAoaXRlbUlkOiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBpbWFnZVByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBsaXN0QnlSZWFjdGlvbnM6IChyZWFjdGlvbnM6IHN0cmluZ1tdLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgaW1hZ2VQcm9wcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPEltYWdlVHlwZVtdPjtcbiAgdXBkYXRlSW1hZ2VBZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVJbWFnZUFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5jb25zdCBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zKSA9PiB2YWxpZGF0ZUltYWdlSW5wdXQoaW5wdXQpO1xuXG4vLyBFbmhhbmNlZCB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgbWVyZ2VzIGN1c3RvbSBsb2dpYyB3aXRoIGRlZmF1bHRzXG5jb25zdCBjcmVhdGVJbWFnZVZhbGlkYXRvciA9IChcbiAgY3VzdG9tQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSxcbiAgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnNcbikgPT4gKGlucHV0OiB1bmtub3duLCB2YWxpZGF0b3JPcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0gey4uLm9wdGlvbnMsIC4uLnZhbGlkYXRvck9wdGlvbnN9O1xuXG4gIC8vIFN0YXJ0IHdpdGggZGVmYXVsdCB2YWxpZGF0aW9uXG4gIGxldCB2YWxpZGF0ZWQgPSBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IoaW5wdXQsIG1lcmdlZE9wdGlvbnMpO1xuXG4gIC8vIEFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIGlmIHByb3ZpZGVkXG4gIGlmKGN1c3RvbUFkYXB0ZXIpIHtcbiAgICB2YWxpZGF0ZWQgPSBjdXN0b21BZGFwdGVyKHZhbGlkYXRlZCwgbWVyZ2VkT3B0aW9ucyk7XG4gIH1cblxuICAvLyBBcHBseSBjdXN0b20gdmFsaWRhdGlvbiBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWRcbiAgaWYobWVyZ2VkT3B0aW9ucz8uY3VzdG9tVmFsaWRhdGlvbikge1xuICAgIHZhbGlkYXRlZCA9IG1lcmdlZE9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbih2YWxpZGF0ZWQpIGFzIEltYWdlVHlwZTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWQ7XG59O1xuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIEltYWdlQWN0aW9ucyB3aXRoIGVuaGFuY2VkIGFkYXB0ZXIgaW5qZWN0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEN1c3RvbSBhZGFwdGVycyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBiZWhhdmlvciwgYWxsb3dpbmcgcGFydGlhbCBvdmVycmlkZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCBhZGFwdGVyc1xuICogY29uc3QgaW1hZ2VBY3Rpb25zID0gY3JlYXRlSW1hZ2VBY3Rpb25zKGZsdXgpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gYWRhcHRlciB0aGF0IGV4dGVuZHMgZGVmYXVsdCBiZWhhdmlvclxuICogY29uc3QgY3VzdG9tSW1hZ2VBZGFwdGVyID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICogICAvLyBpbnB1dCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBieSBkZWZhdWx0IGFkYXB0ZXJcbiAqICAgaWYgKGlucHV0LmZpbGVTaXplICYmIGlucHV0LmZpbGVTaXplID4gNTAwMDAwMCkge1xuICogICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgZmlsZSB0b28gbGFyZ2UnKTtcbiAqICAgfVxuICogICByZXR1cm4gaW5wdXQ7XG4gKiB9O1xuICpcbiAqIGNvbnN0IGltYWdlQWN0aW9ucyA9IGNyZWF0ZUltYWdlQWN0aW9ucyhmbHV4LCB7XG4gKiAgIGltYWdlQWRhcHRlcjogY3VzdG9tSW1hZ2VBZGFwdGVyXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUltYWdlQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IEltYWdlQWN0aW9uc09wdGlvbnNcbik6IEltYWdlQWN0aW9ucyA9PiB7XG4gIC8vIEluaXRpYWxpemUgYWRhcHRlciBzdGF0ZVxuICBsZXQgaW1hZ2VBZGFwdGVyT3B0aW9uczogSW1hZ2VBZGFwdGVyT3B0aW9ucyA9IG9wdGlvbnM/LmltYWdlQWRhcHRlck9wdGlvbnMgfHwge307XG4gIGxldCBjdXN0b21JbWFnZUFkYXB0ZXIgPSBvcHRpb25zPy5pbWFnZUFkYXB0ZXI7XG5cbiAgLy8gQ3JlYXRlIHZhbGlkYXRvcnMgdGhhdCBtZXJnZSBjdXN0b20gYWRhcHRlcnMgd2l0aCBkZWZhdWx0c1xuICBsZXQgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG5cbiAgLy8gVXBkYXRlIGZ1bmN0aW9ucyB0aGF0IHJlY3JlYXRlIHZhbGlkYXRvcnNcbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyID0gKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSk6IHZvaWQgPT4ge1xuICAgIGN1c3RvbUltYWdlQWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9ucyA9IChvcHRpb25zOiBJbWFnZUFkYXB0ZXJPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgaW1hZ2VBZGFwdGVyT3B0aW9ucyA9IHsuLi5pbWFnZUFkYXB0ZXJPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICB2YWxpZGF0ZUltYWdlID0gY3JlYXRlSW1hZ2VWYWxpZGF0b3IoY3VzdG9tSW1hZ2VBZGFwdGVyLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgfTtcblxuICAvLyBBY3Rpb24gaW1wbGVtZW50YXRpb25zXG4gIGNvbnN0IGFkZCA9IGFzeW5jIChcbiAgICBpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LFxuICAgIHR5cGU6IHN0cmluZyA9ICdpbWFnZSdcbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkSW1hZ2UgPSB2YWxpZGF0ZUltYWdlKGltYWdlLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IHtiYXNlNjQsIGRlc2NyaXB0aW9uLCBpdGVtSWR9ID0gdmFsaWRhdGVkSW1hZ2U7XG4gICAgICBjb25zdCBmb3JtYXRJbWFnZSA9IHtcbiAgICAgICAgYmFzZTY0LFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gPyBwYXJzZVN0cmluZyhkZXNjcmlwdGlvbiwgNTAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgICAgaXRlbUlkLFxuICAgICAgICBpdGVtVHlwZTogdHlwZVxuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlOiBuZXdJbWFnZX0gPSBhd2FpdCB1cGxvYWRJbWFnZShmbHV4LCBmb3JtYXRJbWFnZSk7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtpbWFnZTogbmV3SW1hZ2UsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTfSk7XG4gICAgICByZXR1cm4gbmV3SW1hZ2UgYXMgSW1hZ2VUeXBlO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuQUREX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkZWxldGVJbWFnZSA9IGFzeW5jIChcbiAgICBpbWFnZUlkOiBzdHJpbmcsXG4gICAgaW1hZ2VQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPEltYWdlVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgaW1hZ2VJZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBpbWFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtkZWxldGVJbWFnZSA9IHt9fSA9IGRhdGE7XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtpbWFnZTogZGVsZXRlSW1hZ2UsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9TVUNDRVNTfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7ZGVsZXRlSW1hZ2V9ID0gYXdhaXQgYXBwTXV0YXRpb24oZmx1eCwgJ2RlbGV0ZUltYWdlJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgWydpZCcsIC4uLmltYWdlUHJvcHNdLCB7b25TdWNjZXNzfSk7XG4gICAgICByZXR1cm4gZGVsZXRlSW1hZ2UgYXMgSW1hZ2VUeXBlO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuUkVNT1ZFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGUgPSBhc3luYyAoXG4gICAgaW1hZ2U6IFBhcnRpYWw8SW1hZ2VUeXBlPixcbiAgICB0eXBlOiBzdHJpbmcgPSAnaW1hZ2UnXG4gICk6IFByb21pc2U8SW1hZ2VUeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEltYWdlID0gdmFsaWRhdGVJbWFnZShpbWFnZSwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG4gICAgICBjb25zdCB7YmFzZTY0LCBkZXNjcmlwdGlvbiwgaXRlbUlkfSA9IHZhbGlkYXRlZEltYWdlO1xuICAgICAgY29uc3QgZm9ybWF0SW1hZ2UgPSB7XG4gICAgICAgIGJhc2U2NCxcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uID8gcGFyc2VTdHJpbmcoZGVzY3JpcHRpb24sIDUwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgIGZpbGVUeXBlOiAnaW1hZ2UvanBlZycsXG4gICAgICAgIGl0ZW1JZCxcbiAgICAgICAgaXRlbVR5cGU6IHR5cGVcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHtpbWFnZTogbmV3SW1hZ2V9ID0gYXdhaXQgdXBsb2FkSW1hZ2UoZmx1eCwgZm9ybWF0SW1hZ2UpO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7aW1hZ2U6IG5ld0ltYWdlLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTU30pO1xuICAgICAgcmV0dXJuIG5ld0ltYWdlIGFzIEltYWdlVHlwZTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkFERF9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBsb2FkID0gYXN5bmMgKFxuICAgIGltYWdlRmlsZXM6IEZpbGVbXSxcbiAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICBpdGVtVHlwZTogc3RyaW5nID0gJ3VzZXJzJ1xuICApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhdmVkSW1hZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGltYWdlRmlsZXMubWFwKGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmFzZTY0OiBzdHJpbmcgPSBhd2FpdCBjb252ZXJ0RmlsZVRvQmFzZTY0KGZpbGUsIENvbmZpZy5nZXQoJ2FwcC5pbWFnZXMubWF4SW1hZ2VTaXplJykpO1xuICAgICAgICAgIGNvbnN0IHt0eXBlOiBmaWxlVHlwZX0gPSBmaWxlO1xuICAgICAgICAgIHJldHVybiBhZGQoe2Jhc2U2NCwgZmlsZVR5cGUsIGl0ZW1JZH0sIGl0ZW1UeXBlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlczogc2F2ZWRJbWFnZXMsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9TVUNDRVNTfSk7XG4gICAgICByZXR1cm4gc2F2ZWRJbWFnZXM7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvdW50QnlJdGVtID0gYXN5bmMgKGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGl0ZW1JZDoge1xuICAgICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgICB2YWx1ZTogaXRlbUlkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHtpbWFnZUNvdW50OiBjb3VudCA9IDB9ID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2l0ZW1JZCwgY291bnQsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfQ09VTlRfU1VDQ0VTU30pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlQ291bnR9ID0gYXdhaXQgYXBwUXVlcnkoZmx1eCwgJ2ltYWdlQ291bnQnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbJ2NvdW50J10sIHtvblN1Y2Nlc3N9KTtcbiAgICAgIHJldHVybiBpbWFnZUNvdW50IGFzIG51bWJlcjtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9DT1VOVF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgaW1hZ2VQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBmcm9tOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IGZyb21cbiAgICAgICAgfSxcbiAgICAgICAgaXRlbUlkOiB7XG4gICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgdmFsdWU6IGl0ZW1JZFxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiB0b1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7aW1hZ2VzQnlJdGVtID0gW119ID0gZGF0YSBhcyB7aW1hZ2VzQnlJdGVtOiBJbWFnZVR5cGVbXX07XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgbGlzdDogaW1hZ2VzQnlJdGVtLFxuICAgICAgICAgIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlc0J5SXRlbX0gPSBhd2FpdCBhcHBRdWVyeShcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2ltYWdlc0J5SXRlbScsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnY29sb3InLFxuICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ2ltYWdlSWQnLFxuICAgICAgICAgICdpbWFnZVVybCcsXG4gICAgICAgICAgJ2xpa2VDb3VudCcsXG4gICAgICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLmltYWdlUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgICByZXR1cm4gaW1hZ2VzQnlJdGVtIGFzIEltYWdlVHlwZVtdO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0QnlSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgcmVhY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICBpbWFnZVByb3BzOiBzdHJpbmdbXSA9IFtdXG4gICk6IFByb21pc2U8SW1hZ2VUeXBlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgICB9LFxuICAgICAgICByZWFjdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnUmVhY3Rpb25JbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiByZWFjdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogdG9cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3Qge2ltYWdlc0J5UmVhY3Rpb25zID0gW119ID0gZGF0YSBhcyB7aW1hZ2VzQnlSZWFjdGlvbnM6IEltYWdlVHlwZVtdfTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIGxpc3Q6IGltYWdlc0J5UmVhY3Rpb25zLFxuICAgICAgICAgIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qge2ltYWdlc0J5UmVhY3Rpb25zfSA9IGF3YWl0IGFwcFF1ZXJ5KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2VzQnlSZWFjdGlvbnMnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICdpbWFnZUlkJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdsaWtlQ291bnQnLFxuICAgICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAuLi5pbWFnZVByb3BzXG4gICAgICAgIF0sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGltYWdlc0J5UmVhY3Rpb25zIGFzIEltYWdlVHlwZVtdO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIGFjdGlvbnMgb2JqZWN0XG4gIHJldHVybiB7XG4gICAgYWRkLFxuICAgIGRlbGV0ZTogZGVsZXRlSW1hZ2UsXG4gICAgdXBkYXRlLFxuICAgIHVwbG9hZCxcbiAgICBjb3VudEJ5SXRlbSxcbiAgICBsaXN0QnlJdGVtLFxuICAgIGxpc3RCeVJlYWN0aW9ucyxcbiAgICB1cGRhdGVJbWFnZUFkYXB0ZXIsXG4gICAgdXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9uc1xuICB9O1xufTtcblxuIl0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBUSxlQUFBQSxNQUFrQixlQUUxQixPQUFRLHNCQUFBQyxNQUF5QiwyQ0FDakMsT0FBUSxVQUFBQyxNQUFhLGVBQ3JCLE9BQVEsbUJBQUFDLE1BQXNCLDBCQUM5QixPQUFRLGVBQUFDLEVBQWEsWUFBQUMsRUFBVSxl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LEdBQ2JiLEVBQXVCLENBQUMsSUFDQyxDQUN6QixHQUFJLENBQ0YsTUFBTUMsRUFBaUIsQ0FDckIsS0FBTSxDQUNKLEtBQU0sTUFDTixNQUFPVyxDQUNULEVBQ0EsVUFBVyxDQUNULEtBQU0saUJBQ04sTUFBT0csQ0FDVCxFQUNBLEdBQUksQ0FDRixLQUFNLE1BQ04sTUFBT0YsQ0FDVCxDQUNGLEVBRU1YLEVBQVksQ0FBQ0MsRUFBdUIsQ0FBQyxJQUFNLENBQy9DLEtBQU0sQ0FBQyxrQkFBQWEsRUFBb0IsQ0FBQyxDQUFDLEVBQUliLEVBQ2pDLE9BQU9yQixFQUFLLFNBQVMsQ0FDbkIsS0FBTWtDLEVBQ04sS0FBTWpELEVBQWdCLGdCQUN4QixDQUFDLENBQ0gsRUFFTSxDQUFDLGtCQUFBaUQsQ0FBaUIsRUFBSSxNQUFNL0MsRUFDaENhLEVBQ0Esb0JBQ0FWLEVBQ0E2QixFQUNBLENBQ0UsUUFDQSxjQUNBLFNBQ0EsVUFDQSxXQUNBLFlBQ0EsV0FDQSxRQUNBLEdBQUdELENBQ0wsRUFDQSxDQUFDLFVBQUFFLENBQVMsQ0FDWixFQUNBLE9BQU9jLENBQ1QsT0FBUWxCLEVBQU8sQ0FDYixNQUFBaEIsRUFBSyxTQUFTLENBQUMsTUFBQWdCLEVBQU8sS0FBTS9CLEVBQWdCLGNBQWMsQ0FBQyxFQUNyRCtCLENBQ1IsQ0FDRixFQVdFLG1CQUFBWixFQUNBLDBCQUFBRSxDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsicGFyc2VTdHJpbmciLCAidmFsaWRhdGVJbWFnZUlucHV0IiwgIkNvbmZpZyIsICJJTUFHRV9DT05TVEFOVFMiLCAiYXBwTXV0YXRpb24iLCAiYXBwUXVlcnkiLCAidXBsb2FkSW1hZ2UiLCAiY29udmVydEZpbGVUb0Jhc2U2NCIsICJEQVRBX1RZUEUiLCAiZGVmYXVsdEltYWdlVmFsaWRhdG9yIiwgImlucHV0IiwgIm9wdGlvbnMiLCAiY3JlYXRlSW1hZ2VWYWxpZGF0b3IiLCAiY3VzdG9tQWRhcHRlciIsICJ2YWxpZGF0b3JPcHRpb25zIiwgIm1lcmdlZE9wdGlvbnMiLCAidmFsaWRhdGVkIiwgImNyZWF0ZUltYWdlQWN0aW9ucyIsICJmbHV4IiwgImltYWdlQWRhcHRlck9wdGlvbnMiLCAiY3VzdG9tSW1hZ2VBZGFwdGVyIiwgInZhbGlkYXRlSW1hZ2UiLCAidXBkYXRlSW1hZ2VBZGFwdGVyIiwgImFkYXB0ZXIiLCAidXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9ucyIsICJhZGQiLCAiaW1hZ2UiLCAidHlwZSIsICJ2YWxpZGF0ZWRJbWFnZSIsICJiYXNlNjQiLCAiZGVzY3JpcHRpb24iLCAiaXRlbUlkIiwgImZvcm1hdEltYWdlIiwgIm5ld0ltYWdlIiwgImVycm9yIiwgImltYWdlSWQiLCAiaW1hZ2VQcm9wcyIsICJxdWVyeVZhcmlhYmxlcyIsICJvblN1Y2Nlc3MiLCAiZGF0YSIsICJkZWxldGVJbWFnZSIsICJpbWFnZUZpbGVzIiwgIml0ZW1UeXBlIiwgInNhdmVkSW1hZ2VzIiwgImZpbGUiLCAiZmlsZVR5cGUiLCAiY291bnQiLCAiaW1hZ2VDb3VudCIsICJmcm9tIiwgInRvIiwgImltYWdlc0J5SXRlbSIsICJyZWFjdGlvbnMiLCAiaW1hZ2VzQnlSZWFjdGlvbnMiXQp9Cg==
1
+ /**
2
+ * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { parseString } from '@nlabs/utils';
5
+ import { validateImageInput } from '../../adapters/imageAdapter/imageAdapter.js';
6
+ import { getConfigFromFlux } from '../../utils/configUtils.js';
7
+ import { IMAGE_CONSTANTS } from '../../stores/imageStore.js';
8
+ import { appMutation, appQuery, uploadImage } from '../../utils/api.js';
9
+ import { convertFileToUploadFile } from '../../utils/file.js';
10
+ import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
11
+ const DATA_TYPE = 'images';
12
+ const getImageUploadConfig = (flux)=>{
13
+ const config = getConfigFromFlux(flux);
14
+ const configuredMaxImageSize = Number(config?.app?.images?.maxImageSize || config?.maxImageSize || 1200);
15
+ const configuredMaxImageUploadBytes = Number(config?.app?.images?.maxImageUploadBytes || config?.maxImageUploadBytes || 900 * 1024);
16
+ return {
17
+ maxImageSize: Number.isFinite(configuredMaxImageSize) && configuredMaxImageSize > 0 ? configuredMaxImageSize : 1200,
18
+ maxImageUploadBytes: Number.isFinite(configuredMaxImageUploadBytes) && configuredMaxImageUploadBytes > 0 ? configuredMaxImageUploadBytes : 900 * 1024
19
+ };
20
+ };
21
+ // Default validation function
22
+ const defaultImageValidator = (input, options)=>validateImageInput(input);
23
+ // Enhanced validation function that merges custom logic with defaults
24
+ const createImageValidator = (customAdapter, options)=>(input, validatorOptions)=>{
25
+ const mergedOptions = {
26
+ ...options,
27
+ ...validatorOptions
28
+ };
29
+ // Start with default validation
30
+ let validated = defaultImageValidator(input, mergedOptions);
31
+ // Apply custom validation if provided
32
+ if (customAdapter) {
33
+ validated = customAdapter(validated, mergedOptions);
34
+ }
35
+ // Apply custom validation from options if provided
36
+ if (mergedOptions?.customValidation) {
37
+ validated = mergedOptions.customValidation(validated);
38
+ }
39
+ return validated;
40
+ };
41
+ /**
42
+ * Factory function to create ImageActions with enhanced adapter injection capabilities.
43
+ * Custom adapters are merged with default behavior, allowing partial overrides.
44
+ *
45
+ * @example
46
+ * // Basic usage with default adapters
47
+ * const imageActions = createImageActions(flux);
48
+ *
49
+ * @example
50
+ * // Custom adapter that extends default behavior
51
+ * const customImageAdapter = (input: unknown, options?: ImageAdapterOptions) => {
52
+ * // input is already validated by default adapter
53
+ * if (input.fileSize && input.fileSize > 5000000) {
54
+ * throw new Error('Image file too large');
55
+ * }
56
+ * return input;
57
+ * };
58
+ *
59
+ * const imageActions = createImageActions(flux, {
60
+ * imageAdapter: customImageAdapter
61
+ * });
62
+ */ export const createImageActions = (flux, options)=>{
63
+ // Initialize adapter state
64
+ let imageAdapterOptions = options?.imageAdapterOptions || {};
65
+ let customImageAdapter = options?.imageAdapter;
66
+ // Create validators that merge custom adapters with defaults
67
+ let validateImage = createImageValidator(customImageAdapter, imageAdapterOptions);
68
+ // Update functions that recreate validators
69
+ const updateImageAdapter = (adapter)=>{
70
+ customImageAdapter = adapter;
71
+ validateImage = createImageValidator(customImageAdapter, imageAdapterOptions);
72
+ };
73
+ const updateImageAdapterOptions = (options)=>{
74
+ imageAdapterOptions = {
75
+ ...imageAdapterOptions,
76
+ ...options
77
+ };
78
+ validateImage = createImageValidator(customImageAdapter, imageAdapterOptions);
79
+ };
80
+ // Action implementations
81
+ const add = async (image, type = 'image', requestOptions = {})=>{
82
+ try {
83
+ const validatedImage = validateImage(image, imageAdapterOptions);
84
+ const { base64, description, file, fileType, itemId, name, privacy } = validatedImage;
85
+ const parsedDescription = description ? parseString(description, 500) : undefined;
86
+ const parsedItemId = String(itemId || '');
87
+ let uploadPayload;
88
+ if (typeof FormData !== 'undefined' && file instanceof File) {
89
+ const { maxImageSize, maxImageUploadBytes } = getImageUploadConfig(flux);
90
+ const uploadFile = await convertFileToUploadFile(file, maxImageSize, maxImageUploadBytes);
91
+ uploadPayload = new FormData();
92
+ uploadPayload.set('file', uploadFile);
93
+ uploadPayload.set('itemType', type);
94
+ if (parsedDescription) {
95
+ uploadPayload.set('description', parsedDescription);
96
+ }
97
+ if (parsedItemId) {
98
+ uploadPayload.set('itemId', parsedItemId);
99
+ }
100
+ if (uploadFile.type || fileType) {
101
+ uploadPayload.set('fileType', uploadFile.type || fileType);
102
+ }
103
+ if (name) {
104
+ uploadPayload.set('name', name);
105
+ }
106
+ if (privacy) {
107
+ uploadPayload.set('privacy', privacy);
108
+ }
109
+ } else {
110
+ uploadPayload = {
111
+ base64,
112
+ description: parsedDescription,
113
+ fileType: fileType || 'image/jpeg',
114
+ itemId,
115
+ itemType: type,
116
+ ...name ? {
117
+ name
118
+ } : {},
119
+ ...privacy ? {
120
+ privacy
121
+ } : {}
122
+ };
123
+ }
124
+ const { image: newImage } = await uploadImage(flux, uploadPayload);
125
+ await flux.dispatch({
126
+ image: newImage,
127
+ type: IMAGE_CONSTANTS.ADD_ITEM_SUCCESS
128
+ });
129
+ return newImage;
130
+ } catch (error) {
131
+ flux.dispatch({
132
+ error,
133
+ type: IMAGE_CONSTANTS.ADD_ITEM_ERROR
134
+ });
135
+ throw error;
136
+ } finally{
137
+ await clearCachedRequest(flux, `image.countByItem:${String(image?.itemId || '')}`);
138
+ await clearCachedRequest(flux, `image.listByItem:${String(image?.itemId || '')}`);
139
+ await clearCachedRequest(flux, 'image.listByPersonaReactions');
140
+ await clearCachedRequest(flux, 'image.listByReactions');
141
+ }
142
+ };
143
+ const deleteImage = async (imageId, imageProps = [], requestOptions = {})=>{
144
+ try {
145
+ const queryVariables = {
146
+ imageId: {
147
+ type: 'ID!',
148
+ value: imageId
149
+ }
150
+ };
151
+ const onSuccess = async (data = {})=>{
152
+ const deleteImage = data?.images?.deleteImage || {};
153
+ await flux.dispatch({
154
+ image: deleteImage,
155
+ type: IMAGE_CONSTANTS.REMOVE_ITEM_SUCCESS
156
+ });
157
+ return deleteImage;
158
+ };
159
+ return await appMutation(flux, 'deleteImage', DATA_TYPE, queryVariables, [
160
+ 'id',
161
+ ...imageProps
162
+ ], {
163
+ onSuccess
164
+ });
165
+ } catch (error) {
166
+ flux.dispatch({
167
+ error,
168
+ type: IMAGE_CONSTANTS.REMOVE_ITEM_ERROR
169
+ });
170
+ throw error;
171
+ } finally{
172
+ await clearCachedRequest(flux, `image.getImageById:${imageId}`);
173
+ await clearCachedRequest(flux, 'image.listByPersonaReactions');
174
+ await clearCachedRequest(flux, 'image.listByReactions');
175
+ }
176
+ };
177
+ const update = async (image, type = 'image', requestOptions = {})=>{
178
+ try {
179
+ const validatedImage = validateImage(image, imageAdapterOptions);
180
+ const { base64, description, imageId, itemId, privacy, url } = validatedImage;
181
+ if (imageId && !base64 && !url) {
182
+ const queryVariables = {
183
+ image: {
184
+ type: 'ImagesInput!',
185
+ value: {
186
+ imageId,
187
+ ...description ? {
188
+ description: parseString(description, 500)
189
+ } : {},
190
+ ...privacy ? {
191
+ privacy
192
+ } : {}
193
+ }
194
+ }
195
+ };
196
+ const onSuccess = async (data = {})=>{
197
+ const updateImage = data?.images?.updateImage || {};
198
+ await flux.dispatch({
199
+ image: updateImage,
200
+ type: IMAGE_CONSTANTS.UPDATE_ITEM_SUCCESS
201
+ });
202
+ return updateImage;
203
+ };
204
+ return await appMutation(flux, 'updateImage', DATA_TYPE, queryVariables, [
205
+ 'imageId',
206
+ 'privacy',
207
+ 'description',
208
+ 'thumbUrl',
209
+ 'imageUrl'
210
+ ], {
211
+ onSuccess
212
+ });
213
+ }
214
+ const formatImage = {
215
+ base64,
216
+ description: description ? parseString(description, 500) : undefined,
217
+ fileType: 'image/jpeg',
218
+ itemId,
219
+ itemType: type,
220
+ ...imageId ? {
221
+ imageId
222
+ } : {},
223
+ ...privacy ? {
224
+ privacy
225
+ } : {}
226
+ };
227
+ const { image: newImage } = await uploadImage(flux, formatImage);
228
+ await flux.dispatch({
229
+ image: newImage,
230
+ type: IMAGE_CONSTANTS.ADD_ITEM_SUCCESS
231
+ });
232
+ return newImage;
233
+ } catch (error) {
234
+ flux.dispatch({
235
+ error,
236
+ type: IMAGE_CONSTANTS.ADD_ITEM_ERROR
237
+ });
238
+ throw error;
239
+ } finally{
240
+ await clearCachedRequest(flux, `image.getImageById:${String(image?.imageId || '')}`);
241
+ await clearCachedRequest(flux, `image.countByItem:${String(image?.itemId || '')}`);
242
+ await clearCachedRequest(flux, `image.listByItem:${String(image?.itemId || '')}`);
243
+ await clearCachedRequest(flux, 'image.listByPersonaReactions');
244
+ await clearCachedRequest(flux, 'image.listByReactions');
245
+ }
246
+ };
247
+ const upload = async (imageFiles, itemId, itemType = 'users', requestOptions = {})=>{
248
+ try {
249
+ const savedImages = await Promise.all(imageFiles.map(async (file)=>{
250
+ const { type: fileType } = file;
251
+ return add({
252
+ file,
253
+ fileType,
254
+ itemId,
255
+ name: file.name
256
+ }, itemType, requestOptions);
257
+ }));
258
+ await flux.dispatch({
259
+ images: savedImages,
260
+ type: IMAGE_CONSTANTS.UPLOAD_ITEM_SUCCESS
261
+ });
262
+ return savedImages;
263
+ } catch (error) {
264
+ flux.dispatch({
265
+ error,
266
+ type: IMAGE_CONSTANTS.UPLOAD_ITEM_ERROR
267
+ });
268
+ throw error;
269
+ } finally{
270
+ await clearCachedRequest(flux, `image.countByItem:${itemId}`);
271
+ await clearCachedRequest(flux, `image.listByItem:${itemId}`);
272
+ await clearCachedRequest(flux, 'image.listByPersonaReactions');
273
+ await clearCachedRequest(flux, 'image.listByReactions');
274
+ }
275
+ };
276
+ const countByItem = async (itemId, requestOptions = {})=>{
277
+ try {
278
+ const cachedResult = getCachedRequest(flux, `image.countByItem:${itemId}`, {
279
+ itemId
280
+ }, requestOptions);
281
+ if (cachedResult !== undefined) {
282
+ return cachedResult;
283
+ }
284
+ const queryVariables = {
285
+ itemId: {
286
+ type: 'ID!',
287
+ value: itemId
288
+ }
289
+ };
290
+ const onSuccess = (data = {})=>{
291
+ const count = data?.imageCount ?? 0;
292
+ return flux.dispatch({
293
+ itemId,
294
+ count,
295
+ type: IMAGE_CONSTANTS.GET_COUNT_SUCCESS
296
+ });
297
+ };
298
+ const result = await appQuery(flux, 'imageCount', DATA_TYPE, queryVariables, [
299
+ 'count'
300
+ ], {
301
+ onSuccess
302
+ });
303
+ return await setCachedRequest(flux, `image.countByItem:${itemId}`, {
304
+ itemId
305
+ }, result, requestOptions);
306
+ } catch (error) {
307
+ flux.dispatch({
308
+ error,
309
+ type: IMAGE_CONSTANTS.GET_COUNT_ERROR
310
+ });
311
+ throw error;
312
+ }
313
+ };
314
+ const getImageById = async (imageId, imageProps = [], requestOptions = {})=>{
315
+ try {
316
+ const cachedResult = getCachedRequest(flux, `image.getImageById:${imageId}`, {
317
+ imageId,
318
+ imageProps
319
+ }, requestOptions);
320
+ if (cachedResult !== undefined) {
321
+ return cachedResult;
322
+ }
323
+ const queryVariables = {
324
+ imageId: {
325
+ type: 'ID!',
326
+ value: imageId
327
+ }
328
+ };
329
+ const onSuccess = async (data = {})=>{
330
+ const imagesData = data?.images || {};
331
+ const image = imagesData?.getImageById || {};
332
+ await flux.dispatch({
333
+ image,
334
+ type: IMAGE_CONSTANTS.GET_ITEM_SUCCESS
335
+ });
336
+ return image;
337
+ };
338
+ const result = await appQuery(flux, 'getImageById', DATA_TYPE, queryVariables, [
339
+ 'color',
340
+ 'description',
341
+ 'height',
342
+ 'imageId',
343
+ 'imageUrl',
344
+ 'itemId',
345
+ 'likeCount',
346
+ 'privacy',
347
+ 'thumbUrl',
348
+ 'width',
349
+ ...imageProps
350
+ ], {
351
+ onSuccess
352
+ });
353
+ return await setCachedRequest(flux, `image.getImageById:${imageId}`, {
354
+ imageId,
355
+ imageProps
356
+ }, result, requestOptions);
357
+ } catch (error) {
358
+ flux.dispatch({
359
+ error,
360
+ type: IMAGE_CONSTANTS.GET_ITEM_ERROR
361
+ });
362
+ throw error;
363
+ }
364
+ };
365
+ const listByItem = async (itemId, itemType = 'users', from = 0, to = 10, imageProps = [], requestOptions = {})=>{
366
+ try {
367
+ const cachedResult = getCachedRequest(flux, `image.listByItem:${itemId}`, {
368
+ from,
369
+ imageProps,
370
+ itemId,
371
+ itemType,
372
+ to
373
+ }, requestOptions);
374
+ if (cachedResult) {
375
+ return cachedResult;
376
+ }
377
+ const queryVariables = {
378
+ from: {
379
+ type: 'Int',
380
+ value: from
381
+ },
382
+ itemId: {
383
+ type: 'ID!',
384
+ value: itemId
385
+ },
386
+ itemType: {
387
+ type: 'String',
388
+ value: itemType
389
+ },
390
+ to: {
391
+ type: 'Int',
392
+ value: to
393
+ }
394
+ };
395
+ const onSuccess = async (data = {})=>{
396
+ const imagesData = data?.images || {};
397
+ const imagesByItem = Array.isArray(imagesData?.getImageListByItem) ? imagesData.getImageListByItem || [] : [];
398
+ await flux.dispatch({
399
+ itemId,
400
+ list: imagesByItem,
401
+ type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
402
+ });
403
+ return imagesByItem;
404
+ };
405
+ const result = await appQuery(flux, 'getImageListByItem', DATA_TYPE, queryVariables, [
406
+ 'color',
407
+ 'description',
408
+ 'height',
409
+ 'imageId',
410
+ 'imageUrl',
411
+ 'likeCount',
412
+ 'privacy',
413
+ 'thumbUrl',
414
+ 'width',
415
+ ...imageProps
416
+ ], {
417
+ onSuccess
418
+ });
419
+ return await setCachedRequest(flux, `image.listByItem:${itemId}`, {
420
+ from,
421
+ imageProps,
422
+ itemId,
423
+ itemType,
424
+ to
425
+ }, result, requestOptions);
426
+ } catch (error) {
427
+ flux.dispatch({
428
+ error,
429
+ type: IMAGE_CONSTANTS.GET_LIST_ERROR
430
+ });
431
+ throw error;
432
+ }
433
+ };
434
+ const listByReactions = async (reactions, from = 0, to = 10, imageProps = [], requestOptions = {})=>{
435
+ try {
436
+ const cachedResult = getCachedRequest(flux, 'image.listByReactions', {
437
+ from,
438
+ imageProps,
439
+ reactions,
440
+ to
441
+ }, requestOptions);
442
+ if (cachedResult) {
443
+ return cachedResult;
444
+ }
445
+ const queryVariables = {
446
+ from: {
447
+ type: 'Int',
448
+ value: from
449
+ },
450
+ reactions: {
451
+ type: '[String!]',
452
+ value: reactions
453
+ },
454
+ to: {
455
+ type: 'Int',
456
+ value: to
457
+ }
458
+ };
459
+ const onSuccess = (data = {})=>{
460
+ const imagesData = data?.images || {};
461
+ const imagesByReactions = Array.isArray(imagesData?.imagesByReactions) ? imagesData.imagesByReactions || [] : [];
462
+ return flux.dispatch({
463
+ list: imagesByReactions,
464
+ type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
465
+ });
466
+ };
467
+ const result = await appQuery(flux, 'imagesByReactions', DATA_TYPE, queryVariables, [
468
+ 'color',
469
+ 'description',
470
+ 'height',
471
+ 'imageId',
472
+ 'imageUrl',
473
+ 'likeCount',
474
+ 'privacy',
475
+ 'thumbUrl',
476
+ 'width',
477
+ ...imageProps
478
+ ], {
479
+ onSuccess
480
+ });
481
+ return await setCachedRequest(flux, 'image.listByReactions', {
482
+ from,
483
+ imageProps,
484
+ reactions,
485
+ to
486
+ }, result, requestOptions);
487
+ } catch (error) {
488
+ flux.dispatch({
489
+ error,
490
+ type: IMAGE_CONSTANTS.GET_LIST_ERROR
491
+ });
492
+ throw error;
493
+ }
494
+ };
495
+ const listByPersonaReactions = async (personaId, reactions, from = 0, to = 30, imageProps = [], listKey = `persona:${personaId}:savedPhotos`, requestOptions = {})=>{
496
+ try {
497
+ const cachedResult = getCachedRequest(flux, 'image.listByPersonaReactions', {
498
+ from,
499
+ imageProps,
500
+ listKey,
501
+ personaId,
502
+ reactions,
503
+ to
504
+ }, requestOptions);
505
+ if (cachedResult !== undefined) {
506
+ await flux.dispatch({
507
+ itemId: listKey,
508
+ list: cachedResult,
509
+ personaId,
510
+ reactions,
511
+ type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
512
+ });
513
+ return cachedResult;
514
+ }
515
+ const queryVariables = {
516
+ from: {
517
+ type: 'Int',
518
+ value: from
519
+ },
520
+ personaId: {
521
+ type: 'ID',
522
+ value: personaId
523
+ },
524
+ reactions: {
525
+ type: '[String!]',
526
+ value: reactions
527
+ },
528
+ to: {
529
+ type: 'Int',
530
+ value: to
531
+ }
532
+ };
533
+ const onSuccess = async (data = {})=>{
534
+ const imagesData = data?.images || {};
535
+ const imagesByPersonaReactions = Array.isArray(imagesData?.imagesByPersonaReactions) ? imagesData.imagesByPersonaReactions || [] : [];
536
+ await flux.dispatch({
537
+ itemId: listKey,
538
+ list: imagesByPersonaReactions,
539
+ personaId,
540
+ reactions,
541
+ type: IMAGE_CONSTANTS.GET_LIST_SUCCESS
542
+ });
543
+ return imagesByPersonaReactions;
544
+ };
545
+ const result = await appQuery(flux, 'imagesByPersonaReactions', DATA_TYPE, queryVariables, [
546
+ 'color',
547
+ 'description',
548
+ 'height',
549
+ 'imageId',
550
+ 'imageUrl',
551
+ 'likeCount',
552
+ 'privacy',
553
+ 'thumbUrl',
554
+ 'width',
555
+ ...imageProps
556
+ ], {
557
+ onSuccess
558
+ });
559
+ return await setCachedRequest(flux, 'image.listByPersonaReactions', {
560
+ from,
561
+ imageProps,
562
+ listKey,
563
+ personaId,
564
+ reactions,
565
+ to
566
+ }, result, requestOptions);
567
+ } catch (error) {
568
+ flux.dispatch({
569
+ error,
570
+ itemId: listKey,
571
+ personaId,
572
+ reactions,
573
+ type: IMAGE_CONSTANTS.GET_LIST_ERROR
574
+ });
575
+ throw error;
576
+ }
577
+ };
578
+ return {
579
+ add,
580
+ delete: deleteImage,
581
+ getImageById,
582
+ update,
583
+ upload,
584
+ countByItem,
585
+ listByItem,
586
+ listByPersonaReactions,
587
+ listByReactions,
588
+ updateImageAdapter,
589
+ updateImageAdapterOptions
590
+ };
591
+ };
592
+
593
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9pbWFnZUFjdGlvbnMvaW1hZ2VBY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgeyBwYXJzZVN0cmluZyB9IGZyb20gJ0BubGFicy91dGlscyc7XG5cbmltcG9ydCB7IHZhbGlkYXRlSW1hZ2VJbnB1dCB9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL2ltYWdlQWRhcHRlci9pbWFnZUFkYXB0ZXIuanMnO1xuaW1wb3J0IHsgZ2V0Q29uZmlnRnJvbUZsdXggfSBmcm9tICcuLi8uLi91dGlscy9jb25maWdVdGlscy5qcyc7XG5pbXBvcnQgeyBJTUFHRV9DT05TVEFOVFMgfSBmcm9tICcuLi8uLi9zdG9yZXMvaW1hZ2VTdG9yZS5qcyc7XG5pbXBvcnQgeyBhcHBNdXRhdGlvbiwgYXBwUXVlcnksIHVwbG9hZEltYWdlIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7IGNvbnZlcnRGaWxlVG9VcGxvYWRGaWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQgeyBjbGVhckNhY2hlZFJlcXVlc3QsIGdldENhY2hlZFJlcXVlc3QsIHNldENhY2hlZFJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEZsdXhBY3Rpb24sIEZsdXhGcmFtZXdvcmsgfSBmcm9tICdAbmxhYnMvYXJraGFtanMnO1xuaW1wb3J0IHR5cGUgeyBJbWFnZVR5cGUgfSBmcm9tICcuLi8uLi9hZGFwdGVycy9pbWFnZUFkYXB0ZXIvaW1hZ2VBZGFwdGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQXBpUmVzdWx0c1R5cGUgfSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3Rpb25SZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmNvbnN0IERBVEFfVFlQRSA9ICdpbWFnZXMnO1xuXG5jb25zdCBnZXRJbWFnZVVwbG9hZENvbmZpZyA9IChmbHV4OiBGbHV4RnJhbWV3b3JrKToge21heEltYWdlU2l6ZTogbnVtYmVyOyBtYXhJbWFnZVVwbG9hZEJ5dGVzOiBudW1iZXJ9ID0+IHtcbiAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRnJvbUZsdXgoZmx1eCk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRNYXhJbWFnZVNpemUgPSBOdW1iZXIoXG4gICAgKGNvbmZpZyBhcyBhbnkpPy5hcHA/LmltYWdlcz8ubWF4SW1hZ2VTaXplXG4gICAgfHwgKGNvbmZpZyBhcyBhbnkpPy5tYXhJbWFnZVNpemVcbiAgICB8fCAxMjAwXG4gICk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRNYXhJbWFnZVVwbG9hZEJ5dGVzID0gTnVtYmVyKFxuICAgIChjb25maWcgYXMgYW55KT8uYXBwPy5pbWFnZXM/Lm1heEltYWdlVXBsb2FkQnl0ZXNcbiAgICB8fCAoY29uZmlnIGFzIGFueSk/Lm1heEltYWdlVXBsb2FkQnl0ZXNcbiAgICB8fCA5MDAgKiAxMDI0XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYXhJbWFnZVNpemU6IE51bWJlci5pc0Zpbml0ZShjb25maWd1cmVkTWF4SW1hZ2VTaXplKSAmJiBjb25maWd1cmVkTWF4SW1hZ2VTaXplID4gMFxuICAgICAgPyBjb25maWd1cmVkTWF4SW1hZ2VTaXplXG4gICAgICA6IDEyMDAsXG4gICAgbWF4SW1hZ2VVcGxvYWRCeXRlczogTnVtYmVyLmlzRmluaXRlKGNvbmZpZ3VyZWRNYXhJbWFnZVVwbG9hZEJ5dGVzKSAmJiBjb25maWd1cmVkTWF4SW1hZ2VVcGxvYWRCeXRlcyA+IDBcbiAgICAgID8gY29uZmlndXJlZE1heEltYWdlVXBsb2FkQnl0ZXNcbiAgICAgIDogOTAwICogMTAyNFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUFkYXB0ZXJPcHRpb25zIHtcbiAgc3RyaWN0PzogYm9vbGVhbjtcbiAgYWxsb3dQYXJ0aWFsPzogYm9vbGVhbjtcbiAgZW52aXJvbm1lbnQ/OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nIHwgJ3Rlc3QnO1xuICBjdXN0b21WYWxpZGF0aW9uPzogKGlucHV0OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlQWN0aW9uc09wdGlvbnMge1xuICBpbWFnZUFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zKSA9PiBhbnk7XG4gIGltYWdlQWRhcHRlck9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgdHlwZSBJbWFnZUFwaVJlc3VsdHNUeXBlID0ge1xuICBhZGRJbWFnZTogSW1hZ2VUeXBlO1xuICBkZWxldGVJbWFnZTogSW1hZ2VUeXBlO1xuICBpbWFnZTogSW1hZ2VUeXBlO1xuICBnZXRJbWFnZUJ5SWQ6IEltYWdlVHlwZTtcbiAgZ2V0SW1hZ2VMaXN0QnlJdGVtOiBJbWFnZVR5cGVbXTtcbiAgaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zOiBJbWFnZVR5cGVbXTtcbiAgZ2V0SW1hZ2VMaXN0QnlSZWFjdGlvbnM6IEltYWdlVHlwZVtdO1xuICB1cGRhdGVJbWFnZTogSW1hZ2VUeXBlO1xuICB1cGxvYWRGaWxlSW1hZ2VzOiBJbWFnZVR5cGVbXTtcbiAgZ2V0SW1hZ2VDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUFjdGlvbnMge1xuICBhZGQ6IChpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LCB0eXBlPzogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIGRlbGV0ZTogKGltYWdlSWQ6IHN0cmluZywgaW1hZ2VQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIGdldEltYWdlQnlJZDogKGltYWdlSWQ6IHN0cmluZywgaW1hZ2VQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZT47XG4gIHVwZGF0ZTogKGltYWdlOiBQYXJ0aWFsPEltYWdlVHlwZT4sIHR5cGU/OiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlPjtcbiAgdXBsb2FkOiAoaW1hZ2VGaWxlczogRmlsZVtdLCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU/OiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBjb3VudEJ5SXRlbTogKGl0ZW1JZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPG51bWJlcj47XG4gIGxpc3RCeUl0ZW06IChpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU/OiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBpbWFnZVByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBsaXN0QnlQZXJzb25hUmVhY3Rpb25zOiAocGVyc29uYUlkOiBzdHJpbmcsIHJlYWN0aW9uczogc3RyaW5nW10sIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBpbWFnZVByb3BzPzogc3RyaW5nW10sIGxpc3RLZXk/OiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8SW1hZ2VUeXBlW10+O1xuICBsaXN0QnlSZWFjdGlvbnM6IChyZWFjdGlvbnM6IHN0cmluZ1tdLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgaW1hZ2VQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPEltYWdlVHlwZVtdPjtcbiAgdXBkYXRlSW1hZ2VBZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVJbWFnZUFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLy8gRGVmYXVsdCB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5jb25zdCBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBJbWFnZUFkYXB0ZXJPcHRpb25zKSA9PiB2YWxpZGF0ZUltYWdlSW5wdXQoaW5wdXQpO1xuXG4vLyBFbmhhbmNlZCB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoYXQgbWVyZ2VzIGN1c3RvbSBsb2dpYyB3aXRoIGRlZmF1bHRzXG5jb25zdCBjcmVhdGVJbWFnZVZhbGlkYXRvciA9IChcbiAgY3VzdG9tQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSxcbiAgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnNcbikgPT4gKGlucHV0OiB1bmtub3duLCB2YWxpZGF0b3JPcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0gey4uLm9wdGlvbnMsIC4uLnZhbGlkYXRvck9wdGlvbnN9O1xuXG4gIC8vIFN0YXJ0IHdpdGggZGVmYXVsdCB2YWxpZGF0aW9uXG4gIGxldCB2YWxpZGF0ZWQgPSBkZWZhdWx0SW1hZ2VWYWxpZGF0b3IoaW5wdXQsIG1lcmdlZE9wdGlvbnMpO1xuXG4gIC8vIEFwcGx5IGN1c3RvbSB2YWxpZGF0aW9uIGlmIHByb3ZpZGVkXG4gIGlmKGN1c3RvbUFkYXB0ZXIpIHtcbiAgICB2YWxpZGF0ZWQgPSBjdXN0b21BZGFwdGVyKHZhbGlkYXRlZCwgbWVyZ2VkT3B0aW9ucyk7XG4gIH1cblxuICAvLyBBcHBseSBjdXN0b20gdmFsaWRhdGlvbiBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWRcbiAgaWYobWVyZ2VkT3B0aW9ucz8uY3VzdG9tVmFsaWRhdGlvbikge1xuICAgIHZhbGlkYXRlZCA9IG1lcmdlZE9wdGlvbnMuY3VzdG9tVmFsaWRhdGlvbih2YWxpZGF0ZWQpIGFzIEltYWdlVHlwZTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWQ7XG59O1xuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIEltYWdlQWN0aW9ucyB3aXRoIGVuaGFuY2VkIGFkYXB0ZXIgaW5qZWN0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEN1c3RvbSBhZGFwdGVycyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBiZWhhdmlvciwgYWxsb3dpbmcgcGFydGlhbCBvdmVycmlkZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCBhZGFwdGVyc1xuICogY29uc3QgaW1hZ2VBY3Rpb25zID0gY3JlYXRlSW1hZ2VBY3Rpb25zKGZsdXgpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gYWRhcHRlciB0aGF0IGV4dGVuZHMgZGVmYXVsdCBiZWhhdmlvclxuICogY29uc3QgY3VzdG9tSW1hZ2VBZGFwdGVyID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogSW1hZ2VBZGFwdGVyT3B0aW9ucykgPT4ge1xuICogICAvLyBpbnB1dCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBieSBkZWZhdWx0IGFkYXB0ZXJcbiAqICAgaWYgKGlucHV0LmZpbGVTaXplICYmIGlucHV0LmZpbGVTaXplID4gNTAwMDAwMCkge1xuICogICAgIHRocm93IG5ldyBFcnJvcignSW1hZ2UgZmlsZSB0b28gbGFyZ2UnKTtcbiAqICAgfVxuICogICByZXR1cm4gaW5wdXQ7XG4gKiB9O1xuICpcbiAqIGNvbnN0IGltYWdlQWN0aW9ucyA9IGNyZWF0ZUltYWdlQWN0aW9ucyhmbHV4LCB7XG4gKiAgIGltYWdlQWRhcHRlcjogY3VzdG9tSW1hZ2VBZGFwdGVyXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUltYWdlQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IEltYWdlQWN0aW9uc09wdGlvbnNcbik6IEltYWdlQWN0aW9ucyA9PiB7XG4gIC8vIEluaXRpYWxpemUgYWRhcHRlciBzdGF0ZVxuICBsZXQgaW1hZ2VBZGFwdGVyT3B0aW9ucyA9IG9wdGlvbnM/LmltYWdlQWRhcHRlck9wdGlvbnMgfHwge307XG4gIGxldCBjdXN0b21JbWFnZUFkYXB0ZXIgPSBvcHRpb25zPy5pbWFnZUFkYXB0ZXI7XG5cbiAgLy8gQ3JlYXRlIHZhbGlkYXRvcnMgdGhhdCBtZXJnZSBjdXN0b20gYWRhcHRlcnMgd2l0aCBkZWZhdWx0c1xuICBsZXQgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG5cbiAgLy8gVXBkYXRlIGZ1bmN0aW9ucyB0aGF0IHJlY3JlYXRlIHZhbGlkYXRvcnNcbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyID0gKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEltYWdlQWRhcHRlck9wdGlvbnMpID0+IGFueSk6IHZvaWQgPT4ge1xuICAgIGN1c3RvbUltYWdlQWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgdmFsaWRhdGVJbWFnZSA9IGNyZWF0ZUltYWdlVmFsaWRhdG9yKGN1c3RvbUltYWdlQWRhcHRlciwgaW1hZ2VBZGFwdGVyT3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlSW1hZ2VBZGFwdGVyT3B0aW9ucyA9IChvcHRpb25zOiBJbWFnZUFkYXB0ZXJPcHRpb25zKTogdm9pZCA9PiB7XG4gICAgaW1hZ2VBZGFwdGVyT3B0aW9ucyA9IHsuLi5pbWFnZUFkYXB0ZXJPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICB2YWxpZGF0ZUltYWdlID0gY3JlYXRlSW1hZ2VWYWxpZGF0b3IoY3VzdG9tSW1hZ2VBZGFwdGVyLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgfTtcblxuICAvLyBBY3Rpb24gaW1wbGVtZW50YXRpb25zXG4gIGNvbnN0IGFkZCA9IGFzeW5jIChcbiAgICBpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LFxuICAgIHR5cGU6IHN0cmluZyA9ICdpbWFnZScsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkSW1hZ2UgPSB2YWxpZGF0ZUltYWdlKGltYWdlLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IHtiYXNlNjQsIGRlc2NyaXB0aW9uLCBmaWxlLCBmaWxlVHlwZSwgaXRlbUlkLCBuYW1lLCBwcml2YWN5fSA9IHZhbGlkYXRlZEltYWdlO1xuICAgICAgY29uc3QgcGFyc2VkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/IHBhcnNlU3RyaW5nKGRlc2NyaXB0aW9uLCA1MDApIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcGFyc2VkSXRlbUlkID0gU3RyaW5nKGl0ZW1JZCB8fCAnJyk7XG4gICAgICBsZXQgdXBsb2FkUGF5bG9hZDogRm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgaWYodHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyAmJiBmaWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBjb25zdCB7bWF4SW1hZ2VTaXplLCBtYXhJbWFnZVVwbG9hZEJ5dGVzfSA9IGdldEltYWdlVXBsb2FkQ29uZmlnKGZsdXgpO1xuICAgICAgICBjb25zdCB1cGxvYWRGaWxlID0gYXdhaXQgY29udmVydEZpbGVUb1VwbG9hZEZpbGUoZmlsZSwgbWF4SW1hZ2VTaXplLCBtYXhJbWFnZVVwbG9hZEJ5dGVzKTtcbiAgICAgICAgdXBsb2FkUGF5bG9hZCA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB1cGxvYWRQYXlsb2FkLnNldCgnZmlsZScsIHVwbG9hZEZpbGUpO1xuICAgICAgICB1cGxvYWRQYXlsb2FkLnNldCgnaXRlbVR5cGUnLCB0eXBlKTtcblxuICAgICAgICBpZihwYXJzZWREZXNjcmlwdGlvbikge1xuICAgICAgICAgIHVwbG9hZFBheWxvYWQuc2V0KCdkZXNjcmlwdGlvbicsIHBhcnNlZERlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHBhcnNlZEl0ZW1JZCkge1xuICAgICAgICAgIHVwbG9hZFBheWxvYWQuc2V0KCdpdGVtSWQnLCBwYXJzZWRJdGVtSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodXBsb2FkRmlsZS50eXBlIHx8IGZpbGVUeXBlKSB7XG4gICAgICAgICAgdXBsb2FkUGF5bG9hZC5zZXQoJ2ZpbGVUeXBlJywgdXBsb2FkRmlsZS50eXBlIHx8IGZpbGVUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUpIHtcbiAgICAgICAgICB1cGxvYWRQYXlsb2FkLnNldCgnbmFtZScsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYocHJpdmFjeSkge1xuICAgICAgICAgIHVwbG9hZFBheWxvYWQuc2V0KCdwcml2YWN5JywgcHJpdmFjeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwbG9hZFBheWxvYWQgPSB7XG4gICAgICAgICAgYmFzZTY0LFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwYXJzZWREZXNjcmlwdGlvbixcbiAgICAgICAgICBmaWxlVHlwZTogZmlsZVR5cGUgfHwgJ2ltYWdlL2pwZWcnLFxuICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICBpdGVtVHlwZTogdHlwZSxcbiAgICAgICAgICAuLi4obmFtZSA/IHtuYW1lfSA6IHt9KSxcbiAgICAgICAgICAuLi4ocHJpdmFjeSA/IHtwcml2YWN5fSA6IHt9KVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7aW1hZ2U6IG5ld0ltYWdlfSA9IGF3YWl0IHVwbG9hZEltYWdlKGZsdXgsIHVwbG9hZFBheWxvYWQpO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7aW1hZ2U6IG5ld0ltYWdlLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTU30pO1xuICAgICAgcmV0dXJuIG5ld0ltYWdlIGFzIEltYWdlVHlwZTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkFERF9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGBpbWFnZS5jb3VudEJ5SXRlbToke1N0cmluZyhpbWFnZT8uaXRlbUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UubGlzdEJ5SXRlbToke1N0cmluZyhpbWFnZT8uaXRlbUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UGVyc29uYVJlYWN0aW9ucycpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICdpbWFnZS5saXN0QnlSZWFjdGlvbnMnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlSW1hZ2UgPSBhc3luYyAoXG4gICAgaW1hZ2VJZDogc3RyaW5nLFxuICAgIGltYWdlUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGltYWdlSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogaW1hZ2VJZFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBkZWxldGVJbWFnZSA9IChkYXRhIGFzIHtpbWFnZXM/OiB7ZGVsZXRlSW1hZ2U/OiBJbWFnZVR5cGV9fSk/LmltYWdlcz8uZGVsZXRlSW1hZ2UgfHwge307XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlOiBkZWxldGVJbWFnZSwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLlJFTU9WRV9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUltYWdlIGFzIHVua25vd24gYXMgRmx1eEFjdGlvbjtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxJbWFnZVR5cGU+KGZsdXgsICdkZWxldGVJbWFnZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFsnaWQnLCAuLi5pbWFnZVByb3BzXSwge29uU3VjY2Vzc30pO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuUkVNT1ZFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmdldEltYWdlQnlJZDoke2ltYWdlSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZSA9IGFzeW5jIChcbiAgICBpbWFnZTogUGFydGlhbDxJbWFnZVR5cGU+LFxuICAgIHR5cGU6IHN0cmluZyA9ICdpbWFnZScsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkSW1hZ2UgPSB2YWxpZGF0ZUltYWdlKGltYWdlLCBpbWFnZUFkYXB0ZXJPcHRpb25zKTtcbiAgICAgIGNvbnN0IHtiYXNlNjQsIGRlc2NyaXB0aW9uLCBpbWFnZUlkLCBpdGVtSWQsIHByaXZhY3ksIHVybH0gPSB2YWxpZGF0ZWRJbWFnZTtcblxuICAgICAgaWYoaW1hZ2VJZCAmJiAhYmFzZTY0ICYmICF1cmwpIHtcbiAgICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgICAgaW1hZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICdJbWFnZXNJbnB1dCEnLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgaW1hZ2VJZCxcbiAgICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8ge2Rlc2NyaXB0aW9uOiBwYXJzZVN0cmluZyhkZXNjcmlwdGlvbiwgNTAwKX0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcml2YWN5ID8ge3ByaXZhY3l9IDoge30pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlSW1hZ2UgPSAoZGF0YSBhcyB7aW1hZ2VzPzoge3VwZGF0ZUltYWdlPzogSW1hZ2VUeXBlfX0pPy5pbWFnZXM/LnVwZGF0ZUltYWdlIHx8IHt9O1xuICAgICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlOiB1cGRhdGVJbWFnZSwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlSW1hZ2UgYXMgdW5rbm93biBhcyBGbHV4QWN0aW9uO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxJbWFnZVR5cGU+KFxuICAgICAgICAgIGZsdXgsXG4gICAgICAgICAgJ3VwZGF0ZUltYWdlJyxcbiAgICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgICAgWydpbWFnZUlkJywgJ3ByaXZhY3knLCAnZGVzY3JpcHRpb24nLCAndGh1bWJVcmwnLCAnaW1hZ2VVcmwnXSxcbiAgICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRJbWFnZSA9IHtcbiAgICAgICAgYmFzZTY0LFxuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gPyBwYXJzZVN0cmluZyhkZXNjcmlwdGlvbiwgNTAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsZVR5cGU6ICdpbWFnZS9qcGVnJyxcbiAgICAgICAgaXRlbUlkLFxuICAgICAgICBpdGVtVHlwZTogdHlwZSxcbiAgICAgICAgLi4uKGltYWdlSWQgPyB7aW1hZ2VJZH0gOiB7fSksXG4gICAgICAgIC4uLihwcml2YWN5ID8ge3ByaXZhY3l9IDoge30pXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7aW1hZ2U6IG5ld0ltYWdlfSA9IGF3YWl0IHVwbG9hZEltYWdlKGZsdXgsIGZvcm1hdEltYWdlKTtcbiAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlOiBuZXdJbWFnZSwgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1N9KTtcbiAgICAgIHJldHVybiBuZXdJbWFnZSBhcyBJbWFnZVR5cGU7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5BRERfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UuZ2V0SW1hZ2VCeUlkOiR7U3RyaW5nKGltYWdlPy5pbWFnZUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UuY291bnRCeUl0ZW06JHtTdHJpbmcoaW1hZ2U/Lml0ZW1JZCB8fCAnJyl9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmxpc3RCeUl0ZW06JHtTdHJpbmcoaW1hZ2U/Lml0ZW1JZCB8fCAnJyl9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHVwbG9hZCA9IGFzeW5jIChcbiAgICBpbWFnZUZpbGVzOiBGaWxlW10sXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgaXRlbVR5cGU6IHN0cmluZyA9ICd1c2VycycsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlZEltYWdlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBpbWFnZUZpbGVzLm1hcChhc3luYyAoZmlsZTogRmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHt0eXBlOiBmaWxlVHlwZX0gPSBmaWxlO1xuICAgICAgICAgIHJldHVybiBhZGQoe1xuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgICAgbmFtZTogZmlsZS5uYW1lXG4gICAgICAgICAgfSwgaXRlbVR5cGUsIHJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2ltYWdlczogc2F2ZWRJbWFnZXMsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9TVUNDRVNTfSk7XG4gICAgICByZXR1cm4gc2F2ZWRJbWFnZXM7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5VUExPQURfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgaW1hZ2UuY291bnRCeUl0ZW06JHtpdGVtSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmxpc3RCeUl0ZW06JHtpdGVtSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvdW50QnlJdGVtID0gYXN5bmMgKGl0ZW1JZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8bnVtYmVyPihmbHV4LCBgaW1hZ2UuY291bnRCeUl0ZW06JHtpdGVtSWR9YCwge2l0ZW1JZH0sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGl0ZW1JZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBpdGVtSWRcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgY291bnQgPSBkYXRhPy5pbWFnZUNvdW50ID8/IDA7XG4gICAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtpdGVtSWQsIGNvdW50LCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0NPVU5UX1NVQ0NFU1N9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcFF1ZXJ5PG51bWJlcj4oZmx1eCwgJ2ltYWdlQ291bnQnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbJ2NvdW50J10sIHtvblN1Y2Nlc3N9KTtcbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KGZsdXgsIGBpbWFnZS5jb3VudEJ5SXRlbToke2l0ZW1JZH1gLCB7aXRlbUlkfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfQ09VTlRfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRJbWFnZUJ5SWQgPSBhc3luYyAoXG4gICAgaW1hZ2VJZDogc3RyaW5nLFxuICAgIGltYWdlUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxJbWFnZVR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICBgaW1hZ2UuZ2V0SW1hZ2VCeUlkOiR7aW1hZ2VJZH1gLFxuICAgICAgICB7aW1hZ2VJZCwgaW1hZ2VQcm9wc30sXG4gICAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgICApO1xuXG4gICAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgaW1hZ2VJZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBpbWFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGltYWdlc0RhdGEgPSAoZGF0YSBhcyB7aW1hZ2VzPzoge2dldEltYWdlQnlJZD86IEltYWdlVHlwZX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlc0RhdGE/LmdldEltYWdlQnlJZCB8fCB7fTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgaW1hZ2UsXG4gICAgICAgICAgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9JVEVNX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbWFnZSBhcyB1bmtub3duIGFzIEZsdXhBY3Rpb247XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxJbWFnZVR5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZ2V0SW1hZ2VCeUlkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAnaW1hZ2VJZCcsXG4gICAgICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICAgICAnaXRlbUlkJyxcbiAgICAgICAgICAnbGlrZUNvdW50JyxcbiAgICAgICAgICAncHJpdmFjeScsXG4gICAgICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLmltYWdlUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KGZsdXgsIGBpbWFnZS5nZXRJbWFnZUJ5SWQ6JHtpbWFnZUlkfWAsIHtpbWFnZUlkLCBpbWFnZVByb3BzfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUl0ZW0gPSBhc3luYyAoXG4gICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgaXRlbVR5cGU6IHN0cmluZyA9ICd1c2VycycsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgaW1hZ2VQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPEltYWdlVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8SW1hZ2VUeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICBgaW1hZ2UubGlzdEJ5SXRlbToke2l0ZW1JZH1gLFxuICAgICAgICB7ZnJvbSwgaW1hZ2VQcm9wcywgaXRlbUlkLCBpdGVtVHlwZSwgdG99LFxuICAgICAgICByZXF1ZXN0T3B0aW9uc1xuICAgICAgKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBmcm9tOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IGZyb21cbiAgICAgICAgfSxcbiAgICAgICAgaXRlbUlkOiB7XG4gICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgdmFsdWU6IGl0ZW1JZFxuICAgICAgICB9LFxuICAgICAgICBpdGVtVHlwZToge1xuICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgIHZhbHVlOiBpdGVtVHlwZVxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiB0b1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBpbWFnZXNEYXRhID0gKGRhdGEgYXMge2ltYWdlcz86IHtnZXRJbWFnZUxpc3RCeUl0ZW0/OiBJbWFnZVR5cGVbXX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZXNCeUl0ZW0gPSBBcnJheS5pc0FycmF5KGltYWdlc0RhdGE/LmdldEltYWdlTGlzdEJ5SXRlbSlcbiAgICAgICAgICA/IGltYWdlc0RhdGEuZ2V0SW1hZ2VMaXN0QnlJdGVtIHx8IFtdXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgIGxpc3Q6IGltYWdlc0J5SXRlbSxcbiAgICAgICAgICB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGltYWdlc0J5SXRlbSBhcyB1bmtub3duIGFzIEZsdXhBY3Rpb247XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxJbWFnZVR5cGVbXT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdnZXRJbWFnZUxpc3RCeUl0ZW0nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICdpbWFnZUlkJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdsaWtlQ291bnQnLFxuICAgICAgICAgICdwcml2YWN5JyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgLi4uaW1hZ2VQcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgYGltYWdlLmxpc3RCeUl0ZW06JHtpdGVtSWR9YCwge2Zyb20sIGltYWdlUHJvcHMsIGl0ZW1JZCwgaXRlbVR5cGUsIHRvfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgICByZWFjdGlvbnM6IHN0cmluZ1tdLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIGltYWdlUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PEltYWdlVHlwZVtdPihmbHV4LCAnaW1hZ2UubGlzdEJ5UmVhY3Rpb25zJywge2Zyb20sIGltYWdlUHJvcHMsIHJlYWN0aW9ucywgdG99LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgZnJvbToge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiBmcm9tXG4gICAgICAgIH0sXG4gICAgICAgIHJlYWN0aW9uczoge1xuICAgICAgICAgIHR5cGU6ICdbU3RyaW5nIV0nLFxuICAgICAgICAgIHZhbHVlOiByZWFjdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogdG9cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgaW1hZ2VzRGF0YSA9IChkYXRhIGFzIHtpbWFnZXM/OiB7aW1hZ2VzQnlSZWFjdGlvbnM/OiBJbWFnZVR5cGVbXX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZXNCeVJlYWN0aW9ucyA9IEFycmF5LmlzQXJyYXkoaW1hZ2VzRGF0YT8uaW1hZ2VzQnlSZWFjdGlvbnMpXG4gICAgICAgICAgPyBpbWFnZXNEYXRhLmltYWdlc0J5UmVhY3Rpb25zIHx8IFtdXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIGxpc3Q6IGltYWdlc0J5UmVhY3Rpb25zLFxuICAgICAgICAgIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8SW1hZ2VUeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2VzQnlSZWFjdGlvbnMnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgICdpbWFnZUlkJyxcbiAgICAgICAgICAnaW1hZ2VVcmwnLFxuICAgICAgICAgICdsaWtlQ291bnQnLFxuICAgICAgICAgICdwcml2YWN5JyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgLi4uaW1hZ2VQcm9wc1xuICAgICAgICBdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgJ2ltYWdlLmxpc3RCeVJlYWN0aW9ucycsIHtmcm9tLCBpbWFnZVByb3BzLCByZWFjdGlvbnMsIHRvfSwgcmVzdWx0LCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IElNQUdFX0NPTlNUQU5UUy5HRVRfTElTVF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3RCeVBlcnNvbmFSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgcGVyc29uYUlkOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAzMCxcbiAgICBpbWFnZVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIGxpc3RLZXk6IHN0cmluZyA9IGBwZXJzb25hOiR7cGVyc29uYUlkfTpzYXZlZFBob3Rvc2AsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxJbWFnZVR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PEltYWdlVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2ltYWdlLmxpc3RCeVBlcnNvbmFSZWFjdGlvbnMnLFxuICAgICAgICB7ZnJvbSwgaW1hZ2VQcm9wcywgbGlzdEtleSwgcGVyc29uYUlkLCByZWFjdGlvbnMsIHRvfSxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2l0ZW1JZDogbGlzdEtleSwgbGlzdDogY2FjaGVkUmVzdWx0LCBwZXJzb25hSWQsIHJlYWN0aW9ucywgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgICB9LFxuICAgICAgICBwZXJzb25hSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQnLFxuICAgICAgICAgIHZhbHVlOiBwZXJzb25hSWRcbiAgICAgICAgfSxcbiAgICAgICAgcmVhY3Rpb25zOiB7XG4gICAgICAgICAgdHlwZTogJ1tTdHJpbmchXScsXG4gICAgICAgICAgdmFsdWU6IHJlYWN0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiB0b1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBpbWFnZXNEYXRhID0gKGRhdGEgYXMge2ltYWdlcz86IHtpbWFnZXNCeVBlcnNvbmFSZWFjdGlvbnM/OiBJbWFnZVR5cGVbXX19KT8uaW1hZ2VzIHx8IHt9O1xuICAgICAgICBjb25zdCBpbWFnZXNCeVBlcnNvbmFSZWFjdGlvbnMgPSBBcnJheS5pc0FycmF5KGltYWdlc0RhdGE/LmltYWdlc0J5UGVyc29uYVJlYWN0aW9ucylcbiAgICAgICAgICA/IGltYWdlc0RhdGEuaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zIHx8IFtdXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBpdGVtSWQ6IGxpc3RLZXksXG4gICAgICAgICAgbGlzdDogaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zLFxuICAgICAgICAgIHBlcnNvbmFJZCxcbiAgICAgICAgICByZWFjdGlvbnMsXG4gICAgICAgICAgdHlwZTogSU1BR0VfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbWFnZXNCeVBlcnNvbmFSZWFjdGlvbnMgYXMgdW5rbm93biBhcyBGbHV4QWN0aW9uO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8SW1hZ2VUeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2VzQnlQZXJzb25hUmVhY3Rpb25zJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgW1xuICAgICAgICAgICdjb2xvcicsXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAnaW1hZ2VJZCcsXG4gICAgICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICAgICAnbGlrZUNvdW50JyxcbiAgICAgICAgICAncHJpdmFjeScsXG4gICAgICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLmltYWdlUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnaW1hZ2UubGlzdEJ5UGVyc29uYVJlYWN0aW9ucycsXG4gICAgICAgIHtmcm9tLCBpbWFnZVByb3BzLCBsaXN0S2V5LCBwZXJzb25hSWQsIHJlYWN0aW9ucywgdG99LFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCBpdGVtSWQ6IGxpc3RLZXksIHBlcnNvbmFJZCwgcmVhY3Rpb25zLCB0eXBlOiBJTUFHRV9DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICBkZWxldGU6IGRlbGV0ZUltYWdlLFxuICAgIGdldEltYWdlQnlJZCxcbiAgICB1cGRhdGUsXG4gICAgdXBsb2FkLFxuICAgIGNvdW50QnlJdGVtLFxuICAgIGxpc3RCeUl0ZW0sXG4gICAgbGlzdEJ5UGVyc29uYVJlYWN0aW9ucyxcbiAgICBsaXN0QnlSZWFjdGlvbnMsXG4gICAgdXBkYXRlSW1hZ2VBZGFwdGVyLFxuICAgIHVwZGF0ZUltYWdlQWRhcHRlck9wdGlvbnNcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsicGFyc2VTdHJpbmciLCJ2YWxpZGF0ZUltYWdlSW5wdXQiLCJnZXRDb25maWdGcm9tRmx1eCIsIklNQUdFX0NPTlNUQU5UUyIsImFwcE11dGF0aW9uIiwiYXBwUXVlcnkiLCJ1cGxvYWRJbWFnZSIsImNvbnZlcnRGaWxlVG9VcGxvYWRGaWxlIiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJEQVRBX1RZUEUiLCJnZXRJbWFnZVVwbG9hZENvbmZpZyIsImZsdXgiLCJjb25maWciLCJjb25maWd1cmVkTWF4SW1hZ2VTaXplIiwiTnVtYmVyIiwiYXBwIiwiaW1hZ2VzIiwibWF4SW1hZ2VTaXplIiwiY29uZmlndXJlZE1heEltYWdlVXBsb2FkQnl0ZXMiLCJtYXhJbWFnZVVwbG9hZEJ5dGVzIiwiaXNGaW5pdGUiLCJkZWZhdWx0SW1hZ2VWYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJjcmVhdGVJbWFnZVZhbGlkYXRvciIsImN1c3RvbUFkYXB0ZXIiLCJ2YWxpZGF0b3JPcHRpb25zIiwibWVyZ2VkT3B0aW9ucyIsInZhbGlkYXRlZCIsImN1c3RvbVZhbGlkYXRpb24iLCJjcmVhdGVJbWFnZUFjdGlvbnMiLCJpbWFnZUFkYXB0ZXJPcHRpb25zIiwiY3VzdG9tSW1hZ2VBZGFwdGVyIiwiaW1hZ2VBZGFwdGVyIiwidmFsaWRhdGVJbWFnZSIsInVwZGF0ZUltYWdlQWRhcHRlciIsImFkYXB0ZXIiLCJ1cGRhdGVJbWFnZUFkYXB0ZXJPcHRpb25zIiwiYWRkIiwiaW1hZ2UiLCJ0eXBlIiwicmVxdWVzdE9wdGlvbnMiLCJ2YWxpZGF0ZWRJbWFnZSIsImJhc2U2NCIsImRlc2NyaXB0aW9uIiwiZmlsZSIsImZpbGVUeXBlIiwiaXRlbUlkIiwibmFtZSIsInByaXZhY3kiLCJwYXJzZWREZXNjcmlwdGlvbiIsInVuZGVmaW5lZCIsInBhcnNlZEl0ZW1JZCIsIlN0cmluZyIsInVwbG9hZFBheWxvYWQiLCJGb3JtRGF0YSIsIkZpbGUiLCJ1cGxvYWRGaWxlIiwic2V0IiwiaXRlbVR5cGUiLCJuZXdJbWFnZSIsImRpc3BhdGNoIiwiQUREX0lURU1fU1VDQ0VTUyIsImVycm9yIiwiQUREX0lURU1fRVJST1IiLCJkZWxldGVJbWFnZSIsImltYWdlSWQiLCJpbWFnZVByb3BzIiwicXVlcnlWYXJpYWJsZXMiLCJ2YWx1ZSIsIm9uU3VjY2VzcyIsImRhdGEiLCJSRU1PVkVfSVRFTV9TVUNDRVNTIiwiUkVNT1ZFX0lURU1fRVJST1IiLCJ1cGRhdGUiLCJ1cmwiLCJ1cGRhdGVJbWFnZSIsIlVQREFURV9JVEVNX1NVQ0NFU1MiLCJmb3JtYXRJbWFnZSIsInVwbG9hZCIsImltYWdlRmlsZXMiLCJzYXZlZEltYWdlcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJVUExPQURfSVRFTV9TVUNDRVNTIiwiVVBMT0FEX0lURU1fRVJST1IiLCJjb3VudEJ5SXRlbSIsImNhY2hlZFJlc3VsdCIsImNvdW50IiwiaW1hZ2VDb3VudCIsIkdFVF9DT1VOVF9TVUNDRVNTIiwicmVzdWx0IiwiR0VUX0NPVU5UX0VSUk9SIiwiZ2V0SW1hZ2VCeUlkIiwiaW1hZ2VzRGF0YSIsIkdFVF9JVEVNX1NVQ0NFU1MiLCJHRVRfSVRFTV9FUlJPUiIsImxpc3RCeUl0ZW0iLCJmcm9tIiwidG8iLCJpbWFnZXNCeUl0ZW0iLCJBcnJheSIsImlzQXJyYXkiLCJnZXRJbWFnZUxpc3RCeUl0ZW0iLCJsaXN0IiwiR0VUX0xJU1RfU1VDQ0VTUyIsIkdFVF9MSVNUX0VSUk9SIiwibGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25zIiwiaW1hZ2VzQnlSZWFjdGlvbnMiLCJsaXN0QnlQZXJzb25hUmVhY3Rpb25zIiwicGVyc29uYUlkIiwibGlzdEtleSIsImltYWdlc0J5UGVyc29uYVJlYWN0aW9ucyIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBU0EsV0FBVyxRQUFRLGVBQWU7QUFFM0MsU0FBU0Msa0JBQWtCLFFBQVEsOENBQThDO0FBQ2pGLFNBQVNDLGlCQUFpQixRQUFRLDZCQUE2QjtBQUMvRCxTQUFTQyxlQUFlLFFBQVEsNkJBQTZCO0FBQzdELFNBQVNDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxXQUFXLFFBQVEscUJBQXFCO0FBQ3hFLFNBQVNDLHVCQUF1QixRQUFRLHNCQUFzQjtBQUM5RCxTQUFTQyxrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFRLDhCQUE4QjtBQU9yRyxNQUFNQyxZQUFZO0FBRWxCLE1BQU1DLHVCQUF1QixDQUFDQztJQUM1QixNQUFNQyxTQUFTWixrQkFBa0JXO0lBQ2pDLE1BQU1FLHlCQUF5QkMsT0FDN0IsQUFBQ0YsUUFBZ0JHLEtBQUtDLFFBQVFDLGdCQUMxQkwsUUFBZ0JLLGdCQUNqQjtJQUVMLE1BQU1DLGdDQUFnQ0osT0FDcEMsQUFBQ0YsUUFBZ0JHLEtBQUtDLFFBQVFHLHVCQUMxQlAsUUFBZ0JPLHVCQUNqQixNQUFNO0lBR1gsT0FBTztRQUNMRixjQUFjSCxPQUFPTSxRQUFRLENBQUNQLDJCQUEyQkEseUJBQXlCLElBQzlFQSx5QkFDQTtRQUNKTSxxQkFBcUJMLE9BQU9NLFFBQVEsQ0FBQ0Ysa0NBQWtDQSxnQ0FBZ0MsSUFDbkdBLGdDQUNBLE1BQU07SUFDWjtBQUNGO0FBeUNBLDhCQUE4QjtBQUM5QixNQUFNRyx3QkFBd0IsQ0FBQ0MsT0FBZ0JDLFVBQWtDeEIsbUJBQW1CdUI7QUFFcEcsc0VBQXNFO0FBQ3RFLE1BQU1FLHVCQUF1QixDQUMzQkMsZUFDQUYsVUFDRyxDQUFDRCxPQUFnQkk7UUFDcEIsTUFBTUMsZ0JBQWdCO1lBQUMsR0FBR0osT0FBTztZQUFFLEdBQUdHLGdCQUFnQjtRQUFBO1FBRXRELGdDQUFnQztRQUNoQyxJQUFJRSxZQUFZUCxzQkFBc0JDLE9BQU9LO1FBRTdDLHNDQUFzQztRQUN0QyxJQUFHRixlQUFlO1lBQ2hCRyxZQUFZSCxjQUFjRyxXQUFXRDtRQUN2QztRQUVBLG1EQUFtRDtRQUNuRCxJQUFHQSxlQUFlRSxrQkFBa0I7WUFDbENELFlBQVlELGNBQWNFLGdCQUFnQixDQUFDRDtRQUM3QztRQUVBLE9BQU9BO0lBQ1Q7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBcUJDLEdBQ0QsT0FBTyxNQUFNRSxxQkFBcUIsQ0FDaENuQixNQUNBWTtJQUVBLDJCQUEyQjtJQUMzQixJQUFJUSxzQkFBc0JSLFNBQVNRLHVCQUF1QixDQUFDO0lBQzNELElBQUlDLHFCQUFxQlQsU0FBU1U7SUFFbEMsNkRBQTZEO0lBQzdELElBQUlDLGdCQUFnQlYscUJBQXFCUSxvQkFBb0JEO0lBRTdELDRDQUE0QztJQUM1QyxNQUFNSSxxQkFBcUIsQ0FBQ0M7UUFDMUJKLHFCQUFxQkk7UUFDckJGLGdCQUFnQlYscUJBQXFCUSxvQkFBb0JEO0lBQzNEO0lBRUEsTUFBTU0sNEJBQTRCLENBQUNkO1FBQ2pDUSxzQkFBc0I7WUFBQyxHQUFHQSxtQkFBbUI7WUFBRSxHQUFHUixPQUFPO1FBQUE7UUFDekRXLGdCQUFnQlYscUJBQXFCUSxvQkFBb0JEO0lBQzNEO0lBRUEseUJBQXlCO0lBQ3pCLE1BQU1PLE1BQU0sT0FDVkMsT0FDQUMsT0FBZSxPQUFPLEVBQ3RCQyxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUk7WUFDRixNQUFNQyxpQkFBaUJSLGNBQWNLLE9BQU9SO1lBQzVDLE1BQU0sRUFBQ1ksTUFBTSxFQUFFQyxXQUFXLEVBQUVDLElBQUksRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsT0FBTyxFQUFDLEdBQUdQO1lBQ3JFLE1BQU1RLG9CQUFvQk4sY0FBYzlDLFlBQVk4QyxhQUFhLE9BQU9PO1lBQ3hFLE1BQU1DLGVBQWVDLE9BQU9OLFVBQVU7WUFDdEMsSUFBSU87WUFFSixJQUFHLE9BQU9DLGFBQWEsZUFBZVYsZ0JBQWdCVyxNQUFNO2dCQUMxRCxNQUFNLEVBQUN2QyxZQUFZLEVBQUVFLG1CQUFtQixFQUFDLEdBQUdULHFCQUFxQkM7Z0JBQ2pFLE1BQU04QyxhQUFhLE1BQU1wRCx3QkFBd0J3QyxNQUFNNUIsY0FBY0U7Z0JBQ3JFbUMsZ0JBQWdCLElBQUlDO2dCQUNwQkQsY0FBY0ksR0FBRyxDQUFDLFFBQVFEO2dCQUMxQkgsY0FBY0ksR0FBRyxDQUFDLFlBQVlsQjtnQkFFOUIsSUFBR1UsbUJBQW1CO29CQUNwQkksY0FBY0ksR0FBRyxDQUFDLGVBQWVSO2dCQUNuQztnQkFFQSxJQUFHRSxjQUFjO29CQUNmRSxjQUFjSSxHQUFHLENBQUMsVUFBVU47Z0JBQzlCO2dCQUVBLElBQUdLLFdBQVdqQixJQUFJLElBQUlNLFVBQVU7b0JBQzlCUSxjQUFjSSxHQUFHLENBQUMsWUFBWUQsV0FBV2pCLElBQUksSUFBSU07Z0JBQ25EO2dCQUVBLElBQUdFLE1BQU07b0JBQ1BNLGNBQWNJLEdBQUcsQ0FBQyxRQUFRVjtnQkFDNUI7Z0JBRUEsSUFBR0MsU0FBUztvQkFDVkssY0FBY0ksR0FBRyxDQUFDLFdBQVdUO2dCQUMvQjtZQUNGLE9BQU87Z0JBQ0xLLGdCQUFnQjtvQkFDZFg7b0JBQ0FDLGFBQWFNO29CQUNiSixVQUFVQSxZQUFZO29CQUN0QkM7b0JBQ0FZLFVBQVVuQjtvQkFDVixHQUFJUSxPQUFPO3dCQUFDQTtvQkFBSSxJQUFJLENBQUMsQ0FBQztvQkFDdEIsR0FBSUMsVUFBVTt3QkFBQ0E7b0JBQU8sSUFBSSxDQUFDLENBQUM7Z0JBQzlCO1lBQ0Y7WUFFQSxNQUFNLEVBQUNWLE9BQU9xQixRQUFRLEVBQUMsR0FBRyxNQUFNeEQsWUFBWU8sTUFBTTJDO1lBQ2xELE1BQU0zQyxLQUFLa0QsUUFBUSxDQUFDO2dCQUFDdEIsT0FBT3FCO2dCQUFVcEIsTUFBTXZDLGdCQUFnQjZELGdCQUFnQjtZQUFBO1lBQzVFLE9BQU9GO1FBQ1QsRUFBRSxPQUFNRyxPQUFPO1lBQ2JwRCxLQUFLa0QsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT3ZCLE1BQU12QyxnQkFBZ0IrRCxjQUFjO1lBQUE7WUFDMUQsTUFBTUQ7UUFDUixTQUFVO1lBQ1IsTUFBTXpELG1CQUFtQkssTUFBTSxDQUFDLGtCQUFrQixFQUFFMEMsT0FBT2QsT0FBT1EsVUFBVSxLQUFLO1lBQ2pGLE1BQU16QyxtQkFBbUJLLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTBDLE9BQU9kLE9BQU9RLFVBQVUsS0FBSztZQUNoRixNQUFNekMsbUJBQW1CSyxNQUFNO1lBQy9CLE1BQU1MLG1CQUFtQkssTUFBTTtRQUNqQztJQUNGO0lBRUEsTUFBTXNELGNBQWMsT0FDbEJDLFNBQ0FDLGFBQXVCLEVBQUUsRUFDekIxQixpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUk7WUFDRixNQUFNMkIsaUJBQWlCO2dCQUNyQkYsU0FBUztvQkFDUDFCLE1BQU07b0JBQ042QixPQUFPSDtnQkFDVDtZQUNGO1lBRUEsTUFBTUksWUFBWSxPQUFPQyxPQUF1QixDQUFDLENBQUM7Z0JBQ2hELE1BQU1OLGNBQWMsQUFBQ00sTUFBK0N2RCxRQUFRaUQsZUFBZSxDQUFDO2dCQUM1RixNQUFNdEQsS0FBS2tELFFBQVEsQ0FBQztvQkFBQ3RCLE9BQU8wQjtvQkFBYXpCLE1BQU12QyxnQkFBZ0J1RSxtQkFBbUI7Z0JBQUE7Z0JBQ2xGLE9BQU9QO1lBQ1Q7WUFFQSxPQUFPLE1BQU0vRCxZQUF1QlMsTUFBTSxlQUFlRixXQUFXMkQsZ0JBQWdCO2dCQUFDO21CQUFTRDthQUFXLEVBQUU7Z0JBQUNHO1lBQVM7UUFDdkgsRUFBRSxPQUFNUCxPQUFPO1lBQ2JwRCxLQUFLa0QsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT3ZCLE1BQU12QyxnQkFBZ0J3RSxpQkFBaUI7WUFBQTtZQUM3RCxNQUFNVjtRQUNSLFNBQVU7WUFDUixNQUFNekQsbUJBQW1CSyxNQUFNLENBQUMsbUJBQW1CLEVBQUV1RCxTQUFTO1lBQzlELE1BQU01RCxtQkFBbUJLLE1BQU07WUFDL0IsTUFBTUwsbUJBQW1CSyxNQUFNO1FBQ2pDO0lBQ0Y7SUFFQSxNQUFNK0QsU0FBUyxPQUNibkMsT0FDQUMsT0FBZSxPQUFPLEVBQ3RCQyxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUk7WUFDRixNQUFNQyxpQkFBaUJSLGNBQWNLLE9BQU9SO1lBQzVDLE1BQU0sRUFBQ1ksTUFBTSxFQUFFQyxXQUFXLEVBQUVzQixPQUFPLEVBQUVuQixNQUFNLEVBQUVFLE9BQU8sRUFBRTBCLEdBQUcsRUFBQyxHQUFHakM7WUFFN0QsSUFBR3dCLFdBQVcsQ0FBQ3ZCLFVBQVUsQ0FBQ2dDLEtBQUs7Z0JBQzdCLE1BQU1QLGlCQUFpQjtvQkFDckI3QixPQUFPO3dCQUNMQyxNQUFNO3dCQUNONkIsT0FBTzs0QkFDTEg7NEJBQ0EsR0FBSXRCLGNBQWM7Z0NBQUNBLGFBQWE5QyxZQUFZOEMsYUFBYTs0QkFBSSxJQUFJLENBQUMsQ0FBQzs0QkFDbkUsR0FBSUssVUFBVTtnQ0FBQ0E7NEJBQU8sSUFBSSxDQUFDLENBQUM7d0JBQzlCO29CQUNGO2dCQUNGO2dCQUVBLE1BQU1xQixZQUFZLE9BQU9DLE9BQXVCLENBQUMsQ0FBQztvQkFDaEQsTUFBTUssY0FBYyxBQUFDTCxNQUErQ3ZELFFBQVE0RCxlQUFlLENBQUM7b0JBQzVGLE1BQU1qRSxLQUFLa0QsUUFBUSxDQUFDO3dCQUFDdEIsT0FBT3FDO3dCQUFhcEMsTUFBTXZDLGdCQUFnQjRFLG1CQUFtQjtvQkFBQTtvQkFDbEYsT0FBT0Q7Z0JBQ1Q7Z0JBRUEsT0FBTyxNQUFNMUUsWUFDWFMsTUFDQSxlQUNBRixXQUNBMkQsZ0JBQ0E7b0JBQUM7b0JBQVc7b0JBQVc7b0JBQWU7b0JBQVk7aUJBQVcsRUFDN0Q7b0JBQUNFO2dCQUFTO1lBRWQ7WUFFQSxNQUFNUSxjQUFjO2dCQUNsQm5DO2dCQUNBQyxhQUFhQSxjQUFjOUMsWUFBWThDLGFBQWEsT0FBT087Z0JBQzNETCxVQUFVO2dCQUNWQztnQkFDQVksVUFBVW5CO2dCQUNWLEdBQUkwQixVQUFVO29CQUFDQTtnQkFBTyxJQUFJLENBQUMsQ0FBQztnQkFDNUIsR0FBSWpCLFVBQVU7b0JBQUNBO2dCQUFPLElBQUksQ0FBQyxDQUFDO1lBQzlCO1lBRUEsTUFBTSxFQUFDVixPQUFPcUIsUUFBUSxFQUFDLEdBQUcsTUFBTXhELFlBQVlPLE1BQU1tRTtZQUNsRCxNQUFNbkUsS0FBS2tELFFBQVEsQ0FBQztnQkFBQ3RCLE9BQU9xQjtnQkFBVXBCLE1BQU12QyxnQkFBZ0I2RCxnQkFBZ0I7WUFBQTtZQUM1RSxPQUFPRjtRQUNULEVBQUUsT0FBTUcsT0FBTztZQUNicEQsS0FBS2tELFFBQVEsQ0FBQztnQkFBQ0U7Z0JBQU92QixNQUFNdkMsZ0JBQWdCK0QsY0FBYztZQUFBO1lBQzFELE1BQU1EO1FBQ1IsU0FBVTtZQUNSLE1BQU16RCxtQkFBbUJLLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTBDLE9BQU9kLE9BQU8yQixXQUFXLEtBQUs7WUFDbkYsTUFBTTVELG1CQUFtQkssTUFBTSxDQUFDLGtCQUFrQixFQUFFMEMsT0FBT2QsT0FBT1EsVUFBVSxLQUFLO1lBQ2pGLE1BQU16QyxtQkFBbUJLLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTBDLE9BQU9kLE9BQU9RLFVBQVUsS0FBSztZQUNoRixNQUFNekMsbUJBQW1CSyxNQUFNO1lBQy9CLE1BQU1MLG1CQUFtQkssTUFBTTtRQUNqQztJQUNGO0lBRUEsTUFBTW9FLFNBQVMsT0FDYkMsWUFDQWpDLFFBQ0FZLFdBQW1CLE9BQU8sRUFDMUJsQixpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUk7WUFDRixNQUFNd0MsY0FBYyxNQUFNQyxRQUFRQyxHQUFHLENBQ25DSCxXQUFXSSxHQUFHLENBQUMsT0FBT3ZDO2dCQUNwQixNQUFNLEVBQUNMLE1BQU1NLFFBQVEsRUFBQyxHQUFHRDtnQkFDekIsT0FBT1AsSUFBSTtvQkFDVE87b0JBQ0FDO29CQUNBQztvQkFDQUMsTUFBTUgsS0FBS0csSUFBSTtnQkFDakIsR0FBR1csVUFBVWxCO1lBQ2Y7WUFHRixNQUFNOUIsS0FBS2tELFFBQVEsQ0FBQztnQkFBQzdDLFFBQVFpRTtnQkFBYXpDLE1BQU12QyxnQkFBZ0JvRixtQkFBbUI7WUFBQTtZQUNuRixPQUFPSjtRQUNULEVBQUUsT0FBTWxCLE9BQU87WUFDYnBELEtBQUtrRCxRQUFRLENBQUM7Z0JBQUNFO2dCQUFPdkIsTUFBTXZDLGdCQUFnQnFGLGlCQUFpQjtZQUFBO1lBQzdELE1BQU12QjtRQUNSLFNBQVU7WUFDUixNQUFNekQsbUJBQW1CSyxNQUFNLENBQUMsa0JBQWtCLEVBQUVvQyxRQUFRO1lBQzVELE1BQU16QyxtQkFBbUJLLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRW9DLFFBQVE7WUFDM0QsTUFBTXpDLG1CQUFtQkssTUFBTTtZQUMvQixNQUFNTCxtQkFBbUJLLE1BQU07UUFDakM7SUFDRjtJQUVBLE1BQU00RSxjQUFjLE9BQU94QyxRQUFnQk4saUJBQXVDLENBQUMsQ0FBQztRQUNsRixJQUFJO1lBQ0YsTUFBTStDLGVBQWVqRixpQkFBeUJJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRW9DLFFBQVEsRUFBRTtnQkFBQ0E7WUFBTSxHQUFHTjtZQUU3RixJQUFHK0MsaUJBQWlCckMsV0FBVztnQkFDN0IsT0FBT3FDO1lBQ1Q7WUFFQSxNQUFNcEIsaUJBQWlCO2dCQUNyQnJCLFFBQVE7b0JBQ05QLE1BQU07b0JBQ042QixPQUFPdEI7Z0JBQ1Q7WUFDRjtZQUVBLE1BQU11QixZQUFZLENBQUNDLE9BQXVCLENBQUMsQ0FBQztnQkFDMUMsTUFBTWtCLFFBQVFsQixNQUFNbUIsY0FBYztnQkFDbEMsT0FBTy9FLEtBQUtrRCxRQUFRLENBQUM7b0JBQUNkO29CQUFRMEM7b0JBQU9qRCxNQUFNdkMsZ0JBQWdCMEYsaUJBQWlCO2dCQUFBO1lBQzlFO1lBRUEsTUFBTUMsU0FBUyxNQUFNekYsU0FBaUJRLE1BQU0sY0FBY0YsV0FBVzJELGdCQUFnQjtnQkFBQzthQUFRLEVBQUU7Z0JBQUNFO1lBQVM7WUFDMUcsT0FBTyxNQUFNOUQsaUJBQWlCRyxNQUFNLENBQUMsa0JBQWtCLEVBQUVvQyxRQUFRLEVBQUU7Z0JBQUNBO1lBQU0sR0FBRzZDLFFBQVFuRDtRQUN2RixFQUFFLE9BQU1zQixPQUFPO1lBQ2JwRCxLQUFLa0QsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT3ZCLE1BQU12QyxnQkFBZ0I0RixlQUFlO1lBQUE7WUFDM0QsTUFBTTlCO1FBQ1I7SUFDRjtJQUVBLE1BQU0rQixlQUFlLE9BQ25CNUIsU0FDQUMsYUFBdUIsRUFBRSxFQUN6QjFCLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU0rQyxlQUFlakYsaUJBQ25CSSxNQUNBLENBQUMsbUJBQW1CLEVBQUV1RCxTQUFTLEVBQy9CO2dCQUFDQTtnQkFBU0M7WUFBVSxHQUNwQjFCO1lBR0YsSUFBRytDLGlCQUFpQnJDLFdBQVc7Z0JBQzdCLE9BQU9xQztZQUNUO1lBRUEsTUFBTXBCLGlCQUFpQjtnQkFDckJGLFNBQVM7b0JBQ1AxQixNQUFNO29CQUNONkIsT0FBT0g7Z0JBQ1Q7WUFDRjtZQUVBLE1BQU1JLFlBQVksT0FBT0MsT0FBdUIsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNd0IsYUFBYSxBQUFDeEIsTUFBZ0R2RCxVQUFVLENBQUM7Z0JBQy9FLE1BQU11QixRQUFRd0QsWUFBWUQsZ0JBQWdCLENBQUM7Z0JBQzNDLE1BQU1uRixLQUFLa0QsUUFBUSxDQUFDO29CQUNsQnRCO29CQUNBQyxNQUFNdkMsZ0JBQWdCK0YsZ0JBQWdCO2dCQUN4QztnQkFDQSxPQUFPekQ7WUFDVDtZQUVBLE1BQU1xRCxTQUFTLE1BQU16RixTQUNuQlEsTUFDQSxnQkFDQUYsV0FDQTJELGdCQUNBO2dCQUNFO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO21CQUNHRDthQUNKLEVBQ0Q7Z0JBQUNHO1lBQVM7WUFHWixPQUFPLE1BQU05RCxpQkFBaUJHLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRXVELFNBQVMsRUFBRTtnQkFBQ0E7Z0JBQVNDO1lBQVUsR0FBR3lCLFFBQVFuRDtRQUN0RyxFQUFFLE9BQU1zQixPQUFPO1lBQ2JwRCxLQUFLa0QsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT3ZCLE1BQU12QyxnQkFBZ0JnRyxjQUFjO1lBQUE7WUFDMUQsTUFBTWxDO1FBQ1I7SUFDRjtJQUVBLE1BQU1tQyxhQUFhLE9BQ2pCbkQsUUFDQVksV0FBbUIsT0FBTyxFQUMxQndDLE9BQWUsQ0FBQyxFQUNoQkMsS0FBYSxFQUFFLEVBQ2ZqQyxhQUF1QixFQUFFLEVBQ3pCMUIsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxJQUFJO1lBQ0YsTUFBTStDLGVBQWVqRixpQkFDbkJJLE1BQ0EsQ0FBQyxpQkFBaUIsRUFBRW9DLFFBQVEsRUFDNUI7Z0JBQUNvRDtnQkFBTWhDO2dCQUFZcEI7Z0JBQVFZO2dCQUFVeUM7WUFBRSxHQUN2QzNEO1lBR0YsSUFBRytDLGNBQWM7Z0JBQ2YsT0FBT0E7WUFDVDtZQUVBLE1BQU1wQixpQkFBaUI7Z0JBQ3JCK0IsTUFBTTtvQkFDSjNELE1BQU07b0JBQ042QixPQUFPOEI7Z0JBQ1Q7Z0JBQ0FwRCxRQUFRO29CQUNOUCxNQUFNO29CQUNONkIsT0FBT3RCO2dCQUNUO2dCQUNBWSxVQUFVO29CQUNSbkIsTUFBTTtvQkFDTjZCLE9BQU9WO2dCQUNUO2dCQUNBeUMsSUFBSTtvQkFDRjVELE1BQU07b0JBQ042QixPQUFPK0I7Z0JBQ1Q7WUFDRjtZQUVBLE1BQU05QixZQUFZLE9BQU9DLE9BQXVCLENBQUMsQ0FBQztnQkFDaEQsTUFBTXdCLGFBQWEsQUFBQ3hCLE1BQXdEdkQsVUFBVSxDQUFDO2dCQUN2RixNQUFNcUYsZUFBZUMsTUFBTUMsT0FBTyxDQUFDUixZQUFZUyxzQkFDM0NULFdBQVdTLGtCQUFrQixJQUFJLEVBQUUsR0FDbkMsRUFBRTtnQkFDTixNQUFNN0YsS0FBS2tELFFBQVEsQ0FBQztvQkFDbEJkO29CQUNBMEQsTUFBTUo7b0JBQ043RCxNQUFNdkMsZ0JBQWdCeUcsZ0JBQWdCO2dCQUN4QztnQkFDQSxPQUFPTDtZQUNUO1lBRUEsTUFBTVQsU0FBUyxNQUFNekYsU0FDbkJRLE1BQ0Esc0JBQ0FGLFdBQ0EyRCxnQkFDQTtnQkFDRTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTttQkFDR0Q7YUFDSixFQUNEO2dCQUFDRztZQUFTO1lBR1osT0FBTyxNQUFNOUQsaUJBQWlCRyxNQUFNLENBQUMsaUJBQWlCLEVBQUVvQyxRQUFRLEVBQUU7Z0JBQUNvRDtnQkFBTWhDO2dCQUFZcEI7Z0JBQVFZO2dCQUFVeUM7WUFBRSxHQUFHUixRQUFRbkQ7UUFDdEgsRUFBRSxPQUFNc0IsT0FBTztZQUNicEQsS0FBS2tELFFBQVEsQ0FBQztnQkFBQ0U7Z0JBQU92QixNQUFNdkMsZ0JBQWdCMEcsY0FBYztZQUFBO1lBQzFELE1BQU01QztRQUNSO0lBQ0Y7SUFFQSxNQUFNNkMsa0JBQWtCLE9BQ3RCQyxXQUNBVixPQUFlLENBQUMsRUFDaEJDLEtBQWEsRUFBRSxFQUNmakMsYUFBdUIsRUFBRSxFQUN6QjFCLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU0rQyxlQUFlakYsaUJBQThCSSxNQUFNLHlCQUF5QjtnQkFBQ3dGO2dCQUFNaEM7Z0JBQVkwQztnQkFBV1Q7WUFBRSxHQUFHM0Q7WUFFckgsSUFBRytDLGNBQWM7Z0JBQ2YsT0FBT0E7WUFDVDtZQUVBLE1BQU1wQixpQkFBaUI7Z0JBQ3JCK0IsTUFBTTtvQkFDSjNELE1BQU07b0JBQ042QixPQUFPOEI7Z0JBQ1Q7Z0JBQ0FVLFdBQVc7b0JBQ1RyRSxNQUFNO29CQUNONkIsT0FBT3dDO2dCQUNUO2dCQUNBVCxJQUFJO29CQUNGNUQsTUFBTTtvQkFDTjZCLE9BQU8rQjtnQkFDVDtZQUNGO1lBRUEsTUFBTTlCLFlBQVksQ0FBQ0MsT0FBdUIsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNd0IsYUFBYSxBQUFDeEIsTUFBdUR2RCxVQUFVLENBQUM7Z0JBQ3RGLE1BQU04RixvQkFBb0JSLE1BQU1DLE9BQU8sQ0FBQ1IsWUFBWWUscUJBQ2hEZixXQUFXZSxpQkFBaUIsSUFBSSxFQUFFLEdBQ2xDLEVBQUU7Z0JBQ04sT0FBT25HLEtBQUtrRCxRQUFRLENBQUM7b0JBQ25CNEMsTUFBTUs7b0JBQ050RSxNQUFNdkMsZ0JBQWdCeUcsZ0JBQWdCO2dCQUN4QztZQUNGO1lBRUEsTUFBTWQsU0FBUyxNQUFNekYsU0FDbkJRLE1BQ0EscUJBQ0FGLFdBQ0EyRCxnQkFDQTtnQkFDRTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTttQkFDR0Q7YUFDSixFQUNEO2dCQUFDRztZQUFTO1lBR1osT0FBTyxNQUFNOUQsaUJBQWlCRyxNQUFNLHlCQUF5QjtnQkFBQ3dGO2dCQUFNaEM7Z0JBQVkwQztnQkFBV1Q7WUFBRSxHQUFHUixRQUFRbkQ7UUFDMUcsRUFBRSxPQUFNc0IsT0FBTztZQUNicEQsS0FBS2tELFFBQVEsQ0FBQztnQkFBQ0U7Z0JBQU92QixNQUFNdkMsZ0JBQWdCMEcsY0FBYztZQUFBO1lBQzFELE1BQU01QztRQUNSO0lBQ0Y7SUFFQSxNQUFNZ0QseUJBQXlCLE9BQzdCQyxXQUNBSCxXQUNBVixPQUFlLENBQUMsRUFDaEJDLEtBQWEsRUFBRSxFQUNmakMsYUFBdUIsRUFBRSxFQUN6QjhDLFVBQWtCLENBQUMsUUFBUSxFQUFFRCxVQUFVLFlBQVksQ0FBQyxFQUNwRHZFLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU0rQyxlQUFlakYsaUJBQ25CSSxNQUNBLGdDQUNBO2dCQUFDd0Y7Z0JBQU1oQztnQkFBWThDO2dCQUFTRDtnQkFBV0g7Z0JBQVdUO1lBQUUsR0FDcEQzRDtZQUdGLElBQUcrQyxpQkFBaUJyQyxXQUFXO2dCQUM3QixNQUFNeEMsS0FBS2tELFFBQVEsQ0FBQztvQkFBQ2QsUUFBUWtFO29CQUFTUixNQUFNakI7b0JBQWN3QjtvQkFBV0g7b0JBQVdyRSxNQUFNdkMsZ0JBQWdCeUcsZ0JBQWdCO2dCQUFBO2dCQUN0SCxPQUFPbEI7WUFDVDtZQUVBLE1BQU1wQixpQkFBaUI7Z0JBQ3JCK0IsTUFBTTtvQkFDSjNELE1BQU07b0JBQ042QixPQUFPOEI7Z0JBQ1Q7Z0JBQ0FhLFdBQVc7b0JBQ1R4RSxNQUFNO29CQUNONkIsT0FBTzJDO2dCQUNUO2dCQUNBSCxXQUFXO29CQUNUckUsTUFBTTtvQkFDTjZCLE9BQU93QztnQkFDVDtnQkFDQVQsSUFBSTtvQkFDRjVELE1BQU07b0JBQ042QixPQUFPK0I7Z0JBQ1Q7WUFDRjtZQUVBLE1BQU05QixZQUFZLE9BQU9DLE9BQXVCLENBQUMsQ0FBQztnQkFDaEQsTUFBTXdCLGFBQWEsQUFBQ3hCLE1BQThEdkQsVUFBVSxDQUFDO2dCQUM3RixNQUFNa0csMkJBQTJCWixNQUFNQyxPQUFPLENBQUNSLFlBQVltQiw0QkFDdkRuQixXQUFXbUIsd0JBQXdCLElBQUksRUFBRSxHQUN6QyxFQUFFO2dCQUVOLE1BQU12RyxLQUFLa0QsUUFBUSxDQUFDO29CQUNsQmQsUUFBUWtFO29CQUNSUixNQUFNUztvQkFDTkY7b0JBQ0FIO29CQUNBckUsTUFBTXZDLGdCQUFnQnlHLGdCQUFnQjtnQkFDeEM7Z0JBQ0EsT0FBT1E7WUFDVDtZQUVBLE1BQU10QixTQUFTLE1BQU16RixTQUNuQlEsTUFDQSw0QkFDQUYsV0FDQTJELGdCQUNBO2dCQUNFO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO21CQUNHRDthQUNKLEVBQ0Q7Z0JBQUNHO1lBQVM7WUFHWixPQUFPLE1BQU05RCxpQkFDWEcsTUFDQSxnQ0FDQTtnQkFBQ3dGO2dCQUFNaEM7Z0JBQVk4QztnQkFBU0Q7Z0JBQVdIO2dCQUFXVDtZQUFFLEdBQ3BEUixRQUNBbkQ7UUFFSixFQUFFLE9BQU1zQixPQUFPO1lBQ2JwRCxLQUFLa0QsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT2hCLFFBQVFrRTtnQkFBU0Q7Z0JBQVdIO2dCQUFXckUsTUFBTXZDLGdCQUFnQjBHLGNBQWM7WUFBQTtZQUNqRyxNQUFNNUM7UUFDUjtJQUNGO0lBRUEsT0FBTztRQUNMekI7UUFDQTZFLFFBQVFsRDtRQUNSNkI7UUFDQXBCO1FBQ0FLO1FBQ0FRO1FBQ0FXO1FBQ0FhO1FBQ0FIO1FBQ0F6RTtRQUNBRTtJQUNGO0FBQ0YsRUFBRSJ9