@nlabs/reaktor 1.17.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/README.md +182 -0
  2. package/docs/ASSISTANT.md +138 -0
  3. package/docs/GENERATION.md +42 -5
  4. package/docs/NATIVE_PUSH.md +56 -0
  5. package/lib/actions/alfredFaq.d.ts +80 -0
  6. package/lib/actions/alfredFaq.js +206 -0
  7. package/lib/actions/analytics.js +1 -1
  8. package/lib/actions/apps.js +1 -1
  9. package/lib/actions/connections.js +1 -1
  10. package/lib/actions/content.js +1 -1
  11. package/lib/actions/contentGeneration.d.ts +4 -0
  12. package/lib/actions/contentGeneration.js +82 -10
  13. package/lib/actions/contentGenerationErrors.js +1 -1
  14. package/lib/actions/conversations.d.ts +1 -1
  15. package/lib/actions/conversations.js +19 -9
  16. package/lib/actions/crm.js +1 -1
  17. package/lib/actions/crud.js +26 -1
  18. package/lib/actions/databaseAccounts.js +1 -1
  19. package/lib/actions/databaseProvisioningLease.js +1 -1
  20. package/lib/actions/dynamodb.js +1 -1
  21. package/lib/actions/email.js +1 -1
  22. package/lib/actions/files.js +1 -1
  23. package/lib/actions/flags.js +1 -1
  24. package/lib/actions/geminiVideo.js +1 -1
  25. package/lib/actions/groups.js +1 -1
  26. package/lib/actions/higgsfield.js +1 -1
  27. package/lib/actions/imageGeneration.js +1 -1
  28. package/lib/actions/images.js +1 -1
  29. package/lib/actions/index.d.ts +1 -0
  30. package/lib/actions/index.js +2 -1
  31. package/lib/actions/ios.js +1 -1
  32. package/lib/actions/locations.js +1 -1
  33. package/lib/actions/messages.js +23 -7
  34. package/lib/actions/notifications.js +1 -1
  35. package/lib/actions/ollamaGeneration.js +1 -1
  36. package/lib/actions/openaiResponseSession.js +1 -1
  37. package/lib/actions/payments.js +1 -1
  38. package/lib/actions/personas.js +1 -1
  39. package/lib/actions/phoneSupport.js +1 -1
  40. package/lib/actions/posts.js +1 -1
  41. package/lib/actions/query.js +1 -1
  42. package/lib/actions/reactions.js +1 -1
  43. package/lib/actions/rum.js +1 -1
  44. package/lib/actions/s3.js +1 -1
  45. package/lib/actions/search.js +1 -1
  46. package/lib/actions/sms.js +1 -1
  47. package/lib/actions/statistics.js +1 -1
  48. package/lib/actions/subscriptions.js +1 -1
  49. package/lib/actions/tags.js +1 -1
  50. package/lib/actions/users.js +57 -4
  51. package/lib/actions/videoGeneration.js +1 -1
  52. package/lib/actions/videos.js +1 -1
  53. package/lib/adapters/arangoAdapter.js +1 -1
  54. package/lib/adapters/contentAdapter.js +1 -1
  55. package/lib/adapters/fileAdapter.js +1 -1
  56. package/lib/adapters/geminiGenerationAdapter.js +1 -1
  57. package/lib/adapters/higgsfieldAdapter.js +1 -1
  58. package/lib/adapters/higgsfieldModelCatalog.js +1 -1
  59. package/lib/adapters/higgsfieldModels.js +1 -1
  60. package/lib/adapters/imageAdapter.js +1 -1
  61. package/lib/adapters/imageGenerationAdapter.js +1 -1
  62. package/lib/adapters/index.js +1 -1
  63. package/lib/adapters/messageAdapter.js +1 -1
  64. package/lib/adapters/postAdapter.js +1 -1
  65. package/lib/adapters/reaktorAdapter.js +1 -1
  66. package/lib/adapters/tagAdapter.js +1 -1
  67. package/lib/adapters/userAdapter.js +1 -1
  68. package/lib/assistant/core.d.ts +53 -0
  69. package/lib/assistant/core.js +123 -0
  70. package/lib/assistant/faq.d.ts +26 -0
  71. package/lib/assistant/faq.js +238 -0
  72. package/lib/assistant/faqCore.d.ts +23 -0
  73. package/lib/assistant/faqCore.js +20 -0
  74. package/lib/assistant/index.d.ts +7 -0
  75. package/lib/assistant/index.js +5 -0
  76. package/lib/assistant/service.d.ts +35 -0
  77. package/lib/assistant/service.js +201 -0
  78. package/lib/config.js +1 -1
  79. package/lib/constants/collections.js +1 -1
  80. package/lib/durableChat/conversations.d.ts +62 -0
  81. package/lib/durableChat/conversations.js +729 -0
  82. package/lib/durableChat/errors.d.ts +6 -0
  83. package/lib/durableChat/errors.js +11 -0
  84. package/lib/durableChat/events.d.ts +22 -0
  85. package/lib/durableChat/events.js +50 -0
  86. package/lib/durableChat/index.d.ts +8 -0
  87. package/lib/durableChat/index.js +10 -0
  88. package/lib/durableChat/membership.d.ts +24 -0
  89. package/lib/durableChat/membership.js +85 -0
  90. package/lib/durableChat/messageTypes.d.ts +76 -0
  91. package/lib/durableChat/messageTypes.js +3 -0
  92. package/lib/durableChat/messages.d.ts +16 -0
  93. package/lib/durableChat/messages.js +257 -0
  94. package/lib/durableChat/transaction.d.ts +10 -0
  95. package/lib/durableChat/transaction.js +53 -0
  96. package/lib/durableChat/types.d.ts +81 -0
  97. package/lib/durableChat/types.js +3 -0
  98. package/lib/handlers/graphqlHandler.js +1 -1
  99. package/lib/index.d.ts +4 -4
  100. package/lib/index.js +5 -3
  101. package/lib/lambdas/actions/websockets.js +4 -4
  102. package/lib/lambdas/authorizer.js +1 -1
  103. package/lib/lambdas/connection.js +1 -1
  104. package/lib/lambdas/utils/message.js +1 -1
  105. package/lib/lambdas/utils/websocket.js +1 -1
  106. package/lib/mocks/conversation.js +1 -1
  107. package/lib/mocks/file.js +1 -1
  108. package/lib/mocks/group.js +1 -1
  109. package/lib/mocks/image.js +1 -1
  110. package/lib/mocks/post.js +1 -1
  111. package/lib/mocks/tag.js +1 -1
  112. package/lib/mocks/user.js +1 -1
  113. package/lib/mocks/video.js +1 -1
  114. package/lib/mutations/analytics/analytics.js +1 -1
  115. package/lib/mutations/content/content.js +1 -1
  116. package/lib/mutations/crm/crm.js +1 -1
  117. package/lib/mutations/events/events.js +1 -1
  118. package/lib/mutations/flags/flags.js +1 -1
  119. package/lib/mutations/groups/groups.js +1 -1
  120. package/lib/mutations/higgsfield/higgsfield.js +1 -1
  121. package/lib/mutations/images/images.js +1 -1
  122. package/lib/mutations/index.js +1 -1
  123. package/lib/mutations/locations/locations.js +1 -1
  124. package/lib/mutations/messages/messages.js +1 -1
  125. package/lib/mutations/personas/personas.js +1 -1
  126. package/lib/mutations/posts/posts.js +1 -1
  127. package/lib/mutations/reactions/reactions.js +1 -1
  128. package/lib/mutations/rum/rum.js +1 -1
  129. package/lib/mutations/statistics/statistics.js +1 -1
  130. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  131. package/lib/mutations/tags/tags.js +1 -1
  132. package/lib/mutations/users/users.js +1 -1
  133. package/lib/mutations/videos/videos.js +1 -1
  134. package/lib/nativePush/graphql.d.ts +14 -0
  135. package/lib/nativePush/graphql.js +105 -0
  136. package/lib/nativePush/index.d.ts +7 -0
  137. package/lib/nativePush/index.js +9 -0
  138. package/lib/nativePush/migrations.d.ts +2 -0
  139. package/lib/nativePush/migrations.js +36 -0
  140. package/lib/nativePush/nativePushContract.fixture.d.ts +22 -0
  141. package/lib/nativePush/nativePushContract.fixture.js +27 -0
  142. package/lib/nativePush/payload.d.ts +2 -0
  143. package/lib/nativePush/payload.js +106 -0
  144. package/lib/nativePush/repository.d.ts +9 -0
  145. package/lib/nativePush/repository.js +120 -0
  146. package/lib/nativePush/service.d.ts +2 -0
  147. package/lib/nativePush/service.js +110 -0
  148. package/lib/nativePush/snsProvider.d.ts +17 -0
  149. package/lib/nativePush/snsProvider.js +165 -0
  150. package/lib/nativePush/types.d.ts +89 -0
  151. package/lib/nativePush/types.js +3 -0
  152. package/lib/objectTypes/analytics.js +1 -1
  153. package/lib/objectTypes/app.js +1 -1
  154. package/lib/objectTypes/bankAccount.js +1 -1
  155. package/lib/objectTypes/connection.js +1 -1
  156. package/lib/objectTypes/content.js +1 -1
  157. package/lib/objectTypes/contentGeneration.js +1 -1
  158. package/lib/objectTypes/conversation.js +1 -1
  159. package/lib/objectTypes/creditCard.js +1 -1
  160. package/lib/objectTypes/crm.js +1 -1
  161. package/lib/objectTypes/document.js +1 -1
  162. package/lib/objectTypes/error.js +1 -1
  163. package/lib/objectTypes/event.js +1 -1
  164. package/lib/objectTypes/external.js +1 -1
  165. package/lib/objectTypes/file.js +1 -1
  166. package/lib/objectTypes/filter.js +1 -1
  167. package/lib/objectTypes/flag.js +1 -1
  168. package/lib/objectTypes/group.js +1 -1
  169. package/lib/objectTypes/higgsfield.js +1 -1
  170. package/lib/objectTypes/iapSubscription.js +1 -1
  171. package/lib/objectTypes/image.js +1 -1
  172. package/lib/objectTypes/imageGeneration.js +1 -1
  173. package/lib/objectTypes/index.js +1 -1
  174. package/lib/objectTypes/location.js +1 -1
  175. package/lib/objectTypes/message.js +1 -1
  176. package/lib/objectTypes/passcode.js +1 -1
  177. package/lib/objectTypes/persona.js +1 -1
  178. package/lib/objectTypes/plan.js +1 -1
  179. package/lib/objectTypes/post.js +1 -1
  180. package/lib/objectTypes/query.js +1 -1
  181. package/lib/objectTypes/reaction.js +1 -1
  182. package/lib/objectTypes/relation.js +1 -1
  183. package/lib/objectTypes/rum.js +1 -1
  184. package/lib/objectTypes/search.js +1 -1
  185. package/lib/objectTypes/statistics.js +1 -1
  186. package/lib/objectTypes/subscription.js +1 -1
  187. package/lib/objectTypes/tag.js +1 -1
  188. package/lib/objectTypes/user.js +1 -1
  189. package/lib/objectTypes/video.js +1 -1
  190. package/lib/objectTypes/videoGeneration.js +1 -1
  191. package/lib/organizations/accountLifecycle.d.ts +7 -0
  192. package/lib/organizations/accountLifecycle.js +106 -0
  193. package/lib/organizations/authorization.d.ts +9 -0
  194. package/lib/organizations/authorization.js +40 -0
  195. package/lib/organizations/billing.d.ts +38 -0
  196. package/lib/organizations/billing.js +277 -0
  197. package/lib/organizations/billingProvider.d.ts +4 -0
  198. package/lib/organizations/billingProvider.js +287 -0
  199. package/lib/organizations/billingUpdates.d.ts +9 -0
  200. package/lib/organizations/billingUpdates.js +388 -0
  201. package/lib/organizations/index.d.ts +10 -0
  202. package/lib/organizations/index.js +12 -0
  203. package/lib/organizations/mail.d.ts +10 -0
  204. package/lib/organizations/mail.js +60 -0
  205. package/lib/organizations/memberDirectory.d.ts +15 -0
  206. package/lib/organizations/memberDirectory.js +28 -0
  207. package/lib/organizations/membership.d.ts +19 -0
  208. package/lib/organizations/membership.js +248 -0
  209. package/lib/organizations/passwordRecovery.d.ts +9 -0
  210. package/lib/organizations/passwordRecovery.js +50 -0
  211. package/lib/organizations/plans.d.ts +6 -0
  212. package/lib/organizations/plans.js +40 -0
  213. package/lib/organizations/providerPagination.d.ts +6 -0
  214. package/lib/organizations/providerPagination.js +23 -0
  215. package/lib/organizations/reconciliation.d.ts +11 -0
  216. package/lib/organizations/reconciliation.js +400 -0
  217. package/lib/organizations/signup.d.ts +25 -0
  218. package/lib/organizations/signup.js +169 -0
  219. package/lib/organizations/store.d.ts +25 -0
  220. package/lib/organizations/store.js +167 -0
  221. package/lib/organizations/types.d.ts +138 -0
  222. package/lib/organizations/types.js +3 -0
  223. package/lib/organizations/verification.d.ts +3 -0
  224. package/lib/organizations/verification.js +51 -0
  225. package/lib/queries/analytics/analytics.js +1 -1
  226. package/lib/queries/content/content.js +1 -1
  227. package/lib/queries/crm/crm.js +1 -1
  228. package/lib/queries/events/events.js +1 -1
  229. package/lib/queries/flags/flags.js +1 -1
  230. package/lib/queries/groups/groups.js +1 -1
  231. package/lib/queries/higgsfield/higgsfield.js +1 -1
  232. package/lib/queries/images/images.js +1 -1
  233. package/lib/queries/index.js +1 -1
  234. package/lib/queries/locations/locations.js +1 -1
  235. package/lib/queries/messages/messages.js +1 -1
  236. package/lib/queries/personas/personas.js +1 -1
  237. package/lib/queries/posts/posts.js +1 -1
  238. package/lib/queries/query/query.js +1 -1
  239. package/lib/queries/reactions/reactions.js +1 -1
  240. package/lib/queries/statistics/statistics.js +1 -1
  241. package/lib/queries/subscriptions/subscriptions.js +1 -1
  242. package/lib/queries/tags/tags.js +1 -1
  243. package/lib/queries/users/users.js +1 -1
  244. package/lib/queries/videos/videos.js +1 -1
  245. package/lib/templates/email/layout.js +1 -1
  246. package/lib/templates/email/passwordForgot.js +1 -1
  247. package/lib/templates/email/passwordRecovery.js +1 -1
  248. package/lib/templates/email/verifyEmail.js +1 -1
  249. package/lib/templates/email/welcome.js +1 -1
  250. package/lib/templates/sms/passwordForgot.js +1 -1
  251. package/lib/templates/sms/passwordRecovery.js +1 -1
  252. package/lib/templates/sms/verifyEmail.js +1 -1
  253. package/lib/templates/sms/verifyPhone.js +1 -1
  254. package/lib/templates/sms/welcome.js +1 -1
  255. package/lib/types/analytics.types.js +1 -1
  256. package/lib/types/apps.types.js +1 -1
  257. package/lib/types/arangodb.types.js +1 -1
  258. package/lib/types/auth.types.js +1 -1
  259. package/lib/types/connections.types.js +1 -1
  260. package/lib/types/content.types.js +1 -1
  261. package/lib/types/conversations.types.js +1 -1
  262. package/lib/types/crm.types.js +1 -1
  263. package/lib/types/databaseCredentials.types.js +1 -1
  264. package/lib/types/email.types.js +1 -1
  265. package/lib/types/error.types.js +1 -1
  266. package/lib/types/files.types.js +1 -1
  267. package/lib/types/flags.types.js +1 -1
  268. package/lib/types/google.types.js +1 -1
  269. package/lib/types/groups.types.js +1 -1
  270. package/lib/types/images.types.js +1 -1
  271. package/lib/types/index.js +1 -1
  272. package/lib/types/locations.types.js +1 -1
  273. package/lib/types/messages.types.js +1 -1
  274. package/lib/types/notifications.types.js +1 -1
  275. package/lib/types/payments.types.js +1 -1
  276. package/lib/types/personas.types.js +1 -1
  277. package/lib/types/posts.types.js +1 -1
  278. package/lib/types/rum.types.js +1 -1
  279. package/lib/types/statistics.types.js +1 -1
  280. package/lib/types/tags.types.js +1 -1
  281. package/lib/types/users.types.js +1 -1
  282. package/lib/types/videos.types.js +1 -1
  283. package/lib/types/websockets.types.js +1 -1
  284. package/lib/upload.js +1 -1
  285. package/lib/utils/adapterUtils.js +1 -1
  286. package/lib/utils/analyticsUtils.js +1 -1
  287. package/lib/utils/appContext.js +1 -1
  288. package/lib/utils/aqlHelpers.js +1 -1
  289. package/lib/utils/arangodbUtils.js +1 -1
  290. package/lib/utils/authUtils.js +1 -1
  291. package/lib/utils/awsUtils.js +1 -1
  292. package/lib/utils/collectionRegistry.js +1 -1
  293. package/lib/utils/contextUtils.js +1 -1
  294. package/lib/utils/databaseCredentials.js +1 -1
  295. package/lib/utils/dbI18n.example.js +1 -1
  296. package/lib/utils/dbI18n.js +1 -1
  297. package/lib/utils/generationCallback.js +1 -1
  298. package/lib/utils/googleTranslate.js +1 -1
  299. package/lib/utils/graphqlUtils.js +1 -1
  300. package/lib/utils/imageUtils.js +1 -1
  301. package/lib/utils/index.js +1 -1
  302. package/lib/utils/languageDetection.js +1 -1
  303. package/lib/utils/localeUtils.example.js +1 -1
  304. package/lib/utils/localeUtils.js +1 -1
  305. package/lib/utils/mediaAccess.js +1 -1
  306. package/lib/utils/middlewareUtils.js +1 -1
  307. package/lib/utils/nodeRealtime.js +1 -1
  308. package/lib/utils/opaqueToken.js +1 -1
  309. package/lib/utils/queryBuilder.js +1 -1
  310. package/lib/utils/schemaUtils.js +1 -1
  311. package/lib/utils/secretDatabase.js +1 -1
  312. package/lib/utils/sessionUtils.js +1 -1
  313. package/lib/utils/stripeUtils.js +1 -1
  314. package/lib/utils/stripeUtils.ts.bak +1 -1
  315. package/lib/utils/templateUtils.js +1 -1
  316. package/lib/utils/testUtils.js +1 -1
  317. package/lib/utils/translationQueue.example.js +1 -1
  318. package/lib/utils/translationQueue.js +1 -1
  319. package/lib/videoProcessing.js +1 -1
  320. package/package.json +16 -3
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
3
3
  * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
