@nlabs/gothamui 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/LICENSE +21 -0
  2. package/MIGRATION.md +36 -0
  3. package/README.md +768 -0
  4. package/docs/assets/gothamui-app-architecture.svg +159 -0
  5. package/docs/assets/gothamui-logo.png +0 -0
  6. package/docs/assets/gothamui-logo.svg +42 -0
  7. package/docs/render-performance.md +34 -0
  8. package/lib/actions/GothamActions.d.ts +42 -0
  9. package/lib/actions/GothamActions.js +67 -0
  10. package/lib/actions/MarkdownActions.d.ts +4 -0
  11. package/lib/actions/MarkdownActions.js +48 -0
  12. package/lib/app.d.ts +1 -0
  13. package/lib/app.js +198 -0
  14. package/lib/components/Alert/Alert.d.ts +8 -0
  15. package/lib/components/Alert/Alert.js +24 -0
  16. package/lib/components/Alert/Alert.stories.js +59 -0
  17. package/lib/components/AuthRoute/AuthRoute.d.ts +3 -0
  18. package/lib/components/AuthRoute/AuthRoute.js +21 -0
  19. package/lib/components/AuthRoute/AuthRoute.stories.js +45 -0
  20. package/lib/components/AutocompleteField/AutocompleteField.d.ts +24 -0
  21. package/lib/components/AutocompleteField/AutocompleteField.js +148 -0
  22. package/lib/components/AutocompleteField/AutocompleteField.stories.js +62 -0
  23. package/lib/components/Avatar/Avatar.d.ts +29 -0
  24. package/lib/components/Avatar/Avatar.js +154 -0
  25. package/lib/components/Avatar/Avatar.stories.js +105 -0
  26. package/lib/components/Badge/Badge.d.ts +9 -0
  27. package/lib/components/Badge/Badge.js +22 -0
  28. package/lib/components/Badge/Badge.stories.js +53 -0
  29. package/lib/components/Breadcrumbs/Breadcrumbs.d.ts +19 -0
  30. package/lib/components/Breadcrumbs/Breadcrumbs.js +74 -0
  31. package/lib/components/Breadcrumbs/Breadcrumbs.stories.js +95 -0
  32. package/lib/components/Button/Button.d.ts +25 -0
  33. package/lib/components/Button/Button.js +157 -0
  34. package/lib/components/Button/Button.stories.js +119 -0
  35. package/lib/components/Card/Card.d.ts +8 -0
  36. package/lib/components/Card/Card.js +39 -0
  37. package/lib/components/Card/Card.stories.js +60 -0
  38. package/lib/components/CategoryGrid/CategoryGrid.d.ts +15 -0
  39. package/lib/components/CategoryGrid/CategoryGrid.js +42 -0
  40. package/lib/components/CategoryGrid/CategoryGrid.stories.js +35 -0
  41. package/lib/components/Chat/AudioMessage/AudioMessage.css +1 -0
  42. package/lib/components/Chat/AudioMessage/AudioMessage.d.ts +3 -0
  43. package/lib/components/Chat/AudioMessage/AudioMessage.js +28 -0
  44. package/lib/components/Chat/Avatar/Avatar.css +1 -0
  45. package/lib/components/Chat/Avatar/Avatar.d.ts +3 -0
  46. package/lib/components/Chat/Avatar/Avatar.js +72 -0
  47. package/lib/components/Chat/Button/Button.css +1 -0
  48. package/lib/components/Chat/Button/Button.d.ts +3 -0
  49. package/lib/components/Chat/Button/Button.js +37 -0
  50. package/lib/components/Chat/Chat.stories.js +688 -0
  51. package/lib/components/Chat/ChatItem/ChatItem.css +1 -0
  52. package/lib/components/Chat/ChatItem/ChatItem.d.ts +3 -0
  53. package/lib/components/Chat/ChatItem/ChatItem.js +183 -0
  54. package/lib/components/Chat/ChatList/ChatList.css +1 -0
  55. package/lib/components/Chat/ChatList/ChatList.d.ts +3 -0
  56. package/lib/components/Chat/ChatList/ChatList.js +84 -0
  57. package/lib/components/Chat/Circle/Circle.d.ts +3 -0
  58. package/lib/components/Chat/Circle/Circle.js +27 -0
  59. package/lib/components/Chat/Dropdown/Dropdown.css +1 -0
  60. package/lib/components/Chat/Dropdown/Dropdown.d.ts +3 -0
  61. package/lib/components/Chat/Dropdown/Dropdown.js +66 -0
  62. package/lib/components/Chat/FileMessage/FileMessage.css +1 -0
  63. package/lib/components/Chat/FileMessage/FileMessage.d.ts +3 -0
  64. package/lib/components/Chat/FileMessage/FileMessage.js +77 -0
  65. package/lib/components/Chat/Input/Input.css +1 -0
  66. package/lib/components/Chat/Input/Input.d.ts +3 -0
  67. package/lib/components/Chat/Input/Input.js +108 -0
  68. package/lib/components/Chat/LocationMessage/LocationMessage.css +1 -0
  69. package/lib/components/Chat/LocationMessage/LocationMessage.d.ts +3 -0
  70. package/lib/components/Chat/LocationMessage/LocationMessage.js +36 -0
  71. package/lib/components/Chat/MeetingItem/MeetingItem.css +1 -0
  72. package/lib/components/Chat/MeetingItem/MeetingItem.d.ts +3 -0
  73. package/lib/components/Chat/MeetingItem/MeetingItem.js +106 -0
  74. package/lib/components/Chat/MeetingLink/MeetingLink.css +1 -0
  75. package/lib/components/Chat/MeetingLink/MeetingLink.d.ts +3 -0
  76. package/lib/components/Chat/MeetingLink/MeetingLink.js +26 -0
  77. package/lib/components/Chat/MeetingList/MeetingList.css +1 -0
  78. package/lib/components/Chat/MeetingList/MeetingList.d.ts +3 -0
  79. package/lib/components/Chat/MeetingList/MeetingList.js +52 -0
  80. package/lib/components/Chat/MeetingMessage/MeetingMessage.css +1 -0
  81. package/lib/components/Chat/MeetingMessage/MeetingMessage.d.ts +3 -0
  82. package/lib/components/Chat/MeetingMessage/MeetingMessage.js +227 -0
  83. package/lib/components/Chat/MessageBox/MessageBox.css +1 -0
  84. package/lib/components/Chat/MessageBox/MessageBox.d.ts +3 -0
  85. package/lib/components/Chat/MessageBox/MessageBox.js +263 -0
  86. package/lib/components/Chat/MessageList/MessageList.css +1 -0
  87. package/lib/components/Chat/MessageList/MessageList.d.ts +2 -0
  88. package/lib/components/Chat/MessageList/MessageList.js +196 -0
  89. package/lib/components/Chat/Navbar/Navbar.css +1 -0
  90. package/lib/components/Chat/Navbar/Navbar.d.ts +3 -0
  91. package/lib/components/Chat/Navbar/Navbar.js +21 -0
  92. package/lib/components/Chat/PhotoMessage/PhotoMessage.css +1 -0
  93. package/lib/components/Chat/PhotoMessage/PhotoMessage.d.ts +3 -0
  94. package/lib/components/Chat/PhotoMessage/PhotoMessage.js +73 -0
  95. package/lib/components/Chat/Popup/Popup.css +1 -0
  96. package/lib/components/Chat/Popup/Popup.d.ts +3 -0
  97. package/lib/components/Chat/Popup/Popup.js +45 -0
  98. package/lib/components/Chat/README.md +50 -0
  99. package/lib/components/Chat/ReplyMessage/ReplyMessage.css +1 -0
  100. package/lib/components/Chat/ReplyMessage/ReplyMessage.d.ts +3 -0
  101. package/lib/components/Chat/ReplyMessage/ReplyMessage.js +42 -0
  102. package/lib/components/Chat/SideBar/SideBar.css +1 -0
  103. package/lib/components/Chat/SideBar/SideBar.d.ts +3 -0
  104. package/lib/components/Chat/SideBar/SideBar.js +21 -0
  105. package/lib/components/Chat/SpotifyMessage/SpotifyMessage.css +1 -0
  106. package/lib/components/Chat/SpotifyMessage/SpotifyMessage.d.ts +3 -0
  107. package/lib/components/Chat/SpotifyMessage/SpotifyMessage.js +28 -0
  108. package/lib/components/Chat/SystemMessage/SystemMessage.css +1 -0
  109. package/lib/components/Chat/SystemMessage/SystemMessage.d.ts +3 -0
  110. package/lib/components/Chat/SystemMessage/SystemMessage.js +14 -0
  111. package/lib/components/Chat/VideoMessage/VideoMessage.css +1 -0
  112. package/lib/components/Chat/VideoMessage/VideoMessage.d.ts +3 -0
  113. package/lib/components/Chat/VideoMessage/VideoMessage.js +88 -0
  114. package/lib/components/Chat/assets/img/leftArrow.svg +6 -0
  115. package/lib/components/Chat/assets/img/rightArrow.svg +6 -0
  116. package/lib/components/Chat/index.d.ts +25 -0
  117. package/lib/components/Chat/index.js +27 -0
  118. package/lib/components/Chat/type.d.js +52 -0
  119. package/lib/components/Chat/utils/formatRelativeDate.d.ts +4 -0
  120. package/lib/components/Chat/utils/formatRelativeDate.js +110 -0
  121. package/lib/components/Checkbox/Checkbox.d.ts +15 -0
  122. package/lib/components/Checkbox/Checkbox.js +106 -0
  123. package/lib/components/Checkbox/Checkbox.stories.js +51 -0
  124. package/lib/components/ComponentUtils/renderWithAsChild.d.ts +9 -0
  125. package/lib/components/ComponentUtils/renderWithAsChild.js +27 -0
  126. package/lib/components/Container/Container.d.ts +7 -0
  127. package/lib/components/Container/Container.js +16 -0
  128. package/lib/components/Container/Container.stories.js +36 -0
  129. package/lib/components/DateField/DateField.d.ts +22 -0
  130. package/lib/components/DateField/DateField.js +145 -0
  131. package/lib/components/DateField/DateField.stories.js +125 -0
  132. package/lib/components/DateField/DatePicker.d.ts +9 -0
  133. package/lib/components/DateField/DatePicker.js +205 -0
  134. package/lib/components/DateField/DatePicker.stories.js +33 -0
  135. package/lib/components/DescriptionList/DescriptionList.d.ts +4 -0
  136. package/lib/components/DescriptionList/DescriptionList.js +19 -0
  137. package/lib/components/DescriptionList/DescriptionList.stories.js +34 -0
  138. package/lib/components/Dialog/Dialog.d.ts +25 -0
  139. package/lib/components/Dialog/Dialog.js +66 -0
  140. package/lib/components/Dialog/Dialog.stories.js +88 -0
  141. package/lib/components/DropUpload/DropUpload.d.ts +37 -0
  142. package/lib/components/DropUpload/DropUpload.js +323 -0
  143. package/lib/components/DropUpload/DropUpload.stories.js +48 -0
  144. package/lib/components/Empty/Empty.d.ts +11 -0
  145. package/lib/components/Empty/Empty.js +39 -0
  146. package/lib/components/Empty/Empty.stories.js +52 -0
  147. package/lib/components/EmptyState/EmptyState.d.ts +15 -0
  148. package/lib/components/EmptyState/EmptyState.js +44 -0
  149. package/lib/components/EmptyState/EmptyState.stories.js +36 -0
  150. package/lib/components/ErrorMessage/ErrorMessage.d.ts +7 -0
  151. package/lib/components/ErrorMessage/ErrorMessage.js +20 -0
  152. package/lib/components/ErrorMessage/ErrorMessage.stories.js +25 -0
  153. package/lib/components/FaqSection/FaqSection.d.ts +14 -0
  154. package/lib/components/FaqSection/FaqSection.js +37 -0
  155. package/lib/components/FaqSection/FaqSection.stories.js +31 -0
  156. package/lib/components/Fieldset/Fieldset.d.ts +21 -0
  157. package/lib/components/Fieldset/Fieldset.js +39 -0
  158. package/lib/components/Fieldset/Fieldset.stories.js +42 -0
  159. package/lib/components/Footer/Footer.d.ts +26 -0
  160. package/lib/components/Footer/Footer.js +119 -0
  161. package/lib/components/Footer/Footer.stories.js +184 -0
  162. package/lib/components/Form/Form.d.ts +42 -0
  163. package/lib/components/Form/Form.js +198 -0
  164. package/lib/components/Form/Form.stories.js +65 -0
  165. package/lib/components/Form/FormContext.d.ts +35 -0
  166. package/lib/components/Form/FormContext.js +71 -0
  167. package/lib/components/GothamRoute/GothamRoute.d.ts +0 -0
  168. package/lib/components/GothamRoute/GothamRoute.js +56 -0
  169. package/lib/components/GothamRouter/GothamRouter.d.ts +0 -0
  170. package/lib/components/GothamRouter/GothamRouter.js +52 -0
  171. package/lib/components/Heading/Heading.d.ts +7 -0
  172. package/lib/components/Heading/Heading.js +20 -0
  173. package/lib/components/Heading/Heading.stories.js +51 -0
  174. package/lib/components/IncentiveGrid/IncentiveGrid.d.ts +15 -0
  175. package/lib/components/IncentiveGrid/IncentiveGrid.js +34 -0
  176. package/lib/components/IncentiveGrid/IncentiveGrid.stories.js +41 -0
  177. package/lib/components/InputField/InputField.d.ts +25 -0
  178. package/lib/components/InputField/InputField.js +68 -0
  179. package/lib/components/InputField/InputField.stories.js +58 -0
  180. package/lib/components/Item/Item.d.ts +25 -0
  181. package/lib/components/Item/Item.js +79 -0
  182. package/lib/components/Item/Item.stories.js +94 -0
  183. package/lib/components/Kbd/Kbd.d.ts +2 -0
  184. package/lib/components/Kbd/Kbd.js +9 -0
  185. package/lib/components/Kbd/Kbd.stories.js +24 -0
  186. package/lib/components/Label/Label.d.ts +11 -0
  187. package/lib/components/Label/Label.js +23 -0
  188. package/lib/components/Label/Label.stories.js +38 -0
  189. package/lib/components/Link/Link.d.ts +7 -0
  190. package/lib/components/Link/Link.js +13 -0
  191. package/lib/components/Link/Link.stories.js +28 -0
  192. package/lib/components/ListContainer/ListContainer.d.ts +8 -0
  193. package/lib/components/ListContainer/ListContainer.js +14 -0
  194. package/lib/components/ListContainer/ListContainer.stories.js +45 -0
  195. package/lib/components/Loader/Loader.d.ts +9 -0
  196. package/lib/components/Loader/Loader.js +36 -0
  197. package/lib/components/Loader/Loader.stories.js +94 -0
  198. package/lib/components/LogoCloud/LogoCloud.d.ts +15 -0
  199. package/lib/components/LogoCloud/LogoCloud.js +43 -0
  200. package/lib/components/LogoCloud/LogoCloud.stories.js +28 -0
  201. package/lib/components/Markdown/Markdown.d.ts +8 -0
  202. package/lib/components/Markdown/Markdown.js +64 -0
  203. package/lib/components/Markdown/Markdown.stories.js +34 -0
  204. package/lib/components/MediaLightbox/MediaLightbox.d.ts +22 -0
  205. package/lib/components/MediaLightbox/MediaLightbox.js +80 -0
  206. package/lib/components/MediaObject/MediaObject.d.ts +8 -0
  207. package/lib/components/MediaObject/MediaObject.js +37 -0
  208. package/lib/components/MediaObject/MediaObject.stories.js +28 -0
  209. package/lib/components/Navbar/Navbar.d.ts +43 -0
  210. package/lib/components/Navbar/Navbar.js +213 -0
  211. package/lib/components/Navbar/Navbar.stories.js +235 -0
  212. package/lib/components/NotFound/NotFound.d.ts +34 -0
  213. package/lib/components/NotFound/NotFound.js +351 -0
  214. package/lib/components/NotFound/NotFound.stories.js +80 -0
  215. package/lib/components/Notify/Notify.d.ts +18 -0
  216. package/lib/components/Notify/Notify.js +178 -0
  217. package/lib/components/Notify/Notify.stories.js +148 -0
  218. package/lib/components/Notify/NotifyExample.d.ts +1 -0
  219. package/lib/components/Notify/NotifyExample.js +174 -0
  220. package/lib/components/Notify/README.md +103 -0
  221. package/lib/components/Pagination/Pagination.d.ts +18 -0
  222. package/lib/components/Pagination/Pagination.js +225 -0
  223. package/lib/components/Pagination/Pagination.stories.js +69 -0
  224. package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.d.ts +12 -0
  225. package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.js +88 -0
  226. package/lib/components/PasswordStrengthMeter/PasswordStrengthMeter.stories.js +16 -0
  227. package/lib/components/PaymentMethodPanel/PaymentMethodPanel.d.ts +18 -0
  228. package/lib/components/PaymentMethodPanel/PaymentMethodPanel.js +113 -0
  229. package/lib/components/PaymentMethodPanel/PaymentMethodPanel.stories.js +88 -0
  230. package/lib/components/Pricing/Pricing.d.ts +78 -0
  231. package/lib/components/Pricing/Pricing.js +764 -0
  232. package/lib/components/Pricing/Pricing.stories.js +146 -0
  233. package/lib/components/ProductGrid/ProductGrid.d.ts +23 -0
  234. package/lib/components/ProductGrid/ProductGrid.js +79 -0
  235. package/lib/components/ProductGrid/ProductGrid.stories.js +50 -0
  236. package/lib/components/ProgressSteps/ProgressSteps.d.ts +13 -0
  237. package/lib/components/ProgressSteps/ProgressSteps.js +51 -0
  238. package/lib/components/ProgressSteps/ProgressSteps.stories.js +35 -0
  239. package/lib/components/RadioField/RadioField.d.ts +16 -0
  240. package/lib/components/RadioField/RadioField.js +63 -0
  241. package/lib/components/RadioField/RadioField.stories.js +140 -0
  242. package/lib/components/ReviewList/ReviewList.d.ts +15 -0
  243. package/lib/components/ReviewList/ReviewList.js +51 -0
  244. package/lib/components/ReviewList/ReviewList.stories.js +29 -0
  245. package/lib/components/SectionHeader/SectionHeader.d.ts +9 -0
  246. package/lib/components/SectionHeader/SectionHeader.js +36 -0
  247. package/lib/components/SectionHeader/SectionHeader.stories.js +35 -0
  248. package/lib/components/SelectField/SelectField.d.ts +18 -0
  249. package/lib/components/SelectField/SelectField.js +145 -0
  250. package/lib/components/SelectField/SelectField.stories.js +155 -0
  251. package/lib/components/SelectField/SelectOption.d.ts +13 -0
  252. package/lib/components/SelectField/SelectOption.js +40 -0
  253. package/lib/components/SelectField/SelectOption.stories.js +40 -0
  254. package/lib/components/Separator/Separator.d.ts +6 -0
  255. package/lib/components/Separator/Separator.js +13 -0
  256. package/lib/components/Separator/Separator.stories.js +70 -0
  257. package/lib/components/Skeleton/Skeleton.d.ts +2 -0
  258. package/lib/components/Skeleton/Skeleton.js +9 -0
  259. package/lib/components/Skeleton/Skeleton.stories.js +24 -0
  260. package/lib/components/Svg/Svg.d.ts +9 -0
  261. package/lib/components/Svg/Svg.js +25 -0
  262. package/lib/components/Svg/Svg.stories.js +34 -0
  263. package/lib/components/Switch/Switch.d.ts +12 -0
  264. package/lib/components/Switch/Switch.js +54 -0
  265. package/lib/components/Switch/Switch.stories.js +61 -0
  266. package/lib/components/Table/Table.d.ts +18 -0
  267. package/lib/components/Table/Table.js +99 -0
  268. package/lib/components/Table/Table.stories.js +79 -0
  269. package/lib/components/Tabs/Tabs.d.ts +17 -0
  270. package/lib/components/Tabs/Tabs.js +85 -0
  271. package/lib/components/Tabs/Tabs.stories.js +45 -0
  272. package/lib/components/Text/Text.d.ts +5 -0
  273. package/lib/components/Text/Text.js +24 -0
  274. package/lib/components/Text/Text.stories.js +35 -0
  275. package/lib/components/TextField/TextField.d.ts +31 -0
  276. package/lib/components/TextField/TextField.js +91 -0
  277. package/lib/components/TextField/TextField.stories.js +158 -0
  278. package/lib/components/Textarea/Textarea.d.ts +5 -0
  279. package/lib/components/Textarea/Textarea.js +10 -0
  280. package/lib/components/Textarea/Textarea.stories.js +32 -0
  281. package/lib/components/index.d.ts +60 -0
  282. package/lib/components/index.js +62 -0
  283. package/lib/config/appConfig.d.ts +5 -0
  284. package/lib/config/appConfig.js +20 -0
  285. package/lib/constants/AuthConstants.d.ts +8 -0
  286. package/lib/constants/AuthConstants.js +9 -0
  287. package/lib/constants/GothamConstants.d.ts +24 -0
  288. package/lib/constants/GothamConstants.js +25 -0
  289. package/lib/constants/MarkdownConstants.d.ts +8 -0
  290. package/lib/constants/MarkdownConstants.js +9 -0
  291. package/lib/constants/MessageConstants.d.ts +10 -0
  292. package/lib/constants/MessageConstants.js +11 -0
  293. package/lib/docs/analytics.md +231 -0
  294. package/lib/docs/api-reference.md +364 -0
  295. package/lib/docs/comparison.md +83 -0
  296. package/lib/docs/containers.md +11 -0
  297. package/lib/docs/gettingStarted.md +338 -0
  298. package/lib/docs/payments.md +79 -0
  299. package/lib/editor/CodeEditor.d.ts +11 -0
  300. package/lib/editor/CodeEditor.js +15 -0
  301. package/lib/editor/CodeEditor.stories.js +24 -0
  302. package/lib/editor/index.d.ts +1 -0
  303. package/lib/editor/index.js +3 -0
  304. package/lib/errors/UserError.d.ts +8 -0
  305. package/lib/errors/UserError.js +12 -0
  306. package/lib/examples/OptimizedFormExample.d.ts +1 -0
  307. package/lib/examples/OptimizedFormExample.js +130 -0
  308. package/lib/form/index.d.ts +11 -0
  309. package/lib/form/index.js +13 -0
  310. package/lib/hooks/useIsMobile.d.ts +1 -0
  311. package/lib/hooks/useIsMobile.js +12 -0
  312. package/lib/i18n/index.d.ts +8 -0
  313. package/lib/i18n/index.js +7 -0
  314. package/lib/icons/Dual Ring-1s-100px.svg +1 -0
  315. package/lib/icons/gotham-logo.svg +17 -0
  316. package/lib/icons/gotham.svg +8 -0
  317. package/lib/icons/index.d.ts +5 -0
  318. package/lib/icons/index.js +6 -0
  319. package/lib/icons/pencil.svg +6 -0
  320. package/lib/img/arkhamjs-logo.png +0 -0
  321. package/lib/img/logo.png +0 -0
  322. package/lib/index.d.ts +25 -0
  323. package/lib/index.js +25 -0
  324. package/lib/router/index.d.ts +5 -0
  325. package/lib/router/index.js +6 -0
  326. package/lib/stores/GothamAppStore.d.ts +35 -0
  327. package/lib/stores/GothamAppStore.js +70 -0
  328. package/lib/stories/Button.d.ts +28 -0
  329. package/lib/stories/Button.js +22 -0
  330. package/lib/stories/Header.d.ts +12 -0
  331. package/lib/stories/Header.js +78 -0
  332. package/lib/stories/Page.d.ts +3 -0
  333. package/lib/stories/Page.js +108 -0
  334. package/lib/stories/assets/accessibility.png +0 -0
  335. package/lib/stories/assets/accessibility.svg +5 -0
  336. package/lib/stories/assets/addon-library.png +0 -0
  337. package/lib/stories/assets/assets.png +0 -0
  338. package/lib/stories/assets/context.png +0 -0
  339. package/lib/stories/assets/discord.svg +15 -0
  340. package/lib/stories/assets/docs.png +0 -0
  341. package/lib/stories/assets/figma-plugin.png +0 -0
  342. package/lib/stories/assets/github.svg +3 -0
  343. package/lib/stories/assets/share.png +0 -0
  344. package/lib/stories/assets/styling.png +0 -0
  345. package/lib/stories/assets/testing.png +0 -0
  346. package/lib/stories/assets/theming.png +0 -0
  347. package/lib/stories/assets/tutorials.svg +12 -0
  348. package/lib/stories/assets/youtube.svg +4 -0
  349. package/lib/stories/button.css +1 -0
  350. package/lib/stories/header.css +1 -0
  351. package/lib/stories/page.css +1 -0
  352. package/lib/styles/chat.css +1 -0
  353. package/lib/styles/index.css +2 -0
  354. package/lib/styles/tailwind.css +1 -0
  355. package/lib/types/assets.d.js +2 -0
  356. package/lib/types/gotham.d.ts +12 -0
  357. package/lib/types/gotham.js +3 -0
  358. package/lib/types/vitest-globals.d.js +3 -0
  359. package/lib/utils/GothamContext.d.ts +14 -0
  360. package/lib/utils/GothamContext.js +14 -0
  361. package/lib/utils/awsRum.d.ts +23 -0
  362. package/lib/utils/awsRum.js +50 -0
  363. package/lib/utils/colorUtils.d.ts +20 -0
  364. package/lib/utils/colorUtils.js +499 -0
  365. package/lib/utils/contentUtils.d.ts +2 -0
  366. package/lib/utils/contentUtils.js +18 -0
  367. package/lib/utils/i18nUtil.d.ts +1 -0
  368. package/lib/utils/i18nUtil.js +7 -0
  369. package/lib/utils/imageUtils.d.ts +5 -0
  370. package/lib/utils/imageUtils.js +48 -0
  371. package/lib/utils/interactionAnalytics.d.ts +10 -0
  372. package/lib/utils/interactionAnalytics.js +142 -0
  373. package/lib/utils/navEventQueue.d.ts +6 -0
  374. package/lib/utils/navEventQueue.js +50 -0
  375. package/lib/utils/refUtils.d.ts +2 -0
  376. package/lib/utils/refUtils.js +11 -0
  377. package/lib/utils/routeUtils.d.ts +12 -0
  378. package/lib/utils/routeUtils.js +109 -0
  379. package/lib/utils/sizeUtils.d.ts +5 -0
  380. package/lib/utils/sizeUtils.js +6 -0
  381. package/lib/utils/storyInteractions.d.ts +6 -0
  382. package/lib/utils/storyInteractions.js +45 -0
  383. package/lib/utils/storyUtils.d.ts +1 -0
  384. package/lib/utils/storyUtils.js +11 -0
  385. package/lib/utils/testUtils.d.ts +3 -0
  386. package/lib/utils/testUtils.js +56 -0
  387. package/lib/utils/timer.d.ts +21 -0
  388. package/lib/utils/timer.js +38 -0
  389. package/lib/utils/useBreakpoint.d.ts +6 -0
  390. package/lib/utils/useBreakpoint.js +56 -0
  391. package/lib/utils/viewPerformance.d.ts +34 -0
  392. package/lib/utils/viewPerformance.js +103 -0
  393. package/lib/utils/viewUtils.d.ts +9 -0
  394. package/lib/utils/viewUtils.js +44 -0
  395. package/lib/views/AuthSignInView/AuthSignInView.d.ts +20 -0
  396. package/lib/views/AuthSignInView/AuthSignInView.js +107 -0
  397. package/lib/views/AuthSignInView/AuthSignInView.stories.js +29 -0
  398. package/lib/views/AuthSignUpView/AuthSignUpView.d.ts +21 -0
  399. package/lib/views/AuthSignUpView/AuthSignUpView.js +146 -0
  400. package/lib/views/AuthSignUpView/AuthSignUpView.stories.js +30 -0
  401. package/lib/views/AuthView/AuthView.d.ts +16 -0
  402. package/lib/views/AuthView/AuthView.js +60 -0
  403. package/lib/views/AuthView/AuthView.stories.js +34 -0
  404. package/lib/views/DefaultView/DefaultView.d.ts +5 -0
  405. package/lib/views/DefaultView/DefaultView.js +134 -0
  406. package/lib/views/Gotham/Gotham.d.ts +44 -0
  407. package/lib/views/Gotham/Gotham.js +24 -0
  408. package/lib/views/Gotham/Gotham.stories.js +31 -0
  409. package/lib/views/Gotham/GothamListeners.d.ts +0 -0
  410. package/lib/views/Gotham/GothamListeners.js +2 -0
  411. package/lib/views/Gotham/GothamProvider.d.ts +43 -0
  412. package/lib/views/Gotham/GothamProvider.js +217 -0
  413. package/lib/views/Gotham/GothamRoot.d.ts +6 -0
  414. package/lib/views/Gotham/GothamRoot.js +69 -0
  415. package/lib/views/HomeView/HomeView.d.ts +10 -0
  416. package/lib/views/HomeView/HomeView.js +134 -0
  417. package/lib/views/LoaderView/LoaderView.d.ts +8 -0
  418. package/lib/views/LoaderView/LoaderView.js +30 -0
  419. package/lib/views/MenuView/MenuView.d.ts +13 -0
  420. package/lib/views/MenuView/MenuView.js +305 -0
  421. package/lib/views/NotFoundView/NotFoundView.d.ts +2 -0
  422. package/lib/views/NotFoundView/NotFoundView.js +12 -0
  423. package/lib/views/index.d.ts +11 -0
  424. package/lib/views/index.js +13 -0
  425. package/package.json +202 -0
  426. package/styles/tailwind.css +1 -0
