@onepercentio/one-ui 1.3.3 → 1.3.4

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 (310) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/img/svg/checkbox.svg +3 -0
  3. package/dist/assets/styles/index.scss +2 -0
  4. package/dist/assets/styles/mixins.scss +15 -0
  5. package/dist/assets/styles/variables.scss +49 -0
  6. package/dist/components/AdaptiveButton/AdaptiveButton.js +32 -0
  7. package/dist/components/AdaptiveButton/AdaptiveButton.module.scss +7 -0
  8. package/dist/components/AdaptiveButton/index.js +27 -0
  9. package/dist/components/AdaptiveContainer/AdaptiveContainer.js +152 -0
  10. package/dist/components/AdaptiveContainer/AdaptiveContainer.module.scss +53 -0
  11. package/dist/components/AdaptiveContainer/index.js +27 -0
  12. package/dist/components/AdaptiveDialog/AdaptiveDialog.js +81 -0
  13. package/dist/components/AdaptiveDialog/AdaptiveDialog.module.scss +145 -0
  14. package/dist/components/AdaptiveDialog/index.js +27 -0
  15. package/dist/components/AdaptiveSidebar/AdaptiveSidebar.js +77 -0
  16. package/dist/components/AdaptiveSidebar/AdaptiveSidebar.module.scss +49 -0
  17. package/dist/components/AdaptiveSidebar/AdaptiveSidebar.sample.js +13 -0
  18. package/dist/components/AdaptiveSidebar/index.js +27 -0
  19. package/dist/components/AnchoredTooltip/AnchoredTooltip.js +168 -0
  20. package/dist/components/AnchoredTooltip/AnchoredTooltip.module.scss +64 -0
  21. package/dist/components/AnchoredTooltip/index.js +27 -0
  22. package/dist/components/AnimatedEntrance/AnimatedEntrance.js +166 -0
  23. package/dist/components/AnimatedEntrance/AnimatedEntrance.module.scss +108 -0
  24. package/dist/components/AnimatedEntrance/index.js +27 -0
  25. package/dist/components/AsyncTriggerContainer/AsyncTriggerContainer.js +95 -0
  26. package/dist/components/AsyncTriggerContainer/AsyncTriggerContainer.module.scss +22 -0
  27. package/dist/components/AsyncTriggerContainer/index.js +27 -0
  28. package/dist/components/AsyncWrapper/AsyncWrapper.js +42 -0
  29. package/dist/components/AsyncWrapper/index.js +27 -0
  30. package/dist/components/Avatar/Avatar.js +40 -0
  31. package/dist/components/Avatar/Avatar.module.scss +22 -0
  32. package/dist/components/Avatar/index.js +27 -0
  33. package/dist/components/BucketFill/BucketFill.js +56 -0
  34. package/dist/components/BucketFill/BucketFill.module.scss +36 -0
  35. package/dist/components/BucketFill/index.js +27 -0
  36. package/dist/components/Button/Button.js +39 -0
  37. package/dist/components/Button/Button.module.scss +45 -0
  38. package/dist/components/Button/index.js +27 -0
  39. package/dist/components/Card/Card.js +22 -0
  40. package/dist/components/Card/Card.module.scss +12 -0
  41. package/dist/components/Card/index.js +27 -0
  42. package/dist/components/Chart/Chart.js +27 -0
  43. package/dist/components/Chart/Chart.logic.js +14 -0
  44. package/dist/components/Chart/Chart.module.scss +58 -0
  45. package/dist/components/Chart/Chart.types.js +6 -0
  46. package/dist/components/Chart/Chart.view.js +184 -0
  47. package/dist/components/Chart/index.js +27 -0
  48. package/dist/components/CheckBox/CheckBox.js +52 -0
  49. package/dist/components/CheckBox/CheckBox.module.scss +36 -0
  50. package/dist/components/CheckBox/index.js +27 -0
  51. package/dist/components/CodeInput/CodeInput.js +84 -0
  52. package/dist/components/CodeInput/CodeInput.module.scss +5 -0
  53. package/dist/components/CodeInput/index.js +27 -0
  54. package/dist/components/Collapsable/Collapsable.js +186 -0
  55. package/dist/components/Collapsable/Collapsable.module.scss +42 -0
  56. package/dist/components/Collapsable/index.js +27 -0
  57. package/dist/components/Countdown/Countdown.js +83 -0
  58. package/dist/components/Countdown/index.js +27 -0
  59. package/dist/components/CurrencyInput/CurrencyInput.hook.js +28 -0
  60. package/dist/components/CurrencyInput/CurrencyInput.js +54 -0
  61. package/dist/components/CurrencyInput/index.js +27 -0
  62. package/dist/components/Divider/Divider.js +21 -0
  63. package/dist/components/Divider/Divider.module.scss +7 -0
  64. package/dist/components/Divider/index.js +27 -0
  65. package/dist/components/EmailInput/EmailInput.js +48 -0
  66. package/dist/components/EmailInput/EmailInput.module.scss +0 -0
  67. package/dist/components/EmailInput/index.js +27 -0
  68. package/dist/components/FadeIn/FadeIn.js +64 -0
  69. package/dist/components/FadeIn/FadeIn.module.scss +9 -0
  70. package/dist/components/FadeIn/index.js +27 -0
  71. package/dist/components/FileInput/FileInput.js +53 -0
  72. package/dist/components/FileInput/FileInput.module.scss +6 -0
  73. package/dist/components/FileInput/View/BigFactory/BigFactory.js +54 -0
  74. package/dist/components/FileInput/View/BigFactory/BigFactory.module.scss +20 -0
  75. package/dist/components/FileInput/View/BigFactory/index.js +27 -0
  76. package/dist/components/FileInput/View/Compact/Compact.js +120 -0
  77. package/dist/components/FileInput/View/Compact/Compact.module.scss +68 -0
  78. package/dist/components/FileInput/View/Compact/index.js +27 -0
  79. package/dist/components/FileInput/View/View.types.js +6 -0
  80. package/dist/components/FileInput/index.js +27 -0
  81. package/dist/components/FlowController/FlowController.js +66 -0
  82. package/dist/components/FlowController/FlowController.module.scss +47 -0
  83. package/dist/components/FlowController/index.js +27 -0
  84. package/dist/components/Form/Form.hook.js +234 -0
  85. package/dist/components/Form/Form.js +115 -0
  86. package/dist/components/Form/Form.module.scss +0 -0
  87. package/dist/components/Form/Form.types.js +40 -0
  88. package/dist/components/Form/FormField/Extensions/DateField/DateField.js +75 -0
  89. package/dist/components/Form/FormField/Extensions/DateField/DateField.module.scss +0 -0
  90. package/dist/components/Form/FormField/Extensions/DateField/index.js +27 -0
  91. package/dist/components/Form/FormField/Extensions/PhoneField/PhoneField.js +91 -0
  92. package/dist/components/Form/FormField/Extensions/PhoneField/PhoneField.module.scss +0 -0
  93. package/dist/components/Form/FormField/Extensions/PhoneField/index.js +27 -0
  94. package/dist/components/Form/FormField/FormField.js +296 -0
  95. package/dist/components/Form/FormField/FormField.types.js +12 -0
  96. package/dist/components/Form/FormField/index.js +27 -0
  97. package/dist/components/Form/index.js +27 -0
  98. package/dist/components/Freeze/Freeze.js +18 -0
  99. package/dist/components/Freeze/index.js +27 -0
  100. package/dist/components/HSForms/HSForms.js +55 -0
  101. package/dist/components/HSForms/index.js +27 -0
  102. package/dist/components/HeaderCloseBtn/HeaderCloseBtn.js +25 -0
  103. package/dist/components/HeaderCloseBtn/HeaderCloseBtn.module.scss +44 -0
  104. package/dist/components/HeaderCloseBtn/index.js +27 -0
  105. package/dist/components/InfinityScroll/InfinityScroll.js +128 -0
  106. package/dist/components/InfinityScroll/InfinityScroll.module.scss +30 -0
  107. package/dist/components/InfinityScroll/index.js +27 -0
  108. package/dist/components/Input/Input.js +110 -0
  109. package/dist/components/Input/Input.module.scss +31 -0
  110. package/dist/components/Input/index.js +27 -0
  111. package/dist/components/InstantCounter/InstantCounter.js +55 -0
  112. package/dist/components/InstantCounter/index.js +27 -0
  113. package/dist/components/LavaLamp/LavaLamp.data.js +89 -0
  114. package/dist/components/LavaLamp/LavaLamp.js +125 -0
  115. package/dist/components/LavaLamp/LavaLamp.module.scss +26 -0
  116. package/dist/components/LavaLamp/index.js +27 -0
  117. package/dist/components/LavaLamp/v2/LavaLamp.js +154 -0
  118. package/dist/components/LavaLamp/v2/LavaLamp.module.scss +23 -0
  119. package/dist/components/LinkToId/LinkToId.js +45 -0
  120. package/dist/components/LinkToId/LinkToId.module.scss +4 -0
  121. package/dist/components/LinkToId/index.js +27 -0
  122. package/dist/components/Loader/Loader.js +27 -0
  123. package/dist/components/Loader/Loader.module.scss +40 -0
  124. package/dist/components/Loader/index.js +27 -0
  125. package/dist/components/LoaderDotsIndicator/LoaderDotsIndicator.js +36 -0
  126. package/dist/components/LoaderDotsIndicator/index.js +27 -0
  127. package/dist/components/LoopableVideo/LoopableVideo.js +41 -0
  128. package/dist/components/LoopableVideo/index.js +27 -0
  129. package/dist/components/MainGrid/MainGrid.js +55 -0
  130. package/dist/components/MainGrid/MainGrid.module.scss +28 -0
  131. package/dist/components/MainGrid/index.js +27 -0
  132. package/dist/components/MutableHamburgerButton/MutableHamburgerButton.js +32 -0
  133. package/dist/components/MutableHamburgerButton/MutableHamburgerButton.module.scss +220 -0
  134. package/dist/components/MutableHamburgerButton/index.js +27 -0
  135. package/dist/components/Notification/Notification.js +24 -0
  136. package/dist/components/Notification/Notification.module.scss +25 -0
  137. package/dist/components/Notification/index.js +27 -0
  138. package/dist/components/NumberInput/NumberInput.js +50 -0
  139. package/dist/components/NumberInput/index.js +27 -0
  140. package/dist/components/OrderableList/OrderableList.js +439 -0
  141. package/dist/components/OrderableList/OrderableList.module.scss +98 -0
  142. package/dist/components/OrderableList/index.js +27 -0
  143. package/dist/components/PaginationIndicator/PaginationIndicator.js +261 -0
  144. package/dist/components/PaginationIndicator/index.js +27 -0
  145. package/dist/components/Parallax/Parallax.js +169 -0
  146. package/dist/components/Parallax/Parallax.module.scss +28 -0
  147. package/dist/components/Parallax/index.js +27 -0
  148. package/dist/components/Parallax/math/helpers.js +134 -0
  149. package/dist/components/PasswordInput/PasswordInput.js +97 -0
  150. package/dist/components/PasswordInput/PasswordInput.module.scss +17 -0
  151. package/dist/components/PasswordInput/index.js +27 -0
  152. package/dist/components/PingPongText/PingPongText.js +76 -0
  153. package/dist/components/PingPongText/PingPongText.module.scss +4 -0
  154. package/dist/components/PingPongText/index.js +27 -0
  155. package/dist/components/PixelatedScan/PixelatedScan.js +139 -0
  156. package/dist/components/PixelatedScan/PixelatedScan.module.scss +86 -0
  157. package/dist/components/PixelatedScan/index.js +27 -0
  158. package/dist/components/Portal/Portal.js +62 -0
  159. package/dist/components/Portal/Portal.module.scss +3 -0
  160. package/dist/components/Portal/index.js +27 -0
  161. package/dist/components/ProgressBar/ProgressBar.js +113 -0
  162. package/dist/components/ProgressBar/ProgressBar.module.scss +44 -0
  163. package/dist/components/ProgressBar/index.js +27 -0
  164. package/dist/components/ProgressTexts/ProgressTexts.js +52 -0
  165. package/dist/components/ProgressTexts/ProgressTexts.module.scss +37 -0
  166. package/dist/components/ProgressTexts/index.js +27 -0
  167. package/dist/components/Radio/Radio.js +53 -0
  168. package/dist/components/Radio/Radio.module.scss +20 -0
  169. package/dist/components/Radio/index.js +27 -0
  170. package/dist/components/Radio/variants/Checkmark/Checkmark.js +20 -0
  171. package/dist/components/Radio/variants/Checkmark/Checkmark.module.scss +24 -0
  172. package/dist/components/Radio/variants/Checkmark/index.js +27 -0
  173. package/dist/components/Radio/variants/Generic/Generic.js +22 -0
  174. package/dist/components/Radio/variants/Generic/Generic.module.scss +38 -0
  175. package/dist/components/Radio/variants/Generic/index.js +27 -0
  176. package/dist/components/SectionContainer/SectionContainer.js +49 -0
  177. package/dist/components/SectionContainer/SectionContainer.module.scss +30 -0
  178. package/dist/components/SectionContainer/index.js +27 -0
  179. package/dist/components/Select/Select.js +138 -0
  180. package/dist/components/Select/Select.module.scss +60 -0
  181. package/dist/components/Select/index.js +27 -0
  182. package/dist/components/Skeleton/Skeleton.js +30 -0
  183. package/dist/components/Skeleton/Skeleton.module.scss +21 -0
  184. package/dist/components/Skeleton/index.js +27 -0
  185. package/dist/components/Slider/Slider.js +70 -0
  186. package/dist/components/Slider/Slider.module.scss +7 -0
  187. package/dist/components/Slider/index.js +27 -0
  188. package/dist/components/Spacing/Spacing.js +34 -0
  189. package/dist/components/Spacing/Spacing.module.scss +13 -0
  190. package/dist/components/Spacing/index.js +27 -0
  191. package/dist/components/StaticScroller/StaticScroller.js +72 -0
  192. package/dist/components/StaticScroller/StaticScroller.module.scss +14 -0
  193. package/dist/components/StaticScroller/index.js +27 -0
  194. package/dist/components/Switch/Switch.js +47 -0
  195. package/dist/components/Switch/Switch.module.scss +46 -0
  196. package/dist/components/Switch/index.js +27 -0
  197. package/dist/components/Table/Table.js +115 -0
  198. package/dist/components/Table/Table.module.scss +74 -0
  199. package/dist/components/Table/index.js +27 -0
  200. package/dist/components/Tabs/Tabs.js +67 -0
  201. package/dist/components/Tabs/Tabs.module.scss +40 -0
  202. package/dist/components/Tabs/index.js +27 -0
  203. package/dist/components/Text/Text.js +44 -0
  204. package/dist/components/Text/Text.module.scss +13 -0
  205. package/dist/components/Text/index.js +27 -0
  206. package/dist/components/Transition/MasksFactory/DiagonalReveal.js +49 -0
  207. package/dist/components/Transition/MasksFactory/DiagonalSquareToBalls.js +78 -0
  208. package/dist/components/Transition/MasksFactory/PhysicsSquares.js +96 -0
  209. package/dist/components/Transition/MasksFactory/SquareToBalls.js +67 -0
  210. package/dist/components/Transition/MasksFactory/utils.js +30 -0
  211. package/dist/components/Transition/Transition.js +323 -0
  212. package/dist/components/Transition/Transition.module.scss +211 -0
  213. package/dist/components/Transition/index.js +27 -0
  214. package/dist/components/UncontrolledTransition/UncontrolledTransition.ai.md +9 -0
  215. package/dist/components/UncontrolledTransition/UncontrolledTransition.js +110 -0
  216. package/dist/components/UncontrolledTransition/UncontrolledTransition.sample.js +32 -0
  217. package/dist/components/UncontrolledTransition/index.js +27 -0
  218. package/dist/components/WalletConnectionWrapper/WalletConnectionWrapper.js +115 -0
  219. package/dist/components/WalletConnectionWrapper/index.js +27 -0
  220. package/dist/components/utilitary/ScrollAndFocusLock/ScrollAndFocusLock.js +59 -0
  221. package/dist/components/utilitary/ScrollAndFocusLock/ScrollAndFocusLock.module.scss +5 -0
  222. package/dist/components/utilitary/ScrollAndFocusLock/index.js +27 -0
  223. package/dist/context/AsyncProcess.js +74 -0
  224. package/dist/context/ContextAsyncControl.js +92 -0
  225. package/dist/context/CustomBrowserRouter.js +50 -0
  226. package/dist/context/OneUIProvider.js +129 -0
  227. package/dist/hooks/logs/useDependencyChangeDetection.js +20 -0
  228. package/dist/hooks/logs/useIsMounting.js +13 -0
  229. package/dist/hooks/persistence/useLocalStorage.js +48 -0
  230. package/dist/hooks/shims/ObjectWatchShim.js +54 -0
  231. package/dist/hooks/ui/useAdaptiveImage.js +36 -0
  232. package/dist/hooks/ui/useAlternating.js +24 -0
  233. package/dist/hooks/ui/useBreakpoint.js +26 -0
  234. package/dist/hooks/ui/useCustomScrollbar.js +28 -0
  235. package/dist/hooks/ui/useCustomScrollbar.module.scss +20 -0
  236. package/dist/hooks/ui/useEffectIf.js +14 -0
  237. package/dist/hooks/ui/useMouseHover.js +32 -0
  238. package/dist/hooks/ui/usePaginationControls.js +136 -0
  239. package/dist/hooks/ui/usePaginationControls.module.scss +16 -0
  240. package/dist/hooks/ui/useSnapToViewport.js +26 -0
  241. package/dist/hooks/ui/useSnapToViewport.module.scss +6 -0
  242. package/dist/hooks/ui/useTilt.js +161 -0
  243. package/dist/hooks/ui/useZoomable.js +135 -0
  244. package/dist/hooks/ui/useZoomable.module.scss +34 -0
  245. package/dist/hooks/useAsyncControl.ai.md +25 -0
  246. package/dist/hooks/useAsyncControl.js +79 -0
  247. package/dist/hooks/useContainedRepositioning.js +83 -0
  248. package/dist/hooks/useCustomHistory.js +24 -0
  249. package/dist/hooks/useElementFit.js +54 -0
  250. package/dist/hooks/useFirestoreWatch.js +45 -0
  251. package/dist/hooks/useFreeze.js +17 -0
  252. package/dist/hooks/useHero.js +273 -0
  253. package/dist/hooks/useHero.module.scss +41 -0
  254. package/dist/hooks/useIntersection.js +39 -0
  255. package/dist/hooks/useMergeRefs.js +36 -0
  256. package/dist/hooks/useObserve.js +25 -0
  257. package/dist/hooks/usePagination.js +163 -0
  258. package/dist/hooks/usePooledOperation.js +52 -0
  259. package/dist/hooks/usePooling.js +52 -0
  260. package/dist/hooks/useRebound.js +32 -0
  261. package/dist/hooks/useShortIntl.ai.md +5 -0
  262. package/dist/hooks/useShortIntl.js +82 -0
  263. package/dist/hooks/utility/useAsyncMemo.js +45 -0
  264. package/dist/hooks/utility/useDepChange.js +17 -0
  265. package/dist/hooks/utility/useEvents.js +33 -0
  266. package/dist/hooks/utility/useImmediate.js +14 -0
  267. package/dist/hooks/utility/useManualInit.js +25 -0
  268. package/dist/hooks/utility/useModule.js +18 -0
  269. package/dist/hooks/utility/useQuery.js +20 -0
  270. package/dist/hooks/utility/useUniqueEffect.js +20 -0
  271. package/dist/index.js +2149 -0
  272. package/dist/index.preprocess.js +42 -0
  273. package/dist/models/DebugLogger.js +16 -0
  274. package/dist/models/GenericContract.js +51 -0
  275. package/dist/models/Orbs.js +67 -0
  276. package/dist/reac-app-env.d.js +2 -0
  277. package/dist/storybook/assets/video/txt-reversed.mp4 +0 -0
  278. package/dist/storybookUtils/index.js +44 -0
  279. package/dist/type-utils.js +6 -0
  280. package/dist/types.js +6 -0
  281. package/dist/utility.d.js +2 -0
  282. package/dist/utils/blockchain.js +46 -0
  283. package/dist/utils/e2e.js +33 -0
  284. package/dist/utils/flatten.js +19 -0
  285. package/dist/utils/formatters.js +63 -0
  286. package/dist/utils/html.utils.js +15 -0
  287. package/dist/utils/ownEvent.js +16 -0
  288. package/dist/utils/test.js +19 -0
  289. package/dist-ts/components/AnchoredTooltip/AnchoredTooltip.module.scss +13 -10
  290. package/dist-ts/components/CheckBox/CheckBox.d.ts +3 -1
  291. package/dist-ts/components/CheckBox/CheckBox.js +7 -4
  292. package/dist-ts/components/CheckBox/CheckBox.js.map +1 -1
  293. package/dist-ts/components/CheckBox/CheckBox.module.scss +5 -0
  294. package/dist-ts/components/Input/Input.js +1 -1
  295. package/dist-ts/components/Input/Input.js.map +1 -1
  296. package/dist-ts/context/OneUIProvider.d.ts +3 -1
  297. package/dist-ts/context/OneUIProvider.js.map +1 -1
  298. package/dist-ts/hooks/ui/useAdaptiveImage.d.ts +1 -1
  299. package/dist-ts/hooks/ui/useAdaptiveImage.js +1 -1
  300. package/dist-ts/hooks/ui/useAdaptiveImage.js.map +1 -1
  301. package/dist-ts/hooks/ui/useMouseHover.d.ts +2 -3
  302. package/dist-ts/hooks/ui/useMouseHover.js +6 -8
  303. package/dist-ts/hooks/ui/useMouseHover.js.map +1 -1
  304. package/dist-ts/index.d.ts +1 -0
  305. package/dist-ts/index.js +1 -0
  306. package/dist-ts/index.js.map +1 -1
  307. package/dist-ts/models/ImageScales.d.ts +7 -0
  308. package/dist-ts/models/ImageScales.js +9 -0
  309. package/dist-ts/models/ImageScales.js.map +1 -0
  310. package/package.json +1 -1