- */ import { cloneDeep } from '@nlabs/utils/objects/clone';
4
+ */ /* eslint no-underscore-dangle: ["error", {"allow": ["_id", "_key"]}] -- ArangoDB document identity fields. */ import { cloneDeep } from '@nlabs/utils/objects/clone';
5
5
  import { createHash, parseId } from '@nlabs/utils/parsers/strings';
6
6
  import { aql } from 'arangojs';
7
7
  import { literal } from 'arangojs/aql';
@@ -79,6 +79,7 @@ export const getConversationListByUser = (context, userId, options)=>{
79
79
  const userDocId = `users/${userId}`;
80
80
  const aqlQry = aql`
81
81
  FOR c, e IN 1..1 OUTBOUND ${userDocId} ${hasConversationCollection}
82
+ FILTER c.chatSchemaVersion != 1
82
83
  SORT c.added DESC
83
84
  ${literal(limit.aql)}
84
85
  LET users = (
@@ -113,7 +114,7 @@ export const getDirectConversation = async (context, { fromId, toId, toUser })=>
113
114
  const user = toUser || await getUserById(context, {
114
115
  userId: formatToId
115
116
  });
116
- const aqlQry = aql`LET c = DOCUMENT(${`conversations/${conversationId}`}) RETURN c`;
117
+ const aqlQry = aql`LET c = DOCUMENT(${`conversations/${conversationId}`}) FILTER c.chatSchemaVersion != 1 RETURN c`;
117
118
  const conversation = await useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).catch((error)=>logError({
118
119
  action,
119
120
  category: eventCategory,
@@ -201,6 +202,7 @@ export const getConnectionUserList = (context, { conversationId, includeAll = fa
201
202
  }
202
203
  const aqlQry = aql`FOR u, e,p IN 1..1 INBOUND ${`conversations/${conversationId}`} hasConversation
203
204
  OPTIONS {vertexCollections: "users"}
205
+ FILTER DOCUMENT(${`conversations/${conversationId}`}).chatSchemaVersion != 1
204
206
  FOR c IN connections
205
207
  FILTER ${filters.join(' && ')}
206
208
  RETURN c`;
@@ -227,6 +229,7 @@ export const getConversationUsers = (context, { conversationId, includeAll = fal
227
229
  }
228
230
  const aqlQry = aql`FOR u, e,p IN 1..1 INBOUND ${`conversations/${conversationId}`} hasConversation
229
231
  OPTIONS {vertexCollections: "users"}
232
+ FILTER DOCUMENT(${`conversations/${conversationId}`}).chatSchemaVersion != 1
230
233
  FILTER ${filters.join(' && ')}
231
234
  RETURN u`;
232
235
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.all()).catch((error)=>{
@@ -244,7 +247,7 @@ export const getConversationById = (context, conversationId)=>{
244
247
  const sessionDocId = `users/${sessionId}`;
245
248
  const conversationDocId = `conversations/${parseId(conversationId)}`;
246
249
  const aqlQry = aql`FOR c, e IN 1..1 OUTBOUND ${sessionDocId} hasConversation
247
- FILTER c._id == ${conversationDocId}
250
+ FILTER c._id == ${conversationDocId} AND c.chatSchemaVersion != 1
248
251
  LET u = (
249
252
  FOR inUser, inEdge IN 1..1 INBOUND ${conversationDocId} hasConversation
250
253
  RETURN inUser
@@ -275,7 +278,9 @@ export const updateConversation = (context, conversation)=>{
275
278
  ...cloneDeep(update),
276
279
  _key: formatConversationId
277
280
  };
278
- const aqlQry = aql`UPSERT {_key: ${formatConversationId} }
281
+ const aqlQry = aql`LET current = DOCUMENT('conversations', ${formatConversationId})
282
+ FILTER current.chatSchemaVersion != 1
283
+ UPSERT {_key: ${formatConversationId} }
279
284
  INSERT ${insert}
280
285
  UPDATE ${update}
281
286
  IN conversations RETURN NEW`;
@@ -292,11 +297,15 @@ export const addUserToConversation = (context, { conversationId, userId })=>{
292
297
  const formatUserId = parseId(userId);
293
298
  const conversationDocId = `conversations/${formatConversationId}`;
294
299
  const userDocId = `users/${formatUserId}`;
295
- const aqlQry = aql`FOR hc IN hasConversation
296
- FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
297
- LIMIT 1
298
- RETURN hc`;
300
+ const aqlQry = aql`LET conversation = DOCUMENT(${conversationDocId})
301
+ RETURN conversation.chatSchemaVersion == 1 ? {chatSchemaVersion: 1} : FIRST(
302
+ FOR hc IN hasConversation
303
+ FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
304
+ LIMIT 1 RETURN hc)`;
299
305
  return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((hasConversationEdge)=>{
306
+ if (hasConversationEdge?.chatSchemaVersion === 1) {
307
+ return {};
308
+ }
300
309
  if (!!hasConversationEdge) {
301
310
  return hasConversationEdge;
302
311
  }
@@ -326,6 +335,7 @@ export const deleteUserFromConversation = (context, { conversationId, userId })=
326
335
  const userDocId = `users/${formatUserId}`;
327
336
  const aqlQry = aql`FOR hc IN hasConversation
328
337
  FILTER hc._from == ${userDocId} && hc._to == ${conversationDocId}
338
+ AND DOCUMENT(${conversationDocId}).chatSchemaVersion != 1
329
339
  LIMIT 1
330
340
  REMOVE hc IN hasConversation
331
341
  RETURN OLD`;
@@ -336,4 +346,4 @@ export const deleteUserFromConversation = (context, { conversationId, userId })=
336
346
  }, error, context));
337
347
  };
338
348
 
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb252ZXJzYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2Nsb25lRGVlcH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvY2xvbmUnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7Z2V0TGltaXQsIHNvcnRJZHMsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbX0gZnJvbSAnLi9jcnVkLmpzJztcbmltcG9ydCB7Z2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlLCBpc1BlcnNvbmFWaXNpYmlsaXR5QmxvY2tlZH0gZnJvbSAnLi9wZXJzb25hcy5qcyc7XG5pbXBvcnQge2dldFVzZXJCeUlkfSBmcm9tICcuL3VzZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7QXJhbmdvRGJMaW1pdCwgRWRnZVR5cGV9IGZyb20gJy4uL3R5cGVzL2FyYW5nb2RiLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDb25uZWN0aW9uVHlwZX0gZnJvbSAnLi4vdHlwZXMvY29ubmVjdGlvbnMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb252ZXJzYXRpb25PcHRpb25zLFxuICBDb252ZXJzYXRpb25UeXBlLFxuICBDb252ZXJzYXRpb25Vc2Vyc1BhcmFtcyxcbiAgRGlyZWN0Q29udmVyc2F0aW9uUGFyYW1zLFxuICBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zXG59IGZyb20gJy4uL3R5cGVzL2NvbnZlcnNhdGlvbnMudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJUeXBlfSBmcm9tICcuLi90eXBlcy91c2Vycy50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnY29udmVyc2F0aW9ucyc7XG5jb25zdCBoYXNDb252ZXJzYXRpb25Db2xsZWN0aW9uID0gbGl0ZXJhbCgnaGFzQ29udmVyc2F0aW9uJyk7XG5cbmNvbnN0IGVuc3VyZURpcmVjdENvbnZlcnNhdGlvbkZyaWVuZHNoaXAgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGZyb21Vc2VySWQ6IHN0cmluZyxcbiAgdG9Vc2VySWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IFtmcm9tVXNlciwgdG9Vc2VyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBmcm9tVXNlcklkfSksXG4gICAgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogdG9Vc2VySWR9KVxuICBdKTtcbiAgY29uc3QgZnJvbVBlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKGZyb21Vc2VyPy5wZXJzb25hSWQgfHwgJycpKTtcbiAgY29uc3QgdG9QZXJzb25hSWQgPSBwYXJzZUlkKFN0cmluZyh0b1VzZXI/LnBlcnNvbmFJZCB8fCAnJykpO1xuXG4gIGlmKCFmcm9tUGVyc29uYUlkIHx8ICF0b1BlcnNvbmFJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT04pO1xuICB9XG5cbiAgY29uc3QgcmVsYXRpb25zaGlwID0gYXdhaXQgZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlKGNvbnRleHQsIHRvUGVyc29uYUlkLCBmcm9tUGVyc29uYUlkKTtcblxuICBpZighcmVsYXRpb25zaGlwLmlzRnJpZW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTik7XG4gIH1cbn07XG5cbmNvbnN0IGZpbHRlckJsb2NrZWRDb252ZXJzYXRpb25zID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb25zOiBDb252ZXJzYXRpb25UeXBlW10gPSBbXVxuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3Qgc2Vzc2lvblBlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnBlcnNvbmFJZCB8fCAnJykpO1xuXG4gIGlmKCFzZXNzaW9uUGVyc29uYUlkIHx8ICFjb252ZXJzYXRpb25zLmxlbmd0aCkge1xuICAgIHJldHVybiBjb252ZXJzYXRpb25zO1xuICB9XG5cbiAgY29uc3QgdmlzaWJpbGl0eSA9IGF3YWl0IFByb21pc2UuYWxsKGNvbnZlcnNhdGlvbnMubWFwKGFzeW5jIChjb252ZXJzYXRpb24pID0+IHtcbiAgICBpZighY29udmVyc2F0aW9uPy5pc0RpcmVjdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGljaXBhbnQgPSBBcnJheS5pc0FycmF5KGNvbnZlcnNhdGlvbj8udXNlcnMpXG4gICAgICA/IGNvbnZlcnNhdGlvbi51c2Vycy5maW5kKCh1c2VyKSA9PiBwYXJzZUlkKFN0cmluZyh1c2VyPy51c2VySWQgfHwgdXNlcj8uX2tleSB8fCAnJykpICE9PSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSlcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBwYXJ0aWNpcGFudFBlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKHBhcnRpY2lwYW50Py5wZXJzb25hSWQgfHwgJycpKTtcblxuICAgIGlmKCFwYXJ0aWNpcGFudFBlcnNvbmFJZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuICEoYXdhaXQgaXNQZXJzb25hVmlzaWJpbGl0eUJsb2NrZWQoY29udGV4dCwgcGFydGljaXBhbnRQZXJzb25hSWQsIHNlc3Npb25QZXJzb25hSWQpKTtcbiAgfSkpO1xuXG4gIHJldHVybiBjb252ZXJzYXRpb25zLmZpbHRlcigoX2NvbnZlcnNhdGlvbiwgaW5kZXgpID0+IHZpc2liaWxpdHlbaW5kZXhdKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb25JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgZ2V0Q29udmVyc2F0aW9uQnlJZChjb250ZXh0LCBjb252ZXJzYXRpb25JZCk7XG5cbiAgaWYoIWNvbnZlcnNhdGlvbj8uY29udmVyc2F0aW9uSWQgJiYgIWNvbnZlcnNhdGlvbj8uX2tleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT04pO1xuICB9XG5cbiAgaWYoIWNvbnZlcnNhdGlvbj8uaXNEaXJlY3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXNzaW9uVXNlcklkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSk7XG4gIGNvbnN0IHBhcnRpY2lwYW50ID0gQXJyYXkuaXNBcnJheShjb252ZXJzYXRpb24/LnVzZXJzKVxuICAgID8gY29udmVyc2F0aW9uLnVzZXJzLmZpbmQoKHVzZXIpID0+IHBhcnNlSWQoU3RyaW5nKHVzZXI/LnVzZXJJZCB8fCB1c2VyPy5fa2V5IHx8ICcnKSkgIT09IHNlc3Npb25Vc2VySWQpXG4gICAgOiBudWxsO1xuICBjb25zdCBwYXJ0aWNpcGFudFVzZXJJZCA9IHBhcnNlSWQoU3RyaW5nKHBhcnRpY2lwYW50Py51c2VySWQgfHwgcGFydGljaXBhbnQ/Ll9rZXkgfHwgJycpKTtcblxuICBpZighc2Vzc2lvblVzZXJJZCB8fCAhcGFydGljaXBhbnRVc2VySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OKTtcbiAgfVxuXG4gIGF3YWl0IGVuc3VyZURpcmVjdENvbnZlcnNhdGlvbkZyaWVuZHNoaXAoY29udGV4dCwgc2Vzc2lvblVzZXJJZCwgcGFydGljaXBhbnRVc2VySWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlQ29udmVyc2F0aW9uT3B0aW9ucyA9IChvcHRpb25zOiBDb252ZXJzYXRpb25PcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW1pdDogZ2V0TGltaXQoZnJvbSwgdG8pIGFzIEFyYW5nb0RiTGltaXRcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJzYXRpb25MaXN0QnlVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBvcHRpb25zPyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRDb252ZXJzYXRpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VDb252ZXJzYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB1c2VyRG9jSWQgPSBgdXNlcnMvJHt1c2VySWR9YDtcbiAgY29uc3QgYXFsUXJ5ID0gYXFsYFxuICAgIEZPUiBjLCBlIElOIDEuLjEgT1VUQk9VTkQgJHt1c2VyRG9jSWR9ICR7aGFzQ29udmVyc2F0aW9uQ29sbGVjdGlvbn1cbiAgICAgIFNPUlQgYy5hZGRlZCBERVNDXG4gICAgICAke2xpdGVyYWwobGltaXQuYXFsKX1cbiAgICAgIExFVCB1c2VycyA9IChcbiAgICAgICAgRk9SIHUsIHVjIElOIDEuLjEgSU5CT1VORCBjLl9pZCAke2hhc0NvbnZlcnNhdGlvbkNvbGxlY3Rpb259XG4gICAgICAgICAgRklMVEVSIHUuX2lkICE9ICR7dXNlckRvY0lkfVxuICAgICAgICAgIFJFVFVSTiB1XG4gICAgICApXG4gICAgICBSRVRVUk4gTUVSR0UoYywge3VzZXJzfSlcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgQ29udmVyc2F0aW9uVHlwZVtdKVxuICAgIC50aGVuKChjb252ZXJzYXRpb25zKSA9PiBmaWx0ZXJCbG9ja2VkQ29udmVyc2F0aW9ucyhjb250ZXh0LCBjb252ZXJzYXRpb25zKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpcmVjdENvbnZlcnNhdGlvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGZyb21JZCxcbiAgICB0b0lkLFxuICAgIHRvVXNlclxuICB9OiBEaXJlY3RDb252ZXJzYXRpb25QYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0RGlyZWN0Q29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZm9ybWF0RnJvbUlkID0gcGFyc2VJZChmcm9tSWQpO1xuICAgIGNvbnN0IGZvcm1hdFRvSWQgPSBwYXJzZUlkKHRvSWQpO1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdENvbnZlcnNhdGlvbkZyaWVuZHNoaXAoY29udGV4dCwgZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkKTtcbiAgICBjb25zdCB1c2VySWRzID0gW2Zvcm1hdEZyb21JZCwgZm9ybWF0VG9JZF07XG4gICAgY29uc3Qgc29ydGVkVXNlcklkcyA9IHNvcnRJZHModXNlcklkcyk7XG4gICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb25zLSR7c29ydGVkVXNlcklkcy5qb2luKCctJyl9YCwgbnVsbCk7XG4gICAgY29uc3QgdXNlcjogVXNlclR5cGUgPSB0b1VzZXIgfHwgYXdhaXQgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogZm9ybWF0VG9JZH0pO1xuICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGMgPSBET0NVTUVOVCgke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0pIFJFVFVSTiBjYDtcbiAgICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcblxuICAgIGlmKGNvbnZlcnNhdGlvbikge1xuICAgICAgcmV0dXJuIHsuLi5jb252ZXJzYXRpb24sIHVzZXJzOiBbdXNlcl19O1xuICAgIH1cblxuICAgIHJldHVybiBhZGREaXJlY3RDb252ZXJzYXRpb24oY29udGV4dCwge2Zyb21JZCwgdG9JZCwgdG9Vc2VyOiB1c2VyfSk7XG4gIH0gY2F0Y2goZGF0YWJhc2VFcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZGF0YWJhc2VFcnJvciwgY29udGV4dCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBhZGREaXJlY3RDb252ZXJzYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBmcm9tSWQsXG4gICAgdG9JZCxcbiAgICB0b1VzZXJcbiAgfTogRGlyZWN0Q29udmVyc2F0aW9uUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldERpcmVjdENvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcblxuICB0cnkge1xuICAgIGNvbnN0IGZvcm1hdEZyb21JZCA9IHBhcnNlSWQoZnJvbUlkKTtcbiAgICBjb25zdCBmb3JtYXRUb0lkID0gcGFyc2VJZCh0b0lkKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RDb252ZXJzYXRpb25GcmllbmRzaGlwKGNvbnRleHQsIGZvcm1hdEZyb21JZCwgZm9ybWF0VG9JZCk7XG4gICAgY29uc3QgdXNlcklkcyA9IFtmb3JtYXRGcm9tSWQsIGZvcm1hdFRvSWRdO1xuICAgIGNvbnN0IHNvcnRlZFVzZXJJZHMgPSBzb3J0SWRzKHVzZXJJZHMpO1xuICAgIGNvbnN0IHVzZXI6IFVzZXJUeXBlID0gdG9Vc2VyIHx8IGF3YWl0IGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IGZvcm1hdFRvSWR9KTtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbnMtJHtzb3J0ZWRVc2VySWRzLmpvaW4oJy0nKX1gLCBudWxsKTtcblxuICAgIGNvbnN0IGluc2VydCA9IHtcbiAgICAgIF9rZXk6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgaXNEaXJlY3Q6IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZWRDb252ZXJzYXRpb24gPSBhd2FpdCBhZGRJdGVtPENvbnZlcnNhdGlvblR5cGU+KGNvbnRleHQsICdjb252ZXJzYXRpb25zJywgaW5zZXJ0KTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHVzZXJJZHMubWFwKCh1c2VySWQpID0+IHtcbiAgICAgIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYGhhc0NvbnZlcnNhdGlvbi0ke3VzZXJJZH0tJHtjb252ZXJzYXRpb25JZH1gKTtcbiAgICAgIGNvbnN0IGVkZ2U6IEVkZ2VUeXBlID0ge1xuICAgICAgICBfZnJvbTogYHVzZXJzLyR7dXNlcklkfWAsXG4gICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgX3RvOiBgY29udmVyc2F0aW9ucy8ke2NvbnZlcnNhdGlvbklkfWAsXG4gICAgICAgIGFkZGVkOiBEYXRlLm5vdygpXG4gICAgICB9O1xuICAgICAgY29uc3QgaW5zZXJ0RWRnZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtlZGdlfSBJTiBoYXNDb252ZXJzYXRpb24gUkVUVVJOIE5FV2A7XG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShpbnNlcnRFZGdlUXVlcnkpO1xuICAgIH0pKTtcblxuICAgIHJldHVybiB7Li4udXBkYXRlZENvbnZlcnNhdGlvbiwgdXNlcnM6IFt1c2VyXX07XG4gIH0gY2F0Y2goZGF0YWJhc2VFcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBkYXRhYmFzZUVycm9yLCBjb250ZXh0KTtcbiAgICByZXR1cm4ge307XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uVXNlckxpc3QgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpbmNsdWRlQWxsID0gZmFsc2UsXG4gICAgaXNEaXJlY3RcbiAgfTogQ29udmVyc2F0aW9uVXNlcnNQYXJhbXNcbik6IFByb21pc2U8Q29ubmVjdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0Q29ubmVjdGlvblVzZXJMaXN0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZH19ID0gY29udGV4dDtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbJ2MudXNlcklkID09IHUuX2tleSddO1xuXG4gIGlmKCFpbmNsdWRlQWxsKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1Ll9rZXkgIT0gJHtzZXNzaW9uVXNlcklkfWApO1xuICB9XG4gIGlmKGlzRGlyZWN0KSB7XG4gICAgZmlsdGVycy5wdXNoKGBwLnZlcnRpY2VzWzBdLmlzRGlyZWN0ID09ICR7aXNEaXJlY3R9YCk7XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1LCBlLHAgSU4gMS4uMSBJTkJPVU5EICR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSBoYXNDb252ZXJzYXRpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgIEZPUiBjIElOIGNvbm5lY3Rpb25zXG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBDb25uZWN0aW9uVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVyc2F0aW9uVXNlcnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBpbmNsdWRlQWxsID0gZmFsc2UsXG4gICAgaXNEaXJlY3RcbiAgfTogQ29udmVyc2F0aW9uVXNlcnNQYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRDb252ZXJzYXRpb25Vc2Vycyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gWydjLnVzZXJJZCA9PSB1Ll9rZXknXTtcblxuICBpZighaW5jbHVkZUFsbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5fa2V5ICE9ICR7c2Vzc2lvblVzZXJJZH1gKTtcbiAgfVxuICBpZihpc0RpcmVjdCkge1xuICAgIGZpbHRlcnMucHVzaChgcC52ZXJ0aWNlc1swXS5pc0RpcmVjdCA9PSAke2lzRGlyZWN0fWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSwgZSxwIElOIDEuLjEgSU5CT1VORCAke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0gaGFzQ29udmVyc2F0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbnZlcnNhdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvbkJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY29udmVyc2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtwYXJzZUlkKGNvbnZlcnNhdGlvbklkKX1gO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCAke3Nlc3Npb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGMuX2lkID09ICR7Y29udmVyc2F0aW9uRG9jSWR9XG4gICAgTEVUIHUgPSAoXG4gICAgICBGT1IgaW5Vc2VyLCBpbkVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7Y29udmVyc2F0aW9uRG9jSWR9IGhhc0NvbnZlcnNhdGlvblxuICAgICAgUkVUVVJOIGluVXNlclxuICAgIClcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE1FUkdFKGMsIHt1c2VyczogdX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25UeXBlKSA9PiB7XG4gICAgICBpZighY29udmVyc2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb252ZXJzYXRpb247XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQ29udmVyc2F0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGVcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlQ29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7XG4gICAgY29udmVyc2F0aW9uSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb24tJHtzZXNzaW9uSWR9IGApLFxuICAgIGlzRGlyZWN0ID0gZmFsc2UsXG4gICAgbmFtZVxuICB9ID0gY29udmVyc2F0aW9uO1xuICBjb25zdCBmb3JtYXRDb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgaXNEaXJlY3QsXG4gICAgbmFtZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydCA9IHtcbiAgICAuLi5jbG9uZURlZXAodXBkYXRlKSxcbiAgICBfa2V5OiBmb3JtYXRDb252ZXJzYXRpb25JZFxuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdENvbnZlcnNhdGlvbklkfSB9XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBjb252ZXJzYXRpb25zIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IGNvbnZlcnNhdGlvbilcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvQ29udmVyc2F0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgdXNlcklkXG4gIH06IFVwZGF0ZUNvbnZlcnNhdGlvblVzZXJQYXJhbXNcbik6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlclRvQ29udmVyc2F0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRDb252ZXJzYXRpb25JZCA9IHBhcnNlSWQoY29udmVyc2F0aW9uSWQpO1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtmb3JtYXRDb252ZXJzYXRpb25JZH1gO1xuICBjb25zdCB1c2VyRG9jSWQgPSBgdXNlcnMvJHtmb3JtYXRVc2VySWR9YDtcblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBoYyBJTiBoYXNDb252ZXJzYXRpb25cbiAgICBGSUxURVIgaGMuX2Zyb20gPT0gJHt1c2VyRG9jSWR9ICYmIGhjLl90byA9PSAke2NvbnZlcnNhdGlvbkRvY0lkfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gaGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChoYXNDb252ZXJzYXRpb25FZGdlKSA9PiB7XG4gICAgICBpZighIWhhc0NvbnZlcnNhdGlvbkVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGhhc0NvbnZlcnNhdGlvbkVkZ2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaGFzQ29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb24tJHtmb3JtYXRDb252ZXJzYXRpb25JZH0tJHtmb3JtYXRVc2VySWR9YCk7XG5cbiAgICAgIGNvbnN0IGVkZ2U6IENvbnZlcnNhdGlvblR5cGUgPSB7XG4gICAgICAgIF9mcm9tOiB1c2VyRG9jSWQsXG4gICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgX3RvOiBjb252ZXJzYXRpb25Eb2NJZCxcbiAgICAgICAgYWRkZWQ6IERhdGUubm93KClcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvblxuICAgICAgICAuc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gZWRnZSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICB1c2VySWRcbiAgfTogVXBkYXRlQ29udmVyc2F0aW9uVXNlclBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZCA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGhjLl9mcm9tID09ICR7dXNlckRvY0lkfSAmJiBoYy5fdG8gPT0gJHtjb252ZXJzYXRpb25Eb2NJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVNT1ZFIGhjIElOIGhhc0NvbnZlcnNhdGlvblxuICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG4iXSwibmFtZXMiOlsiY2xvbmVEZWVwIiwiY3JlYXRlSGFzaCIsInBhcnNlSWQiLCJhcWwiLCJsaXRlcmFsIiwiRXJyb3JUeXBlcyIsImxvZ0Vycm9yIiwiZ2V0TGltaXQiLCJzb3J0SWRzIiwidXNlRGIiLCJhZGRJdGVtIiwiZ2V0UGVyc29uYVJlbGF0aW9uc2hpcFN0YXRlIiwiaXNQZXJzb25hVmlzaWJpbGl0eUJsb2NrZWQiLCJnZXRVc2VyQnlJZCIsImV2ZW50Q2F0ZWdvcnkiLCJoYXNDb252ZXJzYXRpb25Db2xsZWN0aW9uIiwiZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcCIsImNvbnRleHQiLCJmcm9tVXNlcklkIiwidG9Vc2VySWQiLCJmcm9tVXNlciIsInRvVXNlciIsIlByb21pc2UiLCJhbGwiLCJ1c2VySWQiLCJmcm9tUGVyc29uYUlkIiwiU3RyaW5nIiwicGVyc29uYUlkIiwidG9QZXJzb25hSWQiLCJFcnJvciIsIklOVkFMSURfQVVUSEVOVElDQVRJT04iLCJyZWxhdGlvbnNoaXAiLCJpc0ZyaWVuZCIsImZpbHRlckJsb2NrZWRDb252ZXJzYXRpb25zIiwiY29udmVyc2F0aW9ucyIsInNlc3Npb25QZXJzb25hSWQiLCJzZXNzaW9uIiwibGVuZ3RoIiwidmlzaWJpbGl0eSIsIm1hcCIsImNvbnZlcnNhdGlvbiIsImlzRGlyZWN0IiwicGFydGljaXBhbnQiLCJBcnJheSIsImlzQXJyYXkiLCJ1c2VycyIsImZpbmQiLCJ1c2VyIiwiX2tleSIsInBhcnRpY2lwYW50UGVyc29uYUlkIiwiZmlsdGVyIiwiX2NvbnZlcnNhdGlvbiIsImluZGV4IiwiZW5zdXJlQ29udmVyc2F0aW9uTWVzc2FnaW5nQWxsb3dlZCIsImNvbnZlcnNhdGlvbklkIiwiZ2V0Q29udmVyc2F0aW9uQnlJZCIsInNlc3Npb25Vc2VySWQiLCJwYXJ0aWNpcGFudFVzZXJJZCIsInBhcnNlQ29udmVyc2F0aW9uT3B0aW9ucyIsIm9wdGlvbnMiLCJmcm9tIiwidG8iLCJsaW1pdCIsImdldENvbnZlcnNhdGlvbkxpc3RCeVVzZXIiLCJhY3Rpb24iLCJkYXRhYmFzZU5hbWUiLCJ1c2VyRG9jSWQiLCJhcWxRcnkiLCJxdWVyeSIsInRoZW4iLCJjdXJzb3IiLCJjYXRjaCIsImVycm9yIiwiY2F0ZWdvcnkiLCJsYWJlbCIsIkRBVEFCQVNFX0VSUk9SIiwiZ2V0RGlyZWN0Q29udmVyc2F0aW9uIiwiZnJvbUlkIiwidG9JZCIsImZvcm1hdEZyb21JZCIsImZvcm1hdFRvSWQiLCJ1c2VySWRzIiwic29ydGVkVXNlcklkcyIsImpvaW4iLCJuZXh0IiwiYWRkRGlyZWN0Q29udmVyc2F0aW9uIiwiZGF0YWJhc2VFcnJvciIsImluc2VydCIsInVwZGF0ZWRDb252ZXJzYXRpb24iLCJlZGdlSWQiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJhZGRlZCIsIkRhdGUiLCJub3ciLCJpbnNlcnRFZGdlUXVlcnkiLCJnZXRDb25uZWN0aW9uVXNlckxpc3QiLCJpbmNsdWRlQWxsIiwiZmlsdGVycyIsInB1c2giLCJnZXRDb252ZXJzYXRpb25Vc2VycyIsInNlc3Npb25JZCIsInNlc3Npb25Eb2NJZCIsImNvbnZlcnNhdGlvbkRvY0lkIiwidXBkYXRlQ29udmVyc2F0aW9uIiwibmFtZSIsImZvcm1hdENvbnZlcnNhdGlvbklkIiwidXBkYXRlIiwiYWRkVXNlclRvQ29udmVyc2F0aW9uIiwiZm9ybWF0VXNlcklkIiwiaGFzQ29udmVyc2F0aW9uRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsInNhdmUiLCJyZXR1cm5OZXciLCJkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsU0FBUyxRQUFPLDZCQUE2QjtBQUNyRCxTQUFRQyxVQUFVLEVBQUVDLE9BQU8sUUFBTywrQkFBK0I7QUFDakUsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBUUMsT0FBTyxRQUFPLGVBQWU7QUFDckMsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUNuRCxTQUFRQyxRQUFRLFFBQU8sNkJBQTZCO0FBQ3BELFNBQVFDLFFBQVEsRUFBRUMsT0FBTyxFQUFFQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ25FLFNBQVFDLE9BQU8sUUFBTyxZQUFZO0FBQ2xDLFNBQVFDLDJCQUEyQixFQUFFQywwQkFBMEIsUUFBTyxnQkFBZ0I7QUFDdEYsU0FBUUMsV0FBVyxRQUFPLGFBQWE7QUFnQnZDLE1BQU1DLGdCQUFnQjtBQUN0QixNQUFNQyw0QkFBNEJYLFFBQVE7QUFFMUMsTUFBTVkscUNBQXFDLE9BQ3pDQyxTQUNBQyxZQUNBQztJQUVBLE1BQU0sQ0FBQ0MsVUFBVUMsT0FBTyxHQUFHLE1BQU1DLFFBQVFDLEdBQUcsQ0FBQztRQUMzQ1YsWUFBWUksU0FBUztZQUFDTyxRQUFRTjtRQUFVO1FBQ3hDTCxZQUFZSSxTQUFTO1lBQUNPLFFBQVFMO1FBQVE7S0FDdkM7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
349
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jb252ZXJzYXRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG4vKiBlc2xpbnQgbm8tdW5kZXJzY29yZS1kYW5nbGU6IFtcImVycm9yXCIsIHtcImFsbG93XCI6IFtcIl9pZFwiLCBcIl9rZXlcIl19XSAtLSBBcmFuZ29EQiBkb2N1bWVudCBpZGVudGl0eSBmaWVsZHMuICovXG5pbXBvcnQge2Nsb25lRGVlcH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvY2xvbmUnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUlkfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgc29ydElkcywgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHthZGRJdGVtfSBmcm9tICcuL2NydWQuanMnO1xuaW1wb3J0IHtnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUsIGlzUGVyc29uYVZpc2liaWxpdHlCbG9ja2VkfSBmcm9tICcuL3BlcnNvbmFzLmpzJztcbmltcG9ydCB7Z2V0VXNlckJ5SWR9IGZyb20gJy4vdXNlcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcbmltcG9ydCB0eXBlIHtBcmFuZ29EYkxpbWl0LCBFZGdlVHlwZX0gZnJvbSAnLi4vdHlwZXMvYXJhbmdvZGIudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Nvbm5lY3Rpb25UeXBlfSBmcm9tICcuLi90eXBlcy9jb25uZWN0aW9ucy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbnZlcnNhdGlvbk9wdGlvbnMsXG4gIENvbnZlcnNhdGlvblR5cGUsXG4gIENvbnZlcnNhdGlvblVzZXJzUGFyYW1zLFxuICBEaXJlY3RDb252ZXJzYXRpb25QYXJhbXMsXG4gIFVwZGF0ZUNvbnZlcnNhdGlvblVzZXJQYXJhbXNcbn0gZnJvbSAnLi4vdHlwZXMvY29udmVyc2F0aW9ucy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICdjb252ZXJzYXRpb25zJztcbmNvbnN0IGhhc0NvbnZlcnNhdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKCdoYXNDb252ZXJzYXRpb24nKTtcblxuY29uc3QgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZnJvbVVzZXJJZDogc3RyaW5nLFxuICB0b1VzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgW2Zyb21Vc2VyLCB0b1VzZXJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IGZyb21Vc2VySWR9KSxcbiAgICBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiB0b1VzZXJJZH0pXG4gIF0pO1xuICBjb25zdCBmcm9tUGVyc29uYUlkID0gcGFyc2VJZChTdHJpbmcoZnJvbVVzZXI/LnBlcnNvbmFJZCB8fCAnJykpO1xuICBjb25zdCB0b1BlcnNvbmFJZCA9IHBhcnNlSWQoU3RyaW5nKHRvVXNlcj8ucGVyc29uYUlkIHx8ICcnKSk7XG5cbiAgaWYoIWZyb21QZXJzb25hSWQgfHwgIXRvUGVyc29uYUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTik7XG4gIH1cblxuICBjb25zdCByZWxhdGlvbnNoaXAgPSBhd2FpdCBnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUoY29udGV4dCwgdG9QZXJzb25hSWQsIGZyb21QZXJzb25hSWQpO1xuXG4gIGlmKCFyZWxhdGlvbnNoaXAuaXNGcmllbmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OKTtcbiAgfVxufTtcblxuY29uc3QgZmlsdGVyQmxvY2tlZENvbnZlcnNhdGlvbnMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbnZlcnNhdGlvbnM6IENvbnZlcnNhdGlvblR5cGVbXSA9IFtdXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGVbXT4gPT4ge1xuICBjb25zdCBzZXNzaW9uUGVyc29uYUlkID0gcGFyc2VJZChTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8ucGVyc29uYUlkIHx8ICcnKSk7XG5cbiAgaWYoIXNlc3Npb25QZXJzb25hSWQgfHwgIWNvbnZlcnNhdGlvbnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGNvbnZlcnNhdGlvbnM7XG4gIH1cblxuICBjb25zdCB2aXNpYmlsaXR5ID0gYXdhaXQgUHJvbWlzZS5hbGwoY29udmVyc2F0aW9ucy5tYXAoYXN5bmMgKGNvbnZlcnNhdGlvbikgPT4ge1xuICAgIGlmKCFjb252ZXJzYXRpb24/LmlzRGlyZWN0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudCA9IEFycmF5LmlzQXJyYXkoY29udmVyc2F0aW9uPy51c2VycylcbiAgICAgID8gY29udmVyc2F0aW9uLnVzZXJzLmZpbmQoKHVzZXIpID0+IHBhcnNlSWQoU3RyaW5nKHVzZXI/LnVzZXJJZCB8fCB1c2VyPy5fa2V5IHx8ICcnKSkgIT09IHBhcnNlSWQoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHBhcnRpY2lwYW50UGVyc29uYUlkID0gcGFyc2VJZChTdHJpbmcocGFydGljaXBhbnQ/LnBlcnNvbmFJZCB8fCAnJykpO1xuXG4gICAgaWYoIXBhcnRpY2lwYW50UGVyc29uYUlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIShhd2FpdCBpc1BlcnNvbmFWaXNpYmlsaXR5QmxvY2tlZChjb250ZXh0LCBwYXJ0aWNpcGFudFBlcnNvbmFJZCwgc2Vzc2lvblBlcnNvbmFJZCkpO1xuICB9KSk7XG5cbiAgcmV0dXJuIGNvbnZlcnNhdGlvbnMuZmlsdGVyKChfY29udmVyc2F0aW9uLCBpbmRleCkgPT4gdmlzaWJpbGl0eVtpbmRleF0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuc3VyZUNvbnZlcnNhdGlvbk1lc3NhZ2luZ0FsbG93ZWQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCBnZXRDb252ZXJzYXRpb25CeUlkKGNvbnRleHQsIGNvbnZlcnNhdGlvbklkKTtcblxuICBpZighY29udmVyc2F0aW9uPy5jb252ZXJzYXRpb25JZCAmJiAhY29udmVyc2F0aW9uPy5fa2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTik7XG4gIH1cblxuICBpZighY29udmVyc2F0aW9uPy5pc0RpcmVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBwYXJzZUlkKFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKTtcbiAgY29uc3QgcGFydGljaXBhbnQgPSBBcnJheS5pc0FycmF5KGNvbnZlcnNhdGlvbj8udXNlcnMpXG4gICAgPyBjb252ZXJzYXRpb24udXNlcnMuZmluZCgodXNlcikgPT4gcGFyc2VJZChTdHJpbmcodXNlcj8udXNlcklkIHx8IHVzZXI/Ll9rZXkgfHwgJycpKSAhPT0gc2Vzc2lvblVzZXJJZClcbiAgICA6IG51bGw7XG4gIGNvbnN0IHBhcnRpY2lwYW50VXNlcklkID0gcGFyc2VJZChTdHJpbmcocGFydGljaXBhbnQ/LnVzZXJJZCB8fCBwYXJ0aWNpcGFudD8uX2tleSB8fCAnJykpO1xuXG4gIGlmKCFzZXNzaW9uVXNlcklkIHx8ICFwYXJ0aWNpcGFudFVzZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT04pO1xuICB9XG5cbiAgYXdhaXQgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcChjb250ZXh0LCBzZXNzaW9uVXNlcklkLCBwYXJ0aWNpcGFudFVzZXJJZCk7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VDb252ZXJzYXRpb25PcHRpb25zID0gKG9wdGlvbnM6IENvbnZlcnNhdGlvbk9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvbkxpc3RCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udmVyc2F0aW9uT3B0aW9uc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldENvbnZlcnNhdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZUNvbnZlcnNhdGlvbk9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IGB1c2Vycy8ke3VzZXJJZH1gO1xuICBjb25zdCBhcWxRcnkgPSBhcWxgXG4gICAgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCAke3VzZXJEb2NJZH0gJHtoYXNDb252ZXJzYXRpb25Db2xsZWN0aW9ufVxuICAgICAgRklMVEVSIGMuY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgICAgU09SVCBjLmFkZGVkIERFU0NcbiAgICAgICR7bGl0ZXJhbChsaW1pdC5hcWwpfVxuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgdWMgSU4gMS4uMSBJTkJPVU5EIGMuX2lkICR7aGFzQ29udmVyc2F0aW9uQ29sbGVjdGlvbn1cbiAgICAgICAgICBGSUxURVIgdS5faWQgIT0gJHt1c2VyRG9jSWR9XG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgIClcbiAgICAgIFJFVFVSTiBNRVJHRShjLCB7dXNlcnN9KVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBDb252ZXJzYXRpb25UeXBlW10pXG4gICAgLnRoZW4oKGNvbnZlcnNhdGlvbnMpID0+IGZpbHRlckJsb2NrZWRDb252ZXJzYXRpb25zKGNvbnRleHQsIGNvbnZlcnNhdGlvbnMpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0Q29udmVyc2F0aW9uID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgZnJvbUlkLFxuICAgIHRvSWQsXG4gICAgdG9Vc2VyXG4gIH06IERpcmVjdENvbnZlcnNhdGlvblBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtYXRGcm9tSWQgPSBwYXJzZUlkKGZyb21JZCk7XG4gICAgY29uc3QgZm9ybWF0VG9JZCA9IHBhcnNlSWQodG9JZCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcChjb250ZXh0LCBmb3JtYXRGcm9tSWQsIGZvcm1hdFRvSWQpO1xuICAgIGNvbnN0IHVzZXJJZHMgPSBbZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkXTtcbiAgICBjb25zdCBzb3J0ZWRVc2VySWRzID0gc29ydElkcyh1c2VySWRzKTtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbnMtJHtzb3J0ZWRVc2VySWRzLmpvaW4oJy0nKX1gLCBudWxsKTtcbiAgICBjb25zdCB1c2VyOiBVc2VyVHlwZSA9IHRvVXNlciB8fCBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBmb3JtYXRUb0lkfSk7XG4gICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgYyA9IERPQ1VNRU5UKCR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSkgRklMVEVSIGMuY2hhdFNjaGVtYVZlcnNpb24gIT0gMSBSRVRVUk4gY2A7XG4gICAgY29uc3QgY29udmVyc2F0aW9uID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG5cbiAgICBpZihjb252ZXJzYXRpb24pIHtcbiAgICAgIHJldHVybiB7Li4uY29udmVyc2F0aW9uLCB1c2VyczogW3VzZXJdfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkRGlyZWN0Q29udmVyc2F0aW9uKGNvbnRleHQsIHtmcm9tSWQsIHRvSWQsIHRvVXNlcjogdXNlcn0pO1xuICB9IGNhdGNoKGRhdGFiYXNlRXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGRhdGFiYXNlRXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYWRkRGlyZWN0Q29udmVyc2F0aW9uID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgZnJvbUlkLFxuICAgIHRvSWQsXG4gICAgdG9Vc2VyXG4gIH06IERpcmVjdENvbnZlcnNhdGlvblBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXREaXJlY3RDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBmb3JtYXRGcm9tSWQgPSBwYXJzZUlkKGZyb21JZCk7XG4gICAgY29uc3QgZm9ybWF0VG9JZCA9IHBhcnNlSWQodG9JZCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0Q29udmVyc2F0aW9uRnJpZW5kc2hpcChjb250ZXh0LCBmb3JtYXRGcm9tSWQsIGZvcm1hdFRvSWQpO1xuICAgIGNvbnN0IHVzZXJJZHMgPSBbZm9ybWF0RnJvbUlkLCBmb3JtYXRUb0lkXTtcbiAgICBjb25zdCBzb3J0ZWRVc2VySWRzID0gc29ydElkcyh1c2VySWRzKTtcbiAgICBjb25zdCB1c2VyOiBVc2VyVHlwZSA9IHRvVXNlciB8fCBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBmb3JtYXRUb0lkfSk7XG4gICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb25zLSR7c29ydGVkVXNlcklkcy5qb2luKCctJyl9YCwgbnVsbCk7XG5cbiAgICBjb25zdCBpbnNlcnQgPSB7XG4gICAgICBfa2V5OiBjb252ZXJzYXRpb25JZCxcbiAgICAgIGlzRGlyZWN0OiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVkQ29udmVyc2F0aW9uID0gYXdhaXQgYWRkSXRlbTxDb252ZXJzYXRpb25UeXBlPihjb250ZXh0LCAnY29udmVyc2F0aW9ucycsIGluc2VydCk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh1c2VySWRzLm1hcCgodXNlcklkKSA9PiB7XG4gICAgICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBoYXNDb252ZXJzYXRpb24tJHt1c2VySWR9LSR7Y29udmVyc2F0aW9uSWR9YCk7XG4gICAgICBjb25zdCBlZGdlOiBFZGdlVHlwZSA9IHtcbiAgICAgICAgX2Zyb206IGB1c2Vycy8ke3VzZXJJZH1gLFxuICAgICAgICBfa2V5OiBlZGdlSWQsXG4gICAgICAgIF90bzogYGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gLFxuICAgICAgICBhZGRlZDogRGF0ZS5ub3coKVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGluc2VydEVkZ2VRdWVyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7ZWRnZX0gSU4gaGFzQ29udmVyc2F0aW9uIFJFVFVSTiBORVdgO1xuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoaW5zZXJ0RWRnZVF1ZXJ5KTtcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gey4uLnVwZGF0ZWRDb252ZXJzYXRpb24sIHVzZXJzOiBbdXNlcl19O1xuICB9IGNhdGNoKGRhdGFiYXNlRXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZGF0YWJhc2VFcnJvciwgY29udGV4dCk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvblVzZXJMaXN0ID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgaW5jbHVkZUFsbCA9IGZhbHNlLFxuICAgIGlzRGlyZWN0XG4gIH06IENvbnZlcnNhdGlvblVzZXJzUGFyYW1zXG4pOiBQcm9taXNlPENvbm5lY3Rpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldENvbm5lY3Rpb25Vc2VyTGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25Vc2VySWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gWydjLnVzZXJJZCA9PSB1Ll9rZXknXTtcblxuICBpZighaW5jbHVkZUFsbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5fa2V5ICE9ICR7c2Vzc2lvblVzZXJJZH1gKTtcbiAgfVxuICBpZihpc0RpcmVjdCkge1xuICAgIGZpbHRlcnMucHVzaChgcC52ZXJ0aWNlc1swXS5pc0RpcmVjdCA9PSAke2lzRGlyZWN0fWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSwgZSxwIElOIDEuLjEgSU5CT1VORCAke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0gaGFzQ29udmVyc2F0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICBGSUxURVIgRE9DVU1FTlQoJHtgY29udmVyc2F0aW9ucy8ke2NvbnZlcnNhdGlvbklkfWB9KS5jaGF0U2NoZW1hVmVyc2lvbiAhPSAxXG4gICAgRk9SIGMgSU4gY29ubmVjdGlvbnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICBSRVRVUk4gY2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbm5lY3Rpb25UeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJzYXRpb25Vc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIGluY2x1ZGVBbGwgPSBmYWxzZSxcbiAgICBpc0RpcmVjdFxuICB9OiBDb252ZXJzYXRpb25Vc2Vyc1BhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldENvbnZlcnNhdGlvblVzZXJzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvblVzZXJJZH19ID0gY29udGV4dDtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbJ2MudXNlcklkID09IHUuX2tleSddO1xuXG4gIGlmKCFpbmNsdWRlQWxsKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1Ll9rZXkgIT0gJHtzZXNzaW9uVXNlcklkfWApO1xuICB9XG4gIGlmKGlzRGlyZWN0KSB7XG4gICAgZmlsdGVycy5wdXNoKGBwLnZlcnRpY2VzWzBdLmlzRGlyZWN0ID09ICR7aXNEaXJlY3R9YCk7XG4gIH1cblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1LCBlLHAgSU4gMS4uMSBJTkJPVU5EICR7YGNvbnZlcnNhdGlvbnMvJHtjb252ZXJzYXRpb25JZH1gfSBoYXNDb252ZXJzYXRpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgIEZJTFRFUiBET0NVTUVOVCgke2Bjb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9YH0pLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIENvbnZlcnNhdGlvblR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnZlcnNhdGlvbkJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY29udmVyc2F0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q29udmVyc2F0aW9uVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbkRvY0lkID0gYGNvbnZlcnNhdGlvbnMvJHtwYXJzZUlkKGNvbnZlcnNhdGlvbklkKX1gO1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMsIGUgSU4gMS4uMSBPVVRCT1VORCAke3Nlc3Npb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGMuX2lkID09ICR7Y29udmVyc2F0aW9uRG9jSWR9IEFORCBjLmNoYXRTY2hlbWFWZXJzaW9uICE9IDFcbiAgICBMRVQgdSA9IChcbiAgICAgIEZPUiBpblVzZXIsIGluRWRnZSBJTiAxLi4xIElOQk9VTkQgJHtjb252ZXJzYXRpb25Eb2NJZH0gaGFzQ29udmVyc2F0aW9uXG4gICAgICBSRVRVUk4gaW5Vc2VyXG4gICAgKVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gTUVSR0UoYywge3VzZXJzOiB1fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChjb252ZXJzYXRpb246IENvbnZlcnNhdGlvblR5cGUpID0+IHtcbiAgICAgIGlmKCFjb252ZXJzYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnZlcnNhdGlvbjtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDb252ZXJzYXRpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uVHlwZVxuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICd1cGRhdGVDb252ZXJzYXRpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjb252ZXJzYXRpb25JZCA9IGNyZWF0ZUhhc2goYGNvbnZlcnNhdGlvbi0ke3Nlc3Npb25JZH0gYCksXG4gICAgaXNEaXJlY3QgPSBmYWxzZSxcbiAgICBuYW1lXG4gIH0gPSBjb252ZXJzYXRpb247XG4gIGNvbnN0IGZvcm1hdENvbnZlcnNhdGlvbklkID0gcGFyc2VJZChjb252ZXJzYXRpb25JZCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBpc0RpcmVjdCxcbiAgICBuYW1lXG4gIH07XG5cbiAgY29uc3QgaW5zZXJ0ID0ge1xuICAgIC4uLmNsb25lRGVlcCh1cGRhdGUpLFxuICAgIF9rZXk6IGZvcm1hdENvbnZlcnNhdGlvbklkXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgY3VycmVudCA9IERPQ1VNRU5UKCdjb252ZXJzYXRpb25zJywgJHtmb3JtYXRDb252ZXJzYXRpb25JZH0pXG4gICAgRklMVEVSIGN1cnJlbnQuY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgIFVQU0VSVCB7X2tleTogJHtmb3JtYXRDb252ZXJzYXRpb25JZH0gfVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gY29udmVyc2F0aW9ucyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigoY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb25UeXBlKSA9PiBjb252ZXJzYXRpb24pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXJUb0NvbnZlcnNhdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge1xuICAgIGNvbnZlcnNhdGlvbklkLFxuICAgIHVzZXJJZFxuICB9OiBVcGRhdGVDb252ZXJzYXRpb25Vc2VyUGFyYW1zXG4pOiBQcm9taXNlPENvbnZlcnNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFVzZXJUb0NvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZCA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgY29udmVyc2F0aW9uID0gRE9DVU1FTlQoJHtjb252ZXJzYXRpb25Eb2NJZH0pXG4gICAgUkVUVVJOIGNvbnZlcnNhdGlvbi5jaGF0U2NoZW1hVmVyc2lvbiA9PSAxID8ge2NoYXRTY2hlbWFWZXJzaW9uOiAxfSA6IEZJUlNUKFxuICAgICAgRk9SIGhjIElOIGhhc0NvbnZlcnNhdGlvblxuICAgICAgICBGSUxURVIgaGMuX2Zyb20gPT0gJHt1c2VyRG9jSWR9ICYmIGhjLl90byA9PSAke2NvbnZlcnNhdGlvbkRvY0lkfVxuICAgICAgICBMSU1JVCAxIFJFVFVSTiBoYylgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChoYXNDb252ZXJzYXRpb25FZGdlKSA9PiB7XG4gICAgICBpZihoYXNDb252ZXJzYXRpb25FZGdlPy5jaGF0U2NoZW1hVmVyc2lvbiA9PT0gMSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBpZighIWhhc0NvbnZlcnNhdGlvbkVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGhhc0NvbnZlcnNhdGlvbkVkZ2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaGFzQ29udmVyc2F0aW9uJyk7XG4gICAgICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBjb252ZXJzYXRpb24tJHtmb3JtYXRDb252ZXJzYXRpb25JZH0tJHtmb3JtYXRVc2VySWR9YCk7XG5cbiAgICAgIGNvbnN0IGVkZ2U6IENvbnZlcnNhdGlvblR5cGUgPSB7XG4gICAgICAgIF9mcm9tOiB1c2VyRG9jSWQsXG4gICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgX3RvOiBjb252ZXJzYXRpb25Eb2NJZCxcbiAgICAgICAgYWRkZWQ6IERhdGUubm93KClcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvblxuICAgICAgICAuc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAgICAgLnRoZW4oKCkgPT4gZWRnZSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICB1c2VySWRcbiAgfTogVXBkYXRlQ29udmVyc2F0aW9uVXNlclBhcmFtc1xuKTogUHJvbWlzZTxDb252ZXJzYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyRnJvbUNvbnZlcnNhdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q29udmVyc2F0aW9uSWQgPSBwYXJzZUlkKGNvbnZlcnNhdGlvbklkKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBjb252ZXJzYXRpb25Eb2NJZCA9IGBjb252ZXJzYXRpb25zLyR7Zm9ybWF0Q29udmVyc2F0aW9uSWR9YDtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7Zm9ybWF0VXNlcklkfWA7XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgRklMVEVSIGhjLl9mcm9tID09ICR7dXNlckRvY0lkfSAmJiBoYy5fdG8gPT0gJHtjb252ZXJzYXRpb25Eb2NJZH1cbiAgICAgIEFORCBET0NVTUVOVCgke2NvbnZlcnNhdGlvbkRvY0lkfSkuY2hhdFNjaGVtYVZlcnNpb24gIT0gMVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgaGMgSU4gaGFzQ29udmVyc2F0aW9uXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjbG9uZURlZXAiLCJjcmVhdGVIYXNoIiwicGFyc2VJZCIsImFxbCIsImxpdGVyYWwiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJnZXRMaW1pdCIsInNvcnRJZHMiLCJ1c2VEYiIsImFkZEl0ZW0iLCJnZXRQZXJzb25hUmVsYXRpb25zaGlwU3RhdGUiLCJpc1BlcnNvbmFWaXNpYmlsaXR5QmxvY2tlZCIsImdldFVzZXJCeUlkIiwiZXZlbnRDYXRlZ29yeSIsImhhc0NvbnZlcnNhdGlvbkNvbGxlY3Rpb24iLCJlbnN1cmVEaXJlY3RDb252ZXJzYXRpb25GcmllbmRzaGlwIiwiY29udGV4dCIsImZyb21Vc2VySWQiLCJ0b1VzZXJJZCIsImZyb21Vc2VyIiwidG9Vc2VyIiwiUHJvbWlzZSIsImFsbCIsInVzZXJJZCIsImZyb21QZXJzb25hSWQiLCJTdHJpbmciLCJwZXJzb25hSWQiLCJ0b1BlcnNvbmFJZCIsIkVycm9yIiwiSU5WQUxJRF9BVVRIRU5USUNBVElPTiIsInJlbGF0aW9uc2hpcCIsImlzRnJpZW5kIiwiZmlsdGVyQmxvY2tlZENvbnZlcnNhdGlvbnMiLCJjb252ZXJzYXRpb25zIiwic2Vzc2lvblBlcnNvbmFJZCIsInNlc3Npb24iLCJsZW5ndGgiLCJ2aXNpYmlsaXR5IiwibWFwIiwiY29udmVyc2F0aW9uIiwiaXNEaXJlY3QiLCJwYXJ0aWNpcGFudCIsIkFycmF5IiwiaXNBcnJheSIsInVzZXJzIiwiZmluZCIsInVzZXIiLCJfa2V5IiwicGFydGljaXBhbnRQZXJzb25hSWQiLCJmaWx0ZXIiLCJfY29udmVyc2F0aW9uIiwiaW5kZXgiLCJlbnN1cmVDb252ZXJzYXRpb25NZXNzYWdpbmdBbGxvd2VkIiwiY29udmVyc2F0aW9uSWQiLCJnZXRDb252ZXJzYXRpb25CeUlkIiwic2Vzc2lvblVzZXJJZCIsInBhcnRpY2lwYW50VXNlcklkIiwicGFyc2VDb252ZXJzYXRpb25PcHRpb25zIiwib3B0aW9ucyIsImZyb20iLCJ0byIsImxpbWl0IiwiZ2V0Q29udmVyc2F0aW9uTGlzdEJ5VXNlciIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsInVzZXJEb2NJZCIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJnZXREaXJlY3RDb252ZXJzYXRpb24iLCJmcm9tSWQiLCJ0b0lkIiwiZm9ybWF0RnJvbUlkIiwiZm9ybWF0VG9JZCIsInVzZXJJZHMiLCJzb3J0ZWRVc2VySWRzIiwiam9pbiIsIm5leHQiLCJhZGREaXJlY3RDb252ZXJzYXRpb24iLCJkYXRhYmFzZUVycm9yIiwiaW5zZXJ0IiwidXBkYXRlZENvbnZlcnNhdGlvbiIsImVkZ2VJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsImFkZGVkIiwiRGF0ZSIsIm5vdyIsImluc2VydEVkZ2VRdWVyeSIsImdldENvbm5lY3Rpb25Vc2VyTGlzdCIsImluY2x1ZGVBbGwiLCJmaWx0ZXJzIiwicHVzaCIsImdldENvbnZlcnNhdGlvblVzZXJzIiwic2Vzc2lvbklkIiwic2Vzc2lvbkRvY0lkIiwiY29udmVyc2F0aW9uRG9jSWQiLCJ1cGRhdGVDb252ZXJzYXRpb24iLCJuYW1lIiwiZm9ybWF0Q29udmVyc2F0aW9uSWQiLCJ1cGRhdGUiLCJhZGRVc2VyVG9Db252ZXJzYXRpb24iLCJmb3JtYXRVc2VySWQiLCJoYXNDb252ZXJzYXRpb25FZGdlIiwiY2hhdFNjaGVtYVZlcnNpb24iLCJlZGdlQ29sbGVjdGlvbiIsImNvbGxlY3Rpb24iLCJzYXZlIiwicmV0dXJuTmV3IiwiZGVsZXRlVXNlckZyb21Db252ZXJzYXRpb24iXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELDRHQUE0RyxHQUM1RyxTQUFRQSxTQUFTLFFBQU8sNkJBQTZCO0FBQ3JELFNBQVFDLFVBQVUsRUFBRUMsT0FBTyxRQUFPLCtCQUErQjtBQUNqRSxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUVyQyxTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBQ25ELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsUUFBUSxFQUFFQyxPQUFPLEVBQUVDLEtBQUssUUFBTyw0QkFBNEI7QUFDbkUsU0FBUUMsT0FBTyxRQUFPLFlBQVk7QUFDbEMsU0FBUUMsMkJBQTJCLEVBQUVDLDBCQUEwQixRQUFPLGdCQUFnQjtBQUN0RixTQUFRQyxXQUFXLFFBQU8sYUFBYTtBQWdCdkMsTUFBTUMsZ0JBQWdCO0FBQ3RCLE1BQU1DLDRCQUE0QlgsUUFBUTtBQUUxQyxNQUFNWSxxQ0FBcUMsT0FDekNDLFNBQ0FDLFlBQ0FDO0lBRUEsTUFBTSxDQUFDQyxVQUFVQyxPQUFPLEdBQUcsTUFBTUMsUUFBUUMsR0FBRyxDQUFDO1FBQzNDVixZQUFZSSxTQUFTO1lBQUNPLFFBQVFOO1FBQVU7UUFDeENMLFlBQVlJLFNBQVM7WUFBQ08sUUFBUUw7UUFBUTtLQUN2QztJQUNELE1BQU1NLGdCQUFnQnZCLFFBQVF3QixPQUFPTixVQUFVTyxhQUFhO0lBQzVELE1BQU1DLGNBQWMxQixRQUFRd0IsT0FBT0wsUUFBUU0sYUFBYTtJQUV4RCxJQUFHLENBQUNGLGlCQUFpQixDQUFDRyxhQUFhO1FBQ2pDLE1BQU0sSUFBSUMsTUFBTXhCLFdBQVd5QixzQkFBc0I7SUFDbkQ7SUFFQSxNQUFNQyxlQUFlLE1BQU1wQiw0QkFBNEJNLFNBQVNXLGFBQWFIO0lBRTdFLElBQUcsQ0FBQ00sYUFBYUMsUUFBUSxFQUFFO1FBQ3pCLE1BQU0sSUFBSUgsTUFBTXhCLFdBQVd5QixzQkFBc0I7SUFDbkQ7QUFDRjtBQUVBLE1BQU1HLDZCQUE2QixPQUNqQ2hCLFNBQ0FpQixnQkFBb0MsRUFBRTtJQUV0QyxNQUFNQyxtQkFBbUJqQyxRQUFRd0IsT0FBT1QsU0FBU21CLFNBQVNULGFBQWE7SUFFdkUsSUFBRyxDQUFDUSxvQkFBb0IsQ0FBQ0QsY0FBY0csTUFBTSxFQUFFO1FBQzdDLE9BQU9IO0lBQ1Q7SUFFQSxNQUFNSSxhQUFhLE1BQU1oQixRQUFRQyxHQUFHLENBQUNXLGNBQWNLLEdBQUcsQ0FBQyxPQUFPQztRQUM1RCxJQUFHLENBQUNBLGNBQWNDLFVBQVU7WUFDMUIsT0FBTztRQUNUO1FBRUEsTUFBTUMsY0FBY0MsTUFBTUMsT0FBTyxDQUFDSixjQUFjSyxTQUM1Q0wsYUFBYUssS0FBSyxDQUFDQyxJQUFJLENBQUMsQ0FBQ0MsT0FBUzdDLFFBQVF3QixPQUFPcUIsTUFBTXZCLFVBQVV1QixNQUFNQyxRQUFRLFNBQVM5QyxRQUFRd0IsT0FBT1QsU0FBU21CLFNBQVNaLFVBQVUsUUFDbkk7UUFDSixNQUFNeUIsdUJBQXVCL0MsUUFBUXdCLE9BQU9nQixhQUFhZixhQUFhO1FBRXRFLElBQUcsQ0FBQ3NCLHNCQUFzQjtZQUN4QixPQUFPO1FBQ1Q7UUFFQSxPQUFPLENBQUUsTUFBTXJDLDJCQUEyQkssU0FBU2dDLHNCQUFzQmQ7SUFDM0U7SUFFQSxPQUFPRCxjQUFjZ0IsTUFBTSxDQUFDLENBQUNDLGVBQWVDLFFBQVVkLFVBQVUsQ0FBQ2MsTUFBTTtBQUN6RTtBQUVBLE9BQU8sTUFBTUMscUNBQXFDLE9BQ2hEcEMsU0FDQXFDO0lBRUEsTUFBTWQsZUFBZSxNQUFNZSxvQkFBb0J0QyxTQUFTcUM7SUFFeEQsSUFBRyxDQUFDZCxjQUFjYyxrQkFBa0IsQ0FBQ2QsY0FBY1EsTUFBTTtRQUN2RCxNQUFNLElBQUluQixNQUFNeEIsV0FBV3lCLHNCQUFzQjtJQUNuRDtJQUVBLElBQUcsQ0FBQ1UsY0FBY0MsVUFBVTtRQUMxQjtJQUNGO0lBRUEsTUFBTWUsZ0JBQWdCdEQsUUFBUXdCLE9BQU9ULFNBQVNtQixTQUFTWixVQUFVO0lBQ2pFLE1BQU1rQixjQUFjQyxNQUFNQyxPQUFPLENBQUNKLGNBQWNLLFNBQzVDTCxhQUFhSyxLQUFLLENBQUNDLElBQUksQ0FBQyxDQUFDQyxPQUFTN0MsUUFBUXdCLE9BQU9xQixNQUFNdkIsVUFBVXVCLE1BQU1DLFFBQVEsU0FBU1EsaUJBQ3hGO0lBQ0osTUFBTUMsb0JBQW9CdkQsUUFBUXdCLE9BQU9nQixhQUFhbEIsVUFBVWtCLGFBQWFNLFFBQVE7SUFFckYsSUFBRyxDQUFDUSxpQkFBaUIsQ0FBQ0MsbUJBQW1CO1FBQ3ZDLE1BQU0sSUFBSTVCLE1BQU14QixXQUFXeUIsc0JBQXNCO0lBQ25EO0lBRUEsTUFBTWQsbUNBQW1DQyxTQUFTdUMsZUFBZUM7QUFDbkUsRUFBRTtBQUVGLE9BQU8sTUFBTUMsMkJBQTJCLENBQUNDLFVBQStCLENBQUMsQ0FBQztJQUN4RSxNQUFNLEVBQ0pDLE9BQU8sQ0FBQyxFQUNSQyxLQUFLLEVBQUUsRUFDUixHQUFHRjtJQUVKLE9BQU87UUFDTEcsT0FBT3ZELFNBQVNxRCxNQUFNQztJQUN4QjtBQUNGLEVBQUU7QUFFRixPQUFPLE1BQU1FLDRCQUE0QixDQUN2QzlDLFNBQXFCTyxRQUFnQm1DO0lBRXJDLE1BQU1LLFNBQVM7SUFDZixNQUFNLEVBQUNDLFlBQVksRUFBQyxHQUFHaEQ7SUFDdkIsTUFBTSxFQUFDNkMsS0FBSyxFQUFDLEdBQUdKLHlCQUF5QkM7SUFDekMsTUFBTU8sWUFBWSxDQUFDLE1BQU0sRUFBRTFDLFFBQVE7SUFDbkMsTUFBTTJDLFNBQVNoRSxHQUFHLENBQUM7OEJBQ1MsRUFBRStELFVBQVUsQ0FBQyxFQUFFbkQsMEJBQTBCOzs7TUFHakUsRUFBRVgsUUFBUTBELE1BQU0zRCxHQUFHLEVBQUU7O3dDQUVhLEVBQUVZLDBCQUEwQjswQkFDMUMsRUFBRW1ELFVBQVU7Ozs7RUFJcEMsQ0FBQztJQUVELE9BQU96RCxNQUFNd0QsY0FBY0csS0FBSyxDQUFDRCxRQUM5QkUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU8vQyxHQUFHLElBQzNCOEMsSUFBSSxDQUFDLENBQUNuQyxnQkFBa0JELDJCQUEyQmhCLFNBQVNpQixnQkFDNURxQyxLQUFLLENBQUMsQ0FBQ0M7UUFDTmxFLFNBQVM7WUFDUDBEO1lBQ0FTLFVBQVUzRDtZQUNWNEQsT0FBT3JFLFdBQVdzRSxjQUFjO1FBQ2xDLEdBQUdILE9BQU92RDtRQUNWLE9BQU8sRUFBRTtJQUNYO0FBQ0osRUFBRTtBQUVGLE9BQU8sTUFBTTJELHdCQUF3QixPQUNuQzNELFNBQ0EsRUFDRTRELE1BQU0sRUFDTkMsSUFBSSxFQUNKekQsTUFBTSxFQUNtQjtJQUUzQixNQUFNMkMsU0FBUztJQUNmLE1BQU0sRUFBQ0MsWUFBWSxFQUFDLEdBQUdoRDtJQUV2QixJQUFJO1FBQ0YsTUFBTThELGVBQWU3RSxRQUFRMkU7UUFDN0IsTUFBTUcsYUFBYTlFLFFBQVE0RTtRQUMzQixNQUFNOUQsbUNBQW1DQyxTQUFTOEQsY0FBY0M7UUFDaEUsTUFBTUMsVUFBVTtZQUFDRjtZQUFjQztTQUFXO1FBQzFDLE1BQU1FLGdCQUFnQjFFLFFBQVF5RTtRQUM5QixNQUFNM0IsaUJBQWlCckQsV0FBVyxDQUFDLGNBQWMsRUFBRWlGLGNBQWNDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDOUUsTUFBTXBDLE9BQWlCMUIsVUFBVSxNQUFNUixZQUFZSSxTQUFTO1lBQUNPLFFBQVF3RDtRQUFVO1FBQy9FLE1BQU1iLFNBQW1CaEUsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUMsY0FBYyxFQUFFbUQsZ0JBQWdCLENBQUMsMENBQTBDLENBQUM7UUFDN0gsTUFBTWQsZUFBZSxNQUFNL0IsTUFBTXdELGNBQWNHLEtBQUssQ0FBQ0QsUUFDbERFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPYyxJQUFJLElBQzVCYixLQUFLLENBQUMsQ0FBQ0MsUUFBaUJsRSxTQUFTO2dCQUNoQzBEO2dCQUNBUyxVQUFVM0Q7Z0JBQ1Y0RCxPQUFPckUsV0FBV3NFLGNBQWM7WUFDbEMsR0FBR0gsT0FBT3ZEO1FBRVosSUFBR3VCLGNBQWM7WUFDZixPQUFPO2dCQUFDLEdBQUdBLFlBQVk7Z0JBQUVLLE9BQU87b0JBQUNFO2lCQUFLO1lBQUE7UUFDeEM7UUFFQSxPQUFPc0Msc0JBQXNCcEUsU0FBUztZQUFDNEQ7WUFBUUM7WUFBTXpELFFBQVEwQjtRQUFJO0lBQ25FLEVBQUUsT0FBTXVDLGVBQWU7UUFDckIsT0FBT2hGLFNBQVM7WUFDZDBEO1lBQ0FTLFVBQVUzRDtZQUNWNEQsT0FBT3JFLFdBQVdzRSxjQUFjO1FBQ2xDLEdBQUdXLGVBQWVyRTtJQUNwQjtBQUNGLEVBQUU7QUFFRixPQUFPLE1BQU1vRSx3QkFBd0IsT0FDbkNwRSxTQUNBLEVBQ0U0RCxNQUFNLEVBQ05DLElBQUksRUFDSnpELE1BQU0sRUFDbUI7SUFFM0IsTUFBTTJDLFNBQVM7SUFDZixNQUFNLEVBQUNDLFlBQVksRUFBQyxHQUFHaEQ7SUFFdkIsSUFBSTtRQUNGLE1BQU04RCxlQUFlN0UsUUFBUTJFO1FBQzdCLE1BQU1HLGFBQWE5RSxRQUFRNEU7UUFDM0IsTUFBTTlELG1DQUFtQ0MsU0FBUzhELGNBQWNDO1FBQ2hFLE1BQU1DLFVBQVU7WUFBQ0Y7WUFBY0M7U0FBVztRQUMxQyxNQUFNRSxnQkFBZ0IxRSxRQUFReUU7UUFDOUIsTUFBTWxDLE9BQWlCMUIsVUFBVSxNQUFNUixZQUFZSSxTQUFTO1lBQUNPLFFBQVF3RDtRQUFVO1FBQy9FLE1BQU0xQixpQkFBaUJyRCxXQUFXLENBQUMsY0FBYyxFQUFFaUYsY0FBY0MsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUU5RSxNQUFNSSxTQUFTO1lBQ2J2QyxNQUFNTTtZQUNOYixVQUFVO1FBQ1o7UUFDQSxNQUFNK0Msc0JBQXNCLE1BQU05RSxRQUEwQk8sU0FBUyxpQkFBaUJzRTtRQUV0RixNQUFNakUsUUFBUUMsR0FBRyxDQUFDMEQsUUFBUTFDLEdBQUcsQ0FBQyxDQUFDZjtZQUM3QixNQUFNaUUsU0FBU3hGLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRXVCLE9BQU8sQ0FBQyxFQUFFOEIsZ0JBQWdCO1lBQ3ZFLE1BQU1vQyxPQUFpQjtnQkFDckJDLE9BQU8sQ0FBQyxNQUFNLEVBQUVuRSxRQUFRO2dCQUN4QndCLE1BQU15QztnQkFDTkcsS0FBSyxDQUFDLGNBQWMsRUFBRXRDLGdCQUFnQjtnQkFDdEN1QyxPQUFPQyxLQUFLQyxHQUFHO1lBQ2pCO1lBQ0EsTUFBTUMsa0JBQTRCN0YsR0FBRyxDQUFDLE9BQU8sRUFBRXVGLEtBQUssOEJBQThCLENBQUM7WUFDbkYsT0FBT2pGLE1BQU13RCxjQUFjRyxLQUFLLENBQUM0QjtRQUNuQztRQUVBLE9BQU87WUFBQyxHQUFHUixtQkFBbUI7WUFBRTNDLE9BQU87Z0JBQUNFO2FBQUs7UUFBQTtJQUMvQyxFQUFFLE9BQU11QyxlQUFlO1FBQ3JCaEYsU0FBUztZQUNQMEQ7WUFDQVMsVUFBVTNEO1lBQ1Y0RCxPQUFPckUsV0FBV3NFLGNBQWM7UUFDbEMsR0FBR1csZUFBZXJFO1FBQ2xCLE9BQU8sQ0FBQztJQUNWO0FBQ0YsRUFBRTtBQUVGLE9BQU8sTUFBTWdGLHdCQUF3QixDQUNuQ2hGLFNBQ0EsRUFDRXFDLGNBQWMsRUFDZDRDLGFBQWEsS0FBSyxFQUNsQnpELFFBQVEsRUFDZ0I7SUFFMUIsTUFBTXVCLFNBQVM7SUFDZixNQUFNLEVBQUNDLFlBQVksRUFBRTdCLFNBQVMsRUFBQ1osUUFBUWdDLGFBQWEsRUFBQyxFQUFDLEdBQUd2QztJQUN6RCxNQUFNa0YsVUFBb0I7UUFBQztLQUFxQjtJQUVoRCxJQUFHLENBQUNELFlBQVk7UUFDZEMsUUFBUUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFNUMsZUFBZTtJQUMzQztJQUNBLElBQUdmLFVBQVU7UUFDWDBELFFBQVFDLElBQUksQ0FBQyxDQUFDLDBCQUEwQixFQUFFM0QsVUFBVTtJQUN0RDtJQUVBLE1BQU0wQixTQUFtQmhFLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxDQUFDLGNBQWMsRUFBRW1ELGdCQUFnQixDQUFDOztvQkFFMUUsRUFBRSxDQUFDLGNBQWMsRUFBRUEsZ0JBQWdCLENBQUM7O1dBRTdDLEVBQUU2QyxRQUFRaEIsSUFBSSxDQUFDLFFBQVE7WUFDdEIsQ0FBQztJQUVYLE9BQU8xRSxNQUFNd0QsY0FBY0csS0FBSyxDQUFDRCxRQUM5QkUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU8vQyxHQUFHLElBQzNCZ0QsS0FBSyxDQUFDLENBQUNDO1FBQ05sRSxTQUFTO1lBQ1AwRDtZQUNBUyxVQUFVM0Q7WUFDVjRELE9BQU9yRSxXQUFXc0UsY0FBYztRQUNsQyxHQUFHSCxPQUFPdkQ7UUFDVixPQUFPLEVBQUU7SUFDWDtBQUNKLEVBQUU7QUFFRixPQUFPLE1BQU1vRix1QkFBdUIsQ0FDbENwRixTQUNBLEVBQ0VxQyxjQUFjLEVBQ2Q0QyxhQUFhLEtBQUssRUFDbEJ6RCxRQUFRLEVBQ2dCO0lBRTFCLE1BQU11QixTQUFTO0lBQ2YsTUFBTSxFQUFDQyxZQUFZLEVBQUU3QixTQUFTLEVBQUNaLFFBQVFnQyxhQUFhLEVBQUMsRUFBQyxHQUFHdkM7SUFDekQsTUFBTWtGLFVBQW9CO1FBQUM7S0FBcUI7SUFFaEQsSUFBRyxDQUFDRCxZQUFZO1FBQ2RDLFFBQVFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRTVDLGVBQWU7SUFDM0M7SUFDQSxJQUFHZixVQUFVO1FBQ1gwRCxRQUFRQyxJQUFJLENBQUMsQ0FBQywwQkFBMEIsRUFBRTNELFVBQVU7SUFDdEQ7SUFFQSxNQUFNMEIsU0FBbUJoRSxHQUFHLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxjQUFjLEVBQUVtRCxnQkFBZ0IsQ0FBQzs7b0JBRTFFLEVBQUUsQ0FBQyxjQUFjLEVBQUVBLGdCQUFnQixDQUFDO1dBQzdDLEVBQUU2QyxRQUFRaEIsSUFBSSxDQUFDLFFBQVE7WUFDdEIsQ0FBQztJQUVYLE9BQU8xRSxNQUFNd0QsY0FBY0csS0FBSyxDQUFDRCxRQUM5QkUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU8vQyxHQUFHLElBQzNCZ0QsS0FBSyxDQUFDLENBQUNDO1FBQ05sRSxTQUFTO1lBQ1AwRDtZQUNBUyxVQUFVM0Q7WUFDVjRELE9BQU9yRSxXQUFXc0UsY0FBYztRQUNsQyxHQUFHSCxPQUFPdkQ7UUFDVixPQUFPLEVBQUU7SUFDWDtBQUNKLEVBQUU7QUFFRixPQUFPLE1BQU1zQyxzQkFBc0IsQ0FBQ3RDLFNBQXFCcUM7SUFDdkQsTUFBTVUsU0FBUztJQUNmLE1BQU0sRUFBQ0MsWUFBWSxFQUFFN0IsU0FBUyxFQUFDWixRQUFROEUsU0FBUyxFQUFDLEVBQUMsR0FBR3JGO0lBQ3JELE1BQU1zRixlQUFlLENBQUMsTUFBTSxFQUFFRCxXQUFXO0lBQ3pDLE1BQU1FLG9CQUFvQixDQUFDLGNBQWMsRUFBRXRHLFFBQVFvRCxpQkFBaUI7SUFFcEUsTUFBTWEsU0FBbUJoRSxHQUFHLENBQUMsMEJBQTBCLEVBQUVvRyxhQUFhO29CQUNwRCxFQUFFQyxrQkFBa0I7O3lDQUVDLEVBQUVBLGtCQUFrQjs7OzsrQkFJOUIsQ0FBQztJQUU5QixPQUFPL0YsTUFBTXdELGNBQWNHLEtBQUssQ0FBQ0QsUUFDOUJFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPYyxJQUFJLElBQzVCZixJQUFJLENBQUMsQ0FBQzdCO1FBQ0wsSUFBRyxDQUFDQSxjQUFjO1lBQ2hCLE9BQU8sQ0FBQztRQUNWO1FBQ0EsT0FBT0E7SUFDVCxHQUNDK0IsS0FBSyxDQUFDLENBQUNDLFFBQWlCbEUsU0FBUztZQUNoQzBEO1lBQ0FTLFVBQVUzRDtZQUNWNEQsT0FBT3JFLFdBQVdzRSxjQUFjO1FBQ2xDLEdBQUdILE9BQU92RDtBQUNkLEVBQUU7QUFFRixPQUFPLE1BQU13RixxQkFBcUIsQ0FDaEN4RixTQUNBdUI7SUFFQSxNQUFNd0IsU0FBUztJQUNmLE1BQU0sRUFBQ0MsWUFBWSxFQUFFN0IsU0FBUyxFQUFDWixRQUFROEUsU0FBUyxFQUFDLEVBQUMsR0FBR3JGO0lBQ3JELE1BQU0sRUFDSnFDLGlCQUFpQnJELFdBQVcsQ0FBQyxhQUFhLEVBQUVxRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQ3pEN0QsV0FBVyxLQUFLLEVBQ2hCaUUsSUFBSSxFQUNMLEdBQUdsRTtJQUNKLE1BQU1tRSx1QkFBdUJ6RyxRQUFRb0Q7SUFDckMsTUFBTXNELFNBQVM7UUFDYm5FO1FBQ0FpRTtJQUNGO0lBRUEsTUFBTW5CLFNBQVM7UUFDYixHQUFHdkYsVUFBVTRHLE9BQU87UUFDcEI1RCxNQUFNMkQ7SUFDUjtJQUVBLE1BQU14QyxTQUFtQmhFLEdBQUcsQ0FBQyx3Q0FBd0MsRUFBRXdHLHFCQUFxQjs7a0JBRTVFLEVBQUVBLHFCQUFxQjtXQUM5QixFQUFFcEIsT0FBTztXQUNULEVBQUVxQixPQUFPOytCQUNXLENBQUM7SUFFOUIsT0FBT25HLE1BQU13RCxjQUFjRyxLQUFLLENBQUNELFFBQzlCRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT2MsSUFBSSxJQUM1QmYsSUFBSSxDQUFDLENBQUM3QixlQUFtQ0EsY0FDekMrQixLQUFLLENBQUMsQ0FBQ0MsUUFBaUJsRSxTQUFTO1lBQ2hDMEQ7WUFDQVMsVUFBVTNEO1lBQ1Y0RCxPQUFPckUsV0FBV3NFLGNBQWM7UUFDbEMsR0FBR0gsT0FBT3ZEO0FBQ2QsRUFBRTtBQUVGLE9BQU8sTUFBTTRGLHdCQUF3QixDQUNuQzVGLFNBQ0EsRUFDRXFDLGNBQWMsRUFDZDlCLE1BQU0sRUFDdUI7SUFFL0IsTUFBTXdDLFNBQVM7SUFDZixNQUFNLEVBQUNDLFlBQVksRUFBQyxHQUFHaEQ7SUFDdkIsTUFBTTBGLHVCQUF1QnpHLFFBQVFvRDtJQUNyQyxNQUFNd0QsZUFBZTVHLFFBQVFzQjtJQUM3QixNQUFNZ0Ysb0JBQW9CLENBQUMsY0FBYyxFQUFFRyxzQkFBc0I7SUFDakUsTUFBTXpDLFlBQVksQ0FBQyxNQUFNLEVBQUU0QyxjQUFjO0lBRXpDLE1BQU0zQyxTQUFtQmhFLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRXFHLGtCQUFrQjs7OzJCQUdwRCxFQUFFdEMsVUFBVSxjQUFjLEVBQUVzQyxrQkFBa0I7MEJBQy9DLENBQUM7SUFFekIsT0FBTy9GLE1BQU13RCxjQUFjRyxLQUFLLENBQUNELFFBQzlCRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT2MsSUFBSSxJQUM1QmYsSUFBSSxDQUFDLENBQUMwQztRQUNMLElBQUdBLHFCQUFxQkMsc0JBQXNCLEdBQUc7WUFDL0MsT0FBTyxDQUFDO1FBQ1Y7UUFDQSxJQUFHLENBQUMsQ0FBQ0QscUJBQXFCO1lBQ3hCLE9BQU9BO1FBQ1Q7UUFFQSxNQUFNRSxpQkFBaUN4RyxNQUFNd0QsY0FBY2lELFVBQVUsQ0FBQztRQUN0RSxNQUFNekIsU0FBU3hGLFdBQVcsQ0FBQyxhQUFhLEVBQUUwRyxxQkFBcUIsQ0FBQyxFQUFFRyxjQUFjO1FBRWhGLE1BQU1wQixPQUF5QjtZQUM3QkMsT0FBT3pCO1lBQ1BsQixNQUFNeUM7WUFDTkcsS0FBS1k7WUFDTFgsT0FBT0MsS0FBS0MsR0FBRztRQUNqQjtRQUVBLE9BQU9rQixlQUNKRSxJQUFJLENBQUN6QixNQUFNO1lBQUMwQixXQUFXO1FBQUksR0FDM0IvQyxJQUFJLENBQUMsSUFBTXFCO0lBQ2hCLEdBQ0NuQixLQUFLLENBQUMsQ0FBQ0MsUUFBaUJsRSxTQUFTO1lBQ2hDMEQ7WUFDQVMsVUFBVTNEO1lBQ1Y0RCxPQUFPckUsV0FBV3NFLGNBQWM7UUFDbEMsR0FBR0gsT0FBT3ZEO0FBQ2QsRUFBRTtBQUVGLE9BQU8sTUFBTW9HLDZCQUE2QixDQUN4Q3BHLFNBQ0EsRUFDRXFDLGNBQWMsRUFDZDlCLE1BQU0sRUFDdUI7SUFFL0IsTUFBTXdDLFNBQVM7SUFDZixNQUFNLEVBQUNDLFlBQVksRUFBQyxHQUFHaEQ7SUFDdkIsTUFBTTBGLHVCQUF1QnpHLFFBQVFvRDtJQUNyQyxNQUFNd0QsZUFBZTVHLFFBQVFzQjtJQUM3QixNQUFNZ0Ysb0JBQW9CLENBQUMsY0FBYyxFQUFFRyxzQkFBc0I7SUFDakUsTUFBTXpDLFlBQVksQ0FBQyxNQUFNLEVBQUU0QyxjQUFjO0lBRXpDLE1BQU0zQyxTQUFtQmhFLEdBQUcsQ0FBQzt1QkFDUixFQUFFK0QsVUFBVSxjQUFjLEVBQUVzQyxrQkFBa0I7bUJBQ2xELEVBQUVBLGtCQUFrQjs7O2NBR3pCLENBQUM7SUFFYixPQUFPL0YsTUFBTXdELGNBQWNHLEtBQUssQ0FBQ0QsUUFDOUJFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPYyxJQUFJLElBQzVCYixLQUFLLENBQUMsQ0FBQ0MsUUFBaUJsRSxTQUFTO1lBQ2hDMEQ7WUFDQVMsVUFBVTNEO1lBQ1Y0RCxPQUFPckUsV0FBV3NFLGNBQWM7UUFDbEMsR0FBR0gsT0FBT3ZEO0FBQ2QsRUFBRSJ9