@@ -0,0 +1,764 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { cn } from '@nlabs/utils';
3
+ import { memo, useMemo, useState } from 'react';
4
+ import { Check, Minus, Plus, X } from '../../icons/index.js';
5
+ const toneClasses = {
6
+ dark: 'bg-gray-950 text-white',
7
+ default: 'bg-white text-gray-900 dark:bg-gray-900 dark:text-white',
8
+ gradient: 'bg-white dark:bg-gray-900'
9
+ };
10
+ const headerToneClasses = {
11
+ dark: {
12
+ description: 'text-gray-300',
13
+ eyebrow: 'text-primary-dark-300',
14
+ title: 'text-white'
15
+ },
16
+ default: {
17
+ description: 'text-gray-600 dark:text-gray-400',
18
+ eyebrow: 'text-primary dark:text-primary-dark-300',
19
+ title: 'text-gray-900 dark:text-white'
20
+ },
21
+ gradient: {
22
+ description: 'text-gray-600 dark:text-gray-400',
23
+ eyebrow: 'text-primary dark:text-primary-dark-300',
24
+ title: 'text-gray-900 dark:text-white'
25
+ }
26
+ };
27
+ const frequencyShellClasses = {
28
+ dark: 'bg-white/5 ring-1 ring-white/10',
29
+ default: 'ring-1 ring-border bg-background',
30
+ gradient: 'ring-1 ring-border bg-background'
31
+ };
32
+ const frequencyItemClasses = {
33
+ dark: 'has-checked:bg-primary-dark text-gray-300 has-checked:text-white',
34
+ default: 'has-checked:bg-primary text-gray-500 has-checked:text-white dark:text-gray-400 dark:has-checked:bg-primary-dark',
35
+ gradient: 'has-checked:bg-primary text-gray-500 has-checked:text-white dark:text-gray-400 dark:has-checked:bg-primary-dark'
36
+ };
37
+ const cardToneClasses = {
38
+ dark: {
39
+ contrast: {
40
+ body: 'bg-white/5 ring-1 ring-white/10',
41
+ cta: 'bg-white/10 text-white ring-1 ring-white/10 hover:bg-white/20',
42
+ featuredBody: 'bg-white text-gray-900 shadow-2xl ring-1 ring-black/5 dark:bg-gray-800 dark:text-white dark:ring-white/10 dark:shadow-none',
43
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
44
+ muted: 'text-gray-300',
45
+ title: 'text-white'
46
+ },
47
+ default: {
48
+ body: 'bg-white/5 ring-1 ring-white/10',
49
+ cta: 'bg-white/10 text-white ring-1 ring-white/10 hover:bg-white/20',
50
+ featuredBody: 'bg-gray-900 ring-1 ring-gray-900 shadow-2xl dark:bg-gray-800 dark:ring-white/10 dark:shadow-none',
51
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
52
+ muted: 'text-gray-300',
53
+ title: 'text-white'
54
+ },
55
+ solid: {
56
+ body: 'bg-gray-900 ring-1 ring-white/10',
57
+ cta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
58
+ featuredBody: 'bg-primary-dark ring-2 ring-primary-dark-300 shadow-2xl',
59
+ featuredCta: 'bg-white text-gray-900 hover:bg-gray-100',
60
+ muted: 'text-gray-300',
61
+ title: 'text-white'
62
+ }
63
+ },
64
+ default: {
65
+ contrast: {
66
+ body: 'bg-white/70 ring-1 ring-black/10 dark:bg-white/5 dark:ring-white/10',
67
+ cta: 'bg-white text-primary ring-1 ring-primary/20 hover:ring-primary/40 dark:bg-white/10 dark:text-white dark:ring-white/10 dark:hover:bg-white/20',
68
+ featuredBody: 'bg-gray-900 text-white shadow-2xl ring-1 ring-gray-900/10 dark:bg-gray-800 dark:ring-white/10 dark:shadow-none',
69
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
70
+ muted: 'text-gray-600 dark:text-gray-300',
71
+ title: 'text-gray-900 dark:text-white'
72
+ },
73
+ default: {
74
+ body: 'bg-white ring-1 ring-border dark:bg-gray-800/50 dark:ring-white/10',
75
+ cta: 'bg-white text-primary ring-1 ring-primary/20 hover:ring-primary/40 dark:bg-white/10 dark:text-white dark:ring-white/10 dark:hover:bg-white/20',
76
+ featuredBody: 'bg-white ring-2 ring-primary shadow-xl dark:bg-gray-800/50 dark:ring-primary-dark-300 dark:shadow-none',
77
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
78
+ muted: 'text-gray-600 dark:text-gray-300',
79
+ title: 'text-gray-900 dark:text-white'
80
+ },
81
+ solid: {
82
+ body: 'bg-white ring-1 ring-border shadow-lg dark:bg-gray-800/50 dark:ring-white/10 dark:shadow-none',
83
+ cta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
84
+ featuredBody: 'bg-white ring-2 ring-primary shadow-2xl dark:bg-gray-800 dark:ring-primary-dark-300 dark:shadow-none',
85
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
86
+ muted: 'text-gray-600 dark:text-gray-300',
87
+ title: 'text-gray-900 dark:text-white'
88
+ }
89
+ },
90
+ gradient: {
91
+ contrast: {
92
+ body: 'bg-white/75 ring-1 ring-black/10 dark:bg-white/5 dark:ring-white/10',
93
+ cta: 'bg-white text-primary ring-1 ring-primary/20 hover:ring-primary/40 dark:bg-white/10 dark:text-white dark:ring-white/10 dark:hover:bg-white/20',
94
+ featuredBody: 'bg-gray-900 text-white shadow-2xl ring-1 ring-gray-900/10 dark:bg-gray-800 dark:ring-white/10 dark:shadow-none',
95
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
96
+ muted: 'text-gray-600 dark:text-gray-300',
97
+ title: 'text-gray-900 dark:text-white'
98
+ },
99
+ default: {
100
+ body: 'bg-white ring-1 ring-border dark:bg-gray-800/50 dark:ring-white/10',
101
+ cta: 'bg-white text-primary ring-1 ring-primary/20 hover:ring-primary/40 dark:bg-white/10 dark:text-white dark:ring-white/10 dark:hover:bg-white/20',
102
+ featuredBody: 'bg-white shadow-xl ring-2 ring-primary dark:bg-gray-800/50 dark:ring-primary-dark-300 dark:shadow-none',
103
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
104
+ muted: 'text-gray-600 dark:text-gray-300',
105
+ title: 'text-gray-900 dark:text-white'
106
+ },
107
+ solid: {
108
+ body: 'bg-white ring-1 ring-border shadow-lg dark:bg-gray-800/50 dark:ring-white/10 dark:shadow-none',
109
+ cta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
110
+ featuredBody: 'bg-white shadow-2xl ring-2 ring-primary dark:bg-gray-800 dark:ring-primary-dark-300 dark:shadow-none',
111
+ featuredCta: 'bg-primary text-white hover:bg-primary-700 dark:bg-primary-dark dark:hover:bg-primary-dark-300',
112
+ muted: 'text-gray-600 dark:text-gray-300',
113
+ title: 'text-gray-900 dark:text-white'
114
+ }
115
+ }
116
+ };
117
+ const featuredTextClasses = (tone, cardStyle)=>{
118
+ const lightFeaturedCard = tone === 'dark' && cardStyle === 'contrast' || (tone === 'default' || tone === 'gradient') && (cardStyle === 'default' || cardStyle === 'solid');
119
+ return lightFeaturedCard ? {
120
+ badge: 'bg-primary/10 text-primary dark:bg-primary-dark-300/10 dark:text-primary-dark-300',
121
+ icon: 'text-primary dark:text-primary-dark-300',
122
+ muted: 'text-gray-600 dark:text-gray-300',
123
+ title: 'text-gray-900 dark:text-white'
124
+ } : {
125
+ badge: 'bg-white/10 text-white dark:bg-primary-dark-300/15 dark:text-primary-dark-300',
126
+ icon: 'text-primary-dark-300',
127
+ muted: 'text-gray-300 dark:text-gray-300',
128
+ title: 'text-white dark:text-white'
129
+ };
130
+ };
131
+ const comparisonPanelToneClasses = {
132
+ dark: 'bg-gray-900/60 border-white/10',
133
+ default: 'bg-white border-border dark:bg-gray-800/50 dark:border-white/10',
134
+ gradient: 'bg-white border-border dark:bg-gray-800/50 dark:border-white/10'
135
+ };
136
+ const comparisonGridClasses = {
137
+ 1: 'lg:grid-cols-1',
138
+ 2: 'lg:grid-cols-2',
139
+ 3: 'lg:grid-cols-3',
140
+ 4: 'md:grid-cols-2 xl:grid-cols-4'
141
+ };
142
+ const comparisonColClasses = {
143
+ 1: 'w-full',
144
+ 2: 'w-1/2',
145
+ 3: 'w-1/3',
146
+ 4: 'w-1/4'
147
+ };
148
+ const gradientDecoration = /*#__PURE__*/ _jsx("div", {
149
+ "aria-hidden": "true",
150
+ className: "pointer-events-none absolute inset-x-0 top-0 -z-10 overflow-hidden blur-3xl",
151
+ children: /*#__PURE__*/ _jsx("div", {
152
+ className: "mx-auto aspect-[1155/678] w-[72rem] bg-linear-to-tr from-primary/25 via-secondary/20 to-primary-dark/25 opacity-70 dark:opacity-40",
153
+ style: {
154
+ clipPath: 'polygon(74.1% 44.1%,100% 61.6%,97.5% 26.9%,85.5% 0.1%,80.7% 2%,72.5% 32.5%,60.2% 62.4%,52.4% 68.1%,47.5% 58.3%,45.2% 34.5%,27.5% 76.7%,0.1% 64.9%,17.9% 100%,27.6% 76.8%,76.1% 97.7%,74.1% 44.1%)'
155
+ }
156
+ })
157
+ });
158
+ const getDefaultFrequency = (frequencies, tiers, defaultFrequency)=>{
159
+ if (defaultFrequency) {
160
+ return defaultFrequency;
161
+ }
162
+ if (frequencies?.[0]?.value) {
163
+ return frequencies[0].value;
164
+ }
165
+ const firstPrice = tiers?.find((tier)=>typeof tier.price !== 'string' && Object.keys(tier.price).length > 0)?.price;
166
+ if (firstPrice && typeof firstPrice !== 'string') {
167
+ return Object.keys(firstPrice)[0] ?? 'monthly';
168
+ }
169
+ return 'monthly';
170
+ };
171
+ const getPriceForTier = (tier, activeFrequency)=>{
172
+ if (typeof tier.price === 'string') {
173
+ return tier.price;
174
+ }
175
+ return tier.price[activeFrequency] ?? Object.values(tier.price)[0] ?? '';
176
+ };
177
+ const getPriceSuffixForTier = (tier, frequencies, activeFrequency)=>{
178
+ if (typeof tier.price === 'string' && typeof tier.priceSuffix === 'string') {
179
+ return tier.priceSuffix;
180
+ }
181
+ if (tier.priceSuffix && typeof tier.priceSuffix !== 'string') {
182
+ return tier.priceSuffix[activeFrequency] ?? Object.values(tier.priceSuffix)[0] ?? '';
183
+ }
184
+ return frequencies?.find((frequency)=>frequency.value === activeFrequency)?.priceSuffix ?? '';
185
+ };
186
+ const renderTierList = (tier, featured, featuredText)=>{
187
+ if (tier.highlights?.length) {
188
+ return /*#__PURE__*/ _jsx("ul", {
189
+ className: "mt-8 space-y-3 text-sm/6",
190
+ role: "list",
191
+ children: tier.highlights.map((highlight)=>/*#__PURE__*/ _jsxs("li", {
192
+ className: cn('group flex items-start gap-3', highlight.disabled ? 'text-gray-400 dark:text-gray-500' : featured ? featuredText.muted : 'text-gray-600 dark:text-gray-300'),
193
+ children: [
194
+ /*#__PURE__*/ _jsx("span", {
195
+ className: "inline-flex h-6 items-center",
196
+ children: highlight.disabled ? /*#__PURE__*/ _jsx(Minus, {
197
+ "aria-hidden": "true",
198
+ className: "size-4 text-gray-400 dark:text-gray-500"
199
+ }) : /*#__PURE__*/ _jsx(Plus, {
200
+ "aria-hidden": "true",
201
+ className: cn('size-4', featured ? featuredText.icon : 'text-primary dark:text-primary-dark-300')
202
+ })
203
+ }),
204
+ highlight.description
205
+ ]
206
+ }, highlight.description))
207
+ });
208
+ }
209
+ if (!tier.features?.length) {
210
+ return null;
211
+ }
212
+ return /*#__PURE__*/ _jsx("ul", {
213
+ className: "mt-8 space-y-3 text-sm/6",
214
+ role: "list",
215
+ children: tier.features.map((feature)=>/*#__PURE__*/ _jsxs("li", {
216
+ className: cn('flex gap-3', featured ? featuredText.muted : 'text-gray-600 dark:text-gray-300'),
217
+ children: [
218
+ /*#__PURE__*/ _jsx(Check, {
219
+ "aria-hidden": "true",
220
+ className: cn('mt-0.5 size-4 shrink-0', featured ? featuredText.icon : 'text-primary dark:text-primary-dark-300')
221
+ }),
222
+ /*#__PURE__*/ _jsx("span", {
223
+ children: feature
224
+ })
225
+ ]
226
+ }, feature))
227
+ });
228
+ };
229
+ const PricingHeader = ({ description, eyebrow, title, tone })=>{
230
+ if (!eyebrow && !title && !description) {
231
+ return null;
232
+ }
233
+ return /*#__PURE__*/ _jsxs("div", {
234
+ className: "mx-auto max-w-4xl text-center",
235
+ children: [
236
+ eyebrow ? /*#__PURE__*/ _jsx("h2", {
237
+ className: cn('text-base/7 font-semibold', headerToneClasses[tone ?? 'default'].eyebrow),
238
+ children: eyebrow
239
+ }) : null,
240
+ title ? /*#__PURE__*/ _jsx("p", {
241
+ className: cn('mt-2 text-5xl font-semibold tracking-tight text-balance sm:text-6xl', headerToneClasses[tone ?? 'default'].title),
242
+ children: title
243
+ }) : null,
244
+ description ? /*#__PURE__*/ _jsx("p", {
245
+ className: cn('mx-auto mt-6 max-w-2xl text-center text-lg font-medium text-pretty sm:text-xl/8', headerToneClasses[tone ?? 'default'].description),
246
+ children: description
247
+ }) : null
248
+ ]
249
+ });
250
+ };
251
+ const FrequencyToggle = ({ activeFrequency, frequencies, onChange, tone })=>/*#__PURE__*/ _jsx("div", {
252
+ className: "mt-16 flex justify-center",
253
+ children: /*#__PURE__*/ _jsx("fieldset", {
254
+ "aria-label": "Payment frequency",
255
+ children: /*#__PURE__*/ _jsx("div", {
256
+ className: cn('grid grid-cols-2 gap-x-1 rounded-full p-1 text-center text-xs/5 font-semibold', frequencyShellClasses[tone]),
257
+ children: frequencies.map((frequency)=>{
258
+ const checked = activeFrequency === frequency.value;
259
+ return /*#__PURE__*/ _jsxs("label", {
260
+ className: cn('relative rounded-full px-2.5 py-1 transition-colors', frequencyItemClasses[tone], checked && 'text-white'),
261
+ children: [
262
+ /*#__PURE__*/ _jsx("input", {
263
+ checked: checked,
264
+ className: "sr-only",
265
+ name: "pricing-frequency",
266
+ onChange: ()=>onChange(frequency.value),
267
+ type: "radio",
268
+ value: frequency.value
269
+ }),
270
+ /*#__PURE__*/ _jsx("span", {
271
+ children: frequency.label
272
+ })
273
+ ]
274
+ }, frequency.value);
275
+ })
276
+ })
277
+ })
278
+ });
279
+ const GridPricing = ({ activeFrequency, cardStyle, extraOffer, frequencies, tone, tiers })=>{
280
+ const gridColsClass = tiers.length >= 4 ? 'md:grid-cols-2 xl:grid-cols-4' : tiers.length === 3 ? 'lg:grid-cols-3' : tiers.length === 2 ? 'lg:grid-cols-2 lg:max-w-4xl' : 'max-w-2xl';
281
+ const cardTokens = cardToneClasses[tone][cardStyle];
282
+ return /*#__PURE__*/ _jsx("div", {
283
+ className: "mt-10",
284
+ children: /*#__PURE__*/ _jsxs("div", {
285
+ className: cn('mx-auto grid max-w-md grid-cols-1 gap-8', gridColsClass),
286
+ children: [
287
+ tiers.map((tier)=>{
288
+ const featured = Boolean(tier.featured);
289
+ const featuredText = featuredTextClasses(tone, cardStyle);
290
+ const price = getPriceForTier(tier, activeFrequency);
291
+ const suffix = getPriceSuffixForTier(tier, frequencies, activeFrequency);
292
+ return /*#__PURE__*/ _jsxs("div", {
293
+ className: cn('flex flex-col justify-between rounded-3xl p-8 xl:p-10', featured ? cardTokens.featuredBody : cardTokens.body),
294
+ "data-featured": featured ? 'true' : undefined,
295
+ children: [
296
+ /*#__PURE__*/ _jsxs("div", {
297
+ children: [
298
+ /*#__PURE__*/ _jsxs("div", {
299
+ className: "flex items-center justify-between gap-4",
300
+ children: [
301
+ /*#__PURE__*/ _jsx("h3", {
302
+ className: cn('text-lg/8 font-semibold', featured ? featuredText.title : cardTokens.title),
303
+ id: tier.id,
304
+ children: tier.name
305
+ }),
306
+ tier.badge ? /*#__PURE__*/ _jsx("span", {
307
+ className: cn('rounded-full px-2.5 py-1 text-xs/5 font-semibold', featured ? featuredText.badge : 'bg-primary/10 text-primary dark:bg-primary-dark-300/10 dark:text-primary-dark-300'),
308
+ children: tier.badge
309
+ }) : null
310
+ ]
311
+ }),
312
+ tier.description ? /*#__PURE__*/ _jsx("p", {
313
+ className: cn('mt-4 text-sm/6', featured ? featuredText.muted : cardTokens.muted),
314
+ children: tier.description
315
+ }) : null,
316
+ /*#__PURE__*/ _jsxs("p", {
317
+ className: "mt-6 flex items-baseline gap-x-2",
318
+ children: [
319
+ /*#__PURE__*/ _jsx("span", {
320
+ className: cn('text-4xl font-semibold tracking-tight', featured ? featuredText.title : cardTokens.title),
321
+ children: price
322
+ }),
323
+ suffix ? /*#__PURE__*/ _jsx("span", {
324
+ className: cn('text-sm/6 font-semibold', featured ? featuredText.muted : cardTokens.muted),
325
+ children: suffix
326
+ }) : null
327
+ ]
328
+ }),
329
+ tier.priceCaption ? /*#__PURE__*/ _jsx("p", {
330
+ className: cn('mt-3 text-sm/6', featured ? featuredText.muted : cardTokens.muted),
331
+ children: tier.priceCaption
332
+ }) : null,
333
+ renderTierList(tier, featured, featuredText)
334
+ ]
335
+ }),
336
+ tier.href && tier.ctaLabel ? /*#__PURE__*/ _jsx("a", {
337
+ "aria-describedby": tier.id,
338
+ className: cn('mt-8 block rounded-md px-3.5 py-2.5 text-center text-sm/6 font-semibold focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:focus-visible:outline-primary-dark-300', featured ? cardTokens.featuredCta : cardTokens.cta),
339
+ href: tier.href,
340
+ children: tier.ctaLabel
341
+ }) : null,
342
+ tier.ctaSubtitle ? /*#__PURE__*/ _jsx("p", {
343
+ className: cn('mt-3 text-center text-xs/5', featured ? featuredText.muted : cardTokens.muted),
344
+ children: tier.ctaSubtitle
345
+ }) : null
346
+ ]
347
+ }, tier.id);
348
+ }),
349
+ extraOffer ? /*#__PURE__*/ _jsxs("div", {
350
+ className: cn('flex flex-col items-start gap-6 rounded-3xl p-8 ring-1 sm:p-10', tiers.length > 1 ? 'lg:col-span-full lg:flex-row lg:items-center' : '', tone === 'dark' ? 'bg-white/5 ring-white/10' : 'bg-transparent ring-border dark:bg-white/5 dark:ring-white/10'),
351
+ children: [
352
+ /*#__PURE__*/ _jsxs("div", {
353
+ className: "min-w-0 flex-1",
354
+ children: [
355
+ /*#__PURE__*/ _jsx("h3", {
356
+ className: "text-base/7 font-semibold text-primary dark:text-primary-dark-300",
357
+ children: extraOffer.title
358
+ }),
359
+ extraOffer.description ? /*#__PURE__*/ _jsx("p", {
360
+ className: cn('mt-1 text-base/7', tone === 'dark' ? 'text-gray-300' : 'text-gray-600 dark:text-gray-300'),
361
+ children: extraOffer.description
362
+ }) : null
363
+ ]
364
+ }),
365
+ /*#__PURE__*/ _jsx("a", {
366
+ className: cn('rounded-md px-3.5 py-2 text-sm/6 font-semibold', tone === 'dark' ? 'bg-white/10 text-white ring-1 ring-white/10 hover:bg-white/20' : 'bg-white text-primary ring-1 ring-primary/20 hover:ring-primary/40 dark:bg-white/10 dark:text-white dark:ring-white/10 dark:hover:bg-white/20'),
367
+ href: extraOffer.ctaHref,
368
+ children: extraOffer.ctaLabel
369
+ })
370
+ ]
371
+ }) : null
372
+ ]
373
+ })
374
+ });
375
+ };
376
+ const SinglePricing = ({ singleOffer, tone })=>/*#__PURE__*/ _jsxs("div", {
377
+ className: "mx-auto mt-16 max-w-5xl rounded-3xl ring-1 ring-border lg:flex dark:bg-gray-800/50 dark:ring-white/10",
378
+ children: [
379
+ /*#__PURE__*/ _jsxs("div", {
380
+ className: "p-8 sm:p-10 lg:flex-auto",
381
+ children: [
382
+ /*#__PURE__*/ _jsx("h3", {
383
+ className: "text-3xl font-semibold tracking-tight text-gray-900 dark:text-white",
384
+ children: singleOffer.title
385
+ }),
386
+ singleOffer.description ? /*#__PURE__*/ _jsx("p", {
387
+ className: "mt-6 text-base/7 text-gray-600 dark:text-gray-300",
388
+ children: singleOffer.description
389
+ }) : null,
390
+ singleOffer.features?.length ? /*#__PURE__*/ _jsxs(_Fragment, {
391
+ children: [
392
+ /*#__PURE__*/ _jsxs("div", {
393
+ className: "mt-10 flex items-center gap-x-4",
394
+ children: [
395
+ /*#__PURE__*/ _jsx("h4", {
396
+ className: "flex-none text-sm/6 font-semibold text-primary dark:text-primary-dark-300",
397
+ children: singleOffer.featureLabel ?? 'What\'s included'
398
+ }),
399
+ /*#__PURE__*/ _jsx("div", {
400
+ className: "h-px flex-auto bg-gray-100 dark:bg-white/10"
401
+ })
402
+ ]
403
+ }),
404
+ /*#__PURE__*/ _jsx("ul", {
405
+ className: "mt-8 grid grid-cols-1 gap-4 text-sm/6 text-gray-600 sm:grid-cols-2 sm:gap-6 dark:text-gray-300",
406
+ role: "list",
407
+ children: singleOffer.features.map((feature)=>/*#__PURE__*/ _jsxs("li", {
408
+ className: "flex gap-3",
409
+ children: [
410
+ /*#__PURE__*/ _jsx(Check, {
411
+ "aria-hidden": "true",
412
+ className: "mt-0.5 size-4 shrink-0 text-primary dark:text-primary-dark-300"
413
+ }),
414
+ /*#__PURE__*/ _jsx("span", {
415
+ children: feature
416
+ })
417
+ ]
418
+ }, feature))
419
+ })
420
+ ]
421
+ }) : null
422
+ ]
423
+ }),
424
+ /*#__PURE__*/ _jsx("div", {
425
+ className: "-mt-2 p-2 lg:mt-0 lg:w-full lg:max-w-md lg:shrink-0",
426
+ children: /*#__PURE__*/ _jsx("div", {
427
+ className: cn('rounded-2xl py-10 text-center ring-1 lg:flex lg:flex-col lg:justify-center lg:py-16', tone === 'dark' ? 'bg-gray-900 ring-white/10' : 'bg-gray-50 ring-gray-900/5 dark:bg-gray-900 dark:ring-white/10'),
428
+ children: /*#__PURE__*/ _jsxs("div", {
429
+ className: "mx-auto max-w-xs px-8",
430
+ children: [
431
+ singleOffer.priceLabel ? /*#__PURE__*/ _jsx("p", {
432
+ className: "text-base font-semibold text-gray-600 dark:text-gray-400",
433
+ children: singleOffer.priceLabel
434
+ }) : null,
435
+ /*#__PURE__*/ _jsxs("p", {
436
+ className: "mt-6 flex items-baseline justify-center gap-x-2",
437
+ children: [
438
+ /*#__PURE__*/ _jsx("span", {
439
+ className: "text-5xl font-semibold tracking-tight text-gray-900 dark:text-white",
440
+ children: singleOffer.price
441
+ }),
442
+ singleOffer.priceSuffix ? /*#__PURE__*/ _jsx("span", {
443
+ className: "text-sm/6 font-semibold tracking-wide text-gray-600 dark:text-gray-400",
444
+ children: singleOffer.priceSuffix
445
+ }) : null
446
+ ]
447
+ }),
448
+ /*#__PURE__*/ _jsx("a", {
449
+ className: "mt-10 block w-full rounded-md bg-primary px-3 py-2 text-center text-sm font-semibold text-white hover:bg-primary-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:bg-primary-dark dark:hover:bg-primary-dark-300",
450
+ href: singleOffer.ctaHref,
451
+ children: singleOffer.ctaLabel
452
+ }),
453
+ singleOffer.note ? /*#__PURE__*/ _jsx("p", {
454
+ className: "mt-6 text-xs/5 text-gray-600 dark:text-gray-400",
455
+ children: singleOffer.note
456
+ }) : null
457
+ ]
458
+ })
459
+ })
460
+ })
461
+ ]
462
+ });
463
+ const ComparisonValue = ({ value })=>{
464
+ if (typeof value === 'string') {
465
+ return /*#__PURE__*/ _jsx("span", {
466
+ className: "text-sm/6 text-gray-900 dark:text-white",
467
+ children: value
468
+ });
469
+ }
470
+ if (value === true) {
471
+ return /*#__PURE__*/ _jsx(Check, {
472
+ "aria-hidden": "true",
473
+ className: "inline-block size-4 text-green-600 dark:text-green-500"
474
+ });
475
+ }
476
+ return /*#__PURE__*/ _jsx(X, {
477
+ "aria-hidden": "true",
478
+ className: "inline-block size-4 text-gray-400 dark:text-gray-500"
479
+ });
480
+ };
481
+ const ComparisonPricing = ({ activeFrequency, cardStyle, comparisonSections, frequencies, logos, tone, tiers })=>{
482
+ const [activeMobileTierId, setActiveMobileTierId] = useState(tiers[0]?.id ?? '');
483
+ const activeMobileTier = tiers.find((tier)=>tier.id === activeMobileTierId) ?? tiers[0];
484
+ const cardTokens = cardToneClasses[tone][cardStyle];
485
+ return /*#__PURE__*/ _jsxs(_Fragment, {
486
+ children: [
487
+ /*#__PURE__*/ _jsxs("div", {
488
+ className: cn('relative mt-10', tone === 'gradient' && 'pt-6'),
489
+ children: [
490
+ tone === 'gradient' ? /*#__PURE__*/ _jsx("div", {
491
+ "aria-hidden": "true",
492
+ className: "absolute inset-x-0 top-16 bottom-0 bg-[radial-gradient(circle_at_center_center,theme(colors.primary/.35),theme(colors.primary-dark/.28),transparent_72%)] dark:bg-[radial-gradient(circle_at_center_center,theme(colors.primary-dark-300/.28),theme(colors.primary-dark/.22),transparent_72%)]"
493
+ }) : null,
494
+ /*#__PURE__*/ _jsxs("div", {
495
+ className: "relative mx-auto max-w-7xl",
496
+ children: [
497
+ /*#__PURE__*/ _jsx("div", {
498
+ className: cn('grid grid-cols-1 gap-8', comparisonGridClasses[Math.min(Math.max(tiers.length, 1), 4)]),
499
+ children: tiers.map((tier)=>{
500
+ const featured = Boolean(tier.featured);
501
+ const featuredText = featuredTextClasses(tone, cardStyle);
502
+ return /*#__PURE__*/ _jsx("div", {
503
+ className: cn('rounded-4xl p-2 shadow-[inset_0_0_0_1px_rgba(255,255,255,0.08)]', tone === 'dark' ? 'bg-white/5' : 'bg-white/5 dark:bg-white/5'),
504
+ children: /*#__PURE__*/ _jsxs("div", {
505
+ className: cn('rounded-3xl p-8', featured ? cardTokens.featuredBody : cardTokens.body),
506
+ children: [
507
+ /*#__PURE__*/ _jsx("h3", {
508
+ className: cn('text-sm font-semibold', featured ? 'text-white dark:text-white' : 'text-primary dark:text-primary-dark-300'),
509
+ children: tier.name
510
+ }),
511
+ tier.description ? /*#__PURE__*/ _jsx("p", {
512
+ className: cn('mt-2 text-sm/6', featured ? 'text-gray-300 dark:text-gray-300' : cardTokens.muted),
513
+ children: tier.description
514
+ }) : null,
515
+ /*#__PURE__*/ _jsxs("div", {
516
+ className: "mt-8 flex items-center gap-4",
517
+ children: [
518
+ /*#__PURE__*/ _jsx("div", {
519
+ className: cn('text-5xl font-semibold', featured ? 'text-white dark:text-white' : cardTokens.title),
520
+ children: getPriceForTier(tier, activeFrequency)
521
+ }),
522
+ getPriceSuffixForTier(tier, frequencies, activeFrequency) ? /*#__PURE__*/ _jsx("div", {
523
+ className: cn('text-sm', featured ? 'text-gray-300 dark:text-gray-300' : cardTokens.muted),
524
+ children: /*#__PURE__*/ _jsx("p", {
525
+ children: getPriceSuffixForTier(tier, frequencies, activeFrequency)
526
+ })
527
+ }) : null
528
+ ]
529
+ }),
530
+ tier.href && tier.ctaLabel ? /*#__PURE__*/ _jsx("a", {
531
+ "aria-label": `${tier.ctaLabel} on the ${tier.name} plan`,
532
+ className: cn('mt-8 inline-block rounded-md px-3.5 py-2 text-center text-sm/6 font-semibold', featured ? cardTokens.featuredCta : cardTokens.cta),
533
+ href: tier.href,
534
+ children: tier.ctaLabel
535
+ }) : null,
536
+ renderTierList(tier, featured, featuredText)
537
+ ]
538
+ })
539
+ }, tier.id);
540
+ })
541
+ }),
542
+ logos?.length ? /*#__PURE__*/ _jsx("div", {
543
+ className: "flex flex-wrap justify-center gap-x-8 gap-y-4 py-16 opacity-70 sm:py-24",
544
+ children: logos.map((logo)=>/*#__PURE__*/ _jsx("img", {
545
+ alt: logo.alt,
546
+ className: cn('h-8 object-contain lg:h-10', logo.className),
547
+ src: logo.src
548
+ }, `${logo.alt}-${logo.src}`))
549
+ }) : null
550
+ ]
551
+ })
552
+ ]
553
+ }),
554
+ comparisonSections?.length ? /*#__PURE__*/ _jsxs("div", {
555
+ className: "mx-auto mt-8 max-w-7xl",
556
+ children: [
557
+ /*#__PURE__*/ _jsx("div", {
558
+ className: "hidden lg:block",
559
+ children: /*#__PURE__*/ _jsxs("table", {
560
+ className: "w-full text-left",
561
+ children: [
562
+ /*#__PURE__*/ _jsx("caption", {
563
+ className: "sr-only",
564
+ children: "Pricing plan comparison"
565
+ }),
566
+ /*#__PURE__*/ _jsxs("colgroup", {
567
+ children: [
568
+ /*#__PURE__*/ _jsx("col", {
569
+ className: "w-2/5"
570
+ }),
571
+ tiers.map((tier)=>/*#__PURE__*/ _jsx("col", {
572
+ className: comparisonColClasses[Math.min(Math.max(tiers.length, 1), 4)]
573
+ }, tier.id))
574
+ ]
575
+ }),
576
+ /*#__PURE__*/ _jsxs("thead", {
577
+ children: [
578
+ /*#__PURE__*/ _jsxs("tr", {
579
+ children: [
580
+ /*#__PURE__*/ _jsx("td", {
581
+ className: "p-0"
582
+ }),
583
+ tiers.map((tier)=>/*#__PURE__*/ _jsx("th", {
584
+ className: "p-0",
585
+ scope: "col",
586
+ children: /*#__PURE__*/ _jsx("div", {
587
+ className: "text-sm font-semibold text-primary dark:text-primary-dark-300",
588
+ children: tier.name
589
+ })
590
+ }, tier.id))
591
+ ]
592
+ }),
593
+ /*#__PURE__*/ _jsxs("tr", {
594
+ children: [
595
+ /*#__PURE__*/ _jsx("th", {
596
+ className: "p-0"
597
+ }),
598
+ tiers.map((tier)=>/*#__PURE__*/ _jsx("td", {
599
+ className: "px-0 pt-3 pb-0",
600
+ children: tier.href && tier.ctaLabel ? /*#__PURE__*/ _jsx("a", {
601
+ className: cn('inline-block rounded-md px-2.5 py-1.5 text-sm font-semibold', tier.featured ? cardTokens.featuredCta : cardTokens.cta),
602
+ href: tier.href,
603
+ children: tier.ctaLabel
604
+ }) : null
605
+ }, tier.id))
606
+ ]
607
+ })
608
+ ]
609
+ }),
610
+ comparisonSections.map((section)=>/*#__PURE__*/ _jsxs("tbody", {
611
+ className: "group",
612
+ children: [
613
+ /*#__PURE__*/ _jsx("tr", {
614
+ children: /*#__PURE__*/ _jsx("th", {
615
+ className: "px-0 pt-10 pb-0 group-first-of-type:pt-5",
616
+ colSpan: tiers.length + 1,
617
+ scope: "colgroup",
618
+ children: /*#__PURE__*/ _jsx("div", {
619
+ className: "rounded-lg bg-gray-50 px-4 py-3 text-sm/6 font-semibold text-gray-950 dark:bg-gray-800/50 dark:text-white",
620
+ children: section.name
621
+ })
622
+ })
623
+ }),
624
+ section.features.map((feature)=>/*#__PURE__*/ _jsxs("tr", {
625
+ className: "border-b border-gray-100 last:border-none dark:border-white/10",
626
+ children: [
627
+ /*#__PURE__*/ _jsx("th", {
628
+ className: "px-0 py-4 text-sm/6 font-normal text-gray-600 dark:text-gray-300",
629
+ scope: "row",
630
+ children: feature.name
631
+ }),
632
+ tiers.map((tier)=>/*#__PURE__*/ _jsxs("td", {
633
+ className: "p-4 max-sm:text-center",
634
+ children: [
635
+ /*#__PURE__*/ _jsx(ComparisonValue, {
636
+ value: feature.tiers[tier.name]
637
+ }),
638
+ /*#__PURE__*/ _jsx("span", {
639
+ className: "sr-only",
640
+ children: typeof feature.tiers[tier.name] === 'string' ? `${feature.tiers[tier.name]} for ${tier.name}` : `${feature.tiers[tier.name] === true ? 'Included' : 'Not included'} in ${tier.name}`
641
+ })
642
+ ]
643
+ }, tier.id))
644
+ ]
645
+ }, feature.name))
646
+ ]
647
+ }, section.name))
648
+ ]
649
+ })
650
+ }),
651
+ /*#__PURE__*/ _jsxs("div", {
652
+ className: "lg:hidden",
653
+ children: [
654
+ /*#__PURE__*/ _jsx("div", {
655
+ className: "flex border-b border-gray-100 dark:border-white/10",
656
+ children: tiers.map((tier)=>/*#__PURE__*/ _jsx("button", {
657
+ className: cn('flex-1 border-b py-4 text-base/8 font-medium not-focus-visible:focus:outline-none', activeMobileTier?.id === tier.id ? 'border-primary text-primary dark:border-primary-dark-300 dark:text-primary-dark-300' : 'border-transparent text-gray-500 dark:text-gray-400'),
658
+ onClick: ()=>setActiveMobileTierId(tier.id),
659
+ type: "button",
660
+ children: tier.name
661
+ }, tier.id))
662
+ }),
663
+ activeMobileTier ? /*#__PURE__*/ _jsxs("div", {
664
+ className: "mt-8",
665
+ children: [
666
+ activeMobileTier.href && activeMobileTier.ctaLabel ? /*#__PURE__*/ _jsx("a", {
667
+ className: cn('block rounded-md px-3.5 py-2.5 text-center text-sm font-semibold', activeMobileTier.featured ? cardTokens.featuredCta : cardTokens.cta),
668
+ href: activeMobileTier.href,
669
+ children: activeMobileTier.ctaLabel
670
+ }) : null,
671
+ comparisonSections.map((section)=>/*#__PURE__*/ _jsxs("div", {
672
+ children: [
673
+ /*#__PURE__*/ _jsx("div", {
674
+ className: cn('mt-10 rounded-lg px-6 py-3 text-sm/6 font-semibold text-gray-950 group-first-of-type:mt-5 dark:text-white', comparisonPanelToneClasses[tone]),
675
+ children: section.name
676
+ }),
677
+ /*#__PURE__*/ _jsx("dl", {
678
+ children: section.features.map((feature)=>/*#__PURE__*/ _jsxs("div", {
679
+ className: "grid grid-cols-2 border-b border-gray-100 py-4 last:border-none dark:border-white/10",
680
+ children: [
681
+ /*#__PURE__*/ _jsx("dt", {
682
+ className: "text-sm/6 font-normal text-gray-600 dark:text-gray-300",
683
+ children: feature.name
684
+ }),
685
+ /*#__PURE__*/ _jsx("dd", {
686
+ className: "text-center",
687
+ children: /*#__PURE__*/ _jsx(ComparisonValue, {
688
+ value: feature.tiers[activeMobileTier.name]
689
+ })
690
+ })
691
+ ]
692
+ }, feature.name))
693
+ })
694
+ ]
695
+ }, section.name))
696
+ ]
697
+ }) : null
698
+ ]
699
+ })
700
+ ]
701
+ }) : null
702
+ ]
703
+ });
704
+ };
705
+ const PricingComponent = ({ cardStyle = 'default', className, comparisonSections, defaultFrequency, description, eyebrow = 'Pricing', extraOffer, frequencies, logos, singleOffer, tiers = [], title, tone = 'default', variant = 'grid', ...props })=>{
706
+ const initialFrequency = useMemo(()=>getDefaultFrequency(frequencies, tiers, defaultFrequency), [
707
+ defaultFrequency,
708
+ frequencies,
709
+ tiers
710
+ ]);
711
+ const [activeFrequency, setActiveFrequency] = useState(initialFrequency);
712
+ return /*#__PURE__*/ _jsxs("section", {
713
+ className: cn('relative overflow-hidden px-6 py-24 sm:py-32 lg:px-8', toneClasses[tone], className),
714
+ "data-slot": "pricing",
715
+ "data-tone": tone,
716
+ "data-variant": variant,
717
+ ...props,
718
+ children: [
719
+ tone === 'gradient' ? gradientDecoration : null,
720
+ /*#__PURE__*/ _jsxs("div", {
721
+ className: "mx-auto max-w-7xl",
722
+ children: [
723
+ /*#__PURE__*/ _jsx(PricingHeader, {
724
+ description: description,
725
+ eyebrow: eyebrow,
726
+ title: title,
727
+ tone: tone
728
+ }),
729
+ frequencies?.length ? /*#__PURE__*/ _jsx(FrequencyToggle, {
730
+ activeFrequency: activeFrequency,
731
+ frequencies: frequencies,
732
+ onChange: setActiveFrequency,
733
+ tone: tone
734
+ }) : null,
735
+ variant === 'single' && singleOffer ? /*#__PURE__*/ _jsx(SinglePricing, {
736
+ singleOffer: singleOffer,
737
+ tone: tone
738
+ }) : null,
739
+ variant === 'grid' ? /*#__PURE__*/ _jsx(GridPricing, {
740
+ activeFrequency: activeFrequency,
741
+ cardStyle: cardStyle,
742
+ extraOffer: extraOffer,
743
+ frequencies: frequencies,
744
+ tiers: tiers,
745
+ tone: tone
746
+ }) : null,
747
+ variant === 'comparison' ? /*#__PURE__*/ _jsx(ComparisonPricing, {
748
+ activeFrequency: activeFrequency,
749
+ cardStyle: cardStyle,
750
+ comparisonSections: comparisonSections,
751
+ frequencies: frequencies,
752
+ logos: logos,
753
+ tiers: tiers,
754
+ tone: tone
755
+ }) : null
756
+ ]
757
+ })
758
+ ]
759
+ });
760
+ };
761
+ export const Pricing = /*#__PURE__*/ memo(PricingComponent);
762
+ Pricing.displayName = 'Pricing';
763
+
764
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL1ByaWNpbmcvUHJpY2luZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjbn0gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCB7bWVtbywgdXNlTWVtbywgdXNlU3RhdGV9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHtDaGVjaywgTWludXMsIFBsdXMsIFh9IGZyb20gJy4uLy4uL2ljb25zL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge0hUTUxBdHRyaWJ1dGVzLCBSZWFjdE5vZGV9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IHR5cGUgUHJpY2luZ1ZhcmlhbnQgPSAnZ3JpZCcgfCAnc2luZ2xlJyB8ICdjb21wYXJpc29uJztcbmV4cG9ydCB0eXBlIFByaWNpbmdUb25lID0gJ2RlZmF1bHQnIHwgJ2RhcmsnIHwgJ2dyYWRpZW50JztcbmV4cG9ydCB0eXBlIFByaWNpbmdDYXJkU3R5bGUgPSAnZGVmYXVsdCcgfCAnY29udHJhc3QnIHwgJ3NvbGlkJztcblxuZXhwb3J0IGludGVyZmFjZSBQcmljaW5nRnJlcXVlbmN5IHtcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJpY2VTdWZmaXg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2luZ0hpZ2hsaWdodCB7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUHJpY2luZ1RpZXJWYWx1ZSA9IGJvb2xlYW4gfCBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpY2luZ1RpZXIge1xuICByZWFkb25seSBiYWRnZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY3RhTGFiZWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGN0YVN1YnRpdGxlPzogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZmVhdHVyZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBmZWF0dXJlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBoaWdobGlnaHRzPzogcmVhZG9ubHkgUHJpY2luZ0hpZ2hsaWdodFtdO1xuICByZWFkb25seSBocmVmPzogc3RyaW5nO1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByaWNlOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZWFkb25seSBwcmljZUNhcHRpb24/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IHByaWNlU3VmZml4Pzogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljaW5nQ29tcGFyaXNvbkZlYXR1cmUge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRpZXJzOiBSZWNvcmQ8c3RyaW5nLCBQcmljaW5nVGllclZhbHVlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljaW5nQ29tcGFyaXNvblNlY3Rpb24ge1xuICByZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgUHJpY2luZ0NvbXBhcmlzb25GZWF0dXJlW107XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljaW5nTG9nbyB7XG4gIHJlYWRvbmx5IGFsdDogc3RyaW5nO1xuICByZWFkb25seSBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNyYzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaWNpbmdFeHRyYU9mZmVyIHtcbiAgcmVhZG9ubHkgY3RhSHJlZjogc3RyaW5nO1xuICByZWFkb25seSBjdGFMYWJlbDogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgdGl0bGU6IFJlYWN0Tm9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmljaW5nU2luZ2xlT2ZmZXIge1xuICByZWFkb25seSBjdGFIcmVmOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGN0YUxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogUmVhY3ROb2RlO1xuICByZWFkb25seSBmZWF0dXJlTGFiZWw/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGZlYXR1cmVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IG5vdGU/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IHByaWNlOiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IHByaWNlTGFiZWw/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IHByaWNlU3VmZml4PzogUmVhY3ROb2RlO1xuICByZWFkb25seSB0aXRsZTogUmVhY3ROb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaWNpbmdQcm9wcyBleHRlbmRzIE9taXQ8SFRNTEF0dHJpYnV0ZXM8SFRNTEVsZW1lbnQ+LCAndGl0bGUnPiB7XG4gIHJlYWRvbmx5IGNhcmRTdHlsZT86IFByaWNpbmdDYXJkU3R5bGU7XG4gIHJlYWRvbmx5IGNvbXBhcmlzb25TZWN0aW9ucz86IHJlYWRvbmx5IFByaWNpbmdDb21wYXJpc29uU2VjdGlvbltdO1xuICByZWFkb25seSBkZWZhdWx0RnJlcXVlbmN5Pzogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZXllYnJvdz86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZXh0cmFPZmZlcj86IFByaWNpbmdFeHRyYU9mZmVyO1xuICByZWFkb25seSBmcmVxdWVuY2llcz86IHJlYWRvbmx5IFByaWNpbmdGcmVxdWVuY3lbXTtcbiAgcmVhZG9ubHkgbG9nb3M/OiByZWFkb25seSBQcmljaW5nTG9nb1tdO1xuICByZWFkb25seSBzaW5nbGVPZmZlcj86IFByaWNpbmdTaW5nbGVPZmZlcjtcbiAgcmVhZG9ubHkgdGllcnM/OiByZWFkb25seSBQcmljaW5nVGllcltdO1xuICByZWFkb25seSB0aXRsZT86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgdG9uZT86IFByaWNpbmdUb25lO1xuICByZWFkb25seSB2YXJpYW50PzogUHJpY2luZ1ZhcmlhbnQ7XG59XG5cbmNvbnN0IHRvbmVDbGFzc2VzOiBSZWNvcmQ8UHJpY2luZ1RvbmUsIHN0cmluZz4gPSB7XG4gIGRhcms6ICdiZy1ncmF5LTk1MCB0ZXh0LXdoaXRlJyxcbiAgZGVmYXVsdDogJ2JnLXdoaXRlIHRleHQtZ3JheS05MDAgZGFyazpiZy1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUnLFxuICBncmFkaWVudDogJ2JnLXdoaXRlIGRhcms6YmctZ3JheS05MDAnXG59O1xuXG5jb25zdCBoZWFkZXJUb25lQ2xhc3NlczogUmVjb3JkPFByaWNpbmdUb25lLCB7ZGVzY3JpcHRpb246IHN0cmluZzsgZXllYnJvdzogc3RyaW5nOyB0aXRsZTogc3RyaW5nfT4gPSB7XG4gIGRhcms6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3RleHQtZ3JheS0zMDAnLFxuICAgIGV5ZWJyb3c6ICd0ZXh0LXByaW1hcnktZGFyay0zMDAnLFxuICAgIHRpdGxlOiAndGV4dC13aGl0ZSdcbiAgfSxcbiAgZGVmYXVsdDoge1xuICAgIGRlc2NyaXB0aW9uOiAndGV4dC1ncmF5LTYwMCBkYXJrOnRleHQtZ3JheS00MDAnLFxuICAgIGV5ZWJyb3c6ICd0ZXh0LXByaW1hcnkgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDAnLFxuICAgIHRpdGxlOiAndGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUnXG4gIH0sXG4gIGdyYWRpZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICd0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTQwMCcsXG4gICAgZXllYnJvdzogJ3RleHQtcHJpbWFyeSBkYXJrOnRleHQtcHJpbWFyeS1kYXJrLTMwMCcsXG4gICAgdGl0bGU6ICd0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSdcbiAgfVxufTtcblxuY29uc3QgZnJlcXVlbmN5U2hlbGxDbGFzc2VzOiBSZWNvcmQ8UHJpY2luZ1RvbmUsIHN0cmluZz4gPSB7XG4gIGRhcms6ICdiZy13aGl0ZS81IHJpbmctMSByaW5nLXdoaXRlLzEwJyxcbiAgZGVmYXVsdDogJ3JpbmctMSByaW5nLWJvcmRlciBiZy1iYWNrZ3JvdW5kJyxcbiAgZ3JhZGllbnQ6ICdyaW5nLTEgcmluZy1ib3JkZXIgYmctYmFja2dyb3VuZCdcbn07XG5cbmNvbnN0IGZyZXF1ZW5jeUl0ZW1DbGFzc2VzOiBSZWNvcmQ8UHJpY2luZ1RvbmUsIHN0cmluZz4gPSB7XG4gIGRhcms6ICdoYXMtY2hlY2tlZDpiZy1wcmltYXJ5LWRhcmsgdGV4dC1ncmF5LTMwMCBoYXMtY2hlY2tlZDp0ZXh0LXdoaXRlJyxcbiAgZGVmYXVsdDogJ2hhcy1jaGVja2VkOmJnLXByaW1hcnkgdGV4dC1ncmF5LTUwMCBoYXMtY2hlY2tlZDp0ZXh0LXdoaXRlIGRhcms6dGV4dC1ncmF5LTQwMCBkYXJrOmhhcy1jaGVja2VkOmJnLXByaW1hcnktZGFyaycsXG4gIGdyYWRpZW50OiAnaGFzLWNoZWNrZWQ6YmctcHJpbWFyeSB0ZXh0LWdyYXktNTAwIGhhcy1jaGVja2VkOnRleHQtd2hpdGUgZGFyazp0ZXh0LWdyYXktNDAwIGRhcms6aGFzLWNoZWNrZWQ6YmctcHJpbWFyeS1kYXJrJ1xufTtcblxuY29uc3QgY2FyZFRvbmVDbGFzc2VzOiBSZWNvcmQ8UHJpY2luZ1RvbmUsIFJlY29yZDxQcmljaW5nQ2FyZFN0eWxlLCB7Ym9keTogc3RyaW5nOyBjdGE6IHN0cmluZzsgZmVhdHVyZWRCb2R5OiBzdHJpbmc7IGZlYXR1cmVkQ3RhOiBzdHJpbmc7IG11dGVkOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmd9Pj4gPSB7XG4gIGRhcms6IHtcbiAgICBjb250cmFzdDoge1xuICAgICAgYm9keTogJ2JnLXdoaXRlLzUgcmluZy0xIHJpbmctd2hpdGUvMTAnLFxuICAgICAgY3RhOiAnYmctd2hpdGUvMTAgdGV4dC13aGl0ZSByaW5nLTEgcmluZy13aGl0ZS8xMCBob3ZlcjpiZy13aGl0ZS8yMCcsXG4gICAgICBmZWF0dXJlZEJvZHk6ICdiZy13aGl0ZSB0ZXh0LWdyYXktOTAwIHNoYWRvdy0yeGwgcmluZy0xIHJpbmctYmxhY2svNSBkYXJrOmJnLWdyYXktODAwIGRhcms6dGV4dC13aGl0ZSBkYXJrOnJpbmctd2hpdGUvMTAgZGFyazpzaGFkb3ctbm9uZScsXG4gICAgICBmZWF0dXJlZEN0YTogJ2JnLXByaW1hcnkgdGV4dC13aGl0ZSBob3ZlcjpiZy1wcmltYXJ5LTcwMCBkYXJrOmJnLXByaW1hcnktZGFyayBkYXJrOmhvdmVyOmJnLXByaW1hcnktZGFyay0zMDAnLFxuICAgICAgbXV0ZWQ6ICd0ZXh0LWdyYXktMzAwJyxcbiAgICAgIHRpdGxlOiAndGV4dC13aGl0ZSdcbiAgICB9LFxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJvZHk6ICdiZy13aGl0ZS81IHJpbmctMSByaW5nLXdoaXRlLzEwJyxcbiAgICAgIGN0YTogJ2JnLXdoaXRlLzEwIHRleHQtd2hpdGUgcmluZy0xIHJpbmctd2hpdGUvMTAgaG92ZXI6Ymctd2hpdGUvMjAnLFxuICAgICAgZmVhdHVyZWRCb2R5OiAnYmctZ3JheS05MDAgcmluZy0xIHJpbmctZ3JheS05MDAgc2hhZG93LTJ4bCBkYXJrOmJnLWdyYXktODAwIGRhcms6cmluZy13aGl0ZS8xMCBkYXJrOnNoYWRvdy1ub25lJyxcbiAgICAgIGZlYXR1cmVkQ3RhOiAnYmctcHJpbWFyeSB0ZXh0LXdoaXRlIGhvdmVyOmJnLXByaW1hcnktNzAwIGRhcms6YmctcHJpbWFyeS1kYXJrIGRhcms6aG92ZXI6YmctcHJpbWFyeS1kYXJrLTMwMCcsXG4gICAgICBtdXRlZDogJ3RleHQtZ3JheS0zMDAnLFxuICAgICAgdGl0bGU6ICd0ZXh0LXdoaXRlJ1xuICAgIH0sXG4gICAgc29saWQ6IHtcbiAgICAgIGJvZHk6ICdiZy1ncmF5LTkwMCByaW5nLTEgcmluZy13aGl0ZS8xMCcsXG4gICAgICBjdGE6ICdiZy1wcmltYXJ5IHRleHQtd2hpdGUgaG92ZXI6YmctcHJpbWFyeS03MDAgZGFyazpiZy1wcmltYXJ5LWRhcmsgZGFyazpob3ZlcjpiZy1wcmltYXJ5LWRhcmstMzAwJyxcbiAgICAgIGZlYXR1cmVkQm9keTogJ2JnLXByaW1hcnktZGFyayByaW5nLTIgcmluZy1wcmltYXJ5LWRhcmstMzAwIHNoYWRvdy0yeGwnLFxuICAgICAgZmVhdHVyZWRDdGE6ICdiZy13aGl0ZSB0ZXh0LWdyYXktOTAwIGhvdmVyOmJnLWdyYXktMTAwJyxcbiAgICAgIG11dGVkOiAndGV4dC1ncmF5LTMwMCcsXG4gICAgICB0aXRsZTogJ3RleHQtd2hpdGUnXG4gICAgfVxuICB9LFxuICBkZWZhdWx0OiB7XG4gICAgY29udHJhc3Q6IHtcbiAgICAgIGJvZHk6ICdiZy13aGl0ZS83MCByaW5nLTEgcmluZy1ibGFjay8xMCBkYXJrOmJnLXdoaXRlLzUgZGFyazpyaW5nLXdoaXRlLzEwJyxcbiAgICAgIGN0YTogJ2JnLXdoaXRlIHRleHQtcHJpbWFyeSByaW5nLTEgcmluZy1wcmltYXJ5LzIwIGhvdmVyOnJpbmctcHJpbWFyeS80MCBkYXJrOmJnLXdoaXRlLzEwIGRhcms6dGV4dC13aGl0ZSBkYXJrOnJpbmctd2hpdGUvMTAgZGFyazpob3ZlcjpiZy13aGl0ZS8yMCcsXG4gICAgICBmZWF0dXJlZEJvZHk6ICdiZy1ncmF5LTkwMCB0ZXh0LXdoaXRlIHNoYWRvdy0yeGwgcmluZy0xIHJpbmctZ3JheS05MDAvMTAgZGFyazpiZy1ncmF5LTgwMCBkYXJrOnJpbmctd2hpdGUvMTAgZGFyazpzaGFkb3ctbm9uZScsXG4gICAgICBmZWF0dXJlZEN0YTogJ2JnLXByaW1hcnkgdGV4dC13aGl0ZSBob3ZlcjpiZy1wcmltYXJ5LTcwMCBkYXJrOmJnLXByaW1hcnktZGFyayBkYXJrOmhvdmVyOmJnLXByaW1hcnktZGFyay0zMDAnLFxuICAgICAgbXV0ZWQ6ICd0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTMwMCcsXG4gICAgICB0aXRsZTogJ3RleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlJ1xuICAgIH0sXG4gICAgZGVmYXVsdDoge1xuICAgICAgYm9keTogJ2JnLXdoaXRlIHJpbmctMSByaW5nLWJvcmRlciBkYXJrOmJnLWdyYXktODAwLzUwIGRhcms6cmluZy13aGl0ZS8xMCcsXG4gICAgICBjdGE6ICdiZy13aGl0ZSB0ZXh0LXByaW1hcnkgcmluZy0xIHJpbmctcHJpbWFyeS8yMCBob3ZlcjpyaW5nLXByaW1hcnkvNDAgZGFyazpiZy13aGl0ZS8xMCBkYXJrOnRleHQtd2hpdGUgZGFyazpyaW5nLXdoaXRlLzEwIGRhcms6aG92ZXI6Ymctd2hpdGUvMjAnLFxuICAgICAgZmVhdHVyZWRCb2R5OiAnYmctd2hpdGUgcmluZy0yIHJpbmctcHJpbWFyeSBzaGFkb3cteGwgZGFyazpiZy1ncmF5LTgwMC81MCBkYXJrOnJpbmctcHJpbWFyeS1kYXJrLTMwMCBkYXJrOnNoYWRvdy1ub25lJyxcbiAgICAgIGZlYXR1cmVkQ3RhOiAnYmctcHJpbWFyeSB0ZXh0LXdoaXRlIGhvdmVyOmJnLXByaW1hcnktNzAwIGRhcms6YmctcHJpbWFyeS1kYXJrIGRhcms6aG92ZXI6YmctcHJpbWFyeS1kYXJrLTMwMCcsXG4gICAgICBtdXRlZDogJ3RleHQtZ3JheS02MDAgZGFyazp0ZXh0LWdyYXktMzAwJyxcbiAgICAgIHRpdGxlOiAndGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUnXG4gICAgfSxcbiAgICBzb2xpZDoge1xuICAgICAgYm9keTogJ2JnLXdoaXRlIHJpbmctMSByaW5nLWJvcmRlciBzaGFkb3ctbGcgZGFyazpiZy1ncmF5LTgwMC81MCBkYXJrOnJpbmctd2hpdGUvMTAgZGFyazpzaGFkb3ctbm9uZScsXG4gICAgICBjdGE6ICdiZy1wcmltYXJ5IHRleHQtd2hpdGUgaG92ZXI6YmctcHJpbWFyeS03MDAgZGFyazpiZy1wcmltYXJ5LWRhcmsgZGFyazpob3ZlcjpiZy1wcmltYXJ5LWRhcmstMzAwJyxcbiAgICAgIGZlYXR1cmVkQm9keTogJ2JnLXdoaXRlIHJpbmctMiByaW5nLXByaW1hcnkgc2hhZG93LTJ4bCBkYXJrOmJnLWdyYXktODAwIGRhcms6cmluZy1wcmltYXJ5LWRhcmstMzAwIGRhcms6c2hhZG93LW5vbmUnLFxuICAgICAgZmVhdHVyZWRDdGE6ICdiZy1wcmltYXJ5IHRleHQtd2hpdGUgaG92ZXI6YmctcHJpbWFyeS03MDAgZGFyazpiZy1wcmltYXJ5LWRhcmsgZGFyazpob3ZlcjpiZy1wcmltYXJ5LWRhcmstMzAwJyxcbiAgICAgIG11dGVkOiAndGV4dC1ncmF5LTYwMCBkYXJrOnRleHQtZ3JheS0zMDAnLFxuICAgICAgdGl0bGU6ICd0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSdcbiAgICB9XG4gIH0sXG4gIGdyYWRpZW50OiB7XG4gICAgY29udHJhc3Q6IHtcbiAgICAgIGJvZHk6ICdiZy13aGl0ZS83NSByaW5nLTEgcmluZy1ibGFjay8xMCBkYXJrOmJnLXdoaXRlLzUgZGFyazpyaW5nLXdoaXRlLzEwJyxcbiAgICAgIGN0YTogJ2JnLXdoaXRlIHRleHQtcHJpbWFyeSByaW5nLTEgcmluZy1wcmltYXJ5LzIwIGhvdmVyOnJpbmctcHJpbWFyeS80MCBkYXJrOmJnLXdoaXRlLzEwIGRhcms6dGV4dC13aGl0ZSBkYXJrOnJpbmctd2hpdGUvMTAgZGFyazpob3ZlcjpiZy13aGl0ZS8yMCcsXG4gICAgICBmZWF0dXJlZEJvZHk6ICdiZy1ncmF5LTkwMCB0ZXh0LXdoaXRlIHNoYWRvdy0yeGwgcmluZy0xIHJpbmctZ3JheS05MDAvMTAgZGFyazpiZy1ncmF5LTgwMCBkYXJrOnJpbmctd2hpdGUvMTAgZGFyazpzaGFkb3ctbm9uZScsXG4gICAgICBmZWF0dXJlZEN0YTogJ2JnLXByaW1hcnkgdGV4dC13aGl0ZSBob3ZlcjpiZy1wcmltYXJ5LTcwMCBkYXJrOmJnLXByaW1hcnktZGFyayBkYXJrOmhvdmVyOmJnLXByaW1hcnktZGFyay0zMDAnLFxuICAgICAgbXV0ZWQ6ICd0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTMwMCcsXG4gICAgICB0aXRsZTogJ3RleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlJ1xuICAgIH0sXG4gICAgZGVmYXVsdDoge1xuICAgICAgYm9keTogJ2JnLXdoaXRlIHJpbmctMSByaW5nLWJvcmRlciBkYXJrOmJnLWdyYXktODAwLzUwIGRhcms6cmluZy13aGl0ZS8xMCcsXG4gICAgICBjdGE6ICdiZy13aGl0ZSB0ZXh0LXByaW1hcnkgcmluZy0xIHJpbmctcHJpbWFyeS8yMCBob3ZlcjpyaW5nLXByaW1hcnkvNDAgZGFyazpiZy13aGl0ZS8xMCBkYXJrOnRleHQtd2hpdGUgZGFyazpyaW5nLXdoaXRlLzEwIGRhcms6aG92ZXI6Ymctd2hpdGUvMjAnLFxuICAgICAgZmVhdHVyZWRCb2R5OiAnYmctd2hpdGUgc2hhZG93LXhsIHJpbmctMiByaW5nLXByaW1hcnkgZGFyazpiZy1ncmF5LTgwMC81MCBkYXJrOnJpbmctcHJpbWFyeS1kYXJrLTMwMCBkYXJrOnNoYWRvdy1ub25lJyxcbiAgICAgIGZlYXR1cmVkQ3RhOiAnYmctcHJpbWFyeSB0ZXh0LXdoaXRlIGhvdmVyOmJnLXByaW1hcnktNzAwIGRhcms6YmctcHJpbWFyeS1kYXJrIGRhcms6aG92ZXI6YmctcHJpbWFyeS1kYXJrLTMwMCcsXG4gICAgICBtdXRlZDogJ3RleHQtZ3JheS02MDAgZGFyazp0ZXh0LWdyYXktMzAwJyxcbiAgICAgIHRpdGxlOiAndGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUnXG4gICAgfSxcbiAgICBzb2xpZDoge1xuICAgICAgYm9keTogJ2JnLXdoaXRlIHJpbmctMSByaW5nLWJvcmRlciBzaGFkb3ctbGcgZGFyazpiZy1ncmF5LTgwMC81MCBkYXJrOnJpbmctd2hpdGUvMTAgZGFyazpzaGFkb3ctbm9uZScsXG4gICAgICBjdGE6ICdiZy1wcmltYXJ5IHRleHQtd2hpdGUgaG92ZXI6YmctcHJpbWFyeS03MDAgZGFyazpiZy1wcmltYXJ5LWRhcmsgZGFyazpob3ZlcjpiZy1wcmltYXJ5LWRhcmstMzAwJyxcbiAgICAgIGZlYXR1cmVkQm9keTogJ2JnLXdoaXRlIHNoYWRvdy0yeGwgcmluZy0yIHJpbmctcHJpbWFyeSBkYXJrOmJnLWdyYXktODAwIGRhcms6cmluZy1wcmltYXJ5LWRhcmstMzAwIGRhcms6c2hhZG93LW5vbmUnLFxuICAgICAgZmVhdHVyZWRDdGE6ICdiZy1wcmltYXJ5IHRleHQtd2hpdGUgaG92ZXI6YmctcHJpbWFyeS03MDAgZGFyazpiZy1wcmltYXJ5LWRhcmsgZGFyazpob3ZlcjpiZy1wcmltYXJ5LWRhcmstMzAwJyxcbiAgICAgIG11dGVkOiAndGV4dC1ncmF5LTYwMCBkYXJrOnRleHQtZ3JheS0zMDAnLFxuICAgICAgdGl0bGU6ICd0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC13aGl0ZSdcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGZlYXR1cmVkVGV4dENsYXNzZXMgPSAodG9uZTogUHJpY2luZ1RvbmUsIGNhcmRTdHlsZTogUHJpY2luZ0NhcmRTdHlsZSkgPT4ge1xuICBjb25zdCBsaWdodEZlYXR1cmVkQ2FyZCA9XG4gICAgKHRvbmUgPT09ICdkYXJrJyAmJiBjYXJkU3R5bGUgPT09ICdjb250cmFzdCcpIHx8XG4gICAgKCh0b25lID09PSAnZGVmYXVsdCcgfHwgdG9uZSA9PT0gJ2dyYWRpZW50JykgJiYgKGNhcmRTdHlsZSA9PT0gJ2RlZmF1bHQnIHx8IGNhcmRTdHlsZSA9PT0gJ3NvbGlkJykpO1xuXG4gIHJldHVybiBsaWdodEZlYXR1cmVkQ2FyZFxuICAgID8ge1xuICAgICAgYmFkZ2U6ICdiZy1wcmltYXJ5LzEwIHRleHQtcHJpbWFyeSBkYXJrOmJnLXByaW1hcnktZGFyay0zMDAvMTAgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDAnLFxuICAgICAgaWNvbjogJ3RleHQtcHJpbWFyeSBkYXJrOnRleHQtcHJpbWFyeS1kYXJrLTMwMCcsXG4gICAgICBtdXRlZDogJ3RleHQtZ3JheS02MDAgZGFyazp0ZXh0LWdyYXktMzAwJyxcbiAgICAgIHRpdGxlOiAndGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUnXG4gICAgfVxuICAgIDoge1xuICAgICAgYmFkZ2U6ICdiZy13aGl0ZS8xMCB0ZXh0LXdoaXRlIGRhcms6YmctcHJpbWFyeS1kYXJrLTMwMC8xNSBkYXJrOnRleHQtcHJpbWFyeS1kYXJrLTMwMCcsXG4gICAgICBpY29uOiAndGV4dC1wcmltYXJ5LWRhcmstMzAwJyxcbiAgICAgIG11dGVkOiAndGV4dC1ncmF5LTMwMCBkYXJrOnRleHQtZ3JheS0zMDAnLFxuICAgICAgdGl0bGU6ICd0ZXh0LXdoaXRlIGRhcms6dGV4dC13aGl0ZSdcbiAgICB9O1xufTtcblxuY29uc3QgY29tcGFyaXNvblBhbmVsVG9uZUNsYXNzZXM6IFJlY29yZDxQcmljaW5nVG9uZSwgc3RyaW5nPiA9IHtcbiAgZGFyazogJ2JnLWdyYXktOTAwLzYwIGJvcmRlci13aGl0ZS8xMCcsXG4gIGRlZmF1bHQ6ICdiZy13aGl0ZSBib3JkZXItYm9yZGVyIGRhcms6YmctZ3JheS04MDAvNTAgZGFyazpib3JkZXItd2hpdGUvMTAnLFxuICBncmFkaWVudDogJ2JnLXdoaXRlIGJvcmRlci1ib3JkZXIgZGFyazpiZy1ncmF5LTgwMC81MCBkYXJrOmJvcmRlci13aGl0ZS8xMCdcbn07XG5cbmNvbnN0IGNvbXBhcmlzb25HcmlkQ2xhc3NlczogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgMTogJ2xnOmdyaWQtY29scy0xJyxcbiAgMjogJ2xnOmdyaWQtY29scy0yJyxcbiAgMzogJ2xnOmdyaWQtY29scy0zJyxcbiAgNDogJ21kOmdyaWQtY29scy0yIHhsOmdyaWQtY29scy00J1xufTtcblxuY29uc3QgY29tcGFyaXNvbkNvbENsYXNzZXM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDE6ICd3LWZ1bGwnLFxuICAyOiAndy0xLzInLFxuICAzOiAndy0xLzMnLFxuICA0OiAndy0xLzQnXG59O1xuXG5jb25zdCBncmFkaWVudERlY29yYXRpb24gPSAoXG4gIDxkaXYgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC14LTAgdG9wLTAgLXotMTAgb3ZlcmZsb3ctaGlkZGVuIGJsdXItM3hsXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwibXgtYXV0byBhc3BlY3QtWzExNTUvNjc4XSB3LVs3MnJlbV0gYmctbGluZWFyLXRvLXRyIGZyb20tcHJpbWFyeS8yNSB2aWEtc2Vjb25kYXJ5LzIwIHRvLXByaW1hcnktZGFyay8yNSBvcGFjaXR5LTcwIGRhcms6b3BhY2l0eS00MFwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBjbGlwUGF0aDpcbiAgICAgICAgICAncG9seWdvbig3NC4xJSA0NC4xJSwxMDAlIDYxLjYlLDk3LjUlIDI2LjklLDg1LjUlIDAuMSUsODAuNyUgMiUsNzIuNSUgMzIuNSUsNjAuMiUgNjIuNCUsNTIuNCUgNjguMSUsNDcuNSUgNTguMyUsNDUuMiUgMzQuNSUsMjcuNSUgNzYuNyUsMC4xJSA2NC45JSwxNy45JSAxMDAlLDI3LjYlIDc2LjglLDc2LjElIDk3LjclLDc0LjElIDQ0LjElKSdcbiAgICAgIH19XG4gICAgLz5cbiAgPC9kaXY+XG4pO1xuXG5jb25zdCBnZXREZWZhdWx0RnJlcXVlbmN5ID0gKFxuICBmcmVxdWVuY2llczogcmVhZG9ubHkgUHJpY2luZ0ZyZXF1ZW5jeVtdIHwgdW5kZWZpbmVkLFxuICB0aWVyczogcmVhZG9ubHkgUHJpY2luZ1RpZXJbXSB8IHVuZGVmaW5lZCxcbiAgZGVmYXVsdEZyZXF1ZW5jeT86IHN0cmluZ1xuKSA9PiB7XG4gIGlmKGRlZmF1bHRGcmVxdWVuY3kpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZyZXF1ZW5jeTtcbiAgfVxuXG4gIGlmKGZyZXF1ZW5jaWVzPy5bMF0/LnZhbHVlKSB7XG4gICAgcmV0dXJuIGZyZXF1ZW5jaWVzWzBdLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZmlyc3RQcmljZSA9IHRpZXJzPy5maW5kKCh0aWVyKSA9PiB0eXBlb2YgdGllci5wcmljZSAhPT0gJ3N0cmluZycgJiYgT2JqZWN0LmtleXModGllci5wcmljZSkubGVuZ3RoID4gMCk/LnByaWNlO1xuXG4gIGlmKGZpcnN0UHJpY2UgJiYgdHlwZW9mIGZpcnN0UHJpY2UgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGZpcnN0UHJpY2UpWzBdID8/ICdtb250aGx5JztcbiAgfVxuXG4gIHJldHVybiAnbW9udGhseSc7XG59O1xuXG5jb25zdCBnZXRQcmljZUZvclRpZXIgPSAodGllcjogUHJpY2luZ1RpZXIsIGFjdGl2ZUZyZXF1ZW5jeTogc3RyaW5nKSA9PiB7XG4gIGlmKHR5cGVvZiB0aWVyLnByaWNlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0aWVyLnByaWNlO1xuICB9XG5cbiAgcmV0dXJuIHRpZXIucHJpY2VbYWN0aXZlRnJlcXVlbmN5XSA/PyBPYmplY3QudmFsdWVzKHRpZXIucHJpY2UpWzBdID8/ICcnO1xufTtcblxuY29uc3QgZ2V0UHJpY2VTdWZmaXhGb3JUaWVyID0gKFxuICB0aWVyOiBQcmljaW5nVGllcixcbiAgZnJlcXVlbmNpZXM6IHJlYWRvbmx5IFByaWNpbmdGcmVxdWVuY3lbXSB8IHVuZGVmaW5lZCxcbiAgYWN0aXZlRnJlcXVlbmN5OiBzdHJpbmdcbikgPT4ge1xuICBpZih0eXBlb2YgdGllci5wcmljZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRpZXIucHJpY2VTdWZmaXggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRpZXIucHJpY2VTdWZmaXg7XG4gIH1cblxuICBpZih0aWVyLnByaWNlU3VmZml4ICYmIHR5cGVvZiB0aWVyLnByaWNlU3VmZml4ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0aWVyLnByaWNlU3VmZml4W2FjdGl2ZUZyZXF1ZW5jeV0gPz8gT2JqZWN0LnZhbHVlcyh0aWVyLnByaWNlU3VmZml4KVswXSA/PyAnJztcbiAgfVxuXG4gIHJldHVybiBmcmVxdWVuY2llcz8uZmluZCgoZnJlcXVlbmN5KSA9PiBmcmVxdWVuY3kudmFsdWUgPT09IGFjdGl2ZUZyZXF1ZW5jeSk/LnByaWNlU3VmZml4ID8/ICcnO1xufTtcblxuY29uc3QgcmVuZGVyVGllckxpc3QgPSAoXG4gIHRpZXI6IFByaWNpbmdUaWVyLFxuICBmZWF0dXJlZDogYm9vbGVhbixcbiAgZmVhdHVyZWRUZXh0OiBSZXR1cm5UeXBlPHR5cGVvZiBmZWF0dXJlZFRleHRDbGFzc2VzPlxuKSA9PiB7XG4gIGlmKHRpZXIuaGlnaGxpZ2h0cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDx1bCBjbGFzc05hbWU9XCJtdC04IHNwYWNlLXktMyB0ZXh0LXNtLzZcIiByb2xlPVwibGlzdFwiPlxuICAgICAgICB7dGllci5oaWdobGlnaHRzLm1hcCgoaGlnaGxpZ2h0KSA9PiAoXG4gICAgICAgICAgPGxpXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAnZ3JvdXAgZmxleCBpdGVtcy1zdGFydCBnYXAtMycsXG4gICAgICAgICAgICAgIGhpZ2hsaWdodC5kaXNhYmxlZCA/ICd0ZXh0LWdyYXktNDAwIGRhcms6dGV4dC1ncmF5LTUwMCcgOiBmZWF0dXJlZCA/IGZlYXR1cmVkVGV4dC5tdXRlZCA6ICd0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTMwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBrZXk9e2hpZ2hsaWdodC5kZXNjcmlwdGlvbn1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBoLTYgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIHtoaWdobGlnaHQuZGlzYWJsZWQgPyAoXG4gICAgICAgICAgICAgICAgPE1pbnVzIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cInNpemUtNCB0ZXh0LWdyYXktNDAwIGRhcms6dGV4dC1ncmF5LTUwMFwiIC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPFBsdXMgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3NOYW1lPXtjbignc2l6ZS00JywgZmVhdHVyZWQgPyBmZWF0dXJlZFRleHQuaWNvbiA6ICd0ZXh0LXByaW1hcnkgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDAnKX0gLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIHtoaWdobGlnaHQuZGVzY3JpcHRpb259XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKSl9XG4gICAgICA8L3VsPlxuICAgICk7XG4gIH1cblxuICBpZighdGllci5mZWF0dXJlcz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDx1bCBjbGFzc05hbWU9XCJtdC04IHNwYWNlLXktMyB0ZXh0LXNtLzZcIiByb2xlPVwibGlzdFwiPlxuICAgICAge3RpZXIuZmVhdHVyZXMubWFwKChmZWF0dXJlKSA9PiAoXG4gICAgICAgIDxsaVxuICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAnZmxleCBnYXAtMycsXG4gICAgICAgICAgICBmZWF0dXJlZCA/IGZlYXR1cmVkVGV4dC5tdXRlZCA6ICd0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTMwMCdcbiAgICAgICAgICApfVxuICAgICAgICAgIGtleT17ZmVhdHVyZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxDaGVjayBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzc05hbWU9e2NuKCdtdC0wLjUgc2l6ZS00IHNocmluay0wJywgZmVhdHVyZWQgPyBmZWF0dXJlZFRleHQuaWNvbiA6ICd0ZXh0LXByaW1hcnkgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDAnKX0gLz5cbiAgICAgICAgICA8c3Bhbj57ZmVhdHVyZX08L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICApKX1cbiAgICA8L3VsPlxuICApO1xufTtcblxuY29uc3QgUHJpY2luZ0hlYWRlciA9ICh7XG4gIGRlc2NyaXB0aW9uLFxuICBleWVicm93LFxuICB0aXRsZSxcbiAgdG9uZVxufTogUGljazxQcmljaW5nUHJvcHMsICdkZXNjcmlwdGlvbicgfCAnZXllYnJvdycgfCAndGl0bGUnIHwgJ3RvbmUnPikgPT4ge1xuICBpZighZXllYnJvdyAmJiAhdGl0bGUgJiYgIWRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy00eGwgdGV4dC1jZW50ZXJcIj5cbiAgICAgIHtleWVicm93ID8gKFxuICAgICAgICA8aDIgY2xhc3NOYW1lPXtjbigndGV4dC1iYXNlLzcgZm9udC1zZW1pYm9sZCcsIGhlYWRlclRvbmVDbGFzc2VzW3RvbmUgPz8gJ2RlZmF1bHQnXS5leWVicm93KX0+XG4gICAgICAgICAge2V5ZWJyb3d9XG4gICAgICAgIDwvaDI+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHt0aXRsZSA/IChcbiAgICAgICAgPHAgY2xhc3NOYW1lPXtjbignbXQtMiB0ZXh0LTV4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0IHRleHQtYmFsYW5jZSBzbTp0ZXh0LTZ4bCcsIGhlYWRlclRvbmVDbGFzc2VzW3RvbmUgPz8gJ2RlZmF1bHQnXS50aXRsZSl9PlxuICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgPC9wPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7ZGVzY3JpcHRpb24gPyAoXG4gICAgICAgIDxwIGNsYXNzTmFtZT17Y24oJ214LWF1dG8gbXQtNiBtYXgtdy0yeGwgdGV4dC1jZW50ZXIgdGV4dC1sZyBmb250LW1lZGl1bSB0ZXh0LXByZXR0eSBzbTp0ZXh0LXhsLzgnLCBoZWFkZXJUb25lQ2xhc3Nlc1t0b25lID8/ICdkZWZhdWx0J10uZGVzY3JpcHRpb24pfT5cbiAgICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgIDwvcD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuY29uc3QgRnJlcXVlbmN5VG9nZ2xlID0gKHtcbiAgYWN0aXZlRnJlcXVlbmN5LFxuICBmcmVxdWVuY2llcyxcbiAgb25DaGFuZ2UsXG4gIHRvbmVcbn06IHtcbiAgcmVhZG9ubHkgYWN0aXZlRnJlcXVlbmN5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZyZXF1ZW5jaWVzOiByZWFkb25seSBQcmljaW5nRnJlcXVlbmN5W107XG4gIHJlYWRvbmx5IG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgcmVhZG9ubHkgdG9uZTogUHJpY2luZ1RvbmU7XG59KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwibXQtMTYgZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIDxmaWVsZHNldCBhcmlhLWxhYmVsPVwiUGF5bWVudCBmcmVxdWVuY3lcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbignZ3JpZCBncmlkLWNvbHMtMiBnYXAteC0xIHJvdW5kZWQtZnVsbCBwLTEgdGV4dC1jZW50ZXIgdGV4dC14cy81IGZvbnQtc2VtaWJvbGQnLCBmcmVxdWVuY3lTaGVsbENsYXNzZXNbdG9uZV0pfT5cbiAgICAgICAge2ZyZXF1ZW5jaWVzLm1hcCgoZnJlcXVlbmN5KSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hlY2tlZCA9IGFjdGl2ZUZyZXF1ZW5jeSA9PT0gZnJlcXVlbmN5LnZhbHVlO1xuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKCdyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgcHgtMi41IHB5LTEgdHJhbnNpdGlvbi1jb2xvcnMnLCBmcmVxdWVuY3lJdGVtQ2xhc3Nlc1t0b25lXSwgY2hlY2tlZCAmJiAndGV4dC13aGl0ZScpfVxuICAgICAgICAgICAgICBrZXk9e2ZyZXF1ZW5jeS52YWx1ZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17Y2hlY2tlZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzci1vbmx5XCJcbiAgICAgICAgICAgICAgICBuYW1lPVwicHJpY2luZy1mcmVxdWVuY3lcIlxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoKSA9PiBvbkNoYW5nZShmcmVxdWVuY3kudmFsdWUpfVxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgdmFsdWU9e2ZyZXF1ZW5jeS52YWx1ZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+e2ZyZXF1ZW5jeS5sYWJlbH08L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgPC9kaXY+XG4gICAgPC9maWVsZHNldD5cbiAgPC9kaXY+XG4pO1xuXG5jb25zdCBHcmlkUHJpY2luZyA9ICh7XG4gIGFjdGl2ZUZyZXF1ZW5jeSxcbiAgY2FyZFN0eWxlLFxuICBleHRyYU9mZmVyLFxuICBmcmVxdWVuY2llcyxcbiAgdG9uZSxcbiAgdGllcnNcbn06IHtcbiAgcmVhZG9ubHkgYWN0aXZlRnJlcXVlbmN5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhcmRTdHlsZTogUHJpY2luZ0NhcmRTdHlsZTtcbiAgcmVhZG9ubHkgZXh0cmFPZmZlcj86IFByaWNpbmdFeHRyYU9mZmVyO1xuICByZWFkb25seSBmcmVxdWVuY2llcz86IHJlYWRvbmx5IFByaWNpbmdGcmVxdWVuY3lbXTtcbiAgcmVhZG9ubHkgdG9uZTogUHJpY2luZ1RvbmU7XG4gIHJlYWRvbmx5IHRpZXJzOiByZWFkb25seSBQcmljaW5nVGllcltdO1xufSkgPT4ge1xuICBjb25zdCBncmlkQ29sc0NsYXNzID0gdGllcnMubGVuZ3RoID49IDRcbiAgICA/ICdtZDpncmlkLWNvbHMtMiB4bDpncmlkLWNvbHMtNCdcbiAgICA6IHRpZXJzLmxlbmd0aCA9PT0gM1xuICAgICAgPyAnbGc6Z3JpZC1jb2xzLTMnXG4gICAgICA6IHRpZXJzLmxlbmd0aCA9PT0gMlxuICAgICAgICA/ICdsZzpncmlkLWNvbHMtMiBsZzptYXgtdy00eGwnXG4gICAgICAgIDogJ21heC13LTJ4bCc7XG4gIGNvbnN0IGNhcmRUb2tlbnMgPSBjYXJkVG9uZUNsYXNzZXNbdG9uZV1bY2FyZFN0eWxlXTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbignbXgtYXV0byBncmlkIG1heC13LW1kIGdyaWQtY29scy0xIGdhcC04JywgZ3JpZENvbHNDbGFzcyl9PlxuICAgICAgICB7dGllcnMubWFwKCh0aWVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmVhdHVyZWQgPSBCb29sZWFuKHRpZXIuZmVhdHVyZWQpO1xuICAgICAgICAgIGNvbnN0IGZlYXR1cmVkVGV4dCA9IGZlYXR1cmVkVGV4dENsYXNzZXModG9uZSwgY2FyZFN0eWxlKTtcbiAgICAgICAgICBjb25zdCBwcmljZSA9IGdldFByaWNlRm9yVGllcih0aWVyLCBhY3RpdmVGcmVxdWVuY3kpO1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGdldFByaWNlU3VmZml4Rm9yVGllcih0aWVyLCBmcmVxdWVuY2llcywgYWN0aXZlRnJlcXVlbmN5KTtcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgJ2ZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtM3hsIHAtOCB4bDpwLTEwJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlZCA/IGNhcmRUb2tlbnMuZmVhdHVyZWRCb2R5IDogY2FyZFRva2Vucy5ib2R5XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIGRhdGEtZmVhdHVyZWQ9e2ZlYXR1cmVkID8gJ3RydWUnIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICBrZXk9e3RpZXIuaWR9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9e2NuKCd0ZXh0LWxnLzggZm9udC1zZW1pYm9sZCcsIGZlYXR1cmVkID8gZmVhdHVyZWRUZXh0LnRpdGxlIDogY2FyZFRva2Vucy50aXRsZSl9IGlkPXt0aWVyLmlkfT5cbiAgICAgICAgICAgICAgICAgICAge3RpZXIubmFtZX1cbiAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICB7dGllci5iYWRnZSA/IChcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAncm91bmRlZC1mdWxsIHB4LTIuNSBweS0xIHRleHQteHMvNSBmb250LXNlbWlib2xkJyxcbiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlZCA/IGZlYXR1cmVkVGV4dC5iYWRnZSA6ICdiZy1wcmltYXJ5LzEwIHRleHQtcHJpbWFyeSBkYXJrOmJnLXByaW1hcnktZGFyay0zMDAvMTAgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDAnXG4gICAgICAgICAgICAgICAgICAgICl9PlxuICAgICAgICAgICAgICAgICAgICAgIHt0aWVyLmJhZGdlfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7dGllci5kZXNjcmlwdGlvbiA/IChcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17Y24oJ210LTQgdGV4dC1zbS82JywgZmVhdHVyZWQgPyBmZWF0dXJlZFRleHQubXV0ZWQgOiBjYXJkVG9rZW5zLm11dGVkKX0+XG4gICAgICAgICAgICAgICAgICAgIHt0aWVyLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTYgZmxleCBpdGVtcy1iYXNlbGluZSBnYXAteC0yXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2NuKCd0ZXh0LTR4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0JywgZmVhdHVyZWQgPyBmZWF0dXJlZFRleHQudGl0bGUgOiBjYXJkVG9rZW5zLnRpdGxlKX0+XG4gICAgICAgICAgICAgICAgICAgIHtwcmljZX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIHtzdWZmaXggPyAoXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y24oJ3RleHQtc20vNiBmb250LXNlbWlib2xkJywgZmVhdHVyZWQgPyBmZWF0dXJlZFRleHQubXV0ZWQgOiBjYXJkVG9rZW5zLm11dGVkKX0+XG4gICAgICAgICAgICAgICAgICAgICAge3N1ZmZpeH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIHt0aWVyLnByaWNlQ2FwdGlvbiA/IChcbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17Y24oJ210LTMgdGV4dC1zbS82JywgZmVhdHVyZWQgPyBmZWF0dXJlZFRleHQubXV0ZWQgOiBjYXJkVG9rZW5zLm11dGVkKX0+XG4gICAgICAgICAgICAgICAgICAgIHt0aWVyLnByaWNlQ2FwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICB7cmVuZGVyVGllckxpc3QodGllciwgZmVhdHVyZWQsIGZlYXR1cmVkVGV4dCl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB7dGllci5ocmVmICYmIHRpZXIuY3RhTGFiZWwgPyAoXG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e3RpZXIuaWR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgICAnbXQtOCBibG9jayByb3VuZGVkLW1kIHB4LTMuNSBweS0yLjUgdGV4dC1jZW50ZXIgdGV4dC1zbS82IGZvbnQtc2VtaWJvbGQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1wcmltYXJ5IGRhcms6Zm9jdXMtdmlzaWJsZTpvdXRsaW5lLXByaW1hcnktZGFyay0zMDAnLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlZCA/IGNhcmRUb2tlbnMuZmVhdHVyZWRDdGEgOiBjYXJkVG9rZW5zLmN0YVxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIGhyZWY9e3RpZXIuaHJlZn1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7dGllci5jdGFMYWJlbH1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICB7dGllci5jdGFTdWJ0aXRsZSA/IChcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9e2NuKCdtdC0zIHRleHQtY2VudGVyIHRleHQteHMvNScsIGZlYXR1cmVkID8gZmVhdHVyZWRUZXh0Lm11dGVkIDogY2FyZFRva2Vucy5tdXRlZCl9PlxuICAgICAgICAgICAgICAgICAge3RpZXIuY3RhU3VidGl0bGV9XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICk7XG4gICAgICAgIH0pfVxuICAgICAgICB7ZXh0cmFPZmZlciA/IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAnZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBnYXAtNiByb3VuZGVkLTN4bCBwLTggcmluZy0xIHNtOnAtMTAnLFxuICAgICAgICAgICAgdGllcnMubGVuZ3RoID4gMSA/ICdsZzpjb2wtc3Bhbi1mdWxsIGxnOmZsZXgtcm93IGxnOml0ZW1zLWNlbnRlcicgOiAnJyxcbiAgICAgICAgICAgIHRvbmUgPT09ICdkYXJrJ1xuICAgICAgICAgICAgICA/ICdiZy13aGl0ZS81IHJpbmctd2hpdGUvMTAnXG4gICAgICAgICAgICAgIDogJ2JnLXRyYW5zcGFyZW50IHJpbmctYm9yZGVyIGRhcms6Ymctd2hpdGUvNSBkYXJrOnJpbmctd2hpdGUvMTAnXG4gICAgICAgICAgKX0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTAgZmxleC0xXCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UvNyBmb250LXNlbWlib2xkIHRleHQtcHJpbWFyeSBkYXJrOnRleHQtcHJpbWFyeS1kYXJrLTMwMFwiPntleHRyYU9mZmVyLnRpdGxlfTwvaDM+XG4gICAgICAgICAgICAgIHtleHRyYU9mZmVyLmRlc2NyaXB0aW9uID8gKFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT17Y24oJ210LTEgdGV4dC1iYXNlLzcnLCB0b25lID09PSAnZGFyaycgPyAndGV4dC1ncmF5LTMwMCcgOiAndGV4dC1ncmF5LTYwMCBkYXJrOnRleHQtZ3JheS0zMDAnKX0+XG4gICAgICAgICAgICAgICAgICB7ZXh0cmFPZmZlci5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICdyb3VuZGVkLW1kIHB4LTMuNSBweS0yIHRleHQtc20vNiBmb250LXNlbWlib2xkJyxcbiAgICAgICAgICAgICAgICB0b25lID09PSAnZGFyaydcbiAgICAgICAgICAgICAgICAgID8gJ2JnLXdoaXRlLzEwIHRleHQtd2hpdGUgcmluZy0xIHJpbmctd2hpdGUvMTAgaG92ZXI6Ymctd2hpdGUvMjAnXG4gICAgICAgICAgICAgICAgICA6ICdiZy13aGl0ZSB0ZXh0LXByaW1hcnkgcmluZy0xIHJpbmctcHJpbWFyeS8yMCBob3ZlcjpyaW5nLXByaW1hcnkvNDAgZGFyazpiZy13aGl0ZS8xMCBkYXJrOnRleHQtd2hpdGUgZGFyazpyaW5nLXdoaXRlLzEwIGRhcms6aG92ZXI6Ymctd2hpdGUvMjAnXG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIGhyZWY9e2V4dHJhT2ZmZXIuY3RhSHJlZn1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2V4dHJhT2ZmZXIuY3RhTGFiZWx9XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5jb25zdCBTaW5nbGVQcmljaW5nID0gKHtcbiAgc2luZ2xlT2ZmZXIsXG4gIHRvbmVcbn06IHtcbiAgcmVhZG9ubHkgc2luZ2xlT2ZmZXI6IFByaWNpbmdTaW5nbGVPZmZlcjtcbiAgcmVhZG9ubHkgdG9uZTogUHJpY2luZ1RvbmU7XG59KSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtdC0xNiBtYXgtdy01eGwgcm91bmRlZC0zeGwgcmluZy0xIHJpbmctYm9yZGVyIGxnOmZsZXggZGFyazpiZy1ncmF5LTgwMC81MCBkYXJrOnJpbmctd2hpdGUvMTBcIj5cbiAgICA8ZGl2IGNsYXNzTmFtZT1cInAtOCBzbTpwLTEwIGxnOmZsZXgtYXV0b1wiPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cInRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGVcIj57c2luZ2xlT2ZmZXIudGl0bGV9PC9oMz5cbiAgICAgIHtzaW5nbGVPZmZlci5kZXNjcmlwdGlvbiA/IChcbiAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtNiB0ZXh0LWJhc2UvNyB0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTMwMFwiPntzaW5nbGVPZmZlci5kZXNjcmlwdGlvbn08L3A+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtzaW5nbGVPZmZlci5mZWF0dXJlcz8ubGVuZ3RoID8gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMTAgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtNFwiPlxuICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cImZsZXgtbm9uZSB0ZXh0LXNtLzYgZm9udC1zZW1pYm9sZCB0ZXh0LXByaW1hcnkgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDBcIj5cbiAgICAgICAgICAgICAge3NpbmdsZU9mZmVyLmZlYXR1cmVMYWJlbCA/PyAnV2hhdFxcJ3MgaW5jbHVkZWQnfVxuICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaC1weCBmbGV4LWF1dG8gYmctZ3JheS0xMDAgZGFyazpiZy13aGl0ZS8xMFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTggZ3JpZCBncmlkLWNvbHMtMSBnYXAtNCB0ZXh0LXNtLzYgdGV4dC1ncmF5LTYwMCBzbTpncmlkLWNvbHMtMiBzbTpnYXAtNiBkYXJrOnRleHQtZ3JheS0zMDBcIiByb2xlPVwibGlzdFwiPlxuICAgICAgICAgICAge3NpbmdsZU9mZmVyLmZlYXR1cmVzLm1hcCgoZmVhdHVyZSkgPT4gKFxuICAgICAgICAgICAgICA8bGkgY2xhc3NOYW1lPVwiZmxleCBnYXAtM1wiIGtleT17ZmVhdHVyZX0+XG4gICAgICAgICAgICAgICAgPENoZWNrIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGNsYXNzTmFtZT1cIm10LTAuNSBzaXplLTQgc2hyaW5rLTAgdGV4dC1wcmltYXJ5IGRhcms6dGV4dC1wcmltYXJ5LWRhcmstMzAwXCIgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj57ZmVhdHVyZX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8Lz5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiLW10LTIgcC0yIGxnOm10LTAgbGc6dy1mdWxsIGxnOm1heC13LW1kIGxnOnNocmluay0wXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdyb3VuZGVkLTJ4bCBweS0xMCB0ZXh0LWNlbnRlciByaW5nLTEgbGc6ZmxleCBsZzpmbGV4LWNvbCBsZzpqdXN0aWZ5LWNlbnRlciBsZzpweS0xNicsXG4gICAgICAgIHRvbmUgPT09ICdkYXJrJ1xuICAgICAgICAgID8gJ2JnLWdyYXktOTAwIHJpbmctd2hpdGUvMTAnXG4gICAgICAgICAgOiAnYmctZ3JheS01MCByaW5nLWdyYXktOTAwLzUgZGFyazpiZy1ncmF5LTkwMCBkYXJrOnJpbmctd2hpdGUvMTAnXG4gICAgICApfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LXhzIHB4LThcIj5cbiAgICAgICAgICB7c2luZ2xlT2ZmZXIucHJpY2VMYWJlbCA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtYmFzZSBmb250LXNlbWlib2xkIHRleHQtZ3JheS02MDAgZGFyazp0ZXh0LWdyYXktNDAwXCI+e3NpbmdsZU9mZmVyLnByaWNlTGFiZWx9PC9wPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTYgZmxleCBpdGVtcy1iYXNlbGluZSBqdXN0aWZ5LWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LTV4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlXCI+e3NpbmdsZU9mZmVyLnByaWNlfTwvc3Bhbj5cbiAgICAgICAgICAgIHtzaW5nbGVPZmZlci5wcmljZVN1ZmZpeCA/IChcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbS82IGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctd2lkZSB0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTQwMFwiPntzaW5nbGVPZmZlci5wcmljZVN1ZmZpeH08L3NwYW4+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTEwIGJsb2NrIHctZnVsbCByb3VuZGVkLW1kIGJnLXByaW1hcnkgcHgtMyBweS0yIHRleHQtY2VudGVyIHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXdoaXRlIGhvdmVyOmJnLXByaW1hcnktNzAwIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtcHJpbWFyeSBkYXJrOmJnLXByaW1hcnktZGFyayBkYXJrOmhvdmVyOmJnLXByaW1hcnktZGFyay0zMDBcIlxuICAgICAgICAgICAgaHJlZj17c2luZ2xlT2ZmZXIuY3RhSHJlZn1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7c2luZ2xlT2ZmZXIuY3RhTGFiZWx9XG4gICAgICAgICAgPC9hPlxuICAgICAgICAgIHtzaW5nbGVPZmZlci5ub3RlID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtNiB0ZXh0LXhzLzUgdGV4dC1ncmF5LTYwMCBkYXJrOnRleHQtZ3JheS00MDBcIj57c2luZ2xlT2ZmZXIubm90ZX08L3A+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuKTtcblxuY29uc3QgQ29tcGFyaXNvblZhbHVlID0gKHt2YWx1ZX06IHtyZWFkb25seSB2YWx1ZTogUHJpY2luZ1RpZXJWYWx1ZSB8IHVuZGVmaW5lZH0pID0+IHtcbiAgaWYodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtLzYgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGVcIj57dmFsdWV9PC9zcGFuPjtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIDxDaGVjayBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzc05hbWU9XCJpbmxpbmUtYmxvY2sgc2l6ZS00IHRleHQtZ3JlZW4tNjAwIGRhcms6dGV4dC1ncmVlbi01MDBcIiAvPjtcbiAgfVxuXG4gIHJldHVybiA8WCBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzc05hbWU9XCJpbmxpbmUtYmxvY2sgc2l6ZS00IHRleHQtZ3JheS00MDAgZGFyazp0ZXh0LWdyYXktNTAwXCIgLz47XG59O1xuXG5jb25zdCBDb21wYXJpc29uUHJpY2luZyA9ICh7XG4gIGFjdGl2ZUZyZXF1ZW5jeSxcbiAgY2FyZFN0eWxlLFxuICBjb21wYXJpc29uU2VjdGlvbnMsXG4gIGZyZXF1ZW5jaWVzLFxuICBsb2dvcyxcbiAgdG9uZSxcbiAgdGllcnNcbn06IHtcbiAgcmVhZG9ubHkgYWN0aXZlRnJlcXVlbmN5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNhcmRTdHlsZTogUHJpY2luZ0NhcmRTdHlsZTtcbiAgcmVhZG9ubHkgY29tcGFyaXNvblNlY3Rpb25zPzogcmVhZG9ubHkgUHJpY2luZ0NvbXBhcmlzb25TZWN0aW9uW107XG4gIHJlYWRvbmx5IGZyZXF1ZW5jaWVzPzogcmVhZG9ubHkgUHJpY2luZ0ZyZXF1ZW5jeVtdO1xuICByZWFkb25seSBsb2dvcz86IHJlYWRvbmx5IFByaWNpbmdMb2dvW107XG4gIHJlYWRvbmx5IHRvbmU6IFByaWNpbmdUb25lO1xuICByZWFkb25seSB0aWVyczogcmVhZG9ubHkgUHJpY2luZ1RpZXJbXTtcbn0pID0+IHtcbiAgY29uc3QgW2FjdGl2ZU1vYmlsZVRpZXJJZCwgc2V0QWN0aXZlTW9iaWxlVGllcklkXSA9IHVzZVN0YXRlKHRpZXJzWzBdPy5pZCA/PyAnJyk7XG4gIGNvbnN0IGFjdGl2ZU1vYmlsZVRpZXIgPSB0aWVycy5maW5kKCh0aWVyKSA9PiB0aWVyLmlkID09PSBhY3RpdmVNb2JpbGVUaWVySWQpID8/IHRpZXJzWzBdO1xuICBjb25zdCBjYXJkVG9rZW5zID0gY2FyZFRvbmVDbGFzc2VzW3RvbmVdW2NhcmRTdHlsZV07XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NuKCdyZWxhdGl2ZSBtdC0xMCcsIHRvbmUgPT09ICdncmFkaWVudCcgJiYgJ3B0LTYnKX0+XG4gICAgICAgIHt0b25lID09PSAnZ3JhZGllbnQnID8gKFxuICAgICAgICAgIDxkaXYgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteC0wIHRvcC0xNiBib3R0b20tMCBiZy1bcmFkaWFsLWdyYWRpZW50KGNpcmNsZV9hdF9jZW50ZXJfY2VudGVyLHRoZW1lKGNvbG9ycy5wcmltYXJ5Ly4zNSksdGhlbWUoY29sb3JzLnByaW1hcnktZGFyay8uMjgpLHRyYW5zcGFyZW50XzcyJSldIGRhcms6YmctW3JhZGlhbC1ncmFkaWVudChjaXJjbGVfYXRfY2VudGVyX2NlbnRlcix0aGVtZShjb2xvcnMucHJpbWFyeS1kYXJrLTMwMC8uMjgpLHRoZW1lKGNvbG9ycy5wcmltYXJ5LWRhcmsvLjIyKSx0cmFuc3BhcmVudF83MiUpXVwiIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIG14LWF1dG8gbWF4LXctN3hsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NuKCdncmlkIGdyaWQtY29scy0xIGdhcC04JywgY29tcGFyaXNvbkdyaWRDbGFzc2VzW01hdGgubWluKE1hdGgubWF4KHRpZXJzLmxlbmd0aCwgMSksIDQpXSl9PlxuICAgICAgICAgICAge3RpZXJzLm1hcCgodGllcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlZCA9IEJvb2xlYW4odGllci5mZWF0dXJlZCk7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVkVGV4dCA9IGZlYXR1cmVkVGV4dENsYXNzZXModG9uZSwgY2FyZFN0eWxlKTtcblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbigncm91bmRlZC00eGwgcC0yIHNoYWRvdy1baW5zZXRfMF8wXzBfMXB4X3JnYmEoMjU1LDI1NSwyNTUsMC4wOCldJywgdG9uZSA9PT0gJ2RhcmsnID8gJ2JnLXdoaXRlLzUnIDogJ2JnLXdoaXRlLzUgZGFyazpiZy13aGl0ZS81Jyl9IGtleT17dGllci5pZH0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y24oJ3JvdW5kZWQtM3hsIHAtOCcsIGZlYXR1cmVkID8gY2FyZFRva2Vucy5mZWF0dXJlZEJvZHkgOiBjYXJkVG9rZW5zLmJvZHkpfT5cbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT17Y24oJ3RleHQtc20gZm9udC1zZW1pYm9sZCcsIGZlYXR1cmVkID8gJ3RleHQtd2hpdGUgZGFyazp0ZXh0LXdoaXRlJyA6ICd0ZXh0LXByaW1hcnkgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDAnKX0+XG4gICAgICAgICAgICAgICAgICAgICAge3RpZXIubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAge3RpZXIuZGVzY3JpcHRpb24gPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXtjbignbXQtMiB0ZXh0LXNtLzYnLCBmZWF0dXJlZCA/ICd0ZXh0LWdyYXktMzAwIGRhcms6dGV4dC1ncmF5LTMwMCcgOiBjYXJkVG9rZW5zLm11dGVkKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGllci5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTggZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y24oJ3RleHQtNXhsIGZvbnQtc2VtaWJvbGQnLCBmZWF0dXJlZCA/ICd0ZXh0LXdoaXRlIGRhcms6dGV4dC13aGl0ZScgOiBjYXJkVG9rZW5zLnRpdGxlKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Z2V0UHJpY2VGb3JUaWVyKHRpZXIsIGFjdGl2ZUZyZXF1ZW5jeSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge2dldFByaWNlU3VmZml4Rm9yVGllcih0aWVyLCBmcmVxdWVuY2llcywgYWN0aXZlRnJlcXVlbmN5KSA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbigndGV4dC1zbScsIGZlYXR1cmVkID8gJ3RleHQtZ3JheS0zMDAgZGFyazp0ZXh0LWdyYXktMzAwJyA6IGNhcmRUb2tlbnMubXV0ZWQpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e2dldFByaWNlU3VmZml4Rm9yVGllcih0aWVyLCBmcmVxdWVuY2llcywgYWN0aXZlRnJlcXVlbmN5KX08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIHt0aWVyLmhyZWYgJiYgdGllci5jdGFMYWJlbCA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17YCR7dGllci5jdGFMYWJlbH0gb24gdGhlICR7dGllci5uYW1lfSBwbGFuYH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdtdC04IGlubGluZS1ibG9jayByb3VuZGVkLW1kIHB4LTMuNSBweS0yIHRleHQtY2VudGVyIHRleHQtc20vNiBmb250LXNlbWlib2xkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZWQgPyBjYXJkVG9rZW5zLmZlYXR1cmVkQ3RhIDogY2FyZFRva2Vucy5jdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXt0aWVyLmhyZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3RpZXIuY3RhTGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAge3JlbmRlclRpZXJMaXN0KHRpZXIsIGZlYXR1cmVkLCBmZWF0dXJlZFRleHQpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7bG9nb3M/Lmxlbmd0aCA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAganVzdGlmeS1jZW50ZXIgZ2FwLXgtOCBnYXAteS00IHB5LTE2IG9wYWNpdHktNzAgc206cHktMjRcIj5cbiAgICAgICAgICAgICAge2xvZ29zLm1hcCgobG9nbykgPT4gKFxuICAgICAgICAgICAgICAgIDxpbWcgYWx0PXtsb2dvLmFsdH0gY2xhc3NOYW1lPXtjbignaC04IG9iamVjdC1jb250YWluIGxnOmgtMTAnLCBsb2dvLmNsYXNzTmFtZSl9IGtleT17YCR7bG9nby5hbHR9LSR7bG9nby5zcmN9YH0gc3JjPXtsb2dvLnNyY30gLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIHtjb21wYXJpc29uU2VjdGlvbnM/Lmxlbmd0aCA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG10LTggbWF4LXctN3hsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbGc6YmxvY2tcIj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJ3LWZ1bGwgdGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgIDxjYXB0aW9uIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5QcmljaW5nIHBsYW4gY29tcGFyaXNvbjwvY2FwdGlvbj5cbiAgICAgICAgICAgICAgPGNvbGdyb3VwPlxuICAgICAgICAgICAgICAgIDxjb2wgY2xhc3NOYW1lPVwidy0yLzVcIiAvPlxuICAgICAgICAgICAgICAgIHt0aWVycy5tYXAoKHRpZXIpID0+IDxjb2wgY2xhc3NOYW1lPXtjb21wYXJpc29uQ29sQ2xhc3Nlc1tNYXRoLm1pbihNYXRoLm1heCh0aWVycy5sZW5ndGgsIDEpLCA0KV19IGtleT17dGllci5pZH0gLz4pfVxuICAgICAgICAgICAgICA8L2NvbGdyb3VwPlxuICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInAtMFwiIC8+XG4gICAgICAgICAgICAgICAgICB7dGllcnMubWFwKCh0aWVyKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJwLTBcIiBrZXk9e3RpZXIuaWR9IHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1wcmltYXJ5IGRhcms6dGV4dC1wcmltYXJ5LWRhcmstMzAwXCI+e3RpZXIubmFtZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInAtMFwiIC8+XG4gICAgICAgICAgICAgICAgICB7dGllcnMubWFwKCh0aWVyKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweC0wIHB0LTMgcGItMFwiIGtleT17dGllci5pZH0+XG4gICAgICAgICAgICAgICAgICAgICAge3RpZXIuaHJlZiAmJiB0aWVyLmN0YUxhYmVsID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5saW5lLWJsb2NrIHJvdW5kZWQtbWQgcHgtMi41IHB5LTEuNSB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZXIuZmVhdHVyZWQgPyBjYXJkVG9rZW5zLmZlYXR1cmVkQ3RhIDogY2FyZFRva2Vucy5jdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17dGllci5ocmVmfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dGllci5jdGFMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgIHtjb21wYXJpc29uU2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzTmFtZT1cImdyb3VwXCIga2V5PXtzZWN0aW9uLm5hbWV9PlxuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHgtMCBwdC0xMCBwYi0wIGdyb3VwLWZpcnN0LW9mLXR5cGU6cHQtNVwiIGNvbFNwYW49e3RpZXJzLmxlbmd0aCArIDF9IHNjb3BlPVwiY29sZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYmctZ3JheS01MCBweC00IHB5LTMgdGV4dC1zbS82IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTk1MCBkYXJrOmJnLWdyYXktODAwLzUwIGRhcms6dGV4dC13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3NlY3Rpb24ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICB7c2VjdGlvbi5mZWF0dXJlcy5tYXAoKGZlYXR1cmUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci1ncmF5LTEwMCBsYXN0OmJvcmRlci1ub25lIGRhcms6Ym9yZGVyLXdoaXRlLzEwXCIga2V5PXtmZWF0dXJlLm5hbWV9PlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweC0wIHB5LTQgdGV4dC1zbS82IGZvbnQtbm9ybWFsIHRleHQtZ3JheS02MDAgZGFyazp0ZXh0LWdyYXktMzAwXCIgc2NvcGU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtmZWF0dXJlLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICB7dGllcnMubWFwKCh0aWVyKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicC00IG1heC1zbTp0ZXh0LWNlbnRlclwiIGtleT17dGllci5pZH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxDb21wYXJpc29uVmFsdWUgdmFsdWU9e2ZlYXR1cmUudGllcnNbdGllci5uYW1lXX0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3Itb25seVwiPnt0eXBlb2YgZmVhdHVyZS50aWVyc1t0aWVyLm5hbWVdID09PSAnc3RyaW5nJyA/IGAke2ZlYXR1cmUudGllcnNbdGllci5uYW1lXX0gZm9yICR7dGllci5uYW1lfWAgOiBgJHtmZWF0dXJlLnRpZXJzW3RpZXIubmFtZV0gPT09IHRydWUgPyAnSW5jbHVkZWQnIDogJ05vdCBpbmNsdWRlZCd9IGluICR7dGllci5uYW1lfWB9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxnOmhpZGRlblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGJvcmRlci1iIGJvcmRlci1ncmF5LTEwMCBkYXJrOmJvcmRlci13aGl0ZS8xMFwiPlxuICAgICAgICAgICAgICB7dGllcnMubWFwKCh0aWVyKSA9PiAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgJ2ZsZXgtMSBib3JkZXItYiBweS00IHRleHQtYmFzZS84IGZvbnQtbWVkaXVtIG5vdC1mb2N1cy12aXNpYmxlOmZvY3VzOm91dGxpbmUtbm9uZScsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZU1vYmlsZVRpZXI/LmlkID09PSB0aWVyLmlkXG4gICAgICAgICAgICAgICAgICAgICAgPyAnYm9yZGVyLXByaW1hcnkgdGV4dC1wcmltYXJ5IGRhcms6Ym9yZGVyLXByaW1hcnktZGFyay0zMDAgZGFyazp0ZXh0LXByaW1hcnktZGFyay0zMDAnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnYm9yZGVyLXRyYW5zcGFyZW50IHRleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwJ1xuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIGtleT17dGllci5pZH1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEFjdGl2ZU1vYmlsZVRpZXJJZCh0aWVyLmlkKX1cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt0aWVyLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7YWN0aXZlTW9iaWxlVGllciA/IChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC04XCI+XG4gICAgICAgICAgICAgICAge2FjdGl2ZU1vYmlsZVRpZXIuaHJlZiAmJiBhY3RpdmVNb2JpbGVUaWVyLmN0YUxhYmVsID8gKFxuICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnYmxvY2sgcm91bmRlZC1tZCBweC0zLjUgcHktMi41IHRleHQtY2VudGVyIHRleHQtc20gZm9udC1zZW1pYm9sZCcsXG4gICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTW9iaWxlVGllci5mZWF0dXJlZCA/IGNhcmRUb2tlbnMuZmVhdHVyZWRDdGEgOiBjYXJkVG9rZW5zLmN0YVxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICBocmVmPXthY3RpdmVNb2JpbGVUaWVyLmhyZWZ9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHthY3RpdmVNb2JpbGVUaWVyLmN0YUxhYmVsfVxuICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIHtjb21wYXJpc29uU2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGtleT17c2VjdGlvbi5uYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2NuKCdtdC0xMCByb3VuZGVkLWxnIHB4LTYgcHktMyB0ZXh0LXNtLzYgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTUwIGdyb3VwLWZpcnN0LW9mLXR5cGU6bXQtNSBkYXJrOnRleHQtd2hpdGUnLCBjb21wYXJpc29uUGFuZWxUb25lQ2xhc3Nlc1t0b25lXSl9PlxuICAgICAgICAgICAgICAgICAgICAgIHtzZWN0aW9uLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGw+XG4gICAgICAgICAgICAgICAgICAgICAge3NlY3Rpb24uZmVhdHVyZXMubWFwKChmZWF0dXJlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgYm9yZGVyLWIgYm9yZGVyLWdyYXktMTAwIHB5LTQgbGFzdDpib3JkZXItbm9uZSBkYXJrOmJvcmRlci13aGl0ZS8xMFwiIGtleT17ZmVhdHVyZS5uYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGR0IGNsYXNzTmFtZT1cInRleHQtc20vNiBmb250LW5vcm1hbCB0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC1ncmF5LTMwMFwiPntmZWF0dXJlLm5hbWV9PC9kdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRkIGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPENvbXBhcmlzb25WYWx1ZSB2YWx1ZT17ZmVhdHVyZS50aWVyc1thY3RpdmVNb2JpbGVUaWVyLm5hbWVdfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGw+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogbnVsbH1cbiAgICA8Lz5cbiAgKTtcbn07XG5cbmNvbnN0IFByaWNpbmdDb21wb25lbnQgPSAoe1xuICBjYXJkU3R5bGUgPSAnZGVmYXVsdCcsXG4gIGNsYXNzTmFtZSxcbiAgY29tcGFyaXNvblNlY3Rpb25zLFxuICBkZWZhdWx0RnJlcXVlbmN5LFxuICBkZXNjcmlwdGlvbixcbiAgZXllYnJvdyA9ICdQcmljaW5nJyxcbiAgZXh0cmFPZmZlcixcbiAgZnJlcXVlbmNpZXMsXG4gIGxvZ29zLFxuICBzaW5nbGVPZmZlcixcbiAgdGllcnMgPSBbXSxcbiAgdGl0bGUsXG4gIHRvbmUgPSAnZGVmYXVsdCcsXG4gIHZhcmlhbnQgPSAnZ3JpZCcsXG4gIC4uLnByb3BzXG59OiBQcmljaW5nUHJvcHMpID0+IHtcbiAgY29uc3QgaW5pdGlhbEZyZXF1ZW5jeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZ2V0RGVmYXVsdEZyZXF1ZW5jeShmcmVxdWVuY2llcywgdGllcnMsIGRlZmF1bHRGcmVxdWVuY3kpLFxuICAgIFtkZWZhdWx0RnJlcXVlbmN5LCBmcmVxdWVuY2llcywgdGllcnNdXG4gICk7XG4gIGNvbnN0IFthY3RpdmVGcmVxdWVuY3ksIHNldEFjdGl2ZUZyZXF1ZW5jeV0gPSB1c2VTdGF0ZShpbml0aWFsRnJlcXVlbmN5KTtcblxuICByZXR1cm4gKFxuICAgIDxzZWN0aW9uXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuIHB4LTYgcHktMjQgc206cHktMzIgbGc6cHgtOCcsXG4gICAgICAgIHRvbmVDbGFzc2VzW3RvbmVdLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBkYXRhLXNsb3Q9XCJwcmljaW5nXCJcbiAgICAgIGRhdGEtdG9uZT17dG9uZX1cbiAgICAgIGRhdGEtdmFyaWFudD17dmFyaWFudH1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICB7dG9uZSA9PT0gJ2dyYWRpZW50JyA/IGdyYWRpZW50RGVjb3JhdGlvbiA6IG51bGx9XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctN3hsXCI+XG4gICAgICAgIDxQcmljaW5nSGVhZGVyIGRlc2NyaXB0aW9uPXtkZXNjcmlwdGlvbn0gZXllYnJvdz17ZXllYnJvd30gdGl0bGU9e3RpdGxlfSB0b25lPXt0b25lfSAvPlxuICAgICAgICB7ZnJlcXVlbmNpZXM/Lmxlbmd0aCA/IChcbiAgICAgICAgICA8RnJlcXVlbmN5VG9nZ2xlXG4gICAgICAgICAgICBhY3RpdmVGcmVxdWVuY3k9e2FjdGl2ZUZyZXF1ZW5jeX1cbiAgICAgICAgICAgIGZyZXF1ZW5jaWVzPXtmcmVxdWVuY2llc31cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtzZXRBY3RpdmVGcmVxdWVuY3l9XG4gICAgICAgICAgICB0b25lPXt0b25lfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICB7dmFyaWFudCA9PT0gJ3NpbmdsZScgJiYgc2luZ2xlT2ZmZXIgPyAoXG4gICAgICAgICAgPFNpbmdsZVByaWNpbmcgc2luZ2xlT2ZmZXI9e3NpbmdsZU9mZmVyfSB0b25lPXt0b25lfSAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAge3ZhcmlhbnQgPT09ICdncmlkJyA/IChcbiAgICAgICAgICA8R3JpZFByaWNpbmdcbiAgICAgICAgICAgIGFjdGl2ZUZyZXF1ZW5jeT17YWN0aXZlRnJlcXVlbmN5fVxuICAgICAgICAgICAgY2FyZFN0eWxlPXtjYXJkU3R5bGV9XG4gICAgICAgICAgICBleHRyYU9mZmVyPXtleHRyYU9mZmVyfVxuICAgICAgICAgICAgZnJlcXVlbmNpZXM9e2ZyZXF1ZW5jaWVzfVxuICAgICAgICAgICAgdGllcnM9e3RpZXJzfVxuICAgICAgICAgICAgdG9uZT17dG9uZX1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAge3ZhcmlhbnQgPT09ICdjb21wYXJpc29uJyA/IChcbiAgICAgICAgICA8Q29tcGFyaXNvblByaWNpbmdcbiAgICAgICAgICAgIGFjdGl2ZUZyZXF1ZW5jeT17YWN0aXZlRnJlcXVlbmN5fVxuICAgICAgICAgICAgY2FyZFN0eWxlPXtjYXJkU3R5bGV9XG4gICAgICAgICAgICBjb21wYXJpc29uU2VjdGlvbnM9e2NvbXBhcmlzb25TZWN0aW9uc31cbiAgICAgICAgICAgIGZyZXF1ZW5jaWVzPXtmcmVxdWVuY2llc31cbiAgICAgICAgICAgIGxvZ29zPXtsb2dvc31cbiAgICAgICAgICAgIHRpZXJzPXt0aWVyc31cbiAgICAgICAgICAgIHRvbmU9e3RvbmV9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L2Rpdj5cbiAgICA8L3NlY3Rpb24+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgUHJpY2luZyA9IG1lbW8oUHJpY2luZ0NvbXBvbmVudCk7XG5QcmljaW5nLmRpc3BsYXlOYW1lID0gJ1ByaWNpbmcnO1xuIl0sIm5hbWVzIjpbImNuIiwibWVtbyIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkNoZWNrIiwiTWludXMiLCJQbHVzIiwiWCIsInRvbmVDbGFzc2VzIiwiZGFyayIsImRlZmF1bHQiLCJncmFkaWVudCIsImhlYWRlclRvbmVDbGFzc2VzIiwiZGVzY3JpcHRpb24iLCJleWVicm93IiwidGl0bGUiLCJmcmVxdWVuY3lTaGVsbENsYXNzZXMiLCJmcmVxdWVuY3lJdGVtQ2xhc3NlcyIsImNhcmRUb25lQ2xhc3NlcyIsImNvbnRyYXN0IiwiYm9keSIsImN0YSIsImZlYXR1cmVkQm9keSIsImZlYXR1cmVkQ3RhIiwibXV0ZWQiLCJzb2xpZCIsImZlYXR1cmVkVGV4dENsYXNzZXMiLCJ0b25lIiwiY2FyZFN0eWxlIiwibGlnaHRGZWF0dXJlZENhcmQiLCJiYWRnZSIsImljb24iLCJjb21wYXJpc29uUGFuZWxUb25lQ2xhc3NlcyIsImNvbXBhcmlzb25HcmlkQ2xhc3NlcyIsImNvbXBhcmlzb25Db2xDbGFzc2VzIiwiZ3JhZGllbnREZWNvcmF0aW9uIiwiZGl2IiwiYXJpYS1oaWRkZW4iLCJjbGFzc05hbWUiLCJzdHlsZSIsImNsaXBQYXRoIiwiZ2V0RGVmYXVsdEZyZXF1ZW5jeSIsImZyZXF1ZW5jaWVzIiwidGllcnMiLCJkZWZhdWx0RnJlcXVlbmN5IiwidmFsdWUiLCJmaXJzdFByaWNlIiwiZmluZCIsInRpZXIiLCJwcmljZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJnZXRQcmljZUZvclRpZXIiLCJhY3RpdmVGcmVxdWVuY3kiLCJ2YWx1ZXMiLCJnZXRQcmljZVN1ZmZpeEZvclRpZXIiLCJwcmljZVN1ZmZpeCIsImZyZXF1ZW5jeSIsInJlbmRlclRpZXJMaXN0IiwiZmVhdHVyZWQiLCJmZWF0dXJlZFRleHQiLCJoaWdobGlnaHRzIiwidWwiLCJyb2xlIiwibWFwIiwiaGlnaGxpZ2h0IiwibGkiLCJkaXNhYmxlZCIsInNwYW4iLCJmZWF0dXJlcyIsImZlYXR1cmUiLCJQcmljaW5nSGVhZGVyIiwiaDIiLCJwIiwiRnJlcXVlbmN5VG9nZ2xlIiwib25DaGFuZ2UiLCJmaWVsZHNldCIsImFyaWEtbGFiZWwiLCJjaGVja2VkIiwibGFiZWwiLCJpbnB1dCIsIm5hbWUiLCJ0eXBlIiwiR3JpZFByaWNpbmciLCJleHRyYU9mZmVyIiwiZ3JpZENvbHNDbGFzcyIsImNhcmRUb2tlbnMiLCJCb29sZWFuIiwic3VmZml4IiwiZGF0YS1mZWF0dXJlZCIsInVuZGVmaW5lZCIsImgzIiwiaWQiLCJwcmljZUNhcHRpb24iLCJocmVmIiwiY3RhTGFiZWwiLCJhIiwiYXJpYS1kZXNjcmliZWRieSIsImN0YVN1YnRpdGxlIiwiY3RhSHJlZiIsIlNpbmdsZVByaWNpbmciLCJzaW5nbGVPZmZlciIsImg0IiwiZmVhdHVyZUxhYmVsIiwicHJpY2VMYWJlbCIsIm5vdGUiLCJDb21wYXJpc29uVmFsdWUiLCJDb21wYXJpc29uUHJpY2luZyIsImNvbXBhcmlzb25TZWN0aW9ucyIsImxvZ29zIiwiYWN0aXZlTW9iaWxlVGllcklkIiwic2V0QWN0aXZlTW9iaWxlVGllcklkIiwiYWN0aXZlTW9iaWxlVGllciIsIk1hdGgiLCJtaW4iLCJtYXgiLCJsb2dvIiwiaW1nIiwiYWx0Iiwic3JjIiwidGFibGUiLCJjYXB0aW9uIiwiY29sZ3JvdXAiLCJjb2wiLCJ0aGVhZCIsInRyIiwidGQiLCJ0aCIsInNjb3BlIiwic2VjdGlvbiIsInRib2R5IiwiY29sU3BhbiIsImJ1dHRvbiIsIm9uQ2xpY2siLCJkbCIsImR0IiwiZGQiLCJQcmljaW5nQ29tcG9uZW50IiwidmFyaWFudCIsInByb3BzIiwiaW5pdGlhbEZyZXF1ZW5jeSIsInNldEFjdGl2ZUZyZXF1ZW5jeSIsImRhdGEtc2xvdCIsImRhdGEtdG9uZSIsImRhdGEtdmFyaWFudCIsIlByaWNpbmciLCJkaXNwbGF5TmFtZSJdLCJtYXBwaW5ncyI6IjtBQUFBLFNBQVFBLEVBQUUsUUFBTyxlQUFlO0FBQ2hDLFNBQVFDLElBQUksRUFBRUMsT0FBTyxFQUFFQyxRQUFRLFFBQU8sUUFBUTtBQUU5QyxTQUFRQyxLQUFLLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFQyxDQUFDLFFBQU8sdUJBQXVCO0FBeUYzRCxNQUFNQyxjQUEyQztJQUMvQ0MsTUFBTTtJQUNOQyxTQUFTO0lBQ1RDLFVBQVU7QUFDWjtBQUVBLE1BQU1DLG9CQUFnRztJQUNwR0gsTUFBTTtRQUNKSSxhQUFhO1FBQ2JDLFNBQVM7UUFDVEMsT0FBTztJQUNUO0lBQ0FMLFNBQVM7UUFDUEcsYUFBYTtRQUNiQyxTQUFTO1FBQ1RDLE9BQU87SUFDVDtJQUNBSixVQUFVO1FBQ1JFLGFBQWE7UUFDYkMsU0FBUztRQUNUQyxPQUFPO0lBQ1Q7QUFDRjtBQUVBLE1BQU1DLHdCQUFxRDtJQUN6RFAsTUFBTTtJQUNOQyxTQUFTO0lBQ1RDLFVBQVU7QUFDWjtBQUVBLE1BQU1NLHVCQUFvRDtJQUN4RFIsTUFBTTtJQUNOQyxTQUFTO0lBQ1RDLFVBQVU7QUFDWjtBQUVBLE1BQU1PLGtCQUF1SztJQUMzS1QsTUFBTTtRQUNKVSxVQUFVO1lBQ1JDLE1BQU07WUFDTkMsS0FBSztZQUNMQyxjQUFjO1lBQ2RDLGFBQWE7WUFDYkMsT0FBTztZQUNQVCxPQUFPO1FBQ1Q7UUFDQUwsU0FBUztZQUNQVSxNQUFNO1lBQ05DLEtBQUs7WUFDTEMsY0FBYztZQUNkQyxhQUFhO1lBQ2JDLE9BQU87WUFDUFQsT0FBTztRQUNUO1FBQ0FVLE9BQU87WUFDTEwsTUFBTTtZQUNOQyxLQUFLO1lBQ0xDLGNBQWM7WUFDZEMsYUFBYTtZQUNiQyxPQUFPO1lBQ1BULE9BQU87UUFDVDtJQUNGO0lBQ0FMLFNB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