@payloadcms/ui 3.0.0-alpha.0 → 3.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/dist/@types/assets.d.js +3 -0
  2. package/dist/config.js +13 -0
  3. package/dist/elements/ArrayAction/index.js +120 -0
  4. package/dist/elements/ArrayAction/types.js +6 -0
  5. package/dist/elements/Autosave/index.d.ts.map +1 -1
  6. package/dist/elements/Autosave/index.js +207 -0
  7. package/dist/elements/Autosave/types.js +6 -0
  8. package/dist/elements/Banner/index.js +52 -0
  9. package/dist/elements/Banner/types.js +6 -0
  10. package/dist/elements/Button/index.js +166 -0
  11. package/dist/elements/Button/types.js +6 -0
  12. package/dist/elements/Card/index.js +46 -0
  13. package/dist/elements/Card/types.js +6 -0
  14. package/dist/elements/CodeEditor/CodeEditor.js +53 -0
  15. package/dist/elements/CodeEditor/index.js +68 -0
  16. package/dist/elements/CodeEditor/types.js +6 -0
  17. package/dist/elements/Collapsible/index.js +128 -0
  18. package/dist/elements/Collapsible/provider.js +90 -0
  19. package/dist/elements/Collapsible/types.js +6 -0
  20. package/dist/elements/ColumnSelector/index.js +109 -0
  21. package/dist/elements/ColumnSelector/types.js +6 -0
  22. package/dist/elements/CopyToClipboard/index.js +98 -0
  23. package/dist/elements/CopyToClipboard/types.js +6 -0
  24. package/dist/elements/DatePicker/DatePicker.js +147 -0
  25. package/dist/elements/DatePicker/index.js +63 -0
  26. package/dist/elements/DatePicker/types.js +6 -0
  27. package/dist/elements/DeleteDocument/index.js +178 -0
  28. package/dist/elements/DeleteDocument/types.js +6 -0
  29. package/dist/elements/DeleteMany/index.js +176 -0
  30. package/dist/elements/DeleteMany/types.js +6 -0
  31. package/dist/elements/DocumentControls/index.d.ts +2 -2
  32. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  33. package/dist/elements/DocumentControls/index.js +159 -0
  34. package/dist/elements/DocumentDrawer/DrawerContent.js +219 -0
  35. package/dist/elements/DocumentDrawer/index.js +185 -0
  36. package/dist/elements/DocumentDrawer/types.js +6 -0
  37. package/dist/elements/DocumentFields/index.js +55 -0
  38. package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js +23 -0
  39. package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js +42 -0
  40. package/dist/elements/DocumentHeader/Tabs/Tab/index.js +105 -0
  41. package/dist/elements/DocumentHeader/Tabs/getCustomViews.js +48 -0
  42. package/dist/elements/DocumentHeader/Tabs/getViewConfig.js +24 -0
  43. package/dist/elements/DocumentHeader/Tabs/index.js +84 -0
  44. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js +27 -0
  45. package/dist/elements/DocumentHeader/Tabs/tabs/index.js +75 -0
  46. package/dist/elements/DocumentHeader/index.js +81 -0
  47. package/dist/elements/DraggableSortable/DraggableSortableItem/index.js +82 -0
  48. package/dist/elements/DraggableSortable/DraggableSortableItem/types.js +6 -0
  49. package/dist/elements/DraggableSortable/index.js +96 -0
  50. package/dist/elements/DraggableSortable/types.js +6 -0
  51. package/dist/elements/DraggableSortable/useDraggableSortable/index.js +32 -0
  52. package/dist/elements/DraggableSortable/useDraggableSortable/types.js +6 -0
  53. package/dist/elements/Drawer/index.js +156 -0
  54. package/dist/elements/Drawer/types.js +6 -0
  55. package/dist/elements/Drawer/useDrawerSlug.js +23 -0
  56. package/dist/elements/Dropzone/index.js +117 -0
  57. package/dist/elements/DuplicateDocument/index.js +217 -0
  58. package/dist/elements/DuplicateDocument/types.js +6 -0
  59. package/dist/elements/EditMany/index.js +274 -0
  60. package/dist/elements/EditMany/types.js +6 -0
  61. package/dist/elements/EditUpload/index.js +390 -0
  62. package/dist/elements/ErrorPill/index.js +37 -0
  63. package/dist/elements/ErrorPill/types.js +6 -0
  64. package/dist/elements/FieldSelect/index.js +138 -0
  65. package/dist/elements/FileDetails/FileMeta/index.js +96 -0
  66. package/dist/elements/FileDetails/FileMeta/types.js +6 -0
  67. package/dist/elements/FileDetails/index.js +59 -0
  68. package/dist/elements/FileDetails/types.js +6 -0
  69. package/dist/elements/GenerateConfirmation/index.js +72 -0
  70. package/dist/elements/GenerateConfirmation/types.js +6 -0
  71. package/dist/elements/GetFilterOptions/index.js +57 -0
  72. package/dist/elements/Gutter/index.js +72 -0
  73. package/dist/elements/Hamburger/index.js +54 -0
  74. package/dist/elements/Header/index.d.ts.map +1 -1
  75. package/dist/elements/Header/index.js +140 -0
  76. package/dist/elements/HydrateClientUser/index.js +28 -0
  77. package/dist/elements/IDLabel/index.js +28 -0
  78. package/dist/elements/ListControls/getTextFieldsToBeSearched.js +21 -0
  79. package/dist/elements/ListControls/index.js +149 -0
  80. package/dist/elements/ListControls/types.js +6 -0
  81. package/dist/elements/ListDrawer/DrawerContent.js +315 -0
  82. package/dist/elements/ListDrawer/index.js +198 -0
  83. package/dist/elements/ListDrawer/types.js +6 -0
  84. package/dist/elements/ListSelection/index.js +83 -0
  85. package/dist/elements/Loading/index.js +103 -0
  86. package/dist/elements/LoadingOverlay/index.js +130 -0
  87. package/dist/elements/LoadingOverlay/reducer.js +49 -0
  88. package/dist/elements/LoadingOverlay/types.js +6 -0
  89. package/dist/elements/Localizer/LocalizerLabel/index.js +43 -0
  90. package/dist/elements/Localizer/index.js +121 -0
  91. package/dist/elements/Logout/index.d.ts.map +1 -1
  92. package/dist/elements/Logout/index.js +49 -0
  93. package/dist/elements/Nav/NavHamburger/index.js +34 -0
  94. package/dist/elements/Nav/NavToggler/index.js +53 -0
  95. package/dist/elements/Nav/NavWrapper/index.js +34 -0
  96. package/dist/elements/Nav/context.js +150 -0
  97. package/dist/elements/Nav/index.d.ts.map +1 -1
  98. package/dist/elements/Nav/index.js +106 -0
  99. package/dist/elements/NavGroup/index.js +129 -0
  100. package/dist/elements/Pagination/ClickableArrow/index.js +36 -0
  101. package/dist/elements/Pagination/ClickableArrow/types.js +6 -0
  102. package/dist/elements/Pagination/Page/index.js +33 -0
  103. package/dist/elements/Pagination/Page/types.js +6 -0
  104. package/dist/elements/Pagination/Separator/index.js +22 -0
  105. package/dist/elements/Pagination/index.js +126 -0
  106. package/dist/elements/Pagination/types.js +6 -0
  107. package/dist/elements/PerPage/index.d.ts.map +1 -1
  108. package/dist/elements/PerPage/index.js +115 -0
  109. package/dist/elements/Pill/index.js +93 -0
  110. package/dist/elements/Pill/types.js +6 -0
  111. package/dist/elements/Popup/PopupButtonList/index.d.ts +2 -2
  112. package/dist/elements/Popup/PopupButtonList/index.d.ts.map +1 -1
  113. package/dist/elements/Popup/PopupButtonList/index.js +118 -0
  114. package/dist/elements/Popup/PopupTrigger/index.js +51 -0
  115. package/dist/elements/Popup/PopupTrigger/types.js +6 -0
  116. package/dist/elements/Popup/index.js +193 -0
  117. package/dist/elements/Popup/types.js +6 -0
  118. package/dist/elements/PreviewButton/index.js +129 -0
  119. package/dist/elements/PreviewSizes/index.js +163 -0
  120. package/dist/elements/Publish/index.js +153 -0
  121. package/dist/elements/PublishMany/index.js +169 -0
  122. package/dist/elements/PublishMany/types.js +6 -0
  123. package/dist/elements/ReactSelect/ClearIndicator/index.js +31 -0
  124. package/dist/elements/ReactSelect/Control/index.js +49 -0
  125. package/dist/elements/ReactSelect/MultiValue/index.js +55 -0
  126. package/dist/elements/ReactSelect/MultiValueLabel/index.js +34 -0
  127. package/dist/elements/ReactSelect/MultiValueRemove/index.js +48 -0
  128. package/dist/elements/ReactSelect/SingleValue/index.js +30 -0
  129. package/dist/elements/ReactSelect/ValueContainer/index.js +29 -0
  130. package/dist/elements/ReactSelect/index.js +177 -0
  131. package/dist/elements/ReactSelect/types.js +6 -0
  132. package/dist/elements/RenderCustomComponent/index.js +28 -0
  133. package/dist/elements/RenderCustomComponent/types.js +6 -0
  134. package/dist/elements/RenderTitle/index.js +42 -0
  135. package/dist/elements/RenderTitle/types.js +6 -0
  136. package/dist/elements/Save/index.js +103 -0
  137. package/dist/elements/SaveDraft/index.js +147 -0
  138. package/dist/elements/SearchFilter/index.d.ts.map +1 -1
  139. package/dist/elements/SearchFilter/index.js +139 -0
  140. package/dist/elements/SearchFilter/types.js +6 -0
  141. package/dist/elements/SelectAll/index.js +35 -0
  142. package/dist/elements/SelectRow/index.js +31 -0
  143. package/dist/elements/ShimmerEffect/index.js +96 -0
  144. package/dist/elements/SortColumn/index.d.ts.map +1 -1
  145. package/dist/elements/SortColumn/index.js +139 -0
  146. package/dist/elements/SortColumn/types.js +6 -0
  147. package/dist/elements/SortComplex/index.d.ts.map +1 -1
  148. package/dist/elements/SortComplex/index.js +157 -0
  149. package/dist/elements/SortComplex/types.js +6 -0
  150. package/dist/elements/Status/index.js +202 -0
  151. package/dist/elements/StayLoggedIn/index.d.ts.map +1 -1
  152. package/dist/elements/StayLoggedIn/index.js +57 -0
  153. package/dist/elements/StayLoggedIn/types.js +6 -0
  154. package/dist/elements/StepNav/SetStepNav.js +25 -0
  155. package/dist/elements/StepNav/index.d.ts.map +1 -1
  156. package/dist/elements/StepNav/index.js +127 -0
  157. package/dist/elements/StepNav/types.js +6 -0
  158. package/dist/elements/Table/TableCellProvider/index.js +47 -0
  159. package/dist/elements/Table/index.js +63 -0
  160. package/dist/elements/Table/types.js +6 -0
  161. package/dist/elements/TableColumns/buildColumns.js +77 -0
  162. package/dist/elements/TableColumns/columnReducer.js +47 -0
  163. package/dist/elements/TableColumns/index.js +199 -0
  164. package/dist/elements/Thumbnail/index.js +89 -0
  165. package/dist/elements/Thumbnail/types.js +6 -0
  166. package/dist/elements/ThumbnailCard/index.js +54 -0
  167. package/dist/elements/ThumbnailCard/types.js +6 -0
  168. package/dist/elements/Tooltip/index.js +114 -0
  169. package/dist/elements/Tooltip/types.js +6 -0
  170. package/dist/elements/Translation/index.js +81 -0
  171. package/dist/elements/UnpublishMany/index.js +169 -0
  172. package/dist/elements/UnpublishMany/types.js +6 -0
  173. package/dist/elements/Upload/index.js +250 -0
  174. package/dist/elements/Upload/types.js +6 -0
  175. package/dist/elements/ViewDescription/index.js +38 -0
  176. package/dist/elements/ViewDescription/types.js +21 -0
  177. package/dist/elements/WhereBuilder/Condition/Date/index.js +32 -0
  178. package/dist/elements/WhereBuilder/Condition/Date/types.js +6 -0
  179. package/dist/elements/WhereBuilder/Condition/Number/index.js +33 -0
  180. package/dist/elements/WhereBuilder/Condition/Number/types.js +6 -0
  181. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +337 -0
  182. package/dist/elements/WhereBuilder/Condition/Relationship/optionsReducer.js +98 -0
  183. package/dist/elements/WhereBuilder/Condition/Relationship/types.js +6 -0
  184. package/dist/elements/WhereBuilder/Condition/Select/index.js +96 -0
  185. package/dist/elements/WhereBuilder/Condition/Select/types.js +6 -0
  186. package/dist/elements/WhereBuilder/Condition/Text/index.js +33 -0
  187. package/dist/elements/WhereBuilder/Condition/Text/types.js +6 -0
  188. package/dist/elements/WhereBuilder/Condition/index.js +203 -0
  189. package/dist/elements/WhereBuilder/Condition/types.js +6 -0
  190. package/dist/elements/WhereBuilder/field-types.js +185 -0
  191. package/dist/elements/WhereBuilder/index.js +235 -0
  192. package/dist/elements/WhereBuilder/reducer.js +88 -0
  193. package/dist/elements/WhereBuilder/transformWhereQuery.js +57 -0
  194. package/dist/elements/WhereBuilder/types.js +6 -0
  195. package/dist/elements/WhereBuilder/validateWhereQuery.js +46 -0
  196. package/dist/exports/assets.js +27 -0
  197. package/dist/exports/elements.js +226 -0
  198. package/dist/exports/forms.js +158 -0
  199. package/dist/exports/graphics.js +27 -0
  200. package/dist/exports/hooks.js +55 -0
  201. package/dist/exports/icons.js +82 -0
  202. package/dist/exports/index.js +28 -0
  203. package/dist/exports/providers.js +116 -0
  204. package/dist/exports/templates.js +22 -0
  205. package/dist/exports/types.js +6 -0
  206. package/dist/exports/utilities.js +62 -0
  207. package/dist/forms/Error/index.js +43 -0
  208. package/dist/forms/FieldDescription/index.js +38 -0
  209. package/dist/forms/FieldDescription/types.js +6 -0
  210. package/dist/forms/FieldPathProvider/index.js +44 -0
  211. package/dist/forms/FieldPathProvider/types.js +6 -0
  212. package/dist/forms/Form/buildFieldSchemaMap.js +54 -0
  213. package/dist/forms/Form/buildInitialState.js +26 -0
  214. package/dist/forms/Form/context.js +84 -0
  215. package/dist/forms/Form/createNestedFieldPath.js +25 -0
  216. package/dist/forms/Form/errorMessages.js +15 -0
  217. package/dist/forms/Form/fieldReducer.js +286 -0
  218. package/dist/forms/Form/getDataByPath.js +29 -0
  219. package/dist/forms/Form/getSiblingData.js +50 -0
  220. package/dist/forms/Form/index.js +565 -0
  221. package/dist/forms/Form/initContextState.js +45 -0
  222. package/dist/forms/Form/mergeServerFormState.js +45 -0
  223. package/dist/forms/Form/reduceFieldsToValues.js +34 -0
  224. package/dist/forms/Form/rows.js +53 -0
  225. package/dist/forms/Form/types.js +6 -0
  226. package/dist/forms/Label/index.js +36 -0
  227. package/dist/forms/NullifyField/index.js +103 -0
  228. package/dist/forms/RenderFields/RenderField.js +30 -0
  229. package/dist/forms/RenderFields/index.js +66 -0
  230. package/dist/forms/RenderFields/types.js +6 -0
  231. package/dist/forms/RowLabel/index.js +50 -0
  232. package/dist/forms/RowLabel/types.js +21 -0
  233. package/dist/forms/Submit/index.js +75 -0
  234. package/dist/forms/WatchChildErrors/buildPathSegments.js +37 -0
  235. package/dist/forms/WatchChildErrors/getFieldStateFromPaths.js +35 -0
  236. package/dist/forms/WatchChildErrors/getNestedFieldState.js +28 -0
  237. package/dist/forms/WatchChildErrors/index.js +41 -0
  238. package/dist/forms/fields/Array/ArrayRow.js +87 -0
  239. package/dist/forms/fields/Array/index.js +305 -0
  240. package/dist/forms/fields/Array/types.js +6 -0
  241. package/dist/forms/fields/Blocks/BlockRow.js +101 -0
  242. package/dist/forms/fields/Blocks/BlocksDrawer/BlockSearch/index.js +37 -0
  243. package/dist/forms/fields/Blocks/BlocksDrawer/index.js +134 -0
  244. package/dist/forms/fields/Blocks/BlocksDrawer/types.js +6 -0
  245. package/dist/forms/fields/Blocks/RowActions.js +52 -0
  246. package/dist/forms/fields/Blocks/SectionTitle/index.js +54 -0
  247. package/dist/forms/fields/Blocks/SectionTitle/types.js +6 -0
  248. package/dist/forms/fields/Blocks/index.js +317 -0
  249. package/dist/forms/fields/Blocks/types.js +6 -0
  250. package/dist/forms/fields/Checkbox/Input.js +56 -0
  251. package/dist/forms/fields/Checkbox/index.js +134 -0
  252. package/dist/forms/fields/Checkbox/types.js +6 -0
  253. package/dist/forms/fields/Code/index.js +115 -0
  254. package/dist/forms/fields/Code/types.js +6 -0
  255. package/dist/forms/fields/Collapsible/index.js +169 -0
  256. package/dist/forms/fields/Collapsible/types.js +6 -0
  257. package/dist/forms/fields/ConfirmPassword/index.js +112 -0
  258. package/dist/forms/fields/ConfirmPassword/types.js +6 -0
  259. package/dist/forms/fields/DateTime/index.js +115 -0
  260. package/dist/forms/fields/DateTime/types.js +6 -0
  261. package/dist/forms/fields/Email/index.js +121 -0
  262. package/dist/forms/fields/Email/types.js +6 -0
  263. package/dist/forms/fields/Group/index.js +127 -0
  264. package/dist/forms/fields/Group/provider.js +74 -0
  265. package/dist/forms/fields/Group/types.js +6 -0
  266. package/dist/forms/fields/HiddenInput/index.js +88 -0
  267. package/dist/forms/fields/HiddenInput/types.js +6 -0
  268. package/dist/forms/fields/JSON/index.js +137 -0
  269. package/dist/forms/fields/JSON/types.js +6 -0
  270. package/dist/forms/fields/Number/index.js +212 -0
  271. package/dist/forms/fields/Number/types.js +6 -0
  272. package/dist/forms/fields/Password/index.js +116 -0
  273. package/dist/forms/fields/Password/types.js +6 -0
  274. package/dist/forms/fields/Point/index.js +147 -0
  275. package/dist/forms/fields/Point/types.js +6 -0
  276. package/dist/forms/fields/RadioGroup/Radio/index.js +45 -0
  277. package/dist/forms/fields/RadioGroup/index.js +147 -0
  278. package/dist/forms/fields/RadioGroup/types.js +6 -0
  279. package/dist/forms/fields/Relationship/AddNew/index.js +216 -0
  280. package/dist/forms/fields/Relationship/AddNew/types.js +6 -0
  281. package/dist/forms/fields/Relationship/AddNew/useRelatedCollections.js +27 -0
  282. package/dist/forms/fields/Relationship/createRelationMap.js +59 -0
  283. package/dist/forms/fields/Relationship/findOptionsByValue.js +45 -0
  284. package/dist/forms/fields/Relationship/index.js +509 -0
  285. package/dist/forms/fields/Relationship/optionsReducer.js +126 -0
  286. package/dist/forms/fields/Relationship/select-components/MultiValueLabel/index.js +109 -0
  287. package/dist/forms/fields/Relationship/select-components/SingleValue/index.js +108 -0
  288. package/dist/forms/fields/Relationship/types.js +6 -0
  289. package/dist/forms/fields/RichText/index.js +16 -0
  290. package/dist/forms/fields/RichText/types.js +6 -0
  291. package/dist/forms/fields/Row/index.js +42 -0
  292. package/dist/forms/fields/Row/provider.js +74 -0
  293. package/dist/forms/fields/Row/types.js +6 -0
  294. package/dist/forms/fields/Select/index.js +183 -0
  295. package/dist/forms/fields/Select/types.js +6 -0
  296. package/dist/forms/fields/Tabs/Tab/index.js +85 -0
  297. package/dist/forms/fields/Tabs/index.js +167 -0
  298. package/dist/forms/fields/Tabs/provider.js +74 -0
  299. package/dist/forms/fields/Tabs/types.js +6 -0
  300. package/dist/forms/fields/Text/index.js +194 -0
  301. package/dist/forms/fields/Text/types.js +6 -0
  302. package/dist/forms/fields/Textarea/index.js +133 -0
  303. package/dist/forms/fields/Textarea/types.js +6 -0
  304. package/dist/forms/fields/UI/index.js +16 -0
  305. package/dist/forms/fields/Upload/Input.js +3 -0
  306. package/dist/forms/fields/Upload/index.js +210 -0
  307. package/dist/forms/fields/Upload/types.js +6 -0
  308. package/dist/forms/fields/getFilterOptionsQuery.js +39 -0
  309. package/dist/forms/fields/index.js +67 -0
  310. package/dist/forms/fields/shared.js +29 -0
  311. package/dist/forms/useField/index.js +169 -0
  312. package/dist/forms/useField/types.js +6 -0
  313. package/dist/forms/utilities/buildStateFromSchema/addFieldStatePromise.js +335 -0
  314. package/dist/forms/utilities/buildStateFromSchema/buildStateFromSchema.spec.js +76 -0
  315. package/dist/forms/utilities/buildStateFromSchema/index.js +35 -0
  316. package/dist/forms/utilities/buildStateFromSchema/iterateFields.js +48 -0
  317. package/dist/forms/withCondition/WatchCondition.js +66 -0
  318. package/dist/forms/withCondition/index.js +33 -0
  319. package/dist/graphics/Account/Default/index.js +43 -0
  320. package/dist/graphics/Account/Gravatar/index.js +42 -0
  321. package/dist/graphics/Account/index.js +50 -0
  322. package/dist/graphics/DefaultBlockImage/index.js +84 -0
  323. package/dist/graphics/ExternalLink/index.js +34 -0
  324. package/dist/graphics/File/index.js +36 -0
  325. package/dist/graphics/Icon/index.js +64 -0
  326. package/dist/graphics/Logo/index.js +60 -0
  327. package/dist/graphics/Search/index.js +42 -0
  328. package/dist/hooks/useAdminThumbnail.js +17 -0
  329. package/dist/hooks/useDebounce.js +31 -0
  330. package/dist/hooks/useDebouncedCallback.js +29 -0
  331. package/dist/hooks/useDebouncedEffect.js +32 -0
  332. package/dist/hooks/useDelay.js +82 -0
  333. package/dist/hooks/useDelayedRender.js +97 -0
  334. package/dist/hooks/useHotkey.js +129 -0
  335. package/dist/hooks/useIntersect.js +39 -0
  336. package/dist/hooks/usePayloadAPI.js +94 -0
  337. package/dist/hooks/useResize.js +59 -0
  338. package/dist/hooks/useThrottledEffect.js +31 -0
  339. package/dist/hooks/useThumbnail.js +57 -0
  340. package/dist/hooks/useUseAsTitle.js +19 -0
  341. package/dist/icons/Calendar/index.js +48 -0
  342. package/dist/icons/Check/index.js +34 -0
  343. package/dist/icons/Chevron/index.js +36 -0
  344. package/dist/icons/CloseMenu/index.js +39 -0
  345. package/dist/icons/CodeBlock/index.js +32 -0
  346. package/dist/icons/Copy/index.js +33 -0
  347. package/dist/icons/DragHandle/index.js +57 -0
  348. package/dist/icons/Edit/index.js +37 -0
  349. package/dist/icons/Line/index.js +30 -0
  350. package/dist/icons/Link/index.js +33 -0
  351. package/dist/icons/LogOut/index.js +37 -0
  352. package/dist/icons/Menu/index.js +45 -0
  353. package/dist/icons/MinimizeMaximize/index.js +87 -0
  354. package/dist/icons/More/index.js +42 -0
  355. package/dist/icons/Plus/index.js +36 -0
  356. package/dist/icons/Search/index.js +36 -0
  357. package/dist/icons/Swap/index.js +43 -0
  358. package/dist/icons/X/index.js +41 -0
  359. package/dist/index.js +20 -0
  360. package/dist/providers/ActionsProvider/index.js +89 -0
  361. package/dist/providers/Auth/HydrateClientUser/index.js +28 -0
  362. package/dist/providers/Auth/index.js +373 -0
  363. package/dist/providers/Auth/types.js +6 -0
  364. package/dist/providers/ClientFunction/index.js +65 -0
  365. package/dist/providers/ComponentMapProvider/index.js +98 -0
  366. package/dist/providers/Config/index.js +70 -0
  367. package/dist/providers/CustomProvider/index.js +38 -0
  368. package/dist/providers/DocumentEvents/index.js +77 -0
  369. package/dist/providers/DocumentEvents/types.js +6 -0
  370. package/dist/providers/DocumentInfo/SetDocumentInfo/index.js +34 -0
  371. package/dist/providers/DocumentInfo/index.js +353 -0
  372. package/dist/providers/DocumentInfo/types.js +6 -0
  373. package/dist/providers/EditDepth/index.js +71 -0
  374. package/dist/providers/FormQueryParams/index.js +77 -0
  375. package/dist/providers/ListInfo/index.js +78 -0
  376. package/dist/providers/ListInfo/types.js +6 -0
  377. package/dist/providers/Locale/index.js +122 -0
  378. package/dist/providers/OperationProvider/index.js +71 -0
  379. package/dist/providers/Params/index.js +72 -0
  380. package/dist/providers/Portal/index.js +20 -0
  381. package/dist/providers/Preferences/index.js +184 -0
  382. package/dist/providers/Root/index.js +103 -0
  383. package/dist/providers/SearchParams/index.js +119 -0
  384. package/dist/providers/SearchParams/types.js +6 -0
  385. package/dist/providers/SelectionProvider/index.js +218 -0
  386. package/dist/providers/Theme/index.js +123 -0
  387. package/dist/providers/Theme/types.js +6 -0
  388. package/dist/providers/Theme/utilities.js +35 -0
  389. package/dist/providers/Translation/index.js +92 -0
  390. package/dist/templates/Default/NavHamburger/index.js +28 -0
  391. package/dist/templates/Default/Wrapper/index.js +32 -0
  392. package/dist/templates/Default/index.js +88 -0
  393. package/dist/templates/Default/types.js +6 -0
  394. package/dist/templates/Minimal/index.js +34 -0
  395. package/dist/templates/Minimal/types.js +6 -0
  396. package/dist/utilities/api.js +98 -0
  397. package/dist/utilities/arraysHaveSameStrings.js +28 -0
  398. package/dist/utilities/buildComponentMap/index.js +101 -0
  399. package/dist/utilities/buildComponentMap/mapFields.js +318 -0
  400. package/dist/utilities/buildComponentMap/types.js +6 -0
  401. package/dist/utilities/buildFieldSchemaMap/index.js +36 -0
  402. package/dist/utilities/buildFieldSchemaMap/traverseFields.js +94 -0
  403. package/dist/utilities/buildFieldSchemaMap/types.js +6 -0
  404. package/dist/utilities/canUseDOM.js +13 -0
  405. package/dist/utilities/findLocaleFromCode.js +18 -0
  406. package/dist/utilities/formatDate/getSupportedDateLocale.js +21 -0
  407. package/dist/utilities/formatDate/index.js +78 -0
  408. package/dist/utilities/formatDocTitle.js +33 -0
  409. package/dist/utilities/formatFields.js +14 -0
  410. package/dist/utilities/getFormState.js +28 -0
  411. package/dist/utilities/getOffsetTop.js +26 -0
  412. package/dist/utilities/getRequestLanguage.js +17 -0
  413. package/dist/utilities/getSupportedMonacoLocale.js +26 -0
  414. package/dist/utilities/groupNavItems.js +61 -0
  415. package/dist/utilities/scrollToID.js +22 -0
  416. package/dist/utilities/setsAreEqual.js +17 -0
  417. package/dist/utilities/withMergedProps/index.js +27 -0
  418. package/dist/views/Global/RenderCustomView.js +3 -0
  419. package/package.json +5 -5
