@researchdatabox/redbox-core 0.0.1-beta.9228 → 0.0.1-beta.9474

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 (347) hide show
  1. package/dist/CoreController.d.ts +4 -0
  2. package/dist/CoreController.d.ts.map +1 -1
  3. package/dist/CoreController.js +33 -1
  4. package/dist/DatastreamService.d.ts +5 -2
  5. package/dist/DatastreamService.d.ts.map +1 -1
  6. package/dist/QueueService.d.ts +1 -1
  7. package/dist/QueueService.d.ts.map +1 -1
  8. package/dist/RecordsService.d.ts +38 -2
  9. package/dist/RecordsService.d.ts.map +1 -1
  10. package/dist/StorageService.d.ts +2 -1
  11. package/dist/StorageService.d.ts.map +1 -1
  12. package/dist/api-routes/apib.d.ts +7 -0
  13. package/dist/api-routes/apib.d.ts.map +1 -0
  14. package/dist/api-routes/apib.js +43 -0
  15. package/dist/api-routes/define.d.ts +4 -0
  16. package/dist/api-routes/define.d.ts.map +1 -0
  17. package/dist/api-routes/define.js +29 -0
  18. package/dist/api-routes/groups/admin.d.ts +6 -0
  19. package/dist/api-routes/groups/admin.d.ts.map +1 -0
  20. package/dist/api-routes/groups/admin.js +53 -0
  21. package/dist/api-routes/groups/appconfig.d.ts +4 -0
  22. package/dist/api-routes/groups/appconfig.d.ts.map +1 -0
  23. package/dist/api-routes/groups/appconfig.js +33 -0
  24. package/dist/api-routes/groups/branding.d.ts +8 -0
  25. package/dist/api-routes/groups/branding.d.ts.map +1 -0
  26. package/dist/api-routes/groups/branding.js +61 -0
  27. package/dist/api-routes/groups/dashboard-config.d.ts +11 -0
  28. package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -0
  29. package/dist/api-routes/groups/dashboard-config.js +90 -0
  30. package/dist/api-routes/groups/export.d.ts +3 -0
  31. package/dist/api-routes/groups/export.d.ts.map +1 -0
  32. package/dist/api-routes/groups/export.js +30 -0
  33. package/dist/api-routes/groups/forms.d.ts +4 -0
  34. package/dist/api-routes/groups/forms.d.ts.map +1 -0
  35. package/dist/api-routes/groups/forms.js +29 -0
  36. package/dist/api-routes/groups/integration-audit.d.ts +3 -0
  37. package/dist/api-routes/groups/integration-audit.d.ts.map +1 -0
  38. package/dist/api-routes/groups/integration-audit.js +35 -0
  39. package/dist/api-routes/groups/notifications.d.ts +3 -0
  40. package/dist/api-routes/groups/notifications.d.ts.map +1 -0
  41. package/dist/api-routes/groups/notifications.js +20 -0
  42. package/dist/api-routes/groups/records.d.ts +28 -0
  43. package/dist/api-routes/groups/records.d.ts.map +1 -0
  44. package/dist/api-routes/groups/records.js +349 -0
  45. package/dist/api-routes/groups/recordtypes.d.ts +4 -0
  46. package/dist/api-routes/groups/recordtypes.d.ts.map +1 -0
  47. package/dist/api-routes/groups/recordtypes.js +27 -0
  48. package/dist/api-routes/groups/reports.d.ts +3 -0
  49. package/dist/api-routes/groups/reports.d.ts.map +1 -0
  50. package/dist/api-routes/groups/reports.js +20 -0
  51. package/dist/api-routes/groups/search-query.d.ts +4 -0
  52. package/dist/api-routes/groups/search-query.d.ts.map +1 -0
  53. package/dist/api-routes/groups/search-query.js +51 -0
  54. package/dist/api-routes/groups/search.d.ts +6 -0
  55. package/dist/api-routes/groups/search.d.ts.map +1 -0
  56. package/dist/api-routes/groups/search.js +31 -0
  57. package/dist/api-routes/groups/translation.d.ts +8 -0
  58. package/dist/api-routes/groups/translation.d.ts.map +1 -0
  59. package/dist/api-routes/groups/translation.js +78 -0
  60. package/dist/api-routes/groups/users.d.ts +17 -0
  61. package/dist/api-routes/groups/users.d.ts.map +1 -0
  62. package/dist/api-routes/groups/users.js +149 -0
  63. package/dist/api-routes/groups/vocabulary.d.ts +10 -0
  64. package/dist/api-routes/groups/vocabulary.d.ts.map +1 -0
  65. package/dist/api-routes/groups/vocabulary.js +97 -0
  66. package/dist/api-routes/helpers.d.ts +29 -0
  67. package/dist/api-routes/helpers.d.ts.map +1 -0
  68. package/dist/api-routes/helpers.js +486 -0
  69. package/dist/api-routes/index.d.ts +25 -0
  70. package/dist/api-routes/index.d.ts.map +1 -0
  71. package/dist/api-routes/index.js +41 -0
  72. package/dist/api-routes/openapi.d.ts +27 -0
  73. package/dist/api-routes/openapi.d.ts.map +1 -0
  74. package/dist/api-routes/openapi.js +273 -0
  75. package/dist/api-routes/request-extraction.d.ts +14 -0
  76. package/dist/api-routes/request-extraction.d.ts.map +1 -0
  77. package/dist/api-routes/request-extraction.js +100 -0
  78. package/dist/api-routes/route-factory.d.ts +3 -0
  79. package/dist/api-routes/route-factory.d.ts.map +1 -0
  80. package/dist/api-routes/route-factory.js +30 -0
  81. package/dist/api-routes/route-registry.d.ts +24 -0
  82. package/dist/api-routes/route-registry.d.ts.map +1 -0
  83. package/dist/api-routes/route-registry.js +113 -0
  84. package/dist/api-routes/route-resolution.d.ts +4 -0
  85. package/dist/api-routes/route-resolution.d.ts.map +1 -0
  86. package/dist/api-routes/route-resolution.js +57 -0
  87. package/dist/api-routes/schemas/common.d.ts +37 -0
  88. package/dist/api-routes/schemas/common.d.ts.map +1 -0
  89. package/dist/api-routes/schemas/common.js +147 -0
  90. package/dist/api-routes/schemas/responses.d.ts +2904 -0
  91. package/dist/api-routes/schemas/responses.d.ts.map +1 -0
  92. package/dist/api-routes/schemas/responses.js +417 -0
  93. package/dist/api-routes/types.d.ts +70 -0
  94. package/dist/api-routes/types.d.ts.map +1 -0
  95. package/dist/api-routes/types.js +3 -0
  96. package/dist/api-routes/validation.d.ts +32 -0
  97. package/dist/api-routes/validation.d.ts.map +1 -0
  98. package/dist/api-routes/validation.js +142 -0
  99. package/dist/bootstrap.d.ts.map +1 -1
  100. package/dist/bootstrap.js +10 -10
  101. package/dist/config/agendaQueue.config.d.ts +25 -1
  102. package/dist/config/agendaQueue.config.d.ts.map +1 -1
  103. package/dist/config/agendaQueue.config.js +19 -2
  104. package/dist/config/auth.config.d.ts.map +1 -1
  105. package/dist/config/auth.config.js +21 -2
  106. package/dist/config/brandingConfigurationDefaults.config.js +3 -3
  107. package/dist/config/dashboardtype.config.d.ts +5 -0
  108. package/dist/config/dashboardtype.config.d.ts.map +1 -1
  109. package/dist/config/dashboardtype.config.js +1 -1
  110. package/dist/config/dashboardview.config.d.ts +24 -0
  111. package/dist/config/dashboardview.config.d.ts.map +1 -0
  112. package/dist/config/dashboardview.config.js +137 -0
  113. package/dist/config/dompurify.config.d.ts.map +1 -1
  114. package/dist/config/dompurify.config.js +2 -2
  115. package/dist/config/http.config.d.ts.map +1 -1
  116. package/dist/config/http.config.js +5 -3
  117. package/dist/config/index.d.ts +6 -0
  118. package/dist/config/index.d.ts.map +1 -1
  119. package/dist/config/index.js +4 -1
  120. package/dist/config/namedQuery.config.d.ts +10 -2
  121. package/dist/config/namedQuery.config.d.ts.map +1 -1
  122. package/dist/config/namedQuery.config.js +17 -17
  123. package/dist/config/policies.config.d.ts +3 -0
  124. package/dist/config/policies.config.d.ts.map +1 -1
  125. package/dist/config/policies.config.js +35 -1
  126. package/dist/config/record.config.d.ts.map +1 -1
  127. package/dist/config/record.config.js +2 -1
  128. package/dist/config/recordtype.config.d.ts +28 -0
  129. package/dist/config/recordtype.config.d.ts.map +1 -1
  130. package/dist/config/recordtype.config.js +85 -9
  131. package/dist/config/routes.config.d.ts +5 -2
  132. package/dist/config/routes.config.d.ts.map +1 -1
  133. package/dist/config/routes.config.js +24 -110
  134. package/dist/config/storage.config.d.ts +20 -2
  135. package/dist/config/storage.config.d.ts.map +1 -1
  136. package/dist/config/storage.config.js +2 -1
  137. package/dist/config/vocab.config.d.ts +30 -0
  138. package/dist/config/vocab.config.d.ts.map +1 -1
  139. package/dist/config/vocab.config.js +21 -1
  140. package/dist/config/webpack.config.d.ts.map +1 -1
  141. package/dist/config/webpack.config.js +13 -7
  142. package/dist/config/workflow.config.d.ts +0 -1
  143. package/dist/config/workflow.config.d.ts.map +1 -1
  144. package/dist/config/workflow.config.js +1 -137
  145. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
  146. package/dist/configmodels/AdminSidebarConfig.js +1 -2
  147. package/dist/configmodels/ConfigModels.d.ts +1 -1
  148. package/dist/configmodels/ConfigModels.d.ts.map +1 -1
  149. package/dist/configmodels/ConfigModels.js +9 -1
  150. package/dist/configmodels/DashboardTableOverrideConfig.d.ts +1011 -0
  151. package/dist/configmodels/DashboardTableOverrideConfig.d.ts.map +1 -0
  152. package/dist/configmodels/DashboardTableOverrideConfig.js +138 -0
  153. package/dist/controllers/AdminController.d.ts +0 -1
  154. package/dist/controllers/AdminController.d.ts.map +1 -1
  155. package/dist/controllers/AdminController.js +2 -32
  156. package/dist/controllers/BrandingController.d.ts +3 -5
  157. package/dist/controllers/BrandingController.d.ts.map +1 -1
  158. package/dist/controllers/BrandingController.js +29 -21
  159. package/dist/controllers/DashboardConfigController.d.ts +8 -0
  160. package/dist/controllers/DashboardConfigController.d.ts.map +1 -0
  161. package/dist/controllers/DashboardConfigController.js +17 -0
  162. package/dist/controllers/DynamicAssetController.d.ts +1 -0
  163. package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
  164. package/dist/controllers/DynamicAssetController.js +20 -1
  165. package/dist/controllers/EmailController.d.ts.map +1 -1
  166. package/dist/controllers/EmailController.js +16 -12
  167. package/dist/controllers/FormVocabularyController.d.ts +1 -0
  168. package/dist/controllers/FormVocabularyController.d.ts.map +1 -1
  169. package/dist/controllers/FormVocabularyController.js +94 -4
  170. package/dist/controllers/RecordController.d.ts +18 -1
  171. package/dist/controllers/RecordController.d.ts.map +1 -1
  172. package/dist/controllers/RecordController.js +274 -124
  173. package/dist/controllers/RenderViewController.d.ts.map +1 -1
  174. package/dist/controllers/RenderViewController.js +4 -2
  175. package/dist/controllers/TranslationController.d.ts.map +1 -1
  176. package/dist/controllers/TranslationController.js +3 -2
  177. package/dist/controllers/WorkspaceTypesController.d.ts +3 -2
  178. package/dist/controllers/WorkspaceTypesController.d.ts.map +1 -1
  179. package/dist/controllers/WorkspaceTypesController.js +120 -31
  180. package/dist/controllers/index.d.ts.map +1 -1
  181. package/dist/controllers/index.js +7 -4
  182. package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
  183. package/dist/controllers/webservice/AdminController.js +15 -16
  184. package/dist/controllers/webservice/AppConfigController.d.ts.map +1 -1
  185. package/dist/controllers/webservice/AppConfigController.js +19 -20
  186. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
  187. package/dist/controllers/webservice/BrandingController.js +101 -48
  188. package/dist/controllers/webservice/DashboardConfigController.d.ts +26 -0
  189. package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -0
  190. package/dist/controllers/webservice/DashboardConfigController.js +241 -0
  191. package/dist/controllers/webservice/ExportController.d.ts.map +1 -1
  192. package/dist/controllers/webservice/ExportController.js +11 -11
  193. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
  194. package/dist/controllers/webservice/FormManagementController.js +11 -13
  195. package/dist/controllers/webservice/RecordController.d.ts +4 -0
  196. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  197. package/dist/controllers/webservice/RecordController.js +428 -257
  198. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
  199. package/dist/controllers/webservice/RecordTypeController.js +9 -10
  200. package/dist/controllers/webservice/ReportController.d.ts.map +1 -1
  201. package/dist/controllers/webservice/ReportController.js +18 -20
  202. package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
  203. package/dist/controllers/webservice/SearchController.js +28 -35
  204. package/dist/controllers/webservice/TranslationController.d.ts.map +1 -1
  205. package/dist/controllers/webservice/TranslationController.js +61 -39
  206. package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -1
  207. package/dist/controllers/webservice/UserManagementController.js +112 -99
  208. package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -1
  209. package/dist/controllers/webservice/VocabularyController.js +76 -28
  210. package/dist/hooks/defineRedboxHook.d.ts +3 -0
  211. package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
  212. package/dist/hooks/defineRedboxHook.js +4 -1
  213. package/dist/index.d.ts +2 -0
  214. package/dist/index.d.ts.map +1 -1
  215. package/dist/index.js +2 -1
  216. package/dist/loader/index.d.ts +6 -0
  217. package/dist/loader/index.d.ts.map +1 -1
  218. package/dist/loader/index.js +57 -10
  219. package/dist/middleware/redboxSession.js +1 -1
  220. package/dist/model/DashboardTypeResponseModel.d.ts +13 -1
  221. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
  222. package/dist/model/DashboardTypeResponseModel.js +12 -4
  223. package/dist/model/DashboardViewResponseModel.d.ts +20 -0
  224. package/dist/model/DashboardViewResponseModel.d.ts.map +1 -0
  225. package/dist/model/DashboardViewResponseModel.js +38 -0
  226. package/dist/model/RecordTypeResponseModel.d.ts +3 -1
  227. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
  228. package/dist/model/RecordTypeResponseModel.js +4 -2
  229. package/dist/model/index.d.ts +1 -0
  230. package/dist/model/index.d.ts.map +1 -1
  231. package/dist/model/index.js +5 -2
  232. package/dist/model/storage/BrandingModel.d.ts +0 -16
  233. package/dist/model/storage/BrandingModel.d.ts.map +1 -1
  234. package/dist/model/storage/BrandingModel.js +2 -51
  235. package/dist/model/storage/DashboardTypeModel.d.ts +4 -0
  236. package/dist/model/storage/DashboardTypeModel.d.ts.map +1 -1
  237. package/dist/model/storage/RecordTypeModel.d.ts +16 -0
  238. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
  239. package/dist/model/storage/RecordTypeModel.js +9 -1
  240. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
  241. package/dist/policies/contentSecurityPolicy.js +23 -2
  242. package/dist/policies/index.d.ts +3 -0
  243. package/dist/policies/index.d.ts.map +1 -1
  244. package/dist/policies/index.js +6 -2
  245. package/dist/policies/validateApiContractRequest.d.ts +3 -0
  246. package/dist/policies/validateApiContractRequest.d.ts.map +1 -0
  247. package/dist/policies/validateApiContractRequest.js +74 -0
  248. package/dist/responses/badRequest.d.ts.map +1 -1
  249. package/dist/responses/badRequest.js +5 -3
  250. package/dist/responses/created.d.ts.map +1 -1
  251. package/dist/responses/created.js +5 -3
  252. package/dist/responses/forbidden.d.ts.map +1 -1
  253. package/dist/responses/forbidden.js +5 -3
  254. package/dist/responses/ok.d.ts.map +1 -1
  255. package/dist/responses/ok.js +5 -3
  256. package/dist/responses/serverError.d.ts.map +1 -1
  257. package/dist/responses/serverError.js +5 -3
  258. package/dist/responses/siteTitle.d.ts +6 -0
  259. package/dist/responses/siteTitle.d.ts.map +1 -0
  260. package/dist/responses/siteTitle.js +28 -0
  261. package/dist/sails.d.ts +7 -0
  262. package/dist/sails.d.ts.map +1 -1
  263. package/dist/services/AgendaQueueService.d.ts +38 -17
  264. package/dist/services/AgendaQueueService.d.ts.map +1 -1
  265. package/dist/services/AgendaQueueService.js +311 -81
  266. package/dist/services/AttachmentMetadataService.d.ts +34 -0
  267. package/dist/services/AttachmentMetadataService.d.ts.map +1 -0
  268. package/dist/services/AttachmentMetadataService.js +133 -0
  269. package/dist/services/BrandingLogoService.d.ts +6 -8
  270. package/dist/services/BrandingLogoService.d.ts.map +1 -1
  271. package/dist/services/BrandingLogoService.js +66 -72
  272. package/dist/services/DashboardConfigService.d.ts +71 -0
  273. package/dist/services/DashboardConfigService.d.ts.map +1 -0
  274. package/dist/services/DashboardConfigService.js +309 -0
  275. package/dist/services/DashboardTypesService.d.ts +61 -63
  276. package/dist/services/DashboardTypesService.d.ts.map +1 -1
  277. package/dist/services/DashboardTypesService.js +361 -198
  278. package/dist/services/DoiService.d.ts +11 -0
  279. package/dist/services/DoiService.d.ts.map +1 -1
  280. package/dist/services/DoiService.js +206 -1
  281. package/dist/services/FigshareService.d.ts.map +1 -1
  282. package/dist/services/FigshareService.js +5 -1
  283. package/dist/services/FormVocabularyService.d.ts +45 -0
  284. package/dist/services/FormVocabularyService.d.ts.map +1 -0
  285. package/dist/services/FormVocabularyService.js +326 -0
  286. package/dist/services/I18nEntriesService.d.ts +3 -0
  287. package/dist/services/I18nEntriesService.d.ts.map +1 -1
  288. package/dist/services/I18nEntriesService.js +14 -2
  289. package/dist/services/NamedQueryService.d.ts +27 -9
  290. package/dist/services/NamedQueryService.d.ts.map +1 -1
  291. package/dist/services/NamedQueryService.js +223 -55
  292. package/dist/services/RDMPService.d.ts.map +1 -1
  293. package/dist/services/RDMPService.js +3 -2
  294. package/dist/services/RecordsService.d.ts +8 -2
  295. package/dist/services/RecordsService.d.ts.map +1 -1
  296. package/dist/services/RecordsService.js +64 -16
  297. package/dist/services/ReportsService.d.ts.map +1 -1
  298. package/dist/services/ReportsService.js +7 -1
  299. package/dist/services/StandardDatastreamService.d.ts +32 -5
  300. package/dist/services/StandardDatastreamService.d.ts.map +1 -1
  301. package/dist/services/StandardDatastreamService.js +490 -38
  302. package/dist/services/StorageManagerService.d.ts +12 -1
  303. package/dist/services/StorageManagerService.d.ts.map +1 -1
  304. package/dist/services/StorageManagerService.js +72 -7
  305. package/dist/services/index.d.ts +9 -3
  306. package/dist/services/index.d.ts.map +1 -1
  307. package/dist/services/index.js +17 -7
  308. package/dist/storage/GridFSDriver.d.ts +101 -0
  309. package/dist/storage/GridFSDriver.d.ts.map +1 -0
  310. package/dist/storage/GridFSDriver.js +291 -0
  311. package/dist/storage/TusStorageManagerDataStore.d.ts +49 -0
  312. package/dist/storage/TusStorageManagerDataStore.d.ts.map +1 -0
  313. package/dist/storage/TusStorageManagerDataStore.js +300 -0
  314. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  315. package/dist/visitor/construct.visitor.js +6 -3
  316. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
  317. package/dist/visitor/migrate-config-v4-v5.visitor.js +19 -1
  318. package/dist/visitor/validator.visitor.d.ts.map +1 -1
  319. package/dist/visitor/validator.visitor.js +11 -3
  320. package/dist/waterline-models/AttachmentAccessAudit.d.ts +26 -0
  321. package/dist/waterline-models/AttachmentAccessAudit.d.ts.map +1 -0
  322. package/dist/waterline-models/AttachmentAccessAudit.js +63 -0
  323. package/dist/waterline-models/AttachmentMetadata.d.ts +40 -0
  324. package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -0
  325. package/dist/waterline-models/AttachmentMetadata.js +147 -0
  326. package/dist/waterline-models/BrandingConfig.d.ts +0 -2
  327. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
  328. package/dist/waterline-models/BrandingConfig.js +1 -6
  329. package/dist/waterline-models/DashboardType.d.ts +7 -0
  330. package/dist/waterline-models/DashboardType.d.ts.map +1 -1
  331. package/dist/waterline-models/DashboardType.js +16 -1
  332. package/dist/waterline-models/I18nTranslation.d.ts +2 -0
  333. package/dist/waterline-models/I18nTranslation.d.ts.map +1 -1
  334. package/dist/waterline-models/I18nTranslation.js +6 -1
  335. package/dist/waterline-models/NamedQuery.d.ts +6 -0
  336. package/dist/waterline-models/NamedQuery.d.ts.map +1 -1
  337. package/dist/waterline-models/NamedQuery.js +16 -1
  338. package/dist/waterline-models/index.d.ts +4 -0
  339. package/dist/waterline-models/index.d.ts.map +1 -1
  340. package/dist/waterline-models/index.js +7 -1
  341. package/package.json +31 -21
  342. package/dist/controllers/VocabController.d.ts +0 -43
  343. package/dist/controllers/VocabController.d.ts.map +0 -1
  344. package/dist/controllers/VocabController.js +0 -190
  345. package/dist/services/VocabService.d.ts +0 -81
  346. package/dist/services/VocabService.d.ts.map +0 -1
  347. package/dist/services/VocabService.js +0 -424
