studiokit-scaffolding-js 7.0.14-alpha.1 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/lib/components/ActionList.d.ts +2 -2
  2. package/lib/components/ActionList.js +166 -87
  3. package/lib/components/AlertDialog.d.ts +3 -3
  4. package/lib/components/AlertDialog.js +133 -18
  5. package/lib/components/AlertWithIcon.js +93 -52
  6. package/lib/components/ConnectedModal.d.ts +1 -2
  7. package/lib/components/ConnectedModal.js +41 -35
  8. package/lib/components/Dropdowns/GroupsDropdown.d.ts +4 -4
  9. package/lib/components/Dropdowns/GroupsDropdown.js +69 -82
  10. package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +2 -2
  11. package/lib/components/Dropdowns/ManagedNavDropdown.js +96 -108
  12. package/lib/components/Dropdowns/UserDropdown.js +109 -70
  13. package/lib/components/Dropdowns/index.js +27 -11
  14. package/lib/components/EntityOwnerList.d.ts +3 -3
  15. package/lib/components/EntityOwnerList.js +52 -60
  16. package/lib/components/Error.js +107 -27
  17. package/lib/components/ErrorBoundary.js +133 -94
  18. package/lib/components/ErrorMessage.d.ts +2 -2
  19. package/lib/components/ErrorMessage.js +44 -14
  20. package/lib/components/Forms/DateField.d.ts +2 -2
  21. package/lib/components/Forms/DateField.js +63 -95
  22. package/lib/components/Forms/TimeField.d.ts +2 -2
  23. package/lib/components/Forms/TimeField.js +84 -108
  24. package/lib/components/Forms/index.js +27 -13
  25. package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +2 -2
  26. package/lib/components/Groups/CreateEditCopySaveButtons.js +102 -14
  27. package/lib/components/Groups/ExternalGroups/Attach.d.ts +6 -7
  28. package/lib/components/Groups/ExternalGroups/Attach.js +213 -188
  29. package/lib/components/Groups/ExternalGroups/Table.js +183 -76
  30. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
  31. package/lib/components/Groups/RosterSyncInfo.js +140 -49
  32. package/lib/components/HOC/AccessibleAppComponent.d.ts +2 -2
  33. package/lib/components/HOC/AccessibleAppComponent.js +96 -119
  34. package/lib/components/HOC/ActivityRequiredComponent.d.ts +14 -14
  35. package/lib/components/HOC/ActivityRequiredComponent.js +72 -86
  36. package/lib/components/HOC/AsyncComponent.d.ts +9 -9
  37. package/lib/components/HOC/AsyncComponent.js +53 -129
  38. package/lib/components/HOC/AuthenticatedComponent.d.ts +4 -4
  39. package/lib/components/HOC/AuthenticatedComponent.js +59 -96
  40. package/lib/components/HOC/CollectionComponent.d.ts +12 -12
  41. package/lib/components/HOC/CollectionComponent.js +161 -161
  42. package/lib/components/HOC/CollectionFirstItemComponent.d.ts +13 -13
  43. package/lib/components/HOC/CollectionFirstItemComponent.js +49 -91
  44. package/lib/components/HOC/CollectionItemComponent.d.ts +9 -9
  45. package/lib/components/HOC/CollectionItemComponent.js +159 -158
  46. package/lib/components/HOC/ConnectedModalComponent.d.ts +9 -9
  47. package/lib/components/HOC/ConnectedModalComponent.js +96 -126
  48. package/lib/components/HOC/DataDependentComponent.d.ts +3 -55
  49. package/lib/components/HOC/DataDependentComponent.js +30 -79
  50. package/lib/components/HOC/EntityComponent.d.ts +13 -13
  51. package/lib/components/HOC/EntityComponent.js +63 -101
  52. package/lib/components/HOC/FullscreenModalComponent.d.ts +9 -9
  53. package/lib/components/HOC/FullscreenModalComponent.js +145 -165
  54. package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +2 -2
  55. package/lib/components/HOC/GroupActivityRequiredComponent.js +32 -31
  56. package/lib/components/HOC/GuidComponent.d.ts +1 -1
  57. package/lib/components/HOC/GuidComponent.js +25 -64
  58. package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +28 -29
  59. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +36 -59
  60. package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +10 -10
  61. package/lib/components/HOC/ModelErrorRedirectComponent.js +40 -83
  62. package/lib/components/HOC/SearchPersistorComponent.d.ts +4 -4
  63. package/lib/components/HOC/SearchPersistorComponent.js +243 -216
  64. package/lib/components/HOC/UnauthenticatedComponent.d.ts +12 -12
  65. package/lib/components/HOC/UnauthenticatedComponent.js +37 -82
  66. package/lib/components/HOC/UserComponent.d.ts +1 -1
  67. package/lib/components/HOC/UserComponent.js +12 -11
  68. package/lib/components/Icons/IconAlphaList.js +34 -20
  69. package/lib/components/Icons/IconExternalUser.js +34 -20
  70. package/lib/components/Icons/IconImpersonation.js +34 -20
  71. package/lib/components/Icons/IconStopImpersonating.js +34 -20
  72. package/lib/components/Icons/IconTable.js +35 -21
  73. package/lib/components/Icons/IconTableDeleteCol.js +34 -20
  74. package/lib/components/Icons/IconTableDeleteRow.js +34 -20
  75. package/lib/components/Icons/IconTableInsertCol.js +34 -20
  76. package/lib/components/Icons/IconTableInsertRow.js +34 -20
  77. package/lib/components/Impersonation/Button.d.ts +2 -2
  78. package/lib/components/Impersonation/Button.js +76 -56
  79. package/lib/components/Impersonation/Link.d.ts +2 -2
  80. package/lib/components/Impersonation/Link.js +76 -53
  81. package/lib/components/Impersonation/UserDetail.d.ts +2 -2
  82. package/lib/components/Impersonation/UserDetail.js +64 -15
  83. package/lib/components/Loading.js +27 -21
  84. package/lib/components/LockDownBrowser/Check.js +194 -107
  85. package/lib/components/LockDownBrowser/ExitButton.js +27 -14
  86. package/lib/components/LockDownBrowser/Launch.js +70 -85
  87. package/lib/components/Lti/Confirm.js +152 -33
  88. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +4 -2
  89. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -78
  90. package/lib/components/Lti/Launch.js +105 -49
  91. package/lib/components/Lti/LaunchGroup.js +85 -39
  92. package/lib/components/ManageTable.d.ts +1 -2
  93. package/lib/components/ManageTable.js +309 -104
  94. package/lib/components/ManageTableNoDataComponent.js +42 -22
  95. package/lib/components/NewVersionAlert.d.ts +2 -2
  96. package/lib/components/NewVersionAlert.js +82 -91
  97. package/lib/components/NotFound.js +87 -28
  98. package/lib/components/Notifications.d.ts +4 -4
  99. package/lib/components/Notifications.js +187 -169
  100. package/lib/components/PaginationNextButton.js +33 -21
  101. package/lib/components/PaginationPreviousButton.js +33 -21
  102. package/lib/components/Quill/CustomToolbar.d.ts +2 -2
  103. package/lib/components/Quill/CustomToolbar.js +432 -257
  104. package/lib/components/Quill/Formats/Image.d.ts +10 -25
  105. package/lib/components/Quill/Formats/Image.js +76 -82
  106. package/lib/components/Quill/Formats/List.d.ts +6 -3
  107. package/lib/components/Quill/Formats/List.js +50 -72
  108. package/lib/components/Quill/Formats/Video.d.ts +2 -1
  109. package/lib/components/Quill/Formats/Video.js +29 -43
  110. package/lib/components/Quill/ImageDropModule.d.ts +1 -1
  111. package/lib/components/Quill/ImageDropModule.js +142 -115
  112. package/lib/components/Quill/ImageWarning.d.ts +2 -2
  113. package/lib/components/Quill/ImageWarning.js +45 -32
  114. package/lib/components/Quill/ImageWithAltTextModal.d.ts +0 -1
  115. package/lib/components/Quill/ImageWithAltTextModal.js +425 -141
  116. package/lib/components/Quill/Specs/CustomImageSpec.d.ts +1 -1
  117. package/lib/components/Quill/Specs/CustomImageSpec.js +37 -45
  118. package/lib/components/Quill/Specs/CustomVideoSpec.d.ts +1 -1
  119. package/lib/components/Quill/Specs/CustomVideoSpec.js +27 -36
  120. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.d.ts +2 -1
  121. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +100 -116
  122. package/lib/components/Quill/TableModule/Blots/TableBlot.js +53 -66
  123. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +54 -67
  124. package/lib/components/Quill/TableModule/Blots/TableCellBlot.d.ts +1 -1
  125. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +225 -241
  126. package/lib/components/Quill/TableModule/Blots/TableContainer.js +82 -99
  127. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +76 -87
  128. package/lib/components/Quill/TableModule/constants.js +45 -41
  129. package/lib/components/Quill/TableModule/index.css +25 -25
  130. package/lib/components/Quill/TableModule/index.d.ts +14 -5
  131. package/lib/components/Quill/TableModule/index.js +373 -313
  132. package/lib/components/Quill/TableModule/utils.js +45 -45
  133. package/lib/components/Quill/accessibilityFix.d.ts +0 -1
  134. package/lib/components/Quill/accessibilityFix.js +222 -238
  135. package/lib/components/Quill/index.js +36 -32
  136. package/lib/components/RefreshIndicator/Bordered.js +48 -32
  137. package/lib/components/RefreshIndicator/Inline.js +48 -33
  138. package/lib/components/RefreshIndicator/index.d.ts +2 -2
  139. package/lib/components/RefreshIndicator/index.js +263 -113
  140. package/lib/components/SearchControls.js +216 -31
  141. package/lib/components/SentryRoute.js +10 -23
  142. package/lib/components/Tables/RoleFilter.d.ts +3 -4
  143. package/lib/components/Tables/RoleFilter.js +71 -46
  144. package/lib/components/Tables/TextFilter.d.ts +2 -3
  145. package/lib/components/Tables/TextFilter.js +62 -20
  146. package/lib/components/UserRoles/Add.d.ts +3 -3
  147. package/lib/components/UserRoles/Add.js +199 -161
  148. package/lib/components/UserRoles/Context.js +8 -6
  149. package/lib/components/UserRoles/RoleCell.js +181 -100
  150. package/lib/components/UserRoles/Select.js +168 -54
  151. package/lib/components/UserRoles/Table.js +221 -102
  152. package/lib/components/UserRoles/index.d.ts +6 -6
  153. package/lib/components/UserRoles/index.js +535 -464
  154. package/lib/config/eslint/index.d.ts +2 -0
  155. package/lib/config/eslint/index.js +36 -0
  156. package/lib/config/eslint/lib/order.d.ts +3 -0
  157. package/lib/config/eslint/lib/order.js +30 -0
  158. package/lib/config/eslint/lib/prettier.d.ts +3 -0
  159. package/lib/config/eslint/lib/prettier.js +23 -0
  160. package/lib/config/eslint/lib/typescript.d.ts +2 -0
  161. package/lib/config/eslint/lib/typescript.js +98 -0
  162. package/lib/config/eslint/react.d.ts +2 -0
  163. package/lib/config/eslint/react.js +30 -0
  164. package/lib/constants/baseActivity.js +30 -26
  165. package/lib/constants/baseRole.js +14 -10
  166. package/lib/constants/configuration.d.ts +1 -1
  167. package/lib/constants/configuration.js +43 -39
  168. package/lib/constants/externalProviderType.js +10 -6
  169. package/lib/constants/fetchErrorData.js +15 -11
  170. package/lib/constants/index.js +137 -23
  171. package/lib/constants/lockDownBrowser.js +28 -24
  172. package/lib/constants/mockData.d.ts +4 -6
  173. package/lib/constants/mockData.js +383 -324
  174. package/lib/constants/modelStatus.js +15 -11
  175. package/lib/constants/notificationType.js +12 -8
  176. package/lib/constants/operatingSystem.js +12 -8
  177. package/lib/constants/shard.js +11 -7
  178. package/lib/constants/table.js +21 -21
  179. package/lib/constants/tier.js +12 -8
  180. package/lib/constants/userRole.d.ts +1 -2
  181. package/lib/constants/userRole.js +15 -17
  182. package/lib/css/components/_buttons.css +11 -3
  183. package/lib/css/components/_quill.css +3 -3
  184. package/lib/css/components/_tables.css +6 -5
  185. package/lib/css/utils/_display.css +12 -19
  186. package/lib/css/utils/_general.css +1 -1
  187. package/lib/css/utils/_text.css +2 -1
  188. package/lib/css/variables.css +0 -4
  189. package/lib/endpointMappings.js +197 -193
  190. package/lib/hooks/useCollection.js +83 -65
  191. package/lib/hooks/useCollectionConfiguration.d.ts +0 -1
  192. package/lib/hooks/useCollectionConfiguration.js +179 -82
  193. package/lib/hooks/useCollectionItem.js +155 -58
  194. package/lib/hooks/useEventCalback.d.ts +14 -0
  195. package/lib/hooks/useEventCalback.js +51 -0
  196. package/lib/hooks/useGuid.js +19 -8
  197. package/lib/hooks/usePrevious.d.ts +24 -1
  198. package/lib/hooks/usePrevious.js +82 -12
  199. package/lib/index.js +156 -36
  200. package/lib/redux/actionCreator.d.ts +6 -6
  201. package/lib/redux/actionCreator.js +51 -40
  202. package/lib/redux/actions/AuthAction.js +44 -31
  203. package/lib/redux/actions/ModalAction.d.ts +1 -1
  204. package/lib/redux/actions/ModalAction.js +10 -6
  205. package/lib/redux/actions/ModelAction.d.ts +1 -1
  206. package/lib/redux/actions/ModelAction.js +77 -49
  207. package/lib/redux/actions/NotificationAction.js +10 -6
  208. package/lib/redux/actions/SearchAction.js +9 -5
  209. package/lib/redux/actions/index.js +60 -16
  210. package/lib/redux/configureReducers.d.ts +2 -5
  211. package/lib/redux/configureReducers.js +61 -72
  212. package/lib/redux/configureStore.d.ts +2 -2
  213. package/lib/redux/configureStore.js +83 -115
  214. package/lib/redux/helpers.js +7 -2
  215. package/lib/redux/reducers/authReducer.js +50 -44
  216. package/lib/redux/reducers/index.js +41 -15
  217. package/lib/redux/reducers/modalsReducer.js +49 -52
  218. package/lib/redux/reducers/modelsReducer.d.ts +2 -2
  219. package/lib/redux/reducers/modelsReducer.js +136 -135
  220. package/lib/redux/reducers/notificationsReducer.js +26 -21
  221. package/lib/redux/reducers/searchReducer.js +18 -12
  222. package/lib/redux/sagas/appInsightsSaga.js +24 -62
  223. package/lib/redux/sagas/authSaga.js +287 -414
  224. package/lib/redux/sagas/caliperSaga.js +154 -248
  225. package/lib/redux/sagas/clockOffsetSaga.js +35 -76
  226. package/lib/redux/sagas/configurationSaga.js +13 -46
  227. package/lib/redux/sagas/downtimeApiErrorSaga.d.ts +0 -1
  228. package/lib/redux/sagas/downtimeApiErrorSaga.js +23 -64
  229. package/lib/redux/sagas/errorSaga.d.ts +0 -1
  230. package/lib/redux/sagas/errorSaga.js +29 -63
  231. package/lib/redux/sagas/googleAnalyticsSaga.js +29 -69
  232. package/lib/redux/sagas/identityProviderSaga.js +24 -69
  233. package/lib/redux/sagas/initialDataLoadSaga.js +38 -29
  234. package/lib/redux/sagas/lockDownBrowserErrorSaga.d.ts +0 -1
  235. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +32 -81
  236. package/lib/redux/sagas/modelFetchSaga.js +331 -411
  237. package/lib/redux/sagas/noStoreSaga.d.ts +1 -1
  238. package/lib/redux/sagas/noStoreSaga.js +68 -101
  239. package/lib/redux/sagas/postLoginDataSaga.js +42 -74
  240. package/lib/redux/sagas/postLoginRedirectSaga.js +27 -68
  241. package/lib/redux/sagas/rootSaga.js +85 -137
  242. package/lib/redux/sagas/sentrySaga.js +29 -85
  243. package/lib/redux/sagas/userIdSaga.js +18 -54
  244. package/lib/services/codeProviderService.js +25 -29
  245. package/lib/services/dateService.js +12 -10
  246. package/lib/services/documentService.js +15 -10
  247. package/lib/services/fetchService.js +110 -144
  248. package/lib/services/persistenceService.d.ts +4 -4
  249. package/lib/services/persistenceService.js +45 -43
  250. package/lib/services/ticketProviderService.js +29 -33
  251. package/lib/services/tokenPersistenceService.js +13 -9
  252. package/lib/services/windowService.js +21 -17
  253. package/lib/startup.d.ts +1 -1
  254. package/lib/startup.js +115 -118
  255. package/lib/types/AppConfiguration.js +5 -1
  256. package/lib/types/Artifact.js +11 -7
  257. package/lib/types/BaseReduxState.js +5 -1
  258. package/lib/types/Client.js +5 -1
  259. package/lib/types/Collection.d.ts +3 -3
  260. package/lib/types/Collection.js +5 -1
  261. package/lib/types/Configuration.js +5 -1
  262. package/lib/types/DeepLinkingResponseRequest.js +5 -1
  263. package/lib/types/DeletableModel.js +5 -1
  264. package/lib/types/Event.js +5 -1
  265. package/lib/types/ExternalGroup.js +5 -1
  266. package/lib/types/ExternalProvider.js +5 -1
  267. package/lib/types/ExternalTerm.js +5 -1
  268. package/lib/types/Group.js +5 -1
  269. package/lib/types/IdentityProvider.js +5 -1
  270. package/lib/types/LtiLaunch.js +5 -1
  271. package/lib/types/NameOnlyEntity.js +5 -1
  272. package/lib/types/Notification.d.ts +2 -2
  273. package/lib/types/Notification.js +5 -1
  274. package/lib/types/OptionalRecord.d.ts +1 -1
  275. package/lib/types/OptionalRecord.js +5 -1
  276. package/lib/types/OwnerSchedule.d.ts +3 -1
  277. package/lib/types/OwnerSchedule.js +5 -1
  278. package/lib/types/PropertyOfType.d.ts +3 -3
  279. package/lib/types/PropertyOfType.js +5 -1
  280. package/lib/types/Quill.js +5 -1
  281. package/lib/types/RoleDescription.d.ts +0 -1
  282. package/lib/types/RoleDescription.js +5 -1
  283. package/lib/types/Search.js +5 -1
  284. package/lib/types/SimpleLocation.js +5 -1
  285. package/lib/types/UniTime.js +5 -1
  286. package/lib/types/User.js +5 -1
  287. package/lib/types/UserRole.js +5 -1
  288. package/lib/types/auth/AuthState.js +5 -1
  289. package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
  290. package/lib/types/auth/ClientCredentials.js +5 -1
  291. package/lib/types/auth/CodeProviderService.js +5 -1
  292. package/lib/types/auth/LocalLoginRequestBody.js +5 -1
  293. package/lib/types/auth/TicketProviderService.js +5 -1
  294. package/lib/types/auth/TokenPersistenceService.js +5 -1
  295. package/lib/types/auth/index.js +82 -18
  296. package/lib/types/externals.d.js +2 -0
  297. package/lib/types/index.js +313 -39
  298. package/lib/types/net/EndpointConfig.js +5 -1
  299. package/lib/types/net/EndpointMapping.js +5 -1
  300. package/lib/types/net/EndpointMappings.js +5 -1
  301. package/lib/types/net/ErrorHandler.d.ts +1 -1
  302. package/lib/types/net/ErrorHandler.js +5 -1
  303. package/lib/types/net/FetchConfig.d.ts +1 -1
  304. package/lib/types/net/FetchConfig.js +5 -1
  305. package/lib/types/net/FetchErrorData.js +10 -6
  306. package/lib/types/net/FetchResult.d.ts +2 -2
  307. package/lib/types/net/FetchResult.js +5 -1
  308. package/lib/types/net/HTTPMethod.d.ts +1 -1
  309. package/lib/types/net/HTTPMethod.js +5 -1
  310. package/lib/types/net/HTTPStatusCode.js +16 -12
  311. package/lib/types/net/Metadata.js +5 -1
  312. package/lib/types/net/Model.js +5 -1
  313. package/lib/types/net/ModelCollection.js +5 -1
  314. package/lib/types/net/ModelsState.js +5 -1
  315. package/lib/types/net/OAuthToken.js +5 -1
  316. package/lib/types/net/OAuthTokenOrNull.d.ts +1 -1
  317. package/lib/types/net/OAuthTokenOrNull.js +5 -1
  318. package/lib/types/net/TokenAccessFunction.d.ts +1 -1
  319. package/lib/types/net/TokenAccessFunction.js +5 -1
  320. package/lib/types/net/index.js +181 -27
  321. package/lib/utils/baseActivity.d.ts +2 -2
  322. package/lib/utils/baseActivity.js +93 -91
  323. package/lib/utils/baseRole.js +37 -33
  324. package/lib/utils/collection.js +413 -291
  325. package/lib/utils/cookies.js +22 -37
  326. package/lib/utils/date.js +210 -210
  327. package/lib/utils/dom.js +145 -133
  328. package/lib/utils/domainIdentifier.js +9 -9
  329. package/lib/utils/entityUserRole.js +6 -2
  330. package/lib/utils/error.d.ts +1 -1
  331. package/lib/utils/error.js +18 -16
  332. package/lib/utils/events.js +37 -30
  333. package/lib/utils/externalGroup.js +25 -21
  334. package/lib/utils/externalProviders.js +8 -4
  335. package/lib/utils/externalTerms.js +9 -6
  336. package/lib/utils/fetch.d.ts +1 -1
  337. package/lib/utils/fetch.js +179 -176
  338. package/lib/utils/group.js +17 -9
  339. package/lib/utils/groupDates.d.ts +1 -1
  340. package/lib/utils/groupDates.js +43 -39
  341. package/lib/utils/groupRoles.js +28 -28
  342. package/lib/utils/lockDownBrowser.js +16 -12
  343. package/lib/utils/logger.js +30 -25
  344. package/lib/utils/lti.js +10 -5
  345. package/lib/utils/model.d.ts +2 -2
  346. package/lib/utils/model.js +35 -44
  347. package/lib/utils/number.js +13 -16
  348. package/lib/utils/promise.d.ts +6 -1
  349. package/lib/utils/promise.js +34 -15
  350. package/lib/utils/quill.js +60 -71
  351. package/lib/utils/route.d.ts +2 -2
  352. package/lib/utils/route.js +61 -60
  353. package/lib/utils/search.d.ts +1 -1
  354. package/lib/utils/search.js +78 -85
  355. package/lib/utils/shard.js +38 -41
  356. package/lib/utils/sort.d.ts +3 -3
  357. package/lib/utils/sort.js +62 -58
  358. package/lib/utils/string.js +14 -10
  359. package/lib/utils/table.d.ts +3 -3
  360. package/lib/utils/table.js +36 -33
  361. package/lib/utils/timezone.js +12 -26
  362. package/lib/utils/url.d.ts +2 -1
  363. package/lib/utils/url.js +139 -193
  364. package/lib/utils/user.js +59 -61
  365. package/lib/utils/userAgent.js +11 -11
  366. package/lib/utils/userRole.d.ts +3 -3
  367. package/lib/utils/userRole.js +46 -44
  368. package/package.json +90 -73
  369. package/lib/config/eslint/index.cjs +0 -21
  370. package/lib/config/eslint/lib/order.cjs +0 -22
  371. package/lib/config/eslint/lib/prettier.cjs +0 -18
  372. package/lib/config/eslint/lib/typescript.cjs +0 -86
  373. package/lib/config/eslint/react.cjs +0 -9
  374. package/lib/css/utils/_focus.css +0 -4
@@ -1,475 +1,546 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- extendStatics(d, b);
11
- function __() { this.constructor = d; }
12
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
13
- };
14
- })();
15
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
- if (k2 === undefined) k2 = k;
17
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
18
- }) : (function(o, m, k, k2) {
19
- if (k2 === undefined) k2 = k;
20
- o[k2] = m[k];
21
- }));
22
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
- Object.defineProperty(o, "default", { enumerable: true, value: v });
24
- }) : function(o, v) {
25
- o["default"] = v;
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
26
6
  });
27
- var __importStar = (this && this.__importStar) || function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.mapStateToProps = exports.UserRoles = void 0;
36
- var lodash_1 = require("lodash");
37
- var react_1 = __importStar(require("react"));
38
- var react_bootstrap_1 = require("react-bootstrap");
39
- var react_redux_1 = require("react-redux");
40
- var uuid_1 = require("uuid");
41
- var AlertDialog_1 = require("../../components/AlertDialog");
42
- var Loading_1 = require("../../components/Loading");
43
- var Add_1 = require("../../components/UserRoles/Add");
44
- var Table_1 = require("../../components/UserRoles/Table");
45
- var constants_1 = require("../../constants");
46
- var baseRole_1 = require("../../constants/baseRole");
47
- var modelStatus_1 = require("../../constants/modelStatus");
48
- var actionCreator_1 = require("../../redux/actionCreator");
49
- var actions_1 = require("../../redux/actions");
50
- var noStoreSaga_1 = require("../../redux/sagas/noStoreSaga");
51
- var baseActivity_1 = require("../../utils/baseActivity");
52
- var baseRole_2 = require("../../utils/baseRole");
53
- var domainIdentifier_1 = require("../../utils/domainIdentifier");
54
- var entityUserRole_1 = require("../../utils/entityUserRole");
55
- var fetch_1 = require("../../utils/fetch");
56
- var sort_1 = require("../../utils/sort");
57
- var user_1 = require("../../utils/user");
58
- var userRole_1 = require("../../utils/userRole");
59
- var AlertWithIcon_1 = require("../AlertWithIcon");
60
- var Context_1 = require("./Context");
7
+ exports.mapStateToProps = exports.default = exports.UserRoles = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _lodash = require("lodash");
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactBootstrap = require("react-bootstrap");
12
+ var _reactRedux = require("react-redux");
13
+ var _uuid = require("uuid");
14
+ var _AlertDialog = require("../../components/AlertDialog");
15
+ var _Loading = require("../../components/Loading");
16
+ var _Add = require("../../components/UserRoles/Add");
17
+ var _Table = require("../../components/UserRoles/Table");
18
+ var _constants = require("../../constants");
19
+ var _baseRole = require("../../constants/baseRole");
20
+ var _modelStatus = require("../../constants/modelStatus");
21
+ var _actionCreator = require("../../redux/actionCreator");
22
+ var _actions = require("../../redux/actions");
23
+ var _noStoreSaga = require("../../redux/sagas/noStoreSaga");
24
+ var _baseActivity = require("../../utils/baseActivity");
25
+ var _baseRole2 = require("../../utils/baseRole");
26
+ var _domainIdentifier = require("../../utils/domainIdentifier");
27
+ var _entityUserRole = require("../../utils/entityUserRole");
28
+ var _fetch = require("../../utils/fetch");
29
+ var _sort = require("../../utils/sort");
30
+ var _user = require("../../utils/user");
31
+ var _userRole = require("../../utils/userRole");
32
+ var _AlertWithIcon = require("../AlertWithIcon");
33
+ var _Context = require("./Context");
34
+ var _jsxRuntime = require("react/jsx-runtime");
35
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
61
36
  /**
62
37
  * Component used to manage either UserRoles (global roles) or EntityUserRoles.
63
38
  */
