@nlabs/reaktor 0.8.1 → 0.10.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 (445) hide show
  1. package/.prettierrc.js +4 -0
  2. package/README.md +10 -1
  3. package/coverage/actions/groups.ts.html +1039 -0
  4. package/coverage/actions/images.ts.html +2500 -0
  5. package/coverage/actions/index.html +131 -0
  6. package/coverage/actions/tags.ts.html +1000 -0
  7. package/coverage/adapters/arangoAdapter.ts.html +151 -0
  8. package/coverage/adapters/index.html +146 -0
  9. package/coverage/adapters/reaktorAdapter.ts.html +127 -0
  10. package/coverage/adapters/tagAdapter.ts.html +160 -0
  11. package/coverage/base.css +224 -0
  12. package/coverage/block-navigation.js +87 -0
  13. package/coverage/clover.xml +6 -0
  14. package/coverage/coverage-final.json +1 -0
  15. package/coverage/favicon.png +0 -0
  16. package/coverage/index.html +221 -0
  17. package/coverage/lcov-report/base.css +224 -0
  18. package/coverage/lcov-report/block-navigation.js +87 -0
  19. package/coverage/lcov-report/favicon.png +0 -0
  20. package/coverage/lcov-report/index.html +101 -0
  21. package/coverage/lcov-report/prettify.css +1 -0
  22. package/coverage/lcov-report/prettify.js +2 -0
  23. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  24. package/coverage/lcov-report/sorter.js +196 -0
  25. package/coverage/lcov.info +0 -0
  26. package/coverage/mocks/file.ts.html +118 -0
  27. package/coverage/mocks/group.ts.html +145 -0
  28. package/coverage/mocks/image.ts.html +136 -0
  29. package/coverage/mocks/index.html +146 -0
  30. package/coverage/mocks/post.ts.html +169 -0
  31. package/coverage/mocks/tag.ts.html +121 -0
  32. package/coverage/mocks/user.ts.html +268 -0
  33. package/coverage/prettify.css +1 -0
  34. package/coverage/prettify.js +2 -0
  35. package/coverage/sort-arrow-sprite.png +0 -0
  36. package/coverage/sorter.js +196 -0
  37. package/coverage/types/error.ts.html +145 -0
  38. package/coverage/types/index.html +116 -0
  39. package/coverage/utils/adapterUtils.ts.html +151 -0
  40. package/coverage/utils/analyticsUtils.ts.html +292 -0
  41. package/coverage/utils/arangodbUtils.ts.html +463 -0
  42. package/coverage/utils/index.html +146 -0
  43. package/dist/actions/apps.js +242 -0
  44. package/dist/actions/connections.js +90 -0
  45. package/dist/actions/conversations.js +350 -0
  46. package/dist/actions/dynamodb.js +150 -0
  47. package/dist/actions/email.js +152 -0
  48. package/dist/actions/files.js +283 -0
  49. package/dist/actions/groups.js +292 -0
  50. package/dist/actions/images.js +735 -0
  51. package/dist/actions/index.js +66 -0
  52. package/dist/actions/ios.js +164 -0
  53. package/dist/actions/locations.js +122 -0
  54. package/dist/actions/messages.js +208 -0
  55. package/dist/actions/notifications.js +59 -0
  56. package/dist/actions/payments.js +497 -0
  57. package/dist/actions/personas.js +110 -0
  58. package/dist/actions/posts.js +595 -0
  59. package/dist/actions/reactions.js +322 -0
  60. package/dist/actions/s3.js +133 -0
  61. package/dist/actions/search.js +90 -0
  62. package/dist/actions/sms.js +108 -0
  63. package/dist/actions/statistics.js +62 -0
  64. package/dist/actions/subscription.js +220 -0
  65. package/dist/actions/tags.js +292 -0
  66. package/dist/actions/users.js +784 -0
  67. package/dist/actions/websockets.js +174 -0
  68. package/dist/adapters/arangoAdapter.js +46 -0
  69. package/dist/adapters/fileAdapter.js +76 -0
  70. package/dist/adapters/imageAdapter.js +40 -0
  71. package/dist/adapters/messageAdapter.js +49 -0
  72. package/dist/adapters/postAdapter.js +70 -0
  73. package/dist/adapters/reaktorAdapter.js +44 -0
  74. package/dist/adapters/tagAdapter.js +50 -0
  75. package/dist/adapters/userAdapter.js +115 -0
  76. package/dist/config.js +125 -0
  77. package/dist/index.js +66 -0
  78. package/dist/lambdas/actions/websockets.js +132 -0
  79. package/dist/lambdas/authorizer.js +67 -0
  80. package/dist/lambdas/connection.js +91 -0
  81. package/dist/lambdas/utils/message.js +42 -0
  82. package/dist/lambdas/utils/websocket.js +105 -0
  83. package/dist/mocks/conversation.js +35 -0
  84. package/dist/mocks/file.js +38 -0
  85. package/dist/mocks/group.js +47 -0
  86. package/dist/mocks/image.js +44 -0
  87. package/dist/mocks/nlabs.png +0 -0
  88. package/dist/mocks/post.js +55 -0
  89. package/dist/mocks/tag.js +37 -0
  90. package/dist/mocks/user.js +88 -0
  91. package/dist/mutations/index.js +26 -0
  92. package/dist/mutations/locations.js +44 -0
  93. package/dist/mutations/messages.js +86 -0
  94. package/dist/mutations/personas.js +100 -0
  95. package/dist/mutations/posts.js +53 -0
  96. package/dist/mutations/reactions.js +51 -0
  97. package/dist/mutations/statistics.js +39 -0
  98. package/dist/mutations/subscriptions.js +56 -0
  99. package/dist/mutations/tags.js +120 -0
  100. package/dist/mutations/users.js +116 -0
  101. package/dist/objectTypes/app.js +173 -0
  102. package/dist/objectTypes/bankAccount.js +76 -0
  103. package/dist/objectTypes/connection.js +48 -0
  104. package/dist/objectTypes/conversation.js +77 -0
  105. package/dist/objectTypes/creditCard.js +86 -0
  106. package/dist/objectTypes/document.js +46 -0
  107. package/dist/objectTypes/error.js +46 -0
  108. package/dist/objectTypes/external.js +74 -0
  109. package/dist/objectTypes/file.js +100 -0
  110. package/dist/objectTypes/filter.js +43 -0
  111. package/dist/objectTypes/group.js +123 -0
  112. package/dist/objectTypes/iapSubscription.js +40 -0
  113. package/dist/objectTypes/image.js +129 -0
  114. package/dist/objectTypes/index.js +68 -0
  115. package/dist/objectTypes/location.js +109 -0
  116. package/dist/objectTypes/message.js +96 -0
  117. package/dist/objectTypes/passcode.js +42 -0
  118. package/dist/objectTypes/persona.js +87 -0
  119. package/dist/objectTypes/plan.js +95 -0
  120. package/dist/objectTypes/post.js +125 -0
  121. package/dist/objectTypes/reaction.js +61 -0
  122. package/dist/objectTypes/relation.js +49 -0
  123. package/dist/objectTypes/search.js +72 -0
  124. package/dist/objectTypes/statistics.js +39 -0
  125. package/dist/objectTypes/subscription.js +117 -0
  126. package/dist/objectTypes/tag.js +65 -0
  127. package/dist/objectTypes/user.js +144 -0
  128. package/dist/queries/index.js +33 -0
  129. package/dist/queries/locations.js +45 -0
  130. package/dist/queries/messages.js +52 -0
  131. package/dist/queries/posts.js +154 -0
  132. package/dist/queries/reactions.js +56 -0
  133. package/dist/queries/statistics.js +39 -0
  134. package/dist/queries/subscriptions.js +44 -0
  135. package/dist/queries/tags.js +75 -0
  136. package/dist/queries/users.js +64 -0
  137. package/dist/templates/email/layout.js +302 -0
  138. package/dist/templates/email/passwordForgot.js +38 -0
  139. package/dist/templates/email/passwordRecovery.js +35 -0
  140. package/dist/templates/email/verifyEmail.js +38 -0
  141. package/dist/templates/email/welcome.js +38 -0
  142. package/dist/templates/sms/passwordForgot.js +24 -0
  143. package/dist/templates/sms/passwordRecovery.js +24 -0
  144. package/dist/templates/sms/verifyEmail.js +24 -0
  145. package/dist/templates/sms/verifyPhone.js +24 -0
  146. package/dist/templates/sms/welcome.js +24 -0
  147. package/dist/types/apps.js +32 -0
  148. package/dist/types/arangodb.js +16 -0
  149. package/{lib → dist}/types/auth.js +1 -1
  150. package/{lib → dist}/types/connections.js +1 -1
  151. package/{lib → dist}/types/conversations.js +1 -1
  152. package/{lib → dist}/types/email.js +1 -1
  153. package/dist/types/error.js +44 -0
  154. package/{lib → dist}/types/files.js +1 -1
  155. package/dist/types/google.js +16 -0
  156. package/{lib → dist}/types/groups.js +1 -1
  157. package/dist/types/images.js +16 -0
  158. package/dist/types/index.js +60 -0
  159. package/{lib → dist}/types/locations.js +1 -1
  160. package/dist/types/messages.js +16 -0
  161. package/{lib → dist}/types/notifications.js +1 -1
  162. package/dist/types/payments.js +16 -0
  163. package/dist/types/personas.js +16 -0
  164. package/dist/types/posts.js +16 -0
  165. package/{lib → dist}/types/statistics.js +1 -1
  166. package/{lib → dist}/types/tags.js +1 -1
  167. package/dist/types/users.js +16 -0
  168. package/dist/types/websockets.js +16 -0
  169. package/dist/utils/adapterUtils.js +45 -0
  170. package/dist/utils/analyticsUtils.js +72 -0
  171. package/dist/utils/arangodbUtils.js +165 -0
  172. package/dist/utils/auth.js +57 -0
  173. package/dist/utils/index.js +30 -0
  174. package/dist/utils/session.js +60 -0
  175. package/jest.setup.js +0 -0
  176. package/jpg:- +0 -0
  177. package/lex.config.cjs +13 -0
  178. package/lib/actions/apps.d.ts +25 -0
  179. package/lib/actions/apps.js +242 -0
  180. package/lib/actions/connections.d.ts +4 -0
  181. package/lib/actions/connections.js +90 -0
  182. package/lib/actions/conversations.d.ts +12 -12
  183. package/lib/actions/conversations.js +147 -131
  184. package/lib/actions/dynamodb.d.ts +8 -8
  185. package/lib/actions/dynamodb.js +35 -32
  186. package/lib/actions/email.d.ts +3 -5
  187. package/lib/actions/email.js +33 -63
  188. package/lib/actions/files.d.ts +17 -14
  189. package/lib/actions/files.js +184 -202
  190. package/lib/actions/groups.d.ts +4 -4
  191. package/lib/actions/groups.js +47 -45
  192. package/lib/actions/images.d.ts +17 -13
  193. package/lib/actions/images.js +325 -264
  194. package/lib/actions/index.d.ts +3 -0
  195. package/lib/actions/index.js +7 -1
  196. package/lib/actions/ios.js +11 -10
  197. package/lib/actions/locations.d.ts +5 -2
  198. package/lib/actions/locations.js +41 -37
  199. package/lib/actions/messages.d.ts +4 -3
  200. package/lib/actions/messages.js +35 -32
  201. package/lib/actions/notifications.d.ts +2 -2
  202. package/lib/actions/notifications.js +1 -1
  203. package/lib/actions/payments.d.ts +2 -2
  204. package/lib/actions/payments.js +87 -83
  205. package/lib/actions/personas.d.ts +3 -0
  206. package/lib/actions/personas.js +110 -0
  207. package/lib/actions/posts.d.ts +11 -10
  208. package/lib/actions/posts.js +186 -152
  209. package/lib/actions/reactions.d.ts +5 -5
  210. package/lib/actions/reactions.js +30 -28
  211. package/lib/actions/s3.d.ts +7 -7
  212. package/lib/actions/s3.js +37 -32
  213. package/lib/actions/search.d.ts +3 -3
  214. package/lib/actions/search.js +13 -11
  215. package/lib/actions/sms.d.ts +9 -3
  216. package/lib/actions/sms.js +60 -34
  217. package/lib/actions/statistics.d.ts +3 -2
  218. package/lib/actions/statistics.js +21 -18
  219. package/lib/actions/subscription.d.ts +2 -2
  220. package/lib/actions/subscription.js +32 -39
  221. package/lib/actions/tags.d.ts +23 -20
  222. package/lib/actions/tags.js +161 -205
  223. package/lib/actions/users.d.ts +50 -22
  224. package/lib/actions/users.js +441 -217
  225. package/lib/actions/websockets.d.ts +19 -5
  226. package/lib/actions/websockets.js +89 -61
  227. package/lib/adapters/arangoAdapter.d.ts +2 -0
  228. package/lib/adapters/arangoAdapter.js +46 -0
  229. package/lib/adapters/fileAdapter.d.ts +3 -0
  230. package/lib/adapters/fileAdapter.js +76 -0
  231. package/lib/adapters/imageAdapter.d.ts +2 -0
  232. package/lib/adapters/imageAdapter.js +40 -0
  233. package/lib/adapters/messageAdapter.d.ts +2 -0
  234. package/lib/adapters/messageAdapter.js +49 -0
  235. package/lib/adapters/postAdapter.d.ts +2 -0
  236. package/lib/adapters/postAdapter.js +70 -0
  237. package/lib/adapters/reaktorAdapter.d.ts +6 -0
  238. package/lib/adapters/reaktorAdapter.js +44 -0
  239. package/lib/adapters/tagAdapter.d.ts +2 -0
  240. package/lib/adapters/tagAdapter.js +50 -0
  241. package/lib/adapters/userAdapter.d.ts +2 -0
  242. package/lib/adapters/userAdapter.js +115 -0
  243. package/lib/config.js +16 -17
  244. package/lib/index.d.ts +7 -0
  245. package/lib/index.js +44 -8
  246. package/lib/lambdas/actions/websockets.d.ts +7 -6
  247. package/lib/lambdas/actions/websockets.js +15 -11
  248. package/lib/lambdas/authorizer.js +4 -4
  249. package/lib/lambdas/connection.js +20 -20
  250. package/lib/lambdas/utils/message.js +1 -1
  251. package/lib/lambdas/utils/websocket.js +8 -7
  252. package/lib/mocks/conversation.d.ts +8 -0
  253. package/lib/mocks/conversation.js +35 -0
  254. package/lib/mocks/file.d.ts +11 -0
  255. package/lib/mocks/file.js +38 -0
  256. package/lib/mocks/group.d.ts +17 -0
  257. package/lib/mocks/group.js +47 -0
  258. package/lib/mocks/image.d.ts +3 -0
  259. package/lib/mocks/image.js +44 -0
  260. package/lib/mocks/nlabs.png +0 -0
  261. package/lib/mocks/post.d.ts +38 -0
  262. package/lib/mocks/post.js +55 -0
  263. package/lib/mocks/tag.d.ts +2 -0
  264. package/lib/mocks/tag.js +37 -0
  265. package/lib/mocks/user.d.ts +4 -0
  266. package/lib/mocks/user.js +88 -0
  267. package/lib/mutations/index.d.ts +3 -0
  268. package/lib/mutations/index.js +26 -0
  269. package/lib/mutations/locations.d.ts +2 -0
  270. package/lib/mutations/locations.js +44 -0
  271. package/lib/mutations/messages.d.ts +2 -0
  272. package/lib/mutations/messages.js +86 -0
  273. package/lib/mutations/personas.d.ts +2 -0
  274. package/lib/mutations/personas.js +100 -0
  275. package/lib/mutations/posts.d.ts +2 -0
  276. package/lib/mutations/posts.js +53 -0
  277. package/lib/mutations/reactions.d.ts +2 -0
  278. package/lib/mutations/reactions.js +51 -0
  279. package/lib/mutations/statistics.d.ts +2 -0
  280. package/lib/mutations/statistics.js +39 -0
  281. package/lib/mutations/subscriptions.d.ts +2 -0
  282. package/lib/mutations/subscriptions.js +56 -0
  283. package/lib/mutations/tags.d.ts +2 -0
  284. package/lib/mutations/tags.js +120 -0
  285. package/lib/mutations/users.d.ts +1 -0
  286. package/lib/mutations/users.js +116 -0
  287. package/lib/objectTypes/app.d.ts +3 -0
  288. package/lib/objectTypes/app.js +173 -0
  289. package/lib/objectTypes/bankAccount.d.ts +1 -0
  290. package/lib/objectTypes/bankAccount.js +76 -0
  291. package/lib/objectTypes/connection.d.ts +1 -0
  292. package/lib/objectTypes/connection.js +48 -0
  293. package/lib/objectTypes/conversation.d.ts +2 -0
  294. package/lib/objectTypes/conversation.js +77 -0
  295. package/lib/objectTypes/creditCard.d.ts +1 -0
  296. package/lib/objectTypes/creditCard.js +86 -0
  297. package/lib/objectTypes/document.d.ts +1 -0
  298. package/lib/objectTypes/document.js +46 -0
  299. package/lib/objectTypes/error.d.ts +1 -0
  300. package/lib/objectTypes/error.js +46 -0
  301. package/lib/objectTypes/external.d.ts +1 -0
  302. package/lib/objectTypes/external.js +74 -0
  303. package/lib/objectTypes/file.d.ts +2 -0
  304. package/lib/objectTypes/file.js +100 -0
  305. package/lib/objectTypes/filter.d.ts +1 -0
  306. package/lib/objectTypes/filter.js +43 -0
  307. package/lib/objectTypes/group.d.ts +3 -0
  308. package/lib/objectTypes/group.js +123 -0
  309. package/lib/objectTypes/iapSubscription.d.ts +1 -0
  310. package/lib/objectTypes/iapSubscription.js +40 -0
  311. package/lib/objectTypes/image.d.ts +2 -0
  312. package/lib/objectTypes/image.js +129 -0
  313. package/lib/objectTypes/index.d.ts +24 -0
  314. package/lib/objectTypes/index.js +68 -0
  315. package/lib/objectTypes/location.d.ts +2 -0
  316. package/lib/objectTypes/location.js +109 -0
  317. package/lib/objectTypes/message.d.ts +2 -0
  318. package/lib/objectTypes/message.js +96 -0
  319. package/lib/objectTypes/passcode.d.ts +1 -0
  320. package/lib/objectTypes/passcode.js +42 -0
  321. package/lib/objectTypes/persona.d.ts +3 -0
  322. package/lib/objectTypes/persona.js +87 -0
  323. package/lib/objectTypes/plan.d.ts +2 -0
  324. package/lib/objectTypes/plan.js +95 -0
  325. package/lib/objectTypes/post.d.ts +2 -0
  326. package/lib/objectTypes/post.js +125 -0
  327. package/lib/objectTypes/reaction.d.ts +2 -0
  328. package/lib/objectTypes/reaction.js +61 -0
  329. package/lib/objectTypes/relation.d.ts +1 -0
  330. package/lib/objectTypes/relation.js +49 -0
  331. package/lib/objectTypes/search.d.ts +1 -0
  332. package/lib/objectTypes/search.js +72 -0
  333. package/lib/objectTypes/statistics.d.ts +1 -0
  334. package/lib/objectTypes/statistics.js +39 -0
  335. package/lib/objectTypes/subscription.d.ts +2 -0
  336. package/lib/objectTypes/subscription.js +117 -0
  337. package/lib/objectTypes/tag.d.ts +2 -0
  338. package/lib/objectTypes/tag.js +65 -0
  339. package/lib/objectTypes/user.d.ts +4 -0
  340. package/lib/objectTypes/user.js +144 -0
  341. package/lib/queries/index.d.ts +3 -0
  342. package/lib/queries/index.js +33 -0
  343. package/lib/queries/locations.d.ts +2 -0
  344. package/lib/queries/locations.js +45 -0
  345. package/lib/queries/messages.d.ts +2 -0
  346. package/lib/queries/messages.js +52 -0
  347. package/lib/queries/posts.d.ts +2 -0
  348. package/lib/queries/posts.js +154 -0
  349. package/lib/queries/reactions.d.ts +2 -0
  350. package/lib/queries/reactions.js +56 -0
  351. package/lib/queries/statistics.d.ts +2 -0
  352. package/lib/queries/statistics.js +39 -0
  353. package/lib/queries/subscriptions.d.ts +2 -0
  354. package/lib/queries/subscriptions.js +44 -0
  355. package/lib/queries/tags.d.ts +2 -0
  356. package/lib/queries/tags.js +75 -0
  357. package/lib/queries/users.d.ts +1 -0
  358. package/lib/queries/users.js +64 -0
  359. package/lib/types/{apps.d.ts → apps.types.d.ts} +19 -17
  360. package/lib/types/apps.types.js +32 -0
  361. package/lib/types/arangodb.types.d.ts +34 -0
  362. package/lib/types/arangodb.types.js +16 -0
  363. package/lib/types/auth.types.d.ts +9 -0
  364. package/lib/types/auth.types.js +16 -0
  365. package/lib/types/connections.types.d.ts +5 -0
  366. package/lib/types/connections.types.js +16 -0
  367. package/lib/types/conversations.types.d.ts +27 -0
  368. package/lib/types/conversations.types.js +16 -0
  369. package/lib/types/email.types.d.ts +13 -0
  370. package/lib/types/email.types.js +16 -0
  371. package/lib/types/error.types.d.ts +20 -0
  372. package/lib/types/error.types.js +44 -0
  373. package/lib/types/{files.d.ts → files.types.d.ts} +9 -12
  374. package/lib/types/files.types.js +16 -0
  375. package/lib/types/google.types.d.ts +29 -0
  376. package/lib/types/google.types.js +16 -0
  377. package/lib/types/{groups.d.ts → groups.types.d.ts} +6 -10
  378. package/lib/types/groups.types.js +16 -0
  379. package/lib/types/images.types.d.ts +52 -0
  380. package/lib/types/images.types.js +16 -0
  381. package/lib/types/index.d.ts +20 -18
  382. package/lib/types/index.js +41 -37
  383. package/lib/types/{locations.d.ts → locations.types.d.ts} +4 -6
  384. package/lib/types/locations.types.js +16 -0
  385. package/lib/types/messages.types.d.ts +16 -0
  386. package/lib/types/messages.types.js +16 -0
  387. package/lib/types/notifications.types.d.ts +19 -0
  388. package/lib/types/notifications.types.js +16 -0
  389. package/lib/types/{payments.d.ts → payments.types.d.ts} +13 -19
  390. package/lib/types/payments.types.js +16 -0
  391. package/lib/types/personas.types.d.ts +32 -0
  392. package/lib/types/personas.types.js +16 -0
  393. package/lib/types/posts.types.d.ts +28 -0
  394. package/lib/types/posts.types.js +16 -0
  395. package/lib/types/statistics.types.d.ts +3 -0
  396. package/lib/types/statistics.types.js +16 -0
  397. package/lib/types/tags.types.d.ts +15 -0
  398. package/lib/types/tags.types.js +16 -0
  399. package/lib/types/{users.d.ts → users.types.d.ts} +21 -22
  400. package/lib/types/users.types.js +16 -0
  401. package/lib/types/{websocket.d.ts → websockets.types.d.ts} +7 -3
  402. package/lib/types/websockets.types.js +16 -0
  403. package/lib/utils/adapterUtils.d.ts +1 -0
  404. package/lib/utils/adapterUtils.js +45 -0
  405. package/lib/utils/analyticsUtils.d.ts +21 -0
  406. package/lib/utils/analyticsUtils.js +72 -0
  407. package/lib/utils/arangodbUtils.d.ts +66 -0
  408. package/lib/utils/arangodbUtils.js +165 -0
  409. package/lib/utils/auth.d.ts +19 -3
  410. package/lib/utils/auth.js +20 -30
  411. package/lib/utils/index.d.ts +3 -4
  412. package/lib/utils/index.js +7 -9
  413. package/lib/utils/session.d.ts +10 -10
  414. package/lib/utils/session.js +15 -3
  415. package/lib/utils/stripeUtils.d.ts +3 -0
  416. package/lib/utils/{graphql.js → stripeUtils.js} +12 -15
  417. package/package.json +38 -30
  418. package/lib/types/apps.js +0 -16
  419. package/lib/types/arangodb.d.ts +0 -17
  420. package/lib/types/arangodb.js +0 -16
  421. package/lib/types/auth.d.ts +0 -7
  422. package/lib/types/connections.d.ts +0 -8
  423. package/lib/types/conversations.d.ts +0 -16
  424. package/lib/types/email.d.ts +0 -12
  425. package/lib/types/google.d.ts +0 -27
  426. package/lib/types/google.js +0 -16
  427. package/lib/types/images.d.ts +0 -42
  428. package/lib/types/images.js +0 -16
  429. package/lib/types/messages.d.ts +0 -27
  430. package/lib/types/messages.js +0 -16
  431. package/lib/types/notifications.d.ts +0 -19
  432. package/lib/types/payments.js +0 -16
  433. package/lib/types/posts.d.ts +0 -47
  434. package/lib/types/posts.js +0 -16
  435. package/lib/types/statistics.d.ts +0 -3
  436. package/lib/types/tags.d.ts +0 -15
  437. package/lib/types/users.js +0 -16
  438. package/lib/types/websocket.js +0 -16
  439. package/lib/utils/analytics.d.ts +0 -14
  440. package/lib/utils/analytics.js +0 -88
  441. package/lib/utils/arangodb.d.ts +0 -9
  442. package/lib/utils/arangodb.js +0 -118
  443. package/lib/utils/graphql.d.ts +0 -1
  444. package/lib/utils/objects.d.ts +0 -3
  445. package/lib/utils/objects.js +0 -59
