@gravitee/ui-components 3.25.3 → 3.25.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (547) hide show
  1. package/package.json +10 -7
  2. package/src/atoms/gv-autocomplete.d.ts +104 -0
  3. package/src/atoms/gv-autocomplete.js +339 -353
  4. package/src/atoms/gv-autocomplete.js.map +1 -0
  5. package/src/atoms/gv-button.d.ts +109 -0
  6. package/src/atoms/gv-button.js +315 -152
  7. package/src/atoms/gv-button.js.map +1 -0
  8. package/src/atoms/gv-checkbox.d.ts +114 -0
  9. package/src/atoms/gv-checkbox.js +128 -78
  10. package/src/atoms/gv-checkbox.js.map +1 -0
  11. package/src/atoms/gv-date-picker-calendar.d.ts +190 -0
  12. package/src/atoms/gv-date-picker-calendar.js +699 -699
  13. package/src/atoms/gv-date-picker-calendar.js.map +1 -0
  14. package/src/atoms/gv-date-picker-cell.d.ts +80 -0
  15. package/src/atoms/gv-date-picker-cell.js +117 -108
  16. package/src/atoms/gv-date-picker-cell.js.map +1 -0
  17. package/src/atoms/gv-date-picker.d.ts +194 -0
  18. package/src/atoms/gv-date-picker.js +549 -442
  19. package/src/atoms/gv-date-picker.js.map +1 -0
  20. package/src/atoms/gv-file-upload.d.ts +64 -0
  21. package/src/atoms/gv-file-upload.js +288 -196
  22. package/src/atoms/gv-file-upload.js.map +1 -0
  23. package/src/atoms/gv-icon.d.ts +26 -0
  24. package/src/atoms/gv-icon.js +59 -47
  25. package/src/atoms/gv-icon.js.map +1 -0
  26. package/src/atoms/gv-image.d.ts +45 -0
  27. package/src/atoms/gv-image.js +93 -66
  28. package/src/atoms/gv-image.js.map +1 -0
  29. package/src/atoms/gv-input-message.d.ts +20 -0
  30. package/src/atoms/gv-input-message.js +49 -29
  31. package/src/atoms/gv-input-message.js.map +1 -0
  32. package/src/atoms/gv-input.d.ts +246 -0
  33. package/src/atoms/gv-input.js +400 -421
  34. package/src/atoms/gv-input.js.map +1 -0
  35. package/src/atoms/gv-link.d.ts +67 -0
  36. package/src/atoms/gv-link.js +143 -70
  37. package/src/atoms/gv-link.js.map +1 -0
  38. package/src/atoms/gv-message.d.ts +23 -0
  39. package/src/atoms/gv-message.js +98 -41
  40. package/src/atoms/gv-message.js.map +1 -0
  41. package/src/atoms/gv-metric.d.ts +32 -0
  42. package/src/atoms/gv-metric.js +74 -29
  43. package/src/atoms/gv-metric.js.map +1 -0
  44. package/src/atoms/gv-relative-time.d.ts +45 -0
  45. package/src/atoms/gv-relative-time.js +107 -148
  46. package/src/atoms/gv-relative-time.js.map +1 -0
  47. package/src/atoms/gv-select-native.d.ts +174 -0
  48. package/src/atoms/gv-select-native.js +289 -194
  49. package/src/atoms/gv-select-native.js.map +1 -0
  50. package/src/atoms/gv-select.d.ts +71 -0
  51. package/src/atoms/gv-select.js +323 -226
  52. package/src/atoms/gv-select.js.map +1 -0
  53. package/src/atoms/gv-spinner.d.ts +10 -0
  54. package/src/atoms/gv-spinner.js +29 -10
  55. package/src/atoms/gv-spinner.js.map +1 -0
  56. package/src/atoms/gv-state.d.ts +50 -0
  57. package/src/atoms/gv-state.js +76 -39
  58. package/src/atoms/gv-state.js.map +1 -0
  59. package/src/atoms/gv-switch.d.ts +60 -0
  60. package/src/atoms/gv-switch.js +187 -74
  61. package/src/atoms/gv-switch.js.map +1 -0
  62. package/src/atoms/gv-tag.d.ts +69 -0
  63. package/src/atoms/gv-tag.js +92 -45
  64. package/src/atoms/gv-tag.js.map +1 -0
  65. package/src/atoms/gv-text.d.ts +110 -0
  66. package/src/atoms/gv-text.js +105 -51
  67. package/src/atoms/gv-text.js.map +1 -0
  68. package/src/charts/gv-chart-bar.d.ts +50 -0
  69. package/src/charts/gv-chart-bar.js +64 -69
  70. package/src/charts/gv-chart-bar.js.map +1 -0
  71. package/src/charts/gv-chart-gauge.d.ts +58 -0
  72. package/src/charts/gv-chart-gauge.js +58 -62
  73. package/src/charts/gv-chart-gauge.js.map +1 -0
  74. package/src/charts/gv-chart-histogram.d.ts +48 -0
  75. package/src/charts/gv-chart-histogram.js +46 -58
  76. package/src/charts/gv-chart-histogram.js.map +1 -0
  77. package/src/charts/gv-chart-line.d.ts +52 -0
  78. package/src/charts/gv-chart-line.js +173 -189
  79. package/src/charts/gv-chart-line.js.map +1 -0
  80. package/src/charts/gv-chart-map.d.ts +50 -0
  81. package/src/charts/gv-chart-map.js +73 -75
  82. package/src/charts/gv-chart-map.js.map +1 -0
  83. package/src/charts/gv-chart-pie.d.ts +50 -0
  84. package/src/charts/gv-chart-pie.js +52 -57
  85. package/src/charts/gv-chart-pie.js.map +1 -0
  86. package/src/index.d.ts +77 -0
  87. package/src/index.js +1 -1
  88. package/src/index.js.map +1 -0
  89. package/src/lib/cron-expression.d.ts +1 -0
  90. package/src/lib/cron-expression.js +143 -176
  91. package/src/lib/cron-expression.js.map +1 -0
  92. package/src/lib/date.d.ts +1 -0
  93. package/src/lib/date.js +26 -35
  94. package/src/lib/date.js.map +1 -0
  95. package/src/lib/events.d.ts +1 -0
  96. package/src/lib/events.js +10 -11
  97. package/src/lib/events.js.map +1 -0
  98. package/src/lib/http-client-schema-form.d.ts +68 -0
  99. package/src/lib/http-client-schema-form.js +50 -50
  100. package/src/lib/http-client-schema-form.js.map +1 -0
  101. package/src/lib/http.d.ts +222 -0
  102. package/src/lib/http.js +221 -221
  103. package/src/lib/http.js.map +1 -0
  104. package/src/lib/i18n.d.ts +30 -0
  105. package/src/lib/i18n.js +40 -57
  106. package/src/lib/i18n.js.map +1 -0
  107. package/src/lib/item.d.ts +12 -0
  108. package/src/lib/item.js +66 -74
  109. package/src/lib/item.js.map +1 -0
  110. package/src/lib/properties.d.ts +42 -0
  111. package/src/lib/properties.js +110 -162
  112. package/src/lib/properties.js.map +1 -0
  113. package/src/lib/schema-form.d.ts +5 -0
  114. package/src/lib/schema-form.js +13 -16
  115. package/src/lib/schema-form.js.map +1 -0
  116. package/src/lib/studio.d.ts +2 -0
  117. package/src/lib/studio.js +116 -65
  118. package/src/lib/studio.js.map +1 -0
  119. package/src/lib/style.d.ts +6 -0
  120. package/src/lib/style.js +18 -19
  121. package/src/lib/style.js.map +1 -0
  122. package/src/lib/text-format.d.ts +6 -0
  123. package/src/lib/text-format.js +45 -55
  124. package/src/lib/text-format.js.map +1 -0
  125. package/src/lib/theme.d.ts +4 -0
  126. package/src/lib/theme.js +38 -43
  127. package/src/lib/theme.js.map +1 -0
  128. package/src/lib/utils.d.ts +9 -0
  129. package/src/lib/utils.js +72 -75
  130. package/src/lib/utils.js.map +1 -0
  131. package/src/mixins/chart-element.d.ts +39 -0
  132. package/src/mixins/chart-element.js +118 -106
  133. package/src/mixins/chart-element.js.map +1 -0
  134. package/src/mixins/input-element.d.ts +64 -0
  135. package/src/mixins/input-element.js +111 -131
  136. package/src/mixins/input-element.js.map +1 -0
  137. package/src/mixins/item-resource.d.ts +56 -0
  138. package/src/mixins/item-resource.js +76 -95
  139. package/src/mixins/item-resource.js.map +1 -0
  140. package/src/mixins/keyboard-element.d.ts +25 -0
  141. package/src/mixins/keyboard-element.js +44 -51
  142. package/src/mixins/keyboard-element.js.map +1 -0
  143. package/src/mixins/update-after-browser.d.ts +11 -0
  144. package/src/mixins/update-after-browser.js +10 -12
  145. package/src/mixins/update-after-browser.js.map +1 -0
  146. package/src/mixins/with-resize-observer.d.ts +12 -0
  147. package/src/mixins/with-resize-observer.js +46 -61
  148. package/src/mixins/with-resize-observer.js.map +1 -0
  149. package/src/mixins/with-skeleton-attribute.d.ts +35 -0
  150. package/src/mixins/with-skeleton-attribute.js +80 -88
  151. package/src/mixins/with-skeleton-attribute.js.map +1 -0
  152. package/src/molecules/gv-card-full.d.ts +78 -0
  153. package/src/molecules/gv-card-full.js +160 -47
  154. package/src/molecules/gv-card-full.js.map +1 -0
  155. package/src/molecules/gv-card-list.d.ts +33 -0
  156. package/src/molecules/gv-card-list.js +65 -47
  157. package/src/molecules/gv-card-list.js.map +1 -0
  158. package/src/molecules/gv-card.d.ts +65 -0
  159. package/src/molecules/gv-card.js +94 -22
  160. package/src/molecules/gv-card.js.map +1 -0
  161. package/src/molecules/gv-category-list.d.ts +17 -0
  162. package/src/molecules/gv-category-list.js +23 -15
  163. package/src/molecules/gv-category-list.js.map +1 -0
  164. package/src/molecules/gv-category.d.ts +64 -0
  165. package/src/molecules/gv-category.js +117 -43
  166. package/src/molecules/gv-category.js.map +1 -0
  167. package/src/molecules/gv-code.d.ts +192 -0
  168. package/src/molecules/gv-code.js +258 -220
  169. package/src/molecules/gv-code.js.map +1 -0
  170. package/src/molecules/gv-confirm.d.ts +60 -0
  171. package/src/molecules/gv-confirm.js +131 -113
  172. package/src/molecules/gv-confirm.js.map +1 -0
  173. package/src/molecules/gv-cron-editor.d.ts +115 -0
  174. package/src/molecules/gv-cron-editor.js +597 -375
  175. package/src/molecules/gv-cron-editor.js.map +1 -0
  176. package/src/molecules/gv-dropdown-menu.d.ts +28 -0
  177. package/src/molecules/gv-dropdown-menu.js +77 -52
  178. package/src/molecules/gv-dropdown-menu.js.map +1 -0
  179. package/src/molecules/gv-expandable.d.ts +37 -0
  180. package/src/molecules/gv-expandable.js +77 -54
  181. package/src/molecules/gv-expandable.js.map +1 -0
  182. package/src/molecules/gv-expression-language.d.ts +150 -0
  183. package/src/molecules/gv-expression-language.js +212 -256
  184. package/src/molecules/gv-expression-language.js.map +1 -0
  185. package/src/molecules/gv-identity-picture.d.ts +44 -0
  186. package/src/molecules/gv-identity-picture.js +102 -87
  187. package/src/molecules/gv-identity-picture.js.map +1 -0
  188. package/src/molecules/gv-list.d.ts +123 -0
  189. package/src/molecules/gv-list.js +167 -87
  190. package/src/molecules/gv-list.js.map +1 -0
  191. package/src/molecules/gv-metrics.d.ts +65 -0
  192. package/src/molecules/gv-metrics.js +103 -105
  193. package/src/molecules/gv-metrics.js.map +1 -0
  194. package/src/molecules/gv-modal.d.ts +64 -0
  195. package/src/molecules/gv-modal.js +157 -99
  196. package/src/molecules/gv-modal.js.map +1 -0
  197. package/src/molecules/gv-nav.d.ts +41 -0
  198. package/src/molecules/gv-nav.js +134 -123
  199. package/src/molecules/gv-nav.js.map +1 -0
  200. package/src/molecules/gv-option.d.ts +65 -0
  201. package/src/molecules/gv-option.js +177 -115
  202. package/src/molecules/gv-option.js.map +1 -0
  203. package/src/molecules/gv-plans.d.ts +73 -0
  204. package/src/molecules/gv-plans.js +327 -232
  205. package/src/molecules/gv-plans.js.map +1 -0
  206. package/src/molecules/gv-popover.d.ts +91 -0
  207. package/src/molecules/gv-popover.js +265 -172
  208. package/src/molecules/gv-popover.js.map +1 -0
  209. package/src/molecules/gv-promote.d.ts +108 -0
  210. package/src/molecules/gv-promote.js +152 -39
  211. package/src/molecules/gv-promote.js.map +1 -0
  212. package/src/molecules/gv-rating-list.d.ts +77 -0
  213. package/src/molecules/gv-rating-list.js +287 -184
  214. package/src/molecules/gv-rating-list.js.map +1 -0
  215. package/src/molecules/gv-rating.d.ts +55 -0
  216. package/src/molecules/gv-rating.js +187 -152
  217. package/src/molecules/gv-rating.js.map +1 -0
  218. package/src/molecules/gv-row-expandable.d.ts +8 -0
  219. package/src/molecules/gv-row-expandable.js +18 -14
  220. package/src/molecules/gv-row-expandable.js.map +1 -0
  221. package/src/molecules/gv-row.d.ts +37 -0
  222. package/src/molecules/gv-row.js +164 -42
  223. package/src/molecules/gv-row.js.map +1 -0
  224. package/src/molecules/gv-stats.d.ts +53 -0
  225. package/src/molecules/gv-stats.js +70 -55
  226. package/src/molecules/gv-stats.js.map +1 -0
  227. package/src/molecules/gv-stepper.d.ts +46 -0
  228. package/src/molecules/gv-stepper.js +225 -94
  229. package/src/molecules/gv-stepper.js.map +1 -0
  230. package/src/molecules/gv-table.d.ts +159 -0
  231. package/src/molecules/gv-table.js +530 -460
  232. package/src/molecules/gv-table.js.map +1 -0
  233. package/src/molecules/gv-tree.d.ts +44 -0
  234. package/src/molecules/gv-tree.js +189 -77
  235. package/src/molecules/gv-tree.js.map +1 -0
  236. package/src/organisms/gv-documentation.d.ts +52 -0
  237. package/src/organisms/gv-documentation.js +155 -81
  238. package/src/organisms/gv-documentation.js.map +1 -0
  239. package/src/organisms/gv-header.d.ts +60 -0
  240. package/src/organisms/gv-header.js +227 -80
  241. package/src/organisms/gv-header.js.map +1 -0
  242. package/src/organisms/gv-http-client.d.ts +57 -0
  243. package/src/organisms/gv-http-client.js +203 -83
  244. package/src/organisms/gv-http-client.js.map +1 -0
  245. package/src/organisms/gv-menu.d.ts +74 -0
  246. package/src/organisms/gv-menu.js +206 -89
  247. package/src/organisms/gv-menu.js.map +1 -0
  248. package/src/organisms/gv-newsletter-subscription.d.ts +82 -0
  249. package/src/organisms/gv-newsletter-subscription.js +212 -83
  250. package/src/organisms/gv-newsletter-subscription.js.map +1 -0
  251. package/src/organisms/gv-pagination.d.ts +63 -0
  252. package/src/organisms/gv-pagination.js +134 -124
  253. package/src/organisms/gv-pagination.js.map +1 -0
  254. package/src/organisms/gv-properties.d.ts +229 -0
  255. package/src/organisms/gv-properties.js +778 -616
  256. package/src/organisms/gv-properties.js.map +1 -0
  257. package/src/organisms/gv-resizable-views.d.ts +33 -0
  258. package/src/organisms/gv-resizable-views.js +334 -140
  259. package/src/organisms/gv-resizable-views.js.map +1 -0
  260. package/src/organisms/gv-resources.d.ts +125 -0
  261. package/src/organisms/gv-resources.js +434 -365
  262. package/src/organisms/gv-resources.js.map +1 -0
  263. package/src/organisms/gv-schema-form-array.d.ts +55 -0
  264. package/src/organisms/gv-schema-form-array.js +196 -98
  265. package/src/organisms/gv-schema-form-array.js.map +1 -0
  266. package/src/organisms/gv-schema-form-control-object.d.ts +64 -0
  267. package/src/organisms/gv-schema-form-control-object.js +110 -108
  268. package/src/organisms/gv-schema-form-control-object.js.map +1 -0
  269. package/src/organisms/gv-schema-form-control.d.ts +90 -0
  270. package/src/organisms/gv-schema-form-control.js +353 -349
  271. package/src/organisms/gv-schema-form-control.js.map +1 -0
  272. package/src/organisms/gv-schema-form.d.ts +156 -0
  273. package/src/organisms/gv-schema-form.js +611 -556
  274. package/src/organisms/gv-schema-form.js.map +1 -0
  275. package/src/organisms/gv-tabs.d.ts +56 -0
  276. package/src/organisms/gv-tabs.js +149 -125
  277. package/src/organisms/gv-tabs.js.map +1 -0
  278. package/src/organisms/gv-user-menu.d.ts +56 -0
  279. package/src/organisms/gv-user-menu.js +244 -94
  280. package/src/organisms/gv-user-menu.js.map +1 -0
  281. package/src/organisms/gv-vertical-menu.d.ts +28 -0
  282. package/src/organisms/gv-vertical-menu.js +84 -46
  283. package/src/organisms/gv-vertical-menu.js.map +1 -0
  284. package/src/policy-studio/gv-flow-step.d.ts +142 -0
  285. package/src/policy-studio/gv-flow-step.js +390 -250
  286. package/src/policy-studio/gv-flow-step.js.map +1 -0
  287. package/src/policy-studio/gv-flow.d.ts +89 -0
  288. package/src/policy-studio/gv-flow.js +512 -358
  289. package/src/policy-studio/gv-flow.js.map +1 -0
  290. package/src/policy-studio/gv-policy-studio-menu.d.ts +94 -0
  291. package/src/policy-studio/gv-policy-studio-menu.js +657 -403
  292. package/src/policy-studio/gv-policy-studio-menu.js.map +1 -0
  293. package/src/policy-studio/gv-policy-studio.d.ts +464 -0
  294. package/src/policy-studio/gv-policy-studio.js +1531 -1599
  295. package/src/policy-studio/gv-policy-studio.js.map +1 -0
  296. package/src/styles/empty.d.ts +1 -0
  297. package/src/styles/empty.js +21 -4
  298. package/src/styles/empty.js.map +1 -0
  299. package/src/styles/input.d.ts +1 -0
  300. package/src/styles/input.js +247 -3
  301. package/src/styles/input.js.map +1 -0
  302. package/src/styles/link.d.ts +1 -0
  303. package/src/styles/link.js +16 -3
  304. package/src/styles/link.js.map +1 -0
  305. package/src/styles/shapes.d.ts +2 -0
  306. package/src/styles/shapes.js +1 -1
  307. package/src/styles/shapes.js.map +1 -0
  308. package/src/styles/skeleton.d.ts +1 -0
  309. package/src/styles/skeleton.js +37 -3
  310. package/src/styles/skeleton.js.map +1 -0
  311. package/src/styles/zoom.d.ts +1 -0
  312. package/src/styles/zoom.js +24 -3
  313. package/src/styles/zoom.js.map +1 -0
  314. package/src/theme/gv-theme.d.ts +81 -0
  315. package/src/theme/gv-theme.js +115 -81
  316. package/src/theme/gv-theme.js.map +1 -0
  317. package/wc/gv-autocomplete.d.ts +1 -0
  318. package/wc/gv-autocomplete.js +2 -1
  319. package/wc/gv-autocomplete.js.map +1 -0
  320. package/wc/gv-button.d.ts +1 -0
  321. package/wc/gv-button.js +2 -1
  322. package/wc/gv-button.js.map +1 -0
  323. package/wc/gv-card-full.d.ts +1 -0
  324. package/wc/gv-card-full.js +2 -1
  325. package/wc/gv-card-full.js.map +1 -0
  326. package/wc/gv-card-list.d.ts +1 -0
  327. package/wc/gv-card-list.js +2 -1
  328. package/wc/gv-card-list.js.map +1 -0
  329. package/wc/gv-card.d.ts +1 -0
  330. package/wc/gv-card.js +2 -1
  331. package/wc/gv-card.js.map +1 -0
  332. package/wc/gv-category-list.d.ts +1 -0
  333. package/wc/gv-category-list.js +2 -1
  334. package/wc/gv-category-list.js.map +1 -0
  335. package/wc/gv-category.d.ts +1 -0
  336. package/wc/gv-category.js +2 -1
  337. package/wc/gv-category.js.map +1 -0
  338. package/wc/gv-chart-bar.d.ts +1 -0
  339. package/wc/gv-chart-bar.js +2 -1
  340. package/wc/gv-chart-bar.js.map +1 -0
  341. package/wc/gv-chart-gauge.d.ts +1 -0
  342. package/wc/gv-chart-gauge.js +2 -1
  343. package/wc/gv-chart-gauge.js.map +1 -0
  344. package/wc/gv-chart-histogram.d.ts +1 -0
  345. package/wc/gv-chart-histogram.js +2 -1
  346. package/wc/gv-chart-histogram.js.map +1 -0
  347. package/wc/gv-chart-line.d.ts +1 -0
  348. package/wc/gv-chart-line.js +2 -1
  349. package/wc/gv-chart-line.js.map +1 -0
  350. package/wc/gv-chart-map.d.ts +1 -0
  351. package/wc/gv-chart-map.js +2 -1
  352. package/wc/gv-chart-map.js.map +1 -0
  353. package/wc/gv-chart-pie.d.ts +1 -0
  354. package/wc/gv-chart-pie.js +2 -1
  355. package/wc/gv-chart-pie.js.map +1 -0
  356. package/wc/gv-checkbox.d.ts +1 -0
  357. package/wc/gv-checkbox.js +2 -1
  358. package/wc/gv-checkbox.js.map +1 -0
  359. package/wc/gv-code.d.ts +1 -0
  360. package/wc/gv-code.js +2 -1
  361. package/wc/gv-code.js.map +1 -0
  362. package/wc/gv-confirm.d.ts +1 -0
  363. package/wc/gv-confirm.js +2 -1
  364. package/wc/gv-confirm.js.map +1 -0
  365. package/wc/gv-cron-editor.d.ts +1 -0
  366. package/wc/gv-cron-editor.js +2 -1
  367. package/wc/gv-cron-editor.js.map +1 -0
  368. package/wc/gv-date-picker-calendar.d.ts +1 -0
  369. package/wc/gv-date-picker-calendar.js +2 -1
  370. package/wc/gv-date-picker-calendar.js.map +1 -0
  371. package/wc/gv-date-picker-cell.d.ts +1 -0
  372. package/wc/gv-date-picker-cell.js +2 -1
  373. package/wc/gv-date-picker-cell.js.map +1 -0
  374. package/wc/gv-date-picker.d.ts +1 -0
  375. package/wc/gv-date-picker.js +2 -1
  376. package/wc/gv-date-picker.js.map +1 -0
  377. package/wc/gv-documentation.d.ts +1 -0
  378. package/wc/gv-documentation.js +2 -1
  379. package/wc/gv-documentation.js.map +1 -0
  380. package/wc/gv-dropdown-menu.d.ts +1 -0
  381. package/wc/gv-dropdown-menu.js +2 -1
  382. package/wc/gv-dropdown-menu.js.map +1 -0
  383. package/wc/gv-expandable.d.ts +1 -0
  384. package/wc/gv-expandable.js +2 -1
  385. package/wc/gv-expandable.js.map +1 -0
  386. package/wc/gv-expression-language.d.ts +1 -0
  387. package/wc/gv-expression-language.js +2 -1
  388. package/wc/gv-expression-language.js.map +1 -0
  389. package/wc/gv-file-upload.d.ts +1 -0
  390. package/wc/gv-file-upload.js +2 -1
  391. package/wc/gv-file-upload.js.map +1 -0
  392. package/wc/gv-flow-step.d.ts +1 -0
  393. package/wc/gv-flow-step.js +2 -1
  394. package/wc/gv-flow-step.js.map +1 -0
  395. package/wc/gv-flow.d.ts +1 -0
  396. package/wc/gv-flow.js +2 -1
  397. package/wc/gv-flow.js.map +1 -0
  398. package/wc/gv-header.d.ts +1 -0
  399. package/wc/gv-header.js +2 -1
  400. package/wc/gv-header.js.map +1 -0
  401. package/wc/gv-http-client.d.ts +1 -0
  402. package/wc/gv-http-client.js +2 -1
  403. package/wc/gv-http-client.js.map +1 -0
  404. package/wc/gv-icon.d.ts +1 -0
  405. package/wc/gv-icon.js +2 -1
  406. package/wc/gv-icon.js.map +1 -0
  407. package/wc/gv-identity-picture.d.ts +1 -0
  408. package/wc/gv-identity-picture.js +2 -1
  409. package/wc/gv-identity-picture.js.map +1 -0
  410. package/wc/gv-image.d.ts +1 -0
  411. package/wc/gv-image.js +2 -1
  412. package/wc/gv-image.js.map +1 -0
  413. package/wc/gv-input-message.d.ts +1 -0
  414. package/wc/gv-input-message.js +2 -1
  415. package/wc/gv-input-message.js.map +1 -0
  416. package/wc/gv-input.d.ts +1 -0
  417. package/wc/gv-input.js +2 -1
  418. package/wc/gv-input.js.map +1 -0
  419. package/wc/gv-link.d.ts +1 -0
  420. package/wc/gv-link.js +2 -1
  421. package/wc/gv-link.js.map +1 -0
  422. package/wc/gv-list.d.ts +1 -0
  423. package/wc/gv-list.js +2 -1
  424. package/wc/gv-list.js.map +1 -0
  425. package/wc/gv-menu.d.ts +1 -0
  426. package/wc/gv-menu.js +2 -1
  427. package/wc/gv-menu.js.map +1 -0
  428. package/wc/gv-message.d.ts +1 -0
  429. package/wc/gv-message.js +2 -1
  430. package/wc/gv-message.js.map +1 -0
  431. package/wc/gv-metric.d.ts +1 -0
  432. package/wc/gv-metric.js +2 -1
  433. package/wc/gv-metric.js.map +1 -0
  434. package/wc/gv-metrics.d.ts +1 -0
  435. package/wc/gv-metrics.js +2 -1
  436. package/wc/gv-metrics.js.map +1 -0
  437. package/wc/gv-modal.d.ts +1 -0
  438. package/wc/gv-modal.js +2 -1
  439. package/wc/gv-modal.js.map +1 -0
  440. package/wc/gv-nav.d.ts +1 -0
  441. package/wc/gv-nav.js +2 -1
  442. package/wc/gv-nav.js.map +1 -0
  443. package/wc/gv-newsletter-subscription.d.ts +1 -0
  444. package/wc/gv-newsletter-subscription.js +2 -1
  445. package/wc/gv-newsletter-subscription.js.map +1 -0
  446. package/wc/gv-option.d.ts +1 -0
  447. package/wc/gv-option.js +2 -1
  448. package/wc/gv-option.js.map +1 -0
  449. package/wc/gv-pagination.d.ts +1 -0
  450. package/wc/gv-pagination.js +2 -1
  451. package/wc/gv-pagination.js.map +1 -0
  452. package/wc/gv-plans.d.ts +1 -0
  453. package/wc/gv-plans.js +2 -1
  454. package/wc/gv-plans.js.map +1 -0
  455. package/wc/gv-policy-studio-menu.d.ts +1 -0
  456. package/wc/gv-policy-studio-menu.js +2 -1
  457. package/wc/gv-policy-studio-menu.js.map +1 -0
  458. package/wc/gv-policy-studio.d.ts +1 -0
  459. package/wc/gv-policy-studio.js +2 -1
  460. package/wc/gv-policy-studio.js.map +1 -0
  461. package/wc/gv-popover.d.ts +1 -0
  462. package/wc/gv-popover.js +2 -1
  463. package/wc/gv-popover.js.map +1 -0
  464. package/wc/gv-promote.d.ts +1 -0
  465. package/wc/gv-promote.js +2 -1
  466. package/wc/gv-promote.js.map +1 -0
  467. package/wc/gv-properties.d.ts +1 -0
  468. package/wc/gv-properties.js +2 -1
  469. package/wc/gv-properties.js.map +1 -0
  470. package/wc/gv-rating-list.d.ts +1 -0
  471. package/wc/gv-rating-list.js +2 -1
  472. package/wc/gv-rating-list.js.map +1 -0
  473. package/wc/gv-rating.d.ts +1 -0
  474. package/wc/gv-rating.js +2 -1
  475. package/wc/gv-rating.js.map +1 -0
  476. package/wc/gv-relative-time.d.ts +1 -0
  477. package/wc/gv-relative-time.js +2 -1
  478. package/wc/gv-relative-time.js.map +1 -0
  479. package/wc/gv-resizable-views.d.ts +1 -0
  480. package/wc/gv-resizable-views.js +2 -1
  481. package/wc/gv-resizable-views.js.map +1 -0
  482. package/wc/gv-resources.d.ts +1 -0
  483. package/wc/gv-resources.js +2 -1
  484. package/wc/gv-resources.js.map +1 -0
  485. package/wc/gv-row-expandable.d.ts +1 -0
  486. package/wc/gv-row-expandable.js +2 -1
  487. package/wc/gv-row-expandable.js.map +1 -0
  488. package/wc/gv-row.d.ts +1 -0
  489. package/wc/gv-row.js +2 -1
  490. package/wc/gv-row.js.map +1 -0
  491. package/wc/gv-schema-form-array.d.ts +1 -0
  492. package/wc/gv-schema-form-array.js +2 -1
  493. package/wc/gv-schema-form-array.js.map +1 -0
  494. package/wc/gv-schema-form-control-object.d.ts +1 -0
  495. package/wc/gv-schema-form-control-object.js +2 -1
  496. package/wc/gv-schema-form-control-object.js.map +1 -0
  497. package/wc/gv-schema-form-control.d.ts +1 -0
  498. package/wc/gv-schema-form-control.js +2 -1
  499. package/wc/gv-schema-form-control.js.map +1 -0
  500. package/wc/gv-schema-form.d.ts +1 -0
  501. package/wc/gv-schema-form.js +2 -1
  502. package/wc/gv-schema-form.js.map +1 -0
  503. package/wc/gv-select-native.d.ts +1 -0
  504. package/wc/gv-select-native.js +2 -1
  505. package/wc/gv-select-native.js.map +1 -0
  506. package/wc/gv-select.d.ts +1 -0
  507. package/wc/gv-select.js +2 -1
  508. package/wc/gv-select.js.map +1 -0
  509. package/wc/gv-spinner.d.ts +1 -0
  510. package/wc/gv-spinner.js +2 -1
  511. package/wc/gv-spinner.js.map +1 -0
  512. package/wc/gv-state.d.ts +1 -0
  513. package/wc/gv-state.js +2 -1
  514. package/wc/gv-state.js.map +1 -0
  515. package/wc/gv-stats.d.ts +1 -0
  516. package/wc/gv-stats.js +2 -1
  517. package/wc/gv-stats.js.map +1 -0
  518. package/wc/gv-stepper.d.ts +1 -0
  519. package/wc/gv-stepper.js +2 -1
  520. package/wc/gv-stepper.js.map +1 -0
  521. package/wc/gv-switch.d.ts +1 -0
  522. package/wc/gv-switch.js +2 -1
  523. package/wc/gv-switch.js.map +1 -0
  524. package/wc/gv-table.d.ts +1 -0
  525. package/wc/gv-table.js +2 -1
  526. package/wc/gv-table.js.map +1 -0
  527. package/wc/gv-tabs.d.ts +1 -0
  528. package/wc/gv-tabs.js +2 -1
  529. package/wc/gv-tabs.js.map +1 -0
  530. package/wc/gv-tag.d.ts +1 -0
  531. package/wc/gv-tag.js +2 -1
  532. package/wc/gv-tag.js.map +1 -0
  533. package/wc/gv-text.d.ts +1 -0
  534. package/wc/gv-text.js +2 -1
  535. package/wc/gv-text.js.map +1 -0
  536. package/wc/gv-theme.d.ts +1 -0
  537. package/wc/gv-theme.js +2 -1
  538. package/wc/gv-theme.js.map +1 -0
  539. package/wc/gv-tree.d.ts +1 -0
  540. package/wc/gv-tree.js +2 -1
  541. package/wc/gv-tree.js.map +1 -0
  542. package/wc/gv-user-menu.d.ts +1 -0
  543. package/wc/gv-user-menu.js +2 -1
  544. package/wc/gv-user-menu.js.map +1 -0
  545. package/wc/gv-vertical-menu.d.ts +1 -0
  546. package/wc/gv-vertical-menu.js +2 -1
  547. package/wc/gv-vertical-menu.js.map +1 -0