64
- var UserRoles = /** @class */ (function (_super) {
65
- __extends(UserRoles, _super);
66
- function UserRoles() {
67
- var _this = _super !== null && _super.apply(this, arguments) || this;
68
- _this.state = {
69
- sortedUsers: [],
70
- // add
71
- addUsersHookId: uuid_1.v4(),
72
- isAdding: false,
73
- isUpdating: false,
74
- isRemoving: false,
75
- shouldResetAddForm: false,
76
- shouldShowRemoveDialog: false
77
- };
78
- _this.setStateFromProps = function (props) {
79
- var userRoles = props.modelArray, filterUsers = props.filterUsers;
80
- var usersWithRoles = Object.values(userRoles.reduce(function (result, userRole) {
81
- var userId = userRole_1.getUserId(userRole);
82
- var userWithRoles = result[userId];
83
- if (!userWithRoles) {
84
- userWithRoles = userRole_1.convertToUserWithRoles(userRole);
85
- }
86
- else {
87
- userWithRoles.roles.push(userRole);
88
- }
89
- result[userId] = userWithRoles;
90
- return result;
91
- }, {}));
92
- var filteredUsers = filterUsers ? filterUsers(usersWithRoles) : usersWithRoles;
93
- var sortedUsers = filteredUsers.sort(sort_1.sortByNames);
94
- _this.setState({
95
- sortedUsers: sortedUsers
96
- });
97
- };
98
- _this.textForRole = function (role, lowercase) {
99
- if (lowercase === void 0) { lowercase = false; }
100
- if (lowercase && _this.props.lowercaseTextForRole) {
101
- return _this.props.lowercaseTextForRole(role);
102
- }
103
- var roleString = _this.props.textForRole ? _this.props.textForRole(role) : baseRole_2.textForBaseRole(role);
104
- return lowercase ? roleString.toLowerCase() : roleString;
105
- };
106
- _this.singularArticleForRole = function (role) {
107
- return _this.props.singularArticleForRole
108
- ? _this.props.singularArticleForRole(role)
109
- : baseRole_2.singularArticleForBaseRole(role);
110
- };
111
- //#region Add Users
112
- _this.addUserRoles = function (identifiers, role) {
113
- var entity = _this.props.entity;
114
- _this.setState({
115
- identifiersToAdd: identifiers,
116
- roleForAdd: role,
117
- successMessage: undefined,
118
- failMessage: undefined,
119
- existingMessage: undefined,
120
- blockedMessage: undefined,
121
- shouldResetAddForm: false,
122
- isAdding: true
123
- });
124
- var addUsersHookId = _this.state.addUsersHookId;
125
- noStoreSaga_1.noStoreHooks.registerNoStoreActionHook(addUsersHookId, function (data) {
126
- noStoreSaga_1.noStoreHooks.unregisterNoStoreActionHook(addUsersHookId);
127
- _this.didAdd(data);
128
- });
129
- var rootModelName = entityUserRole_1.getRootModelName(_this.props);
130
- actionCreator_1.dispatchModelFetchRequest({
131
- modelName: (rootModelName ? rootModelName + "." : '') + "addUserRoles",
132
- pathParams: entity ? [entity.id] : undefined,
133
- body: {
134
- entityId: entity ? entity.id : undefined,
135
- identifiers: identifiers,
136
- roleName: role
137
- },
138
- noStore: true,
139
- guid: addUsersHookId
140
- });
141
- };
142
- _this.didAdd = function (data) {
143
- var _a = _this.props, entityName = _a.entityName, onAdd = _a.onAdd, model = _a.model, modelName = _a.modelName, pathParams = _a.pathParams;
144
- var _b = _this.state, roleForAdd = _b.roleForAdd, identifiersToAdd = _b.identifiersToAdd;
145
- if (!roleForAdd || !identifiersToAdd || identifiersToAdd.length === 0) {
146
- throw new Error('didAdd was called in the incorrect state');
147
- }
148
- if (!data || fetch_1.isFetchErrorData(data)) {
149
- var failMessage_1 = "The following identifiers were not added" + (entityName ? " to your " + entityName : '') + ":\r\n" + identifiersToAdd.join('\r\n');
150
- _this.setState({
151
- shouldResetAddForm: true,
152
- isAdding: false,
153
- identifiersToAdd: undefined,
154
- roleForAdd: undefined,
155
- failMessage: failMessage_1
156
- });
157
- return;
158
- }
159
- var addedUserRoles = data.addedUserRoles, existingUserRoles = data.existingUserRoles, blockedUserRoles = data.blockedUserRoles, invalidIdentifiers = data.invalidIdentifiers, allowedDomains = data.allowedDomains, invalidDomainIdentifiers = data.invalidDomainIdentifiers;
160
- var roleString = _this.textForRole(roleForAdd, true);
161
- var singularArticleString = _this.singularArticleForRole(roleForAdd);
162
- var addedNames = !!addedUserRoles && addedUserRoles.length > 0
163
- ? addedUserRoles
164
- .map(function (au) {
165
- return "" + user_1.displayName(au) + (au.uid ? " (" + au.uid + ")" : '');
166
- })
167
- .join('\r\n')
168
- : undefined;
169
- var successMessage = addedNames
170
- ? "The following " + roleString + (addedUserRoles.length > 1 ? 's were' : ' was') + " successfully added" + (entityName ? " to your " + entityName : '') + ":\r\n" + addedNames
171
- : undefined;
172
- var existingNames = !!existingUserRoles && existingUserRoles.length > 0
173
- ? existingUserRoles.map(function (eu) { return "" + user_1.displayName(eu) + (eu.uid ? " (" + eu.uid + ")" : ''); }).join('\r\n')
174
- : undefined;
175
- var hasMultipleExisting = existingUserRoles.length > 1;
176
- var existingMessage = existingNames
177
- ? "The following " + (hasMultipleExisting ? 'people were' : 'person was') + " already " + (entityName
178
- ? "in your " + entityName + " as " + (hasMultipleExisting ? '' : singularArticleString + " ")
179
- : hasMultipleExisting
180
- ? ''
181
- : singularArticleString + " ") + roleString + (hasMultipleExisting ? 's' : '') + ":\r\n" + existingNames
182
- : undefined;
183
- var blockedNames = !!blockedUserRoles && blockedUserRoles.length > 0
184
- ? blockedUserRoles.map(function (eu) { return "" + user_1.displayName(eu) + (eu.uid ? " (" + eu.uid + ")" : ''); }).join('\r\n')
185
- : undefined;
186
- var hasMultipleBlocked = !!blockedUserRoles && blockedUserRoles.length > 1;
187
- var blockedMessage = blockedNames
188
- ? "The following " + (hasMultipleBlocked ? 'people' : 'person') + " could not be added " + (entityName ? "to your " + entityName : '') + " as " + (hasMultipleBlocked ? '' : singularArticleString + " ") + roleString + (hasMultipleBlocked ? 's' : '') + " because they already have a role:\r\n" + blockedNames
189
- : undefined;
190
- var failMessage = !!invalidIdentifiers && invalidIdentifiers.length > 0
191
- ? "The following " + domainIdentifier_1.getDomainIdentifierTypePluralString() + " are invalid:\r\n" + invalidIdentifiers.join('\r\n')
192
- : undefined;
193
- if (!!invalidDomainIdentifiers && invalidDomainIdentifiers.length > 0) {
194
- failMessage = (failMessage ? failMessage + "\r\n" : '') + "The following " + domainIdentifier_1.getDomainIdentifierTypePluralString() + " do not match the allowed domains of " + allowedDomains.replace(',', ', ') + ":\r\n" + invalidDomainIdentifiers.join('\r\n');
195
- }
196
- _this.setState({
197
- shouldResetAddForm: true,
198
- isAdding: false,
199
- identifiersToAdd: undefined,
200
- roleForAdd: undefined,
201
- successMessage: successMessage,
202
- existingMessage: existingMessage,
203
- blockedMessage: blockedMessage,
204
- failMessage: failMessage
205
- });
206
- // only reload if we had some successful adds
207
- if (addedNames) {
208
- // update redux with added userRoles
209
- var updatedModel_1 = lodash_1.cloneDeep(model);
210
- addedUserRoles.forEach(function (userRole) { return (updatedModel_1[userRole.id] = lodash_1.cloneDeep(userRole)); });
211
- // create a dummy action and call `prepareFetch` to get the final `modelPath`
212
- var modelPath = fetch_1.prepareFetch({
213
- type: actions_1.MODEL_FETCH_REQUEST_ACTION_TYPE.FETCH_REQUEST,
214
- modelName: modelName,
215
- pathParams: pathParams
216
- }, constants_1.getEndpointMappings()).modelPath;
217
- actionCreator_1.dispatchAction({
218
- type: actions_1.MODEL_FETCH_RESULT_ACTION_TYPE.FETCH_RESULT_RECEIVED,
219
- modelPath: modelPath,
220
- data: updatedModel_1
221
- });
222
- if (onAdd) {
223
- onAdd(addedUserRoles);
224
- }
225
- }
226
- };
227
- //#endregion Add Users
228
- //#region Update
229
- _this.updateUserRole = function (userRoleToUpdate, newRole) {
230
- _this.setState({
231
- isUpdating: true,
232
- userRoleToUpdate: userRoleToUpdate,
233
- roleForUpdate: newRole,
234
- successMessage: undefined,
235
- failMessage: undefined
236
- });
237
- _this.props.update({
238
- id: userRoleToUpdate.id,
239
- body: {},
240
- queryParams: {
241
- roleName: newRole
242
- }
243
- });
244
- };
245
- _this.didUpdate = function (isSuccess) {
246
- var _a = _this.props, entityName = _a.entityName, onUpdate = _a.onUpdate;
247
- var _b = _this.state, userRoleToUpdate = _b.userRoleToUpdate, roleForUpdate = _b.roleForUpdate;
248
- if (userRoleToUpdate === undefined) {
249
- throw new Error('`didUpdate` was called without setting `userRoleToUpdate` in state');
250
- }
251
- if (roleForUpdate === undefined) {
252
- throw new Error('`didUpdate` was called without setting `roleForUpdate` in state');
253
- }
254
- var name = user_1.displayName(userRoleToUpdate);
255
- var roleString = _this.textForRole(roleForUpdate, true);
256
- var singularArticleString = _this.singularArticleForRole(roleForUpdate);
257
- if (!isSuccess) {
258
- var failMessage = "Oops! There was an error updating " + name + " to " + singularArticleString + " " + roleString + (entityName ? " in your " + entityName : '') + ". Please try again.";
259
- _this.setState({
260
- isUpdating: false,
261
- userRoleToUpdate: undefined,
262
- roleForUpdate: undefined,
263
- failMessage: failMessage
264
- });
265
- return;
266
- }
267
- var successMessage = name + " was successfully updated to " + singularArticleString + " " + roleString + (entityName ? " in your " + entityName : '') + ".";
268
- if (onUpdate) {
269
- onUpdate(userRoleToUpdate, roleForUpdate);
270
- }
271
- _this.setState({
272
- isUpdating: false,
273
- userRoleToUpdate: undefined,
274
- roleForUpdate: undefined,
275
- successMessage: successMessage
276
- });
277
- };
278
- //#endregion Update
279
- //#region Remove User
280
- _this.alertRemoveUserRole = function (userRoleToRemove) {
281
- _this.setState({
282
- userRoleToRemove: userRoleToRemove,
283
- shouldShowRemoveDialog: true
284
- });
285
- };
286
- _this.removeUserRoleTitle = function (roleForRemove) {
287
- return "Remove " + _this.textForRole(roleForRemove);
288
- };
289
- _this.renderRemoveUserRoleDescription = function (userRoleToRemove, warning) {
290
- var _a = _this.props, entity = _a.entity, externalProviders = _a.externalProviders;
291
- var group = entity && entity.externalGroups ? entity : undefined;
292
- var roleString = _this.textForRole(userRoleToRemove.role, true);
293
- var singularArticleString = _this.singularArticleForRole(userRoleToRemove.role);
294
- var defaultWarning = warning !== null && warning !== void 0 ? warning : (react_1.default.createElement("p", { className: "ma0" },
295
- "Are you sure you want to ",
296
- react_1.default.createElement("strong", null,
297
- "remove ",
298
- user_1.displayName(userRoleToRemove)),
299
- " as",
300
- ' ',
301
- singularArticleString,
302
- " ",
303
- roleString,
304
- "?"));
305
- var externalGroupsToRemove = group === null || group === void 0 ? void 0 : group.externalGroups.filter(function (eg) { return eg.userId === userRoleToRemove.id; });
306
- if (!externalGroupsToRemove ||
307
- externalGroupsToRemove.length === 0 ||
308
- userRoleToRemove.role !== baseRole_1.BASE_ROLE.GROUP_OWNER) {
309
- return defaultWarning;
310
- }
311
- var externalGroupsToRemoveWithRosterSync = externalGroupsToRemove.filter(function (eg) { var _a; return (_a = externalProviders === null || externalProviders === void 0 ? void 0 : externalProviders[eg.externalProviderId]) === null || _a === void 0 ? void 0 : _a.rosterSyncEnabled; });
312
- return (react_1.default.createElement("div", null,
313
- react_1.default.createElement("p", null,
314
- "The following course sections will be ",
315
- react_1.default.createElement("strong", null, "disconnected"),
316
- ".",
317
- ' ',
318
- externalGroupsToRemoveWithRosterSync.length > 0 && (react_1.default.createElement("span", null,
319
- "Any automatically added students will be ",
320
- react_1.default.createElement("strong", null, "removed"),
321
- "."))),
322
- react_1.default.createElement("ul", null, externalGroupsToRemove.map(function (eg) { return (react_1.default.createElement("li", { key: eg.id }, eg.description)); })),
323
- defaultWarning));
324
- };
325
- _this.removeUserRole = function (shouldRemove) {
326
- var userRoleToRemove = _this.state.userRoleToRemove;
327
- if (userRoleToRemove === undefined) {
328
- throw new Error('`removeUser` was called without setting `userRoleToRemove` in state');
329
- }
330
- _this.setState({
331
- isRemoving: shouldRemove,
332
- shouldShowRemoveDialog: false,
333
- successMessage: undefined,
334
- failMessage: undefined,
335
- // clear if cancelled
336
- userRoleToRemove: shouldRemove ? userRoleToRemove : undefined
337
- });
338
- if (!shouldRemove) {
339
- return;
340
- }
341
- _this.props.delete({
342
- id: userRoleToRemove.id
343
- });
344
- };
345
- _this.didRemove = function (isSuccess) {
346
- var _a = _this.props, entityName = _a.entityName, onRemove = _a.onRemove;
347
- var userRoleToRemove = _this.state.userRoleToRemove;
348
- if (userRoleToRemove === undefined) {
349
- throw new Error('`didRemove` was called without setting `userRoleToRemove` in state');
350
- }
351
- var name = user_1.displayName(userRoleToRemove);
352
- if (!isSuccess) {
353
- var failMessage = "Oops! There was an error removing " + name + (entityName ? " from your " + entityName : '') + ". Please try again.";
354
- _this.setState({
355
- isRemoving: false,
356
- userRoleToRemove: undefined,
357
- failMessage: failMessage
358
- });
359
- return;
360
- }
361
- var successMessage = name + " was successfully removed" + (entityName ? " from your " + entityName : '') + ".";
362
- if (onRemove) {
363
- onRemove(userRoleToRemove);
364
- }
365
- _this.setState({
366
- isRemoving: false,
367
- userRoleToRemove: undefined,
368
- successMessage: successMessage
369
- });
370
- };
371
- return _this;
372
- }
373
- UserRoles.prototype.componentDidMount = function () {
374
- this.setStateFromProps(this.props);
375
- var addUsersHookId = this.state.addUsersHookId;
376
- noStoreSaga_1.noStoreHooks.unregisterNoStoreActionHook(addUsersHookId);
377
- };
378
- UserRoles.prototype.componentDidUpdate = function (prevProps) {
379
- var prevModelArray = prevProps.modelArray, prevModelStatus = prevProps.modelStatus;
380
- var _a = this.props, modelArray = _a.modelArray, modelStatus = _a.modelStatus, entityName = _a.entityName;
381
- if (!lodash_1.isEqual(prevModelArray, modelArray)) {
382
- this.setStateFromProps(this.props);
39
+ class UserRoles extends _react.Component {
40
+ constructor() {
41
+ var _this;
42
+ super(...arguments);
43
+ _this = this;
44
+ (0, _defineProperty2.default)(this, "state", {
45
+ sortedUsers: [],
46
+ // add
47
+ addUsersHookId: (0, _uuid.v4)(),
48
+ isAdding: false,
49
+ isUpdating: false,
50
+ isRemoving: false,
51
+ shouldResetAddForm: false,
52
+ shouldShowRemoveDialog: false
53
+ });
54
+ (0, _defineProperty2.default)(this, "setStateFromProps", props => {
55
+ const {
56
+ modelArray: userRoles,
57
+ filterUsers
58
+ } = props;
59
+ const usersWithRoles = Object.values(userRoles.reduce((result, userRole) => {
60
+ const userId = (0, _userRole.getUserId)(userRole);
61
+ let userWithRoles = result[userId];
62
+ if (!userWithRoles) {
63
+ userWithRoles = (0, _userRole.convertToUserWithRoles)(userRole);
64
+ } else {
65
+ userWithRoles.roles.push(userRole);
383
66
  }
384
- // loading error
385
- if ((prevModelStatus === modelStatus_1.MODEL_STATUS.UNINITIALIZED || prevModelStatus === modelStatus_1.MODEL_STATUS.LOADING) &&
386
- modelStatus === modelStatus_1.MODEL_STATUS.ERROR) {
387
- this.setState({
388
- failMessage: "Oops! There was an error loading" + (entityName ? " the people for your " + entityName : '') + ".\r\nPlease try again."
389
- });
67
+ result[userId] = userWithRoles;
68
+ return result;
69
+ }, {}));
70
+ const filteredUsers = filterUsers ? filterUsers(usersWithRoles) : usersWithRoles;
71
+ const sortedUsers = filteredUsers.sort(_sort.sortByNames);
72
+ this.setState({
73
+ sortedUsers
74
+ });
75
+ });
76
+ (0, _defineProperty2.default)(this, "textForRole", function (role) {
77
+ let lowercase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
78
+ if (lowercase && _this.props.lowercaseTextForRole) {
79
+ return _this.props.lowercaseTextForRole(role);
80
+ }
81
+ const roleString = _this.props.textForRole ? _this.props.textForRole(role) : (0, _baseRole2.textForBaseRole)(role);
82
+ return lowercase ? roleString.toLowerCase() : roleString;
83
+ });
84
+ (0, _defineProperty2.default)(this, "singularArticleForRole", role => {
85
+ return this.props.singularArticleForRole ? this.props.singularArticleForRole(role) : (0, _baseRole2.singularArticleForBaseRole)(role);
86
+ });
87
+ //#region Add Users
88
+ (0, _defineProperty2.default)(this, "addUserRoles", (identifiers, role) => {
89
+ const {
90
+ entity
91
+ } = this.props;
92
+ this.setState({
93
+ identifiersToAdd: identifiers,
94
+ roleForAdd: role,
95
+ successMessage: undefined,
96
+ failMessage: undefined,
97
+ existingMessage: undefined,
98
+ blockedMessage: undefined,
99
+ shouldResetAddForm: false,
100
+ isAdding: true
101
+ });
102
+ const {
103
+ addUsersHookId
104
+ } = this.state;
105
+ _noStoreSaga.noStoreHooks.registerNoStoreActionHook(addUsersHookId, data => {
106
+ _noStoreSaga.noStoreHooks.unregisterNoStoreActionHook(addUsersHookId);
107
+ this.didAdd(data);
108
+ });
109
+ const rootModelName = (0, _entityUserRole.getRootModelName)(this.props);
110
+ (0, _actionCreator.dispatchModelFetchRequest)({
111
+ modelName: `${rootModelName ? `${rootModelName}.` : ''}addUserRoles`,
112
+ pathParams: entity ? [entity.id] : undefined,
113
+ body: {
114
+ entityId: entity ? entity.id : undefined,
115
+ identifiers: identifiers,
116
+ roleName: role
117
+ },
118
+ noStore: true,
119
+ guid: addUsersHookId
120
+ });
121
+ });
122
+ (0, _defineProperty2.default)(this, "didAdd", data => {
123
+ const {
124
+ entityName,
125
+ onAdd,
126
+ model,
127
+ modelName,
128
+ pathParams
129
+ } = this.props;
130
+ const {
131
+ roleForAdd,
132
+ identifiersToAdd
133
+ } = this.state;
134
+ if (!roleForAdd || !identifiersToAdd || identifiersToAdd.length === 0) {
135
+ throw new Error('didAdd was called in the incorrect state');
136
+ }
137
+ if (!data || (0, _fetch.isFetchErrorData)(data)) {
138
+ const failMessage = `The following identifiers were not added${entityName ? ` to your ${entityName}` : ''}:\r\n${identifiersToAdd.join('\r\n')}`;
139
+ this.setState({
140
+ shouldResetAddForm: true,
141
+ isAdding: false,
142
+ identifiersToAdd: undefined,
143
+ roleForAdd: undefined,
144
+ failMessage
145
+ });
146
+ return;
147
+ }
148
+ const {
149
+ addedUserRoles,
150
+ existingUserRoles,
151
+ blockedUserRoles,
152
+ invalidIdentifiers,
153
+ allowedDomains,
154
+ invalidDomainIdentifiers
155
+ } = data;
156
+ const roleString = this.textForRole(roleForAdd, true);
157
+ const singularArticleString = this.singularArticleForRole(roleForAdd);
158
+ const addedNames = addedUserRoles.length > 0 ? addedUserRoles.map(au => {
159
+ return `${(0, _user.displayName)(au)}${au.uid ? ` (${au.uid})` : ''}`;
160
+ }).join('\r\n') : undefined;
161
+ const successMessage = addedNames ? `The following ${roleString}${addedUserRoles.length > 1 ? 's were' : ' was'} successfully added${entityName ? ` to your ${entityName}` : ''}:\r\n${addedNames}` : undefined;
162
+ const existingNames = existingUserRoles.length > 0 ? existingUserRoles.map(eu => `${(0, _user.displayName)(eu)}${eu.uid ? ` (${eu.uid})` : ''}`).join('\r\n') : undefined;
163
+ const hasMultipleExisting = existingUserRoles.length > 1;
164
+ const existingMessage = existingNames ? `The following ${hasMultipleExisting ? 'people were' : 'person was'} already ${entityName ? `in your ${entityName} as ${hasMultipleExisting ? '' : `${singularArticleString} `}` : hasMultipleExisting ? '' : `${singularArticleString} `}${roleString}${hasMultipleExisting ? 's' : ''}:\r\n${existingNames}` : undefined;
165
+ const blockedNames = !!blockedUserRoles && blockedUserRoles.length > 0 ? blockedUserRoles.map(eu => `${(0, _user.displayName)(eu)}${eu.uid ? ` (${eu.uid})` : ''}`).join('\r\n') : undefined;
166
+ const hasMultipleBlocked = !!blockedUserRoles && blockedUserRoles.length > 1;
167
+ const blockedMessage = blockedNames ? `The following ${hasMultipleBlocked ? 'people' : 'person'} could not be added ${entityName ? `to your ${entityName}` : ''} as ${hasMultipleBlocked ? '' : `${singularArticleString} `}${roleString}${hasMultipleBlocked ? 's' : ''} because they already have a role:\r\n${blockedNames}` : undefined;
168
+ let failMessage = invalidIdentifiers.length > 0 ? `The following ${(0, _domainIdentifier.getDomainIdentifierTypePluralString)()} are invalid:\r\n${invalidIdentifiers.join('\r\n')}` : undefined;
169
+ if (invalidDomainIdentifiers.length > 0) {
170
+ failMessage = `${failMessage ? `${failMessage}\r\n` : ''}The following ${(0, _domainIdentifier.getDomainIdentifierTypePluralString)()} do not match the allowed domains of ${allowedDomains.replace(',', ', ')}:\r\n${invalidDomainIdentifiers.join('\r\n')}`;
171
+ }
172
+ this.setState({
173
+ shouldResetAddForm: true,
174
+ isAdding: false,
175
+ identifiersToAdd: undefined,
176
+ roleForAdd: undefined,
177
+ successMessage,
178
+ existingMessage,
179
+ blockedMessage,
180
+ failMessage
181
+ });
182
+
183
+ // only reload if we had some successful adds
184
+ if (addedNames) {
185
+ // update redux with added userRoles
186
+ const updatedModel = (0, _lodash.cloneDeep)(model);
187
+ addedUserRoles.forEach(userRole => updatedModel[userRole.id] = (0, _lodash.cloneDeep)(userRole));
188
+
189
+ // create a dummy action and call `prepareFetch` to get the final `modelPath`
190
+ const {
191
+ modelPath
192
+ } = (0, _fetch.prepareFetch)({
193
+ type: _actions.MODEL_FETCH_REQUEST_ACTION_TYPE.FETCH_REQUEST,
194
+ modelName,
195
+ pathParams
196
+ }, (0, _constants.getEndpointMappings)());
197
+ (0, _actionCreator.dispatchAction)({
198
+ type: _actions.MODEL_FETCH_RESULT_ACTION_TYPE.FETCH_RESULT_RECEIVED,
199
+ modelPath,
200
+ data: updatedModel
201
+ });
202
+ if (onAdd) {
203
+ onAdd(addedUserRoles);
390
204
  }
391
- // updating
392
- if (prevModelStatus === modelStatus_1.MODEL_STATUS.UPDATING && modelStatus !== modelStatus_1.MODEL_STATUS.UPDATING) {
393
- this.didUpdate(modelStatus === modelStatus_1.MODEL_STATUS.READY);
205
+ }
206
+ });
207
+ //#endregion Add Users
208
+ //#region Update
209
+ (0, _defineProperty2.default)(this, "updateUserRole", (userRoleToUpdate, newRole) => {
210
+ this.setState({
211
+ isUpdating: true,
212
+ userRoleToUpdate,
213
+ roleForUpdate: newRole,
214
+ successMessage: undefined,
215
+ failMessage: undefined
216
+ });
217
+ this.props.update({
218
+ id: userRoleToUpdate.id,
219
+ body: {},
220
+ queryParams: {
221
+ roleName: newRole
394
222
  }
395
- // removing
396
- if (prevModelStatus === modelStatus_1.MODEL_STATUS.DELETING && modelStatus !== modelStatus_1.MODEL_STATUS.DELETING) {
397
- this.didRemove(modelStatus === modelStatus_1.MODEL_STATUS.READY);
398
- }
399
- };
400
- //#endregion Remove User
401
- UserRoles.prototype.render = function () {
402
- var _this = this;
403
- var _a = this.props, modelStatus = _a.modelStatus, canModify = _a.canModify, readOnly = _a.readOnly, canDeleteSelf = _a.canDeleteSelf, allowMultipleRoles = _a.allowMultipleRoles, isAddDisabled = _a.isAddDisabled, isUpdateDisabled = _a.isUpdateDisabled, isDeleteDisabled = _a.isDeleteDisabled, defaultRole = _a.defaultRole, requiredRole = _a.requiredRole, roleDescriptions = _a.roleDescriptions, addRoleExcludeList = _a.addRoleExcludeList, entityName = _a.entityName, renderTableDescription = _a.renderTableDescription, renderAddDescription = _a.renderAddDescription;
404
- var _b = this.state, sortedUsers = _b.sortedUsers, isAdding = _b.isAdding, isUpdating = _b.isUpdating, isRemoving = _b.isRemoving, shouldResetAddForm = _b.shouldResetAddForm, shouldShowRemoveDialog = _b.shouldShowRemoveDialog, userRoleToUpdate = _b.userRoleToUpdate, userRoleToRemove = _b.userRoleToRemove, successMessage = _b.successMessage, existingMessage = _b.existingMessage, blockedMessage = _b.blockedMessage, failMessage = _b.failMessage;
405
- var addableRoleDescriptions = addRoleExcludeList
406
- ? lodash_1.pickBy(roleDescriptions, function (_, key) { return !addRoleExcludeList.includes(key); })
407
- : roleDescriptions;
408
- var roles = Object.keys(roleDescriptions);
409
- var shouldRenderAsMutable = !readOnly && canModify;
410
- return (react_1.default.createElement(react_1.default.Fragment, null,
411
- !!successMessage && (react_1.default.createElement(AlertWithIcon_1.AlertWithIcon, { id: "successMessageAlert", variant: "success", dismissible: true, onClose: function () {
412
- return _this.setState({
413
- successMessage: undefined
414
- });
415
- } },
416
- react_1.default.createElement("p", { className: "pre-wrap" }, successMessage))),
417
- !!existingMessage && (react_1.default.createElement(AlertWithIcon_1.AlertWithIcon, { id: "existingMessageAlert", variant: "info", dismissible: true, onClose: function () {
418
- return _this.setState({
419
- existingMessage: undefined
420
- });
421
- } },
422
- react_1.default.createElement("p", { className: "pre-wrap" }, existingMessage))),
423
- !!blockedMessage && (react_1.default.createElement(AlertWithIcon_1.AlertWithIcon, { id: "blockedMessageAlert", variant: "warning", dismissible: true, onClose: function () {
424
- return _this.setState({
425
- blockedMessage: undefined
426
- });
427
- } },
428
- react_1.default.createElement("p", { className: "pre-wrap" }, blockedMessage))),
429
- !!failMessage && (react_1.default.createElement(AlertWithIcon_1.AlertWithIcon, { id: "failMessageAlert", variant: "warning", dismissible: true, onClose: function () {
430
- return _this.setState({
431
- failMessage: undefined
432
- });
433
- } },
434
- react_1.default.createElement("p", { className: "pre-wrap" }, failMessage))),
435
- shouldRenderAsMutable && (react_1.default.createElement(Add_1.UserRolesAdd, { id: "entityUserRolesAdd", disabled: isAddDisabled, entityName: entityName, defaultRole: defaultRole, roleDescriptions: addableRoleDescriptions, renderAddDescription: renderAddDescription, textForRole: this.textForRole, isAddingUsersToRole: isAdding, shouldReset: shouldResetAddForm, addUserRoles: this.addUserRoles })),
436
- !!renderTableDescription && renderTableDescription(shouldRenderAsMutable),
437
- react_1.default.createElement(react_bootstrap_1.Row, { className: "mt3" },
438
- react_1.default.createElement(react_bootstrap_1.Col, { xs: 12 }, modelStatus === modelStatus_1.MODEL_STATUS.LOADING ? (react_1.default.createElement(Loading_1.Loading, null)) : sortedUsers.length > 0 ? (react_1.default.createElement(Context_1.UserRolesContext.Provider, { value: {
439
- isUpdateDisabled: isUpdateDisabled || readOnly,
440
- isDeleteDisabled: isDeleteDisabled || readOnly,
441
- canModify: shouldRenderAsMutable,
442
- canDeleteSelf: canDeleteSelf,
443
- allowMultipleRoles: allowMultipleRoles,
444
- roles: roles,
445
- requiredRole: requiredRole,
446
- textForRole: this.textForRole,
447
- userRoleToUpdate: userRoleToUpdate,
448
- isUpdating: isUpdating,
449
- updateUserRole: this.updateUserRole,
450
- userRoleToRemove: userRoleToRemove,
451
- isRemoving: isRemoving,
452
- removeUserRole: this.alertRemoveUserRole
453
- } },
454
- react_1.default.createElement(Table_1.UserRolesTable, { id: "entityUserRolesTable", users: sortedUsers }))) : null)),
455
- !!userRoleToRemove && (react_1.default.createElement(AlertDialog_1.AlertDialog, { id: "removeUserAlert", isOpen: shouldShowRemoveDialog, title: this.removeUserRoleTitle(userRoleToRemove.role), description: this.renderRemoveUserRoleDescription(userRoleToRemove), onDestroy: function () { return _this.removeUserRole(true); }, destroyText: "Yes, remove the user", onCancel: function () { return _this.removeUserRole(false); }, cancelText: "No, I changed my mind" }))));
456
- };
457
- return UserRoles;
458
- }(react_1.Component));
223
+ });
224
+ });
225
+ (0, _defineProperty2.default)(this, "didUpdate", isSuccess => {
226
+ const {
227
+ entityName,
228
+ onUpdate
229
+ } = this.props;
230
+ const {
231
+ userRoleToUpdate,
232
+ roleForUpdate
233
+ } = this.state;
234
+ if (userRoleToUpdate === undefined) {
235
+ throw new Error('`didUpdate` was called without setting `userRoleToUpdate` in state');
236
+ }
237
+ if (roleForUpdate === undefined) {
238
+ throw new Error('`didUpdate` was called without setting `roleForUpdate` in state');
239
+ }
240
+ const name = (0, _user.displayName)(userRoleToUpdate);
241
+ const roleString = this.textForRole(roleForUpdate, true);
242
+ const singularArticleString = this.singularArticleForRole(roleForUpdate);
243
+ if (!isSuccess) {
244
+ const failMessage = `Oops! There was an error updating ${name} to ${singularArticleString} ${roleString}${entityName ? ` in your ${entityName}` : ''}. Please try again.`;
245
+ this.setState({
246
+ isUpdating: false,
247
+ userRoleToUpdate: undefined,
248
+ roleForUpdate: undefined,
249
+ failMessage
250
+ });
251
+ return;
252
+ }
253
+ const successMessage = `${name} was successfully updated to ${singularArticleString} ${roleString}${entityName ? ` in your ${entityName}` : ''}.`;
254
+ if (onUpdate) {
255
+ onUpdate(userRoleToUpdate, roleForUpdate);
256
+ }
257
+ this.setState({
258
+ isUpdating: false,
259
+ userRoleToUpdate: undefined,
260
+ roleForUpdate: undefined,
261
+ successMessage
262
+ });
263
+ });
264
+ //#endregion Update
265
+ //#region Remove User
266
+ (0, _defineProperty2.default)(this, "alertRemoveUserRole", userRoleToRemove => {
267
+ this.setState({
268
+ userRoleToRemove,
269
+ shouldShowRemoveDialog: true
270
+ });
271
+ });
272
+ (0, _defineProperty2.default)(this, "removeUserRoleTitle", roleForRemove => {
273
+ return `Remove ${this.textForRole(roleForRemove)}`;
274
+ });
275
+ (0, _defineProperty2.default)(this, "renderRemoveUserRoleDescription", (userRoleToRemove, warning) => {
276
+ const {
277
+ entity,
278
+ externalProviders
279
+ } = this.props;
280
+ const group = entity && 'externalGroups' in entity ? entity : undefined;
281
+ const roleString = this.textForRole(userRoleToRemove.role, true);
282
+ const singularArticleString = this.singularArticleForRole(userRoleToRemove.role);
283
+ const defaultWarning = warning ?? /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
284
+ className: "ma0",
285
+ children: ["Are you sure you want to ", /*#__PURE__*/(0, _jsxRuntime.jsxs)("strong", {
286
+ children: ["remove ", (0, _user.displayName)(userRoleToRemove)]
287
+ }), " as", ' ', singularArticleString, " ", roleString, "?"]
288
+ });
289
+ const externalGroupsToRemove = group?.externalGroups.filter(eg => eg.userId === userRoleToRemove.id);
290
+ if (!externalGroupsToRemove || externalGroupsToRemove.length === 0 || userRoleToRemove.role !== _baseRole.BASE_ROLE.GROUP_OWNER) {
291
+ return defaultWarning;
292
+ }
293
+ const externalGroupsToRemoveWithRosterSync = externalGroupsToRemove.filter(eg => externalProviders?.[eg.externalProviderId]?.rosterSyncEnabled);
294
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
295
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
296
+ children: ["The following course sections will be ", /*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
297
+ children: "disconnected"
298
+ }), ".", ' ', externalGroupsToRemoveWithRosterSync.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
299
+ children: ["Any automatically added students will be ", /*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
300
+ children: "removed"
301
+ }), "."]
302
+ })]
303
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
304
+ children: externalGroupsToRemove.map(eg => /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
305
+ children: eg.description
306
+ }, eg.id))
307
+ }), defaultWarning]
308
+ });
309
+ });
310
+ (0, _defineProperty2.default)(this, "removeUserRole", shouldRemove => {
311
+ const {
312
+ userRoleToRemove
313
+ } = this.state;
314
+ if (userRoleToRemove === undefined) {
315
+ throw new Error('`removeUser` was called without setting `userRoleToRemove` in state');
316
+ }
317
+ this.setState({
318
+ isRemoving: shouldRemove,
319
+ shouldShowRemoveDialog: false,
320
+ successMessage: undefined,
321
+ failMessage: undefined,
322
+ // clear if cancelled
323
+ userRoleToRemove: shouldRemove ? userRoleToRemove : undefined
324
+ });
325
+ if (!shouldRemove) {
326
+ return;
327
+ }
328
+ this.props.delete({
329
+ id: userRoleToRemove.id
330
+ });
331
+ });
332
+ (0, _defineProperty2.default)(this, "didRemove", isSuccess => {
333
+ const {
334
+ entityName,
335
+ onRemove
336
+ } = this.props;
337
+ const {
338
+ userRoleToRemove
339
+ } = this.state;
340
+ if (userRoleToRemove === undefined) {
341
+ throw new Error('`didRemove` was called without setting `userRoleToRemove` in state');
342
+ }
343
+ const name = (0, _user.displayName)(userRoleToRemove);
344
+ if (!isSuccess) {
345
+ const failMessage = `Oops! There was an error removing ${name}${entityName ? ` from your ${entityName}` : ''}. Please try again.`;
346
+ this.setState({
347
+ isRemoving: false,
348
+ userRoleToRemove: undefined,
349
+ failMessage
350
+ });
351
+ return;
352
+ }
353
+ const successMessage = `${name} was successfully removed${entityName ? ` from your ${entityName}` : ''}.`;
354
+ if (onRemove) {
355
+ onRemove(userRoleToRemove);
356
+ }
357
+ this.setState({
358
+ isRemoving: false,
359
+ userRoleToRemove: undefined,
360
+ successMessage
361
+ });
362
+ });
363
+ }
364
+ componentDidMount() {
365
+ this.setStateFromProps(this.props);
366
+ const {
367
+ addUsersHookId
368
+ } = this.state;
369
+ _noStoreSaga.noStoreHooks.unregisterNoStoreActionHook(addUsersHookId);
370
+ }
371
+ componentDidUpdate(prevProps) {
372
+ const {
373
+ modelArray: prevModelArray,
374
+ modelStatus: prevModelStatus
375
+ } = prevProps;
376
+ const {
377
+ modelArray,
378
+ modelStatus,
379
+ entityName
380
+ } = this.props;
381
+ if (!(0, _lodash.isEqual)(prevModelArray, modelArray)) {
382
+ this.setStateFromProps(this.props);
383
+ }
384
+
385
+ // loading error
386
+ if ((prevModelStatus === _modelStatus.MODEL_STATUS.UNINITIALIZED || prevModelStatus === _modelStatus.MODEL_STATUS.LOADING) && modelStatus === _modelStatus.MODEL_STATUS.ERROR) {
387
+ this.setState({
388
+ failMessage: `Oops! There was an error loading${entityName ? ` the people for your ${entityName}` : ''}.\r\nPlease try again.`
389
+ });
390
+ }
391
+
392
+ // updating
393
+ if (prevModelStatus === _modelStatus.MODEL_STATUS.UPDATING && modelStatus !== _modelStatus.MODEL_STATUS.UPDATING) {
394
+ this.didUpdate(modelStatus === _modelStatus.MODEL_STATUS.READY);
395
+ }
396
+
397
+ // removing
398
+ if (prevModelStatus === _modelStatus.MODEL_STATUS.DELETING && modelStatus !== _modelStatus.MODEL_STATUS.DELETING) {
399
+ this.didRemove(modelStatus === _modelStatus.MODEL_STATUS.READY);
400
+ }
401
+ }
402
+ //#endregion Remove User
403
+
404
+ render() {
405
+ const {
406
+ modelStatus,
407
+ canModify,
408
+ readOnly,
409
+ canDeleteSelf,
410
+ allowMultipleRoles,
411
+ isAddDisabled,
412
+ isUpdateDisabled,
413
+ isDeleteDisabled,
414
+ defaultRole,
415
+ requiredRole,
416
+ roleDescriptions,
417
+ addRoleExcludeList,
418
+ entityName,
419
+ renderTableDescription,
420
+ renderAddDescription
421
+ } = this.props;
422
+ const {
423
+ sortedUsers,
424
+ isAdding,
425
+ isUpdating,
426
+ isRemoving,
427
+ shouldResetAddForm,
428
+ shouldShowRemoveDialog,
429
+ userRoleToUpdate,
430
+ userRoleToRemove,
431
+ successMessage,
432
+ existingMessage,
433
+ blockedMessage,
434
+ failMessage
435
+ } = this.state;
436
+ const addableRoleDescriptions = addRoleExcludeList ? (0, _lodash.pickBy)(roleDescriptions, (_, key) => !addRoleExcludeList.includes(key)) : roleDescriptions;
437
+ const roles = Object.keys(roleDescriptions);
438
+ const shouldRenderAsMutable = !readOnly && canModify;
439
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
440
+ children: [!!successMessage && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
441
+ id: "successMessageAlert",
442
+ variant: "success",
443
+ dismissible: true,
444
+ onClose: () => this.setState({
445
+ successMessage: undefined
446
+ }),
447
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
448
+ className: "pre-wrap",
449
+ children: successMessage
450
+ })
451
+ }), !!existingMessage && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
452
+ id: "existingMessageAlert",
453
+ variant: "info",
454
+ dismissible: true,
455
+ onClose: () => this.setState({
456
+ existingMessage: undefined
457
+ }),
458
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
459
+ className: "pre-wrap",
460
+ children: existingMessage
461
+ })
462
+ }), !!blockedMessage && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
463
+ id: "blockedMessageAlert",
464
+ variant: "warning",
465
+ dismissible: true,
466
+ onClose: () => this.setState({
467
+ blockedMessage: undefined
468
+ }),
469
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
470
+ className: "pre-wrap",
471
+ children: blockedMessage
472
+ })
473
+ }), !!failMessage && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
474
+ id: "failMessageAlert",
475
+ variant: "warning",
476
+ dismissible: true,
477
+ onClose: () => this.setState({
478
+ failMessage: undefined
479
+ }),
480
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
481
+ className: "pre-wrap",
482
+ children: failMessage
483
+ })
484
+ }), shouldRenderAsMutable && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Add.UserRolesAdd, {
485
+ id: "entityUserRolesAdd",
486
+ disabled: isAddDisabled,
487
+ entityName: entityName,
488
+ defaultRole: defaultRole,
489
+ roleDescriptions: addableRoleDescriptions,
490
+ renderAddDescription: renderAddDescription,
491
+ textForRole: this.textForRole,
492
+ isAddingUsersToRole: isAdding,
493
+ shouldReset: shouldResetAddForm,
494
+ addUserRoles: this.addUserRoles
495
+ }), !!renderTableDescription && renderTableDescription(shouldRenderAsMutable), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Row, {
496
+ className: "mt3",
497
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Col, {
498
+ xs: 12,
499
+ children: modelStatus === _modelStatus.MODEL_STATUS.LOADING ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Loading.Loading, {}) : sortedUsers.length > 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Context.UserRolesContext.Provider, {
500
+ value: {
501
+ isUpdateDisabled: isUpdateDisabled || readOnly,
502
+ isDeleteDisabled: isDeleteDisabled || readOnly,
503
+ canModify: shouldRenderAsMutable,
504
+ canDeleteSelf,
505
+ allowMultipleRoles,
506
+ roles,
507
+ requiredRole,
508
+ textForRole: this.textForRole,
509
+ userRoleToUpdate,
510
+ isUpdating,
511
+ updateUserRole: this.updateUserRole,
512
+ userRoleToRemove,
513
+ isRemoving,
514
+ removeUserRole: this.alertRemoveUserRole
515
+ },
516
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Table.UserRolesTable, {
517
+ id: "entityUserRolesTable",
518
+ users: sortedUsers
519
+ })
520
+ }) : null
521
+ })
522
+ }), !!userRoleToRemove && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertDialog.AlertDialog, {
523
+ id: "removeUserAlert",
524
+ isOpen: shouldShowRemoveDialog,
525
+ title: this.removeUserRoleTitle(userRoleToRemove.role),
526
+ description: this.renderRemoveUserRoleDescription(userRoleToRemove),
527
+ onDestroy: () => this.removeUserRole(true),
528
+ destroyText: "Yes, remove the user",
529
+ onCancel: () => this.removeUserRole(false),
530
+ cancelText: "No, I changed my mind"
531
+ })]
532
+ });
533
+ }
534
+ }
459
535
  exports.UserRoles = UserRoles;
460
- var mapStateToProps = function (state, ownProps) {
461
- var canModifyGlobally = baseActivity_1.canPerformActivityGlobally(ownProps.modifyUserRoleActivityName, baseActivity_1.defaultOptions(state));
462
- var canModify = canModifyGlobally ||
463
- (ownProps.entity
464
- ? baseActivity_1.canPerformActivityOnEntity(ownProps.modifyUserRoleActivityName, baseActivity_1.defaultOptions(state, ownProps, 'entity'))
465
- : false);
466
- return {
467
- canModify: canModify,
468
- canDeleteSelf: canModify ||
469
- (ownProps.entity && ownProps.deleteOwnUserRoleActivityName
470
- ? baseActivity_1.canPerformActivityOnEntity(ownProps.deleteOwnUserRoleActivityName, baseActivity_1.defaultOptions(state, ownProps, 'entity'))
471
- : false)
472
- };
536
+ const mapStateToProps = (state, ownProps) => {
537
+ const canModifyGlobally = (0, _baseActivity.canPerformActivityGlobally)(ownProps.modifyUserRoleActivityName, (0, _baseActivity.defaultOptions)(state));
538
+ const canModify = canModifyGlobally || (ownProps.entity ? (0, _baseActivity.canPerformActivityOnEntity)(ownProps.modifyUserRoleActivityName, (0, _baseActivity.defaultOptions)(state, ownProps, 'entity')) : false);
539
+ return {
540
+ canModify,
541
+ canDeleteSelf: canModify || (ownProps.entity && ownProps.deleteOwnUserRoleActivityName ? (0, _baseActivity.canPerformActivityOnEntity)(ownProps.deleteOwnUserRoleActivityName, (0, _baseActivity.defaultOptions)(state, ownProps, 'entity')) : false)
542
+ };
473
543
  };
474
544
  exports.mapStateToProps = mapStateToProps;
475
- exports.default = react_redux_1.connect(exports.mapStateToProps)(UserRoles);
545
+ var _default = exports.default = (0, _reactRedux.connect)(mapStateToProps)(UserRoles);
546
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3JlYWN0Qm9vdHN0cmFwIiwiX3JlYWN0UmVkdXgiLCJfdXVpZCIsIl9BbGVydERpYWxvZyIsIl9Mb2FkaW5nIiwiX0FkZCIsIl9UYWJsZSIsIl9jb25zdGFudHMiLCJfYmFzZVJvbGUiLCJfbW9kZWxTdGF0dXMiLCJfYWN0aW9uQ3JlYXRvciIsIl9hY3Rpb25zIiwiX25vU3RvcmVTYWdhIiwiX2Jhc2VBY3Rpdml0eSIsIl9iYXNlUm9sZTIiLCJfZG9tYWluSWRlbnRpZmllciIsIl9lbnRpdHlVc2VyUm9sZSIsIl9mZXRjaCIsIl9zb3J0IiwiX3VzZXIiLCJfdXNlclJvbGUiLCJfQWxlcnRXaXRoSWNvbiIsIl9Db250ZXh0IiwiX2pzeFJ1bnRpbWUiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJVc2VyUm9sZXMiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsIl90aGlzIiwiYXJndW1lbnRzIiwidGhpcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJzb3J0ZWRVc2VycyIsImFkZFVzZXJzSG9va0lkIiwidXVpZHY0IiwiaXNBZGRpbmciLCJpc1VwZGF0aW5nIiwiaXNSZW1vdmluZyIsInNob3VsZFJlc2V0QWRkRm9ybSIsInNob3VsZFNob3dSZW1vdmVEaWFsb2ciLCJwcm9wcyIsIm1vZGVsQXJyYXkiLCJ1c2VyUm9sZXMiLCJmaWx0ZXJVc2VycyIsInVzZXJzV2l0aFJvbGVzIiwidmFsdWVzIiwicmVkdWNlIiwicmVzdWx0IiwidXNlclJvbGUiLCJ1c2VySWQiLCJnZXRVc2VySWQiLCJ1c2VyV2l0aFJvbGVzIiwiY29udmVydFRvVXNlcldpdGhSb2xlcyIsInJvbGVzIiwicHVzaCIsImZpbHRlcmVkVXNlcnMiLCJzb3J0Iiwic29ydEJ5TmFtZXMiLCJzZXRTdGF0ZSIsInJvbGUiLCJsb3dlcmNhc2UiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJsb3dlcmNhc2VUZXh0Rm9yUm9sZSIsInJvbGVTdHJpbmciLCJ0ZXh0Rm9yUm9sZSIsInRleHRGb3JCYXNlUm9sZSIsInRvTG93ZXJDYXNlIiwic2luZ3VsYXJBcnRpY2xlRm9yUm9sZSIsInNpbmd1bGFyQXJ0aWNsZUZvckJhc2VSb2xlIiwiaWRlbnRpZmllcnMiLCJlbnRpdHkiLCJpZGVudGlmaWVyc1RvQWRkIiwicm9sZUZvckFkZCIsInN1Y2Nlc3NNZXNzYWdlIiwiZmFpbE1lc3NhZ2UiLCJleGlzdGluZ01lc3NhZ2UiLCJibG9ja2VkTWVzc2FnZSIsInN0YXRlIiwibm9TdG9yZUhvb2tzIiwicmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayIsImRhdGEiLCJ1bnJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2siLCJkaWRBZGQiLCJyb290TW9kZWxOYW1lIiwiZ2V0Um9vdE1vZGVsTmFtZSIsImRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QiLCJtb2RlbE5hbWUiLCJwYXRoUGFyYW1zIiwiaWQiLCJib2R5IiwiZW50aXR5SWQiLCJyb2xlTmFtZSIsIm5vU3RvcmUiLCJndWlkIiwiZW50aXR5TmFtZSIsIm9uQWRkIiwibW9kZWwiLCJFcnJvciIsImlzRmV0Y2hFcnJvckRhdGEiLCJqb2luIiwiYWRkZWRVc2VyUm9sZXMiLCJleGlzdGluZ1VzZXJSb2xlcyIsImJsb2NrZWRVc2VyUm9sZXMiLCJpbnZhbGlkSWRlbnRpZmllcnMiLCJhbGxvd2VkRG9tYWlucyIsImludmFsaWREb21haW5JZGVudGlmaWVycyIsInNpbmd1bGFyQXJ0aWNsZVN0cmluZyIsImFkZGVkTmFtZXMiLCJtYXAiLCJhdSIsImRpc3BsYXlOYW1lIiwidWlkIiwiZXhpc3RpbmdOYW1lcyIsImV1IiwiaGFzTXVsdGlwbGVFeGlzdGluZyIsImJsb2NrZWROYW1lcyIsImhhc011bHRpcGxlQmxvY2tlZCIsImdldERvbWFpbklkZW50aWZpZXJUeXBlUGx1cmFsU3RyaW5nIiwicmVwbGFjZSIsInVwZGF0ZWRNb2RlbCIsImNsb25lRGVlcCIsImZvckVhY2giLCJtb2RlbFBhdGgiLCJwcmVwYXJlRmV0Y2giLCJ0eXBlIiwiTU9ERUxfRkVUQ0hfUkVRVUVTVF9BQ1RJT05fVFlQRSIsIkZFVENIX1JFUVVFU1QiLCJnZXRFbmRwb2ludE1hcHBpbmdzIiwiZGlzcGF0Y2hBY3Rpb24iLCJNT0RFTF9GRVRDSF9SRVNVTFRfQUNUSU9OX1RZUEUiLCJGRVRDSF9SRVNVTFRfUkVDRUlWRUQiLCJ1c2VyUm9sZVRvVXBkYXRlIiwibmV3Um9sZSIsInJvbGVGb3JVcGRhdGUiLCJ1cGRhdGUiLCJxdWVyeVBhcmFtcyIsImlzU3VjY2VzcyIsIm9uVXBkYXRlIiwibmFtZSIsInVzZXJSb2xlVG9SZW1vdmUiLCJyb2xlRm9yUmVtb3ZlIiwid2FybmluZyIsImV4dGVybmFsUHJvdmlkZXJzIiwiZ3JvdXAiLCJkZWZhdWx0V2FybmluZyIsImpzeHMiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsImV4dGVybmFsR3JvdXBzVG9SZW1vdmUiLCJleHRlcm5hbEdyb3VwcyIsImZpbHRlciIsImVnIiwiQkFTRV9ST0xFIiwiR1JPVVBfT1dORVIiLCJleHRlcm5hbEdyb3Vwc1RvUmVtb3ZlV2l0aFJvc3RlclN5bmMiLCJleHRlcm5hbFByb3ZpZGVySWQiLCJyb3N0ZXJTeW5jRW5hYmxlZCIsImpzeCIsImRlc2NyaXB0aW9uIiwic2hvdWxkUmVtb3ZlIiwiZGVsZXRlIiwib25SZW1vdmUiLCJjb21wb25lbnREaWRNb3VudCIsInNldFN0YXRlRnJvbVByb3BzIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwicHJldk1vZGVsQXJyYXkiLCJtb2RlbFN0YXR1cyIsInByZXZNb2RlbFN0YXR1cyIsImlzRXF1YWwiLCJNT0RFTF9TVEFUVVMiLCJVTklOSVRJQUxJWkVEIiwiTE9BRElORyIsIkVSUk9SIiwiVVBEQVRJTkciLCJkaWRVcGRhdGUiLCJSRUFEWSIsIkRFTEVUSU5HIiwiZGlkUmVtb3ZlIiwicmVuZGVyIiwiY2FuTW9kaWZ5IiwicmVhZE9ubHkiLCJjYW5EZWxldGVTZWxmIiwiYWxsb3dNdWx0aXBsZVJvbGVzIiwiaXNBZGREaXNhYmxlZCIsImlzVXBkYXRlRGlzYWJsZWQiLCJpc0RlbGV0ZURpc2FibGVkIiwiZGVmYXVsdFJvbGUiLCJyZXF1aXJlZFJvbGUiLCJyb2xlRGVzY3JpcHRpb25zIiwiYWRkUm9sZUV4Y2x1ZGVMaXN0IiwicmVuZGVyVGFibGVEZXNjcmlwdGlvbiIsInJlbmRlckFkZERlc2NyaXB0aW9uIiwiYWRkYWJsZVJvbGVEZXNjcmlwdGlvbnMiLCJwaWNrQnkiLCJfIiwia2V5IiwiaW5jbHVkZXMiLCJrZXlzIiwic2hvdWxkUmVuZGVyQXNNdXRhYmxlIiwiRnJhZ21lbnQiLCJBbGVydFdpdGhJY29uIiwidmFyaWFudCIsImRpc21pc3NpYmxlIiwib25DbG9zZSIsIlVzZXJSb2xlc0FkZCIsImRpc2FibGVkIiwiaXNBZGRpbmdVc2Vyc1RvUm9sZSIsInNob3VsZFJlc2V0IiwiYWRkVXNlclJvbGVzIiwiUm93IiwiQ29sIiwieHMiLCJMb2FkaW5nIiwiVXNlclJvbGVzQ29udGV4dCIsIlByb3ZpZGVyIiwidmFsdWUiLCJ1cGRhdGVVc2VyUm9sZSIsInJlbW92ZVVzZXJSb2xlIiwiYWxlcnRSZW1vdmVVc2VyUm9sZSIsIlVzZXJSb2xlc1RhYmxlIiwidXNlcnMiLCJBbGVydERpYWxvZyIsImlzT3BlbiIsInRpdGxlIiwicmVtb3ZlVXNlclJvbGVUaXRsZSIsInJlbmRlclJlbW92ZVVzZXJSb2xlRGVzY3JpcHRpb24iLCJvbkRlc3Ryb3kiLCJkZXN0cm95VGV4dCIsIm9uQ2FuY2VsIiwiY2FuY2VsVGV4dCIsImV4cG9ydHMiLCJtYXBTdGF0ZVRvUHJvcHMiLCJvd25Qcm9wcyIsImNhbk1vZGlmeUdsb2JhbGx5IiwiY2FuUGVyZm9ybUFjdGl2aXR5R2xvYmFsbHkiLCJtb2RpZnlVc2VyUm9sZUFjdGl2aXR5TmFtZSIsImRlZmF1bHRPcHRpb25zIiwiY2FuUGVyZm9ybUFjdGl2aXR5T25FbnRpdHkiLCJkZWxldGVPd25Vc2VyUm9sZUFjdGl2aXR5TmFtZSIsIl9kZWZhdWx0IiwiY29ubmVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1VzZXJSb2xlcy9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xvbmVEZWVwLCBEaWN0aW9uYXJ5LCBpc0VxdWFsLCBwaWNrQnkgfSBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDb2wsIFJvdyB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXG5pbXBvcnQgeyBBbGVydERpYWxvZyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQWxlcnREaWFsb2cnXG5pbXBvcnQgeyBMb2FkaW5nIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Mb2FkaW5nJ1xuaW1wb3J0IHsgVXNlclJvbGVzQWRkIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Vc2VyUm9sZXMvQWRkJ1xuaW1wb3J0IHsgVXNlclJvbGVzVGFibGUgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL1VzZXJSb2xlcy9UYWJsZSdcbmltcG9ydCB7IGdldEVuZHBvaW50TWFwcGluZ3MgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5pbXBvcnQgeyBCQVNFX1JPTEUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvYmFzZVJvbGUnXG5pbXBvcnQgeyBNT0RFTF9TVEFUVVMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbW9kZWxTdGF0dXMnXG5pbXBvcnQgeyBkaXNwYXRjaEFjdGlvbiwgZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCB9IGZyb20gJy4uLy4uL3JlZHV4L2FjdGlvbkNyZWF0b3InXG5pbXBvcnQge1xuXHRNT0RFTF9GRVRDSF9SRVFVRVNUX0FDVElPTl9UWVBFLFxuXHRNT0RFTF9GRVRDSF9SRVNVTFRfQUNUSU9OX1RZUEUsXG5cdE1vZGVsRmV0Y2hSZXN1bHRBY3Rpb25cbn0gZnJvbSAnLi4vLi4vcmVkdXgvYWN0aW9ucydcbmltcG9ydCB7IG5vU3RvcmVIb29rcyB9IGZyb20gJy4uLy4uL3JlZHV4L3NhZ2FzL25vU3RvcmVTYWdhJ1xuaW1wb3J0IHtcblx0QmFzZVJlZHV4U3RhdGUsXG5cdEV4dGVybmFsUHJvdmlkZXIsXG5cdEZldGNoRXJyb3JEYXRhLFxuXHRHcm91cCxcblx0TW9kZWwsXG5cdE1vZGVsQ29sbGVjdGlvbixcblx0Um9sZURlc2NyaXB0aW9ucyxcblx0VXNlcixcblx0VXNlclJvbGUsXG5cdFVzZXJXaXRoUm9sZXNcbn0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgeyBjYW5QZXJmb3JtQWN0aXZpdHlHbG9iYWxseSwgY2FuUGVyZm9ybUFjdGl2aXR5T25FbnRpdHksIGRlZmF1bHRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZUFjdGl2aXR5J1xuaW1wb3J0IHsgc2luZ3VsYXJBcnRpY2xlRm9yQmFzZVJvbGUsIHRleHRGb3JCYXNlUm9sZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Jhc2VSb2xlJ1xuaW1wb3J0IHsgZ2V0RG9tYWluSWRlbnRpZmllclR5cGVQbHVyYWxTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscy9kb21haW5JZGVudGlmaWVyJ1xuaW1wb3J0IHsgZ2V0Um9vdE1vZGVsTmFtZSB9IGZyb20gJy4uLy4uL3V0aWxzL2VudGl0eVVzZXJSb2xlJ1xuaW1wb3J0IHsgaXNGZXRjaEVycm9yRGF0YSwgcHJlcGFyZUZldGNoIH0gZnJvbSAnLi4vLi4vdXRpbHMvZmV0Y2gnXG5pbXBvcnQgeyBzb3J0QnlOYW1lcyB9IGZyb20gJy4uLy4uL3V0aWxzL3NvcnQnXG5pbXBvcnQgeyBkaXNwbGF5TmFtZSB9IGZyb20gJy4uLy4uL3V0aWxzL3VzZXInXG5pbXBvcnQgeyBjb252ZXJ0VG9Vc2VyV2l0aFJvbGVzLCBnZXRVc2VySWQgfSBmcm9tICcuLi8uLi91dGlscy91c2VyUm9sZSdcbmltcG9ydCB7IEFsZXJ0V2l0aEljb24gfSBmcm9tICcuLi9BbGVydFdpdGhJY29uJ1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNvbXBvbmVudFdyYXBwZWRQcm9wcyB9IGZyb20gJy4uL0hPQy9Db2xsZWN0aW9uQ29tcG9uZW50J1xuaW1wb3J0IHsgVXNlclJvbGVzQ29udGV4dCB9IGZyb20gJy4vQ29udGV4dCdcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyUm9sZXNSZWR1eFByb3BzIHtcblx0LyoqIElzIHRoZSBjdXJyZW50IHVzZXIgYWxsb3dlZCB0byBhZGQsIHVwZGF0ZSwgYW5kIGRlbGV0ZSB1c2VyIHJvbGVzPyAqL1xuXHRjYW5Nb2RpZnk/OiBib29sZWFuXG5cdC8qKiBJcyB0aGUgY3VycmVudCB1c2VyIGFsbG93ZWQgdG8gZGVsZXRlIHRoZWlyIG93biB1c2VyIHJvbGU/ICovXG5cdGNhbkRlbGV0ZVNlbGY/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJvbGVzT3duUHJvcHMgZXh0ZW5kcyBDb2xsZWN0aW9uQ29tcG9uZW50V3JhcHBlZFByb3BzPFVzZXJSb2xlPiB7XG5cdC8qKiBTaG91bGQgdGhlIGNvbXBvbmVudCBwcmV2ZW50IG1vZGlmaWNhdGlvbnMsIGluZGVwZW5kZW50IG9mIHBlcm1pc3Npb25zPyAqL1xuXHRyZWFkT25seT86IGJvb2xlYW5cblx0LyoqIElzIHRoZSBjdXJyZW50IHVzZXIgYWxsb3dlZCB0byBkZWxldGUgdGhlaXIgb3duIHVzZXIgcm9sZT8gT3ZlcnJpZGVzIHRoZSB2YWx1ZSBmcm9tIHJlZHV4LiAqL1xuXHRjYW5EZWxldGVTZWxmPzogYm9vbGVhblxuXG5cdC8qKiBJZiBtdWx0aXBsZSByb2xlcyBhbGxvd2VkLCBlYWNoIHJvbGUgaXMgZGlzcGxheWVkIHBlciB1c2VyLCBvdGhlcndpc2UgYSBzZWxlY3QgZHJvcGRvd24gaXMgZGlzcGxheWVkLiAqL1xuXHRhbGxvd011bHRpcGxlUm9sZXM/OiBib29sZWFuXG5cdC8qKiBkaXNhYmxlIGFkZGluZyBuZXcgdXNlciByb2xlcyAqL1xuXHRpc0FkZERpc2FibGVkPzogYm9vbGVhblxuXHQvKiogZGlzYWJsZSBhbGwgdXNlciByb2xlIHNlbGVjdCBkcm9wZG93bnMsIGlmIGFueSAqL1xuXHRpc1VwZGF0ZURpc2FibGVkPzogYm9vbGVhblxuXHQvKiogZGlzYWJsZSBhbGwgdXNlciByb2xlIGRlbGV0ZSBidXR0b25zICovXG5cdGlzRGVsZXRlRGlzYWJsZWQ/OiBib29sZWFuXG5cblx0LyoqIFRoZSBhY3Rpdml0eSB0aGUgY3VycmVudCB1c2VyIG11c3QgaGF2ZSBpbiBvcmRlciB0byBhZGQsIHVwZGF0ZSwgb3IgZGVsZXRlIHVzZXIgcm9sZXMuICovXG5cdG1vZGlmeVVzZXJSb2xlQWN0aXZpdHlOYW1lOiBzdHJpbmdcblx0LyoqIChPcHRpb25hbCkgVGhlIGFjdGl2aXR5IHRoZSBjdXJyZW50IHVzZXIgbXVzdCBoYXZlIGluIG9yZGVyIHRvIGRlbGV0ZSB0aGVpciBvd24gdXNlciByb2xlcywgaWYgdGhleSBjYW5ub3QgbW9kaWZ5IGFsbC4gKi9cblx0ZGVsZXRlT3duVXNlclJvbGVBY3Rpdml0eU5hbWU/OiBzdHJpbmdcblx0LyoqIFRoZSByb2xlIHRoYXQgd2lsbCBiZSBzaG93biBmaXJzdCBpbiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgcm9sZXMuICovXG5cdGRlZmF1bHRSb2xlOiBzdHJpbmdcblx0LyoqIChPcHRpb25hbCkgSWYgcHJvdmlkZWQsIHRoZSBsYXN0IHVzZXIgcm9sZSB3aXRoIHRoZSByZXF1aXJlZCByb2xlIHdpbGwgYmUgcHJldmVudGVkIGZyb20gYmVpbmcgcmVtb3ZlZC4gKi9cblx0cmVxdWlyZWRSb2xlPzogc3RyaW5nXG5cdC8qKiBBIGRpY3Rpb25hcnkgb2YgYWxsIHBvc3NpYmxlIHJvbGVzIGFuZCB0aGVpciBkZXNjcmlwdGlvbnMuICovXG5cdHJvbGVEZXNjcmlwdGlvbnM6IFJvbGVEZXNjcmlwdGlvbnNcblx0LyoqIChPcHRpb25hbCkgbGlzdCBvZiByb2xlcyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBhZGQgb3B0aW9ucy4gKi9cblx0YWRkUm9sZUV4Y2x1ZGVMaXN0Pzogc3RyaW5nW11cblxuXHQvKiogKE9wdGlvbmFsKSBUaGUgZW50aXR5IHRoYXQgb3ducyB0aGUgdXNlciByb2xlcywgd2hlbiB0YXJnZXRpbmcgRW50aXR5VXNlclJvbGVzICovXG5cdGVudGl0eT86IE1vZGVsXG5cdC8qKiAoT3B0aW9uYWwpIEEgdXNlci1mcmllbmRseSBuYW1lIGZvciB0aGUgZW50aXR5IHR5cGUsIHdoZW4gdGFyZ2V0aW5nIEVudGl0eVVzZXJSb2xlcyAgKi9cblx0ZW50aXR5TmFtZT86IHN0cmluZ1xuXHQvKiogKE9wdGlvbmFsKSBzZXQgaWYgYHJlbmRlclJlbW92ZVVzZXJSb2xlRGVzY3JpcHRpb25gIHNob3VsZCBjaGVjayBmb3Igcm9zdGVyIHN5bmMgKi9cblx0ZXh0ZXJuYWxQcm92aWRlcnM/OiBNb2RlbENvbGxlY3Rpb248RXh0ZXJuYWxQcm92aWRlcj5cblxuXHQvKiogKE9wdGlvbmFsKSBBbGxvdyB1c2VycyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgdGFibGUgKi9cblx0ZmlsdGVyVXNlcnM/OiAodXNlcnM6IFVzZXJXaXRoUm9sZXNbXSkgPT4gVXNlcldpdGhSb2xlc1tdXG5cdC8qKiAoT3B0aW9uYWwpIENhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGFmdGVyIHVzZXIgcm9sZXMgYXJlIGFkZGVkICovXG5cdG9uQWRkPzogKHVzZXJSb2xlczogVXNlclJvbGVbXSkgPT4gdm9pZFxuXHQvKiogKE9wdGlvbmFsKSBDYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBhZnRlciBhIHVzZXIgcm9sZSBpcyB1cGRhdGVkICovXG5cdG9uVXBkYXRlPzogKHVzZXJSb2xlOiBVc2VyUm9sZSwgcm9sZTogc3RyaW5nKSA9PiB2b2lkXG5cdC8qKiAoT3B0aW9uYWwpIENhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIGFmdGVyIGEgdXNlciByb2xlIGlzIHJlbW92ZWQgKi9cblx0b25SZW1vdmU/OiAodXNlclJvbGU6IFVzZXJSb2xlKSA9PiB2b2lkXG5cdC8qKiAoT3B0aW9uYWwpIFJlbmRlciBjdXN0b20gY29tcG9uZW50cyBiZXR3ZWVuIHRoZSBBZGQgYW5kIFRhYmxlIGNvbXBvbmVudHMgKi9cblx0cmVuZGVyVGFibGVEZXNjcmlwdGlvbj86IChjYW5Nb2RpZnk/OiBib29sZWFuKSA9PiBSZWFjdC5KU1guRWxlbWVudFxuXHQvKiogKE9wdGlvbmFsKSBSZW5kZXIgY3VzdG9tIGNvbXBvbmVudHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBBZGQgY29tcG9uZW50ICovXG5cdHJlbmRlckFkZERlc2NyaXB0aW9uPzogKGVudGl0eU5hbWU/OiBzdHJpbmcpID0+IFJlYWN0LkpTWC5FbGVtZW50XG5cdC8qKiAoT3B0aW9uYWwpIFByb3ZpZGUgY3VzdG9tIHVzZXItZnJpZW5kbHkgbmFtZXMgZm9yIGRpc3BsYXllZCByb2xlcyAqL1xuXHR0ZXh0Rm9yUm9sZT86IChyb2xlOiBzdHJpbmcpID0+IHN0cmluZ1xuXHQvKiogKE9wdGlvbmFsKSBQcm92aWRlIGN1c3RvbSB1c2VyLWZyaWVuZGx5IG5hbWVzIGZvciBkaXNwbGF5ZWQgcm9sZXMgdGhhdCByZXF1aXJlIGN1c3RvbSBjYXNpbmcgKi9cblx0bG93ZXJjYXNlVGV4dEZvclJvbGU/OiAocm9sZTogc3RyaW5nKSA9PiBzdHJpbmdcblx0LyoqIChPcHRpb25hbCkgUHJvdmlkZSBjdXN0b20gdXNlci1mcmllbmRseSBhcnRpY2xlcyAoXCJhXCIgdnMuIFwiYW5cIikgZm9yIGRpc3BsYXllZCByb2xlcyAqL1xuXHRzaW5ndWxhckFydGljbGVGb3JSb2xlPzogKHJvbGU6IHN0cmluZykgPT4gc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJvbGVzUHJvcHMgZXh0ZW5kcyBVc2VyUm9sZXNSZWR1eFByb3BzLCBVc2VyUm9sZXNPd25Qcm9wcyB7fVxuXG5pbnRlcmZhY2UgVXNlclJvbGVzU3RhdGUge1xuXHRzb3J0ZWRVc2VyczogVXNlcldpdGhSb2xlc1tdXG5cdC8vIGFkZFxuXHRhZGRVc2Vyc0hvb2tJZDogc3RyaW5nXG5cdGlzQWRkaW5nOiBib29sZWFuXG5cdGlkZW50aWZpZXJzVG9BZGQ/OiBzdHJpbmdbXVxuXHRyb2xlRm9yQWRkPzogc3RyaW5nXG5cdHNob3VsZFJlc2V0QWRkRm9ybTogYm9vbGVhblxuXHQvLyB1cGRhdGVcblx0dXNlclJvbGVUb1VwZGF0ZT86IFVzZXJSb2xlXG5cdHJvbGVGb3JVcGRhdGU/OiBzdHJpbmdcblx0aXNVcGRhdGluZzogYm9vbGVhblxuXHQvLyByZW1vdmVcblx0c2hvdWxkU2hvd1JlbW92ZURpYWxvZzogYm9vbGVhblxuXHR1c2VyUm9sZVRvUmVtb3ZlPzogVXNlclJvbGVcblx0aXNSZW1vdmluZzogYm9vbGVhblxuXHQvLyBtZXNzYWdlc1xuXHRzdWNjZXNzTWVzc2FnZT86IHN0cmluZ1xuXHRleGlzdGluZ01lc3NhZ2U/OiBzdHJpbmdcblx0YmxvY2tlZE1lc3NhZ2U/OiBzdHJpbmdcblx0ZmFpbE1lc3NhZ2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGRCdXNpbmVzc01vZGVsIHtcblx0YWRkZWRVc2VyUm9sZXM6IFVzZXJSb2xlW11cblx0ZXhpc3RpbmdVc2VyUm9sZXM6IFVzZXJSb2xlW11cblx0YmxvY2tlZFVzZXJSb2xlcz86IFVzZXJSb2xlW11cblx0aW52YWxpZElkZW50aWZpZXJzOiBzdHJpbmdbXVxuXHRhbGxvd2VkRG9tYWluczogc3RyaW5nXG5cdGludmFsaWREb21haW5JZGVudGlmaWVyczogc3RyaW5nW11cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdXNlZCB0byBtYW5hZ2UgZWl0aGVyIFVzZXJSb2xlcyAoZ2xvYmFsIHJvbGVzKSBvciBFbnRpdHlVc2VyUm9sZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyUm9sZXMgZXh0ZW5kcyBDb21wb25lbnQ8VXNlclJvbGVzUHJvcHMsIFVzZXJSb2xlc1N0YXRlPiB7XG5cdHN0YXRlOiBVc2VyUm9sZXNTdGF0ZSA9IHtcblx0XHRzb3J0ZWRVc2VyczogW10sXG5cdFx0Ly8gYWRkXG5cdFx0YWRkVXNlcnNIb29rSWQ6IHV1aWR2NCgpLFxuXHRcdGlzQWRkaW5nOiBmYWxzZSxcblx0XHRpc1VwZGF0aW5nOiBmYWxzZSxcblx0XHRpc1JlbW92aW5nOiBmYWxzZSxcblx0XHRzaG91bGRSZXNldEFkZEZvcm06IGZhbHNlLFxuXHRcdHNob3VsZFNob3dSZW1vdmVEaWFsb2c6IGZhbHNlXG5cdH1cblxuXHRjb21wb25lbnREaWRNb3VudCgpIHtcblx0XHR0aGlzLnNldFN0YXRlRnJvbVByb3BzKHRoaXMucHJvcHMpXG5cdFx0Y29uc3QgeyBhZGRVc2Vyc0hvb2tJZCB9ID0gdGhpcy5zdGF0ZVxuXHRcdG5vU3RvcmVIb29rcy51bnJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2soYWRkVXNlcnNIb29rSWQpXG5cdH1cblxuXHRjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBVc2VyUm9sZXNQcm9wcykge1xuXHRcdGNvbnN0IHsgbW9kZWxBcnJheTogcHJldk1vZGVsQXJyYXksIG1vZGVsU3RhdHVzOiBwcmV2TW9kZWxTdGF0dXMgfSA9IHByZXZQcm9wc1xuXHRcdGNvbnN0IHsgbW9kZWxBcnJheSwgbW9kZWxTdGF0dXMsIGVudGl0eU5hbWUgfSA9IHRoaXMucHJvcHNcblxuXHRcdGlmICghaXNFcXVhbChwcmV2TW9kZWxBcnJheSwgbW9kZWxBcnJheSkpIHtcblx0XHRcdHRoaXMuc2V0U3RhdGVGcm9tUHJvcHModGhpcy5wcm9wcylcblx0XHR9XG5cblx0XHQvLyBsb2FkaW5nIGVycm9yXG5cdFx0aWYgKFxuXHRcdFx0KHByZXZNb2RlbFN0YXR1cyA9PT0gTU9ERUxfU1RBVFVTLlVOSU5JVElBTElaRUQgfHwgcHJldk1vZGVsU3RhdHVzID09PSBNT0RFTF9TVEFUVVMuTE9BRElORykgJiZcblx0XHRcdG1vZGVsU3RhdHVzID09PSBNT0RFTF9TVEFUVVMuRVJST1Jcblx0XHQpIHtcblx0XHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0XHRmYWlsTWVzc2FnZTogYE9vcHMhIFRoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nJHtcblx0XHRcdFx0XHRlbnRpdHlOYW1lID8gYCB0aGUgcGVvcGxlIGZvciB5b3VyICR7ZW50aXR5TmFtZX1gIDogJydcblx0XHRcdFx0fS5cXHJcXG5QbGVhc2UgdHJ5IGFnYWluLmBcblx0XHRcdH0pXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRpbmdcblx0XHRpZiAocHJldk1vZGVsU3RhdHVzID09PSBNT0RFTF9TVEFUVVMuVVBEQVRJTkcgJiYgbW9kZWxTdGF0dXMgIT09IE1PREVMX1NUQVRVUy5VUERBVElORykge1xuXHRcdFx0dGhpcy5kaWRVcGRhdGUobW9kZWxTdGF0dXMgPT09IE1PREVMX1NUQVRVUy5SRUFEWSlcblx0XHR9XG5cblx0XHQvLyByZW1vdmluZ1xuXHRcdGlmIChwcmV2TW9kZWxTdGF0dXMgPT09IE1PREVMX1NUQVRVUy5ERUxFVElORyAmJiBtb2RlbFN0YXR1cyAhPT0gTU9ERUxfU1RBVFVTLkRFTEVUSU5HKSB7XG5cdFx0XHR0aGlzLmRpZFJlbW92ZShtb2RlbFN0YXR1cyA9PT0gTU9ERUxfU1RBVFVTLlJFQURZKVxuXHRcdH1cblx0fVxuXG5cdHNldFN0YXRlRnJvbVByb3BzID0gKHByb3BzOiBVc2VyUm9sZXNQcm9wcykgPT4ge1xuXHRcdGNvbnN0IHsgbW9kZWxBcnJheTogdXNlclJvbGVzLCBmaWx0ZXJVc2VycyB9ID0gcHJvcHNcblx0XHRjb25zdCB1c2Vyc1dpdGhSb2xlcyA9IE9iamVjdC52YWx1ZXMoXG5cdFx0XHR1c2VyUm9sZXMucmVkdWNlKChyZXN1bHQ6IERpY3Rpb25hcnk8VXNlcldpdGhSb2xlcz4sIHVzZXJSb2xlOiBVc2VyUm9sZSkgPT4ge1xuXHRcdFx0XHRjb25zdCB1c2VySWQgPSBnZXRVc2VySWQodXNlclJvbGUpXG5cdFx0XHRcdGxldCB1c2VyV2l0aFJvbGVzID0gcmVzdWx0W3VzZXJJZF0gYXMgVXNlcldpdGhSb2xlcyB8IHVuZGVmaW5lZFxuXHRcdFx0XHRpZiAoIXVzZXJXaXRoUm9sZXMpIHtcblx0XHRcdFx0XHR1c2VyV2l0aFJvbGVzID0gY29udmVydFRvVXNlcldpdGhSb2xlcyh1c2VyUm9sZSlcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR1c2VyV2l0aFJvbGVzLnJvbGVzLnB1c2godXNlclJvbGUpXG5cdFx0XHRcdH1cblx0XHRcdFx0cmVzdWx0W3VzZXJJZF0gPSB1c2VyV2l0aFJvbGVzXG5cdFx0XHRcdHJldHVybiByZXN1bHRcblx0XHRcdH0sIHt9KVxuXHRcdClcblx0XHRjb25zdCBmaWx0ZXJlZFVzZXJzID0gZmlsdGVyVXNlcnMgPyBmaWx0ZXJVc2Vycyh1c2Vyc1dpdGhSb2xlcykgOiB1c2Vyc1dpdGhSb2xlc1xuXHRcdGNvbnN0IHNvcnRlZFVzZXJzID0gZmlsdGVyZWRVc2Vycy5zb3J0KHNvcnRCeU5hbWVzKVxuXHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0c29ydGVkVXNlcnNcblx0XHR9KVxuXHR9XG5cblx0dGV4dEZvclJvbGUgPSAocm9sZTogc3RyaW5nLCBsb3dlcmNhc2UgPSBmYWxzZSkgPT4ge1xuXHRcdGlmIChsb3dlcmNhc2UgJiYgdGhpcy5wcm9wcy5sb3dlcmNhc2VUZXh0Rm9yUm9sZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvcHMubG93ZXJjYXNlVGV4dEZvclJvbGUocm9sZSlcblx0XHR9XG5cdFx0Y29uc3Qgcm9sZVN0cmluZyA9IHRoaXMucHJvcHMudGV4dEZvclJvbGUgPyB0aGlzLnByb3BzLnRleHRGb3JSb2xlKHJvbGUpIDogdGV4dEZvckJhc2VSb2xlKHJvbGUpXG5cdFx0cmV0dXJuIGxvd2VyY2FzZSA/IHJvbGVTdHJpbmcudG9Mb3dlckNhc2UoKSA6IHJvbGVTdHJpbmdcblx0fVxuXG5cdHNpbmd1bGFyQXJ0aWNsZUZvclJvbGUgPSAocm9sZTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvcHMuc2luZ3VsYXJBcnRpY2xlRm9yUm9sZVxuXHRcdFx0PyB0aGlzLnByb3BzLnNpbmd1bGFyQXJ0aWNsZUZvclJvbGUocm9sZSlcblx0XHRcdDogc2luZ3VsYXJBcnRpY2xlRm9yQmFzZVJvbGUocm9sZSlcblx0fVxuXG5cdC8vI3JlZ2lvbiBBZGQgVXNlcnNcblxuXHRhZGRVc2VyUm9sZXMgPSAoaWRlbnRpZmllcnM6IHN0cmluZ1tdLCByb2xlOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IGVudGl0eSB9ID0gdGhpcy5wcm9wc1xuXHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0aWRlbnRpZmllcnNUb0FkZDogaWRlbnRpZmllcnMsXG5cdFx0XHRyb2xlRm9yQWRkOiByb2xlLFxuXHRcdFx0c3VjY2Vzc01lc3NhZ2U6IHVuZGVmaW5lZCxcblx0XHRcdGZhaWxNZXNzYWdlOiB1bmRlZmluZWQsXG5cdFx0XHRleGlzdGluZ01lc3NhZ2U6IHVuZGVmaW5lZCxcblx0XHRcdGJsb2NrZWRNZXNzYWdlOiB1bmRlZmluZWQsXG5cdFx0XHRzaG91bGRSZXNldEFkZEZvcm06IGZhbHNlLFxuXHRcdFx0aXNBZGRpbmc6IHRydWVcblx0XHR9KVxuXHRcdGNvbnN0IHsgYWRkVXNlcnNIb29rSWQgfSA9IHRoaXMuc3RhdGVcblx0XHRub1N0b3JlSG9va3MucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhhZGRVc2Vyc0hvb2tJZCwgKGRhdGE6IEFkZEJ1c2luZXNzTW9kZWwgfCBGZXRjaEVycm9yRGF0YSB8IG51bGwpID0+IHtcblx0XHRcdG5vU3RvcmVIb29rcy51bnJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2soYWRkVXNlcnNIb29rSWQpXG5cdFx0XHR0aGlzLmRpZEFkZChkYXRhKVxuXHRcdH0pXG5cdFx0Y29uc3Qgcm9vdE1vZGVsTmFtZSA9IGdldFJvb3RNb2RlbE5hbWUodGhpcy5wcm9wcylcblx0XHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcblx0XHRcdG1vZGVsTmFtZTogYCR7cm9vdE1vZGVsTmFtZSA/IGAke3Jvb3RNb2RlbE5hbWV9LmAgOiAnJ31hZGRVc2VyUm9sZXNgLFxuXHRcdFx0cGF0aFBhcmFtczogZW50aXR5ID8gW2VudGl0eS5pZF0gOiB1bmRlZmluZWQsXG5cdFx0XHRib2R5OiB7XG5cdFx0XHRcdGVudGl0eUlkOiBlbnRpdHkgPyBlbnRpdHkuaWQgOiB1bmRlZmluZWQsXG5cdFx0XHRcdGlkZW50aWZpZXJzOiBpZGVudGlmaWVycyxcblx0XHRcdFx0cm9sZU5hbWU6IHJvbGVcblx0XHRcdH0sXG5cdFx0XHRub1N0b3JlOiB0cnVlLFxuXHRcdFx0Z3VpZDogYWRkVXNlcnNIb29rSWRcblx0XHR9KVxuXHR9XG5cblx0ZGlkQWRkID0gKGRhdGE6IEFkZEJ1c2luZXNzTW9kZWwgfCBGZXRjaEVycm9yRGF0YSB8IG51bGwpID0+IHtcblx0XHRjb25zdCB7IGVudGl0eU5hbWUsIG9uQWRkLCBtb2RlbCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zIH0gPSB0aGlzLnByb3BzXG5cdFx0Y29uc3QgeyByb2xlRm9yQWRkLCBpZGVudGlmaWVyc1RvQWRkIH0gPSB0aGlzLnN0YXRlXG5cdFx0aWYgKCFyb2xlRm9yQWRkIHx8ICFpZGVudGlmaWVyc1RvQWRkIHx8IGlkZW50aWZpZXJzVG9BZGQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2RpZEFkZCB3YXMgY2FsbGVkIGluIHRoZSBpbmNvcnJlY3Qgc3RhdGUnKVxuXHRcdH1cblxuXHRcdGlmICghZGF0YSB8fCBpc0ZldGNoRXJyb3JEYXRhKGRhdGEpKSB7XG5cdFx0XHRjb25zdCBmYWlsTWVzc2FnZSA9IGBUaGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIHdlcmUgbm90IGFkZGVkJHtcblx0XHRcdFx0ZW50aXR5TmFtZSA/IGAgdG8geW91ciAke2VudGl0eU5hbWV9YCA6ICcnXG5cdFx0XHR9OlxcclxcbiR7aWRlbnRpZmllcnNUb0FkZC5qb2luKCdcXHJcXG4nKX1gXG5cblx0XHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0XHRzaG91bGRSZXNldEFkZEZvcm06IHRydWUsXG5cdFx0XHRcdGlzQWRkaW5nOiBmYWxzZSxcblx0XHRcdFx0aWRlbnRpZmllcnNUb0FkZDogdW5kZWZpbmVkLFxuXHRcdFx0XHRyb2xlRm9yQWRkOiB1bmRlZmluZWQsXG5cdFx0XHRcdGZhaWxNZXNzYWdlXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0Y29uc3Qge1xuXHRcdFx0YWRkZWRVc2VyUm9sZXMsXG5cdFx0XHRleGlzdGluZ1VzZXJSb2xlcyxcblx0XHRcdGJsb2NrZWRVc2VyUm9sZXMsXG5cdFx0XHRpbnZhbGlkSWRlbnRpZmllcnMsXG5cdFx0XHRhbGxvd2VkRG9tYWlucyxcblx0XHRcdGludmFsaWREb21haW5JZGVudGlmaWVyc1xuXHRcdH0gPSBkYXRhXG5cdFx0Y29uc3Qgcm9sZVN0cmluZyA9IHRoaXMudGV4dEZvclJvbGUocm9sZUZvckFkZCwgdHJ1ZSlcblx0XHRjb25zdCBzaW5ndWxhckFydGljbGVTdHJpbmcgPSB0aGlzLnNpbmd1bGFyQXJ0aWNsZUZvclJvbGUocm9sZUZvckFkZClcblxuXHRcdGNvbnN0IGFkZGVkTmFtZXMgPVxuXHRcdFx0YWRkZWRVc2VyUm9sZXMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IGFkZGVkVXNlclJvbGVzXG5cdFx0XHRcdFx0XHQubWFwKChhdTogVXNlcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYCR7ZGlzcGxheU5hbWUoYXUpfSR7YXUudWlkID8gYCAoJHthdS51aWR9KWAgOiAnJ31gXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmpvaW4oJ1xcclxcbicpXG5cdFx0XHRcdDogdW5kZWZpbmVkXG5cblx0XHRjb25zdCBzdWNjZXNzTWVzc2FnZSA9IGFkZGVkTmFtZXNcblx0XHRcdD8gYFRoZSBmb2xsb3dpbmcgJHtyb2xlU3RyaW5nfSR7YWRkZWRVc2VyUm9sZXMubGVuZ3RoID4gMSA/ICdzIHdlcmUnIDogJyB3YXMnfSBzdWNjZXNzZnVsbHkgYWRkZWQke1xuXHRcdFx0XHRcdGVudGl0eU5hbWUgPyBgIHRvIHlvdXIgJHtlbnRpdHlOYW1lfWAgOiAnJ1xuXHRcdFx0XHR9OlxcclxcbiR7YWRkZWROYW1lc31gXG5cdFx0XHQ6IHVuZGVmaW5lZFxuXG5cdFx0Y29uc3QgZXhpc3RpbmdOYW1lcyA9XG5cdFx0XHRleGlzdGluZ1VzZXJSb2xlcy5sZW5ndGggPiAwXG5cdFx0XHRcdD8gZXhpc3RpbmdVc2VyUm9sZXMubWFwKChldTogVXNlcikgPT4gYCR7ZGlzcGxheU5hbWUoZXUpfSR7ZXUudWlkID8gYCAoJHtldS51aWR9KWAgOiAnJ31gKS5qb2luKCdcXHJcXG4nKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXG5cdFx0Y29uc3QgaGFzTXVsdGlwbGVFeGlzdGluZyA9IGV4aXN0aW5nVXNlclJvbGVzLmxlbmd0aCA+IDFcblx0XHRjb25zdCBleGlzdGluZ01lc3NhZ2UgPSBleGlzdGluZ05hbWVzXG5cdFx0XHQ/IGBUaGUgZm9sbG93aW5nICR7aGFzTXVsdGlwbGVFeGlzdGluZyA/ICdwZW9wbGUgd2VyZScgOiAncGVyc29uIHdhcyd9IGFscmVhZHkgJHtcblx0XHRcdFx0XHRlbnRpdHlOYW1lXG5cdFx0XHRcdFx0XHQ/IGBpbiB5b3VyICR7ZW50aXR5TmFtZX0gYXMgJHtoYXNNdWx0aXBsZUV4aXN0aW5nID8gJycgOiBgJHtzaW5ndWxhckFydGljbGVTdHJpbmd9IGB9YFxuXHRcdFx0XHRcdFx0OiBoYXNNdWx0aXBsZUV4aXN0aW5nXG5cdFx0XHRcdFx0XHRcdD8gJydcblx0XHRcdFx0XHRcdFx0OiBgJHtzaW5ndWxhckFydGljbGVTdHJpbmd9IGBcblx0XHRcdFx0fSR7cm9sZVN0cmluZ30ke2hhc011bHRpcGxlRXhpc3RpbmcgPyAncycgOiAnJ306XFxyXFxuJHtleGlzdGluZ05hbWVzfWBcblx0XHRcdDogdW5kZWZpbmVkXG5cblx0XHRjb25zdCBibG9ja2VkTmFtZXMgPVxuXHRcdFx0ISFibG9ja2VkVXNlclJvbGVzICYmIGJsb2NrZWRVc2VyUm9sZXMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IGJsb2NrZWRVc2VyUm9sZXMubWFwKChldTogVXNlcikgPT4gYCR7ZGlzcGxheU5hbWUoZXUpfSR7ZXUudWlkID8gYCAoJHtldS51aWR9KWAgOiAnJ31gKS5qb2luKCdcXHJcXG4nKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdGNvbnN0IGhhc011bHRpcGxlQmxvY2tlZCA9ICEhYmxvY2tlZFVzZXJSb2xlcyAmJiBibG9ja2VkVXNlclJvbGVzLmxlbmd0aCA+IDFcblx0XHRjb25zdCBibG9ja2VkTWVzc2FnZSA9IGJsb2NrZWROYW1lc1xuXHRcdFx0PyBgVGhlIGZvbGxvd2luZyAke2hhc011bHRpcGxlQmxvY2tlZCA/ICdwZW9wbGUnIDogJ3BlcnNvbid9IGNvdWxkIG5vdCBiZSBhZGRlZCAke1xuXHRcdFx0XHRcdGVudGl0eU5hbWUgPyBgdG8geW91ciAke2VudGl0eU5hbWV9YCA6ICcnXG5cdFx0XHRcdH0gYXMgJHtoYXNNdWx0aXBsZUJsb2NrZWQgPyAnJyA6IGAke3Npbmd1bGFyQXJ0aWNsZVN0cmluZ30gYH0ke3JvbGVTdHJpbmd9JHtcblx0XHRcdFx0XHRoYXNNdWx0aXBsZUJsb2NrZWQgPyAncycgOiAnJ1xuXHRcdFx0XHR9IGJlY2F1c2UgdGhleSBhbHJlYWR5IGhhdmUgYSByb2xlOlxcclxcbiR7YmxvY2tlZE5hbWVzfWBcblx0XHRcdDogdW5kZWZpbmVkXG5cblx0XHRsZXQgZmFpbE1lc3NhZ2UgPVxuXHRcdFx0aW52YWxpZElkZW50aWZpZXJzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBgVGhlIGZvbGxvd2luZyAke2dldERvbWFpbklkZW50aWZpZXJUeXBlUGx1cmFsU3RyaW5nKCl9IGFyZSBpbnZhbGlkOlxcclxcbiR7aW52YWxpZElkZW50aWZpZXJzLmpvaW4oXG5cdFx0XHRcdFx0XHQnXFxyXFxuJ1xuXHRcdFx0XHRcdCl9YFxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXG5cdFx0aWYgKGludmFsaWREb21haW5JZGVudGlmaWVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmYWlsTWVzc2FnZSA9IGAke1xuXHRcdFx0XHRmYWlsTWVzc2FnZSA/IGAke2ZhaWxNZXNzYWdlfVxcclxcbmAgOiAnJ1xuXHRcdFx0fVRoZSBmb2xsb3dpbmcgJHtnZXREb21haW5JZGVudGlmaWVyVHlwZVBsdXJhbFN0cmluZygpfSBkbyBub3QgbWF0Y2ggdGhlIGFsbG93ZWQgZG9tYWlucyBvZiAke2FsbG93ZWREb21haW5zLnJlcGxhY2UoXG5cdFx0XHRcdCcsJyxcblx0XHRcdFx0JywgJ1xuXHRcdFx0KX06XFxyXFxuJHtpbnZhbGlkRG9tYWluSWRlbnRpZmllcnMuam9pbignXFxyXFxuJyl9YFxuXHRcdH1cblxuXHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0c2hvdWxkUmVzZXRBZGRGb3JtOiB0cnVlLFxuXHRcdFx0aXNBZGRpbmc6IGZhbHNlLFxuXHRcdFx0aWRlbnRpZmllcnNUb0FkZDogdW5kZWZpbmVkLFxuXHRcdFx0cm9sZUZvckFkZDogdW5kZWZpbmVkLFxuXHRcdFx0c3VjY2Vzc01lc3NhZ2UsXG5cdFx0XHRleGlzdGluZ01lc3NhZ2UsXG5cdFx0XHRibG9ja2VkTWVzc2FnZSxcblx0XHRcdGZhaWxNZXNzYWdlXG5cdFx0fSlcblxuXHRcdC8vIG9ubHkgcmVsb2FkIGlmIHdlIGhhZCBzb21lIHN1Y2Nlc3NmdWwgYWRkc1xuXHRcdGlmIChhZGRlZE5hbWVzKSB7XG5cdFx0XHQvLyB1cGRhdGUgcmVkdXggd2l0aCBhZGRlZCB1c2VyUm9sZXNcblx0XHRcdGNvbnN0IHVwZGF0ZWRNb2RlbCA9IGNsb25lRGVlcChtb2RlbClcblx0XHRcdGFkZGVkVXNlclJvbGVzLmZvckVhY2godXNlclJvbGUgPT4gKHVwZGF0ZWRNb2RlbFt1c2VyUm9sZS5pZF0gPSBjbG9uZURlZXAodXNlclJvbGUpKSlcblxuXHRcdFx0Ly8gY3JlYXRlIGEgZHVtbXkgYWN0aW9uIGFuZCBjYWxsIGBwcmVwYXJlRmV0Y2hgIHRvIGdldCB0aGUgZmluYWwgYG1vZGVsUGF0aGBcblx0XHRcdGNvbnN0IHsgbW9kZWxQYXRoIH0gPSBwcmVwYXJlRmV0Y2goXG5cdFx0XHRcdHtcblx0XHRcdFx0XHR0eXBlOiBNT0RFTF9GRVRDSF9SRVFVRVNUX0FDVElPTl9UWVBFLkZFVENIX1JFUVVFU1QsXG5cdFx0XHRcdFx0bW9kZWxOYW1lLFxuXHRcdFx0XHRcdHBhdGhQYXJhbXNcblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0RW5kcG9pbnRNYXBwaW5ncygpXG5cdFx0XHQpXG5cdFx0XHRkaXNwYXRjaEFjdGlvbjxNb2RlbEZldGNoUmVzdWx0QWN0aW9uPih7XG5cdFx0XHRcdHR5cGU6IE1PREVMX0ZFVENIX1JFU1VMVF9BQ1RJT05fVFlQRS5GRVRDSF9SRVNVTFRfUkVDRUlWRUQsXG5cdFx0XHRcdG1vZGVsUGF0aCxcblx0XHRcdFx0ZGF0YTogdXBkYXRlZE1vZGVsXG5cdFx0XHR9KVxuXG5cdFx0XHRpZiAob25BZGQpIHtcblx0XHRcdFx0b25BZGQoYWRkZWRVc2VyUm9sZXMpXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8jZW5kcmVnaW9uIEFkZCBVc2Vyc1xuXG5cdC8vI3JlZ2lvbiBVcGRhdGVcblxuXHR1cGRhdGVVc2VyUm9sZSA9ICh1c2VyUm9sZVRvVXBkYXRlOiBVc2VyUm9sZSwgbmV3Um9sZTogc3RyaW5nKSA9PiB7XG5cdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRpc1VwZGF0aW5nOiB0cnVlLFxuXHRcdFx0dXNlclJvbGVUb1VwZGF0ZSxcblx0XHRcdHJvbGVGb3JVcGRhdGU6IG5ld1JvbGUsXG5cdFx0XHRzdWNjZXNzTWVzc2FnZTogdW5kZWZpbmVkLFxuXHRcdFx0ZmFpbE1lc3NhZ2U6IHVuZGVmaW5lZFxuXHRcdH0pXG5cdFx0dGhpcy5wcm9wcy51cGRhdGUoe1xuXHRcdFx0aWQ6IHVzZXJSb2xlVG9VcGRhdGUuaWQsXG5cdFx0XHRib2R5OiB7fSxcblx0XHRcdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0XHRcdHJvbGVOYW1lOiBuZXdSb2xlXG5cdFx0XHR9XG5cdFx0fSlcblx0fVxuXG5cdGRpZFVwZGF0ZSA9IChpc1N1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcblx0XHRjb25zdCB7IGVudGl0eU5hbWUsIG9uVXBkYXRlIH0gPSB0aGlzLnByb3BzXG5cdFx0Y29uc3QgeyB1c2VyUm9sZVRvVXBkYXRlLCByb2xlRm9yVXBkYXRlIH0gPSB0aGlzLnN0YXRlXG5cdFx0aWYgKHVzZXJSb2xlVG9VcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdgZGlkVXBkYXRlYCB3YXMgY2FsbGVkIHdpdGhvdXQgc2V0dGluZyBgdXNlclJvbGVUb1VwZGF0ZWAgaW4gc3RhdGUnKVxuXHRcdH1cblx0XHRpZiAocm9sZUZvclVwZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2BkaWRVcGRhdGVgIHdhcyBjYWxsZWQgd2l0aG91dCBzZXR0aW5nIGByb2xlRm9yVXBkYXRlYCBpbiBzdGF0ZScpXG5cdFx0fVxuXG5cdFx0Y29uc3QgbmFtZSA9IGRpc3BsYXlOYW1lKHVzZXJSb2xlVG9VcGRhdGUpXG5cdFx0Y29uc3Qgcm9sZVN0cmluZyA9IHRoaXMudGV4dEZvclJvbGUocm9sZUZvclVwZGF0ZSwgdHJ1ZSlcblx0XHRjb25zdCBzaW5ndWxhckFydGljbGVTdHJpbmcgPSB0aGlzLnNpbmd1bGFyQXJ0aWNsZUZvclJvbGUocm9sZUZvclVwZGF0ZSlcblxuXHRcdGlmICghaXNTdWNjZXNzKSB7XG5cdFx0XHRjb25zdCBmYWlsTWVzc2FnZSA9IGBPb3BzISBUaGVyZSB3YXMgYW4gZXJyb3IgdXBkYXRpbmcgJHtuYW1lfSB0byAke3Npbmd1bGFyQXJ0aWNsZVN0cmluZ30gJHtyb2xlU3RyaW5nfSR7XG5cdFx0XHRcdGVudGl0eU5hbWUgPyBgIGluIHlvdXIgJHtlbnRpdHlOYW1lfWAgOiAnJ1xuXHRcdFx0fS4gUGxlYXNlIHRyeSBhZ2Fpbi5gXG5cdFx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdFx0aXNVcGRhdGluZzogZmFsc2UsXG5cdFx0XHRcdHVzZXJSb2xlVG9VcGRhdGU6IHVuZGVmaW5lZCxcblx0XHRcdFx0cm9sZUZvclVwZGF0ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRmYWlsTWVzc2FnZVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdGNvbnN0IHN1Y2Nlc3NNZXNzYWdlID0gYCR7bmFtZX0gd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkIHRvICR7c2luZ3VsYXJBcnRpY2xlU3RyaW5nfSAke3JvbGVTdHJpbmd9JHtcblx0XHRcdGVudGl0eU5hbWUgPyBgIGluIHlvdXIgJHtlbnRpdHlOYW1lfWAgOiAnJ1xuXHRcdH0uYFxuXG5cdFx0aWYgKG9uVXBkYXRlKSB7XG5cdFx0XHRvblVwZGF0ZSh1c2VyUm9sZVRvVXBkYXRlLCByb2xlRm9yVXBkYXRlKVxuXHRcdH1cblxuXHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0aXNVcGRhdGluZzogZmFsc2UsXG5cdFx0XHR1c2VyUm9sZVRvVXBkYXRlOiB1bmRlZmluZWQsXG5cdFx0XHRyb2xlRm9yVXBkYXRlOiB1bmRlZmluZWQsXG5cdFx0XHRzdWNjZXNzTWVzc2FnZVxuXHRcdH0pXG5cdH1cblxuXHQvLyNlbmRyZWdpb24gVXBkYXRlXG5cblx0Ly8jcmVnaW9uIFJlbW92ZSBVc2VyXG5cblx0YWxlcnRSZW1vdmVVc2VyUm9sZSA9ICh1c2VyUm9sZVRvUmVtb3ZlOiBVc2VyUm9sZSkgPT4ge1xuXHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0dXNlclJvbGVUb1JlbW92ZSxcblx0XHRcdHNob3VsZFNob3dSZW1vdmVEaWFsb2c6IHRydWVcblx0XHR9KVxuXHR9XG5cblx0cmVtb3ZlVXNlclJvbGVUaXRsZSA9IChyb2xlRm9yUmVtb3ZlOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gYFJlbW92ZSAke3RoaXMudGV4dEZvclJvbGUocm9sZUZvclJlbW92ZSl9YFxuXHR9XG5cblx0cmVuZGVyUmVtb3ZlVXNlclJvbGVEZXNjcmlwdGlvbiA9ICh1c2VyUm9sZVRvUmVtb3ZlOiBVc2VyUm9sZSwgd2FybmluZz86IFJlYWN0LkpTWC5FbGVtZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBlbnRpdHksIGV4dGVybmFsUHJvdmlkZXJzIH0gPSB0aGlzLnByb3BzXG5cdFx0Y29uc3QgZ3JvdXAgPSBlbnRpdHkgJiYgJ2V4dGVybmFsR3JvdXBzJyBpbiBlbnRpdHkgPyAoZW50aXR5IGFzIEdyb3VwKSA6IHVuZGVmaW5lZFxuXG5cdFx0Y29uc3Qgcm9sZVN0cmluZyA9IHRoaXMudGV4dEZvclJvbGUodXNlclJvbGVUb1JlbW92ZS5yb2xlLCB0cnVlKVxuXHRcdGNvbnN0IHNpbmd1bGFyQXJ0aWNsZVN0cmluZyA9IHRoaXMuc2luZ3VsYXJBcnRpY2xlRm9yUm9sZSh1c2VyUm9sZVRvUmVtb3ZlLnJvbGUpXG5cdFx0Y29uc3QgZGVmYXVsdFdhcm5pbmcgPSB3YXJuaW5nID8/IChcblx0XHRcdDxwIGNsYXNzTmFtZT1cIm1hMFwiPlxuXHRcdFx0XHRBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gPHN0cm9uZz5yZW1vdmUge2Rpc3BsYXlOYW1lKHVzZXJSb2xlVG9SZW1vdmUpfTwvc3Ryb25nPiBhc3snICd9XG5cdFx0XHRcdHtzaW5ndWxhckFydGljbGVTdHJpbmd9IHtyb2xlU3RyaW5nfT9cblx0XHRcdDwvcD5cblx0XHQpXG5cblx0XHRjb25zdCBleHRlcm5hbEdyb3Vwc1RvUmVtb3ZlID0gZ3JvdXA/LmV4dGVybmFsR3JvdXBzLmZpbHRlcihlZyA9PiBlZy51c2VySWQgPT09IHVzZXJSb2xlVG9SZW1vdmUuaWQpXG5cblx0XHRpZiAoXG5cdFx0XHQhZXh0ZXJuYWxHcm91cHNUb1JlbW92ZSB8fFxuXHRcdFx0ZXh0ZXJuYWxHcm91cHNUb1JlbW92ZS5sZW5ndGggPT09IDAgfHxcblx0XHRcdHVzZXJSb2xlVG9SZW1vdmUucm9sZSAhPT0gQkFTRV9ST0xFLkdST1VQX09XTkVSXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdFdhcm5pbmdcblx0XHR9XG5cblx0XHRjb25zdCBleHRlcm5hbEdyb3Vwc1RvUmVtb3ZlV2l0aFJvc3RlclN5bmMgPSBleHRlcm5hbEdyb3Vwc1RvUmVtb3ZlLmZpbHRlcihcblx0XHRcdGVnID0+IGV4dGVybmFsUHJvdmlkZXJzPy5bZWcuZXh0ZXJuYWxQcm92aWRlcklkXT8ucm9zdGVyU3luY0VuYWJsZWRcblx0XHQpXG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PGRpdj5cblx0XHRcdFx0PHA+XG5cdFx0XHRcdFx0VGhlIGZvbGxvd2luZyBjb3Vyc2Ugc2VjdGlvbnMgd2lsbCBiZSA8c3Ryb25nPmRpc2Nvbm5lY3RlZDwvc3Ryb25nPi57JyAnfVxuXHRcdFx0XHRcdHtleHRlcm5hbEdyb3Vwc1RvUmVtb3ZlV2l0aFJvc3RlclN5bmMubGVuZ3RoID4gMCAmJiAoXG5cdFx0XHRcdFx0XHQ8c3Bhbj5cblx0XHRcdFx0XHRcdFx0QW55IGF1dG9tYXRpY2FsbHkgYWRkZWQgc3R1ZGVudHMgd2lsbCBiZSA8c3Ryb25nPnJlbW92ZWQ8L3N0cm9uZz4uXG5cdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0KX1cblx0XHRcdFx0PC9wPlxuXHRcdFx0XHQ8dWw+XG5cdFx0XHRcdFx0e2V4dGVybmFsR3JvdXBzVG9SZW1vdmUubWFwKGVnID0+IChcblx0XHRcdFx0XHRcdDxsaSBrZXk9e2VnLmlkfT57ZWcuZGVzY3JpcHRpb259PC9saT5cblx0XHRcdFx0XHQpKX1cblx0XHRcdFx0PC91bD5cblx0XHRcdFx0e2RlZmF1bHRXYXJuaW5nfVxuXHRcdFx0PC9kaXY+XG5cdFx0KVxuXHR9XG5cblx0cmVtb3ZlVXNlclJvbGUgPSAoc2hvdWxkUmVtb3ZlOiBib29sZWFuKSA9PiB7XG5cdFx0Y29uc3QgeyB1c2VyUm9sZVRvUmVtb3ZlIH0gPSB0aGlzLnN0YXRlXG5cdFx0aWYgKHVzZXJSb2xlVG9SZW1vdmUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdgcmVtb3ZlVXNlcmAgd2FzIGNhbGxlZCB3aXRob3V0IHNldHRpbmcgYHVzZXJSb2xlVG9SZW1vdmVgIGluIHN0YXRlJylcblx0XHR9XG5cdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRpc1JlbW92aW5nOiBzaG91bGRSZW1vdmUsXG5cdFx0XHRzaG91bGRTaG93UmVtb3ZlRGlhbG9nOiBmYWxzZSxcblx0XHRcdHN1Y2Nlc3NNZXNzYWdlOiB1bmRlZmluZWQsXG5cdFx0XHRmYWlsTWVzc2FnZTogdW5kZWZpbmVkLFxuXHRcdFx0Ly8gY2xlYXIgaWYgY2FuY2VsbGVkXG5cdFx0XHR1c2VyUm9sZVRvUmVtb3ZlOiBzaG91bGRSZW1vdmUgPyB1c2VyUm9sZVRvUmVtb3ZlIDogdW5kZWZpbmVkXG5cdFx0fSlcblx0XHRpZiAoIXNob3VsZFJlbW92ZSkge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXHRcdHRoaXMucHJvcHMuZGVsZXRlKHtcblx0XHRcdGlkOiB1c2VyUm9sZVRvUmVtb3ZlLmlkXG5cdFx0fSlcblx0fVxuXG5cdGRpZFJlbW92ZSA9IChpc1N1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcblx0XHRjb25zdCB7IGVudGl0eU5hbWUsIG9uUmVtb3ZlIH0gPSB0aGlzLnByb3BzXG5cdFx0Y29uc3QgeyB1c2VyUm9sZVRvUmVtb3ZlIH0gPSB0aGlzLnN0YXRlXG5cdFx0aWYgKHVzZXJSb2xlVG9SZW1vdmUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdgZGlkUmVtb3ZlYCB3YXMgY2FsbGVkIHdpdGhvdXQgc2V0dGluZyBgdXNlclJvbGVUb1JlbW92ZWAgaW4gc3RhdGUnKVxuXHRcdH1cblxuXHRcdGNvbnN0IG5hbWUgPSBkaXNwbGF5TmFtZSh1c2VyUm9sZVRvUmVtb3ZlKVxuXHRcdGlmICghaXNTdWNjZXNzKSB7XG5cdFx0XHRjb25zdCBmYWlsTWVzc2FnZSA9IGBPb3BzISBUaGVyZSB3YXMgYW4gZXJyb3IgcmVtb3ZpbmcgJHtuYW1lfSR7XG5cdFx0XHRcdGVudGl0eU5hbWUgPyBgIGZyb20geW91ciAke2VudGl0eU5hbWV9YCA6ICcnXG5cdFx0XHR9LiBQbGVhc2UgdHJ5IGFnYWluLmBcblx0XHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0XHRpc1JlbW92aW5nOiBmYWxzZSxcblx0XHRcdFx0dXNlclJvbGVUb1JlbW92ZTogdW5kZWZpbmVkLFxuXHRcdFx0XHRmYWlsTWVzc2FnZVxuXHRcdFx0fSlcblx0XHRcdHJldHVyblxuXHRcdH1cblxuXHRcdGNvbnN0IHN1Y2Nlc3NNZXNzYWdlID0gYCR7bmFtZX0gd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkJHtlbnRpdHlOYW1lID8gYCBmcm9tIHlvdXIgJHtlbnRpdHlOYW1lfWAgOiAnJ30uYFxuXG5cdFx0aWYgKG9uUmVtb3ZlKSB7XG5cdFx0XHRvblJlbW92ZSh1c2VyUm9sZVRvUmVtb3ZlKVxuXHRcdH1cblxuXHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0aXNSZW1vdmluZzogZmFsc2UsXG5cdFx0XHR1c2VyUm9sZVRvUmVtb3ZlOiB1bmRlZmluZWQsXG5cdFx0XHRzdWNjZXNzTWVzc2FnZVxuXHRcdH0pXG5cdH1cblxuXHQvLyNlbmRyZWdpb24gUmVtb3ZlIFVzZXJcblxuXHRyZW5kZXIoKSB7XG5cdFx0Y29uc3Qge1xuXHRcdFx0bW9kZWxTdGF0dXMsXG5cdFx0XHRjYW5Nb2RpZnksXG5cdFx0XHRyZWFkT25seSxcblx0XHRcdGNhbkRlbGV0ZVNlbGYsXG5cdFx0XHRhbGxvd011bHRpcGxlUm9sZXMsXG5cdFx0XHRpc0FkZERpc2FibGVkLFxuXHRcdFx0aXNVcGRhdGVEaXNhYmxlZCxcblx0XHRcdGlzRGVsZXRlRGlzYWJsZWQsXG5cdFx0XHRkZWZhdWx0Um9sZSxcblx0XHRcdHJlcXVpcmVkUm9sZSxcblx0XHRcdHJvbGVEZXNjcmlwdGlvbnMsXG5cdFx0XHRhZGRSb2xlRXhjbHVkZUxpc3QsXG5cdFx0XHRlbnRpdHlOYW1lLFxuXHRcdFx0cmVuZGVyVGFibGVEZXNjcmlwdGlvbixcblx0XHRcdHJlbmRlckFkZERlc2NyaXB0aW9uXG5cdFx0fSA9IHRoaXMucHJvcHNcblx0XHRjb25zdCB7XG5cdFx0XHRzb3J0ZWRVc2Vycyxcblx0XHRcdGlzQWRkaW5nLFxuXHRcdFx0aXNVcGRhdGluZyxcblx0XHRcdGlzUmVtb3ZpbmcsXG5cdFx0XHRzaG91bGRSZXNldEFkZEZvcm0sXG5cdFx0XHRzaG91bGRTaG93UmVtb3ZlRGlhbG9nLFxuXHRcdFx0dXNlclJvbGVUb1VwZGF0ZSxcblx0XHRcdHVzZXJSb2xlVG9SZW1vdmUsXG5cdFx0XHRzdWNjZXNzTWVzc2FnZSxcblx0XHRcdGV4aXN0aW5nTWVzc2FnZSxcblx0XHRcdGJsb2NrZWRNZXNzYWdlLFxuXHRcdFx0ZmFpbE1lc3NhZ2Vcblx0XHR9ID0gdGhpcy5zdGF0ZVxuXG5cdFx0Y29uc3QgYWRkYWJsZVJvbGVEZXNjcmlwdGlvbnMgPSBhZGRSb2xlRXhjbHVkZUxpc3Rcblx0XHRcdD8gcGlja0J5KHJvbGVEZXNjcmlwdGlvbnMsIChfLCBrZXkpID0+ICFhZGRSb2xlRXhjbHVkZUxpc3QuaW5jbHVkZXMoa2V5KSlcblx0XHRcdDogcm9sZURlc2NyaXB0aW9uc1xuXHRcdGNvbnN0IHJvbGVzID0gT2JqZWN0LmtleXMocm9sZURlc2NyaXB0aW9ucylcblx0XHRjb25zdCBzaG91bGRSZW5kZXJBc011dGFibGUgPSAhcmVhZE9ubHkgJiYgY2FuTW9kaWZ5XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PD5cblx0XHRcdFx0eyEhc3VjY2Vzc01lc3NhZ2UgJiYgKFxuXHRcdFx0XHRcdDxBbGVydFdpdGhJY29uXG5cdFx0XHRcdFx0XHRpZD1cInN1Y2Nlc3NNZXNzYWdlQWxlcnRcIlxuXHRcdFx0XHRcdFx0dmFyaWFudD1cInN1Y2Nlc3NcIlxuXHRcdFx0XHRcdFx0ZGlzbWlzc2libGVcblx0XHRcdFx0XHRcdG9uQ2xvc2U9eygpID0+XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0U3RhdGUoe1xuXHRcdFx0XHRcdFx0XHRcdHN1Y2Nlc3NNZXNzYWdlOiB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdH0+XG5cdFx0XHRcdFx0XHQ8cCBjbGFzc05hbWU9XCJwcmUtd3JhcFwiPntzdWNjZXNzTWVzc2FnZX08L3A+XG5cdFx0XHRcdFx0PC9BbGVydFdpdGhJY29uPlxuXHRcdFx0XHQpfVxuXHRcdFx0XHR7ISFleGlzdGluZ01lc3NhZ2UgJiYgKFxuXHRcdFx0XHRcdDxBbGVydFdpdGhJY29uXG5cdFx0XHRcdFx0XHRpZD1cImV4aXN0aW5nTWVzc2FnZUFsZXJ0XCJcblx0XHRcdFx0XHRcdHZhcmlhbnQ9XCJpbmZvXCJcblx0XHRcdFx0XHRcdGRpc21pc3NpYmxlXG5cdFx0XHRcdFx0XHRvbkNsb3NlPXsoKSA9PlxuXHRcdFx0XHRcdFx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdFx0XHRcdFx0XHRleGlzdGluZ01lc3NhZ2U6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fT5cblx0XHRcdFx0XHRcdDxwIGNsYXNzTmFtZT1cInByZS13cmFwXCI+e2V4aXN0aW5nTWVzc2FnZX08L3A+XG5cdFx0XHRcdFx0PC9BbGVydFdpdGhJY29uPlxuXHRcdFx0XHQpfVxuXHRcdFx0XHR7ISFibG9ja2VkTWVzc2FnZSAmJiAoXG5cdFx0XHRcdFx0PEFsZXJ0V2l0aEljb25cblx0XHRcdFx0XHRcdGlkPVwiYmxvY2tlZE1lc3NhZ2VBbGVydFwiXG5cdFx0XHRcdFx0XHR2YXJpYW50PVwid2FybmluZ1wiXG5cdFx0XHRcdFx0XHRkaXNtaXNzaWJsZVxuXHRcdFx0XHRcdFx0b25DbG9zZT17KCkgPT5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0YmxvY2tlZE1lc3NhZ2U6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0fT5cblx0XHRcdFx0XHRcdDxwIGNsYXNzTmFtZT1cInByZS13cmFwXCI+e2Jsb2NrZWRNZXNzYWdlfTwvcD5cblx0XHRcdFx0XHQ8L0FsZXJ0V2l0aEljb24+XG5cdFx0XHRcdCl9XG5cdFx0XHRcdHshIWZhaWxNZXNzYWdlICYmIChcblx0XHRcdFx0XHQ8QWxlcnRXaXRoSWNvblxuXHRcdFx0XHRcdFx0aWQ9XCJmYWlsTWVzc2FnZUFsZXJ0XCJcblx0XHRcdFx0XHRcdHZhcmlhbnQ9XCJ3YXJuaW5nXCJcblx0XHRcdFx0XHRcdGRpc21pc3NpYmxlXG5cdFx0XHRcdFx0XHRvbkNsb3NlPXsoKSA9PlxuXHRcdFx0XHRcdFx0XHR0aGlzLnNldFN0YXRlKHtcblx0XHRcdFx0XHRcdFx0XHRmYWlsTWVzc2FnZTogdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHR9PlxuXHRcdFx0XHRcdFx0PHAgY2xhc3NOYW1lPVwicHJlLXdyYXBcIj57ZmFpbE1lc3NhZ2V9PC9wPlxuXHRcdFx0XHRcdDwvQWxlcnRXaXRoSWNvbj5cblx0XHRcdFx0KX1cblx0XHRcdFx0e3Nob3VsZFJlbmRlckFzTXV0YWJsZSAmJiAoXG5cdFx0XHRcdFx0PFVzZXJSb2xlc0FkZFxuXHRcdFx0XHRcdFx0aWQ9XCJlbnRpdHlVc2VyUm9sZXNBZGRcIlxuXHRcdFx0XHRcdFx0ZGlzYWJsZWQ9e2lzQWRkRGlzYWJsZWR9XG5cdFx0XHRcdFx0XHRlbnRpdHlOYW1lPXtlbnRpdHlOYW1lfVxuXHRcdFx0XHRcdFx0ZGVmYXVsdFJvbGU9e2RlZmF1bHRSb2xlfVxuXHRcdFx0XHRcdFx0cm9sZURlc2NyaXB0aW9ucz17YWRkYWJsZVJvbGVEZXNjcmlwdGlvbnN9XG5cdFx0XHRcdFx0XHRyZW5kZXJBZGREZXNjcmlwdGlvbj17cmVuZGVyQWRkRGVzY3JpcHRpb259XG5cdFx0XHRcdFx0XHR0ZXh0Rm9yUm9sZT17dGhpcy50ZXh0Rm9yUm9sZX1cblx0XHRcdFx0XHRcdGlzQWRkaW5nVXNlcnNUb1JvbGU9e2lzQWRkaW5nfVxuXHRcdFx0XHRcdFx0c2hvdWxkUmVzZXQ9e3Nob3VsZFJlc2V0QWRkRm9ybX1cblx0XHRcdFx0XHRcdGFkZFVzZXJSb2xlcz17dGhpcy5hZGRVc2VyUm9sZXN9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0KX1cblx0XHRcdFx0eyEhcmVuZGVyVGFibGVEZXNjcmlwdGlvbiAmJiByZW5kZXJUYWJsZURlc2NyaXB0aW9uKHNob3VsZFJlbmRlckFzTXV0YWJsZSl9XG5cdFx0XHRcdDxSb3cgY2xhc3NOYW1lPVwibXQzXCI+XG5cdFx0XHRcdFx0PENvbCB4cz17MTJ9PlxuXHRcdFx0XHRcdFx0e21vZGVsU3RhdHVzID09PSBNT0RFTF9TVEFUVVMuTE9BRElORyA/IChcblx0XHRcdFx0XHRcdFx0PExvYWRpbmcgLz5cblx0XHRcdFx0XHRcdCkgOiBzb3J0ZWRVc2Vycy5sZW5ndGggPiAwID8gKFxuXHRcdFx0XHRcdFx0XHQ8VXNlclJvbGVzQ29udGV4dC5Qcm92aWRlclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlPXt7XG5cdFx0XHRcdFx0XHRcdFx0XHRpc1VwZGF0ZURpc2FibGVkOiBpc1VwZGF0ZURpc2FibGVkIHx8IHJlYWRPbmx5LFxuXHRcdFx0XHRcdFx0XHRcdFx0aXNEZWxldGVEaXNhYmxlZDogaXNEZWxldGVEaXNhYmxlZCB8fCByZWFkT25seSxcblx0XHRcdFx0XHRcdFx0XHRcdGNhbk1vZGlmeTogc2hvdWxkUmVuZGVyQXNNdXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FuRGVsZXRlU2VsZixcblx0XHRcdFx0XHRcdFx0XHRcdGFsbG93TXVsdGlwbGVSb2xlcyxcblx0XHRcdFx0XHRcdFx0XHRcdHJvbGVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVxdWlyZWRSb2xlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGV4dEZvclJvbGU6IHRoaXMudGV4dEZvclJvbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHR1c2VyUm9sZVRvVXBkYXRlLFxuXHRcdFx0XHRcdFx0XHRcdFx0aXNVcGRhdGluZyxcblx0XHRcdFx0XHRcdFx0XHRcdHVwZGF0ZVVzZXJSb2xlOiB0aGlzLnVwZGF0ZVVzZXJSb2xlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dXNlclJvbGVUb1JlbW92ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGlzUmVtb3ZpbmcsXG5cdFx0XHRcdFx0XHRcdFx0XHRyZW1vdmVVc2VyUm9sZTogdGhpcy5hbGVydFJlbW92ZVVzZXJSb2xlXG5cdFx0XHRcdFx0XHRcdFx0fX0+XG5cdFx0XHRcdFx0XHRcdFx0PFVzZXJSb2xlc1RhYmxlIGlkPVwiZW50aXR5VXNlclJvbGVzVGFibGVcIiB1c2Vycz17c29ydGVkVXNlcnN9IC8+XG5cdFx0XHRcdFx0XHRcdDwvVXNlclJvbGVzQ29udGV4dC5Qcm92aWRlcj5cblx0XHRcdFx0XHRcdCkgOiBudWxsfVxuXHRcdFx0XHRcdDwvQ29sPlxuXHRcdFx0XHQ8L1Jvdz5cblx0XHRcdFx0eyEhdXNlclJvbGVUb1JlbW92ZSAmJiAoXG5cdFx0XHRcdFx0PEFsZXJ0RGlhbG9nXG5cdFx0XHRcdFx0XHRpZD1cInJlbW92ZVVzZXJBbGVydFwiXG5cdFx0XHRcdFx0XHRpc09wZW49e3Nob3VsZFNob3dSZW1vdmVEaWFsb2d9XG5cdFx0XHRcdFx0XHR0aXRsZT17dGhpcy5yZW1vdmVVc2VyUm9sZVRpdGxlKHVzZXJSb2xlVG9SZW1vdmUucm9sZSl9XG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbj17dGhpcy5yZW5kZXJSZW1vdmVVc2VyUm9sZURlc2NyaXB0aW9uKHVzZXJSb2xlVG9SZW1vdmUpfVxuXHRcdFx0XHRcdFx0b25EZXN0cm95PXsoKSA9PiB0aGlzLnJlbW92ZVVzZXJSb2xlKHRydWUpfVxuXHRcdFx0XHRcdFx0ZGVzdHJveVRleHQ9XCJZZXMsIHJlbW92ZSB0aGUgdXNlclwiXG5cdFx0XHRcdFx0XHRvbkNhbmNlbD17KCkgPT4gdGhpcy5yZW1vdmVVc2VyUm9sZShmYWxzZSl9XG5cdFx0XHRcdFx0XHRjYW5jZWxUZXh0PVwiTm8sIEkgY2hhbmdlZCBteSBtaW5kXCJcblx0XHRcdFx0XHQvPlxuXHRcdFx0XHQpfVxuXHRcdFx0PC8+XG5cdFx0KVxuXHR9XG59XG5cbmV4cG9ydCBjb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoc3RhdGU6IEJhc2VSZWR1eFN0YXRlLCBvd25Qcm9wczogVXNlclJvbGVzT3duUHJvcHMpOiBVc2VyUm9sZXNSZWR1eFByb3BzID0+IHtcblx0Y29uc3QgY2FuTW9kaWZ5R2xvYmFsbHkgPSBjYW5QZXJmb3JtQWN0aXZpdHlHbG9iYWxseShvd25Qcm9wcy5tb2RpZnlVc2VyUm9sZUFjdGl2aXR5TmFtZSwgZGVmYXVsdE9wdGlvbnMoc3RhdGUpKVxuXG5cdGNvbnN0IGNhbk1vZGlmeSA9XG5cdFx0Y2FuTW9kaWZ5R2xvYmFsbHkgfHxcblx0XHQob3duUHJvcHMuZW50aXR5XG5cdFx0XHQ/IGNhblBlcmZvcm1BY3Rpdml0eU9uRW50aXR5KG93blByb3BzLm1vZGlmeVVzZXJSb2xlQWN0aXZpdHlOYW1lLCBkZWZhdWx0T3B0aW9ucyhzdGF0ZSwgb3duUHJvcHMsICdlbnRpdHknKSlcblx0XHRcdDogZmFsc2UpXG5cblx0cmV0dXJuIHtcblx0XHRjYW5Nb2RpZnksXG5cdFx0Y2FuRGVsZXRlU2VsZjpcblx0XHRcdGNhbk1vZGlmeSB8fFxuXHRcdFx0KG93blByb3BzLmVudGl0eSAmJiBvd25Qcm9wcy5kZWxldGVPd25Vc2VyUm9sZUFjdGl2aXR5TmFtZVxuXHRcdFx0XHQ/IGNhblBlcmZvcm1BY3Rpdml0eU9uRW50aXR5KFxuXHRcdFx0XHRcdFx0b3duUHJvcHMuZGVsZXRlT3duVXNlclJvbGVBY3Rpdml0eU5hbWUsXG5cdFx0XHRcdFx0XHRkZWZhdWx0T3B0aW9ucyhzdGF0ZSwgb3duUHJvcHMsICdlbnRpdHknKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0OiBmYWxzZSlcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcykoVXNlclJvbGVzKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFdBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLElBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLFVBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLFNBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLFlBQUEsR0FBQVosT0FBQTtBQUNBLElBQUFhLGNBQUEsR0FBQWIsT0FBQTtBQUNBLElBQUFjLFFBQUEsR0FBQWQsT0FBQTtBQUtBLElBQUFlLFlBQUEsR0FBQWYsT0FBQTtBQWFBLElBQUFnQixhQUFBLEdBQUFoQixPQUFBO0FBQ0EsSUFBQWlCLFVBQUEsR0FBQWpCLE9BQUE7QUFDQSxJQUFBa0IsaUJBQUEsR0FBQWxCLE9BQUE7QUFDQSxJQUFBbUIsZUFBQSxHQUFBbkIsT0FBQTtBQUNBLElBQUFvQixNQUFBLEdBQUFwQixPQUFBO0FBQ0EsSUFBQXFCLEtBQUEsR0FBQXJCLE9BQUE7QUFDQSxJQUFBc0IsS0FBQSxHQUFBdEIsT0FBQTtBQUNBLElBQUF1QixTQUFBLEdBQUF2QixPQUFBO0FBQ0EsSUFBQXdCLGNBQUEsR0FBQXhCLE9BQUE7QUFFQSxJQUFBeUIsUUFBQSxHQUFBekIsT0FBQTtBQUE0QyxJQUFBMEIsV0FBQSxHQUFBMUIsT0FBQTtBQUFBLFNBQUFFLHdCQUFBeUIsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQTNCLHVCQUFBLFlBQUFBLENBQUF5QixDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENBQUFNLEdBQUEsQ0FBQVosQ0FBQSxHQUFBTSxDQUFBLENBQUFPLEdBQUEsQ0FBQWIsQ0FBQSxFQUFBUSxDQUFBLGdCQUFBUCxDQUFBLElBQUFELENBQUEsZ0JBQUFDLENBQUEsT0FBQWEsY0FBQSxDQUFBQyxJQUFBLENBQUFmLENBQUEsRUFBQUMsQ0FBQSxPQUFBTSxDQUFBLElBQUFELENBQUEsR0FBQVUsTUFBQSxDQUFBQyxjQUFBLEtBQUFELE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWxCLENBQUEsRUFBQUMsQ0FBQSxPQUFBTSxDQUFBLENBQUFLLEdBQUEsSUFBQUwsQ0FBQSxDQUFBTSxHQUFBLElBQUFQLENBQUEsQ0FBQUUsQ0FBQSxFQUFBUCxDQUFBLEVBQUFNLENBQUEsSUFBQUMsQ0FBQSxDQUFBUCxDQUFBLElBQUFELENBQUEsQ0FBQUMsQ0FBQSxXQUFBTyxDQUFBLEtBQUFSLENBQUEsRUFBQUMsQ0FBQTtBQWtHNUM7QUFDQTtBQUNBO0FBQ08sTUFBTWtCLFNBQVMsU0FBU0MsZ0JBQVMsQ0FBaUM7RUFBQUMsWUFBQTtJQUFBLElBQUFDLEtBQUE7SUFBQSxTQUFBQyxTQUFBO0lBQUFELEtBQUEsR0FBQUUsSUFBQTtJQUFBLElBQUFDLGdCQUFBLENBQUFmLE9BQUEsaUJBQ2hEO01BQ3ZCZ0IsV0FBVyxFQUFFLEVBQUU7TUFDZjtNQUNBQyxjQUFjLEVBQUUsSUFBQUMsUUFBTSxFQUFDLENBQUM7TUFDeEJDLFFBQVEsRUFBRSxLQUFLO01BQ2ZDLFVBQVUsRUFBRSxLQUFLO01BQ2pCQyxVQUFVLEVBQUUsS0FBSztNQUNqQkMsa0JBQWtCLEVBQUUsS0FBSztNQUN6QkMsc0JBQXNCLEVBQUU7SUFDekIsQ0FBQztJQUFBLElBQUFSLGdCQUFBLENBQUFmLE9BQUEsNkJBdUNvQndCLEtBQXFCLElBQUs7TUFDOUMsTUFBTTtRQUFFQyxVQUFVLEVBQUVDLFNBQVM7UUFBRUM7TUFBWSxDQUFDLEdBQUdILEtBQUs7TUFDcEQsTUFBTUksY0FBYyxHQUFHdEIsTUFBTSxDQUFDdUIsTUFBTSxDQUNuQ0gsU0FBUyxDQUFDSSxNQUFNLENBQUMsQ0FBQ0MsTUFBaUMsRUFBRUMsUUFBa0IsS0FBSztRQUMzRSxNQUFNQyxNQUFNLEdBQUcsSUFBQUMsbUJBQVMsRUFBQ0YsUUFBUSxDQUFDO1FBQ2xDLElBQUlHLGFBQWEsR0FBR0osTUFBTSxDQUFDRSxNQUFNLENBQThCO1FBQy9ELElBQUksQ0FBQ0UsYUFBYSxFQUFFO1VBQ25CQSxhQUFhLEdBQUcsSUFBQUMsZ0NBQXNCLEVBQUNKLFFBQVEsQ0FBQztRQUNqRCxDQUFDLE1BQU07VUFDTkcsYUFBYSxDQUFDRSxLQUFLLENBQUNDLElBQUksQ0FBQ04sUUFBUSxDQUFDO1FBQ25DO1FBQ0FELE1BQU0sQ0FBQ0UsTUFBTSxDQUFDLEdBQUdFLGFBQWE7UUFDOUIsT0FBT0osTUFBTTtNQUNkLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDTixDQUFDO01BQ0QsTUFBTVEsYUFBYSxHQUFHWixXQUFXLEdBQUdBLFdBQVcsQ0FBQ0MsY0FBYyxDQUFDLEdBQUdBLGNBQWM7TUFDaEYsTUFBTVosV0FBVyxHQUFHdUIsYUFBYSxDQUFDQyxJQUFJLENBQUNDLGlCQUFXLENBQUM7TUFDbkQsSUFBSSxDQUFDQyxRQUFRLENBQUM7UUFDYjFCO01BQ0QsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUFBLElBQUFELGdCQUFBLENBQUFmLE9BQUEsdUJBRWEsVUFBQzJDLElBQVksRUFBd0I7TUFBQSxJQUF0QkMsU0FBUyxHQUFBL0IsU0FBQSxDQUFBZ0MsTUFBQSxRQUFBaEMsU0FBQSxRQUFBaUMsU0FBQSxHQUFBakMsU0FBQSxNQUFHLEtBQUs7TUFDN0MsSUFBSStCLFNBQVMsSUFBSWhDLEtBQUksQ0FBQ1ksS0FBSyxDQUFDdUIsb0JBQW9CLEVBQUU7UUFDakQsT0FBT25DLEtBQUksQ0FBQ1ksS0FBSyxDQUFDdUIsb0JBQW9CLENBQUNKLElBQUksQ0FBQztNQUM3QztNQUNBLE1BQU1LLFVBQVUsR0FBR3BDLEtBQUksQ0FBQ1ksS0FBSyxDQUFDeUIsV0FBVyxHQUFHckMsS0FBSSxDQUFDWSxLQUFLLENBQUN5QixXQUFXLENBQUNOLElBQUksQ0FBQyxHQUFHLElBQUFPLDBCQUFlLEVBQUNQLElBQUksQ0FBQztNQUNoRyxPQUFPQyxTQUFTLEdBQUdJLFVBQVUsQ0FBQ0csV0FBVyxDQUFDLENBQUMsR0FBR0gsVUFBVTtJQUN6RCxDQUFDO0lBQUEsSUFBQWpDLGdCQUFBLENBQUFmLE9BQUEsa0NBRXlCMkMsSUFBWSxJQUFLO01BQzFDLE9BQU8sSUFBSSxDQUFDbkIsS0FBSyxDQUFDNEIsc0JBQXNCLEdBQ3JDLElBQUksQ0FBQzVCLEtBQUssQ0FBQzRCLHNCQUFzQixDQUFDVCxJQUFJLENBQUMsR0FDdkMsSUFBQVUscUNBQTBCLEVBQUNWLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBRUQ7SUFBQSxJQUFBNUIsZ0JBQUEsQ0FBQWYsT0FBQSx3QkFFZSxDQUFDc0QsV0FBcUIsRUFBRVgsSUFBWSxLQUFLO01BQ3ZELE1BQU07UUFBRVk7TUFBTyxDQUFDLEdBQUcsSUFBSSxDQUFDL0IsS0FBSztNQUM3QixJQUFJLENBQUNrQixRQUFRLENBQUM7UUFDYmMsZ0JBQWdCLEVBQUVGLFdBQVc7UUFDN0JHLFVBQVUsRUFBRWQsSUFBSTtRQUNoQmUsY0FBYyxFQUFFWixTQUFTO1FBQ3pCYSxXQUFXLEVBQUViLFNBQVM7UUFDdEJjLGVBQWUsRUFBRWQsU0FBUztRQUMxQmUsY0FBYyxFQUFFZixTQUFTO1FBQ3pCeEIsa0JBQWtCLEVBQUUsS0FBSztRQUN6QkgsUUFBUSxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BQ0YsTUFBTTtRQUFFRjtNQUFlLENBQUMsR0FBRyxJQUFJLENBQUM2QyxLQUFLO01BQ3JDQyx5QkFBWSxDQUFDQyx5QkFBeUIsQ0FBQy9DLGNBQWMsRUFBR2dELElBQThDLElBQUs7UUFDMUdGLHlCQUFZLENBQUNHLDJCQUEyQixDQUFDakQsY0FBYyxDQUFDO1FBQ3hELElBQUksQ0FBQ2tELE1BQU0sQ0FBQ0YsSUFBSSxDQUFDO01BQ2xCLENBQUMsQ0FBQztNQUNGLE1BQU1HLGFBQWEsR0FBRyxJQUFBQyxnQ0FBZ0IsRUFBQyxJQUFJLENBQUM3QyxLQUFLLENBQUM7TUFDbEQsSUFBQThDLHdDQUF5QixFQUFDO1FBQ3pCQyxTQUFTLEVBQUUsR0FBR0gsYUFBYSxHQUFHLEdBQUdBLGFBQWEsR0FBRyxHQUFHLEVBQUUsY0FBYztRQUNwRUksVUFBVSxFQUFFakIsTUFBTSxHQUFHLENBQUNBLE1BQU0sQ0FBQ2tCLEVBQUUsQ0FBQyxHQUFHM0IsU0FBUztRQUM1QzRCLElBQUksRUFBRTtVQUNMQyxRQUFRLEVBQUVwQixNQUFNLEdBQUdBLE1BQU0sQ0FBQ2tCLEVBQUUsR0FBRzNCLFNBQVM7VUFDeENRLFdBQVcsRUFBRUEsV0FBVztVQUN4QnNCLFFBQVEsRUFBRWpDO1FBQ1gsQ0FBQztRQUNEa0MsT0FBTyxFQUFFLElBQUk7UUFDYkMsSUFBSSxFQUFFN0Q7TUFDUCxDQUFDLENBQUM7SUFDSCxDQUFDO0lBQUEsSUFBQUYsZ0JBQUEsQ0FBQWYsT0FBQSxrQkFFU2lFLElBQThDLElBQUs7TUFDNUQsTUFBTTtRQUFFYyxVQUFVO1FBQUVDLEtBQUs7UUFBRUMsS0FBSztRQUFFVixTQUFTO1FBQUVDO01BQVcsQ0FBQyxHQUFHLElBQUksQ0FBQ2hELEtBQUs7TUFDdEUsTUFBTTtRQUFFaUMsVUFBVTtRQUFFRDtNQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDTSxLQUFLO01BQ25ELElBQUksQ0FBQ0wsVUFBVSxJQUFJLENBQUNELGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQ1gsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN0RSxNQUFNLElBQUlxQyxLQUFLLENBQUMsMENBQTBDLENBQUM7TUFDNUQ7TUFFQSxJQUFJLENBQUNqQixJQUFJLElBQUksSUFBQWtCLHVCQUFnQixFQUFDbEIsSUFBSSxDQUFDLEVBQUU7UUFDcEMsTUFBTU4sV0FBVyxHQUFHLDJDQUNuQm9CLFVBQVUsR0FBRyxZQUFZQSxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQ25DdkIsZ0JBQWdCLENBQUM0QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFFdkMsSUFBSSxDQUFDMUMsUUFBUSxDQUFDO1VBQ2JwQixrQkFBa0IsRUFBRSxJQUFJO1VBQ3hCSCxRQUFRLEVBQUUsS0FBSztVQUNmcUMsZ0JBQWdCLEVBQUVWLFNBQVM7VUFDM0JXLFVBQVUsRUFBRVgsU0FBUztVQUNyQmE7UUFDRCxDQUFDLENBQUM7UUFDRjtNQUNEO01BRUEsTUFBTTtRQUNMMEIsY0FBYztRQUNkQyxpQkFBaUI7UUFDakJDLGdCQUFnQjtRQUNoQkMsa0JBQWtCO1FBQ2xCQyxjQUFjO1FBQ2RDO01BQ0QsQ0FBQyxHQUFHekIsSUFBSTtNQUNSLE1BQU1qQixVQUFVLEdBQUcsSUFBSSxDQUFDQyxXQUFXLENBQUNRLFVBQVUsRUFBRSxJQUFJLENBQUM7TUFDckQsTUFBTWtDLHFCQUFxQixHQUFHLElBQUksQ0FBQ3ZDLHNCQUFzQixDQUFDSyxVQUFVLENBQUM7TUFFckUsTUFBTW1DLFVBQVUsR0FDZlAsY0FBYyxDQUFDeEMsTUFBTSxHQUFHLENBQUMsR0FDdEJ3QyxjQUFjLENBQ2JRLEdBQUcsQ0FBRUMsRUFBUSxJQUFLO1FBQ2xCLE9BQU8sR0FBRyxJQUFBQyxpQkFBVyxFQUFDRCxFQUFFLENBQUMsR0FBR0EsRUFBRSxDQUFDRSxHQUFHLEdBQUcsS0FBS0YsRUFBRSxDQUFDRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUU7TUFDM0QsQ0FBQyxDQUFDLENBQ0RaLElBQUksQ0FBQyxNQUFNLENBQUMsR0FDYnRDLFNBQVM7TUFFYixNQUFNWSxjQUFjLEdBQUdrQyxVQUFVLEdBQzlCLGlCQUFpQjVDLFVBQVUsR0FBR3FDLGNBQWMsQ0FBQ3hDLE1BQU0sR0FBRyxDQUFDLEdBQUcsUUFBUSxHQUFHLE1BQU0sc0JBQzNFa0MsVUFBVSxHQUFHLFlBQVlBLFVBQVUsRUFBRSxHQUFHLEVBQUUsUUFDbkNhLFVBQVUsRUFBRSxHQUNuQjlDLFNBQVM7TUFFWixNQUFNbUQsYUFBYSxHQUNsQlgsaUJBQWlCLENBQUN6QyxNQUFNLEdBQUcsQ0FBQyxHQUN6QnlDLGlCQUFpQixDQUFDTyxHQUFHLENBQUVLLEVBQVEsSUFBSyxHQUFHLElBQUFILGlCQUFXLEVBQUNHLEVBQUUsQ0FBQyxHQUFHQSxFQUFFLENBQUNGLEdBQUcsR0FBRyxLQUFLRSxFQUFFLENBQUNGLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsR0FDckd0QyxTQUFTO01BRWIsTUFBTXFELG1CQUFtQixHQUFHYixpQkFBaUIsQ0FBQ3pDLE1BQU0sR0FBRyxDQUFDO01BQ3hELE1BQU1lLGVBQWUsR0FBR3FDLGFBQWEsR0FDbEMsaUJBQWlCRSxtQkFBbUIsR0FBRyxhQUFhLEdBQUcsWUFBWSxZQUNuRXBCLFVBQVUsR0FDUCxXQUFXQSxVQUFVLE9BQU9vQixtQkFBbUIsR0FBRyxFQUFFLEdBQUcsR0FBR1IscUJBQXFCLEdBQUcsRUFBRSxHQUNwRlEsbUJBQW1CLEdBQ2xCLEVBQUUsR0FDRixHQUFHUixxQkFBcUIsR0FBRyxHQUM3QjNDLFVBQVUsR0FBR21ELG1CQUFtQixHQUFHLEdBQUcsR0FBRyxFQUFFLFFBQVFGLGFBQWEsRUFBRSxHQUNwRW5ELFNBQVM7TUFFWixNQUFNc0QsWUFBWSxHQUNqQixDQUFDLENBQUNiLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQzFDLE1BQU0sR0FBRyxDQUFDLEdBQzlDMEMsZ0JBQWdCLENBQUNNLEdBQUcsQ0FBRUssRUFBUSxJQUFLLEdBQUcsSUFBQUgsaUJBQVcsRUFBQ0csRUFBRSxDQUFDLEdBQUdBLEVBQUUsQ0FBQ0YsR0FBRyxHQUFHLEtBQUtFLEVBQUUsQ0FBQ0YsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUNwR3RDLFNBQVM7TUFDYixNQUFNdUQsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDZCxnQkFBZ0IsSUFBSUEsZ0JBQWdCLENBQUMxQyxNQUFNLEdBQUcsQ0FBQztNQUM1RSxNQUFNZ0IsY0FBYyxHQUFHdUMsWUFBWSxHQUNoQyxpQkFBaUJDLGtCQUFrQixHQUFHLFFBQVEsR0FBRyxRQUFRLHVCQUN6RHRCLFVBQVUsR0FBRyxXQUFXQSxVQUFVLEVBQUUsR0FBRyxFQUFFLE9BQ25Dc0Isa0JBQWtCLEdBQUcsRUFBRSxHQUFHLEdBQUdWLHFCQUFxQixHQUFHLEdBQUczQyxVQUFVLEdBQ3hFcUQsa0JBQWtCLEdBQUcsR0FBRyxHQUFHLEVBQUUseUNBQ1dELFlBQVksRUFBRSxHQUN0RHRELFNBQVM7TUFFWixJQUFJYSxXQUFXLEdBQ2Q2QixrQkFBa0IsQ0FBQzNDLE1BQU0sR0FBRyxDQUFDLEdBQzFCLGlCQUFpQixJQUFBeUQscURBQW1DLEVBQUMsQ0FBQyxvQkFBb0JkLGtCQUFrQixDQUFDSixJQUFJLENBQ2pHLE1BQ0QsQ0FBQyxFQUFFLEdBQ0Z0QyxTQUFTO01BRWIsSUFBSTRDLHdCQUF3QixDQUFDN0MsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN4Q2MsV0FBVyxHQUFHLEdBQ2JBLFdBQVcsR0FBRyxHQUFHQSxXQUFXLE1BQU0sR0FBRyxFQUFFLGlCQUN2QixJQUFBMkMscURBQW1DLEVBQUMsQ0FBQyx3Q0FBd0NiLGNBQWMsQ0FBQ2MsT0FBTyxDQUNuSCxHQUFHLEVBQ0gsSUFDRCxDQUFDLFFBQVFiLHdCQUF3QixDQUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7TUFDakQ7TUFFQSxJQUFJLENBQUMxQyxRQUFRLENBQUM7UUFDYnBCLGtCQUFrQixFQUFFLElBQUk7UUFDeEJILFFBQVEsRUFBRSxLQUFLO1FBQ2ZxQyxnQkFBZ0IsRUFBRVYsU0FBUztRQUMzQlcsVUFBVSxFQUFFWCxTQUFTO1FBQ3JCWSxjQUFjO1FBQ2RFLGVBQWU7UUFDZkMsY0FBYztRQUNkRjtNQUNELENBQUMsQ0FBQzs7TUFFRjtNQUNBLElBQUlpQyxVQUFVLEVBQUU7UUFDZjtRQUNBLE1BQU1ZLFlBQVksR0FBRyxJQUFBQyxpQkFBUyxFQUFDeEIsS0FBSyxDQUFDO1FBQ3JDSSxjQUFjLENBQUNxQixPQUFPLENBQUMxRSxRQUFRLElBQUt3RSxZQUFZLENBQUN4RSxRQUFRLENBQUN5QyxFQUFFLENBQUMsR0FBRyxJQUFBZ0MsaUJBQVMsRUFBQ3pFLFFBQVEsQ0FBRSxDQUFDOztRQUVyRjtRQUNBLE1BQU07VUFBRTJFO1FBQVUsQ0FBQyxHQUFHLElBQUFDLG1CQUFZLEVBQ2pDO1VBQ0NDLElBQUksRUFBRUMsd0NBQStCLENBQUNDLGFBQWE7VUFDbkR4QyxTQUFTO1VBQ1RDO1FBQ0QsQ0FBQyxFQUNELElBQUF3Qyw4QkFBbUIsRUFBQyxDQUNyQixDQUFDO1FBQ0QsSUFBQUMsNkJBQWMsRUFBeUI7VUFDdENKLElBQUksRUFBRUssdUNBQThCLENBQUNDLHFCQUFxQjtVQUMxRFIsU0FBUztVQUNUMUMsSUFBSSxFQUFFdUM7UUFDUCxDQUFDLENBQUM7UUFFRixJQUFJeEIsS0FBSyxFQUFFO1VBQ1ZBLEtBQUssQ0FBQ0ssY0FBYyxDQUFDO1FBQ3RCO01BQ0Q7SUFDRCxDQUFDO0lBRUQ7SUFFQTtJQUFBLElBQUF0RSxnQkFBQSxDQUFBZixPQUFBLDBCQUVpQixDQUFDb0gsZ0JBQTBCLEVBQUVDLE9BQWUsS0FBSztNQUNqRSxJQUFJLENBQUMzRSxRQUFRLENBQUM7UUFDYnRCLFVBQVUsRUFBRSxJQUFJO1FBQ2hCZ0csZ0JBQWdCO1FBQ2hCRSxhQUFhLEVBQUVELE9BQU87UUFDdEIzRCxjQUFjLEVBQUVaLFNBQVM7UUFDekJhLFdBQVcsRUFBRWI7TUFDZCxDQUFDLENBQUM7TUFDRixJQUFJLENBQUN0QixLQUFLLENBQUMrRixNQUFNLENBQUM7UUFDakI5QyxFQUFFLEVBQUUyQyxnQkFBZ0IsQ0FBQzNDLEVBQUU7UUFDdkJDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDUjhDLFdBQVcsRUFBRTtVQUNaNUMsUUFBUSxFQUFFeUM7UUFDWDtNQUNELENBQUMsQ0FBQztJQUNILENBQUM7SUFBQSxJQUFBdEcsZ0JBQUEsQ0FBQWYsT0FBQSxxQkFFWXlILFNBQWtCLElBQUs7TUFDbkMsTUFBTTtRQUFFMUMsVUFBVTtRQUFFMkM7TUFBUyxDQUFDLEdBQUcsSUFBSSxDQUFDbEcsS0FBSztNQUMzQyxNQUFNO1FBQUU0RixnQkFBZ0I7UUFBRUU7TUFBYyxDQUFDLEdBQUcsSUFBSSxDQUFDeEQsS0FBSztNQUN0RCxJQUFJc0QsZ0JBQWdCLEtBQUt0RSxTQUFTLEVBQUU7UUFDbkMsTUFBTSxJQUFJb0MsS0FBSyxDQUFDLG9FQUFvRSxDQUFDO01BQ3RGO01BQ0EsSUFBSW9DLGFBQWEsS0FBS3hFLFNBQVMsRUFBRTtRQUNoQyxNQUFNLElBQUlvQyxLQUFLLENBQUMsaUVBQWlFLENBQUM7TUFDbkY7TUFFQSxNQUFNeUMsSUFBSSxHQUFHLElBQUE1QixpQkFBVyxFQUFDcUIsZ0JBQWdCLENBQUM7TUFDMUMsTUFBTXBFLFVBQVUsR0FBRyxJQUFJLENBQUNDLFdBQVcsQ0FBQ3FFLGFBQWEsRUFBRSxJQUFJLENBQUM7TUFDeEQsTUFBTTNCLHFCQUFxQixHQUFHLElBQUksQ0FBQ3ZDLHNCQUFzQixDQUFDa0UsYUFBYSxDQUFDO01BRXhFLElBQUksQ0FBQ0csU0FBUyxFQUFFO1FBQ2YsTUFBTTlELFdBQVcsR0FBRyxxQ0FBcUNnRSxJQUFJLE9BQU9oQyxxQkFBcUIsSUFBSTNDLFVBQVUsR0FDdEcrQixVQUFVLEdBQUcsWUFBWUEsVUFBVSxFQUFFLEdBQUcsRUFBRSxxQkFDdEI7UUFDckIsSUFBSSxDQUFDckMsUUFBUSxDQUFDO1VBQ2J0QixVQUFVLEVBQUUsS0FBSztVQUNqQmdHLGdCQUFnQixFQUFFdEUsU0FBUztVQUMzQndFLGFBQWEsRUFBRXhFLFNBQVM7VUFDeEJhO1FBQ0QsQ0FBQyxDQUFDO1FBQ0Y7TUFDRDtNQUVBLE1BQU1ELGNBQWMsR0FBRyxHQUFHaUUsSUFBSSxnQ0FBZ0NoQyxxQkFBcUIsSUFBSTNDLFVBQVUsR0FDaEcrQixVQUFVLEdBQUcsWUFBWUEsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUN4QztNQUVILElBQUkyQyxRQUFRLEVBQUU7UUFDYkEsUUFBUSxDQUFDTixnQkFBZ0IsRUFBRUUsYUFBYSxDQUFDO01BQzFDO01BRUEsSUFBSSxDQUFDNUUsUUFBUSxDQUFDO1FBQ2J0QixVQUFVLEVBQUUsS0FBSztRQUNqQmdHLGdCQUFnQixFQUFFdEUsU0FBUztRQUMzQndFLGFBQWEsRUFBRXhFLFNBQVM7UUFDeEJZO01BQ0QsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUVEO0lBRUE7SUFBQSxJQUFBM0MsZ0JBQUEsQ0FBQWYsT0FBQSwrQkFFdUI0SCxnQkFBMEIsSUFBSztNQUNyRCxJQUFJLENBQUNsRixRQUFRLENBQUM7UUFDYmtGLGdCQUFnQjtRQUNoQnJHLHNCQUFzQixFQUFFO01BQ3pCLENBQUMsQ0FBQztJQUNILENBQUM7SUFBQSxJQUFBUixnQkFBQSxDQUFBZixPQUFBLCtCQUVzQjZILGFBQXFCLElBQUs7TUFDaEQsT0FBTyxVQUFVLElBQUksQ0FBQzVFLFdBQVcsQ0FBQzRFLGFBQWEsQ0FBQyxFQUFFO0lBQ25ELENBQUM7SUFBQSxJQUFBOUcsZ0JBQUEsQ0FBQWYsT0FBQSwyQ0FFaUMsQ0FBQzRILGdCQUEwQixFQUFFRSxPQUEyQixLQUFLO01BQzlGLE1BQU07UUFBRXZFLE1BQU07UUFBRXdFO01BQWtCLENBQUMsR0FBRyxJQUFJLENBQUN2RyxLQUFLO01BQ2hELE1BQU13RyxLQUFLLEdBQUd6RSxNQUFNLElBQUksZ0JBQWdCLElBQUlBLE1BQU0sR0FBSUEsTUFBTSxHQUFhVCxTQUFTO01BRWxGLE1BQU1FLFVBQVUsR0FBRyxJQUFJLENBQUNDLFdBQVcsQ0FBQzJFLGdCQUFnQixDQUFDakYsSUFBSSxFQUFFLElBQUksQ0FBQztNQUNoRSxNQUFNZ0QscUJBQXFCLEdBQUcsSUFBSSxDQUFDdkMsc0JBQXNCLENBQUN3RSxnQkFBZ0IsQ0FBQ2pGLElBQUksQ0FBQztNQUNoRixNQUFNc0YsY0FBYyxHQUFHSCxPQUFPLGlCQUM3QixJQUFBekksV0FBQSxDQUFBNkksSUFBQTtRQUFHQyxTQUFTLEVBQUMsS0FBSztRQUFBQyxRQUFBLEdBQUMsMkJBQ08sbUJBQUEvSSxXQUFBLENBQUE2SSxJQUFBO1VBQUFFLFFBQUEsR0FBUSxTQUFPLEVBQUMsSUFBQXJDLGlCQUFXLEVBQUM2QixnQkFBZ0IsQ0FBQztRQUFBLENBQVMsQ0FBQyxPQUFHLEVBQUMsR0FBRyxFQUN0RmpDLHFCQUFxQixFQUFDLEdBQUMsRUFBQzNDLFVBQVUsRUFBQyxHQUNyQztNQUFBLENBQUcsQ0FDSDtNQUVELE1BQU1xRixzQkFBc0IsR0FBR0wsS0FBSyxFQUFFTSxjQUFjLENBQUNDLE1BQU0sQ0FBQ0MsRUFBRSxJQUFJQSxFQUFFLENBQUN2RyxNQUFNLEtBQUsyRixnQkFBZ0IsQ0FBQ25ELEVBQUUsQ0FBQztNQUVwRyxJQUNDLENBQUM0RCxzQkFBc0IsSUFDdkJBLHNCQUFzQixDQUFDeEYsTUFBTSxLQUFLLENBQUMsSUFDbkMrRSxnQkFBZ0IsQ0FBQ2pGLElBQUksS0FBSzhGLG1CQUFTLENBQUNDLFdBQVcsRUFDOUM7UUFDRCxPQUFPVCxjQUFjO01BQ3RCO01BRUEsTUFBTVUsb0NBQW9DLEdBQUdOLHNCQUFzQixDQUFDRSxNQUFNLENBQ3pFQyxFQUFFLElBQUlULGlCQUFpQixHQUFHUyxFQUFFLENBQUNJLGtCQUFrQixDQUFDLEVBQUVDLGlCQUNuRCxDQUFDO01BRUQsb0JBQ0MsSUFBQXhKLFdBQUEsQ0FBQTZJLElBQUE7UUFBQUUsUUFBQSxnQkFDQyxJQUFBL0ksV0FBQSxDQUFBNkksSUFBQTtVQUFBRSxRQUFBLEdBQUcsd0NBQ29DLG1CQUFBL0ksV0FBQSxDQUFBeUosR0FBQTtZQUFBVixRQUFBLEVBQVE7VUFBWSxDQUFRLENBQUMsS0FBQyxFQUFDLEdBQUcsRUFDdkVPLG9DQUFvQyxDQUFDOUYsTUFBTSxHQUFHLENBQUMsaUJBQy9DLElBQUF4RCxXQUFBLENBQUE2SSxJQUFBO1lBQUFFLFFBQUEsR0FBTSwyQ0FDb0MsbUJBQUEvSSxXQUFBLENBQUF5SixHQUFBO2NBQUFWLFFBQUEsRUFBUTtZQUFPLENBQVEsQ0FBQyxLQUNsRTtVQUFBLENBQU0sQ0FDTjtRQUFBLENBQ0MsQ0FBQyxlQUNKLElBQUEvSSxXQUFBLENBQUF5SixHQUFBO1VBQUFWLFFBQUEsRUFDRUMsc0JBQXNCLENBQUN4QyxHQUFHLENBQUMyQyxFQUFFLGlCQUM3QixJQUFBbkosV0FBQSxDQUFBeUosR0FBQTtZQUFBVixRQUFBLEVBQWlCSSxFQUFFLENBQUNPO1VBQVcsR0FBdEJQLEVBQUUsQ0FBQy9ELEVBQXdCLENBQ3BDO1FBQUMsQ0FDQyxDQUFDLEVBQ0p3RCxjQUFjO01BQUEsQ0FDWCxDQUFDO0lBRVIsQ0FBQztJQUFBLElBQUFsSCxnQkFBQSxDQUFBZixPQUFBLDBCQUVpQmdKLFlBQXFCLElBQUs7TUFDM0MsTUFBTTtRQUFFcEI7TUFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQzlELEtBQUs7TUFDdkMsSUFBSThELGdCQUFnQixLQUFLOUUsU0FBUyxFQUFFO1FBQ25DLE1BQU0sSUFBSW9DLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQztNQUN2RjtNQUNBLElBQUksQ0FBQ3hDLFFBQVEsQ0FBQztRQUNickIsVUFBVSxFQUFFMkgsWUFBWTtRQUN4QnpILHNCQUFzQixFQUFFLEtBQUs7UUFDN0JtQyxjQUFjLEVBQUVaLFNBQVM7UUFDekJhLFdBQVcsRUFBRWIsU0FBUztRQUN0QjtRQUNBOEUsZ0JBQWdCLEVBQUVvQixZQUFZLEdBQUdwQixnQkFBZ0IsR0FBRzlFO01BQ3JELENBQUMsQ0FBQztNQUNGLElBQUksQ0FBQ2tHLFlBQVksRUFBRTtRQUNsQjtNQUNEO01BQ0EsSUFBSSxDQUFDeEgsS0FBSyxDQUFDeUgsTUFBTSxDQUFDO1FBQ2pCeEUsRUFBRSxFQUFFbUQsZ0JBQWdCLENBQUNuRDtNQUN0QixDQUFDLENBQUM7SUFDSCxDQUFDO0lBQUEsSUFBQTFELGdCQUFBLENBQUFmLE9BQUEscUJBRVl5SCxTQUFrQixJQUFLO01BQ25DLE1BQU07UUFBRTFDLFVBQVU7UUFBRW1FO01BQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzFILEtBQUs7TUFDM0MsTUFBTTtRQUFFb0c7TUFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQzlELEtBQUs7TUFDdkMsSUFBSThELGdCQUFnQixLQUFLOUUsU0FBUyxFQUFFO1FBQ25DLE1BQU0sSUFBSW9DLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQztNQUN0RjtNQUVBLE1BQU15QyxJQUFJLEdBQUcsSUFBQTVCLGlCQUFXLEVBQUM2QixnQkFBZ0IsQ0FBQztNQUMxQyxJQUFJLENBQUNILFNBQVMsRUFBRTtRQUNmLE1BQU05RCxXQUFXLEdBQUcscUNBQXFDZ0UsSUFBSSxHQUM1RDVDLFVBQVUsR0FBRyxjQUFjQSxVQUFVLEVBQUUsR0FBRyxFQUFFLHFCQUN4QjtRQUNyQixJQUFJLENBQUNyQyxRQUFRLENBQUM7VUFDYnJCLFVBQVUsRUFBRSxLQUFLO1VBQ2pCdUcsZ0JBQWdCLEVBQUU5RSxTQUFTO1VBQzNCYTtRQUNELENBQUMsQ0FBQztRQUNGO01BQ0Q7TUFFQSxNQUFNRCxjQUFjLEdBQUcsR0FBR2lFLElBQUksNEJBQTRCNUMsVUFBVSxHQUFHLGNBQWNBLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRztNQUV6RyxJQUFJbUUsUUFBUSxFQUFFO1FBQ2JBLFFBQVEsQ0FBQ3RCLGdCQUFnQixDQUFDO01BQzNCO01BRUEsSUFBSSxDQUFDbEYsUUFBUSxDQUFDO1FBQ2JyQixVQUFVLEVBQUUsS0FBSztRQUNqQnVHLGdCQUFnQixFQUFFOUUsU0FBUztRQUMzQlk7TUFDRCxDQUFDLENBQUM7SUFDSCxDQUFDO0VBQUE7RUEvWkR5RixpQkFBaUJBLENBQUEsRUFBRztJQUNuQixJQUFJLENBQUNDLGlCQUFpQixDQUFDLElBQUksQ0FBQzVILEtBQUssQ0FBQztJQUNsQyxNQUFNO01BQUVQO0lBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQzZDLEtBQUs7SUFDckNDLHlCQUFZLENBQUNHLDJCQUEyQixDQUFDakQsY0FBYyxDQUFDO0VBQ3pEO0VBRUFvSSxrQkFBa0JBLENBQUNDLFNBQXlCLEVBQUU7SUFDN0MsTUFBTTtNQUFFN0gsVUFBVSxFQUFFOEgsY0FBYztNQUFFQyxXQUFXLEVBQUVDO0lBQWdCLENBQUMsR0FBR0gsU0FBUztJQUM5RSxNQUFNO01BQUU3SCxVQUFVO01BQUUrSCxXQUFXO01BQUV6RTtJQUFXLENBQUMsR0FBRyxJQUFJLENBQUN2RCxLQUFLO0lBRTFELElBQUksQ0FBQyxJQUFBa0ksZUFBTyxFQUFDSCxjQUFjLEVBQUU5SCxVQUFVLENBQUMsRUFBRTtNQUN6QyxJQUFJLENBQUMySCxpQkFBaUIsQ0FBQyxJQUFJLENBQUM1SCxLQUFLLENBQUM7SUFDbkM7O0lBRUE7SUFDQSxJQUNDLENBQUNpSSxlQUFlLEtBQUtFLHlCQUFZLENBQUNDLGFBQWEsSUFBSUgsZUFBZSxLQUFLRSx5QkFBWSxDQUFDRSxPQUFPLEtBQzNGTCxXQUFXLEtBQUtHLHlCQUFZLENBQUNHLEtBQUssRUFDakM7TUFDRCxJQUFJLENBQUNwSCxRQUFRLENBQUM7UUFDYmlCLFdBQVcsRUFBRSxtQ0FDWm9CLFVBQVUsR0FBRyx3QkFBd0JBLFVBQVUsRUFBRSxHQUFHLEVBQUU7TUFFeEQsQ0FBQyxDQUFDO0lBQ0g7O0lBRUE7SUFDQSxJQUFJMEUsZUFBZSxLQUFLRSx5QkFBWSxDQUFDSSxRQUFRLElBQUlQLFdBQVcsS0FBS0cseUJBQVksQ0FBQ0ksUUFBUSxFQUFFO01BQ3ZGLElBQUksQ0FBQ0MsU0FBUyxDQUFDUixXQUFXLEtBQUtHLHlCQUFZLENBQUNNLEtBQUssQ0FBQztJQUNuRDs7SUFFQTtJQUNBLElBQUlSLGVBQWUsS0FBS0UseUJBQVksQ0FBQ08sUUFBUSxJQUFJVixXQUFXLEtBQUtHLHlCQUFZLENBQUNPLFFBQVEsRUFBRTtNQUN2RixJQUFJLENBQUNDLFNBQVMsQ0FBQ1gsV0FBVyxLQUFLRyx5QkFBWSxDQUFDTSxLQUFLLENBQUM7SUFDbkQ7RUFDRDtFQThYQTs7RUFFQUcsTUFBTUEsQ0FBQSxFQUFHO0lBQ1IsTUFBTTtNQUNMWixXQUFXO01BQ1hhLFNBQVM7TUFDVEMsUUFBUTtNQUNSQyxhQUFhO01BQ2JDLGtCQUFrQjtNQUNsQkMsYUFBYTtNQUNiQyxnQkFBZ0I7TUFDaEJDLGdCQUFnQjtNQUNoQkMsV0FBVztNQUNYQyxZQUFZO01BQ1pDLGdCQUFnQjtNQUNoQkMsa0JBQWtCO01BQ2xCaEcsVUFBVTtNQUNWaUcsc0JBQXNCO01BQ3RCQztJQUNELENBQUMsR0FBRyxJQUFJLENBQUN6SixLQUFLO0lBQ2QsTUFBTTtNQUNMUixXQUFXO01BQ1hHLFFBQVE7TUFDUkMsVUFBVTtNQUNWQyxVQUFVO01BQ1ZDLGtCQUFrQjtNQUNsQkMsc0JBQXNCO01BQ3RCNkYsZ0JBQWdCO01BQ2hCUSxnQkFBZ0I7TUFDaEJsRSxjQUFjO01BQ2RFLGVBQWU7TUFDZkMsY0FBYztNQUNkRjtJQUNELENBQUMsR0FBRyxJQUFJLENBQUNHLEtBQUs7SUFFZCxNQUFNb0gsdUJBQXVCLEdBQUdILGtCQUFrQixHQUMvQyxJQUFBSSxjQUFNLEVBQUNMLGdCQUFnQixFQUFFLENBQUNNLENBQUMsRUFBRUMsR0FBRyxLQUFLLENBQUNOLGtCQUFrQixDQUFDTyxRQUFRLENBQUNELEdBQUcsQ0FBQyxDQUFDLEdBQ3ZFUCxnQkFBZ0I7SUFDbkIsTUFBTXpJLEtBQUssR0FBRy9CLE1BQU0sQ0FBQ2lMLElBQUksQ0FBQ1QsZ0JBQWdCLENBQUM7SUFDM0MsTUFBTVUscUJBQXFCLEdBQUcsQ0FBQ2xCLFFBQVEsSUFBSUQsU0FBUztJQUVwRCxvQkFDQyxJQUFBaEwsV0FBQSxDQUFBNkksSUFBQSxFQUFBN0ksV0FBQSxDQUFBb00sUUFBQTtNQUFBckQsUUFBQSxHQUNFLENBQUMsQ0FBQzFFLGNBQWMsaUJBQ2hCLElBQUFyRSxXQUFBLENBQUF5SixHQUFBLEVBQUMzSixjQUFBLENBQUF1TSxhQUFhO1FBQ2JqSCxFQUFFLEVBQUMscUJBQXFCO1FBQ3hCa0gsT0FBTyxFQUFDLFNBQVM7UUFDakJDLFdBQVc7UUFDWEMsT0FBTyxFQUFFQSxDQUFBLEtBQ1IsSUFBSSxDQUFDbkosUUFBUSxDQUFDO1VBQ2JnQixjQUFjLEVBQUVaO1FBQ2pCLENBQUMsQ0FDRDtRQUFBc0YsUUFBQSxlQUNELElBQUEvSSxXQUFBLENBQUF5SixHQUFBO1VBQUdYLFNBQVMsRUFBQyxVQUFVO1VBQUFDLFFBQUEsRUFBRTFFO1FBQWMsQ0FBSTtNQUFDLENBQzlCLENBQ2YsRUFDQSxDQUFDLENBQUNFLGVBQWUsaUJBQ2pCLElBQUF2RSxXQUFBLENBQUF5SixHQUFBLEVBQUMzSixjQUFBLENBQUF1TSxhQUFhO1FBQ2JqSCxFQUFFLEVBQUMsc0JBQXNCO1FBQ3pCa0gsT0FBTyxFQUFDLE1BQU07UUFDZEMsV0FBVztRQUNYQyxPQUFPLEVBQUVBLENBQUEsS0FDUixJQUFJLENBQUNuSixRQUFRLENBQUM7VUFDYmtCLGVBQWUsRUFBRWQ7UUFDbEIsQ0FBQyxDQUNEO1FBQUFzRixRQUFBLGVBQ0QsSUFBQS9JLFdBQUEsQ0FBQXlKLEdBQUE7VUFBR1gsU0FBUyxFQUFDLFVBQVU7VUFBQUMsUUFBQSxFQUFFeEU7UUFBZSxDQUFJO01BQUMsQ0FDL0IsQ0FDZixFQUNBLENBQUMsQ0FBQ0MsY0FBYyxpQkFDaEIsSUFBQXhFLFdBQUEsQ0FBQXlKLEdBQUEsRUFBQzNKLGNBQUEsQ0FBQXVNLGFBQWE7UUFDYmpILEVBQUUsRUFBQyxxQkFBcUI7UUFDeEJrSCxPQUFPLEVBQUMsU0FBUztRQUNqQkMsV0FBVztRQUNYQyxPQUFPLEVBQUVBLENBQUEsS0FDUixJQUFJLENBQUNuSixRQUFRLENBQUM7VUFDYm1CLGNBQWMsRUFBRWY7UUFDakIsQ0FBQyxDQUNEO1FBQUFzRixRQUFBLGVBQ0QsSUFBQS9JLFdBQUEsQ0FBQXlKLEdBQUE7VUFBR1gsU0FBUyxFQUFDLFVBQVU7VUFBQUMsUUFBQSxFQUFFdkU7UUFBYyxDQUFJO01BQUMsQ0FDOUIsQ0FDZixFQUNBLENBQUMsQ0FBQ0YsV0FBVyxpQkFDYixJQUFBdEUsV0FBQSxDQUFBeUosR0FBQSxFQUFDM0osY0FBQSxDQUFBdU0sYUFBYTtRQUNiakgsRUFBRSxFQUFDLGtCQUFrQjtRQUNyQmtILE9BQU8sRUFBQyxTQUFTO1FBQ2pCQyxXQUFXO1FBQ1hDLE9BQU8sRUFBRUEsQ0FBQSxLQUNSLElBQUksQ0FBQ25KLFFBQVEsQ0FBQztVQUNiaUIsV0FBVyxFQUFFYjtRQUNkLENBQUMsQ0FDRDtRQUFBc0YsUUFBQSxlQUNELElBQUEvSSxXQUFBLENBQUF5SixHQUFBO1VBQUdYLFNBQVMsRUFBQyxVQUFVO1VBQUFDLFFBQUEsRUFBRXpFO1FBQVcsQ0FBSTtNQUFDLENBQzNCLENBQ2YsRUFDQTZILHFCQUFxQixpQkFDckIsSUFBQW5NLFdBQUEsQ0FBQXlKLEdBQUEsRUFBQzNLLElBQUEsQ0FBQTJOLFlBQVk7UUFDWnJILEVBQUUsRUFBQyxvQkFBb0I7UUFDdkJzSCxRQUFRLEVBQUV0QixhQUFjO1FBQ3hCMUYsVUFBVSxFQUFFQSxVQUFXO1FBQ3ZCNkYsV0FBVyxFQUFFQSxXQUFZO1FBQ3pCRSxnQkFBZ0IsRUFBRUksdUJBQXdCO1FBQzFDRCxvQkFBb0IsRUFBRUEsb0JBQXFCO1FBQzNDaEksV0FBVyxFQUFFLElBQUksQ0FBQ0EsV0FBWTtRQUM5QitJLG1CQUFtQixFQUFFN0ssUUFBUztRQUM5QjhLLFdBQVcsRUFBRTNLLGtCQUFtQjtRQUNoQzRLLFlBQVksRUFBRSxJQUFJLENBQUNBO01BQWEsQ0FDaEMsQ0FDRCxFQUNBLENBQUMsQ0FBQ2xCLHNCQUFzQixJQUFJQSxzQkFBc0IsQ0FBQ1EscUJBQXFCLENBQUMsZUFDMUUsSUFBQW5NLFdBQUEsQ0FBQXlKLEdBQUEsRUFBQ2hMLGVBQUEsQ0FBQXFPLEdBQUc7UUFBQ2hFLFNBQVMsRUFBQyxLQUFLO1FBQUFDLFFBQUEsZUFDbkIsSUFBQS9JLFdBQUEsQ0FBQXlKLEdBQUEsRUFBQ2hMLGVBQUEsQ0FBQXNPLEdBQUc7VUFBQ0MsRUFBRSxFQUFFLEVBQUc7VUFBQWpFLFFBQUEsRUFDVm9CLFdBQVcsS0FBS0cseUJBQVksQ0FBQ0UsT0FBTyxnQkFDcEMsSUFBQXhLLFdBQUEsQ0FBQXlKLEdBQUEsRUFBQzVLLFFBQUEsQ0FBQW9PLE9BQU8sSUFBRSxDQUFDLEdBQ1J0TCxXQUFXLENBQUM2QixNQUFNLEdBQUcsQ0FBQyxnQkFDekIsSUFBQXhELFdBQUEsQ0FBQXlKLEdBQUEsRUFBQzFKLFFBQUEsQ0FBQW1OLGdCQUFnQixDQUFDQyxRQUFRO1lBQ3pCQyxLQUFLLEVBQUU7Y0FDTi9CLGdCQUFnQixFQUFFQSxnQkFBZ0IsSUFBSUosUUFBUTtjQUM5Q0ssZ0JBQWdCLEVBQUVBLGdCQUFnQixJQUFJTCxRQUFRO2NBQzlDRCxTQUFTLEVBQUVtQixxQkFBcUI7Y0FDaENqQixhQUFhO2NBQ2JDLGtCQUFrQjtjQUNsQm5JLEtBQUs7Y0FDTHdJLFlBQVk7Y0FDWjVILFdBQVcsRUFBRSxJQUFJLENBQUNBLFdBQVc7Y0FDN0JtRSxnQkFBZ0I7Y0FDaEJoRyxVQUFVO2NBQ1ZzTCxjQUFjLEVBQUUsSUFBSSxDQUFDQSxjQUFjO2NBQ25DOUUsZ0JBQWdCO2NBQ2hCdkcsVUFBVTtjQUNWc0wsY0FBYyxFQUFFLElBQUksQ0FBQ0M7WUFDdEIsQ0FBRTtZQUFBeEUsUUFBQSxlQUNGLElBQUEvSSxXQUFBLENBQUF5SixHQUFBLEVBQUMxSyxNQUFBLENBQUF5TyxjQUFjO2NBQUNwSSxFQUFFLEVBQUMsc0JBQXNCO2NBQUNxSSxLQUFLLEVBQUU5TDtZQUFZLENBQUU7VUFBQyxDQUN0QyxDQUFDLEdBQ3pCO1FBQUksQ0FDSjtNQUFDLENBQ0YsQ0FBQyxFQUNMLENBQUMsQ0FBQzRHLGdCQUFnQixpQkFDbEIsSUFBQXZJLFdBQUEsQ0FBQXlKLEdBQUEsRUFBQzdLLFlBQUEsQ0FBQThPLFdBQVc7UUFDWHRJLEVBQUUsRUFBQyxpQkFBaUI7UUFDcEJ1SSxNQUFNLEVBQUV6TCxzQkFBdUI7UUFDL0IwTCxLQUFLLEVBQUUsSUFBSSxDQUFDQyxtQkFBbUIsQ0FBQ3RGLGdCQUFnQixDQUFDakYsSUFBSSxDQUFFO1FBQ3ZEb0csV0FBVyxFQUFFLElBQUksQ0FBQ29FLCtCQUErQixDQUFDdkYsZ0JBQWdCLENBQUU7UUFDcEV3RixTQUFTLEVBQUVBLENBQUEsS0FBTSxJQUFJLENBQUNULGNBQWMsQ0FBQyxJQUFJLENBQUU7UUFDM0NVLFdBQVcsRUFBQyxzQkFBc0I7UUFDbENDLFFBQVEsRUFBRUEsQ0FBQSxLQUFNLElBQUksQ0FBQ1gsY0FBYyxDQUFDLEtBQUssQ0FBRTtRQUMzQ1ksVUFBVSxFQUFDO01BQXVCLENBQ2xDLENBQ0Q7SUFBQSxDQUNBLENBQUM7RUFFTDtBQUNEO0FBQUNDLE9BQUEsQ0FBQS9NLFNBQUEsR0FBQUEsU0FBQTtBQUVNLE1BQU1nTixlQUFlLEdBQUdBLENBQUMzSixLQUFxQixFQUFFNEosUUFBMkIsS0FBMEI7RUFDM0csTUFBTUMsaUJBQWlCLEdBQUcsSUFBQUMsd0NBQTBCLEVBQUNGLFFBQVEsQ0FBQ0csMEJBQTBCLEVBQUUsSUFBQUMsNEJBQWMsRUFBQ2hLLEtBQUssQ0FBQyxDQUFDO0VBRWhILE1BQU11RyxTQUFTLEdBQ2RzRCxpQkFBaUIsS0FDaEJELFFBQVEsQ0FBQ25LLE1BQU0sR0FDYixJQUFBd0ssd0NBQTBCLEVBQUNMLFFBQVEsQ0FBQ0csMEJBQTBCLEVBQUUsSUFBQUMsNEJBQWMsRUFBQ2hLLEtBQUssRUFBRTRKLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUMxRyxLQUFLLENBQUM7RUFFVixPQUFPO0lBQ05yRCxTQUFTO0lBQ1RFLGFBQWEsRUFDWkYsU0FBUyxLQUNScUQsUUFBUSxDQUFDbkssTUFBTSxJQUFJbUssUUFBUSxDQUFDTSw2QkFBNkIsR0FDdkQsSUFBQUQsd0NBQTBCLEVBQzFCTCxRQUFRLENBQUNNLDZCQUE2QixFQUN0QyxJQUFBRiw0QkFBYyxFQUFDaEssS0FBSyxFQUFFNEosUUFBUSxFQUFFLFFBQVEsQ0FDekMsQ0FBQyxHQUNBLEtBQUs7RUFDVixDQUFDO0FBQ0YsQ0FBQztBQUFBRixPQUFBLENBQUFDLGVBQUEsR0FBQUEsZUFBQTtBQUFBLElBQUFRLFFBQUEsR0FBQVQsT0FBQSxDQUFBeE4sT0FBQSxHQUVjLElBQUFrTyxtQkFBTyxFQUFDVCxlQUFlLENBQUMsQ0FBQ2hOLFNBQVMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==