@nlabs/metropolisjs 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/.github/copilot-instructions.md +167 -0
  2. package/AGENTS.md +13 -0
  3. package/CHANGELOG.md +112 -0
  4. package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
  5. package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
  6. package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
  7. package/README.md +1123 -112
  8. package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
  9. package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
  10. package/docs/ACTIONS.md +63 -0
  11. package/docs/COLLECTIONS.md +1038 -0
  12. package/docs/CONNECTIONS.md +1367 -0
  13. package/docs/CRUD_INTEGRATION.md +702 -0
  14. package/examples/connections-usage.tsx +909 -0
  15. package/examples/content-actions-usage.ts +144 -0
  16. package/examples/crud-usage.tsx +847 -0
  17. package/examples/extensibility-usage.tsx +889 -0
  18. package/examples/i18n-import-examples.ts +86 -0
  19. package/examples/i18n-namespace-usage.ts +118 -0
  20. package/examples/i18next-singleton-demo.ts +187 -0
  21. package/examples/permission-system-usage.tsx +415 -0
  22. package/examples/project-details.tsx +397 -0
  23. package/examples/shared-i18n-usage.tsx +203 -0
  24. package/examples/signup-error-handling.ts +100 -0
  25. package/examples/translation-types.ts +86 -0
  26. package/examples/translation-usage.tsx +336 -0
  27. package/index.js +1 -0
  28. package/jest.config.mjs +28 -0
  29. package/lex.config.mjs +11 -2
  30. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
  31. package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
  32. package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
  33. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
  34. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
  35. package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
  36. package/lib/actions/appActions/appActions.d.ts +29 -0
  37. package/lib/actions/appActions/appActions.d.ts.map +1 -0
  38. package/lib/actions/appActions/appActions.js +159 -0
  39. package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
  40. package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
  41. package/lib/actions/connectionActions/connectionActions.js +131 -0
  42. package/lib/actions/contentActions/contentActions.d.ts +34 -0
  43. package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
  44. package/lib/actions/contentActions/contentActions.js +314 -0
  45. package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
  46. package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
  47. package/lib/actions/conversationActions/conversationActions.js +225 -0
  48. package/lib/actions/eventActions/eventActions.d.ts +27 -7
  49. package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
  50. package/lib/actions/eventActions/eventActions.js +436 -2
  51. package/lib/actions/groupActions/groupActions.d.ts +30 -0
  52. package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
  53. package/lib/actions/groupActions/groupActions.js +229 -0
  54. package/lib/actions/imageActions/imageActions.d.ts +16 -10
  55. package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
  56. package/lib/actions/imageActions/imageActions.js +593 -2
  57. package/lib/actions/index.d.ts +21 -9
  58. package/lib/actions/index.d.ts.map +1 -0
  59. package/lib/actions/index.js +22 -2
  60. package/lib/actions/locationActions/locationActions.d.ts +11 -9
  61. package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
  62. package/lib/actions/locationActions/locationActions.js +388 -2
  63. package/lib/actions/messageActions/messageActions.d.ts +16 -32
  64. package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
  65. package/lib/actions/messageActions/messageActions.js +235 -2
  66. package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
  67. package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
  68. package/lib/actions/permissionActions/permissionActions.js +330 -0
  69. package/lib/actions/personaActions/personaActions.d.ts +65 -0
  70. package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
  71. package/lib/actions/personaActions/personaActions.js +572 -0
  72. package/lib/actions/postActions/postActions.d.ts +12 -32
  73. package/lib/actions/postActions/postActions.d.ts.map +1 -0
  74. package/lib/actions/postActions/postActions.js +447 -2
  75. package/lib/actions/reactionActions/reactionActions.d.ts +13 -27
  76. package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
  77. package/lib/actions/reactionActions/reactionActions.js +413 -2
  78. package/lib/actions/sseActions/sseActions.d.ts +1 -0
  79. package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
  80. package/lib/actions/sseActions/sseActions.js +148 -2
  81. package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
  82. package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
  83. package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
  84. package/lib/actions/tagActions/tagActions.d.ts +13 -31
  85. package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
  86. package/lib/actions/tagActions/tagActions.js +347 -2
  87. package/lib/actions/translationActions/translationActions.d.ts +38 -0
  88. package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
  89. package/lib/actions/translationActions/translationActions.js +189 -0
  90. package/lib/actions/userActions/userActions.d.ts +42 -95
  91. package/lib/actions/userActions/userActions.d.ts.map +1 -0
  92. package/lib/actions/userActions/userActions.js +844 -2
  93. package/lib/actions/videoActions/videoActions.d.ts +41 -0
  94. package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
  95. package/lib/actions/videoActions/videoActions.js +532 -0
  96. package/lib/actions/websocketActions/websocketActions.d.ts +20 -21
  97. package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
  98. package/lib/actions/websocketActions/websocketActions.js +377 -2
  99. package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
  100. package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
  101. package/lib/adapters/appAdapter/appAdapter.js +90 -0
  102. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +3 -2
  103. package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
  104. package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -2
  105. package/lib/adapters/contentAdapter/contentAdapter.d.ts +3 -2
  106. package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
  107. package/lib/adapters/contentAdapter/contentAdapter.js +107 -2
  108. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +3 -2
  109. package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
  110. package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -2
  111. package/lib/adapters/eventAdapter/eventAdapter.d.ts +5 -2
  112. package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
  113. package/lib/adapters/eventAdapter/eventAdapter.js +162 -2
  114. package/lib/adapters/fileAdapter/fileAdapter.d.ts +3 -2
  115. package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
  116. package/lib/adapters/fileAdapter/fileAdapter.js +118 -2
  117. package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
  118. package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
  119. package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
  120. package/lib/adapters/imageAdapter/imageAdapter.d.ts +9 -2
  121. package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
  122. package/lib/adapters/imageAdapter/imageAdapter.js +134 -2
  123. package/lib/adapters/index.d.ts +34 -16
  124. package/lib/adapters/index.d.ts.map +1 -0
  125. package/lib/adapters/index.js +19 -2
  126. package/lib/adapters/locationAdapter/locationAdapter.d.ts +3 -2
  127. package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
  128. package/lib/adapters/locationAdapter/locationAdapter.js +95 -2
  129. package/lib/adapters/messageAdapter/messageAdapter.d.ts +23 -19
  130. package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
  131. package/lib/adapters/messageAdapter/messageAdapter.js +82 -2
  132. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
  133. package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
  134. package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
  135. package/lib/adapters/personaAdapter/personaAdapter.d.ts +28 -2
  136. package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
  137. package/lib/adapters/personaAdapter/personaAdapter.js +161 -2
  138. package/lib/adapters/postAdapter/postAdapter.d.ts +3 -2
  139. package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
  140. package/lib/adapters/postAdapter/postAdapter.js +115 -2
  141. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +5 -2
  142. package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
  143. package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -2
  144. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +3 -2
  145. package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
  146. package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -2
  147. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +3 -2
  148. package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
  149. package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -2
  150. package/lib/adapters/tagAdapter/tagAdapter.d.ts +3 -2
  151. package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
  152. package/lib/adapters/tagAdapter/tagAdapter.js +98 -2
  153. package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
  154. package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
  155. package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
  156. package/lib/adapters/userAdapter/userAdapter.d.ts +18 -6
  157. package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
  158. package/lib/adapters/userAdapter/userAdapter.js +302 -2
  159. package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
  160. package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
  161. package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
  162. package/lib/config/index.d.ts +19 -6
  163. package/lib/config/index.d.ts.map +1 -0
  164. package/lib/config/index.js +97 -2
  165. package/lib/constants/Collections.d.ts +44 -0
  166. package/lib/constants/Collections.d.ts.map +1 -0
  167. package/lib/constants/Collections.js +40 -0
  168. package/lib/constants/MetropolisConstants.d.ts +1 -0
  169. package/lib/constants/MetropolisConstants.d.ts.map +1 -0
  170. package/lib/constants/MetropolisConstants.js +15 -2
  171. package/lib/graphql/message.d.ts +1 -0
  172. package/lib/graphql/message.d.ts.map +1 -0
  173. package/lib/graphql/message.js +6 -4
  174. package/lib/graphql/notification.d.ts +1 -0
  175. package/lib/graphql/notification.d.ts.map +1 -0
  176. package/lib/graphql/notification.js +6 -4
  177. package/lib/graphql/session.d.ts +1 -0
  178. package/lib/graphql/session.d.ts.map +1 -0
  179. package/lib/graphql/session.js +4 -3
  180. package/lib/index.d.ts +45 -22
  181. package/lib/index.d.ts.map +1 -0
  182. package/lib/index.js +248 -2
  183. package/lib/stores/appStore.d.ts +1 -0
  184. package/lib/stores/appStore.d.ts.map +1 -0
  185. package/lib/stores/appStore.js +23 -2
  186. package/lib/stores/contentStore.d.ts +36 -0
  187. package/lib/stores/contentStore.d.ts.map +1 -0
  188. package/lib/stores/contentStore.js +139 -0
  189. package/lib/stores/conversationStore.d.ts +38 -0
  190. package/lib/stores/conversationStore.d.ts.map +1 -0
  191. package/lib/stores/conversationStore.js +117 -0
  192. package/lib/stores/eventStore.d.ts +4 -1
  193. package/lib/stores/eventStore.d.ts.map +1 -0
  194. package/lib/stores/eventStore.js +47 -2
  195. package/lib/stores/groupStore.d.ts +37 -0
  196. package/lib/stores/groupStore.d.ts.map +1 -0
  197. package/lib/stores/groupStore.js +68 -0
  198. package/lib/stores/imageStore.d.ts +6 -1
  199. package/lib/stores/imageStore.d.ts.map +1 -0
  200. package/lib/stores/imageStore.js +53 -2
  201. package/lib/stores/index.d.ts +20 -11
  202. package/lib/stores/index.d.ts.map +1 -0
  203. package/lib/stores/index.js +24 -2
  204. package/lib/stores/locationStore.d.ts +2 -1
  205. package/lib/stores/locationStore.d.ts.map +1 -0
  206. package/lib/stores/locationStore.js +42 -2
  207. package/lib/stores/messageStore.d.ts +19 -4
  208. package/lib/stores/messageStore.d.ts.map +1 -0
  209. package/lib/stores/messageStore.js +137 -2
  210. package/lib/stores/notificationStore.d.ts +33 -0
  211. package/lib/stores/notificationStore.d.ts.map +1 -0
  212. package/lib/stores/notificationStore.js +55 -0
  213. package/lib/stores/permissionStore.d.ts +37 -0
  214. package/lib/stores/permissionStore.d.ts.map +1 -0
  215. package/lib/stores/permissionStore.js +117 -0
  216. package/lib/stores/personaStore.d.ts +26 -0
  217. package/lib/stores/personaStore.d.ts.map +1 -0
  218. package/lib/stores/personaStore.js +118 -0
  219. package/lib/stores/postStore.d.ts +2 -1
  220. package/lib/stores/postStore.d.ts.map +1 -0
  221. package/lib/stores/postStore.js +53 -2
  222. package/lib/stores/reactionStore.d.ts +1 -0
  223. package/lib/stores/reactionStore.d.ts.map +1 -0
  224. package/lib/stores/reactionStore.js +28 -2
  225. package/lib/stores/subscriptionStore.d.ts +41 -0
  226. package/lib/stores/subscriptionStore.d.ts.map +1 -0
  227. package/lib/stores/subscriptionStore.js +85 -0
  228. package/lib/stores/tagStore.d.ts +8 -5
  229. package/lib/stores/tagStore.d.ts.map +1 -0
  230. package/lib/stores/tagStore.js +87 -2
  231. package/lib/stores/translationStore.d.ts +42 -0
  232. package/lib/stores/translationStore.d.ts.map +1 -0
  233. package/lib/stores/translationStore.js +122 -0
  234. package/lib/stores/userStore.d.ts +5 -4
  235. package/lib/stores/userStore.d.ts.map +1 -0
  236. package/lib/stores/userStore.js +319 -2
  237. package/lib/stores/videoStore.d.ts +39 -0
  238. package/lib/stores/videoStore.d.ts.map +1 -0
  239. package/lib/stores/videoStore.js +132 -0
  240. package/lib/stores/websocketStore.d.ts +1 -0
  241. package/lib/stores/websocketStore.d.ts.map +1 -0
  242. package/lib/stores/websocketStore.js +51 -2
  243. package/lib/types/apps.types.d.ts +17 -0
  244. package/lib/types/apps.types.d.ts.map +1 -0
  245. package/lib/types/apps.types.js +6 -0
  246. package/lib/types/common.types.d.ts +31 -0
  247. package/lib/types/common.types.d.ts.map +1 -0
  248. package/lib/types/common.types.js +6 -0
  249. package/lib/types/conversations.types.d.ts +17 -0
  250. package/lib/types/conversations.types.d.ts.map +1 -0
  251. package/lib/types/conversations.types.js +6 -0
  252. package/lib/types/edges.types.d.ts +38 -0
  253. package/lib/types/edges.types.d.ts.map +1 -0
  254. package/lib/types/edges.types.js +6 -0
  255. package/lib/types/groups.types.d.ts +19 -0
  256. package/lib/types/groups.types.d.ts.map +1 -0
  257. package/lib/types/groups.types.js +6 -0
  258. package/lib/types/index.d.ts +12 -0
  259. package/lib/types/index.d.ts.map +1 -0
  260. package/lib/types/index.js +12 -0
  261. package/lib/types/subscriptions.types.d.ts +32 -0
  262. package/lib/types/subscriptions.types.d.ts.map +1 -0
  263. package/lib/types/subscriptions.types.js +6 -0
  264. package/lib/types/videos.types.d.ts +61 -0
  265. package/lib/types/videos.types.d.ts.map +1 -0
  266. package/lib/types/videos.types.js +6 -0
  267. package/lib/utils/MetropolisProvider.d.ts +39 -15
  268. package/lib/utils/MetropolisProvider.d.ts.map +1 -0
  269. package/lib/utils/MetropolisProvider.js +31 -2
  270. package/lib/utils/actionFactory.d.ts +21 -19
  271. package/lib/utils/actionFactory.d.ts.map +1 -0
  272. package/lib/utils/actionFactory.js +95 -2
  273. package/lib/utils/api.d.ts +5 -4
  274. package/lib/utils/api.d.ts.map +1 -0
  275. package/lib/utils/api.js +252 -6
  276. package/lib/utils/app.d.ts +1 -0
  277. package/lib/utils/app.d.ts.map +1 -0
  278. package/lib/utils/app.js +15 -2
  279. package/lib/utils/baseActionFactory.d.ts +5 -23
  280. package/lib/utils/baseActionFactory.d.ts.map +1 -0
  281. package/lib/utils/baseActionFactory.js +72 -2
  282. package/lib/utils/configUtils.d.ts +11 -0
  283. package/lib/utils/configUtils.d.ts.map +1 -0
  284. package/lib/utils/configUtils.js +20 -0
  285. package/lib/utils/dateUtils.d.ts +1 -0
  286. package/lib/utils/dateUtils.d.ts.map +1 -0
  287. package/lib/utils/dateUtils.js +11 -2
  288. package/lib/utils/file.d.ts +3 -1
  289. package/lib/utils/file.d.ts.map +1 -0
  290. package/lib/utils/file.js +156 -2
  291. package/lib/utils/i18n.d.ts +7 -0
  292. package/lib/utils/i18n.d.ts.map +1 -0
  293. package/lib/utils/i18n.js +96 -0
  294. package/lib/utils/index.d.ts +20 -0
  295. package/lib/utils/index.d.ts.map +1 -0
  296. package/lib/utils/index.js +26 -0
  297. package/lib/utils/location.d.ts +4 -3
  298. package/lib/utils/location.d.ts.map +1 -0
  299. package/lib/utils/location.js +82 -2
  300. package/lib/utils/permissionUtils.d.ts +22 -0
  301. package/lib/utils/permissionUtils.d.ts.map +1 -0
  302. package/lib/utils/permissionUtils.js +72 -0
  303. package/lib/utils/requestCache.d.ts +8 -0
  304. package/lib/utils/requestCache.d.ts.map +1 -0
  305. package/lib/utils/requestCache.js +53 -0
  306. package/lib/utils/session.d.ts +14 -0
  307. package/lib/utils/session.d.ts.map +1 -0
  308. package/lib/utils/session.js +107 -0
  309. package/lib/utils/useConversationTyping.d.ts +26 -0
  310. package/lib/utils/useConversationTyping.d.ts.map +1 -0
  311. package/lib/utils/useConversationTyping.js +117 -0
  312. package/lib/utils/useMetropolis.d.ts +67 -12
  313. package/lib/utils/useMetropolis.d.ts.map +1 -0
  314. package/lib/utils/useMetropolis.js +311 -2
  315. package/lib/utils/useTranslations.d.ts +16 -0
  316. package/lib/utils/useTranslations.d.ts.map +1 -0
  317. package/lib/utils/useTranslations.js +105 -0
  318. package/lib/utils/validatorFactory.d.ts +3 -2
  319. package/lib/utils/validatorFactory.d.ts.map +1 -0
  320. package/lib/utils/validatorFactory.js +95 -2
  321. package/package.json +58 -17
  322. package/temp_signin.ts +73 -0
  323. package/lib/actions/profileActions/profileActions.d.ts +0 -50
  324. package/lib/actions/profileActions/profileActions.js +0 -2
  325. package/lib/adapters/profileAdapter/profileAdapter.d.ts +0 -32
  326. package/lib/adapters/profileAdapter/profileAdapter.js +0 -2
  327. package/lib/stores/profileStore.d.ts +0 -24
  328. package/lib/stores/profileStore.js +0 -2
  329. /package/{FACTORY_PATTERN_GUIDE.md → factoryPatternGuide.md} +0 -0