@@ -40,16 +40,18 @@ const Datastream_1 = require("../Datastream");
40
40
  const rxjs_1 = require("rxjs");
41
41
  const operators_1 = require("rxjs/operators");
42
42
  const _ = __importStar(require("lodash"));
43
+ const node_stream_1 = require("node:stream");
43
44
  /**
44
45
  * StandardDatastreamService
45
46
  *
46
47
  * Implements the DatastreamService interface using Flydrive v2 disks
47
48
  * managed by StorageManagerService. Files are read from the staging disk
48
- * and written to the primary disk under the key `{oid}/{fileId}`.
49
+ * and written to the primary disk under the configured key prefix.
49
50
  */
50
51
  var Services;
51
52
  (function (Services) {
52
53
  class StandardDatastream extends CoreService_1.Services.Core.Service {
54
+ static promotionGuards = new Map();
53
55
  _exportedMethods = [
54
56
  'addDatastreams',
55
57
  'updateDatastream',
@@ -61,10 +63,320 @@ var Services;
61
63
  ];
62
64
  logHeader = 'StandardDatastreamService::';
63
65
  /**
64
- * Build the storage key for a file: `{oid}/{fileId}`
66
+ * Build the storage key for a file under the configured prefix.
67
+ */
68
+ normalizedKeyPrefix() {
69
+ const storageConfig = StorageManagerService.getMergedStorageConfig();
70
+ const keyPrefix = storageConfig.keyPrefix ?? '';
71
+ if (_.isEmpty(keyPrefix)) {
72
+ return '';
73
+ }
74
+ return `${keyPrefix.replace(/\/+$/, '')}/`;
75
+ }
76
+ /**
77
+ * Build the storage key for a file under the configured prefix.
65
78
  */
66
79
  storageKey(oid, fileId) {
67
- return `${oid}/${fileId}`;
80
+ return `${this.normalizedKeyPrefix()}${oid}/${fileId}`;
81
+ }
82
+ fileIdFromStorageKey(key) {
83
+ return key.split('/').filter(Boolean).pop() ?? key;
84
+ }
85
+ attachmentMetadataService() {
86
+ return sails.services.attachmentmetadataservice;
87
+ }
88
+ requestUsername(requestContext) {
89
+ const username = String(requestContext?.username ?? '').trim();
90
+ return username || undefined;
91
+ }
92
+ safeToISOString(value) {
93
+ if (value === null || value === undefined) {
94
+ return undefined;
95
+ }
96
+ if (value instanceof Date) {
97
+ return Number.isNaN(value.getTime()) ? undefined : value.toISOString();
98
+ }
99
+ const valueWithToISOString = value;
100
+ if (typeof valueWithToISOString.toISOString === 'function') {
101
+ try {
102
+ return valueWithToISOString.toISOString();
103
+ }
104
+ catch {
105
+ return undefined;
106
+ }
107
+ }
108
+ const normalizedDate = new Date(value);
109
+ return Number.isNaN(normalizedDate.getTime()) ? undefined : normalizedDate.toISOString();
110
+ }
111
+ metadataToListEntry(row) {
112
+ const normalizedLastModified = row.lastModified
113
+ ? new Date(row.lastModified)
114
+ : undefined;
115
+ return this.datastreamListEntry(row.storageKey, {
116
+ contentType: row.contentType,
117
+ contentLength: row.contentLength,
118
+ lastModified: normalizedLastModified && !Number.isNaN(normalizedLastModified.getTime()) ? normalizedLastModified : row.lastModified,
119
+ etag: row.etag,
120
+ metadata: {
121
+ fileId: row.fileId,
122
+ name: row.filename ?? row.fileId,
123
+ mimeType: row.mimeType ?? row.contentType,
124
+ filename: row.filename,
125
+ uploadedBy: row.uploadedBy,
126
+ attachmentField: row.attachmentField,
127
+ lastAccessedAt: row.lastAccessedAt,
128
+ lastAccessedBy: row.lastAccessedBy,
129
+ accessCount: row.accessCount,
130
+ },
131
+ });
132
+ }
133
+ async buildMetadataRow(oid, fileId, storageKey, metadata) {
134
+ const primaryDisk = StorageManagerService.primaryDisk();
135
+ const diskMetadata = await primaryDisk.getMetaData(storageKey);
136
+ return {
137
+ oid,
138
+ fileId,
139
+ storageKey,
140
+ contentType: diskMetadata.contentType,
141
+ contentLength: diskMetadata.contentLength,
142
+ etag: diskMetadata.etag,
143
+ lastModified: this.safeToISOString(diskMetadata.lastModified),
144
+ filename: typeof metadata?.name === 'string' ? metadata.name : undefined,
145
+ mimeType: typeof metadata?.mimeType === 'string' ? metadata.mimeType : diskMetadata.contentType,
146
+ uploadedBy: typeof metadata?.uploadedBy === 'string' ? metadata.uploadedBy : undefined,
147
+ attachmentField: typeof metadata?.attachmentField === 'string' ? metadata.attachmentField : undefined,
148
+ };
149
+ }
150
+ async safelyUpsertMetadata(row) {
151
+ const metadataService = this.attachmentMetadataService();
152
+ if (!metadataService) {
153
+ return;
154
+ }
155
+ try {
156
+ await metadataService.upsert(row);
157
+ }
158
+ catch (err) {
159
+ this.logger.error(`${this.logHeader} metadata upsert failed for ${row.storageKey}`, err);
160
+ }
161
+ }
162
+ async safelyDeleteMetadata(storageKey) {
163
+ const metadataService = this.attachmentMetadataService();
164
+ if (!metadataService) {
165
+ return;
166
+ }
167
+ try {
168
+ await metadataService.deleteByStorageKey(storageKey);
169
+ }
170
+ catch (err) {
171
+ this.logger.error(`${this.logHeader} metadata delete failed for ${storageKey}`, err);
172
+ }
173
+ }
174
+ async safelyRecordAccess(event) {
175
+ const metadataService = this.attachmentMetadataService();
176
+ if (!metadataService) {
177
+ return;
178
+ }
179
+ try {
180
+ await metadataService.recordAccess(event);
181
+ }
182
+ catch (err) {
183
+ this.logger.error(`${this.logHeader} access audit failed for ${event.action} ${event.storageKey ?? event.oid}`, err);
184
+ }
185
+ }
186
+ async backfillMetadataFromDisk(oid, fileEntries) {
187
+ const primaryDisk = StorageManagerService.primaryDisk();
188
+ const results = [];
189
+ const detailsByKey = {};
190
+ const metadataBatchSize = 10;
191
+ for (let index = 0; index < fileEntries.length; index += metadataBatchSize) {
192
+ const batch = fileEntries.slice(index, index + metadataBatchSize);
193
+ const batchResults = await Promise.allSettled(batch.map(async ({ key }) => {
194
+ const meta = await primaryDisk.getMetaData(key);
195
+ const fileId = this.fileIdFromStorageKey(key);
196
+ const row = {
197
+ oid,
198
+ fileId,
199
+ storageKey: key,
200
+ contentType: meta.contentType,
201
+ contentLength: meta.contentLength,
202
+ etag: meta.etag,
203
+ lastModified: this.safeToISOString(meta.lastModified),
204
+ };
205
+ detailsByKey[key] = {
206
+ contentType: meta.contentType,
207
+ contentLength: meta.contentLength,
208
+ etag: meta.etag,
209
+ lastModified: meta.lastModified,
210
+ };
211
+ await this.safelyUpsertMetadata(row);
212
+ return row;
213
+ }));
214
+ results.push(...batchResults);
215
+ }
216
+ const byKey = {};
217
+ results.forEach((result) => {
218
+ if (result.status === 'fulfilled') {
219
+ byKey[result.value.storageKey] = {
220
+ row: result.value,
221
+ details: detailsByKey[result.value.storageKey] ?? {},
222
+ };
223
+ }
224
+ });
225
+ return byKey;
226
+ }
227
+ datastreamListEntry(key, details = {}) {
228
+ const fileId = this.fileIdFromStorageKey(key);
229
+ return {
230
+ filename: key,
231
+ ...details,
232
+ metadata: {
233
+ fileId,
234
+ name: fileId,
235
+ ...(details['metadata'] ?? {}),
236
+ },
237
+ };
238
+ }
239
+ isStorageNotFoundError(err) {
240
+ if (!err || typeof err !== 'object') {
241
+ return false;
242
+ }
243
+ const storageError = err;
244
+ const message = storageError.message?.toLowerCase() ?? '';
245
+ return storageError.code === 'ENOENT'
246
+ || storageError.code === 'NoSuchKey'
247
+ || storageError.status === 404
248
+ || storageError.statusCode === 404
249
+ || message.includes('not found')
250
+ || message.includes('no such')
251
+ || message.includes('does not exist')
252
+ || message.includes('enoent');
253
+ }
254
+ isStorageAlreadyExistsError(err) {
255
+ if (!err || typeof err !== 'object') {
256
+ return false;
257
+ }
258
+ const storageError = err;
259
+ const message = storageError.message?.toLowerCase() ?? '';
260
+ return storageError.code === 'EEXIST'
261
+ || storageError.status === 409
262
+ || storageError.statusCode === 409
263
+ || message.includes('already exists')
264
+ || message.includes('eexist');
265
+ }
266
+ async promoteFromStagingOnce(oid, fileId, destKey) {
267
+ const inFlightPromotion = Services.StandardDatastream.promotionGuards.get(destKey);
268
+ if (inFlightPromotion) {
269
+ return inFlightPromotion;
270
+ }
271
+ const promotionPromise = this.promoteFromStaging(oid, fileId, destKey);
272
+ Services.StandardDatastream.promotionGuards.set(destKey, promotionPromise);
273
+ try {
274
+ return await promotionPromise;
275
+ }
276
+ finally {
277
+ if (Services.StandardDatastream.promotionGuards.get(destKey) === promotionPromise) {
278
+ Services.StandardDatastream.promotionGuards.delete(destKey);
279
+ }
280
+ }
281
+ }
282
+ async promoteFromStaging(oid, fileId, destKey) {
283
+ const stagingDisk = StorageManagerService.stagingDisk();
284
+ const primaryDisk = StorageManagerService.primaryDisk();
285
+ if (await primaryDisk.exists(destKey)) {
286
+ this.logger.verbose(`${this.logHeader} promoteFromStaging() -> Already present: ${destKey}`);
287
+ return true;
288
+ }
289
+ const existsInStaging = await stagingDisk.exists(fileId);
290
+ if (!existsInStaging) {
291
+ return await this.promoteTusPartsFromStaging(stagingDisk, primaryDisk, fileId, destKey)
292
+ || primaryDisk.exists(destKey);
293
+ }
294
+ const readable = await stagingDisk.getStream(fileId);
295
+ try {
296
+ await primaryDisk.putStream(destKey, readable);
297
+ }
298
+ catch (err) {
299
+ readable.destroy();
300
+ if (!this.isStorageAlreadyExistsError(err) || !(await primaryDisk.exists(destKey))) {
301
+ throw err;
302
+ }
303
+ }
304
+ try {
305
+ await stagingDisk.delete(fileId);
306
+ }
307
+ catch (err) {
308
+ if (!this.isStorageNotFoundError(err)) {
309
+ throw err;
310
+ }
311
+ }
312
+ this.logger.verbose(`${this.logHeader} promoteFromStaging() -> Promoted: ${destKey}`);
313
+ if (oid) {
314
+ try {
315
+ const metadataRow = await this.buildMetadataRow(oid, fileId, destKey);
316
+ await this.safelyUpsertMetadata(metadataRow);
317
+ }
318
+ catch (err) {
319
+ this.logger.error(`${this.logHeader} promoteFromStaging() metadata sync failed for ${destKey}`, err);
320
+ }
321
+ await this.safelyRecordAccess({ oid, fileId, storageKey: destKey, action: 'upload' });
322
+ }
323
+ return true;
324
+ }
325
+ async promoteTusPartsFromStaging(stagingDisk, primaryDisk, fileId, destKey) {
326
+ const partKeys = await this.listTusPartKeys(stagingDisk, fileId);
327
+ if (!partKeys.length) {
328
+ return false;
329
+ }
330
+ const readable = node_stream_1.Readable.from(this.streamDiskObjects(stagingDisk, partKeys));
331
+ try {
332
+ await primaryDisk.putStream(destKey, readable);
333
+ await stagingDisk.deleteAll(this.tusPartsPrefix(fileId));
334
+ await stagingDisk.delete(this.tusInfoKey(fileId)).catch((err) => {
335
+ if (!this.isStorageNotFoundError(err)) {
336
+ throw err;
337
+ }
338
+ });
339
+ }
340
+ catch (err) {
341
+ readable.destroy();
342
+ throw err;
343
+ }
344
+ this.logger.verbose(`${this.logHeader} promoteTusPartsFromStaging() -> Promoted incomplete TUS upload parts: ${destKey}`);
345
+ return true;
346
+ }
347
+ async listTusPartKeys(stagingDisk, fileId) {
348
+ const listed = await stagingDisk.listAll(this.tusPartsPrefix(fileId), { recursive: true });
349
+ return Array.from(listed.objects)
350
+ .map((object) => this.listedObjectKey(object))
351
+ .filter((key) => typeof key === 'string' && key.length > 0)
352
+ .sort((left, right) => left.localeCompare(right));
353
+ }
354
+ listedObjectKey(object) {
355
+ if (!object || typeof object !== 'object') {
356
+ return undefined;
357
+ }
358
+ const candidate = object;
359
+ if (typeof candidate.key === 'string') {
360
+ return candidate.key;
361
+ }
362
+ if (typeof candidate.name === 'string') {
363
+ return candidate.name;
364
+ }
365
+ return undefined;
366
+ }
367
+ tusPartsPrefix(fileId) {
368
+ return `.tus/${fileId}/parts/`;
369
+ }
370
+ tusInfoKey(fileId) {
371
+ return `.tus/${fileId}/info.json`;
372
+ }
373
+ async *streamDiskObjects(stagingDisk, keys) {
374
+ for (const key of keys) {
375
+ const stream = await stagingDisk.getStream(key);
376
+ for await (const chunk of stream) {
377
+ yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
378
+ }
379
+ }
68
380
  }
69
381
  // ----------------------------------------------------------------
70
382
  // DatastreamService interface implementation
@@ -103,9 +415,10 @@ var Services;
103
415
  .getFormByName(typedRecord.metaMetadata.form, true, typedRecord.metaMetadata.brandId)
104
416
  .pipe((0, operators_1.mergeMap)(form => {
105
417
  const reqs = [];
106
- if (form?.attachmentFields) {
107
- typedRecord.metaMetadata.attachmentFields = form.attachmentFields;
108
- for (const attField of form.attachmentFields) {
418
+ const attachmentFields = form?.configuration?.attachmentFields;
419
+ if (attachmentFields) {
420
+ typedRecord.metaMetadata.attachmentFields = attachmentFields;
421
+ for (const attField of attachmentFields) {
109
422
  const perFieldFileIdsAdded = [];
110
423
  const oldAttachments = this.getAttachments(typedRecord.metadata, attField);
111
424
  const newAttachments = this.getAttachments(typedNewMetadata, attField);
@@ -119,7 +432,13 @@ var Services;
119
432
  const toAdd = this.diffAttachments(newAttachments, oldAttachments);
120
433
  for (const addAtt of toAdd) {
121
434
  if (this.isAttachment(addAtt)) {
122
- perFieldFileIdsAdded.push(new Datastream_1.Datastream(addAtt));
435
+ perFieldFileIdsAdded.push(new Datastream_1.Datastream({
436
+ ...addAtt,
437
+ name: addAtt['name'],
438
+ mimeType: addAtt['mimeType'],
439
+ attachmentField: attField,
440
+ uploadedBy: addAtt['uploadedBy'],
441
+ }));
123
442
  }
124
443
  }
125
444
  fileIdsAdded.push(...perFieldFileIdsAdded);
@@ -174,21 +493,45 @@ var Services;
174
493
  const effectiveStagingDisk = stagingDisk ?? StorageManagerService.stagingDisk();
175
494
  const primaryDisk = StorageManagerService.primaryDisk();
176
495
  const destKey = this.storageKey(oid, fileId);
177
- const exists = await effectiveStagingDisk.exists(fileId);
178
- if (!exists) {
179
- throw new Error(`Attachment not found in staging: ${fileId}`);
496
+ const existsInStaging = await effectiveStagingDisk.exists(fileId);
497
+ if (!existsInStaging) {
498
+ const promotedTusParts = await this.promoteTusPartsFromStaging(effectiveStagingDisk, primaryDisk, fileId, destKey);
499
+ if (!promotedTusParts) {
500
+ throw new Error(`Attachment not found in staging: ${fileId}`);
501
+ }
502
+ await this.afterDatastreamPromoted(oid, fileId, destKey, datastream);
503
+ this.logger.verbose(`${this.logHeader} addDatastream() -> Successfully added: ${destKey}`);
504
+ return { success: true, key: destKey };
180
505
  }
506
+ const readable = await effectiveStagingDisk.getStream(fileId);
181
507
  try {
182
- await effectiveStagingDisk.move(fileId, destKey);
183
- }
184
- catch {
185
- const readable = await effectiveStagingDisk.getStream(fileId);
186
508
  await primaryDisk.putStream(destKey, readable);
187
- await effectiveStagingDisk.delete(fileId);
188
509
  }
510
+ catch (err) {
511
+ readable.destroy();
512
+ throw err;
513
+ }
514
+ await effectiveStagingDisk.delete(fileId);
515
+ await this.afterDatastreamPromoted(oid, fileId, destKey, datastream);
189
516
  this.logger.verbose(`${this.logHeader} addDatastream() -> Successfully added: ${destKey}`);
190
517
  return { success: true, key: destKey };
191
518
  }
519
+ async afterDatastreamPromoted(oid, fileId, destKey, datastream) {
520
+ try {
521
+ const metadataRow = await this.buildMetadataRow(oid, fileId, destKey, datastream.metadata);
522
+ await this.safelyUpsertMetadata(metadataRow);
523
+ }
524
+ catch (err) {
525
+ this.logger.error(`${this.logHeader} addDatastream() metadata sync failed for ${destKey}`, err);
526
+ }
527
+ await this.safelyRecordAccess({
528
+ oid,
529
+ fileId,
530
+ storageKey: destKey,
531
+ action: 'upload',
532
+ accessedBy: typeof datastream.metadata?.uploadedBy === 'string' ? datastream.metadata.uploadedBy : undefined,
533
+ });
534
+ }
192
535
  /**
193
536
  * Remove a single datastream from the primary disk.
194
537
  */
@@ -205,6 +548,8 @@ var Services;
205
548
  // Flydrive may throw if the file doesn't exist; log and continue
206
549
  this.logger.verbose(`${this.logHeader} removeDatastream() -> File not found or error deleting: ${destKey}`);
207
550
  }
551
+ await this.safelyDeleteMetadata(destKey);
552
+ await this.safelyRecordAccess({ oid, fileId, storageKey: destKey, action: 'remove' });
208
553
  return { success: true };
209
554
  }
210
555
  /**
@@ -223,27 +568,53 @@ var Services;
223
568
  * Get a datastream (file contents) from the primary disk.
224
569
  * Returns an Attachment with a readstream.
225
570
  */
226
- async getDatastream(oid, fileId) {
571
+ async getDatastream(oid, fileId, requestContext) {
227
572
  const destKey = this.storageKey(oid, fileId);
228
573
  this.logger.verbose(`${this.logHeader} getDatastream() -> Key: ${destKey}`);
229
574
  const primaryDisk = StorageManagerService.primaryDisk();
230
575
  // Check existence
231
- const exists = await primaryDisk.exists(destKey);
576
+ let exists = await primaryDisk.exists(destKey);
577
+ if (!exists) {
578
+ exists = await this.promoteFromStagingOnce(oid, fileId, destKey);
579
+ }
232
580
  if (!exists) {
233
581
  throw new Error(`Attachment not found: ${destKey}`);
234
582
  }
235
583
  const readstream = await primaryDisk.getStream(destKey);
236
- // Try to get metadata for content type / size
584
+ const metadataService = this.attachmentMetadataService();
585
+ const metadataRow = await metadataService?.findOneByStorageKey(destKey);
237
586
  let contentType = '';
238
587
  let size = 0;
239
- try {
240
- const meta = await primaryDisk.getMetaData(destKey);
241
- contentType = meta.contentType ?? '';
242
- size = meta.contentLength ?? 0;
588
+ if (metadataRow) {
589
+ contentType = metadataRow.contentType ?? metadataRow.mimeType ?? '';
590
+ size = metadataRow.contentLength ?? 0;
243
591
  }
244
- catch {
245
- // Metadata may not be available for all drivers
592
+ else {
593
+ try {
594
+ const meta = await primaryDisk.getMetaData(destKey);
595
+ contentType = meta.contentType ?? '';
596
+ size = meta.contentLength ?? 0;
597
+ await this.safelyUpsertMetadata({
598
+ oid,
599
+ fileId,
600
+ storageKey: destKey,
601
+ contentType: meta.contentType,
602
+ contentLength: meta.contentLength,
603
+ etag: meta.etag,
604
+ lastModified: this.safeToISOString(meta.lastModified),
605
+ });
606
+ }
607
+ catch {
608
+ // Metadata may not be available for all drivers
609
+ }
246
610
  }
611
+ await this.safelyRecordAccess({
612
+ oid,
613
+ fileId,
614
+ storageKey: destKey,
615
+ action: 'download',
616
+ accessedBy: this.requestUsername(requestContext),
617
+ });
247
618
  return {
248
619
  readstream,
249
620
  contentType,
@@ -254,44 +625,125 @@ var Services;
254
625
  * List datastreams for a record.
255
626
  * If fileId is provided, lists that specific file; otherwise lists all files for the oid.
256
627
  */
257
- async listDatastreams(oid, fileId) {
628
+ async listDatastreams(oid, fileId, requestContext) {
258
629
  const primaryDisk = StorageManagerService.primaryDisk();
630
+ const metadataService = this.attachmentMetadataService();
259
631
  if (!_.isEmpty(fileId)) {
260
632
  const destKey = this.storageKey(oid, fileId);
261
633
  const exists = await primaryDisk.exists(destKey);
262
634
  if (!exists) {
263
635
  return [];
264
636
  }
637
+ const metadataRow = await metadataService?.findOneByStorageKey(destKey);
638
+ if (metadataRow) {
639
+ await this.safelyRecordAccess({
640
+ oid,
641
+ fileId,
642
+ storageKey: destKey,
643
+ action: 'list',
644
+ accessedBy: this.requestUsername(requestContext),
645
+ itemCount: 1,
646
+ });
647
+ return [this.metadataToListEntry(metadataRow)];
648
+ }
265
649
  try {
266
650
  const meta = await primaryDisk.getMetaData(destKey);
267
- return [
268
- {
269
- filename: destKey,
651
+ const response = [
652
+ this.datastreamListEntry(destKey, {
270
653
  contentType: meta.contentType,
271
654
  contentLength: meta.contentLength,
272
655
  lastModified: meta.lastModified,
273
656
  etag: meta.etag,
274
- },
657
+ }),
275
658
  ];
659
+ await this.safelyUpsertMetadata({
660
+ oid,
661
+ fileId,
662
+ storageKey: destKey,
663
+ contentType: meta.contentType,
664
+ contentLength: meta.contentLength,
665
+ lastModified: this.safeToISOString(meta.lastModified),
666
+ etag: meta.etag,
667
+ });
668
+ await this.safelyRecordAccess({
669
+ oid,
670
+ fileId,
671
+ storageKey: destKey,
672
+ action: 'list',
673
+ accessedBy: this.requestUsername(requestContext),
674
+ itemCount: response.length,
675
+ });
676
+ return response;
276
677
  }
277
678
  catch {
278
- return [{ filename: destKey }];
679
+ const response = [this.datastreamListEntry(destKey)];
680
+ await this.safelyRecordAccess({
681
+ oid,
682
+ fileId,
683
+ storageKey: destKey,
684
+ action: 'list',
685
+ accessedBy: this.requestUsername(requestContext),
686
+ itemCount: response.length,
687
+ });
688
+ return response;
279
689
  }
280
690
  }
281
691
  // List all files under the oid prefix
282
- const prefix = `${oid}/`;
692
+ const prefix = `${this.normalizedKeyPrefix()}${oid}/`;
283
693
  const result = await primaryDisk.listAll(prefix, { recursive: true });
284
- const files = [];
285
- for (const obj of result.objects) {
694
+ const fileEntries = Array.from(result.objects).map((obj) => {
286
695
  const fileObj = obj;
287
- files.push({
288
- filename: fileObj['key'] ?? fileObj['name'] ?? String(obj),
289
- ...fileObj,
696
+ const key = String(fileObj['key'] ?? fileObj['name'] ?? obj);
697
+ return {
698
+ key,
699
+ fileObj,
700
+ };
701
+ });
702
+ const metadataRows = await metadataService?.findByOid(oid) ?? [];
703
+ const metadataByKey = _.keyBy(metadataRows, 'storageKey');
704
+ const hasCompleteMetadata = fileEntries.length > 0 && fileEntries.every(({ key }) => !!metadataByKey[key]);
705
+ if (hasCompleteMetadata) {
706
+ const response = fileEntries.map(({ key }) => this.metadataToListEntry(metadataByKey[key]));
707
+ await this.safelyRecordAccess({
708
+ oid,
709
+ action: 'list',
710
+ accessedBy: this.requestUsername(requestContext),
711
+ itemCount: response.length,
290
712
  });
713
+ return response;
291
714
  }
292
- return files;
715
+ const backfilledMetadataByKey = await this.backfillMetadataFromDisk(oid, fileEntries);
716
+ const response = fileEntries.map(({ key, fileObj }) => {
717
+ const metadataRow = metadataByKey[key];
718
+ if (metadataRow) {
719
+ return this.metadataToListEntry(metadataRow);
720
+ }
721
+ const backfilled = backfilledMetadataByKey[key];
722
+ if (backfilled) {
723
+ return this.datastreamListEntry(key, {
724
+ ...fileObj,
725
+ ...backfilled.details,
726
+ metadata: {
727
+ fileId: backfilled.row.fileId,
728
+ name: backfilled.row.filename ?? backfilled.row.fileId,
729
+ mimeType: backfilled.row.mimeType ?? backfilled.row.contentType,
730
+ filename: backfilled.row.filename,
731
+ uploadedBy: backfilled.row.uploadedBy,
732
+ attachmentField: backfilled.row.attachmentField,
733
+ },
734
+ });
735
+ }
736
+ return this.datastreamListEntry(key, fileObj);
737
+ });
738
+ await this.safelyRecordAccess({
739
+ oid,
740
+ action: 'list',
741
+ accessedBy: this.requestUsername(requestContext),
742
+ itemCount: response.length,
743
+ });
744
+ return response;
293
745
  }
294
746
  }
295
747
  Services.StandardDatastream = StandardDatastream;
296
748
  })(Services || (exports.Services = Services = {}));
297
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhbmRhcmREYXRhc3RyZWFtU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9TdGFuZGFyZERhdGFzdHJlYW1TZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUFzRDtBQUV0RCw0RUFBeUU7QUFDekUsOENBQTJDO0FBQzNDLCtCQUFzQztBQUN0Qyw4Q0FBMEM7QUFDMUMsMENBQTRCO0FBVzVCOzs7Ozs7R0FNRztBQUNILElBQWlCLFFBQVEsQ0F1U3hCO0FBdlNELFdBQWlCLFFBQVE7SUFDdkIsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUSxDQUFDLElBQUksQ0FBQyxPQUFPO1FBQ2pELGdCQUFnQixHQUFhO1lBQ3JDLGdCQUFnQjtZQUNoQixrQkFBa0I7WUFDbEIsa0JBQWtCO1lBQ2xCLGVBQWU7WUFDZix5QkFBeUI7WUFDekIsZUFBZTtZQUNmLGlCQUFpQjtTQUNsQixDQUFDO1FBRVEsU0FBUyxHQUFXLDZCQUE2QixDQUFDO1FBRzVEOztXQUVHO1FBQ0ssVUFBVSxDQUFDLEdBQVcsRUFBRSxNQUFjO1lBQzVDLE9BQU8sR0FBRyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSw2Q0FBNkM7UUFDN0MsbUVBQW1FO1FBRW5FOzs7V0FHRztRQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBVyxFQUFFLFdBQXlCO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLElBQUkscURBQXlCLEVBQUUsQ0FBQztZQUNqRCxRQUFRLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFFdkIsS0FBSyxNQUFNLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFH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
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhbmRhcmREYXRhc3RyZWFtU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9TdGFuZGFyZERhdGFzdHJlYW1TZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUFzRDtBQUV0RCw0RUFBeUU7QUFDekUsOENBQTJDO0FBQzNDLCtCQUFzQztBQUN0Qyw4Q0FBMEM7QUFDMUMsMENBQTRCO0FBQzVCLDZDQUF1QztBQTRCdkM7Ozs7OztHQU1HO0FBQ0gsSUFBaUIsUUFBUSxDQXd6QnhCO0FBeHpCRCxXQUFpQixRQUFRO0lBQ3ZCLE1BQWEsa0JBQW1CLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUNuRCxNQUFNLENBQUMsZUFBZSxHQUFrQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRXZELGdCQUFnQixHQUFhO1lBQzlDLGdCQUFnQjtZQUNoQixrQkFBa0I7WUFDbEIsa0JBQWtCO1lBQ2xCLGVBQWU7WUFDZix5QkFBeUI7WUFDekIsZUFBZTtZQUNmLGlCQUFpQjtTQUNsQixDQUFDO1FBRWlCLFNBQVMsR0FBVyw2QkFBNkIsQ0FBQztRQUVyRTs7V0FFRztRQUNLLG1CQUFtQjtZQUN6QixNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFDRCxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUM3QyxDQUFDO1FBRUQ7O1dBRUc7UUFDSyxVQUFVLENBQUMsR0FBVyxFQUFFLE1BQWM7WUFDNUMsT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBRU8sb0JBQW9CLENBQUMsR0FBVztZQUN0QyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUNyRCxDQUFDO1FBRU8seUJBQXlCO1lBQy9CLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyx5QkFBMEUsQ0FBQztRQUNuRyxDQUFDO1FBRU8sZUFBZSxDQUFDLGNBQXlDO1lBQy9ELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9ELE9BQU8sUUFBUSxJQUFJLFNBQVMsQ0FBQztRQUMvQixDQUFDO1FBRU8sZUFBZSxDQUFDLEtBQWM7WUFDcEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO2dCQUMxQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pFLENBQUM7WUFFRCxNQUFNLG9CQUFvQixHQUFHLEtBQXVDLENBQUM7WUFDckUsSUFBSSxPQUFPLG9CQUFvQixDQUFDLFdBQVcsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDO29CQUNILE9BQU8sb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzVDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLE9BQU8sU0FBUyxDQUFDO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQStCLENBQUMsQ0FBQztZQUNqRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNGLENBQUM7UUFFTyxtQkFBbUIsQ0FBQyxHQUFpQztZQUMzRCxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQyxZQUFZO2dCQUM3QyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQXNDLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDZCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUM5QyxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7Z0JBQzVCLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYTtnQkFDaEMsWUFBWSxFQUFFLHNCQUFzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVk7Z0JBQ25JLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDZCxRQUFRLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO29CQUNsQixJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTTtvQkFDaEMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLElBQUksR0FBRyxDQUFDLFdBQVc7b0JBQ3pDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtvQkFDdEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO29CQUMxQixlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7b0JBQ3BDLGNBQWMsRUFBRSxHQUFHLENBQUMsY0FBYztvQkFDbEMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjO29CQUNsQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7aUJBQzdCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUIsR0FBVyxFQUNYLE1BQWMsRUFDZCxVQUFrQixFQUNsQixRQUFrQztZQUVsQyxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4RCxNQUFNLFlBQVksR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0QsT0FBTztnQkFDTCxHQUFHO2dCQUNILE1BQU07Z0JBQ04sVUFBVTtnQkFDVixXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVc7Z0JBQ3JDLGFBQWEsRUFBRSxZQUFZLENBQUMsYUFBYTtnQkFDekMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2dCQUM3RCxRQUFRLEVBQUUsT0FBTyxRQUFRLEVBQUUsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDeEUsUUFBUSxFQUFFLE9BQU8sUUFBUSxFQUFFLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXO2dCQUMvRixVQUFVLEVBQUUsT0FBTyxRQUFRLEVBQUUsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDdEYsZUFBZSxFQUFFLE9BQU8sUUFBUSxFQUFFLGVBQWUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDdEcsQ0FBQztRQUNKLENBQUM7UUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsR0FBNEI7WUFDN0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNyQixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxNQUFNLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywrQkFBK0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzNGLENBQUM7UUFDSCxDQUFDO1FBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQWtCO1lBQ25ELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxlQUFlLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywrQkFBK0IsVUFBVSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdkYsQ0FBQztRQUNILENBQUM7UUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FPaEM7WUFDQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLDRCQUE0QixLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZILENBQUM7UUFDSCxDQUFDO1FBRU8sS0FBSyxDQUFDLHdCQUF3QixDQUNwQyxHQUFXLEVBQ1gsV0FBcUU7WUFFckUsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEQsTUFBTSxPQUFPLEdBQW9ELEVBQUUsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FBNEMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzdCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUMzRSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTtvQkFDeEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzlDLE1BQU0sR0FBRyxHQUE0Qjt3QkFDbkMsR0FBRzt3QkFDSCxNQUFNO3dCQUNOLFVBQVUsRUFBRSxHQUFHO3dCQUNmLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztxQkFDdEQsQ0FBQztvQkFDRixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUc7d0JBQ2xCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO3FCQUNoQyxDQUFDO29CQUNGLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNyQyxPQUFPLEdBQUcsQ0FBQztnQkFDYixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQXVGLEVBQUUsQ0FBQztZQUNyRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDbEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUc7d0JBQy9CLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSzt3QkFDakIsT0FBTyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7cUJBQ3JELENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRU8sbUJBQW1CLENBQUMsR0FBVyxFQUFFLFVBQW1DLEVBQUU7WUFDNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsR0FBRyxPQUFPO2dCQUNWLFFBQVEsRUFBRTtvQkFDUixNQUFNO29CQUNOLElBQUksRUFBRSxNQUFNO29CQUNaLEdBQUcsQ0FBRSxPQUFPLENBQUMsVUFBVSxDQUF5QyxJQUFJLEVBQUUsQ0FBQztpQkFDeEU7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVPLHNCQUFzQixDQUFDLEdBQVk7WUFDekMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsR0FLcEIsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1lBRTFELE9BQU8sWUFBWSxDQUFDLElBQUksS0FBSyxRQUFRO21CQUNoQyxZQUFZLENBQUMsSUFBSSxLQUFLLFdBQVc7bUJBQ2pDLFlBQVksQ0FBQyxNQUFNLEtBQUssR0FBRzttQkFDM0IsWUFBWSxDQUFDLFVBQVUsS0FBSyxHQUFHO21CQUMvQixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQzttQkFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7bUJBQzNCLE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7bUJBQ2xDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVPLDJCQUEyQixDQUFDLEdBQVk7WUFDOUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxZQUFZLEdBQUcsR0FLcEIsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1lBRTFELE9BQU8sWUFBWSxDQUFDLElBQUksS0FBSyxRQUFRO21CQUNoQyxZQUFZLENBQUMsTUFBTSxLQUFLLEdBQUc7bUJBQzNCLFlBQVksQ0FBQyxVQUFVLEtBQUssR0FBRzttQkFDL0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQzttQkFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLEdBQVcsRUFBRSxNQUFjLEVBQUUsT0FBZTtZQUMvRSxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25GLElBQUksaUJBQWlCLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxpQkFBaUIsQ0FBQztZQUMzQixDQUFDO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2RSxRQUFRLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUUzRSxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLGdCQUFnQixDQUFDO1lBQ2hDLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLGdCQUFnQixFQUFFLENBQUM7b0JBQ2xGLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBVyxFQUFFLE1BQWMsRUFBRSxPQUFlO1lBQzNFLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hELE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXhELElBQUksTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsNkNBQTZDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzdGLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO3VCQUNsRixXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFckQsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNuRixNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0QyxNQUFNLEdBQUcsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsc0NBQXNDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdEYsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixJQUFJLENBQUM7b0JBQ0gsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDdEUsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9DLENBQUM7Z0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLGtEQUFrRCxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkcsQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN4RixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU8sS0FBSyxDQUFDLDBCQUEwQixDQUN0QyxXQUFrQixFQUNsQixXQUFrQixFQUNsQixNQUFjLEVBQ2QsT0FBZTtZQUVmLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDckIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsc0JBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQztnQkFDSCxNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3RDLE1BQU0sR0FBRyxDQUFDO29CQUNaLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsMEVBQTBFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDMUgsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxXQUFrQixFQUFFLE1BQWM7WUFDOUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztpQkFDOUIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUM3QyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQWlCLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7aUJBQ3pFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRU8sZUFBZSxDQUFDLE1BQWU7WUFDckMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLE1BQTJDLENBQUM7WUFDOUQsSUFBSSxPQUFPLFNBQVMsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUN2QixDQUFDO1lBQ0QsSUFBSSxPQUFPLFNBQVMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQztZQUN4QixDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVPLGNBQWMsQ0FBQyxNQUFjO1lBQ25DLE9BQU8sUUFBUSxNQUFNLFNBQVMsQ0FBQztRQUNqQyxDQUFDO1FBRU8sVUFBVSxDQUFDLE1BQWM7WUFDL0IsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDO1FBQ3BDLENBQUM7UUFFTyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFrQixFQUFFLElBQWM7WUFDakUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSw2Q0FBNkM7UUFDN0MsbUVBQW1FO1FBRW5FOzs7V0FHRztRQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBVyxFQUFFLFdBQXlCO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLElBQUkscURBQXlCLEVBQUUsQ0FBQztZQUNqRCxRQUFRLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFFdkIsS0FBSyxNQUFNLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQ3ZFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ3RFLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUM3RyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsVUFBVSxHQUFHLElBQUksQ0FBQztvQkFDbEIsTUFBTSxjQUFjLEdBQUcscUJBQXFCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3BHLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUM3RyxDQUFDO1lBQ0gsQ0FBQztZQUVELFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDL0IsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVEOzs7V0FHRztRQUNJLGdCQUFnQixDQUNyQixHQUFXLEVBQ1gsTUFBZSxFQUNmLFdBQW9CLEVBQ3BCLFdBQWtCLEVBQ2xCLFlBQTBCO1lBRTFCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTFELE9BQU8sWUFBWTtpQkFDaEIsYUFBYSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztpQkFDcEYsSUFBSSxDQUNILElBQUEsb0JBQVEsRUFBQyxJQUFJLENBQUMsRUFBRTtnQkFFZCxNQUFNLElBQUksR0FBdUIsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLGdCQUFnQixHQUFHLElBQUksRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUM7Z0JBQy9ELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDckIsV0FBVyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztvQkFFN0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO3dCQUN4QyxNQUFNLG9CQUFvQixHQUFpQixFQUFFLENBQUM7d0JBQzlDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFDM0UsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFDdkUsTUFBTSxTQUFTLEdBQWlCLEVBQUUsQ0FBQzt3QkFFbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7d0JBQ3RFLEtBQUssTUFBTSxTQUFTLElBQUksUUFBUSxFQUFFLENBQUM7NEJBQ2pDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dDQUNqQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksdUJBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOzRCQUM1QyxDQUFDO3dCQUNILENBQUM7d0JBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7d0JBQ25FLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7NEJBQzNCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dDQUM5QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSx1QkFBVSxDQUFDO29DQUN2QyxHQUFHLE1BQU07b0NBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0NBQ3BCLFFBQVEsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDO29DQUM1QixlQUFlLEVBQUUsUUFBUTtvQ0FDekIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUM7aUNBQ2pDLENBQUMsQ0FBQyxDQUFDOzRCQUNOLENBQUM7d0JBQ0gsQ0FBQzt3QkFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQzt3QkFFM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUM3RixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsT0FBTyxJQUFBLFNBQUUsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ04sQ0FBQztRQUVPLFlBQVksQ0FBQyxNQUFlO1lBQ2xDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFpQyxDQUFDO1lBQzlDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFtRCxDQUFDO1lBQzdFLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUErQyxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxHQUFHLE9BQU8sWUFBWSxFQUFFLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RSxNQUFNLE9BQU8sR0FBRyxPQUFPLFlBQVksRUFBRSxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDN0YsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQztnQkFDcEUsQ0FBQyxDQUFFLFlBQVksRUFBRSxnQkFBNkI7Z0JBQzlDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDZCxPQUFPO2dCQUNMLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ2pELFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRTthQUN6QixDQUFDO1FBQ0osQ0FBQztRQUVPLGNBQWMsQ0FBQyxLQUFjO1lBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUNELE9BQU8sS0FBZ0MsQ0FBQztRQUMxQyxDQUFDO1FBRU8sY0FBYyxDQUFDLFFBQWlDLEVBQUUsS0FBYTtZQUNyRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFtQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNyRyxDQUFDO1FBRU8sZUFBZSxDQUNyQixNQUFzQyxFQUN0QyxVQUEwQztZQUUxQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVPLFlBQVksQ0FBQyxLQUE4QjtZQUNqRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxZQUFZLElBQUksT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFDO1FBQy9FLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVyxFQUFFLFVBQXNCLEVBQUUsV0FBbUI7WUFDakYsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLCtCQUErQixNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBRTlFLE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxJQUFJLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTdDLE1BQU0sZUFBZSxHQUFHLE1BQU0sb0JBQW9CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNuSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywyQ0FBMkMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3pDLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUNELE1BQU0sb0JBQW9CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRXJFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsMkNBQTJDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFTyxLQUFLLENBQUMsdUJBQXVCLENBQUMsR0FBVyxFQUFFLE1BQWMsRUFBRSxPQUFlLEVBQUUsVUFBc0I7WUFDeEcsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0YsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyw2Q0FBNkMsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEcsQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUM1QixHQUFHO2dCQUNILE1BQU07Z0JBQ04sVUFBVSxFQUFFLE9BQU87Z0JBQ25CLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixVQUFVLEVBQUUsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzdHLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRDs7V0FFRztRQUNJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsVUFBc0I7WUFDL0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLG9DQUFvQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRXBGLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQztnQkFDSCxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsNkNBQTZDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDL0YsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxpRUFBaUU7Z0JBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsNERBQTRELE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDOUcsQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVEOztXQUVHO1FBQ0ksS0FBSyxDQUFDLHVCQUF1QixDQUNsQyxHQUFXLEVBQ1gsY0FBNEIsRUFDNUIsaUJBQStCLEVBQy9CLFdBQW1CO1lBRW5CLEtBQUssTUFBTSxFQUFFLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFDRCxLQUFLLE1BQU0sRUFBRSxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ25DLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FDeEIsR0FBVyxFQUNYLE1BQWMsRUFDZCxjQUF5QztZQUV6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLDRCQUE0QixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXhELGtCQUFrQjtZQUNsQixJQUFJLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQWEsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWxFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3pELE1BQU0sV0FBVyxHQUFHLE1BQU0sZUFBZSxFQUFFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXhFLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztnQkFDcEUsSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDO1lBQ3hDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNwRCxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7b0JBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQztvQkFDL0IsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7d0JBQzlCLEdBQUc7d0JBQ0gsTUFBTTt3QkFDTixVQUFVLEVBQUUsT0FBTzt3QkFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO3dCQUM3QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTt3QkFDZixZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO3FCQUN0RCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsZ0RBQWdEO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUM1QixHQUFHO2dCQUNILE1BQU07Z0JBQ04sVUFBVSxFQUFFLE9BQU87Z0JBQ25CLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7YUFDakQsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDTCxVQUFVO2dCQUNWLFdBQVc7Z0JBQ1gsSUFBSTthQUNMLENBQUM7UUFDSixDQUFDO1FBRUQ7OztXQUdHO1FBQ0ksS0FBSyxDQUFDLGVBQWUsQ0FDMUIsR0FBVyxFQUNYLE1BQWMsRUFDZCxjQUF5QztZQUV6QyxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUV6RCxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ1osT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUM7d0JBQzVCLEdBQUc7d0JBQ0gsTUFBTTt3QkFDTixVQUFVLEVBQUUsT0FBTzt3QkFDbkIsTUFBTSxFQUFFLE1BQU07d0JBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDO3dCQUNoRCxTQUFTLEVBQUUsQ0FBQztxQkFDYixDQUFDLENBQUM7b0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3BELE1BQU0sUUFBUSxHQUFHO3dCQUNmLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUU7NEJBQ2hDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzs0QkFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhOzRCQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7NEJBQy9CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTt5QkFDaEIsQ0FBQztxQkFDSCxDQUFDO29CQUNGLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDO3dCQUM5QixHQUFHO3dCQUNILE1BQU07d0JBQ04sVUFBVSxFQUFFLE9BQU87d0JBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO3dCQUNyRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7cUJBQ2hCLENBQUMsQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDNUIsR0FBRzt3QkFDSCxNQUFNO3dCQUNOLFVBQVUsRUFBRSxPQUFPO3dCQUNuQixNQUFNLEVBQUUsTUFBTTt3QkFDZCxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7d0JBQ2hELFNBQVMsRUFBRSxRQUFRLENBQUMsTUFBTTtxQkFDM0IsQ0FBQyxDQUFDO29CQUNILE9BQU8sUUFBUSxDQUFDO2dCQUNsQixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNyRCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDNUIsR0FBRzt3QkFDSCxNQUFNO3dCQUNOLFVBQVUsRUFBRSxPQUFPO3dCQUNuQixNQUFNLEVBQUUsTUFBTTt3QkFDZCxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUM7d0JBQ2hELFNBQVMsRUFBRSxRQUFRLENBQUMsTUFBTTtxQkFDM0IsQ0FBQyxDQUFDO29CQUNILE9BQU8sUUFBUSxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztZQUVELHNDQUFzQztZQUN0QyxNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUt0RSxNQUFNLFdBQVcsR0FBNEIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2xGLE1BQU0sT0FBTyxHQUFHLEdBQThCLENBQUM7Z0JBQy9DLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RCxPQUFPO29CQUNMLEdBQUc7b0JBQ0gsT0FBTztpQkFDUixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLFlBQVksR0FBRyxNQUFNLGVBQWUsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzFELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUzRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUYsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUM7b0JBQzVCLEdBQUc7b0JBQ0gsTUFBTSxFQUFFLE1BQU07b0JBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDO29CQUNoRCxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU07aUJBQzNCLENBQUMsQ0FBQztnQkFDSCxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBRUQsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDdEYsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7Z0JBQ3BELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9DLENBQUM7Z0JBRUQsTUFBTSxVQUFVLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hELElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFO3dCQUNuQyxHQUFHLE9BQU87d0JBQ1YsR0FBRyxVQUFVLENBQUMsT0FBTzt3QkFDckIsUUFBUSxFQUFFOzRCQUNSLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU07NEJBQzdCLElBQUksRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU07NEJBQ3RELFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVc7NEJBQy9ELFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVE7NEJBQ2pDLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVU7NEJBQ3JDLGVBQWUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWU7eUJBQ2hEO3FCQUNGLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUM1QixHQUFHO2dCQUNILE1BQU0sRUFBRSxNQUFNO2dCQUNkLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQztnQkFDaEQsU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2FBQzNCLENBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7O0lBcnpCVSwyQkFBa0IscUJBc3pCOUIsQ0FBQTtBQUNILENBQUMsRUF4ekJnQixRQUFRLHdCQUFSLFFBQVEsUUF3ekJ4QiJ9