@nlabs/reaktor 1.4.1 → 1.5.1

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 (419) hide show
  1. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/apps.d.ts +1 -2
  2. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/connections.d.ts +0 -1
  3. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/content.d.ts +0 -1
  4. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/conversations.d.ts +0 -1
  5. package/lib/Users/nitrog7/Development/reaktor/src/actions/crm.d.ts +28 -0
  6. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/crud.d.ts +0 -1
  7. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/dynamodb.d.ts +0 -1
  8. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/email.d.ts +0 -1
  9. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/files.d.ts +0 -1
  10. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/groups.d.ts +0 -1
  11. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/images.d.ts +0 -1
  12. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/index.d.ts +2 -1
  13. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/ios.d.ts +0 -1
  14. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/locations.d.ts +0 -1
  15. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/messages.d.ts +0 -1
  16. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/notifications.d.ts +0 -1
  17. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/payments.d.ts +0 -1
  18. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/personas.d.ts +1 -2
  19. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/posts.d.ts +0 -1
  20. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/query.d.ts +0 -1
  21. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/reactions.d.ts +0 -1
  22. package/lib/Users/nitrog7/Development/reaktor/src/actions/rum.d.ts +3 -0
  23. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/s3.d.ts +0 -1
  24. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/search.d.ts +0 -1
  25. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/sms.d.ts +0 -1
  26. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/statistics.d.ts +0 -1
  27. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/subscriptions.d.ts +0 -1
  28. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/tags.d.ts +0 -1
  29. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/users.d.ts +2 -3
  30. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/videos.d.ts +0 -1
  31. package/lib/{actions → Users/nitrog7/Development/reaktor/src/actions}/websockets.d.ts +0 -1
  32. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/arangoAdapter.d.ts +0 -1
  33. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/contentAdapter.d.ts +0 -1
  34. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/fileAdapter.d.ts +0 -1
  35. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/imageAdapter.d.ts +0 -1
  36. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/index.d.ts +0 -1
  37. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/messageAdapter.d.ts +0 -1
  38. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/postAdapter.d.ts +0 -1
  39. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/reaktorAdapter.d.ts +0 -1
  40. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/tagAdapter.d.ts +0 -1
  41. package/lib/{adapters → Users/nitrog7/Development/reaktor/src/adapters}/userAdapter.d.ts +0 -1
  42. package/lib/{config.d.ts → Users/nitrog7/Development/reaktor/src/config.d.ts} +0 -1
  43. package/lib/Users/nitrog7/Development/reaktor/src/constants/collections.d.ts +86 -0
  44. package/lib/{handlers → Users/nitrog7/Development/reaktor/src/handlers}/graphqlHandler.d.ts +0 -1
  45. package/lib/{index.d.ts → Users/nitrog7/Development/reaktor/src/index.d.ts} +0 -1
  46. package/lib/{lambdas → Users/nitrog7/Development/reaktor/src/lambdas}/actions/websockets.d.ts +0 -1
  47. package/lib/{lambdas → Users/nitrog7/Development/reaktor/src/lambdas}/authorizer.d.ts +0 -1
  48. package/lib/{lambdas → Users/nitrog7/Development/reaktor/src/lambdas}/connection.d.ts +4 -5
  49. package/lib/{lambdas → Users/nitrog7/Development/reaktor/src/lambdas}/utils/message.d.ts +0 -1
  50. package/lib/{lambdas → Users/nitrog7/Development/reaktor/src/lambdas}/utils/websocket.d.ts +0 -1
  51. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/conversation.d.ts +1 -2
  52. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/file.d.ts +0 -1
  53. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/group.d.ts +0 -1
  54. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/image.d.ts +0 -1
  55. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/post.d.ts +1 -2
  56. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/tag.d.ts +0 -1
  57. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/user.d.ts +0 -1
  58. package/lib/{mocks → Users/nitrog7/Development/reaktor/src/mocks}/video.d.ts +0 -1
  59. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/content/content.d.ts +0 -1
  60. package/lib/Users/nitrog7/Development/reaktor/src/mutations/crm/crm.d.ts +1 -0
  61. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/events/events.d.ts +0 -1
  62. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/groups/groups.d.ts +0 -1
  63. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/images/images.d.ts +0 -1
  64. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/index.d.ts +3 -2
  65. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/locations/locations.d.ts +0 -1
  66. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/messages/messages.d.ts +0 -1
  67. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/personas/personas.d.ts +0 -1
  68. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/posts/posts.d.ts +0 -1
  69. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/reactions/reactions.d.ts +0 -1
  70. package/lib/Users/nitrog7/Development/reaktor/src/mutations/rum/rum.d.ts +1 -0
  71. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/statistics/statistics.d.ts +0 -1
  72. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/subscriptions/subscriptions.d.ts +0 -1
  73. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/tags/tags.d.ts +0 -1
  74. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/users/users.d.ts +0 -1
  75. package/lib/{mutations → Users/nitrog7/Development/reaktor/src/mutations}/videos/videos.d.ts +0 -1
  76. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/app.d.ts +0 -1
  77. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/bankAccount.d.ts +0 -1
  78. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/connection.d.ts +0 -1
  79. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/content.d.ts +0 -1
  80. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/conversation.d.ts +0 -1
  81. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/creditCard.d.ts +0 -1
  82. package/lib/Users/nitrog7/Development/reaktor/src/objectTypes/crm.d.ts +12 -0
  83. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/document.d.ts +0 -1
  84. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/error.d.ts +0 -1
  85. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/event.d.ts +0 -1
  86. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/external.d.ts +0 -1
  87. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/file.d.ts +0 -1
  88. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/filter.d.ts +0 -1
  89. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/group.d.ts +0 -1
  90. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/iapSubscription.d.ts +0 -1
  91. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/image.d.ts +0 -1
  92. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/index.d.ts +2 -1
  93. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/location.d.ts +0 -1
  94. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/message.d.ts +0 -1
  95. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/passcode.d.ts +0 -1
  96. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/persona.d.ts +0 -1
  97. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/plan.d.ts +0 -1
  98. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/post.d.ts +0 -1
  99. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/query.d.ts +0 -1
  100. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/reaction.d.ts +0 -1
  101. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/relation.d.ts +0 -1
  102. package/lib/Users/nitrog7/Development/reaktor/src/objectTypes/rum.d.ts +3 -0
  103. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/search.d.ts +0 -1
  104. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/statistics.d.ts +0 -1
  105. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/subscription.d.ts +0 -1
  106. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/tag.d.ts +0 -1
  107. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/user.d.ts +0 -1
  108. package/lib/{objectTypes → Users/nitrog7/Development/reaktor/src/objectTypes}/video.d.ts +0 -1
  109. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/content/content.d.ts +0 -1
  110. package/lib/Users/nitrog7/Development/reaktor/src/queries/crm/crm.d.ts +1 -0
  111. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/events/events.d.ts +0 -1
  112. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/groups/groups.d.ts +0 -1
  113. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/images/images.d.ts +0 -1
  114. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/index.d.ts +2 -2
  115. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/locations/locations.d.ts +0 -1
  116. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/messages/messages.d.ts +0 -1
  117. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/personas/personas.d.ts +0 -1
  118. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/posts/posts.d.ts +0 -1
  119. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/query/query.d.ts +0 -1
  120. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/reactions/reactions.d.ts +0 -1
  121. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/statistics/statistics.d.ts +0 -1
  122. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/subscriptions/subscriptions.d.ts +0 -1
  123. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/tags/tags.d.ts +0 -1
  124. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/users/users.d.ts +0 -1
  125. package/lib/{queries → Users/nitrog7/Development/reaktor/src/queries}/videos/videos.d.ts +0 -1
  126. package/lib/Users/nitrog7/Development/reaktor/src/templates/email/layout.d.ts +2 -0
  127. package/lib/Users/nitrog7/Development/reaktor/src/templates/email/passwordForgot.d.ts +2 -0
  128. package/lib/Users/nitrog7/Development/reaktor/src/templates/email/passwordRecovery.d.ts +2 -0
  129. package/lib/Users/nitrog7/Development/reaktor/src/templates/email/verifyEmail.d.ts +2 -0
  130. package/lib/Users/nitrog7/Development/reaktor/src/templates/email/welcome.d.ts +2 -0
  131. package/lib/Users/nitrog7/Development/reaktor/src/templates/sms/passwordForgot.d.ts +2 -0
  132. package/lib/Users/nitrog7/Development/reaktor/src/templates/sms/passwordRecovery.d.ts +2 -0
  133. package/lib/Users/nitrog7/Development/reaktor/src/templates/sms/verifyEmail.d.ts +2 -0
  134. package/lib/Users/nitrog7/Development/reaktor/src/templates/sms/verifyPhone.d.ts +2 -0
  135. package/lib/Users/nitrog7/Development/reaktor/src/templates/sms/welcome.d.ts +2 -0
  136. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/apps.types.d.ts +0 -1
  137. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/arangodb.types.d.ts +1 -2
  138. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/auth.types.d.ts +0 -1
  139. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/connections.types.d.ts +2 -3
  140. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/content.types.d.ts +0 -1
  141. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/conversations.types.d.ts +0 -1
  142. package/lib/Users/nitrog7/Development/reaktor/src/types/crm.types.d.ts +89 -0
  143. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/email.types.d.ts +0 -1
  144. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/error.types.d.ts +0 -1
  145. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/files.types.d.ts +0 -1
  146. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/google.types.d.ts +0 -1
  147. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/groups.types.d.ts +0 -1
  148. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/images.types.d.ts +0 -1
  149. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/index.d.ts +2 -1
  150. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/locations.types.d.ts +0 -1
  151. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/messages.types.d.ts +0 -1
  152. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/notifications.types.d.ts +0 -1
  153. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/payments.types.d.ts +0 -1
  154. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/personas.types.d.ts +0 -1
  155. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/posts.types.d.ts +0 -1
  156. package/lib/Users/nitrog7/Development/reaktor/src/types/rum.types.d.ts +23 -0
  157. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/statistics.types.d.ts +0 -1
  158. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/tags.types.d.ts +0 -1
  159. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/users.types.d.ts +20 -1
  160. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/videos.types.d.ts +0 -1
  161. package/lib/{types → Users/nitrog7/Development/reaktor/src/types}/websockets.types.d.ts +0 -1
  162. package/lib/{upload.d.ts → Users/nitrog7/Development/reaktor/src/upload.d.ts} +0 -1
  163. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/adapterUtils.d.ts +0 -1
  164. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/analyticsUtils.d.ts +0 -1
  165. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/aqlHelpers.d.ts +4 -1
  166. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/arangodbUtils.d.ts +0 -1
  167. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/authUtils.d.ts +0 -1
  168. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/awsUtils.d.ts +0 -1
  169. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/collectionRegistry.d.ts +0 -1
  170. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/contextUtils.d.ts +0 -1
  171. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/dbI18n.d.ts +0 -1
  172. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/dbI18n.example.d.ts +0 -1
  173. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/googleTranslate.d.ts +0 -1
  174. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/graphqlUtils.d.ts +1 -2
  175. package/lib/Users/nitrog7/Development/reaktor/src/utils/imageUtils.d.ts +1 -0
  176. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/index.d.ts +0 -1
  177. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/languageDetection.d.ts +0 -1
  178. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/localeUtils.d.ts +0 -1
  179. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/localeUtils.example.d.ts +1 -1
  180. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/middlewareUtils.d.ts +0 -1
  181. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/queryBuilder.d.ts +0 -1
  182. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/schemaUtils.d.ts +0 -1
  183. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/sessionUtils.d.ts +0 -1
  184. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/stripeUtils.d.ts +1 -2
  185. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/templateUtils.d.ts +0 -1
  186. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/testUtils.d.ts +0 -1
  187. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/translationQueue.d.ts +0 -1
  188. package/lib/{utils → Users/nitrog7/Development/reaktor/src/utils}/translationQueue.example.d.ts +0 -1
  189. package/lib/{videoProcessing.d.ts → Users/nitrog7/Development/reaktor/src/videoProcessing.d.ts} +2 -3
  190. package/lib/actions/apps.js +2 -2
  191. package/lib/actions/content.js +1 -2
  192. package/lib/actions/crm.js +498 -0
  193. package/lib/actions/crud.js +1 -1
  194. package/lib/actions/groups.js +2 -2
  195. package/lib/actions/images.js +3 -10
  196. package/lib/actions/index.js +3 -1
  197. package/lib/actions/locations.js +1 -2
  198. package/lib/actions/posts.js +3 -3
  199. package/lib/actions/rum.js +66 -0
  200. package/lib/actions/search.js +30 -53
  201. package/lib/actions/users.js +124 -160
  202. package/lib/adapters/messageAdapter.js +7 -5
  203. package/lib/adapters/userAdapter.js +42 -2
  204. package/lib/constants/collections.js +17 -1
  205. package/lib/mocks/image.js +3 -3
  206. package/lib/mocks/video.js +3 -3
  207. package/lib/mutations/crm/crm.js +67 -0
  208. package/lib/mutations/index.js +12 -2
  209. package/lib/mutations/rum/rum.js +20 -0
  210. package/lib/objectTypes/crm.js +188 -0
  211. package/lib/objectTypes/index.js +3 -1
  212. package/lib/objectTypes/persona.js +3 -2
  213. package/lib/objectTypes/rum.js +33 -0
  214. package/lib/objectTypes/user.js +83 -2
  215. package/lib/queries/crm/crm.js +77 -0
  216. package/lib/queries/index.js +7 -2
  217. package/lib/queries/videos/videos.js +1 -1
  218. package/lib/types/apps.types.js +1 -1
  219. package/lib/types/arangodb.types.js +1 -1
  220. package/lib/types/crm.types.js +6 -0
  221. package/lib/types/index.js +3 -1
  222. package/lib/types/rum.types.js +6 -0
  223. package/lib/types/users.types.js +1 -1
  224. package/lib/utils/aqlHelpers.js +13 -2
  225. package/lib/utils/collectionRegistry.js +18 -1
  226. package/lib/utils/imageUtils.js +6 -0
  227. package/lib/utils/localeUtils.example.js +3 -4
  228. package/lib/utils/stripeUtils.js +2 -2
  229. package/package.json +53 -39
  230. package/lib/actions/apps.d.ts.map +0 -1
  231. package/lib/actions/connections.d.ts.map +0 -1
  232. package/lib/actions/content.d.ts.map +0 -1
  233. package/lib/actions/conversations.d.ts.map +0 -1
  234. package/lib/actions/crud.d.ts.map +0 -1
  235. package/lib/actions/dynamodb.d.ts.map +0 -1
  236. package/lib/actions/email.d.ts.map +0 -1
  237. package/lib/actions/files.d.ts.map +0 -1
  238. package/lib/actions/groups.d.ts.map +0 -1
  239. package/lib/actions/images.d.ts.map +0 -1
  240. package/lib/actions/index.d.ts.map +0 -1
  241. package/lib/actions/ios.d.ts.map +0 -1
  242. package/lib/actions/locations.d.ts.map +0 -1
  243. package/lib/actions/messages.d.ts.map +0 -1
  244. package/lib/actions/notifications.d.ts.map +0 -1
  245. package/lib/actions/payments.d.ts.map +0 -1
  246. package/lib/actions/personas.d.ts.map +0 -1
  247. package/lib/actions/posts.d.ts.map +0 -1
  248. package/lib/actions/query.d.ts.map +0 -1
  249. package/lib/actions/reactions.d.ts.map +0 -1
  250. package/lib/actions/s3.d.ts.map +0 -1
  251. package/lib/actions/search.d.ts.map +0 -1
  252. package/lib/actions/sms.d.ts.map +0 -1
  253. package/lib/actions/statistics.d.ts.map +0 -1
  254. package/lib/actions/subscriptions.d.ts.map +0 -1
  255. package/lib/actions/tags.d.ts.map +0 -1
  256. package/lib/actions/users.d.ts.map +0 -1
  257. package/lib/actions/videos.d.ts.map +0 -1
  258. package/lib/actions/websockets.d.ts.map +0 -1
  259. package/lib/adapters/arangoAdapter.d.ts.map +0 -1
  260. package/lib/adapters/contentAdapter.d.ts.map +0 -1
  261. package/lib/adapters/fileAdapter.d.ts.map +0 -1
  262. package/lib/adapters/imageAdapter.d.ts.map +0 -1
  263. package/lib/adapters/index.d.ts.map +0 -1
  264. package/lib/adapters/messageAdapter.d.ts.map +0 -1
  265. package/lib/adapters/postAdapter.d.ts.map +0 -1
  266. package/lib/adapters/reaktorAdapter.d.ts.map +0 -1
  267. package/lib/adapters/tagAdapter.d.ts.map +0 -1
  268. package/lib/adapters/userAdapter.d.ts.map +0 -1
  269. package/lib/config.d.ts.map +0 -1
  270. package/lib/constants/collections.d.ts +0 -71
  271. package/lib/constants/collections.d.ts.map +0 -1
  272. package/lib/handlers/graphqlHandler.d.ts.map +0 -1
  273. package/lib/index.d.ts.map +0 -1
  274. package/lib/lambdas/actions/websockets.d.ts.map +0 -1
  275. package/lib/lambdas/authorizer.d.ts.map +0 -1
  276. package/lib/lambdas/connection.d.ts.map +0 -1
  277. package/lib/lambdas/utils/message.d.ts.map +0 -1
  278. package/lib/lambdas/utils/websocket.d.ts.map +0 -1
  279. package/lib/mocks/conversation.d.ts.map +0 -1
  280. package/lib/mocks/file.d.ts.map +0 -1
  281. package/lib/mocks/group.d.ts.map +0 -1
  282. package/lib/mocks/image.d.ts.map +0 -1
  283. package/lib/mocks/post.d.ts.map +0 -1
  284. package/lib/mocks/tag.d.ts.map +0 -1
  285. package/lib/mocks/user.d.ts.map +0 -1
  286. package/lib/mocks/video.d.ts.map +0 -1
  287. package/lib/mutations/content/content.d.ts.map +0 -1
  288. package/lib/mutations/events/events.d.ts.map +0 -1
  289. package/lib/mutations/groups/groups.d.ts.map +0 -1
  290. package/lib/mutations/images/images.d.ts.map +0 -1
  291. package/lib/mutations/index.d.ts.map +0 -1
  292. package/lib/mutations/locations/locations.d.ts.map +0 -1
  293. package/lib/mutations/messages/messages.d.ts.map +0 -1
  294. package/lib/mutations/personas/personas.d.ts.map +0 -1
  295. package/lib/mutations/posts/posts.d.ts.map +0 -1
  296. package/lib/mutations/reactions/reactions.d.ts.map +0 -1
  297. package/lib/mutations/statistics/statistics.d.ts.map +0 -1
  298. package/lib/mutations/subscriptions/subscriptions.d.ts.map +0 -1
  299. package/lib/mutations/tags/tags.d.ts.map +0 -1
  300. package/lib/mutations/users/users.d.ts.map +0 -1
  301. package/lib/mutations/videos/videos.d.ts.map +0 -1
  302. package/lib/objectTypes/app.d.ts.map +0 -1
  303. package/lib/objectTypes/bankAccount.d.ts.map +0 -1
  304. package/lib/objectTypes/connection.d.ts.map +0 -1
  305. package/lib/objectTypes/content.d.ts.map +0 -1
  306. package/lib/objectTypes/conversation.d.ts.map +0 -1
  307. package/lib/objectTypes/creditCard.d.ts.map +0 -1
  308. package/lib/objectTypes/document.d.ts.map +0 -1
  309. package/lib/objectTypes/error.d.ts.map +0 -1
  310. package/lib/objectTypes/event.d.ts.map +0 -1
  311. package/lib/objectTypes/external.d.ts.map +0 -1
  312. package/lib/objectTypes/file.d.ts.map +0 -1
  313. package/lib/objectTypes/filter.d.ts.map +0 -1
  314. package/lib/objectTypes/group.d.ts.map +0 -1
  315. package/lib/objectTypes/iapSubscription.d.ts.map +0 -1
  316. package/lib/objectTypes/image.d.ts.map +0 -1
  317. package/lib/objectTypes/index.d.ts.map +0 -1
  318. package/lib/objectTypes/location.d.ts.map +0 -1
  319. package/lib/objectTypes/message.d.ts.map +0 -1
  320. package/lib/objectTypes/passcode.d.ts.map +0 -1
  321. package/lib/objectTypes/persona.d.ts.map +0 -1
  322. package/lib/objectTypes/plan.d.ts.map +0 -1
  323. package/lib/objectTypes/post.d.ts.map +0 -1
  324. package/lib/objectTypes/query.d.ts.map +0 -1
  325. package/lib/objectTypes/reaction.d.ts.map +0 -1
  326. package/lib/objectTypes/relation.d.ts.map +0 -1
  327. package/lib/objectTypes/search.d.ts.map +0 -1
  328. package/lib/objectTypes/statistics.d.ts.map +0 -1
  329. package/lib/objectTypes/subscription.d.ts.map +0 -1
  330. package/lib/objectTypes/tag.d.ts.map +0 -1
  331. package/lib/objectTypes/user.d.ts.map +0 -1
  332. package/lib/objectTypes/video.d.ts.map +0 -1
  333. package/lib/queries/content/content.d.ts.map +0 -1
  334. package/lib/queries/events/events.d.ts.map +0 -1
  335. package/lib/queries/groups/groups.d.ts.map +0 -1
  336. package/lib/queries/images/images.d.ts.map +0 -1
  337. package/lib/queries/index.d.ts.map +0 -1
  338. package/lib/queries/locations/locations.d.ts.map +0 -1
  339. package/lib/queries/messages/messages.d.ts.map +0 -1
  340. package/lib/queries/personas/personas.d.ts.map +0 -1
  341. package/lib/queries/posts/posts.d.ts.map +0 -1
  342. package/lib/queries/query/query.d.ts.map +0 -1
  343. package/lib/queries/reactions/reactions.d.ts.map +0 -1
  344. package/lib/queries/statistics/statistics.d.ts.map +0 -1
  345. package/lib/queries/subscriptions/subscriptions.d.ts.map +0 -1
  346. package/lib/queries/tags/tags.d.ts.map +0 -1
  347. package/lib/queries/users/users.d.ts.map +0 -1
  348. package/lib/queries/videos/videos.d.ts.map +0 -1
  349. package/lib/templates/email/layout.d.ts +0 -3
  350. package/lib/templates/email/layout.d.ts.map +0 -1
  351. package/lib/templates/email/passwordForgot.d.ts +0 -3
  352. package/lib/templates/email/passwordForgot.d.ts.map +0 -1
  353. package/lib/templates/email/passwordRecovery.d.ts +0 -3
  354. package/lib/templates/email/passwordRecovery.d.ts.map +0 -1
  355. package/lib/templates/email/verifyEmail.d.ts +0 -3
  356. package/lib/templates/email/verifyEmail.d.ts.map +0 -1
  357. package/lib/templates/email/welcome.d.ts +0 -3
  358. package/lib/templates/email/welcome.d.ts.map +0 -1
  359. package/lib/templates/sms/passwordForgot.d.ts +0 -3
  360. package/lib/templates/sms/passwordForgot.d.ts.map +0 -1
  361. package/lib/templates/sms/passwordRecovery.d.ts +0 -3
  362. package/lib/templates/sms/passwordRecovery.d.ts.map +0 -1
  363. package/lib/templates/sms/verifyEmail.d.ts +0 -3
  364. package/lib/templates/sms/verifyEmail.d.ts.map +0 -1
  365. package/lib/templates/sms/verifyPhone.d.ts +0 -3
  366. package/lib/templates/sms/verifyPhone.d.ts.map +0 -1
  367. package/lib/templates/sms/welcome.d.ts +0 -3
  368. package/lib/templates/sms/welcome.d.ts.map +0 -1
  369. package/lib/types/apps.types.d.ts.map +0 -1
  370. package/lib/types/arangodb.types.d.ts.map +0 -1
  371. package/lib/types/auth.types.d.ts.map +0 -1
  372. package/lib/types/connections.types.d.ts.map +0 -1
  373. package/lib/types/content.types.d.ts.map +0 -1
  374. package/lib/types/conversations.types.d.ts.map +0 -1
  375. package/lib/types/email.types.d.ts.map +0 -1
  376. package/lib/types/error.types.d.ts.map +0 -1
  377. package/lib/types/files.types.d.ts.map +0 -1
  378. package/lib/types/google.types.d.ts.map +0 -1
  379. package/lib/types/groups.types.d.ts.map +0 -1
  380. package/lib/types/images.types.d.ts.map +0 -1
  381. package/lib/types/index.d.ts.map +0 -1
  382. package/lib/types/locations.types.d.ts.map +0 -1
  383. package/lib/types/messages.types.d.ts.map +0 -1
  384. package/lib/types/notifications.types.d.ts.map +0 -1
  385. package/lib/types/payments.types.d.ts.map +0 -1
  386. package/lib/types/personas.types.d.ts.map +0 -1
  387. package/lib/types/posts.types.d.ts.map +0 -1
  388. package/lib/types/statistics.types.d.ts.map +0 -1
  389. package/lib/types/tags.types.d.ts.map +0 -1
  390. package/lib/types/users.types.d.ts.map +0 -1
  391. package/lib/types/videos.types.d.ts.map +0 -1
  392. package/lib/types/websockets.types.d.ts.map +0 -1
  393. package/lib/upload.d.ts.map +0 -1
  394. package/lib/utils/adapterUtils.d.ts.map +0 -1
  395. package/lib/utils/analyticsUtils.d.ts.map +0 -1
  396. package/lib/utils/aqlHelpers.d.ts.map +0 -1
  397. package/lib/utils/arangodbUtils.d.ts.map +0 -1
  398. package/lib/utils/authUtils.d.ts.map +0 -1
  399. package/lib/utils/awsUtils.d.ts.map +0 -1
  400. package/lib/utils/collectionRegistry.d.ts.map +0 -1
  401. package/lib/utils/contextUtils.d.ts.map +0 -1
  402. package/lib/utils/dbI18n.d.ts.map +0 -1
  403. package/lib/utils/dbI18n.example.d.ts.map +0 -1
  404. package/lib/utils/googleTranslate.d.ts.map +0 -1
  405. package/lib/utils/graphqlUtils.d.ts.map +0 -1
  406. package/lib/utils/index.d.ts.map +0 -1
  407. package/lib/utils/languageDetection.d.ts.map +0 -1
  408. package/lib/utils/localeUtils.d.ts.map +0 -1
  409. package/lib/utils/localeUtils.example.d.ts.map +0 -1
  410. package/lib/utils/middlewareUtils.d.ts.map +0 -1
  411. package/lib/utils/queryBuilder.d.ts.map +0 -1
  412. package/lib/utils/schemaUtils.d.ts.map +0 -1
  413. package/lib/utils/sessionUtils.d.ts.map +0 -1
  414. package/lib/utils/stripeUtils.d.ts.map +0 -1
  415. package/lib/utils/templateUtils.d.ts.map +0 -1
  416. package/lib/utils/testUtils.d.ts.map +0 -1
  417. package/lib/utils/translationQueue.d.ts.map +0 -1
  418. package/lib/utils/translationQueue.example.d.ts.map +0 -1
  419. package/lib/videoProcessing.d.ts.map +0 -1