@@ -0,0 +1,41 @@
1
+ import type { FluxFramework } from '@nlabs/arkhamjs';
2
+ import type { VideoMultipartUploadType, VideoType, VideoUploadPartInput, VideoUploadPartUrl } from '../../types/videos.types.js';
3
+ import type { ActionRequestOptions } from '../../utils/requestCache.js';
4
+ import type { BaseAdapterOptions } from '../../utils/validatorFactory.js';
5
+ export type VideoAdapterOptions = BaseAdapterOptions;
6
+ export interface VideoActionsOptions {
7
+ readonly videoAdapter?: (input: unknown, options?: VideoAdapterOptions) => any;
8
+ readonly videoAdapterOptions?: VideoAdapterOptions;
9
+ }
10
+ export type VideoApiResultsType = {
11
+ readonly videos: {
12
+ readonly add?: VideoType;
13
+ readonly abortMultipartUpload?: boolean;
14
+ readonly completeMultipartUpload?: VideoType;
15
+ readonly createMultipartUpload?: VideoMultipartUploadType;
16
+ readonly getMultipartUploadPartUrls?: VideoUploadPartUrl[];
17
+ readonly getVideoById?: VideoType;
18
+ readonly getVideoListByItem?: VideoType[];
19
+ readonly getVideoListByReactions?: VideoType[];
20
+ readonly list?: VideoType[];
21
+ readonly remove?: VideoType;
22
+ readonly update?: VideoType;
23
+ };
24
+ };
25
+ export interface VideoActions {
26
+ readonly add: (videoData: Partial<VideoType>, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
27
+ readonly abortMultipartUpload: (videoId: string, uploadId: string, requestOptions?: ActionRequestOptions) => Promise<boolean>;
28
+ readonly completeMultipartUpload: (videoId: string, uploadId: string, parts: VideoUploadPartInput[], videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
29
+ readonly createMultipartUpload: (videoData: Partial<VideoType>, partCount: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoMultipartUploadType>;
30
+ readonly delete: (videoId: string, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
31
+ readonly getMultipartUploadPartUrls: (videoId: string, uploadId: string, partNumbers: number[], requestOptions?: ActionRequestOptions) => Promise<VideoUploadPartUrl[]>;
32
+ readonly getVideoById: (videoId: string, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
33
+ readonly list: (from?: number, to?: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType[]>;
34
+ readonly listByItem: (itemId: string, from?: number, to?: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType[]>;
35
+ readonly listByReactions: (reactions: string[], from?: number, to?: number, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType[]>;
36
+ readonly update: (video: Partial<VideoType>, videoProps?: string[], requestOptions?: ActionRequestOptions) => Promise<VideoType>;
37
+ readonly updateVideoAdapter: (adapter: (input: unknown, options?: VideoAdapterOptions) => any) => void;
38
+ readonly updateVideoAdapterOptions: (options: VideoAdapterOptions) => void;
39
+ }
40
+ export declare const createVideoActions: (flux: FluxFramework, options?: VideoActionsOptions) => VideoActions;
41
+ //# sourceMappingURL=videoActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"videoActions.d.ts","sourceRoot":"","sources":["../../../src/actions/videoActions/videoActions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,532 @@
1
+ /**
2
+ * Copyright (c) 2026-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { parseId, parseNum } from '@nlabs/utils';
5
+ import { validateVideoInput } from '../../adapters/videoAdapter/videoAdapter.js';
6
+ import { VIDEO_CONSTANTS } from '../../stores/videoStore.js';
7
+ import { appMutation, appQuery } from '../../utils/api.js';
8
+ import { createBaseActions } from '../../utils/baseActionFactory.js';
9
+ import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
10
+ const DATA_TYPE = 'videos';
11
+ const defaultVideoValidator = (input, options)=>validateVideoInput(input);
12
+ export const createVideoActions = (flux, options)=>{
13
+ const videoBase = createBaseActions(flux, defaultVideoValidator, {
14
+ adapter: options?.videoAdapter,
15
+ adapterOptions: options?.videoAdapterOptions
16
+ });
17
+ const add = async (videoData, videoProps = [], requestOptions = {})=>{
18
+ try {
19
+ const queryVariables = {
20
+ video: {
21
+ type: 'VideoInput!',
22
+ value: videoBase.validator(videoData)
23
+ }
24
+ };
25
+ const onSuccess = async (data)=>{
26
+ const video = data?.videos?.add || {};
27
+ await flux.dispatch({
28
+ type: VIDEO_CONSTANTS.ADD_ITEM_SUCCESS,
29
+ video
30
+ });
31
+ return video;
32
+ };
33
+ return await appMutation(flux, 'add', DATA_TYPE, queryVariables, [
34
+ 'videoId',
35
+ ...videoProps
36
+ ], {
37
+ onSuccess: onSuccess
38
+ });
39
+ } catch (error) {
40
+ flux.dispatch({
41
+ error,
42
+ type: VIDEO_CONSTANTS.ADD_ITEM_ERROR
43
+ });
44
+ throw error;
45
+ } finally{
46
+ await clearCachedRequest(flux, 'video.list');
47
+ await clearCachedRequest(flux, `video.listByItem:${String(videoData?.itemId || '')}`);
48
+ await clearCachedRequest(flux, 'video.listByReactions');
49
+ }
50
+ };
51
+ const getVideoById = async (videoId, videoProps = [], requestOptions = {})=>{
52
+ try {
53
+ const cachedResult = getCachedRequest(flux, `video.getVideoById:${videoId}`, {
54
+ videoId,
55
+ videoProps
56
+ }, requestOptions);
57
+ if (cachedResult !== undefined) {
58
+ return cachedResult;
59
+ }
60
+ const queryVariables = {
61
+ videoId: {
62
+ type: 'ID!',
63
+ value: parseId(videoId)
64
+ }
65
+ };
66
+ const onSuccess = async (data)=>{
67
+ const video = data?.videos?.getVideoById || {};
68
+ await flux.dispatch({
69
+ type: VIDEO_CONSTANTS.GET_ITEM_SUCCESS,
70
+ video
71
+ });
72
+ return video;
73
+ };
74
+ const result = await appQuery(flux, 'getVideoById', DATA_TYPE, queryVariables, [
75
+ 'description',
76
+ 'duration',
77
+ 'format',
78
+ 'height',
79
+ 'mimeType',
80
+ 'name',
81
+ 'privacy',
82
+ 'size',
83
+ 'thumbUrl',
84
+ 'url',
85
+ 'userId',
86
+ 'videoId',
87
+ 'width',
88
+ ...videoProps
89
+ ], {
90
+ onSuccess: onSuccess
91
+ });
92
+ return await setCachedRequest(flux, `video.getVideoById:${videoId}`, {
93
+ videoId,
94
+ videoProps
95
+ }, result, requestOptions);
96
+ } catch (error) {
97
+ flux.dispatch({
98
+ error,
99
+ type: VIDEO_CONSTANTS.GET_ITEM_ERROR
100
+ });
101
+ throw error;
102
+ }
103
+ };
104
+ const createMultipartUpload = async (videoData, partCount, videoProps = [], requestOptions = {})=>{
105
+ try {
106
+ const queryVariables = {
107
+ partCount: {
108
+ type: 'Int!',
109
+ value: parseNum(partCount)
110
+ },
111
+ video: {
112
+ type: 'VideoInput!',
113
+ value: videoBase.validator(videoData)
114
+ }
115
+ };
116
+ const onSuccess = async (data)=>{
117
+ const upload = data?.videos?.createMultipartUpload || {};
118
+ const video = upload?.video || {};
119
+ await flux.dispatch({
120
+ type: VIDEO_CONSTANTS.ADD_ITEM_SUCCESS,
121
+ video
122
+ });
123
+ return upload;
124
+ };
125
+ return await appMutation(flux, 'createMultipartUpload', DATA_TYPE, queryVariables, [
126
+ 'bucket',
127
+ 'key',
128
+ 'partSize',
129
+ 'uploadId',
130
+ 'videoId',
131
+ 'partUrls {partNumber url}',
132
+ `video {videoId ${videoProps.join(' ')}}`
133
+ ], {
134
+ onSuccess: onSuccess
135
+ });
136
+ } catch (error) {
137
+ flux.dispatch({
138
+ error,
139
+ type: VIDEO_CONSTANTS.ADD_ITEM_ERROR
140
+ });
141
+ throw error;
142
+ } finally{
143
+ await clearCachedRequest(flux, 'video.list');
144
+ await clearCachedRequest(flux, `video.listByItem:${String(videoData?.itemId || '')}`);
145
+ await clearCachedRequest(flux, 'video.listByReactions');
146
+ }
147
+ };
148
+ const getMultipartUploadPartUrls = async (videoId, uploadId, partNumbers, requestOptions = {})=>{
149
+ try {
150
+ const queryVariables = {
151
+ partNumbers: {
152
+ type: '[Int!]!',
153
+ value: partNumbers.map((partNumber)=>parseNum(partNumber))
154
+ },
155
+ uploadId: {
156
+ type: 'String!',
157
+ value: uploadId
158
+ },
159
+ videoId: {
160
+ type: 'ID!',
161
+ value: parseId(videoId)
162
+ }
163
+ };
164
+ const onSuccess = async (data)=>data?.videos?.getMultipartUploadPartUrls || [];
165
+ return await appMutation(flux, 'getMultipartUploadPartUrls', DATA_TYPE, queryVariables, [
166
+ 'partNumber',
167
+ 'url'
168
+ ], {
169
+ onSuccess: onSuccess
170
+ });
171
+ } catch (error) {
172
+ flux.dispatch({
173
+ error,
174
+ type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
175
+ });
176
+ throw error;
177
+ }
178
+ };
179
+ const completeMultipartUpload = async (videoId, uploadId, parts, videoProps = [], requestOptions = {})=>{
180
+ try {
181
+ const queryVariables = {
182
+ parts: {
183
+ type: '[VideoUploadPartInput!]',
184
+ value: parts
185
+ },
186
+ uploadId: {
187
+ type: 'String!',
188
+ value: uploadId
189
+ },
190
+ videoId: {
191
+ type: 'ID!',
192
+ value: parseId(videoId)
193
+ }
194
+ };
195
+ const onSuccess = async (data)=>{
196
+ const video = data?.videos?.completeMultipartUpload || {};
197
+ await flux.dispatch({
198
+ type: VIDEO_CONSTANTS.UPDATE_ITEM_SUCCESS,
199
+ video
200
+ });
201
+ await flux.dispatch({
202
+ type: VIDEO_CONSTANTS.PROCESSING_COMPLETE,
203
+ video
204
+ });
205
+ return video;
206
+ };
207
+ return await appMutation(flux, 'completeMultipartUpload', DATA_TYPE, queryVariables, [
208
+ 'videoId',
209
+ ...videoProps
210
+ ], {
211
+ onSuccess: onSuccess
212
+ });
213
+ } catch (error) {
214
+ flux.dispatch({
215
+ error,
216
+ type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
217
+ });
218
+ throw error;
219
+ } finally{
220
+ await clearCachedRequest(flux, `video.getVideoById:${videoId}`);
221
+ await clearCachedRequest(flux, 'video.list');
222
+ await clearCachedRequest(flux, 'video.listByReactions');
223
+ }
224
+ };
225
+ const abortMultipartUpload = async (videoId, uploadId, requestOptions = {})=>{
226
+ try {
227
+ const queryVariables = {
228
+ uploadId: {
229
+ type: 'String!',
230
+ value: uploadId
231
+ },
232
+ videoId: {
233
+ type: 'ID!',
234
+ value: parseId(videoId)
235
+ }
236
+ };
237
+ const onSuccess = async (data)=>!!data?.videos?.abortMultipartUpload;
238
+ return await appMutation(flux, 'abortMultipartUpload', DATA_TYPE, queryVariables, [], {
239
+ onSuccess: onSuccess
240
+ });
241
+ } catch (error) {
242
+ flux.dispatch({
243
+ error,
244
+ type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
245
+ });
246
+ throw error;
247
+ } finally{
248
+ await clearCachedRequest(flux, `video.getVideoById:${videoId}`);
249
+ await clearCachedRequest(flux, 'video.list');
250
+ await clearCachedRequest(flux, 'video.listByReactions');
251
+ }
252
+ };
253
+ const list = async (from = 0, to = 10, videoProps = [], requestOptions = {})=>{
254
+ try {
255
+ const cachedResult = getCachedRequest(flux, 'video.list', {
256
+ from,
257
+ to,
258
+ videoProps
259
+ }, requestOptions);
260
+ if (cachedResult !== undefined) {
261
+ return cachedResult;
262
+ }
263
+ const queryVariables = {
264
+ from: {
265
+ type: 'Int',
266
+ value: parseNum(from)
267
+ },
268
+ to: {
269
+ type: 'Int',
270
+ value: parseNum(to)
271
+ }
272
+ };
273
+ const onSuccess = async (data)=>{
274
+ const list = data?.videos?.list || [];
275
+ await flux.dispatch({
276
+ list,
277
+ type: VIDEO_CONSTANTS.GET_LIST_SUCCESS
278
+ });
279
+ return list;
280
+ };
281
+ const result = await appQuery(flux, 'list', DATA_TYPE, queryVariables, [
282
+ 'description',
283
+ 'duration',
284
+ 'format',
285
+ 'height',
286
+ 'mimeType',
287
+ 'name',
288
+ 'privacy',
289
+ 'size',
290
+ 'thumbUrl',
291
+ 'url',
292
+ 'userId',
293
+ 'videoId',
294
+ 'width',
295
+ ...videoProps
296
+ ], {
297
+ onSuccess: onSuccess
298
+ });
299
+ return await setCachedRequest(flux, 'video.list', {
300
+ from,
301
+ to,
302
+ videoProps
303
+ }, result, requestOptions);
304
+ } catch (error) {
305
+ flux.dispatch({
306
+ error,
307
+ type: VIDEO_CONSTANTS.GET_LIST_ERROR
308
+ });
309
+ throw error;
310
+ }
311
+ };
312
+ const listByItem = async (itemId, from = 0, to = 10, videoProps = [], requestOptions = {})=>{
313
+ try {
314
+ const cachedResult = getCachedRequest(flux, `video.listByItem:${itemId}`, {
315
+ from,
316
+ itemId,
317
+ to,
318
+ videoProps
319
+ }, requestOptions);
320
+ if (cachedResult !== undefined) {
321
+ return cachedResult;
322
+ }
323
+ const queryVariables = {
324
+ from: {
325
+ type: 'Int',
326
+ value: parseNum(from)
327
+ },
328
+ itemId: {
329
+ type: 'ID!',
330
+ value: parseId(itemId)
331
+ },
332
+ to: {
333
+ type: 'Int',
334
+ value: parseNum(to)
335
+ }
336
+ };
337
+ const onSuccess = async (data)=>{
338
+ const list = data?.videos?.getVideoListByItem || [];
339
+ await flux.dispatch({
340
+ list,
341
+ type: VIDEO_CONSTANTS.GET_LIST_SUCCESS
342
+ });
343
+ return list;
344
+ };
345
+ const result = await appQuery(flux, 'getVideoListByItem', DATA_TYPE, queryVariables, [
346
+ 'description',
347
+ 'durationMs',
348
+ 'fileSize',
349
+ 'fileType',
350
+ 'height',
351
+ 'hlsUrl',
352
+ 'playbackFileType',
353
+ 'playbackUrl',
354
+ 'privacy',
355
+ 'thumbUrl',
356
+ 'type',
357
+ 'url',
358
+ 'userId',
359
+ 'videoId',
360
+ 'width',
361
+ ...videoProps
362
+ ], {
363
+ onSuccess: onSuccess
364
+ });
365
+ return await setCachedRequest(flux, `video.listByItem:${itemId}`, {
366
+ from,
367
+ itemId,
368
+ to,
369
+ videoProps
370
+ }, result, requestOptions);
371
+ } catch (error) {
372
+ flux.dispatch({
373
+ error,
374
+ type: VIDEO_CONSTANTS.GET_LIST_ERROR
375
+ });
376
+ throw error;
377
+ }
378
+ };
379
+ const listByReactions = async (reactions, from = 0, to = 10, videoProps = [], requestOptions = {})=>{
380
+ try {
381
+ const cachedResult = getCachedRequest(flux, 'video.listByReactions', {
382
+ from,
383
+ reactions,
384
+ to,
385
+ videoProps
386
+ }, requestOptions);
387
+ if (cachedResult !== undefined) {
388
+ return cachedResult;
389
+ }
390
+ const queryVariables = {
391
+ from: {
392
+ type: 'Int',
393
+ value: parseNum(from)
394
+ },
395
+ reactions: {
396
+ type: '[String!]',
397
+ value: reactions
398
+ },
399
+ to: {
400
+ type: 'Int',
401
+ value: parseNum(to)
402
+ }
403
+ };
404
+ const onSuccess = async (data)=>{
405
+ const list = data?.videos?.getVideoListByReactions || [];
406
+ await flux.dispatch({
407
+ list,
408
+ type: VIDEO_CONSTANTS.GET_LIST_SUCCESS
409
+ });
410
+ return list;
411
+ };
412
+ const result = await appQuery(flux, 'getVideoListByReactions', DATA_TYPE, queryVariables, [
413
+ 'description',
414
+ 'durationMs',
415
+ 'fileSize',
416
+ 'fileType',
417
+ 'height',
418
+ 'hlsUrl',
419
+ 'playbackFileType',
420
+ 'playbackUrl',
421
+ 'privacy',
422
+ 'thumbUrl',
423
+ 'type',
424
+ 'url',
425
+ 'userId',
426
+ 'videoId',
427
+ 'width',
428
+ ...videoProps
429
+ ], {
430
+ onSuccess: onSuccess
431
+ });
432
+ return await setCachedRequest(flux, 'video.listByReactions', {
433
+ from,
434
+ reactions,
435
+ to,
436
+ videoProps
437
+ }, result, requestOptions);
438
+ } catch (error) {
439
+ flux.dispatch({
440
+ error,
441
+ type: VIDEO_CONSTANTS.GET_LIST_ERROR
442
+ });
443
+ throw error;
444
+ }
445
+ };
446
+ const deleteVideo = async (videoId, videoProps = [], requestOptions = {})=>{
447
+ try {
448
+ const queryVariables = {
449
+ videoId: {
450
+ type: 'ID!',
451
+ value: parseId(videoId)
452
+ }
453
+ };
454
+ const onSuccess = async (data)=>{
455
+ const video = data?.videos?.remove || {};
456
+ await flux.dispatch({
457
+ type: VIDEO_CONSTANTS.REMOVE_ITEM_SUCCESS,
458
+ video
459
+ });
460
+ return video;
461
+ };
462
+ return await appMutation(flux, 'remove', DATA_TYPE, queryVariables, [
463
+ 'videoId',
464
+ ...videoProps
465
+ ], {
466
+ onSuccess: onSuccess
467
+ });
468
+ } catch (error) {
469
+ flux.dispatch({
470
+ error,
471
+ type: VIDEO_CONSTANTS.REMOVE_ITEM_ERROR
472
+ });
473
+ throw error;
474
+ } finally{
475
+ await clearCachedRequest(flux, `video.getVideoById:${videoId}`);
476
+ await clearCachedRequest(flux, 'video.list');
477
+ await clearCachedRequest(flux, 'video.listByReactions');
478
+ }
479
+ };
480
+ const update = async (video, videoProps = [], requestOptions = {})=>{
481
+ try {
482
+ const queryVariables = {
483
+ video: {
484
+ type: 'VideoInput!',
485
+ value: videoBase.validator(video)
486
+ }
487
+ };
488
+ const onSuccess = async (data)=>{
489
+ const video = data?.videos?.update || {};
490
+ await flux.dispatch({
491
+ type: VIDEO_CONSTANTS.UPDATE_ITEM_SUCCESS,
492
+ video
493
+ });
494
+ return video;
495
+ };
496
+ return await appMutation(flux, 'update', DATA_TYPE, queryVariables, [
497
+ 'videoId',
498
+ ...videoProps
499
+ ], {
500
+ onSuccess: onSuccess
501
+ });
502
+ } catch (error) {
503
+ flux.dispatch({
504
+ error,
505
+ type: VIDEO_CONSTANTS.UPDATE_ITEM_ERROR
506
+ });
507
+ throw error;
508
+ } finally{
509
+ await clearCachedRequest(flux, `video.getVideoById:${String(video?.videoId || '')}`);
510
+ await clearCachedRequest(flux, 'video.list');
511
+ await clearCachedRequest(flux, `video.listByItem:${String(video?.itemId || '')}`);
512
+ await clearCachedRequest(flux, 'video.listByReactions');
513
+ }
514
+ };
515
+ return {
516
+ abortMultipartUpload,
517
+ add,
518
+ completeMultipartUpload,
519
+ createMultipartUpload,
520
+ delete: deleteVideo,
521
+ getMultipartUploadPartUrls,
522
+ getVideoById,
523
+ list,
524
+ listByItem,
525
+ listByReactions,
526
+ update,
527
+ updateVideoAdapter: videoBase.updateAdapter,
528
+ updateVideoAdapterOptions: videoBase.updateOptions
529
+ };
530
+ };
531
+
532
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy92aWRlb0FjdGlvbnMvdmlkZW9BY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge3BhcnNlSWQsIHBhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlVmlkZW9JbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdmlkZW9BZGFwdGVyL3ZpZGVvQWRhcHRlci5qcyc7XG5pbXBvcnQge1ZJREVPX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3ZpZGVvU3RvcmUuanMnO1xuaW1wb3J0IHthcHBNdXRhdGlvbiwgYXBwUXVlcnl9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS5qcyc7XG5pbXBvcnQge2NyZWF0ZUJhc2VBY3Rpb25zfSBmcm9tICcuLi8uLi91dGlscy9iYXNlQWN0aW9uRmFjdG9yeS5qcyc7XG5pbXBvcnQge2NsZWFyQ2FjaGVkUmVxdWVzdCwgZ2V0Q2FjaGVkUmVxdWVzdCwgc2V0Q2FjaGVkUmVxdWVzdH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdENhY2hlLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7VmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlLCBWaWRlb1R5cGUsIFZpZGVvVXBsb2FkUGFydElucHV0LCBWaWRlb1VwbG9hZFBhcnRVcmx9IGZyb20gJy4uLy4uL3R5cGVzL3ZpZGVvcy50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSB7QmFzZUFkYXB0ZXJPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JGYWN0b3J5LmpzJztcblxuY29uc3QgREFUQV9UWVBFID0gJ3ZpZGVvcyc7XG5cbmV4cG9ydCB0eXBlIFZpZGVvQWRhcHRlck9wdGlvbnMgPSBCYXNlQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9BY3Rpb25zT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHZpZGVvQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFZpZGVvQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgcmVhZG9ubHkgdmlkZW9BZGFwdGVyT3B0aW9ucz86IFZpZGVvQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCB0eXBlIFZpZGVvQXBpUmVzdWx0c1R5cGUgPSB7XG4gIHJlYWRvbmx5IHZpZGVvczoge1xuICAgIHJlYWRvbmx5IGFkZD86IFZpZGVvVHlwZTtcbiAgICByZWFkb25seSBhYm9ydE11bHRpcGFydFVwbG9hZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQ/OiBWaWRlb1R5cGU7XG4gICAgcmVhZG9ubHkgY3JlYXRlTXVsdGlwYXJ0VXBsb2FkPzogVmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlO1xuICAgIHJlYWRvbmx5IGdldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzPzogVmlkZW9VcGxvYWRQYXJ0VXJsW107XG4gICAgcmVhZG9ubHkgZ2V0VmlkZW9CeUlkPzogVmlkZW9UeXBlO1xuICAgIHJlYWRvbmx5IGdldFZpZGVvTGlzdEJ5SXRlbT86IFZpZGVvVHlwZVtdO1xuICAgIHJlYWRvbmx5IGdldFZpZGVvTGlzdEJ5UmVhY3Rpb25zPzogVmlkZW9UeXBlW107XG4gICAgcmVhZG9ubHkgbGlzdD86IFZpZGVvVHlwZVtdO1xuICAgIHJlYWRvbmx5IHJlbW92ZT86IFZpZGVvVHlwZTtcbiAgICByZWFkb25seSB1cGRhdGU/OiBWaWRlb1R5cGU7XG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpZGVvQWN0aW9ucyB7XG4gIHJlYWRvbmx5IGFkZDogKHZpZGVvRGF0YTogUGFydGlhbDxWaWRlb1R5cGU+LCB2aWRlb1Byb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9UeXBlPjtcbiAgcmVhZG9ubHkgYWJvcnRNdWx0aXBhcnRVcGxvYWQ6ICh2aWRlb0lkOiBzdHJpbmcsIHVwbG9hZElkOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IGNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkOiAodmlkZW9JZDogc3RyaW5nLCB1cGxvYWRJZDogc3RyaW5nLCBwYXJ0czogVmlkZW9VcGxvYWRQYXJ0SW5wdXRbXSwgdmlkZW9Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFZpZGVvVHlwZT47XG4gIHJlYWRvbmx5IGNyZWF0ZU11bHRpcGFydFVwbG9hZDogKHZpZGVvRGF0YTogUGFydGlhbDxWaWRlb1R5cGU+LCBwYXJ0Q291bnQ6IG51bWJlciwgdmlkZW9Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZT47XG4gIHJlYWRvbmx5IGRlbGV0ZTogKHZpZGVvSWQ6IHN0cmluZywgdmlkZW9Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFZpZGVvVHlwZT47XG4gIHJlYWRvbmx5IGdldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzOiAodmlkZW9JZDogc3RyaW5nLCB1cGxvYWRJZDogc3RyaW5nLCBwYXJ0TnVtYmVyczogbnVtYmVyW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9VcGxvYWRQYXJ0VXJsW10+O1xuICByZWFkb25seSBnZXRWaWRlb0J5SWQ6ICh2aWRlb0lkOiBzdHJpbmcsIHZpZGVvUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxWaWRlb1R5cGU+O1xuICByZWFkb25seSBsaXN0OiAoZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHZpZGVvUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxWaWRlb1R5cGVbXT47XG4gIHJlYWRvbmx5IGxpc3RCeUl0ZW06IChpdGVtSWQ6IHN0cmluZywgZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHZpZGVvUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxWaWRlb1R5cGVbXT47XG4gIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9uczogKHJlYWN0aW9uczogc3RyaW5nW10sIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCB2aWRlb1Byb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9UeXBlW10+O1xuICByZWFkb25seSB1cGRhdGU6ICh2aWRlbzogUGFydGlhbDxWaWRlb1R5cGU+LCB2aWRlb1Byb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VmlkZW9UeXBlPjtcbiAgcmVhZG9ubHkgdXBkYXRlVmlkZW9BZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVmlkZW9BZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICByZWFkb25seSB1cGRhdGVWaWRlb0FkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogVmlkZW9BZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdFZpZGVvVmFsaWRhdG9yID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVmlkZW9BZGFwdGVyT3B0aW9ucykgPT5cbiAgdmFsaWRhdGVWaWRlb0lucHV0KGlucHV0KTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVZpZGVvQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IFZpZGVvQWN0aW9uc09wdGlvbnNcbik6IFZpZGVvQWN0aW9ucyA9PiB7XG4gIGNvbnN0IHZpZGVvQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRWaWRlb1ZhbGlkYXRvciwge1xuICAgIGFkYXB0ZXI6IG9wdGlvbnM/LnZpZGVvQWRhcHRlcixcbiAgICBhZGFwdGVyT3B0aW9uczogb3B0aW9ucz8udmlkZW9BZGFwdGVyT3B0aW9uc1xuICB9KTtcblxuICBjb25zdCBhZGQgPSBhc3luYyAoXG4gICAgdmlkZW9EYXRhOiBQYXJ0aWFsPFZpZGVvVHlwZT4sXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICB0eXBlOiAnVmlkZW9JbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiB2aWRlb0Jhc2UudmFsaWRhdG9yKHZpZGVvRGF0YSlcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gYXN5bmMgKGRhdGE6IFZpZGVvQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgICAgY29uc3QgdmlkZW8gPSBkYXRhPy52aWRlb3M/LmFkZCB8fCB7fTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7dHlwZTogVklERU9fQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1MsIHZpZGVvfSk7XG4gICAgICAgIHJldHVybiB2aWRlbztcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxWaWRlb1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnYWRkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWyd2aWRlb0lkJywgLi4udmlkZW9Qcm9wc10sXG4gICAgICAgIHtvblN1Y2Nlc3M6IG9uU3VjY2VzcyBhcyBhbnl9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuQUREX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3QnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8ubGlzdEJ5SXRlbToke1N0cmluZyh2aWRlb0RhdGE/Lml0ZW1JZCB8fCAnJyl9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3RCeVJlYWN0aW9ucycpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRWaWRlb0J5SWQgPSBhc3luYyAodmlkZW9JZDogc3RyaW5nLCB2aWRlb1Byb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VmlkZW9UeXBlPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VmlkZW9UeXBlPihmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7dmlkZW9JZH1gLCB7dmlkZW9JZCwgdmlkZW9Qcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB2aWRlbyA9IGRhdGE/LnZpZGVvcz8uZ2V0VmlkZW9CeUlkIHx8IHt9O1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHt0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdmlkZW99KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8VmlkZW9UeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFZpZGVvQnlJZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbicsXG4gICAgICAgICAgJ2Zvcm1hdCcsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ21pbWVUeXBlJyxcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICdzaXplJyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7dmlkZW9JZH1gLCB7dmlkZW9JZCwgdmlkZW9Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjcmVhdGVNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyAoXG4gICAgdmlkZW9EYXRhOiBQYXJ0aWFsPFZpZGVvVHlwZT4sXG4gICAgcGFydENvdW50OiBudW1iZXIsXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgcGFydENvdW50OiB7XG4gICAgICAgICAgdHlwZTogJ0ludCEnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZU51bShwYXJ0Q291bnQpXG4gICAgICAgIH0sXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgdHlwZTogJ1ZpZGVvSW5wdXQhJyxcbiAgICAgICAgICB2YWx1ZTogdmlkZW9CYXNlLnZhbGlkYXRvcih2aWRlb0RhdGEpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBWaWRlb0FwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwbG9hZCA9IChkYXRhPy52aWRlb3M/LmNyZWF0ZU11bHRpcGFydFVwbG9hZCB8fCB7fSkgYXMgVmlkZW9NdWx0aXBhcnRVcGxvYWRUeXBlO1xuICAgICAgICBjb25zdCB2aWRlbyA9IHVwbG9hZD8udmlkZW8gfHwge307XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3R5cGU6IFZJREVPX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTLCB2aWRlb30pO1xuICAgICAgICByZXR1cm4gdXBsb2FkO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvTXVsdGlwYXJ0VXBsb2FkVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdjcmVhdGVNdWx0aXBhcnRVcGxvYWQnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbXG4gICAgICAgICAgJ2J1Y2tldCcsXG4gICAgICAgICAgJ2tleScsXG4gICAgICAgICAgJ3BhcnRTaXplJyxcbiAgICAgICAgICAndXBsb2FkSWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAncGFydFVybHMge3BhcnROdW1iZXIgdXJsfScsXG4gICAgICAgICAgYHZpZGVvIHt2aWRlb0lkICR7dmlkZW9Qcm9wcy5qb2luKCcgJyl9fWBcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5BRERfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB2aWRlby5saXN0QnlJdGVtOiR7U3RyaW5nKHZpZGVvRGF0YT8uaXRlbUlkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzID0gYXN5bmMgKFxuICAgIHZpZGVvSWQ6IHN0cmluZyxcbiAgICB1cGxvYWRJZDogc3RyaW5nLFxuICAgIHBhcnROdW1iZXJzOiBudW1iZXJbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVXBsb2FkUGFydFVybFtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICBwYXJ0TnVtYmVyczoge1xuICAgICAgICAgIHR5cGU6ICdbSW50IV0hJyxcbiAgICAgICAgICB2YWx1ZTogcGFydE51bWJlcnMubWFwKChwYXJ0TnVtYmVyKSA9PiBwYXJzZU51bShwYXJ0TnVtYmVyKSlcbiAgICAgICAgfSxcbiAgICAgICAgdXBsb2FkSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkXG4gICAgICAgIH0sXG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT5cbiAgICAgICAgZGF0YT8udmlkZW9zPy5nZXRNdWx0aXBhcnRVcGxvYWRQYXJ0VXJscyB8fCBbXTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvVXBsb2FkUGFydFVybFtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldE11bHRpcGFydFVwbG9hZFBhcnRVcmxzJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWydwYXJ0TnVtYmVyJywgJ3VybCddLFxuICAgICAgICB7b25TdWNjZXNzOiBvblN1Y2Nlc3MgYXMgYW55fVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVklERU9fQ09OU1RBTlRTLlVQREFURV9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyAoXG4gICAgdmlkZW9JZDogc3RyaW5nLFxuICAgIHVwbG9hZElkOiBzdHJpbmcsXG4gICAgcGFydHM6IFZpZGVvVXBsb2FkUGFydElucHV0W10sXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgcGFydHM6IHtcbiAgICAgICAgICB0eXBlOiAnW1ZpZGVvVXBsb2FkUGFydElucHV0IV0nLFxuICAgICAgICAgIHZhbHVlOiBwYXJ0c1xuICAgICAgICB9LFxuICAgICAgICB1cGxvYWRJZDoge1xuICAgICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgICB2YWx1ZTogdXBsb2FkSWRcbiAgICAgICAgfSxcbiAgICAgICAgdmlkZW9JZDoge1xuICAgICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZUlkKHZpZGVvSWQpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBWaWRlb0FwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZGVvID0gZGF0YT8udmlkZW9zPy5jb21wbGV0ZU11bHRpcGFydFVwbG9hZCB8fCB7fTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7dHlwZTogVklERU9fQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsIHZpZGVvfSk7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3R5cGU6IFZJREVPX0NPTlNUQU5UUy5QUk9DRVNTSU5HX0NPTVBMRVRFLCB2aWRlb30pO1xuICAgICAgICByZXR1cm4gdmlkZW87XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb248VmlkZW9UeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2NvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWyd2aWRlb0lkJywgLi4udmlkZW9Qcm9wc10sXG4gICAgICAgIHtvblN1Y2Nlc3M6IG9uU3VjY2VzcyBhcyBhbnl9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuVVBEQVRFX0lURU1fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYHZpZGVvLmdldFZpZGVvQnlJZDoke3ZpZGVvSWR9YCk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3QnKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdEJ5UmVhY3Rpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFib3J0TXVsdGlwYXJ0VXBsb2FkID0gYXN5bmMgKFxuICAgIHZpZGVvSWQ6IHN0cmluZyxcbiAgICB1cGxvYWRJZDogc3RyaW5nLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXBsb2FkSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgICAgdmFsdWU6IHVwbG9hZElkXG4gICAgICAgIH0sXG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT5cbiAgICAgICAgISFkYXRhPy52aWRlb3M/LmFib3J0TXVsdGlwYXJ0VXBsb2FkO1xuXG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb248Ym9vbGVhbj4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdhYm9ydE11bHRpcGFydFVwbG9hZCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtdLFxuICAgICAgICB7b25TdWNjZXNzOiBvblN1Y2Nlc3MgYXMgYW55fVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVklERU9fQ09OU1RBTlRTLlVQREFURV9JVEVNX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB2aWRlby5nZXRWaWRlb0J5SWQ6JHt2aWRlb0lkfWApO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd2aWRlby5saXN0Jyk7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3ZpZGVvLmxpc3RCeVJlYWN0aW9ucycpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0ID0gYXN5bmMgKFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHZpZGVvUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWaWRlb1R5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFZpZGVvVHlwZVtdPihmbHV4LCAndmlkZW8ubGlzdCcsIHtmcm9tLCB0bywgdmlkZW9Qcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0oZnJvbSlcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0odG8pXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBWaWRlb0FwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhPy52aWRlb3M/Lmxpc3QgfHwgW107XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgdHlwZTogVklERU9fQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8VmlkZW9UeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnbGlzdCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbicsXG4gICAgICAgICAgJ2Zvcm1hdCcsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ21pbWVUeXBlJyxcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICdzaXplJyxcbiAgICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcsIHtmcm9tLCB0bywgdmlkZW9Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0QnlJdGVtID0gYXN5bmMgKFxuICAgIGl0ZW1JZDogc3RyaW5nLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHZpZGVvUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWaWRlb1R5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFZpZGVvVHlwZVtdPihmbHV4LCBgdmlkZW8ubGlzdEJ5SXRlbToke2l0ZW1JZH1gLCB7ZnJvbSwgaXRlbUlkLCB0bywgdmlkZW9Qcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGZyb206IHtcbiAgICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VOdW0oZnJvbSlcbiAgICAgICAgfSxcbiAgICAgICAgaXRlbUlkOiB7XG4gICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgdmFsdWU6IHBhcnNlSWQoaXRlbUlkKVxuICAgICAgICB9LFxuICAgICAgICB0bzoge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZU51bSh0bylcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gYXN5bmMgKGRhdGE6IFZpZGVvQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgICAgY29uc3QgbGlzdCA9IGRhdGE/LnZpZGVvcz8uZ2V0VmlkZW9MaXN0QnlJdGVtIHx8IFtdO1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBsaXN0LFxuICAgICAgICAgIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcFF1ZXJ5PFZpZGVvVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFZpZGVvTGlzdEJ5SXRlbScsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbk1zJyxcbiAgICAgICAgICAnZmlsZVNpemUnLFxuICAgICAgICAgICdmaWxlVHlwZScsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ2hsc1VybCcsXG4gICAgICAgICAgJ3BsYXliYWNrRmlsZVR5cGUnLFxuICAgICAgICAgICdwbGF5YmFja1VybCcsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8ubGlzdEJ5SXRlbToke2l0ZW1JZH1gLCB7ZnJvbSwgaXRlbUlkLCB0bywgdmlkZW9Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0xJU1RfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0QnlSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgcmVhY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICB2aWRlb1Byb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VmlkZW9UeXBlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxWaWRlb1R5cGVbXT4oZmx1eCwgJ3ZpZGVvLmxpc3RCeVJlYWN0aW9ucycsIHtmcm9tLCByZWFjdGlvbnMsIHRvLCB2aWRlb1Byb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgZnJvbToge1xuICAgICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICAgIHZhbHVlOiBwYXJzZU51bShmcm9tKVxuICAgICAgICB9LFxuICAgICAgICByZWFjdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnW1N0cmluZyFdJyxcbiAgICAgICAgICB2YWx1ZTogcmVhY3Rpb25zXG4gICAgICAgIH0sXG4gICAgICAgIHRvOiB7XG4gICAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgICAgdmFsdWU6IHBhcnNlTnVtKHRvKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBsaXN0ID0gZGF0YT8udmlkZW9zPy5nZXRWaWRlb0xpc3RCeVJlYWN0aW9ucyB8fCBbXTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgbGlzdCxcbiAgICAgICAgICB0eXBlOiBWSURFT19DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcHBRdWVyeTxWaWRlb1R5cGVbXT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdnZXRWaWRlb0xpc3RCeVJlYWN0aW9ucycsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdkdXJhdGlvbk1zJyxcbiAgICAgICAgICAnZmlsZVNpemUnLFxuICAgICAgICAgICdmaWxlVHlwZScsXG4gICAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICAgJ2hsc1VybCcsXG4gICAgICAgICAgJ3BsYXliYWNrRmlsZVR5cGUnLFxuICAgICAgICAgICdwbGF5YmFja1VybCcsXG4gICAgICAgICAgJ3ByaXZhY3knLFxuICAgICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICd1cmwnLFxuICAgICAgICAgICd1c2VySWQnLFxuICAgICAgICAgICd2aWRlb0lkJyxcbiAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgIC4uLnZpZGVvUHJvcHNcbiAgICAgICAgXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gYXdhaXQgc2V0Q2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdEJ5UmVhY3Rpb25zJywge2Zyb20sIHJlYWN0aW9ucywgdG8sIHZpZGVvUHJvcHN9LCByZXN1bHQsIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVklERU9fQ09OU1RBTlRTLkdFVF9MSVNUX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlVmlkZW8gPSBhc3luYyAoXG4gICAgdmlkZW9JZDogc3RyaW5nLFxuICAgIHZpZGVvUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxWaWRlb1R5cGU+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIHZpZGVvSWQ6IHtcbiAgICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VJZCh2aWRlb0lkKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB2aWRlbyA9IGRhdGE/LnZpZGVvcz8ucmVtb3ZlIHx8IHt9O1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHt0eXBlOiBWSURFT19DT05TVEFOVFMuUkVNT1ZFX0lURU1fU1VDQ0VTUywgdmlkZW99KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdyZW1vdmUnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ3ZpZGVvSWQnLCAuLi52aWRlb1Byb3BzXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7dmlkZW9JZH1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd2aWRlby5saXN0QnlSZWFjdGlvbnMnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlID0gYXN5bmMgKFxuICAgIHZpZGVvOiBQYXJ0aWFsPFZpZGVvVHlwZT4sXG4gICAgdmlkZW9Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFZpZGVvVHlwZT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICB0eXBlOiAnVmlkZW9JbnB1dCEnLFxuICAgICAgICAgIHZhbHVlOiB2aWRlb0Jhc2UudmFsaWRhdG9yKHZpZGVvKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogVmlkZW9BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCB2aWRlbyA9IGRhdGE/LnZpZGVvcz8udXBkYXRlIHx8IHt9O1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHt0eXBlOiBWSURFT19DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUywgdmlkZW99KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFZpZGVvVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICd1cGRhdGUnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ3ZpZGVvSWQnLCAuLi52aWRlb1Byb3BzXSxcbiAgICAgICAge29uU3VjY2Vzczogb25TdWNjZXNzIGFzIGFueX1cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFZJREVPX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCBgdmlkZW8uZ2V0VmlkZW9CeUlkOiR7U3RyaW5nKHZpZGVvPy52aWRlb0lkIHx8ICcnKX1gKTtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndmlkZW8ubGlzdCcpO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB2aWRlby5saXN0QnlJdGVtOiR7U3RyaW5nKHZpZGVvPy5pdGVtSWQgfHwgJycpfWApO1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd2aWRlby5saXN0QnlSZWFjdGlvbnMnKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhYm9ydE11bHRpcGFydFVwbG9hZCxcbiAgICBhZGQsXG4gICAgY29tcGxldGVNdWx0aXBhcnRVcGxvYWQsXG4gICAgY3JlYXRlTXVsdGlwYXJ0VXBsb2FkLFxuICAgIGRlbGV0ZTogZGVsZXRlVmlkZW8sXG4gICAgZ2V0TXVsdGlwYXJ0VXBsb2FkUGFydFVybHMsXG4gICAgZ2V0VmlkZW9CeUlkLFxuICAgIGxpc3QsXG4gICAgbGlzdEJ5SXRlbSxcbiAgICBsaXN0QnlSZWFjdGlvbnMsXG4gICAgdXBkYXRlLFxuICAgIHVwZGF0ZVZpZGVvQWRhcHRlcjogdmlkZW9CYXNlLnVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlVmlkZW9BZGFwdGVyT3B0aW9uczogdmlkZW9CYXNlLnVwZGF0ZU9wdGlvbnNcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsicGFyc2VJZCIsInBhcnNlTnVtIiwidmFsaWRhdGVWaWRlb0lucHV0IiwiVklERU9fQ09OU1RBTlRTIiwiYXBwTXV0YXRpb24iLCJhcHBRdWVyeSIsImNyZWF0ZUJhc2VBY3Rpb25zIiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJEQVRBX1RZUEUiLCJkZWZhdWx0VmlkZW9WYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJjcmVhdGVWaWRlb0FjdGlvbnMiLCJmbHV4IiwidmlkZW9CYXNlIiwiYWRhcHRlciIsInZpZGVvQWRhcHRlciIsImFkYXB0ZXJPcHRpb25zIiwidmlkZW9BZGFwdGVyT3B0aW9ucyIsImFkZCIsInZpZGVvRGF0YSIsInZpZGVvUHJvcHMiLCJyZXF1ZXN0T3B0aW9ucyIsInF1ZXJ5VmFyaWFibGVzIiwidmlkZW8iLCJ0eXBlIiwidmFsdWUiLCJ2YWxpZGF0b3IiLCJvblN1Y2Nlc3MiLCJkYXRhIiwidmlkZW9zIiwiZGlzcGF0Y2giLCJBRERfSVRFTV9TVUNDRVNTIiwiZXJyb3IiLCJBRERfSVRFTV9FUlJPUiIsIlN0cmluZyIsIml0ZW1JZCIsImdldFZpZGVvQnlJZCIsInZpZGVvSWQiLCJjYWNoZWRSZXN1bHQiLCJ1bmRlZmluZWQiLCJHRVRfSVRFTV9TVUNDRVNTIiwicmVzdWx0IiwiR0VUX0lURU1fRVJST1IiLCJjcmVhdGVNdWx0aXBhcnRVcGxvYWQiLCJwYXJ0Q291bnQiLCJ1cGxvYWQiLCJqb2luIiwiZ2V0TXVsdGlwYXJ0VXBsb2FkUGFydFVybHMiLCJ1cGxvYWRJZCIsInBhcnROdW1iZXJzIiwibWFwIiwicGFydE51bWJlciIsIlVQREFURV9JVEVNX0VSUk9SIiwiY29tcGxldGVNdWx0aXBhcnRVcGxvYWQiLCJwYXJ0cyIsIlVQREFURV9JVEVNX1NVQ0NFU1MiLCJQUk9DRVNTSU5HX0NPTVBMRVRFIiwiYWJvcnRNdWx0aXBhcnRVcGxvYWQiLCJsaXN0IiwiZnJvbSIsInRvIiwiR0VUX0xJU1RfU1VDQ0VTUyIsIkdFVF9MSVNUX0VSUk9SIiwibGlzdEJ5SXRlbSIsImdldFZpZGVvTGlzdEJ5SXRlbSIsImxpc3RCeVJlYWN0aW9ucyIsInJlYWN0aW9ucyIsImdldFZpZGVvTGlzdEJ5UmVhY3Rpb25zIiwiZGVsZXRlVmlkZW8iLCJyZW1vdmUiLCJSRU1PVkVfSVRFTV9TVUNDRVNTIiwiUkVNT1ZFX0lURU1fRVJST1IiLCJ1cGRhdGUiLCJkZWxldGUiLCJ1cGRhdGVWaWRlb0FkYXB0ZXIiLCJ1cGRhdGVBZGFwdGVyIiwidXBkYXRlVmlkZW9BZGFwdGVyT3B0aW9ucyIsInVwZGF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLE9BQU8sRUFBRUMsUUFBUSxRQUFPLGVBQWU7QUFFL0MsU0FBUUMsa0JBQWtCLFFBQU8sOENBQThDO0FBQy9FLFNBQVFDLGVBQWUsUUFBTyw2QkFBNkI7QUFDM0QsU0FBUUMsV0FBVyxFQUFFQyxRQUFRLFFBQU8scUJBQXFCO0FBQ3pELFNBQVFDLGlCQUFpQixRQUFPLG1DQUFtQztBQUNuRSxTQUFRQyxrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFPLDhCQUE4QjtBQU9uRyxNQUFNQyxZQUFZO0FBeUNsQixNQUFNQyx3QkFBd0IsQ0FBQ0MsT0FBZ0JDLFVBQzdDWCxtQkFBbUJVO0FBRXJCLE9BQU8sTUFBTUUscUJBQXFCLENBQ2hDQyxNQUNBRjtJQUVBLE1BQU1HLFlBQVlWLGtCQUFrQlMsTUFBTUosdUJBQXVCO1FBQy9ETSxTQUFTSixTQUFTSztRQUNsQkMsZ0JBQWdCTixTQUFTTztJQUMzQjtJQUVBLE1BQU1DLE1BQU0sT0FDVkMsV0FDQUMsYUFBdUIsRUFBRSxFQUN6QkMsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxJQUFJO1lBQ0YsTUFBTUMsaUJBQWlCO2dCQUNyQkMsT0FBTztvQkFDTEMsTUFBTTtvQkFDTkMsT0FBT1osVUFBVWEsU0FBUyxDQUFDUDtnQkFDN0I7WUFDRjtZQUVBLE1BQU1RLFlBQVksT0FBT0M7Z0JBQ3ZCLE1BQU1MLFFBQVFLLE1BQU1DLFFBQVFYLE9BQU8sQ0FBQztnQkFDcEMsTUFBTU4sS0FBS2tCLFFBQVEsQ0FBQztvQkFBQ04sTUFBTXhCLGdCQUFnQitCLGdCQUFnQjtvQkFBRVI7Z0JBQUs7Z0JBQ2xFLE9BQU9BO1lBQ1Q7WUFFQSxPQUFPLE1BQU10QixZQUNYVyxNQUNBLE9BQ0FMLFdBQ0FlLGdCQUNBO2dCQUFDO21CQUFjRjthQUFXLEVBQzFCO2dCQUFDTyxXQUFXQTtZQUFnQjtRQUVoQyxFQUFFLE9BQU1LLE9BQU87WUFDYnBCLEtBQUtrQixRQUFRLENBQUM7Z0JBQUNFO2dCQUFPUixNQUFNeEIsZ0JBQWdCaUMsY0FBYztZQUFBO1lBQzFELE1BQU1EO1FBQ1IsU0FBVTtZQUNSLE1BQU01QixtQkFBbUJRLE1BQU07WUFDL0IsTUFBTVIsbUJBQW1CUSxNQUFNLENBQUMsaUJBQWlCLEVBQUVzQixPQUFPZixXQUFXZ0IsVUFBVSxLQUFLO1lBQ3BGLE1BQU0vQixtQkFBbUJRLE1BQU07UUFDakM7SUFDRjtJQUVBLE1BQU13QixlQUFlLE9BQU9DLFNBQWlCakIsYUFBdUIsRUFBRSxFQUFFQyxpQkFBdUMsQ0FBQyxDQUFDO1FBQy9HLElBQUk7WUFDRixNQUFNaUIsZUFBZWpDLGlCQUE0Qk8sTUFBTSxDQUFDLG1CQUFtQixFQUFFeUIsU0FBUyxFQUFFO2dCQUFDQTtnQkFBU2pCO1lBQVUsR0FBR0M7WUFFL0csSUFBR2lCLGlCQUFpQkMsV0FBVztnQkFDN0IsT0FBT0Q7WUFDVDtZQUVBLE1BQU1oQixpQkFBaUI7Z0JBQ3JCZSxTQUFTO29CQUNQYixNQUFNO29CQUNOQyxPQUFPNUIsUUFBUXdDO2dCQUNqQjtZQUNGO1lBRUEsTUFBTVYsWUFBWSxPQUFPQztnQkFDdkIsTUFBTUwsUUFBUUssTUFBTUMsUUFBUU8sZ0JBQWdCLENBQUM7Z0JBQzdDLE1BQU14QixLQUFLa0IsUUFBUSxDQUFDO29CQUFDTixNQUFNeEIsZ0JBQWdCd0MsZ0JBQWdCO29CQUFFakI7Z0JBQUs7Z0JBQ2xFLE9BQU9BO1lBQ1Q7WUFFQSxNQUFNa0IsU0FBUyxNQUFNdkMsU0FDbkJVLE1BQ0EsZ0JBQ0FMLFdBQ0FlLGdCQUNBO2dCQUNFO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO21CQUNHRjthQUNKLEVBQ0Q7Z0JBQUNPLFdBQVdBO1lBQWdCO1lBRTlCLE9BQU8sTUFBTXJCLGlCQUFpQk0sTUFBTSxDQUFDLG1CQUFtQixFQUFFeUIsU0FBUyxFQUFFO2dCQUFDQTtnQkFBU2pCO1lBQVUsR0FBR3FCLFFBQVFwQjtRQUN0RyxFQUFFLE9BQU1XLE9BQU87WUFDYnBCLEtBQUtrQixRQUFRLENBQUM7Z0JBQUNFO2dCQUFPUixNQUFNeEIsZ0JBQWdCMEMsY0FBYztZQUFBO1lBQzFELE1BQU1WO1FBQ1I7SUFDRjtJQUVBLE1BQU1XLHdCQUF3QixPQUM1QnhCLFdBQ0F5QixXQUNBeEIsYUFBdUIsRUFBRSxFQUN6QkMsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxJQUFJO1lBQ0YsTUFBTUMsaUJBQWlCO2dCQUNyQnNCLFdBQVc7b0JBQ1RwQixNQUFNO29CQUNOQyxPQUFPM0IsU0FBUzhDO2dCQUNsQjtnQkFDQXJCLE9BQU87b0JBQ0xDLE1BQU07b0JBQ05DLE9BQU9aLFVBQVVhLFNBQVMsQ0FBQ1A7Z0JBQzdCO1lBQ0Y7WUFFQSxNQUFNUSxZQUFZLE9BQU9DO2dCQUN2QixNQUFNaUIsU0FBVWpCLE1BQU1DLFFBQVFjLHlCQUF5QixDQUFDO2dCQUN4RCxNQUFNcEIsUUFBUXNCLFFBQVF0QixTQUFTLENBQUM7Z0JBQ2hDLE1BQU1YLEtBQUtrQixRQUFRLENBQUM7b0JBQUNOLE1BQU14QixnQkFBZ0IrQixnQkFBZ0I7b0JBQUVSO2dCQUFLO2dCQUNsRSxPQUFPc0I7WUFDVDtZQUVBLE9BQU8sTUFBTTVDLFlBQ1hXLE1BQ0EseUJBQ0FMLFdBQ0FlLGdCQUNBO2dCQUNFO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBLENBQUMsZUFBZSxFQUFFRixXQUFXMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFDLEVBQ0Q7Z0JBQUNuQixXQUFXQTtZQUFnQjtRQUVoQyxFQUFFLE9BQU1LLE9BQU87WUFDYnBCLEtBQUtrQixRQUFRLENBQUM7Z0JBQUNFO2dCQUFPUixNQUFNeEIsZ0JBQWdCaUMsY0FBYztZQUFBO1lBQzFELE1BQU1EO1FBQ1IsU0FBVTtZQUNSLE1BQU01QixtQkFBbUJRLE1BQU07WUFDL0IsTUFBTVIsbUJBQW1CUSxNQUFNLENBQUMsaUJBQWlCLEVBQUVzQixPQUFPZixXQUFXZ0IsVUFBVSxLQUFLO1lBQ3BGLE1BQU0vQixtQkFBbUJRLE1BQU07UUFDakM7SUFDRjtJQUVBLE1BQU1tQyw2QkFBNkIsT0FDakNWLFNBQ0FXLFVBQ0FDLGFBQ0E1QixpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUk7WUFDRixNQUFNQyxpQkFBaUI7Z0JBQ3JCMkIsYUFBYTtvQkFDWHpCLE1BQU07b0JBQ05DLE9BQU93QixZQUFZQyxHQUFHLENBQUMsQ0FBQ0MsYUFBZXJELFNBQVNxRDtnQkFDbEQ7Z0JBQ0FILFVBQVU7b0JBQ1J4QixNQUFNO29CQUNOQyxPQUFPdUI7Z0JBQ1Q7Z0JBQ0FYLFNBQVM7b0JBQ1BiLE1BQU07b0JBQ05DLE9BQU81QixRQUFRd0M7Z0JBQ2pCO1lBQ0Y7WUFFQSxNQUFNVixZQUFZLE9BQU9DLE9BQ3ZCQSxNQUFNQyxRQUFRa0IsOEJBQThCLEVBQUU7WUFFaEQsT0FBTyxNQUFNOUMsWUFDWFcsTUFDQSw4QkFDQUwsV0FDQWUsZ0JBQ0E7Z0JBQUM7Z0JBQWM7YUFBTSxFQUNyQjtnQkFBQ0ssV0FBV0E7WUFBZ0I7UUFFaEMsRUFBRSxPQUFNSyxPQUFPO1lBQ2JwQixLQUFLa0IsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT1IsTUFBTXhCLGdCQUFnQm9ELGlCQUFpQjtZQUFBO1lBQzdELE1BQU1wQjtRQUNSO0lBQ0Y7SUFFQSxNQUFNcUIsMEJBQTBCLE9BQzlCaEIsU0FDQVcsVUFDQU0sT0FDQWxDLGFBQXVCLEVBQUUsRUFDekJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU1DLGlCQUFpQjtnQkFDckJnQyxPQUFPO29CQUNMOUIsTUFBTTtvQkFDTkMsT0FBTzZCO2dCQUNUO2dCQUNBTixVQUFVO29CQUNSeEIsTUFBTTtvQkFDTkMsT0FBT3VCO2dCQUNUO2dCQUNBWCxTQUFTO29CQUNQYixNQUFNO29CQUNOQyxPQUFPNUIsUUFBUXdDO2dCQUNqQjtZQUNGO1lBRUEsTUFBTVYsWUFBWSxPQUFPQztnQkFDdkIsTUFBTUwsUUFBUUssTUFBTUMsUUFBUXdCLDJCQUEyQixDQUFDO2dCQUN4RCxNQUFNekMsS0FBS2tCLFFBQVEsQ0FBQztvQkFBQ04sTUFBTXhCLGdCQUFnQnVELG1CQUFtQjtvQkFBRWhDO2dCQUFLO2dCQUNyRSxNQUFNWCxLQUFLa0IsUUFBUSxDQUFDO29CQUFDTixNQUFNeEIsZ0JBQWdCd0QsbUJBQW1CO29CQUFFakM7Z0JBQUs7Z0JBQ3JFLE9BQU9BO1lBQ1Q7WUFFQSxPQUFPLE1BQU10QixZQUNYVyxNQUNBLDJCQUNBTCxXQUNBZSxnQkFDQTtnQkFBQzttQkFBY0Y7YUFBVyxFQUMxQjtnQkFBQ08sV0FBV0E7WUFBZ0I7UUFFaEMsRUFBRSxPQUFNSyxPQUFPO1lBQ2JwQixLQUFLa0IsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT1IsTUFBTXhCLGdCQUFnQm9ELGlCQUFpQjtZQUFBO1lBQzdELE1BQU1wQjtRQUNSLFNBQVU7WUFDUixNQUFNNUIsbUJBQW1CUSxNQUFNLENBQUMsbUJBQW1CLEVBQUV5QixTQUFTO1lBQzlELE1BQU1qQyxtQkFBbUJRLE1BQU07WUFDL0IsTUFBTVIsbUJBQW1CUSxNQUFNO1FBQ2pDO0lBQ0Y7SUFFQSxNQUFNNkMsdUJBQXVCLE9BQzNCcEIsU0FDQVcsVUFDQTNCLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU1DLGlCQUFpQjtnQkFDckIwQixVQUFVO29CQUNSeEIsTUFBTTtvQkFDTkMsT0FBT3VCO2dCQUNUO2dCQUNBWCxTQUFTO29CQUNQYixNQUFNO29CQUNOQyxPQUFPNUIsUUFBUXdDO2dCQUNqQjtZQUNGO1lBRUEsTUFBTVYsWUFBWSxPQUFPQyxPQUN2QixDQUFDLENBQUNBLE1BQU1DLFFBQVE0QjtZQUVsQixPQUFPLE1BQU14RCxZQUNYVyxNQUNBLHdCQUNBTCxXQUNBZSxnQkFDQSxFQUFFLEVBQ0Y7Z0JBQUNLLFdBQVdBO1lBQWdCO1FBRWhDLEVBQUUsT0FBTUssT0FBTztZQUNicEIsS0FBS2tCLFFBQVEsQ0FBQztnQkFBQ0U7Z0JBQU9SLE1BQU14QixnQkFBZ0JvRCxpQkFBaUI7WUFBQTtZQUM3RCxNQUFNcEI7UUFDUixTQUFVO1lBQ1IsTUFBTTVCLG1CQUFtQlEsTUFBTSxDQUFDLG1CQUFtQixFQUFFeUIsU0FBUztZQUM5RCxNQUFNakMsbUJBQW1CUSxNQUFNO1lBQy9CLE1BQU1SLG1CQUFtQlEsTUFBTTtRQUNqQztJQUNGO0lBRUEsTUFBTThDLE9BQU8sT0FDWEMsT0FBZSxDQUFDLEVBQ2hCQyxLQUFhLEVBQUUsRUFDZnhDLGFBQXVCLEVBQUUsRUFDekJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU1pQixlQUFlakMsaUJBQThCTyxNQUFNLGNBQWM7Z0JBQUMrQztnQkFBTUM7Z0JBQUl4QztZQUFVLEdBQUdDO1lBRS9GLElBQUdpQixpQkFBaUJDLFdBQVc7Z0JBQzdCLE9BQU9EO1lBQ1Q7WUFFQSxNQUFNaEIsaUJBQWlCO2dCQUNyQnFDLE1BQU07b0JBQ0puQyxNQUFNO29CQUNOQyxPQUFPM0IsU0FBUzZEO2dCQUNsQjtnQkFDQUMsSUFBSTtvQkFDRnBDLE1BQU07b0JBQ05DLE9BQU8zQixTQUFTOEQ7Z0JBQ2xCO1lBQ0Y7WUFFQSxNQUFNakMsWUFBWSxPQUFPQztnQkFDdkIsTUFBTThCLE9BQU85QixNQUFNQyxRQUFRNkIsUUFBUSxFQUFFO2dCQUNyQyxNQUFNOUMsS0FBS2tCLFFBQVEsQ0FBQztvQkFDbEI0QjtvQkFDQWxDLE1BQU14QixnQkFBZ0I2RCxnQkFBZ0I7Z0JBQ3hDO2dCQUNBLE9BQU9IO1lBQ1Q7WUFFQSxNQUFNakIsU0FBUyxNQUFNdkMsU0FDbkJVLE1BQ0EsUUFDQUwsV0FDQWUsZ0JBQ0E7Z0JBQ0U7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7bUJBQ0dGO2FBQ0osRUFDRDtnQkFBQ08sV0FBV0E7WUFBZ0I7WUFFOUIsT0FBTyxNQUFNckIsaUJBQWlCTSxNQUFNLGNBQWM7Z0JBQUMrQztnQkFBTUM7Z0JBQUl4QztZQUFVLEdBQUdxQixRQUFRcEI7UUFDcEYsRUFBRSxPQUFNVyxPQUFPO1lBQ2JwQixLQUFLa0IsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT1IsTUFBTXhCLGdCQUFnQjhELGNBQWM7WUFBQTtZQUMxRCxNQUFNOUI7UUFDUjtJQUNGO0lBRUEsTUFBTStCLGFBQWEsT0FDakI1QixRQUNBd0IsT0FBZSxDQUFDLEVBQ2hCQyxLQUFhLEVBQUUsRUFDZnhDLGFBQXVCLEVBQUUsRUFDekJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU1pQixlQUFlakMsaUJBQThCTyxNQUFNLENBQUMsaUJBQWlCLEVBQUV1QixRQUFRLEVBQUU7Z0JBQUN3QjtnQkFBTXhCO2dCQUFReUI7Z0JBQUl4QztZQUFVLEdBQUdDO1lBRXZILElBQUdpQixpQkFBaUJDLFdBQVc7Z0JBQzdCLE9BQU9EO1lBQ1Q7WUFFQSxNQUFNaEIsaUJBQWlCO2dCQUNyQnFDLE1BQU07b0JBQ0puQyxNQUFNO29CQUNOQyxPQUFPM0IsU0FBUzZEO2dCQUNsQjtnQkFDQXhCLFFBQVE7b0JBQ05YLE1BQU07b0JBQ05DLE9BQU81QixRQUFRc0M7Z0JBQ2pCO2dCQUNBeUIsSUFBSTtvQkFDRnBDLE1BQU07b0JBQ05DLE9BQU8zQixTQUFTOEQ7Z0JBQ2xCO1lBQ0Y7WUFFQSxNQUFNakMsWUFBWSxPQUFPQztnQkFDdkIsTUFBTThCLE9BQU85QixNQUFNQyxRQUFRbUMsc0JBQXNCLEVBQUU7Z0JBQ25ELE1BQU1wRCxLQUFLa0IsUUFBUSxDQUFDO29CQUNsQjRCO29CQUNBbEMsTUFBTXhCLGdCQUFnQjZELGdCQUFnQjtnQkFDeEM7Z0JBQ0EsT0FBT0g7WUFDVDtZQUVBLE1BQU1qQixTQUFTLE1BQU12QyxTQUNuQlUsTUFDQSxzQkFDQUwsV0FDQWUsZ0JBQ0E7Z0JBQ0U7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7bUJBQ0dGO2FBQ0osRUFDRDtnQkFBQ08sV0FBV0E7WUFBZ0I7WUFFOUIsT0FBTyxNQUFNckIsaUJBQWlCTSxNQUFNLENBQUMsaUJBQWlCLEVBQUV1QixRQUFRLEVBQUU7Z0JBQUN3QjtnQkFBTXhCO2dCQUFReUI7Z0JBQUl4QztZQUFVLEdBQUdxQixRQUFRcEI7UUFDNUcsRUFBRSxPQUFNVyxPQUFPO1lBQ2JwQixLQUFLa0IsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT1IsTUFBTXhCLGdCQUFnQjhELGNBQWM7WUFBQTtZQUMxRCxNQUFNOUI7UUFDUjtJQUNGO0lBRUEsTUFBTWlDLGtCQUFrQixPQUN0QkMsV0FDQVAsT0FBZSxDQUFDLEVBQ2hCQyxLQUFhLEVBQUUsRUFDZnhDLGFBQXVCLEVBQUUsRUFDekJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsSUFBSTtZQUNGLE1BQU1pQixlQUFlakMsaUJBQThCTyxNQUFNLHlCQUF5QjtnQkFBQytDO2dCQUFNTztnQkFBV047Z0JBQUl4QztZQUFVLEdBQUdDO1lBRXJILElBQUdpQixpQkFBaUJDLFdBQVc7Z0JBQzdCLE9BQU9EO1lBQ1Q7WUFFQSxNQUFNaEIsaUJBQWlCO2dCQUNyQnFDLE1BQU07b0JBQ0puQyxNQUFNO29CQUNOQyxPQUFPM0IsU0FBUzZEO2dCQUNsQjtnQkFDQU8sV0FBVztvQkFDVDFDLE1BQU07b0JBQ05DLE9BQU95QztnQkFDVDtnQkFDQU4sSUFBSTtvQkFDRnBDLE1BQU07b0JBQ05DLE9BQU8zQixTQUFTOEQ7Z0JBQ2xCO1lBQ0Y7WUFFQSxNQUFNakMsWUFBWSxPQUFPQztnQkFDdkIsTUFBTThCLE9BQU85QixNQUFNQyxRQUFRc0MsMkJBQTJCLEVBQUU7Z0JBQ3hELE1BQU12RCxLQUFLa0IsUUFBUSxDQUFDO29CQUNsQjRCO29CQUNBbEMsTUFBTXhCLGdCQUFnQjZELGdCQUFnQjtnQkFDeEM7Z0JBQ0EsT0FBT0g7WUFDVDtZQUVBLE1BQU1qQixTQUFTLE1BQU12QyxTQUNuQlUsTUFDQSwyQkFDQUwsV0FDQWUsZ0JBQ0E7Z0JBQ0U7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7bUJBQ0dGO2FBQ0osRUFDRDtnQkFBQ08sV0FBV0E7WUFBZ0I7WUFFOUIsT0FBTyxNQUFNckIsaUJBQWlCTSxNQUFNLHlCQUF5QjtnQkFBQytDO2dCQUFNTztnQkFBV047Z0JBQUl4QztZQUFVLEdBQUdxQixRQUFRcEI7UUFDMUcsRUFBRSxPQUFNVyxPQUFPO1lBQ2JwQixLQUFLa0IsUUFBUSxDQUFDO2dCQUFDRTtnQkFBT1IsTUFBTXhCLGdCQUFnQjhELGNBQWM7WUFBQTtZQUMxRCxNQUFNOUI7UUFDUjtJQUNGO0lBRUEsTUFBTW9DLGNBQWMsT0FDbEIvQixTQUNBakIsYUFBdUIsRUFBRSxFQUN6QkMsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxJQUFJO1lBQ0YsTUFBTUMsaUJBQWlCO2dCQUNyQmUsU0FBUztvQkFDUGIsTUFBTTtvQkFDTkMsT0FBTzVCLFFBQVF3QztnQkFDakI7WUFDRjtZQUVBLE1BQU1WLFlBQVksT0FBT0M7Z0JBQ3ZCLE1BQU1MLFFBQVFLLE1BQU1DLFFBQVF3QyxVQUFVLENBQUM7Z0JBQ3ZDLE1BQU16RCxLQUFLa0IsUUFBUSxDQUFDO29CQUFDTixNQUFNeEIsZ0JBQWdCc0UsbUJBQW1CO29CQUFFL0M7Z0JBQUs7Z0JBQ3JFLE9BQU9BO1lBQ1Q7WUFFQSxPQUFPLE1BQU10QixZQUNYVyxNQUNBLFVBQ0FMLFdBQ0FlLGdCQUNBO2dCQUFDO21CQUFjRjthQUFXLEVBQzFCO2dCQUFDTyxXQUFXQTtZQUFnQjtRQUVoQyxFQUFFLE9BQU1LLE9BQU87WUFDYnBCLEtBQUtrQixRQUFRLENBQUM7Z0JBQUNFO2dCQUFPUixNQUFNeEIsZ0JBQWdCdUUsaUJBQWlCO1lBQUE7WUFDN0QsTUFBTXZDO1FBQ1IsU0FBVTtZQUNSLE1BQU01QixtQkFBbUJRLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRXlCLFNBQVM7WUFDOUQsTUFBTWpDLG1CQUFtQlEsTUFBTTtZQUMvQixNQUFNUixtQkFBbUJRLE1BQU07UUFDakM7SUFDRjtJQUVBLE1BQU00RCxTQUFTLE9BQ2JqRCxPQUNBSCxhQUF1QixFQUFFLEVBQ3pCQyxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUk7WUFDRixNQUFNQyxpQkFBaUI7Z0JBQ3JCQyxPQUFPO29CQUNMQyxNQUFNO29CQUNOQyxPQUFPWixVQUFVYSxTQUFTLENBQUNIO2dCQUM3QjtZQUNGO1lBRUEsTUFBTUksWUFBWSxPQUFPQztnQkFDdkIsTUFBTUwsUUFBUUssTUFBTUMsUUFBUTJDLFVBQVUsQ0FBQztnQkFDdkMsTUFBTTVELEtBQUtrQixRQUFRLENBQUM7b0JBQUNOLE1BQU14QixnQkFBZ0J1RCxtQkFBbUI7b0JBQUVoQztnQkFBSztnQkFDckUsT0FBT0E7WUFDVDtZQUVBLE9BQU8sTUFBTXRCLFlBQ1hXLE1BQ0EsVUFDQUwsV0FDQWUsZ0JBQ0E7Z0JBQUM7bUJBQWNGO2FBQVcsRUFDMUI7Z0JBQUNPLFdBQVdBO1lBQWdCO1FBRWhDLEVBQUUsT0FBTUssT0FBTztZQUNicEIsS0FBS2tCLFFBQVEsQ0FBQztnQkFBQ0U7Z0JBQU9SLE1BQU14QixnQkFBZ0JvRCxpQkFBaUI7WUFBQTtZQUM3RCxNQUFNcEI7UUFDUixTQUFVO1lBQ1IsTUFBTTVCLG1CQUFtQlEsTUFBTSxDQUFDLG1CQUFtQixFQUFFc0IsT0FBT1gsT0FBT2MsV0FBVyxLQUFLO1lBQ25GLE1BQU1qQyxtQkFBbUJRLE1BQU07WUFDL0IsTUFBTVIsbUJBQW1CUSxNQUFNLENBQUMsaUJBQWlCLEVBQUVzQixPQUFPWCxPQUFPWSxVQUFVLEtBQUs7WUFDaEYsTUFBTS9CLG1CQUFtQlEsTUFBTTtRQUNqQztJQUNGO0lBRUEsT0FBTztRQUNMNkM7UUFDQXZDO1FBQ0FtQztRQUNBVjtRQUNBOEIsUUFBUUw7UUFDUnJCO1FBQ0FYO1FBQ0FzQjtRQUNBSztRQUNBRTtRQUNBTztRQUNBRSxvQkFBb0I3RCxVQUFVOEQsYUFBYTtRQUMzQ0MsMkJBQTJCL0QsVUFBVWdFLGFBQWE7SUFDcEQ7QUFDRixFQUFFIn0=