@@ -0,0 +1,509 @@
1
+ 'use client';
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function() {
9
+ return _default;
10
+ }
11
+ });
12
+ const _utilities = require("payload/utilities");
13
+ const _qs = /*#__PURE__*/ _interop_require_default(require("qs"));
14
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
15
+ const _GetFilterOptions = require("../../../elements/GetFilterOptions");
16
+ const _ReactSelect = /*#__PURE__*/ _interop_require_default(require("../../../elements/ReactSelect"));
17
+ const _useDebouncedCallback = require("../../../hooks/useDebouncedCallback");
18
+ const _Auth = require("../../../providers/Auth");
19
+ const _Config = require("../../../providers/Config");
20
+ const _Locale = require("../../../providers/Locale");
21
+ const _Translation = require("../../../providers/Translation");
22
+ const _context = require("../../Form/context");
23
+ const _useField = /*#__PURE__*/ _interop_require_default(require("../../useField"));
24
+ const _withCondition = require("../../withCondition");
25
+ const _shared = require("../shared");
26
+ const _AddNew = require("./AddNew");
27
+ const _createRelationMap = require("./createRelationMap");
28
+ const _findOptionsByValue = require("./findOptionsByValue");
29
+ require("./index.scss");
30
+ const _optionsReducer = /*#__PURE__*/ _interop_require_default(require("./optionsReducer"));
31
+ const _MultiValueLabel = require("./select-components/MultiValueLabel");
32
+ const _SingleValue = require("./select-components/SingleValue");
33
+ function _interop_require_default(obj) {
34
+ return obj && obj.__esModule ? obj : {
35
+ default: obj
36
+ };
37
+ }
38
+ function _getRequireWildcardCache(nodeInterop) {
39
+ if (typeof WeakMap !== "function") return null;
40
+ var cacheBabelInterop = new WeakMap();
41
+ var cacheNodeInterop = new WeakMap();
42
+ return (_getRequireWildcardCache = function(nodeInterop) {
43
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
44
+ })(nodeInterop);
45
+ }
46
+ function _interop_require_wildcard(obj, nodeInterop) {
47
+ if (!nodeInterop && obj && obj.__esModule) {
48
+ return obj;
49
+ }
50
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
51
+ return {
52
+ default: obj
53
+ };
54
+ }
55
+ var cache = _getRequireWildcardCache(nodeInterop);
56
+ if (cache && cache.has(obj)) {
57
+ return cache.get(obj);
58
+ }
59
+ var newObj = {
60
+ __proto__: null
61
+ };
62
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
63
+ for(var key in obj){
64
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
65
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
66
+ if (desc && (desc.get || desc.set)) {
67
+ Object.defineProperty(newObj, key, desc);
68
+ } else {
69
+ newObj[key] = obj[key];
70
+ }
71
+ }
72
+ }
73
+ newObj.default = obj;
74
+ if (cache) {
75
+ cache.set(obj, newObj);
76
+ }
77
+ return newObj;
78
+ }
79
+ const maxResultsPerRequest = 10;
80
+ const baseClass = 'relationship';
81
+ const Relationship = (props)=>{
82
+ const { name, Description, Error, Label, className, path: pathFromProps, readOnly, required, style, validate, width } = props;
83
+ const config = (0, _Config.useConfig)();
84
+ const { collections, routes: { api }, serverURL } = config;
85
+ const relationTo = 'relationTo' in props ? props?.relationTo : undefined;
86
+ const hasMany = 'hasMany' in props ? props?.hasMany : undefined;
87
+ const filterOptions = 'filterOptions' in props ? props?.filterOptions : undefined;
88
+ const sortOptions = 'sortOptions' in props ? props?.sortOptions : undefined;
89
+ const isSortable = 'isSortable' in props ? props?.isSortable : true;
90
+ const allowCreate = 'allowCreate' in props ? props?.allowCreate : true;
91
+ const { i18n, t } = (0, _Translation.useTranslation)();
92
+ const { permissions } = (0, _Auth.useAuth)();
93
+ const { code: locale } = (0, _Locale.useLocale)();
94
+ const formProcessing = (0, _context.useFormProcessing)();
95
+ const hasMultipleRelations = Array.isArray(relationTo);
96
+ const [options, dispatchOptions] = (0, _react.useReducer)(_optionsReducer.default, []);
97
+ const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = (0, _react.useState)(-1);
98
+ const [lastLoadedPage, setLastLoadedPage] = (0, _react.useState)({});
99
+ const [errorLoading, setErrorLoading] = (0, _react.useState)('');
100
+ const [filterOptionsResult, setFilterOptionsResult] = (0, _react.useState)();
101
+ const [search, setSearch] = (0, _react.useState)('');
102
+ const [isLoading, setIsLoading] = (0, _react.useState)(false);
103
+ const [hasLoadedFirstPage, setHasLoadedFirstPage] = (0, _react.useState)(false);
104
+ const [enableWordBoundarySearch, setEnableWordBoundarySearch] = (0, _react.useState)(false);
105
+ const firstRun = (0, _react.useRef)(true);
106
+ const memoizedValidate = (0, _react.useCallback)((value, validationOptions)=>{
107
+ if (typeof validate === 'function') {
108
+ return validate(value, {
109
+ ...validationOptions,
110
+ required
111
+ });
112
+ }
113
+ }, [
114
+ validate,
115
+ required
116
+ ]);
117
+ const { initialValue, path, setValue, showError, value } = (0, _useField.default)({
118
+ path: pathFromProps || name,
119
+ validate: memoizedValidate
120
+ });
121
+ const [drawerIsOpen, setDrawerIsOpen] = (0, _react.useState)(false);
122
+ const getResults = (0, _react.useCallback)(async ({ lastFullyLoadedRelation: lastFullyLoadedRelationArg, onSuccess, search: searchArg, sort, value: valueArg })=>{
123
+ if (!permissions) {
124
+ return;
125
+ }
126
+ const lastFullyLoadedRelationToUse = typeof lastFullyLoadedRelationArg !== 'undefined' ? lastFullyLoadedRelationArg : -1;
127
+ const relations = Array.isArray(relationTo) ? relationTo : [
128
+ relationTo
129
+ ];
130
+ const relationsToFetch = lastFullyLoadedRelationToUse === -1 ? relations : relations.slice(lastFullyLoadedRelationToUse + 1);
131
+ let resultsFetched = 0;
132
+ const relationMap = (0, _createRelationMap.createRelationMap)({
133
+ hasMany,
134
+ relationTo,
135
+ value: valueArg
136
+ });
137
+ if (!errorLoading) {
138
+ relationsToFetch.reduce(async (priorRelation, relation)=>{
139
+ const relationFilterOption = filterOptionsResult?.[relation];
140
+ let lastLoadedPageToUse;
141
+ if (search !== searchArg) {
142
+ lastLoadedPageToUse = 1;
143
+ } else {
144
+ lastLoadedPageToUse = lastLoadedPage[relation] + 1;
145
+ }
146
+ await priorRelation;
147
+ if (relationFilterOption === false) {
148
+ setLastFullyLoadedRelation(relations.indexOf(relation));
149
+ return Promise.resolve();
150
+ }
151
+ if (resultsFetched < 10) {
152
+ const collection = collections.find((coll)=>coll.slug === relation);
153
+ let fieldToSearch = collection?.defaultSort || collection?.admin?.useAsTitle || 'id';
154
+ if (!searchArg) {
155
+ if (typeof sortOptions === 'string') {
156
+ fieldToSearch = sortOptions;
157
+ } else if (sortOptions?.[relation]) {
158
+ fieldToSearch = sortOptions[relation];
159
+ }
160
+ }
161
+ const query = {
162
+ depth: 0,
163
+ draft: true,
164
+ limit: maxResultsPerRequest,
165
+ locale,
166
+ page: lastLoadedPageToUse,
167
+ sort: fieldToSearch,
168
+ where: {
169
+ and: [
170
+ {
171
+ id: {
172
+ not_in: relationMap[relation]
173
+ }
174
+ }
175
+ ]
176
+ }
177
+ };
178
+ if (searchArg) {
179
+ query.where.and.push({
180
+ [fieldToSearch]: {
181
+ like: searchArg
182
+ }
183
+ });
184
+ }
185
+ if (relationFilterOption && typeof relationFilterOption !== 'boolean') {
186
+ query.where.and.push(relationFilterOption);
187
+ }
188
+ const response = await fetch(`${serverURL}${api}/${relation}?${_qs.default.stringify(query)}`, {
189
+ credentials: 'include',
190
+ headers: {
191
+ 'Accept-Language': i18n.language
192
+ }
193
+ });
194
+ if (response.ok) {
195
+ const data = await response.json();
196
+ setLastLoadedPage((prevState)=>{
197
+ return {
198
+ ...prevState,
199
+ [relation]: lastLoadedPageToUse
200
+ };
201
+ });
202
+ if (!data.nextPage) {
203
+ setLastFullyLoadedRelation(relations.indexOf(relation));
204
+ }
205
+ if (data.docs.length > 0) {
206
+ resultsFetched += data.docs.length;
207
+ dispatchOptions({
208
+ type: 'ADD',
209
+ collection,
210
+ // TODO: fix this
211
+ // @ts-ignore-next-line
212
+ config,
213
+ docs: data.docs,
214
+ i18n,
215
+ sort
216
+ });
217
+ }
218
+ } else if (response.status === 403) {
219
+ setLastFullyLoadedRelation(relations.indexOf(relation));
220
+ dispatchOptions({
221
+ type: 'ADD',
222
+ collection,
223
+ // TODO: fix this
224
+ // @ts-ignore-next-line
225
+ config,
226
+ docs: [],
227
+ i18n,
228
+ ids: relationMap[relation],
229
+ sort
230
+ });
231
+ } else {
232
+ setErrorLoading(t('error:unspecific'));
233
+ }
234
+ }
235
+ }, Promise.resolve());
236
+ if (typeof onSuccess === 'function') onSuccess();
237
+ }
238
+ }, [
239
+ permissions,
240
+ relationTo,
241
+ hasMany,
242
+ errorLoading,
243
+ search,
244
+ lastLoadedPage,
245
+ collections,
246
+ locale,
247
+ filterOptionsResult,
248
+ serverURL,
249
+ sortOptions,
250
+ api,
251
+ i18n,
252
+ config,
253
+ t
254
+ ]);
255
+ const updateSearch = (0, _useDebouncedCallback.useDebouncedCallback)((searchArg, valueArg)=>{
256
+ getResults({
257
+ search: searchArg,
258
+ sort: true,
259
+ value: valueArg
260
+ });
261
+ setSearch(searchArg);
262
+ }, 300);
263
+ const handleInputChange = (0, _react.useCallback)((searchArg, valueArg)=>{
264
+ if (search !== searchArg) {
265
+ setLastLoadedPage({});
266
+ updateSearch(searchArg, valueArg, searchArg !== '');
267
+ }
268
+ }, [
269
+ search,
270
+ updateSearch
271
+ ]);
272
+ // ///////////////////////////////////
273
+ // Ensure we have an option for each value
274
+ // ///////////////////////////////////
275
+ (0, _react.useEffect)(()=>{
276
+ const relationMap = (0, _createRelationMap.createRelationMap)({
277
+ hasMany,
278
+ relationTo,
279
+ value
280
+ });
281
+ Object.entries(relationMap).reduce(async (priorRelation, [relation, ids])=>{
282
+ await priorRelation;
283
+ const idsToLoad = ids.filter((id)=>{
284
+ return !options.find((optionGroup)=>optionGroup?.options?.find((option)=>option.value === id && option.relationTo === relation));
285
+ });
286
+ if (idsToLoad.length > 0) {
287
+ const query = {
288
+ depth: 0,
289
+ draft: true,
290
+ limit: idsToLoad.length,
291
+ locale,
292
+ where: {
293
+ id: {
294
+ in: idsToLoad
295
+ }
296
+ }
297
+ };
298
+ if (!errorLoading) {
299
+ const response = await fetch(`${serverURL}${api}/${relation}?${_qs.default.stringify(query)}`, {
300
+ credentials: 'include',
301
+ headers: {
302
+ 'Accept-Language': i18n.language
303
+ }
304
+ });
305
+ const collection = collections.find((coll)=>coll.slug === relation);
306
+ let docs = [];
307
+ if (response.ok) {
308
+ const data = await response.json();
309
+ docs = data.docs;
310
+ }
311
+ dispatchOptions({
312
+ type: 'ADD',
313
+ collection,
314
+ // TODO: fix this
315
+ // @ts-ignore-next-line
316
+ config,
317
+ docs,
318
+ i18n,
319
+ ids: idsToLoad,
320
+ sort: true
321
+ });
322
+ }
323
+ }
324
+ }, Promise.resolve());
325
+ }, [
326
+ options,
327
+ value,
328
+ hasMany,
329
+ errorLoading,
330
+ collections,
331
+ hasMultipleRelations,
332
+ serverURL,
333
+ api,
334
+ i18n,
335
+ relationTo,
336
+ locale,
337
+ config
338
+ ]);
339
+ // Determine if we should switch to word boundary search
340
+ (0, _react.useEffect)(()=>{
341
+ const relations = Array.isArray(relationTo) ? relationTo : [
342
+ relationTo
343
+ ];
344
+ const isIdOnly = relations.reduce((idOnly, relation)=>{
345
+ const collection = collections.find((coll)=>coll.slug === relation);
346
+ const fieldToSearch = collection?.admin?.useAsTitle || 'id';
347
+ return fieldToSearch === 'id' && idOnly;
348
+ }, true);
349
+ setEnableWordBoundarySearch(!isIdOnly);
350
+ }, [
351
+ relationTo,
352
+ collections
353
+ ]);
354
+ // When (`relationTo` || `filterOptionsResult` || `locale`) changes, reset component
355
+ // Note - effect should not run on first run
356
+ (0, _react.useEffect)(()=>{
357
+ if (firstRun.current) {
358
+ firstRun.current = false;
359
+ return;
360
+ }
361
+ dispatchOptions({
362
+ type: 'CLEAR'
363
+ });
364
+ setLastFullyLoadedRelation(-1);
365
+ setLastLoadedPage({});
366
+ setHasLoadedFirstPage(false);
367
+ }, [
368
+ relationTo,
369
+ filterOptionsResult,
370
+ locale
371
+ ]);
372
+ const onSave = (0, _react.useCallback)((args)=>{
373
+ dispatchOptions({
374
+ type: 'UPDATE',
375
+ collection: args.collectionConfig,
376
+ // TODO: fix this
377
+ // @ts-ignore-next-line
378
+ config,
379
+ doc: args.doc,
380
+ i18n
381
+ });
382
+ }, [
383
+ i18n,
384
+ config
385
+ ]);
386
+ const filterOption = (0, _react.useCallback)((item, searchFilter)=>{
387
+ if (!searchFilter) {
388
+ return true;
389
+ }
390
+ const r = (0, _utilities.wordBoundariesRegex)(searchFilter || '');
391
+ // breaking the labels to search into smaller parts increases performance
392
+ const breakApartThreshold = 250;
393
+ let string = item.label;
394
+ // strings less than breakApartThreshold length won't be chunked
395
+ while(string.length > breakApartThreshold){
396
+ // slicing by the next space after the length of the search input prevents slicing the string up by partial words
397
+ const indexOfSpace = string.indexOf(' ', searchFilter.length);
398
+ if (r.test(string.slice(0, indexOfSpace === -1 ? searchFilter.length : indexOfSpace + 1))) {
399
+ return true;
400
+ }
401
+ string = string.slice(indexOfSpace === -1 ? searchFilter.length : indexOfSpace + 1);
402
+ }
403
+ return r.test(string.slice(-breakApartThreshold));
404
+ }, []);
405
+ const valueToRender = (0, _findOptionsByValue.findOptionsByValue)({
406
+ options,
407
+ value
408
+ });
409
+ if (!Array.isArray(valueToRender) && valueToRender?.value === 'null') valueToRender.value = null;
410
+ return /*#__PURE__*/ _react.default.createElement("div", {
411
+ className: [
412
+ _shared.fieldBaseClass,
413
+ baseClass,
414
+ className,
415
+ showError && 'error',
416
+ errorLoading && 'error-loading',
417
+ readOnly && `${baseClass}--read-only`
418
+ ].filter(Boolean).join(' '),
419
+ id: `field-${path.replace(/\./g, '__')}`,
420
+ style: {
421
+ ...style,
422
+ width
423
+ }
424
+ }, Error, Label, /*#__PURE__*/ _react.default.createElement(_GetFilterOptions.GetFilterOptions, {
425
+ filterOptions,
426
+ filterOptionsResult,
427
+ path,
428
+ relationTo,
429
+ setFilterOptionsResult
430
+ }), !errorLoading && /*#__PURE__*/ _react.default.createElement("div", {
431
+ className: `${baseClass}__wrap`
432
+ }, /*#__PURE__*/ _react.default.createElement(_ReactSelect.default, {
433
+ backspaceRemovesValue: !drawerIsOpen,
434
+ components: {
435
+ MultiValueLabel: _MultiValueLabel.MultiValueLabel,
436
+ SingleValue: _SingleValue.SingleValue
437
+ },
438
+ customProps: {
439
+ disableKeyDown: drawerIsOpen,
440
+ disableMouseDown: drawerIsOpen,
441
+ onSave,
442
+ setDrawerIsOpen
443
+ },
444
+ disabled: readOnly || formProcessing,
445
+ filterOption: enableWordBoundarySearch ? filterOption : undefined,
446
+ isLoading: isLoading,
447
+ isMulti: hasMany,
448
+ isSortable: isSortable,
449
+ onChange: !readOnly ? (selected)=>{
450
+ if (selected === null) {
451
+ setValue(hasMany ? [] : null);
452
+ } else if (hasMany) {
453
+ setValue(selected ? selected.map((option)=>{
454
+ if (hasMultipleRelations) {
455
+ return {
456
+ relationTo: option.relationTo,
457
+ value: option.value
458
+ };
459
+ }
460
+ return option.value;
461
+ }) : null);
462
+ } else if (hasMultipleRelations) {
463
+ setValue({
464
+ relationTo: selected.relationTo,
465
+ value: selected.value
466
+ });
467
+ } else {
468
+ setValue(selected.value);
469
+ }
470
+ } : undefined,
471
+ onInputChange: (newSearch)=>handleInputChange(newSearch, value),
472
+ onMenuOpen: ()=>{
473
+ if (!hasLoadedFirstPage) {
474
+ setIsLoading(true);
475
+ getResults({
476
+ onSuccess: ()=>{
477
+ setHasLoadedFirstPage(true);
478
+ setIsLoading(false);
479
+ },
480
+ value: initialValue
481
+ });
482
+ }
483
+ },
484
+ onMenuScrollToBottom: ()=>{
485
+ getResults({
486
+ lastFullyLoadedRelation,
487
+ search,
488
+ sort: false,
489
+ value: initialValue
490
+ });
491
+ },
492
+ options: options,
493
+ showError: showError,
494
+ value: valueToRender ?? null
495
+ }), !readOnly && allowCreate && /*#__PURE__*/ _react.default.createElement(_AddNew.AddNewRelation, {
496
+ dispatchOptions,
497
+ hasMany,
498
+ options,
499
+ path,
500
+ relationTo,
501
+ setValue,
502
+ value
503
+ })), errorLoading && /*#__PURE__*/ _react.default.createElement("div", {
504
+ className: `${baseClass}__error-loading`
505
+ }, errorLoading), Description);
506
+ };
507
+ const _default = (0, _withCondition.withCondition)(Relationship);
508
+
509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mb3Jtcy9maWVsZHMvUmVsYXRpb25zaGlwL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCdcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGVkRG9jcyB9IGZyb20gJ3BheWxvYWQvZGF0YWJhc2UnXG5pbXBvcnQgdHlwZSB7IFdoZXJlIH0gZnJvbSAncGF5bG9hZC90eXBlcydcblxuaW1wb3J0IHsgd29yZEJvdW5kYXJpZXNSZWdleCB9IGZyb20gJ3BheWxvYWQvdXRpbGl0aWVzJ1xuaW1wb3J0IHFzIGZyb20gJ3FzJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVJlZHVjZXIsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHR5cGUgeyBEb2N1bWVudERyYXdlclByb3BzIH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvRG9jdW1lbnREcmF3ZXIvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEZpbHRlck9wdGlvbnNSZXN1bHQsIEdldFJlc3VsdHMsIE9wdGlvbiwgUHJvcHMsIFZhbHVlIH0gZnJvbSAnLi90eXBlcydcblxuaW1wb3J0IHsgR2V0RmlsdGVyT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2VsZW1lbnRzL0dldEZpbHRlck9wdGlvbnMnXG5pbXBvcnQgUmVhY3RTZWxlY3QgZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvUmVhY3RTZWxlY3QnXG5pbXBvcnQgeyB1c2VEZWJvdW5jZWRDYWxsYmFjayB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZURlYm91bmNlZENhbGxiYWNrJ1xuaW1wb3J0IHsgdXNlQXV0aCB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy9BdXRoJ1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vcHJvdmlkZXJzL0NvbmZpZydcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy9Mb2NhbGUnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uLy4uL3Byb3ZpZGVycy9UcmFuc2xhdGlvbidcbmltcG9ydCB7IHVzZUZvcm1Qcm9jZXNzaW5nIH0gZnJvbSAnLi4vLi4vRm9ybS9jb250ZXh0J1xuaW1wb3J0IHVzZUZpZWxkIGZyb20gJy4uLy4uL3VzZUZpZWxkJ1xuaW1wb3J0IHsgd2l0aENvbmRpdGlvbiB9IGZyb20gJy4uLy4uL3dpdGhDb25kaXRpb24nXG5pbXBvcnQgeyBmaWVsZEJhc2VDbGFzcyB9IGZyb20gJy4uL3NoYXJlZCdcbmltcG9ydCB7IEFkZE5ld1JlbGF0aW9uIH0gZnJvbSAnLi9BZGROZXcnXG5pbXBvcnQgeyBjcmVhdGVSZWxhdGlvbk1hcCB9IGZyb20gJy4vY3JlYXRlUmVsYXRpb25NYXAnXG5pbXBvcnQgeyBmaW5kT3B0aW9uc0J5VmFsdWUgfSBmcm9tICcuL2ZpbmRPcHRpb25zQnlWYWx1ZSdcbmltcG9ydCAnLi9pbmRleC5zY3NzJ1xuaW1wb3J0IG9wdGlvbnNSZWR1Y2VyIGZyb20gJy4vb3B0aW9uc1JlZHVjZXInXG5pbXBvcnQgeyBNdWx0aVZhbHVlTGFiZWwgfSBmcm9tICcuL3NlbGVjdC1jb21wb25lbnRzL011bHRpVmFsdWVMYWJlbCdcbmltcG9ydCB7IFNpbmdsZVZhbHVlIH0gZnJvbSAnLi9zZWxlY3QtY29tcG9uZW50cy9TaW5nbGVWYWx1ZSdcblxuY29uc3QgbWF4UmVzdWx0c1BlclJlcXVlc3QgPSAxMFxuXG5jb25zdCBiYXNlQ2xhc3MgPSAncmVsYXRpb25zaGlwJ1xuXG5jb25zdCBSZWxhdGlvbnNoaXA6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgbmFtZSxcbiAgICBEZXNjcmlwdGlvbixcbiAgICBFcnJvcixcbiAgICBMYWJlbCxcbiAgICBjbGFzc05hbWUsXG4gICAgcGF0aDogcGF0aEZyb21Qcm9wcyxcbiAgICByZWFkT25seSxcbiAgICByZXF1aXJlZCxcbiAgICBzdHlsZSxcbiAgICB2YWxpZGF0ZSxcbiAgICB3aWR0aCxcbiAgfSA9IHByb3BzXG5cbiAgY29uc3QgY29uZmlnID0gdXNlQ29uZmlnKClcblxuICBjb25zdCB7XG4gICAgY29sbGVjdGlvbnMsXG4gICAgcm91dGVzOiB7IGFwaSB9LFxuICAgIHNlcnZlclVSTCxcbiAgfSA9IGNvbmZpZ1xuXG4gIGNvbnN0IHJlbGF0aW9uVG8gPSAncmVsYXRpb25UbycgaW4gcHJvcHMgPyBwcm9wcz8ucmVsYXRpb25UbyA6IHVuZGVmaW5lZFxuICBjb25zdCBoYXNNYW55ID0gJ2hhc01hbnknIGluIHByb3BzID8gcHJvcHM/Lmhhc01hbnkgOiB1bmRlZmluZWRcbiAgY29uc3QgZmlsdGVyT3B0aW9ucyA9ICdmaWx0ZXJPcHRpb25zJyBpbiBwcm9wcyA/IHByb3BzPy5maWx0ZXJPcHRpb25zIDogdW5kZWZpbmVkXG4gIGNvbnN0IHNvcnRPcHRpb25zID0gJ3NvcnRPcHRpb25zJyBpbiBwcm9wcyA/IHByb3BzPy5zb3J0T3B0aW9ucyA6IHVuZGVmaW5lZFxuICBjb25zdCBpc1NvcnRhYmxlID0gJ2lzU29ydGFibGUnIGluIHByb3BzID8gcHJvcHM/LmlzU29ydGFibGUgOiB0cnVlXG4gIGNvbnN0IGFsbG93Q3JlYXRlID0gJ2FsbG93Q3JlYXRlJyBpbiBwcm9wcyA/IHByb3BzPy5hbGxvd0NyZWF0ZSA6IHRydWVcblxuICBjb25zdCB7IGkxOG4sIHQgfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgY29uc3QgeyBwZXJtaXNzaW9ucyB9ID0gdXNlQXV0aCgpXG4gIGNvbnN0IHsgY29kZTogbG9jYWxlIH0gPSB1c2VMb2NhbGUoKVxuICBjb25zdCBmb3JtUHJvY2Vzc2luZyA9IHVzZUZvcm1Qcm9jZXNzaW5nKClcbiAgY29uc3QgaGFzTXVsdGlwbGVSZWxhdGlvbnMgPSBBcnJheS5pc0FycmF5KHJlbGF0aW9uVG8pXG4gIGNvbnN0IFtvcHRpb25zLCBkaXNwYXRjaE9wdGlvbnNdID0gdXNlUmVkdWNlcihvcHRpb25zUmVkdWNlciwgW10pXG4gIGNvbnN0IFtsYXN0RnVsbHlMb2FkZWRSZWxhdGlvbiwgc2V0TGFzdEZ1bGx5TG9hZGVkUmVsYXRpb25dID0gdXNlU3RhdGUoLTEpXG4gIGNvbnN0IFtsYXN0TG9hZGVkUGFnZSwgc2V0TGFzdExvYWRlZFBhZ2VdID0gdXNlU3RhdGU8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4oe30pXG4gIGNvbnN0IFtlcnJvckxvYWRpbmcsIHNldEVycm9yTG9hZGluZ10gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW2ZpbHRlck9wdGlvbnNSZXN1bHQsIHNldEZpbHRlck9wdGlvbnNSZXN1bHRdID0gdXNlU3RhdGU8RmlsdGVyT3B0aW9uc1Jlc3VsdD4oKVxuICBjb25zdCBbc2VhcmNoLCBzZXRTZWFyY2hdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2hhc0xvYWRlZEZpcnN0UGFnZSwgc2V0SGFzTG9hZGVkRmlyc3RQYWdlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZW5hYmxlV29yZEJvdW5kYXJ5U2VhcmNoLCBzZXRFbmFibGVXb3JkQm91bmRhcnlTZWFyY2hdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGZpcnN0UnVuID0gdXNlUmVmKHRydWUpXG5cbiAgY29uc3QgbWVtb2l6ZWRWYWxpZGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh2YWx1ZSwgdmFsaWRhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHZhbHVlLCB7IC4uLnZhbGlkYXRpb25PcHRpb25zLCByZXF1aXJlZCB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW3ZhbGlkYXRlLCByZXF1aXJlZF0sXG4gIClcblxuICBjb25zdCB7IGluaXRpYWxWYWx1ZSwgcGF0aCwgc2V0VmFsdWUsIHNob3dFcnJvciwgdmFsdWUgfSA9IHVzZUZpZWxkPFZhbHVlIHwgVmFsdWVbXT4oe1xuICAgIHBhdGg6IHBhdGhGcm9tUHJvcHMgfHwgbmFtZSxcbiAgICB2YWxpZGF0ZTogbWVtb2l6ZWRWYWxpZGF0ZSxcbiAgfSlcblxuICBjb25zdCBbZHJhd2VySXNPcGVuLCBzZXREcmF3ZXJJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgZ2V0UmVzdWx0czogR2V0UmVzdWx0cyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7XG4gICAgICBsYXN0RnVsbHlMb2FkZWRSZWxhdGlvbjogbGFzdEZ1bGx5TG9hZGVkUmVsYXRpb25BcmcsXG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICBzZWFyY2g6IHNlYXJjaEFyZyxcbiAgICAgIHNvcnQsXG4gICAgICB2YWx1ZTogdmFsdWVBcmcsXG4gICAgfSkgPT4ge1xuICAgICAgaWYgKCFwZXJtaXNzaW9ucykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RGdWxseUxvYWRlZFJlbGF0aW9uVG9Vc2UgPVxuICAgICAgICB0eXBlb2YgbGFzdEZ1bGx5TG9hZGVkUmVsYXRpb25BcmcgIT09ICd1bmRlZmluZWQnID8gbGFzdEZ1bGx5TG9hZGVkUmVsYXRpb25BcmcgOiAtMVxuXG4gICAgICBjb25zdCByZWxhdGlvbnMgPSBBcnJheS5pc0FycmF5KHJlbGF0aW9uVG8pID8gcmVsYXRpb25UbyA6IFtyZWxhdGlvblRvXVxuICAgICAgY29uc3QgcmVsYXRpb25zVG9GZXRjaCA9XG4gICAgICAgIGxhc3RGdWxseUxvYWRlZFJlbGF0aW9uVG9Vc2UgPT09IC0xXG4gICAgICAgICAgPyByZWxhdGlvbnNcbiAgICAgICAgICA6IHJlbGF0aW9ucy5zbGljZShsYXN0RnVsbHlMb2FkZWRSZWxhdGlvblRvVXNlICsgMSlcblxuICAgICAgbGV0IHJlc3VsdHNGZXRjaGVkID0gMFxuICAgICAgY29uc3QgcmVsYXRpb25NYXAgPSBjcmVhdGVSZWxhdGlvbk1hcCh7XG4gICAgICAgIGhhc01hbnksXG4gICAgICAgIHJlbGF0aW9uVG8sXG4gICAgICAgIHZhbHVlOiB2YWx1ZUFyZyxcbiAgICAgIH0pXG5cbiAgICAgIGlmICghZXJyb3JMb2FkaW5nKSB7XG4gICAgICAgIHJlbGF0aW9uc1RvRmV0Y2gucmVkdWNlKGFzeW5jIChwcmlvclJlbGF0aW9uLCByZWxhdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aW9uRmlsdGVyT3B0aW9uID0gZmlsdGVyT3B0aW9uc1Jlc3VsdD8uW3JlbGF0aW9uXVxuICAgICAgICAgIGxldCBsYXN0TG9hZGVkUGFnZVRvVXNlXG4gICAgICAgICAgaWYgKHNlYXJjaCAhPT0gc2VhcmNoQXJnKSB7XG4gICAgICAgICAgICBsYXN0TG9hZGVkUGFnZVRvVXNlID0gMVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0TG9hZGVkUGFnZVRvVXNlID0gbGFzdExvYWRlZFBhZ2VbcmVsYXRpb25dICsgMVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBwcmlvclJlbGF0aW9uXG5cbiAgICAgICAgICBpZiAocmVsYXRpb25GaWx0ZXJPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzZXRMYXN0RnVsbHlMb2FkZWRSZWxhdGlvbihyZWxhdGlvbnMuaW5kZXhPZihyZWxhdGlvbikpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzdWx0c0ZldGNoZWQgPCAxMCkge1xuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IGNvbGxlY3Rpb25zLmZpbmQoKGNvbGwpID0+IGNvbGwuc2x1ZyA9PT0gcmVsYXRpb24pXG4gICAgICAgICAgICBsZXQgZmllbGRUb1NlYXJjaCA9IGNvbGxlY3Rpb24/LmRlZmF1bHRTb3J0IHx8IGNvbGxlY3Rpb24/LmFkbWluPy51c2VBc1RpdGxlIHx8ICdpZCdcbiAgICAgICAgICAgIGlmICghc2VhcmNoQXJnKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygc29ydE9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZmllbGRUb1NlYXJjaCA9IHNvcnRPcHRpb25zXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc29ydE9wdGlvbnM/LltyZWxhdGlvbl0pIHtcbiAgICAgICAgICAgICAgICBmaWVsZFRvU2VhcmNoID0gc29ydE9wdGlvbnNbcmVsYXRpb25dXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcXVlcnk6IHtcbiAgICAgICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICAgICAgICAgICAgICB3aGVyZTogV2hlcmVcbiAgICAgICAgICAgIH0gPSB7XG4gICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICBkcmFmdDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGltaXQ6IG1heFJlc3VsdHNQZXJSZXF1ZXN0LFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHBhZ2U6IGxhc3RMb2FkZWRQYWdlVG9Vc2UsXG4gICAgICAgICAgICAgIHNvcnQ6IGZpZWxkVG9TZWFyY2gsXG4gICAgICAgICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgICAgICAgYW5kOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgbm90X2luOiByZWxhdGlvbk1hcFtyZWxhdGlvbl0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWFyY2hBcmcpIHtcbiAgICAgICAgICAgICAgcXVlcnkud2hlcmUuYW5kLnB1c2goe1xuICAgICAgICAgICAgICAgIFtmaWVsZFRvU2VhcmNoXToge1xuICAgICAgICAgICAgICAgICAgbGlrZTogc2VhcmNoQXJnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGlvbkZpbHRlck9wdGlvbiAmJiB0eXBlb2YgcmVsYXRpb25GaWx0ZXJPcHRpb24gIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICBxdWVyeS53aGVyZS5hbmQucHVzaChyZWxhdGlvbkZpbHRlck9wdGlvbilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtzZXJ2ZXJVUkx9JHthcGl9LyR7cmVsYXRpb259PyR7cXMuc3RyaW5naWZ5KHF1ZXJ5KX1gLCB7XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhOiBQYWdpbmF0ZWREb2NzPHVua25vd24+ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgIHNldExhc3RMb2FkZWRQYWdlKChwcmV2U3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgW3JlbGF0aW9uXTogbGFzdExvYWRlZFBhZ2VUb1VzZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgaWYgKCFkYXRhLm5leHRQYWdlKSB7XG4gICAgICAgICAgICAgICAgc2V0TGFzdEZ1bGx5TG9hZGVkUmVsYXRpb24ocmVsYXRpb25zLmluZGV4T2YocmVsYXRpb24pKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGRhdGEuZG9jcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c0ZldGNoZWQgKz0gZGF0YS5kb2NzLmxlbmd0aFxuXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdBREQnLFxuICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZpeCB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgZG9jczogZGF0YS5kb2NzLFxuICAgICAgICAgICAgICAgICAgaTE4bixcbiAgICAgICAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICBzZXRMYXN0RnVsbHlMb2FkZWRSZWxhdGlvbihyZWxhdGlvbnMuaW5kZXhPZihyZWxhdGlvbikpXG4gICAgICAgICAgICAgIGRpc3BhdGNoT3B0aW9ucyh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FERCcsXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaXggdGhpc1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgIGRvY3M6IFtdLFxuICAgICAgICAgICAgICAgIGkxOG4sXG4gICAgICAgICAgICAgICAgaWRzOiByZWxhdGlvbk1hcFtyZWxhdGlvbl0sXG4gICAgICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldEVycm9yTG9hZGluZyh0KCdlcnJvcjp1bnNwZWNpZmljJykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICBpZiAodHlwZW9mIG9uU3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykgb25TdWNjZXNzKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgcmVsYXRpb25UbyxcbiAgICAgIGhhc01hbnksXG4gICAgICBlcnJvckxvYWRpbmcsXG4gICAgICBzZWFyY2gsXG4gICAgICBsYXN0TG9hZGVkUGFnZSxcbiAgICAgIGNvbGxlY3Rpb25zLFxuICAgICAgbG9jYWxlLFxuICAgICAgZmlsdGVyT3B0aW9uc1Jlc3VsdCxcbiAgICAgIHNlcnZlclVSTCxcbiAgICAgIHNvcnRPcHRpb25zLFxuICAgICAgYXBpLFxuICAgICAgaTE4bixcbiAgICAgIGNvbmZpZyxcbiAgICAgIHQsXG4gICAgXSxcbiAgKVxuXG4gIGNvbnN0IHVwZGF0ZVNlYXJjaCA9IHVzZURlYm91bmNlZENhbGxiYWNrKChzZWFyY2hBcmc6IHN0cmluZywgdmFsdWVBcmc6IFZhbHVlIHwgVmFsdWVbXSkgPT4ge1xuICAgIGdldFJlc3VsdHMoeyBzZWFyY2g6IHNlYXJjaEFyZywgc29ydDogdHJ1ZSwgdmFsdWU6IHZhbHVlQXJnIH0pXG4gICAgc2V0U2VhcmNoKHNlYXJjaEFyZylcbiAgfSwgMzAwKVxuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHNlYXJjaEFyZzogc3RyaW5nLCB2YWx1ZUFyZzogVmFsdWUgfCBWYWx1ZVtdKSA9PiB7XG4gICAgICBpZiAoc2VhcmNoICE9PSBzZWFyY2hBcmcpIHtcbiAgICAgICAgc2V0TGFzdExvYWRlZFBhZ2Uoe30pXG4gICAgICAgIHVwZGF0ZVNlYXJjaChzZWFyY2hBcmcsIHZhbHVlQXJnLCBzZWFyY2hBcmcgIT09ICcnKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlYXJjaCwgdXBkYXRlU2VhcmNoXSxcbiAgKVxuXG4gIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIEVuc3VyZSB3ZSBoYXZlIGFuIG9wdGlvbiBmb3IgZWFjaCB2YWx1ZVxuICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcmVsYXRpb25NYXAgPSBjcmVhdGVSZWxhdGlvbk1hcCh7XG4gICAgICBoYXNNYW55LFxuICAgICAgcmVsYXRpb25UbyxcbiAgICAgIHZhbHVlLFxuICAgIH0pXG5cbiAgICBPYmplY3QuZW50cmllcyhyZWxhdGlvbk1hcCkucmVkdWNlKGFzeW5jIChwcmlvclJlbGF0aW9uLCBbcmVsYXRpb24sIGlkc10pID0+IHtcbiAgICAgIGF3YWl0IHByaW9yUmVsYXRpb25cblxuICAgICAgY29uc3QgaWRzVG9Mb2FkID0gaWRzLmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgcmV0dXJuICFvcHRpb25zLmZpbmQoKG9wdGlvbkdyb3VwKSA9PlxuICAgICAgICAgIG9wdGlvbkdyb3VwPy5vcHRpb25zPy5maW5kKFxuICAgICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBpZCAmJiBvcHRpb24ucmVsYXRpb25UbyA9PT0gcmVsYXRpb24sXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgfSlcblxuICAgICAgaWYgKGlkc1RvTG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0ge1xuICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgIGRyYWZ0OiB0cnVlLFxuICAgICAgICAgIGxpbWl0OiBpZHNUb0xvYWQubGVuZ3RoLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgaWQ6IHtcbiAgICAgICAgICAgICAgaW46IGlkc1RvTG9hZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXJyb3JMb2FkaW5nKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtzZXJ2ZXJVUkx9JHthcGl9LyR7cmVsYXRpb259PyR7cXMuc3RyaW5naWZ5KHF1ZXJ5KX1gLCB7XG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9ucy5maW5kKChjb2xsKSA9PiBjb2xsLnNsdWcgPT09IHJlbGF0aW9uKVxuICAgICAgICAgIGxldCBkb2NzID0gW11cblxuICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgZG9jcyA9IGRhdGEuZG9jc1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpc3BhdGNoT3B0aW9ucyh7XG4gICAgICAgICAgICB0eXBlOiAnQUREJyxcbiAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAvLyBUT0RPOiBmaXggdGhpc1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGRvY3MsXG4gICAgICAgICAgICBpMThuLFxuICAgICAgICAgICAgaWRzOiBpZHNUb0xvYWQsXG4gICAgICAgICAgICBzb3J0OiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgdmFsdWUsXG4gICAgaGFzTWFueSxcbiAgICBlcnJvckxvYWRpbmcsXG4gICAgY29sbGVjdGlvbnMsXG4gICAgaGFzTXVsdGlwbGVSZWxhdGlvbnMsXG4gICAgc2VydmVyVVJMLFxuICAgIGFwaSxcbiAgICBpMThuLFxuICAgIHJlbGF0aW9uVG8sXG4gICAgbG9jYWxlLFxuICAgIGNvbmZpZyxcbiAgXSlcblxuICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHN3aXRjaCB0byB3b3JkIGJvdW5kYXJ5IHNlYXJjaFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocmVsYXRpb25UbykgPyByZWxhdGlvblRvIDogW3JlbGF0aW9uVG9dXG4gICAgY29uc3QgaXNJZE9ubHkgPSByZWxhdGlvbnMucmVkdWNlKChpZE9ubHksIHJlbGF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gY29sbGVjdGlvbnMuZmluZCgoY29sbCkgPT4gY29sbC5zbHVnID09PSByZWxhdGlvbilcbiAgICAgIGNvbnN0IGZpZWxkVG9TZWFyY2ggPSBjb2xsZWN0aW9uPy5hZG1pbj8udXNlQXNUaXRsZSB8fCAnaWQnXG4gICAgICByZXR1cm4gZmllbGRUb1NlYXJjaCA9PT0gJ2lkJyAmJiBpZE9ubHlcbiAgICB9LCB0cnVlKVxuICAgIHNldEVuYWJsZVdvcmRCb3VuZGFyeVNlYXJjaCghaXNJZE9ubHkpXG4gIH0sIFtyZWxhdGlvblRvLCBjb2xsZWN0aW9uc10pXG5cbiAgLy8gV2hlbiAoYHJlbGF0aW9uVG9gIHx8IGBmaWx0ZXJPcHRpb25zUmVzdWx0YCB8fCBgbG9jYWxlYCkgY2hhbmdlcywgcmVzZXQgY29tcG9uZW50XG4gIC8vIE5vdGUgLSBlZmZlY3Qgc2hvdWxkIG5vdCBydW4gb24gZmlyc3QgcnVuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGZpcnN0UnVuLmN1cnJlbnQpIHtcbiAgICAgIGZpcnN0UnVuLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGlzcGF0Y2hPcHRpb25zKHsgdHlwZTogJ0NMRUFSJyB9KVxuICAgIHNldExhc3RGdWxseUxvYWRlZFJlbGF0aW9uKC0xKVxuICAgIHNldExhc3RMb2FkZWRQYWdlKHt9KVxuICAgIHNldEhhc0xvYWRlZEZpcnN0UGFnZShmYWxzZSlcbiAgfSwgW3JlbGF0aW9uVG8sIGZpbHRlck9wdGlvbnNSZXN1bHQsIGxvY2FsZV0pXG5cbiAgY29uc3Qgb25TYXZlID0gdXNlQ2FsbGJhY2s8RG9jdW1lbnREcmF3ZXJQcm9wc1snb25TYXZlJ10+KFxuICAgIChhcmdzKSA9PiB7XG4gICAgICBkaXNwYXRjaE9wdGlvbnMoe1xuICAgICAgICB0eXBlOiAnVVBEQVRFJyxcbiAgICAgICAgY29sbGVjdGlvbjogYXJncy5jb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAvLyBUT0RPOiBmaXggdGhpc1xuICAgICAgICAvLyBAdHMtaWdub3JlLW5leHQtbGluZVxuICAgICAgICBjb25maWcsXG4gICAgICAgIGRvYzogYXJncy5kb2MsXG4gICAgICAgIGkxOG4sXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2kxOG4sIGNvbmZpZ10sXG4gIClcblxuICBjb25zdCBmaWx0ZXJPcHRpb24gPSB1c2VDYWxsYmFjaygoaXRlbTogT3B0aW9uLCBzZWFyY2hGaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgIGlmICghc2VhcmNoRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCByID0gd29yZEJvdW5kYXJpZXNSZWdleChzZWFyY2hGaWx0ZXIgfHwgJycpXG4gICAgLy8gYnJlYWtpbmcgdGhlIGxhYmVscyB0byBzZWFyY2ggaW50byBzbWFsbGVyIHBhcnRzIGluY3JlYXNlcyBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IGJyZWFrQXBhcnRUaHJlc2hvbGQgPSAyNTBcbiAgICBsZXQgc3RyaW5nID0gaXRlbS5sYWJlbFxuICAgIC8vIHN0cmluZ3MgbGVzcyB0aGFuIGJyZWFrQXBhcnRUaHJlc2hvbGQgbGVuZ3RoIHdvbid0IGJlIGNodW5rZWRcbiAgICB3aGlsZSAoc3RyaW5nLmxlbmd0aCA+IGJyZWFrQXBhcnRUaHJlc2hvbGQpIHtcbiAgICAgIC8vIHNsaWNpbmcgYnkgdGhlIG5leHQgc3BhY2UgYWZ0ZXIgdGhlIGxlbmd0aCBvZiB0aGUgc2VhcmNoIGlucHV0IHByZXZlbnRzIHNsaWNpbmcgdGhlIHN0cmluZyB1cCBieSBwYXJ0aWFsIHdvcmRzXG4gICAgICBjb25zdCBpbmRleE9mU3BhY2UgPSBzdHJpbmcuaW5kZXhPZignICcsIHNlYXJjaEZpbHRlci5sZW5ndGgpXG4gICAgICBpZiAoci50ZXN0KHN0cmluZy5zbGljZSgwLCBpbmRleE9mU3BhY2UgPT09IC0xID8gc2VhcmNoRmlsdGVyLmxlbmd0aCA6IGluZGV4T2ZTcGFjZSArIDEpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKGluZGV4T2ZTcGFjZSA9PT0gLTEgPyBzZWFyY2hGaWx0ZXIubGVuZ3RoIDogaW5kZXhPZlNwYWNlICsgMSlcbiAgICB9XG4gICAgcmV0dXJuIHIudGVzdChzdHJpbmcuc2xpY2UoLWJyZWFrQXBhcnRUaHJlc2hvbGQpKVxuICB9LCBbXSlcblxuICBjb25zdCB2YWx1ZVRvUmVuZGVyID0gZmluZE9wdGlvbnNCeVZhbHVlKHsgb3B0aW9ucywgdmFsdWUgfSlcblxuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb1JlbmRlcikgJiYgdmFsdWVUb1JlbmRlcj8udmFsdWUgPT09ICdudWxsJykgdmFsdWVUb1JlbmRlci52YWx1ZSA9IG51bGxcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17W1xuICAgICAgICBmaWVsZEJhc2VDbGFzcyxcbiAgICAgICAgYmFzZUNsYXNzLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHNob3dFcnJvciAmJiAnZXJyb3InLFxuICAgICAgICBlcnJvckxvYWRpbmcgJiYgJ2Vycm9yLWxvYWRpbmcnLFxuICAgICAgICByZWFkT25seSAmJiBgJHtiYXNlQ2xhc3N9LS1yZWFkLW9ubHlgLFxuICAgICAgXVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcgJyl9XG4gICAgICBpZD17YGZpZWxkLSR7cGF0aC5yZXBsYWNlKC9cXC4vZywgJ19fJyl9YH1cbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIC4uLnN0eWxlLFxuICAgICAgICB3aWR0aCxcbiAgICAgIH19XG4gICAgPlxuICAgICAge0Vycm9yfVxuICAgICAge0xhYmVsfVxuICAgICAgPEdldEZpbHRlck9wdGlvbnNcbiAgICAgICAgey4uLntcbiAgICAgICAgICBmaWx0ZXJPcHRpb25zLFxuICAgICAgICAgIGZpbHRlck9wdGlvbnNSZXN1bHQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICByZWxhdGlvblRvLFxuICAgICAgICAgIHNldEZpbHRlck9wdGlvbnNSZXN1bHQsXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICAgeyFlcnJvckxvYWRpbmcgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fd3JhcGB9PlxuICAgICAgICAgIDxSZWFjdFNlbGVjdFxuICAgICAgICAgICAgYmFja3NwYWNlUmVtb3Zlc1ZhbHVlPXshZHJhd2VySXNPcGVufVxuICAgICAgICAgICAgY29tcG9uZW50cz17e1xuICAgICAgICAgICAgICBNdWx0aVZhbHVlTGFiZWwsXG4gICAgICAgICAgICAgIFNpbmdsZVZhbHVlLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGN1c3RvbVByb3BzPXt7XG4gICAgICAgICAgICAgIGRpc2FibGVLZXlEb3duOiBkcmF3ZXJJc09wZW4sXG4gICAgICAgICAgICAgIGRpc2FibGVNb3VzZURvd246IGRyYXdlcklzT3BlbixcbiAgICAgICAgICAgICAgb25TYXZlLFxuICAgICAgICAgICAgICBzZXREcmF3ZXJJc09wZW4sXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgZGlzYWJsZWQ9e3JlYWRPbmx5IHx8IGZvcm1Qcm9jZXNzaW5nfVxuICAgICAgICAgICAgZmlsdGVyT3B0aW9uPXtlbmFibGVXb3JkQm91bmRhcnlTZWFyY2ggPyBmaWx0ZXJPcHRpb24gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICBpc0xvYWRpbmc9e2lzTG9hZGluZ31cbiAgICAgICAgICAgIGlzTXVsdGk9e2hhc01hbnl9XG4gICAgICAgICAgICBpc1NvcnRhYmxlPXtpc1NvcnRhYmxlfVxuICAgICAgICAgICAgb25DaGFuZ2U9e1xuICAgICAgICAgICAgICAhcmVhZE9ubHlcbiAgICAgICAgICAgICAgICA/IChzZWxlY3RlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShoYXNNYW55ID8gW10gOiBudWxsKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhc01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gc2VsZWN0ZWQubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNNdWx0aXBsZVJlbGF0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVG86IG9wdGlvbi5yZWxhdGlvblRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzTXVsdGlwbGVSZWxhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvblRvOiBzZWxlY3RlZC5yZWxhdGlvblRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoc2VsZWN0ZWQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb25JbnB1dENoYW5nZT17KG5ld1NlYXJjaCkgPT4gaGFuZGxlSW5wdXRDaGFuZ2UobmV3U2VhcmNoLCB2YWx1ZSl9XG4gICAgICAgICAgICBvbk1lbnVPcGVuPXsoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaGFzTG9hZGVkRmlyc3RQYWdlKSB7XG4gICAgICAgICAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpXG4gICAgICAgICAgICAgICAgZ2V0UmVzdWx0cyh7XG4gICAgICAgICAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0SGFzTG9hZGVkRmlyc3RQYWdlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvbk1lbnVTY3JvbGxUb0JvdHRvbT17KCkgPT4ge1xuICAgICAgICAgICAgICBnZXRSZXN1bHRzKHtcbiAgICAgICAgICAgICAgICBsYXN0RnVsbHlMb2FkZWRSZWxhdGlvbixcbiAgICAgICAgICAgICAgICBzZWFyY2gsXG4gICAgICAgICAgICAgICAgc29ydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgc2hvd0Vycm9yPXtzaG93RXJyb3J9XG4gICAgICAgICAgICB2YWx1ZT17dmFsdWVUb1JlbmRlciA/PyBudWxsfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgeyFyZWFkT25seSAmJiBhbGxvd0NyZWF0ZSAmJiAoXG4gICAgICAgICAgICA8QWRkTmV3UmVsYXRpb25cbiAgICAgICAgICAgICAgey4uLntcbiAgICAgICAgICAgICAgICBkaXNwYXRjaE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgaGFzTWFueSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgcmVsYXRpb25UbyxcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAge2Vycm9yTG9hZGluZyAmJiA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fZXJyb3ItbG9hZGluZ2B9PntlcnJvckxvYWRpbmd9PC9kaXY+fVxuICAgICAge0Rlc2NyaXB0aW9ufVxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhDb25kaXRpb24oUmVsYXRpb25zaGlwKVxuIl0sIm5hbWVzIjpbIm1heFJlc3VsdHNQZXJSZXF1ZXN0IiwiYmFzZUNsYXNzIiwiUmVsYXRpb25zaGlwIiwicHJvcHMiLCJuYW1lIiwiRGVzY3JpcHRpb24iLCJFcnJvciIsIkxhYmVsIiwiY2xhc3NOYW1lIiwicGF0aCIsInBhdGhGcm9tUHJvcHMiLCJyZWFkT25seSIsInJlcXVpcmVkIiwic3R5bGUiLCJ2YWxpZGF0ZSIsIndpZHRoIiwiY29uZmlnIiwidXNlQ29uZmlnIiwiY29sbGVjdGlvbnMiLCJyb3V0ZXMiLCJhcGkiLCJzZXJ2ZXJVUkwiLCJyZWxhdGlvblRvIiwidW5kZWZpbmVkIiwiaGFzTWFueSIsImZpbHRlck9wdGlvbnMiLCJzb3J0T3B0aW9ucyIsImlzU29ydGFibGUiLCJhbGxvd0NyZWF0ZSIsImkxOG4iLCJ0IiwidXNlVHJhbnNsYXRpb24iLCJwZXJtaXNzaW9ucyIsInVzZUF1dGgiLCJjb2RlIiwibG9jYWxlIiwidXNlTG9jYWxlIiwiZm9ybVByb2Nlc3NpbmciLCJ1c2VGb3JtUHJvY2Vzc2luZyIsImhhc011bHRpcGxlUmVsYXRpb25zIiwiQXJyYXkiLCJpc0FycmF5Iiwib3B0aW9ucyIsImRpc3BhdGNoT3B0aW9ucyIsInVzZVJlZHVjZXIiLCJvcHRpb25zUmVkdWNlciIsImxhc3RGdWxseUxvYWRlZFJlbGF0aW9uIiwic2V0TGFzdEZ1bGx5TG9hZGVkUmVsYXRpb24iLCJ1c2VTdGF0ZSIsImxhc3RMb2FkZWRQYWdlIiwic2V0TGFzdExvYWRlZFBhZ2UiLCJlcnJvckxvYWRpbmciLCJzZXRFcnJvckxvYWRpbmciLCJmaWx0ZXJPcHRpb25zUmVzdWx0Iiwic2V0RmlsdGVyT3B0aW9uc1Jlc3VsdCIsInNlYXJjaCIsInNldFNlYXJjaCIsImlzTG9hZGluZyIsInNldElzTG9hZGluZyIsImhhc0xvYWRlZEZpcnN0UGFnZSIsInNldEhhc0xvYWRlZEZpcnN0UGFnZSIsImVuYWJsZVdvcmRCb3VuZGFyeVNlYXJjaCIsInNldEVuYWJsZVdvcmRCb3VuZGFyeVNlYXJjaCIsImZpcnN0UnVuIiwidXNlUmVmIiwibWVtb2l6ZWRWYWxpZGF0ZSIsInVzZUNhbGxiYWNrIiwidmFsdWUiLCJ2YWxpZGF0aW9uT3B0aW9ucyIsImluaXRpYWxWYWx1ZSIsInNldFZhbHVlIiwic2hvd0Vycm9yIiwidXNlRmllbGQiLCJkcmF3ZXJJc09wZW4iLCJzZXREcmF3ZXJJc09wZW4iLCJnZXRSZXN1bHRzIiwibGFzdEZ1bGx5TG9hZGVkUmVsYXRpb25BcmciLCJvblN1Y2Nlc3MiLCJzZWFyY2hBcmciLCJzb3J0IiwidmFsdWVBcmciLCJsYXN0RnVsbHlMb2FkZWRSZWxhdGlvblRvVXNlIiwicmVsYXRpb25zIiwicmVsYXRpb25zVG9GZXRjaCIsInNsaWNlIiwicmVzdWx0c0ZldGNoZWQiLCJyZWxhdGlvbk1hcCIsImNyZWF0ZVJlbGF0aW9uTWFwIiwicmVkdWNlIiwicHJpb3JSZWxhdGlvbiIsInJlbGF0aW9uIiwicmVsYXRpb25GaWx0ZXJPcHRpb24iLCJsYXN0TG9hZGVkUGFnZVRvVXNlIiwiaW5kZXhPZiIsIlByb21pc2UiLCJyZXNvbHZlIiwiY29sbGVjdGlvbiIsImZpbmQiLCJjb2xsIiwic2x1ZyIsImZpZWxkVG9TZWFyY2giLCJkZWZhdWx0U29ydCIsImFkbWluIiwidXNlQXNUaXRsZSIsInF1ZXJ5IiwiZGVwdGgiLCJkcmFmdCIsImxpbWl0IiwicGFnZSIsIndoZXJlIiwiYW5kIiwiaWQiLCJub3RfaW4iLCJwdXNoIiwibGlrZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJxcyIsInN0cmluZ2lmeSIsImNyZWRlbnRpYWxzIiwiaGVhZGVycyIsImxhbmd1YWdlIiwib2siLCJkYXRhIiwianNvbiIsInByZXZTdGF0ZSIsIm5leHRQYWdlIiwiZG9jcyIsImxlbmd0aCIsInR5cGUiLCJzdGF0dXMiLCJpZHMiLCJ1cGRhdGVTZWFyY2giLCJ1c2VEZWJvdW5jZWRDYWxsYmFjayIsImhhbmRsZUlucHV0Q2hhbmdlIiwidXNlRWZmZWN0IiwiT2JqZWN0IiwiZW50cmllcyIsImlkc1RvTG9hZCIsImZpbHRlciIsIm9wdGlvbkdyb3VwIiwib3B0aW9uIiwiaW4iLCJpc0lkT25seSIsImlkT25seSIsImN1cnJlbnQiLCJvblNhdmUiLCJhcmdzIiwiY29sbGVjdGlvbkNvbmZpZyIsImRvYyIsImZpbHRlck9wdGlvbiIsIml0ZW0iLCJzZWFyY2hGaWx0ZXIiLCJyIiwid29yZEJvdW5kYXJpZXNSZWdleCIsImJyZWFrQXBhcnRUaHJlc2hvbGQiLCJzdHJpbmciLCJsYWJlbCIsImluZGV4T2ZTcGFjZSIsInRlc3QiLCJ2YWx1ZVRvUmVuZGVyIiwiZmluZE9wdGlvbnNCeVZhbHVlIiwiZGl2IiwiZmllbGRCYXNlQ2xhc3MiLCJCb29sZWFuIiwiam9pbiIsInJlcGxhY2UiLCJHZXRGaWx0ZXJPcHRpb25zIiwiUmVhY3RTZWxlY3QiLCJiYWNrc3BhY2VSZW1vdmVzVmFsdWUiLCJjb21wb25lbnRzIiwiTXVsdGlWYWx1ZUxhYmVsIiwiU2luZ2xlVmFsdWUiLCJjdXN0b21Qcm9wcyIsImRpc2FibGVLZXlEb3duIiwiZGlzYWJsZU1vdXNlRG93biIsImRpc2FibGVkIiwiaXNNdWx0aSIsIm9uQ2hhbmdlIiwic2VsZWN0ZWQiLCJtYXAiLCJvbklucHV0Q2hhbmdlIiwibmV3U2VhcmNoIiwib25NZW51T3BlbiIsIm9uTWVudVNjcm9sbFRvQm90dG9tIiwiQWRkTmV3UmVsYXRpb24iLCJ3aXRoQ29uZGl0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7K0JBOGhCQTs7O2VBQUE7OzsyQkExaEJvQzsyREFDckI7K0RBQzZEO2tDQUszQztvRUFDVDtzQ0FDYTtzQkFDYjt3QkFDRTt3QkFDQTs2QkFDSzt5QkFDRztpRUFDYjsrQkFDUzt3QkFDQzt3QkFDQTttQ0FDRztvQ0FDQztRQUM1Qjt1RUFDb0I7aUNBQ0s7NkJBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTVCLE1BQU1BLHVCQUF1QjtBQUU3QixNQUFNQyxZQUFZO0FBRWxCLE1BQU1DLGVBQWdDLENBQUNDO0lBQ3JDLE1BQU0sRUFDSkMsSUFBSSxFQUNKQyxXQUFXLEVBQ1hDLEtBQUssRUFDTEMsS0FBSyxFQUNMQyxTQUFTLEVBQ1RDLE1BQU1DLGFBQWEsRUFDbkJDLFFBQVEsRUFDUkMsUUFBUSxFQUNSQyxLQUFLLEVBQ0xDLFFBQVEsRUFDUkMsS0FBSyxFQUNOLEdBQUdaO0lBRUosTUFBTWEsU0FBU0MsSUFBQUEsaUJBQVM7SUFFeEIsTUFBTSxFQUNKQyxXQUFXLEVBQ1hDLFFBQVEsRUFBRUMsR0FBRyxFQUFFLEVBQ2ZDLFNBQVMsRUFDVixHQUFHTDtJQUVKLE1BQU1NLGFBQWEsZ0JBQWdCbkIsUUFBUUEsT0FBT21CLGFBQWFDO0lBQy9ELE1BQU1DLFVBQVUsYUFBYXJCLFFBQVFBLE9BQU9xQixVQUFVRDtJQUN0RCxNQUFNRSxnQkFBZ0IsbUJBQW1CdEIsUUFBUUEsT0FBT3NCLGdCQUFnQkY7SUFDeEUsTUFBTUcsY0FBYyxpQkFBaUJ2QixRQUFRQSxPQUFPdUIsY0FBY0g7SUFDbEUsTUFBTUksYUFBYSxnQkFBZ0J4QixRQUFRQSxPQUFPd0IsYUFBYTtJQUMvRCxNQUFNQyxjQUFjLGlCQUFpQnpCLFFBQVFBLE9BQU95QixjQUFjO0lBRWxFLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxDQUFDLEVBQUUsR0FBR0MsSUFBQUEsMkJBQWM7SUFDbEMsTUFBTSxFQUFFQyxXQUFXLEVBQUUsR0FBR0MsSUFBQUEsYUFBTztJQUMvQixNQUFNLEVBQUVDLE1BQU1DLE1BQU0sRUFBRSxHQUFHQyxJQUFBQSxpQkFBUztJQUNsQyxNQUFNQyxpQkFBaUJDLElBQUFBLDBCQUFpQjtJQUN4QyxNQUFNQyx1QkFBdUJDLE1BQU1DLE9BQU8sQ0FBQ25CO0lBQzNDLE1BQU0sQ0FBQ29CLFNBQVNDLGdCQUFnQixHQUFHQyxJQUFBQSxpQkFBVSxFQUFDQyx1QkFBYyxFQUFFLEVBQUU7SUFDaEUsTUFBTSxDQUFDQyx5QkFBeUJDLDJCQUEyQixHQUFHQyxJQUFBQSxlQUFRLEVBQUMsQ0FBQztJQUN4RSxNQUFNLENBQUNDLGdCQUFnQkMsa0JBQWtCLEdBQUdGLElBQUFBLGVBQVEsRUFBeUIsQ0FBQztJQUM5RSxNQUFNLENBQUNHLGNBQWNDLGdCQUFnQixHQUFHSixJQUFBQSxlQUFRLEVBQUM7SUFDakQsTUFBTSxDQUFDSyxxQkFBcUJDLHVCQUF1QixHQUFHTixJQUFBQSxlQUFRO0lBQzlELE1BQU0sQ0FBQ08sUUFBUUMsVUFBVSxHQUFHUixJQUFBQSxlQUFRLEVBQUM7SUFDckMsTUFBTSxDQUFDUyxXQUFXQyxhQUFhLEdBQUdWLElBQUFBLGVBQVEsRUFBQztJQUMzQyxNQUFNLENBQUNXLG9CQUFvQkMsc0JBQXNCLEdBQUdaLElBQUFBLGVBQVEsRUFBQztJQUM3RCxNQUFNLENBQUNhLDBCQUEwQkMsNEJBQTRCLEdBQUdkLElBQUFBLGVBQVEsRUFBQztJQUN6RSxNQUFNZSxXQUFXQyxJQUFBQSxhQUFNLEVBQUM7SUFFeEIsTUFBTUMsbUJBQW1CQyxJQUFBQSxrQkFBVyxFQUNsQyxDQUFDQyxPQUFPQztRQUNOLElBQUksT0FBT3RELGFBQWEsWUFBWTtZQUNsQyxPQUFPQSxTQUFTcUQsT0FBTztnQkFBRSxHQUFHQyxpQkFBaUI7Z0JBQUV4RDtZQUFTO1FBQzFEO0lBQ0YsR0FDQTtRQUFDRTtRQUFVRjtLQUFTO0lBR3RCLE1BQU0sRUFBRXlELFlBQVksRUFBRTVELElBQUksRUFBRTZELFFBQVEsRUFBRUMsU0FBUyxFQUFFSixLQUFLLEVBQUUsR0FBR0ssSUFBQUEsaUJBQVEsRUFBa0I7UUFDbkYvRCxNQUFNQyxpQkFBaUJOO1FBQ3ZCVSxVQUFVbUQ7SUFDWjtJQUVBLE1BQU0sQ0FBQ1EsY0FBY0MsZ0JBQWdCLEdBQUcxQixJQUFBQSxlQUFRLEVBQUM7SUFFakQsTUFBTTJCLGFBQXlCVCxJQUFBQSxrQkFBVyxFQUN4QyxPQUFPLEVBQ0xwQix5QkFBeUI4QiwwQkFBMEIsRUFDbkRDLFNBQVMsRUFDVHRCLFFBQVF1QixTQUFTLEVBQ2pCQyxJQUFJLEVBQ0paLE9BQU9hLFFBQVEsRUFDaEI7UUFDQyxJQUFJLENBQUNoRCxhQUFhO1lBQ2hCO1FBQ0Y7UUFDQSxNQUFNaUQsK0JBQ0osT0FBT0wsK0JBQStCLGNBQWNBLDZCQUE2QixDQUFDO1FBRXBGLE1BQU1NLFlBQVkxQyxNQUFNQyxPQUFPLENBQUNuQixjQUFjQSxhQUFhO1lBQUNBO1NBQVc7UUFDdkUsTUFBTTZELG1CQUNKRixpQ0FBaUMsQ0FBQyxJQUM5QkMsWUFDQUEsVUFBVUUsS0FBSyxDQUFDSCwrQkFBK0I7UUFFckQsSUFBSUksaUJBQWlCO1FBQ3JCLE1BQU1DLGNBQWNDLElBQUFBLG9DQUFpQixFQUFDO1lBQ3BDL0Q7WUFDQUY7WUFDQTZDLE9BQU9hO1FBQ1Q7UUFFQSxJQUFJLENBQUM3QixjQUFjO1lBQ2pCZ0MsaUJBQWlCSyxNQUFNLENBQUMsT0FBT0MsZUFBZUM7Z0JBQzVDLE1BQU1DLHVCQUF1QnRDLHFCQUFxQixDQUFDcUMsU0FBUztnQkFDNUQsSUFBSUU7Z0JBQ0osSUFBSXJDLFdBQVd1QixXQUFXO29CQUN4QmMsc0JBQXNCO2dCQUN4QixPQUFPO29CQUNMQSxzQkFBc0IzQyxjQUFjLENBQUN5QyxTQUFTLEdBQUc7Z0JBQ25EO2dCQUNBLE1BQU1EO2dCQUVOLElBQUlFLHlCQUF5QixPQUFPO29CQUNsQzVDLDJCQUEyQm1DLFVBQVVXLE9BQU8sQ0FBQ0g7b0JBQzdDLE9BQU9JLFFBQVFDLE9BQU87Z0JBQ3hCO2dCQUVBLElBQUlWLGlCQUFpQixJQUFJO29CQUN2QixNQUFNVyxhQUFhOUUsWUFBWStFLElBQUksQ0FBQyxDQUFDQyxPQUFTQSxLQUFLQyxJQUFJLEtBQUtUO29CQUM1RCxJQUFJVSxnQkFBZ0JKLFlBQVlLLGVBQWVMLFlBQVlNLE9BQU9DLGNBQWM7b0JBQ2hGLElBQUksQ0FBQ3pCLFdBQVc7d0JBQ2QsSUFBSSxPQUFPcEQsZ0JBQWdCLFVBQVU7NEJBQ25DMEUsZ0JBQWdCMUU7d0JBQ2xCLE9BQU8sSUFBSUEsYUFBYSxDQUFDZ0UsU0FBUyxFQUFFOzRCQUNsQ1UsZ0JBQWdCMUUsV0FBVyxDQUFDZ0UsU0FBUzt3QkFDdkM7b0JBQ0Y7b0JBRUEsTUFBTWMsUUFHRjt3QkFDRkMsT0FBTzt3QkFDUEMsT0FBTzt3QkFDUEMsT0FBTzNHO3dCQUNQbUM7d0JBQ0F5RSxNQUFNaEI7d0JBQ05iLE1BQU1xQjt3QkFDTlMsT0FBTzs0QkFDTEMsS0FBSztnQ0FDSDtvQ0FDRUMsSUFBSTt3Q0FDRkMsUUFBUTFCLFdBQVcsQ0FBQ0ksU0FBUztvQ0FDL0I7Z0NBQ0Y7NkJBQ0Q7d0JBQ0g7b0JBQ0Y7b0JBRUEsSUFBSVosV0FBVzt3QkFDYjBCLE1BQU1LLEtBQUssQ0FBQ0MsR0FBRyxDQUFDRyxJQUFJLENBQUM7NEJBQ25CLENBQUNiLGNBQWMsRUFBRTtnQ0FDZmMsTUFBTXBDOzRCQUNSO3dCQUNGO29CQUNGO29CQUVBLElBQUlhLHdCQUF3QixPQUFPQSx5QkFBeUIsV0FBVzt3QkFDckVhLE1BQU1LLEtBQUssQ0FBQ0MsR0FBRyxDQUFDRyxJQUFJLENBQUN0QjtvQkFDdkI7b0JBRUEsTUFBTXdCLFdBQVcsTUFBTUMsTUFBTSxDQUFDLEVBQUUvRixVQUFVLEVBQUVELElBQUksQ0FBQyxFQUFFc0UsU0FBUyxDQUFDLEVBQUUyQixXQUFFLENBQUNDLFNBQVMsQ0FBQ2QsT0FBTyxDQUFDLEVBQUU7d0JBQ3BGZSxhQUFhO3dCQUNiQyxTQUFTOzRCQUNQLG1CQUFtQjNGLEtBQUs0RixRQUFRO3dCQUNsQztvQkFDRjtvQkFFQSxJQUFJTixTQUFTTyxFQUFFLEVBQUU7d0JBQ2YsTUFBTUMsT0FBK0IsTUFBTVIsU0FBU1MsSUFBSTt3QkFDeEQxRSxrQkFBa0IsQ0FBQzJFOzRCQUNqQixPQUFPO2dDQUNMLEdBQUdBLFNBQVM7Z0NBQ1osQ0FBQ25DLFNBQVMsRUFBRUU7NEJBQ2Q7d0JBQ0Y7d0JBRUEsSUFBSSxDQUFDK0IsS0FBS0csUUFBUSxFQUFFOzRCQUNsQi9FLDJCQUEyQm1DLFVBQVVXLE9BQU8sQ0FBQ0g7d0JBQy9DO3dCQUVBLElBQUlpQyxLQUFLSSxJQUFJLENBQUNDLE1BQU0sR0FBRyxHQUFHOzRCQUN4QjNDLGtCQUFrQnNDLEtBQUtJLElBQUksQ0FBQ0MsTUFBTTs0QkFFbENyRixnQkFBZ0I7Z0NBQ2RzRixNQUFNO2dDQUNOakM7Z0NBQ0EsaUJBQWlCO2dDQUNqQix1QkFBdUI7Z0NBQ3ZCaEY7Z0NBQ0ErRyxNQUFNSixLQUFLSSxJQUFJO2dDQUNmbEc7Z0NBQ0FrRDs0QkFDRjt3QkFDRjtvQkFDRixPQUFPLElBQUlvQyxTQUFTZSxNQUFNLEtBQUssS0FBSzt3QkFDbENuRiwyQkFBMkJtQyxVQUFVVyxPQUFPLENBQUNIO3dCQUM3Qy9DLGdCQUFnQjs0QkFDZHNGLE1BQU07NEJBQ05qQzs0QkFDQSxpQkFBaUI7NEJBQ2pCLHVCQUF1Qjs0QkFDdkJoRjs0QkFDQStHLE1BQU0sRUFBRTs0QkFDUmxHOzRCQUNBc0csS0FBSzdDLFdBQVcsQ0FBQ0ksU0FBUzs0QkFDMUJYO3dCQUNGO29CQUNGLE9BQU87d0JBQ0wzQixnQkFBZ0J0QixFQUFFO29CQUNwQjtnQkFDRjtZQUNGLEdBQUdnRSxRQUFRQyxPQUFPO1lBRWxCLElBQUksT0FBT2xCLGNBQWMsWUFBWUE7UUFDdkM7SUFDRixHQUNBO1FBQ0U3QztRQUNBVjtRQUNBRTtRQUNBMkI7UUFDQUk7UUFDQU47UUFDQS9CO1FBQ0FpQjtRQUNBa0I7UUFDQWhDO1FBQ0FLO1FBQ0FOO1FBQ0FTO1FBQ0FiO1FBQ0FjO0tBQ0Q7SUFHSCxNQUFNc0csZUFBZUMsSUFBQUEsMENBQW9CLEVBQUMsQ0FBQ3ZELFdBQW1CRTtRQUM1REwsV0FBVztZQUFFcEIsUUFBUXVCO1lBQVdDLE1BQU07WUFBTVosT0FBT2E7UUFBUztRQUM1RHhCLFVBQVVzQjtJQUNaLEdBQUc7SUFFSCxNQUFNd0Qsb0JBQW9CcEUsSUFBQUEsa0JBQVcsRUFDbkMsQ0FBQ1ksV0FBbUJFO1FBQ2xCLElBQUl6QixXQUFXdUIsV0FBVztZQUN4QjVCLGtCQUFrQixDQUFDO1lBQ25Ca0YsYUFBYXRELFdBQVdFLFVBQVVGLGNBQWM7UUFDbEQ7SUFDRixHQUNBO1FBQUN2QjtRQUFRNkU7S0FBYTtJQUd4QixzQ0FBc0M7SUFDdEMsMENBQTBDO0lBQzFDLHNDQUFzQztJQUV0Q0csSUFBQUEsZ0JBQVMsRUFBQztRQUNSLE1BQU1qRCxjQUFjQyxJQUFBQSxvQ0FBaUIsRUFBQztZQUNwQy9EO1lBQ0FGO1lBQ0E2QztRQUNGO1FBRUFxRSxPQUFPQyxPQUFPLENBQUNuRCxhQUFhRSxNQUFNLENBQUMsT0FBT0MsZUFBZSxDQUFDQyxVQUFVeUMsSUFBSTtZQUN0RSxNQUFNMUM7WUFFTixNQUFNaUQsWUFBWVAsSUFBSVEsTUFBTSxDQUFDLENBQUM1QjtnQkFDNUIsT0FBTyxDQUFDckUsUUFBUXVELElBQUksQ0FBQyxDQUFDMkMsY0FDcEJBLGFBQWFsRyxTQUFTdUQsS0FDcEIsQ0FBQzRDLFNBQVdBLE9BQU8xRSxLQUFLLEtBQUs0QyxNQUFNOEIsT0FBT3ZILFVBQVUsS0FBS29FO1lBRy9EO1lBRUEsSUFBSWdELFVBQVVWLE1BQU0sR0FBRyxHQUFHO2dCQUN4QixNQUFNeEIsUUFBUTtvQkFDWkMsT0FBTztvQkFDUEMsT0FBTztvQkFDUEMsT0FBTytCLFVBQVVWLE1BQU07b0JBQ3ZCN0Y7b0JBQ0EwRSxPQUFPO3dCQUNMRSxJQUFJOzRCQUNGK0IsSUFBSUo7d0JBQ047b0JBQ0Y7Z0JBQ0Y7Z0JBRUEsSUFBSSxDQUFDdkYsY0FBYztvQkFDakIsTUFBTWdFLFdBQVcsTUFBTUMsTUFBTSxDQUFDLEVBQUUvRixVQUFVLEVBQUVELElBQUksQ0FBQyxFQUFFc0UsU0FBUyxDQUFDLEVBQUUyQixXQUFFLENBQUNDLFNBQVMsQ0FBQ2QsT0FBTyxDQUFDLEVBQUU7d0JBQ3BGZSxhQUFhO3dCQUNiQyxTQUFTOzRCQUNQLG1CQUFtQjNGLEtBQUs0RixRQUFRO3dCQUNsQztvQkFDRjtvQkFFQSxNQUFNekIsYUFBYTlFLFlBQVkrRSxJQUFJLENBQUMsQ0FBQ0MsT0FBU0EsS0FBS0MsSUFBSSxLQUFLVDtvQkFDNUQsSUFBSXFDLE9BQU8sRUFBRTtvQkFFYixJQUFJWixTQUFTTyxFQUFFLEVBQUU7d0JBQ2YsTUFBTUMsT0FBTyxNQUFNUixTQUFTUyxJQUFJO3dCQUNoQ0csT0FBT0osS0FBS0ksSUFBSTtvQkFDbEI7b0JBRUFwRixnQkFBZ0I7d0JBQ2RzRixNQUFNO3dCQUNOakM7d0JBQ0EsaUJBQWlCO3dCQUNqQix1QkFBdUI7d0JBQ3ZCaEY7d0JBQ0ErRzt3QkFDQWxHO3dCQUNBc0csS0FBS087d0JBQ0wzRCxNQUFNO29CQUNSO2dCQUNGO1lBQ0Y7UUFDRixHQUFHZSxRQUFRQyxPQUFPO0lBQ3BCLEdBQUc7UUFDRHJEO1FBQ0F5QjtRQUNBM0M7UUFDQTJCO1FBQ0FqQztRQUNBcUI7UUFDQWxCO1FBQ0FEO1FBQ0FTO1FBQ0FQO1FBQ0FhO1FBQ0FuQjtLQUNEO0lBRUQsd0RBQXdEO0lBQ3hEdUgsSUFBQUEsZ0JBQVMsRUFBQztRQUNSLE1BQU1yRCxZQUFZMUMsTUFBTUMsT0FBTyxDQUFDbkIsY0FBY0EsYUFBYTtZQUFDQTtTQUFXO1FBQ3ZFLE1BQU15SCxXQUFXN0QsVUFBVU0sTUFBTSxDQUFDLENBQUN3RCxRQUFRdEQ7WUFDekMsTUFBTU0sYUFBYTlFLFlBQVkrRSxJQUFJLENBQUMsQ0FBQ0MsT0FBU0EsS0FBS0MsSUFBSSxLQUFLVDtZQUM1RCxNQUFNVSxnQkFBZ0JKLFlBQVlNLE9BQU9DLGNBQWM7WUFDdkQsT0FBT0gsa0JBQWtCLFFBQVE0QztRQUNuQyxHQUFHO1FBQ0hsRiw0QkFBNEIsQ0FBQ2lGO0lBQy9CLEdBQUc7UUFBQ3pIO1FBQVlKO0tBQVk7SUFFNUIsb0ZBQW9GO0lBQ3BGLDRDQUE0QztJQUM1Q3FILElBQUFBLGdCQUFTLEVBQUM7UUFDUixJQUFJeEUsU0FBU2tGLE9BQU8sRUFBRTtZQUNwQmxGLFNBQVNrRixPQUFPLEdBQUc7WUFDbkI7UUFDRjtRQUVBdEcsZ0JBQWdCO1lBQUVzRixNQUFNO1FBQVE7UUFDaENsRiwyQkFBMkIsQ0FBQztRQUM1Qkcsa0JBQWtCLENBQUM7UUFDbkJVLHNCQUFzQjtJQUN4QixHQUFHO1FBQUN0QztRQUFZK0I7UUFBcUJsQjtLQUFPO0lBRTVDLE1BQU0rRyxTQUFTaEYsSUFBQUEsa0JBQVcsRUFDeEIsQ0FBQ2lGO1FBQ0N4RyxnQkFBZ0I7WUFDZHNGLE1BQU07WUFDTmpDLFlBQVltRCxLQUFLQyxnQkFBZ0I7WUFDakMsaUJBQWlCO1lBQ2pCLHVCQUF1QjtZQUN2QnBJO1lBQ0FxSSxLQUFLRixLQUFLRSxHQUFHO1lBQ2J4SDtRQUNGO0lBQ0YsR0FDQTtRQUFDQTtRQUFNYjtLQUFPO0lBR2hCLE1BQU1zSSxlQUFlcEYsSUFBQUEsa0JBQVcsRUFBQyxDQUFDcUYsTUFBY0M7UUFDOUMsSUFBSSxDQUFDQSxjQUFjO1lBQ2pCLE9BQU87UUFDVDtRQUNBLE1BQU1DLElBQUlDLElBQUFBLDhCQUFtQixFQUFDRixnQkFBZ0I7UUFDOUMseUVBQXlFO1FBQ3pFLE1BQU1HLHNCQUFzQjtRQUM1QixJQUFJQyxTQUFTTCxLQUFLTSxLQUFLO1FBQ3ZCLGdFQUFnRTtRQUNoRSxNQUFPRCxPQUFPNUIsTUFBTSxHQUFHMkIsb0JBQXFCO1lBQzFDLGlIQUFpSDtZQUNqSCxNQUFNRyxlQUFlRixPQUFPL0QsT0FBTyxDQUFDLEtBQUsyRCxhQUFheEIsTUFBTTtZQUM1RCxJQUFJeUIsRUFBRU0sSUFBSSxDQUFDSCxPQUFPeEUsS0FBSyxDQUFDLEdBQUcwRSxpQkFBaUIsQ0FBQyxJQUFJTixhQUFheEIsTUFBTSxHQUFHOEIsZUFBZSxLQUFLO2dCQUN6RixPQUFPO1lBQ1Q7WUFDQUYsU0FBU0EsT0FBT3hFLEtBQUssQ0FBQzBFLGlCQUFpQixDQUFDLElBQUlOLGFBQWF4QixNQUFNLEdBQUc4QixlQUFlO1FBQ25GO1FBQ0EsT0FBT0wsRUFBRU0sSUFBSSxDQUFDSCxPQUFPeEUsS0FBSyxDQUFDLENBQUN1RTtJQUM5QixHQUFHLEVBQUU7SUFFTCxNQUFNSyxnQkFBZ0JDLElBQUFBLHNDQUFrQixFQUFDO1FBQUV2SDtRQUFTeUI7SUFBTTtJQUUxRCxJQUFJLENBQUMzQixNQUFNQyxPQUFPLENBQUN1SCxrQkFBa0JBLGVBQWU3RixVQUFVLFFBQVE2RixjQUFjN0YsS0FBSyxHQUFHO0lBRTVGLHFCQUNFLDZCQUFDK0Y7UUFDQzFKLFdBQVc7WUFDVDJKLHNCQUFjO1lBQ2RsSztZQUNBTztZQUNBK0QsYUFBYTtZQUNicEIsZ0JBQWdCO1lBQ2hCeEMsWUFBWSxDQUFDLEVBQUVWLFVBQVUsV0FBVyxDQUFDO1NBQ3RDLENBQ0UwSSxNQUFNLENBQUN5QixTQUNQQyxJQUFJLENBQUM7UUFDUnRELElBQUksQ0FBQyxNQUFNLEVBQUV0RyxLQUFLNkosT0FBTyxDQUFDLE9BQU8sTUFBTSxDQUFDO1FBQ3hDekosT0FBTztZQUNMLEdBQUdBLEtBQUs7WUFDUkU7UUFDRjtPQUVDVCxPQUNBQyxxQkFDRCw2QkFBQ2dLLGtDQUFnQixFQUNYO1FBQ0Y5STtRQUNBNEI7UUFDQTVDO1FBQ0FhO1FBQ0FnQztJQUNGLElBRUQsQ0FBQ0gsOEJBQ0EsNkJBQUMrRztRQUFJMUosV0FBVyxDQUFDLEVBQUVQLFVBQVUsTUFBTSxDQUFDO3FCQUNsQyw2QkFBQ3VLLG9CQUFXO1FBQ1ZDLHVCQUF1QixDQUFDaEc7UUFDeEJpRyxZQUFZO1lBQ1ZDLGlCQUFBQSxnQ0FBZTtZQUNmQyxhQUFBQSx3QkFBVztRQUNiO1FBQ0FDLGFBQWE7WUFDWEMsZ0JBQWdCckc7WUFDaEJzRyxrQkFBa0J0RztZQUNsQnlFO1lBQ0F4RTtRQUNGO1FBQ0FzRyxVQUFVckssWUFBWTBCO1FBQ3RCaUgsY0FBY3pGLDJCQUEyQnlGLGVBQWUvSDtRQUN4RGtDLFdBQVdBO1FBQ1h3SCxTQUFTeko7UUFDVEcsWUFBWUE7UUFDWnVKLFVBQ0UsQ0FBQ3ZLLFdBQ0csQ0FBQ3dLO1lBQ0MsSUFBSUEsYUFBYSxNQUFNO2dCQUNyQjdHLFNBQVM5QyxVQUFVLEVBQUUsR0FBRztZQUMxQixPQUFPLElBQUlBLFNBQVM7Z0JBQ2xCOEMsU0FDRTZHLFdBQ0lBLFNBQVNDLEdBQUcsQ0FBQyxDQUFDdkM7b0JBQ1osSUFBSXRHLHNCQUFzQjt3QkFDeEIsT0FBTzs0QkFDTGpCLFlBQVl1SCxPQUFPdkgsVUFBVTs0QkFDN0I2QyxPQUFPMEUsT0FBTzFFLEtBQUs7d0JBQ3JCO29CQUNGO29CQUVBLE9BQU8wRSxPQUFPMUUsS0FBSztnQkFDckIsS0FDQTtZQUVSLE9BQU8sSUFBSTVCLHNCQUFzQjtnQkFDL0IrQixTQUFTO29CQUNQaEQsWUFBWTZKLFNBQVM3SixVQUFVO29CQUMvQjZDLE9BQU9nSCxTQUFTaEgsS0FBSztnQkFDdkI7WUFDRixPQUFPO2dCQUNMRyxTQUFTNkcsU0FBU2hILEtBQUs7WUFDekI7UUFDRixJQUNBNUM7UUFFTjhKLGVBQWUsQ0FBQ0MsWUFBY2hELGtCQUFrQmdELFdBQVduSDtRQUMzRG9ILFlBQVk7WUFDVixJQUFJLENBQUM1SCxvQkFBb0I7Z0JBQ3ZCRCxhQUFhO2dCQUNiaUIsV0FBVztvQkFDVEUsV0FBVzt3QkFDVGpCLHNCQUFzQjt3QkFDdEJGLGFBQWE7b0JBQ2Y7b0JBQ0FTLE9BQU9FO2dCQUNUO1lBQ0Y7UUFDRjtRQUNBbUgsc0JBQXNCO1lBQ3BCN0csV0FBVztnQkFDVDdCO2dCQUNBUztnQkFDQXdCLE1BQU07Z0JBQ05aLE9BQU9FO1lBQ1Q7UUFDRjtRQUNBM0IsU0FBU0E7UUFDVDZCLFdBQVdBO1FBQ1hKLE9BQU82RixpQkFBaUI7UUFFekIsQ0FBQ3JKLFlBQVlpQiw2QkFDWiw2QkFBQzZKLHNCQUFjLEVBQ1Q7UUFDRjlJO1FBQ0FuQjtRQUNBa0I7UUFDQWpDO1FBQ0FhO1FBQ0FnRDtRQUNBSDtJQUNGLEtBS1BoQiw4QkFBZ0IsNkJBQUMrRztRQUFJMUosV0FBVyxDQUFDLEVBQUVQLFVBQVUsZUFBZSxDQUFDO09BQUdrRCxlQUNoRTlDO0FBR1A7TUFFQSxXQUFlcUwsSUFBQUEsNEJBQWEsRUFBQ3hMIn0=