@@ -6,22 +6,22 @@ import { createHash, createPassword, parseArangoId, parseChar, parseEmail, parse
6
6
  import { aql } from 'arangojs';
7
7
  import { literal } from 'arangojs/aql';
8
8
  import { DateTime } from 'luxon';
9
- import Stripe from 'stripe';
10
9
  import { parseUser, parseUserSafe } from '../adapters/userAdapter.js';
11
10
  import { Config } from '../config.js';
12
11
  import { COLLECTIONS, EDGES } from '../constants/collections.js';
13
12
  import verifyEmailTemplate from '../templates/email/verifyEmail.js';
14
13
  import { ErrorTypes } from '../types/error.types.js';
15
14
  import { logError, logException } from '../utils/analyticsUtils.js';
15
+ import { buildFilterClause, buildPresentFilterGroup } from '../utils/aqlHelpers.js';
16
16
  import { getDocId, getLimit, selectReactionCountByType, useDb } from '../utils/arangodbUtils.js';
17
17
  import { detectLanguage } from '../utils/languageDetection.js';
18
18
  import { getSession, setSession } from '../utils/sessionUtils.js';
19
+ import { getStripeClient } from '../utils/stripeUtils.js';
19
20
  import { addItem, countItems, getItemBy, getListBy, updateItem } from './crud.js';
20
21
  import { sendEmail } from './email.js';
21
22
  import { addPersona } from './personas.js';
22
23
  import { sendSms } from './sms.js';
23
24
  const eventCategory = 'users';
24
- const STRIPE_API_VERSION = '2026-02-25.clover';
25
25
  const VERIFICATION_EMAIL_COOLDOWN_MS = 1000 * 60 * 15;
26
26
  const usersCollection = literal(COLLECTIONS.USERS);
27
27
  const hasReactionCollection = literal(EDGES.HAS_REACTION);
@@ -85,6 +85,39 @@ const parseUserList = (users = [])=>users.reduce((result, user)=>{
85
85
  }
86
86
  return result;
87
87
  }, []);