@@ -44,656 +44,818 @@ import { empty } from '../styles/empty';
44
44
  *
45
45
  * @cssprop {Length} [--gv-properties-table--colmg=0.2rem] - Table cells margin
46
46
  */
47
-
48
47
  export class GvProperties extends KeyboardElement(LitElement) {
49
- static get properties() {
50
- return {
51
- dynamicPropertySchema: {
52
- type: Object
53
- },
54
- properties: {
55
- type: Array
56
- },
57
- _properties: {
58
- type: Array,
59
- attribute: false
60
- },
61
- provider: {
62
- type: Object
63
- },
64
- providers: {
65
- type: Array
66
- },
67
- _propertySchemaForm: {
68
- type: Object,
69
- attribute: false
70
- },
71
- expert: {
72
- type: Boolean
73
- },
74
- _formattedErrors: {
75
- type: Array,
76
- attributes: false
77
- },
78
- _filter: {
79
- type: String
80
- },
81
- _paginationData: {
82
- type: Object,
83
- attribute: false
84
- },
85
- _pageSize: {
86
- type: Number,
87
- attribute: false
88
- },
89
- _newItem: {
90
- type: Object,
91
- attribute: false
92
- },
93
- _providerDocumentation: {
94
- type: Boolean,
95
- attribute: false
96
- },
97
- _showDocumentation: {
98
- type: Boolean,
99
- attribute: false
100
- },
101
- _textRows: {
102
- type: Number,
103
- attribute: false
104
- },
105
- readonly: {
106
- type: Boolean,
107
- reflect: true
108
- },
109
- encryptable: {
110
- type: Boolean,
111
- reflect: true
112
- }
113
- };
114
- }
115
-
116
- constructor() {
117
- super();
118
- this.properties = [];
119
- this.types = [];
120
- this.provider = {};
121
- this._currentResource = null;
122
- this._formattedErrors = [];
123
- this._showDocumentation = true;
124
- this._newItem = {
125
- key: '',
126
- value: '',
127
- _new: true
128
- };
129
- this._pageSize = 10;
130
- this._textRows = 10;
131
- this._pageSizes = [5, 10, 25, 50, 100];
132
- this._errors = [];
133
- }
134
-
135
- onKeyboard() {
136
- if (this.isPressed(KEYS.Esc)) {
137
- this._onClosePropertySchemaForm();
138
- }
139
-
140
- if (this.isPressed(KEYS.Shift, KEYS.Ctrl, KEYS.Space)) {
141
- const search = this.shadowRoot.querySelector('#search-property');
142
-
143
- if (search) {
144
- search.focus();
145
- }
146
- }
147
- }
148
-
149
- set properties(properties) {
150
- this._properties = properties.sort((a, b) => a.key.localeCompare(b.key)).map(property => {
151
- if (property.encrypted) {
152
- property.encryptable = true;
153
- }
154
-
155
- return property;
156
- });
157
- }
158
-
159
- get properties() {
160
- return this._properties;
161
- }
162
-
163
- _getResizableViews() {
164
- return this.shadowRoot.querySelector('gv-resizable-views');
165
- }
166
-
167
- _maximizeTopView() {
168
- const views = this._getResizableViews();
169
-
170
- if (views) {
171
- views.maximizeTop(95, 5);
172
- }
173
- }
174
-
175
- _maximizeBottomView() {
176
- const views = this._getResizableViews();
177
-
178
- if (views) {
179
- views.resize(30, 70);
180
- }
181
- }
182
-
183
- _splitMainViews() {
184
- const views = this._getResizableViews();
185
-
186
- if (views) {
187
- views.split();
188
- }
189
- }
190
-
191
- _isNewLineTable(line) {
192
- return line._new === true;
193
- }
194
-
195
- _onInputNew(name, event) {
196
- const target = event.target;
197
- this._newItem[name] = event.detail;
198
- const {
199
- errors
200
- } = parseRaw(toNameEqualsValueString([...this.properties, this._newItem]));
201
- this._errors = errors;
202
- setTimeout(() => {
203
- const btn = this.shadowRoot.querySelector('gv-button#add-property');
204
-
205
- if (errors.length > 0 || this._disabledNewLine(this._newItem)) {
206
- btn.setAttribute('disabled', true);
207
- } else {
208
- btn.removeAttribute('disabled');
209
- }
210
-
211
- if (name === 'key') {
212
- if (errors.length === 0) {
213
- target.removeAttribute('invalid');
214
- target.setAttribute('valid', true);
215
- } else {
216
- target.removeAttribute('valid');
217
- target.setAttribute('invalid', true);
218
- }
219
- }
220
- }, 0);
221
- }
222
-
223
- _onInput() {
224
- dispatchCustomEvent(this, 'change', {
225
- properties: this.properties
226
- });
227
- }
228
-
229
- _onSwitchEncrypted(item) {
230
- if (item.encrypted === true) {
231
- item.value = '';
232
- item.encrypted = false;
233
- item.encryptionWarning = i18n('gv-properties.infos.overwrite-encryption');
234
- this.requestUpdate();
235
- }
236
-
237
- dispatchCustomEvent(this, 'switch-encrypted', {
238
- properties: this.properties
239
- });
240
- }
241
-
242
- _addProperty(item) {
243
- delete item._new;
244
- this.properties = [item, ...this._properties];
245
- this._newItem = {
246
- key: '',
247
- value: '',
248
- _new: true,
249
- encryptable: false,
250
- encrypted: false
251
- };
252
- dispatchCustomEvent(this, 'change', {
253
- properties: this.properties
254
- });
255
- }
256
-
257
- _removeProperty(item) {
258
- this._properties = this._properties.filter(property => property.key !== item.key);
259
- dispatchCustomEvent(this, 'change', {
260
- properties: this.properties
261
- });
262
- }
263
-
264
- _disabledNewLine(item) {
265
- return item.key == null || item.value == null || item.key.trim() === '' || item.value.trim() === '';
266
- }
267
-
268
- _submitExpertMode() {
269
- if (this.expert) {
270
- this.properties = this._handleExpertModeInput(this.shadowRoot.querySelector('#expert-input').value);
271
- }
272
- }
273
-
274
- _onExpertModeTextInput({
275
- detail
276
- }) {
277
- this._handleExpertModeInput(detail);
278
- }
279
-
280
- _handleExpertModeInput(expertModeInputString) {
281
- let allProperties = this._properties;
282
- const providerEnabled = this.provider && this.provider.enabled;
283
- const dynamicProperties = allProperties.filter(prop => providerEnabled && prop.dynamic);
284
- const encryptedProperties = allProperties.filter(prop => prop.encrypted);
285
- const allPropertiesString = `${expertModeInputString}\n${toNameEqualsValueString(dynamicProperties)}\n${toNameEqualsValueString(encryptedProperties)}`;
286
- const {
287
- errors
288
- } = parseRaw(allPropertiesString);
289
- this._errors = errors;
290
-
291
- if (errors.length === 0) {
292
- const {
293
- variables
294
- } = parseRaw(expertModeInputString);
295
- allProperties = [...variables, ...dynamicProperties, ...encryptedProperties];
296
- dispatchCustomEvent(this, 'change', {
297
- properties: allProperties
298
- });
299
- }
300
-
301
- return allProperties;
302
- }
303
-
304
- _onSubmitPropertyForm({
305
- detail
306
- }) {
307
- const provider = detail.values;
308
- dispatchCustomEvent(this, 'save-provider', {
309
- provider
310
- });
311
- this.requestUpdate();
312
- }
313
-
314
- submit() {
315
- if (this.expert) {
316
- this._submitExpertMode();
317
- } else {
318
- this._onSubmit();
319
- }
320
- }
321
-
322
- _onSubmit() {
323
- const invalidControls = [...this.shadowRoot.querySelectorAll('form .control')].find(control => control.invalid);
324
-
325
- if (invalidControls == null) {
326
- this._addProperty(this._newItem);
327
- }
328
- }
329
-
330
- _onConfigureDynamicProperties() {
331
- if (this.dynamicPropertySchema == null) {
332
- // dynamicPropertySchema has been introduced to ensure backward compatibility with old versions. If no schema is provided a default schema will be used.
333
- const providersTitleMap = this.providers.reduce((map, provider) => {
334
- map[provider.id] = provider.key;
335
- return map;
336
- }, {});
337
- const providersEnum = Object.keys(providersTitleMap);
338
- this.dynamicPropertySchema = {
339
- properties: {
340
- enabled: {
341
- type: 'boolean',
342
- title: 'Enabled',
343
- description: ' This service is requiring an API deployment. Do not forget to deploy API to start dynamic-properties service.'
344
- },
345
- schedule: {
346
- type: 'string',
347
- title: 'Schedule',
348
- 'x-schema-form': {
349
- 'cron-expression': true
48
+ static get properties() {
49
+ return {
50
+ dynamicPropertySchema: { type: Object },
51
+ properties: { type: Array },
52
+ _properties: { type: Array, attribute: false },
53
+ provider: { type: Object },
54
+ providers: { type: Array },
55
+ _propertySchemaForm: { type: Object, attribute: false },
56
+ expert: { type: Boolean },
57
+ _formattedErrors: { type: Array, attributes: false },
58
+ _filter: { type: String },
59
+ _paginationData: { type: Object, attribute: false },
60
+ _pageSize: { type: Number, attribute: false },
61
+ _newItem: { type: Object, attribute: false },
62
+ _providerDocumentation: { type: Boolean, attribute: false },
63
+ _showDocumentation: { type: Boolean, attribute: false },
64
+ _textRows: { type: Number, attribute: false },
65
+ readonly: { type: Boolean, reflect: true },
66
+ encryptable: { type: Boolean, reflect: true },
67
+ };
68
+ }
69
+ constructor() {
70
+ super();
71
+ this.properties = [];
72
+ this.types = [];
73
+ this.provider = {};
74
+ this._currentResource = null;
75
+ this._formattedErrors = [];
76
+ this._showDocumentation = true;
77
+ this._newItem = { key: '', value: '', _new: true };
78
+ this._pageSize = 10;
79
+ this._textRows = 10;
80
+ this._pageSizes = [5, 10, 25, 50, 100];
81
+ this._errors = [];
82
+ }
83
+ onKeyboard() {
84
+ if (this.isPressed(KEYS.Esc)) {
85
+ this._onClosePropertySchemaForm();
86
+ }
87
+ if (this.isPressed(KEYS.Shift, KEYS.Ctrl, KEYS.Space)) {
88
+ const search = this.shadowRoot.querySelector('#search-property');
89
+ if (search) {
90
+ search.focus();
350
91
  }
351
- },
352
- provider: {
353
- type: 'string',
354
- title: 'Provider type',
355
- enum: providersEnum,
356
- default: providersEnum[0],
357
- 'x-schema-form': {
358
- titleMap: providersTitleMap
92
+ }
93
+ }
94
+ set properties(properties) {
95
+ this._properties = properties
96
+ .sort((a, b) => a.key.localeCompare(b.key))
97
+ .map((property) => {
98
+ if (property.encrypted) {
99
+ property.encryptable = true;
359
100
  }
360
- }
361
- },
362
- required: ['schedule', 'provider']
363
- };
364
- }
365
-
366
- const defaultProvider = this.providers[0];
367
- this._propertySchemaForm = {
368
- properties: { ...this.dynamicPropertySchema.properties,
369
- configuration: defaultProvider.schema
370
- },
371
- required: this.dynamicPropertySchema.required
372
- };
373
- this._providerDocumentation = defaultProvider.documentation;
374
-
375
- this._maximizeBottomView();
376
- }
377
-
378
- _onClosePropertySchemaForm() {
379
- this._propertySchemaForm = null;
380
-
381
- this._maximizeTopView();
382
- }
383
-
384
- _onSearchProperty({
385
- detail
386
- }) {
387
- this._filter = detail;
388
-
389
- this._onClosePropertySchemaForm();
390
- }
391
-
392
- _onClearProperty() {
393
- this._filter = null;
394
-
395
- this._onClosePropertySchemaForm();
396
- }
397
-
398
- get _errors() {
399
- return this._formattedErrors;
400
- }
401
-
402
- set _errors(rawErrors) {
403
- this._formattedErrors = rawErrors.map(({
404
- type,
405
- key,
406
- pos
407
- }) => {
408
- if (type === ERROR_TYPES.INVALID_NAME) {
409
- return {
410
- line: pos.line,
411
- msg: i18n('gv-properties.errors.invalid-key', {
412
- key
413
- })
101
+ return property;
102
+ });
103
+ }
104
+ get properties() {
105
+ return this._properties;
106
+ }
107
+ _getResizableViews() {
108
+ return this.shadowRoot.querySelector('gv-resizable-views');
109
+ }
110
+ _maximizeTopView() {
111
+ const views = this._getResizableViews();
112
+ if (views) {
113
+ views.maximizeTop(95, 5);
114
+ }
115
+ }
116
+ _maximizeBottomView() {
117
+ const views = this._getResizableViews();
118
+ if (views) {
119
+ views.resize(30, 70);
120
+ }
121
+ }
122
+ _splitMainViews() {
123
+ const views = this._getResizableViews();
124
+ if (views) {
125
+ views.split();
126
+ }
127
+ }
128
+ _isNewLineTable(line) {
129
+ return line._new === true;
130
+ }
131
+ _onInputNew(name, event) {
132
+ const target = event.target;
133
+ this._newItem[name] = event.detail;
134
+ const { errors } = parseRaw(toNameEqualsValueString([...this.properties, this._newItem]));
135
+ this._errors = errors;
136
+ setTimeout(() => {
137
+ const btn = this.shadowRoot.querySelector('gv-button#add-property');
138
+ if (errors.length > 0 || this._disabledNewLine(this._newItem)) {
139
+ btn.setAttribute('disabled', true);
140
+ }
141
+ else {
142
+ btn.removeAttribute('disabled');
143
+ }
144
+ if (name === 'key') {
145
+ if (errors.length === 0) {
146
+ target.removeAttribute('invalid');
147
+ target.setAttribute('valid', true);
148
+ }
149
+ else {
150
+ target.removeAttribute('valid');
151
+ target.setAttribute('invalid', true);
152
+ }
153
+ }
154
+ }, 0);
155
+ }
156
+ _onInput() {
157
+ dispatchCustomEvent(this, 'change', { properties: this.properties });
158
+ }
159
+ _onSwitchEncrypted(item) {
160
+ if (item.encrypted === true) {
161
+ item.value = '';
162
+ item.encrypted = false;
163
+ item.encryptionWarning = i18n('gv-properties.infos.overwrite-encryption');
164
+ this.requestUpdate();
165
+ }
166
+ dispatchCustomEvent(this, 'switch-encrypted', { properties: this.properties });
167
+ }
168
+ _addProperty(item) {
169
+ delete item._new;
170
+ this.properties = [item, ...this._properties];
171
+ this._newItem = { key: '', value: '', _new: true, encryptable: false, encrypted: false };
172
+ dispatchCustomEvent(this, 'change', { properties: this.properties });
173
+ }
174
+ _removeProperty(item) {
175
+ this._properties = this._properties.filter((property) => property.key !== item.key);
176
+ dispatchCustomEvent(this, 'change', { properties: this.properties });
177
+ }
178
+ _disabledNewLine(item) {
179
+ return item.key == null || item.value == null || item.key.trim() === '' || item.value.trim() === '';
180
+ }
181
+ _submitExpertMode() {
182
+ if (this.expert) {
183
+ this.properties = this._handleExpertModeInput(this.shadowRoot.querySelector('#expert-input').value);
184
+ }
185
+ }
186
+ _onExpertModeTextInput({ detail }) {
187
+ this._handleExpertModeInput(detail);
188
+ }
189
+ _handleExpertModeInput(expertModeInputString) {
190
+ let allProperties = this._properties;
191
+ const providerEnabled = this.provider && this.provider.enabled;
192
+ const dynamicProperties = allProperties.filter((prop) => providerEnabled && prop.dynamic);
193
+ const encryptedProperties = allProperties.filter((prop) => prop.encrypted);
194
+ const allPropertiesString = `${expertModeInputString}\n${toNameEqualsValueString(dynamicProperties)}\n${toNameEqualsValueString(encryptedProperties)}`;
195
+ const { errors } = parseRaw(allPropertiesString);
196
+ this._errors = errors;
197
+ if (errors.length === 0) {
198
+ const { variables } = parseRaw(expertModeInputString);
199
+ allProperties = [...variables, ...dynamicProperties, ...encryptedProperties];
200
+ dispatchCustomEvent(this, 'change', { properties: allProperties });
201
+ }
202
+ return allProperties;
203
+ }
204
+ _onSubmitPropertyForm({ detail }) {
205
+ const provider = detail.values;
206
+ dispatchCustomEvent(this, 'save-provider', { provider });
207
+ this.requestUpdate();
208
+ }
209
+ submit() {
210
+ if (this.expert) {
211
+ this._submitExpertMode();
212
+ }
213
+ else {
214
+ this._onSubmit();
215
+ }
216
+ }
217
+ _onSubmit() {
218
+ const invalidControls = [...this.shadowRoot.querySelectorAll('form .control')].find((control) => control.invalid);
219
+ if (invalidControls == null) {
220
+ this._addProperty(this._newItem);
221
+ }
222
+ }
223
+ _onConfigureDynamicProperties() {
224
+ if (this.dynamicPropertySchema == null) {
225
+ // dynamicPropertySchema has been introduced to ensure backward compatibility with old versions. If no schema is provided a default schema will be used.
226
+ const providersTitleMap = this.providers.reduce((map, provider) => {
227
+ map[provider.id] = provider.key;
228
+ return map;
229
+ }, {});
230
+ const providersEnum = Object.keys(providersTitleMap);
231
+ this.dynamicPropertySchema = {
232
+ properties: {
233
+ enabled: {
234
+ type: 'boolean',
235
+ title: 'Enabled',
236
+ description: ' This service is requiring an API deployment. Do not forget to deploy API to start dynamic-properties service.',
237
+ },
238
+ schedule: {
239
+ type: 'string',
240
+ title: 'Schedule',
241
+ 'x-schema-form': {
242
+ 'cron-expression': true,
243
+ },
244
+ },
245
+ provider: {
246
+ type: 'string',
247
+ title: 'Provider type',
248
+ enum: providersEnum,
249
+ default: providersEnum[0],
250
+ 'x-schema-form': {
251
+ titleMap: providersTitleMap,
252
+ },
253
+ },
254
+ },
255
+ required: ['schedule', 'provider'],
256
+ };
257
+ }
258
+ const defaultProvider = this.providers[0];
259
+ this._propertySchemaForm = {
260
+ properties: { ...this.dynamicPropertySchema.properties, configuration: defaultProvider.schema },
261
+ required: this.dynamicPropertySchema.required,
414
262
  };
415
- }
263
+ this._providerDocumentation = defaultProvider.documentation;
264
+ this._maximizeBottomView();
265
+ }
266
+ _onClosePropertySchemaForm() {
267
+ this._propertySchemaForm = null;
268
+ this._maximizeTopView();
269
+ }
270
+ _onSearchProperty({ detail }) {
271
+ this._filter = detail;
272
+ this._onClosePropertySchemaForm();
273
+ }
274
+ _onClearProperty() {
275
+ this._filter = null;
276
+ this._onClosePropertySchemaForm();
277
+ }
278
+ get _errors() {
279
+ return this._formattedErrors;
280
+ }
281
+ set _errors(rawErrors) {
282
+ this._formattedErrors = rawErrors.map(({ type, key, pos }) => {
283
+ if (type === ERROR_TYPES.INVALID_NAME) {
284
+ return {
285
+ line: pos.line,
286
+ msg: i18n('gv-properties.errors.invalid-key', { key }),
287
+ };
288
+ }
289
+ if (type === ERROR_TYPES.DUPLICATED_NAME) {
290
+ return {
291
+ line: pos.line,
292
+ msg: i18n('gv-properties.errors.duplicated-key', { key }),
293
+ };
294
+ }
295
+ if (type === ERROR_TYPES.INVALID_LINE) {
296
+ return {
297
+ line: pos.line,
298
+ msg: i18n('gv-properties.errors.invalid-line'),
299
+ };
300
+ }
301
+ if (type === ERROR_TYPES.INVALID_VALUE) {
302
+ return {
303
+ line: pos.line,
304
+ msg: i18n('gv-properties.errors.invalid-value'),
305
+ };
306
+ }
307
+ return { line: '?', msg: i18n('gv-properties.errors.unknown') };
308
+ });
309
+ }
310
+ _renderErrors(withLine = false) {
311
+ if (this._formattedErrors.length > 0) {
312
+ return html `<div class="${classMap({ 'add-form-error': true, 'add-form-error_expert': this.expert })}">
313
+ <div></div>
314
+ <div class="error-list">
315
+ ${this._formattedErrors.map(({ line, msg }) => html `
316
+ <gv-input-message
317
+ >${withLine ? html `<strong .innerHTML="${i18n('gv-properties.errors.line')} ${line}:&nbsp;"></strong>` : ''}
318
+ <span .innerHTML="${msg}"></span
319
+ ></gv-input-message>
320
+ `)}
321
+ </div>
322
+ </div>`;
323
+ }
324
+ return html ``;
325
+ }
326
+ _renderTable() {
327
+ const providerEnabled = this.provider && this.provider.enabled;
328
+ if (this.expert) {
329
+ this._computeTextRows();
330
+ const staticProperties = providerEnabled ? this._properties.filter((prop) => !(providerEnabled && prop.dynamic)) : this._properties;
331
+ const expertProperties = staticProperties.filter((prop) => !prop.encrypted);
332
+ const content = expertProperties.map((prop) => `${prop.key}="${prop.value}"`).join('\n');
333
+ return html `<gv-text
334
+ id="expert-input"
335
+ placeholder="${i18n('gv-properties.placeholder.input')}"
336
+ @gv-text:input="${this._onExpertModeTextInput}"
337
+ .value="${content}"
338
+ ?readonly="${this.readonly}"
339
+ .rows="${this._textRows}"
340
+ ></gv-text>
341
+ ${this._renderErrors(true)}`;
342
+ }
343
+ else {
344
+ const options = {
345
+ data: [
346
+ {
347
+ field: 'dynamic',
348
+ label: 'Dynamic',
349
+ width: '40px',
350
+ type: (item) => (item.dynamic && providerEnabled ? 'gv-icon' : 'div'),
351
+ attributes: {
352
+ shape: (item) => (item.dynamic && providerEnabled ? 'code:time-schedule' : ''),
353
+ title: (item) => (item.dynamic && providerEnabled ? 'Dynamic properties service is actually in running' : ''),
354
+ style: 'justify-content: center; align-items: center; height: 100%;',
355
+ },
356
+ },
357
+ {
358
+ field: 'key',
359
+ label: 'Key',
360
+ type: 'gv-input',
361
+ attributes: {
362
+ clipboard: true,
363
+ placeholder: i18n('gv-properties.placeholder.key'),
364
+ name: 'key',
365
+ required: true,
366
+ readonly: this.readonly,
367
+ },
368
+ },
369
+ {
370
+ field: 'value',
371
+ label: 'Value',
372
+ type: 'gv-input',
373
+ attributes: {
374
+ name: 'value',
375
+ placeholder: 'Property value',
376
+ required: true,
377
+ readonly: this.readonly,
378
+ disabled: (item) => (item.dynamic && providerEnabled) || item.encrypted,
379
+ type: (item) => (item.encrypted ? 'password' : 'text'),
380
+ title: (item) => (item.encrypted ? i18n('gv-properties.infos.encrypted-value') : ''),
381
+ description: (item) => item.encryptionWarning,
382
+ icon: null,
383
+ 'ongv-input:input': this._onInput.bind(this),
384
+ },
385
+ },
386
+ ],
387
+ };
388
+ if (this.encryptable === true) {
389
+ options.data.push({
390
+ field: 'encryptable',
391
+ type: 'gv-switch',
392
+ style: '--gv-switch--ta: right;',
393
+ width: '105px',
394
+ attributes: {
395
+ description: i18n('gv-properties.encrypted-toggle'),
396
+ required: true,
397
+ readonly: this.readonly,
398
+ disabled: (item) => item.dynamic && providerEnabled,
399
+ 'ongv-switch:input': this._onSwitchEncrypted.bind(this),
400
+ style: 'display: inline-flex; font-size: 12px; height: 40px;',
401
+ },
402
+ });
403
+ }
404
+ if (this.readonly !== true) {
405
+ options.data.push({
406
+ type: 'gv-button',
407
+ width: '40px',
408
+ attributes: {
409
+ 'ongv-button:click': (item, event, target) => this._removeProperty(item, target),
410
+ title: 'Remove',
411
+ disabled: (item) => item.dynamic && providerEnabled,
412
+ danger: true,
413
+ outlined: true,
414
+ icon: 'home:trash',
415
+ },
416
+ });
417
+ }
418
+ const filteredProperties = this._filter != null
419
+ ? this._properties.filter((prop) => {
420
+ return (prop.key.toLowerCase() + prop.value.toLowerCase()).includes(this._filter);
421
+ })
422
+ : this._properties;
423
+ let properties = [...filteredProperties];
424
+ if (this._paginationData) {
425
+ this._paginationData.last = Math.ceil(filteredProperties.length / this._pageSize);
426
+ this._paginationData.total = filteredProperties.length;
427
+ this._paginationData.total_pages = Math.ceil(filteredProperties.length / this._pageSize);
428
+ const index = (this._paginationData.current_page - 1) * this._pageSize;
429
+ properties = [...filteredProperties].splice(index, this._pageSize);
430
+ }
431
+ const addPropertyFormGridClass = this.encryptable ? 'add-form-grid-with-encrypted-toggle' : 'add-form-grid';
432
+ const addPropertyForm = this.readonly !== true
433
+ ? html `<form id="add-property-form" class="add-form ${addPropertyFormGridClass}" @submit="${this._onSubmit}">
434
+ <div></div>
435
+ <gv-input
436
+ class="control"
437
+ placeholder="${i18n('gv-properties.placeholder.key')}"
438
+ required
439
+ @gv-input:input="${this._onInputNew.bind(this, 'key')}"
440
+ value="${this._newItem.key}"
441
+ ></gv-input>
442
+ <gv-input
443
+ class="control"
444
+ placeholder="${i18n('gv-properties.placeholder.value')}"
445
+ required
446
+ @gv-input:input="${this._onInputNew.bind(this, 'value')}"
447
+ .value="${this._newItem.value}"
448
+ ></gv-input>
449
+ ${this.encryptable
450
+ ? html ` <gv-switch
451
+ class="control"
452
+ required
453
+ description="${i18n('gv-properties.encrypted-toggle')}"
454
+ @gv-switch:input="${this._onInputNew.bind(this, 'encryptable')}"
455
+ .value="${this._newItem.encryptable}"
456
+ ></gv-switch>`
457
+ : ''}
458
+ <gv-button
459
+ id="add-property"
460
+ icon="code:plus"
461
+ outlined
462
+ disabled
463
+ @gv-button:click="${this._addProperty.bind(this, this._newItem)}"
464
+ title="${i18n('gv-properties.add')}"
465
+ ></gv-button>
466
+ </form>
467
+ ${this._renderErrors()}
468
+ <hr />`
469
+ : '';
470
+ return html ` ${addPropertyForm}
471
+ <gv-table .options="${options}" .items="${properties}" noheader nosort order="key" rowheight="57px"></gv-table>`;
472
+ }
473
+ }
474
+ _onChangeMode({ detail }) {
475
+ this._submitExpertMode();
476
+ this.expert = detail;
477
+ this._errors = [];
478
+ this._newItem = { key: '', value: '', _new: true };
479
+ this._onClosePropertySchemaForm();
480
+ }
481
+ _onPaginate({ detail }) {
482
+ this._paginationData.current_page = detail.page;
483
+ this._onClosePropertySchemaForm();
484
+ this.requestUpdate();
485
+ }
486
+ updated(props) {
487
+ if (props.has('_properties') || props.has('_pageSize')) {
488
+ this._paginationData = {
489
+ first: 1,
490
+ last: Math.ceil(this._properties.length / this._pageSize),
491
+ total: this._properties.length,
492
+ current_page: 1,
493
+ total_pages: Math.ceil(this._properties.length / this._pageSize),
494
+ };
495
+ }
496
+ }
497
+ _onChangePageSize({ detail }) {
498
+ this._pageSize = Number(detail).valueOf();
499
+ this._onClosePropertySchemaForm();
500
+ }
501
+ _renderTableForm() {
502
+ return html `<div class="container">
503
+ <div class="header">
504
+ <div class="title">Manage global properties <span>(${this._properties ? this._properties.length : 0})</span></div>
505
+ <gv-switch
506
+ small
507
+ .description="${this.expert ? 'Expert' : 'Simple'}"
508
+ .value="${this.expert}"
509
+ @gv-switch:input="${this._onChangeMode}"
510
+ ></gv-switch>
511
+ <gv-input
512
+ id="search-property"
513
+ placeholder="Filter properties (Shift + Ctrl + Space)"
514
+ type="search"
515
+ small
516
+ class="search-input"
517
+ .disabled="${this.expert}"
518
+ @gv-input:input="${this._onSearchProperty}"
519
+ @gv-input:clear="${this._onClearProperty}"
520
+ ></gv-input>
521
+ <gv-select
522
+ class="page-size__select"
523
+ @gv-select:input="${this._onChangePageSize}"
524
+ small
525
+ .options="${this._pageSizes}"
526
+ .value="${this._pageSize}"
527
+ .disabled="${this.expert || this._paginationData == null}"
528
+ ></gv-select>
529
+ <gv-pagination
530
+ @gv-pagination:paginate="${this._onPaginate}"
531
+ .disabled="${this.expert || this._paginationData == null}"
532
+ .data="${this._paginationData}"
533
+ widget
534
+ ></gv-pagination>
535
+ </div>
536
+ <div class="content"><div class="form-content">${this._renderTable()}</div></div>
537
+ </div>`;
538
+ }
539
+ _fetchDocumentation() {
540
+ this._showDocumentation = true;
541
+ }
542
+ _hideDocumentation() {
543
+ this._showDocumentation = false;
544
+ }
545
+ get dirty() {
546
+ const form = this.shadowRoot.querySelector('gv-schema-form');
547
+ return form && form.dirty;
548
+ }
549
+ confirm() {
550
+ const form = this.shadowRoot.querySelector('gv-schema-form');
551
+ if (form) {
552
+ return form.confirm().then(() => this._onClosePropertySchemaForm());
553
+ }
554
+ return Promise.resolve();
555
+ }
556
+ _renderForm() {
557
+ return html `<gv-schema-form
558
+ slot="top"
559
+ scrollable
560
+ .schema="${this._propertySchemaForm}"
561
+ .values="${this.provider}"
562
+ .icon="design:edit"
563
+ has-header
564
+ ?readonly="${this.readonly}"
565
+ @gv-schema-form:submit="${this._onSubmitPropertyForm}"
566
+ >
567
+ <div slot="title" class="properties-title">Configure dynamic properties</div>
568
+ <gv-button
569
+ slot="header-left"
570
+ icon="general:close"
571
+ outlined
572
+ small
573
+ @gv-button:click="${this._onClosePropertySchemaForm}"
574
+ title="Close (esc)"
575
+ ></gv-button>
576
+ <gv-button
577
+ slot="header-left"
578
+ icon="home:book"
579
+ ?disabled="${this._showDocumentation}"
580
+ outlined
581
+ small
582
+ @gv-button:click="${this._fetchDocumentation}"
583
+ title="Open documentation"
584
+ ></gv-button>
585
+ </gv-schema-form>`;
586
+ }
587
+ _renderBottom() {
588
+ if (this._propertySchemaForm && this._showDocumentation) {
589
+ return html `<gv-resizable-views no-overflow direction="horizontal">
590
+ ${this._renderForm()}
591
+ <gv-documentation
592
+ slot="bottom"
593
+ .text="${this._providerDocumentation}"
594
+ @gv-documentation:close="${this._hideDocumentation}"
595
+ ></gv-documentation>
596
+ </gv-resizable-views>`;
597
+ }
598
+ else if (this._propertySchemaForm) {
599
+ return this._renderForm();
600
+ }
601
+ else {
602
+ return html `<div class="properties-bottom-container">${this._renderDynamicConfiguration()}</div>`;
603
+ }
604
+ }
605
+ _renderDynamicConfiguration() {
606
+ const hasDynamicConfiguration = this.provider && this.provider.enabled;
607
+ let configureAction = '';
608
+ if (hasDynamicConfiguration || this.readonly !== true) {
609
+ configureAction = html `<gv-button
610
+ icon="tools:tools"
611
+ @gv-button:click="${this._onConfigureDynamicProperties}"
612
+ outlined
613
+ .disabled="${this.expert}"
614
+ >Configure dynamic properties</gv-button
615
+ >`;
616
+ }
617
+ if (hasDynamicConfiguration) {
618
+ return html `<div class="properties-message">
619
+ Dynamic properties service is actually in <code>running</code> state and run with cron expression
620
+ <code>${this.provider.schedule}</code> using <code>${this.provider.provider}</code> provider.
621
+ </div>
622
+ ${configureAction}`;
623
+ }
624
+ else if (this.readonly) {
625
+ return html `<div class="empty">No dynamic properties service configured</div>`;
626
+ }
627
+ else {
628
+ return configureAction;
629
+ }
630
+ }
631
+ _onMove() {
632
+ this._computeTextRows();
633
+ }
634
+ _computeTextRows() {
635
+ const parent = this.shadowRoot.querySelector('.content');
636
+ if (parent) {
637
+ const { height } = parent.getBoundingClientRect();
638
+ // --gv-text--lh=30px
639
+ this._textRows = Math.round(Math.round(height - 20) / 30) - 2;
640
+ }
641
+ }
642
+ render() {
643
+ if (this.providers && this.providers.length > 0) {
644
+ return html `<div class="properties">
645
+ <gv-resizable-views no-overflow @gv-resizable-views:move="${this._onMove}" @gv-resizable-views:resize="${this._onMove}">
646
+ <div slot="top" class="box">${this._renderTableForm()}</div>
647
+ <div slot="bottom">${this._renderBottom()}</div>
648
+ </gv-resizable-views>
649
+ </div>`;
650
+ }
651
+ else {
652
+ return html `<div class="properties">
653
+ <div class="table-box">${this._renderTableForm()}</div>
654
+ </div>`;
655
+ }
656
+ }
657
+ static get styles() {
658
+ return [
659
+ empty,
660
+ // language=CSS
661
+ css `
662
+ :host {
663
+ box-sizing: border-box;
664
+ height: 100%;
665
+ width: 100%;
666
+ display: block;
667
+ }
416
668
 
417
- if (type === ERROR_TYPES.DUPLICATED_NAME) {
418
- return {
419
- line: pos.line,
420
- msg: i18n('gv-properties.errors.duplicated-key', {
421
- key
422
- })
423
- };
424
- }
669
+ .properties {
670
+ display: flex;
671
+ height: 100%;
672
+ width: 100%;
673
+ }
425
674
 
426
- if (type === ERROR_TYPES.INVALID_LINE) {
427
- return {
428
- line: pos.line,
429
- msg: i18n('gv-properties.errors.invalid-line')
430
- };
431
- }
675
+ gv-resizable-views {
676
+ height: 100%;
677
+ width: 100%;
678
+ }
432
679
 
433
- if (type === ERROR_TYPES.INVALID_VALUE) {
434
- return {
435
- line: pos.line,
436
- msg: i18n('gv-properties.errors.invalid-value')
437
- };
438
- }
439
-
440
- return {
441
- line: '?',
442
- msg: i18n('gv-properties.errors.unknown')
443
- };
444
- });
445
- }
446
-
447
- _renderErrors(withLine = false) {
448
- if (this._formattedErrors.length > 0) {
449
- return html`<div class="${classMap({
450
- 'add-form-error': true,
451
- 'add-form-error_expert': this.expert
452
- })}"> <div></div> <div class="error-list"> ${this._formattedErrors.map(({
453
- line,
454
- msg
455
- }) => html` <gv-input-message>${withLine ? html`<strong .innerHTML="${i18n('gv-properties.errors.line')} ${line}:&nbsp;"></strong>` : ''} <span .innerHTML="${msg}"></span></gv-input-message> `)} </div> </div>`;
456
- }
457
-
458
- return html``;
459
- }
460
-
461
- _renderTable() {
462
- const providerEnabled = this.provider && this.provider.enabled;
463
-
464
- if (this.expert) {
465
- this._computeTextRows();
466
-
467
- const staticProperties = providerEnabled ? this._properties.filter(prop => !(providerEnabled && prop.dynamic)) : this._properties;
468
- const expertProperties = staticProperties.filter(prop => !prop.encrypted);
469
- const content = expertProperties.map(prop => `${prop.key}="${prop.value}"`).join('\n');
470
- return html`<gv-text id="expert-input" placeholder="${i18n('gv-properties.placeholder.input')}" @gv-text:input="${this._onExpertModeTextInput}" .value="${content}" ?readonly="${this.readonly}" .rows="${this._textRows}"></gv-text> ${this._renderErrors(true)}`;
471
- } else {
472
- const options = {
473
- data: [{
474
- field: 'dynamic',
475
- label: 'Dynamic',
476
- width: '40px',
477
- type: item => item.dynamic && providerEnabled ? 'gv-icon' : 'div',
478
- attributes: {
479
- shape: item => item.dynamic && providerEnabled ? 'code:time-schedule' : '',
480
- title: item => item.dynamic && providerEnabled ? 'Dynamic properties service is actually in running' : '',
481
- style: 'justify-content: center; align-items: center; height: 100%;'
482
- }
483
- }, {
484
- field: 'key',
485
- label: 'Key',
486
- type: 'gv-input',
487
- attributes: {
488
- clipboard: true,
489
- placeholder: i18n('gv-properties.placeholder.key'),
490
- name: 'key',
491
- required: true,
492
- readonly: this.readonly
493
- }
494
- }, {
495
- field: 'value',
496
- label: 'Value',
497
- type: 'gv-input',
498
- attributes: {
499
- name: 'value',
500
- placeholder: 'Property value',
501
- required: true,
502
- readonly: this.readonly,
503
- disabled: item => item.dynamic && providerEnabled || item.encrypted,
504
- type: item => item.encrypted ? 'password' : 'text',
505
- title: item => item.encrypted ? i18n('gv-properties.infos.encrypted-value') : '',
506
- description: item => item.encryptionWarning,
507
- icon: null,
508
- 'ongv-input:input': this._onInput.bind(this)
509
- }
510
- }]
511
- };
512
-
513
- if (this.encryptable === true) {
514
- options.data.push({
515
- field: 'encryptable',
516
- type: 'gv-switch',
517
- style: '--gv-switch--ta: right;',
518
- width: '105px',
519
- attributes: {
520
- description: i18n('gv-properties.encrypted-toggle'),
521
- required: true,
522
- readonly: this.readonly,
523
- disabled: item => item.dynamic && providerEnabled,
524
- 'ongv-switch:input': this._onSwitchEncrypted.bind(this),
525
- style: 'display: inline-flex; font-size: 12px; height: 40px;'
526
- }
527
- });
528
- }
529
-
530
- if (this.readonly !== true) {
531
- options.data.push({
532
- type: 'gv-button',
533
- width: '40px',
534
- attributes: {
535
- 'ongv-button:click': (item, event, target) => this._removeProperty(item, target),
536
- title: 'Remove',
537
- disabled: item => item.dynamic && providerEnabled,
538
- danger: true,
539
- outlined: true,
540
- icon: 'home:trash'
541
- }
542
- });
543
- }
544
-
545
- const filteredProperties = this._filter != null ? this._properties.filter(prop => {
546
- return (prop.key.toLowerCase() + prop.value.toLowerCase()).includes(this._filter);
547
- }) : this._properties;
548
- let properties = [...filteredProperties];
549
-
550
- if (this._paginationData) {
551
- this._paginationData.last = Math.ceil(filteredProperties.length / this._pageSize);
552
- this._paginationData.total = filteredProperties.length;
553
- this._paginationData.total_pages = Math.ceil(filteredProperties.length / this._pageSize);
554
- const index = (this._paginationData.current_page - 1) * this._pageSize;
555
- properties = [...filteredProperties].splice(index, this._pageSize);
556
- }
680
+ gv-schema-form {
681
+ margin: 0;
682
+ }
557
683
 
558
- const addPropertyFormGridClass = this.encryptable ? 'add-form-grid-with-encrypted-toggle' : 'add-form-grid';
559
- const addPropertyForm = this.readonly !== true ? html`<form id="add-property-form" class="add-form ${addPropertyFormGridClass}" @submit="${this._onSubmit}"> <div></div> <gv-input class="control" placeholder="${i18n('gv-properties.placeholder.key')}" required @gv-input:input="${this._onInputNew.bind(this, 'key')}" value="${this._newItem.key}"></gv-input> <gv-input class="control" placeholder="${i18n('gv-properties.placeholder.value')}" required @gv-input:input="${this._onInputNew.bind(this, 'value')}" .value="${this._newItem.value}"></gv-input> ${this.encryptable ? html` <gv-switch class="control" required description="${i18n('gv-properties.encrypted-toggle')}" @gv-switch:input="${this._onInputNew.bind(this, 'encryptable')}" .value="${this._newItem.encryptable}"></gv-switch>` : ''} <gv-button id="add-property" icon="code:plus" outlined disabled="disabled" @gv-button:click="${this._addProperty.bind(this, this._newItem)}" title="${i18n('gv-properties.add')}"></gv-button> </form> ${this._renderErrors()} <hr>` : '';
560
- return html` ${addPropertyForm} <gv-table .options="${options}" .items="${properties}" noheader nosort order="key" rowheight="57px"></gv-table>`;
561
- }
562
- }
563
-
564
- _onChangeMode({
565
- detail
566
- }) {
567
- this._submitExpertMode();
684
+ .table-box {
685
+ width: 100%;
686
+ border-left: 1px solid #bfbfbf;
687
+ display: flex;
688
+ }
568
689
 
569
- this.expert = detail;
570
- this._errors = [];
571
- this._newItem = {
572
- key: '',
573
- value: '',
574
- _new: true
575
- };
690
+ gv-table {
691
+ height: auto;
692
+ flex: 1;
693
+ margin-top: 10px;
694
+ margin-right: 50px;
695
+ --gv-table-rows--ov: none;
696
+ --gv-table--colmg: var(--gv-properties-table--colmg, 0.2rem);
697
+ --gv-table-cell--d: inline;
698
+ --gv-table-row--ai: flex-start;
699
+ --gv-table-row--ac: flex-start;
700
+ --gv-table-hover--bgc: var(--gv-theme-neutral-color-lightest);
701
+ }
576
702
 
577
- this._onClosePropertySchemaForm();
578
- }
703
+ .properties-title {
704
+ text-transform: uppercase;
705
+ letter-spacing: 0.2rem;
706
+ }
579
707
 
580
- _onPaginate({
581
- detail
582
- }) {
583
- this._paginationData.current_page = detail.page;
708
+ .properties-bottom-container {
709
+ display: flex;
710
+ justify-content: center;
711
+ align-items: center;
712
+ height: 100%;
713
+ flex-direction: column;
714
+ }
584
715
 
585
- this._onClosePropertySchemaForm();
716
+ .header {
717
+ border-bottom: 1px solid #d9d9d9;
718
+ display: flex;
719
+ min-height: 45px;
720
+ align-items: center;
721
+ margin-bottom: 0.5rem;
722
+ padding: 0 0.5rem;
723
+ }
586
724
 
587
- this.requestUpdate();
588
- }
725
+ .header .title {
726
+ color: #28444f;
727
+ font-size: 18px;
728
+ display: flex;
729
+ align-items: flex-end;
730
+ flex: 1;
731
+ }
589
732
 
590
- updated(props) {
591
- if (props.has('_properties') || props.has('_pageSize')) {
592
- this._paginationData = {
593
- first: 1,
594
- last: Math.ceil(this._properties.length / this._pageSize),
595
- total: this._properties.length,
596
- current_page: 1,
597
- total_pages: Math.ceil(this._properties.length / this._pageSize)
598
- };
599
- }
600
- }
733
+ .header .title span {
734
+ font-size: 12px;
735
+ margin-left: 8px;
736
+ opacity: 0.7;
737
+ }
601
738
 
602
- _onChangePageSize({
603
- detail
604
- }) {
605
- this._pageSize = Number(detail).valueOf();
739
+ .box {
740
+ position: absolute;
741
+ display: flex;
742
+ flex-direction: column;
743
+ width: 100%;
744
+ top: 0;
745
+ bottom: 0;
746
+ left: 0;
747
+ }
606
748
 
607
- this._onClosePropertySchemaForm();
608
- }
749
+ .container {
750
+ flex-grow: 1;
609
751
 
610
- _renderTableForm() {
611
- return html`<div class="container"> <div class="header"> <div class="title">Manage global properties <span>(${this._properties ? this._properties.length : 0})</span></div> <gv-switch small .description="${this.expert ? 'Expert' : 'Simple'}" .value="${this.expert}" @gv-switch:input="${this._onChangeMode}"></gv-switch> <gv-input id="search-property" placeholder="Filter properties (Shift + Ctrl + Space)" type="search" small class="search-input" .disabled="${this.expert}" @gv-input:input="${this._onSearchProperty}" @gv-input:clear="${this._onClearProperty}"></gv-input> <gv-select class="page-size__select" @gv-select:input="${this._onChangePageSize}" small .options="${this._pageSizes}" .value="${this._pageSize}" .disabled="${this.expert || this._paginationData == null}"></gv-select> <gv-pagination @gv-pagination:paginate="${this._onPaginate}" .disabled="${this.expert || this._paginationData == null}" .data="${this._paginationData}" widget></gv-pagination> </div> <div class="content"><div class="form-content">${this._renderTable()}</div></div> </div>`;
612
- }
752
+ display: flex;
753
+ flex-direction: column;
613
754
 
614
- _fetchDocumentation() {
615
- this._showDocumentation = true;
616
- }
755
+ /* for Firefox */
756
+ min-height: 0;
757
+ height: 100%;
758
+ }
617
759
 
618
- _hideDocumentation() {
619
- this._showDocumentation = false;
620
- }
760
+ .content {
761
+ background: white;
762
+ flex-grow: 1;
621
763
 
622
- get dirty() {
623
- const form = this.shadowRoot.querySelector('gv-schema-form');
624
- return form && form.dirty;
625
- }
764
+ overflow: auto;
626
765
 
627
- confirm() {
628
- const form = this.shadowRoot.querySelector('gv-schema-form');
766
+ /* for Firefox */
767
+ min-height: 0;
768
+ padding: 0.5rem;
629
769
 
630
- if (form) {
631
- return form.confirm().then(() => this._onClosePropertySchemaForm());
632
- }
770
+ display: flex;
771
+ flex-direction: column;
772
+ align-items: center;
773
+ }
633
774
 
634
- return Promise.resolve();
635
- }
775
+ gv-text {
776
+ --gv-text--fz: 20px;
777
+ --gv-text--lh: 25px;
778
+ }
636
779
 
637
- _renderForm() {
638
- return html`<gv-schema-form slot="top" scrollable .schema="${this._propertySchemaForm}" .values="${this.provider}" .icon="design:edit" has-header ?readonly="${this.readonly}" @gv-schema-form:submit="${this._onSubmitPropertyForm}"> <div slot="title" class="properties-title">Configure dynamic properties</div> <gv-button slot="header-left" icon="general:close" outlined small @gv-button:click="${this._onClosePropertySchemaForm}" title="Close (esc)"></gv-button> <gv-button slot="header-left" icon="home:book" ?disabled="${this._showDocumentation}" outlined small @gv-button:click="${this._fetchDocumentation}" title="Open documentation"></gv-button> </gv-schema-form>`;
639
- }
780
+ gv-switch {
781
+ --gv-switch--ta: right;
782
+ }
640
783
 
641
- _renderBottom() {
642
- if (this._propertySchemaForm && this._showDocumentation) {
643
- return html`<gv-resizable-views no-overflow direction="horizontal"> ${this._renderForm()} <gv-documentation slot="bottom" .text="${this._providerDocumentation}" @gv-documentation:close="${this._hideDocumentation}"></gv-documentation> </gv-resizable-views>`;
644
- } else if (this._propertySchemaForm) {
645
- return this._renderForm();
646
- } else {
647
- return html`<div class="properties-bottom-container">${this._renderDynamicConfiguration()}</div>`;
648
- }
649
- }
784
+ .header gv-input {
785
+ margin: 0 1rem;
786
+ }
650
787
 
651
- _renderDynamicConfiguration() {
652
- const hasDynamicConfiguration = this.provider && this.provider.enabled;
653
- let configureAction = '';
788
+ .add-form,
789
+ .add-form-error {
790
+ display: grid;
791
+ margin: auto 50px auto 0;
792
+ box-sizing: border-box;
793
+ }
654
794
 
655
- if (hasDynamicConfiguration || this.readonly !== true) {
656
- configureAction = html`<gv-button icon="tools:tools" @gv-button:click="${this._onConfigureDynamicProperties}" outlined .disabled="${this.expert}">Configure dynamic properties</gv-button>`;
657
- }
795
+ .add-form {
796
+ column-gap: var(--gv-properties-table--colmg, 0.2rem);
797
+ border-right: solid thick transparent;
798
+ height: 50px;
799
+ }
658
800
 
659
- if (hasDynamicConfiguration) {
660
- return html`<div class="properties-message"> Dynamic properties service is actually in <code>running</code> state and run with cron expression <code>${this.provider.schedule}</code> using <code>${this.provider.provider}</code> provider. </div> ${configureAction}`;
661
- } else if (this.readonly) {
662
- return html`<div class="empty">No dynamic properties service configured</div>`;
663
- } else {
664
- return configureAction;
665
- }
666
- }
801
+ .add-form gv-input,
802
+ gv-button,
803
+ gv-switch {
804
+ margin: auto 0;
805
+ }
667
806
 
668
- _onMove() {
669
- this._computeTextRows();
670
- }
807
+ .add-form gv-switch {
808
+ font-size: 12px;
809
+ }
671
810
 
672
- _computeTextRows() {
673
- const parent = this.shadowRoot.querySelector('.content');
811
+ .add-form-grid {
812
+ grid-template-columns: 40px auto auto 40px;
813
+ }
674
814
 
675
- if (parent) {
676
- const {
677
- height
678
- } = parent.getBoundingClientRect(); // --gv-text--lh=30px
815
+ .add-form-grid-with-encrypted-toggle {
816
+ grid-template-columns: 40px auto auto 105px 40px;
817
+ }
679
818
 
680
- this._textRows = Math.round(Math.round(height - 20) / 30) - 2;
681
- }
682
- }
819
+ .add-form-error_expert {
820
+ display: flex;
821
+ }
683
822
 
684
- render() {
685
- if (this.providers && this.providers.length > 0) {
686
- return html`<div class="properties"> <gv-resizable-views no-overflow @gv-resizable-views:move="${this._onMove}" @gv-resizable-views:resize="${this._onMove}"> <div slot="top" class="box">${this._renderTableForm()}</div> <div slot="bottom">${this._renderBottom()}</div> </gv-resizable-views> </div>`;
687
- } else {
688
- return html`<div class="properties"> <div class="table-box">${this._renderTableForm()}</div> </div>`;
689
- }
690
- }
823
+ .add-form-error {
824
+ grid-template-columns: 40px 1fr;
825
+ }
826
+
827
+ code {
828
+ color: var(--gv-theme-color-warning-dark, #f57c00);
829
+ }
691
830
 
692
- static get styles() {
693
- return [empty, // language=CSS
694
- css`:host{box-sizing:border-box;height:100%;width:100%;display:block}.properties{display:flex;height:100%;width:100%}gv-resizable-views{height:100%;width:100%}gv-schema-form{margin:0}.table-box{width:100%;border-left:1px solid #bfbfbf;display:flex}gv-table{height:auto;flex:1;margin-top:10px;margin-right:50px;--gv-table-rows--ov:none;--gv-table--colmg:var(--gv-properties-table--colmg, 0.2rem);--gv-table-cell--d:inline;--gv-table-row--ai:flex-start;--gv-table-row--ac:flex-start;--gv-table-hover--bgc:var(--gv-theme-neutral-color-lightest)}.properties-title{text-transform:uppercase;letter-spacing:.2rem}.properties-bottom-container{display:flex;justify-content:center;align-items:center;height:100%;flex-direction:column}.header{border-bottom:1px solid #d9d9d9;display:flex;min-height:45px;align-items:center;margin-bottom:.5rem;padding:0 .5rem}.header .title{color:#28444f;font-size:18px;display:flex;align-items:flex-end;flex:1}.header .title span{font-size:12px;margin-left:8px;opacity:.7}.box{position:absolute;display:flex;flex-direction:column;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;display:flex;flex-direction:column;min-height:0;height:100%}.content{background:#fff;flex-grow:1;overflow:auto;min-height:0;padding:.5rem;display:flex;flex-direction:column;align-items:center}gv-text{--gv-text--fz:20px;--gv-text--lh:25px}gv-switch{--gv-switch--ta:right}.header gv-input{margin:0 1rem}.add-form,.add-form-error{display:grid;margin:auto 50px auto 0;box-sizing:border-box}.add-form{column-gap:var(--gv-properties-table--colmg,.2rem);border-right:solid thick transparent;height:50px}.add-form gv-input,gv-button,gv-switch{margin:auto 0}.add-form gv-switch{font-size:12px}.add-form-grid{grid-template-columns:40px auto auto 40px}.add-form-grid-with-encrypted-toggle{grid-template-columns:40px auto auto 105px 40px}.add-form-error_expert{display:flex}.add-form-error{grid-template-columns:40px 1fr}code{color:var(--gv-theme-color-warning-dark,#f57c00)}.form-content{display:flex;flex-direction:column;width:100%}.properties-message{margin-bottom:.5rem;font-size:14px}.page-size__select{max-width:50px}.search-input{width:300px}hr{background-color:var(--gv-theme-neutral-color);border:0;width:100%;height:2px}`];
695
- }
831
+ .form-content {
832
+ display: flex;
833
+ flex-direction: column;
834
+ width: 100%;
835
+ }
696
836
 
837
+ .properties-message {
838
+ margin-bottom: 0.5rem;
839
+ font-size: 14px;
840
+ }
841
+
842
+ .page-size__select {
843
+ max-width: 50px;
844
+ }
845
+
846
+ .search-input {
847
+ width: 300px;
848
+ }
849
+
850
+ hr {
851
+ background-color: var(--gv-theme-neutral-color);
852
+ border: 0;
853
+ width: 100%;
854
+ height: 2px;
855
+ }
856
+ `,
857
+ ];
858
+ }
697
859
  }
698
860
  window.customElements.define('gv-properties', GvProperties);
699
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1wcm9wZXJ0aWVzLmpzIl0sIm5hbWVzIjpbImNzcyIsImh0bWwiLCJMaXRFbGVtZW50IiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsIkVSUk9SX1RZUEVTIiwicGFyc2VSYXciLCJ0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyIsImkxOG4iLCJjbGFzc01hcCIsIktleWJvYXJkRWxlbWVudCIsIktFWVMiLCJlbXB0eSIsIkd2UHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJkeW5hbWljUHJvcGVydHlTY2hlbWEiLCJ0eXBlIiwiT2JqZWN0IiwiQXJyYXkiLCJfcHJvcGVydGllcyIsImF0dHJpYnV0ZSIsInByb3ZpZGVyIiwicHJvdmlkZXJzIiwiX3Byb3BlcnR5U2NoZW1hRm9ybSIsImV4cGVydCIsIkJvb2xlYW4iLCJfZm9ybWF0dGVkRXJyb3JzIiwiYXR0cmlidXRlcyIsIl9maWx0ZXIiLCJTdHJpbmciLCJfcGFnaW5hdGlvbkRhdGEiLCJfcGFnZVNpemUiLCJOdW1iZXIiLCJfbmV3SXRlbSIsIl9wcm92aWRlckRvY3VtZW50YXRpb24iLCJfc2hvd0RvY3VtZW50YXRpb24iLCJfdGV4dFJvd3MiLCJyZWFkb25seSIsInJlZmxlY3QiLCJlbmNyeXB0YWJsZSIsImNvbnN0cnVjdG9yIiwidHlwZXMiLCJfY3VycmVudFJlc291cmNlIiwia2V5IiwidmFsdWUiLCJfbmV3IiwiX3BhZ2VTaXplcyIsIl9lcnJvcnMiLCJvbktleWJvYXJkIiwiaXNQcmVzc2VkIiwiRXNjIiwiX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0iLCJTaGlmdCIsIkN0cmwiLCJTcGFjZSIsInNlYXJjaCIsInNoYWRvd1Jvb3QiLCJxdWVyeVNlbGVjdG9yIiwiZm9jdXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwibWFwIiwicHJvcGVydHkiLCJlbmNyeXB0ZWQiLCJfZ2V0UmVzaXphYmxlVmlld3MiLCJfbWF4aW1pemVUb3BWaWV3Iiwidmlld3MiLCJtYXhpbWl6ZVRvcCIsIl9tYXhpbWl6ZUJvdHRvbVZpZXciLCJyZXNpemUiLCJfc3BsaXRNYWluVmlld3MiLCJzcGxpdCIsIl9pc05ld0xpbmVUYWJsZSIsImxpbmUiLCJfb25JbnB1dE5ldyIsIm5hbWUiLCJldmVudCIsInRhcmdldCIsImRldGFpbCIsImVycm9ycyIsInNldFRpbWVvdXQiLCJidG4iLCJsZW5ndGgiLCJfZGlzYWJsZWROZXdMaW5lIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiX29uSW5wdXQiLCJfb25Td2l0Y2hFbmNyeXB0ZWQiLCJpdGVtIiwiZW5jcnlwdGlvbldhcm5pbmciLCJyZXF1ZXN0VXBkYXRlIiwiX2FkZFByb3BlcnR5IiwiX3JlbW92ZVByb3BlcnR5IiwiZmlsdGVyIiwidHJpbSIsIl9zdWJtaXRFeHBlcnRNb2RlIiwiX2hhbmRsZUV4cGVydE1vZGVJbnB1dCIsIl9vbkV4cGVydE1vZGVUZXh0SW5wdXQiLCJleHBlcnRNb2RlSW5wdXRTdHJpbmciLCJhbGxQcm9wZXJ0aWVzIiwicHJvdmlkZXJFbmFibGVkIiwiZW5hYmxlZCIsImR5bmFtaWNQcm9wZXJ0aWVzIiwicHJvcCIsImR5bmFtaWMiLCJlbmNyeXB0ZWRQcm9wZXJ0aWVzIiwiYWxsUHJvcGVydGllc1N0cmluZyIsInZhcmlhYmxlcyIsIl9vblN1Ym1pdFByb3BlcnR5Rm9ybSIsInZhbHVlcyIsInN1Ym1pdCIsIl9vblN1Ym1pdCIsImludmFsaWRDb250cm9scyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmaW5kIiwiY29udHJvbCIsImludmFsaWQiLCJfb25Db25maWd1cmVEeW5hbWljUHJvcGVydGllcyIsInByb3ZpZGVyc1RpdGxlTWFwIiwicmVkdWNlIiwiaWQiLCJwcm92aWRlcnNFbnVtIiwia2V5cyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJzY2hlZHVsZSIsImVudW0iLCJkZWZhdWx0IiwidGl0bGVNYXAiLCJyZXF1aXJlZCIsImRlZmF1bHRQcm92aWRlciIsImNvbmZpZ3VyYXRpb24iLCJzY2hlbWEiLCJkb2N1bWVudGF0aW9uIiwiX29uU2VhcmNoUHJvcGVydHkiLCJfb25DbGVhclByb3BlcnR5IiwicmF3RXJyb3JzIiwicG9zIiwiSU5WQUxJRF9OQU1FIiwibXNnIiwiRFVQTElDQVRFRF9OQU1FIiwiSU5WQUxJRF9MSU5FIiwiSU5WQUxJRF9WQUxVRSIsIl9yZW5kZXJFcnJvcnMiLCJ3aXRoTGluZSIsIl9yZW5kZXJUYWJsZSIsIl9jb21wdXRlVGV4dFJvd3MiLCJzdGF0aWNQcm9wZXJ0aWVzIiwiZXhwZXJ0UHJvcGVydGllcyIsImNvbnRlbnQiLCJqb2luIiwib3B0aW9ucyIsImRhdGEiLCJmaWVsZCIsImxhYmVsIiwid2lkdGgiLCJzaGFwZSIsInN0eWxlIiwiY2xpcGJvYXJkIiwicGxhY2Vob2xkZXIiLCJkaXNhYmxlZCIsImljb24iLCJiaW5kIiwicHVzaCIsImRhbmdlciIsIm91dGxpbmVkIiwiZmlsdGVyZWRQcm9wZXJ0aWVzIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsImxhc3QiLCJNYXRoIiwiY2VpbCIsInRvdGFsIiwidG90YWxfcGFnZXMiLCJpbmRleCIsImN1cnJlbnRfcGFnZSIsInNwbGljZSIsImFkZFByb3BlcnR5Rm9ybUdyaWRDbGFzcyIsImFkZFByb3BlcnR5Rm9ybSIsIl9vbkNoYW5nZU1vZGUiLCJfb25QYWdpbmF0ZSIsInBhZ2UiLCJ1cGRhdGVkIiwicHJvcHMiLCJoYXMiLCJmaXJzdCIsIl9vbkNoYW5nZVBhZ2VTaXplIiwidmFsdWVPZiIsIl9yZW5kZXJUYWJsZUZvcm0iLCJfZmV0Y2hEb2N1bWVudGF0aW9uIiwiX2hpZGVEb2N1bWVudGF0aW9uIiwiZGlydHkiLCJmb3JtIiwiY29uZmlybSIsInRoZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsIl9yZW5kZXJGb3JtIiwiX3JlbmRlckJvdHRvbSIsIl9yZW5kZXJEeW5hbWljQ29uZmlndXJhdGlvbiIsImhhc0R5bmFtaWNDb25maWd1cmF0aW9uIiwiY29uZmlndXJlQWN0aW9uIiwiX29uTW92ZSIsInBhcmVudCIsImhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJvdW5kIiwicmVuZGVyIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsSUFBZCxFQUFvQkMsVUFBcEIsUUFBc0MsS0FBdEM7QUFFQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTyxzQkFBUDtBQUNBLE9BQU8sdUJBQVA7QUFDQSxPQUFPLG9CQUFQO0FBQ0EsT0FBTyxtQkFBUDtBQUNBLE9BQU8sa0JBQVA7QUFDQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTywyQkFBUDtBQUNBLE9BQU8sb0JBQVA7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLFdBQVQsRUFBc0JDLFFBQXRCLEVBQWdDQyx1QkFBaEMsUUFBK0QsbUJBQS9EO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixhQUFyQjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpCO0FBQ0EsU0FBU0MsZUFBVCxFQUEwQkMsSUFBMUIsUUFBc0MsNEJBQXRDO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixpQkFBdEI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxZQUFOLFNBQTJCSCxlQUFlLENBQUNQLFVBQUQsQ0FBMUMsQ0FBdUQ7QUFDdkMsYUFBVlcsVUFBVSxHQUFHO0FBQ3RCLFdBQU87QUFDTEMsTUFBQUEscUJBQXFCLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BRGxCO0FBRUxILE1BQUFBLFVBQVUsRUFBRTtBQUFFRSxRQUFBQSxJQUFJLEVBQUVFO0FBQVIsT0FGUDtBQUdMQyxNQUFBQSxXQUFXLEVBQUU7QUFBRUgsUUFBQUEsSUFBSSxFQUFFRSxLQUFSO0FBQWVFLFFBQUFBLFNBQVMsRUFBRTtBQUExQixPQUhSO0FBSUxDLE1BQUFBLFFBQVEsRUFBRTtBQUFFTCxRQUFBQSxJQUFJLEVBQUVDO0FBQVIsT0FKTDtBQUtMSyxNQUFBQSxTQUFTLEVBQUU7QUFBRU4sUUFBQUEsSUFBSSxFQUFFRTtBQUFSLE9BTE47QUFNTEssTUFBQUEsbUJBQW1CLEVBQUU7QUFBRVAsUUFBQUEsSUFBSSxFQUFFQyxNQUFSO0FBQWdCRyxRQUFBQSxTQUFTLEVBQUU7QUFBM0IsT0FOaEI7QUFPTEksTUFBQUEsTUFBTSxFQUFFO0FBQUVSLFFBQUFBLElBQUksRUFBRVM7QUFBUixPQVBIO0FBUUxDLE1BQUFBLGdCQUFnQixFQUFFO0FBQUVWLFFBQUFBLElBQUksRUFBRUUsS0FBUjtBQUFlUyxRQUFBQSxVQUFVLEVBQUU7QUFBM0IsT0FSYjtBQVNMQyxNQUFBQSxPQUFPLEVBQUU7QUFBRVosUUFBQUEsSUFBSSxFQUFFYTtBQUFSLE9BVEo7QUFVTEMsTUFBQUEsZUFBZSxFQUFFO0FBQUVkLFFBQUFBLElBQUksRUFBRUMsTUFBUjtBQUFnQkcsUUFBQUEsU0FBUyxFQUFFO0FBQTNCLE9BVlo7QUFXTFcsTUFBQUEsU0FBUyxFQUFFO0FBQUVmLFFBQUFBLElBQUksRUFBRWdCLE1BQVI7QUFBZ0JaLFFBQUFBLFNBQVMsRUFBRTtBQUEzQixPQVhOO0FBWUxhLE1BQUFBLFFBQVEsRUFBRTtBQUFFakIsUUFBQUEsSUFBSSxFQUFFQyxNQUFSO0FBQWdCRyxRQUFBQSxTQUFTLEVBQUU7QUFBM0IsT0FaTDtBQWFMYyxNQUFBQSxzQkFBc0IsRUFBRTtBQUFFbEIsUUFBQUEsSUFBSSxFQUFFUyxPQUFSO0FBQWlCTCxRQUFBQSxTQUFTLEVBQUU7QUFBNUIsT0FibkI7QUFjTGUsTUFBQUEsa0JBQWtCLEVBQUU7QUFBRW5CLFFBQUFBLElBQUksRUFBRVMsT0FBUjtBQUFpQkwsUUFBQUEsU0FBUyxFQUFFO0FBQTVCLE9BZGY7QUFlTGdCLE1BQUFBLFNBQVMsRUFBRTtBQUFFcEIsUUFBQUEsSUFBSSxFQUFFZ0IsTUFBUjtBQUFnQlosUUFBQUEsU0FBUyxFQUFFO0FBQTNCLE9BZk47QUFnQkxpQixNQUFBQSxRQUFRLEVBQUU7QUFBRXJCLFFBQUFBLElBQUksRUFBRVMsT0FBUjtBQUFpQmEsUUFBQUEsT0FBTyxFQUFFO0FBQTFCLE9BaEJMO0FBaUJMQyxNQUFBQSxXQUFXLEVBQUU7QUFBRXZCLFFBQUFBLElBQUksRUFBRVMsT0FBUjtBQUFpQmEsUUFBQUEsT0FBTyxFQUFFO0FBQTFCO0FBakJSLEtBQVA7QUFtQkQ7O0FBRURFLEVBQUFBLFdBQVcsR0FBRztBQUNaO0FBQ0EsU0FBSzFCLFVBQUwsR0FBa0IsRUFBbEI7QUFDQSxTQUFLMkIsS0FBTCxHQUFhLEVBQWI7QUFDQSxTQUFLcEIsUUFBTCxHQUFnQixFQUFoQjtBQUNBLFNBQUtxQixnQkFBTCxHQUF3QixJQUF4QjtBQUNBLFNBQUtoQixnQkFBTCxHQUF3QixFQUF4QjtBQUNBLFNBQUtTLGtCQUFMLEdBQTBCLElBQTFCO0FBQ0EsU0FBS0YsUUFBTCxHQUFnQjtBQUFFVSxNQUFBQSxHQUFHLEVBQUUsRUFBUDtBQUFXQyxNQUFBQSxLQUFLLEVBQUUsRUFBbEI7QUFBc0JDLE1BQUFBLElBQUksRUFBRTtBQUE1QixLQUFoQjtBQUNBLFNBQUtkLFNBQUwsR0FBaUIsRUFBakI7QUFDQSxTQUFLSyxTQUFMLEdBQWlCLEVBQWpCO0FBQ0EsU0FBS1UsVUFBTCxHQUFrQixDQUFDLENBQUQsRUFBSSxFQUFKLEVBQVEsRUFBUixFQUFZLEVBQVosRUFBZ0IsR0FBaEIsQ0FBbEI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUNEOztBQUVEQyxFQUFBQSxVQUFVLEdBQUc7QUFDWCxRQUFJLEtBQUtDLFNBQUwsQ0FBZXRDLElBQUksQ0FBQ3VDLEdBQXBCLENBQUosRUFBOEI7QUFDNUIsV0FBS0MsMEJBQUw7QUFDRDs7QUFDRCxRQUFJLEtBQUtGLFNBQUwsQ0FBZXRDLElBQUksQ0FBQ3lDLEtBQXBCLEVBQTJCekMsSUFBSSxDQUFDMEMsSUFBaEMsRUFBc0MxQyxJQUFJLENBQUMyQyxLQUEzQyxDQUFKLEVBQXVEO0FBQ3JELFlBQU1DLE1BQU0sR0FBRyxLQUFLQyxVQUFMLENBQWdCQyxhQUFoQixDQUE4QixrQkFBOUIsQ0FBZjs7QUFDQSxVQUFJRixNQUFKLEVBQVk7QUFDVkEsUUFBQUEsTUFBTSxDQUFDRyxLQUFQO0FBQ0Q7QUFDRjtBQUNGOztBQUVhLE1BQVY1QyxVQUFVLENBQUNBLFVBQUQsRUFBYTtBQUN6QixTQUFLSyxXQUFMLEdBQW1CTCxVQUFVLENBQzFCNkMsSUFEZ0IsQ0FDWCxDQUFDQyxDQUFELEVBQUlDLENBQUosS0FBVUQsQ0FBQyxDQUFDakIsR0FBRixDQUFNbUIsYUFBTixDQUFvQkQsQ0FBQyxDQUFDbEIsR0FBdEIsQ0FEQyxFQUVoQm9CLEdBRmdCLENBRVhDLFFBQUQsSUFBYztBQUNqQixVQUFJQSxRQUFRLENBQUNDLFNBQWIsRUFBd0I7QUFDdEJELFFBQUFBLFFBQVEsQ0FBQ3pCLFdBQVQsR0FBdUIsSUFBdkI7QUFDRDs7QUFDRCxhQUFPeUIsUUFBUDtBQUNELEtBUGdCLENBQW5CO0FBUUQ7O0FBRWEsTUFBVmxELFVBQVUsR0FBRztBQUNmLFdBQU8sS0FBS0ssV0FBWjtBQUNEOztBQUVEK0MsRUFBQUEsa0JBQWtCLEdBQUc7QUFDbkIsV0FBTyxLQUFLVixVQUFMLENBQWdCQyxhQUFoQixDQUE4QixvQkFBOUIsQ0FBUDtBQUNEOztBQUVEVSxFQUFBQSxnQkFBZ0IsR0FBRztBQUNqQixVQUFNQyxLQUFLLEdBQUcsS0FBS0Ysa0JBQUwsRUFBZDs7QUFDQSxRQUFJRSxLQUFKLEVBQVc7QUFDVEEsTUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCLEVBQWxCLEVBQXNCLENBQXRCO0FBQ0Q7QUFDRjs7QUFFREMsRUFBQUEsbUJBQW1CLEdBQUc7QUFDcEIsVUFBTUYsS0FBSyxHQUFHLEtBQUtGLGtCQUFMLEVBQWQ7O0FBQ0EsUUFBSUUsS0FBSixFQUFXO0FBQ1RBLE1BQUFBLEtBQUssQ0FBQ0csTUFBTixDQUFhLEVBQWIsRUFBaUIsRUFBakI7QUFDRDtBQUNGOztBQUVEQyxFQUFBQSxlQUFlLEdBQUc7QUFDaEIsVUFBTUosS0FBSyxHQUFHLEtBQUtGLGtCQUFMLEVBQWQ7O0FBQ0EsUUFBSUUsS0FBSixFQUFXO0FBQ1RBLE1BQUFBLEtBQUssQ0FBQ0ssS0FBTjtBQUNEO0FBQ0Y7O0FBRURDLEVBQUFBLGVBQWUsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3BCLFdBQU9BLElBQUksQ0FBQzlCLElBQUwsS0FBYyxJQUFyQjtBQUNEOztBQUVEK0IsRUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLEtBQVAsRUFBYztBQUN2QixVQUFNQyxNQUFNLEdBQUdELEtBQUssQ0FBQ0MsTUFBckI7QUFDQSxTQUFLOUMsUUFBTCxDQUFjNEMsSUFBZCxJQUFzQkMsS0FBSyxDQUFDRSxNQUE1QjtBQUNBLFVBQU07QUFBRUMsTUFBQUE7QUFBRixRQUFhM0UsUUFBUSxDQUFDQyx1QkFBdUIsQ0FBQyxDQUFDLEdBQUcsS0FBS08sVUFBVCxFQUFxQixLQUFLbUIsUUFBMUIsQ0FBRCxDQUF4QixDQUEzQjtBQUNBLFNBQUtjLE9BQUwsR0FBZWtDLE1BQWY7QUFDQUMsSUFBQUEsVUFBVSxDQUFDLE1BQU07QUFDZixZQUFNQyxHQUFHLEdBQUcsS0FBSzNCLFVBQUwsQ0FBZ0JDLGFBQWhCLENBQThCLHdCQUE5QixDQUFaOztBQUNBLFVBQUl3QixNQUFNLENBQUNHLE1BQVAsR0FBZ0IsQ0FBaEIsSUFBcUIsS0FBS0MsZ0JBQUwsQ0FBc0IsS0FBS3BELFFBQTNCLENBQXpCLEVBQStEO0FBQzdEa0QsUUFBQUEsR0FBRyxDQUFDRyxZQUFKLENBQWlCLFVBQWpCLEVBQTZCLElBQTdCO0FBQ0QsT0FGRCxNQUVPO0FBQ0xILFFBQUFBLEdBQUcsQ0FBQ0ksZUFBSixDQUFvQixVQUFwQjtBQUNEOztBQUNELFVBQUlWLElBQUksS0FBSyxLQUFiLEVBQW9CO0FBQ2xCLFlBQUlJLE1BQU0sQ0FBQ0csTUFBUCxLQUFrQixDQUF0QixFQUF5QjtBQUN2QkwsVUFBQUEsTUFBTSxDQUFDUSxlQUFQLENBQXVCLFNBQXZCO0FBQ0FSLFVBQUFBLE1BQU0sQ0FBQ08sWUFBUCxDQUFvQixPQUFwQixFQUE2QixJQUE3QjtBQUNELFNBSEQsTUFHTztBQUNMUCxVQUFBQSxNQUFNLENBQUNRLGVBQVAsQ0FBdUIsT0FBdkI7QUFDQVIsVUFBQUEsTUFBTSxDQUFDTyxZQUFQLENBQW9CLFNBQXBCLEVBQStCLElBQS9CO0FBQ0Q7QUFDRjtBQUNGLEtBaEJTLEVBZ0JQLENBaEJPLENBQVY7QUFpQkQ7O0FBRURFLEVBQUFBLFFBQVEsR0FBRztBQUNUcEYsSUFBQUEsbUJBQW1CLENBQUMsSUFBRCxFQUFPLFFBQVAsRUFBaUI7QUFBRVUsTUFBQUEsVUFBVSxFQUFFLEtBQUtBO0FBQW5CLEtBQWpCLENBQW5CO0FBQ0Q7O0FBRUQyRSxFQUFBQSxrQkFBa0IsQ0FBQ0MsSUFBRCxFQUFPO0FBQ3ZCLFFBQUlBLElBQUksQ0FBQ3pCLFNBQUwsS0FBbUIsSUFBdkIsRUFBNkI7QUFDM0J5QixNQUFBQSxJQUFJLENBQUM5QyxLQUFMLEdBQWEsRUFBYjtBQUNBOEMsTUFBQUEsSUFBSSxDQUFDekIsU0FBTCxHQUFpQixLQUFqQjtBQUNBeUIsTUFBQUEsSUFBSSxDQUFDQyxpQkFBTCxHQUF5Qm5GLElBQUksQ0FBQywwQ0FBRCxDQUE3QjtBQUNBLFdBQUtvRixhQUFMO0FBQ0Q7O0FBQ0R4RixJQUFBQSxtQkFBbUIsQ0FBQyxJQUFELEVBQU8sa0JBQVAsRUFBMkI7QUFBRVUsTUFBQUEsVUFBVSxFQUFFLEtBQUtBO0FBQW5CLEtBQTNCLENBQW5CO0FBQ0Q7O0FBRUQrRSxFQUFBQSxZQUFZLENBQUNILElBQUQsRUFBTztBQUNqQixXQUFPQSxJQUFJLENBQUM3QyxJQUFaO0FBQ0EsU0FBSy9CLFVBQUwsR0FBa0IsQ0FBQzRFLElBQUQsRUFBTyxHQUFHLEtBQUt2RSxXQUFmLENBQWxCO0FBQ0EsU0FBS2MsUUFBTCxHQUFnQjtBQUFFVSxNQUFBQSxHQUFHLEVBQUUsRUFBUDtBQUFXQyxNQUFBQSxLQUFLLEVBQUUsRUFBbEI7QUFBc0JDLE1BQUFBLElBQUksRUFBRSxJQUE1QjtBQUFrQ04sTUFBQUEsV0FBVyxFQUFFLEtBQS9DO0FBQXNEMEIsTUFBQUEsU0FBUyxFQUFFO0FBQWpFLEtBQWhCO0FBQ0E3RCxJQUFBQSxtQkFBbUIsQ0FBQyxJQUFELEVBQU8sUUFBUCxFQUFpQjtBQUFFVSxNQUFBQSxVQUFVLEVBQUUsS0FBS0E7QUFBbkIsS0FBakIsQ0FBbkI7QUFDRDs7QUFFRGdGLEVBQUFBLGVBQWUsQ0FBQ0osSUFBRCxFQUFPO0FBQ3BCLFNBQUt2RSxXQUFMLEdBQW1CLEtBQUtBLFdBQUwsQ0FBaUI0RSxNQUFqQixDQUF5Qi9CLFFBQUQsSUFBY0EsUUFBUSxDQUFDckIsR0FBVCxLQUFpQitDLElBQUksQ0FBQy9DLEdBQTVELENBQW5CO0FBQ0F2QyxJQUFBQSxtQkFBbUIsQ0FBQyxJQUFELEVBQU8sUUFBUCxFQUFpQjtBQUFFVSxNQUFBQSxVQUFVLEVBQUUsS0FBS0E7QUFBbkIsS0FBakIsQ0FBbkI7QUFDRDs7QUFFRHVFLEVBQUFBLGdCQUFnQixDQUFDSyxJQUFELEVBQU87QUFDckIsV0FBT0EsSUFBSSxDQUFDL0MsR0FBTCxJQUFZLElBQVosSUFBb0IrQyxJQUFJLENBQUM5QyxLQUFMLElBQWMsSUFBbEMsSUFBMEM4QyxJQUFJLENBQUMvQyxHQUFMLENBQVNxRCxJQUFULE9BQW9CLEVBQTlELElBQW9FTixJQUFJLENBQUM5QyxLQUFMLENBQVdvRCxJQUFYLE9BQXNCLEVBQWpHO0FBQ0Q7O0FBRURDLEVBQUFBLGlCQUFpQixHQUFHO0FBQ2xCLFFBQUksS0FBS3pFLE1BQVQsRUFBaUI7QUFDZixXQUFLVixVQUFMLEdBQWtCLEtBQUtvRixzQkFBTCxDQUE0QixLQUFLMUMsVUFBTCxDQUFnQkMsYUFBaEIsQ0FBOEIsZUFBOUIsRUFBK0NiLEtBQTNFLENBQWxCO0FBQ0Q7QUFDRjs7QUFFRHVELEVBQUFBLHNCQUFzQixDQUFDO0FBQUVuQixJQUFBQTtBQUFGLEdBQUQsRUFBYTtBQUNqQyxTQUFLa0Isc0JBQUwsQ0FBNEJsQixNQUE1QjtBQUNEOztBQUVEa0IsRUFBQUEsc0JBQXNCLENBQUNFLHFCQUFELEVBQXdCO0FBQzVDLFFBQUlDLGFBQWEsR0FBRyxLQUFLbEYsV0FBekI7QUFDQSxVQUFNbUYsZUFBZSxHQUFHLEtBQUtqRixRQUFMLElBQWlCLEtBQUtBLFFBQUwsQ0FBY2tGLE9BQXZEO0FBQ0EsVUFBTUMsaUJBQWlCLEdBQUdILGFBQWEsQ0FBQ04sTUFBZCxDQUFzQlUsSUFBRCxJQUFVSCxlQUFlLElBQUlHLElBQUksQ0FBQ0MsT0FBdkQsQ0FBMUI7QUFDQSxVQUFNQyxtQkFBbUIsR0FBR04sYUFBYSxDQUFDTixNQUFkLENBQXNCVSxJQUFELElBQVVBLElBQUksQ0FBQ3hDLFNBQXBDLENBQTVCO0FBRUEsVUFBTTJDLG1CQUFtQixHQUFJLEdBQUVSLHFCQUFzQixLQUFJN0YsdUJBQXVCLENBQUNpRyxpQkFBRCxDQUFvQixLQUFJakcsdUJBQXVCLENBQzdIb0csbUJBRDZILENBRTdILEVBRkY7QUFHQSxVQUFNO0FBQUUxQixNQUFBQTtBQUFGLFFBQWEzRSxRQUFRLENBQUNzRyxtQkFBRCxDQUEzQjtBQUNBLFNBQUs3RCxPQUFMLEdBQWVrQyxNQUFmOztBQUNBLFFBQUlBLE1BQU0sQ0FBQ0csTUFBUCxLQUFrQixDQUF0QixFQUF5QjtBQUN2QixZQUFNO0FBQUV5QixRQUFBQTtBQUFGLFVBQWdCdkcsUUFBUSxDQUFDOEYscUJBQUQsQ0FBOUI7QUFDQUMsTUFBQUEsYUFBYSxHQUFHLENBQUMsR0FBR1EsU0FBSixFQUFlLEdBQUdMLGlCQUFsQixFQUFxQyxHQUFHRyxtQkFBeEMsQ0FBaEI7QUFDQXZHLE1BQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxRQUFQLEVBQWlCO0FBQUVVLFFBQUFBLFVBQVUsRUFBRXVGO0FBQWQsT0FBakIsQ0FBbkI7QUFDRDs7QUFFRCxXQUFPQSxhQUFQO0FBQ0Q7O0FBRURTLEVBQUFBLHFCQUFxQixDQUFDO0FBQUU5QixJQUFBQTtBQUFGLEdBQUQsRUFBYTtBQUNoQyxVQUFNM0QsUUFBUSxHQUFHMkQsTUFBTSxDQUFDK0IsTUFBeEI7QUFDQTNHLElBQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxlQUFQLEVBQXdCO0FBQUVpQixNQUFBQTtBQUFGLEtBQXhCLENBQW5CO0FBQ0EsU0FBS3VFLGFBQUw7QUFDRDs7QUFFRG9CLEVBQUFBLE1BQU0sR0FBRztBQUNQLFFBQUksS0FBS3hGLE1BQVQsRUFBaUI7QUFDZixXQUFLeUUsaUJBQUw7QUFDRCxLQUZELE1BRU87QUFDTCxXQUFLZ0IsU0FBTDtBQUNEO0FBQ0Y7O0FBRURBLEVBQUFBLFNBQVMsR0FBRztBQUNWLFVBQU1DLGVBQWUsR0FBRyxDQUFDLEdBQUcsS0FBSzFELFVBQUwsQ0FBZ0IyRCxnQkFBaEIsQ0FBaUMsZUFBakMsQ0FBSixFQUF1REMsSUFBdkQsQ0FBNkRDLE9BQUQsSUFBYUEsT0FBTyxDQUFDQyxPQUFqRixDQUF4Qjs7QUFDQSxRQUFJSixlQUFlLElBQUksSUFBdkIsRUFBNkI7QUFDM0IsV0FBS3JCLFlBQUwsQ0FBa0IsS0FBSzVELFFBQXZCO0FBQ0Q7QUFDRjs7QUFFRHNGLEVBQUFBLDZCQUE2QixHQUFHO0FBQzlCLFFBQUksS0FBS3hHLHFCQUFMLElBQThCLElBQWxDLEVBQXdDO0FBQ3RDO0FBQ0EsWUFBTXlHLGlCQUFpQixHQUFHLEtBQUtsRyxTQUFMLENBQWVtRyxNQUFmLENBQXNCLENBQUMxRCxHQUFELEVBQU0xQyxRQUFOLEtBQW1CO0FBQ2pFMEMsUUFBQUEsR0FBRyxDQUFDMUMsUUFBUSxDQUFDcUcsRUFBVixDQUFILEdBQW1CckcsUUFBUSxDQUFDc0IsR0FBNUI7QUFDQSxlQUFPb0IsR0FBUDtBQUNELE9BSHlCLEVBR3ZCLEVBSHVCLENBQTFCO0FBS0EsWUFBTTRELGFBQWEsR0FBRzFHLE1BQU0sQ0FBQzJHLElBQVAsQ0FBWUosaUJBQVosQ0FBdEI7QUFDQSxXQUFLekcscUJBQUwsR0FBNkI7QUFDM0JELFFBQUFBLFVBQVUsRUFBRTtBQUNWeUYsVUFBQUEsT0FBTyxFQUFFO0FBQ1B2RixZQUFBQSxJQUFJLEVBQUUsU0FEQztBQUVQNkcsWUFBQUEsS0FBSyxFQUFFLFNBRkE7QUFHUEMsWUFBQUEsV0FBVyxFQUFFO0FBSE4sV0FEQztBQU1WQyxVQUFBQSxRQUFRLEVBQUU7QUFDUi9HLFlBQUFBLElBQUksRUFBRSxRQURFO0FBRVI2RyxZQUFBQSxLQUFLLEVBQUUsVUFGQztBQUdSLDZCQUFpQjtBQUNmLGlDQUFtQjtBQURKO0FBSFQsV0FOQTtBQWFWeEcsVUFBQUEsUUFBUSxFQUFFO0FBQ1JMLFlBQUFBLElBQUksRUFBRSxRQURFO0FBRVI2RyxZQUFBQSxLQUFLLEVBQUUsZUFGQztBQUdSRyxZQUFBQSxJQUFJLEVBQUVMLGFBSEU7QUFJUk0sWUFBQUEsT0FBTyxFQUFFTixhQUFhLENBQUMsQ0FBRCxDQUpkO0FBS1IsNkJBQWlCO0FBQ2ZPLGNBQUFBLFFBQVEsRUFBRVY7QUFESztBQUxUO0FBYkEsU0FEZTtBQXdCM0JXLFFBQUFBLFFBQVEsRUFBRSxDQUFDLFVBQUQsRUFBYSxVQUFiO0FBeEJpQixPQUE3QjtBQTBCRDs7QUFFRCxVQUFNQyxlQUFlLEdBQUcsS0FBSzlHLFNBQUwsQ0FBZSxDQUFmLENBQXhCO0FBRUEsU0FBS0MsbUJBQUwsR0FBMkI7QUFDekJULE1BQUFBLFVBQVUsRUFBRSxFQUFFLEdBQUcsS0FBS0MscUJBQUwsQ0FBMkJELFVBQWhDO0FBQTRDdUgsUUFBQUEsYUFBYSxFQUFFRCxlQUFlLENBQUNFO0FBQTNFLE9BRGE7QUFFekJILE1BQUFBLFFBQVEsRUFBRSxLQUFLcEgscUJBQUwsQ0FBMkJvSDtBQUZaLEtBQTNCO0FBSUEsU0FBS2pHLHNCQUFMLEdBQThCa0csZUFBZSxDQUFDRyxhQUE5Qzs7QUFDQSxTQUFLakUsbUJBQUw7QUFDRDs7QUFFRG5CLEVBQUFBLDBCQUEwQixHQUFHO0FBQzNCLFNBQUs1QixtQkFBTCxHQUEyQixJQUEzQjs7QUFDQSxTQUFLNEMsZ0JBQUw7QUFDRDs7QUFFRHFFLEVBQUFBLGlCQUFpQixDQUFDO0FBQUV4RCxJQUFBQTtBQUFGLEdBQUQsRUFBYTtBQUM1QixTQUFLcEQsT0FBTCxHQUFlb0QsTUFBZjs7QUFDQSxTQUFLN0IsMEJBQUw7QUFDRDs7QUFFRHNGLEVBQUFBLGdCQUFnQixHQUFHO0FBQ2pCLFNBQUs3RyxPQUFMLEdBQWUsSUFBZjs7QUFDQSxTQUFLdUIsMEJBQUw7QUFDRDs7QUFFVSxNQUFQSixPQUFPLEdBQUc7QUFDWixXQUFPLEtBQUtyQixnQkFBWjtBQUNEOztBQUVVLE1BQVBxQixPQUFPLENBQUMyRixTQUFELEVBQVk7QUFDckIsU0FBS2hILGdCQUFMLEdBQXdCZ0gsU0FBUyxDQUFDM0UsR0FBVixDQUFjLENBQUM7QUFBRS9DLE1BQUFBLElBQUY7QUFBUTJCLE1BQUFBLEdBQVI7QUFBYWdHLE1BQUFBO0FBQWIsS0FBRCxLQUF3QjtBQUM1RCxVQUFJM0gsSUFBSSxLQUFLWCxXQUFXLENBQUN1SSxZQUF6QixFQUF1QztBQUNyQyxlQUFPO0FBQ0xqRSxVQUFBQSxJQUFJLEVBQUVnRSxHQUFHLENBQUNoRSxJQURMO0FBRUxrRSxVQUFBQSxHQUFHLEVBQUVySSxJQUFJLENBQUMsa0NBQUQsRUFBcUM7QUFBRW1DLFlBQUFBO0FBQUYsV0FBckM7QUFGSixTQUFQO0FBSUQ7O0FBQ0QsVUFBSTNCLElBQUksS0FBS1gsV0FBVyxDQUFDeUksZUFBekIsRUFBMEM7QUFDeEMsZUFBTztBQUNMbkUsVUFBQUEsSUFBSSxFQUFFZ0UsR0FBRyxDQUFDaEUsSUFETDtBQUVMa0UsVUFBQUEsR0FBRyxFQUFFckksSUFBSSxDQUFDLHFDQUFELEVBQXdDO0FBQUVtQyxZQUFBQTtBQUFGLFdBQXhDO0FBRkosU0FBUDtBQUlEOztBQUNELFVBQUkzQixJQUFJLEtBQUtYLFdBQVcsQ0FBQzBJLFlBQXpCLEVBQXVDO0FBQ3JDLGVBQU87QUFDTHBFLFVBQUFBLElBQUksRUFBRWdFLEdBQUcsQ0FBQ2hFLElBREw7QUFFTGtFLFVBQUFBLEdBQUcsRUFBRXJJLElBQUksQ0FBQyxtQ0FBRDtBQUZKLFNBQVA7QUFJRDs7QUFDRCxVQUFJUSxJQUFJLEtBQUtYLFdBQVcsQ0FBQzJJLGFBQXpCLEVBQXdDO0FBQ3RDLGVBQU87QUFDTHJFLFVBQUFBLElBQUksRUFBRWdFLEdBQUcsQ0FBQ2hFLElBREw7QUFFTGtFLFVBQUFBLEdBQUcsRUFBRXJJLElBQUksQ0FBQyxvQ0FBRDtBQUZKLFNBQVA7QUFJRDs7QUFDRCxhQUFPO0FBQUVtRSxRQUFBQSxJQUFJLEVBQUUsR0FBUjtBQUFha0UsUUFBQUEsR0FBRyxFQUFFckksSUFBSSxDQUFDLDhCQUFEO0FBQXRCLE9BQVA7QUFDRCxLQTFCdUIsQ0FBeEI7QUEyQkQ7O0FBRUR5SSxFQUFBQSxhQUFhLENBQUNDLFFBQVEsR0FBRyxLQUFaLEVBQW1CO0FBQzlCLFFBQUksS0FBS3hILGdCQUFMLENBQXNCMEQsTUFBdEIsR0FBK0IsQ0FBbkMsRUFBc0M7QUFDcEMsYUFBT2xGLElBQUksZUFBZU8sUUFBUSxDQUFDO0FBQUUsMEJBQWtCLElBQXBCO0FBQTBCLGlDQUF5QixLQUFLZTtBQUF4RCxPQUFELENBQXZCLDJDQUdMLEtBQUtFLGdCQUFMLENBQXNCcUMsR0FBdEIsQ0FDQSxDQUFDO0FBQUVZLFFBQUFBLElBQUY7QUFBUWtFLFFBQUFBO0FBQVIsT0FBRCxLQUFtQjNJLElBQUksc0JBRWhCZ0osUUFBUSxHQUFHaEosSUFBSSx1QkFBdUJNLElBQUksQ0FBQywyQkFBRCxDQUEzQixJQUE0RG1FLElBQTVELG9CQUFQLEdBQThGLEVBRnRGLHNCQUdDa0UsR0FIRCwrQkFEdkIsQ0FISyxnQkFBWDtBQWFEOztBQUNELFdBQU8zSSxJQUFJLEVBQVg7QUFDRDs7QUFFRGlKLEVBQUFBLFlBQVksR0FBRztBQUNiLFVBQU03QyxlQUFlLEdBQUcsS0FBS2pGLFFBQUwsSUFBaUIsS0FBS0EsUUFBTCxDQUFja0YsT0FBdkQ7O0FBQ0EsUUFBSSxLQUFLL0UsTUFBVCxFQUFpQjtBQUNmLFdBQUs0SCxnQkFBTDs7QUFFQSxZQUFNQyxnQkFBZ0IsR0FBRy9DLGVBQWUsR0FBRyxLQUFLbkYsV0FBTCxDQUFpQjRFLE1BQWpCLENBQXlCVSxJQUFELElBQVUsRUFBRUgsZUFBZSxJQUFJRyxJQUFJLENBQUNDLE9BQTFCLENBQWxDLENBQUgsR0FBMkUsS0FBS3ZGLFdBQXhIO0FBQ0EsWUFBTW1JLGdCQUFnQixHQUFHRCxnQkFBZ0IsQ0FBQ3RELE1BQWpCLENBQXlCVSxJQUFELElBQVUsQ0FBQ0EsSUFBSSxDQUFDeEMsU0FBeEMsQ0FBekI7QUFDQSxZQUFNc0YsT0FBTyxHQUFHRCxnQkFBZ0IsQ0FBQ3ZGLEdBQWpCLENBQXNCMEMsSUFBRCxJQUFXLEdBQUVBLElBQUksQ0FBQzlELEdBQUksS0FBSThELElBQUksQ0FBQzdELEtBQU0sR0FBMUQsRUFBOEQ0RyxJQUE5RCxDQUFtRSxJQUFuRSxDQUFoQjtBQUVBLGFBQU90SixJQUFJLDJDQUVRTSxJQUFJLENBQUMsaUNBQUQsQ0FGWixxQkFHVyxLQUFLMkYsc0JBSGhCLGFBSUdvRCxPQUpILGdCQUtNLEtBQUtsSCxRQUxYLFlBTUUsS0FBS0QsU0FOUCxnQkFRUCxLQUFLNkcsYUFBTCxDQUFtQixJQUFuQixDQVJPLEVBQVg7QUFTRCxLQWhCRCxNQWdCTztBQUNMLFlBQU1RLE9BQU8sR0FBRztBQUNkQyxRQUFBQSxJQUFJLEVBQUUsQ0FDSjtBQUNFQyxVQUFBQSxLQUFLLEVBQUUsU0FEVDtBQUVFQyxVQUFBQSxLQUFLLEVBQUUsU0FGVDtBQUdFQyxVQUFBQSxLQUFLLEVBQUUsTUFIVDtBQUlFN0ksVUFBQUEsSUFBSSxFQUFHMEUsSUFBRCxJQUFXQSxJQUFJLENBQUNnQixPQUFMLElBQWdCSixlQUFoQixHQUFrQyxTQUFsQyxHQUE4QyxLQUpqRTtBQUtFM0UsVUFBQUEsVUFBVSxFQUFFO0FBQ1ZtSSxZQUFBQSxLQUFLLEVBQUdwRSxJQUFELElBQVdBLElBQUksQ0FBQ2dCLE9BQUwsSUFBZ0JKLGVBQWhCLEdBQWtDLG9CQUFsQyxHQUF5RCxFQURqRTtBQUVWdUIsWUFBQUEsS0FBSyxFQUFHbkMsSUFBRCxJQUFXQSxJQUFJLENBQUNnQixPQUFMLElBQWdCSixlQUFoQixHQUFrQyxtREFBbEMsR0FBd0YsRUFGaEc7QUFHVnlELFlBQUFBLEtBQUssRUFBRTtBQUhHO0FBTGQsU0FESSxFQVlKO0FBQ0VKLFVBQUFBLEtBQUssRUFBRSxLQURUO0FBRUVDLFVBQUFBLEtBQUssRUFBRSxLQUZUO0FBR0U1SSxVQUFBQSxJQUFJLEVBQUUsVUFIUjtBQUlFVyxVQUFBQSxVQUFVLEVBQUU7QUFDVnFJLFlBQUFBLFNBQVMsRUFBRSxJQUREO0FBRVZDLFlBQUFBLFdBQVcsRUFBRXpKLElBQUksQ0FBQywrQkFBRCxDQUZQO0FBR1ZxRSxZQUFBQSxJQUFJLEVBQUUsS0FISTtBQUlWc0QsWUFBQUEsUUFBUSxFQUFFLElBSkE7QUFLVjlGLFlBQUFBLFFBQVEsRUFBRSxLQUFLQTtBQUxMO0FBSmQsU0FaSSxFQXdCSjtBQUNFc0gsVUFBQUEsS0FBSyxFQUFFLE9BRFQ7QUFFRUMsVUFBQUEsS0FBSyxFQUFFLE9BRlQ7QUFHRTVJLFVBQUFBLElBQUksRUFBRSxVQUhSO0FBSUVXLFVBQUFBLFVBQVUsRUFBRTtBQUNWa0QsWUFBQUEsSUFBSSxFQUFFLE9BREk7QUFFVm9GLFlBQUFBLFdBQVcsRUFBRSxnQkFGSDtBQUdWOUIsWUFBQUEsUUFBUSxFQUFFLElBSEE7QUFJVjlGLFlBQUFBLFFBQVEsRUFBRSxLQUFLQSxRQUpMO0FBS1Y2SCxZQUFBQSxRQUFRLEVBQUd4RSxJQUFELElBQVdBLElBQUksQ0FBQ2dCLE9BQUwsSUFBZ0JKLGVBQWpCLElBQXFDWixJQUFJLENBQUN6QixTQUxwRDtBQU1WakQsWUFBQUEsSUFBSSxFQUFHMEUsSUFBRCxJQUFXQSxJQUFJLENBQUN6QixTQUFMLEdBQWlCLFVBQWpCLEdBQThCLE1BTnJDO0FBT1Y0RCxZQUFBQSxLQUFLLEVBQUduQyxJQUFELElBQVdBLElBQUksQ0FBQ3pCLFNBQUwsR0FBaUJ6RCxJQUFJLENBQUMscUNBQUQsQ0FBckIsR0FBK0QsRUFQdkU7QUFRVnNILFlBQUFBLFdBQVcsRUFBR3BDLElBQUQsSUFBVUEsSUFBSSxDQUFDQyxpQkFSbEI7QUFTVndFLFlBQUFBLElBQUksRUFBRSxJQVRJO0FBVVYsZ0NBQW9CLEtBQUszRSxRQUFMLENBQWM0RSxJQUFkLENBQW1CLElBQW5CO0FBVlY7QUFKZCxTQXhCSTtBQURRLE9BQWhCOztBQTZDQSxVQUFJLEtBQUs3SCxXQUFMLEtBQXFCLElBQXpCLEVBQStCO0FBQzdCa0gsUUFBQUEsT0FBTyxDQUFDQyxJQUFSLENBQWFXLElBQWIsQ0FBa0I7QUFDaEJWLFVBQUFBLEtBQUssRUFBRSxhQURTO0FBRWhCM0ksVUFBQUEsSUFBSSxFQUFFLFdBRlU7QUFHaEIrSSxVQUFBQSxLQUFLLEVBQUUseUJBSFM7QUFJaEJGLFVBQUFBLEtBQUssRUFBRSxPQUpTO0FBS2hCbEksVUFBQUEsVUFBVSxFQUFFO0FBQ1ZtRyxZQUFBQSxXQUFXLEVBQUV0SCxJQUFJLENBQUMsZ0NBQUQsQ0FEUDtBQUVWMkgsWUFBQUEsUUFBUSxFQUFFLElBRkE7QUFHVjlGLFlBQUFBLFFBQVEsRUFBRSxLQUFLQSxRQUhMO0FBSVY2SCxZQUFBQSxRQUFRLEVBQUd4RSxJQUFELElBQVVBLElBQUksQ0FBQ2dCLE9BQUwsSUFBZ0JKLGVBSjFCO0FBS1YsaUNBQXFCLEtBQUtiLGtCQUFMLENBQXdCMkUsSUFBeEIsQ0FBNkIsSUFBN0IsQ0FMWDtBQU1WTCxZQUFBQSxLQUFLLEVBQUU7QUFORztBQUxJLFNBQWxCO0FBY0Q7O0FBRUQsVUFBSSxLQUFLMUgsUUFBTCxLQUFrQixJQUF0QixFQUE0QjtBQUMxQm9ILFFBQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUFhVyxJQUFiLENBQWtCO0FBQ2hCckosVUFBQUEsSUFBSSxFQUFFLFdBRFU7QUFFaEI2SSxVQUFBQSxLQUFLLEVBQUUsTUFGUztBQUdoQmxJLFVBQUFBLFVBQVUsRUFBRTtBQUNWLGlDQUFxQixDQUFDK0QsSUFBRCxFQUFPWixLQUFQLEVBQWNDLE1BQWQsS0FBeUIsS0FBS2UsZUFBTCxDQUFxQkosSUFBckIsRUFBMkJYLE1BQTNCLENBRHBDO0FBRVY4QyxZQUFBQSxLQUFLLEVBQUUsUUFGRztBQUdWcUMsWUFBQUEsUUFBUSxFQUFHeEUsSUFBRCxJQUFVQSxJQUFJLENBQUNnQixPQUFMLElBQWdCSixlQUgxQjtBQUlWZ0UsWUFBQUEsTUFBTSxFQUFFLElBSkU7QUFLVkMsWUFBQUEsUUFBUSxFQUFFLElBTEE7QUFNVkosWUFBQUEsSUFBSSxFQUFFO0FBTkk7QUFISSxTQUFsQjtBQVlEOztBQUVELFlBQU1LLGtCQUFrQixHQUN0QixLQUFLNUksT0FBTCxJQUFnQixJQUFoQixHQUNJLEtBQUtULFdBQUwsQ0FBaUI0RSxNQUFqQixDQUF5QlUsSUFBRCxJQUFVO0FBQ2hDLGVBQU8sQ0FBQ0EsSUFBSSxDQUFDOUQsR0FBTCxDQUFTOEgsV0FBVCxLQUF5QmhFLElBQUksQ0FBQzdELEtBQUwsQ0FBVzZILFdBQVgsRUFBMUIsRUFBb0RDLFFBQXBELENBQTZELEtBQUs5SSxPQUFsRSxDQUFQO0FBQ0QsT0FGRCxDQURKLEdBSUksS0FBS1QsV0FMWDtBQU1BLFVBQUlMLFVBQVUsR0FBRyxDQUFDLEdBQUcwSixrQkFBSixDQUFqQjs7QUFDQSxVQUFJLEtBQUsxSSxlQUFULEVBQTBCO0FBQ3hCLGFBQUtBLGVBQUwsQ0FBcUI2SSxJQUFyQixHQUE0QkMsSUFBSSxDQUFDQyxJQUFMLENBQVVMLGtCQUFrQixDQUFDcEYsTUFBbkIsR0FBNEIsS0FBS3JELFNBQTNDLENBQTVCO0FBQ0EsYUFBS0QsZUFBTCxDQUFxQmdKLEtBQXJCLEdBQTZCTixrQkFBa0IsQ0FBQ3BGLE1BQWhEO0FBQ0EsYUFBS3RELGVBQUwsQ0FBcUJpSixXQUFyQixHQUFtQ0gsSUFBSSxDQUFDQyxJQUFMLENBQVVMLGtCQUFrQixDQUFDcEYsTUFBbkIsR0FBNEIsS0FBS3JELFNBQTNDLENBQW5DO0FBQ0EsY0FBTWlKLEtBQUssR0FBRyxDQUFDLEtBQUtsSixlQUFMLENBQXFCbUosWUFBckIsR0FBb0MsQ0FBckMsSUFBMEMsS0FBS2xKLFNBQTdEO0FBQ0FqQixRQUFBQSxVQUFVLEdBQUcsQ0FBQyxHQUFHMEosa0JBQUosRUFBd0JVLE1BQXhCLENBQStCRixLQUEvQixFQUFzQyxLQUFLakosU0FBM0MsQ0FBYjtBQUNEOztBQUVELFlBQU1vSix3QkFBd0IsR0FBRyxLQUFLNUksV0FBTCxHQUFtQixxQ0FBbkIsR0FBMkQsZUFBNUY7QUFFQSxZQUFNNkksZUFBZSxHQUNuQixLQUFLL0ksUUFBTCxLQUFrQixJQUFsQixHQUNJbkMsSUFBSSxnREFBZ0RpTCx3QkFBaEQsY0FBc0YsS0FBS2xFLFNBQTNGLHlEQUlpQnpHLElBQUksQ0FBQywrQkFBRCxDQUpyQiwrQkFNcUIsS0FBS29FLFdBQUwsQ0FBaUJ3RixJQUFqQixDQUFzQixJQUF0QixFQUE0QixLQUE1QixDQU5yQixZQU9XLEtBQUtuSSxRQUFMLENBQWNVLEdBUHpCLHdEQVdpQm5DLElBQUksQ0FBQyxpQ0FBRCxDQVhyQiwrQkFhcUIsS0FBS29FLFdBQUwsQ0FBaUJ3RixJQUFqQixDQUFzQixJQUF0QixFQUE0QixPQUE1QixDQWJyQixhQWNZLEtBQUtuSSxRQUFMLENBQWNXLEtBZDFCLGlCQWdCRSxLQUFLTCxXQUFMLEdBQ0VyQyxJQUFJLHFEQUdhTSxJQUFJLENBQUMsZ0NBQUQsQ0FIakIsdUJBSWtCLEtBQUtvRSxXQUFMLENBQWlCd0YsSUFBakIsQ0FBc0IsSUFBdEIsRUFBNEIsYUFBNUIsQ0FKbEIsYUFLUSxLQUFLbkksUUFBTCxDQUFjTSxXQUx0QixnQkFETixHQVFFLEVBeEJKLGlHQThCc0IsS0FBS3NELFlBQUwsQ0FBa0J1RSxJQUFsQixDQUF1QixJQUF2QixFQUE2QixLQUFLbkksUUFBbEMsQ0E5QnRCLFlBK0JXekIsSUFBSSxDQUFDLG1CQUFELENBL0JmLDBCQWtDQSxLQUFLeUksYUFBTCxFQWxDQSxPQURSLEdBcUNJLEVBdENOO0FBd0NBLGFBQU8vSSxJQUFJLElBQUlrTCxlQUFKLHdCQUNhM0IsT0FEYixhQUNpQzNJLFVBRGpDLDREQUFYO0FBRUQ7QUFDRjs7QUFFRHVLLEVBQUFBLGFBQWEsQ0FBQztBQUFFckcsSUFBQUE7QUFBRixHQUFELEVBQWE7QUFDeEIsU0FBS2lCLGlCQUFMOztBQUNBLFNBQUt6RSxNQUFMLEdBQWN3RCxNQUFkO0FBQ0EsU0FBS2pDLE9BQUwsR0FBZSxFQUFmO0FBQ0EsU0FBS2QsUUFBTCxHQUFnQjtBQUFFVSxNQUFBQSxHQUFHLEVBQUUsRUFBUDtBQUFXQyxNQUFBQSxLQUFLLEVBQUUsRUFBbEI7QUFBc0JDLE1BQUFBLElBQUksRUFBRTtBQUE1QixLQUFoQjs7QUFDQSxTQUFLTSwwQkFBTDtBQUNEOztBQUVEbUksRUFBQUEsV0FBVyxDQUFDO0FBQUV0RyxJQUFBQTtBQUFGLEdBQUQsRUFBYTtBQUN0QixTQUFLbEQsZUFBTCxDQUFxQm1KLFlBQXJCLEdBQW9DakcsTUFBTSxDQUFDdUcsSUFBM0M7O0FBQ0EsU0FBS3BJLDBCQUFMOztBQUNBLFNBQUt5QyxhQUFMO0FBQ0Q7O0FBRUQ0RixFQUFBQSxPQUFPLENBQUNDLEtBQUQsRUFBUTtBQUNiLFFBQUlBLEtBQUssQ0FBQ0MsR0FBTixDQUFVLGFBQVYsS0FBNEJELEtBQUssQ0FBQ0MsR0FBTixDQUFVLFdBQVYsQ0FBaEMsRUFBd0Q7QUFDdEQsV0FBSzVKLGVBQUwsR0FBdUI7QUFDckI2SixRQUFBQSxLQUFLLEVBQUUsQ0FEYztBQUVyQmhCLFFBQUFBLElBQUksRUFBRUMsSUFBSSxDQUFDQyxJQUFMLENBQVUsS0FBSzFKLFdBQUwsQ0FBaUJpRSxNQUFqQixHQUEwQixLQUFLckQsU0FBekMsQ0FGZTtBQUdyQitJLFFBQUFBLEtBQUssRUFBRSxLQUFLM0osV0FBTCxDQUFpQmlFLE1BSEg7QUFJckI2RixRQUFBQSxZQUFZLEVBQUUsQ0FKTztBQUtyQkYsUUFBQUEsV0FBVyxFQUFFSCxJQUFJLENBQUNDLElBQUwsQ0FBVSxLQUFLMUosV0FBTCxDQUFpQmlFLE1BQWpCLEdBQTBCLEtBQUtyRCxTQUF6QztBQUxRLE9BQXZCO0FBT0Q7QUFDRjs7QUFFRDZKLEVBQUFBLGlCQUFpQixDQUFDO0FBQUU1RyxJQUFBQTtBQUFGLEdBQUQsRUFBYTtBQUM1QixTQUFLakQsU0FBTCxHQUFpQkMsTUFBTSxDQUFDZ0QsTUFBRCxDQUFOLENBQWU2RyxPQUFmLEVBQWpCOztBQUNBLFNBQUsxSSwwQkFBTDtBQUNEOztBQUVEMkksRUFBQUEsZ0JBQWdCLEdBQUc7QUFDakIsV0FBTzVMLElBQUksbUdBRThDLEtBQUtpQixXQUFMLEdBQW1CLEtBQUtBLFdBQUwsQ0FBaUJpRSxNQUFwQyxHQUE2QyxDQUYzRixpREFLVyxLQUFLNUQsTUFBTCxHQUFjLFFBQWQsR0FBeUIsUUFMcEMsYUFNSyxLQUFLQSxNQU5WLHVCQU9lLEtBQUs2SixhQVBwQiw0SkFlUSxLQUFLN0osTUFmYixzQkFnQmMsS0FBS2dILGlCQWhCbkIsc0JBaUJjLEtBQUtDLGdCQWpCbkIsd0VBcUJlLEtBQUttRCxpQkFyQnBCLHFCQXVCTyxLQUFLOUksVUF2QlosYUF3QkssS0FBS2YsU0F4QlYsZ0JBeUJRLEtBQUtQLE1BQUwsSUFBZSxLQUFLTSxlQUFMLElBQXdCLElBekIvQywwREE0QnNCLEtBQUt3SixXQTVCM0IsZ0JBNkJRLEtBQUs5SixNQUFMLElBQWUsS0FBS00sZUFBTCxJQUF3QixJQTdCL0MsWUE4QkksS0FBS0EsZUE5QlQsbUZBa0N3QyxLQUFLcUgsWUFBTCxFQWxDeEMscUJBQVg7QUFvQ0Q7O0FBRUQ0QyxFQUFBQSxtQkFBbUIsR0FBRztBQUNwQixTQUFLNUosa0JBQUwsR0FBMEIsSUFBMUI7QUFDRDs7QUFFRDZKLEVBQUFBLGtCQUFrQixHQUFHO0FBQ25CLFNBQUs3SixrQkFBTCxHQUEwQixLQUExQjtBQUNEOztBQUVRLE1BQUw4SixLQUFLLEdBQUc7QUFDVixVQUFNQyxJQUFJLEdBQUcsS0FBSzFJLFVBQUwsQ0FBZ0JDLGFBQWhCLENBQThCLGdCQUE5QixDQUFiO0FBQ0EsV0FBT3lJLElBQUksSUFBSUEsSUFBSSxDQUFDRCxLQUFwQjtBQUNEOztBQUVERSxFQUFBQSxPQUFPLEdBQUc7QUFDUixVQUFNRCxJQUFJLEdBQUcsS0FBSzFJLFVBQUwsQ0FBZ0JDLGFBQWhCLENBQThCLGdCQUE5QixDQUFiOztBQUNBLFFBQUl5SSxJQUFKLEVBQVU7QUFDUixhQUFPQSxJQUFJLENBQUNDLE9BQUwsR0FBZUMsSUFBZixDQUFvQixNQUFNLEtBQUtqSiwwQkFBTCxFQUExQixDQUFQO0FBQ0Q7O0FBQ0QsV0FBT2tKLE9BQU8sQ0FBQ0MsT0FBUixFQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLFdBQVcsR0FBRztBQUNaLFdBQU9yTSxJQUFJLGtEQUdFLEtBQUtxQixtQkFIUCxjQUlFLEtBQUtGLFFBSlAsK0NBT0ksS0FBS2dCLFFBUFQsNkJBUWlCLEtBQUt5RSxxQkFSdEIsd0tBZ0JhLEtBQUszRCwwQkFoQmxCLGdHQXNCTSxLQUFLaEIsa0JBdEJYLHNDQXlCYSxLQUFLNEosbUJBekJsQiw2REFBWDtBQTZCRDs7QUFFRFMsRUFBQUEsYUFBYSxHQUFHO0FBQ2QsUUFBSSxLQUFLakwsbUJBQUwsSUFBNEIsS0FBS1ksa0JBQXJDLEVBQXlEO0FBQ3ZELGFBQU9qQyxJQUFJLDJEQUNQLEtBQUtxTSxXQUFMLEVBRE8sMkNBSUUsS0FBS3JLLHNCQUpQLDhCQUtvQixLQUFLOEosa0JBTHpCLDZDQUFYO0FBUUQsS0FURCxNQVNPLElBQUksS0FBS3pLLG1CQUFULEVBQThCO0FBQ25DLGFBQU8sS0FBS2dMLFdBQUwsRUFBUDtBQUNELEtBRk0sTUFFQTtBQUNMLGFBQU9yTSxJQUFJLDRDQUE0QyxLQUFLdU0sMkJBQUwsRUFBNUMsUUFBWDtBQUNEO0FBQ0Y7O0FBRURBLEVBQUFBLDJCQUEyQixHQUFHO0FBQzVCLFVBQU1DLHVCQUF1QixHQUFHLEtBQUtyTCxRQUFMLElBQWlCLEtBQUtBLFFBQUwsQ0FBY2tGLE9BQS9EO0FBRUEsUUFBSW9HLGVBQWUsR0FBRyxFQUF0Qjs7QUFDQSxRQUFJRCx1QkFBdUIsSUFBSSxLQUFLckssUUFBTCxLQUFrQixJQUFqRCxFQUF1RDtBQUNyRHNLLE1BQUFBLGVBQWUsR0FBR3pNLElBQUksbURBRUEsS0FBS3FILDZCQUZMLHlCQUlQLEtBQUsvRixNQUpFLDRDQUF0QjtBQU9EOztBQUVELFFBQUlrTCx1QkFBSixFQUE2QjtBQUMzQixhQUFPeE0sSUFBSSw0SUFFQyxLQUFLbUIsUUFBTCxDQUFjMEcsUUFGZix1QkFFOEMsS0FBSzFHLFFBQUwsQ0FBY0EsUUFGNUQsNEJBSVBzTCxlQUpPLEVBQVg7QUFLRCxLQU5ELE1BTU8sSUFBSSxLQUFLdEssUUFBVCxFQUFtQjtBQUN4QixhQUFPbkMsSUFBSSxtRUFBWDtBQUNELEtBRk0sTUFFQTtBQUNMLGFBQU95TSxlQUFQO0FBQ0Q7QUFDRjs7QUFFREMsRUFBQUEsT0FBTyxHQUFHO0FBQ1IsU0FBS3hELGdCQUFMO0FBQ0Q7O0FBRURBLEVBQUFBLGdCQUFnQixHQUFHO0FBQ2pCLFVBQU15RCxNQUFNLEdBQUcsS0FBS3JKLFVBQUwsQ0FBZ0JDLGFBQWhCLENBQThCLFVBQTlCLENBQWY7O0FBQ0EsUUFBSW9KLE1BQUosRUFBWTtBQUNWLFlBQU07QUFBRUMsUUFBQUE7QUFBRixVQUFhRCxNQUFNLENBQUNFLHFCQUFQLEVBQW5CLENBRFUsQ0FFVjs7QUFDQSxXQUFLM0ssU0FBTCxHQUFpQndJLElBQUksQ0FBQ29DLEtBQUwsQ0FBV3BDLElBQUksQ0FBQ29DLEtBQUwsQ0FBV0YsTUFBTSxHQUFHLEVBQXBCLElBQTBCLEVBQXJDLElBQTJDLENBQTVEO0FBQ0Q7QUFDRjs7QUFFREcsRUFBQUEsTUFBTSxHQUFHO0FBQ1AsUUFBSSxLQUFLM0wsU0FBTCxJQUFrQixLQUFLQSxTQUFMLENBQWU4RCxNQUFmLEdBQXdCLENBQTlDLEVBQWlEO0FBQy9DLGFBQU9sRixJQUFJLHNGQUNtRCxLQUFLME0sT0FEeEQsaUNBQ2dHLEtBQUtBLE9BRHJHLGtDQUV1QixLQUFLZCxnQkFBTCxFQUZ2Qiw2QkFHYyxLQUFLVSxhQUFMLEVBSGQscUNBQVg7QUFNRCxLQVBELE1BT087QUFDTCxhQUFPdE0sSUFBSSxtREFDZ0IsS0FBSzRMLGdCQUFMLEVBRGhCLGVBQVg7QUFHRDtBQUNGOztBQUVnQixhQUFOb0IsTUFBTSxHQUFHO0FBQ2xCLFdBQU8sQ0FDTHRNLEtBREssRUFFTDtBQUNBWCxJQUFBQSxHQUFHLGtyRUFIRSxDQUFQO0FBd01EOztBQXAyQjJEO0FBdTJCOURrTixNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLGVBQTdCLEVBQThDeE0sWUFBOUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuaW1wb3J0ICcuL2d2LXNjaGVtYS1mb3JtJztcbmltcG9ydCAnLi9ndi1yZXNpemFibGUtdmlld3MnO1xuaW1wb3J0ICcuLi9tb2xlY3VsZXMvZ3YtdGFibGUnO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1idXR0b24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1pbnB1dCc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWljb24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi10ZXh0JztcbmltcG9ydCAnLi4vYXRvbXMvZ3YtaW5wdXQtbWVzc2FnZSc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LXNlbGVjdCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBFUlJPUl9UWVBFUywgcGFyc2VSYXcsIHRvTmFtZUVxdWFsc1ZhbHVlU3RyaW5nIH0gZnJvbSAnLi4vbGliL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xpYi9pMThuJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IEtleWJvYXJkRWxlbWVudCwgS0VZUyB9IGZyb20gJy4uL21peGlucy9rZXlib2FyZC1lbGVtZW50JztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vc3R5bGVzL2VtcHR5JztcblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBtYW5hZ2UgcHJvcGVydGllc1xuICpcbiAqIEBmaXJlcyBndi1wcm9wZXJ0aWVzOmNoYW5nZSAtIFdoZW4gbGlzdCBvZiBwcm9wZXJ0aWVzIGNoYW5nZVxuICogQGZpcmVzIGd2LXByb3BlcnRpZXM6c2F2ZS1wcm92aWRlciAtIFdoZW4gdXNlciB2YWxpZGF0ZXMgcHJvdmlkZXIgY29uZmlndXJhdGlvblxuICogQGZpcmVzIGd2LXByb3BlcnRpZXM6c3dpdGNoLWVuY3J5cHRlZCAtIFdoZW4gdXNlciBzd2l0Y2hlcyBlbmNyeXB0aW9uIHRvZ2dsZVxuICpcbiAqIEBhdHRyIHtBcnJheX0gcHJvcGVydGllcyAtIEFycmF5IG9mIFByb3BlcnRpZXMge2tleSwgdmFsdWUsIGR5bmFtaWM/fVxuICogQGF0dHIge09iamVjdH0gcHJvdmlkZXIgLSBDb25maWd1cmF0aW9uIG9mIHByb3ZpZGVyXG4gKiBAYXR0ciB7QXJyYXl9IHByb3ZpZGVycyAtIExpc3Qgb2YgYXZhaWxhYmxlIHByb3ZpZGVycyAob25seSBodHRwIGZvciB0aGUgbW9tZW50KVxuICogQGF0dHIge0Jvb2xlYW59IGV4cGVydCAtIEZvciBkaXNwbGF5IGV4cGVydCBtb2RlIGJ5IGRlZmF1bHRcbiAqIEBhdHRyIHtCb29sZWFufSBlbmNyeXB0YWJsZSAtIFRvIGRpc3BsYXkgdGhlICdlbmNyeXB0ZWQnIHRvZ2dsZSBvbiBlYWNoIHByb3BlcnR5XG4gKlxuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3YtcHJvcGVydGllcy10YWJsZS0tY29sbWc9MC4ycmVtXSAtIFRhYmxlIGNlbGxzIG1hcmdpblxuICovXG5leHBvcnQgY2xhc3MgR3ZQcm9wZXJ0aWVzIGV4dGVuZHMgS2V5Ym9hcmRFbGVtZW50KExpdEVsZW1lbnQpIHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkeW5hbWljUHJvcGVydHlTY2hlbWE6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgICBfcHJvcGVydGllczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgcHJvdmlkZXI6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBwcm92aWRlcnM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAgIF9wcm9wZXJ0eVNjaGVtYUZvcm06IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBleHBlcnQ6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgX2Zvcm1hdHRlZEVycm9yczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlczogZmFsc2UgfSxcbiAgICAgIF9maWx0ZXI6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBfcGFnaW5hdGlvbkRhdGE6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfcGFnZVNpemU6IHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfbmV3SXRlbTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9wcm92aWRlckRvY3VtZW50YXRpb246IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX3Nob3dEb2N1bWVudGF0aW9uOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF90ZXh0Um93czogeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIGVuY3J5cHRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLnR5cGVzID0gW107XG4gICAgdGhpcy5wcm92aWRlciA9IHt9O1xuICAgIHRoaXMuX2N1cnJlbnRSZXNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZm9ybWF0dGVkRXJyb3JzID0gW107XG4gICAgdGhpcy5fc2hvd0RvY3VtZW50YXRpb24gPSB0cnVlO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSB9O1xuICAgIHRoaXMuX3BhZ2VTaXplID0gMTA7XG4gICAgdGhpcy5fdGV4dFJvd3MgPSAxMDtcbiAgICB0aGlzLl9wYWdlU2l6ZXMgPSBbNSwgMTAsIDI1LCA1MCwgMTAwXTtcbiAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgfVxuXG4gIG9uS2V5Ym9hcmQoKSB7XG4gICAgaWYgKHRoaXMuaXNQcmVzc2VkKEtFWVMuRXNjKSkge1xuICAgICAgdGhpcy5fb25DbG9zZVByb3BlcnR5U2NoZW1hRm9ybSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ByZXNzZWQoS0VZUy5TaGlmdCwgS0VZUy5DdHJsLCBLRVlTLlNwYWNlKSkge1xuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNzZWFyY2gtcHJvcGVydHknKTtcbiAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgc2VhcmNoLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0IHByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBpZiAocHJvcGVydHkuZW5jcnlwdGVkKSB7XG4gICAgICAgICAgcHJvcGVydHkuZW5jcnlwdGFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XG4gIH1cblxuICBfZ2V0UmVzaXphYmxlVmlld3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1yZXNpemFibGUtdmlld3MnKTtcbiAgfVxuXG4gIF9tYXhpbWl6ZVRvcFZpZXcoKSB7XG4gICAgY29uc3Qgdmlld3MgPSB0aGlzLl9nZXRSZXNpemFibGVWaWV3cygpO1xuICAgIGlmICh2aWV3cykge1xuICAgICAgdmlld3MubWF4aW1pemVUb3AoOTUsIDUpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXhpbWl6ZUJvdHRvbVZpZXcoKSB7XG4gICAgY29uc3Qgdmlld3MgPSB0aGlzLl9nZXRSZXNpemFibGVWaWV3cygpO1xuICAgIGlmICh2aWV3cykge1xuICAgICAgdmlld3MucmVzaXplKDMwLCA3MCk7XG4gICAgfVxuICB9XG5cbiAgX3NwbGl0TWFpblZpZXdzKCkge1xuICAgIGNvbnN0IHZpZXdzID0gdGhpcy5fZ2V0UmVzaXphYmxlVmlld3MoKTtcbiAgICBpZiAodmlld3MpIHtcbiAgICAgIHZpZXdzLnNwbGl0KCk7XG4gICAgfVxuICB9XG5cbiAgX2lzTmV3TGluZVRhYmxlKGxpbmUpIHtcbiAgICByZXR1cm4gbGluZS5fbmV3ID09PSB0cnVlO1xuICB9XG5cbiAgX29uSW5wdXROZXcobmFtZSwgZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgdGhpcy5fbmV3SXRlbVtuYW1lXSA9IGV2ZW50LmRldGFpbDtcbiAgICBjb25zdCB7IGVycm9ycyB9ID0gcGFyc2VSYXcodG9OYW1lRXF1YWxzVmFsdWVTdHJpbmcoWy4uLnRoaXMucHJvcGVydGllcywgdGhpcy5fbmV3SXRlbV0pKTtcbiAgICB0aGlzLl9lcnJvcnMgPSBlcnJvcnM7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBidG4gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtYnV0dG9uI2FkZC1wcm9wZXJ0eScpO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwIHx8IHRoaXMuX2Rpc2FibGVkTmV3TGluZSh0aGlzLl9uZXdJdGVtKSkge1xuICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSAna2V5Jykge1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2ludmFsaWQnKTtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd2YWxpZCcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbGlkJyk7XG4gICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnaW52YWxpZCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBfb25JbnB1dCgpIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdjaGFuZ2UnLCB7IHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIF9vblN3aXRjaEVuY3J5cHRlZChpdGVtKSB7XG4gICAgaWYgKGl0ZW0uZW5jcnlwdGVkID09PSB0cnVlKSB7XG4gICAgICBpdGVtLnZhbHVlID0gJyc7XG4gICAgICBpdGVtLmVuY3J5cHRlZCA9IGZhbHNlO1xuICAgICAgaXRlbS5lbmNyeXB0aW9uV2FybmluZyA9IGkxOG4oJ2d2LXByb3BlcnRpZXMuaW5mb3Mub3ZlcndyaXRlLWVuY3J5cHRpb24nKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH1cbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdzd2l0Y2gtZW5jcnlwdGVkJywgeyBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBfYWRkUHJvcGVydHkoaXRlbSkge1xuICAgIGRlbGV0ZSBpdGVtLl9uZXc7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gW2l0ZW0sIC4uLnRoaXMuX3Byb3BlcnRpZXNdO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSwgZW5jcnlwdGFibGU6IGZhbHNlLCBlbmNyeXB0ZWQ6IGZhbHNlIH07XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnY2hhbmdlJywgeyBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBfcmVtb3ZlUHJvcGVydHkoaXRlbSkge1xuICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB0aGlzLl9wcm9wZXJ0aWVzLmZpbHRlcigocHJvcGVydHkpID0+IHByb3BlcnR5LmtleSAhPT0gaXRlbS5rZXkpO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgX2Rpc2FibGVkTmV3TGluZShpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ua2V5ID09IG51bGwgfHwgaXRlbS52YWx1ZSA9PSBudWxsIHx8IGl0ZW0ua2V5LnRyaW0oKSA9PT0gJycgfHwgaXRlbS52YWx1ZS50cmltKCkgPT09ICcnO1xuICB9XG5cbiAgX3N1Ym1pdEV4cGVydE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuZXhwZXJ0KSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLl9oYW5kbGVFeHBlcnRNb2RlSW5wdXQodGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNleHBlcnQtaW5wdXQnKS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgX29uRXhwZXJ0TW9kZVRleHRJbnB1dCh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5faGFuZGxlRXhwZXJ0TW9kZUlucHV0KGRldGFpbCk7XG4gIH1cblxuICBfaGFuZGxlRXhwZXJ0TW9kZUlucHV0KGV4cGVydE1vZGVJbnB1dFN0cmluZykge1xuICAgIGxldCBhbGxQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcbiAgICBjb25zdCBwcm92aWRlckVuYWJsZWQgPSB0aGlzLnByb3ZpZGVyICYmIHRoaXMucHJvdmlkZXIuZW5hYmxlZDtcbiAgICBjb25zdCBkeW5hbWljUHJvcGVydGllcyA9IGFsbFByb3BlcnRpZXMuZmlsdGVyKChwcm9wKSA9PiBwcm92aWRlckVuYWJsZWQgJiYgcHJvcC5keW5hbWljKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRQcm9wZXJ0aWVzID0gYWxsUHJvcGVydGllcy5maWx0ZXIoKHByb3ApID0+IHByb3AuZW5jcnlwdGVkKTtcblxuICAgIGNvbnN0IGFsbFByb3BlcnRpZXNTdHJpbmcgPSBgJHtleHBlcnRNb2RlSW5wdXRTdHJpbmd9XFxuJHt0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyhkeW5hbWljUHJvcGVydGllcyl9XFxuJHt0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyhcbiAgICAgIGVuY3J5cHRlZFByb3BlcnRpZXMsXG4gICAgKX1gO1xuICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBwYXJzZVJhdyhhbGxQcm9wZXJ0aWVzU3RyaW5nKTtcbiAgICB0aGlzLl9lcnJvcnMgPSBlcnJvcnM7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHsgdmFyaWFibGVzIH0gPSBwYXJzZVJhdyhleHBlcnRNb2RlSW5wdXRTdHJpbmcpO1xuICAgICAgYWxsUHJvcGVydGllcyA9IFsuLi52YXJpYWJsZXMsIC4uLmR5bmFtaWNQcm9wZXJ0aWVzLCAuLi5lbmNyeXB0ZWRQcm9wZXJ0aWVzXTtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgcHJvcGVydGllczogYWxsUHJvcGVydGllcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUHJvcGVydGllcztcbiAgfVxuXG4gIF9vblN1Ym1pdFByb3BlcnR5Rm9ybSh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBkZXRhaWwudmFsdWVzO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3NhdmUtcHJvdmlkZXInLCB7IHByb3ZpZGVyIH0pO1xuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICB9XG5cbiAgc3VibWl0KCkge1xuICAgIGlmICh0aGlzLmV4cGVydCkge1xuICAgICAgdGhpcy5fc3VibWl0RXhwZXJ0TW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN1Ym1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vblN1Ym1pdCgpIHtcbiAgICBjb25zdCBpbnZhbGlkQ29udHJvbHMgPSBbLi4udGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm0gLmNvbnRyb2wnKV0uZmluZCgoY29udHJvbCkgPT4gY29udHJvbC5pbnZhbGlkKTtcbiAgICBpZiAoaW52YWxpZENvbnRyb2xzID09IG51bGwpIHtcbiAgICAgIHRoaXMuX2FkZFByb3BlcnR5KHRoaXMuX25ld0l0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNvbmZpZ3VyZUR5bmFtaWNQcm9wZXJ0aWVzKCkge1xuICAgIGlmICh0aGlzLmR5bmFtaWNQcm9wZXJ0eVNjaGVtYSA9PSBudWxsKSB7XG4gICAgICAvLyBkeW5hbWljUHJvcGVydHlTY2hlbWEgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucy4gSWYgbm8gc2NoZW1hIGlzIHByb3ZpZGVkIGEgZGVmYXVsdCBzY2hlbWEgd2lsbCBiZSB1c2VkLlxuICAgICAgY29uc3QgcHJvdmlkZXJzVGl0bGVNYXAgPSB0aGlzLnByb3ZpZGVycy5yZWR1Y2UoKG1hcCwgcHJvdmlkZXIpID0+IHtcbiAgICAgICAgbWFwW3Byb3ZpZGVyLmlkXSA9IHByb3ZpZGVyLmtleTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgY29uc3QgcHJvdmlkZXJzRW51bSA9IE9iamVjdC5rZXlzKHByb3ZpZGVyc1RpdGxlTWFwKTtcbiAgICAgIHRoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hID0ge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgdGl0bGU6ICdFbmFibGVkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnIFRoaXMgc2VydmljZSBpcyByZXF1aXJpbmcgYW4gQVBJIGRlcGxveW1lbnQuIERvIG5vdCBmb3JnZXQgdG8gZGVwbG95IEFQSSB0byBzdGFydCBkeW5hbWljLXByb3BlcnRpZXMgc2VydmljZS4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2NoZWR1bGU6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdGl0bGU6ICdTY2hlZHVsZScsXG4gICAgICAgICAgICAneC1zY2hlbWEtZm9ybSc6IHtcbiAgICAgICAgICAgICAgJ2Nyb24tZXhwcmVzc2lvbic6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvdmlkZXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdGl0bGU6ICdQcm92aWRlciB0eXBlJyxcbiAgICAgICAgICAgIGVudW06IHByb3ZpZGVyc0VudW0sXG4gICAgICAgICAgICBkZWZhdWx0OiBwcm92aWRlcnNFbnVtWzBdLFxuICAgICAgICAgICAgJ3gtc2NoZW1hLWZvcm0nOiB7XG4gICAgICAgICAgICAgIHRpdGxlTWFwOiBwcm92aWRlcnNUaXRsZU1hcCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFsnc2NoZWR1bGUnLCAncHJvdmlkZXInXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnNbMF07XG5cbiAgICB0aGlzLl9wcm9wZXJ0eVNjaGVtYUZvcm0gPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7IC4uLnRoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hLnByb3BlcnRpZXMsIGNvbmZpZ3VyYXRpb246IGRlZmF1bHRQcm92aWRlci5zY2hlbWEgfSxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLmR5bmFtaWNQcm9wZXJ0eVNjaGVtYS5yZXF1aXJlZCxcbiAgICB9O1xuICAgIHRoaXMuX3Byb3ZpZGVyRG9jdW1lbnRhdGlvbiA9IGRlZmF1bHRQcm92aWRlci5kb2N1bWVudGF0aW9uO1xuICAgIHRoaXMuX21heGltaXplQm90dG9tVmlldygpO1xuICB9XG5cbiAgX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKSB7XG4gICAgdGhpcy5fcHJvcGVydHlTY2hlbWFGb3JtID0gbnVsbDtcbiAgICB0aGlzLl9tYXhpbWl6ZVRvcFZpZXcoKTtcbiAgfVxuXG4gIF9vblNlYXJjaFByb3BlcnR5KHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBkZXRhaWw7XG4gICAgdGhpcy5fb25DbG9zZVByb3BlcnR5U2NoZW1hRm9ybSgpO1xuICB9XG5cbiAgX29uQ2xlYXJQcm9wZXJ0eSgpIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBudWxsO1xuICAgIHRoaXMuX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKTtcbiAgfVxuXG4gIGdldCBfZXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0ZWRFcnJvcnM7XG4gIH1cblxuICBzZXQgX2Vycm9ycyhyYXdFcnJvcnMpIHtcbiAgICB0aGlzLl9mb3JtYXR0ZWRFcnJvcnMgPSByYXdFcnJvcnMubWFwKCh7IHR5cGUsIGtleSwgcG9zIH0pID0+IHtcbiAgICAgIGlmICh0eXBlID09PSBFUlJPUl9UWVBFUy5JTlZBTElEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiBwb3MubGluZSxcbiAgICAgICAgICBtc2c6IGkxOG4oJ2d2LXByb3BlcnRpZXMuZXJyb3JzLmludmFsaWQta2V5JywgeyBrZXkgfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gRVJST1JfVFlQRVMuRFVQTElDQVRFRF9OQU1FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZTogcG9zLmxpbmUsXG4gICAgICAgICAgbXNnOiBpMThuKCdndi1wcm9wZXJ0aWVzLmVycm9ycy5kdXBsaWNhdGVkLWtleScsIHsga2V5IH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IEVSUk9SX1RZUEVTLklOVkFMSURfTElORSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHBvcy5saW5lLFxuICAgICAgICAgIG1zZzogaTE4bignZ3YtcHJvcGVydGllcy5lcnJvcnMuaW52YWxpZC1saW5lJyksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gRVJST1JfVFlQRVMuSU5WQUxJRF9WQUxVRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHBvcy5saW5lLFxuICAgICAgICAgIG1zZzogaTE4bignZ3YtcHJvcGVydGllcy5lcnJvcnMuaW52YWxpZC12YWx1ZScpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbGluZTogJz8nLCBtc2c6IGkxOG4oJ2d2LXByb3BlcnRpZXMuZXJyb3JzLnVua25vd24nKSB9O1xuICAgIH0pO1xuICB9XG5cbiAgX3JlbmRlckVycm9ycyh3aXRoTGluZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX2Zvcm1hdHRlZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiJHtjbGFzc01hcCh7ICdhZGQtZm9ybS1lcnJvcic6IHRydWUsICdhZGQtZm9ybS1lcnJvcl9leHBlcnQnOiB0aGlzLmV4cGVydCB9KX1cIj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yLWxpc3RcIj5cbiAgICAgICAgICAke3RoaXMuX2Zvcm1hdHRlZEVycm9ycy5tYXAoXG4gICAgICAgICAgICAoeyBsaW5lLCBtc2cgfSkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgPGd2LWlucHV0LW1lc3NhZ2VcbiAgICAgICAgICAgICAgICA+JHt3aXRoTGluZSA/IGh0bWxgPHN0cm9uZyAuaW5uZXJIVE1MPVwiJHtpMThuKCdndi1wcm9wZXJ0aWVzLmVycm9ycy5saW5lJyl9ICR7bGluZX06Jm5ic3A7XCI+PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgICAgICAgICAgIDxzcGFuIC5pbm5lckhUTUw9XCIke21zZ31cIj48L3NwYW5cbiAgICAgICAgICAgICAgPjwvZ3YtaW5wdXQtbWVzc2FnZT5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBgO1xuICB9XG5cbiAgX3JlbmRlclRhYmxlKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyRW5hYmxlZCA9IHRoaXMucHJvdmlkZXIgJiYgdGhpcy5wcm92aWRlci5lbmFibGVkO1xuICAgIGlmICh0aGlzLmV4cGVydCkge1xuICAgICAgdGhpcy5fY29tcHV0ZVRleHRSb3dzKCk7XG5cbiAgICAgIGNvbnN0IHN0YXRpY1Byb3BlcnRpZXMgPSBwcm92aWRlckVuYWJsZWQgPyB0aGlzLl9wcm9wZXJ0aWVzLmZpbHRlcigocHJvcCkgPT4gIShwcm92aWRlckVuYWJsZWQgJiYgcHJvcC5keW5hbWljKSkgOiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgZXhwZXJ0UHJvcGVydGllcyA9IHN0YXRpY1Byb3BlcnRpZXMuZmlsdGVyKChwcm9wKSA9PiAhcHJvcC5lbmNyeXB0ZWQpO1xuICAgICAgY29uc3QgY29udGVudCA9IGV4cGVydFByb3BlcnRpZXMubWFwKChwcm9wKSA9PiBgJHtwcm9wLmtleX09XCIke3Byb3AudmFsdWV9XCJgKS5qb2luKCdcXG4nKTtcblxuICAgICAgcmV0dXJuIGh0bWxgPGd2LXRleHRcbiAgICAgICAgICBpZD1cImV4cGVydC1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMucGxhY2Vob2xkZXIuaW5wdXQnKX1cIlxuICAgICAgICAgIEBndi10ZXh0OmlucHV0PVwiJHt0aGlzLl9vbkV4cGVydE1vZGVUZXh0SW5wdXR9XCJcbiAgICAgICAgICAudmFsdWU9XCIke2NvbnRlbnR9XCJcbiAgICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgICAucm93cz1cIiR7dGhpcy5fdGV4dFJvd3N9XCJcbiAgICAgICAgPjwvZ3YtdGV4dD5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJFcnJvcnModHJ1ZSl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZHluYW1pYycsXG4gICAgICAgICAgICBsYWJlbDogJ0R5bmFtaWMnLFxuICAgICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICAgIHR5cGU6IChpdGVtKSA9PiAoaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCA/ICdndi1pY29uJyA6ICdkaXYnKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgc2hhcGU6IChpdGVtKSA9PiAoaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCA/ICdjb2RlOnRpbWUtc2NoZWR1bGUnIDogJycpLFxuICAgICAgICAgICAgICB0aXRsZTogKGl0ZW0pID0+IChpdGVtLmR5bmFtaWMgJiYgcHJvdmlkZXJFbmFibGVkID8gJ0R5bmFtaWMgcHJvcGVydGllcyBzZXJ2aWNlIGlzIGFjdHVhbGx5IGluIHJ1bm5pbmcnIDogJycpLFxuICAgICAgICAgICAgICBzdHlsZTogJ2p1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyBoZWlnaHQ6IDEwMCU7JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ2tleScsXG4gICAgICAgICAgICBsYWJlbDogJ0tleScsXG4gICAgICAgICAgICB0eXBlOiAnZ3YtaW5wdXQnLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBjbGlwYm9hcmQ6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBpMThuKCdndi1wcm9wZXJ0aWVzLnBsYWNlaG9sZGVyLmtleScpLFxuICAgICAgICAgICAgICBuYW1lOiAna2V5JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgbGFiZWw6ICdWYWx1ZScsXG4gICAgICAgICAgICB0eXBlOiAnZ3YtaW5wdXQnLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1Byb3BlcnR5IHZhbHVlJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5LFxuICAgICAgICAgICAgICBkaXNhYmxlZDogKGl0ZW0pID0+IChpdGVtLmR5bmFtaWMgJiYgcHJvdmlkZXJFbmFibGVkKSB8fCBpdGVtLmVuY3J5cHRlZCxcbiAgICAgICAgICAgICAgdHlwZTogKGl0ZW0pID0+IChpdGVtLmVuY3J5cHRlZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpLFxuICAgICAgICAgICAgICB0aXRsZTogKGl0ZW0pID0+IChpdGVtLmVuY3J5cHRlZCA/IGkxOG4oJ2d2LXByb3BlcnRpZXMuaW5mb3MuZW5jcnlwdGVkLXZhbHVlJykgOiAnJyksXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAoaXRlbSkgPT4gaXRlbS5lbmNyeXB0aW9uV2FybmluZyxcbiAgICAgICAgICAgICAgaWNvbjogbnVsbCxcbiAgICAgICAgICAgICAgJ29uZ3YtaW5wdXQ6aW5wdXQnOiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5lbmNyeXB0YWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvcHRpb25zLmRhdGEucHVzaCh7XG4gICAgICAgICAgZmllbGQ6ICdlbmNyeXB0YWJsZScsXG4gICAgICAgICAgdHlwZTogJ2d2LXN3aXRjaCcsXG4gICAgICAgICAgc3R5bGU6ICctLWd2LXN3aXRjaC0tdGE6IHJpZ2h0OycsXG4gICAgICAgICAgd2lkdGg6ICcxMDVweCcsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGkxOG4oJ2d2LXByb3BlcnRpZXMuZW5jcnlwdGVkLXRvZ2dsZScpLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICByZWFkb25seTogdGhpcy5yZWFkb25seSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoaXRlbSkgPT4gaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCxcbiAgICAgICAgICAgICdvbmd2LXN3aXRjaDppbnB1dCc6IHRoaXMuX29uU3dpdGNoRW5jcnlwdGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzdHlsZTogJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBmb250LXNpemU6IDEycHg7IGhlaWdodDogNDBweDsnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yZWFkb25seSAhPT0gdHJ1ZSkge1xuICAgICAgICBvcHRpb25zLmRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2d2LWJ1dHRvbicsXG4gICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAnb25ndi1idXR0b246Y2xpY2snOiAoaXRlbSwgZXZlbnQsIHRhcmdldCkgPT4gdGhpcy5fcmVtb3ZlUHJvcGVydHkoaXRlbSwgdGFyZ2V0KSxcbiAgICAgICAgICAgIHRpdGxlOiAnUmVtb3ZlJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoaXRlbSkgPT4gaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCxcbiAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcbiAgICAgICAgICAgIG91dGxpbmVkOiB0cnVlLFxuICAgICAgICAgICAgaWNvbjogJ2hvbWU6dHJhc2gnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnRpZXMgPVxuICAgICAgICB0aGlzLl9maWx0ZXIgIT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5fcHJvcGVydGllcy5maWx0ZXIoKHByb3ApID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChwcm9wLmtleS50b0xvd2VyQ2FzZSgpICsgcHJvcC52YWx1ZS50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyh0aGlzLl9maWx0ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICBsZXQgcHJvcGVydGllcyA9IFsuLi5maWx0ZXJlZFByb3BlcnRpZXNdO1xuICAgICAgaWYgKHRoaXMuX3BhZ2luYXRpb25EYXRhKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25EYXRhLmxhc3QgPSBNYXRoLmNlaWwoZmlsdGVyZWRQcm9wZXJ0aWVzLmxlbmd0aCAvIHRoaXMuX3BhZ2VTaXplKTtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbkRhdGEudG90YWwgPSBmaWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YS50b3RhbF9wYWdlcyA9IE1hdGguY2VpbChmaWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoIC8gdGhpcy5fcGFnZVNpemUpO1xuICAgICAgICBjb25zdCBpbmRleCA9ICh0aGlzLl9wYWdpbmF0aW9uRGF0YS5jdXJyZW50X3BhZ2UgLSAxKSAqIHRoaXMuX3BhZ2VTaXplO1xuICAgICAgICBwcm9wZXJ0aWVzID0gWy4uLmZpbHRlcmVkUHJvcGVydGllc10uc3BsaWNlKGluZGV4LCB0aGlzLl9wYWdlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkZFByb3BlcnR5Rm9ybUdyaWRDbGFzcyA9IHRoaXMuZW5jcnlwdGFibGUgPyAnYWRkLWZvcm0tZ3JpZC13aXRoLWVuY3J5cHRlZC10b2dnbGUnIDogJ2FkZC1mb3JtLWdyaWQnO1xuXG4gICAgICBjb25zdCBhZGRQcm9wZXJ0eUZvcm0gPVxuICAgICAgICB0aGlzLnJlYWRvbmx5ICE9PSB0cnVlXG4gICAgICAgICAgPyBodG1sYDxmb3JtIGlkPVwiYWRkLXByb3BlcnR5LWZvcm1cIiBjbGFzcz1cImFkZC1mb3JtICR7YWRkUHJvcGVydHlGb3JtR3JpZENsYXNzfVwiIEBzdWJtaXQ9XCIke3RoaXMuX29uU3VibWl0fVwiPlxuICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGd2LWlucHV0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMucGxhY2Vob2xkZXIua2V5Jyl9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBAZ3YtaW5wdXQ6aW5wdXQ9XCIke3RoaXMuX29uSW5wdXROZXcuYmluZCh0aGlzLCAna2V5Jyl9XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLmtleX1cIlxuICAgICAgICAgICAgICAgID48L2d2LWlucHV0PlxuICAgICAgICAgICAgICAgIDxndi1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpMThuKCdndi1wcm9wZXJ0aWVzLnBsYWNlaG9sZGVyLnZhbHVlJyl9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBAZ3YtaW5wdXQ6aW5wdXQ9XCIke3RoaXMuX29uSW5wdXROZXcuYmluZCh0aGlzLCAndmFsdWUnKX1cIlxuICAgICAgICAgICAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLnZhbHVlfVwiXG4gICAgICAgICAgICAgICAgPjwvZ3YtaW5wdXQ+XG4gICAgICAgICAgICAgICAgJHt0aGlzLmVuY3J5cHRhYmxlXG4gICAgICAgICAgICAgICAgICA/IGh0bWxgIDxndi1zd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMuZW5jcnlwdGVkLXRvZ2dsZScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgQGd2LXN3aXRjaDppbnB1dD1cIiR7dGhpcy5fb25JbnB1dE5ldy5iaW5kKHRoaXMsICdlbmNyeXB0YWJsZScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLmVuY3J5cHRhYmxlfVwiXG4gICAgICAgICAgICAgICAgICAgID48L2d2LXN3aXRjaD5gXG4gICAgICAgICAgICAgICAgICA6ICcnfVxuICAgICAgICAgICAgICAgIDxndi1idXR0b25cbiAgICAgICAgICAgICAgICAgIGlkPVwiYWRkLXByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgIGljb249XCJjb2RlOnBsdXNcIlxuICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9hZGRQcm9wZXJ0eS5iaW5kKHRoaXMsIHRoaXMuX25ld0l0ZW0pfVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIiR7aTE4bignZ3YtcHJvcGVydGllcy5hZGQnKX1cIlxuICAgICAgICAgICAgICAgID48L2d2LWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckVycm9ycygpfVxuICAgICAgICAgICAgICA8aHIgLz5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgcmV0dXJuIGh0bWxgICR7YWRkUHJvcGVydHlGb3JtfVxuICAgICAgICA8Z3YtdGFibGUgLm9wdGlvbnM9XCIke29wdGlvbnN9XCIgLml0ZW1zPVwiJHtwcm9wZXJ0aWVzfVwiIG5vaGVhZGVyIG5vc29ydCBvcmRlcj1cImtleVwiIHJvd2hlaWdodD1cIjU3cHhcIj48L2d2LXRhYmxlPmA7XG4gICAgfVxuICB9XG5cbiAgX29uQ2hhbmdlTW9kZSh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5fc3VibWl0RXhwZXJ0TW9kZSgpO1xuICAgIHRoaXMuZXhwZXJ0ID0gZGV0YWlsO1xuICAgIHRoaXMuX2Vycm9ycyA9IFtdO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSB9O1xuICAgIHRoaXMuX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKTtcbiAgfVxuXG4gIF9vblBhZ2luYXRlKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YS5jdXJyZW50X3BhZ2UgPSBkZXRhaWwucGFnZTtcbiAgICB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCk7XG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gIH1cblxuICB1cGRhdGVkKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmhhcygnX3Byb3BlcnRpZXMnKSB8fCBwcm9wcy5oYXMoJ19wYWdlU2l6ZScpKSB7XG4gICAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YSA9IHtcbiAgICAgICAgZmlyc3Q6IDEsXG4gICAgICAgIGxhc3Q6IE1hdGguY2VpbCh0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCAvIHRoaXMuX3BhZ2VTaXplKSxcbiAgICAgICAgdG90YWw6IHRoaXMuX3Byb3BlcnRpZXMubGVuZ3RoLFxuICAgICAgICBjdXJyZW50X3BhZ2U6IDEsXG4gICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodGhpcy5fcHJvcGVydGllcy5sZW5ndGggLyB0aGlzLl9wYWdlU2l6ZSksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZVBhZ2VTaXplKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IE51bWJlcihkZXRhaWwpLnZhbHVlT2YoKTtcbiAgICB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCk7XG4gIH1cblxuICBfcmVuZGVyVGFibGVGb3JtKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+TWFuYWdlIGdsb2JhbCBwcm9wZXJ0aWVzIDxzcGFuPigke3RoaXMuX3Byb3BlcnRpZXMgPyB0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCA6IDB9KTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGd2LXN3aXRjaFxuICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgLmRlc2NyaXB0aW9uPVwiJHt0aGlzLmV4cGVydCA/ICdFeHBlcnQnIDogJ1NpbXBsZSd9XCJcbiAgICAgICAgICAudmFsdWU9XCIke3RoaXMuZXhwZXJ0fVwiXG4gICAgICAgICAgQGd2LXN3aXRjaDppbnB1dD1cIiR7dGhpcy5fb25DaGFuZ2VNb2RlfVwiXG4gICAgICAgID48L2d2LXN3aXRjaD5cbiAgICAgICAgPGd2LWlucHV0XG4gICAgICAgICAgaWQ9XCJzZWFyY2gtcHJvcGVydHlcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIHByb3BlcnRpZXMgKFNoaWZ0ICsgQ3RybCArIFNwYWNlKVwiXG4gICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgc21hbGxcbiAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydH1cIlxuICAgICAgICAgIEBndi1pbnB1dDppbnB1dD1cIiR7dGhpcy5fb25TZWFyY2hQcm9wZXJ0eX1cIlxuICAgICAgICAgIEBndi1pbnB1dDpjbGVhcj1cIiR7dGhpcy5fb25DbGVhclByb3BlcnR5fVwiXG4gICAgICAgID48L2d2LWlucHV0PlxuICAgICAgICA8Z3Ytc2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJwYWdlLXNpemVfX3NlbGVjdFwiXG4gICAgICAgICAgQGd2LXNlbGVjdDppbnB1dD1cIiR7dGhpcy5fb25DaGFuZ2VQYWdlU2l6ZX1cIlxuICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgLm9wdGlvbnM9XCIke3RoaXMuX3BhZ2VTaXplc31cIlxuICAgICAgICAgIC52YWx1ZT1cIiR7dGhpcy5fcGFnZVNpemV9XCJcbiAgICAgICAgICAuZGlzYWJsZWQ9XCIke3RoaXMuZXhwZXJ0IHx8IHRoaXMuX3BhZ2luYXRpb25EYXRhID09IG51bGx9XCJcbiAgICAgICAgPjwvZ3Ytc2VsZWN0PlxuICAgICAgICA8Z3YtcGFnaW5hdGlvblxuICAgICAgICAgIEBndi1wYWdpbmF0aW9uOnBhZ2luYXRlPVwiJHt0aGlzLl9vblBhZ2luYXRlfVwiXG4gICAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydCB8fCB0aGlzLl9wYWdpbmF0aW9uRGF0YSA9PSBudWxsfVwiXG4gICAgICAgICAgLmRhdGE9XCIke3RoaXMuX3BhZ2luYXRpb25EYXRhfVwiXG4gICAgICAgICAgd2lkZ2V0XG4gICAgICAgID48L2d2LXBhZ2luYXRpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+PGRpdiBjbGFzcz1cImZvcm0tY29udGVudFwiPiR7dGhpcy5fcmVuZGVyVGFibGUoKX08L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgX2ZldGNoRG9jdW1lbnRhdGlvbigpIHtcbiAgICB0aGlzLl9zaG93RG9jdW1lbnRhdGlvbiA9IHRydWU7XG4gIH1cblxuICBfaGlkZURvY3VtZW50YXRpb24oKSB7XG4gICAgdGhpcy5fc2hvd0RvY3VtZW50YXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBkaXJ0eSgpIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2d2LXNjaGVtYS1mb3JtJyk7XG4gICAgcmV0dXJuIGZvcm0gJiYgZm9ybS5kaXJ0eTtcbiAgfVxuXG4gIGNvbmZpcm0oKSB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1zY2hlbWEtZm9ybScpO1xuICAgIGlmIChmb3JtKSB7XG4gICAgICByZXR1cm4gZm9ybS5jb25maXJtKCkudGhlbigoKSA9PiB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfcmVuZGVyRm9ybSgpIHtcbiAgICByZXR1cm4gaHRtbGA8Z3Ytc2NoZW1hLWZvcm1cbiAgICAgIHNsb3Q9XCJ0b3BcIlxuICAgICAgc2Nyb2xsYWJsZVxuICAgICAgLnNjaGVtYT1cIiR7dGhpcy5fcHJvcGVydHlTY2hlbWFGb3JtfVwiXG4gICAgICAudmFsdWVzPVwiJHt0aGlzLnByb3ZpZGVyfVwiXG4gICAgICAuaWNvbj1cImRlc2lnbjplZGl0XCJcbiAgICAgIGhhcy1oZWFkZXJcbiAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgQGd2LXNjaGVtYS1mb3JtOnN1Ym1pdD1cIiR7dGhpcy5fb25TdWJtaXRQcm9wZXJ0eUZvcm19XCJcbiAgICA+XG4gICAgICA8ZGl2IHNsb3Q9XCJ0aXRsZVwiIGNsYXNzPVwicHJvcGVydGllcy10aXRsZVwiPkNvbmZpZ3VyZSBkeW5hbWljIHByb3BlcnRpZXM8L2Rpdj5cbiAgICAgIDxndi1idXR0b25cbiAgICAgICAgc2xvdD1cImhlYWRlci1sZWZ0XCJcbiAgICAgICAgaWNvbj1cImdlbmVyYWw6Y2xvc2VcIlxuICAgICAgICBvdXRsaW5lZFxuICAgICAgICBzbWFsbFxuICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtfVwiXG4gICAgICAgIHRpdGxlPVwiQ2xvc2UgKGVzYylcIlxuICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgICAgPGd2LWJ1dHRvblxuICAgICAgICBzbG90PVwiaGVhZGVyLWxlZnRcIlxuICAgICAgICBpY29uPVwiaG9tZTpib29rXCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLl9zaG93RG9jdW1lbnRhdGlvbn1cIlxuICAgICAgICBvdXRsaW5lZFxuICAgICAgICBzbWFsbFxuICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9mZXRjaERvY3VtZW50YXRpb259XCJcbiAgICAgICAgdGl0bGU9XCJPcGVuIGRvY3VtZW50YXRpb25cIlxuICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgIDwvZ3Ytc2NoZW1hLWZvcm0+YDtcbiAgfVxuXG4gIF9yZW5kZXJCb3R0b20oKSB7XG4gICAgaWYgKHRoaXMuX3Byb3BlcnR5U2NoZW1hRm9ybSAmJiB0aGlzLl9zaG93RG9jdW1lbnRhdGlvbikge1xuICAgICAgcmV0dXJuIGh0bWxgPGd2LXJlc2l6YWJsZS12aWV3cyBuby1vdmVyZmxvdyBkaXJlY3Rpb249XCJob3Jpem9udGFsXCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyRm9ybSgpfVxuICAgICAgICA8Z3YtZG9jdW1lbnRhdGlvblxuICAgICAgICAgIHNsb3Q9XCJib3R0b21cIlxuICAgICAgICAgIC50ZXh0PVwiJHt0aGlzLl9wcm92aWRlckRvY3VtZW50YXRpb259XCJcbiAgICAgICAgICBAZ3YtZG9jdW1lbnRhdGlvbjpjbG9zZT1cIiR7dGhpcy5faGlkZURvY3VtZW50YXRpb259XCJcbiAgICAgICAgPjwvZ3YtZG9jdW1lbnRhdGlvbj5cbiAgICAgIDwvZ3YtcmVzaXphYmxlLXZpZXdzPmA7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wcm9wZXJ0eVNjaGVtYUZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzLWJvdHRvbS1jb250YWluZXJcIj4ke3RoaXMuX3JlbmRlckR5bmFtaWNDb25maWd1cmF0aW9uKCl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBfcmVuZGVyRHluYW1pY0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3QgaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24gPSB0aGlzLnByb3ZpZGVyICYmIHRoaXMucHJvdmlkZXIuZW5hYmxlZDtcblxuICAgIGxldCBjb25maWd1cmVBY3Rpb24gPSAnJztcbiAgICBpZiAoaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24gfHwgdGhpcy5yZWFkb25seSAhPT0gdHJ1ZSkge1xuICAgICAgY29uZmlndXJlQWN0aW9uID0gaHRtbGA8Z3YtYnV0dG9uXG4gICAgICAgIGljb249XCJ0b29sczp0b29sc1wiXG4gICAgICAgIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uQ29uZmlndXJlRHluYW1pY1Byb3BlcnRpZXN9XCJcbiAgICAgICAgb3V0bGluZWRcbiAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydH1cIlxuICAgICAgICA+Q29uZmlndXJlIGR5bmFtaWMgcHJvcGVydGllczwvZ3YtYnV0dG9uXG4gICAgICA+YDtcbiAgICB9XG5cbiAgICBpZiAoaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzLW1lc3NhZ2VcIj5cbiAgICAgICAgICBEeW5hbWljIHByb3BlcnRpZXMgc2VydmljZSBpcyBhY3R1YWxseSBpbiA8Y29kZT5ydW5uaW5nPC9jb2RlPiBzdGF0ZSBhbmQgcnVuIHdpdGggY3JvbiBleHByZXNzaW9uXG4gICAgICAgICAgPGNvZGU+JHt0aGlzLnByb3ZpZGVyLnNjaGVkdWxlfTwvY29kZT4gdXNpbmcgPGNvZGU+JHt0aGlzLnByb3ZpZGVyLnByb3ZpZGVyfTwvY29kZT4gcHJvdmlkZXIuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZUFjdGlvbn1gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImVtcHR5XCI+Tm8gZHluYW1pYyBwcm9wZXJ0aWVzIHNlcnZpY2UgY29uZmlndXJlZDwvZGl2PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb25maWd1cmVBY3Rpb247XG4gICAgfVxuICB9XG5cbiAgX29uTW92ZSgpIHtcbiAgICB0aGlzLl9jb21wdXRlVGV4dFJvd3MoKTtcbiAgfVxuXG4gIF9jb21wdXRlVGV4dFJvd3MoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50Jyk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIC8vIC0tZ3YtdGV4dC0tbGg9MzBweFxuICAgICAgdGhpcy5fdGV4dFJvd3MgPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoaGVpZ2h0IC0gMjApIC8gMzApIC0gMjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvdmlkZXJzICYmIHRoaXMucHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzXCI+XG4gICAgICAgIDxndi1yZXNpemFibGUtdmlld3Mgbm8tb3ZlcmZsb3cgQGd2LXJlc2l6YWJsZS12aWV3czptb3ZlPVwiJHt0aGlzLl9vbk1vdmV9XCIgQGd2LXJlc2l6YWJsZS12aWV3czpyZXNpemU9XCIke3RoaXMuX29uTW92ZX1cIj5cbiAgICAgICAgICA8ZGl2IHNsb3Q9XCJ0b3BcIiBjbGFzcz1cImJveFwiPiR7dGhpcy5fcmVuZGVyVGFibGVGb3JtKCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzbG90PVwiYm90dG9tXCI+JHt0aGlzLl9yZW5kZXJCb3R0b20oKX08L2Rpdj5cbiAgICAgICAgPC9ndi1yZXNpemFibGUtdmlld3M+XG4gICAgICA8L2Rpdj5gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwicHJvcGVydGllc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm94XCI+JHt0aGlzLl9yZW5kZXJUYWJsZUZvcm0oKX08L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVtcHR5LFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIC5wcm9wZXJ0aWVzIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LXJlc2l6YWJsZS12aWV3cyB7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3Ytc2NoZW1hLWZvcm0ge1xuICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50YWJsZS1ib3gge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2JmYmZiZjtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtdGFibGUge1xuICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4O1xuICAgICAgICAgIC0tZ3YtdGFibGUtcm93cy0tb3Y6IG5vbmU7XG4gICAgICAgICAgLS1ndi10YWJsZS0tY29sbWc6IHZhcigtLWd2LXByb3BlcnRpZXMtdGFibGUtLWNvbG1nLCAwLjJyZW0pO1xuICAgICAgICAgIC0tZ3YtdGFibGUtY2VsbC0tZDogaW5saW5lO1xuICAgICAgICAgIC0tZ3YtdGFibGUtcm93LS1haTogZmxleC1zdGFydDtcbiAgICAgICAgICAtLWd2LXRhYmxlLXJvdy0tYWM6IGZsZXgtc3RhcnQ7XG4gICAgICAgICAgLS1ndi10YWJsZS1ob3Zlci0tYmdjOiB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wcm9wZXJ0aWVzLXRpdGxlIHtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjJyZW07XG4gICAgICAgIH1cblxuICAgICAgICAucHJvcGVydGllcy1ib3R0b20tY29udGFpbmVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDQ1cHg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG4gICAgICAgICAgcGFkZGluZzogMCAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSB7XG4gICAgICAgICAgY29sb3I6ICMyODQ0NGY7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSBzcGFuIHtcbiAgICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICAgIH1cblxuICAgICAgICAuYm94IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBib3R0b206IDA7XG4gICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250YWluZXIge1xuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcblxuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICAgIC8qIGZvciBGaXJlZm94ICovXG4gICAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGVudCB7XG4gICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgICAgZmxleC1ncm93OiAxO1xuXG4gICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgICAgcGFkZGluZzogMC41cmVtO1xuXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBndi10ZXh0IHtcbiAgICAgICAgICAtLWd2LXRleHQtLWZ6OiAyMHB4O1xuICAgICAgICAgIC0tZ3YtdGV4dC0tbGg6IDI1cHg7XG4gICAgICAgIH1cblxuICAgICAgICBndi1zd2l0Y2gge1xuICAgICAgICAgIC0tZ3Ytc3dpdGNoLS10YTogcmlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIGd2LWlucHV0IHtcbiAgICAgICAgICBtYXJnaW46IDAgMXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybSxcbiAgICAgICAgLmFkZC1mb3JtLWVycm9yIHtcbiAgICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICAgIG1hcmdpbjogYXV0byA1MHB4IGF1dG8gMDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtIHtcbiAgICAgICAgICBjb2x1bW4tZ2FwOiB2YXIoLS1ndi1wcm9wZXJ0aWVzLXRhYmxlLS1jb2xtZywgMC4ycmVtKTtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIHRoaWNrIHRyYW5zcGFyZW50O1xuICAgICAgICAgIGhlaWdodDogNTBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybSBndi1pbnB1dCxcbiAgICAgICAgZ3YtYnV0dG9uLFxuICAgICAgICBndi1zd2l0Y2gge1xuICAgICAgICAgIG1hcmdpbjogYXV0byAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtIGd2LXN3aXRjaCB7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtLWdyaWQge1xuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDBweCBhdXRvIGF1dG8gNDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybS1ncmlkLXdpdGgtZW5jcnlwdGVkLXRvZ2dsZSB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0MHB4IGF1dG8gYXV0byAxMDVweCA0MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtLWVycm9yX2V4cGVydCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybS1lcnJvciB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0MHB4IDFmcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUge1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ndi10aGVtZS1jb2xvci13YXJuaW5nLWRhcmssICNmNTdjMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm0tY29udGVudCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLnByb3BlcnRpZXMtbWVzc2FnZSB7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wYWdlLXNpemVfX3NlbGVjdCB7XG4gICAgICAgICAgbWF4LXdpZHRoOiA1MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLnNlYXJjaC1pbnB1dCB7XG4gICAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgaHIge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3IpO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDJweDtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LXByb3BlcnRpZXMnLCBHdlByb3BlcnRpZXMpO1xuIl19
861
+ //# sourceMappingURL=gv-properties.js.map