@@ -29,101 +29,110 @@ var tags_exports = {};
29
29
  __export(tags_exports, {
30
30
  addTag: () => addTag,
31
31
  addTagToItem: () => addTagToItem,
32
- createTag: () => createTag,
33
- createTagEdge: () => createTagEdge,
34
32
  deleteTag: () => deleteTag,
33
+ deleteTagFromEdge: () => deleteTagFromEdge,
35
34
  deleteTagFromItem: () => deleteTagFromItem,
36
35
  extractTags: () => extractTags,
37
36
  getTag: () => getTag,
38
37
  getTags: () => getTags,
39
38
  getTagsByItem: () => getTagsByItem,
40
- getTagsByOwner: () => getTagsByOwner,
41
- linkTags: () => linkTags,
42
- updateTag: () => updateTag
39
+ getTagsByName: () => getTagsByName,
40
+ updateTag: () => updateTag,
41
+ updateTagsInItem: () => updateTagsInItem
43
42
  });
44
43
  module.exports = __toCommonJS(tags_exports);
45
44
  var import_utils = require("@nlabs/utils");
46
45
  var import_arangojs = require("arangojs");
47
- var import_words = __toESM(require("lodash/words"));
48
- var import_utils2 = require("../utils");
46
+ var import_words = __toESM(require("lodash/words"), 1);
47
+ var import_tagAdapter = require("../adapters/tagAdapter");
48
+ var import_error = require("../types/error.types");
49
+ var import_analyticsUtils = require("../utils/analyticsUtils");
50
+ var import_arangodbUtils = require("../utils/arangodbUtils");
49
51
  const eventCategory = "tags";