88
+ const buildUserAttributeFilters = ({ email, phone, username, userId }, { active = false } = {})=>{
89
+ const attributeFilters = buildPresentFilterGroup({
90
+ email,
91
+ phone,
92
+ username,
93
+ ...userId ? {
94
+ _key: userId
95
+ } : {}
96
+ }, {
97
+ logic: 'OR'
98
+ });
99
+ if (!active || attributeFilters.conditions.length === 0) {
100
+ return attributeFilters;
101
+ }
102
+ return {
103
+ conditions: [
104
+ attributeFilters,
105
+ {
106
+ field: 'active',
107
+ operator: '!=',
108
+ value: false
109
+ }
110
+ ],
111
+ logic: 'AND'
112
+ };
113
+ };
114
+ const getUserByAttributes = (context, user, options)=>{
115
+ const filters = buildUserAttributeFilters(user, options);
116
+ if (filters.conditions.length === 0) {
117
+ return Promise.resolve(null);
118
+ }
119
+ return getItemBy(context, COLLECTIONS.USERS, filters);
120
+ };
88
121
  export const getUserOptionalFields = (fields = [])=>fields.reduce((selects, field)=>{
89
122
  if (field.includes('Count')) {
90
123
  return selectReactionCountByType('users', 'u', field, selects);
@@ -123,33 +156,11 @@ export const addUser = async (context, user)=>{
123
156
  const hashId = username || phone || email;
124
157
  const salt = createHash(`${hashId}${password}`, '');
125
158
  const encryptedPassword = createPassword(password, salt);
126
- // Check for existing users
127
- const conditions = [];
128
- if (username) {
129
- conditions.push({
130
- field: 'username',
131
- operator: '==',
132
- value: username
133
- });
134
- }
135
- if (email) {
136
- conditions.push({
137
- field: 'email',
138
- operator: '==',
139
- value: email
140
- });
141
- }
142
- if (phone) {
143
- conditions.push({
144
- field: 'phone',
145
- operator: '==',
146
- value: phone
147
- });
148
- }
149
159
  try {
150
- const existingUser = await getItemBy(context, 'users', {
151
- logic: 'OR',
152
- conditions
160
+ const existingUser = await getUserByAttributes(context, {
161
+ email,
162
+ phone,
163
+ username
153
164
  });
154
165
  if (existingUser) {
155
166
  throw logException({
@@ -278,58 +289,49 @@ export const updateUser = async (context, user)=>{
278
289
  };
279
290
  export const forgotPassword = async (context, user)=>{
280
291
  const action = 'forgotPassword';
281
- const { databaseName } = context;
282
292
  const { email, phone, username } = parseUser(user);
283
- const hasEmail = Boolean(email);
284
- const hasPhone = Boolean(phone);
285
- const hasUsername = Boolean(username);
286
- const aqlQuery = aql`FOR u IN users
287
- FILTER (${hasEmail} && u.email == ${email || ''})
288
- || (${hasPhone} && u.phone == ${phone || ''})
289
- || (${hasUsername} && u.username == ${username || ''})
290
- LIMIT 1
291
- RETURN u`;
292
293
  try {
293
- return await useDb(databaseName).query(aqlQuery).then(async (cursor)=>{
294
- const user = await cursor.next();
295
- if (user) {
296
- const { email, phone, verifiedEmail, verifiedPhone } = user;
297
- const codeExpires = Date.now() + 1000 * 60 * 15;
298
- const code = Math.floor(100000 + Math.random() * 900000);
299
- const userDocId = getDocId('users', user);
300
- let update;
301
- if (email && verifiedEmail) {
302
- sendEmail({
303
- context,
304
- html: `<p>Your password reset code is <strong>${code}</strong>.</p>`,
305
- subject: `${getAppTitle(getAppName(context))} password reset code`,
306
- text: `Your code is ${code}`,
307
- user
308
- });
309
- update = {
310
- verifiedEmailCode: code,
311
- verifiedEmailExpires: codeExpires
312
- };
313
- }
314
- if (phone && verifiedPhone) {
315
- sendSms({
316
- context,
317
- text: `Your code is ${code}`
318
- });
319
- update = {
320
- verifiedPhoneExpires: codeExpires,
321
- verifiedSmsCode: code
322
- };
323
- }
324
- if (update?.verifiedEmailCode || update?.verifiedSmsCode) {
325
- const updateQuery = aql`UPDATE ${userDocId} WITH ${update} IN users`;
326
- await useDb(databaseName).query(updateQuery);
327
- return true;
328
- }
329
- return false;
294
+ const existingUser = await getUserByAttributes(context, {
295
+ email,
296
+ phone,
297
+ username
298
+ });
299
+ if (existingUser) {
300
+ const { email, phone, verifiedEmail, verifiedPhone } = existingUser;
301
+ const codeExpires = Date.now() + 1000 * 60 * 15;
302
+ const code = Math.floor(100000 + Math.random() * 900000);
303
+ let update;
304
+ if (email && verifiedEmail) {
305
+ sendEmail({
306
+ context,
307
+ html: `<p>Your password reset code is <strong>${code}</strong>.</p>`,
308
+ subject: `${getAppTitle(getAppName(context))} password reset code`,
309
+ text: `Your code is ${code}`,
310
+ user: existingUser
311
+ });
312
+ update = {
313
+ verifiedEmailCode: code,
314
+ verifiedEmailExpires: codeExpires
315
+ };
316
+ }
317
+ if (phone && verifiedPhone) {
318
+ sendSms({
319
+ context,
320
+ text: `Your code is ${code}`
321
+ });
322
+ update = {
323
+ verifiedPhoneExpires: codeExpires,
324
+ verifiedSmsCode: code
325
+ };
326
+ }
327
+ if (update?.verifiedEmailCode || update?.verifiedSmsCode) {
328
+ const userDocId = getDocId(COLLECTIONS.USERS, existingUser);
329
+ await updateItem(context, COLLECTIONS.USERS, userDocId, update);
330
+ return true;
330
331
  }
331
332
  return false;
332
- });
333
+ }
334
+ return false;
333
335
  } catch (error) {
334
336
  logError({
335
337
  action,
@@ -346,44 +348,36 @@ export const forgotPassword = async (context, user)=>{
346
348
  };
347
349
  export const resetPassword = async (context, { code, user })=>{
348
350
  const action = 'resetPassword';
349
- const { databaseName } = context;
350
351
  const { email, password, phone, username } = parseUser(user);
351
352
  const formatPassword = parsePassword(password);
352
- const hasEmail = Boolean(email);
353
- const hasPhone = Boolean(phone);
354
- const hasUsername = Boolean(username);
355
- const aqlQuery = aql`FOR u IN users
356
- FILTER (${hasEmail} && u.email == ${email || ''})
357
- || (${hasPhone} && u.phone == ${phone || ''})
358
- || (${hasUsername} && u.username == ${username || ''})
359
- LIMIT 1
360
- RETURN u`;
361
353
  try {
362
- return await useDb(databaseName).query(aqlQuery).then(async (cursor)=>{
363
- const user = cursor.next();
364
- if (user) {
365
- const { _id: userDocId, salt, verifiedEmailCode, verifiedEmailExpires = 0, verifiedSmsCode, verifiedPhoneExpires = 0 } = user;
366
- const now = Date.now();
367
- let update;
368
- if (email && code === verifiedEmailCode && verifiedEmailExpires > now) {
369
- const password = createPassword(formatPassword, salt);
370
- update = {
371
- password
372
- };
373
- } else if (phone && code === verifiedSmsCode && verifiedPhoneExpires > now) {
374
- const password = createPassword(formatPassword, salt);
375
- update = {
376
- password
377
- };
378
- }
379
- if (update) {
380
- const updateQuery = aql`UPDATE ${userDocId} WITH ${update} IN users`;
381
- await useDb(databaseName).query(updateQuery);
382
- return true;
383
- }
384
- }
385
- return false;
354
+ const existingUser = await getUserByAttributes(context, {
355
+ email,
356
+ phone,
357
+ username
386
358
  });
359
+ if (existingUser) {
360
+ const { salt, verifiedEmailCode, verifiedEmailExpires = 0, verifiedSmsCode, verifiedPhoneExpires = 0 } = existingUser;
361
+ const now = Date.now();
362
+ let update;
363
+ if (email && code === verifiedEmailCode && verifiedEmailExpires > now) {
364
+ const password = createPassword(formatPassword, salt);
365
+ update = {
366
+ password
367
+ };
368
+ } else if (phone && code === verifiedSmsCode && verifiedPhoneExpires > now) {
369
+ const password = createPassword(formatPassword, salt);
370
+ update = {
371
+ password
372
+ };
373
+ }
374
+ if (update) {
375
+ const userDocId = getDocId(COLLECTIONS.USERS, existingUser);
376
+ await updateItem(context, COLLECTIONS.USERS, userDocId, update);
377
+ return true;
378
+ }
379
+ }
380
+ return false;
387
381
  } catch (error) {
388
382
  logError({
389
383
  action,
@@ -511,10 +505,7 @@ export const deleteUser = (context, user)=>{
511
505
  const aqlQuery = aql`LET u = DOCUMENT(${id})
512
506
  REMOVE u IN users
513
507
  RETURN OLD`;
514
- const stripeClient = new Stripe(Config.get('stripe.token'), {
515
- apiVersion: STRIPE_API_VERSION,
516
- typescript: true
517
- });
508
+ const stripeClient = getStripeClient();
518
509
  return useDb(databaseName).query(aqlQuery).then((cursor)=>cursor.next()).then((user)=>parseUserSafe(user)).then((deletedUser)=>stripeClient.customers.del(deletedUser?.stripeCustomerId).then(()=>stripeClient.accounts.del(deletedUser?.stripeAccountId)).then(()=>deletedUser)).catch((error)=>logError({
519
510
  action,
520
511
  category: eventCategory,
@@ -583,7 +574,6 @@ export const getUserById = (context, user)=>{
583
574
  const { email, id, phone, userId, username } = parseUser(user);
584
575
  const { fields } = context;
585
576
  const { objects: selectObjects, queries: selectQueries } = getUserOptionalFields(fields);
586
- const conditions = [];
587
577
  if (id) {
588
578
  return getItemBy(context, 'users', {
589
579
  logic: 'AND',
@@ -613,40 +603,18 @@ export const getUserById = (context, user)=>{
613
603
  value: ErrorTypes.DATABASE_ERROR
614
604
  }, error, context));
615
605
  }
616
- if (username) {
617
- conditions.push({
618
- field: 'username',
619
- operator: '==',
620
- value: username
621
- });
622
- } else if (email) {
623
- conditions.push({
624
- field: 'email',
625
- operator: '==',
626
- value: email
627
- });
628
- } else if (phone) {
629
- conditions.push({
630
- field: 'phone',
631
- operator: '==',
632
- value: phone
633
- });
634
- } else if (userId) {
635
- conditions.push({
636
- field: '_key',
637
- operator: '==',
638
- value: userId
639
- });
640
- }
641
- conditions.push({
642
- field: 'active',
643
- operator: '!=',
644
- value: false
645
- });
646
- return getItemBy(context, 'users', {
647
- logic: 'AND',
648
- conditions
606
+ const filters = buildUserAttributeFilters({
607
+ email,
608
+ phone,
609
+ userId,
610
+ username
649
611
  }, {
612
+ active: true
613
+ });
614
+ if (filters.conditions.length === 0) {
615
+ return Promise.resolve(null);
616
+ }
617
+ return getItemBy(context, 'users', filters, {
650
618
  customQueries: selectQueries,
651
619
  customObjects: selectObjects
652
620
  }).then((result)=>parseUserSafe(result)).catch((error)=>logError({
@@ -870,19 +838,15 @@ export const signIn = async (context, { expires, user })=>{
870
838
  value: ErrorTypes.INVALID_ARGUMENTS
871
839
  }, context);
872
840
  }
873
- const filters = [];
874
- if (formatEmail) {
875
- filters.push(`u.email == "${formatEmail}"`);
876
- }
877
- if (formatPhone) {
878
- filters.push(`u.phone == ${formatPhone}`);
879
- }
880
- if (formatUsername) {
881
- filters.push(`u.username == "${formatUsername}"`);
882
- }
841
+ const filters = buildUserAttributeFilters({
842
+ email: formatEmail,
843
+ phone: formatPhone,
844
+ username: formatUsername
845
+ });
846
+ const filterClause = buildFilterClause(filters, 'u');
883
847
  const checkQuery = aql`
884
848
  FOR u IN ${usersCollection}
885
- FILTER ${literal(filters.join(' || '))}
849
+ FILTER ${literal(filterClause)}
886
850
  RETURN u
887
851
  `;
888
852
  let checkUsers;
@@ -1021,4 +985,4 @@ export const getUserByToken = (context, token)=>{
1021
985
  });
1022
986
  };
1023
987
 
1024
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSGFzaCxcbiAgY3JlYXRlUGFzc3dvcmQsXG4gIHBhcnNlQXJhbmdvSWQsXG4gIHBhcnNlQ2hhcixcbiAgcGFyc2VFbWFpbCxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7cGFyc2VVc2VyLCBwYXJzZVVzZXJTYWZlfSBmcm9tICcuLi9hZGFwdGVycy91c2VyQWRhcHRlci5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHZlcmlmeUVtYWlsVGVtcGxhdGUgZnJvbSAnLi4vdGVtcGxhdGVzL2VtYWlsL3ZlcmlmeUVtYWlsLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlcywgdHlwZSBTZXNzaW9uRXJyb3J9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7ZGV0ZWN0TGFuZ3VhZ2V9IGZyb20gJy4uL3V0aWxzL2xhbmd1YWdlRGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7Z2V0U2Vzc2lvbiwgc2V0U2Vzc2lvbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbSwgY291bnRJdGVtcywgZ2V0SXRlbUJ5LCBnZXRMaXN0QnksIHVwZGF0ZUl0ZW19IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge3NlbmRFbWFpbH0gZnJvbSAnLi9lbWFpbC5qcyc7XG5pbXBvcnQge2FkZFBlcnNvbmF9IGZyb20gJy4vcGVyc29uYXMuanMnO1xuaW1wb3J0IHtzZW5kU21zfSBmcm9tICcuL3Ntcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJJbnB1dCwgVXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtTZXNzaW9uVG9rZW59IGZyb20gJy4uL3V0aWxzL3Nlc3Npb25VdGlscy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAndXNlcnMnO1xuY29uc3QgU1RSSVBFX0FQSV9WRVJTSU9OID0gJzIwMjYtMDItMjUuY2xvdmVyJztcbmNvbnN0IFZFUklGSUNBVElPTl9FTUFJTF9DT09MRE9XTl9NUyA9IDEwMDAgKiA2MCAqIDE1O1xuY29uc3QgdXNlcnNDb2xsZWN0aW9uID0gbGl0ZXJhbChDT0xMRUNUSU9OUy5VU0VSUyk7XG5jb25zdCBoYXNSZWFjdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLkhBU19SRUFDVElPTik7XG5jb25zdCBpc1RhZ2dlZENvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLklTX1RBR0dFRCk7XG5jb25zdCBoYXNDb25uZWN0aW9uQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSEFTX0NPTk5FQ1RJT04pO1xuXG5jb25zdCBnZXRBcHBOYW1lID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBzdHJpbmcgPT5cbiAgY29udGV4dC5jb25maWc/LmRldGFpbHM/Lm5hbWUgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5uYW1lJykgfHwgJ1JlYWt0b3InO1xuXG5jb25zdCBnZXRBcHBUaXRsZSA9IChhcHBOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYXBwTmFtZVxuICAgIC5zcGxpdCgvKFtcXHMtX10rKS8pXG4gICAgLm1hcCgocGFydCkgPT4gL15bQS1aYS16XS8udGVzdChwYXJ0KSA/IGAke3BhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtwYXJ0LnNsaWNlKDEpfWAgOiBwYXJ0KVxuICAgIC5qb2luKCcnKTtcblxuY29uc3QgYnVpbGRWZXJpZmljYXRpb25FbWFpbCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlcixcbiAgdXNlcjogVXNlclR5cGUgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IGFwcE5hbWUgPSBnZXRBcHBOYW1lKGNvbnRleHQpO1xuICBjb25zdCBhcHBUaXRsZSA9IGdldEFwcFRpdGxlKGFwcE5hbWUpO1xuICBjb25zdCBjb2RlID0gYCR7dmVyaWZpZWRFbWFpbENvZGV9YDtcbiAgY29uc3QgcGFyc2VFbWFpbFRlbXBsYXRlID0gKHRlbXBsYXRlOiBzdHJpbmcpID0+IHRlbXBsYXRlXG4gICAgLnJlcGxhY2VBbGwoJ1thcHBOYW1lXScsIGFwcE5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ1thcHBUaXRsZV0nLCBhcHBUaXRsZSlcbiAgICAucmVwbGFjZUFsbCgnW2VtYWlsQ29kZV0nLCBjb2RlKTtcbiAgY29uc3QgaHRtbCA9IHBhcnNlRW1haWxUZW1wbGF0ZSh1c2VyLnZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGUgfHwgdmVyaWZ5RW1haWxUZW1wbGF0ZSk7XG4gIGNvbnN0IHN1YmplY3QgPSBwYXJzZUVtYWlsVGVtcGxhdGUodXNlci52ZXJpZmljYXRpb25FbWFpbFN1YmplY3QgfHwgYFlvdXIgJHthcHBUaXRsZX0gdmVyaWZpY2F0aW9uIGNvZGUgaXMgJHtjb2RlfWApO1xuICBjb25zdCB0ZXh0ID0gcGFyc2VFbWFpbFRlbXBsYXRlKHVzZXIudmVyaWZpY2F0aW9uRW1haWxUZXh0IHx8IGBZb3VyICR7YXBwVGl0bGV9IHZlcmlmaWNhdGlvbiBjb2RlIGlzICR7Y29kZX0uXFxuXFxuRW50ZXIgdGhpcyBjb2RlIGluICR7YXBwVGl0bGV9IHRvIGZpbmlzaCBzZXR0aW5nIHVwIHlvdXIgYWNjb3VudC4gSWYgeW91IGRpZCBub3QgcmVxdWVzdCB0aGlzIGVtYWlsLCB5b3UgY2FuIHNhZmVseSBpZ25vcmUgaXQuYCk7XG5cbiAgcmV0dXJuIHtcbiAgICBodG1sLFxuICAgIHN1YmplY3QsXG4gICAgdGV4dFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZyb20/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvPzogbnVtYmVyO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gVXNlckFjY2VzcyB7XG4gIEFETUlOID0gLTEsXG4gIEJBU0lDID0gMCxcbiAgUFJFTUlVTSA9IDEsXG4gIFBSTyA9IDJcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVVzZXJUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHBlcnNvbmFJZDogc3RyaW5nID0gJycsXG4gIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgdXNlckFjY2VzczogbnVtYmVyID0gMCxcbiAgZXhwaXJlc0luTWludXRlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc0luTWludXRlc30pO1xuICBjb25zdCBpYXQgPSBNYXRoLmZsb29yKG5vdy50b1NlY29uZHMoKSk7XG4gIGNvbnN0IGV4cCA9IE1hdGguZmxvb3Ioc2Vzc2lvbkV4cGlyZXMudG9TZWNvbmRzKCkpO1xuICBjb25zdCB0b2tlbiA9IHNldFNlc3Npb24oe1xuICAgIGV4cCxcbiAgICBpYXQsXG4gICAgLi4uKHBlcnNvbmFJZCA/IHtwZXJzb25hSWR9IDoge30pLFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXhwaXJlczogc2Vzc2lvbkV4cGlyZXMudG9NaWxsaXMoKSxcbiAgICBpc3N1ZWQ6IG5vdy50b01pbGxpcygpLFxuICAgIC4uLihwZXJzb25hSWQgPyB7cGVyc29uYUlkfSA6IHt9KSxcbiAgICB0b2tlbixcbiAgICB1c2VySWQsXG4gICAgdXNlcm5hbWVcbiAgfTtcbn07XG5cbmludGVyZmFjZSBTZWxlY3RBY2N1bXVsYXRvciB7XG4gIG9iamVjdHM6IHN0cmluZ1tdO1xuICBxdWVyaWVzOiBzdHJpbmdbXTtcbn1cblxuY29uc3QgcGFyc2VVc2VyTGlzdCA9ICh1c2VyczogQXJyYXk8VXNlclR5cGUgfCBudWxsIHwgdW5kZWZpbmVkPiA9IFtdKTogVXNlclR5cGVbXSA9PlxuICB1c2Vycy5yZWR1Y2U8VXNlclR5cGVbXT4oKHJlc3VsdCwgdXNlcikgPT4ge1xuICAgIGNvbnN0IHBhcnNlZFVzZXIgPSBwYXJzZVVzZXJTYWZlKHVzZXIpO1xuXG4gICAgaWYocGFyc2VkVXNlcikge1xuICAgICAgcmVzdWx0LnB1c2gocGFyc2VkVXNlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW10pO1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlck9wdGlvbmFsRmllbGRzID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSk6IFNlbGVjdEFjY3VtdWxhdG9yID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IFNlbGVjdEFjY3VtdWxhdG9yLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCd1c2VycycsICd1JywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RzO1xuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVVzZXJPcHRpb25zID0gKG9wdGlvbnM6IFVzZXJPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBsaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlcklucHV0KTogUHJvbWlzZTxVc2VyVHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFVzZXInO1xuICBjb25zdCB7bGFuZ3VhZ2VDb250ZXh0fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtjb25maXJtOiBfY29uZmlybSwgLi4ubmV3VXNlcn0gPSB1c2VyO1xuICBjb25zdCB7ZW1haWwsIHBhc3N3b3JkLCBwaG9uZSwgdXNlcm5hbWUsIHVzZXJJZCwgX2tleSwgX2lkLCAuLi5pbnNlcnRVc2VyfSA9IHBhcnNlVXNlcihuZXdVc2VyKTtcbiAgY29uc3QgaGFzUGFzc3dvcmQgPSAhIXBhc3N3b3JkO1xuICBjb25zdCBoYXNVc2VybmFtZSA9ICEhdXNlcm5hbWUgfHwgISFwaG9uZSB8fCAhIWVtYWlsO1xuXG4gIGlmKCFoYXNQYXNzd29yZCB8fCAhaGFzVXNlcm5hbWUpIHtcbiAgICBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBoYXNoSWQgPSB1c2VybmFtZSB8fCBwaG9uZSB8fCBlbWFpbDtcbiAgY29uc3Qgc2FsdCA9IGNyZWF0ZUhhc2goYCR7aGFzaElkfSR7cGFzc3dvcmR9YCwgJycpO1xuICBjb25zdCBlbmNyeXB0ZWRQYXNzd29yZCA9IGNyZWF0ZVBhc3N3b3JkKHBhc3N3b3JkLCBzYWx0KTtcblxuICAvLyBDaGVjayBmb3IgZXhpc3RpbmcgdXNlcnNcbiAgY29uc3QgY29uZGl0aW9uczogYW55W10gPSBbXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGNvbmRpdGlvbnMucHVzaCh7ZmllbGQ6ICd1c2VybmFtZScsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogdXNlcm5hbWV9KTtcbiAgfVxuXG4gIGlmKGVtYWlsKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKHtmaWVsZDogJ2VtYWlsJywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiBlbWFpbH0pO1xuICB9XG5cbiAgaWYocGhvbmUpIHtcbiAgICBjb25kaXRpb25zLnB1c2goe2ZpZWxkOiAncGhvbmUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHBob25lfSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nVXNlciA9IGF3YWl0IGdldEl0ZW1CeTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywge1xuICAgICAgbG9naWM6ICdPUicsXG4gICAgICBjb25kaXRpb25zXG4gICAgfSBhcyBhbnkpO1xuXG4gICAgaWYoZXhpc3RpbmdVc2VyKSB7XG4gICAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5FWElTVElOR19JVEVNXG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwaG9uZUNvdW50cnlDb2RlID0gcGhvbmU/LnJlcGxhY2UoL1xcRC9nLCAnJykuc3Vic3RyaW5nKDAsIDMpO1xuICBjb25zdCBsb2NhbGUgPSBkZXRlY3RMYW5ndWFnZSh7XG4gICAgLi4ubGFuZ3VhZ2VDb250ZXh0LFxuICAgIHBob25lQ291bnRyeUNvZGU6IHBob25lQ291bnRyeUNvZGUgfHwgJycsXG4gICAgdXNlclByZWZlcmVuY2U6IGluc2VydFVzZXIubG9jYWxlIHx8ICdlbidcbiAgfSk7XG4gIGNvbnN0IHZlcmlmaWVkRW1haWxDb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICBjb25zdCB2ZXJpZmllZFNtc0NvZGUgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgY29uc3QgaW5zZXJ0OiBVc2VyVHlwZSA9IHtcbiAgICAuLi5pbnNlcnRVc2VyLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2goaGFzaElkKSxcbiAgICBhY3RpdmU6IHRydWUsXG4gICAgZW1haWwsXG4gICAgbG9jYWxlLFxuICAgIHBhc3N3b3JkOiBlbmNyeXB0ZWRQYXNzd29yZCxcbiAgICBwaG9uZSxcbiAgICBzYWx0LFxuICAgIHVzZXJBY2Nlc3M6IFVzZXJBY2Nlc3MuQkFTSUMsXG4gICAgdXNlcm5hbWUsXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgdmVyaWZpZWRTbXNDb2RlXG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGFkZEl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIGluc2VydClcbiAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBzYXZlZFVzZXIgPSBwYXJzZVVzZXJTYWZlKHJlc3VsdCk7XG4gICAgICBjb25zdCBzYXZlZFVzZXJJZCA9IHNhdmVkVXNlcj8udXNlcklkIHx8IHNhdmVkVXNlcj8uX2tleTtcblxuICAgICAgaWYoIXNhdmVkVXNlciB8fCAhc2F2ZWRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHNhdmVkVXNlcjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGVyc29uYSA9IGF3YWl0IGFkZFBlcnNvbmEoY29udGV4dCwge3VzZXJJZDogc2F2ZWRVc2VySWR9KTtcbiAgICAgICAgY29uc3QgcGVyc29uYUlkID0gcGVyc29uYT8ucGVyc29uYUlkIHx8IHBlcnNvbmE/Ll9rZXk7XG5cbiAgICAgICAgaWYoIXBlcnNvbmFJZCkge1xuICAgICAgICAgIHJldHVybiBzYXZlZFVzZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIHNhdmVkVXNlcklkLCB7cGVyc29uYUlkfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFVzZXIgPSBwYXJzZVVzZXJTYWZlKHVwZGF0ZWRVc2VyKSB8fCB7XG4gICAgICAgICAgLi4uc2F2ZWRVc2VyLFxuICAgICAgICAgIHBlcnNvbmFJZFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHRVc2VyO1xuICAgICAgfSBjYXRjaChwZXJzb25hRXJyb3IpIHtcbiAgICAgICAgYXdhaXQgbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNhdmVkVXNlcklkfSxcbiAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICB9LCBwZXJzb25hRXJyb3IgYXMgRXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgIHJldHVybiBzYXZlZFVzZXI7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlVXNlcic7XG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7cGFzc3dvcmQsIF9rZXksIF9pZCwgLi4udXBkYXRlRmllbGRzfSA9IHVwZGF0ZWRVc2VyO1xuICBjb25zdCB7aWR9ID0gdXBkYXRlZFVzZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IHsuLi51cGRhdGVGaWVsZHN9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIHRyeSB7XG4gICAgaWYocGFzc3dvcmQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgICAgIFJFVFVSTiBET0NVTUVOVCgke2lkfSlcbiAgICAgIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICAgICAgY29uc3QgaGFzaElkID0gZXhpc3RpbmdVc2VyPy51c2VybmFtZSB8fCBleGlzdGluZ1VzZXI/LnBob25lIHx8IGV4aXN0aW5nVXNlcj8uZW1haWwgfHwgaWQgfHwgX2tleSB8fCBfaWQgfHwgJyc7XG4gICAgICBjb25zdCBzYWx0ID0gZXhpc3RpbmdVc2VyPy5zYWx0IHx8IGNyZWF0ZUhhc2goYCR7aGFzaElkfSR7cGFzc3dvcmR9YCwgJycpO1xuXG4gICAgICB1cGRhdGUucGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG5cbiAgICAgIGlmKCFleGlzdGluZ1VzZXI/LnNhbHQpIHtcbiAgICAgICAgdXBkYXRlLnNhbHQgPSBzYWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyUmVzdWx0ID0gYXdhaXQgdXBkYXRlSXRlbTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywgaWQsIHVwZGF0ZSBhcyBVc2VyVHlwZSk7XG4gICAgcmV0dXJuIHBhcnNlVXNlclNhZmUodXBkYXRlZFVzZXJSZXN1bHQpIGFzIFVzZXJUeXBlO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2ZvcmdvdFBhc3N3b3JkJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IGhhc0VtYWlsID0gQm9vbGVhbihlbWFpbCk7XG4gIGNvbnN0IGhhc1Bob25lID0gQm9vbGVhbihwaG9uZSk7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gQm9vbGVhbih1c2VybmFtZSk7XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAoJHtoYXNFbWFpbH0gJiYgdS5lbWFpbCA9PSAke2VtYWlsIHx8ICcnfSlcbiAgICAgIHx8ICgke2hhc1Bob25lfSAmJiB1LnBob25lID09ICR7cGhvbmUgfHwgJyd9KVxuICAgICAgfHwgKCR7aGFzVXNlcm5hbWV9ICYmIHUudXNlcm5hbWUgPT0gJHt1c2VybmFtZSB8fCAnJ30pXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdmVyaWZpZWRFbWFpbCwgdmVyaWZpZWRQaG9uZX0gPSB1c2VyIGFzIFVzZXJUeXBlO1xuICAgICAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gRGF0ZS5ub3coKSArICgxMDAwICogNjAgKiAxNSk7XG4gICAgICAgICAgY29uc3QgY29kZSA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgICAgICAgICBjb25zdCB1c2VyRG9jSWQgPSBnZXREb2NJZCgndXNlcnMnLCB1c2VyKTtcbiAgICAgICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICAgICAgaWYoZW1haWwgJiYgdmVyaWZpZWRFbWFpbCkge1xuICAgICAgICAgICAgc2VuZEVtYWlsKHtcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgaHRtbDogYDxwPllvdXIgcGFzc3dvcmQgcmVzZXQgY29kZSBpcyA8c3Ryb25nPiR7Y29kZX08L3N0cm9uZz4uPC9wPmAsXG4gICAgICAgICAgICAgIHN1YmplY3Q6IGAke2dldEFwcFRpdGxlKGdldEFwcE5hbWUoY29udGV4dCkpfSBwYXNzd29yZCByZXNldCBjb2RlYCxcbiAgICAgICAgICAgICAgdGV4dDogYFlvdXIgY29kZSBpcyAke2NvZGV9YCxcbiAgICAgICAgICAgICAgdXNlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRFbWFpbENvZGU6IGNvZGUsIHZlcmlmaWVkRW1haWxFeHBpcmVzOiBjb2RlRXhwaXJlc307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYocGhvbmUgJiYgdmVyaWZpZWRQaG9uZSkge1xuICAgICAgICAgICAgc2VuZFNtcyh7XG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIHRleHQ6IGBZb3VyIGNvZGUgaXMgJHtjb2RlfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdXBkYXRlID0ge3ZlcmlmaWVkUGhvbmVFeHBpcmVzOiBjb2RlRXhwaXJlcywgdmVyaWZpZWRTbXNDb2RlOiBjb2RlfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih1cGRhdGU/LnZlcmlmaWVkRW1haWxDb2RlIHx8IHVwZGF0ZT8udmVyaWZpZWRTbXNDb2RlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlckRvY0lkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICAgIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtjb2RlLCB1c2VyfToge2NvZGU6IG51bWJlcjsgdXNlcjogVXNlclR5cGU7fVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZXNldFBhc3N3b3JkJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWwsIHBhc3N3b3JkLCBwaG9uZSwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCBmb3JtYXRQYXNzd29yZCA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBoYXNFbWFpbCA9IEJvb2xlYW4oZW1haWwpO1xuICBjb25zdCBoYXNQaG9uZSA9IEJvb2xlYW4ocGhvbmUpO1xuICBjb25zdCBoYXNVc2VybmFtZSA9IEJvb2xlYW4odXNlcm5hbWUpO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgKCR7aGFzRW1haWx9ICYmIHUuZW1haWwgPT0gJHtlbWFpbCB8fCAnJ30pXG4gICAgICB8fCAoJHtoYXNQaG9uZX0gJiYgdS5waG9uZSA9PSAke3Bob25lIHx8ICcnfSlcbiAgICAgIHx8ICgke2hhc1VzZXJuYW1lfSAmJiB1LnVzZXJuYW1lID09ICR7dXNlcm5hbWUgfHwgJyd9KVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdWA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKGFzeW5jIChjdXJzb3IpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IGN1cnNvci5uZXh0KCk7XG5cbiAgICAgICAgaWYodXNlcikge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIF9pZDogdXNlckRvY0lkLFxuICAgICAgICAgICAgc2FsdCxcbiAgICAgICAgICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgICAgICAgICAgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPSAwLFxuICAgICAgICAgICAgdmVyaWZpZWRTbXNDb2RlLFxuICAgICAgICAgICAgdmVyaWZpZWRQaG9uZUV4cGlyZXMgPSAwXG4gICAgICAgICAgfSA9IHVzZXIgYXMgVXNlclR5cGU7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICAgICAgaWYoZW1haWwgJiYgY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGUgJiYgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZihwaG9uZSAmJiBjb2RlID09PSB2ZXJpZmllZFNtc0NvZGUgJiYgdmVyaWZpZWRQaG9uZUV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih1cGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyRG9jSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzYDtcblxuICAgICAgICAgICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh1cGRhdGVRdWVyeSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNlbmRWZXJpZmljYXRpb25FbWFpbCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2VuZFZlcmlmaWNhdGlvbkVtYWlsJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWx9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGlmKCFlbWFpbCkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGUgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG4gICAgY29uc3QgdXBkYXRlUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICAgIEZJTFRFUiB1LmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIEZJTFRFUiB1LnZlcmlmaWVkRW1haWwgIT0gdHJ1ZVxuICAgICAgICBGSUxURVIgIUhBUyh1LCBcInZlcmlmaWVkRW1haWxFeHBpcmVzXCIpIHx8IHUudmVyaWZpZWRFbWFpbEV4cGlyZXMgPD0gJHtub3d9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgVVBEQVRFIHUgV0lUSCAke3tcbiAgICAgICAgICB2ZXJpZmllZEVtYWlsQ29kZSxcbiAgICAgICAgICB2ZXJpZmllZEVtYWlsRXhwaXJlczogbm93ICsgVkVSSUZJQ0FUSU9OX0VNQUlMX0NPT0xET1dOX01TXG4gICAgICAgIH19IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgICBSRVRVUk4gTkVXXG4gICAgYDtcblxuICAgIGNvbnN0IGN1cnNvciA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuICAgIGNvbnN0IHJhd1VzZXIgPSBhd2FpdCBjdXJzb3IubmV4dCgpO1xuICAgIGNvbnN0IGZvdW5kVXNlciA9IHJhd1VzZXIgPyBwYXJzZVVzZXIocmF3VXNlcikgOiBudWxsO1xuXG4gICAgaWYoIWZvdW5kVXNlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzZW5kRW1haWwoe1xuICAgICAgY29udGV4dCxcbiAgICAgIC4uLmJ1aWxkVmVyaWZpY2F0aW9uRW1haWwoY29udGV4dCwgdmVyaWZpZWRFbWFpbENvZGUsIHVzZXIpLFxuICAgICAgdXNlcjoge1xuICAgICAgICAuLi5mb3VuZFVzZXIsXG4gICAgICAgIHZlcmlmaWVkRW1haWxDb2RlXG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHR5cGUsXG4gICAgdmFsdWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICB0eXBlOiAnc21zJyB8ICdlbWFpbCc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjb25maXJtQ29kZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgaXNTbXMgPSB0eXBlID09PSAnc21zJztcbiAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBpc1NtcyA/IHBhcnNlUGhvbmUodmFsdWUpIDogcGFyc2VFbWFpbCh2YWx1ZSk7XG4gIGNvbnN0IGZpbHRlckJ5VHlwZSA9IGlzU21zXG4gICAgPyBhcWxgRklMVEVSIHUucGhvbmUgPT0gJHtmb3JtYXR0ZWRWYWx1ZX0gJiYgdS52ZXJpZmllZFNtc0NvZGUgPT0gJHtjb2RlfWBcbiAgICA6IGFxbGBGSUxURVIgdS5lbWFpbCA9PSAke2Zvcm1hdHRlZFZhbHVlfSAmJiB1LnZlcmlmaWVkRW1haWxDb2RlID09ICR7Y29kZX1gO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICAke2ZpbHRlckJ5VHlwZX1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gIGA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigodXNlcikgPT4ge1xuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZFVzZXIgPSBpc1Ntc1xuICAgICAgICAgICAgPyB7dmVyaWZpZWRQaG9uZTogdHJ1ZSwgdmVyaWZpZWRTbXNDb2RlOiAwfVxuICAgICAgICAgICAgOiB7dmVyaWZpZWRFbWFpbDogdHJ1ZSwgdmVyaWZpZWRFbWFpbENvZGU6IDB9O1xuICAgICAgICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyLl9rZXl9IFdJVEggJHt1cGRhdGVkVXNlcn0gSU4gdXNlcnNgO1xuXG4gICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtjb2RlLCB0eXBlLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWV9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtjb2RlLCB0eXBlLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2lkfSA9IHBhcnNlVXNlcih1c2VyKTtcblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke2lkfSlcbiAgICBSRU1PVkUgdSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uOiBTVFJJUEVfQVBJX1ZFUlNJT04sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyKSA9PiBwYXJzZVVzZXJTYWZlKHVzZXIpKVxuICAgIC50aGVuKChkZWxldGVkVXNlcikgPT4gc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUN1c3RvbWVySWQpXG4gICAgICAudGhlbigoKSA9PiBzdHJpcGVDbGllbnQuYWNjb3VudHMuZGVsKGRlbGV0ZWRVc2VyPy5zdHJpcGVBY2NvdW50SWQpKVxuICAgICAgLnRoZW4oKCkgPT4gZGVsZXRlZFVzZXIgYXMgVXNlclR5cGUpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2lkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWFjdGl2YXRlVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlYWN0aXZhdGVVc2VyJztcbiAgY29uc3Qge2lkfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3QgdXBkYXRlZDogVXNlclR5cGUgPSB7XG4gICAgYWN0aXZlOiBmYWxzZVxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVJdGVtPFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCBpZCwgdXBkYXRlZClcbiAgICAudGhlbigodXBkYXRlZFVzZXIpID0+IHBhcnNlVXNlclNhZmUodXBkYXRlZFVzZXIpIGFzIFVzZXJUeXBlKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2lkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyRGlzcGxheU5hbWUgPSAodXNlcjogVXNlclR5cGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7Zmlyc3ROYW1lLCBsYXN0TmFtZSwgbmFtZSA9ICcnLCB1c2VybmFtZSA9ICcnfSA9IHVzZXI7XG4gIGNvbnN0IGZ1bGxuYW1lID0gKFtmaXJzdE5hbWUsIGxhc3ROYW1lXSkuam9pbignICcpLnRyaW0oKTtcblxuICBpZihuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0gZWxzZSBpZihmdWxsbmFtZSAhPT0gJycpIHtcbiAgICByZXR1cm4gZnVsbG5hbWU7XG4gIH0gZWxzZSBpZih1c2VybmFtZSkge1xuICAgIHJldHVybiB1c2VybmFtZTtcbiAgfVxuXG4gIHJldHVybiAnVW5rbm93bic7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2Vzc2lvblVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFNlc3Npb25Vc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3Nlc3Npb25JZH1gKTtcblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgTEVUIHUgPSBET0NVTUVOVCgke2Zvcm1hdFNlc3Npb25JZH0pXG4gICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgIFJFVFVSTiAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgndScpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHBhcnNlVXNlclNhZmUodXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyQnlJZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJCeUlkJztcbiAgY29uc3Qge2VtYWlsLCBpZCwgcGhvbmUsIHVzZXJJZCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7ZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuXG4gIGNvbnN0IGNvbmRpdGlvbnM6IGFueVtdID0gW107XG5cbiAgaWYoaWQpIHtcbiAgICByZXR1cm4gZ2V0SXRlbUJ5PFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgICBsb2dpYzogJ0FORCcsXG4gICAgICBjb25kaXRpb25zOiBbXG4gICAgICAgIHtmaWVsZDogJ19pZCcsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogaWR9LFxuICAgICAgICB7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJyE9JywgdmFsdWU6IGZhbHNlfVxuICAgICAgXVxuICAgIH0gYXMgYW55LCB7XG4gICAgICBjdXN0b21RdWVyaWVzOiBzZWxlY3RRdWVyaWVzLFxuICAgICAgY3VzdG9tT2JqZWN0czogc2VsZWN0T2JqZWN0c1xuICAgIH0pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiBwYXJzZVVzZXJTYWZlKHJlc3VsdCkgYXMgVXNlclR5cGUpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtpZCwgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBjb25kaXRpb25zLnB1c2goe2ZpZWxkOiAndXNlcm5hbWUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHVzZXJuYW1lfSk7XG4gIH0gZWxzZSBpZihlbWFpbCkge1xuICAgIGNvbmRpdGlvbnMucHVzaCh7ZmllbGQ6ICdlbWFpbCcsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogZW1haWx9KTtcbiAgfSBlbHNlIGlmKHBob25lKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKHtmaWVsZDogJ3Bob25lJywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiBwaG9uZX0pO1xuICB9IGVsc2UgaWYodXNlcklkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKHtmaWVsZDogJ19rZXknLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHVzZXJJZH0pO1xuICB9XG5cbiAgY29uZGl0aW9ucy5wdXNoKHtmaWVsZDogJ2FjdGl2ZScsIG9wZXJhdG9yOiAnIT0nLCB2YWx1ZTogZmFsc2V9KTtcblxuICByZXR1cm4gZ2V0SXRlbUJ5PFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgbG9naWM6ICdBTkQnLFxuICAgIGNvbmRpdGlvbnNcbiAgfSBhcyBhbnksIHtcbiAgICBjdXN0b21RdWVyaWVzOiBzZWxlY3RRdWVyaWVzLFxuICAgIGN1c3RvbU9iamVjdHM6IHNlbGVjdE9iamVjdHNcbiAgfSlcbiAgICAudGhlbigocmVzdWx0KSA9PiBwYXJzZVVzZXJTYWZlKHJlc3VsdCkgYXMgVXNlclR5cGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWQsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJMaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3QnO1xuICBjb25zdCB7ZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IGFueVtdID0gW1xuICAgIHtmaWVsZDogJ2FjdGl2ZScsIG9wZXJhdG9yOiAnIT0nLCB2YWx1ZTogZmFsc2V9XG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBjb25kaXRpb25zLnB1c2goe2ZpZWxkOiAndXNlcm5hbWUnLCBvcGVyYXRvcjogJ0NPTlRBSU5TJywgdmFsdWU6IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpLCBjYXNlU2Vuc2l0aXZlOiBmYWxzZX0pO1xuICB9XG5cbiAgcmV0dXJuIGdldExpc3RCeTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywge1xuICAgIGxvZ2ljOiAnQU5EJyxcbiAgICBjb25kaXRpb25zXG4gIH0gYXMgYW55LCB7XG4gICAgc29ydDogW3tmaWVsZDogJ3VzZXJuYW1lJywgZGlyZWN0aW9uOiAnQVNDJ31dLFxuICAgIGxpbWl0OiB7ZnJvbTogbGltaXQuc3RhcnQsIHRvOiBsaW1pdC5zdGFydCArIGxpbWl0Lm51bX0sXG4gICAgY3VzdG9tUXVlcmllczogc2VsZWN0UXVlcmllcyxcbiAgICBjdXN0b21PYmplY3RzOiBzZWxlY3RPYmplY3RzXG4gIH0pXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4gcGFyc2VVc2VyTGlzdChyZXN1bHQpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJMaXN0QnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiB7cmVhY3Rpb25zPzogc3RyaW5nW107IHVzZXJuYW1lPzogc3RyaW5nfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJMaXN0QnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbnM6IHN0cmluZ1tdID0gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lOiBzdHJpbmcpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWUgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LmFjdGl2ZSAhPSBmYWxzZScsXG4gICAgYFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0UmVhY3Rpb25zKX0sIExPV0VSKHIubmFtZSkpYFxuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB1LCByIElOIE9VVEJPVU5EICR7Zm9ybWF0U2Vzc2lvbklkfSAke2hhc1JlYWN0aW9uQ29sbGVjdGlvbn1cbiAgICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiAke0NPTExFQ1RJT05TLlVTRVJTfX1cbiAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyQnkuam9pbignICYmICcpKX1cbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgUkVUVVJOICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKCh1c2VycykgPT4gcGFyc2VVc2VyTGlzdCh1c2VycykpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3RCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt0YWdzLCB1c2VybmFtZX0sXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdEJ5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ3M6IHN0cmluZ1tdID0gdGFncz8ucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgdGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYodGFnTmFtZSkge1xuICAgICAgbGlzdC5wdXNoKHBhcnNlQ2hhcih0YWdOYW1lLCAzMikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZSA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgYHUuX2tleSAhPSBcIiR7c2Vzc2lvbklkfVwiYCxcbiAgICAndS5hY3RpdmUgIT0gZmFsc2UnXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7Zm9ybWF0VXNlcm5hbWV9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHQgSU4gdGFnc1xuICAgICAgRklMVEVSIFBPU0lUSU9OKCR7Zm9ybWF0VGFnc30sIExPV0VSKHQubmFtZSkpXG4gICAgICBGT1IgdSwgaXQgSU4gT1VUQk9VTkQgdCAke2lzVGFnZ2VkQ29sbGVjdGlvbn1cbiAgICAgICAgT1BUSU9OUyB7YmZzOiB0cnVlLCB1bmlxdWVWZXJ0aWNlczogXCJnbG9iYWxcIiwgdmVydGV4Q29sbGVjdGlvbnM6ICR7Q09MTEVDVElPTlMuVVNFUlN9fVxuICAgICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyQnkuam9pbignICYmICcpKX1cbiAgICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICAgIFJFVFVSTiBESVNUSU5DVCAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgndScpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigodXNlcnMpID0+IHBhcnNlVXNlckxpc3QodXNlcnMpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJMaXN0QnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwge3VzZXJuYW1lfSwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdEJ5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmaWx0ZXIgPSBbXG4gICAgJ3UuX2lkICE9IHNlc3Npb24uX2lkJyxcbiAgICAndS5hY3RpdmUgIT0gZmFsc2UnXG4gIF07XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbEZpZWxkcyhmaWVsZHMpO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyLnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB1IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgTEVUIHNlc3Npb24gPSBET0NVTUVOVCgke2B1c2Vycy8ke3VzZXJJZH1gfSlcbiAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyLmpvaW4oJyAmJiAnKSl9XG4gICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRSh1LmxhdGl0dWRlIHx8IDAsIHUubG9uZ2l0dWRlIHx8IDAsIHNlc3Npb24ubGF0aXR1ZGUgfHwgMCwgc2Vzc2lvbi5sb25naXR1ZGUgfHwgMClcbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgU09SVCBkaXN0YW5jZSBBU0MsIHUuYWRkZWQgREVTQ1xuICAgICAgUkVUVVJOICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKCh1c2VycykgPT4gcGFyc2VVc2VyTGlzdCh1c2VycykpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3RCeUNvbm5lY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt1c2VySWR9OiBVc2VyVHlwZSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJMaXN0QnlDb25uZWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZCA9IHBhcnNlQXJhbmdvSWQoYHVzZXJzLyR7dXNlcklkfWApO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgJ3UuYWN0aXZlICE9IGZhbHNlJ1xuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBjdSBJTiAke3VzZXJzQ29sbGVjdGlvbn1cbiAgICAgIExFVCBzZXNzaW9uID0gRE9DVU1FTlQoJHtmb3JtYXRVc2VySWR9KVxuICAgICAgRk9SIHUsIGNvbm5lY3Rpb24gSU4gT1VUQk9VTkQgY3UgJHtoYXNDb25uZWN0aW9uQ29sbGVjdGlvbn1cbiAgICAgICAgT1BUSU9OUyB7YmZzOiB0cnVlLCB1bmlxdWVWZXJ0aWNlczogXCJnbG9iYWxcIiwgdmVydGV4Q29sbGVjdGlvbnM6ICR7Q09MTEVDVElPTlMuVVNFUlN9fVxuICAgICAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVyQnkuam9pbignICYmICcpKX1cbiAgICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICAgIFJFVFVSTiBESVNUSU5DVCAke3NlbGVjdE9iamVjdHMubGVuZ3RoID4gMCA/IGxpdGVyYWwoYE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWApIDogbGl0ZXJhbCgndScpfVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigodXNlcnMpID0+IHBhcnNlVXNlckxpc3QodXNlcnMpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hTZXNzaW9uID0gKHtleHBpcmVzLCB0b2tlbn0pOiBTZXNzaW9uVG9rZW4gfCBTZXNzaW9uRXJyb3IgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHtwZXJzb25hSWQsIHVzZXJJZCwgdXNlcm5hbWUsIHVzZXJBY2Nlc3N9ID0gZ2V0U2Vzc2lvbih0b2tlbik7XG4gICAgcmV0dXJuIGNyZWF0ZVVzZXJUb2tlbih1c2VySWQsIHBlcnNvbmFJZCB8fCAnJywgdXNlcm5hbWUsIHVzZXJBY2Nlc3MsIGV4cGlyZXMpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRoZSBlcnJvciBmcm9tIGdldFNlc3Npb25cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25JbiA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB7ZXhwaXJlcywgdXNlcn0pOiBQcm9taXNlPFNlc3Npb25Ub2tlbiB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3NpZ25Jbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2VtYWlsLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lfSA9IHVzZXIgfHwge307XG4gIGNvbnN0IGZvcm1hdEVtYWlsID0gcGFyc2VFbWFpbChlbWFpbCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZvcm1hdFBhc3N3b3JkID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG4gIGNvbnN0IGZvcm1hdFBob25lID0gcGFyc2VQaG9uZShwaG9uZSk7XG4gIGNvbnN0IGZvcm1hdEV4cGlyZXMgPSBwYXJzZU51bShleHBpcmVzKSB8fCAxNTtcblxuICBpZigoIWZvcm1hdFVzZXJuYW1lICYmICFmb3JtYXRFbWFpbCAmJiAhZm9ybWF0UGhvbmUpIHx8ICFmb3JtYXRQYXNzd29yZCkge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBmb3JtYXRFbWFpbCwgZm9ybWF0UGhvbmUsIGZvcm1hdFVzZXJuYW1lLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYoZm9ybWF0RW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2Zvcm1hdEVtYWlsfVwiYCk7XG4gIH1cblxuICBpZihmb3JtYXRQaG9uZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS5waG9uZSA9PSAke2Zvcm1hdFBob25lfWApO1xuICB9XG5cbiAgaWYoZm9ybWF0VXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUudXNlcm5hbWUgPT0gXCIke2Zvcm1hdFVzZXJuYW1lfVwiYCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgdSBJTiAke3VzZXJzQ29sbGVjdGlvbn1cbiAgICAgIEZJTFRFUiAke2xpdGVyYWwoZmlsdGVycy5qb2luKCcgfHwgJykpfVxuICAgICAgUkVUVVJOIHVcbiAgYDtcblxuICBsZXQgY2hlY2tVc2VyczogVXNlclR5cGVbXTtcblxuICB0cnkge1xuICAgIGNoZWNrVXNlcnMgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGNoZWNrVXNlciA9IGNoZWNrVXNlcnMuZmluZCgodXNlckl0ZW0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtwYXNzd29yZDogdmFsaWRQYXNzd29yZCwgc2FsdH0gPSB1c2VySXRlbSBhcyBVc2VyVHlwZTtcbiAgICByZXR1cm4gQm9vbGVhbih2YWxpZFBhc3N3b3JkICYmIHNhbHQgJiYgdmFsaWRQYXNzd29yZCA9PT0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpKTtcbiAgfSk7XG5cbiAgaWYoIWNoZWNrVXNlcikge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgaWYoY2hlY2tVc2VyLmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBfa2V5OiB1c2VySWQsXG4gICAgcGVyc29uYUlkLFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcm5hbWU6IGNoZWNrVXNlcm5hbWVcbiAgfSA9IGNoZWNrVXNlciBhcyBVc2VyVHlwZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gY3JlYXRlVXNlclRva2VuKHVzZXJJZCB8fCAnJywgcGVyc29uYUlkIHx8ICcnLCBjaGVja1VzZXJuYW1lIHx8ICcnLCB1c2VyQWNjZXNzLCBmb3JtYXRFeHBpcmVzKTtcblxuICAgIHJldHVybiB0b2tlbjtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25PdXQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbk91dCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG5cbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIGxhc3RPbmxpbmU6IERhdGUubm93KCksXG4gICAgc2Vzc2lvbklkOiBudWxsXG4gIH07XG4gIGNvbnN0IHNlc3Npb25RdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pXG4gICAgVVBEQVRFIHUgV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnNcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHNlc3Npb25RdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aXZlVXNlckNvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0QWN0aXZlVXNlckNvdW50JztcblxuICByZXR1cm4gY291bnRJdGVtcyhjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgbG9naWM6ICdBTkQnLFxuICAgIGNvbmRpdGlvbnM6IFt7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHRydWV9XVxuICB9IGFzIGFueSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckJ5VG9rZW4gPSAoY29udGV4dDogQXBpQ29udGV4dCwgdG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJCeVRva2VuJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7dXNlcklkfSA9IGdldFNlc3Npb24odG9rZW4pO1xuICBjb25zdCB1c2VyRG9jSWQgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3VzZXJJZH1gKTtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoXCIke3VzZXJEb2NJZH1cIikgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHtcbiAgICAgIGlmKHVzZXI/LmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgcGFyYW1zOiB7dXNlcklkfSxcbiAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VVc2VyU2FmZSh1c2VyKSBhcyBVc2VyVHlwZTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuIl0sIm5hbWVzIjpbInBhcnNlTnVtIiwiY3JlYXRlSGFzaCIsImNyZWF0ZVBhc3N3b3JkIiwicGFyc2VBcmFuZ29JZCIsInBhcnNlQ2hhciIsInBhcnNlRW1haWwiLCJwYXJzZVBhc3N3b3JkIiwicGFyc2VQaG9uZSIsInBhcnNlVXNlcm5hbWUiLCJhcWwiLCJsaXRlcmFsIiwiRGF0ZVRpbWUiLCJTdHJpcGUiLCJwYXJzZVVzZXIiLCJwYXJzZVVzZXJTYWZlIiwiQ29uZmlnIiwiQ09MTEVDVElPTlMiLCJFREdFUyIsInZlcmlmeUVtYWlsVGVtcGxhdGUiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJsb2dFeGNlcHRpb24iLCJnZXREb2NJZCIsImdldExpbWl0Iiwic2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSIsInVzZURiIiwiZGV0ZWN0TGFuZ3VhZ2UiLCJnZXRTZXNzaW9uIiwic2V0U2Vzc2lvbiIsImFkZEl0ZW0iLCJjb3VudEl0ZW1zIiwiZ2V0SXRlbUJ5IiwiZ2V0TGlzdEJ5IiwidXBkYXRlSXRlbSIsInNlbmRFbWFpbCIsImFkZFBlcnNvbmEiLCJzZW5kU21zIiwiZXZlbnRDYXRlZ29yeSIsIlNUUklQRV9BUElfVkVSU0lPTiIsIlZFUklGSUNBVElPTl9FTUFJTF9DT09MRE9XTl9NUyIsInVzZXJzQ29sbGVjdGlvbiIsIlVTRVJTIiwiaGFzUmVhY3Rpb25Db2xsZWN0aW9uIiwiSEFTX1JFQUNUSU9OIiwiaXNUYWdnZWRDb2xsZWN0aW9uIiwiSVNfVEFHR0VEIiwiaGFzQ29ubmVjdGlvbkNvbGxlY3Rpb24iLCJIQVNfQ09OTkVDVElPTiIsImdldEFwcE5hbWUiLCJjb250ZXh0IiwiY29uZmlnIiwiZGV0YWlscyIsIm5hbWUiLCJnZXQiLCJnZXRBcHBUaXRsZSIsImFwcE5hbWUiLCJzcGxpdCIsIm1hcCIsInBhcnQiLCJ0ZXN0IiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsImpvaW4iLCJidWlsZFZlcmlmaWNhdGlvbkVtYWlsIiwidmVyaWZpZWRFbWFpbENvZGUiLCJ1c2VyIiwiYXBwVGl0bGUiLCJjb2RlIiwicGFyc2VFbWFpbFRlbXBsYXRlIiwidGVtcGxhdGUiLCJyZXBsYWNlQWxsIiwiaHRtbCIsInZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGUiLCJzdWJqZWN0IiwidmVyaWZpY2F0aW9uRW1haWxTdWJqZWN0IiwidGV4dCIsInZlcmlmaWNhdGlvbkVtYWlsVGV4dCIsIlVzZXJBY2Nlc3MiLCJjcmVhdGVVc2VyVG9rZW4iLCJ1c2VySWQiLCJwZXJzb25hSWQiLCJ1c2VybmFtZSIsInVzZXJBY2Nlc3MiLCJleHBpcmVzSW5NaW51dGVzIiwibm93IiwibG9jYWwiLCJzZXNzaW9uRXhwaXJlcyIsInBsdXMiLCJtaW51dGVzIiwiaWF0IiwiTWF0aCIsImZsb29yIiwidG9TZWNvbmRzIiwiZXhwIiwidG9rZW4iLCJleHBpcmVzIiwidG9NaWxsaXMiLCJpc3N1ZWQiLCJwYXJzZVVzZXJMaXN0IiwidXNlcnMiLCJyZWR1Y2UiLCJyZXN1bHQiLCJwYXJzZWRVc2VyIiwicHVzaCIsImdldFVzZXJPcHRpb25hbEZpZWxkcyIsImZpZWxkcyIsInNlbGVjdHMiLCJmaWVsZCIsImluY2x1ZGVzIiwib2JqZWN0cyIsInF1ZXJpZXMiLCJwYXJzZVVzZXJPcHRpb25zIiwib3B0aW9ucyIsImZyb20iLCJ0byIsImxpbWl0IiwiYWRkVXNlciIsImFjdGlvbiIsImxhbmd1YWdlQ29udGV4dCIsImNvbmZpcm0iLCJfY29uZmlybSIsIm5ld1VzZXIiLCJlbWFpbCIsInBhc3N3b3JkIiwicGhvbmUiLCJfa2V5IiwiX2lkIiwiaW5zZXJ0VXNlciIsImhhc1Bhc3N3b3JkIiwiaGFzVXNlcm5hbWUiLCJjYXRlZ29yeSIsInBhcmFtcyIsInZhbHVlIiwiSU5WQUxJRF9BUkdVTUVOVFMiLCJoYXNoSWQiLCJzYWx0IiwiZW5jcnlwdGVkUGFzc3dvcmQiLCJjb25kaXRpb25zIiwib3BlcmF0b3IiLCJleGlzdGluZ1VzZXIiLCJsb2dpYyIsIkVYSVNUSU5HX0lURU0iLCJlcnJvciIsIkRBVEFCQVNFX0VSUk9SIiwicGhvbmVDb3VudHJ5Q29kZSIsInJlcGxhY2UiLCJzdWJzdHJpbmciLCJsb2NhbGUiLCJ1c2VyUHJlZmVyZW5jZSIsInJhbmRvbSIsInZlcmlmaWVkU21zQ29kZSIsImluc2VydCIsImFjdGl2ZSIsInZlcmlmaWVkRW1haWwiLCJ2ZXJpZmllZFBob25lIiwidGhlbiIsInNhdmVkVXNlciIsInNhdmVkVXNlcklkIiwicGVyc29uYSIsInVwZGF0ZWRVc2VyIiwicmVzdWx0VXNlciIsInBlcnNvbmFFcnJvciIsImNhdGNoIiwidXBkYXRlVXNlciIsInVwZGF0ZUZpZWxkcyIsImlkIiwidXBkYXRlIiwiZGF0YWJhc2VOYW1lIiwicXVlcnkiLCJjdXJzb3IiLCJuZXh0IiwidXBkYXRlZFVzZXJSZXN1bHQiLCJmb3Jnb3RQYXNzd29yZCIsImhhc0VtYWlsIiwiQm9vbGVhbiIsImhhc1Bob25lIiwiYXFsUXVlcnkiLCJjb2RlRXhwaXJlcyIsIkRhdGUiLCJ1c2VyRG9jSWQiLCJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsInZlcmlmaWVkUGhvbmVFeHBpcmVzIiwidXBkYXRlUXVlcnkiLCJyZXNldFBhc3N3b3JkIiwiZm9ybWF0UGFzc3dvcmQiLCJzZW5kVmVyaWZpY2F0aW9uRW1haWwiLCJyYXdVc2VyIiwiZm91bmRVc2VyIiwiY29uZmlybUNvZGUiLCJ0eXBlIiwiaXNTbXMiLCJmb3JtYXR0ZWRWYWx1ZSIsImZpbHRlckJ5VHlwZSIsImRlbGV0ZVVzZXIiLCJzdHJpcGVDbGllbnQiLCJhcGlWZXJzaW9uIiwidHlwZXNjcmlwdCIsImRlbGV0ZWRVc2VyIiwiY3VzdG9tZXJzIiwiZGVsIiwic3RyaXBlQ3VzdG9tZXJJZCIsImFjY291bnRzIiwic3RyaXBlQWNjb3VudElkIiwiZGVhY3RpdmF0ZVVzZXIiLCJ1cGRhdGVkIiwiZ2V0VXNlckRpc3BsYXlOYW1lIiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJmdWxsbmFtZSIsInRyaW0iLCJnZXRTZXNzaW9uVXNlciIsInNlc3Npb24iLCJzZXNzaW9uSWQiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImZvcm1hdFNlc3Npb25JZCIsImxlbmd0aCIsImdldFVzZXJCeUlkIiwiY3VzdG9tUXVlcmllcyIsImN1c3RvbU9iamVjdHMiLCJnZXRVc2VyTGlzdCIsImNhc2VTZW5zaXRpdmUiLCJzb3J0IiwiZGlyZWN0aW9uIiwic3RhcnQiLCJudW0iLCJnZXRVc2VyTGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25zIiwiZm9ybWF0UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lIiwidG9Mb3dlckNhc2UiLCJmb3JtYXRVc2VybmFtZSIsImZpbHRlckJ5IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbCIsImdldFVzZXJMaXN0QnlUYWdzIiwidGFncyIsImZvcm1hdFRhZ3MiLCJsaXN0IiwidGFnTmFtZSIsImdldFVzZXJMaXN0QnlMYXRlc3QiLCJmaWx0ZXIiLCJnZXRVc2VyTGlzdEJ5Q29ubmVjdGlvbiIsImZvcm1hdFVzZXJJZCIsInJlZnJlc2hTZXNzaW9uIiwic2lnbkluIiwiZm9ybWF0RW1haWwiLCJmb3JtYXRQaG9uZSIsImZvcm1hdEV4cGlyZXMiLCJmaWx0ZXJzIiwiY2hlY2tRdWVyeSIsImNoZWNrVXNlcnMiLCJjaGVja1VzZXIiLCJmaW5kIiwidXNlckl0ZW0iLCJ2YWxpZFBhc3N3b3JkIiwiSU5WQUxJRF9BVVRIRU5USUNBVElPTiIsImNoZWNrVXNlcm5hbWUiLCJzaWduT3V0IiwibGFzdE9ubGluZSIsInNlc3Npb25RdWVyeSIsImdldEFjdGl2ZVVzZXJDb3VudCIsImdldFVzZXJCeVRva2VuIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxRQUFRLFFBQU8sK0JBQStCO0FBQ3RELFNBQ0VDLFVBQVUsRUFDVkMsY0FBYyxFQUNkQyxhQUFhLEVBQ2JDLFNBQVMsRUFDVEMsVUFBVSxFQUNWQyxhQUFhLEVBQ2JDLFVBQVUsRUFDVkMsYUFBYSxRQUNSLCtCQUErQjtBQUN0QyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUNyQyxTQUFRQyxRQUFRLFFBQU8sUUFBUTtBQUMvQixPQUFPQyxZQUFZLFNBQVM7QUFFNUIsU0FBUUMsU0FBUyxFQUFFQyxhQUFhLFFBQU8sNkJBQTZCO0FBQ3BFLFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBQ3BDLFNBQVFDLFdBQVcsRUFB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
988
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSGFzaCxcbiAgY3JlYXRlUGFzc3dvcmQsXG4gIHBhcnNlQXJhbmdvSWQsXG4gIHBhcnNlQ2hhcixcbiAgcGFyc2VFbWFpbCxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5cbmltcG9ydCB7cGFyc2VVc2VyLCBwYXJzZVVzZXJTYWZlfSBmcm9tICcuLi9hZGFwdGVycy91c2VyQWRhcHRlci5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHZlcmlmeUVtYWlsVGVtcGxhdGUgZnJvbSAnLi4vdGVtcGxhdGVzL2VtYWlsL3ZlcmlmeUVtYWlsLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlcywgdHlwZSBTZXNzaW9uRXJyb3J9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtidWlsZEZpbHRlckNsYXVzZSwgYnVpbGRQcmVzZW50RmlsdGVyR3JvdXB9IGZyb20gJy4uL3V0aWxzL2FxbEhlbHBlcnMuanMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7ZGV0ZWN0TGFuZ3VhZ2V9IGZyb20gJy4uL3V0aWxzL2xhbmd1YWdlRGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7Z2V0U2Vzc2lvbiwgc2V0U2Vzc2lvbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcbmltcG9ydCB7Z2V0U3RyaXBlQ2xpZW50fSBmcm9tICcuLi91dGlscy9zdHJpcGVVdGlscy5qcyc7XG5pbXBvcnQge2FkZEl0ZW0sIGNvdW50SXRlbXMsIGdldEl0ZW1CeSwgZ2V0TGlzdEJ5LCB1cGRhdGVJdGVtfSBmcm9tICcuL2NydWQuanMnO1xuaW1wb3J0IHtzZW5kRW1haWx9IGZyb20gJy4vZW1haWwuanMnO1xuaW1wb3J0IHthZGRQZXJzb25hfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7c2VuZFNtc30gZnJvbSAnLi9zbXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgdHlwZSB7RmlsdGVyR3JvdXB9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtVc2VySW5wdXQsIFVzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7U2Vzc2lvblRva2VufSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5ID0gJ3VzZXJzJztcbmNvbnN0IFZFUklGSUNBVElPTl9FTUFJTF9DT09MRE9XTl9NUyA9IDEwMDAgKiA2MCAqIDE1O1xuY29uc3QgdXNlcnNDb2xsZWN0aW9uID0gbGl0ZXJhbChDT0xMRUNUSU9OUy5VU0VSUyk7XG5jb25zdCBoYXNSZWFjdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLkhBU19SRUFDVElPTik7XG5jb25zdCBpc1RhZ2dlZENvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLklTX1RBR0dFRCk7XG5jb25zdCBoYXNDb25uZWN0aW9uQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSEFTX0NPTk5FQ1RJT04pO1xuXG5jb25zdCBnZXRBcHBOYW1lID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBzdHJpbmcgPT5cbiAgY29udGV4dC5jb25maWc/LmRldGFpbHM/Lm5hbWUgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5uYW1lJykgfHwgJ1JlYWt0b3InO1xuXG5jb25zdCBnZXRBcHBUaXRsZSA9IChhcHBOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYXBwTmFtZVxuICAgIC5zcGxpdCgvKFtcXHMtX10rKS8pXG4gICAgLm1hcCgocGFydCkgPT4gL15bQS1aYS16XS8udGVzdChwYXJ0KSA/IGAke3BhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtwYXJ0LnNsaWNlKDEpfWAgOiBwYXJ0KVxuICAgIC5qb2luKCcnKTtcblxuY29uc3QgYnVpbGRWZXJpZmljYXRpb25FbWFpbCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlcixcbiAgdXNlcjogVXNlclR5cGUgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IGFwcE5hbWUgPSBnZXRBcHBOYW1lKGNvbnRleHQpO1xuICBjb25zdCBhcHBUaXRsZSA9IGdldEFwcFRpdGxlKGFwcE5hbWUpO1xuICBjb25zdCBjb2RlID0gYCR7dmVyaWZpZWRFbWFpbENvZGV9YDtcbiAgY29uc3QgcGFyc2VFbWFpbFRlbXBsYXRlID0gKHRlbXBsYXRlOiBzdHJpbmcpID0+IHRlbXBsYXRlXG4gICAgLnJlcGxhY2VBbGwoJ1thcHBOYW1lXScsIGFwcE5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ1thcHBUaXRsZV0nLCBhcHBUaXRsZSlcbiAgICAucmVwbGFjZUFsbCgnW2VtYWlsQ29kZV0nLCBjb2RlKTtcbiAgY29uc3QgaHRtbCA9IHBhcnNlRW1haWxUZW1wbGF0ZSh1c2VyLnZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGUgfHwgdmVyaWZ5RW1haWxUZW1wbGF0ZSk7XG4gIGNvbnN0IHN1YmplY3QgPSBwYXJzZUVtYWlsVGVtcGxhdGUodXNlci52ZXJpZmljYXRpb25FbWFpbFN1YmplY3QgfHwgYFlvdXIgJHthcHBUaXRsZX0gdmVyaWZpY2F0aW9uIGNvZGUgaXMgJHtjb2RlfWApO1xuICBjb25zdCB0ZXh0ID0gcGFyc2VFbWFpbFRlbXBsYXRlKHVzZXIudmVyaWZpY2F0aW9uRW1haWxUZXh0IHx8IGBZb3VyICR7YXBwVGl0bGV9IHZlcmlmaWNhdGlvbiBjb2RlIGlzICR7Y29kZX0uXFxuXFxuRW50ZXIgdGhpcyBjb2RlIGluICR7YXBwVGl0bGV9IHRvIGZpbmlzaCBzZXR0aW5nIHVwIHlvdXIgYWNjb3VudC4gSWYgeW91IGRpZCBub3QgcmVxdWVzdCB0aGlzIGVtYWlsLCB5b3UgY2FuIHNhZmVseSBpZ25vcmUgaXQuYCk7XG5cbiAgcmV0dXJuIHtcbiAgICBodG1sLFxuICAgIHN1YmplY3QsXG4gICAgdGV4dFxuICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZyb20/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvPzogbnVtYmVyO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gVXNlckFjY2VzcyB7XG4gIEFETUlOID0gLTEsXG4gIEJBU0lDID0gMCxcbiAgUFJFTUlVTSA9IDEsXG4gIFBSTyA9IDJcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVVzZXJUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHBlcnNvbmFJZDogc3RyaW5nID0gJycsXG4gIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgdXNlckFjY2VzczogbnVtYmVyID0gMCxcbiAgZXhwaXJlc0luTWludXRlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc0luTWludXRlc30pO1xuICBjb25zdCBpYXQgPSBNYXRoLmZsb29yKG5vdy50b1NlY29uZHMoKSk7XG4gIGNvbnN0IGV4cCA9IE1hdGguZmxvb3Ioc2Vzc2lvbkV4cGlyZXMudG9TZWNvbmRzKCkpO1xuICBjb25zdCB0b2tlbiA9IHNldFNlc3Npb24oe1xuICAgIGV4cCxcbiAgICBpYXQsXG4gICAgLi4uKHBlcnNvbmFJZCA/IHtwZXJzb25hSWR9IDoge30pLFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXhwaXJlczogc2Vzc2lvbkV4cGlyZXMudG9NaWxsaXMoKSxcbiAgICBpc3N1ZWQ6IG5vdy50b01pbGxpcygpLFxuICAgIC4uLihwZXJzb25hSWQgPyB7cGVyc29uYUlkfSA6IHt9KSxcbiAgICB0b2tlbixcbiAgICB1c2VySWQsXG4gICAgdXNlcm5hbWVcbiAgfTtcbn07XG5cbmludGVyZmFjZSBTZWxlY3RBY2N1bXVsYXRvciB7XG4gIG9iamVjdHM6IHN0cmluZ1tdO1xuICBxdWVyaWVzOiBzdHJpbmdbXTtcbn1cblxuY29uc3QgcGFyc2VVc2VyTGlzdCA9ICh1c2VyczogQXJyYXk8VXNlclR5cGUgfCBudWxsIHwgdW5kZWZpbmVkPiA9IFtdKTogVXNlclR5cGVbXSA9PlxuICB1c2Vycy5yZWR1Y2U8VXNlclR5cGVbXT4oKHJlc3VsdCwgdXNlcikgPT4ge1xuICAgIGNvbnN0IHBhcnNlZFVzZXIgPSBwYXJzZVVzZXJTYWZlKHVzZXIpO1xuXG4gICAgaWYocGFyc2VkVXNlcikge1xuICAgICAgcmVzdWx0LnB1c2gocGFyc2VkVXNlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW10pO1xuXG5jb25zdCBidWlsZFVzZXJBdHRyaWJ1dGVGaWx0ZXJzID0gKFxuICB7ZW1haWwsIHBob25lLCB1c2VybmFtZSwgdXNlcklkfTogVXNlclR5cGUsXG4gIHthY3RpdmUgPSBmYWxzZX06IHtyZWFkb25seSBhY3RpdmU/OiBib29sZWFufSA9IHt9XG4pOiBGaWx0ZXJHcm91cCA9PiB7XG4gIGNvbnN0IGF0dHJpYnV0ZUZpbHRlcnMgPSBidWlsZFByZXNlbnRGaWx0ZXJHcm91cCh7XG4gICAgZW1haWwsXG4gICAgcGhvbmUsXG4gICAgdXNlcm5hbWUsXG4gICAgLi4uKHVzZXJJZCA/IHtfa2V5OiB1c2VySWR9IDoge30pXG4gIH0sIHtsb2dpYzogJ09SJ30pO1xuXG4gIGlmKCFhY3RpdmUgfHwgYXR0cmlidXRlRmlsdGVycy5jb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVGaWx0ZXJzO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb25kaXRpb25zOiBbXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXJzLFxuICAgICAge2ZpZWxkOiAnYWN0aXZlJywgb3BlcmF0b3I6ICchPScsIHZhbHVlOiBmYWxzZX1cbiAgICBdLFxuICAgIGxvZ2ljOiAnQU5EJ1xuICB9O1xufTtcblxuY29uc3QgZ2V0VXNlckJ5QXR0cmlidXRlcyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSwgb3B0aW9ucz86IHtyZWFkb25seSBhY3RpdmU/OiBib29sZWFufSkgPT4ge1xuICBjb25zdCBmaWx0ZXJzID0gYnVpbGRVc2VyQXR0cmlidXRlRmlsdGVycyh1c2VyLCBvcHRpb25zKTtcblxuICBpZihmaWx0ZXJzLmNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHJldHVybiBnZXRJdGVtQnk8VXNlclR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLlVTRVJTLCBmaWx0ZXJzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyT3B0aW9uYWxGaWVsZHMgPSAoZmllbGRzOiBzdHJpbmdbXSA9IFtdKTogU2VsZWN0QWNjdW11bGF0b3IgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogU2VsZWN0QWNjdW11bGF0b3IsIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ3VzZXJzJywgJ3UnLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdHM7XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVXNlck9wdGlvbnMgPSAob3B0aW9uczogVXNlck9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGltaXQgPSBnZXRMaW1pdChmcm9tLCB0byk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGxpbWl0XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlciA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VySW5wdXQpOiBQcm9taXNlPFVzZXJUeXBlIHwgbnVsbD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlcic7XG4gIGNvbnN0IHtsYW5ndWFnZUNvbnRleHR9ID0gY29udGV4dDtcbiAgY29uc3Qge2NvbmZpcm06IF9jb25maXJtLCAuLi5uZXdVc2VyfSA9IHVzZXI7XG4gIGNvbnN0IHtlbWFpbCwgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZSwgdXNlcklkLCBfa2V5LCBfaWQsIC4uLmluc2VydFVzZXJ9ID0gcGFyc2VVc2VyKG5ld1VzZXIpO1xuICBjb25zdCBoYXNQYXNzd29yZCA9ICEhcGFzc3dvcmQ7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gISF1c2VybmFtZSB8fCAhIXBob25lIHx8ICEhZW1haWw7XG5cbiAgaWYoIWhhc1Bhc3N3b3JkIHx8ICFoYXNVc2VybmFtZSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGhhc2hJZCA9IHVzZXJuYW1lIHx8IHBob25lIHx8IGVtYWlsO1xuICBjb25zdCBzYWx0ID0gY3JlYXRlSGFzaChgJHtoYXNoSWR9JHtwYXNzd29yZH1gLCAnJyk7XG4gIGNvbnN0IGVuY3J5cHRlZFBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQocGFzc3dvcmQsIHNhbHQpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmdVc2VyID0gYXdhaXQgZ2V0VXNlckJ5QXR0cmlidXRlcyhjb250ZXh0LCB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0pO1xuXG4gICAgaWYoZXhpc3RpbmdVc2VyKSB7XG4gICAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICBwaG9uZSxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5FWElTVElOR19JVEVNXG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwaG9uZUNvdW50cnlDb2RlID0gcGhvbmU/LnJlcGxhY2UoL1xcRC9nLCAnJykuc3Vic3RyaW5nKDAsIDMpO1xuICBjb25zdCBsb2NhbGUgPSBkZXRlY3RMYW5ndWFnZSh7XG4gICAgLi4ubGFuZ3VhZ2VDb250ZXh0LFxuICAgIHBob25lQ291bnRyeUNvZGU6IHBob25lQ291bnRyeUNvZGUgfHwgJycsXG4gICAgdXNlclByZWZlcmVuY2U6IGluc2VydFVzZXIubG9jYWxlIHx8ICdlbidcbiAgfSk7XG4gIGNvbnN0IHZlcmlmaWVkRW1haWxDb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICBjb25zdCB2ZXJpZmllZFNtc0NvZGUgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgY29uc3QgaW5zZXJ0OiBVc2VyVHlwZSA9IHtcbiAgICAuLi5pbnNlcnRVc2VyLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2goaGFzaElkKSxcbiAgICBhY3RpdmU6IHRydWUsXG4gICAgZW1haWwsXG4gICAgbG9jYWxlLFxuICAgIHBhc3N3b3JkOiBlbmNyeXB0ZWRQYXNzd29yZCxcbiAgICBwaG9uZSxcbiAgICBzYWx0LFxuICAgIHVzZXJBY2Nlc3M6IFVzZXJBY2Nlc3MuQkFTSUMsXG4gICAgdXNlcm5hbWUsXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgdmVyaWZpZWRTbXNDb2RlXG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IGFkZEl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIGluc2VydClcbiAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBzYXZlZFVzZXIgPSBwYXJzZVVzZXJTYWZlKHJlc3VsdCk7XG4gICAgICBjb25zdCBzYXZlZFVzZXJJZCA9IHNhdmVkVXNlcj8udXNlcklkIHx8IHNhdmVkVXNlcj8uX2tleTtcblxuICAgICAgaWYoIXNhdmVkVXNlciB8fCAhc2F2ZWRVc2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHNhdmVkVXNlcjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGVyc29uYSA9IGF3YWl0IGFkZFBlcnNvbmEoY29udGV4dCwge3VzZXJJZDogc2F2ZWRVc2VySWR9KTtcbiAgICAgICAgY29uc3QgcGVyc29uYUlkID0gcGVyc29uYT8ucGVyc29uYUlkIHx8IHBlcnNvbmE/Ll9rZXk7XG5cbiAgICAgICAgaWYoIXBlcnNvbmFJZCkge1xuICAgICAgICAgIHJldHVybiBzYXZlZFVzZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIHNhdmVkVXNlcklkLCB7cGVyc29uYUlkfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFVzZXIgPSBwYXJzZVVzZXJTYWZlKHVwZGF0ZWRVc2VyKSB8fCB7XG4gICAgICAgICAgLi4uc2F2ZWRVc2VyLFxuICAgICAgICAgIHBlcnNvbmFJZFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHRVc2VyO1xuICAgICAgfSBjYXRjaChwZXJzb25hRXJyb3IpIHtcbiAgICAgICAgYXdhaXQgbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNhdmVkVXNlcklkfSxcbiAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICB9LCBwZXJzb25hRXJyb3IgYXMgRXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgIHJldHVybiBzYXZlZFVzZXI7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlVXNlcic7XG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7cGFzc3dvcmQsIF9rZXksIF9pZCwgLi4udXBkYXRlRmllbGRzfSA9IHVwZGF0ZWRVc2VyO1xuICBjb25zdCB7aWR9ID0gdXBkYXRlZFVzZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IHsuLi51cGRhdGVGaWVsZHN9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIHRyeSB7XG4gICAgaWYocGFzc3dvcmQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgICAgIFJFVFVSTiBET0NVTUVOVCgke2lkfSlcbiAgICAgIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICAgICAgY29uc3QgaGFzaElkID0gZXhpc3RpbmdVc2VyPy51c2VybmFtZSB8fCBleGlzdGluZ1VzZXI/LnBob25lIHx8IGV4aXN0aW5nVXNlcj8uZW1haWwgfHwgaWQgfHwgX2tleSB8fCBfaWQgfHwgJyc7XG4gICAgICBjb25zdCBzYWx0ID0gZXhpc3RpbmdVc2VyPy5zYWx0IHx8IGNyZWF0ZUhhc2goYCR7aGFzaElkfSR7cGFzc3dvcmR9YCwgJycpO1xuXG4gICAgICB1cGRhdGUucGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG5cbiAgICAgIGlmKCFleGlzdGluZ1VzZXI/LnNhbHQpIHtcbiAgICAgICAgdXBkYXRlLnNhbHQgPSBzYWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRVc2VyUmVzdWx0ID0gYXdhaXQgdXBkYXRlSXRlbTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywgaWQsIHVwZGF0ZSBhcyBVc2VyVHlwZSk7XG4gICAgcmV0dXJuIHBhcnNlVXNlclNhZmUodXBkYXRlZFVzZXJSZXN1bHQpIGFzIFVzZXJUeXBlO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2ZvcmdvdFBhc3N3b3JkJztcbiAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmdVc2VyID0gYXdhaXQgZ2V0VXNlckJ5QXR0cmlidXRlcyhjb250ZXh0LCB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0pO1xuXG4gICAgaWYoZXhpc3RpbmdVc2VyKSB7XG4gICAgICBjb25zdCB7ZW1haWwsIHBob25lLCB2ZXJpZmllZEVtYWlsLCB2ZXJpZmllZFBob25lfSA9IGV4aXN0aW5nVXNlciBhcyBVc2VyVHlwZTtcbiAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gRGF0ZS5ub3coKSArICgxMDAwICogNjAgKiAxNSk7XG4gICAgICBjb25zdCBjb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICAgICAgbGV0IHVwZGF0ZTtcblxuICAgICAgaWYoZW1haWwgJiYgdmVyaWZpZWRFbWFpbCkge1xuICAgICAgICBzZW5kRW1haWwoe1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgaHRtbDogYDxwPllvdXIgcGFzc3dvcmQgcmVzZXQgY29kZSBpcyA8c3Ryb25nPiR7Y29kZX08L3N0cm9uZz4uPC9wPmAsXG4gICAgICAgICAgc3ViamVjdDogYCR7Z2V0QXBwVGl0bGUoZ2V0QXBwTmFtZShjb250ZXh0KSl9IHBhc3N3b3JkIHJlc2V0IGNvZGVgLFxuICAgICAgICAgIHRleHQ6IGBZb3VyIGNvZGUgaXMgJHtjb2RlfWAsXG4gICAgICAgICAgdXNlcjogZXhpc3RpbmdVc2VyXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRFbWFpbENvZGU6IGNvZGUsIHZlcmlmaWVkRW1haWxFeHBpcmVzOiBjb2RlRXhwaXJlc307XG4gICAgICB9XG5cbiAgICAgIGlmKHBob25lICYmIHZlcmlmaWVkUGhvbmUpIHtcbiAgICAgICAgc2VuZFNtcyh7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB0ZXh0OiBgWW91ciBjb2RlIGlzICR7Y29kZX1gXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRQaG9uZUV4cGlyZXM6IGNvZGVFeHBpcmVzLCB2ZXJpZmllZFNtc0NvZGU6IGNvZGV9O1xuICAgICAgfVxuXG4gICAgICBpZih1cGRhdGU/LnZlcmlmaWVkRW1haWxDb2RlIHx8IHVwZGF0ZT8udmVyaWZpZWRTbXNDb2RlKSB7XG4gICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKENPTExFQ1RJT05TLlVTRVJTLCBleGlzdGluZ1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLlVTRVJTLCB1c2VyRG9jSWQsIHVwZGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNldFBhc3N3b3JkID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7Y29kZSwgdXNlcn06IHtjb2RlOiBudW1iZXI7IHVzZXI6IFVzZXJUeXBlO31cbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAncmVzZXRQYXNzd29yZCc7XG4gIGNvbnN0IHtlbWFpbCwgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IGZvcm1hdFBhc3N3b3JkID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleGlzdGluZ1VzZXIgPSBhd2FpdCBnZXRVc2VyQnlBdHRyaWJ1dGVzKGNvbnRleHQsIHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSk7XG5cbiAgICBpZihleGlzdGluZ1VzZXIpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc2FsdCxcbiAgICAgICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgICAgIHZlcmlmaWVkRW1haWxFeHBpcmVzID0gMCxcbiAgICAgICAgdmVyaWZpZWRTbXNDb2RlLFxuICAgICAgICB2ZXJpZmllZFBob25lRXhwaXJlcyA9IDBcbiAgICAgIH0gPSBleGlzdGluZ1VzZXIgYXMgVXNlclR5cGU7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IHVwZGF0ZTtcblxuICAgICAgaWYoZW1haWwgJiYgY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGUgJiYgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG4gICAgICAgIHVwZGF0ZSA9IHtwYXNzd29yZH07XG4gICAgICB9XG4gICAgICBlbHNlIGlmKHBob25lICYmIGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZSAmJiB2ZXJpZmllZFBob25lRXhwaXJlcyA+IG5vdykge1xuICAgICAgICBjb25zdCBwYXNzd29yZCA9IGNyZWF0ZVBhc3N3b3JkKGZvcm1hdFBhc3N3b3JkLCBzYWx0KTtcbiAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgIH1cblxuICAgICAgaWYodXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKENPTExFQ1RJT05TLlVTRVJTLCBleGlzdGluZ1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLlVTRVJTLCB1c2VyRG9jSWQsIHVwZGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNlbmRWZXJpZmljYXRpb25FbWFpbCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2VuZFZlcmlmaWNhdGlvbkVtYWlsJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWx9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGlmKCFlbWFpbCkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGUgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG4gICAgY29uc3QgdXBkYXRlUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICAgIEZJTFRFUiB1LmVtYWlsID09ICR7ZW1haWx9XG4gICAgICAgIEZJTFRFUiB1LnZlcmlmaWVkRW1haWwgIT0gdHJ1ZVxuICAgICAgICBGSUxURVIgIUhBUyh1LCBcInZlcmlmaWVkRW1haWxFeHBpcmVzXCIpIHx8IHUudmVyaWZpZWRFbWFpbEV4cGlyZXMgPD0gJHtub3d9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgVVBEQVRFIHUgV0lUSCAke3tcbiAgICAgICAgICB2ZXJpZmllZEVtYWlsQ29kZSxcbiAgICAgICAgICB2ZXJpZmllZEVtYWlsRXhwaXJlczogbm93ICsgVkVSSUZJQ0FUSU9OX0VNQUlMX0NPT0xET1dOX01TXG4gICAgICAgIH19IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgICBSRVRVUk4gTkVXXG4gICAgYDtcblxuICAgIGNvbnN0IGN1cnNvciA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuICAgIGNvbnN0IHJhd1VzZXIgPSBhd2FpdCBjdXJzb3IubmV4dCgpO1xuICAgIGNvbnN0IGZvdW5kVXNlciA9IHJhd1VzZXIgPyBwYXJzZVVzZXIocmF3VXNlcikgOiBudWxsO1xuXG4gICAgaWYoIWZvdW5kVXNlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzZW5kRW1haWwoe1xuICAgICAgY29udGV4dCxcbiAgICAgIC4uLmJ1aWxkVmVyaWZpY2F0aW9uRW1haWwoY29udGV4dCwgdmVyaWZpZWRFbWFpbENvZGUsIHVzZXIpLFxuICAgICAgdXNlcjoge1xuICAgICAgICAuLi5mb3VuZFVzZXIsXG4gICAgICAgIHZlcmlmaWVkRW1haWxDb2RlXG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHR5cGUsXG4gICAgdmFsdWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICB0eXBlOiAnc21zJyB8ICdlbWFpbCc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjb25maXJtQ29kZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgaXNTbXMgPSB0eXBlID09PSAnc21zJztcbiAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSBpc1NtcyA/IHBhcnNlUGhvbmUodmFsdWUpIDogcGFyc2VFbWFpbCh2YWx1ZSk7XG4gIGNvbnN0IGZpbHRlckJ5VHlwZSA9IGlzU21zXG4gICAgPyBhcWxgRklMVEVSIHUucGhvbmUgPT0gJHtmb3JtYXR0ZWRWYWx1ZX0gJiYgdS52ZXJpZmllZFNtc0NvZGUgPT0gJHtjb2RlfWBcbiAgICA6IGFxbGBGSUxURVIgdS5lbWFpbCA9PSAke2Zvcm1hdHRlZFZhbHVlfSAmJiB1LnZlcmlmaWVkRW1haWxDb2RlID09ICR7Y29kZX1gO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICAke2ZpbHRlckJ5VHlwZX1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB1XG4gIGA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigodXNlcikgPT4ge1xuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZFVzZXIgPSBpc1Ntc1xuICAgICAgICAgICAgPyB7dmVyaWZpZWRQaG9uZTogdHJ1ZSwgdmVyaWZpZWRTbXNDb2RlOiAwfVxuICAgICAgICAgICAgOiB7dmVyaWZpZWRFbWFpbDogdHJ1ZSwgdmVyaWZpZWRFbWFpbENvZGU6IDB9O1xuICAgICAgICAgIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyLl9rZXl9IFdJVEggJHt1cGRhdGVkVXNlcn0gSU4gdXNlcnNgO1xuXG4gICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtjb2RlLCB0eXBlLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWV9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtjb2RlLCB0eXBlLCB2YWx1ZTogZm9ybWF0dGVkVmFsdWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2lkfSA9IHBhcnNlVXNlcih1c2VyKTtcblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke2lkfSlcbiAgICBSRU1PVkUgdSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBPTERgO1xuXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHBhcnNlVXNlclNhZmUodXNlcikpXG4gICAgLnRoZW4oKGRlbGV0ZWRVc2VyKSA9PiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUFjY291bnRJZCkpXG4gICAgICAudGhlbigoKSA9PiBkZWxldGVkVXNlciBhcyBVc2VyVHlwZSkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVhY3RpdmF0ZVVzZXInO1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB1cGRhdGVkOiBVc2VyVHlwZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlXG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZUl0ZW08VXNlclR5cGU+KGNvbnRleHQsICd1c2VycycsIGlkLCB1cGRhdGVkKVxuICAgIC50aGVuKCh1cGRhdGVkVXNlcikgPT4gcGFyc2VVc2VyU2FmZSh1cGRhdGVkVXNlcikgYXMgVXNlclR5cGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJEaXNwbGF5TmFtZSA9ICh1c2VyOiBVc2VyVHlwZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHtmaXJzdE5hbWUsIGxhc3ROYW1lLCBuYW1lID0gJycsIHVzZXJuYW1lID0gJyd9ID0gdXNlcjtcbiAgY29uc3QgZnVsbG5hbWUgPSAoW2ZpcnN0TmFtZSwgbGFzdE5hbWVdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfSBlbHNlIGlmKGZ1bGxuYW1lICE9PSAnJykge1xuICAgIHJldHVybiBmdWxsbmFtZTtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHVzZXJuYW1lO1xuICB9XG5cbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0U2Vzc2lvblVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IHBhcnNlQXJhbmdvSWQoYHVzZXJzLyR7c2Vzc2lvbklkfWApO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgdSA9IERPQ1VNRU5UKCR7Zm9ybWF0U2Vzc2lvbklkfSlcbiAgICAke2xpdGVyYWwoc2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKSl9XG4gICAgUkVUVVJOICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlcikgPT4gcGFyc2VVc2VyU2FmZSh1c2VyKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJCeUlkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckJ5SWQnO1xuICBjb25zdCB7ZW1haWwsIGlkLCBwaG9uZSwgdXNlcklkLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHtmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG5cbiAgaWYoaWQpIHtcbiAgICByZXR1cm4gZ2V0SXRlbUJ5PFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgICBsb2dpYzogJ0FORCcsXG4gICAgICBjb25kaXRpb25zOiBbXG4gICAgICAgIHtmaWVsZDogJ19pZCcsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogaWR9LFxuICAgICAgICB7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJyE9JywgdmFsdWU6IGZhbHNlfVxuICAgICAgXVxuICAgIH0gYXMgYW55LCB7XG4gICAgICBjdXN0b21RdWVyaWVzOiBzZWxlY3RRdWVyaWVzLFxuICAgICAgY3VzdG9tT2JqZWN0czogc2VsZWN0T2JqZWN0c1xuICAgIH0pXG4gICAgICAudGhlbigocmVzdWx0KSA9PiBwYXJzZVVzZXJTYWZlKHJlc3VsdCkgYXMgVXNlclR5cGUpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHtpZCwgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVycyA9IGJ1aWxkVXNlckF0dHJpYnV0ZUZpbHRlcnMoe2VtYWlsLCBwaG9uZSwgdXNlcklkLCB1c2VybmFtZX0sIHthY3RpdmU6IHRydWV9KTtcblxuICBpZihmaWx0ZXJzLmNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsIGFzIHVua25vd24gYXMgVXNlclR5cGUpO1xuICB9XG5cbiAgcmV0dXJuIGdldEl0ZW1CeTxVc2VyVHlwZT4oY29udGV4dCwgJ3VzZXJzJywgZmlsdGVycywge1xuICAgIGN1c3RvbVF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXMsXG4gICAgY3VzdG9tT2JqZWN0czogc2VsZWN0T2JqZWN0c1xuICB9KVxuICAgIC50aGVuKChyZXN1bHQpID0+IHBhcnNlVXNlclNhZmUocmVzdWx0KSBhcyBVc2VyVHlwZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpZCwgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyTGlzdCc7XG4gIGNvbnN0IHtmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgY29uZGl0aW9uczogYW55W10gPSBbXG4gICAge2ZpZWxkOiAnYWN0aXZlJywgb3BlcmF0b3I6ICchPScsIHZhbHVlOiBmYWxzZX1cbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGNvbmRpdGlvbnMucHVzaCh7ZmllbGQ6ICd1c2VybmFtZScsIG9wZXJhdG9yOiAnQ09OVEFJTlMnLCB2YWx1ZTogcGFyc2VVc2VybmFtZSh1c2VybmFtZSksIGNhc2VTZW5zaXRpdmU6IGZhbHNlfSk7XG4gIH1cblxuICByZXR1cm4gZ2V0TGlzdEJ5PFVzZXJUeXBlPihjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgbG9naWM6ICdBTkQnLFxuICAgIGNvbmRpdGlvbnNcbiAgfSBhcyBhbnksIHtcbiAgICBzb3J0OiBbe2ZpZWxkOiAndXNlcm5hbWUnLCBkaXJlY3Rpb246ICdBU0MnfV0sXG4gICAgbGltaXQ6IHtmcm9tOiBsaW1pdC5zdGFydCwgdG86IGxpbWl0LnN0YXJ0ICsgbGltaXQubnVtfSxcbiAgICBjdXN0b21RdWVyaWVzOiBzZWxlY3RRdWVyaWVzLFxuICAgIGN1c3RvbU9iamVjdHM6IHNlbGVjdE9iamVjdHNcbiAgfSlcbiAgICAudGhlbigocmVzdWx0KSA9PiBwYXJzZVVzZXJMaXN0KHJlc3VsdCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3RCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3JlYWN0aW9ucyA9IFtdLCB1c2VybmFtZX06IHtyZWFjdGlvbnM/OiBzdHJpbmdbXTsgdXNlcm5hbWU/OiBzdHJpbmd9LFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3RCeVJlYWN0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nW10gPSByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWU6IHN0cmluZykgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZSA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgJ3UuYWN0aXZlICE9IGZhbHNlJyxcbiAgICBgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRSZWFjdGlvbnMpfSwgTE9XRVIoci5uYW1lKSlgXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7Zm9ybWF0VXNlcm5hbWV9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHUsIHIgSU4gT1VUQk9VTkQgJHtmb3JtYXRTZXNzaW9uSWR9ICR7aGFzUmVhY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6ICR7Q09MTEVDVElPTlMuVVNFUlN9fVxuICAgICAgJHtsaXRlcmFsKHNlbGVjdFF1ZXJpZXMuam9pbignXFxuJykpfVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBSRVRVUk4gJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ3UnKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHVzZXJzKSA9PiBwYXJzZVVzZXJMaXN0KHVzZXJzKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyTGlzdEJ5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3RhZ3MsIHVzZXJuYW1lfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnczogc3RyaW5nW10gPSB0YWdzPy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCB0YWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICBpZih0YWdOYW1lKSB7XG4gICAgICBsaXN0LnB1c2gocGFyc2VDaGFyKHRhZ05hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICBgdS5fa2V5ICE9IFwiJHtzZXNzaW9uSWR9XCJgLFxuICAgICd1LmFjdGl2ZSAhPSBmYWxzZSdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgUE9TSVRJT04oJHtmb3JtYXRUYWdzfSwgTE9XRVIodC5uYW1lKSlcbiAgICAgIEZPUiB1LCBpdCBJTiBPVVRCT1VORCB0ICR7aXNUYWdnZWRDb2xsZWN0aW9ufVxuICAgICAgICBPUFRJT05TIHtiZnM6IHRydWUsIHVuaXF1ZVZlcnRpY2VzOiBcImdsb2JhbFwiLCB2ZXJ0ZXhDb2xsZWN0aW9uczogJHtDT0xMRUNUSU9OUy5VU0VSU319XG4gICAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKCh1c2VycykgPT4gcGFyc2VVc2VyTGlzdCh1c2VycykpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckxpc3RCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB7dXNlcm5hbWV9LCBvcHRpb25zPzogVXNlck9wdGlvbnMpOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJMaXN0QnlMYXRlc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZpbHRlciA9IFtcbiAgICAndS5faWQgIT0gc2Vzc2lvbi5faWQnLFxuICAgICd1LmFjdGl2ZSAhPSBmYWxzZSdcbiAgXTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsRmllbGRzKGZpZWxkcyk7XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXIucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIHUgSU4gJHt1c2Vyc0NvbGxlY3Rpb259XG4gICAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKCR7YHVzZXJzLyR7dXNlcklkfWB9KVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXIuam9pbignICYmICcpKX1cbiAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgIExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKHUubGF0aXR1ZGUgfHwgMCwgdS5sb25naXR1ZGUgfHwgMCwgc2Vzc2lvbi5sYXRpdHVkZSB8fCAwLCBzZXNzaW9uLmxvbmdpdHVkZSB8fCAwKVxuICAgICAgJHtsaXRlcmFsKGxpbWl0LmFxbCl9XG4gICAgICBTT1JUIGRpc3RhbmNlIEFTQywgdS5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gJHtzZWxlY3RPYmplY3RzLmxlbmd0aCA+IDAgPyBsaXRlcmFsKGBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgKSA6IGxpdGVyYWwoJ3UnKX1cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHVzZXJzKSA9PiBwYXJzZVVzZXJMaXN0KHVzZXJzKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyTGlzdEJ5Q29ubmVjdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3VzZXJJZH06IFVzZXJUeXBlLFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3RCeUNvbm5lY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWxGaWVsZHMoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VBcmFuZ29JZChgdXNlcnMvJHt1c2VySWR9YCk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAndS5hY3RpdmUgIT0gZmFsc2UnXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGN1IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgTEVUIHNlc3Npb24gPSBET0NVTUVOVCgke2Zvcm1hdFVzZXJJZH0pXG4gICAgICBGT1IgdSwgY29ubmVjdGlvbiBJTiBPVVRCT1VORCBjdSAke2hhc0Nvbm5lY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgICBPUFRJT05TIHtiZnM6IHRydWUsIHVuaXF1ZVZlcnRpY2VzOiBcImdsb2JhbFwiLCB2ZXJ0ZXhDb2xsZWN0aW9uczogJHtDT0xMRUNUSU9OUy5VU0VSU319XG4gICAgICAgICR7bGl0ZXJhbChzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpKX1cbiAgICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJCeS5qb2luKCcgJiYgJykpfVxuICAgICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUICR7c2VsZWN0T2JqZWN0cy5sZW5ndGggPiAwID8gbGl0ZXJhbChgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYCkgOiBsaXRlcmFsKCd1Jyl9XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC50aGVuKCh1c2VycykgPT4gcGFyc2VVc2VyTGlzdCh1c2VycykpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVmcmVzaFNlc3Npb24gPSAoe2V4cGlyZXMsIHRva2VufSk6IFNlc3Npb25Ub2tlbiB8IFNlc3Npb25FcnJvciA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qge3BlcnNvbmFJZCwgdXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2Vzc30gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgICByZXR1cm4gY3JlYXRlVXNlclRva2VuKHVzZXJJZCwgcGVyc29uYUlkIHx8ICcnLCB1c2VybmFtZSwgdXNlckFjY2VzcywgZXhwaXJlcyk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdGhlIGVycm9yIGZyb20gZ2V0U2Vzc2lvblxuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbkluID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHtleHBpcmVzLCB1c2VyfSk6IFByb21pc2U8U2Vzc2lvblRva2VuIHwgbnVsbD4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbkluJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWwsIHBhc3N3b3JkLCBwaG9uZSwgdXNlcm5hbWV9ID0gdXNlciB8fCB7fTtcbiAgY29uc3QgZm9ybWF0RW1haWwgPSBwYXJzZUVtYWlsKGVtYWlsKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWUgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQgPSBwYXJzZVBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgY29uc3QgZm9ybWF0UGhvbmUgPSBwYXJzZVBob25lKHBob25lKTtcbiAgY29uc3QgZm9ybWF0RXhwaXJlcyA9IHBhcnNlTnVtKGV4cGlyZXMpIHx8IDE1O1xuXG4gIGlmKCghZm9ybWF0VXNlcm5hbWUgJiYgIWZvcm1hdEVtYWlsICYmICFmb3JtYXRQaG9uZSkgfHwgIWZvcm1hdFBhc3N3b3JkKSB7XG4gICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIGZvcm1hdEVtYWlsLCBmb3JtYXRQaG9uZSwgZm9ybWF0VXNlcm5hbWUsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVycyA9IGJ1aWxkVXNlckF0dHJpYnV0ZUZpbHRlcnMoe1xuICAgIGVtYWlsOiBmb3JtYXRFbWFpbCxcbiAgICBwaG9uZTogZm9ybWF0UGhvbmUsXG4gICAgdXNlcm5hbWU6IGZvcm1hdFVzZXJuYW1lXG4gIH0pO1xuICBjb25zdCBmaWx0ZXJDbGF1c2UgPSBidWlsZEZpbHRlckNsYXVzZShmaWx0ZXJzLCAndScpO1xuXG4gIGNvbnN0IGNoZWNrUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB1IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgRklMVEVSICR7bGl0ZXJhbChmaWx0ZXJDbGF1c2UpfVxuICAgICAgUkVUVVJOIHVcbiAgYDtcblxuICBsZXQgY2hlY2tVc2VyczogVXNlclR5cGVbXTtcblxuICB0cnkge1xuICAgIGNoZWNrVXNlcnMgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IGNoZWNrVXNlciA9IGNoZWNrVXNlcnMuZmluZCgodXNlckl0ZW0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtwYXNzd29yZDogdmFsaWRQYXNzd29yZCwgc2FsdH0gPSB1c2VySXRlbSBhcyBVc2VyVHlwZTtcbiAgICByZXR1cm4gQm9vbGVhbih2YWxpZFBhc3N3b3JkICYmIHNhbHQgJiYgdmFsaWRQYXNzd29yZCA9PT0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpKTtcbiAgfSk7XG5cbiAgaWYoIWNoZWNrVXNlcikge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgaWYoY2hlY2tVc2VyLmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBfa2V5OiB1c2VySWQsXG4gICAgcGVyc29uYUlkLFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcm5hbWU6IGNoZWNrVXNlcm5hbWVcbiAgfSA9IGNoZWNrVXNlciBhcyBVc2VyVHlwZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gY3JlYXRlVXNlclRva2VuKHVzZXJJZCB8fCAnJywgcGVyc29uYUlkIHx8ICcnLCBjaGVja1VzZXJuYW1lIHx8ICcnLCB1c2VyQWNjZXNzLCBmb3JtYXRFeHBpcmVzKTtcblxuICAgIHJldHVybiB0b2tlbjtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25PdXQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnc2lnbk91dCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG5cbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIGxhc3RPbmxpbmU6IERhdGUubm93KCksXG4gICAgc2Vzc2lvbklkOiBudWxsXG4gIH07XG4gIGNvbnN0IHNlc3Npb25RdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pXG4gICAgVVBEQVRFIHUgV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnNcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHNlc3Npb25RdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aXZlVXNlckNvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0QWN0aXZlVXNlckNvdW50JztcblxuICByZXR1cm4gY291bnRJdGVtcyhjb250ZXh0LCAndXNlcnMnLCB7XG4gICAgbG9naWM6ICdBTkQnLFxuICAgIGNvbmRpdGlvbnM6IFt7ZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHRydWV9XVxuICB9IGFzIGFueSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlckJ5VG9rZW4gPSAoY29udGV4dDogQXBpQ29udGV4dCwgdG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJCeVRva2VuJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7dXNlcklkfSA9IGdldFNlc3Npb24odG9rZW4pO1xuICBjb25zdCB1c2VyRG9jSWQgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3VzZXJJZH1gKTtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoXCIke3VzZXJEb2NJZH1cIikgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHtcbiAgICAgIGlmKHVzZXI/LmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgcGFyYW1zOiB7dXNlcklkfSxcbiAgICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VVc2VyU2FmZSh1c2VyKSBhcyBVc2VyVHlwZTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge3VzZXJJZH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuIl0sIm5hbWVzIjpbInBhcnNlTnVtIiwiY3JlYXRlSGFzaCIsImNyZWF0ZVBhc3N3b3JkIiwicGFyc2VBcmFuZ29JZCIsInBhcnNlQ2hhciIsInBhcnNlRW1haWwiLCJwYXJzZVBhc3N3b3JkIiwicGFyc2VQaG9uZSIsInBhcnNlVXNlcm5hbWUiLCJhcWwiLCJsaXRlcmFsIiwiRGF0ZVRpbWUiLCJwYXJzZVVzZXIiLCJwYXJzZVVzZXJTYWZlIiwiQ29uZmlnIiwiQ09MTEVDVElPTlMiLCJFREdFUyIsInZlcmlmeUVtYWlsVGVtcGxhdGUiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJsb2dFeGNlcHRpb24iLCJidWlsZEZpbHRlckNsYXVzZSIsImJ1aWxkUHJlc2VudEZpbHRlckdyb3VwIiwiZ2V0RG9jSWQiLCJnZXRMaW1pdCIsInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCJ1c2VEYiIsImRldGVjdExhbmd1YWdlIiwiZ2V0U2Vzc2lvbiIsInNldFNlc3Npb24iLCJnZXRTdHJpcGVDbGllbnQiLCJhZGRJdGVtIiwiY291bnRJdGVtcyIsImdldEl0ZW1CeSIsImdldExpc3RCeSIsInVwZGF0ZUl0ZW0iLCJzZW5kRW1haWwiLCJhZGRQZXJzb25hIiwic2VuZFNtcyIsImV2ZW50Q2F0ZWdvcnkiLCJWRVJJRklDQVRJT05fRU1BSUxfQ09PTERPV05fTVMiLCJ1c2Vyc0NvbGxlY3Rpb24iLCJVU0VSUyIsImhhc1JlYWN0aW9uQ29sbGVjdGlvbiIsIkhBU19SRUFDVElPTiIsImlzVGFnZ2VkQ29sbGVjdGlvbiIsIklTX1RBR0dFRCIsImhhc0Nvbm5lY3Rpb25Db2xsZWN0aW9uIiwiSEFTX0NPTk5FQ1RJT04iLCJnZXRBcHBOYW1lIiwiY29udGV4dCIsImNvbmZpZyIsImRldGFpbHMiLCJuYW1lIiwiZ2V0IiwiZ2V0QXBwVGl0bGUiLCJhcHBOYW1lIiwic3BsaXQiLCJtYXAiLCJwYXJ0IiwidGVzdCIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJqb2luIiwiYnVpbGRWZXJpZmljYXRpb25FbWFpbCIsInZlcmlmaWVkRW1haWxDb2RlIiwidXNlciIsImFwcFRpdGxlIiwiY29kZSIsInBhcnNlRW1haWxUZW1wbGF0ZSIsInRlbXBsYXRlIiwicmVwbGFjZUFsbCIsImh0bWwiLCJ2ZXJpZmljYXRpb25FbWFpbFRlbXBsYXRlIiwic3ViamVjdCIsInZlcmlmaWNhdGlvbkVtYWlsU3ViamVjdCIsInRleHQiLCJ2ZXJpZmljYXRpb25FbWFpbFRleHQiLCJVc2VyQWNjZXNzIiwiY3JlYXRlVXNlclRva2VuIiwidXNlcklkIiwicGVyc29uYUlkIiwidXNlcm5hbWUiLCJ1c2VyQWNjZXNzIiwiZXhwaXJlc0luTWludXRlcyIsIm5vdyIsImxvY2FsIiwic2Vzc2lvbkV4cGlyZXMiLCJwbHVzIiwibWludXRlcyIsImlhdCIsIk1hdGgiLCJmbG9vciIsInRvU2Vjb25kcyIsImV4cCIsInRva2VuIiwiZXhwaXJlcyIsInRvTWlsbGlzIiwiaXNzdWVkIiwicGFyc2VVc2VyTGlzdCIsInVzZXJzIiwicmVkdWNlIiwicmVzdWx0IiwicGFyc2VkVXNlciIsInB1c2giLCJidWlsZFVzZXJBdHRyaWJ1dGVGaWx0ZXJzIiwiZW1haWwiLCJwaG9uZSIsImFjdGl2ZSIsImF0dHJpYnV0ZUZpbHRlcnMiLCJfa2V5IiwibG9naWMiLCJjb25kaXRpb25zIiwibGVuZ3RoIiwiZmllbGQiLCJvcGVyYXRvciIsInZhbHVlIiwiZ2V0VXNlckJ5QXR0cmlidXRlcyIsIm9wdGlvbnMiLCJmaWx0ZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRVc2VyT3B0aW9uYWxGaWVsZHMiLCJmaWVsZHMiLCJzZWxlY3RzIiwiaW5jbHVkZXMiLCJvYmplY3RzIiwicXVlcmllcyIsInBhcnNlVXNlck9wdGlvbnMiLCJmcm9tIiwidG8iLCJsaW1pdCIsImFkZFVzZXIiLCJhY3Rpb24iLCJsYW5ndWFnZUNvbnRleHQiLCJjb25maXJtIiwiX2NvbmZpcm0iLCJuZXdVc2VyIiwicGFzc3dvcmQiLCJfaWQiLCJpbnNlcnRVc2VyIiwiaGFzUGFzc3dvcmQiLCJoYXNVc2VybmFtZSIsImNhdGVnb3J5IiwicGFyYW1zIiwiSU5WQUxJRF9BUkdVTUVOVFMiLCJoYXNoSWQiLCJzYWx0IiwiZW5jcnlwdGVkUGFzc3dvcmQiLCJleGlzdGluZ1VzZXIiLCJFWElTVElOR19JVEVNIiwiZXJyb3IiLCJEQVRBQkFTRV9FUlJPUiIsInBob25lQ291bnRyeUNvZGUiLCJyZXBsYWNlIiwic3Vic3RyaW5nIiwibG9jYWxlIiwidXNlclByZWZlcmVuY2UiLCJyYW5kb20iLCJ2ZXJpZmllZFNtc0NvZGUiLCJpbnNlcnQiLCJ2ZXJpZmllZEVtYWlsIiwidmVyaWZpZWRQaG9uZSIsInRoZW4iLCJzYXZlZFVzZXIiLCJzYXZlZFVzZXJJZCIsInBlcnNvbmEiLCJ1cGRhdGVkVXNlciIsInJlc3VsdFVzZXIiLCJwZXJzb25hRXJyb3IiLCJjYXRjaCIsInVwZGF0ZVVzZXIiLCJ1cGRhdGVGaWVsZHMiLCJpZCIsInVwZGF0ZSIsImRhdGFiYXNlTmFtZSIsInF1ZXJ5IiwiY3Vyc29yIiwibmV4dCIsInVwZGF0ZWRVc2VyUmVzdWx0IiwiZm9yZ290UGFzc3dvcmQiLCJjb2RlRXhwaXJlcyIsIkRhdGUiLCJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsInZlcmlmaWVkUGhvbmVFeHBpcmVzIiwidXNlckRvY0lkIiwicmVzZXRQYXNzd29yZCIsImZvcm1hdFBhc3N3b3JkIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwidXBkYXRlUXVlcnkiLCJyYXdVc2VyIiwiZm91bmRVc2VyIiwiY29uZmlybUNvZGUiLCJ0eXBlIiwiaXNTbXMiLCJmb3JtYXR0ZWRWYWx1ZSIsImZpbHRlckJ5VHlwZSIsImFxbFF1ZXJ5IiwiZGVsZXRlVXNlciIsInN0cmlwZUNsaWVudCIsImRlbGV0ZWRVc2VyIiwiY3VzdG9tZXJzIiwiZGVsIiwic3RyaXBlQ3VzdG9tZXJJZCIsImFjY291bnRzIiwic3RyaXBlQWNjb3VudElkIiwiZGVhY3RpdmF0ZVVzZXIiLCJ1cGRhdGVkIiwiZ2V0VXNlckRpc3BsYXlOYW1lIiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJmdWxsbmFtZSIsInRyaW0iLCJnZXRTZXNzaW9uVXNlciIsInNlc3Npb24iLCJzZXNzaW9uSWQiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImZvcm1hdFNlc3Npb25JZCIsImdldFVzZXJCeUlkIiwiY3VzdG9tUXVlcmllcyIsImN1c3RvbU9iamVjdHMiLCJnZXRVc2VyTGlzdCIsImNhc2VTZW5zaXRpdmUiLCJzb3J0IiwiZGlyZWN0aW9uIiwic3RhcnQiLCJudW0iLCJnZXRVc2VyTGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25zIiwiZm9ybWF0UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lIiwidG9Mb3dlckNhc2UiLCJmb3JtYXRVc2VybmFtZSIsImZpbHRlckJ5IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbCIsImdldFVzZXJMaXN0QnlUYWdzIiwidGFncyIsImZvcm1hdFRhZ3MiLCJsaXN0IiwidGFnTmFtZSIsImdldFVzZXJMaXN0QnlMYXRlc3QiLCJmaWx0ZXIiLCJnZXRVc2VyTGlzdEJ5Q29ubmVjdGlvbiIsImZvcm1hdFVzZXJJZCIsInJlZnJlc2hTZXNzaW9uIiwic2lnbkluIiwiZm9ybWF0RW1haWwiLCJmb3JtYXRQaG9uZSIsImZvcm1hdEV4cGlyZXMiLCJmaWx0ZXJDbGF1c2UiLCJjaGVja1F1ZXJ5IiwiY2hlY2tVc2VycyIsImNoZWNrVXNlciIsImZpbmQiLCJ1c2VySXRlbSIsInZhbGlkUGFzc3dvcmQiLCJCb29sZWFuIiwiSU5WQUxJRF9BVVRIRU5USUNBVElPTiIsImNoZWNrVXNlcm5hbWUiLCJzaWduT3V0IiwibGFzdE9ubGluZSIsInNlc3Npb25RdWVyeSIsImdldEFjdGl2ZVVzZXJDb3VudCIsImdldFVzZXJCeVRva2VuIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxRQUFRLFFBQU8sK0JBQStCO0FBQ3RELFNBQ0VDLFVBQVUsRUFDVkMsY0FBYyxFQUNkQyxhQUFhLEVBQ2JDLFNBQVMsRUFDVEMsVUFBVSxFQUNWQyxhQUFhLEVBQ2JDLFVBQVUsRUFDVkMsYUFBYSxRQUNSLCtCQUErQjtBQUN0QyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUNyQyxTQUFRQyxRQUFRLFFBQU8sUUFBUTtBQUUvQixTQUFRQyxTQUFTLEVBQUVDLGFBQWEsUUFBTyw2QkFBNkI7QUFDcEUsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELE9BQU9DLHlCQUF5QixvQ0FBb0M7QUFDcEUsU0FBUUMsVUFBVSxRQUEwQiwwQkFBMEI7QUFDdEUs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