@wrikka/create-docs 0.1.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 (380) hide show
  1. package/README.md +137 -0
  2. package/bin/cli.js +408 -0
  3. package/dist/index.cjs +20 -0
  4. package/dist/index.d.cts +475 -0
  5. package/dist/index.d.ts +475 -0
  6. package/dist/index.js +20 -0
  7. package/docs/_dir.yml +2 -0
  8. package/docs/config.md +75 -0
  9. package/docs/data-sources.md +88 -0
  10. package/docs/deploy.md +38 -0
  11. package/docs/features.md +51 -0
  12. package/docs/getting-started.md +42 -0
  13. package/docs/index.md +34 -0
  14. package/docs/markdown.md +154 -0
  15. package/docs/theming.md +53 -0
  16. package/package.json +142 -0
  17. package/scripts/generate-docs-index.ts +111 -0
  18. package/scripts/github-pull.ts +124 -0
  19. package/src/adapters/config/index.ts +1 -0
  20. package/src/adapters/config/node-config-loader.ts +36 -0
  21. package/src/adapters/fs/fs-docs-loader.ts +31 -0
  22. package/src/adapters/fs/index.ts +12 -0
  23. package/src/adapters/fs/memory-fs.ts +60 -0
  24. package/src/adapters/fs/node-fs.ts +116 -0
  25. package/src/adapters/git/index.ts +164 -0
  26. package/src/adapters/github/github-pull.ts +340 -0
  27. package/src/adapters/index.ts +6 -0
  28. package/src/adapters/velite.ts +112 -0
  29. package/src/adapters/vite/docs-watcher.ts +36 -0
  30. package/src/adapters/vite/index.ts +2 -0
  31. package/src/adapters/vite/polling-watcher.ts +89 -0
  32. package/src/code-block-enhancements/index.ts +3 -0
  33. package/src/config/index.ts +15 -0
  34. package/src/content/index.ts +11 -0
  35. package/src/content-validation/index.ts +5 -0
  36. package/src/index.ts +174 -0
  37. package/src/live-editor/index.ts +7 -0
  38. package/src/modules/analytics/application/plausible-adapter.ts +103 -0
  39. package/src/modules/analytics/application/umami-adapter.ts +109 -0
  40. package/src/modules/analytics/domain/events/index.ts +37 -0
  41. package/src/modules/analytics/domain/models/index.ts +35 -0
  42. package/src/modules/analytics/domain/operations/analytics-operations.ts +67 -0
  43. package/src/modules/analytics/domain/validators/index.ts +50 -0
  44. package/src/modules/analytics/index.ts +9 -0
  45. package/src/modules/analytics/ports/analytics-port.ts +17 -0
  46. package/src/modules/analytics/types/analytics.ts +16 -0
  47. package/src/modules/api-docs/application/type-docs-adapter.ts +34 -0
  48. package/src/modules/api-docs/domain/events/index.ts +42 -0
  49. package/src/modules/api-docs/domain/models/index.ts +40 -0
  50. package/src/modules/api-docs/domain/operations/api-docs-operations.ts +59 -0
  51. package/src/modules/api-docs/domain/validators/index.ts +56 -0
  52. package/src/modules/api-docs/index.ts +8 -0
  53. package/src/modules/api-docs/ports/api-docs-port.ts +21 -0
  54. package/src/modules/api-docs/types/api-docs.ts +15 -0
  55. package/src/modules/api-reference/openapi.ts +166 -0
  56. package/src/modules/api-reference/orpc.ts +94 -0
  57. package/src/modules/code-block-enhancements/application/usecases/index.ts +39 -0
  58. package/src/modules/code-block-enhancements/domain/code-operations.ts +72 -0
  59. package/src/modules/code-block-enhancements/domain/events/index.ts +58 -0
  60. package/src/modules/code-block-enhancements/domain/index.ts +11 -0
  61. package/src/modules/code-block-enhancements/domain/models/index.ts +36 -0
  62. package/src/modules/code-block-enhancements/domain/validators/index.ts +50 -0
  63. package/src/modules/code-block-enhancements/index.ts +10 -0
  64. package/src/modules/code-block-enhancements/ports/index.ts +18 -0
  65. package/src/modules/code-block-enhancements/types/index.ts +37 -0
  66. package/src/modules/code-execution/application/sandbox-adapter.ts +44 -0
  67. package/src/modules/code-execution/domain/events/index.ts +58 -0
  68. package/src/modules/code-execution/domain/models/index.ts +33 -0
  69. package/src/modules/code-execution/domain/operations/execution-operations.ts +60 -0
  70. package/src/modules/code-execution/domain/validators/index.ts +50 -0
  71. package/src/modules/code-execution/index.ts +8 -0
  72. package/src/modules/code-execution/ports/execution-port.ts +15 -0
  73. package/src/modules/code-execution/types/execution.ts +15 -0
  74. package/src/modules/comments/application/giscus-adapter.ts +55 -0
  75. package/src/modules/comments/domain/events/index.ts +55 -0
  76. package/src/modules/comments/domain/models/index.ts +30 -0
  77. package/src/modules/comments/domain/operations/comment-operations.ts +46 -0
  78. package/src/modules/comments/domain/validators/index.ts +50 -0
  79. package/src/modules/comments/index.ts +8 -0
  80. package/src/modules/comments/ports/comment-port.ts +18 -0
  81. package/src/modules/comments/types/comments.ts +19 -0
  82. package/src/modules/config/application/usecases/index.ts +1 -0
  83. package/src/modules/config/application/usecases/loadConfig.ts +38 -0
  84. package/src/modules/config/application/workflows/index.ts +1 -0
  85. package/src/modules/config/application/workflows/validateConfig.ts +14 -0
  86. package/src/modules/config/domain/events/index.ts +50 -0
  87. package/src/modules/config/domain/models/index.ts +9 -0
  88. package/src/modules/config/domain/operations/defaults.ts +74 -0
  89. package/src/modules/config/domain/operations/index.ts +2 -0
  90. package/src/modules/config/domain/operations/resolve.ts +40 -0
  91. package/src/modules/config/domain/validators/index.ts +152 -0
  92. package/src/modules/config/index.ts +23 -0
  93. package/src/modules/config/ports/index.ts +15 -0
  94. package/src/modules/config/types/index.ts +113 -0
  95. package/src/modules/config/types/public.ts +19 -0
  96. package/src/modules/content/application/cache/index.ts +6 -0
  97. package/src/modules/content/application/cache/parse-cache.ts +6 -0
  98. package/src/modules/content/application/cache/parseCache.ts +56 -0
  99. package/src/modules/content/application/usecases/index.ts +2 -0
  100. package/src/modules/content/application/usecases/load-doc-page.ts +1 -0
  101. package/src/modules/content/application/usecases/loadDocPage.ts +111 -0
  102. package/src/modules/content/application/usecases/scanDocsDir.ts +105 -0
  103. package/src/modules/content/application/workflows/index.ts +1 -0
  104. package/src/modules/content/application/workflows/processDocs.ts +51 -0
  105. package/src/modules/content/domain/events/index.ts +61 -0
  106. package/src/modules/content/domain/models/index.ts +13 -0
  107. package/src/modules/content/domain/operations/build-page.ts +146 -0
  108. package/src/modules/content/domain/operations/buildPage.ts +93 -0
  109. package/src/modules/content/domain/operations/index.ts +17 -0
  110. package/src/modules/content/domain/operations/parse.ts +241 -0
  111. package/src/modules/content/domain/validators/frontmatter.ts +82 -0
  112. package/src/modules/content/domain/validators/index.ts +6 -0
  113. package/src/modules/content/index.ts +27 -0
  114. package/src/modules/content/ports/index.ts +45 -0
  115. package/src/modules/content/ports/velite.ts +134 -0
  116. package/src/modules/content/types/index.ts +76 -0
  117. package/src/modules/content/types/public.ts +1 -0
  118. package/src/modules/content-linting/application/builtin-linting-adapter.ts +82 -0
  119. package/src/modules/content-linting/domain/events/index.ts +58 -0
  120. package/src/modules/content-linting/domain/models/index.ts +46 -0
  121. package/src/modules/content-linting/domain/operations/linting-operations.ts +82 -0
  122. package/src/modules/content-linting/domain/validators/index.ts +50 -0
  123. package/src/modules/content-linting/index.ts +8 -0
  124. package/src/modules/content-linting/ports/linting-port.ts +21 -0
  125. package/src/modules/content-linting/types/linting.ts +18 -0
  126. package/src/modules/content-validation/application/usecases/index.ts +18 -0
  127. package/src/modules/content-validation/domain/events/index.ts +7 -0
  128. package/src/modules/content-validation/domain/index.ts +16 -0
  129. package/src/modules/content-validation/domain/models/index.ts +33 -0
  130. package/src/modules/content-validation/domain/operations/index.ts +157 -0
  131. package/src/modules/content-validation/domain/types/index.ts +17 -0
  132. package/src/modules/content-validation/domain/validators/index.ts +8 -0
  133. package/src/modules/content-validation/index.ts +9 -0
  134. package/src/modules/content-validation/ports/index.ts +15 -0
  135. package/src/modules/content-validation/types/index.ts +5 -0
  136. package/src/modules/export/application/puppeteer-export-adapter.ts +63 -0
  137. package/src/modules/export/domain/events/index.ts +55 -0
  138. package/src/modules/export/domain/models/index.ts +38 -0
  139. package/src/modules/export/domain/operations/export-operations.ts +56 -0
  140. package/src/modules/export/domain/validators/index.ts +52 -0
  141. package/src/modules/export/index.ts +8 -0
  142. package/src/modules/export/ports/export-port.ts +15 -0
  143. package/src/modules/export/types/export.ts +15 -0
  144. package/src/modules/external-search/application/algolia-adapter.ts +182 -0
  145. package/src/modules/external-search/application/meilisearch-adapter.ts +161 -0
  146. package/src/modules/external-search/domain/events/index.ts +42 -0
  147. package/src/modules/external-search/domain/models/index.ts +42 -0
  148. package/src/modules/external-search/domain/operations/search-operations.ts +53 -0
  149. package/src/modules/external-search/domain/validators/index.ts +55 -0
  150. package/src/modules/external-search/index.ts +9 -0
  151. package/src/modules/external-search/ports/external-search-port.ts +23 -0
  152. package/src/modules/external-search/types/search.ts +19 -0
  153. package/src/modules/git-history/application/simple-git-adapter.ts +46 -0
  154. package/src/modules/git-history/domain/events/index.ts +34 -0
  155. package/src/modules/git-history/domain/models/index.ts +25 -0
  156. package/src/modules/git-history/domain/operations/git-history-operations.ts +56 -0
  157. package/src/modules/git-history/domain/validators/index.ts +52 -0
  158. package/src/modules/git-history/index.ts +8 -0
  159. package/src/modules/git-history/ports/git-history-port.ts +21 -0
  160. package/src/modules/git-history/types/git-history.ts +15 -0
  161. package/src/modules/i18n/application/fs-locale-loader.ts +39 -0
  162. package/src/modules/i18n/domain/events/index.ts +34 -0
  163. package/src/modules/i18n/domain/models/index.ts +34 -0
  164. package/src/modules/i18n/domain/operations/locale-operations.ts +74 -0
  165. package/src/modules/i18n/domain/validators/index.ts +52 -0
  166. package/src/modules/i18n/index.ts +8 -0
  167. package/src/modules/i18n/ports/locale-loader-port.ts +18 -0
  168. package/src/modules/i18n/types/locale.ts +17 -0
  169. package/src/modules/image-optimization/application/sharp-adapter.ts +58 -0
  170. package/src/modules/image-optimization/domain/events/index.ts +39 -0
  171. package/src/modules/image-optimization/domain/models/index.ts +27 -0
  172. package/src/modules/image-optimization/domain/operations/image-operations.ts +65 -0
  173. package/src/modules/image-optimization/domain/validators/index.ts +52 -0
  174. package/src/modules/image-optimization/index.ts +8 -0
  175. package/src/modules/image-optimization/ports/image-optimizer-port.ts +15 -0
  176. package/src/modules/image-optimization/types/image.ts +17 -0
  177. package/src/modules/live-editor/application/usecases/index.ts +60 -0
  178. package/src/modules/live-editor/domain/events/index.ts +37 -0
  179. package/src/modules/live-editor/domain/gitOperations.ts +110 -0
  180. package/src/modules/live-editor/domain/index.ts +15 -0
  181. package/src/modules/live-editor/domain/models/index.ts +21 -0
  182. package/src/modules/live-editor/domain/validators/index.ts +55 -0
  183. package/src/modules/live-editor/index.ts +14 -0
  184. package/src/modules/live-editor/ports/index.ts +49 -0
  185. package/src/modules/live-editor/types/index.ts +80 -0
  186. package/src/modules/live-preview/application/vite-preview-adapter.ts +20 -0
  187. package/src/modules/live-preview/domain/operations/preview-operations.ts +56 -0
  188. package/src/modules/live-preview/index.ts +8 -0
  189. package/src/modules/live-preview/ports/preview-port.ts +20 -0
  190. package/src/modules/live-preview/types/preview.ts +16 -0
  191. package/src/modules/mdx/application/mdx-js-adapter.ts +38 -0
  192. package/src/modules/mdx/domain/operations/parse-mdx.ts +43 -0
  193. package/src/modules/mdx/index.ts +8 -0
  194. package/src/modules/mdx/ports/mdx-parser-port.ts +15 -0
  195. package/src/modules/mdx/types/mdx.ts +14 -0
  196. package/src/modules/navigation/application/usecases/buildNav.ts +15 -0
  197. package/src/modules/navigation/application/usecases/buildSidebar.ts +45 -0
  198. package/src/modules/navigation/application/usecases/index.ts +2 -0
  199. package/src/modules/navigation/domain/events/index.ts +30 -0
  200. package/src/modules/navigation/domain/models/index.ts +7 -0
  201. package/src/modules/navigation/domain/operations/group.ts +79 -0
  202. package/src/modules/navigation/domain/operations/index.ts +10 -0
  203. package/src/modules/navigation/domain/operations/sort.ts +27 -0
  204. package/src/modules/navigation/domain/shared/utils/array.ts +39 -0
  205. package/src/modules/navigation/domain/validators/index.ts +88 -0
  206. package/src/modules/navigation/index.ts +15 -0
  207. package/src/modules/navigation/ports/index.ts +9 -0
  208. package/src/modules/navigation/types/index.ts +38 -0
  209. package/src/modules/navigation/types/public.ts +9 -0
  210. package/src/modules/openapi/application/swagger-parser-adapter.ts +178 -0
  211. package/src/modules/openapi/domain/operations/parse-openapi.ts +46 -0
  212. package/src/modules/openapi/index.ts +8 -0
  213. package/src/modules/openapi/ports/openapi-parser-port.ts +15 -0
  214. package/src/modules/openapi/types/openapi.ts +37 -0
  215. package/src/modules/plugin/application/usecases/build-virtual-modules.ts +53 -0
  216. package/src/modules/plugin/application/usecases/index.ts +1 -0
  217. package/src/modules/plugin/application/workflows/build-docs.ts +79 -0
  218. package/src/modules/plugin/application/workflows/index.ts +1 -0
  219. package/src/modules/plugin/domain/events/index.ts +62 -0
  220. package/src/modules/plugin/domain/models/index.ts +1 -0
  221. package/src/modules/plugin/domain/operations/build-virtual.ts +76 -0
  222. package/src/modules/plugin/domain/operations/index.ts +11 -0
  223. package/src/modules/plugin/domain/validators/index.ts +30 -0
  224. package/src/modules/plugin/index.ts +14 -0
  225. package/src/modules/plugin/ports/index.ts +21 -0
  226. package/src/modules/plugin/types/index.ts +27 -0
  227. package/src/modules/plugin/types/public.ts +1 -0
  228. package/src/modules/search/application/usecases/index.ts +1 -0
  229. package/src/modules/search/application/usecases/indexPages.ts +15 -0
  230. package/src/modules/search/domain/events/index.ts +32 -0
  231. package/src/modules/search/domain/models/index.ts +1 -0
  232. package/src/modules/search/domain/operations/build-index.ts +6 -0
  233. package/src/modules/search/domain/operations/buildIndex.ts +70 -0
  234. package/src/modules/search/domain/operations/index.ts +7 -0
  235. package/src/modules/search/domain/operations/query.ts +186 -0
  236. package/src/modules/search/domain/validators/index.ts +32 -0
  237. package/src/modules/search/index.ts +9 -0
  238. package/src/modules/search/types/index.ts +22 -0
  239. package/src/modules/search/types/public.ts +1 -0
  240. package/src/modules/search-analytics/application/local-storage-adapter.ts +68 -0
  241. package/src/modules/search-analytics/domain/operations/search-analytics-operations.ts +74 -0
  242. package/src/modules/search-analytics/index.ts +8 -0
  243. package/src/modules/search-analytics/ports/search-analytics-port.ts +20 -0
  244. package/src/modules/search-analytics/types/search-analytics.ts +16 -0
  245. package/src/modules/search-highlighting/application/dom-highlighting-adapter.ts +36 -0
  246. package/src/modules/search-highlighting/domain/operations/highlighting-operations.ts +72 -0
  247. package/src/modules/search-highlighting/index.ts +8 -0
  248. package/src/modules/search-highlighting/ports/highlighting-port.ts +14 -0
  249. package/src/modules/search-highlighting/types/highlighting.ts +15 -0
  250. package/src/modules/seo-optimization/application/usecases/index.ts +18 -0
  251. package/src/modules/seo-optimization/domain/index.ts +12 -0
  252. package/src/modules/seo-optimization/domain/seoOperations.ts +92 -0
  253. package/src/modules/seo-optimization/index.ts +8 -0
  254. package/src/modules/seo-optimization/ports/index.ts +18 -0
  255. package/src/modules/seo-optimization/types/index.ts +41 -0
  256. package/src/modules/theme/application/css-theme-adapter.ts +50 -0
  257. package/src/modules/theme/domain/operations/theme-operations.ts +68 -0
  258. package/src/modules/theme/index.ts +8 -0
  259. package/src/modules/theme/ports/theme-port.ts +8 -0
  260. package/src/modules/theme/types/theme.ts +12 -0
  261. package/src/modules/toc/application/markdown-toc-adapter.ts +106 -0
  262. package/src/modules/toc/domain/operations/toc-operations.ts +92 -0
  263. package/src/modules/toc/index.ts +8 -0
  264. package/src/modules/toc/ports/toc-port.ts +21 -0
  265. package/src/modules/toc/types/toc.ts +17 -0
  266. package/src/modules/toc-generator/application/usecases/index.ts +30 -0
  267. package/src/modules/toc-generator/domain/index.ts +12 -0
  268. package/src/modules/toc-generator/domain/tocOperations.ts +104 -0
  269. package/src/modules/toc-generator/index.ts +9 -0
  270. package/src/modules/toc-generator/ports/index.ts +20 -0
  271. package/src/modules/toc-generator/types/index.ts +50 -0
  272. package/src/modules/version-control/domain/events/index.ts +39 -0
  273. package/src/modules/version-control/domain/models/index.ts +25 -0
  274. package/src/modules/version-control/domain/validators/index.ts +50 -0
  275. package/src/modules/versioning/application/fs-version-loader.ts +44 -0
  276. package/src/modules/versioning/domain/operations/versioning-operations.ts +80 -0
  277. package/src/modules/versioning/index.ts +8 -0
  278. package/src/modules/versioning/ports/version-loader-port.ts +18 -0
  279. package/src/modules/versioning/types/versioning.ts +17 -0
  280. package/src/modules/workflow/domain/events/index.ts +55 -0
  281. package/src/modules/workflow/domain/models/index.ts +40 -0
  282. package/src/modules/workflow/domain/validators/index.ts +50 -0
  283. package/src/modules/yaml-parser/application/js-yaml-adapter.ts +34 -0
  284. package/src/modules/yaml-parser/domain/operations/parse-yaml.ts +58 -0
  285. package/src/modules/yaml-parser/index.ts +7 -0
  286. package/src/modules/yaml-parser/ports/yaml-parser-port.ts +18 -0
  287. package/src/navigation/index.ts +9 -0
  288. package/src/plugin/index.ts +4 -0
  289. package/src/presentation/index.ts +1 -0
  290. package/src/presentation/live-editor/index.ts +22 -0
  291. package/src/presentation/live-editor/live-editor-component.ts +219 -0
  292. package/src/presentation/live-editor/virtual-module.ts +16 -0
  293. package/src/presentation/solid/CodeBlock.tsx +120 -0
  294. package/src/presentation/solid/Toc.tsx +58 -0
  295. package/src/presentation/solid/index.ts +11 -0
  296. package/src/presentation/vite-plugin/docs-plugin.ts +212 -0
  297. package/src/presentation/vite-plugin/index.ts +9 -0
  298. package/src/presentation/vite-plugin/transform-markdown.ts +26 -0
  299. package/src/runtime/analytics.ts +59 -0
  300. package/src/runtime/api-diff.ts +115 -0
  301. package/src/runtime/app.tsx +32 -0
  302. package/src/runtime/components/AccentPicker.tsx +114 -0
  303. package/src/runtime/components/ApiPlayground.tsx +332 -0
  304. package/src/runtime/components/AskAiDialog.tsx +127 -0
  305. package/src/runtime/components/BackToTop.tsx +38 -0
  306. package/src/runtime/components/Banner.tsx +75 -0
  307. package/src/runtime/components/Breadcrumbs.tsx +42 -0
  308. package/src/runtime/components/CollectionDropdown.tsx +85 -0
  309. package/src/runtime/components/CustomizeDrawer.tsx +195 -0
  310. package/src/runtime/components/DocMarkdown.tsx +579 -0
  311. package/src/runtime/components/DocPrevNext.tsx +54 -0
  312. package/src/runtime/components/DocToc.tsx +147 -0
  313. package/src/runtime/components/DocsDropdown.tsx +184 -0
  314. package/src/runtime/components/Footer.tsx +52 -0
  315. package/src/runtime/components/GitHubAuth.tsx +82 -0
  316. package/src/runtime/components/GitHubStats.tsx +73 -0
  317. package/src/runtime/components/Head.tsx +225 -0
  318. package/src/runtime/components/LocaleDropdown.tsx +75 -0
  319. package/src/runtime/components/MobileBottomNav.tsx +111 -0
  320. package/src/runtime/components/NotFound.tsx +139 -0
  321. package/src/runtime/components/PageActions.tsx +144 -0
  322. package/src/runtime/components/RelatedDocs.tsx +50 -0
  323. package/src/runtime/components/ScrollProgress.tsx +32 -0
  324. package/src/runtime/components/SearchPalette.tsx +333 -0
  325. package/src/runtime/components/ShowcaseCard.tsx +87 -0
  326. package/src/runtime/components/SidebarNav.tsx +237 -0
  327. package/src/runtime/components/Skeleton.tsx +39 -0
  328. package/src/runtime/components/ThemeToggle.tsx +26 -0
  329. package/src/runtime/components/TopNav.tsx +270 -0
  330. package/src/runtime/components/VersionDropdown.tsx +189 -0
  331. package/src/runtime/components/markdown/components.ts +280 -0
  332. package/src/runtime/config.ts +225 -0
  333. package/src/runtime/content.ts +451 -0
  334. package/src/runtime/context.tsx +30 -0
  335. package/src/runtime/data.ts +93 -0
  336. package/src/runtime/github.ts +226 -0
  337. package/src/runtime/icons.ts +32 -0
  338. package/src/runtime/index.ts +153 -0
  339. package/src/runtime/layouts/DocsLayout.tsx +144 -0
  340. package/src/runtime/markdown-content.css +996 -0
  341. package/src/runtime/pages/AbTestPage.tsx +88 -0
  342. package/src/runtime/pages/AnalyticsPage.tsx +90 -0
  343. package/src/runtime/pages/ApiDiffPage.tsx +86 -0
  344. package/src/runtime/pages/ApiEndpointPage.tsx +248 -0
  345. package/src/runtime/pages/BuilderPage.tsx +150 -0
  346. package/src/runtime/pages/ChangelogPage.tsx +210 -0
  347. package/src/runtime/pages/CollectionPage.tsx +140 -0
  348. package/src/runtime/pages/CommunityPage.tsx +384 -0
  349. package/src/runtime/pages/CreatePage.tsx +448 -0
  350. package/src/runtime/pages/DocPage.tsx +193 -0
  351. package/src/runtime/pages/EditPage.tsx +201 -0
  352. package/src/runtime/pages/HomePage.tsx +187 -0
  353. package/src/runtime/pages/IssuesPage.tsx +140 -0
  354. package/src/runtime/pages/OAuthCallbackPage.tsx +80 -0
  355. package/src/runtime/pages/PluginsPage.tsx +249 -0
  356. package/src/runtime/pages/ShowcasePage.tsx +202 -0
  357. package/src/runtime/pwa.ts +39 -0
  358. package/src/runtime/router.tsx +192 -0
  359. package/src/runtime/seo.ts +192 -0
  360. package/src/runtime/theme.css +175 -0
  361. package/src/runtime/theme.ts +224 -0
  362. package/src/runtime/types.ts +217 -0
  363. package/src/search/index.ts +6 -0
  364. package/src/seo-optimization/index.ts +4 -0
  365. package/src/shared/constants/index.ts +26 -0
  366. package/src/shared/errors/index.ts +195 -0
  367. package/src/shared/index.ts +27 -0
  368. package/src/shared/types/brand.ts +14 -0
  369. package/src/shared/types/client.d.ts +45 -0
  370. package/src/shared/types/either.ts +38 -0
  371. package/src/shared/types/index.ts +42 -0
  372. package/src/shared/types/option.ts +52 -0
  373. package/src/shared/types/result.ts +81 -0
  374. package/src/shared/utils/array.ts +97 -0
  375. package/src/shared/utils/index.ts +46 -0
  376. package/src/shared/utils/object.ts +47 -0
  377. package/src/shared/utils/string.ts +74 -0
  378. package/src/toc-generator/index.ts +1 -0
  379. package/src/types/js-yaml.d.ts +42 -0
  380. package/src/worker.ts +462 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,20 @@
1
+ // @bun @bun-cjs
2
+ (function(exports, require, module, __filename, __dirname) {var ir=Object.create;var{getPrototypeOf:sr,defineProperty:V,getOwnPropertyNames:dt,getOwnPropertyDescriptor:ar}=Object,he=Object.prototype.hasOwnProperty;function pt(e){return this[e]}var cr,lr,w=(e,t,r)=>{var o=e!=null&&typeof e==="object";if(o){var n=t?cr??=new WeakMap:lr??=new WeakMap,i=n.get(e);if(i)return i}r=e!=null?ir(sr(e)):{};let s=t||!e||!e.__esModule||!he.call(e,"default")?V(r,"default",{value:e,enumerable:!0}):r;if(e&&typeof e==="object"||typeof e==="function"){for(let a of dt(e))if(!he.call(s,a))V(s,a,{get:pt.bind(e,a),enumerable:!0})}if(o)n.set(e,s);return s},dr=(e)=>{var t=(lt??=new WeakMap).get(e),r;if(t)return t;if(t=V({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var o of dt(e))if(!he.call(t,o))V(t,o,{get:pt.bind(e,o),enumerable:!(r=ar(e,o))||r.enumerable})}return lt.set(e,t),t},lt;var pr=(e)=>e;function ur(e,t){this[e]=pr.bind(null,t)}var mr=(e,t)=>{for(var r in t)V(e,r,{get:t[r],enumerable:!0,configurable:!0,set:ur.bind(t,r)})};var Wr={};mr(Wr,{DEFAULT_BASE_ROUTE:()=>F,DEFAULT_DOCS_DIR:()=>I,PLUGIN_NAME:()=>C,SUPPORTED_EXTENSIONS:()=>M,VIRTUAL_PREFIX:()=>U,buildDocPage:()=>Mt,buildDocPageFromRaw:()=>Ot,buildNav:()=>Bt,buildSearchIndex:()=>qt,buildSidebar:()=>Ut,buildVirtualModules:()=>zt,commitAndPush:()=>Vt,createFsDocsLoader:()=>H,createMemoryDirectoryScanner:()=>Oe,createMemoryFileReader:()=>Me,createNodeConfigLoader:()=>Ne,createNodeDocsWatcher:()=>Y,default:()=>rt,defaultDocsConfig:()=>At,docsPlugin:()=>ge,enhanceCodeBlocks:()=>Ct,err:()=>m,formatGroupTitle:()=>Gt,generateFlatToc:()=>at,generateToc:()=>fe,groupDocsByFolder:()=>Wt,indexPages:()=>er,isErr:()=>Se,isMarkdownPath:()=>Ht,isNone:()=>ke,isOk:()=>be,isSome:()=>we,isVirtualDocsModule:()=>Kt,left:()=>ve,loadEditorState:()=>$t,memoryFileSystem:()=>Fe,nodeDirectoryScanner:()=>K,nodeFileReader:()=>A,nodeFileWatcher:()=>Le,none:()=>Re,ok:()=>d,optimizeSeo:()=>or,pageToSearchEntry:()=>tr,parseFrontmatter:()=>Lt,resolveConfig:()=>It,right:()=>Ee,saveFile:()=>_t,search:()=>rr,some:()=>Pe,transformMarkdown:()=>ot,validate:()=>Nt,validateDocsConfig:()=>Ft});module.exports=dr(Wr);var ce=w(require("path"),1);var _=(e)=>e,B=(e)=>e,h=(e)=>e;var xe=(e,t,r)=>{let o={kind:e,message:t,docsUrl:`https://create-docs.dev/errors/${e.replace(/_/g,"-")}`};if(r?.cause!==void 0)o.cause=r.cause;if(r?.context!==void 0)o.context=r.context;if(r?.path!==void 0)o.path=r.path;if(r?.hint!==void 0)o.hint=r.hint;if(r?.suggestions!==void 0)o.suggestions=r.suggestions;return o},x=(e,t)=>xe("file_not_found",`File not found: ${e}`,{cause:t,context:{path:e},hint:"Check that the docsDir option points to an existing directory."}),q=(e,t,r)=>xe("parse_error",t,{cause:r,context:{path:e},hint:"Verify the frontmatter is delimited by '---' on its own line."});var ee=(e,t,r)=>xe("io_error",t,{cause:r,context:{path:e}});var d=(e)=>({ok:!0,value:e}),m=(e)=>({ok:!1,error:e}),be=(e)=>e.ok,Se=(e)=>!e.ok;var ae=w(require("path"),1);class te{max;map=new Map;constructor(e=1024){this.max=e}get(e){return this.map.get(e)}set(e,t){if(this.map.has(e))this.map.delete(e);if(this.map.set(e,t),this.map.size>this.max){let r=this.map.keys().next().value;if(r!==void 0)this.map.delete(r)}}has(e){return this.map.has(e)}clear(){this.map.clear()}get size(){return this.map.size}}var De=(e,t)=>e.endsWith(t)?e.slice(0,-t.length):e;var E=(e)=>e.replace(/\\/g,"/");var ut=(e)=>e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1),mt=(e)=>e.split(/[-_\s]+/).filter((t)=>t.length>0).map((t)=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ");var gt=(e,t,r="...")=>e.length<=t?e:`${e.slice(0,Math.max(0,t-r.length))}${r}`,ft=(e)=>e.split(/\r?\n/),re=(e)=>{let t=e.trim();if(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))return t.slice(1,-1);return t};var gr=(e)=>{let t=[],r=new Set;for(let o of e.split(/\r?\n/)){let n=o.match(/^(#{1,6})\s+(.+)$/);if(!n)continue;let i=n[1].length,a=n[2].trim().replace(/\[([^\]]+)\]\([^)]+\)/g,"$1").replace(/[*_`]/g,""),l=a.toLowerCase().replace(/[^a-z0-9\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"");if(!l)l=`heading-${t.length}`;if(r.has(l)){let c=1,p=`${l}-${c}`;while(r.has(p))c++,p=`${l}-${c}`;l=p}r.add(l),t.push({id:l,text:a,depth:i})}return t},fr=(e,t,r)=>{if(typeof e.title==="string"&&e.title.trim())return e.title.trim();let n=(t.split(/[/\\]/).pop()??r).replace(/\.mdx?$/i,""),i=n.replace(/[-_]/g," ").split(" ").pop()??n;return i.charAt(0).toUpperCase()+i.slice(1)},yr=(e,t)=>{if(typeof e.category==="string"&&e.category.trim())return e.category.trim();let r=t.split("/")[0];if(r&&r!==t)return r;return},hr=(e,t,r)=>{let o=e.replace(/[#*_`[\](){}|]/g," ").split(/\s+/).filter((s)=>s.length>0).length;return{readingTime:Math.max(1,Math.round(o/200)),wordCount:o,...t!==void 0?{lastModified:new Date(t).toISOString()}:{},...r!==void 0?{editUrl:r}:{}}};var yt=(e)=>{let{slug:t,filePath:r,parsed:o,lastModifiedMs:n,editUrl:i}=e,s=fr(o.frontmatter,r,t),a=typeof o.frontmatter.description==="string"?o.frontmatter.description:void 0,l=yr(o.frontmatter,t),c=typeof o.frontmatter.order==="number"?o.frontmatter.order:0,p=gr(o.content),u=t.replace(/\//g,"-");return{id:B(u),slug:_(t),title:s,description:a,frontmatter:o.frontmatter,content:o.content,rawContent:o.rawContent,filePath:h(r),group:l,order:c,toc:p,metadata:hr(o.content,n,i)}};var I="docs",F="/docs";var U="virtual:docs/",C="vite-plugin-docs",M=[".md",".mdoc"],Te="---",ht=500,xt="Documentation";var G=(e)=>typeof e==="string";var ve=(e)=>({tag:"left",left:e}),Ee=(e)=>({tag:"right",right:e});var Pe=(e)=>({kind:"some",value:e}),Re=()=>({kind:"none"}),we=(e)=>e.kind==="some",ke=(e)=>e.kind==="none";var k=require("js-yaml"),bt=(e)=>{try{let t=k.load(e,{schema:k.JSON_SCHEMA});return d(t)}catch(t){let r=t instanceof Error?t.message:"Unknown error",o=t instanceof k.YAMLException?t.mark?.line:void 0,n=t instanceof k.YAMLException?t.mark?.column:void 0;return m({kind:"yaml-parse-error",message:r,line:o,column:n})}};var br=(e)=>{let t=re(e);if(t==="true")return!0;if(t==="false")return!1;if(t==="null"||t==="~")return null;if(t==="")return"";if(/^-?\d+$/.test(t))return Number.parseInt(t,10);if(/^-?\d*\.\d+$/.test(t))return Number.parseFloat(t);return t},Sr=(e)=>{let t=e.slice(1,-1).trim();if(t.length===0)return[];return t.split(",").map((r)=>re(r.trim())).filter((r)=>r.length>0)},St=(e)=>{let t=e.join(`
3
+ `),r=bt(t);if(r.ok&&typeof r.value==="object"&&r.value!==null)return r.value;let o={},n=0;while(n<e.length){let i=e[n]??"",s=i.trim();if(s.length===0||s.startsWith("#")){n++;continue}let a=i.indexOf(":");if(a<0){n++;continue}let l=i.slice(0,a).trim(),c=i.slice(a+1).trim();if(c===""||c==="|"||c===">"){let p=[];n++;while(n<e.length){let u=e[n]??"";if(!u.trim().startsWith("-"))break;p.push(re(u.trim().slice(1).trim())),n++}if(p.length>0)o[l]=p;continue}if(c.startsWith("[")&&c.endsWith("]"))o[l]=Sr(c);else o[l]=br(c);n++}return o},W=(e)=>{let t=ft(e);if(t[0]?.trim()!==Te)return{frontmatter:{},content:e,rawContent:e};let r=-1;for(let a=1;a<t.length;a++)if(t[a]?.trim()===Te){r=a;break}if(r===-1)return{frontmatter:{},content:e,rawContent:e};let o=t.slice(1,r),n=t.slice(r+1),i=St(o),s=n.join(`
4
+ `);return{frontmatter:i,content:s,rawContent:e}};var oe=(e)=>{let t=e.split("/");return t.length>1?t[0]:void 0},ne=(e)=>e.replace(/[/\\]/g,"-").replace(/^-/,""),Ce=(e)=>De(De(e,".mdoc"),".md"),O=(e)=>e.endsWith(".md")||e.endsWith(".mdoc");var Ae=async(e)=>{let{reader:t,docsDir:r,slug:o,editLink:n,cache:i}=e,s=`${E(r).replace(/\/$/,"")}/${o}.md`,a=h(s);if(!await t.exists(a)){let c=h(`${E(r).replace(/\/$/,"")}/${o}.mdoc`);if(!await t.exists(c))return m(x(s));return Dt(t,c,o,n,i)}return Dt(t,a,o,n,i)},Dt=async(e,t,r,o,n)=>{let i=await e.stat(t);if(i.ok&&n){let v=`${t}@${i.value.mtimeMs.toFixed(0)}:${i.value.size}`,P=n.get(v);if(P)return d(P)}let s=await e.read(t);if(!s.ok)return s;let a=s.value,l=t.split(/[/\\]/).pop()??"";if(!O(l))return m(q(t,"Not a markdown file"));let c=W(a),p=i.ok?i.value.mtimeMs:void 0,u=Dr(String(t),o),y=yt({slug:r,filePath:t,parsed:c,...p!==void 0?{lastModifiedMs:p}:{},...u!==void 0?{editUrl:u}:{}});if(i.ok&&n){let v=`${t}@${i.value.mtimeMs.toFixed(0)}:${i.value.size}`;n.set(v,y)}return d(y)},Dr=(e,t)=>{if(!t||t.enabled===!1)return;let r=t.baseUrl??"";if(r.length===0)return;let o=t.branch??"main",i=e.replace(/\\/g,"/").replace(/^\/+/,""),s=i.startsWith("docs/")?i.slice(5):i;return`${r.replace(/\/$/,"")}/edit/${o}/${s}`};var Ie=async(e)=>{let{scanner:t,reader:r,docsDir:o}=e;if(!await r.exists(h(o)))return m(x(o));let i=await Tt(t,o),s=[];for(let a of i){let l=await r.read(h(a));if(!l.ok)continue;let c=l.value,p=a.split(/[/\\]/).pop()??"";if(!O(p))continue;let u=E(a).slice(E(o).length).replace(/^\//,""),y=Ce(u),v=B(ne(y)),P=oe(y),ye=Tr(c);s.push({id:v,slug:_(y),frontmatter:{},rawContent:c,filePath:h(a),...P!==void 0?{group:P}:{},order:ye})}return s.sort((a,l)=>a.order-l.order),d(s)},Tr=(e)=>{let t=e.split(`
5
+ `);if(t[0]?.trim()!=="---")return Number.MAX_SAFE_INTEGER;let r=-1;for(let o=1;o<t.length;o++)if(t[o]?.trim()==="---"){r=o;break}if(r===-1)return Number.MAX_SAFE_INTEGER;for(let o=1;o<r;o++){let i=(t[o]??"").match(/^order:\s*(\d+)/);if(i?.[1])return Number.parseInt(i[1],10)}return Number.MAX_SAFE_INTEGER},Tt=async(e,t)=>{let r=await e.list(t);if(!r.ok)return[];let o=[];for(let n of r.value)if(n.isDirectory)o.push(...await Tt(e,n.path));else if(O(n.name))o.push(n.path);return o};var ie=async(e)=>{let t=await Ie({scanner:e.scanner,reader:e.reader,docsDir:e.docsDir});if(!t.ok)return t;let r=[];for(let o of t.value){let n=typeof o.slug==="string"?o.slug:String(o.slug),i=await Ae({reader:e.reader,docsDir:e.docsDir,slug:n,...e.editLink!==void 0?{editLink:e.editLink}:{},...e.cache!==void 0?{cache:e.cache}:{}});if(i.ok)r.push(i.value)}return d(r)};var se=require("arktype"),En=se.type("'default' | 'primary' | 'success' | 'warning' | 'danger'"),Pn=se.type("string").narrow((e)=>e.trim().length>0),Rn=se.type("number").narrow((e)=>Number.isFinite(e));var H=()=>({async loadAll(e){let t=A,r=K,o=ae.isAbsolute(e.docsDir)?e.docsDir:ae.resolve(process.cwd(),e.docsDir);return ie({scanner:r,reader:t,docsDir:o,editLink:e.editLink})}});var Fe=(e,t)=>({files:e,directories:t}),Me=(e)=>({async read(t){let r=e.files.get(String(t));if(r===void 0)return m(x(String(t)));return d(r)},async exists(t){return e.files.has(String(t))},async stat(t){let r=e.files.get(String(t));if(r===void 0)return m(x(String(t)));return d({mtimeMs:0,size:r.length})}}),Oe=(e)=>({async list(t){let r=e.directories.get(t);if(r===void 0)return m(x(t));return d(r.map((o)=>({name:o,isDirectory:!o.includes("."),path:`${t.replace(/\/$/,"")}/${o}`})))}});var T=w(require("fs/promises"),1),j=w(require("path"),1);var A={async read(e){try{let t=await T.readFile(String(e),"utf-8");return d(t)}catch(t){if(t.code==="ENOENT")return m(x(String(e),t));return m(ee(String(e),"Failed to read file",t))}},async exists(e){try{return await T.access(String(e)),!0}catch{return!1}},async stat(e){try{let t=await T.stat(String(e));return d({mtimeMs:t.mtimeMs,size:t.size})}catch(t){if(t.code==="ENOENT")return m(x(String(e),t));return m(ee(String(e),"Failed to stat file",t))}}},K={async list(e){try{let t=await T.readdir(e,{withFileTypes:!0});return d(t.map((r)=>({name:r.name,isDirectory:r.isDirectory(),path:j.join(e,r.name)})))}catch(t){if(t.code==="ENOENT")return m(x(e,t));return m(ee(e,"Failed to read directory",t))}}},Le={watch(e,t){let r=new AbortController,o=T.watch(e,{recursive:!0,signal:r.signal})[Symbol.asyncIterator]();return(async()=>{try{for await(let i of o){let s=i.filename;if(typeof s==="string"&&(s.endsWith(".md")||s.endsWith(".mdoc")))t.onChange(s)}}catch(i){t.onError(i)}})(),{close:()=>{r.abort()}}}};var Ne=()=>({async load(e,t){let r=ce.isAbsolute(t)?t:ce.join(e,t),o=h(r);if(!await A.exists(o))return d(null);try{let s=await import(new URL(`file:///${r.replace(/\\/g,"/")}`).href);return d(s.default??{})}catch(i){return m(q(r,"Failed to load config",i))}}});var Ar=w(require("simple-git"),1);var vt=require("velite"),Et=(e={})=>{let{configPath:t="velite.config.ts",watch:r=!1}=e;return{build:async()=>{try{return await vt.build({config:t,watch:r}),{success:!0,outputDir:".velite",assetsDir:"public/static"}}catch(n){return{success:!1,error:n instanceof Error?n.message:String(n)}}},configPath:t,watch:r}},pi=Et(),Pt=async(e={})=>Et(e).build();var Rt=w(require("fs/promises"),1);var Y=()=>({watch(e,t){let r=new AbortController,o=Rt.watch(e,{recursive:!0,signal:r.signal})[Symbol.asyncIterator]();return(async()=>{try{for await(let i of o){let s=i.filename;if(typeof s!=="string")return;if(!M.some((a)=>s.endsWith(a)))return;t(s)}}catch{}})(),{close:()=>{r.abort()}}}});var le=w(require("fs/promises"),1),kt=w(require("path"),1);var Ir=(e)=>M.some((t)=>e.endsWith(t)),wt=async(e)=>{let t=new Map,r=async(o)=>{let n;try{n=await le.readdir(o,{withFileTypes:!0})}catch{return}for(let i of n){let s=kt.join(o,i.name);if(i.isDirectory())await r(s);else if(i.isFile()&&Ir(i.name))try{let a=await le.stat(s);t.set(s,{mtimeMs:a.mtimeMs,size:a.size})}catch{}}};return await r(e),t},Ve=(e={})=>{let t=e.intervalMs??300;return{watch(r,o){let n=!1,i=wt(r),s=async()=>{if(n)return;let a=await wt(r),l=await i;for(let[c,p]of a){let u=l.get(c);if(!u||u.mtimeMs!==p.mtimeMs||u.size!==p.size)o(c)}for(let c of l.keys())if(!a.has(c))o(c);if(i=Promise.resolve(a),!n)setTimeout(s,t)};return s(),{close:()=>{n=!0}}}}};var Ct=()=>null;var At=()=>null,It=()=>null,Ft=()=>null;var Mt=()=>null,Ot=()=>null,Lt=()=>null;var Nt=()=>null;var Vt=()=>null,$t=()=>null,_t=()=>null;var Bt=()=>null,Ut=()=>null,Gt=()=>null,Wt=()=>null;var zt=()=>null,Ht=()=>null,Kt=()=>null;var S={site:{title:"Documentation",description:"Documentation and guides",logo:"/logo.svg",github:"",twitter:"",version:"1.0.0"},nav:[{title:"Product",items:[{label:"Getting Started",href:"/docs/getting-started/introduction"},{label:"Installation",href:"/docs/getting-started/installation"},{label:"Features",href:"/docs/product/features"},{label:"Configuration",href:"/docs/product/configuration"}]},{title:"Resources",items:[{label:"FAQ",href:"/docs/resources/faq"},{label:"Best Practices",href:"/docs/resources/best-practices"},{label:"Troubleshooting",href:"/docs/resources/troubleshooting"},{label:"Integrations",href:"/docs/resources/integrations"}]},{title:"API",items:[{label:"Overview",href:"/docs/api/overview"},{label:"Authentication",href:"/docs/api/authentication"},{label:"Endpoints",href:"/docs/api/endpoints"},{label:"API Tester",href:"/docs/api/tester"}]}],sidebar:[],theme:{primaryColor:"#3B82F6",darkMode:!0,accentColor:"#8B5CF6",codeTheme:"github-dark"},api:{baseUrl:"/api/v1",authType:"bearer",authHeader:"Authorization",testerEnabled:!0},search:{enabled:!0,placeholder:"Search docs...",shortcuts:["\u2318K","Ctrl+K"]},editLink:{enabled:!0,baseUrl:"",branch:"main"},lastUpdated:{enabled:!0,format:"dd MMM yyyy"}};var de=(e={})=>({...S,...e,nav:e.nav??S.nav,sidebar:e.sidebar??S.sidebar,site:{...S.site,...e.site??{}},theme:J(S.theme,e.theme),api:J(S.api,e.api),search:J(S.search,e.search),editLink:J(S.editLink,e.editLink),lastUpdated:J(S.lastUpdated,e.lastUpdated),docsDir:e.docsDir??I,baseRoute:e.baseRoute??F}),J=(e,t)=>{if(e===void 0)return t;if(t===void 0)return e;return{...e,...t}};var L=require("arktype"),Yi=L.type({title:"string >= 1",description:"string >= 1"}),Ji=L.type({baseUrl:"string >= 1",authType:L.type("'bearer' | 'apiKey' | 'oauth2'")}),Xi=L.type({method:L.type("'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'"),path:"string >= 1",description:"string >= 1"});var pe=(e)=>e,Mr=pe("virtual:docs/data"),Or=pe("virtual:docs/search-index"),Lr=pe("virtual:docs/sidebar"),Nr=pe("virtual:docs/nav");var b=(e)=>JSON.stringify(e,Vr,2),Vr=(e,t)=>{if(t===void 0)return;return t},$e=(e)=>{let t=e.map((r)=>({id:String(r.id),slug:String(r.slug),title:r.title,description:r.description,frontmatter:r.frontmatter,rawContent:r.rawContent,content:r.content,filePath:String(r.filePath)}));return`export const docsData = ${b(t)};`},_e=(e)=>`export const sidebar = ${b(e)};`,Be=(e)=>`export const nav = ${b(e)};`,Ue=(e)=>`export const searchIndex = ${b(e.entries)};`,Ge=(e)=>`export const docsConfig = ${b(e)};
6
+ export const site = ${b(e.site)};
7
+ export const nav = ${b(e.nav)};
8
+ export const sidebar = ${b(e.sidebar)};
9
+ export const api = ${b(e.api)};
10
+ export const search = ${b(e.search)};
11
+ export const editLink = ${b(e.editLink)};
12
+ export const lastUpdated = ${b(e.lastUpdated)};`;var We=(e)=>{if(!G(e))return!1;return e.endsWith(".md")||e.endsWith(".mdoc")};var ze=({config:e,pages:t,sidebar:r,nav:o,searchIndex:n})=>d({"virtual:docs/data":$e(t),"virtual:docs/sidebar":_e(r),"virtual:docs/nav":Be(o),"virtual:docs/search-index":Ue(n),"virtual:docs/config":Ge(e)});var jt=(e,t)=>[...e].sort((r,o)=>{let n=t(r),i=t(o);if(typeof n==="number"&&typeof i==="number")return n-i;return String(n).localeCompare(String(i))}),He=(e,t)=>[...e].sort((r,o)=>t(r).localeCompare(t(o))),Yt=(e,t)=>{let r={};for(let o of e){let n=String(t(o));if(!r[n])r[n]=[];r[n].push(o)}return r};var Ke=(e)=>[...e].sort((t,r)=>t.title.localeCompare(r.title));var ue=(e)=>He(e,(t)=>t.title),je=(e)=>He(e,(t)=>t.title);var Ye=(e)=>d(Ke(e));var Jt=(e)=>{if(e==="root")return xt;return mt(e)},Je=(e)=>{let t=Yt(e,(o)=>o.group??"root"),r=[];for(let[o,n]of Object.entries(t)){let i=jt(n,(s)=>s.order);r.push({title:Jt(o),items:i.map($r)})}return r.sort((o,n)=>o.title.localeCompare(n.title))},$r=(e)=>{let t=e.frontmatter,r={title:_r(e),slug:typeof e.slug==="string"?e.slug:String(e.slug)};if(typeof t.badge==="string"){let o={...r,badge:t.badge};if(Br(t.badgeVariant))return{...o,badgeVariant:t.badgeVariant};return o}return r},_r=(e)=>{let t=e.frontmatter;if(typeof t.title==="string"&&t.title.trim().length>0)return t.title;let r=typeof e.slug==="string"?e.slug:String(e.slug),o=r.split("/").pop();return o?ut(o):r},Br=(e)=>e==="default"||e==="success"||e==="warning"||e==="danger";var Xe=({configured:e,docs:t,pages:r})=>{if(e&&e.length>0){let n=e.map((i)=>({...i,items:je(i.items)}));return d(ue(n))}let o=r!==void 0&&r.length>0?r:t??[];if(o.length===0)return d([]);return d(ue(Je(o)))};var Xt=(e)=>{let t=Qt(e.content),r=qe(`${e.title} ${e.description??""} ${t}`);return{id:String(e.id),slug:String(e.slug),title:e.title,description:e.description??"",content:gt(t,ht,""),terms:r}},Ze=(e)=>{let t=e.map(Xt),r={},o=0;for(let n of t){let i=new Set;for(let s of n.terms){if(i.has(s))continue;i.add(s);let a=r[s]??[];a.push(n.id),r[s]=a}o+=n.terms.length}return{entries:t,inverted:r,avgDocLength:t.length===0?0:o/t.length}},Qt=(e)=>e.replace(/```[\s\S]*?```/g," ").replace(/~~~[\s\S]*?~~~/g," ").replace(/`[^`\n]*`/g," ").replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/^#{1,6}\s+/gm,"").replace(/^\s*[-*+]\s+/gm,"").replace(/^\s*\d+\.\s+/gm,"").replace(/^>\s?/gm,"").replace(/[*_~]+/g,"").replace(/\s+/g," ").trim(),qe=(e)=>{if(e.length===0)return[];return e.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").split(/[^\p{Letter}\p{Number}]+/u).filter((t)=>t.length>=2)};var et=(e)=>d(Ze(e));var Zt=async({config:e,loader:t,transformPage:r})=>{let o=await t.loadAll(e);if(!o.ok)return o;let n=o.value;if(r){let y=[];for(let v of n)y.push(await r(v));n=y}let i=Xe({configured:e.sidebar,pages:n});if(!i.ok)return i;let s=i.value,a=Ye(e.nav);if(!a.ok)return a;let l=a.value,c=et(n);if(!c.ok)return c;let p=c.value,u=ze({config:e,pages:n,sidebar:s,nav:l,searchIndex:p});if(!u.ok)return u;return d(u.value)};var ge=(e={})=>{let t=e.userConfig??{...e},r=e.options??{},o=e.fullReload===!0,n=e.watchMode??"native",i=e.pollingIntervalMs??300,s=e.transformPage,a=r.docsDir??I,l=r.baseRoute??F,c=null,p=null,u=null,y={},v=new te,P=()=>{if(c)return c;return c=de({...t,docsDir:a,baseRoute:l}),c},ye=(g=Date.now())=>{if(!p)return;let f=[];for(let D of Object.keys(y)){let ct=p.moduleGraph.getModuleById(D);if(ct)p.moduleGraph.invalidateModule(ct),f.push(D)}if(o){p.ws.send({type:"full-reload"});return}let R=g;p.ws.send({type:"update",updates:f.map((D)=>({type:"js-update",path:D,acceptedPath:D,timestamp:R}))})},Z=async()=>{let g=P(),f=await Pt({configPath:g.docsDir?`${g.docsDir}/velite.config.ts`:"velite.config.ts",watch:!0});if(!f.success){console.error(`[${C}] Velite build failed:`,f.error);return}let R=H(),D=await Zt({config:g,loader:R,...s?{transformPage:s}:{}});if(D.ok)y=D.value,ye()};return{name:C,config(){return{optimizeDeps:{include:["comark","@comark/svelte"]}}},async configResolved(g){P(),await Z();try{let f=E(g.root).replace(/\/$/,"");if(n==="polling")u=Ve({intervalMs:i}).watch(f,(D)=>{Z()});else u=Y().watch(f,(D)=>{Z()})}catch(f){console.warn(`[${C}] Failed to start watcher:`,f)}},configureServer(g){p=g,g.httpServer?.on("close",()=>{u?.close(),v.clear()})},resolveId(g){if(g.startsWith(U))return g;return null},async load(g){if(!g.startsWith(U))return null;let f=y[g];if(f!==void 0)return f;return await Z(),y[g]??null},async transform(g,f){if(!We(f))return null;if(!G(g))return null;try{return null}catch(R){return console.error(`[${C}] Failed to transform ${f}:`,R),{code:g,map:null}}},closeBundle(){u?.close()}}},rt=ge;var ot=async(e,{parse:t})=>{let{frontmatter:r,content:o}=W(e),n=await t(o),i=JSON.stringify(r),s=JSON.stringify(o),a=JSON.stringify(n);return`<script lang="ts">
13
+ export const frontmatter = ${i};
14
+ export const content = ${s};
15
+ export const tree = ${a};
16
+ </script>`};var qt=()=>null,er=()=>null,tr=()=>null,rr=()=>null;var or=()=>null;var nt=(e)=>{let t=[],r=e.split(`
17
+ `);for(let o of r){let n=o.match(/^(#{1,6})\s+(.+)$/);if(n)t.push({text:n[2].trim(),level:n[1].length,line:r.indexOf(o)+1})}return t},nr=(e)=>e.toLowerCase().replace(/[^\w\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,""),it=(e,t={})=>{let{maxDepth:r=6,minDepth:o=1,include:n=[],exclude:i=[]}=t,s=e.filter((c)=>{if(c.level<o||c.level>r)return!1;if(n.length>0&&!n.includes(c.text))return!1;if(i.length>0&&i.includes(c.text))return!1;return!0}),a=[],l=[];for(let c of s){let p={text:c.text,level:c.level,id:nr(c.text)};while(l.length>0&&l[l.length-1].level>=c.level)l.pop();if(l.length===0)a.push(p);else{let u=l[l.length-1].item;if(!u.children)u.children=[];u.children.push(p)}l.push({item:p,level:c.level})}return a},st=(e)=>{let t=[],r=(o)=>{for(let n of o)if(t.push(n),n.children)r(n.children)};return r(e),t};var fe=(e,t={})=>{let r=nt(e);return it(r,t)},at=(e,t={})=>{let r=fe(e,t);return st(r)};})
18
+
19
+ //# debugId=B33CA09323C8726E64756E2164756E21
20
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2FkYXB0ZXJzL2NvbmZpZy9ub2RlLWNvbmZpZy1sb2FkZXIudHMiLCAic3JjL21vZHVsZXMvY29udGVudC90eXBlcy9pbmRleC50cyIsICJzcmMvc2hhcmVkL2Vycm9ycy9pbmRleC50cyIsICJzcmMvc2hhcmVkL3R5cGVzL3Jlc3VsdC50cyIsICJzcmMvYWRhcHRlcnMvZnMvZnMtZG9jcy1sb2FkZXIudHMiLCAic3JjL21vZHVsZXMvY29udGVudC9hcHBsaWNhdGlvbi9jYWNoZS9wYXJzZUNhY2hlLnRzIiwgInNyYy9zaGFyZWQvdXRpbHMvc3RyaW5nLnRzIiwgInNyYy9tb2R1bGVzL2NvbnRlbnQvZG9tYWluL29wZXJhdGlvbnMvYnVpbGQtcGFnZS50cyIsICJzcmMvc2hhcmVkL2NvbnN0YW50cy9pbmRleC50cyIsICJzcmMvc2hhcmVkL3V0aWxzL29iamVjdC50cyIsICJzcmMvc2hhcmVkL3R5cGVzL2VpdGhlci50cyIsICJzcmMvc2hhcmVkL3R5cGVzL29wdGlvbi50cyIsICJzcmMvbW9kdWxlcy95YW1sLXBhcnNlci9kb21haW4vb3BlcmF0aW9ucy9wYXJzZS15YW1sLnRzIiwgInNyYy9tb2R1bGVzL2NvbnRlbnQvZG9tYWluL29wZXJhdGlvbnMvcGFyc2UudHMiLCAic3JjL21vZHVsZXMvY29udGVudC9hcHBsaWNhdGlvbi91c2VjYXNlcy9sb2FkRG9jUGFnZS50cyIsICJzcmMvbW9kdWxlcy9jb250ZW50L2FwcGxpY2F0aW9uL3VzZWNhc2VzL3NjYW5Eb2NzRGlyLnRzIiwgInNyYy9tb2R1bGVzL2NvbnRlbnQvYXBwbGljYXRpb24vd29ya2Zsb3dzL3Byb2Nlc3NEb2NzLnRzIiwgInNyYy9tb2R1bGVzL2NvbnRlbnQvZG9tYWluL3ZhbGlkYXRvcnMvZnJvbnRtYXR0ZXIudHMiLCAic3JjL2FkYXB0ZXJzL2ZzL21lbW9yeS1mcy50cyIsICJzcmMvYWRhcHRlcnMvZnMvbm9kZS1mcy50cyIsICJzcmMvYWRhcHRlcnMvZ2l0L2luZGV4LnRzIiwgInNyYy9hZGFwdGVycy92ZWxpdGUudHMiLCAic3JjL2FkYXB0ZXJzL3ZpdGUvZG9jcy13YXRjaGVyLnRzIiwgInNyYy9hZGFwdGVycy92aXRlL3BvbGxpbmctd2F0Y2hlci50cyIsICJzcmMvY29kZS1ibG9jay1lbmhhbmNlbWVudHMvaW5kZXgudHMiLCAic3JjL2NvbmZpZy9pbmRleC50cyIsICJzcmMvY29udGVudC9pbmRleC50cyIsICJzcmMvY29udGVudC12YWxpZGF0aW9uL2luZGV4LnRzIiwgInNyYy9saXZlLWVkaXRvci9pbmRleC50cyIsICJzcmMvbmF2aWdhdGlvbi9pbmRleC50cyIsICJzcmMvcGx1Z2luL2luZGV4LnRzIiwgInNyYy9tb2R1bGVzL2NvbmZpZy9kb21haW4vb3BlcmF0aW9ucy9kZWZhdWx0cy50cyIsICJzcmMvbW9kdWxlcy9jb25maWcvZG9tYWluL29wZXJhdGlvbnMvcmVzb2x2ZS50cyIsICJzcmMvbW9kdWxlcy9jb25maWcvZG9tYWluL3ZhbGlkYXRvcnMvaW5kZXgudHMiLCAic3JjL21vZHVsZXMvcGx1Z2luL3R5cGVzL2luZGV4LnRzIiwgInNyYy9tb2R1bGVzL3BsdWdpbi9kb21haW4vb3BlcmF0aW9ucy9idWlsZC12aXJ0dWFsLnRzIiwgInNyYy9tb2R1bGVzL3BsdWdpbi9hcHBsaWNhdGlvbi91c2VjYXNlcy9idWlsZC12aXJ0dWFsLW1vZHVsZXMudHMiLCAic3JjL21vZHVsZXMvbmF2aWdhdGlvbi9kb21haW4vc2hhcmVkL3V0aWxzL2FycmF5LnRzIiwgInNyYy9tb2R1bGVzL25hdmlnYXRpb24vZG9tYWluL29wZXJhdGlvbnMvc29ydC50cyIsICJzcmMvbW9kdWxlcy9uYXZpZ2F0aW9uL2FwcGxpY2F0aW9uL3VzZWNhc2VzL2J1aWxkTmF2LnRzIiwgInNyYy9tb2R1bGVzL25hdmlnYXRpb24vZG9tYWluL29wZXJhdGlvbnMvZ3JvdXAudHMiLCAic3JjL21vZHVsZXMvbmF2aWdhdGlvbi9hcHBsaWNhdGlvbi91c2VjYXNlcy9idWlsZFNpZGViYXIudHMiLCAic3JjL21vZHVsZXMvc2VhcmNoL2RvbWFpbi9vcGVyYXRpb25zL2J1aWxkSW5kZXgudHMiLCAic3JjL21vZHVsZXMvc2VhcmNoL2FwcGxpY2F0aW9uL3VzZWNhc2VzL2luZGV4UGFnZXMudHMiLCAic3JjL21vZHVsZXMvcGx1Z2luL2FwcGxpY2F0aW9uL3dvcmtmbG93cy9idWlsZC1kb2NzLnRzIiwgInNyYy9wcmVzZW50YXRpb24vdml0ZS1wbHVnaW4vZG9jcy1wbHVnaW4udHMiLCAic3JjL3ByZXNlbnRhdGlvbi92aXRlLXBsdWdpbi90cmFuc2Zvcm0tbWFya2Rvd24udHMiLCAic3JjL3NlYXJjaC9pbmRleC50cyIsICJzcmMvc2VvLW9wdGltaXphdGlvbi9pbmRleC50cyIsICJzcmMvbW9kdWxlcy90b2MtZ2VuZXJhdG9yL2RvbWFpbi90b2NPcGVyYXRpb25zLnRzIiwgInNyYy9tb2R1bGVzL3RvYy1nZW5lcmF0b3IvYXBwbGljYXRpb24vdXNlY2FzZXMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBOb2RlIEZTLWJhY2tlZCBjb25maWcgbG9hZGVyLlxuICogVHJpZXMgdG8gZHluYW1pY2FsbHkgaW1wb3J0IGAke2N3ZH0vJHtjb25maWdQYXRofWAgYW5kIHJldHVybnMgaXRzIGRlZmF1bHQgZXhwb3J0LlxuICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCAoY2FsbGVyIGZhbGxzIGJhY2sgdG8gZGVmYXVsdHMpLlxuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBDb25maWdMb2FkZXIsIERvY3NDb25maWcgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL21vZHVsZXMvY29uZmlnXCI7XG5pbXBvcnQgeyBGaWxlUGF0aCB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50L3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFwcEVycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBwYXJzZUVycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBlcnIsIG9rLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3R5cGVzL3Jlc3VsdFwiO1xuaW1wb3J0IHsgbm9kZUZpbGVSZWFkZXIgfSBmcm9tIFwiLi4vZnNcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU5vZGVDb25maWdMb2FkZXIgPSAoKTogQ29uZmlnTG9hZGVyID0+ICh7XG5cdGFzeW5jIGxvYWQoXG5cdFx0Y3dkOiBzdHJpbmcsXG5cdFx0Y29uZmlnUGF0aDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFJlc3VsdDxQYXJ0aWFsPERvY3NDb25maWc+IHwgbnVsbCwgQXBwRXJyb3I+PiB7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoY29uZmlnUGF0aClcblx0XHRcdD8gY29uZmlnUGF0aFxuXHRcdFx0OiBwYXRoLmpvaW4oY3dkLCBjb25maWdQYXRoKTtcblx0XHRjb25zdCBmcCA9IEZpbGVQYXRoKGZ1bGxQYXRoKTtcblx0XHRjb25zdCBleGlzdHMgPSBhd2FpdCBub2RlRmlsZVJlYWRlci5leGlzdHMoZnApO1xuXHRcdGlmICghZXhpc3RzKSByZXR1cm4gb2sobnVsbCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRHluYW1pYyBpbXBvcnQg4oCUIHdvcmtzIGluIEVTTSBjb250ZXh0LiBDSlMvVFMgY29uZmlncyByZXF1aXJlIHRoZSBidW5kbGVyIHRvIHRyYW5zZm9ybS5cblx0XHRcdGNvbnN0IHVybCA9IG5ldyBVUkwoYGZpbGU6Ly8vJHtmdWxsUGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKX1gKS5ocmVmO1xuXHRcdFx0Y29uc3QgbW9kOiB7IGRlZmF1bHQ/OiBQYXJ0aWFsPERvY3NDb25maWc+IH0gPSBhd2FpdCBpbXBvcnQodXJsKTtcblx0XHRcdHJldHVybiBvayhtb2QuZGVmYXVsdCA/PyB7fSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGVycihwYXJzZUVycm9yKGZ1bGxQYXRoLCBcIkZhaWxlZCB0byBsb2FkIGNvbmZpZ1wiLCBlKSk7XG5cdFx0fVxuXHR9LFxufSk7XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnJhbmQgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBEb2NTbHVnID0gQnJhbmQ8c3RyaW5nLCBcIkRvY1NsdWdcIj47XG5leHBvcnQgdHlwZSBEb2NJZCA9IEJyYW5kPHN0cmluZywgXCJEb2NJZFwiPjtcbmV4cG9ydCB0eXBlIEZpbGVQYXRoID0gQnJhbmQ8c3RyaW5nLCBcIkZpbGVQYXRoXCI+O1xuXG5leHBvcnQgY29uc3QgRG9jU2x1ZyA9IChzOiBzdHJpbmcpOiBEb2NTbHVnID0+IHMgYXMgRG9jU2x1ZztcbmV4cG9ydCBjb25zdCBEb2NJZCA9IChzOiBzdHJpbmcpOiBEb2NJZCA9PiBzIGFzIERvY0lkO1xuZXhwb3J0IGNvbnN0IEZpbGVQYXRoID0gKHM6IHN0cmluZyk6IEZpbGVQYXRoID0+IHMgYXMgRmlsZVBhdGg7XG5cbmV4cG9ydCB0eXBlIEJhZGdlVmFyaWFudCA9IFwiZGVmYXVsdFwiIHwgXCJzdWNjZXNzXCIgfCBcIndhcm5pbmdcIiB8IFwiZGFuZ2VyXCI7XG5cbi8qKiBBIHNpbmdsZSBoZWFkaW5nIGV4dHJhY3RlZCBmcm9tIHBhZ2UgYm9keS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9jSXRlbSB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRleHQ6IHN0cmluZztcblx0cmVhZG9ubHkgZGVwdGg6IDEgfCAyIHwgMyB8IDQgfCA1IHwgNjtcbn1cblxuLyoqIFBlci1wYWdlIG1ldGFkYXRhIGRlcml2ZWQgZnJvbSB0aGUgYm9keSAobm90IHVzZXItYXV0aG9yZWQpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlTWV0YWRhdGEge1xuXHRyZWFkb25seSByZWFkaW5nVGltZTogbnVtYmVyO1xuXHRyZWFkb25seSB3b3JkQ291bnQ6IG51bWJlcjtcblx0cmVhZG9ubHkgbGFzdE1vZGlmaWVkPzogc3RyaW5nO1xuXHRyZWFkb25seSBlZGl0VXJsPzogc3RyaW5nO1xufVxuXG4vKiogUmVhZG9ubHkgZGF0YSBtb2RlbCBmb3IgYSBkb2MgcGFnZSdzIGZyb250bWF0dGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcm9udG1hdHRlciB7XG5cdHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXHRyZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblx0cmVhZG9ubHkgb3JkZXI/OiBudW1iZXI7XG5cdHJlYWRvbmx5IGJhZGdlPzogc3RyaW5nO1xuXHRyZWFkb25seSBiYWRnZVZhcmlhbnQ/OiBCYWRnZVZhcmlhbnQ7XG5cdHJlYWRvbmx5IGNvbGxhcHNpYmxlPzogYm9vbGVhbjtcblx0cmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGF1dGhvcj86IHN0cmluZztcblx0cmVhZG9ubHkgbGFzdFVwZGF0ZWQ/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcblx0cmVhZG9ubHkgZHJhZnQ/OiBib29sZWFuO1xuXHRyZWFkb25seSBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKiogUGFyc2VkLCBub3JtYWxpemVkIGJvZHkgb2YgYSBtYXJrZG93biBmaWxlIChmcm9udG1hdHRlciBzdHJpcHBlZCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZENvbnRlbnQge1xuXHRyZWFkb25seSBmcm9udG1hdHRlcjogRnJvbnRtYXR0ZXI7XG5cdHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblx0cmVhZG9ubHkgcmF3Q29udGVudDogc3RyaW5nO1xufVxuXG4vKiogQSBzaW5nbGUgZG9jIHBhZ2UsIHJlYWR5IGZvciBkb3duc3RyZWFtIGNvbnN1bXB0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NQYWdlIHtcblx0cmVhZG9ubHkgaWQ6IERvY0lkO1xuXHRyZWFkb25seSBzbHVnOiBEb2NTbHVnO1xuXHRyZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXHRyZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblx0cmVhZG9ubHkgZnJvbnRtYXR0ZXI6IEZyb250bWF0dGVyO1xuXHRyZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cdHJlYWRvbmx5IHJhd0NvbnRlbnQ6IHN0cmluZztcblx0cmVhZG9ubHkgZmlsZVBhdGg6IEZpbGVQYXRoO1xuXHRyZWFkb25seSBncm91cD86IHN0cmluZztcblx0cmVhZG9ubHkgb3JkZXI6IG51bWJlcjtcblx0cmVhZG9ubHkgdG9jOiByZWFkb25seSBUb2NJdGVtW107XG5cdHJlYWRvbmx5IG1ldGFkYXRhOiBQYWdlTWV0YWRhdGE7XG59XG5cbi8qKiBMaWdodHdlaWdodCBkZXNjcmlwdG9yIGZvciBhIGZpbGUgZGlzY292ZXJlZCBkdXJpbmcgc2Nhbm5pbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY0ZpbGUge1xuXHRyZWFkb25seSBpZDogRG9jSWQ7XG5cdHJlYWRvbmx5IHNsdWc6IERvY1NsdWc7XG5cdHJlYWRvbmx5IGZyb250bWF0dGVyOiBGcm9udG1hdHRlcjtcblx0cmVhZG9ubHkgcmF3Q29udGVudDogc3RyaW5nO1xuXHRyZWFkb25seSBmaWxlUGF0aDogRmlsZVBhdGg7XG5cdHJlYWRvbmx5IGdyb3VwPzogc3RyaW5nO1xuXHRyZWFkb25seSBvcmRlcjogbnVtYmVyO1xufVxuIiwKICAgICIvKipcbiAqIERvbWFpbiBlcnJvciB0eXBlcyDigJQgdGFnZ2VkIHVuaW9ucyBmb3IgdHlwZWQgZmFpbHVyZXMuXG4gKlxuICogRWFjaCBtb2R1bGUgY2FuIGV4dGVuZCB0aGlzIHdpdGggaXRzIG93biBlcnJvciB2YXJpYW50cywgYnV0XG4gKiBhbGwgZXJyb3JzIHNob3VsZCBmbG93IHRocm91Z2ggdGhlc2UgYmFzZSB0eXBlcyBhdCBib3VuZGFyaWVzLlxuICovXG5cbmV4cG9ydCB0eXBlIEFwcEVycm9yS2luZCA9XG5cdHwgXCJmaWxlX25vdF9mb3VuZFwiXG5cdHwgXCJwYXJzZV9lcnJvclwiXG5cdHwgXCJ2YWxpZGF0aW9uX2Vycm9yXCJcblx0fCBcImNvbmZpZ19lcnJvclwiXG5cdHwgXCJpb19lcnJvclwiXG5cdHwgXCJwbHVnaW5fZXJyb3JcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBcHBFcnJvciB7XG5cdHJlYWRvbmx5IGtpbmQ6IEFwcEVycm9yS2luZDtcblx0cmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuXHRyZWFkb25seSBjYXVzZT86IHVua25vd247XG5cdHJlYWRvbmx5IGNvbnRleHQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cdC8qKiBKU09OLXBvaW50ZXItbGlrZSBwYXRoIHRvIHRoZSBvZmZlbmRpbmcgZmllbGQgKGUuZy4gXCJzaXRlLnRpdGxlXCIpLiAqL1xuXHRyZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXHQvKiogQWN0aW9uYWJsZSBoaW50IHNob3duIHRvIHRoZSB1c2VyIChlLmcuIGFsbG93ZWQgdmFsdWVzKS4gKi9cblx0cmVhZG9ubHkgaGludD86IHN0cmluZztcblx0LyoqIERvY3VtZW50YXRpb24gVVJMIHJlbGF0ZWQgdG8gdGhpcyBlcnJvci4gKi9cblx0cmVhZG9ubHkgZG9jc1VybD86IHN0cmluZztcblx0LyoqIEFsbG93ZWQgdmFsdWVzLCBmb3IgaW5saW5lIHN1Z2dlc3Rpb25zLiAqL1xuXHRyZWFkb25seSBzdWdnZXN0aW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5jb25zdCBET0NTX0JBU0UgPSBcImh0dHBzOi8vY3JlYXRlLWRvY3MuZGV2L2Vycm9yc1wiO1xuXG5leHBvcnQgY29uc3QgbWFrZUVycm9yID0gKFxuXHRraW5kOiBBcHBFcnJvcktpbmQsXG5cdG1lc3NhZ2U6IHN0cmluZyxcblx0b3B0aW9ucz86IHtcblx0XHRjYXVzZT86IHVua25vd247XG5cdFx0Y29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdHBhdGg/OiBzdHJpbmc7XG5cdFx0aGludD86IHN0cmluZztcblx0XHRzdWdnZXN0aW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHR9LFxuKTogQXBwRXJyb3IgPT4ge1xuXHRjb25zdCBiYXNlOiB7XG5cdFx0a2luZDogQXBwRXJyb3JLaW5kO1xuXHRcdG1lc3NhZ2U6IHN0cmluZztcblx0XHRjYXVzZT86IHVua25vd247XG5cdFx0Y29udGV4dD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcblx0XHRwYXRoPzogc3RyaW5nO1xuXHRcdGhpbnQ/OiBzdHJpbmc7XG5cdFx0c3VnZ2VzdGlvbnM/OiByZWFkb25seSBzdHJpbmdbXTtcblx0XHRkb2NzVXJsOiBzdHJpbmc7XG5cdH0gPSB7XG5cdFx0a2luZCxcblx0XHRtZXNzYWdlLFxuXHRcdGRvY3NVcmw6IGAke0RPQ1NfQkFTRX0vJHtraW5kLnJlcGxhY2UoL18vZywgXCItXCIpfWAsXG5cdH07XG5cdGlmIChvcHRpb25zPy5jYXVzZSAhPT0gdW5kZWZpbmVkKSBiYXNlLmNhdXNlID0gb3B0aW9ucy5jYXVzZTtcblx0aWYgKG9wdGlvbnM/LmNvbnRleHQgIT09IHVuZGVmaW5lZCkgYmFzZS5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuXHRpZiAob3B0aW9ucz8ucGF0aCAhPT0gdW5kZWZpbmVkKSBiYXNlLnBhdGggPSBvcHRpb25zLnBhdGg7XG5cdGlmIChvcHRpb25zPy5oaW50ICE9PSB1bmRlZmluZWQpIGJhc2UuaGludCA9IG9wdGlvbnMuaGludDtcblx0aWYgKG9wdGlvbnM/LnN1Z2dlc3Rpb25zICE9PSB1bmRlZmluZWQpXG5cdFx0YmFzZS5zdWdnZXN0aW9ucyA9IG9wdGlvbnMuc3VnZ2VzdGlvbnM7XG5cdHJldHVybiBiYXNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbGVOb3RGb3VuZCA9IChwYXRoOiBzdHJpbmcsIGNhdXNlPzogdW5rbm93bik6IEFwcEVycm9yID0+XG5cdG1ha2VFcnJvcihcImZpbGVfbm90X2ZvdW5kXCIsIGBGaWxlIG5vdCBmb3VuZDogJHtwYXRofWAsIHtcblx0XHRjYXVzZSxcblx0XHRjb250ZXh0OiB7IHBhdGggfSxcblx0XHRoaW50OiBcIkNoZWNrIHRoYXQgdGhlIGRvY3NEaXIgb3B0aW9uIHBvaW50cyB0byBhbiBleGlzdGluZyBkaXJlY3RvcnkuXCIsXG5cdH0pO1xuXG5leHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChcblx0cGF0aDogc3RyaW5nLFxuXHRtZXNzYWdlOiBzdHJpbmcsXG5cdGNhdXNlPzogdW5rbm93bixcbik6IEFwcEVycm9yID0+XG5cdG1ha2VFcnJvcihcInBhcnNlX2Vycm9yXCIsIG1lc3NhZ2UsIHtcblx0XHRjYXVzZSxcblx0XHRjb250ZXh0OiB7IHBhdGggfSxcblx0XHRoaW50OiBcIlZlcmlmeSB0aGUgZnJvbnRtYXR0ZXIgaXMgZGVsaW1pdGVkIGJ5ICctLS0nIG9uIGl0cyBvd24gbGluZS5cIixcblx0fSk7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSAoXG5cdG1lc3NhZ2U6IHN0cmluZyxcblx0b3B0aW9ucz86IHtcblx0XHRwYXRoPzogc3RyaW5nO1xuXHRcdHN1Z2dlc3Rpb25zPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdFx0Y29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHR9LFxuKTogQXBwRXJyb3IgPT4ge1xuXHRjb25zdCBjdHggPSBvcHRpb25zPy5jb250ZXh0ID8/IHt9O1xuXHRpZiAob3B0aW9ucz8ucGF0aCAhPT0gdW5kZWZpbmVkKSBjdHgucGF0aCA9IG9wdGlvbnMucGF0aDtcblx0cmV0dXJuIG1ha2VFcnJvcihcInZhbGlkYXRpb25fZXJyb3JcIiwgbWVzc2FnZSwge1xuXHRcdGNvbnRleHQ6IGN0eCxcblx0XHRwYXRoOiBvcHRpb25zPy5wYXRoLFxuXHRcdHN1Z2dlc3Rpb25zOiBvcHRpb25zPy5zdWdnZXN0aW9ucyxcblx0XHRoaW50OiBvcHRpb25zPy5zdWdnZXN0aW9ucz8ubGVuZ3RoXG5cdFx0XHQ/IGBEaWQgeW91IG1lYW4gb25lIG9mOiAke29wdGlvbnMuc3VnZ2VzdGlvbnMuam9pbihcIiwgXCIpfT9gXG5cdFx0XHQ6IHVuZGVmaW5lZCxcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlnRXJyb3IgPSAoXG5cdG1lc3NhZ2U6IHN0cmluZyxcblx0b3B0aW9ucz86IHtcblx0XHRwYXRoPzogc3RyaW5nO1xuXHRcdHN1Z2dlc3Rpb25zPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdFx0Y29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGhpbnQ/OiBzdHJpbmc7XG5cdFx0Y2F1c2U/OiB1bmtub3duO1xuXHR9LFxuKTogQXBwRXJyb3IgPT4ge1xuXHRjb25zdCBjdHggPSBvcHRpb25zPy5jb250ZXh0ID8/IHt9O1xuXHRpZiAob3B0aW9ucz8ucGF0aCAhPT0gdW5kZWZpbmVkKSBjdHgucGF0aCA9IG9wdGlvbnMucGF0aDtcblx0cmV0dXJuIG1ha2VFcnJvcihcImNvbmZpZ19lcnJvclwiLCBtZXNzYWdlLCB7XG5cdFx0Y29udGV4dDogY3R4LFxuXHRcdHBhdGg6IG9wdGlvbnM/LnBhdGgsXG5cdFx0c3VnZ2VzdGlvbnM6IG9wdGlvbnM/LnN1Z2dlc3Rpb25zLFxuXHRcdGhpbnQ6XG5cdFx0XHRvcHRpb25zPy5oaW50ID8/XG5cdFx0XHQob3B0aW9ucz8uc3VnZ2VzdGlvbnM/Lmxlbmd0aFxuXHRcdFx0XHQ/IGBBbGxvd2VkOiAke29wdGlvbnMuc3VnZ2VzdGlvbnMuam9pbihcIiwgXCIpfS5gXG5cdFx0XHRcdDogXCJTZWUgaHR0cHM6Ly9jcmVhdGUtZG9jcy5kZXYvZG9jcy9jb25maWd1cmF0aW9uIGZvciB0aGUgZnVsbCBzY2hlbWEuXCIpLFxuXHRcdGNhdXNlOiBvcHRpb25zPy5jYXVzZSxcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgaW9FcnJvciA9IChcblx0cGF0aDogc3RyaW5nLFxuXHRtZXNzYWdlOiBzdHJpbmcsXG5cdGNhdXNlPzogdW5rbm93bixcbik6IEFwcEVycm9yID0+IG1ha2VFcnJvcihcImlvX2Vycm9yXCIsIG1lc3NhZ2UsIHsgY2F1c2UsIGNvbnRleHQ6IHsgcGF0aCB9IH0pO1xuXG5leHBvcnQgY29uc3QgcGx1Z2luRXJyb3IgPSAoXG5cdG1lc3NhZ2U6IHN0cmluZyxcblx0b3B0aW9ucz86IHtcblx0XHRwYXRoPzogc3RyaW5nO1xuXHRcdGhpbnQ/OiBzdHJpbmc7XG5cdFx0Y29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGNhdXNlPzogdW5rbm93bjtcblx0fSxcbik6IEFwcEVycm9yID0+IHtcblx0Y29uc3QgY3R4ID0gb3B0aW9ucz8uY29udGV4dCA/PyB7fTtcblx0aWYgKG9wdGlvbnM/LnBhdGggIT09IHVuZGVmaW5lZCkgY3R4LnBhdGggPSBvcHRpb25zLnBhdGg7XG5cdHJldHVybiBtYWtlRXJyb3IoXCJwbHVnaW5fZXJyb3JcIiwgbWVzc2FnZSwge1xuXHRcdGNvbnRleHQ6IGN0eCxcblx0XHRwYXRoOiBvcHRpb25zPy5wYXRoLFxuXHRcdGhpbnQ6IG9wdGlvbnM/LmhpbnQsXG5cdFx0Y2F1c2U6IG9wdGlvbnM/LmNhdXNlLFxuXHR9KTtcbn07XG5cbmNvbnN0IFJFRCA9IFwiXFx1MDAxQlszMW1cIjtcbmNvbnN0IFlFTExPVyA9IFwiXFx1MDAxQlszM21cIjtcbmNvbnN0IENZQU4gPSBcIlxcdTAwMUJbMzZtXCI7XG5jb25zdCBESU0gPSBcIlxcdTAwMUJbMm1cIjtcbmNvbnN0IFJFU0VUID0gXCJcXHUwMDFCWzBtXCI7XG5jb25zdCBCT0xEID0gXCJcXHUwMDFCWzFtXCI7XG5cbmNvbnN0IGlzQ29sb3JTdXBwb3J0ZWQgPSAoKTogYm9vbGVhbiA9PiB7XG5cdGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuXHRjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcblx0aWYgKGVudj8uTk9fQ09MT1IgJiYgZW52Lk5PX0NPTE9SLmxlbmd0aCA+IDApIHJldHVybiBmYWxzZTtcblx0aWYgKGVudj8uRk9SQ0VfQ09MT1IgJiYgZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA+IDApIHJldHVybiB0cnVlO1xuXHRyZXR1cm4gQm9vbGVhbihwcm9jZXNzLnN0ZG91dD8uaXNUVFkpO1xufTtcblxuLyoqIEZvcm1hdCBhbiBBcHBFcnJvciBhcyBhIG11bHRpLWxpbmUsIEFOU0ktY29sb3VyZWQsIGFjdGlvbmFibGUgbWVzc2FnZS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRFcnJvciA9IChcblx0ZTogQXBwRXJyb3IsXG5cdGNvbG9yOiBib29sZWFuID0gaXNDb2xvclN1cHBvcnRlZCgpLFxuKTogc3RyaW5nID0+IHtcblx0Y29uc3QgYyA9IChjb2RlOiBzdHJpbmcsIHM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRcdGNvbG9yID8gYCR7Y29kZX0ke3N9JHtSRVNFVH1gIDogcztcblx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cdGxpbmVzLnB1c2goYCR7YyhCT0xEICsgUkVELCBcIuKcllwiKX0gJHtjKEJPTEQsIGUubWVzc2FnZSl9YCk7XG5cdGxpbmVzLnB1c2goYCAgJHtjKERJTSwgXCJraW5kOlwiKX0gJHtlLmtpbmR9YCk7XG5cdGlmIChlLnBhdGgpIGxpbmVzLnB1c2goYCAgJHtjKERJTSwgXCJwYXRoOlwiKX0gJHtlLnBhdGh9YCk7XG5cdGlmIChlLnN1Z2dlc3Rpb25zICYmIGUuc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdGxpbmVzLnB1c2goXG5cdFx0XHRgICAke2MoRElNLCBcImFsbG93ZWQ6XCIpfSAke2Uuc3VnZ2VzdGlvbnMubWFwKChzKSA9PiBjKENZQU4sIHMpKS5qb2luKFwiLCBcIil9YCxcblx0XHQpO1xuXHR9XG5cdGlmIChlLmhpbnQpIGxpbmVzLnB1c2goYCAgJHtjKFlFTExPVywgXCJoaW50OlwiKX0gJHtlLmhpbnR9YCk7XG5cdGlmIChlLmRvY3NVcmwpIGxpbmVzLnB1c2goYCAgJHtjKERJTSwgXCJkb2NzOlwiKX0gJHtjKENZQU4sIGUuZG9jc1VybCl9YCk7XG5cdGlmIChlLmNvbnRleHQgJiYgT2JqZWN0LmtleXMoZS5jb250ZXh0KS5sZW5ndGggPiAwKSB7XG5cdFx0bGluZXMucHVzaChgICAke2MoRElNLCBcImNvbnRleHQ6XCIpfSAke0pTT04uc3RyaW5naWZ5KGUuY29udGV4dCl9YCk7XG5cdH1cblx0aWYgKGUuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdGxpbmVzLnB1c2goYCAgJHtjKERJTSwgXCJjYXVzZTpcIil9ICR7U3RyaW5nKGUuY2F1c2UpfWApO1xuXHR9XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufTtcbiIsCiAgICAiLyoqXG4gKiBSZXN1bHQ8VCwgRT4g4oCUIEEgcHVyZSBhbGdlYnJhaWMgZGF0YSB0eXBlIGZvciBzeW5jaHJvbm91cyBvcGVyYXRpb25zXG4gKiB0aGF0IGNhbiBmYWlsIHdpdGggYSB0eXBlZCBlcnJvci5cbiAqXG4gKiBVc2UgdGhpcyBvdmVyIHRocm93aW5nIGV4Y2VwdGlvbnMgYXQgdGhlIGJvdW5kYXJpZXMgKGRvbWFpbiwgYXBwbGljYXRpb24pLlxuICogRG9tYWluIG11c3QgbmV2ZXIgdGhyb3cg4oCUIG9ubHkgcmV0dXJuIFJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBjb25zdCBkaXZpZGUgPSAoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+ID0+XG4gKiAgICAgYiA9PT0gMCA/IGVycignRGl2aXNpb24gYnkgemVybycpIDogb2soYSAvIGIpO1xuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRT4gPVxuXHR8IHsgcmVhZG9ubHkgb2s6IHRydWU7IHJlYWRvbmx5IHZhbHVlOiBUIH1cblx0fCB7IHJlYWRvbmx5IG9rOiBmYWxzZTsgcmVhZG9ubHkgZXJyb3I6IEUgfTtcblxuZXhwb3J0IGNvbnN0IG9rID0gPFQ+KHZhbHVlOiBUKTogUmVzdWx0PFQsIG5ldmVyPiA9PiAoeyBvazogdHJ1ZSwgdmFsdWUgfSk7XG5cbmV4cG9ydCBjb25zdCBlcnIgPSA8RT4oZXJyb3I6IEUpOiBSZXN1bHQ8bmV2ZXIsIEU+ID0+ICh7IG9rOiBmYWxzZSwgZXJyb3IgfSk7XG5cbmV4cG9ydCBjb25zdCBpc09rID0gPFQsIEU+KHI6IFJlc3VsdDxULCBFPik6IHIgaXMgeyBvazogdHJ1ZTsgdmFsdWU6IFQgfSA9PlxuXHRyLm9rO1xuXG5leHBvcnQgY29uc3QgaXNFcnIgPSA8VCwgRT4ocjogUmVzdWx0PFQsIEU+KTogciBpcyB7IG9rOiBmYWxzZTsgZXJyb3I6IEUgfSA9PlxuXHQhci5vaztcblxuZXhwb3J0IGNvbnN0IG1hcCA9IDxULCBVLCBFPihcblx0cjogUmVzdWx0PFQsIEU+LFxuXHRmbjogKHZhbHVlOiBUKSA9PiBVLFxuKTogUmVzdWx0PFUsIEU+ID0+IChyLm9rID8gb2soZm4oci52YWx1ZSkpIDogcik7XG5cbmV4cG9ydCBjb25zdCBtYXBFcnIgPSA8VCwgRSwgRj4oXG5cdHI6IFJlc3VsdDxULCBFPixcblx0Zm46IChlcnJvcjogRSkgPT4gRixcbik6IFJlc3VsdDxULCBGPiA9PiAoci5vayA/IHIgOiBlcnIoZm4oci5lcnJvcikpKTtcblxuZXhwb3J0IGNvbnN0IGZsYXRNYXAgPSA8VCwgVSwgRT4oXG5cdHI6IFJlc3VsdDxULCBFPixcblx0Zm46ICh2YWx1ZTogVCkgPT4gUmVzdWx0PFUsIEU+LFxuKTogUmVzdWx0PFUsIEU+ID0+IChyLm9rID8gZm4oci52YWx1ZSkgOiByKTtcblxuZXhwb3J0IGNvbnN0IHVud3JhcCA9IDxULCBFPihyOiBSZXN1bHQ8VCwgRT4pOiBUID0+IHtcblx0aWYgKHIub2spIHJldHVybiByLnZhbHVlO1xuXHR0aHJvdyBuZXcgRXJyb3IoYHVud3JhcCBvbiBFcnI6ICR7U3RyaW5nKHIuZXJyb3IpfWApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVud3JhcE9yID0gPFQsIEU+KHI6IFJlc3VsdDxULCBFPiwgZmFsbGJhY2s6IFQpOiBUID0+XG5cdHIub2sgPyByLnZhbHVlIDogZmFsbGJhY2s7XG5cbmV4cG9ydCBjb25zdCBmcm9tVGhyb3dhYmxlID0gPFQsIEUgPSBFcnJvcj4oXG5cdGZuOiAoKSA9PiBULFxuXHRvbkVycm9yOiAoZTogdW5rbm93bikgPT4gRSxcbik6IFJlc3VsdDxULCBFPiA9PiB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG9rKGZuKCkpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGVycihvbkVycm9yKGUpKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGFsbCA9IDxULCBFPihcblx0cmVzdWx0czogcmVhZG9ubHkgUmVzdWx0PFQsIEU+W10sXG4pOiBSZXN1bHQ8cmVhZG9ubHkgVFtdLCBFPiA9PiB7XG5cdGNvbnN0IHZhbHVlczogVFtdID0gW107XG5cdGZvciAoY29uc3QgciBvZiByZXN1bHRzKSB7XG5cdFx0aWYgKCFyLm9rKSByZXR1cm4gcjtcblx0XHR2YWx1ZXMucHVzaChyLnZhbHVlKTtcblx0fVxuXHRyZXR1cm4gb2sodmFsdWVzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJ0aXRpb24gPSA8VCwgRT4oXG5cdHJlc3VsdHM6IHJlYWRvbmx5IFJlc3VsdDxULCBFPltdLFxuKTogeyBvazogcmVhZG9ubHkgVFtdOyBlcnI6IHJlYWRvbmx5IEVbXSB9ID0+IHtcblx0Y29uc3Qgb2tWYWx1ZXM6IFRbXSA9IFtdO1xuXHRjb25zdCBlcnJWYWx1ZXM6IEVbXSA9IFtdO1xuXHRmb3IgKGNvbnN0IHIgb2YgcmVzdWx0cykge1xuXHRcdGlmIChyLm9rKSBva1ZhbHVlcy5wdXNoKHIudmFsdWUpO1xuXHRcdGVsc2UgZXJyVmFsdWVzLnB1c2goci5lcnJvcik7XG5cdH1cblx0cmV0dXJuIHsgb2s6IG9rVmFsdWVzLCBlcnI6IGVyclZhbHVlcyB9O1xufTtcbiIsCiAgICAiLyoqXG4gKiBGaWxlLXN5c3RlbS1iYWNrZWQgRG9jc0xvYWRlciDigJQgY29tcG9zZXMgdGhlIEZTIGFkYXB0ZXIgd2l0aCB0aGVcbiAqIHByb2Nlc3NEb2NzV29ya2Zsb3cgdXNlIGNhc2UgZnJvbSB0aGUgY29udGVudCBtb2R1bGUuXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkRG9jc0NvbmZpZyB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgRG9jUGFnZSB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCI7XG5pbXBvcnQgeyBwcm9jZXNzRG9jc1dvcmtmbG93IH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL2NvbnRlbnRcIjtcbmltcG9ydCB0eXBlIHsgRG9jc0xvYWRlciB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9wbHVnaW5cIjtcbmltcG9ydCB0eXBlIHsgQXBwRXJyb3IgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUmVzdWx0IH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvdHlwZXMvcmVzdWx0XCI7XG5pbXBvcnQgeyBub2RlRGlyZWN0b3J5U2Nhbm5lciwgbm9kZUZpbGVSZWFkZXIgfSBmcm9tIFwiLi4vZnNcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUZzRG9jc0xvYWRlciA9ICgpOiBEb2NzTG9hZGVyID0+ICh7XG5cdGFzeW5jIGxvYWRBbGwoXG5cdFx0Y29uZmlnOiBSZXNvbHZlZERvY3NDb25maWcsXG5cdCk6IFByb21pc2U8UmVzdWx0PHJlYWRvbmx5IERvY1BhZ2VbXSwgQXBwRXJyb3I+PiB7XG5cdFx0Y29uc3QgcmVhZGVyID0gbm9kZUZpbGVSZWFkZXI7XG5cdFx0Y29uc3Qgc2Nhbm5lciA9IG5vZGVEaXJlY3RvcnlTY2FubmVyO1xuXHRcdGNvbnN0IGRvY3NEaXIgPSBwYXRoLmlzQWJzb2x1dGUoY29uZmlnLmRvY3NEaXIpXG5cdFx0XHQ/IGNvbmZpZy5kb2NzRGlyXG5cdFx0XHQ6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuZG9jc0Rpcik7XG5cdFx0cmV0dXJuIHByb2Nlc3NEb2NzV29ya2Zsb3coe1xuXHRcdFx0c2Nhbm5lcixcblx0XHRcdHJlYWRlcixcblx0XHRcdGRvY3NEaXIsXG5cdFx0XHRlZGl0TGluazogY29uZmlnLmVkaXRMaW5rLFxuXHRcdH0pO1xuXHR9LFxufSk7XG4iLAogICAgIi8qKlxuICogbXRpbWUrc2l6ZSBrZXllZCBwYXJzZSBjYWNoZS5cbiAqXG4gKiBTa2lwcyByZS1wYXJzaW5nIGZpbGVzIHdob3NlIG10aW1lIGFuZCBzaXplIGhhdmUgbm90IGNoYW5nZWQgc2luY2UgdGhlXG4gKiBsYXN0IGJ1aWxkLiBQdXJlIOKAlCBubyBJL08uIERlc2lnbmVkIHRvIGJlIHdyYXBwZWQgYnkgYW4gb3V0ZXIgTWFwIGtleWVkXG4gKiBieSBhYnNvbHV0ZSBmaWxlIHBhdGguXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUtleVBhcnRzIHtcblx0cmVhZG9ubHkgbXRpbWVNczogbnVtYmVyO1xuXHRyZWFkb25seSBzaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbnRyeTxUPiB7XG5cdHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXHRyZWFkb25seSB2YWx1ZTogVDtcbn1cblxuLyoqIEJ1aWxkIGEgc3RhYmxlIGNhY2hlIGtleSBmcm9tIGEgZmlsZSBwYXRoIGFuZCBzdGF0IGluZm8uICovXG5leHBvcnQgY29uc3QgbWFrZUNhY2hlS2V5ID0gKGZpbGVQYXRoOiBzdHJpbmcsIHBhcnRzOiBDYWNoZUtleVBhcnRzKTogc3RyaW5nID0+XG5cdGAke2ZpbGVQYXRofUAke3BhcnRzLm10aW1lTXMudG9GaXhlZCgwKX06JHtwYXJ0cy5zaXplfWA7XG5cbi8qKlxuICogU2ltcGxlIGJvdW5kZWQgcGFyc2UgY2FjaGUgd2l0aCBMUlUtbGlrZSBldmljdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcnNlQ2FjaGU8VD4ge1xuXHRwcml2YXRlIG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgbWF4OiBudW1iZXIgPSAxMDI0KSB7fVxuXG5cdGdldChrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLm1hcC5nZXQoa2V5KTtcblx0fVxuXG5cdHNldChrZXk6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5tYXAuaGFzKGtleSkpIHRoaXMubWFwLmRlbGV0ZShrZXkpO1xuXHRcdHRoaXMubWFwLnNldChrZXksIHZhbHVlKTtcblxuXHRcdGlmICh0aGlzLm1hcC5zaXplID4gdGhpcy5tYXgpIHtcblx0XHRcdGNvbnN0IG9sZGVzdCA9IHRoaXMubWFwLmtleXMoKS5uZXh0KCkudmFsdWU7XG5cdFx0XHRpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHRoaXMubWFwLmRlbGV0ZShvbGRlc3QpO1xuXHRcdH1cblx0fVxuXG5cdGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm1hcC5oYXMoa2V5KTtcblx0fVxuXG5cdGNsZWFyKCk6IHZvaWQge1xuXHRcdHRoaXMubWFwLmNsZWFyKCk7XG5cdH1cblxuXHRnZXQgc2l6ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm1hcC5zaXplO1xuXHR9XG59XG4iLAogICAgIi8qKlxuICogUHVyZSBzdHJpbmcgdXRpbGl0eSBmdW5jdGlvbnMuXG4gKi9cblxuZXhwb3J0IGNvbnN0IHRyaW0gPSAoczogc3RyaW5nKTogc3RyaW5nID0+IHMudHJpbSgpO1xuXG5leHBvcnQgY29uc3QgaXNCbGFuayA9IChzOiBzdHJpbmcpOiBib29sZWFuID0+IHMudHJpbSgpLmxlbmd0aCA9PT0gMDtcblxuZXhwb3J0IGNvbnN0IGlzRW1wdHlTdHJpbmcgPSAoczogc3RyaW5nKTogYm9vbGVhbiA9PiBzLmxlbmd0aCA9PT0gMDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0c1dpdGggPSAoczogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IGJvb2xlYW4gPT5cblx0cy5zdGFydHNXaXRoKHByZWZpeCk7XG5cbmV4cG9ydCBjb25zdCBlbmRzV2l0aCA9IChzOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogYm9vbGVhbiA9PlxuXHRzLmVuZHNXaXRoKHN1ZmZpeCk7XG5cbmV4cG9ydCBjb25zdCBzdHJpcFByZWZpeCA9IChzOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogc3RyaW5nID0+XG5cdHMuc3RhcnRzV2l0aChwcmVmaXgpID8gcy5zbGljZShwcmVmaXgubGVuZ3RoKSA6IHM7XG5cbmV4cG9ydCBjb25zdCBzdHJpcFN1ZmZpeCA9IChzOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogc3RyaW5nID0+XG5cdHMuZW5kc1dpdGgoc3VmZml4KSA/IHMuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpIDogcztcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUV4dGVuc2lvbiA9IChzOiBzdHJpbmcsIGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG5cdHN0cmlwU3VmZml4KHMsIGV4dCk7XG5cbi8qKiBSZXBsYWNlIGFsbCBmb3J3YXJkIHNsYXNoZXMgYW5kIGJhY2tzbGFzaGVzIHdpdGggdGhlIHBsYXRmb3JtLWFnbm9zdGljIGAvYC4gKi9cbmV4cG9ydCBjb25zdCB0b1Bvc2l4UGF0aCA9IChzOiBzdHJpbmcpOiBzdHJpbmcgPT4gcy5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuLyoqIFN0cmlwIGEgbGVhZGluZyBzbGFzaC4gKi9cbmV4cG9ydCBjb25zdCBzdHJpcExlYWRpbmdTbGFzaCA9IChzOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0cy5zdGFydHNXaXRoKFwiL1wiKSA/IHMuc2xpY2UoMSkgOiBzO1xuXG4vKiogU3RyaXAgYSB0cmFpbGluZyBzbGFzaC4gKi9cbmV4cG9ydCBjb25zdCBzdHJpcFRyYWlsaW5nU2xhc2ggPSAoczogc3RyaW5nKTogc3RyaW5nID0+XG5cdHMuZW5kc1dpdGgoXCIvXCIpICYmIHMubGVuZ3RoID4gMSA/IHMuc2xpY2UoMCwgLTEpIDogcztcblxuLyoqIENhcGl0YWxpemUgdGhlIGZpcnN0IGNoYXJhY3Rlci4gKi9cbmV4cG9ydCBjb25zdCBjYXBpdGFsaXplID0gKHM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRzLmxlbmd0aCA9PT0gMCA/IHMgOiBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKTtcblxuLyoqIFRpdGxlLWNhc2UgZWFjaCBkYXNoL3VuZGVyc2NvcmUgc2VwYXJhdGVkIHdvcmQuICovXG5leHBvcnQgY29uc3QgdGl0bGVDYXNlID0gKHM6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRzXG5cdFx0LnNwbGl0KC9bLV9cXHNdKy8pXG5cdFx0LmZpbHRlcigodykgPT4gdy5sZW5ndGggPiAwKVxuXHRcdC5tYXAoKHcpID0+IHcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3LnNsaWNlKDEpKVxuXHRcdC5qb2luKFwiIFwiKTtcblxuZXhwb3J0IGNvbnN0IHNsdWdpZnkgPSAoczogc3RyaW5nKTogc3RyaW5nID0+XG5cdHNcblx0XHQudG9Mb3dlckNhc2UoKVxuXHRcdC50cmltKClcblx0XHQucmVwbGFjZSgvW15hLXowLTlcXHMtXS9nLCBcIlwiKVxuXHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKVxuXHRcdC5yZXBsYWNlKC8tKy9nLCBcIi1cIilcblx0XHQucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKTtcblxuZXhwb3J0IGNvbnN0IHRydW5jYXRlID0gKHM6IHN0cmluZywgbWF4OiBudW1iZXIsIHN1ZmZpeCA9IFwiLi4uXCIpOiBzdHJpbmcgPT5cblx0cy5sZW5ndGggPD0gbWF4XG5cdFx0PyBzXG5cdFx0OiBgJHtzLnNsaWNlKDAsIE1hdGgubWF4KDAsIG1heCAtIHN1ZmZpeC5sZW5ndGgpKX0ke3N1ZmZpeH1gO1xuXG5leHBvcnQgY29uc3Qgc3BsaXRMaW5lcyA9IChzOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiBzLnNwbGl0KC9cXHI/XFxuLyk7XG5cbmV4cG9ydCBjb25zdCBzdHJpcFF1b3RlcyA9IChzOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRjb25zdCB0ID0gcy50cmltKCk7XG5cdGlmIChcblx0XHQodC5zdGFydHNXaXRoKCdcIicpICYmIHQuZW5kc1dpdGgoJ1wiJykpIHx8XG5cdFx0KHQuc3RhcnRzV2l0aChcIidcIikgJiYgdC5lbmRzV2l0aChcIidcIikpXG5cdCkge1xuXHRcdHJldHVybiB0LnNsaWNlKDEsIC0xKTtcblx0fVxuXHRyZXR1cm4gdDtcbn07XG4iLAogICAgIi8qKlxuICogUHVyZSBkb21haW4gb3BlcmF0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBEb2NQYWdlIGZyb20gcGFyc2VkIG1hcmtkb3duLlxuICovXG5cbmltcG9ydCB7IHRvUG9zaXhQYXRoIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvdXRpbHMvc3RyaW5nXCI7XG5pbXBvcnQgdHlwZSB7IERvY1BhZ2UsIEZyb250bWF0dGVyLCBQYXJzZWRDb250ZW50LCBUb2NJdGVtIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEb2NJZCwgRG9jU2x1ZywgRmlsZVBhdGggfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZERvY1BhZ2VJbnB1dCB7XG5cdHNsdWc6IHN0cmluZztcblx0ZmlsZVBhdGg6IHN0cmluZztcblx0cGFyc2VkOiBQYXJzZWRDb250ZW50O1xuXHRsYXN0TW9kaWZpZWRNcz86IG51bWJlcjtcblx0ZWRpdFVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFZGl0TGlua0NvbmZpZyB7XG5cdHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXHRyZWFkb25seSBiYXNlVXJsPzogc3RyaW5nO1xuXHRyZWFkb25seSBicmFuY2g/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHBhcnNlVG9jID0gKGNvbnRlbnQ6IHN0cmluZyk6IHJlYWRvbmx5IFRvY0l0ZW1bXSA9PiB7XG5cdGNvbnN0IGhlYWRpbmdzOiBUb2NJdGVtW10gPSBbXTtcblx0Y29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRmb3IgKGNvbnN0IGxpbmUgb2YgY29udGVudC5zcGxpdCgvXFxyP1xcbi8pKSB7XG5cdFx0Y29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKCN7MSw2fSlcXHMrKC4rKSQvKTtcblx0XHRpZiAoIW1hdGNoKSBjb250aW51ZTtcblx0XHRjb25zdCBkZXB0aCA9IG1hdGNoWzFdLmxlbmd0aCBhcyBUb2NJdGVtW1wiZGVwdGhcIl07XG5cdFx0Y29uc3QgcmF3VGV4dCA9IG1hdGNoWzJdLnRyaW0oKTtcblx0XHQvLyBTdHJpcCBtYXJrZG93biBsaW5rcywgZW1waGFzaXMsIGFuZCBpbmxpbmUgY29kZSBtYXJrZXJzLlxuXHRcdGNvbnN0IHRleHQgPSByYXdUZXh0XG5cdFx0XHQucmVwbGFjZSgvXFxbKFteXFxdXSspXFxdXFwoW14pXStcXCkvZywgXCIkMVwiKVxuXHRcdFx0LnJlcGxhY2UoL1sqX2BdL2csIFwiXCIpO1xuXHRcdGxldCBpZCA9IHRleHRcblx0XHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0XHQucmVwbGFjZSgvW15hLXowLTlcXHMtXS9nLCBcIlwiKVxuXHRcdFx0LnJlcGxhY2UoL1xccysvZywgXCItXCIpXG5cdFx0XHQucmVwbGFjZSgvLSsvZywgXCItXCIpXG5cdFx0XHQucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKTtcblx0XHRpZiAoIWlkKSBpZCA9IGBoZWFkaW5nLSR7aGVhZGluZ3MubGVuZ3RofWA7XG5cdFx0aWYgKHNlZW4uaGFzKGlkKSkge1xuXHRcdFx0bGV0IHN1ZmZpeCA9IDE7XG5cdFx0XHRsZXQgY2FuZGlkYXRlID0gYCR7aWR9LSR7c3VmZml4fWA7XG5cdFx0XHR3aGlsZSAoc2Vlbi5oYXMoY2FuZGlkYXRlKSkge1xuXHRcdFx0XHRzdWZmaXgrKztcblx0XHRcdFx0Y2FuZGlkYXRlID0gYCR7aWR9LSR7c3VmZml4fWA7XG5cdFx0XHR9XG5cdFx0XHRpZCA9IGNhbmRpZGF0ZTtcblx0XHR9XG5cdFx0c2Vlbi5hZGQoaWQpO1xuXHRcdGhlYWRpbmdzLnB1c2goeyBpZCwgdGV4dCwgZGVwdGggfSk7XG5cdH1cblx0cmV0dXJuIGhlYWRpbmdzO1xufTtcblxuY29uc3QgZGVyaXZlVGl0bGUgPSAoXG5cdGZyb250bWF0dGVyOiBGcm9udG1hdHRlcixcblx0ZmlsZVBhdGg6IHN0cmluZyxcblx0c2x1Zzogc3RyaW5nLFxuKTogc3RyaW5nID0+IHtcblx0aWYgKHR5cGVvZiBmcm9udG1hdHRlci50aXRsZSA9PT0gXCJzdHJpbmdcIiAmJiBmcm9udG1hdHRlci50aXRsZS50cmltKCkpIHtcblx0XHRyZXR1cm4gZnJvbnRtYXR0ZXIudGl0bGUudHJpbSgpO1xuXHR9XG5cdGNvbnN0IG5hbWUgPSBmaWxlUGF0aC5zcGxpdCgvWy9cXFxcXS8pLnBvcCgpID8/IHNsdWc7XG5cdGNvbnN0IHdpdGhvdXRFeHQgPSBuYW1lLnJlcGxhY2UoL1xcLm1keD8kL2ksIFwiXCIpO1xuXHRjb25zdCBsYXN0ID0gd2l0aG91dEV4dC5yZXBsYWNlKC9bLV9dL2csIFwiIFwiKS5zcGxpdChcIiBcIikucG9wKCkgPz8gd2l0aG91dEV4dDtcblx0cmV0dXJuIGxhc3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBsYXN0LnNsaWNlKDEpO1xufTtcblxuY29uc3QgZGVyaXZlR3JvdXAgPSAoXG5cdGZyb250bWF0dGVyOiBGcm9udG1hdHRlcixcblx0c2x1Zzogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcblx0aWYgKHR5cGVvZiBmcm9udG1hdHRlci5jYXRlZ29yeSA9PT0gXCJzdHJpbmdcIiAmJiBmcm9udG1hdHRlci5jYXRlZ29yeS50cmltKCkpIHtcblx0XHRyZXR1cm4gZnJvbnRtYXR0ZXIuY2F0ZWdvcnkudHJpbSgpO1xuXHR9XG5cdGNvbnN0IGZpcnN0U2VnbWVudCA9IHNsdWcuc3BsaXQoXCIvXCIpWzBdO1xuXHRpZiAoZmlyc3RTZWdtZW50ICYmIGZpcnN0U2VnbWVudCAhPT0gc2x1Zykge1xuXHRcdHJldHVybiBmaXJzdFNlZ21lbnQ7XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGNvbXB1dGVNZXRhZGF0YSA9IChcblx0Y29udGVudDogc3RyaW5nLFxuXHRsYXN0TW9kaWZpZWRNczogbnVtYmVyIHwgdW5kZWZpbmVkLFxuXHRlZGl0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBEb2NQYWdlW1wibWV0YWRhdGFcIl0gPT4ge1xuXHRjb25zdCB3b3JkcyA9IGNvbnRlbnRcblx0XHQucmVwbGFjZSgvWyMqX2BbXFxdKCl7fXxdL2csIFwiIFwiKVxuXHRcdC5zcGxpdCgvXFxzKy8pXG5cdFx0LmZpbHRlcigodykgPT4gdy5sZW5ndGggPiAwKS5sZW5ndGg7XG5cdGNvbnN0IHJlYWRpbmdUaW1lID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh3b3JkcyAvIDIwMCkpO1xuXHRjb25zdCBtZXRhZGF0YTogRG9jUGFnZVtcIm1ldGFkYXRhXCJdID0ge1xuXHRcdHJlYWRpbmdUaW1lLFxuXHRcdHdvcmRDb3VudDogd29yZHMsXG5cdFx0Li4uKGxhc3RNb2RpZmllZE1zICE9PSB1bmRlZmluZWRcblx0XHRcdD8geyBsYXN0TW9kaWZpZWQ6IG5ldyBEYXRlKGxhc3RNb2RpZmllZE1zKS50b0lTT1N0cmluZygpIH1cblx0XHRcdDoge30pLFxuXHRcdC4uLihlZGl0VXJsICE9PSB1bmRlZmluZWQgPyB7IGVkaXRVcmwgfSA6IHt9KSxcblx0fTtcblx0cmV0dXJuIG1ldGFkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkRWRpdFVybCA9IChcblx0ZmlsZVBhdGg6IHN0cmluZyxcblx0ZWRpdExpbms6IEVkaXRMaW5rQ29uZmlnLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcblx0aWYgKGVkaXRMaW5rLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCBiYXNlID0gZWRpdExpbmsuYmFzZVVybCA/PyBcIlwiO1xuXHRpZiAoYmFzZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cdGNvbnN0IGJyYW5jaCA9IGVkaXRMaW5rLmJyYW5jaCA/PyBcIm1haW5cIjtcblx0Y29uc3QgcG9zaXggPSB0b1Bvc2l4UGF0aChmaWxlUGF0aCkucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcblx0Y29uc3QgdGFpbCA9IHBvc2l4LnN0YXJ0c1dpdGgoXCJkb2NzL1wiKSA/IHBvc2l4LnNsaWNlKDUpIDogcG9zaXg7XG5cdHJldHVybiBgJHtiYXNlLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vZWRpdC8ke2JyYW5jaH0vJHt0YWlsfWA7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGREb2NQYWdlID0gKGlucHV0OiBCdWlsZERvY1BhZ2VJbnB1dCk6IERvY1BhZ2UgPT4ge1xuXHRjb25zdCB7IHNsdWcsIGZpbGVQYXRoLCBwYXJzZWQsIGxhc3RNb2RpZmllZE1zLCBlZGl0VXJsIH0gPSBpbnB1dDtcblx0Y29uc3QgdGl0bGUgPSBkZXJpdmVUaXRsZShwYXJzZWQuZnJvbnRtYXR0ZXIsIGZpbGVQYXRoLCBzbHVnKTtcblx0Y29uc3QgZGVzY3JpcHRpb24gPVxuXHRcdHR5cGVvZiBwYXJzZWQuZnJvbnRtYXR0ZXIuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCJcblx0XHRcdD8gcGFyc2VkLmZyb250bWF0dGVyLmRlc2NyaXB0aW9uXG5cdFx0XHQ6IHVuZGVmaW5lZDtcblx0Y29uc3QgZ3JvdXAgPSBkZXJpdmVHcm91cChwYXJzZWQuZnJvbnRtYXR0ZXIsIHNsdWcpO1xuXHRjb25zdCBvcmRlciA9XG5cdFx0dHlwZW9mIHBhcnNlZC5mcm9udG1hdHRlci5vcmRlciA9PT0gXCJudW1iZXJcIiA/IHBhcnNlZC5mcm9udG1hdHRlci5vcmRlciA6IDA7XG5cdGNvbnN0IHRvYyA9IHBhcnNlVG9jKHBhcnNlZC5jb250ZW50KTtcblx0Y29uc3QgaWQgPSBzbHVnLnJlcGxhY2UoL1xcLy9nLCBcIi1cIik7XG5cblx0cmV0dXJuIHtcblx0XHRpZDogRG9jSWQoaWQpLFxuXHRcdHNsdWc6IERvY1NsdWcoc2x1ZyksXG5cdFx0dGl0bGUsXG5cdFx0ZGVzY3JpcHRpb24sXG5cdFx0ZnJvbnRtYXR0ZXI6IHBhcnNlZC5mcm9udG1hdHRlcixcblx0XHRjb250ZW50OiBwYXJzZWQuY29udGVudCxcblx0XHRyYXdDb250ZW50OiBwYXJzZWQucmF3Q29udGVudCxcblx0XHRmaWxlUGF0aDogRmlsZVBhdGgoZmlsZVBhdGgpLFxuXHRcdGdyb3VwLFxuXHRcdG9yZGVyLFxuXHRcdHRvYyxcblx0XHRtZXRhZGF0YTogY29tcHV0ZU1ldGFkYXRhKHBhcnNlZC5jb250ZW50LCBsYXN0TW9kaWZpZWRNcywgZWRpdFVybCksXG5cdH07XG59O1xuIiwKICAgICIvKipcbiAqIENvbXBpbGUtdGltZSBzdGF0aWMgY29uc3RhbnRzLiBUaGVzZSBhcmUgdGhlIG9ubHkgc2FmZSB2YWx1ZXNcbiAqIHRvIGltcG9ydCBpbiB0aGUgZG9tYWluIGxheWVyICh3aGVyZSBJL08gaXMgZm9yYmlkZGVuKS5cbiAqL1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9ET0NTX0RJUiA9IFwiZG9jc1wiIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFTRV9ST1VURSA9IFwiL2RvY3NcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1BPUlQgPSA1MTczIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFZJUlRVQUxfUFJFRklYID0gXCJ2aXJ0dWFsOmRvY3MvXCIgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgUExVR0lOX05BTUUgPSBcInZpdGUtcGx1Z2luLWRvY3NcIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNVUFBPUlRFRF9FWFRFTlNJT05TID0gW1wiLm1kXCIsIFwiLm1kb2NcIl0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgRlJPTlRNQVRURVJfREVMSU1JVEVSID0gXCItLS1cIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFNFQVJDSF9DT05URU5UX0xJTUlUID0gNTAwIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFNJREVCQVJfREVGQVVMVF9HUk9VUF9USVRMRSA9IFwiRG9jdW1lbnRhdGlvblwiIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFNJREVCQVJfREVGQVVMVF9PUkRFUiA9IDk5OSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IEJBREdFX1ZBUklBTlRTID0gW1xuXHRcImRlZmF1bHRcIixcblx0XCJzdWNjZXNzXCIsXG5cdFwid2FybmluZ1wiLFxuXHRcImRhbmdlclwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBBUElfQVVUSF9UWVBFUyA9IFtcImJlYXJlclwiLCBcImFwaUtleVwiLCBcIm9hdXRoMlwiXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBIVFRQX01FVEhPRFMgPSBbXCJHRVRcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiUEFUQ0hcIiwgXCJERUxFVEVcIl0gYXMgY29uc3Q7XG4iLAogICAgIi8qKlxuICogUHVyZSBvYmplY3QgdXRpbGl0eSBmdW5jdGlvbnMuIE5vIG11dGF0aW9uIG9mIGlucHV0cy5cbiAqL1xuXG5leHBvcnQgY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2OiB1bmtub3duKTogdiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuXHR0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpO1xuXG5leHBvcnQgY29uc3QgaXNTdHJpbmcgPSAodjogdW5rbm93bik6IHYgaXMgc3RyaW5nID0+IHR5cGVvZiB2ID09PSBcInN0cmluZ1wiO1xuXG5leHBvcnQgY29uc3QgaXNOdW1iZXIgPSAodjogdW5rbm93bik6IHYgaXMgbnVtYmVyID0+XG5cdHR5cGVvZiB2ID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNOYU4odik7XG5cbmV4cG9ydCBjb25zdCBpc0Jvb2xlYW4gPSAodjogdW5rbm93bik6IHYgaXMgYm9vbGVhbiA9PiB0eXBlb2YgdiA9PT0gXCJib29sZWFuXCI7XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSBhcyA8VD4odjogdW5rbm93bikgPT4gdiBpcyBUW107XG5cbmV4cG9ydCBjb25zdCBpc05vbkVtcHR5U3RyaW5nID0gKHY6IHVua25vd24pOiB2IGlzIHN0cmluZyA9PlxuXHRpc1N0cmluZyh2KSAmJiB2Lmxlbmd0aCA+IDA7XG5cbmV4cG9ydCBjb25zdCBpc05vbkVtcHR5QXJyYXkgPSA8VD4oXG5cdHY6IHJlYWRvbmx5IFRbXSxcbik6IHYgaXMgcmVhZG9ubHkgW1QsIC4uLlRbXV0gPT4gdi5sZW5ndGggPiAwO1xuXG5leHBvcnQgY29uc3Qga2V5cyA9IDxUIGV4dGVuZHMgb2JqZWN0PihvOiBUKTogcmVhZG9ubHkgKGtleW9mIFQpW10gPT5cblx0T2JqZWN0LmtleXMobykgYXMgKGtleW9mIFQpW107XG5cbmV4cG9ydCBjb25zdCBwaWNrID0gPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihcblx0bzogVCxcblx0a3M6IHJlYWRvbmx5IEtbXSxcbik6IFBpY2s8VCwgSz4gPT4ge1xuXHRjb25zdCBvdXQgPSB7fSBhcyBQaWNrPFQsIEs+O1xuXHRmb3IgKGNvbnN0IGsgb2Yga3MpIHtcblx0XHRpZiAoayBpbiBvKSBvdXRba10gPSBvW2tdO1xuXHR9XG5cdHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgY29uc3Qgb21pdCA9IDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4oXG5cdG86IFQsXG5cdGtzOiByZWFkb25seSBLW10sXG4pOiBPbWl0PFQsIEs+ID0+IHtcblx0Y29uc3Qgb3V0ID0geyAuLi5vIH07XG5cdGZvciAoY29uc3QgayBvZiBrcykge1xuXHRcdGRlbGV0ZSBvdXRba107XG5cdH1cblx0cmV0dXJuIG91dDtcbn07XG4iLAogICAgIi8qKlxuICogRWl0aGVyPEwsIFI+IOKAlCBBIHB1cmUgYWxnZWJyYWljIGRhdGEgdHlwZSBmb3IgYSB2YWx1ZSB0aGF0IGNhbiBiZSBvbmUgb2YgdHdvIHR5cGVzLlxuICpcbiAqIENvbnZlbnRpb246IEwgPSBcImxlZnRcIiAob2Z0ZW4gYW4gZXJyb3Ivc2hvcnQtY2lyY3VpdCksIFIgPSBcInJpZ2h0XCIgKHN1Y2Nlc3MvY29udGludWF0aW9uKS5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIHRvIG1vZGVsIHR3byB2YWxpZCBvdXRjb21lcyAoZS5nLiwgYSB2YWx1ZSBPUiBhIHJlYXNvbiBpdCBpc24ndCBhcHBsaWNhYmxlKVxuICogd2l0aG91dCBjb21taXR0aW5nIHRvIFJlc3VsdCdzIFwiZXJyXCIgc2VtYW50aWNzLlxuICovXG5leHBvcnQgdHlwZSBFaXRoZXI8TCwgUj4gPVxuXHR8IHsgcmVhZG9ubHkgdGFnOiBcImxlZnRcIjsgcmVhZG9ubHkgbGVmdDogTCB9XG5cdHwgeyByZWFkb25seSB0YWc6IFwicmlnaHRcIjsgcmVhZG9ubHkgcmlnaHQ6IFIgfTtcblxuZXhwb3J0IGNvbnN0IGxlZnQgPSA8TD4odmFsdWU6IEwpOiBFaXRoZXI8TCwgbmV2ZXI+ID0+ICh7XG5cdHRhZzogXCJsZWZ0XCIsXG5cdGxlZnQ6IHZhbHVlLFxufSk7XG5cbmV4cG9ydCBjb25zdCByaWdodCA9IDxSPih2YWx1ZTogUik6IEVpdGhlcjxuZXZlciwgUj4gPT4gKHtcblx0dGFnOiBcInJpZ2h0XCIsXG5cdHJpZ2h0OiB2YWx1ZSxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNMZWZ0ID0gPEwsIFI+KGU6IEVpdGhlcjxMLCBSPik6IGUgaXMgeyB0YWc6IFwibGVmdFwiOyBsZWZ0OiBMIH0gPT5cblx0ZS50YWcgPT09IFwibGVmdFwiO1xuXG5leHBvcnQgY29uc3QgaXNSaWdodCA9IDxMLCBSPihcblx0ZTogRWl0aGVyPEwsIFI+LFxuKTogZSBpcyB7IHRhZzogXCJyaWdodFwiOyByaWdodDogUiB9ID0+IGUudGFnID09PSBcInJpZ2h0XCI7XG5cbmV4cG9ydCBjb25zdCBtYXAgPSA8TCwgUiwgUjI+KFxuXHRlOiBFaXRoZXI8TCwgUj4sXG5cdGZuOiAocmlnaHQ6IFIpID0+IFIyLFxuKTogRWl0aGVyPEwsIFIyPiA9PiAoZS50YWcgPT09IFwicmlnaHRcIiA/IHJpZ2h0KGZuKGUucmlnaHQpKSA6IGUpO1xuXG5leHBvcnQgY29uc3QgbWFwTGVmdCA9IDxMLCBMMiwgUj4oXG5cdGU6IEVpdGhlcjxMLCBSPixcblx0Zm46IChsZWZ0OiBMKSA9PiBMMixcbik6IEVpdGhlcjxMMiwgUj4gPT4gKGUudGFnID09PSBcImxlZnRcIiA/IGxlZnQoZm4oZS5sZWZ0KSkgOiBlKTtcbiIsCiAgICAiLyoqXG4gKiBPcHRpb248VD4g4oCUIEEgcHVyZSBhbGdlYnJhaWMgZGF0YSB0eXBlIGZvciB2YWx1ZXMgdGhhdCBtYXkgYmUgYWJzZW50LlxuICpcbiAqIFVzZSB0aGlzIHRvIG1vZGVsIG51bGxhYmxlIHZhbHVlcyB3aXRob3V0IGBudWxsIHwgdW5kZWZpbmVkYCBsZWFrYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGNvbnN0IGZpbmRVc2VyID0gKGlkOiBzdHJpbmcpOiBPcHRpb248VXNlcj4gPT5cbiAqICAgICB1c2Vycy5oYXMoaWQpID8gc29tZSh1c2Vycy5nZXQoaWQpISkgOiBub25lO1xuICovXG5leHBvcnQgdHlwZSBPcHRpb248VD4gPVxuXHR8IHsgcmVhZG9ubHkga2luZDogXCJzb21lXCI7IHJlYWRvbmx5IHZhbHVlOiBUIH1cblx0fCB7IHJlYWRvbmx5IGtpbmQ6IFwibm9uZVwiIH07XG5cbmV4cG9ydCBjb25zdCBzb21lID0gPFQ+KHZhbHVlOiBUKTogT3B0aW9uPFQ+ID0+ICh7IGtpbmQ6IFwic29tZVwiLCB2YWx1ZSB9KTtcblxuZXhwb3J0IGNvbnN0IG5vbmUgPSA8VCA9IG5ldmVyPigpOiBPcHRpb248VD4gPT4gKHsga2luZDogXCJub25lXCIgfSk7XG5cbmV4cG9ydCBjb25zdCBpc1NvbWUgPSA8VD4obzogT3B0aW9uPFQ+KTogbyBpcyB7IGtpbmQ6IFwic29tZVwiOyB2YWx1ZTogVCB9ID0+XG5cdG8ua2luZCA9PT0gXCJzb21lXCI7XG5cbmV4cG9ydCBjb25zdCBpc05vbmUgPSA8VD4obzogT3B0aW9uPFQ+KTogbyBpcyB7IGtpbmQ6IFwibm9uZVwiIH0gPT5cblx0by5raW5kID09PSBcIm5vbmVcIjtcblxuZXhwb3J0IGNvbnN0IG1hcCA9IDxULCBVPihvOiBPcHRpb248VD4sIGZuOiAodmFsdWU6IFQpID0+IFUpOiBPcHRpb248VT4gPT5cblx0by5raW5kID09PSBcInNvbWVcIiA/IHNvbWUoZm4oby52YWx1ZSkpIDogbztcblxuZXhwb3J0IGNvbnN0IGZsYXRNYXAgPSA8VCwgVT4oXG5cdG86IE9wdGlvbjxUPixcblx0Zm46ICh2YWx1ZTogVCkgPT4gT3B0aW9uPFU+LFxuKTogT3B0aW9uPFU+ID0+IChvLmtpbmQgPT09IFwic29tZVwiID8gZm4oby52YWx1ZSkgOiBvKTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlciA9IDxUPihcblx0bzogT3B0aW9uPFQ+LFxuXHRwcmVkOiAodmFsdWU6IFQpID0+IGJvb2xlYW4sXG4pOiBPcHRpb248VD4gPT4gKG8ua2luZCA9PT0gXCJzb21lXCIgJiYgcHJlZChvLnZhbHVlKSA/IG8gOiBub25lKCkpO1xuXG5leHBvcnQgY29uc3Qgb3JFbHNlID0gPFQ+KG86IE9wdGlvbjxUPiwgZmFsbGJhY2s6IE9wdGlvbjxUPik6IE9wdGlvbjxUPiA9PlxuXHRvLmtpbmQgPT09IFwic29tZVwiID8gbyA6IGZhbGxiYWNrO1xuXG5leHBvcnQgY29uc3QgZ2V0T3JFbHNlID0gPFQ+KG86IE9wdGlvbjxUPiwgZmFsbGJhY2s6IFQpOiBUID0+XG5cdG8ua2luZCA9PT0gXCJzb21lXCIgPyBvLnZhbHVlIDogZmFsbGJhY2s7XG5cbmV4cG9ydCBjb25zdCB0b051bGxhYmxlID0gPFQ+KG86IE9wdGlvbjxUPik6IFQgfCBudWxsID0+XG5cdG8ua2luZCA9PT0gXCJzb21lXCIgPyBvLnZhbHVlIDogbnVsbDtcblxuZXhwb3J0IGNvbnN0IGZyb21OdWxsYWJsZSA9IDxUPih2YWx1ZTogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBPcHRpb248VD4gPT5cblx0dmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IG5vbmUoKSA6IHNvbWUodmFsdWUpO1xuXG5leHBvcnQgY29uc3QgZnJvbVByZWRpY2F0ZSA9IDxUPihcblx0dmFsdWU6IFQsXG5cdHByZWQ6ICh2OiBUKSA9PiBib29sZWFuLFxuKTogT3B0aW9uPFQ+ID0+IChwcmVkKHZhbHVlKSA/IHNvbWUodmFsdWUpIDogbm9uZSgpKTtcbiIsCiAgICAiLyoqXG4gKiBQdXJlIFlBTUwgMS4yIHBhcnNlciBvcGVyYXRpb25zLlxuICogTm8gSS9PLiBObyBleGNlcHRpb25zIHRocm93bi4gUmV0dXJucyBSZXN1bHQgdHlwZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZXN1bHQgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgZXJyLCBvayB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3R5cGVzXCI7XG5pbXBvcnQgeyBkdW1wLCBKU09OX1NDSEVNQSwgbG9hZCwgWUFNTEV4Y2VwdGlvbiB9IGZyb20gXCJqcy15YW1sXCI7XG5cbmV4cG9ydCB0eXBlIFlhbWxQYXJzZUVycm9yID0ge1xuXHRyZWFkb25seSBraW5kOiBcInlhbWwtcGFyc2UtZXJyb3JcIjtcblx0cmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuXHRyZWFkb25seSBsaW5lPzogbnVtYmVyO1xuXHRyZWFkb25seSBjb2x1bW4/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIFBhcnNlIFlBTUwgc3RyaW5nIHdpdGggc2FmZSBZQU1MIDEuMiBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZVlhbWwgPSAocmF3OiBzdHJpbmcpOiBSZXN1bHQ8dW5rbm93biwgWWFtbFBhcnNlRXJyb3I+ID0+IHtcblx0dHJ5IHtcblx0XHRjb25zdCB2YWx1ZSA9IGxvYWQocmF3LCB7IHNjaGVtYTogSlNPTl9TQ0hFTUEgfSk7XG5cdFx0cmV0dXJuIG9rKHZhbHVlKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcblx0XHRjb25zdCBsaW5lID0gZXJyb3IgaW5zdGFuY2VvZiBZQU1MRXhjZXB0aW9uID8gZXJyb3IubWFyaz8ubGluZSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCBjb2x1bW4gPVxuXHRcdFx0ZXJyb3IgaW5zdGFuY2VvZiBZQU1MRXhjZXB0aW9uID8gZXJyb3IubWFyaz8uY29sdW1uIDogdW5kZWZpbmVkO1xuXHRcdHJldHVybiBlcnIoe1xuXHRcdFx0a2luZDogXCJ5YW1sLXBhcnNlLWVycm9yXCIsXG5cdFx0XHRtZXNzYWdlLFxuXHRcdFx0bGluZSxcblx0XHRcdGNvbHVtbixcblx0XHR9KTtcblx0fVxufTtcblxuLyoqXG4gKiBTdHJpbmdpZnkgb2JqZWN0IHRvIFlBTUwuXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdpZnlZYW1sID0gKFxuXHR2YWx1ZTogdW5rbm93bixcbik6IFJlc3VsdDxzdHJpbmcsIFlhbWxQYXJzZUVycm9yPiA9PiB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gZHVtcCh2YWx1ZSwge1xuXHRcdFx0c2NoZW1hOiBKU09OX1NDSEVNQSxcblx0XHRcdGluZGVudDogMixcblx0XHRcdGxpbmVXaWR0aDogLTEsXG5cdFx0XHRub1JlZnM6IHRydWUsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9rKHJlc3VsdCk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuIGVycih7XG5cdFx0XHRraW5kOiBcInlhbWwtcGFyc2UtZXJyb3JcIixcblx0XHRcdG1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCIsXG5cdFx0fSk7XG5cdH1cbn07XG4iLAogICAgIi8qKlxuICogUHVyZSBmcm9udG1hdHRlciBwYXJzZXIuXG4gKiBObyBJL08uIE5vIGV4Y2VwdGlvbnMgdGhyb3duLiBSZXR1cm5zIFBhcnNlZENvbnRlbnQuXG4gKlxuICogU3VwcG9ydHM6XG4gKiAgIC0gRnVsbCBZQU1MIDEuMiB2aWEganMteWFtbCBhZGFwdGVyIChuZXN0ZWQgb2JqZWN0cywgZGF0ZXMsIGFuY2hvcnMpXG4gKiAgIC0gRmFsbGJhY2sgdG8gbWluaS1wYXJzZXIgZm9yIHNpbXBsZSBjYXNlc1xuICogICAtIFNjYWxhciB2YWx1ZXM6IHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsXG4gKiAgIC0gSW5saW5lIGFycmF5czogW2EsIGIsIGNdXG4gKiAgIC0gTGlzdCBhcnJheXM6XG4gKiAgICAgICB0YWdzOlxuICogICAgICAgICAtIGFcbiAqICAgICAgICAgLSBiXG4gKiAgIC0gUXVvdGVkIHN0cmluZ3MgKFwidmFsdWVcIiBvciAndmFsdWUnKVxuICovXG5pbXBvcnQge1xuXHRGUk9OVE1BVFRFUl9ERUxJTUlURVIsXG5cdFNJREVCQVJfREVGQVVMVF9PUkRFUixcbn0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3V0aWxzL29iamVjdFwiO1xuaW1wb3J0IHtcblx0aXNCbGFuayxcblx0c3BsaXRMaW5lcyxcblx0c3RyaXBRdW90ZXMsXG5cdHN0cmlwU3VmZml4LFxufSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC91dGlscy9zdHJpbmdcIjtcbmltcG9ydCB7IHBhcnNlWWFtbCB9IGZyb20gXCIuLi8uLi8uLi95YW1sLXBhcnNlci9kb21haW4vb3BlcmF0aW9ucy9wYXJzZS15YW1sXCI7XG5pbXBvcnQgdHlwZSB7IEZyb250bWF0dGVyLCBQYXJzZWRDb250ZW50LCBUb2NJdGVtIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmNvbnN0IHBhcnNlU2NhbGFyID0gKHJhdzogc3RyaW5nKTogdW5rbm93biA9PiB7XG5cdGNvbnN0IHZhbHVlID0gc3RyaXBRdW90ZXMocmF3KTtcblx0aWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG5cdGlmICh2YWx1ZSA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZSA9PT0gXCJudWxsXCIgfHwgdmFsdWUgPT09IFwiflwiKSByZXR1cm4gbnVsbDtcblx0aWYgKHZhbHVlID09PSBcIlwiKSByZXR1cm4gXCJcIjtcblx0aWYgKC9eLT9cXGQrJC8udGVzdCh2YWx1ZSkpIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcblx0aWYgKC9eLT9cXGQqXFwuXFxkKyQvLnRlc3QodmFsdWUpKSByZXR1cm4gTnVtYmVyLnBhcnNlRmxvYXQodmFsdWUpO1xuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCBwYXJzZUlubGluZUxpc3QgPSAocmF3OiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG5cdGNvbnN0IGlubmVyID0gcmF3LnNsaWNlKDEsIC0xKS50cmltKCk7XG5cdGlmIChpbm5lci5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblx0cmV0dXJuIGlubmVyXG5cdFx0LnNwbGl0KFwiLFwiKVxuXHRcdC5tYXAoKHYpID0+IHN0cmlwUXVvdGVzKHYudHJpbSgpKSlcblx0XHQuZmlsdGVyKCh2KSA9PiB2Lmxlbmd0aCA+IDApO1xufTtcblxuLyoqIFBhcnNlIGEgbXVsdGktbGluZSBmcm9udG1hdHRlciBibG9jayAod2l0aG91dCBkZWxpbWl0ZXJzKSBpbnRvIGEgdHlwZWQgb2JqZWN0LiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlRnJvbnRtYXR0ZXJCbG9jayA9IChcblx0bGluZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogRnJvbnRtYXR0ZXIgPT4ge1xuXHRjb25zdCBibG9jayA9IGxpbmVzLmpvaW4oXCJcXG5cIik7XG5cdGNvbnN0IHlhbWxSZXN1bHQgPSBwYXJzZVlhbWwoYmxvY2spO1xuXG5cdGlmIChcblx0XHR5YW1sUmVzdWx0Lm9rICYmXG5cdFx0dHlwZW9mIHlhbWxSZXN1bHQudmFsdWUgPT09IFwib2JqZWN0XCIgJiZcblx0XHR5YW1sUmVzdWx0LnZhbHVlICE9PSBudWxsXG5cdCkge1xuXHRcdHJldHVybiB5YW1sUmVzdWx0LnZhbHVlIGFzIEZyb250bWF0dGVyO1xuXHR9XG5cblx0Ly8gRmFsbGJhY2sgdG8gbWluaS1wYXJzZXIgZm9yIHNpbXBsZSBjYXNlc1xuXHRjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdGxldCBpID0gMDtcblx0d2hpbGUgKGkgPCBsaW5lcy5sZW5ndGgpIHtcblx0XHRjb25zdCBsaW5lID0gbGluZXNbaV0gPz8gXCJcIjtcblx0XHRjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cdFx0aWYgKHRyaW1tZWQubGVuZ3RoID09PSAwIHx8IHRyaW1tZWQuc3RhcnRzV2l0aChcIiNcIikpIHtcblx0XHRcdGkrKztcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbG9uSWR4ID0gbGluZS5pbmRleE9mKFwiOlwiKTtcblx0XHRpZiAoY29sb25JZHggPCAwKSB7XG5cdFx0XHRpKys7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBrZXkgPSBsaW5lLnNsaWNlKDAsIGNvbG9uSWR4KS50cmltKCk7XG5cdFx0Y29uc3QgcmVzdCA9IGxpbmUuc2xpY2UoY29sb25JZHggKyAxKS50cmltKCk7XG5cblx0XHRpZiAocmVzdCA9PT0gXCJcIiB8fCByZXN0ID09PSBcInxcIiB8fCByZXN0ID09PSBcIj5cIikge1xuXHRcdFx0Ly8gTGlzdCBhcnJheSBzdGFydGluZyBvbiBuZXh0IGxpbmUocylcblx0XHRcdGNvbnN0IGl0ZW1zOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0aSsrO1xuXHRcdFx0d2hpbGUgKGkgPCBsaW5lcy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgbmV4dCA9IGxpbmVzW2ldID8/IFwiXCI7XG5cdFx0XHRcdGlmICghbmV4dC50cmltKCkuc3RhcnRzV2l0aChcIi1cIikpIGJyZWFrO1xuXHRcdFx0XHRpdGVtcy5wdXNoKHN0cmlwUXVvdGVzKG5leHQudHJpbSgpLnNsaWNlKDEpLnRyaW0oKSkpO1xuXHRcdFx0XHRpKys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXRlbXMubGVuZ3RoID4gMCkgb3V0W2tleV0gPSBpdGVtcztcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmIChyZXN0LnN0YXJ0c1dpdGgoXCJbXCIpICYmIHJlc3QuZW5kc1dpdGgoXCJdXCIpKSB7XG5cdFx0XHRvdXRba2V5XSA9IHBhcnNlSW5saW5lTGlzdChyZXN0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0W2tleV0gPSBwYXJzZVNjYWxhcihyZXN0KTtcblx0XHR9XG5cdFx0aSsrO1xuXHR9XG5cdHJldHVybiBvdXQgYXMgRnJvbnRtYXR0ZXI7XG59O1xuXG4vKiogUGFyc2UgYSByYXcgbWFya2Rvd24gZmlsZSdzIGNvbnRlbnRzLCBzZXBhcmF0aW5nIGZyb250bWF0dGVyIGZyb20gYm9keS4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZUZyb250bWF0dGVyID0gKHJhdzogc3RyaW5nKTogUGFyc2VkQ29udGVudCA9PiB7XG5cdGNvbnN0IGxpbmVzID0gc3BsaXRMaW5lcyhyYXcpO1xuXHRpZiAobGluZXNbMF0/LnRyaW0oKSAhPT0gRlJPTlRNQVRURVJfREVMSU1JVEVSKSB7XG5cdFx0cmV0dXJuIHsgZnJvbnRtYXR0ZXI6IHt9LCBjb250ZW50OiByYXcsIHJhd0NvbnRlbnQ6IHJhdyB9O1xuXHR9XG5cblx0bGV0IGVuZElkeCA9IC0xO1xuXHRmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGxpbmVzW2ldPy50cmltKCkgPT09IEZST05UTUFUVEVSX0RFTElNSVRFUikge1xuXHRcdFx0ZW5kSWR4ID0gaTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdGlmIChlbmRJZHggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHsgZnJvbnRtYXR0ZXI6IHt9LCBjb250ZW50OiByYXcsIHJhd0NvbnRlbnQ6IHJhdyB9O1xuXHR9XG5cblx0Y29uc3QgZm1MaW5lcyA9IGxpbmVzLnNsaWNlKDEsIGVuZElkeCk7XG5cdGNvbnN0IGNvbnRlbnRMaW5lcyA9IGxpbmVzLnNsaWNlKGVuZElkeCArIDEpO1xuXHRjb25zdCBmcm9udG1hdHRlciA9IHBhcnNlRnJvbnRtYXR0ZXJCbG9jayhmbUxpbmVzKTtcblx0Y29uc3QgY29udGVudCA9IGNvbnRlbnRMaW5lcy5qb2luKFwiXFxuXCIpO1xuXG5cdHJldHVybiB7IGZyb250bWF0dGVyLCBjb250ZW50LCByYXdDb250ZW50OiByYXcgfTtcbn07XG5cbi8qKiBFeHRyYWN0IGEgdGl0bGUgZnJvbSBmcm9udG1hdHRlciBvciBmYWxsIGJhY2sgdG8gc2x1ZyB0YWlsLiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RUaXRsZSA9IChcblx0ZnJvbnRtYXR0ZXI6IEZyb250bWF0dGVyLFxuXHRzbHVnOiBzdHJpbmcsXG4pOiBzdHJpbmcgPT4ge1xuXHRpZiAoaXNTdHJpbmcoZnJvbnRtYXR0ZXIudGl0bGUpICYmICFpc0JsYW5rKGZyb250bWF0dGVyLnRpdGxlKSkge1xuXHRcdHJldHVybiBmcm9udG1hdHRlci50aXRsZTtcblx0fVxuXHRjb25zdCBwYXJ0cyA9IHNsdWcuc3BsaXQoXCIvXCIpO1xuXHRyZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPz8gc2x1Zztcbn07XG5cbi8qKiBFeHRyYWN0IGEgbnVtZXJpYyBvcmRlciBmcm9tIGZyb250bWF0dGVyOyBkZWZhdWx0ID0gU0lERUJBUl9ERUZBVUxUX09SREVSLiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RPcmRlciA9IChmcm9udG1hdHRlcjogRnJvbnRtYXR0ZXIpOiBudW1iZXIgPT4ge1xuXHRjb25zdCBvID0gZnJvbnRtYXR0ZXIub3JkZXI7XG5cdHJldHVybiB0eXBlb2YgbyA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUobylcblx0XHQ/IG9cblx0XHQ6IFNJREVCQVJfREVGQVVMVF9PUkRFUjtcbn07XG5cbi8qKiBGaXJzdCBwYXRoIHNlZ21lbnQgb2YgYSBzbHVnLCB1c2VkIGZvciBncm91cGluZyBpbiBzaWRlYmFyLiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RHcm91cCA9IChzbHVnOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuXHRjb25zdCBwYXJ0cyA9IHNsdWcuc3BsaXQoXCIvXCIpO1xuXHRyZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzWzBdIDogdW5kZWZpbmVkO1xufTtcblxuLyoqIEdlbmVyYXRlIGEgZGV0ZXJtaW5pc3RpYyBpZCBmcm9tIGEgc2x1Zy4gKi9cbmV4cG9ydCBjb25zdCBzbHVnVG9JZCA9IChzbHVnOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0c2x1Zy5yZXBsYWNlKC9bL1xcXFxdL2csIFwiLVwiKS5yZXBsYWNlKC9eLS8sIFwiXCIpO1xuXG4vKiogU3RyaXAgYC5tZGAgb3IgYC5tZG9jYCBleHRlbnNpb24gZnJvbSBhIGZpbGUgbmFtZS4gKi9cbmV4cG9ydCBjb25zdCBzdHJpcE1hcmtkb3duRXh0ID0gKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT5cblx0c3RyaXBTdWZmaXgoc3RyaXBTdWZmaXgoZmlsZU5hbWUsIFwiLm1kb2NcIiksIFwiLm1kXCIpO1xuXG4vKiogRGV0ZXJtaW5lIGlmIGEgZmlsZSBuYW1lIGhhcyBhIHN1cHBvcnRlZCBtYXJrZG93biBleHRlbnNpb24uICovXG5leHBvcnQgY29uc3QgaXNNYXJrZG93bkZpbGUgPSAoZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT5cblx0ZmlsZU5hbWUuZW5kc1dpdGgoXCIubWRcIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoXCIubWRvY1wiKTtcblxuLyoqIEV4dHJhY3QgYSBkZXNjcmlwdGlvbiBmcm9tIGZyb250bWF0dGVyLCBpZiBhbnkuICovXG5leHBvcnQgY29uc3QgZXh0cmFjdERlc2NyaXB0aW9uID0gKFxuXHRmcm9udG1hdHRlcjogRnJvbnRtYXR0ZXIsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuXHRjb25zdCBkID0gZnJvbnRtYXR0ZXIuZGVzY3JpcHRpb247XG5cdHJldHVybiBpc1N0cmluZyhkKSAmJiAhaXNCbGFuayhkKSA/IGQgOiB1bmRlZmluZWQ7XG59O1xuXG4vKiogU3RyaXAgTWFya2Rvd24gZm9ybWF0dGluZyBmcm9tIGEgYm9keSBzbyB3ZSBjYW4gaW5kZXggcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBwbGFpblRleHQgPSAobWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuXHRtZFxuXHRcdC5yZXBsYWNlKC9gYGBbXFxzXFxTXSo/YGBgL2csIFwiIFwiKSAvLyBmZW5jZWQgY29kZVxuXHRcdC5yZXBsYWNlKC9+fn5bXFxzXFxTXSo/fn5+L2csIFwiIFwiKSAvLyB0aWxkZSBjb2RlXG5cdFx0LnJlcGxhY2UoL2BbXmBcXG5dKmAvZywgXCIgXCIpIC8vIGlubGluZSBjb2RlXG5cdFx0LnJlcGxhY2UoLyFcXFsoW15cXF1dKilcXF1cXChbXildKlxcKS9nLCBcIiQxXCIpIC8vIGltYWdlc1xuXHRcdC5yZXBsYWNlKC9cXFsoW15cXF1dKylcXF1cXChbXildKlxcKS9nLCBcIiQxXCIpIC8vIGxpbmtzXG5cdFx0LnJlcGxhY2UoL14jezEsNn1cXHMrL2dtLCBcIlwiKSAvLyBoZWFkaW5nc1xuXHRcdC5yZXBsYWNlKC9eXFxzKlstKitdXFxzKy9nbSwgXCJcIikgLy8gYnVsbGV0c1xuXHRcdC5yZXBsYWNlKC9eXFxzKlxcZCtcXC5cXHMrL2dtLCBcIlwiKSAvLyBvcmRlcmVkIGxpc3Rcblx0XHQucmVwbGFjZSgvXj5cXHM/L2dtLCBcIlwiKSAvLyBibG9ja3F1b3RlXG5cdFx0LnJlcGxhY2UoL1sqX35dKy9nLCBcIlwiKSAvLyBlbXBoYXNpc1xuXHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKVxuXHRcdC50cmltKCk7XG5cbi8qKiBDb3VudCB3b3JkcyBpbiBhIHBsYWluLXRleHQgc3RyaW5nLiAqL1xuZXhwb3J0IGNvbnN0IGNvdW50V29yZHMgPSAodGV4dDogc3RyaW5nKTogbnVtYmVyID0+IHtcblx0aWYgKHRleHQubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcblx0Y29uc3QgdCA9IHRleHQudHJpbSgpO1xuXHRpZiAodC5sZW5ndGggPT09IDApIHJldHVybiAwO1xuXHRyZXR1cm4gdC5zcGxpdCgvXFxzKy8pLmxlbmd0aDtcbn07XG5cbi8qKiBFc3RpbWF0ZSByZWFkaW5nIHRpbWUgaW4gbWludXRlcyBmcm9tIGEgd29yZCBjb3VudCAoZGVmYXVsdCAyMjAgd3BtKS4gKi9cbmV4cG9ydCBjb25zdCBlc3RpbWF0ZVJlYWRpbmdUaW1lID0gKHdvcmRDb3VudDogbnVtYmVyLCB3cG0gPSAyMjApOiBudW1iZXIgPT5cblx0TWF0aC5tYXgoMSwgTWF0aC5jZWlsKHdvcmRDb3VudCAvIHdwbSkpO1xuXG4vKiogU2x1Z2lmeSBhIGhlYWRpbmcgZm9yIGFuIGFuY2hvciBpZC4gRGVkdXBsaWNhdGVzIGFjcm9zcyB0aGUgZG9jdW1lbnQuICovXG5leHBvcnQgY29uc3Qgc2x1Z2lmeUhlYWRpbmcgPSAocmF3OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRjb25zdCBiYXNlID0gcmF3XG5cdFx0LnRvTG93ZXJDYXNlKClcblx0XHQudHJpbSgpXG5cdFx0LnJlcGxhY2UoL1tgKl9+XSsvZywgXCJcIilcblx0XHQucmVwbGFjZSgvW15cXHB7TGV0dGVyfVxccHtOdW1iZXJ9XFxzLV0vZ3UsIFwiXCIpXG5cdFx0LnJlcGxhY2UoL1xccysvZywgXCItXCIpXG5cdFx0LnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuXHRcdC5yZXBsYWNlKC9eLSt8LSskL2csIFwiXCIpO1xuXHRyZXR1cm4gYmFzZS5sZW5ndGggPiAwID8gYmFzZSA6IFwic2VjdGlvblwiO1xufTtcblxuLyoqIEV4dHJhY3QgYSB0YWJsZSBvZiBjb250ZW50cyBmcm9tIG1hcmtkb3duIGJvZHkgKGgx4oCTaDYpLiBEZWR1cGUgYW5jaG9yIGlkcy4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0VG9jID0gKG1kOiBzdHJpbmcpOiByZWFkb25seSBUb2NJdGVtW10gPT4ge1xuXHRjb25zdCBsaW5lcyA9IHNwbGl0TGluZXMobWQpO1xuXHRjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblx0Y29uc3QgaXRlbXM6IFRvY0l0ZW1bXSA9IFtdO1xuXHRmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcblx0XHRjb25zdCBtID0gL14oI3sxLDZ9KVxccysoLis/KVxccyojKlxccyokLy5leGVjKGxpbmUpO1xuXHRcdGlmICghbSkgY29udGludWU7XG5cdFx0Y29uc3QgZGVwdGggPSBtWzFdPy5sZW5ndGggYXMgMSB8IDIgfCAzIHwgNCB8IDUgfCA2O1xuXHRcdGNvbnN0IHRleHQgPSBtWzJdID8/IFwiXCI7XG5cdFx0aWYgKHRleHQubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblx0XHRjb25zdCBiYXNlID0gc2x1Z2lmeUhlYWRpbmcodGV4dCk7XG5cdFx0Y29uc3QgY291bnQgPSBzZWVuLmdldChiYXNlKSA/PyAwO1xuXHRcdHNlZW4uc2V0KGJhc2UsIGNvdW50ICsgMSk7XG5cdFx0Y29uc3QgaWQgPSBjb3VudCA9PT0gMCA/IGJhc2UgOiBgJHtiYXNlfS0ke2NvdW50fWA7XG5cdFx0aXRlbXMucHVzaCh7IGlkLCB0ZXh0LCBkZXB0aCB9KTtcblx0fVxuXHRyZXR1cm4gaXRlbXM7XG59O1xuIiwKICAgICIvKipcbiAqIFVzZSBjYXNlOiBsb2FkIGEgc2luZ2xlIGRvYyBmaWxlIGJ5IGl0cyBzbHVnIGFuZCBwcm9kdWNlIGEgRG9jUGFnZS5cbiAqIE9yY2hlc3RyYXRlcyBGUyByZWFkIOKGkiBmcm9udG1hdHRlciBwYXJzZSDihpIgRG9jUGFnZSBidWlsZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcEVycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBmaWxlTm90Rm91bmQsIHBhcnNlRXJyb3IgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IGVyciwgb2ssIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvdHlwZXMvcmVzdWx0XCI7XG5pbXBvcnQgeyB0b1Bvc2l4UGF0aCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3V0aWxzL3N0cmluZ1wiO1xuaW1wb3J0IHsgYnVpbGREb2NQYWdlIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9vcGVyYXRpb25zL2J1aWxkLXBhZ2VcIjtcbmltcG9ydCB7XG5cdGlzTWFya2Rvd25GaWxlLFxuXHRwYXJzZUZyb250bWF0dGVyLFxufSBmcm9tIFwiLi4vLi4vZG9tYWluL29wZXJhdGlvbnMvcGFyc2VcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVJlYWRlciB9IGZyb20gXCIuLi8uLi9wb3J0c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NQYWdlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGaWxlUGF0aCB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZUNhY2hlIH0gZnJvbSBcIi4uL2NhY2hlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZERvY1BhZ2VEZXBzIHtcblx0cmVhZG9ubHkgcmVhZGVyOiBGaWxlUmVhZGVyO1xuXHRyZWFkb25seSBkb2NzRGlyOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHNsdWc6IHN0cmluZztcblx0LyoqIE9wdGlvbmFsIGVkaXQtbGluayBjb25maWc7IGlmIGFic2VudCwgbm8gZWRpdFVybCBpcyBhdHRhY2hlZC4gKi9cblx0cmVhZG9ubHkgZWRpdExpbms/OiB7XG5cdFx0cmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cdFx0cmVhZG9ubHkgYmFzZVVybD86IHN0cmluZztcblx0XHRyZWFkb25seSBicmFuY2g/OiBzdHJpbmc7XG5cdH07XG5cdC8qKiBPcHRpb25hbCBtdGltZStzaXplIGtleWVkIGNhY2hlLiBXaGVuIHByb3ZpZGVkLCB1bmNoYW5nZWQgZmlsZXMgYXJlIHJldXNlZC4gKi9cblx0cmVhZG9ubHkgY2FjaGU/OiBQYXJzZUNhY2hlPERvY1BhZ2U+O1xufVxuXG5leHBvcnQgY29uc3QgbG9hZERvY1BhZ2UgPSBhc3luYyAoXG5cdGRlcHM6IExvYWREb2NQYWdlRGVwcyxcbik6IFByb21pc2U8UmVzdWx0PERvY1BhZ2UsIEFwcEVycm9yPj4gPT4ge1xuXHRjb25zdCB7IHJlYWRlciwgZG9jc0Rpciwgc2x1ZywgZWRpdExpbmssIGNhY2hlIH0gPSBkZXBzO1xuXHRjb25zdCBmaWxlUGF0aCA9IGAke3RvUG9zaXhQYXRoKGRvY3NEaXIpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0vJHtzbHVnfS5tZGA7XG5cdGNvbnN0IGZwID0gRmlsZVBhdGgoZmlsZVBhdGgpO1xuXHRjb25zdCBleGlzdHMgPSBhd2FpdCByZWFkZXIuZXhpc3RzKGZwKTtcblx0aWYgKCFleGlzdHMpIHtcblx0XHRjb25zdCBtZG9jUGF0aCA9IEZpbGVQYXRoKFxuXHRcdFx0YCR7dG9Qb3NpeFBhdGgoZG9jc0RpcikucmVwbGFjZSgvXFwvJC8sIFwiXCIpfS8ke3NsdWd9Lm1kb2NgLFxuXHRcdCk7XG5cdFx0Y29uc3QgbWRvY0V4aXN0cyA9IGF3YWl0IHJlYWRlci5leGlzdHMobWRvY1BhdGgpO1xuXHRcdGlmICghbWRvY0V4aXN0cykgcmV0dXJuIGVycihmaWxlTm90Rm91bmQoZmlsZVBhdGgpKTtcblx0XHRyZXR1cm4gcmVhZEFuZEJ1aWxkKHJlYWRlciwgbWRvY1BhdGgsIHNsdWcsIGVkaXRMaW5rLCBjYWNoZSk7XG5cdH1cblx0cmV0dXJuIHJlYWRBbmRCdWlsZChyZWFkZXIsIGZwLCBzbHVnLCBlZGl0TGluaywgY2FjaGUpO1xufTtcblxuY29uc3QgcmVhZEFuZEJ1aWxkID0gYXN5bmMgKFxuXHRyZWFkZXI6IEZpbGVSZWFkZXIsXG5cdGZpbGVQYXRoOiBGaWxlUGF0aCxcblx0c2x1Zzogc3RyaW5nLFxuXHRlZGl0TGluazogTG9hZERvY1BhZ2VEZXBzW1wiZWRpdExpbmtcIl0sXG5cdGNhY2hlOiBQYXJzZUNhY2hlPERvY1BhZ2U+IHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxSZXN1bHQ8RG9jUGFnZSwgQXBwRXJyb3I+PiA9PiB7XG5cdGNvbnN0IHN0YXRSZXN1bHQgPSBhd2FpdCByZWFkZXIuc3RhdChmaWxlUGF0aCk7XG5cdGlmIChzdGF0UmVzdWx0Lm9rICYmIGNhY2hlKSB7XG5cdFx0Y29uc3Qga2V5ID0gYCR7ZmlsZVBhdGh9QCR7c3RhdFJlc3VsdC52YWx1ZS5tdGltZU1zLnRvRml4ZWQoMCl9OiR7c3RhdFJlc3VsdC52YWx1ZS5zaXplfWA7XG5cdFx0Y29uc3QgaGl0ID0gY2FjaGUuZ2V0KGtleSk7XG5cdFx0aWYgKGhpdCkgcmV0dXJuIG9rKGhpdCk7XG5cdH1cblx0Y29uc3QgcmVhZFJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKGZpbGVQYXRoKTtcblx0aWYgKCFyZWFkUmVzdWx0Lm9rKSByZXR1cm4gcmVhZFJlc3VsdDtcblx0Y29uc3QgcmF3ID0gcmVhZFJlc3VsdC52YWx1ZTtcblx0Y29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5zcGxpdCgvWy9cXFxcXS8pLnBvcCgpID8/IFwiXCI7XG5cdGlmICghaXNNYXJrZG93bkZpbGUoZmlsZU5hbWUpKSB7XG5cdFx0cmV0dXJuIGVycihwYXJzZUVycm9yKGZpbGVQYXRoLCBcIk5vdCBhIG1hcmtkb3duIGZpbGVcIikpO1xuXHR9XG5cdGNvbnN0IHBhcnNlZCA9IHBhcnNlRnJvbnRtYXR0ZXIocmF3KTtcblx0Y29uc3QgbGFzdE1vZGlmaWVkTXMgPSBzdGF0UmVzdWx0Lm9rID8gc3RhdFJlc3VsdC52YWx1ZS5tdGltZU1zIDogdW5kZWZpbmVkO1xuXHRjb25zdCBlZGl0VXJsID0gY29tcHV0ZUVkaXRVcmwoU3RyaW5nKGZpbGVQYXRoKSwgZWRpdExpbmspO1xuXHRjb25zdCBwYWdlID0gYnVpbGREb2NQYWdlKHtcblx0XHRzbHVnLFxuXHRcdGZpbGVQYXRoLFxuXHRcdHBhcnNlZCxcblx0XHQuLi4obGFzdE1vZGlmaWVkTXMgIT09IHVuZGVmaW5lZCA/IHsgbGFzdE1vZGlmaWVkTXMgfSA6IHt9KSxcblx0XHQuLi4oZWRpdFVybCAhPT0gdW5kZWZpbmVkID8geyBlZGl0VXJsIH0gOiB7fSksXG5cdH0pO1xuXHRpZiAoc3RhdFJlc3VsdC5vayAmJiBjYWNoZSkge1xuXHRcdGNvbnN0IGtleSA9IGAke2ZpbGVQYXRofUAke3N0YXRSZXN1bHQudmFsdWUubXRpbWVNcy50b0ZpeGVkKDApfToke3N0YXRSZXN1bHQudmFsdWUuc2l6ZX1gO1xuXHRcdGNhY2hlLnNldChrZXksIHBhZ2UpO1xuXHR9XG5cdHJldHVybiBvayhwYWdlKTtcbn07XG5cbmNvbnN0IGNvbXB1dGVFZGl0VXJsID0gKFxuXHRmaWxlUGF0aDogc3RyaW5nLFxuXHRlZGl0TGluazogTG9hZERvY1BhZ2VEZXBzW1wiZWRpdExpbmtcIl0sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuXHRpZiAoIWVkaXRMaW5rIHx8IGVkaXRMaW5rLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCBiYXNlID0gZWRpdExpbmsuYmFzZVVybCA/PyBcIlwiO1xuXHRpZiAoYmFzZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cdGNvbnN0IGJyYW5jaCA9IGVkaXRMaW5rLmJyYW5jaCA/PyBcIm1haW5cIjtcblx0Y29uc3QgcG9zaXggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblx0Y29uc3QgdHJpbW1lZCA9IHBvc2l4LnJlcGxhY2UoL15cXC8rLywgXCJcIik7XG5cdGNvbnN0IHRhaWwgPSB0cmltbWVkLnN0YXJ0c1dpdGgoXCJkb2NzL1wiKSA/IHRyaW1tZWQuc2xpY2UoNSkgOiB0cmltbWVkO1xuXHRyZXR1cm4gYCR7YmFzZS5yZXBsYWNlKC9cXC8kLywgXCJcIil9L2VkaXQvJHticmFuY2h9LyR7dGFpbH1gO1xufTtcblxuLyoqIExvYWQgYSBkb2MgcGFnZSBmcm9tIHJhdyBjb250ZW50IGRpcmVjdGx5ICh0ZXN0LWZyaWVuZGx5LCBubyBGUykuICovXG5leHBvcnQgY29uc3QgYnVpbGREb2NQYWdlRnJvbVJhdyA9IChcblx0c2x1Zzogc3RyaW5nLFxuXHRmaWxlUGF0aDogc3RyaW5nLFxuXHRyYXc6IHN0cmluZyxcbik6IFJlc3VsdDxEb2NQYWdlLCBBcHBFcnJvcj4gPT4ge1xuXHRjb25zdCBwYXJzZWQgPSBwYXJzZUZyb250bWF0dGVyKHJhdyk7XG5cdHJldHVybiBvayhidWlsZERvY1BhZ2UoeyBzbHVnLCBmaWxlUGF0aCwgcGFyc2VkIH0pKTtcbn07XG4iLAogICAgIi8qKlxuICogVXNlIGNhc2U6IHNjYW4gYSBkb2NzIGRpcmVjdG9yeSBhbmQgcHJvZHVjZSBhIGxpc3Qgb2YgRG9jRmlsZSBkZXNjcmlwdG9ycy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBvcmNoZXN0cmF0aW9uIGdsdWUgYmV0d2VlbiB0aGUgRlMgYWRhcHRlciBhbmQgdGhlIHB1cmUgZG9tYWluXG4gKiBvcGVyYXRpb25zLiBJdCBkb2VzIG5vIEkvTyBpdHNlbGYg4oCUIGl0IG9ubHkgc2VxdWVuY2VzIGNhbGxzIHRocm91Z2ggcG9ydHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHBFcnJvciB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgZmlsZU5vdEZvdW5kIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBlcnIsIG9rLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3R5cGVzL3Jlc3VsdFwiO1xuaW1wb3J0IHsgdG9Qb3NpeFBhdGggfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC91dGlscy9zdHJpbmdcIjtcbmltcG9ydCB7XG5cdGV4dHJhY3RHcm91cCxcblx0aXNNYXJrZG93bkZpbGUsXG5cdHNsdWdUb0lkLFxuXHRzdHJpcE1hcmtkb3duRXh0LFxufSBmcm9tIFwiLi4vLi4vZG9tYWluL29wZXJhdGlvbnMvcGFyc2VcIjtcbmltcG9ydCB0eXBlIHsgRGlyZWN0b3J5U2Nhbm5lciwgRmlsZVJlYWRlciB9IGZyb20gXCIuLi8uLi9wb3J0c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NGaWxlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEb2NJZCwgRG9jU2x1ZywgRmlsZVBhdGggfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY2FuRG9jc0RpckRlcHMge1xuXHRyZWFkb25seSBzY2FubmVyOiBEaXJlY3RvcnlTY2FubmVyO1xuXHRyZWFkb25seSByZWFkZXI6IEZpbGVSZWFkZXI7XG5cdHJlYWRvbmx5IGRvY3NEaXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IHNjYW5Eb2NzRGlyID0gYXN5bmMgKFxuXHRkZXBzOiBTY2FuRG9jc0RpckRlcHMsXG4pOiBQcm9taXNlPFJlc3VsdDxyZWFkb25seSBEb2NGaWxlW10sIEFwcEVycm9yPj4gPT4ge1xuXHRjb25zdCB7IHNjYW5uZXIsIHJlYWRlciwgZG9jc0RpciB9ID0gZGVwcztcblx0Y29uc3Qgcm9vdEV4aXN0cyA9IGF3YWl0IHJlYWRlci5leGlzdHMoRmlsZVBhdGgoZG9jc0RpcikpO1xuXHRpZiAoIXJvb3RFeGlzdHMpIHJldHVybiBlcnIoZmlsZU5vdEZvdW5kKGRvY3NEaXIpKTtcblxuXHRjb25zdCBmaWxlcyA9IGF3YWl0IGNvbGxlY3RGaWxlcyhzY2FubmVyLCBkb2NzRGlyKTtcblx0Y29uc3QgZG9jczogRG9jRmlsZVtdID0gW107XG5cdGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZXMpIHtcblx0XHRjb25zdCByZWFkUmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoRmlsZVBhdGgoZmlsZVBhdGgpKTtcblx0XHRpZiAoIXJlYWRSZXN1bHQub2spIGNvbnRpbnVlOyAvLyBza2lwIHVucmVhZGFibGUgZmlsZXM7IGFuIGV2ZW50IGNhbiBiZSByYWlzZWQgZWxzZXdoZXJlXG5cdFx0Y29uc3QgcmF3ID0gcmVhZFJlc3VsdC52YWx1ZTtcblxuXHRcdC8vIE9ubHkgcGFyc2UgLm1kLy5tZG9jIGZpbGVzOyB0aGUgZXh0ZW5zaW9uIGNoZWNrIGlzIGFsc28gYSBzYWZldHkgZ3VhcmQuXG5cdFx0Y29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5zcGxpdCgvWy9cXFxcXS8pLnBvcCgpID8/IFwiXCI7XG5cdFx0aWYgKCFpc01hcmtkb3duRmlsZShmaWxlTmFtZSkpIGNvbnRpbnVlO1xuXG5cdFx0Y29uc3QgcmVsUGF0aCA9IHRvUG9zaXhQYXRoKGZpbGVQYXRoKVxuXHRcdFx0LnNsaWNlKHRvUG9zaXhQYXRoKGRvY3NEaXIpLmxlbmd0aClcblx0XHRcdC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG5cdFx0Y29uc3Qgc2x1ZyA9IHN0cmlwTWFya2Rvd25FeHQocmVsUGF0aCk7XG5cdFx0Y29uc3QgaWQgPSBEb2NJZChzbHVnVG9JZChzbHVnKSk7XG5cdFx0Y29uc3QgZ3JvdXAgPSBleHRyYWN0R3JvdXAoc2x1Zyk7XG5cblx0XHQvLyBMYXp5IGZyb250bWF0dGVyIGV4dHJhY3Qg4oCUIG9ubHkgdGhlIG9yZGVyIGZpZWxkIGlzIG5lZWRlZCBhdCBzY2FuIHRpbWUuXG5cdFx0Ly8gRnVsbCBwYXJzZSBoYXBwZW5zIGluIHRoZSBsb2FkQ29udGVudCB1c2UgY2FzZS5cblx0XHRjb25zdCBvcmRlciA9IGV4dHJhY3RRdWlja09yZGVyKHJhdyk7XG5cblx0XHRkb2NzLnB1c2goe1xuXHRcdFx0aWQsXG5cdFx0XHRzbHVnOiBEb2NTbHVnKHNsdWcpLFxuXHRcdFx0ZnJvbnRtYXR0ZXI6IHt9LFxuXHRcdFx0cmF3Q29udGVudDogcmF3LFxuXHRcdFx0ZmlsZVBhdGg6IEZpbGVQYXRoKGZpbGVQYXRoKSxcblx0XHRcdC4uLihncm91cCAhPT0gdW5kZWZpbmVkID8geyBncm91cCB9IDoge30pLFxuXHRcdFx0b3JkZXIsXG5cdFx0fSk7XG5cdH1cblx0ZG9jcy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG5cdHJldHVybiBvayhkb2NzKTtcbn07XG5cbmNvbnN0IGV4dHJhY3RRdWlja09yZGVyID0gKHJhdzogc3RyaW5nKTogbnVtYmVyID0+IHtcblx0Y29uc3QgbGluZXMgPSByYXcuc3BsaXQoXCJcXG5cIik7XG5cdGlmIChsaW5lc1swXT8udHJpbSgpICE9PSBcIi0tLVwiKSByZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5cdGxldCBlbmQgPSAtMTtcblx0Zm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChsaW5lc1tpXT8udHJpbSgpID09PSBcIi0tLVwiKSB7XG5cdFx0XHRlbmQgPSBpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdGlmIChlbmQgPT09IC0xKSByZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5cdGZvciAobGV0IGkgPSAxOyBpIDwgZW5kOyBpKyspIHtcblx0XHRjb25zdCBsaW5lID0gbGluZXNbaV0gPz8gXCJcIjtcblx0XHRjb25zdCBtID0gbGluZS5tYXRjaCgvXm9yZGVyOlxccyooXFxkKykvKTtcblx0XHRpZiAobT8uWzFdKSByZXR1cm4gTnVtYmVyLnBhcnNlSW50KG1bMV0sIDEwKTtcblx0fVxuXHRyZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG59O1xuXG5jb25zdCBjb2xsZWN0RmlsZXMgPSBhc3luYyAoXG5cdHNjYW5uZXI6IERpcmVjdG9yeVNjYW5uZXIsXG5cdGRpcjogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuXHRjb25zdCByZXN1bHQgPSBhd2FpdCBzY2FubmVyLmxpc3QoZGlyKTtcblx0aWYgKCFyZXN1bHQub2spIHJldHVybiBbXTtcblx0Y29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuXHRmb3IgKGNvbnN0IGVudHJ5IG9mIHJlc3VsdC52YWx1ZSkge1xuXHRcdGlmIChlbnRyeS5pc0RpcmVjdG9yeSkge1xuXHRcdFx0b3V0LnB1c2goLi4uKGF3YWl0IGNvbGxlY3RGaWxlcyhzY2FubmVyLCBlbnRyeS5wYXRoKSkpO1xuXHRcdH0gZWxzZSBpZiAoaXNNYXJrZG93bkZpbGUoZW50cnkubmFtZSkpIHtcblx0XHRcdG91dC5wdXNoKGVudHJ5LnBhdGgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb3V0O1xufTtcbiIsCiAgICAiLyoqXG4gKiBXb3JrZmxvdzogcHJvY2VzcyBhbGwgZG9jcyBpbiBhIGRpcmVjdG9yeSBpbnRvIGZ1bGx5LWJ1aWx0IERvY1BhZ2VzLlxuICogVXNlZCBieSB0aGUgVml0ZSBwbHVnaW4ncyBgbG9hZChpZClgIHZpcnR1YWwgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcEVycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBvaywgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC90eXBlcy9yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgRGlyZWN0b3J5U2Nhbm5lciwgRmlsZVJlYWRlciB9IGZyb20gXCIuLi8uLi9wb3J0c1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NQYWdlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhcnNlQ2FjaGUgfSBmcm9tIFwiLi4vY2FjaGVcIjtcbmltcG9ydCB7IGxvYWREb2NQYWdlIH0gZnJvbSBcIi4uL3VzZWNhc2VzL2xvYWREb2NQYWdlXCI7XG5pbXBvcnQgeyBzY2FuRG9jc0RpciB9IGZyb20gXCIuLi91c2VjYXNlcy9zY2FuRG9jc0RpclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NEb2NzV29ya2Zsb3dEZXBzIHtcblx0cmVhZG9ubHkgc2Nhbm5lcjogRGlyZWN0b3J5U2Nhbm5lcjtcblx0cmVhZG9ubHkgcmVhZGVyOiBGaWxlUmVhZGVyO1xuXHRyZWFkb25seSBkb2NzRGlyOiBzdHJpbmc7XG5cdC8qKiBPcHRpb25hbCBlZGl0LWxpbmsgY29uZmlnOyB0aHJlYWRlZCBpbnRvIHBlci1wYWdlIGVkaXRVcmwgY29tcHV0YXRpb24uICovXG5cdHJlYWRvbmx5IGVkaXRMaW5rPzoge1xuXHRcdHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXHRcdHJlYWRvbmx5IGJhc2VVcmw/OiBzdHJpbmc7XG5cdFx0cmVhZG9ubHkgYnJhbmNoPzogc3RyaW5nO1xuXHR9O1xuXHQvKiogT3B0aW9uYWwgbXRpbWUrc2l6ZSBjYWNoZSwgc2hhcmVkIGFjcm9zcyByZWxvYWRzLiAqL1xuXHRyZWFkb25seSBjYWNoZT86IFBhcnNlQ2FjaGU8RG9jUGFnZT47XG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzRG9jc1dvcmtmbG93ID0gYXN5bmMgKFxuXHRkZXBzOiBQcm9jZXNzRG9jc1dvcmtmbG93RGVwcyxcbik6IFByb21pc2U8UmVzdWx0PHJlYWRvbmx5IERvY1BhZ2VbXSwgQXBwRXJyb3I+PiA9PiB7XG5cdGNvbnN0IHNjYW5uZWQgPSBhd2FpdCBzY2FuRG9jc0Rpcih7XG5cdFx0c2Nhbm5lcjogZGVwcy5zY2FubmVyLFxuXHRcdHJlYWRlcjogZGVwcy5yZWFkZXIsXG5cdFx0ZG9jc0RpcjogZGVwcy5kb2NzRGlyLFxuXHR9KTtcblx0aWYgKCFzY2FubmVkLm9rKSByZXR1cm4gc2Nhbm5lZDtcblxuXHRjb25zdCBwYWdlczogRG9jUGFnZVtdID0gW107XG5cdGZvciAoY29uc3QgZmlsZSBvZiBzY2FubmVkLnZhbHVlKSB7XG5cdFx0Y29uc3Qgc2x1ZyA9IHR5cGVvZiBmaWxlLnNsdWcgPT09IFwic3RyaW5nXCIgPyBmaWxlLnNsdWcgOiBTdHJpbmcoZmlsZS5zbHVnKTtcblx0XHRjb25zdCBwYWdlUmVzdWx0ID0gYXdhaXQgbG9hZERvY1BhZ2Uoe1xuXHRcdFx0cmVhZGVyOiBkZXBzLnJlYWRlcixcblx0XHRcdGRvY3NEaXI6IGRlcHMuZG9jc0Rpcixcblx0XHRcdHNsdWcsXG5cdFx0XHQuLi4oZGVwcy5lZGl0TGluayAhPT0gdW5kZWZpbmVkID8geyBlZGl0TGluazogZGVwcy5lZGl0TGluayB9IDoge30pLFxuXHRcdFx0Li4uKGRlcHMuY2FjaGUgIT09IHVuZGVmaW5lZCA/IHsgY2FjaGU6IGRlcHMuY2FjaGUgfSA6IHt9KSxcblx0XHR9KTtcblx0XHRpZiAocGFnZVJlc3VsdC5vaykgcGFnZXMucHVzaChwYWdlUmVzdWx0LnZhbHVlKTtcblx0fVxuXHRyZXR1cm4gb2socGFnZXMpO1xufTtcbiIsCiAgICAiLy8gQ29udGVudCBEb21haW4gU2NoZW1hcyAtIEFya3R5cGUgdmFsaWRhdGlvbiBzY2hlbWFzXG4vLyBGb2xsb3dpbmcgL2ZvbGxvdy1hcmt0eXBlIHdvcmtmbG93IGZvciB0eXBlLXNhZmUgcnVudGltZSB2YWxpZGF0aW9uXG5cbmltcG9ydCB7IEJBREdFX1ZBUklBTlRTIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IGVyciwgb2ssIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvdHlwZXMvcmVzdWx0XCI7XG5pbXBvcnQgeyB0eXBlIFR5cGUsIHR5cGUgfSBmcm9tIFwiYXJrdHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBCYWRnZVZhcmlhbnQsIEZyb250bWF0dGVyIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8qKlxuICogQmFkZ2UgVmFyaWFudCBTY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IGJhZGdlVmFyaWFudFNjaGVtYTogVHlwZSA9IHR5cGUoXG5cdFwiJ2RlZmF1bHQnIHwgJ3ByaW1hcnknIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcidcIixcbik7XG5cbmV4cG9ydCB0eXBlIEJhZGdlVmFyaWFudFNjaGVtYSA9IHR5cGVvZiBiYWRnZVZhcmlhbnRTY2hlbWEuaW5mZXI7XG5cbi8qKlxuICogVGl0bGUgU2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCB0aXRsZVNjaGVtYTogVHlwZSA9IHR5cGUoXCJzdHJpbmdcIikubmFycm93KFxuXHQodGl0bGU6IHN0cmluZykgPT4gdGl0bGUudHJpbSgpLmxlbmd0aCA+IDAsXG4pO1xuXG4vKipcbiAqIE9yZGVyIFNjaGVtYVxuICovXG5leHBvcnQgY29uc3Qgb3JkZXJTY2hlbWE6IFR5cGUgPSB0eXBlKFwibnVtYmVyXCIpLm5hcnJvdygob3JkZXI6IG51bWJlcikgPT5cblx0TnVtYmVyLmlzRmluaXRlKG9yZGVyKSxcbik7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUJhZGdlVmFyaWFudCA9IChcblx0djogdW5rbm93bixcbik6IFJlc3VsdDxCYWRnZVZhcmlhbnQgfCB1bmRlZmluZWQsIFJldHVyblR5cGU8dHlwZW9mIHZhbGlkYXRpb25FcnJvcj4+ID0+IHtcblx0aWYgKHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG9rKHVuZGVmaW5lZCk7XG5cdGNvbnN0IHJlc3VsdCA9IGJhZGdlVmFyaWFudFNjaGVtYSh2KTtcblx0aWYgKHJlc3VsdCBpbnN0YW5jZW9mIHR5cGUuZXJyb3JzKSB7XG5cdFx0cmV0dXJuIGVycihcblx0XHRcdHZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgYmFkZ2UgdmFyaWFudFwiLCB7XG5cdFx0XHRcdHN1Z2dlc3Rpb25zOiBbLi4uQkFER0VfVkFSSUFOVFNdLFxuXHRcdFx0fSksXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gb2sodiBhcyBCYWRnZVZhcmlhbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVGl0bGUgPSAoXG5cdGY6IEZyb250bWF0dGVyLFxuKTogUmVzdWx0PHN0cmluZyB8IHVuZGVmaW5lZCwgUmV0dXJuVHlwZTx0eXBlb2YgdmFsaWRhdGlvbkVycm9yPj4gPT4ge1xuXHRjb25zdCB0ID0gZi50aXRsZTtcblx0aWYgKHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG9rKHVuZGVmaW5lZCk7XG5cdGNvbnN0IHJlc3VsdCA9IHRpdGxlU2NoZW1hKHQpO1xuXHRpZiAocmVzdWx0IGluc3RhbmNlb2YgdHlwZS5lcnJvcnMpIHtcblx0XHRyZXR1cm4gZXJyKHZhbGlkYXRpb25FcnJvcihcIlRpdGxlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpKTtcblx0fVxuXHRyZXR1cm4gb2sodCk7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVPcmRlciA9IChcblx0ZjogRnJvbnRtYXR0ZXIsXG4pOiBSZXN1bHQ8bnVtYmVyIHwgdW5kZWZpbmVkLCBSZXR1cm5UeXBlPHR5cGVvZiB2YWxpZGF0aW9uRXJyb3I+PiA9PiB7XG5cdGNvbnN0IG8gPSBmLm9yZGVyO1xuXHRpZiAobyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gb2sodW5kZWZpbmVkKTtcblx0Y29uc3QgcmVzdWx0ID0gb3JkZXJTY2hlbWEobyk7XG5cdGlmIChyZXN1bHQgaW5zdGFuY2VvZiB0eXBlLmVycm9ycykge1xuXHRcdHJldHVybiBlcnIodmFsaWRhdGlvbkVycm9yKFwiT3JkZXIgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXJcIikpO1xuXHR9XG5cdHJldHVybiBvayhvKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUZyb250bWF0dGVyID0gKFxuXHRmOiBGcm9udG1hdHRlcixcbik6IFJlc3VsdDxGcm9udG1hdHRlciwgUmV0dXJuVHlwZTx0eXBlb2YgdmFsaWRhdGlvbkVycm9yPj4gPT4ge1xuXHRjb25zdCB0aXRsZVJlc3VsdCA9IHZhbGlkYXRlVGl0bGUoZik7XG5cdGlmICghdGl0bGVSZXN1bHQub2spIHJldHVybiB0aXRsZVJlc3VsdDtcblx0Y29uc3Qgb3JkZXJSZXN1bHQgPSB2YWxpZGF0ZU9yZGVyKGYpO1xuXHRpZiAoIW9yZGVyUmVzdWx0Lm9rKSByZXR1cm4gb3JkZXJSZXN1bHQ7XG5cdGNvbnN0IGJhZGdlUmVzdWx0ID0gdmFsaWRhdGVCYWRnZVZhcmlhbnQoZi5iYWRnZVZhcmlhbnQpO1xuXHRpZiAoIWJhZGdlUmVzdWx0Lm9rKSByZXR1cm4gYmFkZ2VSZXN1bHQ7XG5cdHJldHVybiBvayhmKTtcbn07XG4iLAogICAgIi8qKlxuICogSW4tbWVtb3J5IEZTIGFkYXB0ZXIgZm9yIHRlc3RzIGFuZCBTU1Igc2NlbmFyaW9zLlxuICogSW1wbGVtZW50cyBGaWxlUmVhZGVyICsgRGlyZWN0b3J5U2Nhbm5lciB3aXRob3V0IHRvdWNoaW5nIHRoZSBkaXNrLlxuICovXG5cbmltcG9ydCB0eXBlIHtcblx0RGlyZWN0b3J5RW50cnksXG5cdERpcmVjdG9yeVNjYW5uZXIsXG5cdEZpbGVQYXRoLFxuXHRGaWxlUmVhZGVyLFxufSBmcm9tIFwiQGNyZWF0ZS1kb2NzL21vZHVsZXMvY29udGVudFwiO1xuaW1wb3J0IHR5cGUgeyBBcHBFcnJvciB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgZmlsZU5vdEZvdW5kIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBlcnIsIG9rLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3R5cGVzL3Jlc3VsdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeUZpbGVTeXN0ZW0ge1xuXHRyZWFkb25seSBmaWxlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXHRyZWFkb25seSBkaXJlY3RvcmllczogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT47XG59XG5cbmV4cG9ydCBjb25zdCBtZW1vcnlGaWxlU3lzdGVtID0gKFxuXHRmaWxlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+LFxuXHRkaXJlY3RvcmllczogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4sXG4pOiBNZW1vcnlGaWxlU3lzdGVtID0+ICh7IGZpbGVzLCBkaXJlY3RvcmllcyB9KTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU1lbW9yeUZpbGVSZWFkZXIgPSAoZnM6IE1lbW9yeUZpbGVTeXN0ZW0pOiBGaWxlUmVhZGVyID0+ICh7XG5cdGFzeW5jIHJlYWQoZmlsZVBhdGg6IEZpbGVQYXRoKTogUHJvbWlzZTxSZXN1bHQ8c3RyaW5nLCBBcHBFcnJvcj4+IHtcblx0XHRjb25zdCBjb250ZW50ID0gZnMuZmlsZXMuZ2V0KFN0cmluZyhmaWxlUGF0aCkpO1xuXHRcdGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBlcnIoZmlsZU5vdEZvdW5kKFN0cmluZyhmaWxlUGF0aCkpKTtcblx0XHRyZXR1cm4gb2soY29udGVudCk7XG5cdH0sXG5cdGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogRmlsZVBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gZnMuZmlsZXMuaGFzKFN0cmluZyhmaWxlUGF0aCkpO1xuXHR9LFxuXHRhc3luYyBzdGF0KFxuXHRcdGZpbGVQYXRoOiBGaWxlUGF0aCxcblx0KTogUHJvbWlzZTxSZXN1bHQ8eyBtdGltZU1zOiBudW1iZXI7IHNpemU6IG51bWJlciB9LCBBcHBFcnJvcj4+IHtcblx0XHRjb25zdCBjb250ZW50ID0gZnMuZmlsZXMuZ2V0KFN0cmluZyhmaWxlUGF0aCkpO1xuXHRcdGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBlcnIoZmlsZU5vdEZvdW5kKFN0cmluZyhmaWxlUGF0aCkpKTtcblx0XHRyZXR1cm4gb2soeyBtdGltZU1zOiAwLCBzaXplOiBjb250ZW50Lmxlbmd0aCB9KTtcblx0fSxcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWVtb3J5RGlyZWN0b3J5U2Nhbm5lciA9IChcblx0ZnM6IE1lbW9yeUZpbGVTeXN0ZW0sXG4pOiBEaXJlY3RvcnlTY2FubmVyID0+ICh7XG5cdGFzeW5jIGxpc3QoXG5cdFx0ZGlyUGF0aDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFJlc3VsdDxyZWFkb25seSBEaXJlY3RvcnlFbnRyeVtdLCBBcHBFcnJvcj4+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gZnMuZGlyZWN0b3JpZXMuZ2V0KGRpclBhdGgpO1xuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHJldHVybiBlcnIoZmlsZU5vdEZvdW5kKGRpclBhdGgpKTtcblx0XHRyZXR1cm4gb2soXG5cdFx0XHRlbnRyaWVzLm1hcCgobmFtZSkgPT4gKHtcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0aXNEaXJlY3Rvcnk6ICFuYW1lLmluY2x1ZGVzKFwiLlwiKSxcblx0XHRcdFx0cGF0aDogYCR7ZGlyUGF0aC5yZXBsYWNlKC9cXC8kLywgXCJcIil9LyR7bmFtZX1gLFxuXHRcdFx0fSkpLFxuXHRcdCk7XG5cdH0sXG59KTtcbiIsCiAgICAiLyoqXG4gKiBOb2RlIEZTIGFkYXB0ZXIg4oCUIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb250ZW50IG1vZHVsZSdzIEZpbGVSZWFkZXJcbiAqIGFuZCBEaXJlY3RvcnlTY2FubmVyIHBvcnRzLiBUaGlzIGlzIHRoZSBPTkxZIHBsYWNlIHdoZXJlIG5vZGU6ZnMvcHJvbWlzZXMgaXMgdXNlZC5cbiAqL1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUge1xuXHREaXJlY3RvcnlFbnRyeSxcblx0RGlyZWN0b3J5U2Nhbm5lcixcblx0RmlsZVBhdGgsXG5cdEZpbGVSZWFkZXIsXG5cdEZpbGVXYXRjaGVyLFxufSBmcm9tIFwiQGNyZWF0ZS1kb2NzL21vZHVsZXMvY29udGVudFwiO1xuaW1wb3J0IHR5cGUgeyBBcHBFcnJvciB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgZmlsZU5vdEZvdW5kLCBpb0Vycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBlcnIsIG9rLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3R5cGVzL3Jlc3VsdFwiO1xuXG4vKipcbiAqIFBhdGgtdHJhdmVyc2FsIHNhZmUgam9pbi4gUmVqZWN0cyBhbnkgYXR0ZW1wdCB0byByZXNvbHZlIHRvIGEgcGF0aCBvdXRzaWRlXG4gKiB0aGUgY29uZmlndXJlZCByb290LiBUaHJvd3MgYW4gRXJyb3IgY29udGFpbmluZyB0aGUgYWJzb2x1dGUgcmVzb2x2ZWQgcGF0aFxuICogb24gdmlvbGF0aW9uOyBjYWxsZXJzIHNob3VsZCB0cmVhdCBhcyBBcHBFcnJvci5pb19lcnJvciB1cHN0cmVhbS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNhZmVKb2luID0gKHJvb3Q6IHN0cmluZywgcmVxdWVzdGVkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRjb25zdCBhYnNSb290ID0gcGF0aC5yZXNvbHZlKHJvb3QpO1xuXHRjb25zdCBjbGVhbmVkID0gcmVxdWVzdGVkLnJlcGxhY2UoL15bXFxcXC9dKy8sIFwiXCIpO1xuXHRjb25zdCBjYW5kaWRhdGUgPSBwYXRoLnJlc29sdmUoYWJzUm9vdCwgY2xlYW5lZCk7XG5cdGNvbnN0IHJlbCA9IHBhdGgucmVsYXRpdmUoYWJzUm9vdCwgY2FuZGlkYXRlKTtcblx0aWYgKHJlbC5zdGFydHNXaXRoKFwiLi5cIikgfHwgcmVsID09PSBcIi4uXCIgfHwgcGF0aC5pc0Fic29sdXRlKHJlbCkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYFBhdGggdHJhdmVyc2FsIGJsb2NrZWQ6ICR7cmVxdWVzdGVkfSAtPiAke2NhbmRpZGF0ZX1gKTtcblx0fVxuXHRyZXR1cm4gY2FuZGlkYXRlO1xufTtcblxuZXhwb3J0IGNvbnN0IG5vZGVGaWxlUmVhZGVyOiBGaWxlUmVhZGVyID0ge1xuXHRhc3luYyByZWFkKGZpbGVQYXRoOiBGaWxlUGF0aCk6IFByb21pc2U8UmVzdWx0PHN0cmluZywgQXBwRXJyb3I+PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShTdHJpbmcoZmlsZVBhdGgpLCBcInV0Zi04XCIpO1xuXHRcdFx0cmV0dXJuIG9rKGNvbnRlbnQpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbnN0IGNvZGUgPSAoZSBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGU7XG5cdFx0XHRpZiAoY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIGVycihmaWxlTm90Rm91bmQoU3RyaW5nKGZpbGVQYXRoKSwgZSkpO1xuXHRcdFx0cmV0dXJuIGVycihpb0Vycm9yKFN0cmluZyhmaWxlUGF0aCksIFwiRmFpbGVkIHRvIHJlYWQgZmlsZVwiLCBlKSk7XG5cdFx0fVxuXHR9LFxuXHRhc3luYyBleGlzdHMoZmlsZVBhdGg6IEZpbGVQYXRoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IGZzLmFjY2VzcyhTdHJpbmcoZmlsZVBhdGgpKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fSxcblx0YXN5bmMgc3RhdChcblx0XHRmaWxlUGF0aDogRmlsZVBhdGgsXG5cdCk6IFByb21pc2U8UmVzdWx0PHsgbXRpbWVNczogbnVtYmVyOyBzaXplOiBudW1iZXIgfSwgQXBwRXJyb3I+PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHMgPSBhd2FpdCBmcy5zdGF0KFN0cmluZyhmaWxlUGF0aCkpO1xuXHRcdFx0cmV0dXJuIG9rKHsgbXRpbWVNczogcy5tdGltZU1zLCBzaXplOiBzLnNpemUgfSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Y29uc3QgY29kZSA9IChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZTtcblx0XHRcdGlmIChjb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gZXJyKGZpbGVOb3RGb3VuZChTdHJpbmcoZmlsZVBhdGgpLCBlKSk7XG5cdFx0XHRyZXR1cm4gZXJyKGlvRXJyb3IoU3RyaW5nKGZpbGVQYXRoKSwgXCJGYWlsZWQgdG8gc3RhdCBmaWxlXCIsIGUpKTtcblx0XHR9XG5cdH0sXG59O1xuXG5leHBvcnQgY29uc3Qgbm9kZURpcmVjdG9yeVNjYW5uZXI6IERpcmVjdG9yeVNjYW5uZXIgPSB7XG5cdGFzeW5jIGxpc3QoXG5cdFx0ZGlyUGF0aDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFJlc3VsdDxyZWFkb25seSBEaXJlY3RvcnlFbnRyeVtdLCBBcHBFcnJvcj4+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdFx0cmV0dXJuIG9rKFxuXHRcdFx0XHRlbnRyaWVzLm1hcCgoZW50cnkpID0+ICh7XG5cdFx0XHRcdFx0bmFtZTogZW50cnkubmFtZSxcblx0XHRcdFx0XHRpc0RpcmVjdG9yeTogZW50cnkuaXNEaXJlY3RvcnkoKSxcblx0XHRcdFx0XHRwYXRoOiBwYXRoLmpvaW4oZGlyUGF0aCwgZW50cnkubmFtZSksXG5cdFx0XHRcdH0pKSxcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Y29uc3QgY29kZSA9IChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZTtcblx0XHRcdGlmIChjb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4gZXJyKGZpbGVOb3RGb3VuZChkaXJQYXRoLCBlKSk7XG5cdFx0XHRyZXR1cm4gZXJyKGlvRXJyb3IoZGlyUGF0aCwgXCJGYWlsZWQgdG8gcmVhZCBkaXJlY3RvcnlcIiwgZSkpO1xuXHRcdH1cblx0fSxcbn07XG5cbmV4cG9ydCBjb25zdCBub2RlRmlsZVdhdGNoZXI6IEZpbGVXYXRjaGVyID0ge1xuXHR3YXRjaChkaXIsIGhhbmRsZXJzKSB7XG5cdFx0Y29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cdFx0Y29uc3QgaXRlcmF0b3IgPSBmc1xuXHRcdFx0LndhdGNoKGRpciwgeyByZWN1cnNpdmU6IHRydWUsIHNpZ25hbDogYWMuc2lnbmFsIH0gYXMgZnMuV2F0Y2hPcHRpb25zKVxuXHRcdFx0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXHRcdGNvbnN0IGNvbnN1bWUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIGl0ZXJhdG9yKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlsZW5hbWUgPSAoZXZlbnQgYXMgeyBmaWxlbmFtZT86IHVua25vd24gfSkuZmlsZW5hbWU7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0dHlwZW9mIGZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdFx0XHQoZmlsZW5hbWUuZW5kc1dpdGgoXCIubWRcIikgfHwgZmlsZW5hbWUuZW5kc1dpdGgoXCIubWRvY1wiKSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLm9uQ2hhbmdlKGZpbGVuYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aGFuZGxlcnMub25FcnJvcihlKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHZvaWQgY29uc3VtZSgpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRjbG9zZTogKCkgPT4ge1xuXHRcdFx0XHRhYy5hYm9ydCgpO1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9LFxufTtcbiIsCiAgICAiLyoqXG4gKiBHaXQgQWRhcHRlclxuICpcbiAqIEFkYXB0ZXIgbGF5ZXIgZm9yIEdpdCBvcGVyYXRpb25zIHVzaW5nIHNpbXBsZS1naXRcbiAqL1xuXG5pbXBvcnQgc2ltcGxlR2l0LCB7IHR5cGUgU2ltcGxlR2l0IH0gZnJvbSBcInNpbXBsZS1naXRcIjtcbmltcG9ydCB0eXBlIHtcblx0Q29tbWl0T3B0aW9ucyxcblx0R2l0QWRhcHRlcixcblx0R2l0U3RhdHVzLFxuXHRQdXNoT3B0aW9ucyxcbn0gZnJvbSBcIi4uLy4uL21vZHVsZXMvbGl2ZS1lZGl0b3IvcG9ydHNcIjtcblxuaW50ZXJmYWNlIEdpdEZpbGUge1xuXHRwYXRoOiBzdHJpbmc7XG5cdGluZGV4OiBzdHJpbmc7XG5cdHdvcmtpbmdfZGlyOiBzdHJpbmc7XG59XG5cbi8vIEdpdCBhZGFwdGVyIHN0YXRlXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZUdpdEFkYXB0ZXJTdGF0ZSB7XG5cdHJlYWRvbmx5IGdpdDogU2ltcGxlR2l0O1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlU2ltcGxlR2l0QWRhcHRlclN0YXRlID0gKFxuXHRjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4pOiBTaW1wbGVHaXRBZGFwdGVyU3RhdGUgPT4gKHtcblx0Z2l0OiBzaW1wbGVHaXQoY3dkKSxcbn0pO1xuXG4vLyBQdXJlIGZ1bmN0aW9ucyBmb3IgZ2l0IG9wZXJhdGlvbnNcbmV4cG9ydCBjb25zdCBnaXRHZXRDdXJyZW50QnJhbmNoID0gYXN5bmMgKFxuXHRzdGF0ZTogU2ltcGxlR2l0QWRhcHRlclN0YXRlLFxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcblx0Y29uc3QgYnJhbmNoID0gYXdhaXQgc3RhdGUuZ2l0LmJyYW5jaCgpO1xuXHRyZXR1cm4gYnJhbmNoLmN1cnJlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2l0R2V0U3RhdHVzID0gYXN5bmMgKFxuXHRzdGF0ZTogU2ltcGxlR2l0QWRhcHRlclN0YXRlLFxuKTogUHJvbWlzZTxHaXRTdGF0dXM+ID0+IHtcblx0Y29uc3Qgc3RhdHVzID0gYXdhaXQgc3RhdGUuZ2l0LnN0YXR1cygpO1xuXHRjb25zdCBicmFuY2ggPSBhd2FpdCBnaXRHZXRDdXJyZW50QnJhbmNoKHN0YXRlKTtcblxuXHRyZXR1cm4ge1xuXHRcdGJyYW5jaCxcblx0XHRoYXNDaGFuZ2VzOiBzdGF0dXMuZmlsZXMubGVuZ3RoID4gMCxcblx0XHR1bnRyYWNrZWQ6IHN0YXR1cy5maWxlc1xuXHRcdFx0LmZpbHRlcigoZjogR2l0RmlsZSkgPT4gZi53b3JraW5nX2RpciA9PT0gXCI/XCIpXG5cdFx0XHQubWFwKChmOiBHaXRGaWxlKSA9PiBmLnBhdGgpLFxuXHRcdG1vZGlmaWVkOiBzdGF0dXMuZmlsZXNcblx0XHRcdC5maWx0ZXIoKGY6IEdpdEZpbGUpID0+IGYud29ya2luZ19kaXIgPT09IFwiTVwiKVxuXHRcdFx0Lm1hcCgoZjogR2l0RmlsZSkgPT4gZi5wYXRoKSxcblx0XHRzdGFnZWQ6IHN0YXR1cy5maWxlc1xuXHRcdFx0LmZpbHRlcigoZjogR2l0RmlsZSkgPT4gZi5pbmRleCA9PT0gXCJNXCIpXG5cdFx0XHQubWFwKChmOiBHaXRGaWxlKSA9PiBmLnBhdGgpLFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdpdENvbW1pdCA9IGFzeW5jIChcblx0c3RhdGU6IFNpbXBsZUdpdEFkYXB0ZXJTdGF0ZSxcblx0b3B0aW9uczogQ29tbWl0T3B0aW9ucyxcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRhd2FpdCBzdGF0ZS5naXQuYWRkKFwiLlwiKTtcblx0aWYgKG9wdGlvbnMuYXV0aG9yICYmIG9wdGlvbnMuZW1haWwpIHtcblx0XHRhd2FpdCBzdGF0ZS5naXQuY29tbWl0KFtcblx0XHRcdG9wdGlvbnMubWVzc2FnZSxcblx0XHRcdFwiLS1hdXRob3JcIixcblx0XHRcdGAke29wdGlvbnMuYXV0aG9yfSA8JHtvcHRpb25zLmVtYWlsfT5gLFxuXHRcdF0pO1xuXHR9IGVsc2Uge1xuXHRcdGF3YWl0IHN0YXRlLmdpdC5jb21taXQob3B0aW9ucy5tZXNzYWdlKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGdpdFB1c2ggPSBhc3luYyAoXG5cdHN0YXRlOiBTaW1wbGVHaXRBZGFwdGVyU3RhdGUsXG5cdG9wdGlvbnM6IFB1c2hPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0Y29uc3QgcmVtb3RlID0gb3B0aW9ucy5yZW1vdGUgfHwgXCJvcmlnaW5cIjtcblx0Y29uc3QgYnJhbmNoID0gb3B0aW9ucy5icmFuY2ggfHwgKGF3YWl0IGdpdEdldEN1cnJlbnRCcmFuY2goc3RhdGUpKTtcblxuXHRpZiAob3B0aW9ucy5mb3JjZSkge1xuXHRcdGF3YWl0IHN0YXRlLmdpdC5wdXNoKFtcIi0tZm9yY2VcIiwgcmVtb3RlLCBicmFuY2hdKTtcblx0fSBlbHNlIHtcblx0XHRhd2FpdCBzdGF0ZS5naXQucHVzaChyZW1vdGUsIGJyYW5jaCk7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCBnaXRTdGFnZUZpbGUgPSBhc3luYyAoXG5cdHN0YXRlOiBTaW1wbGVHaXRBZGFwdGVyU3RhdGUsXG5cdHBhdGg6IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRhd2FpdCBzdGF0ZS5naXQuYWRkKHBhdGgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdpdFVuc3RhZ2VGaWxlID0gYXN5bmMgKFxuXHRzdGF0ZTogU2ltcGxlR2l0QWRhcHRlclN0YXRlLFxuXHRwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0YXdhaXQgc3RhdGUuZ2l0LnJlc2V0KFtcIi0tbWl4ZWRcIiwgcGF0aF0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdpdERpc2NhcmRDaGFuZ2VzID0gYXN5bmMgKFxuXHRzdGF0ZTogU2ltcGxlR2l0QWRhcHRlclN0YXRlLFxuXHRwYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0YXdhaXQgc3RhdGUuZ2l0LmNoZWNrb3V0KHBhdGgsIHsgXCItLVwiOiBwYXRoIH0pO1xufTtcblxuLyoqXG4gKiBTaW1wbGVHaXQgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2ltcGxlR2l0QWRhcHRlciBpbXBsZW1lbnRzIEdpdEFkYXB0ZXIge1xuXHRwcml2YXRlIHN0YXRlOiBTaW1wbGVHaXRBZGFwdGVyU3RhdGU7XG5cblx0Y29uc3RydWN0b3IoY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKSB7XG5cdFx0dGhpcy5zdGF0ZSA9IGNyZWF0ZVNpbXBsZUdpdEFkYXB0ZXJTdGF0ZShjd2QpO1xuXHR9XG5cblx0Z2V0U3RhdGUoKTogU2ltcGxlR2l0QWRhcHRlclN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy5zdGF0ZTtcblx0fVxuXG5cdHNldFN0YXRlKHN0YXRlOiBTaW1wbGVHaXRBZGFwdGVyU3RhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnN0YXRlID0gc3RhdGU7XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QnJhbmNoKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIGdpdEdldEN1cnJlbnRCcmFuY2godGhpcy5zdGF0ZSk7XG5cdH1cblxuXHRhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxHaXRTdGF0dXM+IHtcblx0XHRyZXR1cm4gZ2l0R2V0U3RhdHVzKHRoaXMuc3RhdGUpO1xuXHR9XG5cblx0YXN5bmMgY29tbWl0KG9wdGlvbnM6IENvbW1pdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gZ2l0Q29tbWl0KHRoaXMuc3RhdGUsIG9wdGlvbnMpO1xuXHR9XG5cblx0YXN5bmMgcHVzaChvcHRpb25zOiBQdXNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIGdpdFB1c2godGhpcy5zdGF0ZSwgb3B0aW9ucyk7XG5cdH1cblxuXHRhc3luYyBzdGFnZUZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIGdpdFN0YWdlRmlsZSh0aGlzLnN0YXRlLCBwYXRoKTtcblx0fVxuXG5cdGFzeW5jIHVuc3RhZ2VGaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiBnaXRVbnN0YWdlRmlsZSh0aGlzLnN0YXRlLCBwYXRoKTtcblx0fVxuXG5cdGFzeW5jIGRpc2NhcmRDaGFuZ2VzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHJldHVybiBnaXREaXNjYXJkQ2hhbmdlcyh0aGlzLnN0YXRlLCBwYXRoKTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBHaXQgYWRhcHRlclxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlR2l0QWRhcHRlciA9IChjd2Q/OiBzdHJpbmcpOiBHaXRBZGFwdGVyID0+IHtcblx0cmV0dXJuIG5ldyBTaW1wbGVHaXRBZGFwdGVyKGN3ZCk7XG59O1xuIiwKICAgICIvKipcbiAqIFZlbGl0ZSBBZGFwdGVyXG4gKlxuICogQWRhcHRlciBsYXllciBmb3IgVmVsaXRlIGNvbnRlbnQgcHJvY2Vzc2luZy5cbiAqIFdyYXBzIFZlbGl0ZSdzIGJ1aWxkIGZ1bmN0aW9uIHdpdGggZnJhbWV3b3JrLWFnbm9zdGljIGludGVyZmFjZS5cbiAqXG4gKiAjIyBBcmNoaXRlY3R1cmVcbiAqIC0gQWRhcHRlciBMYXllcjogSS9PIGltcGxlbWVudGF0aW9uIGZvciBWZWxpdGVcbiAqIC0gTm8gYnVzaW5lc3MgbG9naWMsIHB1cmUgd3JhcHBlciBmdW5jdGlvbnNcbiAqIC0gRnJhbWV3b3JrLWFnbm9zdGljIGNvbnRlbnQgQVBJXG4gKi9cblxuaW1wb3J0IHsgYnVpbGQgfSBmcm9tIFwidmVsaXRlXCI7XG5cbi8qKlxuICogVmVsaXRlIGFkYXB0ZXIgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlbGl0ZUFkYXB0ZXJPcHRpb25zIHtcblx0LyoqIFBhdGggdG8gdmVsaXRlLmNvbmZpZy50cyBmaWxlICovXG5cdGNvbmZpZ1BhdGg/OiBzdHJpbmc7XG5cdC8qKiBXYXRjaCBtb2RlIGZvciBkZXZlbG9wbWVudCAqL1xuXHR3YXRjaD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVmVsaXRlIGJ1aWxkIHJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlbGl0ZUJ1aWxkUmVzdWx0IHtcblx0LyoqIFN1Y2Nlc3Mgc3RhdHVzICovXG5cdHN1Y2Nlc3M6IGJvb2xlYW47XG5cdC8qKiBFcnJvciBtZXNzYWdlIGlmIGZhaWxlZCAqL1xuXHRlcnJvcj86IHN0cmluZztcblx0LyoqIE91dHB1dCBkYXRhIGRpcmVjdG9yeSAqL1xuXHRvdXRwdXREaXI/OiBzdHJpbmc7XG5cdC8qKiBBc3NldHMgb3V0cHV0IGRpcmVjdG9yeSAqL1xuXHRhc3NldHNEaXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmVsaXRlIGFkYXB0ZXIgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVsaXRlQWRhcHRlciB7XG5cdC8qKiBSdW4gVmVsaXRlIGJ1aWxkICovXG5cdGJ1aWxkOiAoKSA9PiBQcm9taXNlPFZlbGl0ZUJ1aWxkUmVzdWx0Pjtcblx0LyoqIFBhdGggdG8gdmVsaXRlLmNvbmZpZy50cyBmaWxlICovXG5cdGNvbmZpZ1BhdGg6IHN0cmluZztcblx0LyoqIFdhdGNoIG1vZGUgZm9yIGRldmVsb3BtZW50ICovXG5cdHdhdGNoOiBib29sZWFuO1xufVxuXG4vKipcbiAqIENyZWF0ZSBWZWxpdGUgYWRhcHRlclxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQWRhcHRlciBvcHRpb25zXG4gKiBAcmV0dXJucyBCdWlsZCBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVmVsaXRlQWRhcHRlciA9IChcblx0b3B0aW9uczogVmVsaXRlQWRhcHRlck9wdGlvbnMgPSB7fSxcbik6IFZlbGl0ZUFkYXB0ZXIgPT4ge1xuXHRjb25zdCB7IGNvbmZpZ1BhdGggPSBcInZlbGl0ZS5jb25maWcudHNcIiwgd2F0Y2ggPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuXHQvKipcblx0ICogUnVuIFZlbGl0ZSBidWlsZFxuXHQgKlxuXHQgKiBAcmV0dXJucyBCdWlsZCByZXN1bHRcblx0ICovXG5cdGNvbnN0IGJ1aWxkVmVsaXRlID0gYXN5bmMgKCk6IFByb21pc2U8VmVsaXRlQnVpbGRSZXN1bHQ+ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYnVpbGRPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBidWlsZD5bMF0gPSB7XG5cdFx0XHRcdGNvbmZpZzogY29uZmlnUGF0aCxcblx0XHRcdFx0d2F0Y2gsXG5cdFx0XHR9O1xuXG5cdFx0XHRhd2FpdCBidWlsZChidWlsZE9wdGlvbnMpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzdWNjZXNzOiB0cnVlLFxuXHRcdFx0XHRvdXRwdXREaXI6IFwiLnZlbGl0ZVwiLFxuXHRcdFx0XHRhc3NldHNEaXI6IFwicHVibGljL3N0YXRpY1wiLFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c3VjY2VzczogZmFsc2UsXG5cdFx0XHRcdGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGJ1aWxkOiBidWlsZFZlbGl0ZSxcblx0XHRjb25maWdQYXRoLFxuXHRcdHdhdGNoLFxuXHR9O1xufTtcblxuLyoqXG4gKiBEZWZhdWx0IFZlbGl0ZSBhZGFwdGVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0VmVsaXRlQWRhcHRlcjogVmVsaXRlQWRhcHRlciA9IGNyZWF0ZVZlbGl0ZUFkYXB0ZXIoKTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBidWlsZCBWZWxpdGUgY29udGVudFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQnVpbGQgb3B0aW9uc1xuICogQHJldHVybnMgQnVpbGQgcmVzdWx0XG4gKi9cbmV4cG9ydCBjb25zdCBidWlsZFZlbGl0ZSA9IGFzeW5jIChcblx0b3B0aW9uczogVmVsaXRlQWRhcHRlck9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8VmVsaXRlQnVpbGRSZXN1bHQ+ID0+IHtcblx0Y29uc3QgYWRhcHRlciA9IGNyZWF0ZVZlbGl0ZUFkYXB0ZXIob3B0aW9ucyk7XG5cdHJldHVybiBhZGFwdGVyLmJ1aWxkKCk7XG59O1xuIiwKICAgICIvKipcbiAqIFZpdGUgc2VydmVyLWJhY2tlZCBkb2NzIHdhdGNoZXIuXG4gKiBXaXJlcyBub2RlOmZzIHRvIHRoZSBwbHVnaW4ncyBEb2NzV2F0Y2hlciBwb3J0IHVzaW5nIHRoZSBWaXRlIGRldiBzZXJ2ZXInc1xuICogb3duIGZpbGUtd2F0Y2hpbmcgZmFjaWxpdHkuXG4gKi9cbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgdHlwZSB7IERvY3NXYXRjaGVyIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL3BsdWdpblwiO1xuaW1wb3J0IHsgU1VQUE9SVEVEX0VYVEVOU0lPTlMgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC9jb25zdGFudHNcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU5vZGVEb2NzV2F0Y2hlciA9ICgpOiBEb2NzV2F0Y2hlciA9PiAoe1xuXHR3YXRjaChkb2NzRGlyOiBzdHJpbmcsIG9uQ2hhbmdlOiAoZmlsZVBhdGg6IHN0cmluZykgPT4gdm9pZCkge1xuXHRcdGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IGl0ZXJhdG9yID0gZnNcblx0XHRcdC53YXRjaChkb2NzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgc2lnbmFsOiBhYy5zaWduYWwgfSBhcyBmcy5XYXRjaE9wdGlvbnMpXG5cdFx0XHRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cdFx0Y29uc3QgY29uc3VtZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgaXRlcmF0b3IpIHtcblx0XHRcdFx0XHRjb25zdCBmaWxlbmFtZSA9IChldmVudCBhcyB7IGZpbGVuYW1lPzogdW5rbm93biB9KS5maWxlbmFtZTtcblx0XHRcdFx0XHRpZiAodHlwZW9mIGZpbGVuYW1lICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cdFx0XHRcdFx0aWYgKCFTVVBQT1JURURfRVhURU5TSU9OUy5zb21lKChleHQpID0+IGZpbGVuYW1lLmVuZHNXaXRoKGV4dCkpKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdG9uQ2hhbmdlKGZpbGVuYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8vIGFib3J0ZWQg4oCUIGV4aXQgc2lsZW50bHlcblx0XHRcdH1cblx0XHR9O1xuXHRcdHZvaWQgY29uc3VtZSgpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRjbG9zZTogKCkgPT4ge1xuXHRcdFx0XHRhYy5hYm9ydCgpO1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9LFxufSk7XG4iLAogICAgIi8qKlxuICogUG9sbGluZy1iYXNlZCB3YXRjaGVyIGZhbGxiYWNrLlxuICpcbiAqIGBmcy53YXRjaGAgd2l0aCBgcmVjdXJzaXZlOiB0cnVlYCBpcyB1bnJlbGlhYmxlIG9uIExpbnV4IChpbm90aWZ5IG1pc3Nlc1xuICogc3ViLWRpcmVjdG9yeSBldmVudHMgdW50aWwgYSBmaWxlIGlzIHRvdWNoZWQpLiBUaGlzIHdhbGtlciBwZXJpb2RpY2FsbHlcbiAqIGRpZmZzIHRoZSBkaXJlY3RvcnkgdHJlZSBhbmQgZW1pdHMgY2hhbmdlIGV2ZW50cyBmb3IgYW55IGZpbGUgd2hvc2UgbXRpbWVcbiAqIG9yIHByZXNlbmNlIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHNjYW4uXG4gKi9cbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFNVUFBPUlRFRF9FWFRFTlNJT05TIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9sbGluZ1dhdGNoZXJPcHRpb25zIHtcblx0cmVhZG9ubHkgaW50ZXJ2YWxNcz86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEZpbGVTbmFwc2hvdCB7XG5cdHJlYWRvbmx5IG10aW1lTXM6IG51bWJlcjtcblx0cmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xufVxuXG5jb25zdCBpc1N1cHBvcnRlZCA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+XG5cdFNVUFBPUlRFRF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT4gbmFtZS5lbmRzV2l0aChleHQpKTtcblxuY29uc3Qgc25hcHNob3REaXIgPSBhc3luYyAoZGlyOiBzdHJpbmcpOiBQcm9taXNlPE1hcDxzdHJpbmcsIEZpbGVTbmFwc2hvdD4+ID0+IHtcblx0Y29uc3Qgb3V0ID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVTbmFwc2hvdD4oKTtcblx0Y29uc3Qgd2FsayA9IGFzeW5jIChjdXJyZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRsZXQgZW50cmllczogaW1wb3J0KFwibm9kZTpmc1wiKS5EaXJlbnRbXTtcblx0XHR0cnkge1xuXHRcdFx0ZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoY3VycmVudCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGZ1bGwgPSBwYXRoLmpvaW4oY3VycmVudCwgZW50cnkubmFtZSk7XG5cdFx0XHRpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuXHRcdFx0XHRhd2FpdCB3YWxrKGZ1bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBpc1N1cHBvcnRlZChlbnRyeS5uYW1lKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IHMgPSBhd2FpdCBmcy5zdGF0KGZ1bGwpO1xuXHRcdFx0XHRcdG91dC5zZXQoZnVsbCwgeyBtdGltZU1zOiBzLm10aW1lTXMsIHNpemU6IHMuc2l6ZSB9KTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Ly8gZmlsZSB2YW5pc2hlZCBiZXR3ZWVuIHJlYWRkaXIgYW5kIHN0YXQgLSBpZ25vcmVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0YXdhaXQgd2FsayhkaXIpO1xuXHRyZXR1cm4gb3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvbGxpbmdXYXRjaGVyID0gKFxuXHRvcHRzOiBQb2xsaW5nV2F0Y2hlck9wdGlvbnMgPSB7fSxcbik6IHtcblx0d2F0Y2g6IChcblx0XHRkaXI6IHN0cmluZyxcblx0XHRvbkNoYW5nZTogKGZpbGVQYXRoOiBzdHJpbmcpID0+IHZvaWQsXG5cdCkgPT4geyBjbG9zZTogKCkgPT4gdm9pZCB9O1xufSA9PiB7XG5cdGNvbnN0IGludGVydmFsID0gb3B0cy5pbnRlcnZhbE1zID8/IDMwMDtcblx0cmV0dXJuIHtcblx0XHR3YXRjaChkaXIsIG9uQ2hhbmdlKSB7XG5cdFx0XHRsZXQgc3RvcHBlZCA9IGZhbHNlO1xuXHRcdFx0bGV0IHByZXY6IFByb21pc2U8TWFwPHN0cmluZywgRmlsZVNuYXBzaG90Pj4gPSBzbmFwc2hvdERpcihkaXIpO1xuXHRcdFx0Y29uc3QgdGljayA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0aWYgKHN0b3BwZWQpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgbmV4dCA9IGF3YWl0IHNuYXBzaG90RGlyKGRpcik7XG5cdFx0XHRcdGNvbnN0IGJlZm9yZSA9IGF3YWl0IHByZXY7XG5cdFx0XHRcdGZvciAoY29uc3QgW2ZpbGUsIHNuYXBdIG9mIG5leHQpIHtcblx0XHRcdFx0XHRjb25zdCBvbGQgPSBiZWZvcmUuZ2V0KGZpbGUpO1xuXHRcdFx0XHRcdGlmICghb2xkIHx8IG9sZC5tdGltZU1zICE9PSBzbmFwLm10aW1lTXMgfHwgb2xkLnNpemUgIT09IHNuYXAuc2l6ZSkge1xuXHRcdFx0XHRcdFx0b25DaGFuZ2UoZmlsZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgZmlsZSBvZiBiZWZvcmUua2V5cygpKSB7XG5cdFx0XHRcdFx0aWYgKCFuZXh0LmhhcyhmaWxlKSkgb25DaGFuZ2UoZmlsZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHJldiA9IFByb21pc2UucmVzb2x2ZShuZXh0KTtcblx0XHRcdFx0aWYgKCFzdG9wcGVkKSBzZXRUaW1lb3V0KHRpY2ssIGludGVydmFsKTtcblx0XHRcdH07XG5cdFx0XHR2b2lkIHRpY2soKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNsb3NlOiAoKSA9PiB7XG5cdFx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXHRcdH0sXG5cdH07XG59O1xuIiwKICAgICJleHBvcnQgdHlwZSBDb2RlQmxvY2sgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgQ29kZUJsb2NrT3B0aW9ucyA9IHVua25vd247XG5leHBvcnQgY29uc3QgZW5oYW5jZUNvZGVCbG9ja3MgPSAoKSA9PiBudWxsO1xuIiwKICAgICJleHBvcnQgdHlwZSBBcGlDb25maWcgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgQXBpRW5kcG9pbnQgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgQXV0aFR5cGUgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgRG9jc0NvbmZpZyA9IHVua25vd247XG5leHBvcnQgdHlwZSBEb2NzUGx1Z2luT3B0aW9ucyA9IHVua25vd247XG5leHBvcnQgdHlwZSBFZGl0TGlua0NvbmZpZyA9IHVua25vd247XG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID0gdW5rbm93bjtcbmV4cG9ydCB0eXBlIExhc3RVcGRhdGVkQ29uZmlnID0gdW5rbm93bjtcbmV4cG9ydCB0eXBlIFJlc29sdmVkRG9jc0NvbmZpZyA9IHVua25vd247XG5leHBvcnQgdHlwZSBTZWFyY2hDb25maWcgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgU2l0ZUNvbmZpZyA9IHVua25vd247XG5leHBvcnQgdHlwZSBUaGVtZUNvbmZpZyA9IHVua25vd247XG5leHBvcnQgY29uc3QgZGVmYXVsdERvY3NDb25maWcgPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IHJlc29sdmVDb25maWcgPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRG9jc0NvbmZpZyA9ICgpID0+IG51bGw7XG4iLAogICAgImV4cG9ydCB0eXBlIEJhZGdlVmFyaWFudCA9IHVua25vd247XG5leHBvcnQgdHlwZSBEb2NGaWxlID0gdW5rbm93bjtcbmV4cG9ydCB0eXBlIERvY0lkID0gdW5rbm93bjtcbmV4cG9ydCB0eXBlIERvY1BhZ2UgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgRG9jU2x1ZyA9IHVua25vd247XG5leHBvcnQgdHlwZSBGaWxlUGF0aCA9IHVua25vd247XG5leHBvcnQgdHlwZSBGcm9udG1hdHRlciA9IHVua25vd247XG5leHBvcnQgdHlwZSBQYXJzZWRDb250ZW50ID0gdW5rbm93bjtcbmV4cG9ydCBjb25zdCBidWlsZERvY1BhZ2UgPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IGJ1aWxkRG9jUGFnZUZyb21SYXcgPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IHBhcnNlRnJvbnRtYXR0ZXIgPSAoKSA9PiBudWxsO1xuIiwKICAgICJleHBvcnQgdHlwZSBDb250ZW50VmFsaWRhdG9yID0gdW5rbm93bjtcbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25FcnJvciA9IHVua25vd247XG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uT3B0aW9ucyA9IHVua25vd247XG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uUmVzdWx0ID0gdW5rbm93bjtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZSA9ICgpID0+IG51bGw7XG4iLAogICAgImV4cG9ydCB0eXBlIENvbW1pdE9wdGlvbnMgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgR2l0QWRhcHRlciA9IHVua25vd247XG5leHBvcnQgdHlwZSBHaXRTdGF0dXMgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgUHVzaE9wdGlvbnMgPSB1bmtub3duO1xuZXhwb3J0IGNvbnN0IGNvbW1pdEFuZFB1c2ggPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IGxvYWRFZGl0b3JTdGF0ZSA9ICgpID0+IG51bGw7XG5leHBvcnQgY29uc3Qgc2F2ZUZpbGUgPSAoKSA9PiBudWxsO1xuIiwKICAgICJleHBvcnQgdHlwZSBOYXZJdGVtID0gdW5rbm93bjtcbmV4cG9ydCB0eXBlIE5hdlNlY3Rpb24gPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgU2lkZWJhciA9IHVua25vd247XG5leHBvcnQgdHlwZSBTaWRlYmFyR3JvdXAgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgU2lkZWJhckl0ZW0gPSB1bmtub3duO1xuZXhwb3J0IGNvbnN0IGJ1aWxkTmF2ID0gKCkgPT4gbnVsbDtcbmV4cG9ydCBjb25zdCBidWlsZFNpZGViYXIgPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IGZvcm1hdEdyb3VwVGl0bGUgPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IGdyb3VwRG9jc0J5Rm9sZGVyID0gKCkgPT4gbnVsbDtcbiIsCiAgICAiZXhwb3J0IHR5cGUgVmlydHVhbE1vZHVsZVNldCA9IHVua25vd247XG5leHBvcnQgY29uc3QgYnVpbGRWaXJ0dWFsTW9kdWxlcyA9ICgpID0+IG51bGw7XG5leHBvcnQgY29uc3QgaXNNYXJrZG93blBhdGggPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IGlzVmlydHVhbERvY3NNb2R1bGUgPSAoKSA9PiBudWxsO1xuIiwKICAgICIvKipcbiAqIERlZmF1bHQgY29uZmlnIOKAlCB0aGUgY2Fub25pY2FsIGZhbGxiYWNrIGZvciB0aGUgZG9jcyBzaXRlLlxuICovXG5pbXBvcnQgdHlwZSB7IERvY3NDb25maWcgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREb2NzQ29uZmlnOiBEb2NzQ29uZmlnID0ge1xuXHRzaXRlOiB7XG5cdFx0dGl0bGU6IFwiRG9jdW1lbnRhdGlvblwiLFxuXHRcdGRlc2NyaXB0aW9uOiBcIkRvY3VtZW50YXRpb24gYW5kIGd1aWRlc1wiLFxuXHRcdGxvZ286IFwiL2xvZ28uc3ZnXCIsXG5cdFx0Z2l0aHViOiBcIlwiLFxuXHRcdHR3aXR0ZXI6IFwiXCIsXG5cdFx0dmVyc2lvbjogXCIxLjAuMFwiLFxuXHR9LFxuXHRuYXY6IFtcblx0XHR7XG5cdFx0XHR0aXRsZTogXCJQcm9kdWN0XCIsXG5cdFx0XHRpdGVtczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bGFiZWw6IFwiR2V0dGluZyBTdGFydGVkXCIsXG5cdFx0XHRcdFx0aHJlZjogXCIvZG9jcy9nZXR0aW5nLXN0YXJ0ZWQvaW50cm9kdWN0aW9uXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHsgbGFiZWw6IFwiSW5zdGFsbGF0aW9uXCIsIGhyZWY6IFwiL2RvY3MvZ2V0dGluZy1zdGFydGVkL2luc3RhbGxhdGlvblwiIH0sXG5cdFx0XHRcdHsgbGFiZWw6IFwiRmVhdHVyZXNcIiwgaHJlZjogXCIvZG9jcy9wcm9kdWN0L2ZlYXR1cmVzXCIgfSxcblx0XHRcdFx0eyBsYWJlbDogXCJDb25maWd1cmF0aW9uXCIsIGhyZWY6IFwiL2RvY3MvcHJvZHVjdC9jb25maWd1cmF0aW9uXCIgfSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XHR7XG5cdFx0XHR0aXRsZTogXCJSZXNvdXJjZXNcIixcblx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdHsgbGFiZWw6IFwiRkFRXCIsIGhyZWY6IFwiL2RvY3MvcmVzb3VyY2VzL2ZhcVwiIH0sXG5cdFx0XHRcdHsgbGFiZWw6IFwiQmVzdCBQcmFjdGljZXNcIiwgaHJlZjogXCIvZG9jcy9yZXNvdXJjZXMvYmVzdC1wcmFjdGljZXNcIiB9LFxuXHRcdFx0XHR7IGxhYmVsOiBcIlRyb3VibGVzaG9vdGluZ1wiLCBocmVmOiBcIi9kb2NzL3Jlc291cmNlcy90cm91Ymxlc2hvb3RpbmdcIiB9LFxuXHRcdFx0XHR7IGxhYmVsOiBcIkludGVncmF0aW9uc1wiLCBocmVmOiBcIi9kb2NzL3Jlc291cmNlcy9pbnRlZ3JhdGlvbnNcIiB9LFxuXHRcdFx0XSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHRpdGxlOiBcIkFQSVwiLFxuXHRcdFx0aXRlbXM6IFtcblx0XHRcdFx0eyBsYWJlbDogXCJPdmVydmlld1wiLCBocmVmOiBcIi9kb2NzL2FwaS9vdmVydmlld1wiIH0sXG5cdFx0XHRcdHsgbGFiZWw6IFwiQXV0aGVudGljYXRpb25cIiwgaHJlZjogXCIvZG9jcy9hcGkvYXV0aGVudGljYXRpb25cIiB9LFxuXHRcdFx0XHR7IGxhYmVsOiBcIkVuZHBvaW50c1wiLCBocmVmOiBcIi9kb2NzL2FwaS9lbmRwb2ludHNcIiB9LFxuXHRcdFx0XHR7IGxhYmVsOiBcIkFQSSBUZXN0ZXJcIiwgaHJlZjogXCIvZG9jcy9hcGkvdGVzdGVyXCIgfSxcblx0XHRcdF0sXG5cdFx0fSxcblx0XSxcblx0c2lkZWJhcjogW10sXG5cdHRoZW1lOiB7XG5cdFx0cHJpbWFyeUNvbG9yOiBcIiMzQjgyRjZcIixcblx0XHRkYXJrTW9kZTogdHJ1ZSxcblx0XHRhY2NlbnRDb2xvcjogXCIjOEI1Q0Y2XCIsXG5cdFx0Y29kZVRoZW1lOiBcImdpdGh1Yi1kYXJrXCIsXG5cdH0sXG5cdGFwaToge1xuXHRcdGJhc2VVcmw6IFwiL2FwaS92MVwiLFxuXHRcdGF1dGhUeXBlOiBcImJlYXJlclwiLFxuXHRcdGF1dGhIZWFkZXI6IFwiQXV0aG9yaXphdGlvblwiLFxuXHRcdHRlc3RlckVuYWJsZWQ6IHRydWUsXG5cdH0sXG5cdHNlYXJjaDoge1xuXHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0cGxhY2Vob2xkZXI6IFwiU2VhcmNoIGRvY3MuLi5cIixcblx0XHRzaG9ydGN1dHM6IFtcIuKMmEtcIiwgXCJDdHJsK0tcIl0sXG5cdH0sXG5cdGVkaXRMaW5rOiB7XG5cdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRiYXNlVXJsOiBcIlwiLFxuXHRcdGJyYW5jaDogXCJtYWluXCIsXG5cdH0sXG5cdGxhc3RVcGRhdGVkOiB7XG5cdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRmb3JtYXQ6IFwiZGQgTU1NIHl5eXlcIixcblx0fSxcbn07XG4iLAogICAgIi8qKlxuICogUHVyZSBvcGVyYXRpb25zIGZvciBidWlsZGluZyBhbmQgbWVyZ2luZyBjb25maWdzLlxuICogTm8gSS9PLiBObyBtdXRhdGlvbiBvZiBpbnB1dHMuXG4gKi9cbmltcG9ydCB7XG5cdERFRkFVTFRfQkFTRV9ST1VURSxcblx0REVGQVVMVF9ET0NTX0RJUixcbn0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERvY3NDb25maWcsXG5cdERvY3NQbHVnaW5PcHRpb25zLFxuXHRSZXNvbHZlZERvY3NDb25maWcsXG59IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgZGVmYXVsdERvY3NDb25maWcgfSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuXG5leHBvcnQgdHlwZSBVc2VyQ29uZmlnID0gUGFydGlhbDxEb2NzQ29uZmlnPiAmIERvY3NQbHVnaW5PcHRpb25zO1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNvbmZpZyA9ICh1c2VyOiBVc2VyQ29uZmlnID0ge30pOiBSZXNvbHZlZERvY3NDb25maWcgPT4gKHtcblx0Li4uZGVmYXVsdERvY3NDb25maWcsXG5cdC4uLnVzZXIsXG5cdG5hdjogdXNlci5uYXYgPz8gZGVmYXVsdERvY3NDb25maWcubmF2LFxuXHRzaWRlYmFyOiB1c2VyLnNpZGViYXIgPz8gZGVmYXVsdERvY3NDb25maWcuc2lkZWJhcixcblx0c2l0ZTogeyAuLi5kZWZhdWx0RG9jc0NvbmZpZy5zaXRlLCAuLi4odXNlci5zaXRlID8/IHt9KSB9LFxuXHR0aGVtZTogbWVyZ2VPcHRpb25hbChkZWZhdWx0RG9jc0NvbmZpZy50aGVtZSwgdXNlci50aGVtZSksXG5cdGFwaTogbWVyZ2VPcHRpb25hbChkZWZhdWx0RG9jc0NvbmZpZy5hcGksIHVzZXIuYXBpKSxcblx0c2VhcmNoOiBtZXJnZU9wdGlvbmFsKGRlZmF1bHREb2NzQ29uZmlnLnNlYXJjaCwgdXNlci5zZWFyY2gpLFxuXHRlZGl0TGluazogbWVyZ2VPcHRpb25hbChkZWZhdWx0RG9jc0NvbmZpZy5lZGl0TGluaywgdXNlci5lZGl0TGluayksXG5cdGxhc3RVcGRhdGVkOiBtZXJnZU9wdGlvbmFsKGRlZmF1bHREb2NzQ29uZmlnLmxhc3RVcGRhdGVkLCB1c2VyLmxhc3RVcGRhdGVkKSxcblx0ZG9jc0RpcjogdXNlci5kb2NzRGlyID8/IERFRkFVTFRfRE9DU19ESVIsXG5cdGJhc2VSb3V0ZTogdXNlci5iYXNlUm91dGUgPz8gREVGQVVMVF9CQVNFX1JPVVRFLFxufSk7XG5cbmNvbnN0IG1lcmdlT3B0aW9uYWwgPSA8VD4oXG5cdGE6IFQgfCB1bmRlZmluZWQsXG5cdGI6IFQgfCB1bmRlZmluZWQsXG4pOiBUIHwgdW5kZWZpbmVkID0+IHtcblx0aWYgKGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGI7XG5cdGlmIChiID09PSB1bmRlZmluZWQpIHJldHVybiBhO1xuXHRyZXR1cm4geyAuLi5hLCAuLi5iIH07XG59O1xuIiwKICAgICIvLyBDb25maWcgRG9tYWluIFNjaGVtYXMgLSBBcmt0eXBlIHZhbGlkYXRpb24gc2NoZW1hc1xuLy8gRm9sbG93aW5nIC9mb2xsb3ctYXJrdHlwZSB3b3JrZmxvdyBmb3IgdHlwZS1zYWZlIHJ1bnRpbWUgdmFsaWRhdGlvblxuXG5pbXBvcnQgeyBBUElfQVVUSF9UWVBFUyB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdHlwZSBBcHBFcnJvciwgY29uZmlnRXJyb3IgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IGVyciwgb2ssIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvdHlwZXMvcmVzdWx0XCI7XG5pbXBvcnQgeyB0eXBlIFR5cGUsIHR5cGUgfSBmcm9tIFwiYXJrdHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBBcGlFbmRwb2ludCwgRG9jc0NvbmZpZyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG4vKipcbiAqIFNpdGUgU2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBzaXRlU2NoZW1hOiBUeXBlID0gdHlwZSh7XG5cdHRpdGxlOiBcInN0cmluZyA+PSAxXCIsXG5cdGRlc2NyaXB0aW9uOiBcInN0cmluZyA+PSAxXCIsXG59KTtcblxuLyoqXG4gKiBBUEkgU2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBhcGlTY2hlbWE6IFR5cGUgPSB0eXBlKHtcblx0YmFzZVVybDogXCJzdHJpbmcgPj0gMVwiLFxuXHRhdXRoVHlwZTogdHlwZShcIidiZWFyZXInIHwgJ2FwaUtleScgfCAnb2F1dGgyJ1wiKSxcbn0pO1xuXG4vKipcbiAqIEFQSSBFbmRwb2ludCBTY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IGFwaUVuZHBvaW50U2NoZW1hOiBUeXBlID0gdHlwZSh7XG5cdG1ldGhvZDogdHlwZShcIidHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnREVMRVRFJyB8ICdQQVRDSCdcIiksXG5cdHBhdGg6IFwic3RyaW5nID49IDFcIixcblx0ZGVzY3JpcHRpb246IFwic3RyaW5nID49IDFcIixcbn0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25Jc3N1ZSB7XG5cdHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblx0cmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuXHRyZWFkb25seSBoaW50Pzogc3RyaW5nO1xuXHRyZWFkb25seSBzdWdnZXN0aW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5jb25zdCBpc05vbkVtcHR5U3RyaW5nID0gKHY6IHVua25vd24pOiB2IGlzIHN0cmluZyA9PlxuXHR0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiB2LnRyaW0oKS5sZW5ndGggPiAwO1xuXG5jb25zdCB2YWxpZGF0ZVNpdGUgPSAoc2l0ZTogRG9jc0NvbmZpZ1tcInNpdGVcIl0pOiBWYWxpZGF0aW9uSXNzdWVbXSA9PiB7XG5cdGNvbnN0IGlzc3VlczogVmFsaWRhdGlvbklzc3VlW10gPSBbXTtcblx0aWYgKCFpc05vbkVtcHR5U3RyaW5nKHNpdGUudGl0bGUpKSB7XG5cdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0cGF0aDogXCJzaXRlLnRpdGxlXCIsXG5cdFx0XHRtZXNzYWdlOiBcIm11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIsXG5cdFx0fSk7XG5cdH1cblx0aWYgKCFpc05vbkVtcHR5U3RyaW5nKHNpdGUuZGVzY3JpcHRpb24pKSB7XG5cdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0cGF0aDogXCJzaXRlLmRlc2NyaXB0aW9uXCIsXG5cdFx0XHRtZXNzYWdlOiBcIm11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIsXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGlzc3Vlcztcbn07XG5cbmNvbnN0IHZhbGlkYXRlQXBpID0gKGFwaTogRG9jc0NvbmZpZ1tcImFwaVwiXSk6IFZhbGlkYXRpb25Jc3N1ZVtdID0+IHtcblx0Y29uc3QgaXNzdWVzOiBWYWxpZGF0aW9uSXNzdWVbXSA9IFtdO1xuXHRpZiAoYXBpID09PSB1bmRlZmluZWQpIHJldHVybiBpc3N1ZXM7XG5cdGlmICghaXNOb25FbXB0eVN0cmluZyhhcGkuYmFzZVVybCkpIHtcblx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRwYXRoOiBcImFwaS5iYXNlVXJsXCIsXG5cdFx0XHRtZXNzYWdlOiBcIm11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIsXG5cdFx0fSk7XG5cdH1cblx0Y29uc3QgYXV0aFR5cGVzID0gQVBJX0FVVEhfVFlQRVMgYXMgcmVhZG9ubHkgc3RyaW5nW107XG5cdGlmICghYXV0aFR5cGVzLmluY2x1ZGVzKGFwaS5hdXRoVHlwZSkpIHtcblx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRwYXRoOiBcImFwaS5hdXRoVHlwZVwiLFxuXHRcdFx0bWVzc2FnZTogYG11c3QgYmUgb25lIG9mOiAke0FQSV9BVVRIX1RZUEVTLmpvaW4oXCIsIFwiKX1gLFxuXHRcdFx0c3VnZ2VzdGlvbnM6IFsuLi5BUElfQVVUSF9UWVBFU10sXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGlzc3Vlcztcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVNpdGVTY2hlbWEgPSAoXG5cdHM6IERvY3NDb25maWdbXCJzaXRlXCJdLFxuKTogUmVzdWx0PERvY3NDb25maWdbXCJzaXRlXCJdLCBBcHBFcnJvcj4gPT4ge1xuXHRjb25zdCBpc3N1ZXMgPSB2YWxpZGF0ZVNpdGUocyk7XG5cdGlmIChpc3N1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gb2socyk7XG5cdGNvbnN0IGZpcnN0ID0gaXNzdWVzWzBdO1xuXHRyZXR1cm4gZXJyKFxuXHRcdGNvbmZpZ0Vycm9yKGZpcnN0Lm1lc3NhZ2UsIHtcblx0XHRcdHBhdGg6IGZpcnN0LnBhdGgsXG5cdFx0XHQuLi4oZmlyc3Quc3VnZ2VzdGlvbnMgPyB7IHN1Z2dlc3Rpb25zOiBmaXJzdC5zdWdnZXN0aW9ucyB9IDoge30pLFxuXHRcdH0pLFxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlQXBpU2NoZW1hID0gKFxuXHRhOiBEb2NzQ29uZmlnW1wiYXBpXCJdLFxuKTogUmVzdWx0PERvY3NDb25maWdbXCJhcGlcIl0gfCB1bmRlZmluZWQsIEFwcEVycm9yPiA9PiB7XG5cdGlmIChhID09PSB1bmRlZmluZWQpIHJldHVybiBvayh1bmRlZmluZWQpO1xuXHRjb25zdCBpc3N1ZXMgPSB2YWxpZGF0ZUFwaShhKTtcblx0aWYgKGlzc3Vlcy5sZW5ndGggPT09IDApIHJldHVybiBvayhhKTtcblx0Y29uc3QgZmlyc3QgPSBpc3N1ZXNbMF07XG5cdHJldHVybiBlcnIoXG5cdFx0Y29uZmlnRXJyb3IoZmlyc3QubWVzc2FnZSwge1xuXHRcdFx0cGF0aDogZmlyc3QucGF0aCxcblx0XHRcdC4uLihmaXJzdC5zdWdnZXN0aW9ucyA/IHsgc3VnZ2VzdGlvbnM6IGZpcnN0LnN1Z2dlc3Rpb25zIH0gOiB7fSksXG5cdFx0fSksXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBcGlFbmRwb2ludCA9IChcblx0ZTogQXBpRW5kcG9pbnQsXG5cdHBhdGg6IHN0cmluZyxcbik6IFJlc3VsdDxBcGlFbmRwb2ludCwgQXBwRXJyb3I+ID0+IHtcblx0Y29uc3QgcmVzdWx0ID0gYXBpRW5kcG9pbnRTY2hlbWEoZSk7XG5cdGlmIChyZXN1bHQgaW5zdGFuY2VvZiB0eXBlLmVycm9ycykge1xuXHRcdHJldHVybiBlcnIoXG5cdFx0XHRjb25maWdFcnJvcihyZXN1bHQuc3VtbWFyeSwge1xuXHRcdFx0XHRwYXRoOiBgJHtwYXRofWAsXG5cdFx0XHR9KSxcblx0XHQpO1xuXHR9XG5cdHJldHVybiBvayhlKTtcbn07XG5cbi8qKiBDb2xsZWN0IGFsbCBpc3N1ZXMgaW4gb25lIHBhc3Mg4oCUIHJldHVybnMgZXZlcnkgcHJvYmxlbSBhdCBvbmNlLiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRG9jc0NvbmZpZ0FsbCA9IChcblx0YzogRG9jc0NvbmZpZyxcbik6IHsgb2s6IHRydWUgfSB8IHsgb2s6IGZhbHNlOyBpc3N1ZXM6IHJlYWRvbmx5IFZhbGlkYXRpb25Jc3N1ZVtdIH0gPT4ge1xuXHRjb25zdCBpc3N1ZXM6IFZhbGlkYXRpb25Jc3N1ZVtdID0gW1xuXHRcdC4uLnZhbGlkYXRlU2l0ZShjLnNpdGUpLFxuXHRcdC4uLnZhbGlkYXRlQXBpKGMuYXBpKSxcblx0XTtcblx0aWYgKGlzc3Vlcy5sZW5ndGggPiAwKSByZXR1cm4geyBvazogZmFsc2UsIGlzc3VlcyB9O1xuXHRyZXR1cm4geyBvazogdHJ1ZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRG9jc0NvbmZpZyA9IChcblx0YzogRG9jc0NvbmZpZyxcbik6IFJlc3VsdDxEb2NzQ29uZmlnLCBBcHBFcnJvcj4gPT4ge1xuXHRjb25zdCBhbGwgPSB2YWxpZGF0ZURvY3NDb25maWdBbGwoYyk7XG5cdGlmIChhbGwub2spIHJldHVybiBvayhjKTtcblx0Y29uc3QgZmlyc3QgPSBhbGwuaXNzdWVzWzBdO1xuXHRpZiAoIWZpcnN0KSByZXR1cm4gb2soYyk7XG5cdHJldHVybiBlcnIoXG5cdFx0Y29uZmlnRXJyb3IoZmlyc3QubWVzc2FnZSwge1xuXHRcdFx0cGF0aDogZmlyc3QucGF0aCxcblx0XHRcdC4uLihmaXJzdC5zdWdnZXN0aW9ucyA/IHsgc3VnZ2VzdGlvbnM6IGZpcnN0LnN1Z2dlc3Rpb25zIH0gOiB7fSksXG5cdFx0XHQuLi4oZmlyc3QuaGludCA/IHsgY29udGV4dDogeyBoaW50OiBmaXJzdC5oaW50IH0gfSA6IHt9KSxcblx0XHR9KSxcblx0KTtcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnJhbmQgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBWaXJ0dWFsTW9kdWxlSWQgPSBCcmFuZDxzdHJpbmcsIFwiVmlydHVhbE1vZHVsZUlkXCI+O1xuZXhwb3J0IGNvbnN0IFZpcnR1YWxNb2R1bGVJZCA9IChzOiBzdHJpbmcpOiBWaXJ0dWFsTW9kdWxlSWQgPT5cblx0cyBhcyBWaXJ0dWFsTW9kdWxlSWQ7XG5cbmV4cG9ydCBjb25zdCBWSVJUVUFMX0RBVEE6IFZpcnR1YWxNb2R1bGVJZCA9XG5cdFZpcnR1YWxNb2R1bGVJZChcInZpcnR1YWw6ZG9jcy9kYXRhXCIpO1xuZXhwb3J0IGNvbnN0IFZJUlRVQUxfU0VBUkNIX0lOREVYOiBWaXJ0dWFsTW9kdWxlSWQgPSBWaXJ0dWFsTW9kdWxlSWQoXG5cdFwidmlydHVhbDpkb2NzL3NlYXJjaC1pbmRleFwiLFxuKTtcbmV4cG9ydCBjb25zdCBWSVJUVUFMX1NJREVCQVI6IFZpcnR1YWxNb2R1bGVJZCA9IFZpcnR1YWxNb2R1bGVJZChcblx0XCJ2aXJ0dWFsOmRvY3Mvc2lkZWJhclwiLFxuKTtcbmV4cG9ydCBjb25zdCBWSVJUVUFMX05BVjogVmlydHVhbE1vZHVsZUlkID0gVmlydHVhbE1vZHVsZUlkKFwidmlydHVhbDpkb2NzL25hdlwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Db250ZXh0IHtcblx0cmVhZG9ubHkgcm9vdDogc3RyaW5nO1xuXHRyZWFkb25seSBtb2RlOiBcImRldlwiIHwgXCJidWlsZFwiIHwgXCJ0ZXN0XCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luSG9va3Mge1xuXHRyZWFkb25seSBjb25maWdSZXNvbHZlZD86IChjb25maWc6IFBsdWdpbkNvbnRleHQpID0+IHZvaWQ7XG5cdHJlYWRvbmx5IHNlcnZlckNsb3NlZD86ICgpID0+IHZvaWQ7XG5cdHJlYWRvbmx5IGZpbGVDaGFuZ2VkPzogKGZpbGVQYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG5cdHJlYWRvbmx5IGRvY3NSZWxvYWRlZD86ICgpID0+IHZvaWQ7XG59XG4iLAogICAgIi8qKlxuICogUHVyZSBvcGVyYXRpb25zIGZvciBnZW5lcmF0aW5nIHZpcnR1YWwgbW9kdWxlIHNvdXJjZSBjb2RlIChWaXRlLWxvYWRhYmxlIEVTTSkuXG4gKiBObyBJL08sIG5vIGV4Y2VwdGlvbnMuIFJldHVybnMgc3RyaW5ncyByZWFkeSB0byBiZSBlbWl0dGVkIGFzIHZpcnR1YWwgbW9kdWxlIGNvZGUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZERvY3NDb25maWcgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL21vZHVsZXMvY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IERvY1BhZ2UsIEZpbGVQYXRoIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL2NvbnRlbnRcIjtcbmltcG9ydCB0eXBlIHsgTmF2U2VjdGlvbiwgU2lkZWJhckdyb3VwIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL25hdmlnYXRpb25cIjtcbmltcG9ydCB7XG5cdFZJUlRVQUxfREFUQSxcblx0VklSVFVBTF9OQVYsXG5cdFZJUlRVQUxfU0VBUkNIX0lOREVYLFxuXHRWSVJUVUFMX1NJREVCQVIsXG59IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9wbHVnaW4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoSW5kZXggfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL21vZHVsZXMvc2VhcmNoXCI7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3V0aWxzL29iamVjdFwiO1xuXG5jb25zdCBzZXJpYWxpemVGb3JFU00gPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT5cblx0SlNPTi5zdHJpbmdpZnkodmFsdWUsIHJlcGxhY2VyLCAyKTtcblxuY29uc3QgcmVwbGFjZXIgPSAoX2tleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24gPT4ge1xuXHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblx0cmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkRG9jc0RhdGFNb2R1bGUgPSAocGFnZXM6IHJlYWRvbmx5IERvY1BhZ2VbXSk6IHN0cmluZyA9PiB7XG5cdGNvbnN0IGV4cG9ydGVkID0gcGFnZXMubWFwKChwKSA9PiAoe1xuXHRcdGlkOiBTdHJpbmcocC5pZCksXG5cdFx0c2x1ZzogU3RyaW5nKHAuc2x1ZyksXG5cdFx0dGl0bGU6IHAudGl0bGUsXG5cdFx0ZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24sXG5cdFx0ZnJvbnRtYXR0ZXI6IHAuZnJvbnRtYXR0ZXIsXG5cdFx0cmF3Q29udGVudDogcC5yYXdDb250ZW50LFxuXHRcdGNvbnRlbnQ6IHAuY29udGVudCxcblx0XHRmaWxlUGF0aDogU3RyaW5nKHAuZmlsZVBhdGgpLFxuXHR9KSk7XG5cdHJldHVybiBgZXhwb3J0IGNvbnN0IGRvY3NEYXRhID0gJHtzZXJpYWxpemVGb3JFU00oZXhwb3J0ZWQpfTtgO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2lkZWJhck1vZHVsZSA9IChncm91cHM6IHJlYWRvbmx5IFNpZGViYXJHcm91cFtdKTogc3RyaW5nID0+XG5cdGBleHBvcnQgY29uc3Qgc2lkZWJhciA9ICR7c2VyaWFsaXplRm9yRVNNKGdyb3Vwcyl9O2A7XG5cbmV4cG9ydCBjb25zdCBidWlsZE5hdk1vZHVsZSA9IChzZWN0aW9uczogcmVhZG9ubHkgTmF2U2VjdGlvbltdKTogc3RyaW5nID0+XG5cdGBleHBvcnQgY29uc3QgbmF2ID0gJHtzZXJpYWxpemVGb3JFU00oc2VjdGlvbnMpfTtgO1xuXG5leHBvcnQgY29uc3QgYnVpbGRTZWFyY2hJbmRleE1vZHVsZSA9IChpbmRleDogU2VhcmNoSW5kZXgpOiBzdHJpbmcgPT5cblx0YGV4cG9ydCBjb25zdCBzZWFyY2hJbmRleCA9ICR7c2VyaWFsaXplRm9yRVNNKGluZGV4LmVudHJpZXMpfTtgO1xuXG5leHBvcnQgY29uc3QgYnVpbGRDb25maWdNb2R1bGUgPSAoXG5cdGNvbmZpZzogUmVzb2x2ZWREb2NzQ29uZmlnLFxuKTogc3RyaW5nID0+IGBleHBvcnQgY29uc3QgZG9jc0NvbmZpZyA9ICR7c2VyaWFsaXplRm9yRVNNKGNvbmZpZyl9O1xuZXhwb3J0IGNvbnN0IHNpdGUgPSAke3NlcmlhbGl6ZUZvckVTTShjb25maWcuc2l0ZSl9O1xuZXhwb3J0IGNvbnN0IG5hdiA9ICR7c2VyaWFsaXplRm9yRVNNKGNvbmZpZy5uYXYpfTtcbmV4cG9ydCBjb25zdCBzaWRlYmFyID0gJHtzZXJpYWxpemVGb3JFU00oY29uZmlnLnNpZGViYXIpfTtcbmV4cG9ydCBjb25zdCBhcGkgPSAke3NlcmlhbGl6ZUZvckVTTShjb25maWcuYXBpKX07XG5leHBvcnQgY29uc3Qgc2VhcmNoID0gJHtzZXJpYWxpemVGb3JFU00oY29uZmlnLnNlYXJjaCl9O1xuZXhwb3J0IGNvbnN0IGVkaXRMaW5rID0gJHtzZXJpYWxpemVGb3JFU00oY29uZmlnLmVkaXRMaW5rKX07XG5leHBvcnQgY29uc3QgbGFzdFVwZGF0ZWQgPSAke3NlcmlhbGl6ZUZvckVTTShjb25maWcubGFzdFVwZGF0ZWQpfTtgO1xuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVZpcnR1YWxNb2R1bGUgPSAoaWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG5cdGlmIChpZCA9PT0gVklSVFVBTF9EQVRBKSByZXR1cm4gXCJkYXRhXCI7XG5cdGlmIChpZCA9PT0gVklSVFVBTF9TSURFQkFSKSByZXR1cm4gXCJzaWRlYmFyXCI7XG5cdGlmIChpZCA9PT0gVklSVFVBTF9OQVYpIHJldHVybiBcIm5hdlwiO1xuXHRpZiAoaWQgPT09IFZJUlRVQUxfU0VBUkNIX0lOREVYKSByZXR1cm4gXCJzZWFyY2gtaW5kZXhcIjtcblx0cmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ZpcnR1YWxEb2NzTW9kdWxlID0gKGlkOiBzdHJpbmcpOiBib29sZWFuID0+XG5cdGlkLnN0YXJ0c1dpdGgoXCJ2aXJ0dWFsOmRvY3MvXCIpO1xuXG5leHBvcnQgY29uc3QgcGF0aFRvRmlsZVBhdGggPSAocDogc3RyaW5nKTogRmlsZVBhdGggPT4gcCBhcyB1bmtub3duIGFzIEZpbGVQYXRoO1xuXG5leHBvcnQgY29uc3QgaXNNYXJrZG93blBhdGggPSAocDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG5cdGlmICghaXNTdHJpbmcocCkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHAuZW5kc1dpdGgoXCIubWRcIikgfHwgcC5lbmRzV2l0aChcIi5tZG9jXCIpO1xufTtcbiIsCiAgICAiLyoqXG4gKiBVc2UgY2FzZTogYnVpbGQgYWxsIHZpcnR1YWwgbW9kdWxlIHNvdXJjZSBjb2RlcyBmcm9tIGEgcmVzb2x2ZWQgY29uZmlnIGFuZCBwYWdlcy5cbiAqIFJldHVybnMgYSBwdXJlIGRhdGEgc3RydWN0dXJlIChubyBWaXRlIGNvdXBsaW5nKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkRG9jc0NvbmZpZyB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgRG9jUGFnZSB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCI7XG5pbXBvcnQgdHlwZSB7IE5hdlNlY3Rpb24sIFNpZGViYXJHcm91cCB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaEluZGV4IH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL3NlYXJjaFwiO1xuaW1wb3J0IHR5cGUgeyBBcHBFcnJvciB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL2Vycm9yc1wiO1xuaW1wb3J0IHsgb2ssIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvdHlwZXMvcmVzdWx0XCI7XG5pbXBvcnQge1xuXHRidWlsZENvbmZpZ01vZHVsZSxcblx0YnVpbGREb2NzRGF0YU1vZHVsZSxcblx0YnVpbGROYXZNb2R1bGUsXG5cdGJ1aWxkU2VhcmNoSW5kZXhNb2R1bGUsXG5cdGJ1aWxkU2lkZWJhck1vZHVsZSxcbn0gZnJvbSBcIi4uLy4uL2RvbWFpbi9vcGVyYXRpb25zL2J1aWxkLXZpcnR1YWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsTW9kdWxlU2V0IHtcblx0cmVhZG9ubHkgXCJ2aXJ0dWFsOmRvY3MvZGF0YVwiOiBzdHJpbmc7XG5cdHJlYWRvbmx5IFwidmlydHVhbDpkb2NzL3NpZGViYXJcIjogc3RyaW5nO1xuXHRyZWFkb25seSBcInZpcnR1YWw6ZG9jcy9uYXZcIjogc3RyaW5nO1xuXHRyZWFkb25seSBcInZpcnR1YWw6ZG9jcy9zZWFyY2gtaW5kZXhcIjogc3RyaW5nO1xuXHRyZWFkb25seSBcInZpcnR1YWw6ZG9jcy9jb25maWdcIjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkVmlydHVhbE1vZHVsZXNJbnB1dCB7XG5cdHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWREb2NzQ29uZmlnO1xuXHRyZWFkb25seSBwYWdlczogcmVhZG9ubHkgRG9jUGFnZVtdO1xuXHRyZWFkb25seSBzaWRlYmFyOiByZWFkb25seSBTaWRlYmFyR3JvdXBbXTtcblx0cmVhZG9ubHkgbmF2OiByZWFkb25seSBOYXZTZWN0aW9uW107XG5cdHJlYWRvbmx5IHNlYXJjaEluZGV4OiBTZWFyY2hJbmRleDtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRWaXJ0dWFsTW9kdWxlcyA9IChcblx0aW5wdXQ6IEJ1aWxkVmlydHVhbE1vZHVsZXNJbnB1dCxcbikgPT4gUmVzdWx0PFZpcnR1YWxNb2R1bGVTZXQsIEFwcEVycm9yPjtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkVmlydHVhbE1vZHVsZXM6IEJ1aWxkVmlydHVhbE1vZHVsZXMgPSAoe1xuXHRjb25maWcsXG5cdHBhZ2VzLFxuXHRzaWRlYmFyLFxuXHRuYXYsXG5cdHNlYXJjaEluZGV4LFxufSkgPT5cblx0b2soe1xuXHRcdFwidmlydHVhbDpkb2NzL2RhdGFcIjogYnVpbGREb2NzRGF0YU1vZHVsZShwYWdlcyksXG5cdFx0XCJ2aXJ0dWFsOmRvY3Mvc2lkZWJhclwiOiBidWlsZFNpZGViYXJNb2R1bGUoc2lkZWJhciksXG5cdFx0XCJ2aXJ0dWFsOmRvY3MvbmF2XCI6IGJ1aWxkTmF2TW9kdWxlKG5hdiksXG5cdFx0XCJ2aXJ0dWFsOmRvY3Mvc2VhcmNoLWluZGV4XCI6IGJ1aWxkU2VhcmNoSW5kZXhNb2R1bGUoc2VhcmNoSW5kZXgpLFxuXHRcdFwidmlydHVhbDpkb2NzL2NvbmZpZ1wiOiBidWlsZENvbmZpZ01vZHVsZShjb25maWcpLFxuXHR9KTtcbiIsCiAgICAiLyoqXG4gKiBQdXJlIGFycmF5IGhlbHBlcnMgdXNlZCBieSBuYXZpZ2F0aW9uIGRvbWFpbiBvcGVyYXRpb25zLlxuICovXG5cbmV4cG9ydCBjb25zdCBzb3J0QnkgPSA8VCwgSyBleHRlbmRzIG51bWJlciB8IHN0cmluZz4oXG5cdGl0ZW1zOiByZWFkb25seSBUW10sXG5cdGtleUZuOiAoaXRlbTogVCkgPT4gSyxcbik6IFRbXSA9PiB7XG5cdHJldHVybiBbLi4uaXRlbXNdLnNvcnQoKGEsIGIpID0+IHtcblx0XHRjb25zdCBrYSA9IGtleUZuKGEpO1xuXHRcdGNvbnN0IGtiID0ga2V5Rm4oYik7XG5cdFx0aWYgKHR5cGVvZiBrYSA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2Yga2IgPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdHJldHVybiBrYSAtIGtiO1xuXHRcdH1cblx0XHRyZXR1cm4gU3RyaW5nKGthKS5sb2NhbGVDb21wYXJlKFN0cmluZyhrYikpO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzb3J0QnlTdHJpbmcgPSA8VD4oXG5cdGl0ZW1zOiByZWFkb25seSBUW10sXG5cdGtleUZuOiAoaXRlbTogVCkgPT4gc3RyaW5nLFxuKTogVFtdID0+IHtcblx0cmV0dXJuIFsuLi5pdGVtc10uc29ydCgoYSwgYikgPT4ga2V5Rm4oYSkubG9jYWxlQ29tcGFyZShrZXlGbihiKSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdyb3VwQnkgPSA8VCwgSyBleHRlbmRzIHN0cmluZyB8IG51bWJlcj4oXG5cdGl0ZW1zOiByZWFkb25seSBUW10sXG5cdGtleUZuOiAoaXRlbTogVCkgPT4gSyxcbik6IFJlY29yZDxzdHJpbmcsIFRbXT4gPT4ge1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFRbXT4gPSB7fTtcblx0Zm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG5cdFx0Y29uc3Qga2V5ID0gU3RyaW5nKGtleUZuKGl0ZW0pKTtcblx0XHRpZiAoIXJlc3VsdFtrZXldKSB7XG5cdFx0XHRyZXN1bHRba2V5XSA9IFtdO1xuXHRcdH1cblx0XHRyZXN1bHRba2V5XS5wdXNoKGl0ZW0pO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59O1xuIiwKICAgICIvKipcbiAqIFB1cmUgb3BlcmF0aW9ucyBmb3Igc29ydGluZy9vcmRlcmluZyBuYXYgaXRlbXMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuXHROYXZJdGVtLFxuXHROYXZTZWN0aW9uLFxuXHRTaWRlYmFyR3JvdXAsXG5cdFNpZGViYXJJdGVtLFxufSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IHNvcnRCeVN0cmluZyB9IGZyb20gXCIuLi9zaGFyZWQvdXRpbHMvYXJyYXlcIjtcblxuZXhwb3J0IGNvbnN0IHNvcnROYXZTZWN0aW9ucyA9IChcblx0c2VjdGlvbnM6IHJlYWRvbmx5IE5hdlNlY3Rpb25bXSxcbik6IHJlYWRvbmx5IE5hdlNlY3Rpb25bXSA9PlxuXHRbLi4uc2VjdGlvbnNdLnNvcnQoKGEsIGIpID0+IGEudGl0bGUubG9jYWxlQ29tcGFyZShiLnRpdGxlKSk7XG5cbmV4cG9ydCBjb25zdCBzb3J0TmF2SXRlbXMgPSAoaXRlbXM6IHJlYWRvbmx5IE5hdkl0ZW1bXSk6IHJlYWRvbmx5IE5hdkl0ZW1bXSA9PlxuXHRzb3J0QnlTdHJpbmcoaXRlbXMsIChpKSA9PiBpLmxhYmVsKTtcblxuZXhwb3J0IGNvbnN0IHNvcnRTaWRlYmFyR3JvdXBzID0gKFxuXHRncm91cHM6IHJlYWRvbmx5IFNpZGViYXJHcm91cFtdLFxuKTogcmVhZG9ubHkgU2lkZWJhckdyb3VwW10gPT4gc29ydEJ5U3RyaW5nKGdyb3VwcywgKGcpID0+IGcudGl0bGUpO1xuXG5leHBvcnQgY29uc3Qgc29ydFNpZGViYXJJdGVtcyA9IChcblx0aXRlbXM6IHJlYWRvbmx5IFNpZGViYXJJdGVtW10sXG4pOiByZWFkb25seSBTaWRlYmFySXRlbVtdID0+IHNvcnRCeVN0cmluZyhpdGVtcywgKGkpID0+IGkudGl0bGUpO1xuIiwKICAgICIvKipcbiAqIFVzZSBjYXNlOiBzZWxlY3Qgb3IgZmFsbGJhY2sgdG8gdGhlIG5hdmlnYXRpb24gc3RydWN0dXJlLlxuICogUHVyZTogZGVwZW5kcyBvbmx5IG9uIGNvbmZpZyBpbnB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcEVycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBvaywgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC90eXBlcy9yZXN1bHRcIjtcbmltcG9ydCB7IHNvcnROYXZTZWN0aW9ucyB9IGZyb20gXCIuLi8uLi9kb21haW4vb3BlcmF0aW9ucy9zb3J0XCI7XG5pbXBvcnQgdHlwZSB7IE5hdlNlY3Rpb24gfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgQnVpbGROYXYgPSAoXG5cdHNlY3Rpb25zOiByZWFkb25seSBOYXZTZWN0aW9uW10sXG4pID0+IFJlc3VsdDxyZWFkb25seSBOYXZTZWN0aW9uW10sIEFwcEVycm9yPjtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkTmF2OiBCdWlsZE5hdiA9IChzZWN0aW9ucykgPT4gb2soc29ydE5hdlNlY3Rpb25zKHNlY3Rpb25zKSk7XG4iLAogICAgIi8qKlxuICogUHVyZSBvcGVyYXRpb25zIGZvciBnZW5lcmF0aW5nIGFuZCBmb3JtYXR0aW5nIG5hdmlnYXRpb24gc3RydWN0dXJlcy5cbiAqIE5vIEkvTy4gTm8gbXV0YXRpb24gb2YgaW5wdXRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRG9jRmlsZSwgRG9jUGFnZSB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCI7XG5pbXBvcnQgeyBTSURFQkFSX0RFRkFVTFRfR1JPVVBfVElUTEUgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC9jb25zdGFudHNcIjtcbmltcG9ydCB7IGNhcGl0YWxpemUsIHRpdGxlQ2FzZSB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3V0aWxzL3N0cmluZ1wiO1xuaW1wb3J0IHR5cGUgeyBTaWRlYmFyR3JvdXAsIFNpZGViYXJJdGVtIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBncm91cEJ5LCBzb3J0QnkgfSBmcm9tIFwiLi4vc2hhcmVkL3V0aWxzL2FycmF5XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBJbnB1dCB7XG5cdHJlYWRvbmx5IHNsdWc6IHN0cmluZztcblx0cmVhZG9ubHkgdGl0bGU6IHN0cmluZztcblx0cmVhZG9ubHkgb3JkZXI6IG51bWJlcjtcblx0cmVhZG9ubHkgZ3JvdXA/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGJhZGdlPzogc3RyaW5nO1xuXHRyZWFkb25seSBiYWRnZVZhcmlhbnQ/OiBTaWRlYmFySXRlbVtcImJhZGdlVmFyaWFudFwiXTtcbn1cblxuLyoqIFN0cnVjdHVyYWwgc3Vic2V0IG5lZWRlZCB0byBkZXJpdmUgYSBzaWRlYmFyIGl0ZW0uIEJvdGggRG9jRmlsZSBhbmQgRG9jUGFnZSBzYXRpc2Z5IGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWRlYmFyU291cmNlIHtcblx0cmVhZG9ubHkgc2x1ZzogRG9jRmlsZVtcInNsdWdcIl0gfCBEb2NQYWdlW1wic2x1Z1wiXTtcblx0cmVhZG9ubHkgZ3JvdXA/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IG9yZGVyOiBudW1iZXI7XG5cdHJlYWRvbmx5IGZyb250bWF0dGVyOiBEb2NGaWxlW1wiZnJvbnRtYXR0ZXJcIl07XG59XG5cbi8qKiBGb3JtYXQgYSBmb2xkZXIgbmFtZSBpbnRvIGEgaHVtYW4tcmVhZGFibGUgZ3JvdXAgdGl0bGUuICovXG5leHBvcnQgY29uc3QgZm9ybWF0R3JvdXBUaXRsZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRpZiAobmFtZSA9PT0gXCJyb290XCIpIHJldHVybiBTSURFQkFSX0RFRkFVTFRfR1JPVVBfVElUTEU7XG5cdHJldHVybiB0aXRsZUNhc2UobmFtZSk7XG59O1xuXG4vKiogR3JvdXAgZG9jIGZpbGVzIGJ5IHRoZWlyIGZpcnN0IHBhdGggc2VnbWVudCwgc29ydGluZyBlYWNoIGJ5IGBvcmRlcmAuICovXG5leHBvcnQgY29uc3QgZ3JvdXBEb2NzQnlGb2xkZXIgPSAoXG5cdGRvY3M6IHJlYWRvbmx5IFNpZGViYXJTb3VyY2VbXSxcbik6IHJlYWRvbmx5IFNpZGViYXJHcm91cFtdID0+IHtcblx0Y29uc3QgZ3JvdXBlZCA9IGdyb3VwQnkoZG9jcywgKGQpID0+IGQuZ3JvdXAgPz8gXCJyb290XCIpO1xuXHRjb25zdCBncm91cHM6IFNpZGViYXJHcm91cFtdID0gW107XG5cdGZvciAoY29uc3QgW2tleSwgaXRlbXNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwZWQpKSB7XG5cdFx0Y29uc3Qgc29ydGVkID0gc29ydEJ5KGl0ZW1zLCAoaSkgPT4gaS5vcmRlcik7XG5cdFx0Z3JvdXBzLnB1c2goe1xuXHRcdFx0dGl0bGU6IGZvcm1hdEdyb3VwVGl0bGUoa2V5KSxcblx0XHRcdGl0ZW1zOiBzb3J0ZWQubWFwKHRvU2lkZWJhckl0ZW0pLFxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBncm91cHMuc29ydCgoYSwgYikgPT4gYS50aXRsZS5sb2NhbGVDb21wYXJlKGIudGl0bGUpKTtcbn07XG5cbmNvbnN0IHRvU2lkZWJhckl0ZW0gPSAoZG9jOiBTaWRlYmFyU291cmNlKTogU2lkZWJhckl0ZW0gPT4ge1xuXHRjb25zdCBmbSA9IGRvYy5mcm9udG1hdHRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0Y29uc3QgaXRlbTogU2lkZWJhckl0ZW0gPSB7XG5cdFx0dGl0bGU6IGRlcml2ZVRpdGxlKGRvYyksXG5cdFx0c2x1ZzogdHlwZW9mIGRvYy5zbHVnID09PSBcInN0cmluZ1wiID8gZG9jLnNsdWcgOiBTdHJpbmcoZG9jLnNsdWcpLFxuXHR9O1xuXHRpZiAodHlwZW9mIGZtLmJhZGdlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0Y29uc3Qgd2l0aEJhZGdlOiBTaWRlYmFySXRlbSA9IHsgLi4uaXRlbSwgYmFkZ2U6IGZtLmJhZGdlIH07XG5cdFx0aWYgKGlzQmFkZ2VWYXJpYW50KGZtLmJhZGdlVmFyaWFudCkpIHtcblx0XHRcdHJldHVybiB7IC4uLndpdGhCYWRnZSwgYmFkZ2VWYXJpYW50OiBmbS5iYWRnZVZhcmlhbnQgfTtcblx0XHR9XG5cdFx0cmV0dXJuIHdpdGhCYWRnZTtcblx0fVxuXHRyZXR1cm4gaXRlbTtcbn07XG5cbmNvbnN0IGRlcml2ZVRpdGxlID0gKGRvYzogU2lkZWJhclNvdXJjZSk6IHN0cmluZyA9PiB7XG5cdGNvbnN0IGZtID0gZG9jLmZyb250bWF0dGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRpZiAodHlwZW9mIGZtLnRpdGxlID09PSBcInN0cmluZ1wiICYmIGZtLnRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKVxuXHRcdHJldHVybiBmbS50aXRsZTtcblx0Y29uc3Qgc2x1Z1N0ciA9IHR5cGVvZiBkb2Muc2x1ZyA9PT0gXCJzdHJpbmdcIiA/IGRvYy5zbHVnIDogU3RyaW5nKGRvYy5zbHVnKTtcblx0Y29uc3QgbGFzdCA9IHNsdWdTdHIuc3BsaXQoXCIvXCIpLnBvcCgpO1xuXHRyZXR1cm4gbGFzdCA/IGNhcGl0YWxpemUobGFzdCkgOiBzbHVnU3RyO1xufTtcblxuY29uc3QgaXNCYWRnZVZhcmlhbnQgPSAoXG5cdHY6IHVua25vd24sXG4pOiB2IGlzIE5vbk51bGxhYmxlPFNpZGViYXJJdGVtW1wiYmFkZ2VWYXJpYW50XCJdPiA9PlxuXHR2ID09PSBcImRlZmF1bHRcIiB8fCB2ID09PSBcInN1Y2Nlc3NcIiB8fCB2ID09PSBcIndhcm5pbmdcIiB8fCB2ID09PSBcImRhbmdlclwiO1xuIiwKICAgICIvKipcbiAqIFVzZSBjYXNlOiBidWlsZCB0aGUgc2lkZWJhciBmcm9tIGVpdGhlciBhIHVzZXItZGVmaW5lZCBjb25maWcgb3JcbiAqIHRoZSBzY2FubmVkIGRvY3MgZGlyZWN0b3J5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgRG9jRmlsZSwgRG9jUGFnZSB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCI7XG5pbXBvcnQgdHlwZSB7IEFwcEVycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc3VsdCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3R5cGVzL3Jlc3VsdFwiO1xuaW1wb3J0IHsgb2sgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC90eXBlcy9yZXN1bHRcIjtcbmltcG9ydCB7XG5cdGdyb3VwRG9jc0J5Rm9sZGVyLFxuXHR0eXBlIFNpZGViYXJTb3VyY2UsXG59IGZyb20gXCIuLi8uLi9kb21haW4vb3BlcmF0aW9ucy9ncm91cFwiO1xuaW1wb3J0IHtcblx0c29ydFNpZGViYXJHcm91cHMsXG5cdHNvcnRTaWRlYmFySXRlbXMsXG59IGZyb20gXCIuLi8uLi9kb21haW4vb3BlcmF0aW9ucy9zb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFNpZGViYXJHcm91cCB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU2lkZWJhcklucHV0IHtcblx0LyoqIEV4cGxpY2l0IHNpZGViYXIgZnJvbSBjb25maWcgKG92ZXJyaWRlcyBhdXRvLWdlbmVyYXRpb24pLiAqL1xuXHRyZWFkb25seSBjb25maWd1cmVkPzogcmVhZG9ubHkgU2lkZWJhckdyb3VwW107XG5cdC8qKiBBbGwgc2Nhbm5lZCBkb2MgZmlsZXMgKHVzZWQgd2hlbiBubyBleHBsaWNpdCBzaWRlYmFyKS4gKi9cblx0cmVhZG9ubHkgZG9jcz86IHJlYWRvbmx5IERvY0ZpbGVbXTtcblx0LyoqIEFsbCBidWlsdCBkb2MgcGFnZXMgKHVzZWQgYXMgYSByaWNoZXIgc291cmNlIHdoZW4gYXZhaWxhYmxlKS4gKi9cblx0cmVhZG9ubHkgcGFnZXM/OiByZWFkb25seSBEb2NQYWdlW107XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkU2lkZWJhciA9IChcblx0aW5wdXQ6IEJ1aWxkU2lkZWJhcklucHV0LFxuKSA9PiBSZXN1bHQ8cmVhZG9ubHkgU2lkZWJhckdyb3VwW10sIEFwcEVycm9yPjtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2lkZWJhcjogQnVpbGRTaWRlYmFyID0gKHsgY29uZmlndXJlZCwgZG9jcywgcGFnZXMgfSkgPT4ge1xuXHRpZiAoY29uZmlndXJlZCAmJiBjb25maWd1cmVkLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBzb3J0ZWQgPSBjb25maWd1cmVkLm1hcCgoZykgPT4gKHtcblx0XHRcdC4uLmcsXG5cdFx0XHRpdGVtczogc29ydFNpZGViYXJJdGVtcyhnLml0ZW1zKSxcblx0XHR9KSk7XG5cdFx0cmV0dXJuIG9rKHNvcnRTaWRlYmFyR3JvdXBzKHNvcnRlZCkpO1xuXHR9XG5cdGNvbnN0IHNvdXJjZXM6IHJlYWRvbmx5IFNpZGViYXJTb3VyY2VbXSA9XG5cdFx0cGFnZXMgIT09IHVuZGVmaW5lZCAmJiBwYWdlcy5sZW5ndGggPiAwID8gcGFnZXMgOiAoZG9jcyA/PyBbXSk7XG5cdGlmIChzb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG9rKFtdKTtcblx0cmV0dXJuIG9rKHNvcnRTaWRlYmFyR3JvdXBzKGdyb3VwRG9jc0J5Rm9sZGVyKHNvdXJjZXMpKSk7XG59O1xuIiwKICAgICIvKipcbiAqIFB1cmUgb3BlcmF0aW9ucyBmb3IgYnVpbGRpbmcgYW5kIHF1ZXJ5aW5nIGEgc2VhcmNoIGluZGV4LlxuICovXG5cbmltcG9ydCB0eXBlIHsgRG9jUGFnZSB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCI7XG5pbXBvcnQgeyBTRUFSQ0hfQ09OVEVOVF9MSU1JVCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdHJ1bmNhdGUgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC91dGlscy9zdHJpbmdcIjtcbmltcG9ydCB0eXBlIHsgU2VhcmNoRW50cnksIFNlYXJjaEluZGV4IH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBwYWdlVG9TZWFyY2hFbnRyeSA9IChwYWdlOiBEb2NQYWdlKTogU2VhcmNoRW50cnkgPT4ge1xuXHRjb25zdCB0ZXh0ID0gcGxhaW5UZXh0KHBhZ2UuY29udGVudCk7XG5cdGNvbnN0IHRlcm1zID0gdG9rZW5pemUoYCR7cGFnZS50aXRsZX0gJHtwYWdlLmRlc2NyaXB0aW9uID8/IFwiXCJ9ICR7dGV4dH1gKTtcblx0cmV0dXJuIHtcblx0XHRpZDogU3RyaW5nKHBhZ2UuaWQpLFxuXHRcdHNsdWc6IFN0cmluZyhwYWdlLnNsdWcpLFxuXHRcdHRpdGxlOiBwYWdlLnRpdGxlLFxuXHRcdGRlc2NyaXB0aW9uOiBwYWdlLmRlc2NyaXB0aW9uID8/IFwiXCIsXG5cdFx0Y29udGVudDogdHJ1bmNhdGUodGV4dCwgU0VBUkNIX0NPTlRFTlRfTElNSVQsIFwiXCIpLFxuXHRcdHRlcm1zLFxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2VhcmNoSW5kZXggPSAocGFnZXM6IHJlYWRvbmx5IERvY1BhZ2VbXSk6IFNlYXJjaEluZGV4ID0+IHtcblx0Y29uc3QgZW50cmllcyA9IHBhZ2VzLm1hcChwYWdlVG9TZWFyY2hFbnRyeSk7XG5cdGNvbnN0IGludmVydGVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0bGV0IHRvdGFsTGVuZ3RoID0gMDtcblx0Zm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcblx0XHRjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0Zm9yIChjb25zdCB0ZXJtIG9mIGUudGVybXMpIHtcblx0XHRcdGlmIChzZWVuLmhhcyh0ZXJtKSkgY29udGludWU7XG5cdFx0XHRzZWVuLmFkZCh0ZXJtKTtcblx0XHRcdGNvbnN0IGxpc3QgPSBpbnZlcnRlZFt0ZXJtXSA/PyBbXTtcblx0XHRcdGxpc3QucHVzaChlLmlkKTtcblx0XHRcdGludmVydGVkW3Rlcm1dID0gbGlzdDtcblx0XHR9XG5cdFx0dG90YWxMZW5ndGggKz0gZS50ZXJtcy5sZW5ndGg7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRlbnRyaWVzLFxuXHRcdGludmVydGVkLFxuXHRcdGF2Z0RvY0xlbmd0aDogZW50cmllcy5sZW5ndGggPT09IDAgPyAwIDogdG90YWxMZW5ndGggLyBlbnRyaWVzLmxlbmd0aCxcblx0fTtcbn07XG5cbi8qKiBTdHJpcCBtYXJrZG93biBmb3JtYXR0aW5nIGZvciBmdWxsLXRleHQgc2VhcmNoLiAqL1xuZXhwb3J0IGNvbnN0IHBsYWluVGV4dCA9IChtZDogc3RyaW5nKTogc3RyaW5nID0+XG5cdG1kXG5cdFx0LnJlcGxhY2UoL2BgYFtcXHNcXFNdKj9gYGAvZywgXCIgXCIpIC8vIGZlbmNlZCBjb2RlXG5cdFx0LnJlcGxhY2UoL35+fltcXHNcXFNdKj9+fn4vZywgXCIgXCIpIC8vIHRpbGRlIGNvZGVcblx0XHQucmVwbGFjZSgvYFteYFxcbl0qYC9nLCBcIiBcIikgLy8gaW5saW5lIGNvZGVcblx0XHQucmVwbGFjZSgvIVxcWyhbXlxcXV0qKVxcXVxcKFteKV0qXFwpL2csIFwiJDFcIikgLy8gaW1hZ2VzXG5cdFx0LnJlcGxhY2UoL1xcWyhbXlxcXV0rKVxcXVxcKFteKV0qXFwpL2csIFwiJDFcIikgLy8gbGlua3Ncblx0XHQucmVwbGFjZSgvXiN7MSw2fVxccysvZ20sIFwiXCIpIC8vIGhlYWRpbmdzXG5cdFx0LnJlcGxhY2UoL15cXHMqWy0qK11cXHMrL2dtLCBcIlwiKSAvLyBidWxsZXRzXG5cdFx0LnJlcGxhY2UoL15cXHMqXFxkK1xcLlxccysvZ20sIFwiXCIpIC8vIG9yZGVyZWQgbGlzdFxuXHRcdC5yZXBsYWNlKC9ePlxccz8vZ20sIFwiXCIpIC8vIGJsb2NrcXVvdGVcblx0XHQucmVwbGFjZSgvWypffl0rL2csIFwiXCIpIC8vIGVtcGhhc2lzXG5cdFx0LnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG5cdFx0LnRyaW0oKTtcblxuLyoqIFRva2VuaXplIGEgc3RyaW5nIGludG8gbG93ZXJjYXNlIHRlcm1zIChsZW5ndGggPj0gMiksIHN0cmlwcGluZyBkaWFjcml0aWNzLiAqL1xuZXhwb3J0IGNvbnN0IHRva2VuaXplID0gKHM6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcblx0aWYgKHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cdHJldHVybiBzXG5cdFx0LnRvTG93ZXJDYXNlKClcblx0XHQubm9ybWFsaXplKFwiTkZEXCIpXG5cdFx0LnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csIFwiXCIpXG5cdFx0LnNwbGl0KC9bXlxccHtMZXR0ZXJ9XFxwe051bWJlcn1dKy91KVxuXHRcdC5maWx0ZXIoKHQpID0+IHQubGVuZ3RoID49IDIpO1xufTtcbiIsCiAgICAiLyoqXG4gKiBVc2UgY2FzZTogaW5kZXggYWxsIGRvYyBwYWdlcyBpbnRvIGEgc2VhcmNoYWJsZSBzdHJ1Y3R1cmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEb2NQYWdlIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL2NvbnRlbnRcIjtcbmltcG9ydCB0eXBlIHsgQXBwRXJyb3IgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC9lcnJvcnNcIjtcbmltcG9ydCB7IG9rLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL3R5cGVzL3Jlc3VsdFwiO1xuaW1wb3J0IHsgYnVpbGRTZWFyY2hJbmRleCB9IGZyb20gXCIuLi8uLi9kb21haW4vb3BlcmF0aW9ucy9idWlsZEluZGV4XCI7XG5pbXBvcnQgdHlwZSB7IFNlYXJjaEluZGV4IH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIEluZGV4UGFnZXMgPSAoXG5cdHBhZ2VzOiByZWFkb25seSBEb2NQYWdlW10sXG4pID0+IFJlc3VsdDxTZWFyY2hJbmRleCwgQXBwRXJyb3I+O1xuXG5leHBvcnQgY29uc3QgaW5kZXhQYWdlczogSW5kZXhQYWdlcyA9IChwYWdlcykgPT4gb2soYnVpbGRTZWFyY2hJbmRleChwYWdlcykpO1xuIiwKICAgICIvKipcbiAqIFVzZSBjYXNlOiBmdWxsIGRvY3MgYnVpbGQgcGlwZWxpbmUuIE9yY2hlc3RyYXRlczpcbiAqICAgMS4gc2NhbiBkb2NzIGRpciDihpIgRG9jRmlsZVtdXG4gKiAgIDIuIGxvYWQrcGFyc2UgZWFjaCBmaWxlIOKGkiBEb2NQYWdlW11cbiAqICAgMy4gYnVpbGQgc2lkZWJhciwgbmF2LCBzZWFyY2ggaW5kZXhcbiAqICAgNC4gcHJvZHVjZSB2aXJ0dWFsIG1vZHVsZSBzb3VyY2UgY29kZXNcbiAqXG4gKiBBbGwgSS9PIGlzIGRlbGVnYXRlZCB0aHJvdWdoIHBvcnRzOyB0aGlzIGZ1bmN0aW9uIGlzIGZ1bGx5IHRlc3RhYmxlIHdpdGggaW4tbWVtb3J5IGFkYXB0ZXJzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWREb2NzQ29uZmlnIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL2NvbmZpZ1wiO1xuaW1wb3J0IHsgcHJvY2Vzc0RvY3NXb3JrZmxvdyB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCI7XG5pbXBvcnQgeyBidWlsZE5hdiwgYnVpbGRTaWRlYmFyIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL25hdmlnYXRpb25cIjtcbmltcG9ydCB7IGluZGV4UGFnZXMgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL21vZHVsZXMvc2VhcmNoXCI7XG5pbXBvcnQgdHlwZSB7IEFwcEVycm9yIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvZXJyb3JzXCI7XG5pbXBvcnQgeyBvaywgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC90eXBlcy9yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgRG9jc0xvYWRlciB9IGZyb20gXCIuLi8uLi9wb3J0c1wiO1xuaW1wb3J0IHtcblx0YnVpbGRWaXJ0dWFsTW9kdWxlcyxcblx0dHlwZSBWaXJ0dWFsTW9kdWxlU2V0LFxufSBmcm9tIFwiLi4vdXNlY2FzZXMvYnVpbGQtdmlydHVhbC1tb2R1bGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGREb2NzSW5wdXQge1xuXHRyZWFkb25seSBjb25maWc6IFJlc29sdmVkRG9jc0NvbmZpZztcblx0cmVhZG9ubHkgbG9hZGVyOiBEb2NzTG9hZGVyO1xuXHQvKiogT3B0aW9uYWwgcGFnZSB0cmFuc2Zvcm1hdGlvbiBob29rLiBJbnZva2VkIG9uIGVhY2ggcGFnZSBhZnRlciBwYXJzaW5nLiAqL1xuXHRyZWFkb25seSB0cmFuc2Zvcm1QYWdlPzogKFxuXHRcdHBhZ2U6IGltcG9ydChcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL2NvbnRlbnRcIikuRG9jUGFnZSxcblx0KSA9PlxuXHRcdHwgaW1wb3J0KFwiQGNyZWF0ZS1kb2NzL21vZHVsZXMvY29udGVudFwiKS5Eb2NQYWdlXG5cdFx0fCBQcm9taXNlPGltcG9ydChcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL2NvbnRlbnRcIikuRG9jUGFnZT47XG59XG5cbmV4cG9ydCB0eXBlIEJ1aWxkRG9jcyA9IChcblx0aW5wdXQ6IEJ1aWxkRG9jc0lucHV0LFxuKSA9PiBQcm9taXNlPFJlc3VsdDxWaXJ0dWFsTW9kdWxlU2V0LCBBcHBFcnJvcj4+O1xuXG5leHBvcnQgY29uc3QgYnVpbGREb2NzOiBCdWlsZERvY3MgPSBhc3luYyAoe1xuXHRjb25maWcsXG5cdGxvYWRlcixcblx0dHJhbnNmb3JtUGFnZSxcbn0pID0+IHtcblx0Y29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZGVyLmxvYWRBbGwoY29uZmlnKTtcblx0aWYgKCFsb2FkZWQub2spIHJldHVybiBsb2FkZWQ7XG5cdGxldCBwYWdlcyA9IGxvYWRlZC52YWx1ZTtcblxuXHQvLyBPcHRpb25hbCBwYWdlIHRyYW5zZm9ybWF0aW9uIGhvb2tcblx0aWYgKHRyYW5zZm9ybVBhZ2UpIHtcblx0XHRjb25zdCBuZXh0OiBpbXBvcnQoXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCIpLkRvY1BhZ2VbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgcCBvZiBwYWdlcykgbmV4dC5wdXNoKGF3YWl0IHRyYW5zZm9ybVBhZ2UocCkpO1xuXHRcdHBhZ2VzID0gbmV4dDtcblx0fVxuXG5cdC8vIFNpZGViYXI6IHByZWZlciBleHBsaWNpdCBjb25maWcsIG90aGVyd2lzZSBhdXRvLWdlbmVyYXRlIGZyb20gcGFnZXNcblx0Y29uc3Qgc2lkZWJhclJlc3VsdCA9IGJ1aWxkU2lkZWJhcih7XG5cdFx0Y29uZmlndXJlZDogY29uZmlnLnNpZGViYXIsXG5cdFx0cGFnZXMsXG5cdH0pO1xuXHRpZiAoIXNpZGViYXJSZXN1bHQub2spIHJldHVybiBzaWRlYmFyUmVzdWx0O1xuXHRjb25zdCBzaWRlYmFyID0gc2lkZWJhclJlc3VsdC52YWx1ZTtcblxuXHQvLyBOYXYgZnJvbSBjb25maWdcblx0Y29uc3QgbmF2UmVzdWx0ID0gYnVpbGROYXYoY29uZmlnLm5hdik7XG5cdGlmICghbmF2UmVzdWx0Lm9rKSByZXR1cm4gbmF2UmVzdWx0O1xuXHRjb25zdCBuYXYgPSBuYXZSZXN1bHQudmFsdWU7XG5cblx0Ly8gU2VhcmNoIGluZGV4XG5cdGNvbnN0IHNlYXJjaFJlc3VsdCA9IGluZGV4UGFnZXMocGFnZXMpO1xuXHRpZiAoIXNlYXJjaFJlc3VsdC5vaykgcmV0dXJuIHNlYXJjaFJlc3VsdDtcblx0Y29uc3Qgc2VhcmNoSW5kZXggPSBzZWFyY2hSZXN1bHQudmFsdWU7XG5cblx0Y29uc3Qgdm1zID0gYnVpbGRWaXJ0dWFsTW9kdWxlcyh7IGNvbmZpZywgcGFnZXMsIHNpZGViYXIsIG5hdiwgc2VhcmNoSW5kZXggfSk7XG5cdGlmICghdm1zLm9rKSByZXR1cm4gdm1zO1xuXG5cdHJldHVybiBvayh2bXMudmFsdWUpO1xufTtcblxuLy8gUmUtZXhwb3J0IGZvciBiYWNrd2FyZHMtY29tcGF0IHdpdGggYWRhcHRlciBsYXllclxuZXhwb3J0IHsgcHJvY2Vzc0RvY3NXb3JrZmxvdyB9O1xuIiwKICAgICIvKipcbiAqIEltcGVyYXRpdmUgc2hlbGw6IGFzc2VtYmxlIGFsbCB0aGUgcGllY2VzIGludG8gYSBWaXRlIFBsdWdpbi5cbiAqXG4gKiBUaGUgZnVuY3Rpb25hbCBjb3JlIChidWlsZFZpcnR1YWxNb2R1bGVzLCBldGMuKSBsaXZlcyBpbiB0aGUgcGx1Z2luIG1vZHVsZS5cbiAqIFRoaXMgZmlsZSBpcyB0aGUgSS9PIGJvdW5kYXJ5IHRoYXQgdGFsa3MgdG8gVml0ZSdzIHJ1bnRpbWUgQVBJLlxuICovXG5cbmltcG9ydCB7XG5cdHR5cGUgRG9jc1BsdWdpbk9wdGlvbnMsXG5cdHR5cGUgUmVzb2x2ZWREb2NzQ29uZmlnLFxuXHRyZXNvbHZlQ29uZmlnLFxuXHR0eXBlIFVzZXJDb25maWcsXG59IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgRG9jUGFnZSwgUGFyc2VDYWNoZSB9IGZyb20gXCJAY3JlYXRlLWRvY3MvbW9kdWxlcy9jb250ZW50XCI7XG5pbXBvcnQgeyBidWlsZERvY3MsIGlzTWFya2Rvd25QYXRoIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL3BsdWdpblwiO1xuaW1wb3J0IHtcblx0REVGQVVMVF9CQVNFX1JPVVRFLFxuXHRERUZBVUxUX0RPQ1NfRElSLFxuXHRQTFVHSU5fTkFNRSxcblx0VklSVFVBTF9QUkVGSVgsXG59IGZyb20gXCJAY3JlYXRlLWRvY3Mvc2hhcmVkL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tIFwiQGNyZWF0ZS1kb2NzL3NoYXJlZC91dGlscy9vYmplY3RcIjtcbmltcG9ydCB7IHRvUG9zaXhQYXRoIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9zaGFyZWQvdXRpbHMvc3RyaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiwgUmVzb2x2ZWRDb25maWcsIFZpdGVEZXZTZXJ2ZXIgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlRnNEb2NzTG9hZGVyIH0gZnJvbSBcIi4uLy4uL2FkYXB0ZXJzL2ZzL2ZzLWRvY3MtbG9hZGVyXCI7XG5pbXBvcnQgeyBidWlsZFZlbGl0ZSB9IGZyb20gXCIuLi8uLi9hZGFwdGVycy92ZWxpdGVcIjtcbmltcG9ydCB7XG5cdGNyZWF0ZU5vZGVEb2NzV2F0Y2hlcixcblx0Y3JlYXRlUG9sbGluZ1dhdGNoZXIsXG59IGZyb20gXCIuLi8uLi9hZGFwdGVycy92aXRlXCI7XG5cbmV4cG9ydCB0eXBlIFdhdGNoTW9kZSA9IFwibmF0aXZlXCIgfCBcInBvbGxpbmdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEb2NzUGx1Z2luQ29uZmlnIGV4dGVuZHMgUGFydGlhbDxVc2VyQ29uZmlnPiB7XG5cdC8qKiBPcHRpb25hbDogZXhwbGljaXQgY29uZmlnIG9iamVjdCBwYXNzZWQgYnkgdGhlIGNvbnN1bWVyLiAqL1xuXHRyZWFkb25seSB1c2VyQ29uZmlnPzogVXNlckNvbmZpZztcblx0LyoqIE9wdGlvbmFsOiBwcmUtcmVzb2x2ZWQgcGx1Z2luIG9wdGlvbnMgb3ZlcnJpZGUuICovXG5cdHJlYWRvbmx5IG9wdGlvbnM/OiBEb2NzUGx1Z2luT3B0aW9ucztcblx0LyoqIEZvcmNlIGEgZnVsbCBicm93c2VyIHJlbG9hZCBvbiBITVIgKGRlZmF1bHQ6IGZhbHNlLCBncmFudWxhciBpbnZhbGlkYXRpb24pLiAqL1xuXHRyZWFkb25seSBmdWxsUmVsb2FkPzogYm9vbGVhbjtcblx0LyoqIFdhdGNoZXIgbW9kZS4gRGVmYXVsdDogJ25hdGl2ZScuIFVzZSAncG9sbGluZycgZm9yIExpbnV4IHN1YmRpciByZWxpYWJpbGl0eS4gKi9cblx0cmVhZG9ubHkgd2F0Y2hNb2RlPzogV2F0Y2hNb2RlO1xuXHQvKiogUG9sbGluZyBpbnRlcnZhbCBpbiBtcyB3aGVuIHdhdGNoTW9kZT0ncG9sbGluZycuIERlZmF1bHQ6IDMwMC4gKi9cblx0cmVhZG9ubHkgcG9sbGluZ0ludGVydmFsTXM/OiBudW1iZXI7XG5cdC8qKiBQZXItcGFnZSB0cmFuc2Zvcm1hdGlvbiBob29rLiBJbnZva2VkIGFmdGVyIHBhcnNlLCBiZWZvcmUgc2VyaWFsaXNhdGlvbi4gKi9cblx0cmVhZG9ubHkgdHJhbnNmb3JtUGFnZT86IChwYWdlOiBEb2NQYWdlKSA9PiBEb2NQYWdlIHwgUHJvbWlzZTxEb2NQYWdlPjtcbn1cblxuZXhwb3J0IGNvbnN0IGRvY3NQbHVnaW4gPSAoY2ZnOiBEb2NzUGx1Z2luQ29uZmlnID0ge30pOiBQbHVnaW4gPT4ge1xuXHRjb25zdCB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnID0gY2ZnLnVzZXJDb25maWcgPz8geyAuLi5jZmcgfTtcblx0Y29uc3Qgb3B0aW9uczogRG9jc1BsdWdpbk9wdGlvbnMgPSBjZmcub3B0aW9ucyA/PyB7fTtcblx0Y29uc3QgZnVsbFJlbG9hZCA9IGNmZy5mdWxsUmVsb2FkID09PSB0cnVlO1xuXHRjb25zdCB3YXRjaE1vZGU6IFdhdGNoTW9kZSA9IGNmZy53YXRjaE1vZGUgPz8gXCJuYXRpdmVcIjtcblx0Y29uc3QgcG9sbGluZ0ludGVydmFsTXMgPSBjZmcucG9sbGluZ0ludGVydmFsTXMgPz8gMzAwO1xuXHRjb25zdCB0cmFuc2Zvcm1QYWdlID0gY2ZnLnRyYW5zZm9ybVBhZ2U7XG5cblx0Y29uc3QgZG9jc0RpciA9IG9wdGlvbnMuZG9jc0RpciA/PyBERUZBVUxUX0RPQ1NfRElSO1xuXHRjb25zdCBiYXNlUm91dGUgPSBvcHRpb25zLmJhc2VSb3V0ZSA/PyBERUZBVUxUX0JBU0VfUk9VVEU7XG5cblx0bGV0IHJlc29sdmVkOiBSZXNvbHZlZERvY3NDb25maWcgfCBudWxsID0gbnVsbDtcblx0bGV0IHNlcnZlcjogVml0ZURldlNlcnZlciB8IG51bGwgPSBudWxsO1xuXHRsZXQgd2F0Y2hlckhhbmRsZTogeyBjbG9zZTogKCkgPT4gdm9pZCB9IHwgbnVsbCA9IG51bGw7XG5cdGxldCBsYXN0TW9kdWxlczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7fTtcblx0Y29uc3QgY2FjaGU6IFBhcnNlQ2FjaGU8RG9jUGFnZT4gPSBuZXcgUGFyc2VDYWNoZTxEb2NQYWdlPigpO1xuXG5cdGNvbnN0IHJlc29sdmUgPSAoKTogUmVzb2x2ZWREb2NzQ29uZmlnID0+IHtcblx0XHRpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcblx0XHRyZXNvbHZlZCA9IHJlc29sdmVDb25maWcoeyAuLi51c2VyQ29uZmlnLCBkb2NzRGlyLCBiYXNlUm91dGUgfSk7XG5cdFx0cmV0dXJuIHJlc29sdmVkO1xuXHR9O1xuXG5cdGNvbnN0IGludmFsaWRhdGVBbmROb3RpZnkgPSAobm93MjogbnVtYmVyID0gRGF0ZS5ub3coKSk6IHZvaWQgPT4ge1xuXHRcdGlmICghc2VydmVyKSByZXR1cm47XG5cdFx0Y29uc3QgaW52YWxpZGF0ZWQ6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyhsYXN0TW9kdWxlcykpIHtcblx0XHRcdGNvbnN0IG1vZCA9IHNlcnZlci5tb2R1bGVHcmFwaC5nZXRNb2R1bGVCeUlkKGlkKTtcblx0XHRcdGlmIChtb2QpIHtcblx0XHRcdFx0c2VydmVyLm1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUobW9kKTtcblx0XHRcdFx0aW52YWxpZGF0ZWQucHVzaChpZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChmdWxsUmVsb2FkKSB7XG5cdFx0XHRzZXJ2ZXIud3Muc2VuZCh7IHR5cGU6IFwiZnVsbC1yZWxvYWRcIiB9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8gR3JhbnVsYXIgSE1SOiBzZW5kIGFuIHVwZGF0ZSBldmVudCByZWZlcmVuY2luZyB0aGUgdmlydHVhbCBtb2R1bGVzLlxuXHRcdC8vIENvbm5lY3RlZCBjbGllbnRzIHdpdGggYGltcG9ydC5tZXRhLmhvdC5hY2NlcHRgIG9uIHRoZXNlIHZpcnR1YWxzXG5cdFx0Ly8gd2lsbCBob3Qtc3dhcDsgb3RoZXJzIHdpbGwgYmUgcmUtZXZhbHVhdGVkIHZpYSB0aGUgc3RhbmRhcmRcblx0XHQvLyBtb2R1bGUgZ3JhcGggaW52YWxpZGF0aW9uIHdpdGhvdXQgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuXHRcdGNvbnN0IG5vdyA9IG5vdzI7XG5cdFx0c2VydmVyLndzLnNlbmQoe1xuXHRcdFx0dHlwZTogXCJ1cGRhdGVcIixcblx0XHRcdHVwZGF0ZXM6IGludmFsaWRhdGVkLm1hcCgoaWQpID0+ICh7XG5cdFx0XHRcdHR5cGU6IFwianMtdXBkYXRlXCIgYXMgY29uc3QsXG5cdFx0XHRcdHBhdGg6IGlkLFxuXHRcdFx0XHRhY2NlcHRlZFBhdGg6IGlkLFxuXHRcdFx0XHR0aW1lc3RhbXA6IG5vdyxcblx0XHRcdH0pKSxcblx0XHR9KTtcblx0fTtcblxuXHRjb25zdCByZWxvYWQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0Y29uc3QgY29uZmlnID0gcmVzb2x2ZSgpO1xuXG5cdFx0Ly8gQnVpbGQgY29udGVudCB3aXRoIFZlbGl0ZVxuXHRcdGNvbnN0IHZlbGl0ZVJlc3VsdCA9IGF3YWl0IGJ1aWxkVmVsaXRlKHtcblx0XHRcdGNvbmZpZ1BhdGg6IGNvbmZpZy5kb2NzRGlyXG5cdFx0XHRcdD8gYCR7Y29uZmlnLmRvY3NEaXJ9L3ZlbGl0ZS5jb25maWcudHNgXG5cdFx0XHRcdDogXCJ2ZWxpdGUuY29uZmlnLnRzXCIsXG5cdFx0XHR3YXRjaDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdGlmICghdmVsaXRlUmVzdWx0LnN1Y2Nlc3MpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdGBbJHtQTFVHSU5fTkFNRX1dIFZlbGl0ZSBidWlsZCBmYWlsZWQ6YCxcblx0XHRcdFx0dmVsaXRlUmVzdWx0LmVycm9yLFxuXHRcdFx0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBCdWlsZCB2aXJ0dWFsIG1vZHVsZXMgZnJvbSBWZWxpdGUgb3V0cHV0XG5cdFx0Y29uc3QgbG9hZGVyID0gY3JlYXRlRnNEb2NzTG9hZGVyKCk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGREb2NzKHtcblx0XHRcdGNvbmZpZyxcblx0XHRcdGxvYWRlcixcblx0XHRcdC4uLih0cmFuc2Zvcm1QYWdlID8geyB0cmFuc2Zvcm1QYWdlIH0gOiB7fSksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzdWx0Lm9rKSB7XG5cdFx0XHRsYXN0TW9kdWxlcyA9IHJlc3VsdC52YWx1ZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdFx0XHRpbnZhbGlkYXRlQW5kTm90aWZ5KCk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiB7XG5cdFx0bmFtZTogUExVR0lOX05BTUUsXG5cblx0XHRjb25maWcoKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRvcHRpbWl6ZURlcHM6IHtcblx0XHRcdFx0XHRpbmNsdWRlOiBbXCJjb21hcmtcIiwgXCJAY29tYXJrL3N2ZWx0ZVwiXSxcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGFzeW5jIGNvbmZpZ1Jlc29sdmVkKGNvbmZpZzogUmVzb2x2ZWRDb25maWcpIHtcblx0XHRcdHJlc29sdmUoKTtcblx0XHRcdC8vIEluaXRpYWwgYnVpbGQgc28gdGhlIHZpcnR1YWwgbW9kdWxlcyBhcmUgcmVhZHkgZm9yIHRoZSBmaXJzdCByZXF1ZXN0LlxuXHRcdFx0YXdhaXQgcmVsb2FkKCk7XG5cdFx0XHQvLyBXYXRjaCBkb2NzRGlyIGZvciBjaGFuZ2VzXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkb2NzRGlyQWJzID0gdG9Qb3NpeFBhdGgoY29uZmlnLnJvb3QpLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcblx0XHRcdFx0aWYgKHdhdGNoTW9kZSA9PT0gXCJwb2xsaW5nXCIpIHtcblx0XHRcdFx0XHRjb25zdCB3YXRjaGVyID0gY3JlYXRlUG9sbGluZ1dhdGNoZXIoe1xuXHRcdFx0XHRcdFx0aW50ZXJ2YWxNczogcG9sbGluZ0ludGVydmFsTXMsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0d2F0Y2hlckhhbmRsZSA9IHdhdGNoZXIud2F0Y2goZG9jc0RpckFicywgKF9maWxlbmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0dm9pZCByZWxvYWQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB3YXRjaGVyID0gY3JlYXRlTm9kZURvY3NXYXRjaGVyKCk7XG5cdFx0XHRcdFx0d2F0Y2hlckhhbmRsZSA9IHdhdGNoZXIud2F0Y2goZG9jc0RpckFicywgKF9maWxlbmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0dm9pZCByZWxvYWQoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYFske1BMVUdJTl9OQU1FfV0gRmFpbGVkIHRvIHN0YXJ0IHdhdGNoZXI6YCwgZSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGNvbmZpZ3VyZVNlcnZlcihzOiBWaXRlRGV2U2VydmVyKSB7XG5cdFx0XHRzZXJ2ZXIgPSBzO1xuXHRcdFx0cy5odHRwU2VydmVyPy5vbihcImNsb3NlXCIsICgpID0+IHtcblx0XHRcdFx0d2F0Y2hlckhhbmRsZT8uY2xvc2UoKTtcblx0XHRcdFx0Y2FjaGUuY2xlYXIoKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRyZXNvbHZlSWQoaWQ6IHN0cmluZykge1xuXHRcdFx0aWYgKGlkLnN0YXJ0c1dpdGgoVklSVFVBTF9QUkVGSVgpKSByZXR1cm4gaWQ7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXG5cdFx0YXN5bmMgbG9hZChpZDogc3RyaW5nKSB7XG5cdFx0XHRpZiAoIWlkLnN0YXJ0c1dpdGgoVklSVFVBTF9QUkVGSVgpKSByZXR1cm4gbnVsbDtcblx0XHRcdGNvbnN0IG1vZCA9IChsYXN0TW9kdWxlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KVtpZF07XG5cdFx0XHRpZiAobW9kICE9PSB1bmRlZmluZWQpIHJldHVybiBtb2Q7XG5cdFx0XHRhd2FpdCByZWxvYWQoKTtcblx0XHRcdGNvbnN0IG0gPSAobGFzdE1vZHVsZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbaWRdO1xuXHRcdFx0cmV0dXJuIG0gPz8gbnVsbDtcblx0XHR9LFxuXG5cdFx0YXN5bmMgdHJhbnNmb3JtKGNvZGU6IHN0cmluZywgaWQ6IHN0cmluZykge1xuXHRcdFx0aWYgKCFpc01hcmtkb3duUGF0aChpZCkpIHJldHVybiBudWxsO1xuXHRcdFx0aWYgKCFpc1N0cmluZyhjb2RlKSkgcmV0dXJuIG51bGw7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBWZWxpdGUgaGFuZGxlcyBtYXJrZG93biBwYXJzaW5nLCBza2lwIHRyYW5zZm9ybWF0aW9uIGhlcmVcblx0XHRcdFx0Ly8gQ29udGVudCBpcyBwcm9jZXNzZWQgYnkgVmVsaXRlIGJ1aWxkIGFuZCBsb2FkZWQgZnJvbSB2aXJ0dWFsIG1vZHVsZXNcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFske1BMVUdJTl9OQU1FfV0gRmFpbGVkIHRvIHRyYW5zZm9ybSAke2lkfTpgLCBlKTtcblx0XHRcdFx0cmV0dXJuIHsgY29kZSwgbWFwOiBudWxsIH07XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGNsb3NlQnVuZGxlKCkge1xuXHRcdFx0d2F0Y2hlckhhbmRsZT8uY2xvc2UoKTtcblx0XHR9LFxuXHR9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZG9jc1BsdWdpbjtcbiIsCiAgICAiLyoqXG4gKiBQdXJlIHRyYW5zZm9ybWF0aW9uOiB0dXJuIGEgbWFya2Rvd24gZmlsZSBwYXRoIOKGkiBTdmVsdGUgc291cmNlIGNvZGUuXG4gKiBObyBJL08sIG5vIGV4Y2VwdGlvbnMuIFRoZSBgcGFyc2VgIGZyb20gY29tYXJrIGlzIGluamVjdGVkIHNvIHRoaXNcbiAqIGZ1bmN0aW9uIGlzIGZ1bGx5IHRlc3RhYmxlLlxuICovXG5pbXBvcnQgeyBwYXJzZUZyb250bWF0dGVyIH0gZnJvbSBcIkBjcmVhdGUtZG9jcy9tb2R1bGVzL2NvbnRlbnRcIjtcblxuZXhwb3J0IHR5cGUgTWFya2Rvd25Ub1N2ZWx0ZSA9IChcblx0cmF3OiBzdHJpbmcsXG5cdGRlcHM6IHtcblx0XHRyZWFkb25seSBwYXJzZTogKGNvbnRlbnQ6IHN0cmluZykgPT4gUHJvbWlzZTx1bmtub3duPjtcblx0fSxcbikgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtTWFya2Rvd246IE1hcmtkb3duVG9TdmVsdGUgPSBhc3luYyAocmF3LCB7IHBhcnNlIH0pID0+IHtcblx0Y29uc3QgeyBmcm9udG1hdHRlciwgY29udGVudCB9ID0gcGFyc2VGcm9udG1hdHRlcihyYXcpO1xuXHRjb25zdCB0cmVlID0gYXdhaXQgcGFyc2UoY29udGVudCk7XG5cdGNvbnN0IGZtSnNvbiA9IEpTT04uc3RyaW5naWZ5KGZyb250bWF0dGVyKTtcblx0Y29uc3QgY29udGVudEpzb24gPSBKU09OLnN0cmluZ2lmeShjb250ZW50KTtcblx0Y29uc3QgdHJlZUpzb24gPSBKU09OLnN0cmluZ2lmeSh0cmVlKTtcblx0cmV0dXJuIGA8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuXHRcdGV4cG9ydCBjb25zdCBmcm9udG1hdHRlciA9ICR7Zm1Kc29ufTtcblx0XHRleHBvcnQgY29uc3QgY29udGVudCA9ICR7Y29udGVudEpzb259O1xuXHRcdGV4cG9ydCBjb25zdCB0cmVlID0gJHt0cmVlSnNvbn07XG5cdDwvc2NyaXB0PmA7XG59O1xuIiwKICAgICJleHBvcnQgdHlwZSBTZWFyY2hFbnRyeSA9IHVua25vd247XG5leHBvcnQgdHlwZSBTZWFyY2hJbmRleCA9IHVua25vd247XG5leHBvcnQgY29uc3QgYnVpbGRTZWFyY2hJbmRleCA9ICgpID0+IG51bGw7XG5leHBvcnQgY29uc3QgaW5kZXhQYWdlcyA9ICgpID0+IG51bGw7XG5leHBvcnQgY29uc3QgcGFnZVRvU2VhcmNoRW50cnkgPSAoKSA9PiBudWxsO1xuZXhwb3J0IGNvbnN0IHNlYXJjaCA9ICgpID0+IG51bGw7XG4iLAogICAgImV4cG9ydCB0eXBlIE1ldGFUYWdHZW5lcmF0b3IgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgTWV0YVRhZ3MgPSB1bmtub3duO1xuZXhwb3J0IHR5cGUgU2VvT3B0aW9ucyA9IHVua25vd247XG5leHBvcnQgY29uc3Qgb3B0aW1pemVTZW8gPSAoKSA9PiBudWxsO1xuIiwKICAgICIvKipcbiAqIFRPQyBPcGVyYXRpb25zXG4gKlxuICogUHVyZSBmdW5jdGlvbnMgZm9yIHRhYmxlIG9mIGNvbnRlbnRzIGdlbmVyYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEhlYWRpbmcsIFRvY0l0ZW0sIFRvY09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBQYXJzZSBoZWFkaW5ncyBmcm9tIG1hcmtkb3duIGNvbnRlbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlSGVhZGluZ3MgPSAoY29udGVudDogc3RyaW5nKTogSGVhZGluZ1tdID0+IHtcblx0Y29uc3QgaGVhZGluZ3M6IEhlYWRpbmdbXSA9IFtdO1xuXHRjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG5cblx0Zm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG5cdFx0Y29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKCN7MSw2fSlcXHMrKC4rKSQvKTtcblx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdGhlYWRpbmdzLnB1c2goe1xuXHRcdFx0XHR0ZXh0OiBtYXRjaFsyXS50cmltKCksXG5cdFx0XHRcdGxldmVsOiBtYXRjaFsxXS5sZW5ndGgsXG5cdFx0XHRcdGxpbmU6IGxpbmVzLmluZGV4T2YobGluZSkgKyAxLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGhlYWRpbmdzO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBzbHVnIGZyb20gdGV4dFxuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVTbHVnID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdHJldHVybiB0ZXh0XG5cdFx0LnRvTG93ZXJDYXNlKClcblx0XHQucmVwbGFjZSgvW15cXHdcXHMtXS9nLCBcIlwiKVxuXHRcdC5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKVxuXHRcdC5yZXBsYWNlKC8tKy9nLCBcIi1cIilcblx0XHQucmVwbGFjZSgvXi18LSQvZywgXCJcIik7XG59O1xuXG4vKipcbiAqIEJ1aWxkIFRPQyB0cmVlIGZyb20gaGVhZGluZ3NcbiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkVG9jVHJlZSA9IChcblx0aGVhZGluZ3M6IEhlYWRpbmdbXSxcblx0b3B0aW9uczogVG9jT3B0aW9ucyA9IHt9LFxuKTogVG9jSXRlbVtdID0+IHtcblx0Y29uc3QgeyBtYXhEZXB0aCA9IDYsIG1pbkRlcHRoID0gMSwgaW5jbHVkZSA9IFtdLCBleGNsdWRlID0gW10gfSA9IG9wdGlvbnM7XG5cblx0Y29uc3QgZmlsdGVyZWRIZWFkaW5ncyA9IGhlYWRpbmdzLmZpbHRlcigoaGVhZGluZykgPT4ge1xuXHRcdGlmIChoZWFkaW5nLmxldmVsIDwgbWluRGVwdGggfHwgaGVhZGluZy5sZXZlbCA+IG1heERlcHRoKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKGluY2x1ZGUubGVuZ3RoID4gMCAmJiAhaW5jbHVkZS5pbmNsdWRlcyhoZWFkaW5nLnRleHQpKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKGV4Y2x1ZGUubGVuZ3RoID4gMCAmJiBleGNsdWRlLmluY2x1ZGVzKGhlYWRpbmcudGV4dCkpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSk7XG5cblx0Y29uc3Qgcm9vdDogVG9jSXRlbVtdID0gW107XG5cdGNvbnN0IHN0YWNrOiB7IGl0ZW06IFRvY0l0ZW07IGxldmVsOiBudW1iZXIgfVtdID0gW107XG5cblx0Zm9yIChjb25zdCBoZWFkaW5nIG9mIGZpbHRlcmVkSGVhZGluZ3MpIHtcblx0XHRjb25zdCBpdGVtOiBUb2NJdGVtID0ge1xuXHRcdFx0dGV4dDogaGVhZGluZy50ZXh0LFxuXHRcdFx0bGV2ZWw6IGhlYWRpbmcubGV2ZWwsXG5cdFx0XHRpZDogZ2VuZXJhdGVTbHVnKGhlYWRpbmcudGV4dCksXG5cdFx0fTtcblxuXHRcdC8vIFBvcCBzdGFjayB1bnRpbCB3ZSBmaW5kIHRoZSBwYXJlbnRcblx0XHR3aGlsZSAoc3RhY2subGVuZ3RoID4gMCAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5sZXZlbCA+PSBoZWFkaW5nLmxldmVsKSB7XG5cdFx0XHRzdGFjay5wb3AoKTtcblx0XHR9XG5cblx0XHRpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyb290LnB1c2goaXRlbSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdLml0ZW07XG5cdFx0XHRpZiAoIXBhcmVudC5jaGlsZHJlbikgcGFyZW50LmNoaWxkcmVuID0gW107XG5cdFx0XHRwYXJlbnQuY2hpbGRyZW4ucHVzaChpdGVtKTtcblx0XHR9XG5cblx0XHRzdGFjay5wdXNoKHsgaXRlbSwgbGV2ZWw6IGhlYWRpbmcubGV2ZWwgfSk7XG5cdH1cblxuXHRyZXR1cm4gcm9vdDtcbn07XG5cbi8qKlxuICogRmxhdHRlbiBUT0MgdHJlZSB0byBsaXN0XG4gKi9cbmV4cG9ydCBjb25zdCBmbGF0dGVuVG9jID0gKHRvYzogVG9jSXRlbVtdKTogVG9jSXRlbVtdID0+IHtcblx0Y29uc3QgcmVzdWx0OiBUb2NJdGVtW10gPSBbXTtcblxuXHRjb25zdCB0cmF2ZXJzZSA9IChpdGVtczogVG9jSXRlbVtdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG5cdFx0XHRyZXN1bHQucHVzaChpdGVtKTtcblx0XHRcdGlmIChpdGVtLmNoaWxkcmVuKSB7XG5cdFx0XHRcdHRyYXZlcnNlKGl0ZW0uY2hpbGRyZW4pO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR0cmF2ZXJzZSh0b2MpO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbiIsCiAgICAiLyoqXG4gKiBUT0MgR2VuZXJhdG9yIFVzZSBDYXNlc1xuICpcbiAqIE9yY2hlc3RyYXRpb24gbGF5ZXIgZm9yIFRPQyBnZW5lcmF0aW9uXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRUb2NUcmVlLCBmbGF0dGVuVG9jLCBwYXJzZUhlYWRpbmdzIH0gZnJvbSBcIi4uLy4uL2RvbWFpblwiO1xuaW1wb3J0IHR5cGUgeyBUb2NJdGVtLCBUb2NPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8qKlxuICogR2VuZXJhdGUgVE9DIGZyb20gbWFya2Rvd24gY29udGVudFxuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVUb2MgPSAoXG5cdGNvbnRlbnQ6IHN0cmluZyxcblx0b3B0aW9uczogVG9jT3B0aW9ucyA9IHt9LFxuKTogVG9jSXRlbVtdID0+IHtcblx0Y29uc3QgaGVhZGluZ3MgPSBwYXJzZUhlYWRpbmdzKGNvbnRlbnQpO1xuXHRyZXR1cm4gYnVpbGRUb2NUcmVlKGhlYWRpbmdzLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgZmxhdCBUT0MgZnJvbSBtYXJrZG93biBjb250ZW50XG4gKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUZsYXRUb2MgPSAoXG5cdGNvbnRlbnQ6IHN0cmluZyxcblx0b3B0aW9uczogVG9jT3B0aW9ucyA9IHt9LFxuKTogVG9jSXRlbVtdID0+IHtcblx0Y29uc3QgdG9jID0gZ2VuZXJhdGVUb2MoY29udGVudCwgb3B0aW9ucyk7XG5cdHJldHVybiBmbGF0dGVuVG9jKHRvYyk7XG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtvb0VBTXNCLElBQXRCLHdCQ0FPLElBQU0sRUFBVSxDQUFDLElBQXVCLEVBQ2xDLEVBQVEsQ0FBQyxJQUFxQixFQUM5QixFQUFXLENBQUMsSUFBd0IsRUN3QjFDLElBQU0sR0FBWSxDQUN4QixFQUNBLEVBQ0EsSUFPYyxDQUNkLElBQU0sRUFTRixDQUNILE9BQ0EsVUFDQSxRQUFTLGtDQUFnQixFQUFLLFFBQVEsS0FBTSxHQUFHLEdBQ2hELEVBQ0EsR0FBSSxHQUFTLFFBQVUsT0FBVyxFQUFLLE1BQVEsRUFBUSxNQUN2RCxHQUFJLEdBQVMsVUFBWSxPQUFXLEVBQUssUUFBVSxFQUFRLFFBQzNELEdBQUksR0FBUyxPQUFTLE9BQVcsRUFBSyxLQUFPLEVBQVEsS0FDckQsR0FBSSxHQUFTLE9BQVMsT0FBVyxFQUFLLEtBQU8sRUFBUSxLQUNyRCxHQUFJLEdBQVMsY0FBZ0IsT0FDNUIsRUFBSyxZQUFjLEVBQVEsWUFDNUIsT0FBTyxHQUdLLEVBQWUsQ0FBQyxFQUFjLElBQzFDLEdBQVUsaUJBQWtCLG1CQUFtQixJQUFRLENBQ3RELFFBQ0EsUUFBUyxDQUFFLE1BQUssRUFDaEIsS0FBTSxnRUFDUCxDQUFDLEVBRVcsRUFBYSxDQUN6QixFQUNBLEVBQ0EsSUFFQSxHQUFVLGNBQWUsRUFBUyxDQUNqQyxR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LFNBQVcsQ0FBQyxFQUN6QyxFQUFPLFNBQVMsS0FBSyxDQUFJLEVBRzFCLEVBQU0sS0FBSyxDQUFFLE9BQU0sTUFBTyxFQUFRLEtBQU0sQ0FBQyxFQUcxQyxPQUFPLEdBTUssR0FBYSxDQUFDLElBQThCLENBQ3hELElBQU0sRUFBb0IsQ0FBQyxFQUVyQixFQUFXLENBQUMsSUFBcUIsQ0FDdEMsUUFBVyxLQUFRLEVBRWxCLEdBREEsRUFBTyxLQUFLLENBQUksRUFDWixFQUFLLFNBQ1IsRUFBUyxFQUFLLFFBQVEsR0FNekIsT0FEQSxFQUFTLENBQUcsRUFDTCxHQzFGRCxJQUFNLEdBQWMsQ0FDMUIsRUFDQSxFQUFzQixDQUFDLElBQ1IsQ0FDZixJQUFNLEVBQVcsR0FBYyxDQUFPLEVBQ3RDLE9BQU8sR0FBYSxFQUFVLENBQU8sR0FNekIsR0FBa0IsQ0FDOUIsRUFDQSxFQUFzQixDQUFDLElBQ1IsQ0FDZixJQUFNLEVBQU0sR0FBWSxFQUFTLENBQU8sRUFDeEMsT0FBTyxHQUFXLENBQUciLAogICJkZWJ1Z0lkIjogIkIzM0NBMDkzMjNDODcyNkU2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9