@@ -0,0 +1,439 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.OrderableListReorderMode = void 0;
7
+ exports.default = OrderableList;
8
+ exports.useOrderableEvents = useOrderableEvents;
9
+ exports.useOrderableListAnchor = useOrderableListAnchor;
10
+ var _throttle = _interopRequireDefault(require("lodash/throttle"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _UncontrolledTransition = _interopRequireDefault(require("../UncontrolledTransition"));
13
+ var _TransitionModule = _interopRequireDefault(require("../Transition/Transition.module.scss"));
14
+ var _useHero = _interopRequireDefault(require("../../hooks/useHero"));
15
+ var _AnimatedEntrance = _interopRequireDefault(require("../AnimatedEntrance"));
16
+ var _Transition = require("../Transition");
17
+ var _OrderableListModule = _interopRequireDefault(require("./OrderableList.module.scss"));
18
+ var _useEvents = _interopRequireDefault(require("../../hooks/utility/useEvents"));
19
+ var _ownEvent = _interopRequireDefault(require("../../utils/ownEvent"));
20
+ const _excluded = ["children", "className", "mode", "shrinkToOnOrder", "reorderingClassName", "cloneClassName"];
21
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
22
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
23
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
25
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
28
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
29
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
30
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
31
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
32
+ const OrderableListContext = /*#__PURE__*/(0, _react.createContext)(null);
33
+ let OrderableListReorderMode = exports.OrderableListReorderMode = /*#__PURE__*/function (OrderableListReorderMode) {
34
+ OrderableListReorderMode["VERTICAL"] = "v";
35
+ OrderableListReorderMode["TWO_DIMENSIONS"] = "hv";
36
+ return OrderableListReorderMode;
37
+ }({});
38
+ function cleanKeys(keys) {
39
+ return keys.map(a => a.split(";")[0]);
40
+ }
41
+
42
+ /**
43
+ * This component displays a list of items that can be reordered by dragging them with your mouse or touch.
44
+ * It supports simple vertical dragging and more advanced 2D reordering, with smooth animations
45
+ * when items move around.
46
+ */
47
+ function OrderableList(_ref) {
48
+ let {
49
+ children,
50
+ className = "",
51
+ mode = OrderableListReorderMode.VERTICAL,
52
+ shrinkToOnOrder,
53
+ reorderingClassName,
54
+ cloneClassName
55
+ } = _ref,
56
+ props = _objectWithoutProperties(_ref, _excluded);
57
+ const availableKeys = children.map(a => a.key);
58
+ const availableKeysDep = availableKeys.join(",");
59
+ const initializeOrder = (0, _react.useCallback)(() => {
60
+ const missingOrderKeys = "keyOrder" in props && props.keyOrder ? availableKeys.filter(a => !props.keyOrder.includes(a)) : [];
61
+ return ("keyOrder" in props && props.keyOrder ? [...props.keyOrder, ...missingOrderKeys] : undefined) || availableKeys;
62
+ }, [availableKeysDep, props.keyOrder]);
63
+ const {
64
+ current: anchorsList
65
+ } = (0, _react.useRef)([]);
66
+ const eventEmitter = (0, _useEvents.default)();
67
+ const currentClone = (0, _react.useRef)(null);
68
+ const currentWorkingKey = (0, _react.useRef)(undefined);
69
+ const rootRef = (0, _react.useRef)(null);
70
+ const [_order, setOrder] = (0, _react.useState)(initializeOrder);
71
+ (0, _react.useEffect)(() => setOrder(initializeOrder()), [initializeOrder]);
72
+ const order = (0, _react.useMemo)(() => {
73
+ return ("currentOrder" in props ? props.currentOrder || _order : _order).filter(o => o.includes(";") || availableKeys.includes(o));
74
+ }, [props.currentOrder, _order, availableKeysDep]);
75
+ const cleanOrder = (0, _react.useMemo)(() => order.map(a => a.split(";")[0]), [order]);
76
+ const orderId = (0, _react.useMemo)(() => "key-" + cleanOrder.join(""), [cleanOrder]);
77
+ function rootEl() {
78
+ if (mode === OrderableListReorderMode.TWO_DIMENSIONS) return rootRef.current.lastElementChild.lastElementChild;
79
+ return rootRef.current;
80
+ }
81
+ const findParentElement = target => {
82
+ let parent = target;
83
+ while (parent.parentElement !== rootEl()) {
84
+ if (parent.parentElement === null) break;
85
+ parent = parent.parentElement;
86
+ }
87
+ if (process.env.NODE_ENV === "development" && parent === null) throw new Error("It seems like we could not find a relation between this element and the root list. Are you using portals maybe?");
88
+ return parent;
89
+ };
90
+ (0, _react.useLayoutEffect)(() => {
91
+ if (shrinkToOnOrder) rootEl().style.setProperty("--shrink-to", "".concat(shrinkToOnOrder, "px"));
92
+ }, [shrinkToOnOrder]);
93
+ const calculateReordering = (0, _react.useMemo)(() => {
94
+ return (0, _throttle.default)((e, els, currentOrder) => {
95
+ if (els.length > currentOrder.length || !currentWorkingKey.current) return;
96
+ const parent = findParentElement(e.target);
97
+ const indexOfKeyInCleanOrder = els.indexOf(parent);
98
+ const keyOfTheOverElement = currentOrder[indexOfKeyInCleanOrder];
99
+ const isDraggingOwnElement = currentWorkingKey.current === keyOfTheOverElement;
100
+ if (indexOfKeyInCleanOrder === -1 || keyOfTheOverElement === undefined) return;
101
+ if (!isDraggingOwnElement) {
102
+ const {
103
+ isAfter,
104
+ isBefore
105
+ } = (() => {
106
+ if (mode === OrderableListReorderMode.TWO_DIMENSIONS) {
107
+ const distanceFromLeft = e.offsetX;
108
+ const widthOfEl = parent.clientWidth;
109
+ const offset = widthOfEl * 0.25;
110
+ const isAfter = distanceFromLeft > widthOfEl - offset;
111
+ const isBefore = distanceFromLeft < offset;
112
+ return {
113
+ isAfter,
114
+ isBefore
115
+ };
116
+ } else {
117
+ const distanceFromTop = e.offsetY;
118
+ const heightOfEl = parent.clientHeight;
119
+ const offset = heightOfEl * 0.25;
120
+ const isAfter = distanceFromTop > heightOfEl - offset;
121
+ const isBefore = distanceFromTop < offset;
122
+ return {
123
+ isAfter,
124
+ isBefore
125
+ };
126
+ }
127
+ })();
128
+ const checkIfCanMove = keyOfOverElement => {
129
+ return keyOfOverElement === undefined || keyOfOverElement !== currentWorkingKey.current;
130
+ };
131
+ const indexOfTheNewElement = indexOfKeyInCleanOrder + (isAfter ? 1 : -1);
132
+ const shouldTriggerReordering = (isAfter || isBefore) && checkIfCanMove(currentOrder[indexOfTheNewElement]);
133
+ if (shouldTriggerReordering) {
134
+ setOrder(p => {
135
+ const previousIndex = currentOrder.indexOf(currentWorkingKey.current);
136
+ const indexOfKeyInProvidedOrder = cleanKeys(p).indexOf(keyOfTheOverElement);
137
+ let indexOfTheNewElement = indexOfKeyInProvidedOrder + (isBefore ? -1 : 0);
138
+ if (previousIndex > indexOfTheNewElement) indexOfTheNewElement++;
139
+ const orderWithoutCurrent = p.filter(a => {
140
+ if (a.startsWith("".concat(currentWorkingKey.current, ";"))) return false;
141
+ return a !== currentWorkingKey.current;
142
+ });
143
+ orderWithoutCurrent.splice(indexOfTheNewElement, 0, "".concat(currentWorkingKey.current, ";").concat(Date.now()));
144
+ return orderWithoutCurrent;
145
+ });
146
+ }
147
+ }
148
+ }, 1000 / 60);
149
+ }, []);
150
+ (0, _react.useEffect)(() => {
151
+ function registerListeners() {
152
+ const els = Array.from(rootEl().children);
153
+ const calculateReorderingCall = e => {
154
+ const els = Array.from(rootEl().children);
155
+ calculateReordering(e, els, cleanOrder);
156
+ };
157
+ for (let el of els) el.addEventListener("mousemove", calculateReorderingCall);
158
+ return () => {
159
+ for (let el of els) el.removeEventListener("mousemove", calculateReorderingCall);
160
+ };
161
+ }
162
+ if (mode === OrderableListReorderMode.VERTICAL) {
163
+ return registerListeners();
164
+ } else {
165
+ let unsubscribe;
166
+ let timeout = setTimeout(() => {
167
+ unsubscribe = registerListeners();
168
+ }, 250);
169
+ return () => {
170
+ clearTimeout(timeout);
171
+ if (unsubscribe) unsubscribe();
172
+ };
173
+ }
174
+ }, [cleanOrder]);
175
+ (0, _react.useEffect)(() => {
176
+ if ("onChangeKeyOrder" in props) props.onChangeKeyOrder(cleanKeys(_order));
177
+ }, [_order]);
178
+ const cleanOrderRef = (0, _react.useRef)(cleanOrder);
179
+ (0, _react.useEffect)(() => {
180
+ cleanOrderRef.current = cleanOrder;
181
+ }, [cleanOrder]);
182
+ const onAnchorClick = (0, _react.useCallback)(_ref2 => {
183
+ let {
184
+ target: anchor
185
+ } = _ref2;
186
+ let offset;
187
+ const orderableListItemForAnchor = findParentElement(anchor);
188
+ const box = orderableListItemForAnchor.getBoundingClientRect();
189
+ const els = Array.from(rootEl().children);
190
+ const elIndex = els.indexOf(orderableListItemForAnchor);
191
+ const clone = orderableListItemForAnchor.cloneNode(true);
192
+ currentClone.current = clone;
193
+ if (process.env.NODE_ENV === "development") clone.setAttribute("data-testid", "orderable-list-clone");
194
+ clone.setAttribute("data-orderableid", "orderable-list-clone");
195
+ clone.style.width = "".concat(box.width, "px");
196
+ clone.style.height = "".concat(box.height, "px");
197
+ clone.style.top = "".concat(box.top, "px");
198
+ clone.style.left = "".concat(box.left, "px");
199
+ clone.classList.add(_OrderableListModule.default.clone);
200
+ if (shrinkToOnOrder) clone.style.maxHeight = "".concat(box.height, "px");
201
+ setTimeout(() => {
202
+ if (cloneClassName) clone.classList.add(cloneClassName);
203
+ if (shrinkToOnOrder) clone.style.maxHeight = "".concat(shrinkToOnOrder, "px");
204
+ }, 0);
205
+ orderableListItemForAnchor.classList.add(_OrderableListModule.default.currentOrdering);
206
+ orderableListItemForAnchor.classList.remove(_OrderableListModule.default.visible);
207
+ const movementControl = e => {
208
+ const {
209
+ x: x1,
210
+ y: y1
211
+ } = "touches" in e ? {
212
+ x: e.touches[0].pageX,
213
+ y: e.touches[0].pageY
214
+ } : e;
215
+ if (!offset) offset = [x1 - box.left, y1 - box.top];
216
+ const [offsetX, offsetY] = offset;
217
+ clone.style.top = "".concat(y1 - offsetY, "px");
218
+ clone.style.left = "".concat(x1 - offsetX, "px");
219
+ };
220
+ document.body.appendChild(clone);
221
+ const deleteClone = () => {
222
+ window.removeEventListener("mousemove", movementControl);
223
+ window.removeEventListener("touchmove", movementControl);
224
+ window.removeEventListener("touchend", deleteClone);
225
+ window.removeEventListener("mouseup", deleteClone);
226
+ orderableListItemForAnchor.style.visibility = "initial";
227
+ currentWorkingKey.current = undefined;
228
+ window.document.body.classList.remove(_OrderableListModule.default.unselectable);
229
+ {
230
+ const els = Array.from(rootEl().children);
231
+ const elInvisible = els.find(a => !a.classList.contains(_OrderableListModule.default.visible) && a.style.maxHeight !== "0px");
232
+ if (shrinkToOnOrder) {
233
+ const child = elInvisible.lastElementChild;
234
+ child.style.maxHeight = "".concat(child.scrollHeight, "px");
235
+ child.classList.add(_OrderableListModule.default.transitionHeight);
236
+ const onEnd = (0, _ownEvent.default)(() => {
237
+ child.removeEventListener("transitionend", onEnd);
238
+ child.style.maxHeight = "initial";
239
+ child.classList.remove(_OrderableListModule.default.transitionHeight);
240
+ });
241
+ child.addEventListener("transitionend", onEnd);
242
+ }
243
+ const box = elInvisible.getBoundingClientRect();
244
+ function cleanUp() {
245
+ if (shrinkToOnOrder) {
246
+ rootEl().style.removeProperty("padding-top");
247
+ rootEl().style.removeProperty("min-height");
248
+ }
249
+ eventEmitter.dispatcher("order-stop");
250
+ rootEl().classList.remove(_OrderableListModule.default.ordering);
251
+ if (reorderingClassName) rootEl().classList.remove(reorderingClassName);
252
+ for (let el of els) el.classList.remove(_OrderableListModule.default.visible);
253
+ clone.remove();
254
+ currentClone.current = null;
255
+ for (let el of Array.from(elInvisible.children)) el.style.height = "";
256
+ }
257
+ if (clone.style.top.startsWith(Math.floor(box.top).toString()) && clone.style.left.startsWith(Math.floor(box.left).toString())) {
258
+ cleanUp();
259
+ } else {
260
+ clone.style.top = "".concat(box.top, "px");
261
+ clone.style.left = "".concat(box.left, "px");
262
+ clone.style.transition = "top 500ms linear, left 500ms linear";
263
+ clone.addEventListener("transitionend", () => {
264
+ cleanUp();
265
+ });
266
+ }
267
+ }
268
+ };
269
+ for (let el of els) {
270
+ el.classList.add(_OrderableListModule.default.visible);
271
+ }
272
+ if (shrinkToOnOrder) {
273
+ for (let el of els) el.style.maxHeight = "".concat(el.scrollHeight, "px");
274
+ const targetHeight = elIndex * shrinkToOnOrder;
275
+ const currentHeight = orderableListItemForAnchor.offsetTop - els[0].offsetTop;
276
+ const paddingTop = currentHeight - targetHeight;
277
+ rootEl().style.paddingTop = "".concat(paddingTop, "px");
278
+ rootEl().style.minHeight = "".concat(rootEl().clientHeight, "px");
279
+ }
280
+ orderableListItemForAnchor.style.visibility = "hidden";
281
+ orderableListItemForAnchor.classList.remove(_OrderableListModule.default.visible);
282
+ rootEl().classList.add(_OrderableListModule.default.ordering);
283
+ if (reorderingClassName) rootEl().classList.add(reorderingClassName);
284
+ currentWorkingKey.current = cleanOrderRef.current[elIndex];
285
+ eventEmitter.dispatcher("order-start");
286
+ window.document.body.classList.add(_OrderableListModule.default.unselectable);
287
+ window.addEventListener("mouseup", deleteClone);
288
+ window.addEventListener("mousemove", movementControl);
289
+ window.addEventListener("touchend", deleteClone);
290
+ window.addEventListener("touchmove", movementControl);
291
+ }, []);
292
+ (0, _react.useLayoutEffect)(() => {
293
+ if (currentClone.current) {
294
+ const els = Array.from(rootEl().children);
295
+ const elInvisible = els.find(a => !a.classList.contains(_OrderableListModule.default.visible) && a.style.maxHeight !== "0px");
296
+ elInvisible.children[0].style.height = "".concat(currentClone.current.clientHeight, "px");
297
+ setTimeout(() => {
298
+ elInvisible.children[1].style.height = "".concat(currentClone.current.clientHeight, "px");
299
+ }, 150);
300
+ }
301
+ }, [cleanOrder]);
302
+ const toSpread = _objectSpread({}, props);
303
+ delete toSpread.keyOrder;
304
+ delete toSpread.onChangeKeyOrder;
305
+ const childrenToRender = [...children].filter(a => cleanOrder.includes(a.key)).sort((a, b) => cleanOrder.indexOf(a.key) - cleanOrder.indexOf(b.key)).map((a, i) => _objectSpread(_objectSpread({}, a), {}, {
306
+ key: order[i]
307
+ }));
308
+ (0, _react.useLayoutEffect)(() => {
309
+ rootEl().addEventListener("touchstart", e => {
310
+ const relatedAnchor = anchorsList.find(anchor => anchor.contains(e.target));
311
+ if (relatedAnchor) {
312
+ e.preventDefault();
313
+ onAnchorClick({
314
+ target: relatedAnchor
315
+ });
316
+ const moveCb = (0, _throttle.default)(e => {
317
+ const touch = e.touches[0];
318
+ const [x, y] = [touch.clientX, touch.clientY];
319
+ const els = Array.from(rootEl().children);
320
+ const currentElementIdx = els.findIndex((c, i) => {
321
+ const rect = c === null || c === void 0 ? void 0 : c.getBoundingClientRect();
322
+ if (!rect) return false;
323
+ return rect.top < y && rect.top + rect.height > y;
324
+ });
325
+ if (currentElementIdx !== -1) {
326
+ const el = els[currentElementIdx];
327
+ const rect = el.getBoundingClientRect();
328
+ calculateReordering({
329
+ target: el,
330
+ offsetY: y - rect.top
331
+ }, els, cleanOrderRef.current);
332
+ }
333
+ }, 500);
334
+ const t = e.target;
335
+ const touchMoveCb = e => {
336
+ e.stopPropagation();
337
+ window.dispatchEvent(new TouchEvent(e.type, e));
338
+ moveCb(e);
339
+ };
340
+ const removeCb = e => {
341
+ t.removeEventListener("touchmove", touchMoveCb);
342
+ t.removeEventListener("touchend", removeCb);
343
+ window.dispatchEvent(new TouchEvent(e.type, e));
344
+ };
345
+ t.addEventListener("touchmove", touchMoveCb);
346
+ t.addEventListener("touchend", removeCb);
347
+ }
348
+ });
349
+ }, []);
350
+ const e = (0, _react.useMemo)(() => ({
351
+ bindAnchor: el => {
352
+ el.addEventListener("mousedown", onAnchorClick);
353
+ anchorsList.push(el);
354
+ },
355
+ unbindAnchor: el => {
356
+ el.removeEventListener("mousedown", onAnchorClick);
357
+ anchorsList.splice(anchorsList.indexOf(el), 1);
358
+ },
359
+ on: eventEmitter.subscriber
360
+ }), []);
361
+ return /*#__PURE__*/_react.default.createElement(OrderableListContext.Provider, {
362
+ value: e
363
+ }, /*#__PURE__*/_react.default.createElement("div", _extends({
364
+ ref: rootRef,
365
+ className: "".concat(_OrderableListModule.default.root, " ").concat(className, " ").concat(shrinkToOnOrder ? _OrderableListModule.default.shrinkable : "")
366
+ }, toSpread), mode === OrderableListReorderMode.VERTICAL ? /*#__PURE__*/_react.default.createElement(_AnimatedEntrance.default, null, childrenToRender) : /*#__PURE__*/_react.default.createElement(_UncontrolledTransition.default, {
367
+ className: _OrderableListModule.default.transition,
368
+ transitionType: _Transition.TransitionAnimationTypes.CUSTOM,
369
+ config: {
370
+ backward: {
371
+ elementEntering: "",
372
+ elementExiting: ""
373
+ },
374
+ forward: {
375
+ elementEntering: _OrderableListModule.default.stubEntering,
376
+ elementExiting: _TransitionModule.default.fadeOut
377
+ }
378
+ },
379
+ contentClassName: "".concat(className)
380
+ }, /*#__PURE__*/_react.default.createElement(_react.Fragment, {
381
+ key: orderId
382
+ }, [...children].filter(a => cleanOrder.includes(a.key)).sort((a, b) => cleanOrder.indexOf(a.key) - cleanOrder.indexOf(b.key)).map((a, i) => /*#__PURE__*/_react.default.createElement(HeroWrapper, {
383
+ key: i,
384
+ id: a.key
385
+ }, a))))));
386
+ }
387
+ function HeroWrapper(_ref3) {
388
+ let {
389
+ children,
390
+ id
391
+ } = _ref3;
392
+ const {
393
+ heroRef
394
+ } = (0, _useHero.default)(id, undefined, {
395
+ onHeroStart: (_c, _o, t) => {
396
+ t.querySelectorAll("img").forEach(img => img.style.visibility = "hidden");
397
+ },
398
+ onHeroCloned(clone) {
399
+ // if (!clone.classList.contains(Styles.visible)) clone.style.opacity = "0";
400
+ },
401
+ onHeroEnd: () => {
402
+ if (heroRef.current) heroRef.current.querySelectorAll("img").forEach(img => img.style.visibility = "");
403
+ }
404
+ });
405
+ return /*#__PURE__*/_react.default.createElement("div", {
406
+ ref: heroRef
407
+ }, children);
408
+ }
409
+ function useOrderableListAnchor() {
410
+ const anchorRef = (0, _react.useRef)(null);
411
+ const ctx = (0, _react.useContext)(OrderableListContext);
412
+ (0, _react.useLayoutEffect)(() => {
413
+ if (!ctx) return;
414
+ const {
415
+ bindAnchor,
416
+ unbindAnchor
417
+ } = ctx;
418
+ bindAnchor(anchorRef.current);
419
+ return () => unbindAnchor(anchorRef.current);
420
+ }, []);
421
+ return {
422
+ anchorRef: ctx ? anchorRef : undefined
423
+ };
424
+ }
425
+ function useOrderableEvents(events) {
426
+ const {
427
+ on
428
+ } = (0, _react.useContext)(OrderableListContext);
429
+ (0, _react.useEffect)(() => {
430
+ const unsubscribers = [];
431
+ for (let eventName in events) {
432
+ unsubscribers.push(on(eventName, events[eventName]));
433
+ }
434
+ return () => {
435
+ unsubscribers.forEach(u => u());
436
+ };
437
+ }, [events]);
438
+ }
439
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGhyb3R0bGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX1VuY29udHJvbGxlZFRyYW5zaXRpb24iLCJfVHJhbnNpdGlvbk1vZHVsZSIsIl91c2VIZXJvIiwiX0FuaW1hdGVkRW50cmFuY2UiLCJfVHJhbnNpdGlvbiIsIl9PcmRlcmFibGVMaXN0TW9kdWxlIiwiX3VzZUV2ZW50cyIsIl9vd25FdmVudCIsIl9leGNsdWRlZCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsImJpbmQiLCJ0YXJnZXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiYXBwbHkiLCJvd25LZXlzIiwib2JqZWN0IiwiZW51bWVyYWJsZU9ubHkiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltYm9scyIsImZpbHRlciIsInN5bSIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsInZhbHVlIiwiX3RvUHJvcGVydHlLZXkiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFyZyIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsInVuZGVmaW5lZCIsInJlcyIsIlR5cGVFcnJvciIsIk51bWJlciIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsImV4Y2x1ZGVkIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UiLCJzb3VyY2VTeW1ib2xLZXlzIiwiaW5kZXhPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwic291cmNlS2V5cyIsIk9yZGVyYWJsZUxpc3RDb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsIk9yZGVyYWJsZUxpc3RSZW9yZGVyTW9kZSIsImV4cG9ydHMiLCJjbGVhbktleXMiLCJtYXAiLCJhIiwic3BsaXQiLCJPcmRlcmFibGVMaXN0IiwiX3JlZiIsImNoaWxkcmVuIiwiY2xhc3NOYW1lIiwibW9kZSIsIlZFUlRJQ0FMIiwic2hyaW5rVG9Pbk9yZGVyIiwicmVvcmRlcmluZ0NsYXNzTmFtZSIsImNsb25lQ2xhc3NOYW1lIiwicHJvcHMiLCJhdmFpbGFibGVLZXlzIiwiYXZhaWxhYmxlS2V5c0RlcCIsImpvaW4iLCJpbml0aWFsaXplT3JkZXIiLCJ1c2VDYWxsYmFjayIsIm1pc3NpbmdPcmRlcktleXMiLCJrZXlPcmRlciIsImluY2x1ZGVzIiwiY3VycmVudCIsImFuY2hvcnNMaXN0IiwidXNlUmVmIiwiZXZlbnRFbWl0dGVyIiwidXNlRXZlbnRzIiwiY3VycmVudENsb25lIiwiY3VycmVudFdvcmtpbmdLZXkiLCJyb290UmVmIiwiX29yZGVyIiwic2V0T3JkZXIiLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIm9yZGVyIiwidXNlTWVtbyIsImN1cnJlbnRPcmRlciIsIm8iLCJjbGVhbk9yZGVyIiwib3JkZXJJZCIsInJvb3RFbCIsIlRXT19ESU1FTlNJT05TIiwibGFzdEVsZW1lbnRDaGlsZCIsImZpbmRQYXJlbnRFbGVtZW50IiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsIkVycm9yIiwidXNlTGF5b3V0RWZmZWN0Iiwic3R5bGUiLCJzZXRQcm9wZXJ0eSIsImNvbmNhdCIsImNhbGN1bGF0ZVJlb3JkZXJpbmciLCJ0aHJvdHRsZSIsImUiLCJlbHMiLCJpbmRleE9mS2V5SW5DbGVhbk9yZGVyIiwia2V5T2ZUaGVPdmVyRWxlbWVudCIsImlzRHJhZ2dpbmdPd25FbGVtZW50IiwiaXNBZnRlciIsImlzQmVmb3JlIiwiZGlzdGFuY2VGcm9tTGVmdCIsIm9mZnNldFgiLCJ3aWR0aE9mRWwiLCJjbGllbnRXaWR0aCIsIm9mZnNldCIsImRpc3RhbmNlRnJvbVRvcCIsIm9mZnNldFkiLCJoZWlnaHRPZkVsIiwiY2xpZW50SGVpZ2h0IiwiY2hlY2tJZkNhbk1vdmUiLCJrZXlPZk92ZXJFbGVtZW50IiwiaW5kZXhPZlRoZU5ld0VsZW1lbnQiLCJzaG91bGRUcmlnZ2VyUmVvcmRlcmluZyIsInAiLCJwcmV2aW91c0luZGV4IiwiaW5kZXhPZktleUluUHJvdmlkZWRPcmRlciIsIm9yZGVyV2l0aG91dEN1cnJlbnQiLCJzdGFydHNXaXRoIiwic3BsaWNlIiwiRGF0ZSIsIm5vdyIsInJlZ2lzdGVyTGlzdGVuZXJzIiwiQXJyYXkiLCJmcm9tIiwiY2FsY3VsYXRlUmVvcmRlcmluZ0NhbGwiLCJlbCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidW5zdWJzY3JpYmUiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsIm9uQ2hhbmdlS2V5T3JkZXIiLCJjbGVhbk9yZGVyUmVmIiwib25BbmNob3JDbGljayIsIl9yZWYyIiwiYW5jaG9yIiwib3JkZXJhYmxlTGlzdEl0ZW1Gb3JBbmNob3IiLCJib3giLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJlbEluZGV4IiwiY2xvbmUiLCJjbG9uZU5vZGUiLCJzZXRBdHRyaWJ1dGUiLCJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJTdHlsZXMiLCJtYXhIZWlnaHQiLCJjdXJyZW50T3JkZXJpbmciLCJyZW1vdmUiLCJ2aXNpYmxlIiwibW92ZW1lbnRDb250cm9sIiwieCIsIngxIiwieSIsInkxIiwidG91Y2hlcyIsInBhZ2VYIiwicGFnZVkiLCJkb2N1bWVudCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImRlbGV0ZUNsb25lIiwid2luZG93IiwidmlzaWJpbGl0eSIsInVuc2VsZWN0YWJsZSIsImVsSW52aXNpYmxlIiwiZmluZCIsImNvbnRhaW5zIiwiY2hpbGQiLCJzY3JvbGxIZWlnaHQiLCJ0cmFuc2l0aW9uSGVpZ2h0Iiwib25FbmQiLCJvd25FdmVudCIsImNsZWFuVXAiLCJyZW1vdmVQcm9wZXJ0eSIsImRpc3BhdGNoZXIiLCJvcmRlcmluZyIsIk1hdGgiLCJmbG9vciIsInRvU3RyaW5nIiwidHJhbnNpdGlvbiIsInRhcmdldEhlaWdodCIsImN1cnJlbnRIZWlnaHQiLCJvZmZzZXRUb3AiLCJwYWRkaW5nVG9wIiwibWluSGVpZ2h0IiwidG9TcHJlYWQiLCJjaGlsZHJlblRvUmVuZGVyIiwic29ydCIsImIiLCJyZWxhdGVkQW5jaG9yIiwicHJldmVudERlZmF1bHQiLCJtb3ZlQ2IiLCJ0b3VjaCIsImNsaWVudFgiLCJjbGllbnRZIiwiY3VycmVudEVsZW1lbnRJZHgiLCJmaW5kSW5kZXgiLCJjIiwicmVjdCIsInQiLCJ0b3VjaE1vdmVDYiIsInN0b3BQcm9wYWdhdGlvbiIsImRpc3BhdGNoRXZlbnQiLCJUb3VjaEV2ZW50IiwidHlwZSIsInJlbW92ZUNiIiwiYmluZEFuY2hvciIsInVuYmluZEFuY2hvciIsIm9uIiwic3Vic2NyaWJlciIsImNyZWF0ZUVsZW1lbnQiLCJQcm92aWRlciIsInJlZiIsInJvb3QiLCJzaHJpbmthYmxlIiwidHJhbnNpdGlvblR5cGUiLCJUcmFuc2l0aW9uQW5pbWF0aW9uVHlwZXMiLCJDVVNUT00iLCJjb25maWciLCJiYWNrd2FyZCIsImVsZW1lbnRFbnRlcmluZyIsImVsZW1lbnRFeGl0aW5nIiwiZm9yd2FyZCIsInN0dWJFbnRlcmluZyIsIlRyYW5zaXRpb25TdHlsZXMiLCJmYWRlT3V0IiwiY29udGVudENsYXNzTmFtZSIsIkZyYWdtZW50IiwiSGVyb1dyYXBwZXIiLCJpZCIsIl9yZWYzIiwiaGVyb1JlZiIsInVzZUhlcm8iLCJvbkhlcm9TdGFydCIsIl9jIiwiX28iLCJxdWVyeVNlbGVjdG9yQWxsIiwiaW1nIiwib25IZXJvQ2xvbmVkIiwib25IZXJvRW5kIiwidXNlT3JkZXJhYmxlTGlzdEFuY2hvciIsImFuY2hvclJlZiIsImN0eCIsInVzZUNvbnRleHQiLCJ1c2VPcmRlcmFibGVFdmVudHMiLCJldmVudHMiLCJ1bnN1YnNjcmliZXJzIiwiZXZlbnROYW1lIiwidSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL09yZGVyYWJsZUxpc3QvT3JkZXJhYmxlTGlzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHRocm90dGxlIGZyb20gXCJsb2Rhc2gvdGhyb3R0bGVcIjtcbmltcG9ydCBSZWFjdCwge1xuICBjcmVhdGVDb250ZXh0LFxuICBEZXRhaWxlZEhUTUxQcm9wcyxcbiAgRnJhZ21lbnQsXG4gIEhUTUxBdHRyaWJ1dGVzLFxuICBQcm9wc1dpdGhDaGlsZHJlbixcbiAgUmVhY3RFbGVtZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VMYXlvdXRFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFVuY29udHJvbGxlZFRyYW5zaXRpb24gZnJvbSBcIi4uL1VuY29udHJvbGxlZFRyYW5zaXRpb25cIjtcbmltcG9ydCBUcmFuc2l0aW9uU3R5bGVzIGZyb20gXCIuLi9UcmFuc2l0aW9uL1RyYW5zaXRpb24ubW9kdWxlLnNjc3NcIjtcbmltcG9ydCB1c2VIZXJvIGZyb20gXCIuLi8uLi9ob29rcy91c2VIZXJvXCI7XG5pbXBvcnQgQW5pbWF0ZWRFbnRyYW5jZSBmcm9tIFwiLi4vQW5pbWF0ZWRFbnRyYW5jZVwiO1xuaW1wb3J0IHsgVHJhbnNpdGlvbkFuaW1hdGlvblR5cGVzIH0gZnJvbSBcIi4uL1RyYW5zaXRpb25cIjtcbmltcG9ydCBTdHlsZXMgZnJvbSBcIi4vT3JkZXJhYmxlTGlzdC5tb2R1bGUuc2Nzc1wiO1xuaW1wb3J0IHVzZUV2ZW50cyBmcm9tIFwiLi4vLi4vaG9va3MvdXRpbGl0eS91c2VFdmVudHNcIjtcbmltcG9ydCBvd25FdmVudCBmcm9tIFwiLi4vLi4vdXRpbHMvb3duRXZlbnRcIjtcblxudHlwZSBFdmVudHMgPSBcIm9yZGVyLXN0b3BcIiB8IFwib3JkZXItc3RhcnRcIjtcblxuY29uc3QgT3JkZXJhYmxlTGlzdENvbnRleHQgPSBjcmVhdGVDb250ZXh0PHtcbiAgYmluZEFuY2hvcjogKGJpbmRFbGVtZW50OiBIVE1MRGl2RWxlbWVudCkgPT4gdm9pZDtcbiAgdW5iaW5kQW5jaG9yOiAoYmluZEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50KSA9PiB2b2lkO1xuICBvbjogKGV2ZW50TmFtZTogRXZlbnRzLCBjYjogKCkgPT4gdm9pZCkgPT4gKCkgPT4gdm9pZDtcbn0+KG51bGwgYXMgYW55KTtcblxuZXhwb3J0IGVudW0gT3JkZXJhYmxlTGlzdFJlb3JkZXJNb2RlIHtcbiAgVkVSVElDQUwgPSBcInZcIixcbiAgVFdPX0RJTUVOU0lPTlMgPSBcImh2XCIsXG59XG5cbmZ1bmN0aW9uIGNsZWFuS2V5cyhrZXlzOiBzdHJpbmdbXSkge1xuICByZXR1cm4ga2V5cy5tYXAoKGEpID0+IGEuc3BsaXQoXCI7XCIpWzBdKTtcbn1cblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCBkaXNwbGF5cyBhIGxpc3Qgb2YgaXRlbXMgdGhhdCBjYW4gYmUgcmVvcmRlcmVkIGJ5IGRyYWdnaW5nIHRoZW0gd2l0aCB5b3VyIG1vdXNlIG9yIHRvdWNoLlxuICogSXQgc3VwcG9ydHMgc2ltcGxlIHZlcnRpY2FsIGRyYWdnaW5nIGFuZCBtb3JlIGFkdmFuY2VkIDJEIHJlb3JkZXJpbmcsIHdpdGggc21vb3RoIGFuaW1hdGlvbnNcbiAqIHdoZW4gaXRlbXMgbW92ZSBhcm91bmQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE9yZGVyYWJsZUxpc3Qoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lID0gXCJcIixcbiAgbW9kZSA9IE9yZGVyYWJsZUxpc3RSZW9yZGVyTW9kZS5WRVJUSUNBTCxcbiAgc2hyaW5rVG9Pbk9yZGVyLFxuICByZW9yZGVyaW5nQ2xhc3NOYW1lLFxuICBjbG9uZUNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0RWxlbWVudFtdO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIG1vZGU/OiBPcmRlcmFibGVMaXN0UmVvcmRlck1vZGU7XG4gIC8qKlxuICAgKiBJZiBwcm92aWRlZCwgbWFrZXMgdGhlIGVsZW1lbnRzIHNocmluayB0byB0aGlzIHZhbHVlIGluIHB4IHdoZW4gb3JkZXJpbmcgZWxlbWVudHNcbiAgICovXG4gIHNocmlua1RvT25PcmRlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogQSBjbGFzcyB0byBhcHBseSB3aGVuIHJlb3JkZXJpbmdcbiAgICovXG4gIHJlb3JkZXJpbmdDbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGNsb25lIGVsXG4gICAqL1xuICBjbG9uZUNsYXNzTmFtZT86IHN0cmluZztcbn0gJiAoXG4gIHwge1xuICAgICAga2V5T3JkZXI/OiBzdHJpbmdbXTtcbiAgICAgIG9uQ2hhbmdlS2V5T3JkZXI6IChuZXdPcmRlcjogc3RyaW5nW10pID0+IHZvaWQ7XG4gICAgfVxuICB8IHtcbiAgICAgIGN1cnJlbnRPcmRlcj86IHN0cmluZ1tdO1xuICAgIH1cbikgJlxuICBEZXRhaWxlZEhUTUxQcm9wczxIVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4sIEhUTUxEaXZFbGVtZW50Pikge1xuICBjb25zdCBhdmFpbGFibGVLZXlzID0gY2hpbGRyZW4ubWFwKChhKSA9PiBhLmtleSBhcyBzdHJpbmcpO1xuICBjb25zdCBhdmFpbGFibGVLZXlzRGVwID0gYXZhaWxhYmxlS2V5cy5qb2luKFwiLFwiKTtcbiAgY29uc3QgaW5pdGlhbGl6ZU9yZGVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IG1pc3NpbmdPcmRlcktleXMgPVxuICAgICAgXCJrZXlPcmRlclwiIGluIHByb3BzICYmIHByb3BzLmtleU9yZGVyXG4gICAgICAgID8gYXZhaWxhYmxlS2V5cy5maWx0ZXIoKGEpID0+ICFwcm9wcy5rZXlPcmRlciEuaW5jbHVkZXMoYSkpXG4gICAgICAgIDogW107XG5cbiAgICByZXR1cm4gKFxuICAgICAgKFwia2V5T3JkZXJcIiBpbiBwcm9wcyAmJiBwcm9wcy5rZXlPcmRlclxuICAgICAgICA/IFsuLi5wcm9wcy5rZXlPcmRlciwgLi4ubWlzc2luZ09yZGVyS2V5c11cbiAgICAgICAgOiB1bmRlZmluZWQpIHx8IGF2YWlsYWJsZUtleXNcbiAgICApO1xuICB9LCBbYXZhaWxhYmxlS2V5c0RlcCwgKHByb3BzIGFzIGFueSkua2V5T3JkZXJdKTtcbiAgY29uc3QgeyBjdXJyZW50OiBhbmNob3JzTGlzdCB9ID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50W10+KFtdKTtcbiAgY29uc3QgZXZlbnRFbWl0dGVyID0gdXNlRXZlbnRzPEV2ZW50cywgeyBbayBpbiBFdmVudHNdOiBbXSB9PigpO1xuICBjb25zdCBjdXJyZW50Q2xvbmUgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgY3VycmVudFdvcmtpbmdLZXkgPSB1c2VSZWY8c3RyaW5nPih1bmRlZmluZWQpO1xuICBjb25zdCByb290UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsIGFzIGFueSk7XG4gIGNvbnN0IFtfb3JkZXIsIHNldE9yZGVyXSA9IHVzZVN0YXRlKGluaXRpYWxpemVPcmRlcik7XG4gIHVzZUVmZmVjdCgoKSA9PiBzZXRPcmRlcihpbml0aWFsaXplT3JkZXIoKSksIFtpbml0aWFsaXplT3JkZXJdKTtcblxuICBjb25zdCBvcmRlciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBcImN1cnJlbnRPcmRlclwiIGluIHByb3BzID8gcHJvcHMuY3VycmVudE9yZGVyIHx8IF9vcmRlciA6IF9vcmRlclxuICAgICkuZmlsdGVyKChvKSA9PiBvLmluY2x1ZGVzKFwiO1wiKSB8fCBhdmFpbGFibGVLZXlzLmluY2x1ZGVzKG8pKTtcbiAgfSwgWyhwcm9wcyBhcyBhbnkpLmN1cnJlbnRPcmRlciwgX29yZGVyLCBhdmFpbGFibGVLZXlzRGVwXSk7XG4gIGNvbnN0IGNsZWFuT3JkZXIgPSB1c2VNZW1vKCgpID0+IG9yZGVyLm1hcCgoYSkgPT4gYS5zcGxpdChcIjtcIilbMF0pLCBbb3JkZXJdKTtcbiAgY29uc3Qgb3JkZXJJZCA9IHVzZU1lbW8oKCkgPT4gXCJrZXktXCIgKyBjbGVhbk9yZGVyLmpvaW4oXCJcIiksIFtjbGVhbk9yZGVyXSk7XG4gIGZ1bmN0aW9uIHJvb3RFbCgpIHtcbiAgICBpZiAobW9kZSA9PT0gT3JkZXJhYmxlTGlzdFJlb3JkZXJNb2RlLlRXT19ESU1FTlNJT05TKVxuICAgICAgcmV0dXJuIHJvb3RSZWYuY3VycmVudCEubGFzdEVsZW1lbnRDaGlsZCFcbiAgICAgICAgLmxhc3RFbGVtZW50Q2hpbGQhIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgIHJldHVybiByb290UmVmLmN1cnJlbnQhIGFzIEhUTUxEaXZFbGVtZW50O1xuICB9XG5cbiAgY29uc3QgZmluZFBhcmVudEVsZW1lbnQgPSAodGFyZ2V0OiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIGxldCBwYXJlbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50O1xuICAgIHdoaWxlIChwYXJlbnQucGFyZW50RWxlbWVudCAhPT0gcm9vdEVsKCkpIHtcbiAgICAgIGlmIChwYXJlbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkgYnJlYWs7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudCBhcyBhbnk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJkZXZlbG9wbWVudFwiICYmIHBhcmVudCA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJJdCBzZWVtcyBsaWtlIHdlIGNvdWxkIG5vdCBmaW5kIGEgcmVsYXRpb24gYmV0d2VlbiB0aGlzIGVsZW1lbnQgYW5kIHRoZSByb290IGxpc3QuIEFyZSB5b3UgdXNpbmcgcG9ydGFscyBtYXliZT9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gcGFyZW50O1xuICB9O1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNocmlua1RvT25PcmRlcilcbiAgICAgIHJvb3RFbCgpLnN0eWxlLnNldFByb3BlcnR5KFwiLS1zaHJpbmstdG9cIiwgYCR7c2hyaW5rVG9Pbk9yZGVyfXB4YCk7XG4gIH0sIFtzaHJpbmtUb09uT3JkZXJdKTtcblxuICBjb25zdCBjYWxjdWxhdGVSZW9yZGVyaW5nID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHRocm90dGxlKChlOiBhbnksIGVsczogSFRNTERpdkVsZW1lbnRbXSwgY3VycmVudE9yZGVyOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgaWYgKGVscy5sZW5ndGggPiBjdXJyZW50T3JkZXIubGVuZ3RoIHx8ICFjdXJyZW50V29ya2luZ0tleS5jdXJyZW50KVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBwYXJlbnQgPSBmaW5kUGFyZW50RWxlbWVudChlLnRhcmdldCk7XG4gICAgICBjb25zdCBpbmRleE9mS2V5SW5DbGVhbk9yZGVyID0gZWxzLmluZGV4T2YocGFyZW50KTtcbiAgICAgIGNvbnN0IGtleU9mVGhlT3ZlckVsZW1lbnQgPSBjdXJyZW50T3JkZXJbaW5kZXhPZktleUluQ2xlYW5PcmRlcl07XG4gICAgICBjb25zdCBpc0RyYWdnaW5nT3duRWxlbWVudCA9XG4gICAgICAgIGN1cnJlbnRXb3JraW5nS2V5LmN1cnJlbnQgPT09IGtleU9mVGhlT3ZlckVsZW1lbnQ7XG4gICAgICBpZiAoaW5kZXhPZktleUluQ2xlYW5PcmRlciA9PT0gLTEgfHwga2V5T2ZUaGVPdmVyRWxlbWVudCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoIWlzRHJhZ2dpbmdPd25FbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgaXNBZnRlciwgaXNCZWZvcmUgfSA9ICgoKSA9PiB7XG4gICAgICAgICAgaWYgKG1vZGUgPT09IE9yZGVyYWJsZUxpc3RSZW9yZGVyTW9kZS5UV09fRElNRU5TSU9OUykge1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tTGVmdCA9IGUub2Zmc2V0WDtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoT2ZFbCA9IHBhcmVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHdpZHRoT2ZFbCAqIDAuMjU7XG4gICAgICAgICAgICBjb25zdCBpc0FmdGVyID0gZGlzdGFuY2VGcm9tTGVmdCA+IHdpZHRoT2ZFbCAtIG9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IGlzQmVmb3JlID0gZGlzdGFuY2VGcm9tTGVmdCA8IG9mZnNldDtcbiAgICAgICAgICAgIHJldHVybiB7IGlzQWZ0ZXIsIGlzQmVmb3JlIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbVRvcCA9IGUub2Zmc2V0WTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodE9mRWwgPSBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaGVpZ2h0T2ZFbCAqIDAuMjU7XG4gICAgICAgICAgICBjb25zdCBpc0FmdGVyID0gZGlzdGFuY2VGcm9tVG9wID4gaGVpZ2h0T2ZFbCAtIG9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IGlzQmVmb3JlID0gZGlzdGFuY2VGcm9tVG9wIDwgb2Zmc2V0O1xuICAgICAgICAgICAgcmV0dXJuIHsgaXNBZnRlciwgaXNCZWZvcmUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgY29uc3QgY2hlY2tJZkNhbk1vdmUgPSAoa2V5T2ZPdmVyRWxlbWVudD86IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBrZXlPZk92ZXJFbGVtZW50ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIGtleU9mT3ZlckVsZW1lbnQgIT09IGN1cnJlbnRXb3JraW5nS2V5LmN1cnJlbnRcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpbmRleE9mVGhlTmV3RWxlbWVudCA9XG4gICAgICAgICAgaW5kZXhPZktleUluQ2xlYW5PcmRlciArIChpc0FmdGVyID8gMSA6IC0xKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkVHJpZ2dlclJlb3JkZXJpbmcgPVxuICAgICAgICAgIChpc0FmdGVyIHx8IGlzQmVmb3JlKSAmJlxuICAgICAgICAgIGNoZWNrSWZDYW5Nb3ZlKGN1cnJlbnRPcmRlcltpbmRleE9mVGhlTmV3RWxlbWVudF0pO1xuICAgICAgICBpZiAoc2hvdWxkVHJpZ2dlclJlb3JkZXJpbmcpIHtcbiAgICAgICAgICBzZXRPcmRlcigocCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IGN1cnJlbnRPcmRlci5pbmRleE9mKFxuICAgICAgICAgICAgICBjdXJyZW50V29ya2luZ0tleS5jdXJyZW50IVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZLZXlJblByb3ZpZGVkT3JkZXIgPVxuICAgICAgICAgICAgICBjbGVhbktleXMocCkuaW5kZXhPZihrZXlPZlRoZU92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgIGxldCBpbmRleE9mVGhlTmV3RWxlbWVudCA9XG4gICAgICAgICAgICAgIGluZGV4T2ZLZXlJblByb3ZpZGVkT3JkZXIgKyAoaXNCZWZvcmUgPyAtMSA6IDApO1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzSW5kZXggPiBpbmRleE9mVGhlTmV3RWxlbWVudCkgaW5kZXhPZlRoZU5ld0VsZW1lbnQrKztcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyV2l0aG91dEN1cnJlbnQgPSBwLmZpbHRlcigoYSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYS5zdGFydHNXaXRoKGAke2N1cnJlbnRXb3JraW5nS2V5LmN1cnJlbnR9O2ApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBhICE9PSBjdXJyZW50V29ya2luZ0tleS5jdXJyZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcmRlcldpdGhvdXRDdXJyZW50LnNwbGljZShcbiAgICAgICAgICAgICAgaW5kZXhPZlRoZU5ld0VsZW1lbnQsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGAke2N1cnJlbnRXb3JraW5nS2V5LmN1cnJlbnR9OyR7RGF0ZS5ub3coKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG9yZGVyV2l0aG91dEN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAxMDAwIC8gNjApO1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBmdW5jdGlvbiByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICAgIGNvbnN0IGVscyA9IEFycmF5LmZyb20ocm9vdEVsKCkhLmNoaWxkcmVuKSBhcyBIVE1MRGl2RWxlbWVudFtdO1xuICAgICAgY29uc3QgY2FsY3VsYXRlUmVvcmRlcmluZ0NhbGwgPSAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGVscyA9IEFycmF5LmZyb20ocm9vdEVsKCkhLmNoaWxkcmVuKSBhcyBIVE1MRGl2RWxlbWVudFtdO1xuICAgICAgICBjYWxjdWxhdGVSZW9yZGVyaW5nKGUsIGVscywgY2xlYW5PcmRlcik7XG4gICAgICB9O1xuICAgICAgZm9yIChsZXQgZWwgb2YgZWxzKVxuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGNhbGN1bGF0ZVJlb3JkZXJpbmdDYWxsKTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgZWwgb2YgZWxzKVxuICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgY2FsY3VsYXRlUmVvcmRlcmluZ0NhbGwpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PT0gT3JkZXJhYmxlTGlzdFJlb3JkZXJNb2RlLlZFUlRJQ0FMKSB7XG4gICAgICByZXR1cm4gcmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkO1xuICAgICAgbGV0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdW5zdWJzY3JpYmUgPSByZWdpc3Rlckxpc3RlbmVycygpO1xuICAgICAgfSwgMjUwKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB1bnN1YnNjcmliZSgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtjbGVhbk9yZGVyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXCJvbkNoYW5nZUtleU9yZGVyXCIgaW4gcHJvcHMpIHByb3BzLm9uQ2hhbmdlS2V5T3JkZXIoY2xlYW5LZXlzKF9vcmRlcikpO1xuICB9LCBbX29yZGVyXSk7XG5cbiAgY29uc3QgY2xlYW5PcmRlclJlZiA9IHVzZVJlZihjbGVhbk9yZGVyKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjbGVhbk9yZGVyUmVmLmN1cnJlbnQgPSBjbGVhbk9yZGVyO1xuICB9LCBbY2xlYW5PcmRlcl0pO1xuICBjb25zdCBvbkFuY2hvckNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKHsgdGFyZ2V0OiBhbmNob3IgfTogUGljazxNb3VzZUV2ZW50LCBcInRhcmdldFwiPikgPT4ge1xuICAgICAgbGV0IG9mZnNldDogW3g6IG51bWJlciwgeTogbnVtYmVyXTtcbiAgICAgIGNvbnN0IG9yZGVyYWJsZUxpc3RJdGVtRm9yQW5jaG9yID0gZmluZFBhcmVudEVsZW1lbnQoXG4gICAgICAgIGFuY2hvciBhcyBIVE1MRGl2RWxlbWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJveCA9IG9yZGVyYWJsZUxpc3RJdGVtRm9yQW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgZWxzID0gQXJyYXkuZnJvbShyb290RWwoKSEuY2hpbGRyZW4pIGFzIEhUTUxEaXZFbGVtZW50W107XG4gICAgICBjb25zdCBlbEluZGV4ID0gZWxzLmluZGV4T2Yob3JkZXJhYmxlTGlzdEl0ZW1Gb3JBbmNob3IpO1xuXG4gICAgICBjb25zdCBjbG9uZSA9IG9yZGVyYWJsZUxpc3RJdGVtRm9yQW5jaG9yLmNsb25lTm9kZShcbiAgICAgICAgdHJ1ZVxuICAgICAgKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgIGN1cnJlbnRDbG9uZS5jdXJyZW50ID0gY2xvbmU7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIilcbiAgICAgICAgY2xvbmUuc2V0QXR0cmlidXRlKFwiZGF0YS10ZXN0aWRcIiwgXCJvcmRlcmFibGUtbGlzdC1jbG9uZVwiKTtcbiAgICAgIGNsb25lLnNldEF0dHJpYnV0ZShcImRhdGEtb3JkZXJhYmxlaWRcIiwgXCJvcmRlcmFibGUtbGlzdC1jbG9uZVwiKTtcbiAgICAgIGNsb25lLnN0eWxlLndpZHRoID0gYCR7Ym94LndpZHRofXB4YDtcbiAgICAgIGNsb25lLnN0eWxlLmhlaWdodCA9IGAke2JveC5oZWlnaHR9cHhgO1xuICAgICAgY2xvbmUuc3R5bGUudG9wID0gYCR7Ym94LnRvcH1weGA7XG4gICAgICBjbG9uZS5zdHlsZS5sZWZ0ID0gYCR7Ym94LmxlZnR9cHhgO1xuICAgICAgY2xvbmUuY2xhc3NMaXN0LmFkZChTdHlsZXMuY2xvbmUpO1xuICAgICAgaWYgKHNocmlua1RvT25PcmRlcikgY2xvbmUuc3R5bGUubWF4SGVpZ2h0ID0gYCR7Ym94LmhlaWdodH1weGA7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGNsb25lQ2xhc3NOYW1lKSBjbG9uZS5jbGFzc0xpc3QuYWRkKGNsb25lQ2xhc3NOYW1lKTtcbiAgICAgICAgaWYgKHNocmlua1RvT25PcmRlcikgY2xvbmUuc3R5bGUubWF4SGVpZ2h0ID0gYCR7c2hyaW5rVG9Pbk9yZGVyfXB4YDtcbiAgICAgIH0sIDApO1xuXG4gICAgICBvcmRlcmFibGVMaXN0SXRlbUZvckFuY2hvci5jbGFzc0xpc3QuYWRkKFN0eWxlcy5jdXJyZW50T3JkZXJpbmcpO1xuICAgICAgb3JkZXJhYmxlTGlzdEl0ZW1Gb3JBbmNob3IuY2xhc3NMaXN0LnJlbW92ZShTdHlsZXMudmlzaWJsZSk7XG5cbiAgICAgIGNvbnN0IG1vdmVtZW50Q29udHJvbCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB7IHg6IHgxLCB5OiB5MSB9ID1cbiAgICAgICAgICBcInRvdWNoZXNcIiBpbiBlID8geyB4OiBlLnRvdWNoZXNbMF0ucGFnZVgsIHk6IGUudG91Y2hlc1swXS5wYWdlWSB9IDogZTtcbiAgICAgICAgaWYgKCFvZmZzZXQpIG9mZnNldCA9IFt4MSAtIGJveC5sZWZ0LCB5MSAtIGJveC50b3BdO1xuXG4gICAgICAgIGNvbnN0IFtvZmZzZXRYLCBvZmZzZXRZXSA9IG9mZnNldDtcbiAgICAgICAgY2xvbmUuc3R5bGUudG9wID0gYCR7eTEgLSBvZmZzZXRZfXB4YDtcbiAgICAgICAgY2xvbmUuc3R5bGUubGVmdCA9IGAke3gxIC0gb2Zmc2V0WH1weGA7XG4gICAgICB9O1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNsb25lKTtcbiAgICAgIGNvbnN0IGRlbGV0ZUNsb25lID0gKCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3ZlbWVudENvbnRyb2wpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBtb3ZlbWVudENvbnRyb2wpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGRlbGV0ZUNsb25lKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGRlbGV0ZUNsb25lKTtcbiAgICAgICAgb3JkZXJhYmxlTGlzdEl0ZW1Gb3JBbmNob3Iuc3R5bGUudmlzaWJpbGl0eSA9IFwiaW5pdGlhbFwiO1xuICAgICAgICBjdXJyZW50V29ya2luZ0tleS5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKFN0eWxlcy51bnNlbGVjdGFibGUpO1xuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgZWxzID0gQXJyYXkuZnJvbShyb290RWwoKSEuY2hpbGRyZW4pIGFzIEhUTUxEaXZFbGVtZW50W107XG4gICAgICAgICAgY29uc3QgZWxJbnZpc2libGUgPSBlbHMuZmluZChcbiAgICAgICAgICAgIChhKSA9PlxuICAgICAgICAgICAgICAhYS5jbGFzc0xpc3QuY29udGFpbnMoU3R5bGVzLnZpc2libGUpICYmXG4gICAgICAgICAgICAgIGEuc3R5bGUubWF4SGVpZ2h0ICE9PSBcIjBweFwiXG4gICAgICAgICAgKSE7XG4gICAgICAgICAgaWYgKHNocmlua1RvT25PcmRlcikge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBlbEludmlzaWJsZS5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICAgICAgY2hpbGQuc3R5bGUubWF4SGVpZ2h0ID0gYCR7Y2hpbGQuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNoaWxkLmNsYXNzTGlzdC5hZGQoU3R5bGVzLnRyYW5zaXRpb25IZWlnaHQpO1xuICAgICAgICAgICAgY29uc3Qgb25FbmQgPSBvd25FdmVudCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNoaWxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIG9uRW5kKTtcbiAgICAgICAgICAgICAgY2hpbGQuc3R5bGUubWF4SGVpZ2h0ID0gYGluaXRpYWxgO1xuICAgICAgICAgICAgICBjaGlsZC5jbGFzc0xpc3QucmVtb3ZlKFN0eWxlcy50cmFuc2l0aW9uSGVpZ2h0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgb25FbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBib3ggPSBlbEludmlzaWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkge1xuICAgICAgICAgICAgaWYgKHNocmlua1RvT25PcmRlcikge1xuICAgICAgICAgICAgICByb290RWwoKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcInBhZGRpbmctdG9wXCIpO1xuICAgICAgICAgICAgICByb290RWwoKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIm1pbi1oZWlnaHRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV2ZW50RW1pdHRlci5kaXNwYXRjaGVyKFwib3JkZXItc3RvcFwiKTtcbiAgICAgICAgICAgIHJvb3RFbCgpLmNsYXNzTGlzdC5yZW1vdmUoU3R5bGVzLm9yZGVyaW5nKTtcbiAgICAgICAgICAgIGlmIChyZW9yZGVyaW5nQ2xhc3NOYW1lKVxuICAgICAgICAgICAgICByb290RWwoKS5jbGFzc0xpc3QucmVtb3ZlKHJlb3JkZXJpbmdDbGFzc05hbWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWwgb2YgZWxzKSBlbC5jbGFzc0xpc3QucmVtb3ZlKFN0eWxlcy52aXNpYmxlKTtcbiAgICAgICAgICAgIGNsb25lLnJlbW92ZSgpO1xuICAgICAgICAgICAgY3VycmVudENsb25lLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChsZXQgZWwgb2YgQXJyYXkuZnJvbShlbEludmlzaWJsZS5jaGlsZHJlbikgYXMgSFRNTERpdkVsZW1lbnRbXSlcbiAgICAgICAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gXCJcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2xvbmUuc3R5bGUudG9wLnN0YXJ0c1dpdGgoTWF0aC5mbG9vcihib3gudG9wKS50b1N0cmluZygpKSAmJlxuICAgICAgICAgICAgY2xvbmUuc3R5bGUubGVmdC5zdGFydHNXaXRoKE1hdGguZmxvb3IoYm94LmxlZnQpLnRvU3RyaW5nKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnRvcCA9IGAke2JveC50b3B9cHhgO1xuICAgICAgICAgICAgY2xvbmUuc3R5bGUubGVmdCA9IGAke2JveC5sZWZ0fXB4YDtcbiAgICAgICAgICAgIGNsb25lLnN0eWxlLnRyYW5zaXRpb24gPSBgdG9wIDUwMG1zIGxpbmVhciwgbGVmdCA1MDBtcyBsaW5lYXJgO1xuICAgICAgICAgICAgY2xvbmUuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmb3IgKGxldCBlbCBvZiBlbHMpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZChTdHlsZXMudmlzaWJsZSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hyaW5rVG9Pbk9yZGVyKSB7XG4gICAgICAgIGZvciAobGV0IGVsIG9mIGVscykgZWwuc3R5bGUubWF4SGVpZ2h0ID0gYCR7ZWwuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgICAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gZWxJbmRleCAqIHNocmlua1RvT25PcmRlcjtcbiAgICAgICAgY29uc3QgY3VycmVudEhlaWdodCA9XG4gICAgICAgICAgb3JkZXJhYmxlTGlzdEl0ZW1Gb3JBbmNob3Iub2Zmc2V0VG9wIC0gZWxzWzBdLm9mZnNldFRvcDtcbiAgICAgICAgY29uc3QgcGFkZGluZ1RvcCA9IGN1cnJlbnRIZWlnaHQgLSB0YXJnZXRIZWlnaHQ7XG4gICAgICAgIHJvb3RFbCgpLnN0eWxlLnBhZGRpbmdUb3AgPSBgJHtwYWRkaW5nVG9wfXB4YDtcbiAgICAgICAgcm9vdEVsKCkuc3R5bGUubWluSGVpZ2h0ID0gYCR7cm9vdEVsKCkuY2xpZW50SGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIG9yZGVyYWJsZUxpc3RJdGVtRm9yQW5jaG9yLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgb3JkZXJhYmxlTGlzdEl0ZW1Gb3JBbmNob3IuY2xhc3NMaXN0LnJlbW92ZShTdHlsZXMudmlzaWJsZSk7XG4gICAgICByb290RWwoKS5jbGFzc0xpc3QuYWRkKFN0eWxlcy5vcmRlcmluZyk7XG4gICAgICBpZiAocmVvcmRlcmluZ0NsYXNzTmFtZSkgcm9vdEVsKCkuY2xhc3NMaXN0LmFkZChyZW9yZGVyaW5nQ2xhc3NOYW1lKTtcbiAgICAgIGN1cnJlbnRXb3JraW5nS2V5LmN1cnJlbnQgPSBjbGVhbk9yZGVyUmVmLmN1cnJlbnRbZWxJbmRleF07XG4gICAgICBldmVudEVtaXR0ZXIuZGlzcGF0Y2hlcihcIm9yZGVyLXN0YXJ0XCIpO1xuICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChTdHlsZXMudW5zZWxlY3RhYmxlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBkZWxldGVDbG9uZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBtb3ZlbWVudENvbnRyb2wpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBkZWxldGVDbG9uZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBtb3ZlbWVudENvbnRyb2wpO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjdXJyZW50Q2xvbmUuY3VycmVudCkge1xuICAgICAgY29uc3QgZWxzID0gQXJyYXkuZnJvbShyb290RWwoKSEuY2hpbGRyZW4pIGFzIEhUTUxEaXZFbGVtZW50W107XG4gICAgICBjb25zdCBlbEludmlzaWJsZSA9IGVscy5maW5kKFxuICAgICAgICAoYSkgPT5cbiAgICAgICAgICAhYS5jbGFzc0xpc3QuY29udGFpbnMoU3R5bGVzLnZpc2libGUpICYmIGEuc3R5bGUubWF4SGVpZ2h0ICE9PSBcIjBweFwiXG4gICAgICApITtcbiAgICAgIChlbEludmlzaWJsZS5jaGlsZHJlblswXSBhcyBIVE1MRGl2RWxlbWVudCkuc3R5bGUuaGVpZ2h0ID0gYCR7XG4gICAgICAgIGN1cnJlbnRDbG9uZS5jdXJyZW50IS5jbGllbnRIZWlnaHRcbiAgICAgIH1weGA7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgKGVsSW52aXNpYmxlLmNoaWxkcmVuWzFdIGFzIEhUTUxEaXZFbGVtZW50KS5zdHlsZS5oZWlnaHQgPSBgJHtcbiAgICAgICAgICBjdXJyZW50Q2xvbmUuY3VycmVudCEuY2xpZW50SGVpZ2h0XG4gICAgICAgIH1weGA7XG4gICAgICB9LCAxNTApO1xuICAgIH1cbiAgfSwgW2NsZWFuT3JkZXJdKTtcblxuICBjb25zdCB0b1NwcmVhZCA9IHsgLi4ucHJvcHMgfSBhcyBhbnk7XG4gIGRlbGV0ZSB0b1NwcmVhZC5rZXlPcmRlcjtcbiAgZGVsZXRlIHRvU3ByZWFkLm9uQ2hhbmdlS2V5T3JkZXI7XG5cbiAgY29uc3QgY2hpbGRyZW5Ub1JlbmRlciA9IFsuLi5jaGlsZHJlbl1cbiAgICAuZmlsdGVyKChhKSA9PiBjbGVhbk9yZGVyLmluY2x1ZGVzKGEua2V5IGFzIHN0cmluZykpXG4gICAgLnNvcnQoXG4gICAgICAoYSwgYikgPT5cbiAgICAgICAgY2xlYW5PcmRlci5pbmRleE9mKGEua2V5IGFzIHN0cmluZykgLVxuICAgICAgICBjbGVhbk9yZGVyLmluZGV4T2YoYi5rZXkgYXMgc3RyaW5nKVxuICAgIClcbiAgICAubWFwKChhOiBSZWFjdEVsZW1lbnQsIGkpID0+ICh7XG4gICAgICAuLi5hLFxuICAgICAga2V5OiBvcmRlcltpXSxcbiAgICB9KSk7XG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICByb290RWwoKSEuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgKGUpID0+IHtcbiAgICAgIGNvbnN0IHJlbGF0ZWRBbmNob3IgPSBhbmNob3JzTGlzdC5maW5kKChhbmNob3IpID0+XG4gICAgICAgIGFuY2hvci5jb250YWlucyhlLnRhcmdldCBhcyBhbnkpXG4gICAgICApO1xuICAgICAgaWYgKHJlbGF0ZWRBbmNob3IpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbkFuY2hvckNsaWNrKHtcbiAgICAgICAgICB0YXJnZXQ6IHJlbGF0ZWRBbmNob3IsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG1vdmVDYiA9IHRocm90dGxlKChlOiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICAgICAgY29uc3QgW3gsIHldID0gW3RvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFldO1xuICAgICAgICAgIGNvbnN0IGVscyA9IEFycmF5LmZyb20ocm9vdEVsKCkuY2hpbGRyZW4pIGFzIEhUTUxEaXZFbGVtZW50W107XG4gICAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnRJZHggPSBlbHMuZmluZEluZGV4KChjLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gYz8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBpZiAoIXJlY3QpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZWN0LnRvcCA8IHkgJiYgcmVjdC50b3AgKyByZWN0LmhlaWdodCA+IHk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50SWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZWwgPSBlbHNbY3VycmVudEVsZW1lbnRJZHhdO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY2FsY3VsYXRlUmVvcmRlcmluZyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhcmdldDogZWwsXG4gICAgICAgICAgICAgICAgb2Zmc2V0WTogeSAtIHJlY3QudG9wLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlbHMsXG4gICAgICAgICAgICAgIGNsZWFuT3JkZXJSZWYuY3VycmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGNvbnN0IHQgPSBlLnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgY29uc3QgdG91Y2hNb3ZlQ2IgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IFRvdWNoRXZlbnQoZS50eXBlLCBlIGFzIGFueSkpO1xuICAgICAgICAgIG1vdmVDYihlKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVtb3ZlQ2IgPSAoZTogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0b3VjaE1vdmVDYik7XG4gICAgICAgICAgdC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgcmVtb3ZlQ2IpO1xuICAgICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBUb3VjaEV2ZW50KGUudHlwZSwgZSBhcyBhbnkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIHRvdWNoTW92ZUNiKTtcbiAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgcmVtb3ZlQ2IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIGJpbmRBbmNob3I6IChlbDogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBvbkFuY2hvckNsaWNrKTtcbiAgICAgICAgYW5jaG9yc0xpc3QucHVzaChlbCk7XG4gICAgICB9LFxuICAgICAgdW5iaW5kQW5jaG9yOiAoZWw6IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgb25BbmNob3JDbGljayk7XG4gICAgICAgIGFuY2hvcnNMaXN0LnNwbGljZShhbmNob3JzTGlzdC5pbmRleE9mKGVsKSwgMSk7XG4gICAgICB9LFxuICAgICAgb246IGV2ZW50RW1pdHRlci5zdWJzY3JpYmVyLFxuICAgIH0pLFxuICAgIFtdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8T3JkZXJhYmxlTGlzdENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2V9PlxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3Jvb3RSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT17YCR7U3R5bGVzLnJvb3R9ICR7Y2xhc3NOYW1lfSAke1xuICAgICAgICAgIHNocmlua1RvT25PcmRlciA/IFN0eWxlcy5zaHJpbmthYmxlIDogXCJcIlxuICAgICAgICB9YH1cbiAgICAgICAgey4uLnRvU3ByZWFkfVxuICAgICAgPlxuICAgICAgICB7bW9kZSA9PT0gT3JkZXJhYmxlTGlzdFJlb3JkZXJNb2RlLlZFUlRJQ0FMID8gKFxuICAgICAgICAgIDxBbmltYXRlZEVudHJhbmNlPntjaGlsZHJlblRvUmVuZGVyfTwvQW5pbWF0ZWRFbnRyYW5jZT5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8VW5jb250cm9sbGVkVHJhbnNpdGlvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtTdHlsZXMudHJhbnNpdGlvbn1cbiAgICAgICAgICAgIHRyYW5zaXRpb25UeXBlPXtUcmFuc2l0aW9uQW5pbWF0aW9uVHlwZXMuQ1VTVE9NfVxuICAgICAgICAgICAgY29uZmlnPXt7XG4gICAgICAgICAgICAgIGJhY2t3YXJkOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudEVudGVyaW5nOiBcIlwiLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRFeGl0aW5nOiBcIlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmb3J3YXJkOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudEVudGVyaW5nOiBTdHlsZXMuc3R1YkVudGVyaW5nLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRFeGl0aW5nOiBUcmFuc2l0aW9uU3R5bGVzLmZhZGVPdXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgY29udGVudENsYXNzTmFtZT17YCR7Y2xhc3NOYW1lfWB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEZyYWdtZW50IGtleT17b3JkZXJJZH0+XG4gICAgICAgICAgICAgIHtbLi4uY2hpbGRyZW5dXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoYSkgPT4gY2xlYW5PcmRlci5pbmNsdWRlcyhhLmtleSBhcyBzdHJpbmcpKVxuICAgICAgICAgICAgICAgIC5zb3J0KFxuICAgICAgICAgICAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICAgIGNsZWFuT3JkZXIuaW5kZXhPZihhLmtleSBhcyBzdHJpbmcpIC1cbiAgICAgICAgICAgICAgICAgICAgY2xlYW5PcmRlci5pbmRleE9mKGIua2V5IGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLm1hcCgoYSwgaSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPEhlcm9XcmFwcGVyIGtleT17aX0gaWQ9e2Eua2V5IGFzIHN0cmluZ30+XG4gICAgICAgICAgICAgICAgICAgIHthfVxuICAgICAgICAgICAgICAgICAgPC9IZXJvV3JhcHBlcj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgPC9VbmNvbnRyb2xsZWRUcmFuc2l0aW9uPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9PcmRlcmFibGVMaXN0Q29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gSGVyb1dyYXBwZXIoeyBjaGlsZHJlbiwgaWQgfTogUHJvcHNXaXRoQ2hpbGRyZW48eyBpZDogc3RyaW5nIH0+KSB7XG4gIGNvbnN0IHsgaGVyb1JlZiB9ID0gdXNlSGVybyhpZCwgdW5kZWZpbmVkLCB7XG4gICAgb25IZXJvU3RhcnQ6IChfYywgX28sIHQpID0+IHtcbiAgICAgIHQucXVlcnlTZWxlY3RvckFsbChcImltZ1wiKS5mb3JFYWNoKFxuICAgICAgICAoaW1nKSA9PiAoaW1nLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiKVxuICAgICAgKTtcbiAgICB9LFxuICAgIG9uSGVyb0Nsb25lZChjbG9uZSkge1xuICAgICAgLy8gaWYgKCFjbG9uZS5jbGFzc0xpc3QuY29udGFpbnMoU3R5bGVzLnZpc2libGUpKSBjbG9uZS5zdHlsZS5vcGFjaXR5ID0gXCIwXCI7XG4gICAgfSxcbiAgICBvbkhlcm9FbmQ6ICgpID0+IHtcbiAgICAgIGlmIChoZXJvUmVmLmN1cnJlbnQpXG4gICAgICAgIGhlcm9SZWYuY3VycmVudFxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKFwiaW1nXCIpXG4gICAgICAgICAgLmZvckVhY2goKGltZykgPT4gKGltZy5zdHlsZS52aXNpYmlsaXR5ID0gXCJcIikpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gPGRpdiByZWY9e2hlcm9SZWZ9PntjaGlsZHJlbn08L2Rpdj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VPcmRlcmFibGVMaXN0QW5jaG9yKCkge1xuICBjb25zdCBhbmNob3JSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwgYXMgYW55KTtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChPcmRlcmFibGVMaXN0Q29udGV4dCk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICBjb25zdCB7IGJpbmRBbmNob3IsIHVuYmluZEFuY2hvciB9ID0gY3R4O1xuICAgIGJpbmRBbmNob3IoYW5jaG9yUmVmLmN1cnJlbnQhKTtcbiAgICByZXR1cm4gKCkgPT4gdW5iaW5kQW5jaG9yKGFuY2hvclJlZi5jdXJyZW50ISk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIHtcbiAgICBhbmNob3JSZWY6IGN0eCA/IGFuY2hvclJlZiA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZU9yZGVyYWJsZUV2ZW50cyhcbiAgZXZlbnRzOiB7XG4gICAgW2sgaW4gRXZlbnRzXTogKCkgPT4gdm9pZDtcbiAgfVxuKSB7XG4gIGNvbnN0IHsgb24gfSA9IHVzZUNvbnRleHQoT3JkZXJhYmxlTGlzdENvbnRleHQpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlcnM6IGFueVtdID0gW107XG4gICAgZm9yIChsZXQgZXZlbnROYW1lIGluIGV2ZW50cykge1xuICAgICAgdW5zdWJzY3JpYmVycy5wdXNoKG9uKGV2ZW50TmFtZSBhcyBFdmVudHMsIGV2ZW50c1tldmVudE5hbWUgYXMgRXZlbnRzXSkpO1xuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdW5zdWJzY3JpYmVycy5mb3JFYWNoKCh1KSA9PiB1KCkpO1xuICAgIH07XG4gIH0sIFtldmVudHNdKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBZUEsSUFBQUcsdUJBQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLGlCQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxpQkFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU8sV0FBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsb0JBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLFVBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLFNBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUE0QyxNQUFBVyxTQUFBO0FBQUEsU0FBQUMseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQVgsd0JBQUFlLEdBQUEsRUFBQUosV0FBQSxTQUFBQSxXQUFBLElBQUFJLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLFdB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