@mnaoumov/obsidian-lib 0.0.0 → 1.0.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 (1044) hide show
  1. package/@types/dataview/api/data-array/package.json +4 -0
  2. package/@types/dataview/api/extensions/package.json +4 -0
  3. package/@types/dataview/api/inline-api/package.json +4 -0
  4. package/@types/dataview/api/plugin-api/package.json +4 -0
  5. package/@types/dataview/api/result/package.json +4 -0
  6. package/@types/dataview/data-import/common/package.json +4 -0
  7. package/@types/dataview/data-import/csv/package.json +4 -0
  8. package/@types/dataview/data-import/inline-field/package.json +4 -0
  9. package/@types/dataview/data-import/markdown-file/package.json +4 -0
  10. package/@types/dataview/data-import/persister/package.json +4 -0
  11. package/@types/dataview/data-import/web-worker/import-entry/package.json +4 -0
  12. package/@types/dataview/data-import/web-worker/import-impl/package.json +4 -0
  13. package/@types/dataview/data-import/web-worker/import-manager/package.json +4 -0
  14. package/@types/dataview/data-index/index/package.json +4 -0
  15. package/@types/dataview/data-index/package.json +4 -0
  16. package/@types/dataview/data-index/resolver/package.json +4 -0
  17. package/@types/dataview/data-index/source/package.json +4 -0
  18. package/@types/dataview/data-model/markdown/package.json +4 -0
  19. package/@types/dataview/data-model/serialized/markdown/package.json +4 -0
  20. package/@types/dataview/data-model/transferable/package.json +4 -0
  21. package/@types/dataview/data-model/value/package.json +4 -0
  22. package/@types/dataview/expression/binaryop/package.json +4 -0
  23. package/@types/dataview/expression/context/package.json +4 -0
  24. package/@types/dataview/expression/field/package.json +4 -0
  25. package/@types/dataview/expression/functions/package.json +4 -0
  26. package/@types/dataview/expression/parse/package.json +4 -0
  27. package/@types/dataview/index/package.json +4 -0
  28. package/@types/dataview/main/package.json +4 -0
  29. package/@types/dataview/package.json +4 -0
  30. package/@types/dataview/query/engine/package.json +4 -0
  31. package/@types/dataview/query/parse/package.json +4 -0
  32. package/@types/dataview/query/query/package.json +4 -0
  33. package/@types/dataview/settings/package.json +4 -0
  34. package/@types/dataview/typings/obsidian-ex/package.json +4 -0
  35. package/@types/dataview/typings/workers/package.json +4 -0
  36. package/@types/dataview/ui/export/markdown/package.json +4 -0
  37. package/@types/dataview/ui/lp-render/package.json +4 -0
  38. package/@types/dataview/ui/markdown/package.json +4 -0
  39. package/@types/dataview/ui/refreshable-view/package.json +4 -0
  40. package/@types/dataview/ui/render/package.json +4 -0
  41. package/@types/dataview/ui/views/calendar-view/package.json +4 -0
  42. package/@types/dataview/ui/views/inline-field-live-preview/package.json +4 -0
  43. package/@types/dataview/ui/views/inline-view/package.json +4 -0
  44. package/@types/dataview/ui/views/js-view/package.json +4 -0
  45. package/@types/dataview/ui/views/list-view/package.json +4 -0
  46. package/@types/dataview/ui/views/table-view/package.json +4 -0
  47. package/@types/dataview/ui/views/task-view/package.json +4 -0
  48. package/@types/dataview/util/hash/package.json +4 -0
  49. package/@types/dataview/util/locale/package.json +4 -0
  50. package/@types/dataview/util/media/package.json +4 -0
  51. package/@types/dataview/util/normalize/package.json +4 -0
  52. package/@types/i18next/package.json +4 -0
  53. package/@types/obsidian-integration-testing/package.json +4 -0
  54. package/@types/original-fs/package.json +4 -0
  55. package/LICENSE +21 -0
  56. package/README.md +7 -1
  57. package/codemirror/index/package.json +6 -0
  58. package/codemirror/package.json +6 -0
  59. package/codemirror/state-field-spec/package.json +6 -0
  60. package/command-handlers/abstract-file-command-handler/package.json +6 -0
  61. package/command-handlers/command-handler/package.json +6 -0
  62. package/command-handlers/command-handler-component/package.json +6 -0
  63. package/command-handlers/editor-command-handler/package.json +6 -0
  64. package/command-handlers/file-command-handler/package.json +6 -0
  65. package/command-handlers/folder-command-handler/package.json +6 -0
  66. package/command-handlers/global-command-handler/package.json +6 -0
  67. package/command-handlers/index/package.json +6 -0
  68. package/command-handlers/open-demo-vault-command-handler/package.json +6 -0
  69. package/command-handlers/open-settings-command-handler/package.json +6 -0
  70. package/command-handlers/package.json +6 -0
  71. package/command-handlers/unlock-active-note-command-handler/package.json +6 -0
  72. package/components/abort-signal-component/package.json +6 -0
  73. package/components/all-windows-event-component/package.json +6 -0
  74. package/components/async-error-handler-component/package.json +6 -0
  75. package/components/async-events-component/package.json +6 -0
  76. package/components/case-insensitive-file-index-component/package.json +6 -0
  77. package/components/component-ex/package.json +6 -0
  78. package/components/console-debug-component/package.json +6 -0
  79. package/components/core-plugin-toggle-component/package.json +6 -0
  80. package/components/disposable-component/package.json +6 -0
  81. package/components/embed-extensions-component/package.json +6 -0
  82. package/components/generate-markdown-link-default-params-component/package.json +6 -0
  83. package/components/index/package.json +6 -0
  84. package/components/layout-ready-component/package.json +6 -0
  85. package/components/menu-event-registrar-component/package.json +6 -0
  86. package/components/monkey-around-component/package.json +6 -0
  87. package/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
  88. package/components/package.json +6 -0
  89. package/components/plugin-context-component/package.json +6 -0
  90. package/components/plugin-gate-component/package.json +6 -0
  91. package/components/plugin-notice-component/package.json +6 -0
  92. package/components/plugin-settings-component/package.json +6 -0
  93. package/components/plugin-settings-tab-component/package.json +6 -0
  94. package/components/plugin-suggestion-component/package.json +6 -0
  95. package/components/pointer-position-component/package.json +6 -0
  96. package/components/registry-component/package.json +6 -0
  97. package/components/release-notes-component/package.json +6 -0
  98. package/components/rename-delete-handler-component/package.json +6 -0
  99. package/components/rmdir-guard-component/package.json +6 -0
  100. package/components/settings-migration-component/package.json +6 -0
  101. package/components/syntax-highlighting-component/package.json +6 -0
  102. package/components/templates-language-component/package.json +6 -0
  103. package/constructors/get-dom-events-handlers-constructor/package.json +6 -0
  104. package/constructors/index/package.json +6 -0
  105. package/constructors/package.json +6 -0
  106. package/dist/lib/cjs/@types/dataview/api/data-array.d.cts +137 -0
  107. package/dist/lib/cjs/@types/dataview/api/extensions.d.cts +16 -0
  108. package/dist/lib/cjs/@types/dataview/api/inline-api.d.cts +187 -0
  109. package/dist/lib/cjs/@types/dataview/api/plugin-api.d.cts +210 -0
  110. package/dist/lib/cjs/@types/dataview/api/result.d.cts +39 -0
  111. package/dist/lib/cjs/@types/dataview/data-import/common.d.cts +4 -0
  112. package/dist/lib/cjs/@types/dataview/data-import/csv.d.cts +4 -0
  113. package/dist/lib/cjs/@types/dataview/data-import/inline-field.d.cts +43 -0
  114. package/dist/lib/cjs/@types/dataview/data-import/markdown-file.d.cts +53 -0
  115. package/dist/lib/cjs/@types/dataview/data-import/persister.d.cts +33 -0
  116. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-entry.d.cts +2 -0
  117. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-impl.d.cts +7 -0
  118. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-manager.d.cts +38 -0
  119. package/dist/lib/cjs/@types/dataview/data-index/index.d.cts +187 -0
  120. package/dist/lib/cjs/@types/dataview/data-index/resolver.d.cts +24 -0
  121. package/dist/lib/cjs/@types/dataview/data-index/source.d.cts +72 -0
  122. package/dist/lib/cjs/@types/dataview/data-model/markdown.d.cts +116 -0
  123. package/dist/lib/cjs/@types/dataview/data-model/serialized/markdown.d.cts +107 -0
  124. package/dist/lib/cjs/@types/dataview/data-model/transferable.d.cts +8 -0
  125. package/dist/lib/cjs/@types/dataview/data-model/value.d.cts +176 -0
  126. package/dist/lib/cjs/@types/dataview/expression/binaryop.d.cts +44 -0
  127. package/dist/lib/cjs/@types/dataview/expression/context.d.cts +50 -0
  128. package/dist/lib/cjs/@types/dataview/expression/field.d.cts +83 -0
  129. package/dist/lib/cjs/@types/dataview/expression/functions.d.cts +150 -0
  130. package/dist/lib/cjs/@types/dataview/expression/parse.d.cts +164 -0
  131. package/dist/lib/cjs/@types/dataview/index.d.cts +56 -0
  132. package/dist/lib/cjs/@types/dataview/main.d.cts +53 -0
  133. package/dist/lib/cjs/@types/dataview/query/engine.d.cts +104 -0
  134. package/dist/lib/cjs/@types/dataview/query/parse.d.cts +45 -0
  135. package/dist/lib/cjs/@types/dataview/query/query.d.cts +96 -0
  136. package/dist/lib/cjs/@types/dataview/settings.d.cts +61 -0
  137. package/dist/lib/cjs/@types/dataview/typings/obsidian-ex.d.cts +29 -0
  138. package/dist/lib/cjs/@types/dataview/typings/workers.d.cts +5 -0
  139. package/dist/lib/cjs/@types/dataview/ui/export/markdown.d.cts +16 -0
  140. package/dist/lib/cjs/@types/dataview/ui/lp-render.d.cts +38 -0
  141. package/dist/lib/cjs/@types/dataview/ui/markdown.d.cts +87 -0
  142. package/dist/lib/cjs/@types/dataview/ui/refreshable-view.d.cts +19 -0
  143. package/dist/lib/cjs/@types/dataview/ui/render.d.cts +34 -0
  144. package/dist/lib/cjs/@types/dataview/ui/views/calendar-view.d.cts +18 -0
  145. package/dist/lib/cjs/@types/dataview/ui/views/inline-field-live-preview.d.cts +43 -0
  146. package/dist/lib/cjs/@types/dataview/ui/views/inline-view.d.cts +29 -0
  147. package/dist/lib/cjs/@types/dataview/ui/views/js-view.d.cts +24 -0
  148. package/dist/lib/cjs/@types/dataview/ui/views/list-view.d.cts +26 -0
  149. package/dist/lib/cjs/@types/dataview/ui/views/table-view.d.cts +29 -0
  150. package/dist/lib/cjs/@types/dataview/ui/views/task-view.d.cts +52 -0
  151. package/dist/lib/cjs/@types/dataview/util/hash.d.cts +2 -0
  152. package/dist/lib/cjs/@types/dataview/util/locale.d.cts +3 -0
  153. package/dist/lib/cjs/@types/dataview/util/media.d.cts +7 -0
  154. package/dist/lib/cjs/@types/dataview/util/normalize.d.cts +45 -0
  155. package/dist/lib/cjs/@types/i18next.d.cts +14 -0
  156. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +29 -0
  157. package/dist/lib/cjs/@types/original-fs.d.cts +15 -0
  158. package/dist/lib/cjs/__merged.cjs +1680 -0
  159. package/dist/lib/cjs/__merged.d.cts +205 -0
  160. package/dist/lib/cjs/active-file-provider.cjs +185 -0
  161. package/dist/lib/cjs/active-file-provider.d.cts +36 -0
  162. package/dist/lib/cjs/app.cjs +177 -0
  163. package/dist/lib/cjs/app.d.cts +17 -0
  164. package/dist/lib/cjs/async-with-notice.cjs +259 -0
  165. package/dist/lib/cjs/async-with-notice.d.cts +113 -0
  166. package/dist/lib/cjs/attachment-path.cjs +403 -0
  167. package/dist/lib/cjs/attachment-path.d.cts +341 -0
  168. package/dist/lib/cjs/attachment-unit-folder.cjs +192 -0
  169. package/dist/lib/cjs/attachment-unit-folder.d.cts +103 -0
  170. package/dist/lib/cjs/backlink-index.cjs +273 -0
  171. package/dist/lib/cjs/backlink-index.d.cts +51 -0
  172. package/dist/lib/cjs/backlink.cjs +241 -0
  173. package/dist/lib/cjs/backlink.d.cts +66 -0
  174. package/dist/lib/cjs/bases-view-registrar.cjs +186 -0
  175. package/dist/lib/cjs/bases-view-registrar.d.cts +52 -0
  176. package/dist/lib/cjs/callout.cjs +244 -0
  177. package/dist/lib/cjs/callout.d.cts +76 -0
  178. package/dist/lib/cjs/canvas.cjs +239 -0
  179. package/dist/lib/cjs/canvas.d.cts +28 -0
  180. package/dist/lib/cjs/case-insensitive-file-index.cjs +268 -0
  181. package/dist/lib/cjs/case-insensitive-file-index.d.cts +92 -0
  182. package/dist/lib/cjs/code-block-markdown-information.cjs +155 -0
  183. package/dist/lib/cjs/code-block-markdown-information.d.cts +48 -0
  184. package/dist/lib/cjs/code-block-reg-exp.cjs +169 -0
  185. package/dist/lib/cjs/code-block-reg-exp.d.cts +39 -0
  186. package/dist/lib/cjs/codemirror/index.cjs +177 -0
  187. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  188. package/dist/lib/cjs/codemirror/state-field-spec.cjs +155 -0
  189. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +72 -0
  190. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +440 -0
  191. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +274 -0
  192. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +302 -0
  193. package/dist/lib/cjs/command-handlers/command-handler-component.d.cts +146 -0
  194. package/dist/lib/cjs/command-handlers/command-handler.cjs +224 -0
  195. package/dist/lib/cjs/command-handlers/command-handler.d.cts +107 -0
  196. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +372 -0
  197. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +208 -0
  198. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +309 -0
  199. package/dist/lib/cjs/command-handlers/file-command-handler.d.cts +143 -0
  200. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +317 -0
  201. package/dist/lib/cjs/command-handlers/folder-command-handler.d.cts +149 -0
  202. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +209 -0
  203. package/dist/lib/cjs/command-handlers/global-command-handler.d.cts +40 -0
  204. package/dist/lib/cjs/command-handlers/index.cjs +204 -0
  205. package/dist/lib/cjs/command-handlers/index.d.cts +11 -0
  206. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +233 -0
  207. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.d.cts +73 -0
  208. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +198 -0
  209. package/dist/lib/cjs/command-handlers/open-settings-command-handler.d.cts +44 -0
  210. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +211 -0
  211. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.d.cts +54 -0
  212. package/dist/lib/cjs/command-registrar.cjs +193 -0
  213. package/dist/lib/cjs/command-registrar.d.cts +48 -0
  214. package/dist/lib/cjs/community-plugins.cjs +346 -0
  215. package/dist/lib/cjs/community-plugins.d.cts +270 -0
  216. package/dist/lib/cjs/components/abort-signal-component.cjs +196 -0
  217. package/dist/lib/cjs/components/abort-signal-component.d.cts +30 -0
  218. package/dist/lib/cjs/components/all-windows-event-component.cjs +238 -0
  219. package/dist/lib/cjs/components/all-windows-event-component.d.cts +84 -0
  220. package/dist/lib/cjs/components/async-error-handler-component.cjs +200 -0
  221. package/dist/lib/cjs/components/async-error-handler-component.d.cts +30 -0
  222. package/dist/lib/cjs/components/async-events-component.cjs +172 -0
  223. package/dist/lib/cjs/components/async-events-component.d.cts +15 -0
  224. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +210 -0
  225. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +36 -0
  226. package/dist/lib/cjs/components/component-ex.cjs +528 -0
  227. package/dist/lib/cjs/components/component-ex.d.cts +229 -0
  228. package/dist/lib/cjs/components/console-debug-component.cjs +194 -0
  229. package/dist/lib/cjs/components/console-debug-component.d.cts +30 -0
  230. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +226 -0
  231. package/dist/lib/cjs/components/core-plugin-toggle-component.d.cts +102 -0
  232. package/dist/lib/cjs/components/disposable-component.cjs +178 -0
  233. package/dist/lib/cjs/components/disposable-component.d.cts +24 -0
  234. package/dist/lib/cjs/components/embed-extensions-component.cjs +198 -0
  235. package/dist/lib/cjs/components/embed-extensions-component.d.cts +38 -0
  236. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +194 -0
  237. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.d.cts +42 -0
  238. package/dist/lib/cjs/components/index.cjs +261 -0
  239. package/dist/lib/cjs/components/index.d.cts +30 -0
  240. package/dist/lib/cjs/components/layout-ready-component.cjs +235 -0
  241. package/dist/lib/cjs/components/layout-ready-component.d.cts +48 -0
  242. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +220 -0
  243. package/dist/lib/cjs/components/menu-event-registrar-component.d.cts +52 -0
  244. package/dist/lib/cjs/components/monkey-around-component.cjs +269 -0
  245. package/dist/lib/cjs/components/monkey-around-component.d.cts +241 -0
  246. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +345 -0
  247. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.d.cts +150 -0
  248. package/dist/lib/cjs/components/plugin-context-component.cjs +204 -0
  249. package/dist/lib/cjs/components/plugin-context-component.d.cts +36 -0
  250. package/dist/lib/cjs/components/plugin-gate-component.cjs +572 -0
  251. package/dist/lib/cjs/components/plugin-gate-component.d.cts +332 -0
  252. package/dist/lib/cjs/components/plugin-notice-component.cjs +653 -0
  253. package/dist/lib/cjs/components/plugin-notice-component.d.cts +362 -0
  254. package/dist/lib/cjs/components/plugin-settings-component.cjs +668 -0
  255. package/dist/lib/cjs/components/plugin-settings-component.d.cts +362 -0
  256. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +194 -0
  257. package/dist/lib/cjs/components/plugin-settings-tab-component.d.cts +39 -0
  258. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +302 -0
  259. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +162 -0
  260. package/dist/lib/cjs/components/pointer-position-component.cjs +190 -0
  261. package/dist/lib/cjs/components/pointer-position-component.d.cts +29 -0
  262. package/dist/lib/cjs/components/registry-component.cjs +211 -0
  263. package/dist/lib/cjs/components/registry-component.d.cts +37 -0
  264. package/dist/lib/cjs/components/release-notes-component.cjs +249 -0
  265. package/dist/lib/cjs/components/release-notes-component.d.cts +129 -0
  266. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +1299 -0
  267. package/dist/lib/cjs/components/rename-delete-handler-component.d.cts +165 -0
  268. package/dist/lib/cjs/components/rmdir-guard-component.cjs +214 -0
  269. package/dist/lib/cjs/components/rmdir-guard-component.d.cts +76 -0
  270. package/dist/lib/cjs/components/settings-migration-component.cjs +246 -0
  271. package/dist/lib/cjs/components/settings-migration-component.d.cts +120 -0
  272. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +272 -0
  273. package/dist/lib/cjs/components/syntax-highlighting-component.d.cts +149 -0
  274. package/dist/lib/cjs/components/templates-language-component.cjs +300 -0
  275. package/dist/lib/cjs/components/templates-language-component.d.cts +124 -0
  276. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +270 -0
  277. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.d.cts +22 -0
  278. package/dist/lib/cjs/constructors/index.cjs +177 -0
  279. package/dist/lib/cjs/constructors/index.d.cts +2 -0
  280. package/dist/lib/cjs/css-class.cjs +232 -0
  281. package/dist/lib/cjs/css-class.d.cts +278 -0
  282. package/dist/lib/cjs/data-handler.cjs +194 -0
  283. package/dist/lib/cjs/data-handler.d.cts +49 -0
  284. package/dist/lib/cjs/dataview-link.cjs +184 -0
  285. package/dist/lib/cjs/dataview-link.d.cts +42 -0
  286. package/dist/lib/cjs/dataview.cjs +403 -0
  287. package/dist/lib/cjs/dataview.d.cts +249 -0
  288. package/dist/lib/cjs/debug.cjs +172 -0
  289. package/dist/lib/cjs/debug.d.cts +19 -0
  290. package/dist/lib/cjs/demo-vault-helper-settings.cjs +155 -0
  291. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +29 -0
  292. package/dist/lib/cjs/demo-vault-helper.cjs +256 -0
  293. package/dist/lib/cjs/demo-vault-helper.d.cts +61 -0
  294. package/dist/lib/cjs/demo-vault-naming.cjs +181 -0
  295. package/dist/lib/cjs/demo-vault-naming.d.cts +54 -0
  296. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +372 -0
  297. package/dist/lib/cjs/desktop-demo-vault-opener.d.cts +76 -0
  298. package/dist/lib/cjs/desktop-trusted-input.cjs +325 -0
  299. package/dist/lib/cjs/desktop-trusted-input.d.cts +288 -0
  300. package/dist/lib/cjs/editor-extension-registrar.cjs +186 -0
  301. package/dist/lib/cjs/editor-extension-registrar.d.cts +37 -0
  302. package/dist/lib/cjs/editor-suggest-registrar.cjs +186 -0
  303. package/dist/lib/cjs/editor-suggest-registrar.d.cts +36 -0
  304. package/dist/lib/cjs/editor.cjs +224 -0
  305. package/dist/lib/cjs/editor.d.cts +45 -0
  306. package/dist/lib/cjs/events.cjs +196 -0
  307. package/dist/lib/cjs/events.d.cts +98 -0
  308. package/dist/lib/cjs/extensions-registrar.cjs +186 -0
  309. package/dist/lib/cjs/extensions-registrar.d.cts +51 -0
  310. package/dist/lib/cjs/file-change.cjs +582 -0
  311. package/dist/lib/cjs/file-change.d.cts +156 -0
  312. package/dist/lib/cjs/file-explorer.cjs +181 -0
  313. package/dist/lib/cjs/file-explorer.d.cts +34 -0
  314. package/dist/lib/cjs/file-manager.cjs +275 -0
  315. package/dist/lib/cjs/file-manager.d.cts +123 -0
  316. package/dist/lib/cjs/file-system.cjs +595 -0
  317. package/dist/lib/cjs/file-system.d.cts +554 -0
  318. package/dist/lib/cjs/folder-note.cjs +285 -0
  319. package/dist/lib/cjs/folder-note.d.cts +166 -0
  320. package/dist/lib/cjs/frontmatter-formatting.cjs +472 -0
  321. package/dist/lib/cjs/frontmatter-formatting.d.cts +44 -0
  322. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +183 -0
  323. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.d.cts +34 -0
  324. package/dist/lib/cjs/frontmatter.cjs +295 -0
  325. package/dist/lib/cjs/frontmatter.d.cts +145 -0
  326. package/dist/lib/cjs/generated-during-build.cjs +170 -0
  327. package/dist/lib/cjs/generated-during-build.d.cts +19 -0
  328. package/dist/lib/cjs/hover-link-source-registrar.cjs +186 -0
  329. package/dist/lib/cjs/hover-link-source-registrar.d.cts +52 -0
  330. package/dist/lib/cjs/html-element.cjs +207 -0
  331. package/dist/lib/cjs/html-element.d.cts +98 -0
  332. package/dist/lib/cjs/i18n/custom-type-options.cjs +156 -0
  333. package/dist/lib/cjs/i18n/custom-type-options.d.cts +38 -0
  334. package/dist/lib/cjs/i18n/default-translations.cjs +156 -0
  335. package/dist/lib/cjs/i18n/default-translations.d.cts +15 -0
  336. package/dist/lib/cjs/i18n/i18n.cjs +216 -0
  337. package/dist/lib/cjs/i18n/i18n.d.cts +38 -0
  338. package/dist/lib/cjs/i18n/index.cjs +186 -0
  339. package/dist/lib/cjs/i18n/index.d.cts +5 -0
  340. package/dist/lib/cjs/i18n/locales/en.cjs +248 -0
  341. package/dist/lib/cjs/i18n/locales/en.d.cts +91 -0
  342. package/dist/lib/cjs/i18n/locales/index.cjs +180 -0
  343. package/dist/lib/cjs/i18n/locales/index.d.cts +3 -0
  344. package/dist/lib/cjs/i18n/locales/translations-map.cjs +174 -0
  345. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +100 -0
  346. package/dist/lib/cjs/index.cjs +459 -0
  347. package/dist/lib/cjs/index.d.cts +96 -0
  348. package/dist/lib/cjs/is-in-obsidian.cjs +178 -0
  349. package/dist/lib/cjs/is-in-obsidian.d.cts +12 -0
  350. package/dist/lib/cjs/library-styles.cjs +197 -0
  351. package/dist/lib/cjs/library-styles.d.cts +56 -0
  352. package/dist/lib/cjs/library.cjs +205 -0
  353. package/dist/lib/cjs/library.d.cts +57 -0
  354. package/dist/lib/cjs/link-name.cjs +169 -0
  355. package/dist/lib/cjs/link-name.d.cts +23 -0
  356. package/dist/lib/cjs/link-update-progress.cjs +155 -0
  357. package/dist/lib/cjs/link-update-progress.d.cts +32 -0
  358. package/dist/lib/cjs/link.cjs +1077 -0
  359. package/dist/lib/cjs/link.d.cts +1369 -0
  360. package/dist/lib/cjs/logger.cjs +236 -0
  361. package/dist/lib/cjs/logger.d.cts +37 -0
  362. package/dist/lib/cjs/loop.cjs +267 -0
  363. package/dist/lib/cjs/loop.d.cts +104 -0
  364. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +190 -0
  365. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +62 -0
  366. package/dist/lib/cjs/markdown-code-block-processor.cjs +468 -0
  367. package/dist/lib/cjs/markdown-code-block-processor.d.cts +137 -0
  368. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +187 -0
  369. package/dist/lib/cjs/markdown-post-processor-registrar.d.cts +59 -0
  370. package/dist/lib/cjs/markdown-view.cjs +175 -0
  371. package/dist/lib/cjs/markdown-view.d.cts +14 -0
  372. package/dist/lib/cjs/markdown.cjs +494 -0
  373. package/dist/lib/cjs/markdown.d.cts +226 -0
  374. package/dist/lib/cjs/menu-event-registrar.cjs +155 -0
  375. package/dist/lib/cjs/menu-event-registrar.d.cts +84 -0
  376. package/dist/lib/cjs/metadata-cache.cjs +568 -0
  377. package/dist/lib/cjs/metadata-cache.d.cts +359 -0
  378. package/dist/lib/cjs/mobile-trusted-input.cjs +209 -0
  379. package/dist/lib/cjs/mobile-trusted-input.d.cts +98 -0
  380. package/dist/lib/cjs/modals/alert.cjs +202 -0
  381. package/dist/lib/cjs/modals/alert.d.cts +35 -0
  382. package/dist/lib/cjs/modals/confirm.cjs +212 -0
  383. package/dist/lib/cjs/modals/confirm.d.cts +39 -0
  384. package/dist/lib/cjs/modals/index.cjs +201 -0
  385. package/dist/lib/cjs/modals/index.d.cts +10 -0
  386. package/dist/lib/cjs/modals/minimizable-modal.cjs +465 -0
  387. package/dist/lib/cjs/modals/minimizable-modal.d.cts +129 -0
  388. package/dist/lib/cjs/modals/modal-command-builder.cjs +482 -0
  389. package/dist/lib/cjs/modals/modal-command-builder.d.cts +285 -0
  390. package/dist/lib/cjs/modals/modal.cjs +200 -0
  391. package/dist/lib/cjs/modals/modal.d.cts +64 -0
  392. package/dist/lib/cjs/modals/prompt.cjs +280 -0
  393. package/dist/lib/cjs/modals/prompt.d.cts +83 -0
  394. package/dist/lib/cjs/modals/select-item.cjs +225 -0
  395. package/dist/lib/cjs/modals/select-item.d.cts +55 -0
  396. package/dist/lib/cjs/modals/select-option.cjs +213 -0
  397. package/dist/lib/cjs/modals/select-option.d.cts +65 -0
  398. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +168 -0
  399. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +35 -0
  400. package/dist/lib/cjs/note-priority.cjs +258 -0
  401. package/dist/lib/cjs/note-priority.d.cts +154 -0
  402. package/dist/lib/cjs/notebook-navigator.cjs +187 -0
  403. package/dist/lib/cjs/notebook-navigator.d.cts +132 -0
  404. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +199 -0
  405. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +42 -0
  406. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +189 -0
  407. package/dist/lib/cjs/obsidian-protocol-handler-registrar.d.cts +55 -0
  408. package/dist/lib/cjs/obsidian-settings.cjs +206 -0
  409. package/dist/lib/cjs/obsidian-settings.d.cts +62 -0
  410. package/dist/lib/cjs/parse-link.cjs +562 -0
  411. package/dist/lib/cjs/parse-link.d.cts +288 -0
  412. package/dist/lib/cjs/path-settings.cjs +293 -0
  413. package/dist/lib/cjs/path-settings.d.cts +56 -0
  414. package/dist/lib/cjs/pdf.cjs +197 -0
  415. package/dist/lib/cjs/pdf.d.cts +26 -0
  416. package/dist/lib/cjs/plugin/index.cjs +198 -0
  417. package/dist/lib/cjs/plugin/index.d.cts +9 -0
  418. package/dist/lib/cjs/plugin/plugin-api.cjs +543 -0
  419. package/dist/lib/cjs/plugin/plugin-api.d.cts +413 -0
  420. package/dist/lib/cjs/plugin/plugin-context.cjs +215 -0
  421. package/dist/lib/cjs/plugin/plugin-context.d.cts +27 -0
  422. package/dist/lib/cjs/plugin/plugin-event-source.cjs +250 -0
  423. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +97 -0
  424. package/dist/lib/cjs/plugin/plugin-install-state.cjs +219 -0
  425. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +113 -0
  426. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +175 -0
  427. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +127 -0
  428. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +635 -0
  429. package/dist/lib/cjs/plugin/plugin-settings-tab.d.cts +368 -0
  430. package/dist/lib/cjs/plugin/plugin.cjs +730 -0
  431. package/dist/lib/cjs/plugin/plugin.d.cts +363 -0
  432. package/dist/lib/cjs/plugin/settings-migration-api.cjs +155 -0
  433. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +91 -0
  434. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +187 -0
  435. package/dist/lib/cjs/plugin-cli-handler-registrar.d.cts +64 -0
  436. package/dist/lib/cjs/popovers/field-popover.cjs +206 -0
  437. package/dist/lib/cjs/popovers/field-popover.d.cts +75 -0
  438. package/dist/lib/cjs/popovers/index.cjs +183 -0
  439. package/dist/lib/cjs/popovers/index.d.cts +4 -0
  440. package/dist/lib/cjs/popovers/popover-anchor.cjs +206 -0
  441. package/dist/lib/cjs/popovers/popover-anchor.d.cts +67 -0
  442. package/dist/lib/cjs/popovers/popover.cjs +253 -0
  443. package/dist/lib/cjs/popovers/popover.d.cts +78 -0
  444. package/dist/lib/cjs/property-entry.cjs +196 -0
  445. package/dist/lib/cjs/property-entry.d.cts +43 -0
  446. package/dist/lib/cjs/queue.cjs +236 -0
  447. package/dist/lib/cjs/queue.d.cts +93 -0
  448. package/dist/lib/cjs/react/app-context.cjs +175 -0
  449. package/dist/lib/cjs/react/app-context.d.cts +24 -0
  450. package/dist/lib/cjs/react/index.cjs +177 -0
  451. package/dist/lib/cjs/react/index.d.cts +2 -0
  452. package/dist/lib/cjs/reference.cjs +210 -0
  453. package/dist/lib/cjs/reference.d.cts +116 -0
  454. package/dist/lib/cjs/resource-lock.cjs +1120 -0
  455. package/dist/lib/cjs/resource-lock.d.cts +318 -0
  456. package/dist/lib/cjs/resource-url.cjs +180 -0
  457. package/dist/lib/cjs/resource-url.d.cts +31 -0
  458. package/dist/lib/cjs/ribbon-icon-registrar.cjs +187 -0
  459. package/dist/lib/cjs/ribbon-icon-registrar.d.cts +60 -0
  460. package/dist/lib/cjs/setting-components/checkbox-component.cjs +240 -0
  461. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +69 -0
  462. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +402 -0
  463. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +132 -0
  464. package/dist/lib/cjs/setting-components/date-component.cjs +204 -0
  465. package/dist/lib/cjs/setting-components/date-component.d.cts +38 -0
  466. package/dist/lib/cjs/setting-components/date-time-component.cjs +204 -0
  467. package/dist/lib/cjs/setting-components/date-time-component.d.cts +38 -0
  468. package/dist/lib/cjs/setting-components/email-component.cjs +215 -0
  469. package/dist/lib/cjs/setting-components/email-component.d.cts +49 -0
  470. package/dist/lib/cjs/setting-components/file-component.cjs +207 -0
  471. package/dist/lib/cjs/setting-components/file-component.d.cts +43 -0
  472. package/dist/lib/cjs/setting-components/index.cjs +252 -0
  473. package/dist/lib/cjs/setting-components/index.d.cts +27 -0
  474. package/dist/lib/cjs/setting-components/month-component.cjs +212 -0
  475. package/dist/lib/cjs/setting-components/month-component.d.cts +51 -0
  476. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +277 -0
  477. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +92 -0
  478. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +201 -0
  479. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +38 -0
  480. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +209 -0
  481. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +43 -0
  482. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +296 -0
  483. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +109 -0
  484. package/dist/lib/cjs/setting-components/number-component.cjs +225 -0
  485. package/dist/lib/cjs/setting-components/number-component.d.cts +56 -0
  486. package/dist/lib/cjs/setting-components/password-component.cjs +201 -0
  487. package/dist/lib/cjs/setting-components/password-component.d.cts +38 -0
  488. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +184 -0
  489. package/dist/lib/cjs/setting-components/setting-component-wrapper.d.cts +13 -0
  490. package/dist/lib/cjs/setting-components/telephone-component.cjs +215 -0
  491. package/dist/lib/cjs/setting-components/telephone-component.d.cts +51 -0
  492. package/dist/lib/cjs/setting-components/text-based-component.cjs +194 -0
  493. package/dist/lib/cjs/setting-components/text-based-component.d.cts +38 -0
  494. package/dist/lib/cjs/setting-components/time-component.cjs +209 -0
  495. package/dist/lib/cjs/setting-components/time-component.d.cts +38 -0
  496. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +241 -0
  497. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +69 -0
  498. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +286 -0
  499. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +97 -0
  500. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +288 -0
  501. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +99 -0
  502. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +199 -0
  503. package/dist/lib/cjs/setting-components/typed-range-text-component.d.cts +35 -0
  504. package/dist/lib/cjs/setting-components/typed-text-component.cjs +256 -0
  505. package/dist/lib/cjs/setting-components/typed-text-component.d.cts +100 -0
  506. package/dist/lib/cjs/setting-components/url-component.cjs +215 -0
  507. package/dist/lib/cjs/setting-components/url-component.d.cts +49 -0
  508. package/dist/lib/cjs/setting-components/validator-component.cjs +254 -0
  509. package/dist/lib/cjs/setting-components/validator-component.d.cts +23 -0
  510. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +155 -0
  511. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.d.cts +20 -0
  512. package/dist/lib/cjs/setting-components/week-component.cjs +212 -0
  513. package/dist/lib/cjs/setting-components/week-component.d.cts +51 -0
  514. package/dist/lib/cjs/setting-ex.cjs +396 -0
  515. package/dist/lib/cjs/setting-ex.d.cts +198 -0
  516. package/dist/lib/cjs/setting-group-ex.cjs +189 -0
  517. package/dist/lib/cjs/setting-group-ex.d.cts +26 -0
  518. package/dist/lib/cjs/status-bar-item-registrar.cjs +186 -0
  519. package/dist/lib/cjs/status-bar-item-registrar.d.cts +36 -0
  520. package/dist/lib/cjs/templater.cjs +303 -0
  521. package/dist/lib/cjs/templater.d.cts +284 -0
  522. package/dist/lib/cjs/transformers/duration-transformer.cjs +206 -0
  523. package/dist/lib/cjs/transformers/duration-transformer.d.cts +39 -0
  524. package/dist/lib/cjs/transformers/index.cjs +177 -0
  525. package/dist/lib/cjs/transformers/index.d.cts +2 -0
  526. package/dist/lib/cjs/trusted-input.cjs +220 -0
  527. package/dist/lib/cjs/trusted-input.d.cts +131 -0
  528. package/dist/lib/cjs/validation.cjs +213 -0
  529. package/dist/lib/cjs/validation.d.cts +87 -0
  530. package/dist/lib/cjs/vault-delete.cjs +246 -0
  531. package/dist/lib/cjs/vault-delete.d.cts +82 -0
  532. package/dist/lib/cjs/vault-transaction.cjs +436 -0
  533. package/dist/lib/cjs/vault-transaction.d.cts +163 -0
  534. package/dist/lib/cjs/vault.cjs +725 -0
  535. package/dist/lib/cjs/vault.d.cts +506 -0
  536. package/dist/lib/cjs/view-registrar.cjs +186 -0
  537. package/dist/lib/cjs/view-registrar.d.cts +52 -0
  538. package/dist/lib/cjs/workspace.cjs +210 -0
  539. package/dist/lib/cjs/workspace.d.cts +81 -0
  540. package/dist/lib/esm/@types/dataview/api/data-array.d.mts +137 -0
  541. package/dist/lib/esm/@types/dataview/api/extensions.d.mts +16 -0
  542. package/dist/lib/esm/@types/dataview/api/inline-api.d.mts +187 -0
  543. package/dist/lib/esm/@types/dataview/api/plugin-api.d.mts +210 -0
  544. package/dist/lib/esm/@types/dataview/api/result.d.mts +39 -0
  545. package/dist/lib/esm/@types/dataview/data-import/common.d.mts +4 -0
  546. package/dist/lib/esm/@types/dataview/data-import/csv.d.mts +4 -0
  547. package/dist/lib/esm/@types/dataview/data-import/inline-field.d.mts +43 -0
  548. package/dist/lib/esm/@types/dataview/data-import/markdown-file.d.mts +53 -0
  549. package/dist/lib/esm/@types/dataview/data-import/persister.d.mts +33 -0
  550. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-entry.d.mts +2 -0
  551. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-impl.d.mts +7 -0
  552. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-manager.d.mts +38 -0
  553. package/dist/lib/esm/@types/dataview/data-index/index.d.mts +187 -0
  554. package/dist/lib/esm/@types/dataview/data-index/resolver.d.mts +24 -0
  555. package/dist/lib/esm/@types/dataview/data-index/source.d.mts +72 -0
  556. package/dist/lib/esm/@types/dataview/data-model/markdown.d.mts +116 -0
  557. package/dist/lib/esm/@types/dataview/data-model/serialized/markdown.d.mts +107 -0
  558. package/dist/lib/esm/@types/dataview/data-model/transferable.d.mts +8 -0
  559. package/dist/lib/esm/@types/dataview/data-model/value.d.mts +176 -0
  560. package/dist/lib/esm/@types/dataview/expression/binaryop.d.mts +44 -0
  561. package/dist/lib/esm/@types/dataview/expression/context.d.mts +50 -0
  562. package/dist/lib/esm/@types/dataview/expression/field.d.mts +83 -0
  563. package/dist/lib/esm/@types/dataview/expression/functions.d.mts +150 -0
  564. package/dist/lib/esm/@types/dataview/expression/parse.d.mts +164 -0
  565. package/dist/lib/esm/@types/dataview/index.d.mts +56 -0
  566. package/dist/lib/esm/@types/dataview/main.d.mts +53 -0
  567. package/dist/lib/esm/@types/dataview/query/engine.d.mts +104 -0
  568. package/dist/lib/esm/@types/dataview/query/parse.d.mts +45 -0
  569. package/dist/lib/esm/@types/dataview/query/query.d.mts +96 -0
  570. package/dist/lib/esm/@types/dataview/settings.d.mts +61 -0
  571. package/dist/lib/esm/@types/dataview/typings/obsidian-ex.d.mts +29 -0
  572. package/dist/lib/esm/@types/dataview/typings/workers.d.mts +5 -0
  573. package/dist/lib/esm/@types/dataview/ui/export/markdown.d.mts +16 -0
  574. package/dist/lib/esm/@types/dataview/ui/lp-render.d.mts +38 -0
  575. package/dist/lib/esm/@types/dataview/ui/markdown.d.mts +87 -0
  576. package/dist/lib/esm/@types/dataview/ui/refreshable-view.d.mts +19 -0
  577. package/dist/lib/esm/@types/dataview/ui/render.d.mts +34 -0
  578. package/dist/lib/esm/@types/dataview/ui/views/calendar-view.d.mts +18 -0
  579. package/dist/lib/esm/@types/dataview/ui/views/inline-field-live-preview.d.mts +43 -0
  580. package/dist/lib/esm/@types/dataview/ui/views/inline-view.d.mts +29 -0
  581. package/dist/lib/esm/@types/dataview/ui/views/js-view.d.mts +24 -0
  582. package/dist/lib/esm/@types/dataview/ui/views/list-view.d.mts +26 -0
  583. package/dist/lib/esm/@types/dataview/ui/views/table-view.d.mts +29 -0
  584. package/dist/lib/esm/@types/dataview/ui/views/task-view.d.mts +52 -0
  585. package/dist/lib/esm/@types/dataview/util/hash.d.mts +2 -0
  586. package/dist/lib/esm/@types/dataview/util/locale.d.mts +3 -0
  587. package/dist/lib/esm/@types/dataview/util/media.d.mts +7 -0
  588. package/dist/lib/esm/@types/dataview/util/normalize.d.mts +45 -0
  589. package/dist/lib/esm/@types/i18next.d.mts +14 -0
  590. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +29 -0
  591. package/dist/lib/esm/@types/original-fs.d.mts +15 -0
  592. package/dist/lib/esm/__merged.d.mts +205 -0
  593. package/dist/lib/esm/__merged.mjs +1532 -0
  594. package/dist/lib/esm/active-file-provider.d.mts +36 -0
  595. package/dist/lib/esm/active-file-provider.mjs +72 -0
  596. package/dist/lib/esm/app.d.mts +17 -0
  597. package/dist/lib/esm/app.mjs +64 -0
  598. package/dist/lib/esm/async-with-notice.d.mts +113 -0
  599. package/dist/lib/esm/async-with-notice.mjs +149 -0
  600. package/dist/lib/esm/attachment-path.d.mts +341 -0
  601. package/dist/lib/esm/attachment-path.mjs +302 -0
  602. package/dist/lib/esm/attachment-unit-folder.d.mts +103 -0
  603. package/dist/lib/esm/attachment-unit-folder.mjs +78 -0
  604. package/dist/lib/esm/backlink-index.d.mts +51 -0
  605. package/dist/lib/esm/backlink-index.mjs +160 -0
  606. package/dist/lib/esm/backlink.d.mts +66 -0
  607. package/dist/lib/esm/backlink.mjs +131 -0
  608. package/dist/lib/esm/bases-view-registrar.d.mts +52 -0
  609. package/dist/lib/esm/bases-view-registrar.mjs +73 -0
  610. package/dist/lib/esm/callout.d.mts +76 -0
  611. package/dist/lib/esm/callout.mjs +132 -0
  612. package/dist/lib/esm/canvas.d.mts +28 -0
  613. package/dist/lib/esm/canvas.mjs +129 -0
  614. package/dist/lib/esm/case-insensitive-file-index.d.mts +92 -0
  615. package/dist/lib/esm/case-insensitive-file-index.mjs +152 -0
  616. package/dist/lib/esm/code-block-markdown-information.d.mts +48 -0
  617. package/dist/lib/esm/code-block-markdown-information.mjs +50 -0
  618. package/dist/lib/esm/code-block-reg-exp.d.mts +39 -0
  619. package/dist/lib/esm/code-block-reg-exp.mjs +56 -0
  620. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  621. package/dist/lib/esm/codemirror/index.mjs +54 -0
  622. package/dist/lib/esm/codemirror/state-field-spec.d.mts +72 -0
  623. package/dist/lib/esm/codemirror/state-field-spec.mjs +50 -0
  624. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +274 -0
  625. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +330 -0
  626. package/dist/lib/esm/command-handlers/command-handler-component.d.mts +146 -0
  627. package/dist/lib/esm/command-handlers/command-handler-component.mjs +193 -0
  628. package/dist/lib/esm/command-handlers/command-handler.d.mts +107 -0
  629. package/dist/lib/esm/command-handlers/command-handler.mjs +111 -0
  630. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +208 -0
  631. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +262 -0
  632. package/dist/lib/esm/command-handlers/file-command-handler.d.mts +143 -0
  633. package/dist/lib/esm/command-handlers/file-command-handler.mjs +200 -0
  634. package/dist/lib/esm/command-handlers/folder-command-handler.d.mts +149 -0
  635. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +208 -0
  636. package/dist/lib/esm/command-handlers/global-command-handler.d.mts +40 -0
  637. package/dist/lib/esm/command-handlers/global-command-handler.mjs +96 -0
  638. package/dist/lib/esm/command-handlers/index.d.mts +11 -0
  639. package/dist/lib/esm/command-handlers/index.mjs +72 -0
  640. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.d.mts +73 -0
  641. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +110 -0
  642. package/dist/lib/esm/command-handlers/open-settings-command-handler.d.mts +44 -0
  643. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +85 -0
  644. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.d.mts +54 -0
  645. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +98 -0
  646. package/dist/lib/esm/command-registrar.d.mts +48 -0
  647. package/dist/lib/esm/command-registrar.mjs +80 -0
  648. package/dist/lib/esm/community-plugins.d.mts +270 -0
  649. package/dist/lib/esm/community-plugins.mjs +222 -0
  650. package/dist/lib/esm/components/abort-signal-component.d.mts +30 -0
  651. package/dist/lib/esm/components/abort-signal-component.mjs +83 -0
  652. package/dist/lib/esm/components/all-windows-event-component.d.mts +84 -0
  653. package/dist/lib/esm/components/all-windows-event-component.mjs +125 -0
  654. package/dist/lib/esm/components/async-error-handler-component.d.mts +30 -0
  655. package/dist/lib/esm/components/async-error-handler-component.mjs +87 -0
  656. package/dist/lib/esm/components/async-events-component.d.mts +15 -0
  657. package/dist/lib/esm/components/async-events-component.mjs +59 -0
  658. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +36 -0
  659. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +101 -0
  660. package/dist/lib/esm/components/component-ex.d.mts +229 -0
  661. package/dist/lib/esm/components/component-ex.mjs +421 -0
  662. package/dist/lib/esm/components/console-debug-component.d.mts +30 -0
  663. package/dist/lib/esm/components/console-debug-component.mjs +81 -0
  664. package/dist/lib/esm/components/core-plugin-toggle-component.d.mts +102 -0
  665. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +113 -0
  666. package/dist/lib/esm/components/disposable-component.d.mts +24 -0
  667. package/dist/lib/esm/components/disposable-component.mjs +65 -0
  668. package/dist/lib/esm/components/embed-extensions-component.d.mts +38 -0
  669. package/dist/lib/esm/components/embed-extensions-component.mjs +85 -0
  670. package/dist/lib/esm/components/generate-markdown-link-default-params-component.d.mts +42 -0
  671. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +81 -0
  672. package/dist/lib/esm/components/index.d.mts +30 -0
  673. package/dist/lib/esm/components/index.mjs +110 -0
  674. package/dist/lib/esm/components/layout-ready-component.d.mts +48 -0
  675. package/dist/lib/esm/components/layout-ready-component.mjs +121 -0
  676. package/dist/lib/esm/components/menu-event-registrar-component.d.mts +52 -0
  677. package/dist/lib/esm/components/menu-event-registrar-component.mjs +107 -0
  678. package/dist/lib/esm/components/monkey-around-component.d.mts +241 -0
  679. package/dist/lib/esm/components/monkey-around-component.mjs +154 -0
  680. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.d.mts +150 -0
  681. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +235 -0
  682. package/dist/lib/esm/components/plugin-context-component.d.mts +36 -0
  683. package/dist/lib/esm/components/plugin-context-component.mjs +94 -0
  684. package/dist/lib/esm/components/plugin-gate-component.d.mts +332 -0
  685. package/dist/lib/esm/components/plugin-gate-component.mjs +472 -0
  686. package/dist/lib/esm/components/plugin-notice-component.d.mts +362 -0
  687. package/dist/lib/esm/components/plugin-notice-component.mjs +543 -0
  688. package/dist/lib/esm/components/plugin-settings-component.d.mts +362 -0
  689. package/dist/lib/esm/components/plugin-settings-component.mjs +562 -0
  690. package/dist/lib/esm/components/plugin-settings-tab-component.d.mts +39 -0
  691. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +81 -0
  692. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +162 -0
  693. package/dist/lib/esm/components/plugin-suggestion-component.mjs +192 -0
  694. package/dist/lib/esm/components/pointer-position-component.d.mts +29 -0
  695. package/dist/lib/esm/components/pointer-position-component.mjs +77 -0
  696. package/dist/lib/esm/components/registry-component.d.mts +37 -0
  697. package/dist/lib/esm/components/registry-component.mjs +98 -0
  698. package/dist/lib/esm/components/release-notes-component.d.mts +129 -0
  699. package/dist/lib/esm/components/release-notes-component.mjs +136 -0
  700. package/dist/lib/esm/components/rename-delete-handler-component.d.mts +165 -0
  701. package/dist/lib/esm/components/rename-delete-handler-component.mjs +1238 -0
  702. package/dist/lib/esm/components/rmdir-guard-component.d.mts +76 -0
  703. package/dist/lib/esm/components/rmdir-guard-component.mjs +100 -0
  704. package/dist/lib/esm/components/settings-migration-component.d.mts +120 -0
  705. package/dist/lib/esm/components/settings-migration-component.mjs +133 -0
  706. package/dist/lib/esm/components/syntax-highlighting-component.d.mts +149 -0
  707. package/dist/lib/esm/components/syntax-highlighting-component.mjs +159 -0
  708. package/dist/lib/esm/components/templates-language-component.d.mts +124 -0
  709. package/dist/lib/esm/components/templates-language-component.mjs +187 -0
  710. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.d.mts +22 -0
  711. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +157 -0
  712. package/dist/lib/esm/constructors/index.d.mts +2 -0
  713. package/dist/lib/esm/constructors/index.mjs +54 -0
  714. package/dist/lib/esm/css-class.d.mts +278 -0
  715. package/dist/lib/esm/css-class.mjs +119 -0
  716. package/dist/lib/esm/data-handler.d.mts +49 -0
  717. package/dist/lib/esm/data-handler.mjs +81 -0
  718. package/dist/lib/esm/dataview-link.d.mts +42 -0
  719. package/dist/lib/esm/dataview-link.mjs +74 -0
  720. package/dist/lib/esm/dataview.d.mts +249 -0
  721. package/dist/lib/esm/dataview.mjs +288 -0
  722. package/dist/lib/esm/debug.d.mts +19 -0
  723. package/dist/lib/esm/debug.mjs +59 -0
  724. package/dist/lib/esm/demo-vault-helper-settings.d.mts +29 -0
  725. package/dist/lib/esm/demo-vault-helper-settings.mjs +50 -0
  726. package/dist/lib/esm/demo-vault-helper.d.mts +61 -0
  727. package/dist/lib/esm/demo-vault-helper.mjs +150 -0
  728. package/dist/lib/esm/demo-vault-naming.d.mts +54 -0
  729. package/dist/lib/esm/demo-vault-naming.mjs +67 -0
  730. package/dist/lib/esm/desktop-demo-vault-opener.d.mts +76 -0
  731. package/dist/lib/esm/desktop-demo-vault-opener.mjs +274 -0
  732. package/dist/lib/esm/desktop-trusted-input.d.mts +288 -0
  733. package/dist/lib/esm/desktop-trusted-input.mjs +206 -0
  734. package/dist/lib/esm/editor-extension-registrar.d.mts +37 -0
  735. package/dist/lib/esm/editor-extension-registrar.mjs +73 -0
  736. package/dist/lib/esm/editor-suggest-registrar.d.mts +36 -0
  737. package/dist/lib/esm/editor-suggest-registrar.mjs +76 -0
  738. package/dist/lib/esm/editor.d.mts +45 -0
  739. package/dist/lib/esm/editor.mjs +115 -0
  740. package/dist/lib/esm/events.d.mts +98 -0
  741. package/dist/lib/esm/events.mjs +81 -0
  742. package/dist/lib/esm/extensions-registrar.d.mts +51 -0
  743. package/dist/lib/esm/extensions-registrar.mjs +73 -0
  744. package/dist/lib/esm/file-change.d.mts +156 -0
  745. package/dist/lib/esm/file-change.mjs +481 -0
  746. package/dist/lib/esm/file-explorer.d.mts +34 -0
  747. package/dist/lib/esm/file-explorer.mjs +68 -0
  748. package/dist/lib/esm/file-manager.d.mts +123 -0
  749. package/dist/lib/esm/file-manager.mjs +169 -0
  750. package/dist/lib/esm/file-system.d.mts +554 -0
  751. package/dist/lib/esm/file-system.mjs +466 -0
  752. package/dist/lib/esm/folder-note.d.mts +166 -0
  753. package/dist/lib/esm/folder-note.mjs +169 -0
  754. package/dist/lib/esm/frontmatter-formatting.d.mts +44 -0
  755. package/dist/lib/esm/frontmatter-formatting.mjs +376 -0
  756. package/dist/lib/esm/frontmatter-link-cache-with-offsets.d.mts +34 -0
  757. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +69 -0
  758. package/dist/lib/esm/frontmatter.d.mts +145 -0
  759. package/dist/lib/esm/frontmatter.mjs +182 -0
  760. package/dist/lib/esm/generated-during-build.d.mts +19 -0
  761. package/dist/lib/esm/generated-during-build.mjs +56 -0
  762. package/dist/lib/esm/hover-link-source-registrar.d.mts +52 -0
  763. package/dist/lib/esm/hover-link-source-registrar.mjs +73 -0
  764. package/dist/lib/esm/html-element.d.mts +98 -0
  765. package/dist/lib/esm/html-element.mjs +94 -0
  766. package/dist/lib/esm/i18n/custom-type-options.d.mts +38 -0
  767. package/dist/lib/esm/i18n/custom-type-options.mjs +51 -0
  768. package/dist/lib/esm/i18n/default-translations.d.mts +15 -0
  769. package/dist/lib/esm/i18n/default-translations.mjs +51 -0
  770. package/dist/lib/esm/i18n/i18n.d.mts +38 -0
  771. package/dist/lib/esm/i18n/i18n.mjs +97 -0
  772. package/dist/lib/esm/i18n/index.d.mts +5 -0
  773. package/dist/lib/esm/i18n/index.mjs +60 -0
  774. package/dist/lib/esm/i18n/locales/en.d.mts +91 -0
  775. package/dist/lib/esm/i18n/locales/en.mjs +135 -0
  776. package/dist/lib/esm/i18n/locales/index.d.mts +3 -0
  777. package/dist/lib/esm/i18n/locales/index.mjs +56 -0
  778. package/dist/lib/esm/i18n/locales/translations-map.d.mts +100 -0
  779. package/dist/lib/esm/i18n/locales/translations-map.mjs +60 -0
  780. package/dist/lib/esm/index.d.mts +96 -0
  781. package/dist/lib/esm/index.mjs +242 -0
  782. package/dist/lib/esm/is-in-obsidian.d.mts +12 -0
  783. package/dist/lib/esm/is-in-obsidian.mjs +67 -0
  784. package/dist/lib/esm/library-styles.d.mts +56 -0
  785. package/dist/lib/esm/library-styles.mjs +80 -0
  786. package/dist/lib/esm/library.d.mts +57 -0
  787. package/dist/lib/esm/library.mjs +91 -0
  788. package/dist/lib/esm/link-name.d.mts +23 -0
  789. package/dist/lib/esm/link-name.mjs +56 -0
  790. package/dist/lib/esm/link-update-progress.d.mts +32 -0
  791. package/dist/lib/esm/link-update-progress.mjs +50 -0
  792. package/dist/lib/esm/link.d.mts +1369 -0
  793. package/dist/lib/esm/link.mjs +996 -0
  794. package/dist/lib/esm/logger.d.mts +37 -0
  795. package/dist/lib/esm/logger.mjs +123 -0
  796. package/dist/lib/esm/loop.d.mts +104 -0
  797. package/dist/lib/esm/loop.mjs +159 -0
  798. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +62 -0
  799. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +77 -0
  800. package/dist/lib/esm/markdown-code-block-processor.d.mts +137 -0
  801. package/dist/lib/esm/markdown-code-block-processor.mjs +364 -0
  802. package/dist/lib/esm/markdown-post-processor-registrar.d.mts +59 -0
  803. package/dist/lib/esm/markdown-post-processor-registrar.mjs +74 -0
  804. package/dist/lib/esm/markdown-view.d.mts +14 -0
  805. package/dist/lib/esm/markdown-view.mjs +62 -0
  806. package/dist/lib/esm/markdown.d.mts +226 -0
  807. package/dist/lib/esm/markdown.mjs +399 -0
  808. package/dist/lib/esm/menu-event-registrar.d.mts +84 -0
  809. package/dist/lib/esm/menu-event-registrar.mjs +50 -0
  810. package/dist/lib/esm/metadata-cache.d.mts +359 -0
  811. package/dist/lib/esm/metadata-cache.mjs +462 -0
  812. package/dist/lib/esm/mobile-trusted-input.d.mts +98 -0
  813. package/dist/lib/esm/mobile-trusted-input.mjs +90 -0
  814. package/dist/lib/esm/modals/alert.d.mts +35 -0
  815. package/dist/lib/esm/modals/alert.mjs +92 -0
  816. package/dist/lib/esm/modals/confirm.d.mts +39 -0
  817. package/dist/lib/esm/modals/confirm.mjs +102 -0
  818. package/dist/lib/esm/modals/index.d.mts +10 -0
  819. package/dist/lib/esm/modals/index.mjs +70 -0
  820. package/dist/lib/esm/modals/minimizable-modal.d.mts +129 -0
  821. package/dist/lib/esm/modals/minimizable-modal.mjs +356 -0
  822. package/dist/lib/esm/modals/modal-command-builder.d.mts +285 -0
  823. package/dist/lib/esm/modals/modal-command-builder.mjs +371 -0
  824. package/dist/lib/esm/modals/modal.d.mts +64 -0
  825. package/dist/lib/esm/modals/modal.mjs +86 -0
  826. package/dist/lib/esm/modals/prompt.d.mts +83 -0
  827. package/dist/lib/esm/modals/prompt.mjs +176 -0
  828. package/dist/lib/esm/modals/select-item.d.mts +55 -0
  829. package/dist/lib/esm/modals/select-item.mjs +112 -0
  830. package/dist/lib/esm/modals/select-option.d.mts +65 -0
  831. package/dist/lib/esm/modals/select-option.mjs +103 -0
  832. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +35 -0
  833. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +55 -0
  834. package/dist/lib/esm/note-priority.d.mts +154 -0
  835. package/dist/lib/esm/note-priority.mjs +143 -0
  836. package/dist/lib/esm/notebook-navigator.d.mts +132 -0
  837. package/dist/lib/esm/notebook-navigator.mjs +72 -0
  838. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +42 -0
  839. package/dist/lib/esm/obsidian-dev-utils-state.mjs +84 -0
  840. package/dist/lib/esm/obsidian-protocol-handler-registrar.d.mts +55 -0
  841. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +76 -0
  842. package/dist/lib/esm/obsidian-settings.d.mts +62 -0
  843. package/dist/lib/esm/obsidian-settings.mjs +89 -0
  844. package/dist/lib/esm/parse-link.d.mts +288 -0
  845. package/dist/lib/esm/parse-link.mjs +436 -0
  846. package/dist/lib/esm/path-settings.d.mts +56 -0
  847. package/dist/lib/esm/path-settings.mjs +184 -0
  848. package/dist/lib/esm/pdf.d.mts +26 -0
  849. package/dist/lib/esm/pdf.mjs +84 -0
  850. package/dist/lib/esm/plugin/index.d.mts +9 -0
  851. package/dist/lib/esm/plugin/index.mjs +68 -0
  852. package/dist/lib/esm/plugin/plugin-api.d.mts +413 -0
  853. package/dist/lib/esm/plugin/plugin-api.mjs +430 -0
  854. package/dist/lib/esm/plugin/plugin-context.d.mts +27 -0
  855. package/dist/lib/esm/plugin/plugin-context.mjs +109 -0
  856. package/dist/lib/esm/plugin/plugin-event-source.d.mts +97 -0
  857. package/dist/lib/esm/plugin/plugin-event-source.mjs +137 -0
  858. package/dist/lib/esm/plugin/plugin-install-state.d.mts +113 -0
  859. package/dist/lib/esm/plugin/plugin-install-state.mjs +109 -0
  860. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +127 -0
  861. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +60 -0
  862. package/dist/lib/esm/plugin/plugin-settings-tab.d.mts +368 -0
  863. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +535 -0
  864. package/dist/lib/esm/plugin/plugin.d.mts +363 -0
  865. package/dist/lib/esm/plugin/plugin.mjs +619 -0
  866. package/dist/lib/esm/plugin/settings-migration-api.d.mts +91 -0
  867. package/dist/lib/esm/plugin/settings-migration-api.mjs +50 -0
  868. package/dist/lib/esm/plugin-cli-handler-registrar.d.mts +64 -0
  869. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +74 -0
  870. package/dist/lib/esm/popovers/field-popover.d.mts +75 -0
  871. package/dist/lib/esm/popovers/field-popover.mjs +96 -0
  872. package/dist/lib/esm/popovers/index.d.mts +4 -0
  873. package/dist/lib/esm/popovers/index.mjs +58 -0
  874. package/dist/lib/esm/popovers/popover-anchor.d.mts +67 -0
  875. package/dist/lib/esm/popovers/popover-anchor.mjs +90 -0
  876. package/dist/lib/esm/popovers/popover.d.mts +78 -0
  877. package/dist/lib/esm/popovers/popover.mjs +140 -0
  878. package/dist/lib/esm/property-entry.d.mts +43 -0
  879. package/dist/lib/esm/property-entry.mjs +81 -0
  880. package/dist/lib/esm/queue.d.mts +93 -0
  881. package/dist/lib/esm/queue.mjs +130 -0
  882. package/dist/lib/esm/react/app-context.d.mts +24 -0
  883. package/dist/lib/esm/react/app-context.mjs +64 -0
  884. package/dist/lib/esm/react/index.d.mts +2 -0
  885. package/dist/lib/esm/react/index.mjs +54 -0
  886. package/dist/lib/esm/reference.d.mts +116 -0
  887. package/dist/lib/esm/reference.mjs +95 -0
  888. package/dist/lib/esm/resource-lock.d.mts +318 -0
  889. package/dist/lib/esm/resource-lock.mjs +1014 -0
  890. package/dist/lib/esm/resource-url.d.mts +31 -0
  891. package/dist/lib/esm/resource-url.mjs +67 -0
  892. package/dist/lib/esm/ribbon-icon-registrar.d.mts +60 -0
  893. package/dist/lib/esm/ribbon-icon-registrar.mjs +74 -0
  894. package/dist/lib/esm/setting-components/checkbox-component.d.mts +69 -0
  895. package/dist/lib/esm/setting-components/checkbox-component.mjs +127 -0
  896. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +132 -0
  897. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +295 -0
  898. package/dist/lib/esm/setting-components/date-component.d.mts +38 -0
  899. package/dist/lib/esm/setting-components/date-component.mjs +91 -0
  900. package/dist/lib/esm/setting-components/date-time-component.d.mts +38 -0
  901. package/dist/lib/esm/setting-components/date-time-component.mjs +91 -0
  902. package/dist/lib/esm/setting-components/email-component.d.mts +49 -0
  903. package/dist/lib/esm/setting-components/email-component.mjs +102 -0
  904. package/dist/lib/esm/setting-components/file-component.d.mts +43 -0
  905. package/dist/lib/esm/setting-components/file-component.mjs +94 -0
  906. package/dist/lib/esm/setting-components/index.d.mts +27 -0
  907. package/dist/lib/esm/setting-components/index.mjs +104 -0
  908. package/dist/lib/esm/setting-components/month-component.d.mts +51 -0
  909. package/dist/lib/esm/setting-components/month-component.mjs +99 -0
  910. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +92 -0
  911. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +167 -0
  912. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +38 -0
  913. package/dist/lib/esm/setting-components/multiple-email-component.mjs +88 -0
  914. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +43 -0
  915. package/dist/lib/esm/setting-components/multiple-file-component.mjs +96 -0
  916. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +109 -0
  917. package/dist/lib/esm/setting-components/multiple-text-component.mjs +186 -0
  918. package/dist/lib/esm/setting-components/number-component.d.mts +56 -0
  919. package/dist/lib/esm/setting-components/number-component.mjs +112 -0
  920. package/dist/lib/esm/setting-components/password-component.d.mts +38 -0
  921. package/dist/lib/esm/setting-components/password-component.mjs +88 -0
  922. package/dist/lib/esm/setting-components/setting-component-wrapper.d.mts +13 -0
  923. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +71 -0
  924. package/dist/lib/esm/setting-components/telephone-component.d.mts +51 -0
  925. package/dist/lib/esm/setting-components/telephone-component.mjs +102 -0
  926. package/dist/lib/esm/setting-components/text-based-component.d.mts +38 -0
  927. package/dist/lib/esm/setting-components/text-based-component.mjs +81 -0
  928. package/dist/lib/esm/setting-components/time-component.d.mts +38 -0
  929. package/dist/lib/esm/setting-components/time-component.mjs +96 -0
  930. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +69 -0
  931. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +128 -0
  932. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +97 -0
  933. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +176 -0
  934. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +99 -0
  935. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +175 -0
  936. package/dist/lib/esm/setting-components/typed-range-text-component.d.mts +35 -0
  937. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +86 -0
  938. package/dist/lib/esm/setting-components/typed-text-component.d.mts +100 -0
  939. package/dist/lib/esm/setting-components/typed-text-component.mjs +146 -0
  940. package/dist/lib/esm/setting-components/url-component.d.mts +49 -0
  941. package/dist/lib/esm/setting-components/url-component.mjs +102 -0
  942. package/dist/lib/esm/setting-components/validator-component.d.mts +23 -0
  943. package/dist/lib/esm/setting-components/validator-component.mjs +150 -0
  944. package/dist/lib/esm/setting-components/value-component-with-change-tracking.d.mts +20 -0
  945. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +50 -0
  946. package/dist/lib/esm/setting-components/week-component.d.mts +51 -0
  947. package/dist/lib/esm/setting-components/week-component.mjs +99 -0
  948. package/dist/lib/esm/setting-ex.d.mts +198 -0
  949. package/dist/lib/esm/setting-ex.mjs +282 -0
  950. package/dist/lib/esm/setting-group-ex.d.mts +26 -0
  951. package/dist/lib/esm/setting-group-ex.mjs +76 -0
  952. package/dist/lib/esm/status-bar-item-registrar.d.mts +36 -0
  953. package/dist/lib/esm/status-bar-item-registrar.mjs +73 -0
  954. package/dist/lib/esm/templater.d.mts +284 -0
  955. package/dist/lib/esm/templater.mjs +181 -0
  956. package/dist/lib/esm/transformers/duration-transformer.d.mts +39 -0
  957. package/dist/lib/esm/transformers/duration-transformer.mjs +93 -0
  958. package/dist/lib/esm/transformers/index.d.mts +2 -0
  959. package/dist/lib/esm/transformers/index.mjs +54 -0
  960. package/dist/lib/esm/trusted-input.d.mts +131 -0
  961. package/dist/lib/esm/trusted-input.mjs +91 -0
  962. package/dist/lib/esm/validation.d.mts +87 -0
  963. package/dist/lib/esm/validation.mjs +95 -0
  964. package/dist/lib/esm/vault-delete.d.mts +82 -0
  965. package/dist/lib/esm/vault-delete.mjs +140 -0
  966. package/dist/lib/esm/vault-transaction.d.mts +163 -0
  967. package/dist/lib/esm/vault-transaction.mjs +333 -0
  968. package/dist/lib/esm/vault.d.mts +506 -0
  969. package/dist/lib/esm/vault.mjs +612 -0
  970. package/dist/lib/esm/view-registrar.d.mts +52 -0
  971. package/dist/lib/esm/view-registrar.mjs +73 -0
  972. package/dist/lib/esm/workspace.d.mts +81 -0
  973. package/dist/lib/esm/workspace.mjs +92 -0
  974. package/dist/styles.css +497 -0
  975. package/i18n/custom-type-options/package.json +6 -0
  976. package/i18n/default-translations/package.json +6 -0
  977. package/i18n/i18n/package.json +6 -0
  978. package/i18n/index/package.json +6 -0
  979. package/i18n/locales/en/package.json +6 -0
  980. package/i18n/locales/index/package.json +6 -0
  981. package/i18n/locales/package.json +6 -0
  982. package/i18n/locales/translations-map/package.json +6 -0
  983. package/i18n/package.json +6 -0
  984. package/modals/alert/package.json +6 -0
  985. package/modals/confirm/package.json +6 -0
  986. package/modals/index/package.json +6 -0
  987. package/modals/minimizable-modal/package.json +6 -0
  988. package/modals/modal/package.json +6 -0
  989. package/modals/modal-command-builder/package.json +6 -0
  990. package/modals/package.json +6 -0
  991. package/modals/prompt/package.json +6 -0
  992. package/modals/select-item/package.json +6 -0
  993. package/modals/select-option/package.json +6 -0
  994. package/modals/suggest-modal-command-builder/package.json +6 -0
  995. package/package.json +488 -13
  996. package/plugin/index/package.json +6 -0
  997. package/plugin/package.json +6 -0
  998. package/plugin/plugin/package.json +6 -0
  999. package/plugin/plugin-api/package.json +6 -0
  1000. package/plugin/plugin-context/package.json +6 -0
  1001. package/plugin/plugin-event-source/package.json +6 -0
  1002. package/plugin/plugin-install-state/package.json +6 -0
  1003. package/plugin/plugin-lifecycle-events/package.json +6 -0
  1004. package/plugin/plugin-settings-tab/package.json +6 -0
  1005. package/plugin/settings-migration-api/package.json +6 -0
  1006. package/popovers/field-popover/package.json +6 -0
  1007. package/popovers/index/package.json +6 -0
  1008. package/popovers/package.json +6 -0
  1009. package/popovers/popover/package.json +6 -0
  1010. package/popovers/popover-anchor/package.json +6 -0
  1011. package/react/app-context/package.json +6 -0
  1012. package/react/index/package.json +6 -0
  1013. package/react/package.json +6 -0
  1014. package/setting-components/checkbox-component/package.json +6 -0
  1015. package/setting-components/code-highlighter-component/package.json +6 -0
  1016. package/setting-components/date-component/package.json +6 -0
  1017. package/setting-components/date-time-component/package.json +6 -0
  1018. package/setting-components/email-component/package.json +6 -0
  1019. package/setting-components/file-component/package.json +6 -0
  1020. package/setting-components/index/package.json +6 -0
  1021. package/setting-components/month-component/package.json +6 -0
  1022. package/setting-components/multiple-dropdown-component/package.json +6 -0
  1023. package/setting-components/multiple-email-component/package.json +6 -0
  1024. package/setting-components/multiple-file-component/package.json +6 -0
  1025. package/setting-components/multiple-text-component/package.json +6 -0
  1026. package/setting-components/number-component/package.json +6 -0
  1027. package/setting-components/package.json +6 -0
  1028. package/setting-components/password-component/package.json +6 -0
  1029. package/setting-components/setting-component-wrapper/package.json +6 -0
  1030. package/setting-components/telephone-component/package.json +6 -0
  1031. package/setting-components/text-based-component/package.json +6 -0
  1032. package/setting-components/time-component/package.json +6 -0
  1033. package/setting-components/tri-state-checkbox-component/package.json +6 -0
  1034. package/setting-components/typed-dropdown-component/package.json +6 -0
  1035. package/setting-components/typed-multiple-dropdown-component/package.json +6 -0
  1036. package/setting-components/typed-range-text-component/package.json +6 -0
  1037. package/setting-components/typed-text-component/package.json +6 -0
  1038. package/setting-components/url-component/package.json +6 -0
  1039. package/setting-components/validator-component/package.json +6 -0
  1040. package/setting-components/value-component-with-change-tracking/package.json +6 -0
  1041. package/setting-components/week-component/package.json +6 -0
  1042. package/transformers/duration-transformer/package.json +6 -0
  1043. package/transformers/index/package.json +6 -0
  1044. package/transformers/package.json +6 -0