50
- const getTags = (context, options) => {
52
+ const getTags = (context, options = {}) => {
51
53
  const action = "getList";
52
54
  const { database } = context;
53
- const { search = "", from = 0, to = 30 } = options;
54
- const limit = (0, import_utils2.getLimit)(from, to);
55
- const filter = search.length ? `FILTER LIKE(t.name, "%${search}%")` : "";
55
+ const { search = "", from = 0, to = 30, userId } = options;
56
+ const limit = (0, import_arangodbUtils.getLimit)(from, to);
57
+ const filters = [];
58
+ if (search) {
59
+ filters.push(`LIKE(t.name, "%${search}%")`);
60
+ }
61
+ if (userId) {
62
+ filters.push(`t.userId == "${userId}"`);
63
+ }
56
64
  const aqlQry = `FOR t IN tags
57
- ${filter}
65
+ FILTER ${filters.join(" || ")}
58
66
  ${limit.aql}
59
67
  SORT t.name
60
68
  RETURN t`;
61
- return database.query(aqlQry).then((cursor) => cursor.all()).then((list = []) => list).catch((error) => (0, import_utils2.logError)({
62
- action,
63
- category: eventCategory,
64
- label: "db_error"
65
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
69
+ return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
70
+ (0, import_analyticsUtils.logError)({
71
+ action,
72
+ category: eventCategory,
73
+ value: import_error.ErrorTypes.DATABASE_ERROR
74
+ }, error, {});
75
+ return [];
76
+ });
66
77
  };
67
- const getTagsByItem = (context, itemId, args) => {
68
- const action = "getList";
69
- const { from = 0, to = 30 } = args;
78
+ const getTagsByItem = (context, itemDocId, options = {}) => {
79
+ const action = "getTagsByItem";
80
+ const { from = 0, to = 30 } = options;
70
81
  const { database } = context;
71
- const limit = (0, import_utils2.getLimit)(from, to);
72
- const formatItemId = (0, import_utils.parseArangoId)(itemId);
82
+ const limit = (0, import_arangodbUtils.getLimit)(from, to);
83
+ const formatItemId = (0, import_utils.parseArangoId)(itemDocId);
73
84
  const tagQuery = `FOR t, it IN INBOUND "${formatItemId}" isTagged
74
85
  ${limit.aql}
75
86
  SORT it.added
76
87
  RETURN t`;
77
- return database.query(tagQuery).then((cursor) => cursor.all() || []).catch((error) => (0, import_utils2.logError)({
78
- action,
79
- category: eventCategory,
80
- label: "db_error"
81
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
82
- };
83
- const getTagsByOwner = (context, args) => {
84
- const action = "getList";
85
- const { from = 0, id, to = 30 } = args;
86
- const { database } = context;
87
- const limit = (0, import_utils2.getLimit)(from, to);
88
- const aqlQry = `FOR t IN tags
89
- FILTER t.userId == "${id}"
90
- ${limit.aql}
91
- SORT t.added
92
- RETURN t`;
93
- return database.query(aqlQry).then((cursor) => cursor.all()).then((list = []) => list).catch((error) => (0, import_utils2.logError)({
94
- action,
95
- category: eventCategory,
96
- label: "db_error"
97
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
88
+ return database.query(tagQuery).then((cursor) => cursor.all()).catch((error) => {
89
+ (0, import_analyticsUtils.logError)({
90
+ action,
91
+ category: eventCategory,
92
+ value: import_error.ErrorTypes.DATABASE_ERROR
93
+ }, error, {});
94
+ return [];
95
+ });
98
96
  };
99
97
  const getTag = (context, tagId) => {
100
- const action = "getItem";
98
+ const action = "getTag";
101
99
  const { database } = context;
102
- const formatId = JSON.stringify((0, import_utils.parseId)(tagId));
100
+ const formatId = (0, import_utils.parseId)(tagId);
103
101
  const aqlQry = `FOR t IN tags
104
- FILTER t._key == ${formatId}
102
+ FILTER t._key == "${formatId}"
105
103
  LIMIT 1
106
104
  RETURN t`;
107
- return database.query(aqlQry).then((cursor) => cursor.next()).then((tag = {}) => tag).catch((error) => (0, import_utils2.logError)({
105
+ return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
108
106
  action,
109
107
  category: eventCategory,
110
- label: "db_error"
111
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
108
+ value: import_error.ErrorTypes.DATABASE_ERROR
109
+ }, error, {}));
112
110
  };
113
- const addTag = (context, { tag }) => {
114
- const action = "addTag";
115
- const { database, session } = context;
116
- const { userAccess } = session;
117
- if (userAccess < 3) {
118
- return (0, import_utils2.logException)({
111
+ const getTagsByName = (context, tagNames) => {
112
+ const action = "getTagsByName";
113
+ const { database } = context;
114
+ const formatTagNames = tagNames.map((tagName) => (0, import_utils.parseVarChar)(tagName, 32)).filter((tagName) => !!tagName);
115
+ if (!formatTagNames.length) {
116
+ return Promise.resolve([]);
117
+ }
118
+ const aqlQry = import_arangojs.aql`FOR t IN tags
119
+ FILTER POSITION(${JSON.stringify(formatTagNames)}, t.name)
120
+ RETURN t`;
121
+ return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
122
+ (0, import_analyticsUtils.logError)({
119
123
  action,
120
124
  category: eventCategory,
121
- label: "db_error"
122
- }, session);
123
- }
125
+ value: import_error.ErrorTypes.DATABASE_ERROR
126
+ }, error, {});
127
+ return [];
128
+ });
129
+ };
130
+ const addTag = (context, tag) => {
131
+ const action = "addTag";
132
+ const { database } = context;
124
133
  const now = Date.now();
125
- const { description, name } = tag;
126
- const formatId = (0, import_utils.createHash)(`tag-${name.toLowercase()}`, null);
134
+ const { description, name } = (0, import_tagAdapter.parseTag)(tag);
135
+ const formatId = (0, import_utils.createHash)(`tag-${name.toLowerCase()}`, null);
127
136
  const insert = {
128
137
  _key: formatId,
129
138
  added: now,
@@ -132,205 +141,152 @@ const addTag = (context, { tag }) => {
132
141
  name: (0, import_utils.parseVarChar)(name, 32)
133
142
  };
134
143
  const aqlQry = import_arangojs.aql`INSERT ${insert} IN tags RETURN NEW`;
135
- return database.query(aqlQry).then((cursor) => cursor.next()).then((tag2 = {}) => tag2).catch((error) => (0, import_utils2.logError)({
144
+ return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
136
145
  action,
137
146
  category: eventCategory,
138
- label: "db_error"
139
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
147
+ value: import_error.ErrorTypes.DATABASE_ERROR
148
+ }, error, {}));
140
149
  };
141
- const addTagToItem = async (context, { itemId, tagId }) => {
150
+ const addTagToItem = async (context, { itemDocId, tagBy, tagDocId }) => {
142
151
  const action = "addTagToItem";
143
- const { database } = context;
152
+ const { database, session: { userId: sessionId } } = context;
144
153
  const added = Date.now();
145
- const formatTagId = (0, import_utils.parseArangoId)(tagId);
146
- const formatItemId = (0, import_utils.parseArangoId)(itemId);
147
- const edgeId = (0, import_utils.createHash)(`isTagged-${formatTagId}-${formatItemId}`, null);
154
+ const formatTagDocId = (0, import_utils.parseArangoId)(tagDocId);
155
+ const formatItemDocId = (0, import_utils.parseArangoId)(itemDocId);
156
+ const edgeId = (0, import_utils.createHash)(`isTagged-${formatTagDocId}-${formatItemDocId}`, null);
148
157
  const edgeCollection = database.collection("isTagged");
149
- const edge = { _from: formatTagId, _key: edgeId, _to: formatItemId, added };
150
- console.log({ edge });
151
- await edgeCollection.save(edge, { overwriteMode: "ignore", silent: true }).catch((error) => (0, import_utils2.logError)({
158
+ const type = formatItemDocId.split("/")[0];
159
+ const formatTagBy = (0, import_utils.parseId)(tagBy) || sessionId;
160
+ const edge = { _from: formatTagDocId, _key: edgeId, _to: formatItemDocId, added, tagBy: formatTagBy, type };
161
+ await edgeCollection.save(edge, { overwriteMode: "ignore", returnNew: true, silent: true }).catch((error) => (0, import_analyticsUtils.logError)({
152
162
  action,
153
163
  category: eventCategory,
154
- label: "db_error",
155
164
  params: {
156
165
  edge
157
- }
158
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
159
- const tagQuery = import_arangojs.aql`LET t = DOCUMENT(${formatTagId}) RETURN t`;
160
- return database.query(tagQuery).then((cursor) => cursor.next()).catch((error) => (0, import_utils2.logError)({
166
+ },
167
+ value: import_error.ErrorTypes.DATABASE_ERROR
168
+ }, error, {}));
169
+ const tagQuery = import_arangojs.aql`LET t = DOCUMENT(${formatTagDocId}) RETURN t`;
170
+ return database.query(tagQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
161
171
  action,
162
172
  category: eventCategory,
163
- label: "db_error",
164
173
  params: {
165
174
  edge
166
- }
167
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
175
+ },
176
+ value: import_error.ErrorTypes.DATABASE_ERROR
177
+ }, error, {}));
168
178
  };
169
- const updateTag = (context, item = {}) => {
170
- const action = "update";
171
- const { database, session } = context;
172
- const { userAccess } = session;
173
- if (userAccess < 3) {
174
- return (0, import_utils2.logException)({
175
- action,
176
- category: eventCategory,
177
- label: "db_error"
178
- }, session);
179
- }
179
+ const updateTag = (context, tag) => {
180
+ const action = "updateTag";
181
+ const { database, session: { userId: sessionId } } = context;
180
182
  const now = Date.now();
181
- const { description, id, name } = item;
183
+ const { description, name, tagId } = (0, import_tagAdapter.parseTag)(tag);
182
184
  const formatName = (0, import_utils.parseVarChar)(name, 32);
183
185
  const update = {
184
186
  description: (0, import_utils.parseVarChar)(description, 64),
185
187
  modified: now,
186
188
  name: formatName
187
189
  };
188
- const formatId = (0, import_utils.parseId)(id);
189
- const tagId = !formatId ? (0, import_utils.createHash)(`tag-${formatName.toLowerCase()}`, null) : formatId;
190
+ const newTagKey = tagId || (0, import_utils.createHash)(`tag-${formatName.toLowerCase()}`, null);
190
191
  const insert = {
191
192
  ...update,
192
- _key: tagId,
193
- added: now
193
+ _id: `tags/${newTagKey}`,
194
+ _key: newTagKey,
195
+ added: now,
196
+ tagBy: sessionId
194
197
  };
195
- const aqlQry = import_arangojs.aql`UPSERT {_key: ${tagId}}
198
+ const aqlQry = import_arangojs.aql`UPSERT {name: ${formatName}}
196
199
  INSERT ${insert}
197
200
  UPDATE ${update}
198
201
  IN tags RETURN NEW`;
199
- return database.query(aqlQry).then((cursor) => cursor.next()).then((tag = {}) => tag).catch((error) => (0, import_utils2.logError)({
202
+ return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
200
203
  action,
201
204
  category: eventCategory,
202
- label: "db_error"
203
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
205
+ value: import_error.ErrorTypes.DATABASE_ERROR
206
+ }, error, {}));
204
207
  };
205
- const deleteTag = (context, { tagId }) => {
208
+ const deleteTag = async (context, tag) => {
206
209
  const action = "deleteTag";
207
- const { database, session } = context;
208
- const { userAccess } = session;
209
- if (userAccess < 3) {
210
- return (0, import_utils2.logException)({
211
- action,
212
- category: eventCategory,
213
- label: "db_error"
214
- }, session);
215
- }
216
- const formatTagId = (0, import_utils.parseId)(tagId);
217
- const aqlQry = import_arangojs.aql`FOR t IN tags
218
- FILTER t._key == ${formatTagId}
210
+ const { database } = context;
211
+ const formatItemId = (0, import_arangodbUtils.getDocId)("tags", tag);
212
+ const tagQuery = `FOR it FROM isTagged
213
+ FILTER it._from == "${formatItemId}" || it._to == "${formatItemId}"
214
+ REMOVE it IN isTagged
215
+ RETURN OLD`;
216
+ await database.query(tagQuery).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
217
+ action,
218
+ category: eventCategory,
219
+ value: import_error.ErrorTypes.DATABASE_ERROR
220
+ }, error, {}));
221
+ const aqlQry = `LET t = DOCUMENT(${formatItemId})
219
222
  REMOVE t IN tags
220
223
  RETURN OLD`;
221
- return database.query(aqlQry).then((cursor) => cursor.next()).then((tag = {}) => tag).catch((error) => (0, import_utils2.logError)({
224
+ return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
222
225
  action,
223
226
  category: eventCategory,
224
- label: "db_error"
225
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
227
+ value: import_error.ErrorTypes.DATABASE_ERROR
228
+ }, error, {}));
226
229
  };
227
- const deleteTagFromItem = async (context, { itemId, tagId }) => {
228
- const action = "deleteTagFromItem";
230
+ const deleteTagFromEdge = async (context, { tagDocId, edgeDocId }) => {
231
+ const action = "deleteTagFromEdge";
229
232
  const { database } = context;
230
- const formatTagId = (0, import_utils.parseArangoId)(tagId);
231
- const formatItemId = (0, import_utils.parseArangoId)(itemId);
232
- const edgeId = (0, import_utils.createHash)(`isTagged-${formatTagId}-${formatItemId}`, null);
233
+ const formatTagDocId = (0, import_utils.parseArangoId)(tagDocId);
234
+ const formatEdgeDocId = (0, import_utils.parseArangoId)(edgeDocId);
233
235
  const edgeCollection = database.collection("isTagged");
234
- const edge = { _key: edgeId };
235
- await edgeCollection.remove(edge, { silent: true }).catch((error) => (0, import_utils2.logError)({
236
+ const edge = { _id: formatEdgeDocId };
237
+ await edgeCollection.remove(edge, { silent: true }).catch((error) => (0, import_analyticsUtils.logError)({
236
238
  action,
237
239
  category: eventCategory,
238
- label: "db_error"
239
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
240
- const tagQuery = import_arangojs.aql`LET t = DOCUMENT(${tagId}) RETURN t`;
241
- return database.query(tagQuery).then((cursor) => cursor.next()).catch((error) => (0, import_utils2.logError)({
240
+ value: import_error.ErrorTypes.DATABASE_ERROR
241
+ }, error, {}));
242
+ const tagQuery = import_arangojs.aql`LET t = DOCUMENT(${formatTagDocId}) RETURN t`;
243
+ return database.query(tagQuery).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
242
244
  action,
243
245
  category: eventCategory,
244
- label: "db_error"
245
- }, error, {}).then(() => null).catch((error2) => Promise.reject(error2)));
246
+ value: import_error.ErrorTypes.DATABASE_ERROR
247
+ }, error, {}));
246
248
  };
247
- const createTag = (db, tagName) => {
248
- const tagId = (0, import_utils.createHash)(`tag-${tagName.toLowerCase()}`, null);
249
- const insert = {
250
- _key: tagId,
251
- added: Date.now(),
252
- name: tagName
253
- };
254
- const aqlQry = import_arangojs.aql`UPSERT {_key: ${tagId}}
255
- INSERT ${insert}
256
- UPDATE {}
257
- IN tags RETURN NEW`;
258
- return db.query(aqlQry).then((cursor) => cursor.next()).then((tag = {}) => tag).catch((error) => {
259
- throw error;
260
- });
261
- };
262
- const createTagEdge = (db, tag, itemId) => {
263
- const edgeCollection = db.collection("isTagged");
264
- const { _id: tagId } = tag;
265
- const edgeId = (0, import_utils.createHash)(`isTagged-${tagId}-${itemId}`);
266
- const type = itemId.split("/")[0];
267
- const edge = {
268
- _from: tagId,
269
- _key: edgeId,
270
- _to: itemId,
271
- added: Date.now(),
272
- type
273
- };
274
- return edgeCollection.save(edge, { returnNew: true }).then(() => tag);
275
- };
276
- const linkTags = async (db, tagNames, itemId) => {
277
- const edgeCollection = db.collection("isTagged");
278
- const edges = await edgeCollection.inEdges(itemId, {});
279
- console.log({ edges });
280
- if (edges.length) {
281
- await Promise.all(
282
- edges.map((edge) => {
283
- const { _key: edgeKey } = edge;
284
- const aqlQry = import_arangojs.aql`REMOVE {_key:${edgeKey}} IN isTagged`;
285
- return db.query(aqlQry);
286
- })
287
- );
288
- }
289
- return Promise.all(
290
- tagNames.map((tagName) => createTag(db, tagName).then((tag) => createTagEdge(db, tag, itemId)))
291
- );
249
+ const deleteTagFromItem = async (context, { tagId, itemId, itemType }) => {
250
+ const action = "deleteTagFromItem";
251
+ const { database } = context;
252
+ const formatTagDocId = (0, import_utils.parseArangoId)(`tags/${tagId}`);
253
+ const formatItemDocId = (0, import_utils.parseArangoId)(`${itemType}/${itemId}`);
254
+ const aqlQuery = `FOR it FROM isTagged
255
+ FILTER it._from == "${formatTagDocId}" || it._to == "${formatItemDocId}"
256
+ REMOVE it IN isTagged`;
257
+ return database.query(aqlQuery).then(() => true).catch((error) => (0, import_analyticsUtils.logError)({
258
+ action,
259
+ category: eventCategory,
260
+ value: import_error.ErrorTypes.DATABASE_ERROR
261
+ }, error, {}));
292
262
  };
293
- const extractTags = (db, itemId, content) => {
294
- const tags = (0, import_words.default)(content, /#[a-zA-Z\d-]+/g).map((tag) => (0, import_utils.parseId)(tag));
295
- const edgeCollection = db.collection("isTagged");
296
- return edgeCollection.inEdges(itemId, {}).then((edges) => {
297
- if (edges.length) {
298
- return Promise.all(
299
- edges.map((edge) => {
300
- const { _key: edgeKey } = edge;
301
- const aqlQry = import_arangojs.aql`REMOVE {_key:${edgeKey}} IN isTagged`;
302
- return db.query(aqlQry).catch((error) => {
303
- throw error;
304
- });
305
- })
306
- ).then(() => {
307
- if (tags.length) {
308
- return linkTags(db, tags, itemId);
309
- }
310
- return [];
311
- });
312
- } else if (tags.length) {
313
- return linkTags(db, tags, itemId);
314
- }
315
- return [];
316
- }).catch((error) => {
317
- throw error;
318
- });
263
+ const extractTags = (content) => (0, import_words.default)(content, /#[a-zA-Z\d-]+/g).map((tag) => (0, import_utils.parseId)(tag));
264
+ const updateTagsInItem = (context, { itemDocId, tags }) => {
265
+ const action = "updateTagsInItem";
266
+ const { database } = context;
267
+ const edgeCollection = database.collection("isTagged");
268
+ return edgeCollection.inEdges(itemDocId, {}).then((edges) => Promise.all([
269
+ ...edges.filter(({ name: existingTagName }) => !tags.find(({ name: tagName }) => existingTagName === tagName)).map(({ _id: edgeDocId, _from: tagDocId }) => deleteTagFromEdge(context, { edgeDocId, tagDocId })),
270
+ ...tags.filter(({ name: tagName }) => !edges.find(({ name: existingTagName }) => existingTagName === tagName)).map(({ _id: tagDocId, tagBy }) => addTagToItem(context, { itemDocId, tagBy, tagDocId }))
271
+ ]).then(() => tags)).catch((error) => (0, import_analyticsUtils.logError)({
272
+ action,
273
+ category: eventCategory,
274
+ value: import_error.ErrorTypes.DATABASE_ERROR
275
+ }, error, {}));
319
276
  };
320
277
  // Annotate the CommonJS export names for ESM import in node:
321
278
  0 && (module.exports = {
322
279
  addTag,
323
280
  addTagToItem,
324
- createTag,
325
- createTagEdge,
326
281
  deleteTag,
282
+ deleteTagFromEdge,
327
283
  deleteTagFromItem,
328
284
  extractTags,
329
285
  getTag,
330
286
  getTags,
331
287
  getTagsByItem,
332
- getTagsByOwner,
333
- linkTags,
334
- updateTag
288
+ getTagsByName,
289
+ updateTag,
290
+ updateTagsInItem
335
291
  });
336
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdGFncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VBcmFuZ29JZCwgcGFyc2VJZCwgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWwsIERhdGFiYXNlfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbic7XG5pbXBvcnQge0FycmF5Q3Vyc29yfSBmcm9tICdhcmFuZ29qcy9jdXJzb3InO1xuaW1wb3J0IHdvcmRzIGZyb20gJ2xvZGFzaC93b3Jkcyc7XG5cbmltcG9ydCB7QXJhbmdvREJMaW1pdH0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGInO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoJztcbmltcG9ydCB7VGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMvdGFncyc7XG5pbXBvcnQge2dldExpbWl0LCBsb2dFcnJvciwgbG9nRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICd0YWdzJztcbmV4cG9ydCBpbnRlcmZhY2UgVGFnT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNlYXJjaD86IHN0cmluZztcbiAgcmVhZG9ubHkgZnJvbT86IG51bWJlcjtcbiAgcmVhZG9ubHkgdG8/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRUYWdzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBvcHRpb25zPzogVGFnT3B0aW9uc1xuKTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7c2VhcmNoID0gJycsIGZyb20gPSAwLCB0byA9IDMwfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EQkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICBjb25zdCBmaWx0ZXI6IHN0cmluZyA9IHNlYXJjaC5sZW5ndGggPyBgRklMVEVSIExJS0UodC5uYW1lLCBcIiUke3NlYXJjaH0lXCIpYCA6ICcnO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgJHtmaWx0ZXJ9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCB0Lm5hbWVcbiAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChsaXN0ID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWdzQnlJdGVtID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nLCAgYXJncyk6IFByb21pc2U8VGFnVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3QnO1xuICBjb25zdCB7ZnJvbSA9IDAsIHRvID0gMzB9ID0gYXJncztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGxpbWl0OiBBcmFuZ29EQkxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcblxuICBjb25zdCB0YWdRdWVyeTogc3RyaW5nID0gYEZPUiB0LCBpdCBJTiBJTkJPVU5EIFwiJHtmb3JtYXRJdGVtSWR9XCIgaXNUYWdnZWRcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGl0LmFkZGVkXG4gICAgUkVUVVJOIHRgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeSh0YWdRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIHx8IFtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGFnc0J5T3duZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgYXJncyk6IFByb21pc2U8VGFnVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3QnO1xuICBjb25zdCB7ZnJvbSA9IDAsIGlkLCB0byA9IDMwfSA9IGFyZ3M7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvREJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiB0LnVzZXJJZCA9PSBcIiR7aWR9XCJcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHQuYWRkZWRcbiAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKChsaXN0ID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWcgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdGFnSWQ6IHN0cmluZyk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShwYXJzZUlkKHRhZ0lkKSk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB0IElOIHRhZ3NcbiAgICBGSUxURVIgdC5fa2V5ID09ICR7Zm9ybWF0SWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB0YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh0YWcgPSB7fSkgPT4gdGFnKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHt0YWd9KTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFRhZyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbn0gPSBjb250ZXh0O1xuICBjb25zdCB7dXNlckFjY2Vzc30gPSBzZXNzaW9uO1xuXG4gIGlmKHVzZXJBY2Nlc3MgPCAzKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgc2Vzc2lvbik7XG4gIH1cblxuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IHtkZXNjcmlwdGlvbiwgbmFtZX0gPSB0YWc7XG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGB0YWctJHtuYW1lLnRvTG93ZXJjYXNlKCl9YCwgbnVsbCk7XG5cbiAgY29uc3QgaW5zZXJ0OiBhbnkgPSB7XG4gICAgX2tleTogZm9ybWF0SWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBkZXNjcmlwdGlvbjogcGFyc2VWYXJDaGFyKGRlc2NyaXB0aW9uLCA2NCksXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBuYW1lOiBwYXJzZVZhckNoYXIobmFtZSwgMzIpXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHRhZ3MgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodGFnOiBUYWdUeXBlID0ge30pID0+IHRhZylcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIGVycm9yLCB7fSkudGhlbigoKSA9PiBudWxsKS5jYXRjaCgoZXJyb3IpID0+IFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFRhZ1RvSXRlbSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB7aXRlbUlkLCB0YWdJZH0pOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkVGFnVG9JdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFkZGVkOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRUYWdJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZCh0YWdJZCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYGlzVGFnZ2VkLSR7Zm9ybWF0VGFnSWR9LSR7Zm9ybWF0SXRlbUlkfWAsIG51bGwpO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSBkYXRhYmFzZS5jb2xsZWN0aW9uKCdpc1RhZ2dlZCcpO1xuICBjb25zdCBlZGdlOiBhbnkgPSB7X2Zyb206IGZvcm1hdFRhZ0lkLCBfa2V5OiBlZGdlSWQsIF90bzogZm9ybWF0SXRlbUlkLCBhZGRlZH07XG4gIGNvbnNvbGUubG9nKHtlZGdlfSk7XG4gIGF3YWl0IGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge292ZXJ3cml0ZU1vZGU6ICdpZ25vcmUnLCBzaWxlbnQ6IHRydWV9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGVkZ2VcbiAgICAgIH1cbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcblxuXG4gIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdCA9IERPQ1VNRU5UKCR7Zm9ybWF0VGFnSWR9KSBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHRhZ1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGVkZ2VcbiAgICAgIH1cbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUYWcgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogVGFnVHlwZSA9IHt9KTogUHJvbWlzZTxUYWdUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbn0gPSBjb250ZXh0O1xuICBjb25zdCB7dXNlckFjY2Vzc30gPSBzZXNzaW9uO1xuXG4gIGlmKHVzZXJBY2Nlc3MgPCAzKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgc2Vzc2lvbik7XG4gIH1cblxuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gIGNvbnN0IHtkZXNjcmlwdGlvbiwgaWQsIG5hbWV9ID0gaXRlbTtcbiAgY29uc3QgZm9ybWF0TmFtZTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKG5hbWUsIDMyKTtcblxuICBjb25zdCB1cGRhdGU6IFRhZ1R5cGUgPSB7XG4gICAgZGVzY3JpcHRpb246IHBhcnNlVmFyQ2hhcihkZXNjcmlwdGlvbiwgNjQpLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogZm9ybWF0TmFtZVxuICB9O1xuXG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBwYXJzZUlkKGlkKTtcbiAgY29uc3QgdGFnSWQ6IHN0cmluZyA9ICFmb3JtYXRJZCA/IGNyZWF0ZUhhc2goYHRhZy0ke2Zvcm1hdE5hbWUudG9Mb3dlckNhc2UoKX1gLCBudWxsKSA6IGZvcm1hdElkO1xuXG4gIGNvbnN0IGluc2VydDogVGFnVHlwZSA9IHtcbiAgICAuLi51cGRhdGUsXG4gICAgX2tleTogdGFnSWQsXG4gICAgYWRkZWQ6IG5vd1xuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHt0YWdJZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiB0YWdzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHRhZyA9IHt9KSA9PiB0YWcpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVUYWcgPSAoY29udGV4dDogQXBpQ29udGV4dCwge3RhZ0lkfSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb259ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJBY2Nlc3N9ID0gc2Vzc2lvbjtcblxuICBpZih1c2VyQWNjZXNzIDwgMykge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ2RiX2Vycm9yJ1xuICAgIH0sIHNlc3Npb24pO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0VGFnSWQ6IHN0cmluZyA9IHBhcnNlSWQodGFnSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIHRhZ3NcbiAgICBGSUxURVIgdC5fa2V5ID09ICR7Zm9ybWF0VGFnSWR9XG4gICAgUkVNT1ZFIHQgSU4gdGFnc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHRhZzogVGFnVHlwZSA9IHt9KSA9PiB0YWcpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVUYWdGcm9tSXRlbSA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB7aXRlbUlkLCB0YWdJZH0pOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZGVsZXRlVGFnRnJvbUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQodGFnSWQpO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBpc1RhZ2dlZC0ke2Zvcm1hdFRhZ0lkfS0ke2Zvcm1hdEl0ZW1JZH1gLCBudWxsKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaXNUYWdnZWQnKTtcbiAgY29uc3QgZWRnZTogYW55ID0ge19rZXk6IGVkZ2VJZH07XG5cbiAgYXdhaXQgZWRnZUNvbGxlY3Rpb24ucmVtb3ZlKGVkZ2UsIHtzaWxlbnQ6IHRydWV9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIHt9KS50aGVuKCgpID0+IG51bGwpLmNhdGNoKChlcnJvcikgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5cbiAgY29uc3QgdGFnUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB0ID0gRE9DVU1FTlQoJHt0YWdJZH0pIFJFVFVSTiB0YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkodGFnUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwge30pLnRoZW4oKCkgPT4gbnVsbCkuY2F0Y2goKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUYWcgPSAoZGI6IERhdGFiYXNlLCB0YWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgdGFnSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHRhZy0ke3RhZ05hbWUudG9Mb3dlckNhc2UoKX1gLCBudWxsKTtcbiAgY29uc3QgaW5zZXJ0OiBUYWdUeXBlID0ge1xuICAgIF9rZXk6IHRhZ0lkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIG5hbWU6IHRhZ05hbWVcbiAgfTtcblxuICBjb25zdCBhcWxRcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke3RhZ0lkfX1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFIHt9XG4gICAgSU4gdGFncyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh0YWcgPSB7fSkgPT4gdGFnKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUYWdFZGdlID0gKGRiOiBEYXRhYmFzZSwgdGFnOiBUYWdUeXBlLCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IGRiLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG4gIGNvbnN0IHtfaWQ6IHRhZ0lkfSA9IHRhZztcbiAgY29uc3QgZWRnZUlkID0gY3JlYXRlSGFzaChgaXNUYWdnZWQtJHt0YWdJZH0tJHtpdGVtSWR9YCk7XG4gIGNvbnN0IHR5cGU6IHN0cmluZyA9IGl0ZW1JZC5zcGxpdCgnLycpWzBdO1xuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2Zyb206IHRhZ0lkLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGl0ZW1JZCxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICB0eXBlXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pLnRoZW4oKCkgPT4gdGFnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBsaW5rVGFncyA9IGFzeW5jIChkYjogRGF0YWJhc2UsIHRhZ05hbWVzOiBzdHJpbmdbXSwgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT4ge1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IGRiLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG4gIGNvbnN0IGVkZ2VzOiBhbnkgPSBhd2FpdCBlZGdlQ29sbGVjdGlvbi5pbkVkZ2VzKGl0ZW1JZCwge30pO1xuXG4gIGNvbnNvbGUubG9nKHtlZGdlc30pO1xuICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICBjb25zdCB7X2tleTogZWRnZUtleX0gPSBlZGdlO1xuICAgICAgICBjb25zdCBhcWxRcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGlzVGFnZ2VkYDtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwodGFnTmFtZXMubWFwKCh0YWdOYW1lOiBzdHJpbmcpID0+IGNyZWF0ZVRhZyhkYiwgdGFnTmFtZSlcbiAgICAudGhlbigodGFnOiBUYWdUeXBlKSA9PiBjcmVhdGVUYWdFZGdlKGRiLCB0YWcsIGl0ZW1JZCkpKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYWdzID0gKGRiOiBEYXRhYmFzZSwgaXRlbUlkLCBjb250ZW50KTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgdGFnczogc3RyaW5nW10gPSB3b3Jkcyhjb250ZW50LCAvI1thLXpBLVpcXGQtXSsvZykubWFwKCh0YWc6IHN0cmluZykgPT4gcGFyc2VJZCh0YWcpKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSBkYi5jb2xsZWN0aW9uKCdpc1RhZ2dlZCcpO1xuXG4gIHJldHVybiBlZGdlQ29sbGVjdGlvbi5pbkVkZ2VzKGl0ZW1JZCwge30pXG4gICAgLnRoZW4oKGVkZ2VzOiBhbnkpID0+IHtcbiAgICAgIGlmKGVkZ2VzLmxlbmd0aCkge1xuICAgICAgICAvLyBSZW1vdmUgbGlua2VkIGVkZ2VzXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtfa2V5OiBlZGdlS2V5fSA9IGVkZ2U7XG4gICAgICAgICAgICBjb25zdCBhcWxRcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGlzVGFnZ2VkYDtcbiAgICAgICAgICAgIHJldHVybiBkYi5xdWVyeShhcWxRcnkpLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZih0YWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAvLyBDcmVhdGUgdGFnc1xuICAgICAgICAgICAgICByZXR1cm4gbGlua1RhZ3MoZGIsIHRhZ3MsIGl0ZW1JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYodGFncy5sZW5ndGgpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRhZ3NcbiAgICAgICAgcmV0dXJuIGxpbmtUYWdzKGRiLCB0YWdzLCBpdGVtSWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSxtQkFBK0Q7QUFDL0Qsc0JBQTRCO0FBSTVCLG1CQUFrQjtBQUtsQixJQUFBQSxnQkFBK0M7QUFFL0MsTUFBTSxnQkFBd0I7QUFPdkIsTUFBTSxVQUFVLENBQ3JCLFNBQ0EsWUFDdUI7QUFDdkIsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsU0FBUSxJQUFJO0FBQ25CLFFBQU0sRUFBQyxTQUFTLElBQUksT0FBTyxHQUFHLEtBQUssR0FBRSxJQUFJO0FBQ3pDLFFBQU0sWUFBdUIsd0JBQVMsTUFBTSxFQUFFO0FBQzlDLFFBQU0sU0FBaUIsT0FBTyxTQUFTLHlCQUF5QixNQUFNLFFBQVE7QUFDOUUsUUFBTSxTQUFpQjtBQUFBLE1BQ25CLE1BQU07QUFBQSxNQUNOLE1BQU0sR0FBRztBQUFBO0FBQUE7QUFJYixTQUFPLFNBQVMsTUFBTSxNQUFNLEVBQ3pCLEtBQUssQ0FBQyxXQUF3QixPQUFPLElBQUksQ0FBQyxFQUMxQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUN4QixNQUFNLENBQUMsY0FBaUIsd0JBQVM7QUFB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LENBQUMsQ0FBQztBQUUxRCxVQUFRLElBQUksRUFBQyxNQUFLLENBQUM7QUFDbkIsTUFBRyxNQUFNLFFBQVE7QUFDZixVQUFNLFFBQVE7QUFBQSxNQUNaLE1BQU0sSUFBSSxDQUFDLFNBQVM7QUFDbEIsY0FBTSxFQUFDLE1BQU0sUUFBTyxJQUFJO0FBQ3hCLGNBQU0sU0FBUyxtQ0FBbUIsT0FBTztBQUN6QyxlQUFPLEdBQUcsTUFBTSxNQUFNO0FBQUEsTUFDeEIsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBRUEsU0FBTyxRQUFRO0FBQUEsSUFBSSxTQUFTLElBQUksQ0FBQyxZQUFvQixVQUFVLElBQUksT0FBTyxFQUN2RSxLQUFLLENBQUMsUUFBaUIsY0FBYyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7QUFBQSxFQUN6RDtBQUNGO0FBRU8sTUFBTSxjQUFjLENBQUMsSUFBYyxRQUFRLFlBQWdDO0FBQ2hGLFFBQU0sV0FBaUIsYUFBQUUsU0FBTSxTQUFTLGdCQUFnQixFQUFFLElBQUksQ0FBQyxZQUFnQixzQkFBUSxHQUFHLENBQUM7QUFDekYsUUFBTSxpQkFBaUIsR0FBRyxXQUFXLFVBQVU7QUFFL0MsU0FBTyxlQUFlLFFBQVEsUUFBUSxDQUFDLENBQUMsRUFDckMsS0FBSyxDQUFDLFVBQWU7QUFDcEIsUUFBRyxNQUFNLFFBQVE7QUFFZixhQUFPLFFBQVE7QUFBQSxRQUNiLE1BQU0sSUFBSSxDQUFDLFNBQVM7QUFDbEIsZ0JBQU0sRUFBQyxNQUFNLFFBQU8sSUFBSTtBQUN4QixnQkFBTSxTQUFTLG1DQUFtQixPQUFPO0FBQ3pDLGlCQUFPLEdBQUcsTUFBTSxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQWlCO0FBQzlDLGtCQUFNO0FBQUEsVUFDUixDQUFDO0FBQUEsUUFDSCxDQUFDO0FBQUEsTUFBQyxFQUNELEtBQUssTUFBTTtBQUNWLFlBQUcsS0FBSyxRQUFRO0FBRWQsaUJBQU8sU0FBUyxJQUFJLE1BQU0sTUFBTTtBQUFBLFFBQ2xDO0FBQ0EsZUFBTyxDQUFDO0FBQUEsTUFDVixDQUFDO0FBQUEsSUFDTCxXQUFVLEtBQUssUUFBUTtBQUVyQixhQUFPLFNBQVMsSUFBSSxNQUFNLE1BQU07QUFBQSxJQUNsQztBQUNBLFdBQU8sQ0FBQztBQUFBLEVBQ1YsQ0FBQyxFQUNBLE1BQU0sQ0FBQyxVQUFpQjtBQUN2QixVQUFNO0FBQUEsRUFDUixDQUFDO0FBQ0w7IiwKICAibmFtZXMiOiBbImltcG9ydF91dGlscyIsICJlcnJvciIsICJ0YWciLCAid29yZHMiXQp9Cg==
292
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdGFncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VBcmFuZ29JZCwgcGFyc2VJZCwgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2V9IGZyb20gJ2FyYW5nb2pzL2RvY3VtZW50cyc7XG5pbXBvcnQgd29yZHMgZnJvbSAnbG9kYXNoL3dvcmRzJztcblxuaW1wb3J0IHtwYXJzZVRhZ30gZnJvbSAnLi4vYWRhcHRlcnMvdGFnQWRhcHRlcic7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0fSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzJztcblxuaW1wb3J0IHR5cGUge0FyYW5nb0RiTGltaXR9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzJztcbmltcG9ydCB0eXBlIHtJc1RhZ2dlZFR5cGUsIFRhZ1R5cGV9IGZyb20gJy4uL3R5cGVzL3RhZ3MudHlwZXMnO1xuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICd0YWdzJztcbmV4cG9ydCBpbnRlcmZhY2UgVGFnT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZyb20/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlYXJjaD86IHN0cmluZztcbiAgcmVhZG9ubHkgdG8/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVzZXJJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG9wdGlvbnM6IFRhZ09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCB7c2VhcmNoID0gJycsIGZyb20gPSAwLCB0byA9IDMwLCB1c2VySWR9ID0gb3B0aW9ucztcbiAgY29uc3QgbGltaXQ6IEFyYW5nb0RiTGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbXTtcblxuICBpZihzZWFyY2gpIHtcbiAgICBmaWx0ZXJzLnB1c2goYExJS0UodC5uYW1lLCBcIiUke3NlYXJjaH0lXCIpYCk7XG4gIH1cblxuICBpZih1c2VySWQpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHQudXNlcklkID09IFwiJHt1c2VySWR9XCJgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB0IElOIHRhZ3NcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHQubmFtZVxuICAgIFJFVFVSTiB0YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFRhZ1R5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIHt9KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFRhZ1R5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWdzQnlJdGVtID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpdGVtRG9jSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogVGFnT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFRhZ1R5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRUYWdzQnlJdGVtJztcbiAgY29uc3Qge2Zyb20gPSAwLCB0byA9IDMwfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBsaW1pdDogQXJhbmdvRGJMaW1pdCA9IGdldExpbWl0KGZyb20sIHRvKTtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1Eb2NJZCk7XG4gIGNvbnN0IHRhZ1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHQsIGl0IElOIElOQk9VTkQgXCIke2Zvcm1hdEl0ZW1JZH1cIiBpc1RhZ2dlZFxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgaXQuYWRkZWRcbiAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHRhZ1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFRhZ1R5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIHt9KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFRhZ1R5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYWcgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdGFnSWQ6IHN0cmluZyk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQodGFnSWQpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgRklMVEVSIHQuX2tleSA9PSBcIiR7Zm9ybWF0SWR9XCJcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHRgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRhZ3NCeU5hbWUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdGFnTmFtZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxUYWdUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VGFnc0J5TmFtZSc7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRUYWdOYW1lcyA9IHRhZ05hbWVzXG4gICAgLm1hcCgodGFnTmFtZSkgPT4gcGFyc2VWYXJDaGFyKHRhZ05hbWUsIDMyKSlcbiAgICAuZmlsdGVyKCh0YWdOYW1lKSA9PiAhIXRhZ05hbWUpO1xuXG4gIGlmKCFmb3JtYXRUYWdOYW1lcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFRhZ05hbWVzKX0sIHQubmFtZSlcbiAgICBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBUYWdUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCB7fSk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBUYWdUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVGFnID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZzogVGFnVHlwZSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7ZGVzY3JpcHRpb24sIG5hbWV9ID0gcGFyc2VUYWcodGFnKTtcbiAgY29uc3QgZm9ybWF0SWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHRhZy0ke25hbWUudG9Mb3dlckNhc2UoKX1gLCBudWxsKTtcbiAgY29uc3QgaW5zZXJ0OiBUYWdUeXBlID0ge1xuICAgIF9rZXk6IGZvcm1hdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgZGVzY3JpcHRpb246IHBhcnNlVmFyQ2hhcihkZXNjcmlwdGlvbiwgNjQpLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VWYXJDaGFyKG5hbWUsIDMyKVxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdGFncyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRUYWdUb0l0ZW0gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtpdGVtRG9jSWQsIHRhZ0J5LCB0YWdEb2NJZH06IHtpdGVtRG9jSWQ6IHN0cmluZywgdGFnQnk/OiBzdHJpbmcsIHRhZ0RvY0lkOiBzdHJpbmd9XG4pOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkVGFnVG9JdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFkZGVkOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmb3JtYXRUYWdEb2NJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZCh0YWdEb2NJZCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1Eb2NJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtRG9jSWQpO1xuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYGlzVGFnZ2VkLSR7Zm9ybWF0VGFnRG9jSWR9LSR7Zm9ybWF0SXRlbURvY0lkfWAsIG51bGwpO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSBkYXRhYmFzZS5jb2xsZWN0aW9uKCdpc1RhZ2dlZCcpO1xuICBjb25zdCB0eXBlOiBzdHJpbmcgPSBmb3JtYXRJdGVtRG9jSWQuc3BsaXQoJy8nKVswXTtcbiAgY29uc3QgZm9ybWF0VGFnQnk6IHN0cmluZyA9IHBhcnNlSWQodGFnQnkpIHx8IHNlc3Npb25JZDtcbiAgY29uc3QgZWRnZTogRWRnZSA9IHtfZnJvbTogZm9ybWF0VGFnRG9jSWQsIF9rZXk6IGVkZ2VJZCwgX3RvOiBmb3JtYXRJdGVtRG9jSWQsIGFkZGVkLCB0YWdCeTogZm9ybWF0VGFnQnksIHR5cGV9O1xuXG4gIGF3YWl0IGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge292ZXJ3cml0ZU1vZGU6ICdpZ25vcmUnLCByZXR1cm5OZXc6IHRydWUsIHNpbGVudDogdHJ1ZX0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGVkZ2VcbiAgICAgIH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xuXG4gIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdCA9IERPQ1VNRU5UKCR7Zm9ybWF0VGFnRG9jSWR9KSBSRVRVUk4gdGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHRhZ1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGVkZ2VcbiAgICAgIH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhZyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0YWc6IFRhZ1R5cGUpOiBQcm9taXNlPFRhZ1R5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAndXBkYXRlVGFnJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge2Rlc2NyaXB0aW9uLCBuYW1lLCB0YWdJZH0gPSBwYXJzZVRhZyh0YWcpO1xuICBjb25zdCBmb3JtYXROYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIobmFtZSwgMzIpO1xuICBjb25zdCB1cGRhdGU6IFRhZ1R5cGUgPSB7XG4gICAgZGVzY3JpcHRpb246IHBhcnNlVmFyQ2hhcihkZXNjcmlwdGlvbiwgNjQpLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogZm9ybWF0TmFtZVxuICB9O1xuICBjb25zdCBuZXdUYWdLZXk6IHN0cmluZyA9IHRhZ0lkIHx8IGNyZWF0ZUhhc2goYHRhZy0ke2Zvcm1hdE5hbWUudG9Mb3dlckNhc2UoKX1gLCBudWxsKTtcbiAgY29uc3QgaW5zZXJ0OiBUYWdUeXBlID0ge1xuICAgIC4uLnVwZGF0ZSxcbiAgICBfaWQ6IGB0YWdzLyR7bmV3VGFnS2V5fWAsXG4gICAgX2tleTogbmV3VGFnS2V5LFxuICAgIGFkZGVkOiBub3csXG4gICAgdGFnQnk6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7bmFtZTogJHtmb3JtYXROYW1lfX1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFICR7dXBkYXRlfVxuICAgIElOIHRhZ3MgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFnID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRhZzogVGFnVHlwZSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVUYWcnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkID0gZ2V0RG9jSWQoJ3RhZ3MnLCB0YWcpO1xuICBjb25zdCB0YWdRdWVyeTogc3RyaW5nID0gYEZPUiBpdCBGUk9NIGlzVGFnZ2VkXG4gICAgRklMVEVSIGl0Ll9mcm9tID09IFwiJHtmb3JtYXRJdGVtSWR9XCIgfHwgaXQuX3RvID09IFwiJHtmb3JtYXRJdGVtSWR9XCJcbiAgICBSRU1PVkUgaXQgSU4gaXNUYWdnZWRcbiAgICBSRVRVUk4gT0xEYDtcblxuICBhd2FpdCBkYXRhYmFzZS5xdWVyeSh0YWdRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcblxuICBjb25zdCBhcWxRcnkgPSBgTEVUIHQgPSBET0NVTUVOVCgke2Zvcm1hdEl0ZW1JZH0pXG4gICAgUkVNT1ZFIHQgSU4gdGFnc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVRhZ0Zyb21FZGdlID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHt0YWdEb2NJZCwgZWRnZURvY0lkfSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlVGFnRnJvbUVkZ2UnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnRG9jSWQgPSBwYXJzZUFyYW5nb0lkKHRhZ0RvY0lkKTtcbiAgY29uc3QgZm9ybWF0RWRnZURvY0lkID0gcGFyc2VBcmFuZ29JZChlZGdlRG9jSWQpO1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSBkYXRhYmFzZS5jb2xsZWN0aW9uKCdpc1RhZ2dlZCcpO1xuICBjb25zdCBlZGdlID0ge19pZDogZm9ybWF0RWRnZURvY0lkfTtcblxuICBhd2FpdCBlZGdlQ29sbGVjdGlvbi5yZW1vdmUoZWRnZSwge3NpbGVudDogdHJ1ZX0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge30pKTtcblxuICBjb25zdCB0YWdRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHQgPSBET0NVTUVOVCgke2Zvcm1hdFRhZ0RvY0lkfSkgUkVUVVJOIHRgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeSh0YWdRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVGFnRnJvbUl0ZW0gPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge3RhZ0lkLCBpdGVtSWQsIGl0ZW1UeXBlfSk6IFByb21pc2U8VGFnVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlVGFnRnJvbUl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnRG9jSWQgPSBwYXJzZUFyYW5nb0lkKGB0YWdzLyR7dGFnSWR9YCk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1Eb2NJZCA9IHBhcnNlQXJhbmdvSWQoYCR7aXRlbVR5cGV9LyR7aXRlbUlkfWApO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIGl0IEZST00gaXNUYWdnZWRcbiAgICBGSUxURVIgaXQuX2Zyb20gPT0gXCIke2Zvcm1hdFRhZ0RvY0lkfVwiIHx8IGl0Ll90byA9PSBcIiR7Zm9ybWF0SXRlbURvY0lkfVwiXG4gICAgUkVNT1ZFIGl0IElOIGlzVGFnZ2VkYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7fSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RUYWdzID0gKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gIHdvcmRzKGNvbnRlbnQsIC8jW2EtekEtWlxcZC1dKy9nKS5tYXAoKHRhZzogc3RyaW5nKSA9PiBwYXJzZUlkKHRhZykpO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVGFnc0luSXRlbSA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB7aXRlbURvY0lkLCB0YWdzfSk6IFByb21pc2U8VGFnVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVUYWdzSW5JdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaXNUYWdnZWQnKSBhcyBFZGdlQ29sbGVjdGlvbjxUYWdUeXBlPjtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uaW5FZGdlcyhpdGVtRG9jSWQsIHt9KVxuICAgIC50aGVuKChlZGdlcykgPT4gUHJvbWlzZS5hbGwoW1xuICAgICAgLi4uKGVkZ2VzIGFzIHVua25vd24gYXMgSXNUYWdnZWRUeXBlW10pXG4gICAgICAgIC5maWx0ZXIoKHtuYW1lOiBleGlzdGluZ1RhZ05hbWV9KSA9PiAhdGFncy5maW5kKCh7bmFtZTogdGFnTmFtZX0pID0+IGV4aXN0aW5nVGFnTmFtZSA9PT0gdGFnTmFtZSkpXG4gICAgICAgIC5tYXAoKHtfaWQ6IGVkZ2VEb2NJZCwgX2Zyb206IHRhZ0RvY0lkfSkgPT4gZGVsZXRlVGFnRnJvbUVkZ2UoY29udGV4dCwge2VkZ2VEb2NJZCwgdGFnRG9jSWR9KSksXG4gICAgICAuLi4odGFncyBhcyB1bmtub3duIGFzIFRhZ1R5cGVbXSlcbiAgICAgICAgLmZpbHRlcigoe25hbWU6IHRhZ05hbWV9KSA9PiAhKGVkZ2VzIGFzIHVua25vd24gYXMgSXNUYWdnZWRUeXBlW10pXG4gICAgICAgICAgLmZpbmQoKHtuYW1lOiBleGlzdGluZ1RhZ05hbWV9KSA9PiBleGlzdGluZ1RhZ05hbWUgPT09IHRhZ05hbWUpKVxuICAgICAgICAubWFwKCh7X2lkOiB0YWdEb2NJZCwgdGFnQnl9KSA9PiBhZGRUYWdUb0l0ZW0oY29udGV4dCwge2l0ZW1Eb2NJZCwgdGFnQnksIHRhZ0RvY0lkfSkpXG4gICAgXSlcbiAgICAgIC50aGVuKCgpID0+IHRhZ3MpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHt9KSk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSxtQkFBK0Q7QUFDL0Qsc0JBQWtCO0FBR2xCLG1CQUFrQjtBQUVsQix3QkFBdUI7QUFDdkIsbUJBQXlCO0FBQ3pCLDRCQUF1QjtBQUN2QiwyQkFBaUM7QUFPakMsTUFBTSxnQkFBd0I7QUFRdkIsTUFBTSxVQUFVLENBQ3JCLFNBQ0EsVUFBc0IsQ0FBQyxNQUNBO0FBQ3ZCLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUNuQixRQUFNLEVBQUMsU0FBUyxJQUFJLE9BQU8sR0FBRyxLQUFLLElBQUksT0FBTSxJQUFJO0FBQ2pELFFBQU0sWUFBdUIsK0JBQVMsTUFBTSxFQUFFO0FBRTlDLFFBQU0sVUFBb0IsQ0FBQztBQUUzQixNQUFHLFFBQVE7QUFDVCxZQUFRLEtBQUssa0JBQWtCLE1BQU0sS0FBSztBQUFBLEVBQzVDO0FBRUEsTUFBRyxRQUFRO0FBQ1QsWUFBUSxLQUFLLGdC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