@@ -0,0 +1,1014 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ (function initEsm() {
45
+ ensureDisposeSymbols();
46
+ ensureBrowserProcess();
47
+ })();
48
+ })();
49
+
50
+ import { snapshot } from "@mnaoumov/typescript-lib/array";
51
+ import { convertAsyncToSync } from "@mnaoumov/typescript-lib/async";
52
+ import { Beeper } from "@mnaoumov/typescript-lib/beeper";
53
+ import {
54
+ CallbackDisposable,
55
+ MultipleDisposeBehavior
56
+ } from "@mnaoumov/typescript-lib/disposable";
57
+ import { noop } from "@mnaoumov/typescript-lib/function";
58
+ import { assertNonNullable } from "@mnaoumov/typescript-lib/type-guards";
59
+ import { ViewType } from "@obsidian-typings/obsidian-public-latest/implementations";
60
+ import {
61
+ FileManager,
62
+ MarkdownView,
63
+ Menu,
64
+ setIcon,
65
+ setTooltip,
66
+ Vault
67
+ } from "obsidian";
68
+ import { ComponentEx } from "./components/component-ex.mjs";
69
+ import { MonkeyAroundComponent } from "./components/monkey-around-component.mjs";
70
+ import { toggleEditorReadOnly } from "./editor.mjs";
71
+ import { getPath } from "./file-system.mjs";
72
+ import { appendCodeBlock } from "./html-element.mjs";
73
+ import { t } from "./i18n/i18n.mjs";
74
+ import { confirm } from "./modals/confirm.mjs";
75
+ import { getObsidianDevUtilsState } from "./obsidian-dev-utils-state.mjs";
76
+ import {
77
+ isChild,
78
+ isChildOrSelf
79
+ } from "./vault.mjs";
80
+ const RESOURCE_LOCK_STATE_KEY = "resourceLock";
81
+ const LOCK_ICON_ID = "lock";
82
+ const LOCK_INDICATOR_CSS_CLASS = "obsidian-dev-utils-lock-indicator";
83
+ const LOCK_INDICATOR_FLASH_CSS_CLASS = "obsidian-dev-utils-lock-indicator-flash";
84
+ const STATUS_BAR_ITEM_CSS_CLASS = "status-bar-item";
85
+ const STATUS_BAR_CSS_SELECTOR = ".status-bar";
86
+ const UNLOCK_ICON_ID = "unlock";
87
+ const MIDDLE_MOUSE_BUTTON = 1;
88
+ class ResourceLockEventsComponent extends ComponentEx {
89
+ app;
90
+ onChange;
91
+ onExternalMutation;
92
+ onFileMenu;
93
+ onRename;
94
+ constructor(params) {
95
+ super();
96
+ this.app = params.app;
97
+ this.onChange = params.onChange;
98
+ this.onExternalMutation = params.onExternalMutation;
99
+ this.onFileMenu = params.onFileMenu;
100
+ this.onRename = params.onRename;
101
+ }
102
+ onload() {
103
+ super.onload();
104
+ this.registerEvent(this.app.workspace.on("active-leaf-change", this.onChange));
105
+ this.registerEvent(this.app.workspace.on("layout-change", this.onChange));
106
+ this.registerEvent(this.app.workspace.on("file-open", this.onChange));
107
+ this.registerEvent(this.app.workspace.on("file-menu", this.onFileMenu));
108
+ this.registerEvent(this.app.vault.on("create", (file) => {
109
+ this.onExternalMutation(file.path);
110
+ }));
111
+ this.registerEvent(this.app.vault.on("delete", (file) => {
112
+ this.onExternalMutation(file.path);
113
+ }));
114
+ this.registerEvent(this.app.vault.on("rename", (file, oldPath) => {
115
+ this.onRename(oldPath, file.path);
116
+ this.onExternalMutation(oldPath);
117
+ this.onExternalMutation(file.path);
118
+ }));
119
+ this.registerEvent(this.app.metadataCache.on("deleted", (file) => {
120
+ this.onExternalMutation(file.path);
121
+ }));
122
+ }
123
+ }
124
+ class ResourceLockManager {
125
+ beeper = new Beeper();
126
+ // The inner sets are mutable so a rename can re-key the paths of an in-flight bypass scope in place;
127
+ // the scope's `Disposable` deletes by set identity, so mutating the contents cannot orphan it.
128
+ bypassPathSets = /* @__PURE__ */ new Set();
129
+ eventsComponent = null;
130
+ indicatorsByView = /* @__PURE__ */ new Map();
131
+ lockEntriesByPath = /* @__PURE__ */ new Map();
132
+ mutationBlockerComponent = null;
133
+ statusBarItemEl = null;
134
+ bypass(app, pathsOrFiles) {
135
+ const bypassedPaths = new Set(pathsOrFiles.map((pathOrFile) => getPath(app, pathOrFile)));
136
+ this.bypassPathSets.add(bypassedPaths);
137
+ return new CallbackDisposable({
138
+ callback: () => {
139
+ this.bypassPathSets.delete(bypassedPaths);
140
+ },
141
+ multipleDisposeBehavior: MultipleDisposeBehavior.Ignore
142
+ });
143
+ }
144
+ /**
145
+ * Fully unlocks the note at the given path. Resolves the lock covering it — the path itself when
146
+ * directly locked, otherwise the enclosing `subtree`-locked folder — then aborts every
147
+ * {@link AbortController} registered on that owner (cancelling the operations that took the locks)
148
+ * AND removes the owner's lock entries (releasing the lock unconditionally). Unlike
149
+ * {@link requestUnlock}, which only aborts the exact path's controllers and relies on each operation
150
+ * releasing its own lock, this resolves ancestor coverage and always releases — so a note held by an
151
+ * indefinitely-held lock is guaranteed to become editable. A no-op when nothing covers the path.
152
+ *
153
+ * @param app - The Obsidian app instance.
154
+ * @param pathOrFile - The path or file of the note to unlock.
155
+ */
156
+ forceUnlock(app, pathOrFile) {
157
+ const ownerPath = this.resolveLockOwnerPath(app, getPath(app, pathOrFile));
158
+ if (ownerPath === null) {
159
+ return;
160
+ }
161
+ this.abortAndReleaseEntries(app, ownerPath);
162
+ }
163
+ isLocked(app, pathOrFile) {
164
+ return this.isPathLocked(getPath(app, pathOrFile));
165
+ }
166
+ /**
167
+ * Checks whether the given path is locked directly or is covered by a `subtree`-locked ancestor
168
+ * folder.
169
+ *
170
+ * @param app - The Obsidian app instance.
171
+ * @param pathOrFile - The path or file to check.
172
+ * @returns `true` if the path is itself locked or lies under a `subtree`-locked folder.
173
+ */
174
+ isLockedByAncestor(app, pathOrFile) {
175
+ return this.resolveLockOwnerPath(app, getPath(app, pathOrFile)) !== null;
176
+ }
177
+ /**
178
+ * Checks whether the given path is covered by a mutation-blocking lock (one taken with
179
+ * `blocksMutations`) directly or on a `subtree`-locked ancestor folder.
180
+ *
181
+ * @param app - The Obsidian app instance.
182
+ * @param pathOrFile - The path or file to check.
183
+ * @returns `true` if a mutation of the path is currently blocked.
184
+ */
185
+ isMutationBlockedByAncestor(app, pathOrFile) {
186
+ const path = getPath(app, pathOrFile);
187
+ const exactEntries = this.lockEntriesByPath.get(path);
188
+ if (exactEntries?.some((entry) => entry.blocksMutations)) {
189
+ return true;
190
+ }
191
+ for (const [lockedPath, entries] of this.lockEntriesByPath) {
192
+ if (entries.some((entry) => entry.mode === "subtree" && entry.blocksMutations) && isChild({ app, childPathOrFile: path, parentPathOrFile: lockedPath })) {
193
+ return true;
194
+ }
195
+ }
196
+ return false;
197
+ }
198
+ lock(params) {
199
+ const { app } = params;
200
+ const path = getPath(app, params.pathOrFile);
201
+ const entry = {
202
+ abortController: params.abortController ?? null,
203
+ blocksMutations: params.blocksMutations ?? false,
204
+ mode: params.mode ?? "file",
205
+ onUnlockRequested: params.onUnlockRequested ?? null,
206
+ operationName: params.operationName,
207
+ path,
208
+ pluginId: params.pluginId,
209
+ shouldReleaseOnAbort: params.shouldReleaseOnAbort ?? false
210
+ };
211
+ let entries = this.lockEntriesByPath.get(path);
212
+ if (!entries) {
213
+ entries = [];
214
+ this.lockEntriesByPath.set(path, entries);
215
+ }
216
+ entries.push(entry);
217
+ this.ensureSubscribed(app);
218
+ if (entry.blocksMutations) {
219
+ this.ensureBlockerInstalled(app);
220
+ }
221
+ this.wireReleaseOnAbort(app, entry);
222
+ this.reconcile(app);
223
+ return new CallbackDisposable({
224
+ callback: () => {
225
+ this.removeEntry(app, entry);
226
+ },
227
+ multipleDisposeBehavior: MultipleDisposeBehavior.Ignore
228
+ });
229
+ }
230
+ /**
231
+ * Aborts every {@link AbortController} currently registered for the note at the given path, which
232
+ * cancels the operations holding the lock. Each operation releases its own lock in its `finally`
233
+ * when it observes the abort, so this does not unlock the path directly. A no-op when no controller
234
+ * is registered for the path.
235
+ *
236
+ * @param app - The Obsidian app instance.
237
+ * @param pathOrFile - The path or file of the note to request an unlock for.
238
+ */
239
+ requestUnlock(app, pathOrFile) {
240
+ const entries = this.lockEntriesByPath.get(getPath(app, pathOrFile));
241
+ if (!entries) {
242
+ return;
243
+ }
244
+ for (const entry of entries) {
245
+ entry.abortController?.abort();
246
+ }
247
+ }
248
+ unlock(app, pathOrFile, pluginId) {
249
+ const path = getPath(app, pathOrFile);
250
+ const entries = this.lockEntriesByPath.get(path);
251
+ if (!entries) {
252
+ return;
253
+ }
254
+ const index = entries.findIndex((entry) => entry.pluginId === pluginId);
255
+ if (index === -1) {
256
+ return;
257
+ }
258
+ entries.splice(index, 1);
259
+ if (entries.length === 0) {
260
+ this.lockEntriesByPath.delete(path);
261
+ }
262
+ this.reconcileAndCleanup(app);
263
+ }
264
+ unlockAllForPlugin(app, pluginId) {
265
+ for (const [path, entries] of this.lockEntriesByPath) {
266
+ const remaining = entries.filter((entry) => entry.pluginId !== pluginId);
267
+ if (remaining.length === 0) {
268
+ this.lockEntriesByPath.delete(path);
269
+ } else if (remaining.length !== entries.length) {
270
+ this.lockEntriesByPath.set(path, remaining);
271
+ }
272
+ }
273
+ this.reconcileAndCleanup(app);
274
+ }
275
+ /**
276
+ * Aborts every {@link AbortController} on the given (already-resolved) owner path's lock entries —
277
+ * cancelling the owning operations — and removes those entries, releasing the lock. The entries
278
+ * snapshot is copied first because an entry's `shouldReleaseOnAbort` abort listener mutates the
279
+ * array as it fires. Always leaves the owner path with no entries.
280
+ *
281
+ * @param app - The Obsidian app instance.
282
+ * @param ownerPath - The directly-locked owner path whose entries to abort and release.
283
+ */
284
+ abortAndReleaseEntries(app, ownerPath) {
285
+ const entries = this.lockEntriesByPath.get(ownerPath);
286
+ assertNonNullable(entries);
287
+ for (const entry of snapshot(entries)) {
288
+ entry.abortController?.abort();
289
+ }
290
+ this.lockEntriesByPath.delete(ownerPath);
291
+ this.reconcileAndCleanup(app);
292
+ }
293
+ addUnlockMenuItem(app, menu, path) {
294
+ menu.addItem((item) => {
295
+ item.setTitle(t(($) => $.obsidianDevUtils.resourceLock.unlockMenuItem)).setIcon(UNLOCK_ICON_ID).onClick(convertAsyncToSync(async () => {
296
+ const isConfirmed = await confirm({
297
+ app,
298
+ message: this.unlockConfirmMessage(app, path),
299
+ title: t(($) => $.obsidianDevUtils.resourceLock.unlockConfirmTitle)
300
+ });
301
+ if (isConfirmed) {
302
+ this.abortAndReleaseEntries(app, path);
303
+ }
304
+ }));
305
+ });
306
+ }
307
+ createIndicators(app, view, tooltip) {
308
+ const getOwnerPath = () => this.resolveViewOwnerPath(app, view);
309
+ const actionIconEl = view.addAction(LOCK_ICON_ID, tooltip, noop);
310
+ this.registerUnlockMenu(app, actionIconEl, getOwnerPath);
311
+ let tabIconEl = null;
312
+ const tabStatusContainerEl = view.leaf.tabHeaderStatusContainerEl;
313
+ if (tabStatusContainerEl) {
314
+ tabIconEl = tabStatusContainerEl.createSpan({ cls: LOCK_INDICATOR_CSS_CLASS });
315
+ setIcon(tabIconEl, LOCK_ICON_ID);
316
+ setTooltip(tabIconEl, tooltip);
317
+ this.registerUnlockMenu(app, tabIconEl, getOwnerPath);
318
+ }
319
+ const onTypeAttempt = () => {
320
+ this.flashIndicators(view);
321
+ this.beeper.beep();
322
+ };
323
+ view.contentEl.addEventListener("beforeinput", onTypeAttempt);
324
+ return {
325
+ actionIconEl,
326
+ disposeTypeListener: () => {
327
+ view.contentEl.removeEventListener("beforeinput", onTypeAttempt);
328
+ },
329
+ tabIconEl
330
+ };
331
+ }
332
+ ensureBlockerInstalled(app) {
333
+ if (this.mutationBlockerComponent) {
334
+ return;
335
+ }
336
+ this.mutationBlockerComponent = new ResourceLockMutationBlockerComponent({
337
+ shouldBlockMutation: (path) => this.shouldBlockMutation(app, path)
338
+ });
339
+ this.mutationBlockerComponent.load();
340
+ }
341
+ ensureSubscribed(app) {
342
+ if (this.eventsComponent) {
343
+ return;
344
+ }
345
+ this.eventsComponent = new ResourceLockEventsComponent({
346
+ app,
347
+ onChange: () => {
348
+ this.reconcile(app);
349
+ },
350
+ onExternalMutation: (path) => {
351
+ this.handleExternalMutation(app, path);
352
+ },
353
+ onFileMenu: (menu, file) => {
354
+ this.handleFileMenu(app, menu, file);
355
+ },
356
+ onRename: (oldPath, newPath) => {
357
+ this.handleRename(app, oldPath, newPath);
358
+ }
359
+ });
360
+ this.eventsComponent.load();
361
+ }
362
+ flashElement(element) {
363
+ element.removeClass(LOCK_INDICATOR_FLASH_CSS_CLASS);
364
+ element.getBoundingClientRect();
365
+ element.addClass(LOCK_INDICATOR_FLASH_CSS_CLASS);
366
+ }
367
+ flashIndicators(view) {
368
+ const indicators = this.indicatorsByView.get(view);
369
+ for (const element of [indicators?.actionIconEl, indicators?.tabIconEl, this.statusBarItemEl]) {
370
+ if (element) {
371
+ this.flashElement(element);
372
+ }
373
+ }
374
+ }
375
+ /**
376
+ * Reacts to a vault/metadata event on a path. If the path is mutation-blocked and NOT covered by an
377
+ * active bypass scope, the change bypassed the blocker patch (sync / filesystem / a raw-adapter
378
+ * write) — an intruder. Abort the `abortController` of every mutation-blocking lock covering the path
379
+ * so the owning operation cancels and rolls back. A no-op for the owner's own (bypassed) mutations,
380
+ * for unblocked paths, and for blocking locks with no `abortController`.
381
+ *
382
+ * @param app - The Obsidian app instance.
383
+ * @param path - The path the event fired on.
384
+ */
385
+ handleExternalMutation(app, path) {
386
+ if (!this.isMutationBlockedByAncestor(app, path) || this.isBypassed(app, path)) {
387
+ return;
388
+ }
389
+ for (const [lockedPath, entries] of this.lockEntriesByPath) {
390
+ for (const entry of entries) {
391
+ if (!entry.blocksMutations || !entry.abortController) {
392
+ continue;
393
+ }
394
+ const doesCoverPath = lockedPath === path || entry.mode === "subtree" && isChild({ app, childPathOrFile: path, parentPathOrFile: lockedPath });
395
+ if (doesCoverPath) {
396
+ entry.abortController.abort();
397
+ }
398
+ }
399
+ }
400
+ }
401
+ handleFileMenu(app, menu, file) {
402
+ const ownerPath = this.resolveLockOwnerPath(app, file.path);
403
+ if (ownerPath === null) {
404
+ return;
405
+ }
406
+ this.addUnlockMenuItem(app, menu, ownerPath);
407
+ }
408
+ /**
409
+ * Re-keys the registry onto a renamed path, so a lock follows the resource it was taken on. Moves
410
+ * the entries of the renamed path AND of every descendant key (a folder rename changes a whole path
411
+ * prefix), and rebases every active {@link ResourceLockManager.bypass} scope the same way — without
412
+ * that second half an operation that renames a folder it locked would have its OWN later mutations
413
+ * read as intruders.
414
+ *
415
+ * Idempotent: a path that no longer matches is left alone, so it does not matter whether Obsidian
416
+ * emits the folder's rename event before or after its descendants'.
417
+ *
418
+ * @param app - The Obsidian app instance.
419
+ * @param oldPath - The path the resource was renamed from.
420
+ * @param newPath - The path the resource was renamed to.
421
+ */
422
+ handleRename(app, oldPath, newPath) {
423
+ const movedEntriesByPath = /* @__PURE__ */ new Map();
424
+ for (const [lockedPath, entries] of this.lockEntriesByPath) {
425
+ const rebasedPath = rebasePath(lockedPath, oldPath, newPath);
426
+ if (rebasedPath === null) {
427
+ continue;
428
+ }
429
+ for (const entry of entries) {
430
+ entry.path = rebasedPath;
431
+ }
432
+ movedEntriesByPath.set(rebasedPath, entries);
433
+ this.lockEntriesByPath.delete(lockedPath);
434
+ }
435
+ for (const [rebasedPath, entries] of movedEntriesByPath) {
436
+ const existingEntries = this.lockEntriesByPath.get(rebasedPath);
437
+ if (existingEntries) {
438
+ existingEntries.push(...entries);
439
+ } else {
440
+ this.lockEntriesByPath.set(rebasedPath, entries);
441
+ }
442
+ }
443
+ for (const bypassedPaths of this.bypassPathSets) {
444
+ const rebasedBypassedPaths = /* @__PURE__ */ new Map();
445
+ for (const bypassedPath of bypassedPaths) {
446
+ const rebasedPath = rebasePath(bypassedPath, oldPath, newPath);
447
+ if (rebasedPath !== null) {
448
+ rebasedBypassedPaths.set(bypassedPath, rebasedPath);
449
+ }
450
+ }
451
+ for (const [bypassedPath, rebasedPath] of rebasedBypassedPaths) {
452
+ bypassedPaths.delete(bypassedPath);
453
+ bypassedPaths.add(rebasedPath);
454
+ }
455
+ }
456
+ this.reconcile(app);
457
+ }
458
+ hasBlockingLock() {
459
+ for (const entries of this.lockEntriesByPath.values()) {
460
+ if (entries.some((entry) => entry.blocksMutations)) {
461
+ return true;
462
+ }
463
+ }
464
+ return false;
465
+ }
466
+ /**
467
+ * Checks whether the path is covered by an active {@link ResourceLockManager.bypass} scope — the
468
+ * owner declaring that its own mutations of the path (and, for a folder, its subtree) are sanctioned.
469
+ *
470
+ * @param app - The Obsidian app instance.
471
+ * @param path - The path being mutated.
472
+ * @returns `true` if some active bypass scope covers the path.
473
+ */
474
+ isBypassed(app, path) {
475
+ for (const bypassedPaths of this.bypassPathSets) {
476
+ for (const bypassedPath of bypassedPaths) {
477
+ if (isChildOrSelf({ app, childPathOrFile: path, parentPathOrFile: bypassedPath })) {
478
+ return true;
479
+ }
480
+ }
481
+ }
482
+ return false;
483
+ }
484
+ isPathLocked(path) {
485
+ return (this.lockEntriesByPath.get(path)?.length ?? 0) > 0;
486
+ }
487
+ /**
488
+ * Builds the deduplicated list of `(plugin name, operation name)` pairs describing the locks on a
489
+ * path — one per distinct plugin+operation. Drives the unlock confirmation, so the user sees exactly
490
+ * which operations an unlock would cancel. Only ever called for a locked path, so its entries are
491
+ * always present.
492
+ *
493
+ * @param app - The Obsidian app instance.
494
+ * @param path - The directly-locked path whose lock descriptors to build.
495
+ * @returns The distinct lock descriptors covering the path.
496
+ */
497
+ lockDescriptors(app, path) {
498
+ const entries = this.lockEntriesByPath.get(path);
499
+ assertNonNullable(entries);
500
+ const seen = /* @__PURE__ */ new Set();
501
+ const descriptors = [];
502
+ for (const entry of entries) {
503
+ const pluginName = app.plugins.manifests[entry.pluginId]?.name ?? entry.pluginId;
504
+ const key = `${pluginName}
505
+ ${entry.operationName}`;
506
+ if (seen.has(key)) {
507
+ continue;
508
+ }
509
+ seen.add(key);
510
+ descriptors.push({ operationName: entry.operationName, pluginName });
511
+ }
512
+ return descriptors;
513
+ }
514
+ lockingPluginNames(app, path) {
515
+ const entries = this.lockEntriesByPath.get(path);
516
+ assertNonNullable(entries);
517
+ const pluginIds = [...new Set(entries.map((entry) => entry.pluginId))];
518
+ return pluginIds.map((pluginId) => app.plugins.manifests[pluginId]?.name ?? pluginId);
519
+ }
520
+ lockTooltip(app, path) {
521
+ const header = t(($) => $.obsidianDevUtils.resourceLock.lockedByTooltip);
522
+ return [header, ...this.lockingPluginNames(app, path)].join("\n");
523
+ }
524
+ reconcile(app) {
525
+ const viewsToLock = /* @__PURE__ */ new Set();
526
+ for (const leaf of app.workspace.getLeavesOfType(ViewType.Markdown)) {
527
+ const view = leaf.view;
528
+ if (!(view instanceof MarkdownView)) {
529
+ continue;
530
+ }
531
+ const path = view.file?.path;
532
+ if (path === void 0) {
533
+ continue;
534
+ }
535
+ const ownerPath = this.resolveLockOwnerPath(app, path);
536
+ if (ownerPath === null) {
537
+ continue;
538
+ }
539
+ viewsToLock.add(view);
540
+ const tooltip = this.lockTooltip(app, ownerPath);
541
+ toggleEditorReadOnly(view.editor, true);
542
+ const indicators = this.indicatorsByView.get(view);
543
+ if (indicators) {
544
+ this.updateIndicatorTooltips(indicators, tooltip);
545
+ } else {
546
+ this.indicatorsByView.set(view, this.createIndicators(app, view, tooltip));
547
+ }
548
+ }
549
+ for (const [view, indicators] of this.indicatorsByView) {
550
+ if (viewsToLock.has(view)) {
551
+ continue;
552
+ }
553
+ toggleEditorReadOnly(view.editor, false);
554
+ indicators.disposeTypeListener();
555
+ indicators.actionIconEl.remove();
556
+ indicators.tabIconEl?.remove();
557
+ this.indicatorsByView.delete(view);
558
+ }
559
+ this.updateStatusBar(app);
560
+ }
561
+ reconcileAndCleanup(app) {
562
+ this.reconcile(app);
563
+ if (this.lockEntriesByPath.size === 0) {
564
+ this.eventsComponent?.unload();
565
+ this.eventsComponent = null;
566
+ }
567
+ if (this.hasBlockingLock()) {
568
+ return;
569
+ }
570
+ this.mutationBlockerComponent?.unload();
571
+ this.mutationBlockerComponent = null;
572
+ }
573
+ registerUnlockMenu(app, element, getContextPath) {
574
+ const openUnlockMenu = ($event) => {
575
+ $event.preventDefault();
576
+ const path = getContextPath();
577
+ if (path === void 0) {
578
+ return;
579
+ }
580
+ const menu = new Menu();
581
+ this.addUnlockMenuItem(app, menu, path);
582
+ menu.showAtMouseEvent($event);
583
+ };
584
+ element.addEventListener("click", openUnlockMenu);
585
+ element.addEventListener("contextmenu", openUnlockMenu);
586
+ element.addEventListener("auxclick", ($event) => {
587
+ if ($event.button === MIDDLE_MOUSE_BUTTON) {
588
+ openUnlockMenu($event);
589
+ }
590
+ });
591
+ }
592
+ removeEntry(app, entry) {
593
+ const entries = this.lockEntriesByPath.get(entry.path);
594
+ if (!entries) {
595
+ return;
596
+ }
597
+ const index = entries.indexOf(entry);
598
+ if (index === -1) {
599
+ return;
600
+ }
601
+ entries.splice(index, 1);
602
+ if (entries.length === 0) {
603
+ this.lockEntriesByPath.delete(entry.path);
604
+ }
605
+ this.reconcileAndCleanup(app);
606
+ }
607
+ /**
608
+ * Resolves which locked path (if any) covers the given path: the path itself when directly locked,
609
+ * otherwise the longest `subtree`-locked ancestor folder that contains it (longest so a nested
610
+ * subtree lock wins deterministically over an outer one).
611
+ *
612
+ * @param app - The Obsidian app instance.
613
+ * @param path - The path to resolve an owner lock for.
614
+ * @returns The covering locked path, or `null` when nothing covers it.
615
+ */
616
+ resolveLockOwnerPath(app, path) {
617
+ if (this.isPathLocked(path)) {
618
+ return path;
619
+ }
620
+ let bestOwnerPath = null;
621
+ for (const [lockedPath, entries] of this.lockEntriesByPath) {
622
+ const hasSubtreeLock = entries.some((entry) => entry.mode === "subtree");
623
+ if (hasSubtreeLock && isChild({ app, childPathOrFile: path, parentPathOrFile: lockedPath }) && (bestOwnerPath === null || lockedPath.length > bestOwnerPath.length)) {
624
+ bestOwnerPath = lockedPath;
625
+ }
626
+ }
627
+ return bestOwnerPath;
628
+ }
629
+ /**
630
+ * Resolves the lock covering the note a view currently shows — its own path when directly locked,
631
+ * otherwise the enclosing `subtree`-locked folder. Read at click time by the view's lock indicators,
632
+ * so it reflects renames of the note and of the locked folder alike.
633
+ *
634
+ * @param app - The Obsidian app instance.
635
+ * @param view - The view whose current file to resolve an owner lock for.
636
+ * @returns The covering locked path, or `undefined` when the view has no file or nothing covers it.
637
+ */
638
+ resolveViewOwnerPath(app, view) {
639
+ const path = view.file?.path;
640
+ return path === void 0 ? void 0 : this.resolveLockOwnerPath(app, path) ?? void 0;
641
+ }
642
+ /**
643
+ * Decides whether a mutation of the path must be blocked: `true` when the path is mutation-blocked
644
+ * and not covered by any active {@link ResourceLockManager.bypass} scope.
645
+ *
646
+ * @param app - The Obsidian app instance.
647
+ * @param path - The path being mutated.
648
+ * @returns `true` to reject the mutation, `false` to allow it.
649
+ */
650
+ shouldBlockMutation(app, path) {
651
+ return this.isMutationBlockedByAncestor(app, path) && !this.isBypassed(app, path);
652
+ }
653
+ unlockConfirmMessage(app, path) {
654
+ const fragment = createFragment();
655
+ fragment.appendText(t(($) => $.obsidianDevUtils.resourceLock.unlockConfirmMessage));
656
+ for (const descriptor of this.lockDescriptors(app, path)) {
657
+ fragment.createEl("br");
658
+ appendCodeBlock(fragment, descriptor.pluginName);
659
+ fragment.appendText(`: ${descriptor.operationName}`);
660
+ }
661
+ return fragment;
662
+ }
663
+ updateIndicatorTooltips(indicators, tooltip) {
664
+ setTooltip(indicators.actionIconEl, tooltip);
665
+ if (indicators.tabIconEl) {
666
+ setTooltip(indicators.tabIconEl, tooltip);
667
+ }
668
+ }
669
+ updateStatusBar(app) {
670
+ const activeView = app.workspace.getActiveViewOfType(MarkdownView);
671
+ const activePath = activeView?.file?.path;
672
+ const activeOwnerPath = activePath === void 0 ? null : this.resolveLockOwnerPath(app, activePath);
673
+ if (activeOwnerPath === null || !activeView) {
674
+ this.statusBarItemEl?.remove();
675
+ this.statusBarItemEl = null;
676
+ return;
677
+ }
678
+ if (!this.statusBarItemEl) {
679
+ const statusBarEl = activeView.containerEl.ownerDocument.body.querySelector(STATUS_BAR_CSS_SELECTOR);
680
+ if (!statusBarEl) {
681
+ return;
682
+ }
683
+ this.statusBarItemEl = statusBarEl.createDiv({ cls: [STATUS_BAR_ITEM_CSS_CLASS, LOCK_INDICATOR_CSS_CLASS] });
684
+ setIcon(this.statusBarItemEl, LOCK_ICON_ID);
685
+ this.registerUnlockMenu(app, this.statusBarItemEl, () => {
686
+ const path = app.workspace.getActiveViewOfType(MarkdownView)?.file?.path;
687
+ return path === void 0 ? void 0 : this.resolveLockOwnerPath(app, path) ?? void 0;
688
+ });
689
+ }
690
+ setTooltip(this.statusBarItemEl, this.lockTooltip(app, activeOwnerPath));
691
+ }
692
+ /**
693
+ * Wires an opt-in `abort` listener for a lock entry: when the entry's controller aborts, releases
694
+ * the entry (if {@link LockEntry.shouldReleaseOnAbort}) and/or invokes
695
+ * {@link LockEntry.onUnlockRequested}. A no-op when the entry has no controller or neither opt-in is
696
+ * set, so transactional locks keep releasing via their own cleanup.
697
+ *
698
+ * @param app - The Obsidian app instance.
699
+ * @param entry - The lock entry whose controller to observe.
700
+ */
701
+ wireReleaseOnAbort(app, entry) {
702
+ const { onUnlockRequested, shouldReleaseOnAbort } = entry;
703
+ if (!entry.abortController || !shouldReleaseOnAbort && !onUnlockRequested) {
704
+ return;
705
+ }
706
+ entry.abortController.signal.addEventListener("abort", () => {
707
+ if (shouldReleaseOnAbort) {
708
+ this.removeEntry(app, entry);
709
+ }
710
+ onUnlockRequested?.();
711
+ }, { once: true });
712
+ }
713
+ }
714
+ class ResourceLockMutationBlockerComponent extends MonkeyAroundComponent {
715
+ shouldBlockMutation;
716
+ constructor(params) {
717
+ super();
718
+ this.shouldBlockMutation = params.shouldBlockMutation;
719
+ }
720
+ onload() {
721
+ super.onload();
722
+ this.registerMethodPatch({
723
+ $object: Vault.prototype,
724
+ methodName: "append",
725
+ patchHandler: ({ fallback, originalArguments: [file] }) => {
726
+ this.assertNotBlocked([file.path]);
727
+ return fallback();
728
+ }
729
+ });
730
+ this.registerMethodPatch({
731
+ $object: Vault.prototype,
732
+ methodName: "copy",
733
+ patchHandler: ({ fallback, originalArguments: [, newPath] }) => {
734
+ this.assertNotBlocked([newPath]);
735
+ return fallback();
736
+ }
737
+ });
738
+ this.registerMethodPatch({
739
+ $object: Vault.prototype,
740
+ methodName: "create",
741
+ patchHandler: ({ fallback, originalArguments: [path] }) => {
742
+ this.assertNotBlocked([path]);
743
+ return fallback();
744
+ }
745
+ });
746
+ this.registerMethodPatch({
747
+ $object: Vault.prototype,
748
+ methodName: "createBinary",
749
+ patchHandler: ({ fallback, originalArguments: [path] }) => {
750
+ this.assertNotBlocked([path]);
751
+ return fallback();
752
+ }
753
+ });
754
+ this.registerMethodPatch({
755
+ $object: Vault.prototype,
756
+ methodName: "createFolder",
757
+ patchHandler: ({ fallback, originalArguments: [path] }) => {
758
+ this.assertNotBlocked([path]);
759
+ return fallback();
760
+ }
761
+ });
762
+ this.registerMethodPatch({
763
+ $object: Vault.prototype,
764
+ methodName: "delete",
765
+ patchHandler: ({ fallback, originalArguments: [file] }) => {
766
+ this.assertNotBlocked([file.path]);
767
+ return fallback();
768
+ }
769
+ });
770
+ this.registerMethodPatch({
771
+ $object: Vault.prototype,
772
+ methodName: "modify",
773
+ patchHandler: ({ fallback, originalArguments: [file] }) => {
774
+ this.assertNotBlocked([file.path]);
775
+ return fallback();
776
+ }
777
+ });
778
+ this.registerMethodPatch({
779
+ $object: Vault.prototype,
780
+ methodName: "modifyBinary",
781
+ patchHandler: ({ fallback, originalArguments: [file] }) => {
782
+ this.assertNotBlocked([file.path]);
783
+ return fallback();
784
+ }
785
+ });
786
+ this.registerMethodPatch({
787
+ $object: Vault.prototype,
788
+ methodName: "process",
789
+ patchHandler: ({ fallback, originalArguments: [file] }) => {
790
+ this.assertNotBlocked([file.path]);
791
+ return fallback();
792
+ }
793
+ });
794
+ this.registerMethodPatch({
795
+ $object: Vault.prototype,
796
+ methodName: "rename",
797
+ patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
798
+ this.assertNotBlocked([file.path, newPath]);
799
+ return fallback();
800
+ }
801
+ });
802
+ this.registerMethodPatch({
803
+ $object: Vault.prototype,
804
+ methodName: "trash",
805
+ patchHandler: ({ fallback, originalArguments: [file] }) => {
806
+ this.assertNotBlocked([file.path]);
807
+ return fallback();
808
+ }
809
+ });
810
+ this.registerMethodPatch({
811
+ $object: FileManager.prototype,
812
+ methodName: "renameFile",
813
+ patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
814
+ this.assertNotBlocked([file.path, newPath]);
815
+ return fallback();
816
+ }
817
+ });
818
+ this.registerMethodPatch({
819
+ $object: FileManager.prototype,
820
+ methodName: "trashFile",
821
+ patchHandler: ({ fallback, originalArguments: [file] }) => {
822
+ this.assertNotBlocked([file.path]);
823
+ return fallback();
824
+ }
825
+ });
826
+ }
827
+ assertNotBlocked(paths) {
828
+ for (const path of paths) {
829
+ if (this.shouldBlockMutation(path)) {
830
+ throw new ResourceLockedError(path);
831
+ }
832
+ }
833
+ }
834
+ }
835
+ class ResourceLockComponent extends ComponentEx {
836
+ /**
837
+ * The Obsidian app instance.
838
+ */
839
+ app;
840
+ /**
841
+ * The id of the owning plugin (e.g. its `manifest.id`). Locks are attributed to it for
842
+ * reference-counting and the indicators' "locked by" tooltip.
843
+ */
844
+ pluginId;
845
+ /**
846
+ * Creates an resource-lock handle owned by a plugin.
847
+ *
848
+ * @param app - The Obsidian app instance.
849
+ * @param pluginId - The id of the owning plugin (e.g. its `manifest.id`). Locks are attributed to
850
+ * it for reference-counting and the indicators' "locked by" tooltip.
851
+ */
852
+ constructor(app, pluginId) {
853
+ super();
854
+ this.app = app;
855
+ this.pluginId = pluginId;
856
+ }
857
+ /**
858
+ * Opens an **ambient bypass scope**: while the returned {@link Disposable} is not disposed, this
859
+ * plugin's own mutations of the given paths (and, for a folder, its whole subtree) pass through the
860
+ * mutation blocker instead of throwing {@link ResourceLockedError}. Any mutation of a blocked path
861
+ * NOT covered by an active bypass scope is still rejected. Use it with a `using` declaration around
862
+ * the operation that legitimately mutates resources it has locked with
863
+ * {@link ResourceLockComponentLockForPathParams.shouldBlockMutations}:
864
+ *
865
+ * ```ts
866
+ * using _bypass = component.bypassBlockedMutations([sourceFile, targetFile]);
867
+ * // ... the operation's own vault mutations of those paths are allowed ...
868
+ * // scope end: the paths are enforced again
869
+ * ```
870
+ *
871
+ * @param pathsOrFiles - The paths (or files/folders) whose mutation by this operation is sanctioned.
872
+ * @returns A {@link Disposable} that ends the bypass scope when disposed.
873
+ */
874
+ bypassBlockedMutations(pathsOrFiles) {
875
+ return getManager().bypass(this.app, pathsOrFiles);
876
+ }
877
+ /**
878
+ * Checks whether the path is locked directly or lies under a `subtree`-locked ancestor folder.
879
+ *
880
+ * @param pathOrFile - The path or file to check.
881
+ * @returns `true` if the path is itself locked or is covered by a `subtree` lock on an ancestor.
882
+ */
883
+ isLockedByAncestorForPath(pathOrFile) {
884
+ return getManager().isLockedByAncestor(this.app, pathOrFile);
885
+ }
886
+ /**
887
+ * Checks whether the note at the given path is currently locked by any plugin.
888
+ *
889
+ * @param pathOrFile - The path or file of the note to check.
890
+ * @returns `true` if the note has at least one active lock, `false` otherwise.
891
+ */
892
+ isLockedForPath(pathOrFile) {
893
+ return getManager().isLocked(this.app, pathOrFile);
894
+ }
895
+ /**
896
+ * Checks whether a vault mutation of the path is currently blocked by a `shouldBlockMutations` lock
897
+ * on the path itself or on a `subtree`-locked ancestor folder.
898
+ *
899
+ * @param pathOrFile - The path or file to check.
900
+ * @returns `true` if editing/deleting/renaming/moving/creating the path would throw a
901
+ * {@link ResourceLockedError}.
902
+ */
903
+ isMutationBlockedByAncestorForPath(pathOrFile) {
904
+ return getManager().isMutationBlockedByAncestor(this.app, pathOrFile);
905
+ }
906
+ /**
907
+ * Locks the note at the given path on behalf of this plugin, making it read-only in every current
908
+ * and future {@link MarkdownView} until the lock is released. Reference-counted: balance each call
909
+ * with a dispose of the returned {@link Disposable} (ideally via `using`) or {@link unlockForPath}.
910
+ *
911
+ * @param params - Locking parameters. Its {@link ResourceLockComponentLockForPathParams.pathOrFile}
912
+ * and {@link ResourceLockComponentLockForPathParams.operationName} are required (the latter is shown
913
+ * in the unlock confirmation). Pass an {@link ResourceLockComponentLockForPathParams.abortController}
914
+ * to make the lock cancelable via a lock indicator's "unlock" menu, the "Unlock active note" command,
915
+ * or {@link requestResourceUnlockForPath}.
916
+ * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
917
+ */
918
+ lockForPath(params) {
919
+ return getManager().lock({
920
+ abortController: params.abortController,
921
+ app: this.app,
922
+ blocksMutations: params.shouldBlockMutations,
923
+ mode: params.mode,
924
+ onUnlockRequested: params.onUnlockRequested,
925
+ operationName: params.operationName,
926
+ pathOrFile: params.pathOrFile,
927
+ pluginId: this.pluginId,
928
+ shouldReleaseOnAbort: params.shouldReleaseOnAbort
929
+ });
930
+ }
931
+ /**
932
+ * Releases every lock still held by this plugin when the component (and thus the plugin) unloads,
933
+ * so no note is left stuck read-only by an operation that never completed.
934
+ */
935
+ onunload() {
936
+ getManager().unlockAllForPlugin(this.app, this.pluginId);
937
+ super.onunload();
938
+ }
939
+ /**
940
+ * Fully unlocks the note at the given path: resolves the lock covering it (the path itself when
941
+ * directly locked, otherwise a `subtree`-locked ancestor folder), cancels the operation(s) that took
942
+ * the lock by aborting their {@link AbortController}s, and releases the lock so the note becomes
943
+ * editable — regardless of which plugin holds the lock. Powers the "Unlock active note" command. A
944
+ * no-op when nothing covers the path.
945
+ *
946
+ * @param pathOrFile - The path or file of the note to unlock.
947
+ */
948
+ requestUnlockForPath(pathOrFile) {
949
+ getManager().forceUnlock(this.app, pathOrFile);
950
+ }
951
+ /**
952
+ * Releases one lock previously acquired for the note at the given path via {@link lockForPath}.
953
+ *
954
+ * @param pathOrFile - The path or file of the note to unlock.
955
+ */
956
+ unlockForPath(pathOrFile) {
957
+ getManager().unlock(this.app, pathOrFile, this.pluginId);
958
+ }
959
+ }
960
+ class ResourceLockedError extends Error {
961
+ /**
962
+ * The vault path whose mutation was blocked.
963
+ */
964
+ path;
965
+ /**
966
+ * Creates a {@link ResourceLockedError}.
967
+ *
968
+ * @param path - The vault path whose mutation was blocked.
969
+ */
970
+ constructor(path) {
971
+ super(`The resource "${path}" is locked and cannot be mutated.`);
972
+ this.name = "ResourceLockedError";
973
+ this.path = path;
974
+ }
975
+ }
976
+ function isResourceLockedForPath(app, pathOrFile) {
977
+ return getManager().isLocked(app, pathOrFile);
978
+ }
979
+ function isResourceLockedForPathByAncestor(app, pathOrFile) {
980
+ return getManager().isLockedByAncestor(app, pathOrFile);
981
+ }
982
+ function lockResourceForPath(params) {
983
+ return getManager().lock({
984
+ app: params.app,
985
+ operationName: params.operationName,
986
+ pathOrFile: params.pathOrFile,
987
+ pluginId: params.pluginId
988
+ });
989
+ }
990
+ function requestResourceUnlockForPath(app, pathOrFile) {
991
+ getManager().requestUnlock(app, pathOrFile);
992
+ }
993
+ function unlockResourceForPath(app, pathOrFile, pluginId) {
994
+ getManager().unlock(app, pathOrFile, pluginId);
995
+ }
996
+ function getManager() {
997
+ return getObsidianDevUtilsState(RESOURCE_LOCK_STATE_KEY, new ResourceLockManager()).value;
998
+ }
999
+ function rebasePath(path, oldPath, newPath) {
1000
+ if (path === oldPath) {
1001
+ return newPath;
1002
+ }
1003
+ return path.startsWith(`${oldPath}/`) ? newPath + path.slice(oldPath.length) : null;
1004
+ }
1005
+ export {
1006
+ ResourceLockComponent,
1007
+ ResourceLockedError,
1008
+ isResourceLockedForPath,
1009
+ isResourceLockedForPathByAncestor,
1010
+ lockResourceForPath,
1011
+ requestResourceUnlockForPath,
1012
+ unlockResourceForPath
1013
+ };
1014
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9iZWVwZXInO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgRmlsZU1hbmFnZXIsXG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyB0b2dnbGVFZGl0b3JSZWFkT25seSB9IGZyb20gJy4vZWRpdG9yLnRzJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBpc0NoaWxkLFxuICBpc0NoaWxkT3JTZWxmXG59IGZyb20gJy4vdmF1bHQudHMnO1xuXG5jb25zdCBSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSA9ICdyZXNvdXJjZUxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5jb25zdCBNSURETEVfTU9VU0VfQlVUVE9OID0gMTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbG9ja1Jlc291cmNlRm9yUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9ja1Jlc291cmNlRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIHRha2luZyB0aGUgbG9jayAoZS5nLiBgJ01vdmUgc2VsZWN0aW9uJ2ApLiBTaG93biBuZXh0IHRvXG4gICAqIHRoZSBwbHVnaW4gbmFtZSBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgbG9ja2luZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBUaGUgbG9jayBpcyBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jay4gV2hlbiBhIGxvY2sgaW5kaWNhdG9yIGlzIGNsaWNrZWQgKHdpdGhcbiAgICogYW55IG1vdXNlIGJ1dHRvbikgYW5kIHRoZSB1c2VyIGNvbmZpcm1zIGFuIHVubG9jaywgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCBydW5zLCBvclxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSAvIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofSBpcyBjYWxsZWRcbiAgICogZm9yIHRoZSBwYXRoLCB0aGlzIGNvbnRyb2xsZXIgaXMgYWJvcnRlZCBzbyB0aGUgb3BlcmF0aW9uIGhvbGRpbmcgdGhlIGxvY2sgY2FuIGNhbmNlbCBpdHNlbGYuIFVubGVzc1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnR9IGlzIHNldCwgdGhlIG9wZXJhdGlvbiBpc1xuICAgKiBleHBlY3RlZCB0byByZWxlYXNlIHRoZSBsb2NrIGluIGl0cyBvd24gY2xlYW51cC4gV2hlbiBvbWl0dGVkLCBhbiB1bmxvY2sgc3RpbGwgcmVsZWFzZXMgdGhlIGxvY2sgYnV0XG4gICAqIGNhbm5vdCBjYW5jZWwgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgaXQuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NrIHNjb3BlLiBgJ3N1YnRyZWUnYCBhbHNvIGxvY2tzIGV2ZXJ5IGRlc2NlbmRhbnQgb2YgYSBmb2xkZXIgcGF0aDsgYCdmaWxlJ2AgbG9ja3Mgb25seSB0aGVcbiAgICogZXhhY3QgcGF0aC4gQSBgc3VidHJlZWAgbG9jayBtdXN0IGJlIHJlbGVhc2VkIHZpYSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IChub3QgdGhlXG4gICAqIGV4cGxpY2l0IHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQudW5sb2NrRm9yUGF0aH0pLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2ZpbGUnYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IFJlc291cmNlTG9ja01vZGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIGFuIHVubG9jayBvZiB0aGUgbG9jayBpcyByZXF1ZXN0ZWQgXHUyMDE0IGkuZS4gd2hlbiB0aGVcbiAgICogbG9jaydzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQgKGJ5IHRoZVxuICAgKiBpbmRpY2F0b3IncyBcIlVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQucmVxdWVzdFVubG9ja0ZvclBhdGh9LFxuICAgKiBvciB7QGxpbmsgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbn0pLiBVc2UgaXQgdG8gY2xlYXIgY29uc3VtZXItc2lkZSBzdGF0ZSB0aGF0IHNoYWRvd3MgdGhlIGxvY2sgKGUuZy5cbiAgICogYSBwZW5kaW5nLW9wZXJhdGlvbiBidWZmZXIgb3IgYSBub3RpY2UpIHdpdGhvdXQgaGFuZC13aXJpbmcgYW4gYGFib3J0YCBsaXN0ZW5lci4gRmlyZXMgYXQgbW9zdCBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IHRvb2sgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgLCBgJ01lcmdlXG4gICAqIG5vdGVzJ2ApLiBJdCBpcyBzaG93biBcdTIwMTQgbmV4dCB0byB0aGUgbG9ja2luZyBwbHVnaW4ncyBuYW1lIFx1MjAxNCBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbiBkaWFsb2csIHNvXG4gICAqIHRoZSB1c2VyIHNlZXMgZXhhY3RseSB3aGljaCBvcGVyYXRpb24gYW4gdW5sb2NrIHdvdWxkIGNhbmNlbC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIGFsc28gKipibG9ja3MgdmF1bHQgbXV0YXRpb25zKiogb2YgdGhlIGNvdmVyZWQgcGF0aChzKTogYW55IGF0dGVtcHQgdG8gZWRpdCxcbiAgICogZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBBUEkgdGhyb3dzIGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LiBJbnN0YWxsZWQgbGF6aWx5IG9uIHRoZSBmaXJzdCBzdWNoIGxvY2sgYW5kIHJlbW92ZWQgd2hlbiB0aGUgbGFzdCBvbmVcbiAgICogaXMgcmVsZWFzZWQuIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpIHRoZSBsb2NrIG9ubHkgbWFrZXMgdGhlIGVkaXRvciByZWFkLW9ubHkgXHUyMDE0IGxlZ2FjeSBiZWhhdmlvcixcbiAgICogc28gZXhpc3RpbmcgY29uc3VtZXJzIHRoYXQgd3JpdGUgdG8gYSBub3RlIHRoZXkgaG9sZCBhbiBlZGl0b3IgbG9jayBvbiBhcmUgdW5hZmZlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxvY2sgcmVsZWFzZXMgaXRzZWxmIHRoZSBtb21lbnQgaXRzXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGFib3J0ZWQsIGluc3RlYWQgb2YgcmVseWluZyBvblxuICAgKiB0aGUgb3duaW5nIG9wZXJhdGlvbiB0byByZWxlYXNlIGl0IGluIGl0cyBvd24gY2xlYW51cC4gVXNlIGl0IGZvciBhIGxvY2sgaGVsZCAqKmluZGVmaW5pdGVseSoqXG4gICAqIG91dHNpZGUgYSBgdXNpbmdgIHNjb3BlIChzbyB0aGVyZSBpcyBubyBgZmluYWxseWAgdG8gcmVsZWFzZSBpdCkgXHUyMDE0IGUuZy4gYSBsb2NrIHRoYXQgc3RheXMgdW50aWwgdGhlXG4gICAqIHVzZXIgZXhwbGljaXRseSB1bmxvY2tzLiBMZWF2ZSBpdCBgZmFsc2VgIGZvciBhIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHRoYXQgaG9sZHMgdGhlIGxvY2sgdGhyb3VnaFxuICAgKiBpdHMgb3duIGFib3J0LWRyaXZlbiByb2xsYmFjayBhbmQgcmVsZWFzZXMgaXQgdmlhIGB1c2luZ2AgYXQgc2NvcGUgZXhpdC4gSGFzIG5vIGVmZmVjdCB3aXRob3V0IGFuXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNjb3BlIG9mIGEgbG9jay5cbiAqXG4gKiAtIGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlIGV4YWN0IHBhdGguXG4gKiAtIGAnc3VidHJlZSdgIGxvY2tzIHRoZSBwYXRoIGFuZCBldmVyeSBkZXNjZW5kYW50IHVuZGVyIGl0IChpdHMgd2hvbGUgZm9sZGVyIHN1YnRyZWUpLCBzbyBhIGZpbGVcbiAqICAgaW5zaWRlIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIgaXMgdHJlYXRlZCBhcyBsb2NrZWQgdG9vLlxuICovXG5leHBvcnQgdHlwZSBSZXNvdXJjZUxvY2tNb2RlID0gJ2ZpbGUnIHwgJ3N1YnRyZWUnO1xuXG5pbnRlcmZhY2UgTG9ja0Rlc2NyaXB0b3Ige1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExvY2tFbnRyeSB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgYmxvY2tzTXV0YXRpb25zOiBib29sZWFuO1xuICByZWFkb25seSBtb2RlOiBSZXNvdXJjZUxvY2tNb2RlO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZDogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggdGhlIGVudHJ5IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHVuZGVyLiBEZWxpYmVyYXRlbHkgbXV0YWJsZTogYSByZW5hbWUgcmUta2V5cyB0aGVcbiAgICogcmVnaXN0cnksIGFuZCByZWxlYXNlIG11c3QgZmluZCB0aGUgZW50cnkgYXQgaXRzIENVUlJFTlQgcGF0aCBcdTIwMTQgYSByZWxlYXNlIHRoYXQgY2FwdHVyZWQgdGhlIHBhdGhcbiAgICogYXQgbG9jayB0aW1lIHdvdWxkIHNpbGVudGx5IG5vLW9wIGFmdGVyIHRoZSByZXNvdXJjZSBtb3ZlZCwgbGVha2luZyB0aGUgbG9jayBmb3JldmVyLlxuICAgKi9cbiAgcGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExvY2tJbmRpY2F0b3JzIHtcbiAgcmVhZG9ubHkgYWN0aW9uSWNvbkVsOiBIVE1MRWxlbWVudDtcbiAgZGlzcG9zZVR5cGVMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICByZWFkb25seSBvbkZpbGVNZW51OiAobWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIHRoZSB3b3Jrc3BhY2UgZXZlbnRzIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBsb2NrIHJlY29uY2lsZSAoYW5kIHRoZSBmaWxlIGNvbnRleHQtbWVudVxuICogZXZlbnQgdGhhdCBvZmZlcnMgYW4gXCJVbmxvY2tcIiBpdGVtKS4gSW1wbGVtZW50ZWQgYXMgYSB7QGxpbmsgQ29tcG9uZW50RXh9IHNvIHRoZSBzdWJzY3JpcHRpb25zIGFyZVxuICogcmVnaXN0ZXJlZCBvbiBgbG9hZCgpYCBhbmQgYXV0b21hdGljYWxseSByZW1vdmVkIG9uIGB1bmxvYWQoKWAsIGluc3RlYWQgb2YgYmVpbmcgdHJhY2tlZCBieSBoYW5kLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRmlsZU1lbnU6IChtZW51OiBNZW51LCBmaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uUmVuYW1lOiAob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLm9uQ2hhbmdlID0gcGFyYW1zLm9uQ2hhbmdlO1xuICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uID0gcGFyYW1zLm9uRXh0ZXJuYWxNdXRhdGlvbjtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgICB0aGlzLm9uUmVuYW1lID0gcGFyYW1zLm9uUmVuYW1lO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBTYW1lLWxlYWYgbmF2aWdhdGlvbiB0byBhbm90aGVyIG5vdGUgZmlyZXMgbm8gbGVhZi9sYXlvdXQgY2hhbmdlOyB3aXRob3V0IHRoaXMgaXQgc3RheXMgcmVhZC1vbmx5LlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIHRoaXMub25DaGFuZ2UpKTtcbiAgICAvLyBBZGRzIGFuIFwiVW5sb2NrXCIgaXRlbSB0byBhIGxvY2tlZCBub3RlJ3MgdGFiL2ZpbGUgY29udGV4dCBtZW51IChhbG9uZ3NpZGUgdGhlIGluZGljYXRvciBtZW51cykuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1tZW51JywgdGhpcy5vbkZpbGVNZW51KSk7XG4gICAgLy8gRXh0ZXJuYWwtY2hhbmdlIGJhY2tzdG9wOiBhIHZhdWx0L21ldGFkYXRhIGV2ZW50IG9uIGEgbXV0YXRpb24tYmxvY2tlZCBwYXRoIG5vdCBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSBieXBhc3Mgc2NvcGUgaXMgYW4gaW50cnVkZXIgKGEgc3luYy9GUy9hZGFwdGVyIGNoYW5nZSB0aGF0IGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2NyZWF0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKTogdm9pZCA9PiB7XG4gICAgICAvLyBSZS1rZXkgRklSU1QsIHNvIHRoZSBjaGVja3MgYmVsb3cgcnVuIGFnYWluc3Qgd2hlcmUgdGhlIGxvY2tzIGFjdHVhbGx5IGFyZSBub3cuXG4gICAgICAvLyBJbnRydWRlciBkZXRlY3Rpb24gaXMgdW5hZmZlY3RlZDogdGhlIG9sZCBwYXRoIHN0b3BzIHJlc29sdmluZywgYnV0IHRoZSBuZXcgb25lIGlzIGNvdmVyZWQgaW5zdGVhZC5cbiAgICAgIHRoaXMub25SZW5hbWUob2xkUGF0aCwgZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKG9sZFBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCAoZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24oZmlsZS5wYXRoKTtcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgcGF0aC1zY29wZWQgZWRpdG9yIGxvY2tzIGFuZCBrZWVwcyBldmVyeSBvcGVuIHtAbGluayBNYXJrZG93blZpZXd9IGluIHN5bmMgd2l0aCB0aGUgbG9ja2VkXG4gKiBzZXQuIEEgc2luZ2xlIGluc3RhbmNlIGxpdmVzIG9uIHRoZSBzaGFyZWQgYG9ic2lkaWFuLWRldi11dGlsc2Agc3RhdGUuIEVhY2ggbG9jayBpcyBvbmVcbiAqIHtAbGluayBMb2NrRW50cnl9IGluIGEgcGVyLXBhdGggbGlzdCwgc28gYSBwYXRoIGNhbiBiZSBoZWxkIGJ5IHNldmVyYWwgcGx1Z2lucyAob3Igc2V2ZXJhbCB0aW1lcyBieVxuICogb25lKSBjb25jdXJyZW50bHkgYW5kIGlzIHJlbGVhc2VkIG9ubHkgd2hlbiBpdHMgbGFzdCBlbnRyeSBpcyByZW1vdmVkOyB0aGUgaW5kaWNhdG9ycyByZXBvcnQgd2hpY2hcbiAqIHBsdWdpbnMgY3VycmVudGx5IGhvbGQgYSBsb2NrLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiZWVwZXIgPSBuZXcgQmVlcGVyKCk7XG4gIC8vIFRoZSBpbm5lciBzZXRzIGFyZSBtdXRhYmxlIHNvIGEgcmVuYW1lIGNhbiByZS1rZXkgdGhlIHBhdGhzIG9mIGFuIGluLWZsaWdodCBieXBhc3Mgc2NvcGUgaW4gcGxhY2U7XG4gIC8vIHRoZSBzY29wZSdzIGBEaXNwb3NhYmxlYCBkZWxldGVzIGJ5IHNldCBpZGVudGl0eSwgc28gbXV0YXRpbmcgdGhlIGNvbnRlbnRzIGNhbm5vdCBvcnBoYW4gaXQuXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlwYXNzUGF0aFNldHMgPSBuZXcgU2V0PFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGV2ZW50c0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NrRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgcHJpdmF0ZSBtdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgYnlwYXNzKGFwcDogQXBwLCBwYXRoc09yRmlsZXM6IHJlYWRvbmx5IFBhdGhPckZpbGVbXSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGJ5cGFzc2VkUGF0aHMgPSBuZXcgU2V0KHBhdGhzT3JGaWxlcy5tYXAoKHBhdGhPckZpbGUpID0+IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkpO1xuICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuYWRkKGJ5cGFzc2VkUGF0aHMpO1xuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnlwYXNzUGF0aFNldHMuZGVsZXRlKGJ5cGFzc2VkUGF0aHMpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1bmxvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyBpdCBcdTIwMTQgdGhlIHBhdGggaXRzZWxmIHdoZW5cbiAgICogZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBcdTIwMTQgdGhlbiBhYm9ydHMgZXZlcnlcbiAgICoge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gcmVnaXN0ZXJlZCBvbiB0aGF0IG93bmVyIChjYW5jZWxsaW5nIHRoZSBvcGVyYXRpb25zIHRoYXQgdG9vayB0aGUgbG9ja3MpXG4gICAqIEFORCByZW1vdmVzIHRoZSBvd25lcidzIGxvY2sgZW50cmllcyAocmVsZWFzaW5nIHRoZSBsb2NrIHVuY29uZGl0aW9uYWxseSkuIFVubGlrZVxuICAgKiB7QGxpbmsgcmVxdWVzdFVubG9ja30sIHdoaWNoIG9ubHkgYWJvcnRzIHRoZSBleGFjdCBwYXRoJ3MgY29udHJvbGxlcnMgYW5kIHJlbGllcyBvbiBlYWNoIG9wZXJhdGlvblxuICAgKiByZWxlYXNpbmcgaXRzIG93biBsb2NrLCB0aGlzIHJlc29sdmVzIGFuY2VzdG9yIGNvdmVyYWdlIGFuZCBhbHdheXMgcmVsZWFzZXMgXHUyMDE0IHNvIGEgbm90ZSBoZWxkIGJ5IGFuXG4gICAqIGluZGVmaW5pdGVseS1oZWxkIGxvY2sgaXMgZ3VhcmFudGVlZCB0byBiZWNvbWUgZWRpdGFibGUuIEEgbm8tb3Agd2hlbiBub3RoaW5nIGNvdmVycyB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgZm9yY2VVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIG93bmVyUGF0aCk7XG4gIH1cblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGhMb2NrZWQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgaXMgY292ZXJlZCBieSBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3JcbiAgICogZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBsaWVzIHVuZGVyIGEgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGNvdmVyZWQgYnkgYSBtdXRhdGlvbi1ibG9ja2luZyBsb2NrIChvbmUgdGFrZW4gd2l0aFxuICAgKiBgYmxvY2tzTXV0YXRpb25zYCkgZGlyZWN0bHkgb3Igb24gYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBleGFjdEVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoZXhhY3RFbnRyaWVzPy5zb21lKChlbnRyeSkgPT4gZW50cnkuYmxvY2tzTXV0YXRpb25zKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5tb2RlID09PSAnc3VidHJlZScgJiYgZW50cnkuYmxvY2tzTXV0YXRpb25zKSAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKHBhcmFtczogTWFuYWdlckxvY2tQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGVudHJ5OiBMb2NrRW50cnkgPSB7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIgPz8gbnVsbCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLmJsb2Nrc011dGF0aW9ucyA/PyBmYWxzZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5tb2RlID8/ICdmaWxlJyxcbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkOiBwYXJhbXMub25VbmxvY2tSZXF1ZXN0ZWQgPz8gbnVsbCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgICAgcGF0aCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0ID8/IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgZW50cmllcyA9IFtdO1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgZW50cmllcyk7XG4gICAgfVxuICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgaWYgKGVudHJ5LmJsb2Nrc011dGF0aW9ucykge1xuICAgICAgdGhpcy5lbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcCk7XG4gICAgfVxuICAgIHRoaXMud2lyZVJlbGVhc2VPbkFib3J0KGFwcCwgZW50cnkpO1xuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG5cbiAgICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVudHJ5KGFwcCwgZW50cnkpO1xuICAgICAgfSxcbiAgICAgIG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JZ25vcmVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCB3aGljaFxuICAgKiBjYW5jZWxzIHRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2suIEVhY2ggb3BlcmF0aW9uIHJlbGVhc2VzIGl0cyBvd24gbG9jayBpbiBpdHMgYGZpbmFsbHlgXG4gICAqIHdoZW4gaXQgb2JzZXJ2ZXMgdGhlIGFib3J0LCBzbyB0aGlzIGRvZXMgbm90IHVubG9jayB0aGUgcGF0aCBkaXJlY3RseS4gQSBuby1vcCB3aGVuIG5vIGNvbnRyb2xsZXJcbiAgICogaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2soYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWVudHJpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgPT09IHBsdWdpbklkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxvY2tBbGxGb3JQbHVnaW4oYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZW1haW5pbmcgPSBlbnRyaWVzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnBsdWdpbklkICE9PSBwbHVnaW5JZCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShwYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nLmxlbmd0aCAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5zZXQocGF0aCwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IG9uIHRoZSBnaXZlbiAoYWxyZWFkeS1yZXNvbHZlZCkgb3duZXIgcGF0aCdzIGxvY2sgZW50cmllcyBcdTIwMTRcbiAgICogY2FuY2VsbGluZyB0aGUgb3duaW5nIG9wZXJhdGlvbnMgXHUyMDE0IGFuZCByZW1vdmVzIHRob3NlIGVudHJpZXMsIHJlbGVhc2luZyB0aGUgbG9jay4gVGhlIGVudHJpZXNcbiAgICogc25hcHNob3QgaXMgY29waWVkIGZpcnN0IGJlY2F1c2UgYW4gZW50cnkncyBgc2hvdWxkUmVsZWFzZU9uQWJvcnRgIGFib3J0IGxpc3RlbmVyIG11dGF0ZXMgdGhlXG4gICAqIGFycmF5IGFzIGl0IGZpcmVzLiBBbHdheXMgbGVhdmVzIHRoZSBvd25lciBwYXRoIHdpdGggbm8gZW50cmllcy5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvd25lclBhdGggLSBUaGUgZGlyZWN0bHktbG9ja2VkIG93bmVyIHBhdGggd2hvc2UgZW50cmllcyB0byBhYm9ydCBhbmQgcmVsZWFzZS5cbiAgICovXG4gIHByaXZhdGUgYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHA6IEFwcCwgb3duZXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQob3duZXJQYXRoKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShlbnRyaWVzKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNuYXBzaG90KGVudHJpZXMpKSB7XG4gICAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgfVxuICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKG93bmVyUGF0aCk7XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFVubG9ja01lbnVJdGVtKGFwcDogQXBwLCBtZW51OiBNZW51LCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgIGl0ZW1cbiAgICAgICAgLnNldFRpdGxlKHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrTWVudUl0ZW0pKVxuICAgICAgICAuc2V0SWNvbihVTkxPQ0tfSUNPTl9JRClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgYXBwLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy51bmxvY2tDb25maXJtTWVzc2FnZShhcHAsIHBhdGgpLFxuICAgICAgICAgICAgdGl0bGU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybVRpdGxlKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgLy8gYHBhdGhgIGlzIHRoZSByZXNvbHZlZCBvd25lciBwYXRoLCBzbyBjYW5jZWwgaXRzIG9wZXJhdGlvbnMgYW5kIHJlbGVhc2UgdGhlIGxvY2sgb3V0cmlnaHQuXG4gICAgICAgICAgICB0aGlzLmFib3J0QW5kUmVsZWFzZUVudHJpZXMoYXBwLCBwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyhhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3LCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgLy8gVGhlIGluZGljYXRvcnMgb3V0bGl2ZSBhIHJlbmFtZSBvZiB0aGUgbm90ZSAob3Igb2YgYW4gZW5jbG9zaW5nIGxvY2tlZCBmb2xkZXIpLCBzbyB0aGV5IHJlc29sdmVcbiAgICAvLyB0aGUgb3duZXIgbG9jayBhdCBDTElDSyB0aW1lIGZyb20gdGhlIHZpZXcncyBjdXJyZW50IGZpbGUsIGV4YWN0bHkgYXMgdGhlIHN0YXR1cy1iYXIgaXRlbSBkb2VzLlxuICAgIC8vIEEgY2FwdHVyZWQgb3duZXIgcGF0aCB3b3VsZCBnbyBzdGFsZSB0aGUgbW9tZW50IHRoZSBsb2NrIGlzIHJlLWtleWVkLlxuICAgIGNvbnN0IGdldE93bmVyUGF0aCA9ICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gdGhpcy5yZXNvbHZlVmlld093bmVyUGF0aChhcHAsIHZpZXcpO1xuXG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgZ2V0T3duZXJQYXRoKTtcblxuICAgIGxldCB0YWJJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgdGFiU3RhdHVzQ29udGFpbmVyRWwgPSB2aWV3LmxlYWYudGFiSGVhZGVyU3RhdHVzQ29udGFpbmVyRWw7XG4gICAgaWYgKHRhYlN0YXR1c0NvbnRhaW5lckVsKSB7XG4gICAgICB0YWJJY29uRWwgPSB0YWJTdGF0dXNDb250YWluZXJFbC5jcmVhdGVTcGFuKHsgY2xzOiBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1MgfSk7XG4gICAgICBzZXRJY29uKHRhYkljb25FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIHNldFRvb2x0aXAodGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGFiSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuICAgIH1cblxuICAgIC8vIEEgbG9ja2VkIHZpZXcgaXMgcmVhZC1vbmx5IGJ1dCBzdGlsbCBlZGl0YWJsZS1mb2N1c2FibGUsIHNvIGEga2V5c3Ryb2tlIGZpcmVzIGBiZWZvcmVpbnB1dGAuXG4gICAgLy8gT24gdGhhdCByZWplY3RlZCBhdHRlbXB0LCBmbGFzaCB0aGUgaW5kaWNhdG9ycyBhbmQgYmVlcCBzbyBpdCdzIGNsZWFyIHRoZSBub3RlIGlzIGxvY2tlZC5cbiAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVtb3ZlZCBvbiB1bmxvY2suXG4gICAgY29uc3Qgb25UeXBlQXR0ZW1wdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuZmxhc2hJbmRpY2F0b3JzKHZpZXcpO1xuICAgICAgdGhpcy5iZWVwZXIuYmVlcCgpO1xuICAgIH07XG4gICAgdmlldy5jb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICBkaXNwb3NlVHlwZUxpc3RlbmVyOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHZpZXcuY29udGVudEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG4gICAgICB9LFxuICAgICAgdGFiSWNvbkVsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlQmxvY2tlckluc3RhbGxlZChhcHA6IEFwcCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG5ldyBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQoe1xuICAgICAgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGgpOiBib29sZWFuID0+IHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihhcHAsIHBhdGgpXG4gICAgfSk7XG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTdWJzY3JpYmVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCh7XG4gICAgICBhcHAsXG4gICAgICBvbkNoYW5nZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgICAgfSxcbiAgICAgIG9uRXh0ZXJuYWxNdXRhdGlvbjogKHBhdGgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcCwgcGF0aCk7XG4gICAgICB9LFxuICAgICAgb25GaWxlTWVudTogKG1lbnUsIGZpbGUpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWxlTWVudShhcHAsIG1lbnUsIGZpbGUpO1xuICAgICAgfSxcbiAgICAgIG9uUmVuYW1lOiAob2xkUGF0aCwgbmV3UGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlbmFtZShhcHAsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZWxlbWVudC5yZW1vdmVDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICAgIC8vIFJlYWQgbGF5b3V0IHRvIGZvcmNlIGEgcmVmbG93IHNvIHRoZSBmbGFzaCBhbmltYXRpb24gcmVzdGFydHMgb24gZXZlcnkgcmVqZWN0ZWQga2V5c3Ryb2tlLlxuICAgIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgZWxlbWVudC5hZGRDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEluZGljYXRvcnModmlldzogTWFya2Rvd25WaWV3KTogdm9pZCB7XG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtpbmRpY2F0b3JzPy5hY3Rpb25JY29uRWwsIGluZGljYXRvcnM/LnRhYkljb25FbCwgdGhpcy5zdGF0dXNCYXJJdGVtRWxdKSB7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLmZsYXNoRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RzIHRvIGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBwYXRoLiBJZiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkIGFuZCBOT1QgY292ZXJlZCBieSBhblxuICAgKiBhY3RpdmUgYnlwYXNzIHNjb3BlLCB0aGUgY2hhbmdlIGJ5cGFzc2VkIHRoZSBibG9ja2VyIHBhdGNoIChzeW5jIC8gZmlsZXN5c3RlbSAvIGEgcmF3LWFkYXB0ZXJcbiAgICogd3JpdGUpIFx1MjAxNCBhbiBpbnRydWRlci4gQWJvcnQgdGhlIGBhYm9ydENvbnRyb2xsZXJgIG9mIGV2ZXJ5IG11dGF0aW9uLWJsb2NraW5nIGxvY2sgY292ZXJpbmcgdGhlIHBhdGhcbiAgICogc28gdGhlIG93bmluZyBvcGVyYXRpb24gY2FuY2VscyBhbmQgcm9sbHMgYmFjay4gQSBuby1vcCBmb3IgdGhlIG93bmVyJ3Mgb3duIChieXBhc3NlZCkgbXV0YXRpb25zLFxuICAgKiBmb3IgdW5ibG9ja2VkIHBhdGhzLCBhbmQgZm9yIGJsb2NraW5nIGxvY2tzIHdpdGggbm8gYGFib3J0Q29udHJvbGxlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRoZSBldmVudCBmaXJlZCBvbi5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRXh0ZXJuYWxNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGgpIHx8IHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkgXHUyMDE0IHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0UgXHUyMDE0IG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIFx1MjAxNCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIFx1MjAxNCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGggXHUyMDE0IG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICBjb25zdCB0b29sdGlwID0gdGhpcy5sb2NrVG9vbHRpcChhcHAsIG93bmVyUGF0aCk7XG4gICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgLy8gVGhlIHRvZ2dsZSBpcyBpZGVtcG90ZW50LCBzbyByZS1hcHBseWluZyB0byBhbiBhbHJlYWR5LWxvY2tlZCB2aWV3IGlzIGNoZWFwLlxuICAgICAgLy8gQSB2aWV3IG9wZW5lZCBhZnRlciB0aGUgbG9jayBpcyByZWNvbmNpbGVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSBpdHMgQ29kZU1pcnJvciBpcyByZWFkeS5cbiAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgdHJ1ZSk7XG4gICAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9ycywgdG9vbHRpcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFt2aWV3LCBpbmRpY2F0b3JzXSBvZiB0aGlzLmluZGljYXRvcnNCeVZpZXcpIHtcbiAgICAgIGlmICh2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCBmYWxzZSk7XG4gICAgICBpbmRpY2F0b3JzLmRpc3Bvc2VUeXBlTGlzdGVuZXIoKTtcbiAgICAgIGluZGljYXRvcnMuYWN0aW9uSWNvbkVsLnJlbW92ZSgpO1xuICAgICAgaW5kaWNhdG9ycy50YWJJY29uRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrRW50cmllc0J5UGF0aC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLmV2ZW50c0NvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tdXRhdGlvbkJsb2NrZXJDb21wb25lbnQ/LnVubG9hZCgpO1xuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJVbmxvY2tNZW51KGFwcDogQXBwLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZ2V0Q29udGV4dFBhdGg6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIEEgY2xpY2sgb2YgQU5ZIG1vdXNlIGJ1dHRvbiBvbiBhIGxvY2sgaW5kaWNhdG9yIG9wZW5zIHRoZSBzYW1lIHVubG9jayBjb250ZXh0IG1lbnU6XG4gICAgLy8gYGNsaWNrYCBmaXJlcyBvbmx5IGZvciB0aGUgcHJpbWFyeSAobGVmdCkgYnV0dG9uLCBgY29udGV4dG1lbnVgIGZvciB0aGUgcmlnaHQgYnV0dG9uLCBhbmRcbiAgICAvLyBgYXV4Y2xpY2tgIGZvciB0aGUgbWlkZGxlIGJ1dHRvbiAodGhlIGJyb3dzZXIgZmlyZXMgbm8gYGNsaWNrYCBmb3IgaXQpLiBgYXV4Y2xpY2tgIGFsc28gZmlyZXMgZm9yXG4gICAgLy8gdGhlIHJpZ2h0IGJ1dHRvbiwgc28gaXQgaXMgZ3VhcmRlZCB0byB0aGUgbWlkZGxlIGJ1dHRvbiB0byBhdm9pZCBkb3VibGUtb3BlbmluZyBhbG9uZ3NpZGUgYGNvbnRleHRtZW51YC5cbiAgICAvLyBBIHBsYWluIGxpc3RlbmVyIGRpZXMgd2l0aCB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGAucmVtb3ZlKClgZCBvbiB1bmxvY2ssIHNvIGl0IG5ldmVyIGxlYWtzLlxuICAgIGNvbnN0IG9wZW5VbmxvY2tNZW51ID0gKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0Q29udGV4dFBhdGgoKTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCk7XG4gICAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgcGF0aCk7XG4gICAgICBtZW51LnNob3dBdE1vdXNlRXZlbnQoJGV2ZW50KTtcbiAgICB9O1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuVW5sb2NrTWVudSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2F1eGNsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC5idXR0b24gPT09IE1JRERMRV9NT1VTRV9CVVRUT04pIHtcbiAgICAgICAgb3BlblVubG9ja01lbnUoJGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRW50cnkoYXBwOiBBcHAsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICAvLyBSZWFkIHRoZSBlbnRyeSdzIENVUlJFTlQgcGF0aCwgbm90IG9uZSBjYXB0dXJlZCB3aGVuIHRoZSBsb2NrIHdhcyB0YWtlbjogYSByZW5hbWUgbWF5IGhhdmVcbiAgICAvLyByZS1rZXllZCBpdCBzaW5jZSwgYW5kIGxvb2tpbmcgaXQgdXAgdW5kZXIgdGhlIG9sZCBwYXRoIHdvdWxkIHNpbGVudGx5IGxlYWsgdGhlIGxvY2suXG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KGVudHJ5LnBhdGgpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShlbnRyeS5wYXRoKTtcbiAgICB9XG4gICAgdGhpcy5yZWNvbmNpbGVBbmRDbGVhbnVwKGFwcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgd2hpY2ggbG9ja2VkIHBhdGggKGlmIGFueSkgY292ZXJzIHRoZSBnaXZlbiBwYXRoOiB0aGUgcGF0aCBpdHNlbGYgd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciB0aGF0IGNvbnRhaW5zIGl0IChsb25nZXN0IHNvIGEgbmVzdGVkXG4gICAqIHN1YnRyZWUgbG9jayB3aW5zIGRldGVybWluaXN0aWNhbGx5IG92ZXIgYW4gb3V0ZXIgb25lKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIGNvdmVycyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGxldCBiZXN0T3duZXJQYXRoOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBoYXNTdWJ0cmVlTG9jayA9IGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyk7XG4gICAgICBpZiAoaGFzU3VidHJlZUxvY2sgJiYgaXNDaGlsZCh7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBsb2NrZWRQYXRoIH0pICYmIChiZXN0T3duZXJQYXRoID09PSBudWxsIHx8IGxvY2tlZFBhdGgubGVuZ3RoID4gYmVzdE93bmVyUGF0aC5sZW5ndGgpKSB7XG4gICAgICAgIGJlc3RPd25lclBhdGggPSBsb2NrZWRQYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdE93bmVyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyB0aGUgbm90ZSBhIHZpZXcgY3VycmVudGx5IHNob3dzIFx1MjAxNCBpdHMgb3duIHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsXG4gICAqIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBSZWFkIGF0IGNsaWNrIHRpbWUgYnkgdGhlIHZpZXcncyBsb2NrIGluZGljYXRvcnMsXG4gICAqIHNvIGl0IHJlZmxlY3RzIHJlbmFtZXMgb2YgdGhlIG5vdGUgYW5kIG9mIHRoZSBsb2NrZWQgZm9sZGVyIGFsaWtlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHZpZXcgLSBUaGUgdmlldyB3aG9zZSBjdXJyZW50IGZpbGUgdG8gcmVzb2x2ZSBhbiBvd25lciBsb2NrIGZvci5cbiAgICogQHJldHVybnMgVGhlIGNvdmVyaW5nIGxvY2tlZCBwYXRoLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2aWV3IGhhcyBubyBmaWxlIG9yIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVmlld093bmVyUGF0aChhcHA6IEFwcCwgdmlldzogTWFya2Rvd25WaWV3KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXRoID0gdmlldy5maWxlPy5wYXRoO1xuICAgIHJldHVybiBwYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCkgPz8gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBhIG11dGF0aW9uIG9mIHRoZSBwYXRoIG11c3QgYmUgYmxvY2tlZDogYHRydWVgIHdoZW4gdGhlIHBhdGggaXMgbXV0YXRpb24tYmxvY2tlZFxuICAgKiBhbmQgbm90IGNvdmVyZWQgYnkgYW55IGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBiZWluZyBtdXRhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcmVqZWN0IHRoZSBtdXRhdGlvbiwgYGZhbHNlYCB0byBhbGxvdyBpdC5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkQmxvY2tNdXRhdGlvbihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkgJiYgIXRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmxvY2tDb25maXJtTWVzc2FnZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGZyYWdtZW50LmFwcGVuZFRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtTWVzc2FnZSkpO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiB0aGUgbG9ja3MgY3VycmVudGx5IGhlbGQ6IGVhY2ggcGx1Z2luIG5hbWUgYXMgYSBjb2RlIGJsb2NrIGZvbGxvd2VkIGJ5XG4gICAgLy8gdGhlIG9wZXJhdGlvbiBpdCBpcyBydW5uaW5nLCBvbmUgcGVyIGxpbmUuXG4gICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRoaXMubG9ja0Rlc2NyaXB0b3JzKGFwcCwgcGF0aCkpIHtcbiAgICAgIGZyYWdtZW50LmNyZWF0ZUVsKCdicicpO1xuICAgICAgYXBwZW5kQ29kZUJsb2NrKGZyYWdtZW50LCBkZXNjcmlwdG9yLnBsdWdpbk5hbWUpO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChgOiAke2Rlc2NyaXB0b3Iub3BlcmF0aW9uTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBhY3RpdmVPd25lclBhdGggPSBhY3RpdmVQYXRoID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGFjdGl2ZVBhdGgpO1xuXG4gICAgaWYgKGFjdGl2ZU93bmVyUGF0aCA9PT0gbnVsbCB8fCAhYWN0aXZlVmlldykge1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWw/LnJlbW92ZSgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0dXNCYXJJdGVtRWwpIHtcbiAgICAgIGNvbnN0IHN0YXR1c0JhckVsID0gYWN0aXZlVmlldy5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oU1RBVFVTX0JBUl9DU1NfU0VMRUNUT1IpO1xuICAgICAgaWYgKCFzdGF0dXNCYXJFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1c0Jhckl0ZW1FbCA9IHN0YXR1c0JhckVsLmNyZWF0ZURpdih7IGNsczogW1NUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MsIExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTU10gfSk7XG4gICAgICBzZXRJY29uKHRoaXMuc3RhdHVzQmFySXRlbUVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgLy8gVGhlIHNpbmdsZSBzdGF0dXMtYmFyIGl0ZW0gaXMgcmV1c2VkIGFjcm9zcyBhY3RpdmUtbm90ZSBzd2l0Y2hlcy5cbiAgICAgIC8vIEl0IG11c3QgcmVzb2x2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBub3RlJ3Mgb3duZXIgbG9jayBhdCBjbGljayB0aW1lIHJhdGhlciB0aGFuIGNhcHR1cmluZyBvbmUgcGF0aC5cbiAgICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgdGhpcy5zdGF0dXNCYXJJdGVtRWwsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5maWxlPy5wYXRoO1xuICAgICAgICByZXR1cm4gcGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIHBhdGgpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRvb2x0aXAodGhpcy5zdGF0dXNCYXJJdGVtRWwsIHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBhY3RpdmVPd25lclBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXJlcyBhbiBvcHQtaW4gYGFib3J0YCBsaXN0ZW5lciBmb3IgYSBsb2NrIGVudHJ5OiB3aGVuIHRoZSBlbnRyeSdzIGNvbnRyb2xsZXIgYWJvcnRzLCByZWxlYXNlc1xuICAgKiB0aGUgZW50cnkgKGlmIHtAbGluayBMb2NrRW50cnkuc2hvdWxkUmVsZWFzZU9uQWJvcnR9KSBhbmQvb3IgaW52b2tlc1xuICAgKiB7QGxpbmsgTG9ja0VudHJ5Lm9uVW5sb2NrUmVxdWVzdGVkfS4gQSBuby1vcCB3aGVuIHRoZSBlbnRyeSBoYXMgbm8gY29udHJvbGxlciBvciBuZWl0aGVyIG9wdC1pbiBpc1xuICAgKiBzZXQsIHNvIHRyYW5zYWN0aW9uYWwgbG9ja3Mga2VlcCByZWxlYXNpbmcgdmlhIHRoZWlyIG93biBjbGVhbnVwLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGVudHJ5IC0gVGhlIGxvY2sgZW50cnkgd2hvc2UgY29udHJvbGxlciB0byBvYnNlcnZlLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlUmVsZWFzZU9uQWJvcnQoYXBwOiBBcHAsIGVudHJ5OiBMb2NrRW50cnkpOiB2b2lkIHtcbiAgICBjb25zdCB7IG9uVW5sb2NrUmVxdWVzdGVkLCBzaG91bGRSZWxlYXNlT25BYm9ydCB9ID0gZW50cnk7XG4gICAgaWYgKCFlbnRyeS5hYm9ydENvbnRyb2xsZXIgfHwgKCFzaG91bGRSZWxlYXNlT25BYm9ydCAmJiAhb25VbmxvY2tSZXF1ZXN0ZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICBpZiAoc2hvdWxkUmVsZWFzZU9uQWJvcnQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFbnRyeShhcHAsIGVudHJ5KTtcbiAgICAgIH1cbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkPy4oKTtcbiAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNb25rZXktcGF0Y2hlcyB0aGUgdmF1bHQtbXV0YXRpb24gY2hva2UgcG9pbnRzIG9uIGBWYXVsdGAvYEZpbGVNYW5hZ2VyYCBzbyB0aGF0IGFueSBlZGl0LCBkZWxldGUsXG4gKiByZW5hbWUsIG1vdmUsIG9yIChyZSljcmVhdGUgb2YgYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggdGhyb3dzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICogSW5zdGFsbGVkIGxhemlseSBieSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlcn0gb24gdGhlIGZpcnN0IGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9jayBhbmQgcmVtb3ZlZFxuICogd2hlbiB0aGUgbGFzdCBvbmUgaXMgcmVsZWFzZWQ7IGJlaW5nIGEge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudH0sIGV2ZXJ5IHBhdGNoIGlzIHRvcm4gZG93biBvblxuICogYHVubG9hZGAuIFJlbmFtZS9jb3B5IGNoZWNrIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbjsgdGhlIG90aGVyIG1ldGhvZHMgY2hlY2sgdGhlaXIgc2luZ2xlIHBhdGguXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkQmxvY2tNdXRhdGlvbjogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaG91bGRCbG9ja011dGF0aW9uID0gcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb247XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnYXBwZW5kJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2FwcGVuZCcsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY29weSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlQmluYXJ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUJpbmFyeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZUZvbGRlcic+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGVGb2xkZXInLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdkZWxldGUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnZGVsZXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdtb2RpZnlCaW5hcnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnbW9kaWZ5QmluYXJ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdwcm9jZXNzJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3Byb2Nlc3MnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3JlbmFtZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3RyYXNoJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICdyZW5hbWVGaWxlJz4oe1xuICAgICAgJG9iamVjdDogRmlsZU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZUZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBuZXdQYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoLCBuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3RCbG9ja2VkKHBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbihwYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VMb2NrZWRFcnJvcihwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBlci1wbHVnaW4gaGFuZGxlIGZvciBwYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIChlZGl0b3IgcmVhZC1vbmx5LCBvcHRpb25hbCB2YXVsdC1tdXRhdGlvblxuICogYmxvY2tpbmcsIGFuZCBleHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uIFx1MjAxNCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcpLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBSZXNvdXJjZUxvY2tDb21wb25lbnQodGhpcy5hcHApKWApIHNvIHRoYXQgYW55IGxvY2tzIGl0IHN0aWxsIGhvbGRzIGFyZSByZWxlYXNlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2FkcyBcdTIwMTQgYSByZXNvdXJjZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayBsb2NrZWQgYmVjYXVzZSB0aGUgcGx1Z2luXG4gKiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXMgaXRcbiAqIGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIExvY2tzIGFyZSBhdHRyaWJ1dGVkIHRvIGl0IGZvclxuICAgKiByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiByZXNvdXJjZS1sb2NrIGhhbmRsZSBvd25lZCBieSBhIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbiAoZS5nLiBpdHMgYG1hbmlmZXN0LmlkYCkuIExvY2tzIGFyZSBhdHRyaWJ1dGVkIHRvXG4gICAqIGl0IGZvciByZWZlcmVuY2UtY291bnRpbmcgYW5kIHRoZSBpbmRpY2F0b3JzJyBcImxvY2tlZCBieVwiIHRvb2x0aXAuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiAqKmFtYmllbnQgYnlwYXNzIHNjb3BlKio6IHdoaWxlIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gaXMgbm90IGRpc3Bvc2VkLCB0aGlzXG4gICAqIHBsdWdpbidzIG93biBtdXRhdGlvbnMgb2YgdGhlIGdpdmVuIHBhdGhzIChhbmQsIGZvciBhIGZvbGRlciwgaXRzIHdob2xlIHN1YnRyZWUpIHBhc3MgdGhyb3VnaCB0aGVcbiAgICogbXV0YXRpb24gYmxvY2tlciBpbnN0ZWFkIG9mIHRocm93aW5nIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gQW55IG11dGF0aW9uIG9mIGEgYmxvY2tlZCBwYXRoXG4gICAqIE5PVCBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSBieXBhc3Mgc2NvcGUgaXMgc3RpbGwgcmVqZWN0ZWQuIFVzZSBpdCB3aXRoIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBhcm91bmRcbiAgICogdGhlIG9wZXJhdGlvbiB0aGF0IGxlZ2l0aW1hdGVseSBtdXRhdGVzIHJlc291cmNlcyBpdCBoYXMgbG9ja2VkIHdpdGhcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zfTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogdXNpbmcgX2J5cGFzcyA9IGNvbXBvbmVudC5ieXBhc3NCbG9ja2VkTXV0YXRpb25zKFtzb3VyY2VGaWxlLCB0YXJnZXRGaWxlXSk7XG4gICAqIC8vIC4uLiB0aGUgb3BlcmF0aW9uJ3Mgb3duIHZhdWx0IG11dGF0aW9ucyBvZiB0aG9zZSBwYXRocyBhcmUgYWxsb3dlZCAuLi5cbiAgICogLy8gc2NvcGUgZW5kOiB0aGUgcGF0aHMgYXJlIGVuZm9yY2VkIGFnYWluXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGF0aHNPckZpbGVzIC0gVGhlIHBhdGhzIChvciBmaWxlcy9mb2xkZXJzKSB3aG9zZSBtdXRhdGlvbiBieSB0aGlzIG9wZXJhdGlvbiBpcyBzYW5jdGlvbmVkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IGVuZHMgdGhlIGJ5cGFzcyBzY29wZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGJ5cGFzc0Jsb2NrZWRNdXRhdGlvbnMocGF0aHNPckZpbGVzOiByZWFkb25seSBQYXRoT3JGaWxlW10pOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmJ5cGFzcyh0aGlzLmFwcCwgcGF0aHNPckZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBsb2NrZWQgZGlyZWN0bHkgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGlzIGNvdmVyZWQgYnkgYSBgc3VidHJlZWAgbG9jayBvbiBhbiBhbmNlc3Rvci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBieSBhbnkgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgdmF1bHQgbXV0YXRpb24gb2YgdGhlIHBhdGggaXMgY3VycmVudGx5IGJsb2NrZWQgYnkgYSBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2tcbiAgICogb24gdGhlIHBhdGggaXRzZWxmIG9yIG9uIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIGVkaXRpbmcvZGVsZXRpbmcvcmVuYW1pbmcvbW92aW5nL2NyZWF0aW5nIHRoZSBwYXRoIHdvdWxkIHRocm93IGFcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKi9cbiAgcHVibGljIGlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3RvckZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvbiBiZWhhbGYgb2YgdGhpcyBwbHVnaW4sIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudFxuICAgKiBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLiBSZWZlcmVuY2UtY291bnRlZDogYmFsYW5jZSBlYWNoIGNhbGxcbiAgICogd2l0aCBhIGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAoaWRlYWxseSB2aWEgYHVzaW5nYCkgb3Ige0BsaW5rIHVubG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gTG9ja2luZyBwYXJhbWV0ZXJzLiBJdHMge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnBhdGhPckZpbGV9XG4gICAqIGFuZCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMub3BlcmF0aW9uTmFtZX0gYXJlIHJlcXVpcmVkICh0aGUgbGF0dGVyIGlzIHNob3duXG4gICAqIGluIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uKS4gUGFzcyBhbiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfVxuICAgKiB0byBtYWtlIHRoZSBsb2NrIGNhbmNlbGFibGUgdmlhIGEgbG9jayBpbmRpY2F0b3IncyBcInVubG9ja1wiIG1lbnUsIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQsXG4gICAqIG9yIHtAbGluayByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRofS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gICAqL1xuICBwdWJsaWMgbG9ja0ZvclBhdGgocGFyYW1zOiBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgICBhYm9ydENvbnRyb2xsZXI6IHBhcmFtcy5hYm9ydENvbnRyb2xsZXIsXG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbnMsXG4gICAgICBtb2RlOiBwYXJhbXMubW9kZSxcbiAgICAgIG9uVW5sb2NrUmVxdWVzdGVkOiBwYXJhbXMub25VbmxvY2tSZXF1ZXN0ZWQsXG4gICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSxcbiAgICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luSWQsXG4gICAgICBzaG91bGRSZWxlYXNlT25BYm9ydDogcGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgZXZlcnkgbG9jayBzdGlsbCBoZWxkIGJ5IHRoaXMgcGx1Z2luIHdoZW4gdGhlIGNvbXBvbmVudCAoYW5kIHRodXMgdGhlIHBsdWdpbikgdW5sb2FkcyxcbiAgICogc28gbm8gbm90ZSBpcyBsZWZ0IHN0dWNrIHJlYWQtb25seSBieSBhbiBvcGVyYXRpb24gdGhhdCBuZXZlciBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9ja0FsbEZvclBsdWdpbih0aGlzLmFwcCwgdGhpcy5wbHVnaW5JZCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB1bmxvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoOiByZXNvbHZlcyB0aGUgbG9jayBjb3ZlcmluZyBpdCAodGhlIHBhdGggaXRzZWxmIHdoZW5cbiAgICogZGlyZWN0bHkgbG9ja2VkLCBvdGhlcndpc2UgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlciksIGNhbmNlbHMgdGhlIG9wZXJhdGlvbihzKSB0aGF0IHRvb2tcbiAgICogdGhlIGxvY2sgYnkgYWJvcnRpbmcgdGhlaXIge0BsaW5rIEFib3J0Q29udHJvbGxlcn1zLCBhbmQgcmVsZWFzZXMgdGhlIGxvY2sgc28gdGhlIG5vdGUgYmVjb21lc1xuICAgKiBlZGl0YWJsZSBcdTIwMTQgcmVnYXJkbGVzcyBvZiB3aGljaCBwbHVnaW4gaG9sZHMgdGhlIGxvY2suIFBvd2VycyB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLiBBXG4gICAqIG5vLW9wIHdoZW4gbm90aGluZyBjb3ZlcnMgdGhlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS5mb3JjZVVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgdGhlIHZhdWx0LW11dGF0aW9uIGJsb2NrZXIgd2hlbiBhIHBsdWdpbiB0cmllcyB0byBlZGl0LCBkZWxldGUsIHJlbmFtZSwgbW92ZSwgb3IgY3JlYXRlIGFcbiAqIHJlc291cmNlIHdob3NlIHBhdGggaXMgY292ZXJlZCBieSBhIGxvY2sgdGFrZW4gd2l0aFxuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTG9ja2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgcGF0aCB3aG9zZSBtdXRhdGlvbiB3YXMgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRoZSByZXNvdXJjZSBcIiR7cGF0aH1cIiBpcyBsb2NrZWQgYW5kIGNhbm5vdCBiZSBtdXRhdGVkLmApO1xuICAgIHRoaXMubmFtZSA9ICdSZXNvdXJjZUxvY2tlZEVycm9yJztcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm90ZSBoYXMgYXQgbGVhc3Qgb25lIGFjdGl2ZSBsb2NrLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGRpcmVjdGx5IE9SIGlzIGNvdmVyZWQgYnkgYVxuICogYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIuXG4gKlxuICogVW5saWtlIHtAbGluayBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aH0sIHdoaWNoIG9ubHkgcmVwb3J0cyBhbiBleGFjdC1wYXRoIGxvY2ssIHRoaXMgYWxzbyByZXBvcnRzIGFcbiAqIHBhdGggdGhhdCBsaWVzIHVuZGVyIGEgZm9sZGVyIGxvY2tlZCBpbiBgc3VidHJlZWAgbW9kZS4gVXNlIGl0IHRvIGRldGVjdCB0aGF0IGEgcmVuYW1lL21vdmUgaXNcbiAqIGhhcHBlbmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZSBhZmZlY3RlZCBmb2xkZXJcbiAqIHN1YnRyZWUpLCBzbyB0aGF0IGEgYnlzdGFuZGVyIChlLmcuIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIpIGNhbiBzdGF5IG91dCBvZiB0aGUgd2F5IGFuZCBsZXQgdGhlXG4gKiB0cmFuc2FjdGlvbidzIG93bmVyIGtlZXAgaXRzIG93biBsaW5rcyBjb25zaXN0ZW50LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGlzIGl0c2VsZiBsb2NrZWQgb3IgbGllcyB1bmRlciBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlXG4gKiB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZCwgYW5kIHNob3dpbmcgYSBsb2NrIGluZGljYXRvciBpbiB0aGUgdGFiIGhlYWRlcixcbiAqIHZpZXcgYWN0aW9uIGJhciwgYW5kICh3aGlsZSBhY3RpdmUpIHRoZSBzdGF0dXMgYmFyLiBUaGUgaW5kaWNhdG9ycycgdG9vbHRpcCBsaXN0cyB0aGUgcGx1Z2luc1xuICogdGhhdCBjdXJyZW50bHkgaG9sZCBhIGxvY2sgb24gdGhlIG5vdGUuXG4gKlxuICogVGhlIGxvY2sgaXMgcmVmZXJlbmNlLWNvdW50ZWQgcGVyIGNhbGxpbmcgcGx1Z2luOiBlYWNoIGNhbGwgbXVzdCBiZSBiYWxhbmNlZCBieSBleGFjdGx5IG9uZVxuICogcmVsZWFzZSAoZWl0aGVyIGRpc3Bvc2luZyB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IFx1MjAxNCBpZGVhbGx5IHZpYSBhIGB1c2luZ2AgZGVjbGFyYXRpb24gXHUyMDE0IG9yXG4gKiBhIG1hdGNoaW5nIHtAbGluayB1bmxvY2tSZXNvdXJjZUZvclBhdGh9IGNhbGwpLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgbG9ja2luZyB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9ja1Jlc291cmNlRm9yUGF0aChwYXJhbXM6IExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgcGF0aE9yRmlsZTogcGFyYW1zLnBhdGhPckZpbGUsXG4gICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0cyBhbiB1bmxvY2sgb2YgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggYnkgYWJvcnRpbmcgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gdGhhdCB3YXNcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2sgb24gaXQgKHZpYSB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofSdzXG4gKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSkuIFRoZSBvcGVyYXRpb25zIGhvbGRpbmcgdGhlIGxvY2tcbiAqIG9ic2VydmUgdGhlIGFib3J0IGFuZCByZWxlYXNlIHRoZWlyIG93biBsb2Nrcy4gQSBuby1vcCB3aGVuIG5vIGFib3J0YWJsZSBsb2NrIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZVxuICogcGF0aC5cbiAqXG4gKiBUaGlzIGxldHMgYSBjb25zdW1pbmcgcGx1Z2luIHdpcmUgaXRzIG93biBcInVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgd2l0aG91dCByZWFjaGluZyBpbnRvIHRoZVxuICogbG9jayBtYW5hZ2VyIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RSZXNvdXJjZVVubG9ja0ZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnJlcXVlc3RVbmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICpcbiAqIFdoZW4gdGhlIGxhc3QgbG9jayBpcyByZWxlYXNlZCB0aGUgbm90ZSBiZWNvbWVzIGZ1bGx5IGVkaXRhYmxlIGFnYWluIGFuZCBpdHMgbG9jayBpbmRpY2F0b3JzIGFyZVxuICogcmVtb3ZlZC4gQ2FsbGluZyB0aGlzIHdoZW4gdGhlIG5vdGUgaXMgbm90IGxvY2tlZCBpcyBhIG5vLW9wLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgaG9sZHMgdGhlIGxvY2sgKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApOyBvbmUgb2YgaXRzXG4gKiBsb2NrcyBvbiB0aGUgbm90ZSBpcyByZWxlYXNlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubG9ja1Jlc291cmNlRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICBnZXRNYW5hZ2VyKCkudW5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgcGx1Z2luSWQpO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VyKCk6IFJlc291cmNlTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPFJlc291cmNlTG9ja01hbmFnZXI+KFJFU09VUkNFX0xPQ0tfU1RBVEVfS0VZLCBuZXcgUmVzb3VyY2VMb2NrTWFuYWdlcigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBNYXBzIGEgc3RvcmVkIHBhdGggdGhyb3VnaCBhIHJlbmFtZTogdGhlIHJlbmFtZWQgcGF0aCBpdHNlbGYgYmVjb21lcyB0aGUgbmV3IHBhdGgsIGFuZCBhIGRlc2NlbmRhbnRcbiAqIG9mIGl0IGtlZXBzIGl0cyBzdWZmaXggdW5kZXIgdGhlIG5ldyBwYXRoLiBTcGVsbGVkIG91dCByYXRoZXIgdGhhbiByZXVzaW5nIHtAbGluayBpc0NoaWxkT3JTZWxmfVxuICogYmVjYXVzZSB0aGUgcmViYXNlZCBzdWZmaXggaGFzIHRvIGJlIGNvbXB1dGVkIGZyb20gdGhlIHNhbWUgcHJlZml4IHRoZSB0ZXN0IG1hdGNoZWQsIGFuZCBhIHJlbmFtZVxuICogc291cmNlIGlzIG5ldmVyIHRoZSB2YXVsdCByb290ICh0aGUgb25lIGNhc2UgdGhvc2UgaGVscGVycyB0cmVhdCBzcGVjaWFsbHkpLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHN0b3JlZCBwYXRoIHRvIG1hcC5cbiAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIHBhdGggdGhlIHJlc291cmNlIHdhcyByZW5hbWVkIGZyb20uXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCB0by5cbiAqIEByZXR1cm5zIFRoZSByZWJhc2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIHRoZSByZW5hbWUgZG9lcyBub3QgYWZmZWN0IGl0LlxuICovXG5mdW5jdGlvbiByZWJhc2VQYXRoKHBhdGg6IHN0cmluZywgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKHBhdGggPT09IG9sZFBhdGgpIHtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxuICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKGAke29sZFBhdGh9L2ApID8gbmV3UGF0aCArIHBhdGguc2xpY2Uob2xkUGF0aC5sZW5ndGgpIDogbnVsbDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQ0EsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyxjQUFjO0FBQ3ZCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsZUFBZTtBQUN4QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFNBQVM7QUFDbEIsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxlQUFlO0FBQ3JCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0saUNBQWlDO0FBQ3ZDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sc0JBQXNCO0FBdUs1QixNQUFNLG9DQUFvQyxZQUFZO0FBQUEsRUFDbkM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFVixZQUFZLFFBQXNEO0FBQ3ZFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLHFCQUFxQixPQUFPO0FBQ2pDLFNBQUssYUFBYSxPQUFPO0FBQ3pCLFNBQUssV0FBVyxPQUFPO0FBQUEsRUFDekI7QUFBQSxFQUVnQixTQUFlO0FBQzdCLFVBQU0sT0FBTztBQUNiLFNBQUssY0FBYyxLQUFLLElBQUksVUFBVSxHQUFHLHNCQUFzQixLQUFLLFFBQVEsQ0FBQztBQUM3RSxTQUFLLGNBQWMsS0FBSyxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsS0FBSyxRQUFRLENBQUM7QUFFeEUsU0FBSyxjQUFjLEtBQUssSUFBSSxVQUFVLEdBQUcsYUFBYSxLQUFLLFFBQVEsQ0FBQztBQUVwRSxTQUFLLGNBQWMsS0FBSyxJQUFJLFVBQVUsR0FBRyxhQUFhLEtBQUssVUFBVSxDQUFDO0FBRXRFLFNBQUssY0FBYyxLQUFLLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFlO0FBQzdELFdBQUssbUJBQW1CLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUMsQ0FBQztBQUNGLFNBQUssY0FBYyxLQUFLLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFlO0FBQzdELFdBQUssbUJBQW1CLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUMsQ0FBQztBQUNGLFNBQUssY0FBYyxLQUFLLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLFlBQWtCO0FBR3RFLFdBQUssU0FBUyxTQUFTLEtBQUssSUFBSTtBQUNoQyxXQUFLLG1CQUFtQixPQUFPO0FBQy9CLFdBQUssbUJBQW1CLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUMsQ0FBQztBQUNGLFNBQUssY0FBYyxLQUFLLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxTQUFlO0FBQ3RFLFdBQUssbUJBQW1CLEtBQUssSUFBSTtBQUFBLElBQ25DLENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFDRjtBQVNBLE1BQU0sb0JBQW9CO0FBQUEsRUFDUCxTQUFTLElBQUksT0FBTztBQUFBO0FBQUE7QUFBQSxFQUdwQixpQkFBaUIsb0JBQUksSUFBaUI7QUFBQSxFQUMvQyxrQkFBc0Q7QUFBQSxFQUM3QyxtQkFBbUIsb0JBQUksSUFBa0M7QUFBQSxFQUN6RCxvQkFBb0Isb0JBQUksSUFBeUI7QUFBQSxFQUMxRCwyQkFBd0U7QUFBQSxFQUN4RSxrQkFBc0M7QUFBQSxFQUV2QyxPQUFPLEtBQVUsY0FBaUQ7QUFDdkUsVUFBTSxnQkFBZ0IsSUFBSSxJQUFJLGFBQWEsSUFBSSxDQUFDLGVBQWUsUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ3hGLFNBQUssZUFBZSxJQUFJLGFBQWE7QUFDckMsV0FBTyxJQUFJLG1CQUFtQjtBQUFBLE1BQzVCLFVBQVUsTUFBWTtBQUNwQixhQUFLLGVBQWUsT0FBTyxhQUFhO0FBQUEsTUFDMUM7QUFBQSxNQUNBLHlCQUF5Qix3QkFBd0I7QUFBQSxJQUNuRCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY08sWUFBWSxLQUFVLFlBQThCO0FBQ3pELFVBQU0sWUFBWSxLQUFLLHFCQUFxQixLQUFLLFFBQVEsS0FBSyxVQUFVLENBQUM7QUFDekUsUUFBSSxjQUFjLE1BQU07QUFDdEI7QUFBQSxJQUNGO0FBQ0EsU0FBSyx1QkFBdUIsS0FBSyxTQUFTO0FBQUEsRUFDNUM7QUFBQSxFQUVPLFNBQVMsS0FBVSxZQUFpQztBQUN6RCxXQUFPLEtBQUssYUFBYSxRQUFRLEtBQUssVUFBVSxDQUFDO0FBQUEsRUFDbkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyxtQkFBbUIsS0FBVSxZQUFpQztBQUNuRSxXQUFPLEtBQUsscUJBQXFCLEtBQUssUUFBUSxLQUFLLFVBQVUsQ0FBQyxNQUFNO0FBQUEsRUFDdEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyw0QkFBNEIsS0FBVSxZQUFpQztBQUM1RSxVQUFNLE9BQU8sUUFBUSxLQUFLLFVBQVU7QUFDcEMsVUFBTSxlQUFlLEtBQUssa0JBQWtCLElBQUksSUFBSTtBQUNwRCxRQUFJLGNBQWMsS0FBSyxDQUFDLFVBQVUsTUFBTSxlQUFlLEdBQUc7QUFDeEQsYUFBTztBQUFBLElBQ1Q7QUFDQSxlQUFXLENBQUMsWUFBWSxPQUFPLEtBQUssS0FBSyxtQkFBbUI7QUFDMUQsVUFBSSxRQUFRLEtBQUssQ0FBQyxVQUFVLE1BQU0sU0FBUyxhQUFhLE1BQU0sZUFBZSxLQUFLLFFBQVEsRUFBRSxLQUFLLGlCQUFpQixNQUFNLGtCQUFrQixXQUFXLENBQUMsR0FBRztBQUN2SixlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRU8sS0FBSyxRQUF1QztBQUNqRCxVQUFNLEVBQUUsSUFBSSxJQUFJO0FBQ2hCLFVBQU0sT0FBTyxRQUFRLEtBQUssT0FBTyxVQUFVO0FBQzNDLFVBQU0sUUFBbUI7QUFBQSxNQUN2QixpQkFBaUIsT0FBTyxtQkFBbUI7QUFBQSxNQUMzQyxpQkFBaUIsT0FBTyxtQkFBbUI7QUFBQSxNQUMzQyxNQUFNLE9BQU8sUUFBUTtBQUFBLE1BQ3JCLG1CQUFtQixPQUFPLHFCQUFxQjtBQUFBLE1BQy9DLGVBQWUsT0FBTztBQUFBLE1BQ3RCO0FBQUEsTUFDQSxVQUFVLE9BQU87QUFBQSxNQUNqQixzQkFBc0IsT0FBTyx3QkFBd0I7QUFBQSxJQUN2RDtBQUNBLFFBQUksVUFBVSxLQUFLLGtCQUFrQixJQUFJLElBQUk7QUFDN0MsUUFBSSxDQUFDLFNBQVM7QUFDWixnQkFBVSxDQUFDO0FBQ1gsV0FBSyxrQkFBa0IsSUFBSSxNQUFNLE9BQU87QUFBQSxJQUMxQztBQUNBLFlBQVEsS0FBSyxLQUFLO0FBQ2xCLFNBQUssaUJBQWlCLEdBQUc7QUFDekIsUUFBSSxNQUFNLGlCQUFpQjtBQUN6QixXQUFLLHVCQUF1QixHQUFHO0FBQUEsSUFDakM7QUFDQSxTQUFLLG1CQUFtQixLQUFLLEtBQUs7QUFDbEMsU0FBSyxVQUFVLEdBQUc7QUFFbEIsV0FBTyxJQUFJLG1CQUFtQjtBQUFBLE1BQzVCLFVBQVUsTUFBWTtBQUNwQixhQUFLLFlBQVksS0FBSyxLQUFLO0FBQUEsTUFDN0I7QUFBQSxNQUNBLHlCQUF5Qix3QkFBd0I7QUFBQSxJQUNuRCxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV08sY0FBYyxLQUFVLFlBQThCO0FBQzNELFVBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJLFFBQVEsS0FBSyxVQUFVLENBQUM7QUFDbkUsUUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLElBQ0Y7QUFDQSxlQUFXLFNBQVMsU0FBUztBQUMzQixZQUFNLGlCQUFpQixNQUFNO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBQUEsRUFFTyxPQUFPLEtBQVUsWUFBd0IsVUFBd0I7QUFDdEUsVUFBTSxPQUFPLFFBQVEsS0FBSyxVQUFVO0FBQ3BDLFVBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJLElBQUk7QUFDL0MsUUFBSSxDQUFDLFNBQVM7QUFDWjtBQUFBLElBQ0Y7QUFDQSxVQUFNLFFBQVEsUUFBUSxVQUFVLENBQUMsVUFBVSxNQUFNLGFBQWEsUUFBUTtBQUN0RSxRQUFJLFVBQVUsSUFBSTtBQUNoQjtBQUFBLElBQ0Y7QUFDQSxZQUFRLE9BQU8sT0FBTyxDQUFDO0FBQ3ZCLFFBQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsV0FBSyxrQkFBa0IsT0FBTyxJQUFJO0FBQUEsSUFDcEM7QUFDQSxTQUFLLG9CQUFvQixHQUFHO0FBQUEsRUFDOUI7QUFBQSxFQUVPLG1CQUFtQixLQUFVLFVBQXdCO0FBQzFELGVBQVcsQ0FBQyxNQUFNLE9BQU8sS0FBSyxLQUFLLG1CQUFtQjtBQUNwRCxZQUFNLFlBQVksUUFBUSxPQUFPLENBQUMsVUFBVSxNQUFNLGFBQWEsUUFBUTtBQUN2RSxVQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLGFBQUssa0JBQWtCLE9BQU8sSUFBSTtBQUFBLE1BQ3BDLFdBQVcsVUFBVSxXQUFXLFFBQVEsUUFBUTtBQUM5QyxhQUFLLGtCQUFrQixJQUFJLE1BQU0sU0FBUztBQUFBLE1BQzVDO0FBQUEsSUFDRjtBQUNBLFNBQUssb0JBQW9CLEdBQUc7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV1EsdUJBQXVCLEtBQVUsV0FBeUI7QUFDaEUsVUFBTSxVQUFVLEtBQUssa0JBQWtCLElBQUksU0FBUztBQUNwRCxzQkFBa0IsT0FBTztBQUN6QixlQUFXLFNBQVMsU0FBUyxPQUFPLEdBQUc7QUFDckMsWUFBTSxpQkFBaUIsTUFBTTtBQUFBLElBQy9CO0FBQ0EsU0FBSyxrQkFBa0IsT0FBTyxTQUFTO0FBQ3ZDLFNBQUssb0JBQW9CLEdBQUc7QUFBQSxFQUM5QjtBQUFBLEVBRVEsa0JBQWtCLEtBQVUsTUFBWSxNQUFvQjtBQUNsRSxTQUFLLFFBQVEsQ0FBQyxTQUFTO0FBQ3JCLFdBQ0csU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixhQUFhLGNBQWMsQ0FBQyxFQUNqRSxRQUFRLGNBQWMsRUFDdEIsUUFBUSxtQkFBbUIsWUFBWTtBQUN0QyxjQUFNLGNBQWMsTUFBTSxRQUFRO0FBQUEsVUFDaEM7QUFBQSxVQUNBLFNBQVMsS0FBSyxxQkFBcUIsS0FBSyxJQUFJO0FBQUEsVUFDNUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixhQUFhLGtCQUFrQjtBQUFBLFFBQ3BFLENBQUM7QUFDRCxZQUFJLGFBQWE7QUFFZixlQUFLLHVCQUF1QixLQUFLLElBQUk7QUFBQSxRQUN2QztBQUFBLE1BQ0YsQ0FBQyxDQUFDO0FBQUEsSUFDTixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRVEsaUJBQWlCLEtBQVUsTUFBb0IsU0FBaUM7QUFJdEYsVUFBTSxlQUFlLE1BQTBCLEtBQUsscUJBQXFCLEtBQUssSUFBSTtBQUVsRixVQUFNLGVBQWUsS0FBSyxVQUFVLGNBQWMsU0FBUyxJQUFJO0FBQy9ELFNBQUssbUJBQW1CLEtBQUssY0FBYyxZQUFZO0FBRXZELFFBQUksWUFBZ0M7QUFDcEMsVUFBTSx1QkFBdUIsS0FBSyxLQUFLO0FBQ3ZDLFFBQUksc0JBQXNCO0FBQ3hCLGtCQUFZLHFCQUFxQixXQUFXLEVBQUUsS0FBSyx5QkFBeUIsQ0FBQztBQUM3RSxjQUFRLFdBQVcsWUFBWTtBQUMvQixpQkFBVyxXQUFXLE9BQU87QUFDN0IsV0FBSyxtQkFBbUIsS0FBSyxXQUFXLFlBQVk7QUFBQSxJQUN0RDtBQUtBLFVBQU0sZ0JBQWdCLE1BQVk7QUFDaEMsV0FBSyxnQkFBZ0IsSUFBSTtBQUN6QixXQUFLLE9BQU8sS0FBSztBQUFBLElBQ25CO0FBQ0EsU0FBSyxVQUFVLGlCQUFpQixlQUFlLGFBQWE7QUFFNUQsV0FBTztBQUFBLE1BQ0w7QUFBQSxNQUNBLHFCQUFxQixNQUFZO0FBQy9CLGFBQUssVUFBVSxvQkFBb0IsZUFBZSxhQUFhO0FBQUEsTUFDakU7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLHVCQUF1QixLQUFnQjtBQUM3QyxRQUFJLEtBQUssMEJBQTBCO0FBQ2pDO0FBQUEsSUFDRjtBQUNBLFNBQUssMkJBQTJCLElBQUkscUNBQXFDO0FBQUEsTUFDdkUscUJBQXFCLENBQUMsU0FBa0IsS0FBSyxvQkFBb0IsS0FBSyxJQUFJO0FBQUEsSUFDNUUsQ0FBQztBQUNELFNBQUsseUJBQXlCLEtBQUs7QUFBQSxFQUNyQztBQUFBLEVBRVEsaUJBQWlCLEtBQWdCO0FBQ3ZDLFFBQUksS0FBSyxpQkFBaUI7QUFDeEI7QUFBQSxJQUNGO0FBQ0EsU0FBSyxrQkFBa0IsSUFBSSw0QkFBNEI7QUFBQSxNQUNyRDtBQUFBLE1BQ0EsVUFBVSxNQUFZO0FBQ3BCLGFBQUssVUFBVSxHQUFHO0FBQUEsTUFDcEI7QUFBQSxNQUNBLG9CQUFvQixDQUFDLFNBQWU7QUFDbEMsYUFBSyx1QkFBdUIsS0FBSyxJQUFJO0FBQUEsTUFDdkM7QUFBQSxNQUNBLFlBQVksQ0FBQyxNQUFNLFNBQWU7QUFDaEMsYUFBSyxlQUFlLEtBQUssTUFBTSxJQUFJO0FBQUEsTUFDckM7QUFBQSxNQUNBLFVBQVUsQ0FBQyxTQUFTLFlBQWtCO0FBQ3BDLGFBQUssYUFBYSxLQUFLLFNBQVMsT0FBTztBQUFBLE1BQ3pDO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxnQkFBZ0IsS0FBSztBQUFBLEVBQzVCO0FBQUEsRUFFUSxhQUFhLFNBQTRCO0FBQy9DLFlBQVEsWUFBWSw4QkFBOEI7QUFFbEQsWUFBUSxzQkFBc0I7QUFDOUIsWUFBUSxTQUFTLDhCQUE4QjtBQUFBLEVBQ2pEO0FBQUEsRUFFUSxnQkFBZ0IsTUFBMEI7QUFDaEQsVUFBTSxhQUFhLEtBQUssaUJBQWlCLElBQUksSUFBSTtBQUNqRCxlQUFXLFdBQVcsQ0FBQyxZQUFZLGNBQWMsWUFBWSxXQUFXLEtBQUssZUFBZSxHQUFHO0FBQzdGLFVBQUksU0FBUztBQUNYLGFBQUssYUFBYSxPQUFPO0FBQUEsTUFDM0I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZUSx1QkFBdUIsS0FBVSxNQUFvQjtBQUMzRCxRQUFJLENBQUMsS0FBSyw0QkFBNEIsS0FBSyxJQUFJLEtBQUssS0FBSyxXQUFXLEtBQUssSUFBSSxHQUFHO0FBQzlFO0FBQUEsSUFDRjtBQUNBLGVBQVcsQ0FBQyxZQUFZLE9BQU8sS0FBSyxLQUFLLG1CQUFtQjtBQUMxRCxpQkFBVyxTQUFTLFNBQVM7QUFDM0IsWUFBSSxDQUFDLE1BQU0sbUJBQW1CLENBQUMsTUFBTSxpQkFBaUI7QUFDcEQ7QUFBQSxRQUNGO0FBQ0EsY0FBTSxnQkFBZ0IsZUFBZSxRQUFTLE1BQU0sU0FBUyxhQUFhLFFBQVEsRUFBRSxLQUFLLGlCQUFpQixNQUFNLGtCQUFrQixXQUFXLENBQUM7QUFDOUksWUFBSSxlQUFlO0FBQ2pCLGdCQUFNLGdCQUFnQixNQUFNO0FBQUEsUUFDOUI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGVBQWUsS0FBVSxNQUFZLE1BQTJCO0FBRXRFLFVBQU0sWUFBWSxLQUFLLHFCQUFxQixLQUFLLEtBQUssSUFBSTtBQUMxRCxRQUFJLGNBQWMsTUFBTTtBQUN0QjtBQUFBLElBQ0Y7QUFDQSxTQUFLLGtCQUFrQixLQUFLLE1BQU0sU0FBUztBQUFBLEVBQzdDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZ0JRLGFBQWEsS0FBVSxTQUFpQixTQUF1QjtBQUVyRSxVQUFNLHFCQUFxQixvQkFBSSxJQUF5QjtBQUN4RCxlQUFXLENBQUMsWUFBWSxPQUFPLEtBQUssS0FBSyxtQkFBbUI7QUFDMUQsWUFBTSxjQUFjLFdBQVcsWUFBWSxTQUFTLE9BQU87QUFDM0QsVUFBSSxnQkFBZ0IsTUFBTTtBQUN4QjtBQUFBLE1BQ0Y7QUFDQSxpQkFBVyxTQUFTLFNBQVM7QUFDM0IsY0FBTSxPQUFPO0FBQUEsTUFDZjtBQUNBLHlCQUFtQixJQUFJLGFBQWEsT0FBTztBQUMzQyxXQUFLLGtCQUFrQixPQUFPLFVBQVU7QUFBQSxJQUMxQztBQUVBLGVBQVcsQ0FBQyxhQUFhLE9BQU8sS0FBSyxvQkFBb0I7QUFDdkQsWUFBTSxrQkFBa0IsS0FBSyxrQkFBa0IsSUFBSSxXQUFXO0FBQzlELFVBQUksaUJBQWlCO0FBRW5CLHdCQUFnQixLQUFLLEdBQUcsT0FBTztBQUFBLE1BQ2pDLE9BQU87QUFDTCxhQUFLLGtCQUFrQixJQUFJLGFBQWEsT0FBTztBQUFBLE1BQ2pEO0FBQUEsSUFDRjtBQUVBLGVBQVcsaUJBQWlCLEtBQUssZ0JBQWdCO0FBRS9DLFlBQU0sdUJBQXVCLG9CQUFJLElBQW9CO0FBQ3JELGlCQUFXLGdCQUFnQixlQUFlO0FBQ3hDLGNBQU0sY0FBYyxXQUFXLGNBQWMsU0FBUyxPQUFPO0FBQzdELFlBQUksZ0JBQWdCLE1BQU07QUFDeEIsK0JBQXFCLElBQUksY0FBYyxXQUFXO0FBQUEsUUFDcEQ7QUFBQSxNQUNGO0FBQ0EsaUJBQVcsQ0FBQyxjQUFjLFdBQVcsS0FBSyxzQkFBc0I7QUFDOUQsc0JBQWMsT0FBTyxZQUFZO0FBQ2pDLHNCQUFjLElBQUksV0FBVztBQUFBLE1BQy9CO0FBQUEsSUFDRjtBQUlBLFNBQUssVUFBVSxHQUFHO0FBQUEsRUFDcEI7QUFBQSxFQUVRLGtCQUEyQjtBQUNqQyxlQUFXLFdBQVcsS0FBSyxrQkFBa0IsT0FBTyxHQUFHO0FBQ3JELFVBQUksUUFBUSxLQUFLLENBQUMsVUFBVSxNQUFNLGVBQWUsR0FBRztBQUNsRCxlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVRLFdBQVcsS0FBVSxNQUF1QjtBQUNsRCxlQUFXLGlCQUFpQixLQUFLLGdCQUFnQjtBQUMvQyxpQkFBVyxnQkFBZ0IsZUFBZTtBQUN4QyxZQUFJLGNBQWMsRUFBRSxLQUFLLGlCQUFpQixNQUFNLGtCQUFrQixhQUFhLENBQUMsR0FBRztBQUNqRixpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSxhQUFhLE1BQXVCO0FBQzFDLFlBQVEsS0FBSyxrQkFBa0IsSUFBSSxJQUFJLEdBQUcsVUFBVSxLQUFLO0FBQUEsRUFDM0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWVEsZ0JBQWdCLEtBQVUsTUFBZ0M7QUFDaEUsVUFBTSxVQUFVLEtBQUssa0JBQWtCLElBQUksSUFBSTtBQUMvQyxzQkFBa0IsT0FBTztBQUN6QixVQUFNLE9BQU8sb0JBQUksSUFBWTtBQUM3QixVQUFNLGNBQWdDLENBQUM7QUFDdkMsZUFBVyxTQUFTLFNBQVM7QUFDM0IsWUFBTSxhQUFhLElBQUksUUFBUSxVQUFVLE1BQU0sUUFBUSxHQUFHLFFBQVEsTUFBTTtBQUN4RSxZQUFNLE1BQU0sR0FBRyxVQUFVO0FBQUEsRUFBSyxNQUFNLGFBQWE7QUFDakQsVUFBSSxLQUFLLElBQUksR0FBRyxHQUFHO0FBQ2pCO0FBQUEsTUFDRjtBQUNBLFdBQUssSUFBSSxHQUFHO0FBQ1osa0JBQVksS0FBSyxFQUFFLGVBQWUsTUFBTSxlQUFlLFdBQVcsQ0FBQztBQUFBLElBQ3JFO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVRLG1CQUFtQixLQUFVLE1BQXdCO0FBQzNELFVBQU0sVUFBVSxLQUFLLGtCQUFrQixJQUFJLElBQUk7QUFFL0Msc0JBQWtCLE9BQU87QUFDekIsVUFBTSxZQUFZLENBQUMsR0FBRyxJQUFJLElBQUksUUFBUSxJQUFJLENBQUMsVUFBVSxNQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQ3JFLFdBQU8sVUFBVSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsVUFBVSxRQUFRLEdBQUcsUUFBUSxRQUFRO0FBQUEsRUFDdEY7QUFBQSxFQUVRLFlBQVksS0FBVSxNQUFzQjtBQUNsRCxVQUFNLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsYUFBYSxlQUFlO0FBRXZFLFdBQU8sQ0FBQyxRQUFRLEdBQUcsS0FBSyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUk7QUFBQSxFQUNsRTtBQUFBLEVBRVEsVUFBVSxLQUFnQjtBQUNoQyxVQUFNLGNBQWMsb0JBQUksSUFBa0I7QUFDMUMsZUFBVyxRQUFRLElBQUksVUFBVSxnQkFBZ0IsU0FBUyxRQUFRLEdBQUc7QUFDbkUsWUFBTSxPQUFPLEtBQUs7QUFDbEIsVUFBSSxFQUFFLGdCQUFnQixlQUFlO0FBQ25DO0FBQUEsTUFDRjtBQUVBLFlBQU0sT0FBTyxLQUFLLE1BQU07QUFDeEIsVUFBSSxTQUFTLFFBQVc7QUFDdEI7QUFBQSxNQUNGO0FBR0EsWUFBTSxZQUFZLEtBQUsscUJBQXFCLEtBQUssSUFBSTtBQUNyRCxVQUFJLGNBQWMsTUFBTTtBQUN0QjtBQUFBLE1BQ0Y7QUFFQSxrQkFBWSxJQUFJLElBQUk7QUFDcEIsWUFBTSxVQUFVLEtBQUssWUFBWSxLQUFLLFNBQVM7QUFLL0MsMkJBQXFCLEtBQUssUUFBUSxJQUFJO0FBQ3RDLFlBQU0sYUFBYSxLQUFLLGlCQUFpQixJQUFJLElBQUk7QUFDakQsVUFBSSxZQUFZO0FBQ2QsYUFBSyx3QkFBd0IsWUFBWSxPQUFPO0FBQUEsTUFDbEQsT0FBTztBQUNMLGFBQUssaUJBQWlCLElBQUksTUFBTSxLQUFLLGlCQUFpQixLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQUEsTUFDM0U7QUFBQSxJQUNGO0FBRUEsZUFBVyxDQUFDLE1BQU0sVUFBVSxLQUFLLEtBQUssa0JBQWtCO0FBQ3RELFVBQUksWUFBWSxJQUFJLElBQUksR0FBRztBQUN6QjtBQUFBLE1BQ0Y7QUFFQSwyQkFBcUIsS0FBSyxRQUFRLEtBQUs7QUFDdkMsaUJBQVcsb0JBQW9CO0FBQy9CLGlCQUFXLGFBQWEsT0FBTztBQUMvQixpQkFBVyxXQUFXLE9BQU87QUFDN0IsV0FBSyxpQkFBaUIsT0FBTyxJQUFJO0FBQUEsSUFDbkM7QUFFQSxTQUFLLGdCQUFnQixHQUFHO0FBQUEsRUFDMUI7QUFBQSxFQUVRLG9CQUFvQixLQUFnQjtBQUMxQyxTQUFLLFVBQVUsR0FBRztBQUNsQixRQUFJLEtBQUssa0JBQWtCLFNBQVMsR0FBRztBQUNyQyxXQUFLLGlCQUFpQixPQUFPO0FBQzdCLFdBQUssa0JBQWtCO0FBQUEsSUFDekI7QUFDQSxRQUFJLEtBQUssZ0JBQWdCLEdBQUc7QUFDMUI7QUFBQSxJQUNGO0FBRUEsU0FBSywwQkFBMEIsT0FBTztBQUN0QyxTQUFLLDJCQUEyQjtBQUFBLEVBQ2xDO0FBQUEsRUFFUSxtQkFBbUIsS0FBVSxTQUFzQixnQkFBZ0Q7QUFNekcsVUFBTSxpQkFBaUIsQ0FBQyxXQUE2QjtBQUNuRCxhQUFPLGVBQWU7QUFDdEIsWUFBTSxPQUFPLGVBQWU7QUFDNUIsVUFBSSxTQUFTLFFBQVc7QUFDdEI7QUFBQSxNQUNGO0FBQ0EsWUFBTSxPQUFPLElBQUksS0FBSztBQUN0QixXQUFLLGtCQUFrQixLQUFLLE1BQU0sSUFBSTtBQUN0QyxXQUFLLGlCQUFpQixNQUFNO0FBQUEsSUFDOUI7QUFDQSxZQUFRLGlCQUFpQixTQUFTLGNBQWM7QUFDaEQsWUFBUSxpQkFBaUIsZUFBZSxjQUFjO0FBQ3RELFlBQVEsaUJBQWlCLFlBQVksQ0FBQyxXQUFXO0FBQy9DLFVBQUksT0FBTyxXQUFXLHFCQUFxQjtBQUN6Qyx1QkFBZSxNQUFNO0FBQUEsTUFDdkI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFUSxZQUFZLEtBQVUsT0FBd0I7QUFHcEQsVUFBTSxVQUFVLEtBQUssa0JBQWtCLElBQUksTUFBTSxJQUFJO0FBQ3JELFFBQUksQ0FBQyxTQUFTO0FBQ1o7QUFBQSxJQUNGO0FBQ0EsVUFBTSxRQUFRLFFBQVEsUUFBUSxLQUFLO0FBQ25DLFFBQUksVUFBVSxJQUFJO0FBQ2hCO0FBQUEsSUFDRjtBQUNBLFlBQVEsT0FBTyxPQUFPLENBQUM7QUFDdkIsUUFBSSxRQUFRLFdBQVcsR0FBRztBQUN4QixXQUFLLGtCQUFrQixPQUFPLE1BQU0sSUFBSTtBQUFBLElBQzFDO0FBQ0EsU0FBSyxvQkFBb0IsR0FBRztBQUFBLEVBQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXUSxxQkFBcUIsS0FBVSxNQUE2QjtBQUNsRSxRQUFJLEtBQUssYUFBYSxJQUFJLEdBQUc7QUFDM0IsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLGdCQUErQjtBQUNuQyxlQUFXLENBQUMsWUFBWSxPQUFPLEtBQUssS0FBSyxtQkFBbUI7QUFDMUQsWUFBTSxpQkFBaUIsUUFBUSxLQUFLLENBQUMsVUFBVSxNQUFNLFNBQVMsU0FBUztBQUN2RSxVQUFJLGtCQUFrQixRQUFRLEVBQUUsS0FBSyxpQkFBaUIsTUFBTSxrQkFBa0IsV0FBVyxDQUFDLE1BQU0sa0JBQWtCLFFBQVEsV0FBVyxTQUFTLGNBQWMsU0FBUztBQUNuSyx3QkFBZ0I7QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV1EscUJBQXFCLEtBQVUsTUFBd0M7QUFDN0UsVUFBTSxPQUFPLEtBQUssTUFBTTtBQUN4QixXQUFPLFNBQVMsU0FBWSxTQUFZLEtBQUsscUJBQXFCLEtBQUssSUFBSSxLQUFLO0FBQUEsRUFDbEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVUSxvQkFBb0IsS0FBVSxNQUF1QjtBQUMzRCxXQUFPLEtBQUssNEJBQTRCLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxXQUFXLEtBQUssSUFBSTtBQUFBLEVBQ2xGO0FBQUEsRUFFUSxxQkFBcUIsS0FBVSxNQUFnQztBQUNyRSxVQUFNLFdBQVcsZUFBZTtBQUNoQyxhQUFTLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsYUFBYSxvQkFBb0IsQ0FBQztBQUdsRixlQUFXLGNBQWMsS0FBSyxnQkFBZ0IsS0FBSyxJQUFJLEdBQUc7QUFDeEQsZUFBUyxTQUFTLElBQUk7QUFDdEIsc0JBQWdCLFVBQVUsV0FBVyxVQUFVO0FBQy9DLGVBQVMsV0FBVyxLQUFLLFdBQVcsYUFBYSxFQUFFO0FBQUEsSUFDckQ7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEsd0JBQXdCLFlBQTRCLFNBQXVCO0FBQ2pGLGVBQVcsV0FBVyxjQUFjLE9BQU87QUFDM0MsUUFBSSxXQUFXLFdBQVc7QUFDeEIsaUJBQVcsV0FBVyxXQUFXLE9BQU87QUFBQSxJQUMxQztBQUFBLEVBQ0Y7QUFBQSxFQUVRLGdCQUFnQixLQUFnQjtBQUN0QyxVQUFNLGFBQWEsSUFBSSxVQUFVLG9CQUFvQixZQUFZO0FBQ2pFLFVBQU0sYUFBYSxZQUFZLE1BQU07QUFDckMsVUFBTSxrQkFBa0IsZUFBZSxTQUFZLE9BQU8sS0FBSyxxQkFBcUIsS0FBSyxVQUFVO0FBRW5HLFFBQUksb0JBQW9CLFFBQVEsQ0FBQyxZQUFZO0FBQzNDLFdBQUssaUJBQWlCLE9BQU87QUFDN0IsV0FBSyxrQkFBa0I7QUFDdkI7QUFBQSxJQUNGO0FBRUEsUUFBSSxDQUFDLEtBQUssaUJBQWlCO0FBQ3pCLFlBQU0sY0FBYyxXQUFXLFlBQVksY0FBYyxLQUFLLGNBQTJCLHVCQUF1QjtBQUNoSCxVQUFJLENBQUMsYUFBYTtBQUNoQjtBQUFBLE1BQ0Y7QUFDQSxXQUFLLGtCQUFrQixZQUFZLFVBQVUsRUFBRSxLQUFLLENBQUMsMkJBQTJCLHdCQUF3QixFQUFFLENBQUM7QUFDM0csY0FBUSxLQUFLLGlCQUFpQixZQUFZO0FBRzFDLFdBQUssbUJBQW1CLEtBQUssS0FBSyxpQkFBaUIsTUFBTTtBQUN2RCxjQUFNLE9BQU8sSUFBSSxVQUFVLG9CQUFvQixZQUFZLEdBQUcsTUFBTTtBQUNwRSxlQUFPLFNBQVMsU0FBWSxTQUFZLEtBQUsscUJBQXFCLEtBQUssSUFBSSxLQUFLO0FBQUEsTUFDbEYsQ0FBQztBQUFBLElBQ0g7QUFFQSxlQUFXLEtBQUssaUJBQWlCLEtBQUssWUFBWSxLQUFLLGVBQWUsQ0FBQztBQUFBLEVBQ3pFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXUSxtQkFBbUIsS0FBVSxPQUF3QjtBQUMzRCxVQUFNLEVBQUUsbUJBQW1CLHFCQUFxQixJQUFJO0FBQ3BELFFBQUksQ0FBQyxNQUFNLG1CQUFvQixDQUFDLHdCQUF3QixDQUFDLG1CQUFvQjtBQUMzRTtBQUFBLElBQ0Y7QUFDQSxVQUFNLGdCQUFnQixPQUFPLGlCQUFpQixTQUFTLE1BQU07QUFDM0QsVUFBSSxzQkFBc0I7QUFDeEIsYUFBSyxZQUFZLEtBQUssS0FBSztBQUFBLE1BQzdCO0FBQ0EsMEJBQW9CO0FBQUEsSUFDdEIsR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQUEsRUFDbkI7QUFDRjtBQVNBLE1BQU0sNkNBQTZDLHNCQUFzQjtBQUFBLEVBQ3REO0FBQUEsRUFFVixZQUFZLFFBQStEO0FBQ2hGLFVBQU07QUFDTixTQUFLLHNCQUFzQixPQUFPO0FBQUEsRUFDcEM7QUFBQSxFQUVnQixTQUFlO0FBQzdCLFVBQU0sT0FBTztBQUViLFNBQUssb0JBQXFDO0FBQUEsTUFDeEMsU0FBUyxNQUFNO0FBQUEsTUFDZixZQUFZO0FBQUEsTUFDWixjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLElBQUksRUFBRSxNQUFNO0FBQ3pELGFBQUssaUJBQWlCLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDakMsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUFtQztBQUFBLE1BQ3RDLFNBQVMsTUFBTTtBQUFBLE1BQ2YsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNO0FBQzlELGFBQUssaUJBQWlCLENBQUMsT0FBTyxDQUFDO0FBQy9CLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxvQkFBcUM7QUFBQSxNQUN4QyxTQUFTLE1BQU07QUFBQSxNQUNmLFlBQVk7QUFBQSxNQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDekQsYUFBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7QUFDNUIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUEyQztBQUFBLE1BQzlDLFNBQVMsTUFBTTtBQUFBLE1BQ2YsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUN6RCxhQUFLLGlCQUFpQixDQUFDLElBQUksQ0FBQztBQUM1QixlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQTJDO0FBQUEsTUFDOUMsU0FBUyxNQUFNO0FBQUEsTUFDZixZQUFZO0FBQUEsTUFDWixjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLElBQUksRUFBRSxNQUFNO0FBQ3pELGFBQUssaUJBQWlCLENBQUMsSUFBSSxDQUFDO0FBQzVCLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxvQkFBcUM7QUFBQSxNQUN4QyxTQUFTLE1BQU07QUFBQSxNQUNmLFlBQVk7QUFBQSxNQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDekQsYUFBSyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNqQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQXFDO0FBQUEsTUFDeEMsU0FBUyxNQUFNO0FBQUEsTUFDZixZQUFZO0FBQUEsTUFDWixjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLElBQUksRUFBRSxNQUFNO0FBQ3pELGFBQUssaUJBQWlCLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDakMsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLG9CQUEyQztBQUFBLE1BQzlDLFNBQVMsTUFBTTtBQUFBLE1BQ2YsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUN6RCxhQUFLLGlCQUFpQixDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ2pDLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxvQkFBc0M7QUFBQSxNQUN6QyxTQUFTLE1BQU07QUFBQSxNQUNmLFlBQVk7QUFBQSxNQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDekQsYUFBSyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNqQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQXFDO0FBQUEsTUFDeEMsU0FBUyxNQUFNO0FBQUEsTUFDZixZQUFZO0FBQUEsTUFDWixjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLE1BQU0sT0FBTyxFQUFFLE1BQU07QUFDbEUsYUFBSyxpQkFBaUIsQ0FBQyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFDLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxvQkFBb0M7QUFBQSxNQUN2QyxTQUFTLE1BQU07QUFBQSxNQUNmLFlBQVk7QUFBQSxNQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU07QUFDekQsYUFBSyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNqQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQStDO0FBQUEsTUFDbEQsU0FBUyxZQUFZO0FBQUEsTUFDckIsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxNQUFNLE9BQU8sRUFBRSxNQUFNO0FBQ2xFLGFBQUssaUJBQWlCLENBQUMsS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQyxlQUFPLFNBQVM7QUFBQSxNQUNsQjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssb0JBQThDO0FBQUEsTUFDakQsU0FBUyxZQUFZO0FBQUEsTUFDckIsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUN6RCxhQUFLLGlCQUFpQixDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ2pDLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRVEsaUJBQWlCLE9BQXVCO0FBQzlDLGVBQVcsUUFBUSxPQUFPO0FBQ3hCLFVBQUksS0FBSyxvQkFBb0IsSUFBSSxHQUFHO0FBQ2xDLGNBQU0sSUFBSSxvQkFBb0IsSUFBSTtBQUFBLE1BQ3BDO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQVlPLE1BQU0sOEJBQThCLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlsQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTWixZQUFZLEtBQVUsVUFBa0I7QUFDN0MsVUFBTTtBQUNOLFNBQUssTUFBTTtBQUNYLFNBQUssV0FBVztBQUFBLEVBQ2xCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBbUJPLHVCQUF1QixjQUFpRDtBQUM3RSxXQUFPLFdBQVcsRUFBRSxPQUFPLEtBQUssS0FBSyxZQUFZO0FBQUEsRUFDbkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLDBCQUEwQixZQUFpQztBQUNoRSxXQUFPLFdBQVcsRUFBRSxtQkFBbUIsS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUM3RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sZ0JBQWdCLFlBQWlDO0FBQ3RELFdBQU8sV0FBVyxFQUFFLFNBQVMsS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUNuRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVPLG1DQUFtQyxZQUFpQztBQUN6RSxXQUFPLFdBQVcsRUFBRSw0QkFBNEIsS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUN0RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY08sWUFBWSxRQUE0RDtBQUM3RSxXQUFPLFdBQVcsRUFBRSxLQUFLO0FBQUEsTUFDdkIsaUJBQWlCLE9BQU87QUFBQSxNQUN4QixLQUFLLEtBQUs7QUFBQSxNQUNWLGlCQUFpQixPQUFPO0FBQUEsTUFDeEIsTUFBTSxPQUFPO0FBQUEsTUFDYixtQkFBbUIsT0FBTztBQUFBLE1BQzFCLGVBQWUsT0FBTztBQUFBLE1BQ3RCLFlBQVksT0FBTztBQUFBLE1BQ25CLFVBQVUsS0FBSztBQUFBLE1BQ2Ysc0JBQXNCLE9BQU87QUFBQSxJQUMvQixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNZ0IsV0FBaUI7QUFDL0IsZUFBVyxFQUFFLG1CQUFtQixLQUFLLEtBQUssS0FBSyxRQUFRO0FBQ3ZELFVBQU0sU0FBUztBQUFBLEVBQ2pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXTyxxQkFBcUIsWUFBOEI7QUFDeEQsZUFBVyxFQUFFLFlBQVksS0FBSyxLQUFLLFVBQVU7QUFBQSxFQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQWMsWUFBOEI7QUFDakQsZUFBVyxFQUFFLE9BQU8sS0FBSyxLQUFLLFlBQVksS0FBSyxRQUFRO0FBQUEsRUFDekQ7QUFDRjtBQU9PLE1BQU0sNEJBQTRCLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUk3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ULFlBQVksTUFBYztBQUMvQixVQUFNLGlCQUFpQixJQUFJLG9DQUFvQztBQUMvRCxTQUFLLE9BQU87QUFDWixTQUFLLE9BQU87QUFBQSxFQUNkO0FBQ0Y7QUFTTyxTQUFTLHdCQUF3QixLQUFVLFlBQWlDO0FBQ2pGLFNBQU8sV0FBVyxFQUFFLFNBQVMsS0FBSyxVQUFVO0FBQzlDO0FBZ0JPLFNBQVMsa0NBQWtDLEtBQVUsWUFBaUM7QUFDM0YsU0FBTyxXQUFXLEVBQUUsbUJBQW1CLEtBQUssVUFBVTtBQUN4RDtBQWVPLFNBQVMsb0JBQW9CLFFBQStDO0FBQ2pGLFNBQU8sV0FBVyxFQUFFLEtBQUs7QUFBQSxJQUN2QixLQUFLLE9BQU87QUFBQSxJQUNaLGVBQWUsT0FBTztBQUFBLElBQ3RCLFlBQVksT0FBTztBQUFBLElBQ25CLFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFDSDtBQWVPLFNBQVMsNkJBQTZCLEtBQVUsWUFBOEI7QUFDbkYsYUFBVyxFQUFFLGNBQWMsS0FBSyxVQUFVO0FBQzVDO0FBYU8sU0FBUyxzQkFBc0IsS0FBVSxZQUF3QixVQUF3QjtBQUM5RixhQUFXLEVBQUUsT0FBTyxLQUFLLFlBQVksUUFBUTtBQUMvQztBQUVBLFNBQVMsYUFBa0M7QUFDekMsU0FBTyx5QkFBOEMseUJBQXlCLElBQUksb0JBQW9CLENBQUMsRUFBRTtBQUMzRztBQWFBLFNBQVMsV0FBVyxNQUFjLFNBQWlCLFNBQWdDO0FBQ2pGLE1BQUksU0FBUyxTQUFTO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxLQUFLLFdBQVcsR0FBRyxPQUFPLEdBQUcsSUFBSSxVQUFVLEtBQUssTUFBTSxRQUFRLE1BQU0sSUFBSTtBQUNqRjsiLAogICJuYW1lcyI6IFtdCn0K