@geoit/ui 0.0.4 → 0.0.5

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 (258) hide show
  1. package/AGENTS.md +12 -8
  2. package/README.md +49 -62
  3. package/ai/AGENTS.md +38 -28
  4. package/ai/README.md +35 -1
  5. package/ai/catalog.json +2796 -288
  6. package/ai/components/geo-alert.md +3 -3
  7. package/ai/components/geo-back-button.md +2 -2
  8. package/ai/components/geo-breadcrumb.md +1 -1
  9. package/ai/components/geo-button.md +3 -3
  10. package/ai/components/geo-chart.md +103 -0
  11. package/ai/components/geo-checkbox.md +4 -6
  12. package/ai/components/geo-column-picker.md +3 -3
  13. package/ai/components/geo-confirm-modal.md +4 -5
  14. package/ai/components/geo-dashboard.md +91 -0
  15. package/ai/components/geo-date-picker.md +5 -3
  16. package/ai/components/geo-date-range-picker.md +5 -3
  17. package/ai/components/geo-empty-state.md +75 -0
  18. package/ai/components/geo-feedback-form.md +97 -0
  19. package/ai/components/geo-file-picker.md +4 -2
  20. package/ai/components/geo-forgot-password.md +78 -0
  21. package/ai/components/geo-form-modal.md +9 -10
  22. package/ai/components/geo-icon.md +3 -3
  23. package/ai/components/geo-input.md +8 -6
  24. package/ai/components/geo-layout-footer.md +70 -0
  25. package/ai/components/geo-layout-header-actions.md +82 -0
  26. package/ai/components/geo-layout-header.md +89 -0
  27. package/ai/components/geo-layout-sidebar.md +86 -0
  28. package/ai/components/geo-layout.md +155 -0
  29. package/ai/components/geo-list-page.md +72 -0
  30. package/ai/components/geo-login.md +94 -0
  31. package/ai/components/geo-map-admin-filter.md +80 -0
  32. package/ai/components/geo-map-basemap-switcher.md +75 -0
  33. package/ai/components/geo-map-help.md +72 -0
  34. package/ai/components/geo-map-layer-card.md +73 -0
  35. package/ai/components/geo-map-layer-panel.md +75 -0
  36. package/ai/components/geo-map-layers-drawer.md +78 -0
  37. package/ai/components/geo-map-legend.md +74 -0
  38. package/ai/components/geo-map-locate.md +75 -0
  39. package/ai/components/geo-map-location-chip.md +71 -0
  40. package/ai/components/geo-map-measure.md +74 -0
  41. package/ai/components/geo-map-opacity.md +75 -0
  42. package/ai/components/geo-map-parcel-popup.md +79 -0
  43. package/ai/components/geo-map-search.md +83 -0
  44. package/ai/components/geo-map-shell.md +110 -0
  45. package/ai/components/geo-map-snapshot.md +75 -0
  46. package/ai/components/geo-map-swipe.md +73 -0
  47. package/ai/components/geo-map-toolbar.md +76 -0
  48. package/ai/components/geo-map-zoom.md +74 -0
  49. package/ai/components/geo-map.md +205 -0
  50. package/ai/components/geo-overlap-result.md +88 -0
  51. package/ai/components/geo-page-header.md +72 -0
  52. package/ai/components/geo-page-title.md +1 -1
  53. package/ai/components/geo-pagination.md +4 -7
  54. package/ai/components/geo-radio.md +3 -1
  55. package/ai/components/geo-row-actions.md +3 -3
  56. package/ai/components/geo-select.md +4 -2
  57. package/ai/components/geo-slider.md +5 -7
  58. package/ai/components/geo-stat-card.md +98 -0
  59. package/ai/components/geo-status-tag.md +2 -2
  60. package/ai/components/geo-step-form-layout.md +7 -8
  61. package/ai/components/geo-stepper.md +3 -4
  62. package/ai/components/geo-table-filter.md +4 -5
  63. package/ai/components/geo-table-pagination.md +4 -7
  64. package/ai/components/geo-table-toolbar.md +7 -7
  65. package/ai/components/geo-table.md +17 -20
  66. package/ai/components/geo-tabs.md +4 -6
  67. package/ai/components/geo-textarea.md +4 -2
  68. package/ai/components/geo-toast.md +4 -4
  69. package/ai/components/geo-tree.md +4 -6
  70. package/ai/components/geo-typography.md +1 -1
  71. package/ai/components/geo-upload.md +9 -10
  72. package/ai/mockup.html +1194 -0
  73. package/ai/recipes.md +98 -85
  74. package/esm2022/lib/figma/geo-alert/geo-alert.component.mjs +19 -36
  75. package/esm2022/lib/figma/geo-back-button/geo-back-button.component.mjs +14 -24
  76. package/esm2022/lib/figma/geo-breadcrumb/geo-breadcrumb.component.mjs +8 -11
  77. package/esm2022/lib/figma/geo-button/geo-button.component.mjs +30 -59
  78. package/esm2022/lib/figma/geo-chart/geo-chart.component.mjs +88 -0
  79. package/esm2022/lib/figma/geo-chart/geo-chart.types.mjs +2 -0
  80. package/esm2022/lib/figma/geo-checkbox/geo-checkbox.component.mjs +11 -22
  81. package/esm2022/lib/figma/geo-confirm-modal/geo-confirm-modal.component.mjs +22 -54
  82. package/esm2022/lib/figma/geo-dashboard/geo-dashboard.component.mjs +49 -0
  83. package/esm2022/lib/figma/geo-dashboard/geo-dashboard.types.mjs +2 -0
  84. package/esm2022/lib/figma/geo-date-picker/geo-date-picker.component.mjs +48 -78
  85. package/esm2022/lib/figma/geo-date-range-picker/geo-date-range-picker.component.mjs +47 -75
  86. package/esm2022/lib/figma/geo-empty-state/geo-empty-state.component.mjs +25 -0
  87. package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.component.mjs +75 -0
  88. package/esm2022/lib/figma/geo-feedback-form/geo-feedback-form.types.mjs +2 -0
  89. package/esm2022/lib/figma/geo-file-picker/geo-file-picker.component.mjs +59 -81
  90. package/esm2022/lib/figma/geo-forgot-password/geo-forgot-password.component.mjs +51 -0
  91. package/esm2022/lib/figma/geo-form-modal/geo-form-modal.component.mjs +45 -112
  92. package/esm2022/lib/figma/geo-icon/geo-icon.component.mjs +22 -32
  93. package/esm2022/lib/figma/geo-input/geo-input.component.mjs +41 -70
  94. package/esm2022/lib/figma/geo-layout/footer/geo-layout-footer.component.mjs +18 -0
  95. package/esm2022/lib/figma/geo-layout/geo-layout-actions.directive.mjs +15 -0
  96. package/esm2022/lib/figma/geo-layout/geo-layout.component.mjs +79 -0
  97. package/esm2022/lib/figma/geo-layout/geo-layout.types.mjs +42 -0
  98. package/esm2022/lib/figma/geo-layout/header/geo-layout-header.component.mjs +60 -0
  99. package/esm2022/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.mjs +70 -0
  100. package/esm2022/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.mjs +90 -0
  101. package/esm2022/lib/figma/geo-list-page/geo-list-page.component.mjs +22 -0
  102. package/esm2022/lib/figma/geo-login/geo-login.component.mjs +58 -0
  103. package/esm2022/lib/figma/geo-login/geo-login.types.mjs +2 -0
  104. package/esm2022/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.mjs +52 -0
  105. package/esm2022/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.mjs +61 -0
  106. package/esm2022/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.mjs +26 -0
  107. package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.mjs +24 -0
  108. package/esm2022/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.mjs +146 -0
  109. package/esm2022/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.mjs +37 -0
  110. package/esm2022/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.mjs +30 -0
  111. package/esm2022/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.mjs +72 -0
  112. package/esm2022/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.mjs +21 -0
  113. package/esm2022/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.mjs +375 -0
  114. package/esm2022/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.mjs +94 -0
  115. package/esm2022/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.mjs +136 -0
  116. package/esm2022/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.mjs +182 -0
  117. package/esm2022/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.mjs +577 -0
  118. package/esm2022/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.mjs +93 -0
  119. package/esm2022/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.mjs +129 -0
  120. package/esm2022/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.mjs +64 -0
  121. package/esm2022/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.mjs +295 -0
  122. package/esm2022/lib/figma/geo-map/geo-map-toolbar.icons.mjs +18 -0
  123. package/esm2022/lib/figma/geo-map/geo-map.component.mjs +144 -0
  124. package/esm2022/lib/figma/geo-map/geo-map.constants.mjs +497 -0
  125. package/esm2022/lib/figma/geo-map/geo-map.controller.mjs +71 -0
  126. package/esm2022/lib/figma/geo-map/geo-map.types.mjs +2 -0
  127. package/esm2022/lib/figma/geo-map/services/geo-map-layer.service.mjs +368 -0
  128. package/esm2022/lib/figma/geo-map/services/geo-map-projection.service.mjs +110 -0
  129. package/esm2022/lib/figma/geo-map/services/geo-map.service.mjs +540 -0
  130. package/esm2022/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.mjs +47 -0
  131. package/esm2022/lib/figma/geo-map/utils/geo-map-interactions.util.mjs +30 -0
  132. package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.component.mjs +25 -0
  133. package/esm2022/lib/figma/geo-overlap-result/geo-overlap-result.types.mjs +2 -0
  134. package/esm2022/lib/figma/geo-page-header/geo-page-header.component.mjs +23 -0
  135. package/esm2022/lib/figma/geo-page-title/geo-page-title.component.mjs +20 -35
  136. package/esm2022/lib/figma/geo-pagination/geo-pagination.component.mjs +13 -43
  137. package/esm2022/lib/figma/geo-radio/geo-radio.component.mjs +32 -52
  138. package/esm2022/lib/figma/geo-select/geo-select.component.mjs +46 -72
  139. package/esm2022/lib/figma/geo-slider/geo-slider.component.mjs +12 -28
  140. package/esm2022/lib/figma/geo-stat-card/geo-stat-card.component.mjs +163 -0
  141. package/esm2022/lib/figma/geo-stat-card/geo-stat-card.types.mjs +2 -0
  142. package/esm2022/lib/figma/geo-status-tag/geo-status-tag.component.mjs +23 -27
  143. package/esm2022/lib/figma/geo-step-form-layout/geo-step-form-layout.component.mjs +39 -96
  144. package/esm2022/lib/figma/geo-stepper/geo-stepper.component.mjs +18 -33
  145. package/esm2022/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.mjs +14 -24
  146. package/esm2022/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.mjs +18 -36
  147. package/esm2022/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.mjs +41 -98
  148. package/esm2022/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.mjs +40 -73
  149. package/esm2022/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.mjs +26 -56
  150. package/esm2022/lib/figma/geo-table/geo-table.component.mjs +110 -210
  151. package/esm2022/lib/figma/geo-tabs/geo-tabs.component.mjs +33 -63
  152. package/esm2022/lib/figma/geo-textarea/geo-textarea.component.mjs +28 -44
  153. package/esm2022/lib/figma/geo-toast/geo-toast.component.mjs +18 -39
  154. package/esm2022/lib/figma/geo-tree/geo-tree.component.mjs +12 -40
  155. package/esm2022/lib/figma/geo-typography/geo-typography.component.mjs +49 -64
  156. package/esm2022/lib/figma/geo-upload/geo-upload.component.mjs +50 -101
  157. package/esm2022/lib/figma/index.mjs +50 -1
  158. package/esm2022/lib/styles/tokens.mjs +56 -24
  159. package/fesm2022/geoit-ui.mjs +5981 -1825
  160. package/fesm2022/geoit-ui.mjs.map +1 -1
  161. package/lib/figma/geo-alert/geo-alert.component.d.ts +10 -11
  162. package/lib/figma/geo-back-button/geo-back-button.component.d.ts +6 -7
  163. package/lib/figma/geo-breadcrumb/geo-breadcrumb.component.d.ts +2 -2
  164. package/lib/figma/geo-button/geo-button.component.d.ts +21 -17
  165. package/lib/figma/geo-chart/geo-chart.component.d.ts +40 -0
  166. package/lib/figma/geo-chart/geo-chart.types.d.ts +13 -0
  167. package/lib/figma/geo-checkbox/geo-checkbox.component.d.ts +6 -7
  168. package/lib/figma/geo-confirm-modal/geo-confirm-modal.component.d.ts +15 -17
  169. package/lib/figma/geo-dashboard/geo-dashboard.component.d.ts +29 -0
  170. package/lib/figma/geo-dashboard/geo-dashboard.types.d.ts +7 -0
  171. package/lib/figma/geo-date-picker/geo-date-picker.component.d.ts +26 -21
  172. package/lib/figma/geo-date-range-picker/geo-date-range-picker.component.d.ts +25 -20
  173. package/lib/figma/geo-empty-state/geo-empty-state.component.d.ts +17 -0
  174. package/lib/figma/geo-feedback-form/geo-feedback-form.component.d.ts +36 -0
  175. package/lib/figma/geo-feedback-form/geo-feedback-form.types.d.ts +8 -0
  176. package/lib/figma/geo-file-picker/geo-file-picker.component.d.ts +23 -20
  177. package/lib/figma/geo-forgot-password/geo-forgot-password.component.d.ts +24 -0
  178. package/lib/figma/geo-form-modal/geo-form-modal.component.d.ts +33 -35
  179. package/lib/figma/geo-icon/geo-icon.component.d.ts +7 -7
  180. package/lib/figma/geo-input/geo-input.component.d.ts +23 -21
  181. package/lib/figma/geo-layout/footer/geo-layout-footer.component.d.ts +10 -0
  182. package/lib/figma/geo-layout/geo-layout-actions.directive.d.ts +6 -0
  183. package/lib/figma/geo-layout/geo-layout.component.d.ts +48 -0
  184. package/lib/figma/geo-layout/geo-layout.types.d.ts +44 -0
  185. package/lib/figma/geo-layout/header/geo-layout-header.component.d.ts +31 -0
  186. package/lib/figma/geo-layout/header-actions/geo-layout-header-actions.component.d.ts +32 -0
  187. package/lib/figma/geo-layout/sidebar/geo-layout-sidebar.component.d.ts +34 -0
  188. package/lib/figma/geo-list-page/geo-list-page.component.d.ts +16 -0
  189. package/lib/figma/geo-login/geo-login.component.d.ts +27 -0
  190. package/lib/figma/geo-login/geo-login.types.d.ts +6 -0
  191. package/lib/figma/geo-map/chrome/geo-map-admin-filter/geo-map-admin-filter.component.d.ts +28 -0
  192. package/lib/figma/geo-map/chrome/geo-map-basemap-switcher/geo-map-basemap-switcher.component.d.ts +26 -0
  193. package/lib/figma/geo-map/chrome/geo-map-help/geo-map-help.component.d.ts +20 -0
  194. package/lib/figma/geo-map/chrome/geo-map-layer-card/geo-map-layer-card.component.d.ts +15 -0
  195. package/lib/figma/geo-map/chrome/geo-map-layer-panel/geo-map-layer-panel.component.d.ts +40 -0
  196. package/lib/figma/geo-map/chrome/geo-map-layers-drawer/geo-map-layers-drawer.component.d.ts +25 -0
  197. package/lib/figma/geo-map/chrome/geo-map-legend/geo-map-legend.component.d.ts +18 -0
  198. package/lib/figma/geo-map/chrome/geo-map-locate/geo-map-locate.component.d.ts +24 -0
  199. package/lib/figma/geo-map/chrome/geo-map-location-chip/geo-map-location-chip.component.d.ts +14 -0
  200. package/lib/figma/geo-map/chrome/geo-map-measure/geo-map-measure.component.d.ts +49 -0
  201. package/lib/figma/geo-map/chrome/geo-map-opacity/geo-map-opacity.component.d.ts +30 -0
  202. package/lib/figma/geo-map/chrome/geo-map-parcel-popup/geo-map-parcel-popup.component.d.ts +44 -0
  203. package/lib/figma/geo-map/chrome/geo-map-search/geo-map-search.component.d.ts +56 -0
  204. package/lib/figma/geo-map/chrome/geo-map-shell/geo-map-shell.component.d.ts +103 -0
  205. package/lib/figma/geo-map/chrome/geo-map-snapshot/geo-map-snapshot.component.d.ts +21 -0
  206. package/lib/figma/geo-map/chrome/geo-map-swipe/geo-map-swipe.component.d.ts +33 -0
  207. package/lib/figma/geo-map/chrome/geo-map-toolbar/geo-map-toolbar.component.d.ts +30 -0
  208. package/lib/figma/geo-map/chrome/geo-map-zoom/geo-map-zoom.component.d.ts +67 -0
  209. package/lib/figma/geo-map/geo-map-toolbar.icons.d.ts +17 -0
  210. package/lib/figma/geo-map/geo-map.component.d.ts +53 -0
  211. package/lib/figma/geo-map/geo-map.constants.d.ts +73 -0
  212. package/lib/figma/geo-map/geo-map.controller.d.ts +49 -0
  213. package/lib/figma/geo-map/geo-map.types.d.ts +224 -0
  214. package/lib/figma/geo-map/services/geo-map-layer.service.d.ts +42 -0
  215. package/lib/figma/geo-map/services/geo-map-projection.service.d.ts +32 -0
  216. package/lib/figma/geo-map/services/geo-map.service.d.ts +99 -0
  217. package/lib/figma/geo-map/utils/geo-map-fullscreen-overlay.util.d.ts +13 -0
  218. package/lib/figma/geo-map/utils/geo-map-interactions.util.d.ts +9 -0
  219. package/lib/figma/geo-overlap-result/geo-overlap-result.component.d.ts +18 -0
  220. package/lib/figma/geo-overlap-result/geo-overlap-result.types.d.ts +7 -0
  221. package/lib/figma/geo-page-header/geo-page-header.component.d.ts +16 -0
  222. package/lib/figma/geo-page-title/geo-page-title.component.d.ts +9 -9
  223. package/lib/figma/geo-pagination/geo-pagination.component.d.ts +9 -14
  224. package/lib/figma/geo-radio/geo-radio.component.d.ts +17 -15
  225. package/lib/figma/geo-select/geo-select.component.d.ts +24 -19
  226. package/lib/figma/geo-slider/geo-slider.component.d.ts +7 -9
  227. package/lib/figma/geo-stat-card/geo-stat-card.component.d.ts +50 -0
  228. package/lib/figma/geo-stat-card/geo-stat-card.types.d.ts +11 -0
  229. package/lib/figma/geo-status-tag/geo-status-tag.component.d.ts +7 -7
  230. package/lib/figma/geo-step-form-layout/geo-step-form-layout.component.d.ts +27 -29
  231. package/lib/figma/geo-stepper/geo-stepper.component.d.ts +6 -8
  232. package/lib/figma/geo-table/geo-column-picker/geo-column-picker.component.d.ts +6 -7
  233. package/lib/figma/geo-table/geo-row-actions/geo-row-actions.component.d.ts +11 -12
  234. package/lib/figma/geo-table/geo-table-filter/geo-table-filter.component.d.ts +21 -28
  235. package/lib/figma/geo-table/geo-table-pagination/geo-table-pagination.component.d.ts +17 -20
  236. package/lib/figma/geo-table/geo-table-toolbar/geo-table-toolbar.component.d.ts +17 -18
  237. package/lib/figma/geo-table/geo-table.component.d.ts +58 -62
  238. package/lib/figma/geo-tabs/geo-tabs.component.d.ts +14 -17
  239. package/lib/figma/geo-textarea/geo-textarea.component.d.ts +15 -13
  240. package/lib/figma/geo-toast/geo-toast.component.d.ts +11 -12
  241. package/lib/figma/geo-tree/geo-tree.component.d.ts +8 -13
  242. package/lib/figma/geo-typography/geo-typography.component.d.ts +13 -13
  243. package/lib/figma/geo-upload/geo-upload.component.d.ts +26 -28
  244. package/lib/figma/index.d.ts +49 -0
  245. package/lib/styles/tokens.d.ts +56 -23
  246. package/package.json +4 -2
  247. package/src/lib/figma/geo-map/assets/toolbar/fullscreen.svg +8 -0
  248. package/src/lib/figma/geo-map/assets/toolbar/home.svg +3 -0
  249. package/src/lib/figma/geo-map/assets/toolbar/layers.svg +3 -0
  250. package/src/lib/figma/geo-map/assets/toolbar/measure-area.svg +12 -0
  251. package/src/lib/figma/geo-map/assets/toolbar/measure-distance.svg +5 -0
  252. package/src/lib/figma/geo-map/assets/toolbar/pan.svg +13 -0
  253. package/src/lib/figma/geo-map/assets/toolbar/search.svg +3 -0
  254. package/src/lib/figma/geo-map/assets/toolbar/zoom-in.svg +3 -0
  255. package/src/lib/figma/geo-map/assets/toolbar/zoom-out.svg +5 -0
  256. package/src/lib/styles/design-tokens.scss +108 -35
  257. package/src/lib/styles/scrollbar.scss +2 -2
  258. package/src/lib/styles/theme.scss +1 -1
@@ -0,0 +1,136 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, model, output, ViewEncapsulation, } from '@angular/core';
2
+ import { GeoIconComponent } from '../../../geo-icon/geo-icon.component';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Parcel / planning result detail panel (TCQH.12).
6
+ *
7
+ * @summary Popup / panel chi tiết kết quả tra cứu thửa đất.
8
+ * @whenToUse Hiển thị thông tin thửa + quy hoạch sau khi chọn kết quả.
9
+ * @doNotUseWhen Full CADASTRE edit forms.
10
+ */
11
+ export class GeoMapParcelPopupComponent {
12
+ open = model(false);
13
+ title = input('Thông tin thửa đất');
14
+ parcel = input(null);
15
+ audience = input('citizen');
16
+ /** Giữ tương thích API cũ; footer xuất file không còn trong layout thiết kế. */
17
+ showExport = input(false);
18
+ closed = output();
19
+ back = output();
20
+ exportClick = output();
21
+ diagramClick = output();
22
+ sections = computed(() => {
23
+ const data = this.parcel();
24
+ if (!data) {
25
+ return [];
26
+ }
27
+ const generalRows = [
28
+ { label: 'Mã thửa đất', value: data.parcelCode ?? '' },
29
+ { label: 'Số tờ', value: data.sheetNumber ?? '' },
30
+ { label: 'Số thửa', value: data.parcelNumber ?? '' },
31
+ { label: 'Diện tích', value: data.area ?? data.legalArea ?? '' },
32
+ ].filter((row) => !!row.value.trim());
33
+ const addressRows = [
34
+ { label: 'Xã', value: data.ward ?? '' },
35
+ { label: 'Tỉnh', value: data.province ?? '' },
36
+ ].filter((row) => !!row.value.trim());
37
+ const sections = [
38
+ {
39
+ id: 'general',
40
+ title: 'Thông tin chung',
41
+ icon: 'info-circle',
42
+ rows: generalRows,
43
+ },
44
+ {
45
+ id: 'landUse',
46
+ title: 'Loại đất',
47
+ icon: 'file-text',
48
+ value: data.landUse,
49
+ },
50
+ {
51
+ id: 'address',
52
+ title: 'Địa chỉ',
53
+ icon: 'environment',
54
+ rows: addressRows,
55
+ },
56
+ {
57
+ id: 'registration',
58
+ title: 'Trạng thái đăng ký',
59
+ icon: 'profile',
60
+ value: data.registrationStatus,
61
+ },
62
+ {
63
+ id: 'price',
64
+ title: 'Giá đất',
65
+ icon: 'search',
66
+ value: data.landPrice?.trim() || 'Đang cập nhật',
67
+ },
68
+ {
69
+ id: 'diagram',
70
+ title: 'Sơ đồ thửa đất',
71
+ icon: 'global',
72
+ diagram: true,
73
+ },
74
+ ];
75
+ if (this.audience() === 'specialist' && data.shapeInfo?.trim()) {
76
+ sections.splice(-1, 0, {
77
+ id: 'shape',
78
+ title: 'Thông tin hình thể',
79
+ icon: 'border-outer',
80
+ value: data.shapeInfo,
81
+ });
82
+ }
83
+ if (this.audience() === 'specialist' && data.planningInfo?.trim()) {
84
+ sections.splice(-1, 0, {
85
+ id: 'planning',
86
+ title: 'Thông tin quy hoạch',
87
+ icon: 'bank',
88
+ value: data.planningInfo,
89
+ });
90
+ }
91
+ for (const extra of data.extraFields ?? []) {
92
+ if (!extra.value?.trim()) {
93
+ continue;
94
+ }
95
+ sections.splice(-1, 0, {
96
+ id: `extra-${extra.label}`,
97
+ title: extra.label,
98
+ icon: 'file-text',
99
+ value: extra.value,
100
+ });
101
+ }
102
+ return sections.filter((section) => section.diagram ||
103
+ !!section.value?.trim() ||
104
+ (section.rows?.length ?? 0) > 0);
105
+ });
106
+ close() {
107
+ this.open.set(false);
108
+ this.closed.emit();
109
+ }
110
+ onBack() {
111
+ this.open.set(false);
112
+ this.back.emit();
113
+ }
114
+ onExport() {
115
+ const data = this.parcel();
116
+ if (data) {
117
+ this.exportClick.emit(data);
118
+ }
119
+ }
120
+ onDiagramDetail() {
121
+ const data = this.parcel();
122
+ if (data) {
123
+ this.diagramClick.emit(data);
124
+ }
125
+ }
126
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapParcelPopupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
127
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapParcelPopupComponent, isStandalone: true, selector: "geo-map-parcel-popup", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, parcel: { classPropertyName: "parcel", publicName: "parcel", isSignal: true, isRequired: false, transformFunction: null }, audience: { classPropertyName: "audience", publicName: "audience", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", closed: "closed", back: "back", exportClick: "exportClick", diagramClick: "diagramClick" }, host: { properties: { "class.geo-map-parcel-popup-host--open": "open()" }, classAttribute: "geo-map-parcel-popup-host" }, ngImport: i0, template: "@if (open() && parcel(); as data) {\n <aside class=\"geo-map-parcel-popup\" role=\"dialog\" aria-label=\"Th\u00F4ng tin th\u1EEDa \u0111\u1EA5t\">\n <header class=\"geo-map-parcel-popup__header\">\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__back\"\n aria-label=\"Quay l\u1EA1i\"\n (click)=\"onBack()\"\n >\n <geo-icon type=\"arrow-left\" size=\"sm\" />\n </button>\n <h3 class=\"geo-map-parcel-popup__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__close\"\n aria-label=\"\u0110\u00F3ng chi ti\u1EBFt\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-parcel-popup__body\">\n @for (section of sections(); track section.id) {\n <section class=\"geo-map-parcel-popup__section\">\n <div class=\"geo-map-parcel-popup__section-head\">\n <h4 class=\"geo-map-parcel-popup__section-title\">\n <geo-icon [type]=\"section.icon\" size=\"sm\" />\n <span>{{ section.title }}</span>\n </h4>\n @if (section.diagram) {\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__link\"\n (click)=\"onDiagramDetail()\"\n >\n Chi ti\u1EBFt\n </button>\n }\n </div>\n\n @if (section.rows?.length) {\n <dl class=\"geo-map-parcel-popup__rows\">\n @for (row of section.rows; track row.label) {\n <div class=\"geo-map-parcel-popup__row\">\n <dt>{{ row.label }}:</dt>\n <dd>{{ row.value }}</dd>\n </div>\n }\n </dl>\n } @else if (section.value) {\n <p class=\"geo-map-parcel-popup__value\">{{ section.value }}</p>\n }\n\n @if (section.diagram) {\n <div class=\"geo-map-parcel-popup__diagram\">\n @if (data.diagramUrl) {\n <img\n class=\"geo-map-parcel-popup__diagram-img\"\n [src]=\"data.diagramUrl\"\n alt=\"S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t\"\n />\n } @else {\n <div class=\"geo-map-parcel-popup__diagram-placeholder\" aria-hidden=\"true\">\n <geo-icon type=\"picture\" size=\"lg\" />\n <span>S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t</span>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-parcel-popup-host{display:none}.geo-map-parcel-popup-host--open{display:block}.geo-map-parcel-popup{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden;--geo-parcel-content-indent: 24px}.geo-map-parcel-popup__header{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-parcel-popup__title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__back,.geo-map-parcel-popup__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:36px;min-width:36px;min-height:36px;padding:0}.geo-map-parcel-popup__back:hover:not(:disabled),.geo-map-parcel-popup__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:active:not(:disabled),.geo-map-parcel-popup__close:active:not(:disabled){transform:scale(.98)}.geo-map-parcel-popup__back:disabled,.geo-map-parcel-popup__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-parcel-popup__back--active,.geo-map-parcel-popup__back--checked,.geo-map-parcel-popup__close--active,.geo-map-parcel-popup__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back--icon-only,.geo-map-parcel-popup__close--icon-only{width:40px;padding:0}.geo-map-parcel-popup__back{border-radius:var(--geo-radius);background:var(--geo-color-primary-surface-light);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:hover:not(:disabled){background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__close{color:var(--geo-color-neutral-500)}.geo-map-parcel-popup__body{display:flex;flex-direction:column;gap:16px;padding:14px 16px 18px;overflow:auto}.geo-map-parcel-popup__section{display:flex;flex-direction:column;gap:8px}.geo-map-parcel-popup__section-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.geo-map-parcel-popup__section-title{display:inline-flex;align-items:center;gap:8px;margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.3}.geo-map-parcel-popup__section-title geo-icon,.geo-map-parcel-popup__section-title .geo-icon-host{flex-shrink:0;width:16px;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__link:hover{text-decoration:underline}.geo-map-parcel-popup__link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-parcel-popup__rows{margin:0;padding-left:var(--geo-parcel-content-indent);display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:8px;row-gap:6px}.geo-map-parcel-popup__row{display:contents}.geo-map-parcel-popup__row dt{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-regular, 400);color:var(--geo-color-neutral-600)}.geo-map-parcel-popup__row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);word-break:break-word}.geo-map-parcel-popup__value{margin:0;padding-left:var(--geo-parcel-content-indent);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);line-height:1.45}.geo-map-parcel-popup__diagram{margin-left:var(--geo-parcel-content-indent);overflow:hidden;border-radius:var(--geo-radius);border:1px solid var(--geo-color-border-default);background:var(--geo-color-neutral-50)}.geo-map-parcel-popup__diagram-img{display:block;width:100%;height:auto;max-height:160px;object-fit:cover}.geo-map-parcel-popup__diagram-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:120px;padding:16px;color:var(--geo-color-neutral-400);font-size:var(--geo-font-size-caption);background:linear-gradient(135deg,color-mix(in srgb,var(--geo-color-primary-soft) 80%,transparent) 0%,transparent 45%),repeating-linear-gradient(-12deg,transparent,transparent 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 11px)}\n"], dependencies: [{ kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
128
+ }
129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapParcelPopupComponent, decorators: [{
130
+ type: Component,
131
+ args: [{ selector: 'geo-map-parcel-popup', standalone: true, imports: [GeoIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
132
+ class: 'geo-map-parcel-popup-host',
133
+ '[class.geo-map-parcel-popup-host--open]': 'open()',
134
+ }, template: "@if (open() && parcel(); as data) {\n <aside class=\"geo-map-parcel-popup\" role=\"dialog\" aria-label=\"Th\u00F4ng tin th\u1EEDa \u0111\u1EA5t\">\n <header class=\"geo-map-parcel-popup__header\">\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__back\"\n aria-label=\"Quay l\u1EA1i\"\n (click)=\"onBack()\"\n >\n <geo-icon type=\"arrow-left\" size=\"sm\" />\n </button>\n <h3 class=\"geo-map-parcel-popup__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__close\"\n aria-label=\"\u0110\u00F3ng chi ti\u1EBFt\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-parcel-popup__body\">\n @for (section of sections(); track section.id) {\n <section class=\"geo-map-parcel-popup__section\">\n <div class=\"geo-map-parcel-popup__section-head\">\n <h4 class=\"geo-map-parcel-popup__section-title\">\n <geo-icon [type]=\"section.icon\" size=\"sm\" />\n <span>{{ section.title }}</span>\n </h4>\n @if (section.diagram) {\n <button\n type=\"button\"\n class=\"geo-map-parcel-popup__link\"\n (click)=\"onDiagramDetail()\"\n >\n Chi ti\u1EBFt\n </button>\n }\n </div>\n\n @if (section.rows?.length) {\n <dl class=\"geo-map-parcel-popup__rows\">\n @for (row of section.rows; track row.label) {\n <div class=\"geo-map-parcel-popup__row\">\n <dt>{{ row.label }}:</dt>\n <dd>{{ row.value }}</dd>\n </div>\n }\n </dl>\n } @else if (section.value) {\n <p class=\"geo-map-parcel-popup__value\">{{ section.value }}</p>\n }\n\n @if (section.diagram) {\n <div class=\"geo-map-parcel-popup__diagram\">\n @if (data.diagramUrl) {\n <img\n class=\"geo-map-parcel-popup__diagram-img\"\n [src]=\"data.diagramUrl\"\n alt=\"S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t\"\n />\n } @else {\n <div class=\"geo-map-parcel-popup__diagram-placeholder\" aria-hidden=\"true\">\n <geo-icon type=\"picture\" size=\"lg\" />\n <span>S\u01A1 \u0111\u1ED3 th\u1EEDa \u0111\u1EA5t</span>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n </aside>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-parcel-popup-host{display:none}.geo-map-parcel-popup-host--open{display:block}.geo-map-parcel-popup{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);display:flex;flex-direction:column;width:min(400px,100vw - 32px);max-height:min(640px,100dvh - 100px);overflow:hidden;--geo-parcel-content-indent: 24px}.geo-map-parcel-popup__header{display:grid;grid-template-columns:36px 1fr 36px;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-parcel-popup__title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__back,.geo-map-parcel-popup__close{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:36px;min-width:36px;min-height:36px;padding:0}.geo-map-parcel-popup__back:hover:not(:disabled),.geo-map-parcel-popup__close:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:active:not(:disabled),.geo-map-parcel-popup__close:active:not(:disabled){transform:scale(.98)}.geo-map-parcel-popup__back:disabled,.geo-map-parcel-popup__close:disabled{opacity:.45;cursor:not-allowed}.geo-map-parcel-popup__back--active,.geo-map-parcel-popup__back--checked,.geo-map-parcel-popup__close--active,.geo-map-parcel-popup__close--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back--icon-only,.geo-map-parcel-popup__close--icon-only{width:40px;padding:0}.geo-map-parcel-popup__back{border-radius:var(--geo-radius);background:var(--geo-color-primary-surface-light);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__back:hover:not(:disabled){background:var(--geo-color-primary-soft-strong);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__close{color:var(--geo-color-neutral-500)}.geo-map-parcel-popup__body{display:flex;flex-direction:column;gap:16px;padding:14px 16px 18px;overflow:auto}.geo-map-parcel-popup__section{display:flex;flex-direction:column;gap:8px}.geo-map-parcel-popup__section-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.geo-map-parcel-popup__section-title{display:inline-flex;align-items:center;gap:8px;margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.3}.geo-map-parcel-popup__section-title geo-icon,.geo-map-parcel-popup__section-title .geo-icon-host{flex-shrink:0;width:16px;color:var(--geo-color-neutral-900)}.geo-map-parcel-popup__link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default)}.geo-map-parcel-popup__link:hover{text-decoration:underline}.geo-map-parcel-popup__link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-parcel-popup__rows{margin:0;padding-left:var(--geo-parcel-content-indent);display:grid;grid-template-columns:max-content minmax(0,1fr);column-gap:8px;row-gap:6px}.geo-map-parcel-popup__row{display:contents}.geo-map-parcel-popup__row dt{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-regular, 400);color:var(--geo-color-neutral-600)}.geo-map-parcel-popup__row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);word-break:break-word}.geo-map-parcel-popup__value{margin:0;padding-left:var(--geo-parcel-content-indent);font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-neutral-900);line-height:1.45}.geo-map-parcel-popup__diagram{margin-left:var(--geo-parcel-content-indent);overflow:hidden;border-radius:var(--geo-radius);border:1px solid var(--geo-color-border-default);background:var(--geo-color-neutral-50)}.geo-map-parcel-popup__diagram-img{display:block;width:100%;height:auto;max-height:160px;object-fit:cover}.geo-map-parcel-popup__diagram-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;min-height:120px;padding:16px;color:var(--geo-color-neutral-400);font-size:var(--geo-font-size-caption);background:linear-gradient(135deg,color-mix(in srgb,var(--geo-color-primary-soft) 80%,transparent) 0%,transparent 45%),repeating-linear-gradient(-12deg,transparent,transparent 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 10px,color-mix(in srgb,var(--geo-color-neutral-200) 55%,transparent) 11px)}\n"] }]
135
+ }] });
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1wYXJjZWwtcG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1wYXJjZWwtcG9wdXAvZ2VvLW1hcC1wYXJjZWwtcG9wdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1wYXJjZWwtcG9wdXAvZ2VvLW1hcC1wYXJjZWwtcG9wdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUF1QnhFOzs7Ozs7R0FNRztBQWNILE1BQU0sT0FBTywwQkFBMEI7SUFDNUIsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixLQUFLLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDcEMsTUFBTSxHQUFHLEtBQUssQ0FBNEIsSUFBSSxDQUFDLENBQUM7SUFDaEQsUUFBUSxHQUFHLEtBQUssQ0FBdUIsU0FBUyxDQUFDLENBQUM7SUFDM0QsZ0ZBQWdGO0lBQ3ZFLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUIsTUFBTSxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQ3hCLElBQUksR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUN0QixXQUFXLEdBQUcsTUFBTSxFQUFzQixDQUFDO0lBQzNDLFlBQVksR0FBRyxNQUFNLEVBQXNCLENBQUM7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QUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7d0dBbElVLDBCQUEwQjs0RkFBMUIsMEJBQTBCLGk4QkNwRHZDLDBxRkEyRUEsMG9LRGpDWSxnQkFBZ0I7OzRGQVVmLDBCQUEwQjtrQkFidEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsZ0JBQWdCLENBQUMsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDSixLQUFLLEVBQUUsMkJBQTJCO3dCQUNsQyx5Q0FBeUMsRUFBRSxRQUFRO3FCQUNwRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbnB1dCxcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR2VvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2dlby1pY29uL2dlby1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgdHlwZSB7XG4gIEdlb01hcFBhcmNlbEF1ZGllbmNlLFxuICBHZW9NYXBQYXJjZWxEZXRhaWwsXG59IGZyb20gJy4uLy4uL2dlby1tYXAudHlwZXMnO1xuXG5pbnRlcmZhY2UgUGFyY2VsRmllbGRSb3cge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUGFyY2VsU2VjdGlvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgLyoqIEtleS12YWx1ZSByb3dzIChUaMO0bmcgdGluIGNodW5nLCDEkOG7i2EgY2jhu4kpLiAqL1xuICByb3dzPzogUGFyY2VsRmllbGRSb3dbXTtcbiAgLyoqIFNpbmdsZSB2YWx1ZSB1bmRlciBzZWN0aW9uIHRpdGxlIChMb+G6oWkgxJHhuqV0LCBUcuG6oW5nIHRow6FpLCBHacOhIMSR4bqldCkuICovXG4gIHZhbHVlPzogc3RyaW5nO1xuICAvKiogU8ahIMSR4buTIHRo4butYS4gKi9cbiAgZGlhZ3JhbT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyY2VsIC8gcGxhbm5pbmcgcmVzdWx0IGRldGFpbCBwYW5lbCAoVENRSC4xMikuXG4gKlxuICogQHN1bW1hcnkgUG9wdXAgLyBwYW5lbCBjaGkgdGnhur90IGvhur90IHF14bqjIHRyYSBj4bupdSB0aOG7rWEgxJHhuqV0LlxuICogQHdoZW5Ub1VzZSBIaeG7g24gdGjhu4sgdGjDtG5nIHRpbiB0aOG7rWEgKyBxdXkgaG/huqFjaCBzYXUga2hpIGNo4buNbiBr4bq/dCBxdeG6oy5cbiAqIEBkb05vdFVzZVdoZW4gRnVsbCBDQURBU1RSRSBlZGl0IGZvcm1zLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnZW8tbWFwLXBhcmNlbC1wb3B1cCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtHZW9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby1tYXAtcGFyY2VsLXBvcHVwLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2dlby1tYXAtcGFyY2VsLXBvcHVwLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2dlby1tYXAtcGFyY2VsLXBvcHVwLWhvc3QnLFxuICAgICdbY2xhc3MuZ2VvLW1hcC1wYXJjZWwtcG9wdXAtaG9zdC0tb3Blbl0nOiAnb3BlbigpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgR2VvTWFwUGFyY2VsUG9wdXBDb21wb25lbnQge1xuICByZWFkb25seSBvcGVuID0gbW9kZWwoZmFsc2UpO1xuICByZWFkb25seSB0aXRsZSA9IGlucHV0KCdUaMO0bmcgdGluIHRo4butYSDEkeG6pXQnKTtcbiAgcmVhZG9ubHkgcGFyY2VsID0gaW5wdXQ8R2VvTWFwUGFyY2VsRGV0YWlsIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGF1ZGllbmNlID0gaW5wdXQ8R2VvTWFwUGFyY2VsQXVkaWVuY2U+KCdjaXRpemVuJyk7XG4gIC8qKiBHaeG7ryB0xrDGoW5nIHRow61jaCBBUEkgY8WpOyBmb290ZXIgeHXhuqV0IGZpbGUga2jDtG5nIGPDsm4gdHJvbmcgbGF5b3V0IHRoaeG6v3Qga+G6vy4gKi9cbiAgcmVhZG9ubHkgc2hvd0V4cG9ydCA9IGlucHV0KGZhbHNlKTtcblxuICByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgYmFjayA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBleHBvcnRDbGljayA9IG91dHB1dDxHZW9NYXBQYXJjZWxEZXRhaWw+KCk7XG4gIHJlYWRvbmx5IGRpYWdyYW1DbGljayA9IG91dHB1dDxHZW9NYXBQYXJjZWxEZXRhaWw+KCk7XG5cbiAgcmVhZG9ubHkgc2VjdGlvbnMgPSBjb21wdXRlZDxQYXJjZWxTZWN0aW9uW10+KCgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5wYXJjZWwoKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBnZW5lcmFsUm93czogUGFyY2VsRmllbGRSb3dbXSA9IFtcbiAgICAgIHsgbGFiZWw6ICdNw6MgdGjhu61hIMSR4bqldCcsIHZhbHVlOiBkYXRhLnBhcmNlbENvZGUgPz8gJycgfSxcbiAgICAgIHsgbGFiZWw6ICdT4buRIHThu50nLCB2YWx1ZTogZGF0YS5zaGVldE51bWJlciA/PyAnJyB9LFxuICAgICAgeyBsYWJlbDogJ1Phu5EgdGjhu61hJywgdmFsdWU6IGRhdGEucGFyY2VsTnVtYmVyID8/ICcnIH0sXG4gICAgICB7IGxhYmVsOiAnRGnhu4duIHTDrWNoJywgdmFsdWU6IGRhdGEuYXJlYSA/PyBkYXRhLmxlZ2FsQXJlYSA/PyAnJyB9LFxuICAgIF0uZmlsdGVyKChyb3cpID0+ICEhcm93LnZhbHVlLnRyaW0oKSk7XG5cbiAgICBjb25zdCBhZGRyZXNzUm93czogUGFyY2VsRmllbGRSb3dbXSA9IFtcbiAgICAgIHsgbGFiZWw6ICdYw6MnLCB2YWx1ZTogZGF0YS53YXJkID8/ICcnIH0sXG4gICAgICB7IGxhYmVsOiAnVOG7iW5oJywgdmFsdWU6IGRhdGEucHJvdmluY2UgPz8gJycgfSxcbiAgICBdLmZpbHRlcigocm93KSA9PiAhIXJvdy52YWx1ZS50cmltKCkpO1xuXG4gICAgY29uc3Qgc2VjdGlvbnM6IFBhcmNlbFNlY3Rpb25bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdnZW5lcmFsJyxcbiAgICAgICAgdGl0bGU6ICdUaMO0bmcgdGluIGNodW5nJyxcbiAgICAgICAgaWNvbjogJ2luZm8tY2lyY2xlJyxcbiAgICAgICAgcm93czogZ2VuZXJhbFJvd3MsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ2xhbmRVc2UnLFxuICAgICAgICB0aXRsZTogJ0xv4bqhaSDEkeG6pXQnLFxuICAgICAgICBpY29uOiAnZmlsZS10ZXh0JyxcbiAgICAgICAgdmFsdWU6IGRhdGEubGFuZFVzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiAnYWRkcmVzcycsXG4gICAgICAgIHRpdGxlOiAnxJDhu4thIGNo4buJJyxcbiAgICAgICAgaWNvbjogJ2Vudmlyb25tZW50JyxcbiAgICAgICAgcm93czogYWRkcmVzc1Jvd3MsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ3JlZ2lzdHJhdGlvbicsXG4gICAgICAgIHRpdGxlOiAnVHLhuqFuZyB0aMOhaSDEkcSDbmcga8O9JyxcbiAgICAgICAgaWNvbjogJ3Byb2ZpbGUnLFxuICAgICAgICB2YWx1ZTogZGF0YS5yZWdpc3RyYXRpb25TdGF0dXMsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogJ3ByaWNlJyxcbiAgICAgICAgdGl0bGU6ICdHacOhIMSR4bqldCcsXG4gICAgICAgIGljb246ICdzZWFyY2gnLFxuICAgICAgICB2YWx1ZTogZGF0YS5sYW5kUHJpY2U/LnRyaW0oKSB8fCAnxJBhbmcgY+G6rXAgbmjhuq10JyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiAnZGlhZ3JhbScsXG4gICAgICAgIHRpdGxlOiAnU8ahIMSR4buTIHRo4butYSDEkeG6pXQnLFxuICAgICAgICBpY29uOiAnZ2xvYmFsJyxcbiAgICAgICAgZGlhZ3JhbTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGlmICh0aGlzLmF1ZGllbmNlKCkgPT09ICdzcGVjaWFsaXN0JyAmJiBkYXRhLnNoYXBlSW5mbz8udHJpbSgpKSB7XG4gICAgICBzZWN0aW9ucy5zcGxpY2UoLTEsIDAsIHtcbiAgICAgICAgaWQ6ICdzaGFwZScsXG4gICAgICAgIHRpdGxlOiAnVGjDtG5nIHRpbiBow6xuaCB0aOG7gycsXG4gICAgICAgIGljb246ICdib3JkZXItb3V0ZXInLFxuICAgICAgICB2YWx1ZTogZGF0YS5zaGFwZUluZm8sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hdWRpZW5jZSgpID09PSAnc3BlY2lhbGlzdCcgJiYgZGF0YS5wbGFubmluZ0luZm8/LnRyaW0oKSkge1xuICAgICAgc2VjdGlvbnMuc3BsaWNlKC0xLCAwLCB7XG4gICAgICAgIGlkOiAncGxhbm5pbmcnLFxuICAgICAgICB0aXRsZTogJ1Row7RuZyB0aW4gcXV5IGhv4bqhY2gnLFxuICAgICAgICBpY29uOiAnYmFuaycsXG4gICAgICAgIHZhbHVlOiBkYXRhLnBsYW5uaW5nSW5mbyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXh0cmEgb2YgZGF0YS5leHRyYUZpZWxkcyA/PyBbXSkge1xuICAgICAgaWYgKCFleHRyYS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc2VjdGlvbnMuc3BsaWNlKC0xLCAwLCB7XG4gICAgICAgIGlkOiBgZXh0cmEtJHtleHRyYS5sYWJlbH1gLFxuICAgICAgICB0aXRsZTogZXh0cmEubGFiZWwsXG4gICAgICAgIGljb246ICdmaWxlLXRleHQnLFxuICAgICAgICB2YWx1ZTogZXh0cmEudmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VjdGlvbnMuZmlsdGVyKFxuICAgICAgKHNlY3Rpb24pID0+XG4gICAgICAgIHNlY3Rpb24uZGlhZ3JhbSB8fFxuICAgICAgICAhIXNlY3Rpb24udmFsdWU/LnRyaW0oKSB8fFxuICAgICAgICAoc2VjdGlvbi5yb3dzPy5sZW5ndGggPz8gMCkgPiAwLFxuICAgICk7XG4gIH0pO1xuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMub3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4uc2V0KGZhbHNlKTtcbiAgICB0aGlzLmJhY2suZW1pdCgpO1xuICB9XG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucGFyY2VsKCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuZXhwb3J0Q2xpY2suZW1pdChkYXRhKTtcbiAgICB9XG4gIH1cblxuICBvbkRpYWdyYW1EZXRhaWwoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucGFyY2VsKCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuZGlhZ3JhbUNsaWNrLmVtaXQoZGF0YSk7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKG9wZW4oKSAmJiBwYXJjZWwoKTsgYXMgZGF0YSkge1xuICA8YXNpZGUgY2xhc3M9XCJnZW8tbWFwLXBhcmNlbC1wb3B1cFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsPVwiVGjDtG5nIHRpbiB0aOG7rWEgxJHhuqV0XCI+XG4gICAgPGhlYWRlciBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX19oZWFkZXJcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiZ2VvLW1hcC1wYXJjZWwtcG9wdXBfX2JhY2tcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiUXVheSBs4bqhaVwiXG4gICAgICAgIChjbGljayk9XCJvbkJhY2soKVwiXG4gICAgICA+XG4gICAgICAgIDxnZW8taWNvbiB0eXBlPVwiYXJyb3ctbGVmdFwiIHNpemU9XCJzbVwiIC8+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxoMyBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX190aXRsZVwiPnt7IHRpdGxlKCkgfX08L2gzPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJnZW8tbWFwLXBhcmNlbC1wb3B1cF9fY2xvc2VcIlxuICAgICAgICBhcmlhLWxhYmVsPVwixJDDs25nIGNoaSB0aeG6v3RcIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICA+XG4gICAgICAgIDxnZW8taWNvbiB0eXBlPVwiY2xvc2VcIiBzaXplPVwic21cIiAvPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9oZWFkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLW1hcC1wYXJjZWwtcG9wdXBfX2JvZHlcIj5cbiAgICAgIEBmb3IgKHNlY3Rpb24gb2Ygc2VjdGlvbnMoKTsgdHJhY2sgc2VjdGlvbi5pZCkge1xuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX19zZWN0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX19zZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICAgIDxnZW8taWNvbiBbdHlwZV09XCJzZWN0aW9uLmljb25cIiBzaXplPVwic21cIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBzZWN0aW9uLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIEBpZiAoc2VjdGlvbi5kaWFncmFtKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX19saW5rXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EaWFncmFtRGV0YWlsKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQ2hpIHRp4bq/dFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAoc2VjdGlvbi5yb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkbCBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX19yb3dzXCI+XG4gICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBzZWN0aW9uLnJvd3M7IHRyYWNrIHJvdy5sYWJlbCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXBhcmNlbC1wb3B1cF9fcm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZHQ+e3sgcm93LmxhYmVsIH19OjwvZHQ+XG4gICAgICAgICAgICAgICAgICA8ZGQ+e3sgcm93LnZhbHVlIH19PC9kZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kbD5cbiAgICAgICAgICB9IEBlbHNlIGlmIChzZWN0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImdlby1tYXAtcGFyY2VsLXBvcHVwX192YWx1ZVwiPnt7IHNlY3Rpb24udmFsdWUgfX08L3A+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChzZWN0aW9uLmRpYWdyYW0pIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXBhcmNlbC1wb3B1cF9fZGlhZ3JhbVwiPlxuICAgICAgICAgICAgICBAaWYgKGRhdGEuZGlhZ3JhbVVybCkge1xuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ2VvLW1hcC1wYXJjZWwtcG9wdXBfX2RpYWdyYW0taW1nXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZGF0YS5kaWFncmFtVXJsXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlPGoSDEkeG7kyB0aOG7rWEgxJHhuqV0XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLW1hcC1wYXJjZWwtcG9wdXBfX2RpYWdyYW0tcGxhY2Vob2xkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxnZW8taWNvbiB0eXBlPVwicGljdHVyZVwiIHNpemU9XCJsZ1wiIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5TxqEgxJHhu5MgdGjhu61hIMSR4bqldDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvYXNpZGU+XG59XG4iXX0=
@@ -0,0 +1,182 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, model, output, signal, ViewEncapsulation, } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { GeoButtonComponent } from '../../../geo-button/geo-button.component';
4
+ import { GeoIconComponent } from '../../../geo-icon/geo-icon.component';
5
+ import { GeoInputComponent } from '../../../geo-input/geo-input.component';
6
+ import { GeoPaginationComponent } from '../../../geo-pagination/geo-pagination.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ const MODE_TILES = [
10
+ { id: 'owner', label: 'Chủ sử dụng', icon: 'user' },
11
+ { id: 'certificate', label: 'Giấy chứng nhận', icon: 'file-text' },
12
+ { id: 'coordinates', label: 'Tọa độ', icon: 'aim' },
13
+ { id: 'parcel', label: 'Thửa đất', icon: 'home' },
14
+ { id: 'address', label: 'Địa chỉ', icon: 'environment' },
15
+ ];
16
+ const MODE_HEADINGS = {
17
+ owner: 'Tìm theo chủ sử dụng',
18
+ certificate: 'Tìm theo giấy chứng nhận',
19
+ coordinates: 'Tìm theo tọa độ',
20
+ address: 'Tìm theo địa chỉ',
21
+ parcel: 'Tìm theo thửa đất',
22
+ };
23
+ const MODE_FIELDS = {
24
+ owner: [
25
+ {
26
+ key: 'idNumber',
27
+ label: 'CMND / CCCD',
28
+ placeholder: 'Nhập số CMND/CCCD',
29
+ },
30
+ {
31
+ key: 'ownerName',
32
+ label: 'Tên chủ sử dụng',
33
+ placeholder: 'Nhập tên chủ sử dụng',
34
+ },
35
+ ],
36
+ certificate: [
37
+ {
38
+ key: 'serial',
39
+ label: 'Số serial GCN',
40
+ placeholder: 'Nhập số serial',
41
+ },
42
+ {
43
+ key: 'bookNumber',
44
+ label: 'Số vào sổ',
45
+ placeholder: 'Nhập số vào sổ',
46
+ },
47
+ {
48
+ key: 'dossierCode',
49
+ label: 'Mã hồ sơ gốc',
50
+ placeholder: 'Nhập mã hồ sơ gốc',
51
+ },
52
+ ],
53
+ coordinates: [
54
+ {
55
+ key: 'longitude',
56
+ label: 'Kinh độ',
57
+ placeholder: 'Ví dụ: 108.45',
58
+ type: 'number',
59
+ },
60
+ {
61
+ key: 'latitude',
62
+ label: 'Vĩ độ',
63
+ placeholder: 'Ví dụ: 11.94',
64
+ type: 'number',
65
+ },
66
+ ],
67
+ address: [
68
+ {
69
+ key: 'address',
70
+ label: 'Địa chỉ / tên đường',
71
+ placeholder: 'Nhập địa chỉ hoặc tên đường',
72
+ },
73
+ ],
74
+ parcel: [
75
+ {
76
+ key: 'sheetNumber',
77
+ label: 'Số tờ',
78
+ placeholder: 'Nhập số tờ (VD: 20)',
79
+ },
80
+ {
81
+ key: 'parcelNumber',
82
+ label: 'Số thửa',
83
+ placeholder: 'Nhập số thửa (VD: 19)',
84
+ },
85
+ ],
86
+ };
87
+ /**
88
+ * Map search panel for TCQH.7–11 (host supplies results / API).
89
+ *
90
+ * @summary Panel tra cứu thửa đất theo nhiều tiêu chí.
91
+ * @whenToUse Cổng / màn tra cứu bản đồ quy hoạch.
92
+ * @doNotUseWhen Global site search outside the map context.
93
+ */
94
+ export class GeoMapSearchComponent {
95
+ open = model(false);
96
+ title = input('Tra cứu thông tin quy hoạch theo');
97
+ mode = model('parcel');
98
+ results = input([]);
99
+ loading = input(false);
100
+ pageIndex = model(1);
101
+ pageSize = model(5);
102
+ total = input(0);
103
+ emptyText = input('Chưa có kết quả tra cứu.');
104
+ search = output();
105
+ reset = output();
106
+ resultSelect = output();
107
+ closed = output();
108
+ modeTiles = MODE_TILES;
109
+ values = signal({});
110
+ /** Form dưới lưới icon — thu gọn bằng X cạnh tiêu đề form. */
111
+ formOpen = signal(false);
112
+ hasSearched = signal(false);
113
+ fields = computed(() => MODE_FIELDS[this.mode()] ?? []);
114
+ modeHeading = computed(() => MODE_HEADINGS[this.mode()] ?? 'Tìm kiếm');
115
+ fieldsInline = computed(() => this.fields().length === 2);
116
+ resolvedTotal = computed(() => {
117
+ const total = this.total();
118
+ return total > 0 ? total : this.results().length;
119
+ });
120
+ selectMode(mode) {
121
+ if (this.mode() !== mode) {
122
+ this.mode.set(mode);
123
+ this.values.set({});
124
+ this.hasSearched.set(false);
125
+ }
126
+ this.formOpen.set(true);
127
+ }
128
+ collapseForm() {
129
+ this.formOpen.set(false);
130
+ }
131
+ setField(key, value) {
132
+ this.values.update((current) => ({ ...current, [key]: value }));
133
+ }
134
+ fieldValue(key) {
135
+ return this.values()[key] ?? '';
136
+ }
137
+ submit() {
138
+ this.hasSearched.set(true);
139
+ this.search.emit({
140
+ mode: this.mode(),
141
+ values: { ...this.values() },
142
+ });
143
+ }
144
+ onReset() {
145
+ this.values.set({});
146
+ this.pageIndex.set(1);
147
+ this.hasSearched.set(false);
148
+ this.reset.emit();
149
+ }
150
+ selectResult(item) {
151
+ this.resultSelect.emit(item);
152
+ }
153
+ mapLabel(item) {
154
+ const sheet = item.parcel?.sheetNumber;
155
+ const parcel = item.parcel?.parcelNumber;
156
+ if (sheet || parcel) {
157
+ return `Bản đồ: số tờ ${sheet ?? '—'}, số thửa ${parcel ?? '—'}`;
158
+ }
159
+ return item.title;
160
+ }
161
+ close() {
162
+ this.open.set(false);
163
+ this.formOpen.set(false);
164
+ this.closed.emit();
165
+ }
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
167
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GeoMapSearchComponent, isStandalone: true, selector: "geo-map-search", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, results: { classPropertyName: "results", publicName: "results", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", mode: "modeChange", pageIndex: "pageIndexChange", pageSize: "pageSizeChange", search: "search", reset: "reset", resultSelect: "resultSelect", closed: "closed" }, host: { properties: { "class.geo-map-search-host--open": "open()" }, classAttribute: "geo-map-search-host" }, ngImport: i0, template: "@if (open()) {\n <section class=\"geo-map-search\" aria-label=\"Tra c\u1EE9u th\u00F4ng tin quy ho\u1EA1ch\">\n <header class=\"geo-map-search__header\">\n <h3 class=\"geo-map-search__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn\"\n aria-label=\"\u0110\u00F3ng tra c\u1EE9u\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-search__body\">\n <div class=\"geo-map-search__modes\" role=\"listbox\" aria-label=\"H\u00ECnh th\u1EE9c tra c\u1EE9u\">\n @for (tile of modeTiles; track tile.id) {\n <button\n type=\"button\"\n class=\"geo-map-search__mode\"\n role=\"option\"\n [class.geo-map-search__mode--active]=\"formOpen() && mode() === tile.id\"\n [attr.aria-selected]=\"formOpen() && mode() === tile.id\"\n (click)=\"selectMode(tile.id)\"\n >\n <span class=\"geo-map-search__mode-icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"tile.icon\" size=\"md\" />\n </span>\n <span class=\"geo-map-search__mode-label\">{{ tile.label }}</span>\n </button>\n }\n </div>\n\n @if (formOpen()) {\n <section class=\"geo-map-search__form\" [attr.aria-label]=\"modeHeading()\">\n <div class=\"geo-map-search__form-head\">\n <h4 class=\"geo-map-search__form-title\">{{ modeHeading() }}</h4>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn geo-map-search__icon-btn--sm\"\n aria-label=\"Thu g\u1ECDn form t\u00ECm ki\u1EBFm\"\n (click)=\"collapseForm()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </div>\n\n <div\n class=\"geo-map-search__fields\"\n [class.geo-map-search__fields--inline]=\"fieldsInline()\"\n >\n @for (field of fields(); track field.key) {\n <geo-input\n [label]=\"field.label\"\n [placeholder]=\"field.placeholder\"\n [type]=\"field.type ?? 'text'\"\n [ngModel]=\"fieldValue(field.key)\"\n (ngModelChange)=\"setField(field.key, $event)\"\n (enterPressed)=\"submit()\"\n [allowClear]=\"true\"\n [block]=\"true\"\n />\n }\n </div>\n\n <div class=\"geo-map-search__actions\">\n <geo-button\n appearance=\"primary\"\n icon=\"search\"\n [disabled]=\"loading()\"\n (clicked)=\"submit()\"\n >\n T\u00ECm ki\u1EBFm\n </geo-button>\n <geo-button\n appearance=\"secondary\"\n icon=\"reload\"\n (clicked)=\"onReset()\"\n >\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n </div>\n </section>\n }\n\n @if (formOpen() && (loading() || hasSearched())) {\n <div class=\"geo-map-search__results\" aria-live=\"polite\">\n @if (loading()) {\n <p class=\"geo-map-search__hint\">\u0110ang t\u00ECm ki\u1EBFm\u2026</p>\n } @else if (!results().length) {\n <p class=\"geo-map-search__hint\">{{ emptyText() }}</p>\n } @else {\n <ul class=\"geo-map-search__list\">\n @for (item of results(); track item.id) {\n <li class=\"geo-map-search__result\">\n <div class=\"geo-map-search__result-head\">\n <span class=\"geo-map-search__result-map\">{{ mapLabel(item) }}</span>\n <button\n type=\"button\"\n class=\"geo-map-search__detail-link\"\n (click)=\"selectResult(item)\"\n >\n Chi ti\u1EBFt\n </button>\n </div>\n @if (item.parcel; as parcel) {\n <dl class=\"geo-map-search__result-meta\">\n @if (parcel.ward) {\n <div class=\"geo-map-search__result-row\">\n <dt>X\u00E3:</dt>\n <dd>{{ parcel.ward }}</dd>\n </div>\n }\n @if (parcel.province) {\n <div class=\"geo-map-search__result-row\">\n <dt>T\u1EC9nh:</dt>\n <dd>{{ parcel.province }}</dd>\n </div>\n }\n @if (parcel.area) {\n <div class=\"geo-map-search__result-row\">\n <dt>Di\u1EC7n t\u00EDch:</dt>\n <dd>{{ parcel.area }}</dd>\n </div>\n }\n </dl>\n } @else if (item.subtitle) {\n <p class=\"geo-map-search__result-sub\">{{ item.subtitle }}</p>\n }\n </li>\n }\n </ul>\n\n @if (resolvedTotal() > pageSize()) {\n <geo-pagination\n class=\"geo-map-search__paging\"\n [(pageIndex)]=\"pageIndex\"\n [(pageSize)]=\"pageSize\"\n [total]=\"resolvedTotal()\"\n size=\"small\"\n [simple]=\"true\"\n />\n }\n }\n </div>\n }\n </div>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-search-host{display:none}.geo-map-search-host--open{display:block}.geo-map-search{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(420px,100vw - 32px);max-height:min(640px,82vh);overflow:hidden;display:flex;flex-direction:column}.geo-map-search__header{position:relative;display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 40px 12px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-search__title{margin:0;max-width:100%;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;line-height:1.35;color:var(--geo-color-neutral-900)}.geo-map-search__header .geo-map-search__icon-btn{position:absolute;top:8px;right:8px}.geo-map-search__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-search__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-search__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-search__icon-btn--active,.geo-map-search__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn--icon-only{width:40px;padding:0}.geo-map-search__icon-btn--sm{width:28px;min-width:28px;min-height:28px}.geo-map-search__body{display:flex;flex-direction:column;gap:14px;padding:14px 16px 16px;overflow:auto}.geo-map-search__modes{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 12px}.geo-map-search__mode{display:inline-flex;flex-direction:column;align-items:center;gap:6px;width:104px;padding:0;border:0;background:transparent;cursor:pointer;color:var(--geo-color-primary-default);font:inherit}.geo-map-search__mode:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:var(--geo-radius)}.geo-map-search__mode-icon{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;border:1.5px solid var(--geo-color-primary-default);background:var(--geo-color-primary-soft, var(--geo-color-primary-surface-light));color:var(--geo-color-primary-default);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-search__mode:hover .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-hover)}.geo-map-search__mode--active .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-active);box-shadow:inset 0 0 0 1px var(--geo-color-primary-default)}.geo-map-search__mode-label{text-align:center;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.3;color:var(--geo-color-primary-default)}.geo-map-search__form{display:flex;flex-direction:column;gap:12px;padding-top:4px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-search__form-head{position:relative;display:flex;align-items:center;justify-content:center;min-height:28px;padding:0 28px}.geo-map-search__form-title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);letter-spacing:.03em;color:var(--geo-color-neutral-900)}.geo-map-search__form-head .geo-map-search__icon-btn{position:absolute;top:50%;right:0;transform:translateY(-50%)}.geo-map-search__fields{display:flex;flex-direction:column;gap:10px}.geo-map-search__fields--inline,.geo-map-search__actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.geo-map-search__actions>geo-button{display:block;min-width:0}.geo-map-search__actions .geo-button{width:100%}.geo-map-search__results{display:flex;flex-direction:column;gap:10px;padding-top:4px;border-top:1px solid var(--geo-color-primary-default)}.geo-map-search__hint{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px}.geo-map-search__result{display:flex;flex-direction:column;gap:8px;padding:0}.geo-map-search__result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.geo-map-search__result-map{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.4}.geo-map-search__detail-link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default);text-decoration:none}.geo-map-search__detail-link:hover{text-decoration:underline}.geo-map-search__detail-link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-search__result-meta{margin:0;display:flex;flex-direction:column;gap:4px}.geo-map-search__result-row{display:grid;grid-template-columns:88px 1fr;gap:8px;align-items:baseline}.geo-map-search__result-row dt{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__result-row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-search__result-sub{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__paging{display:flex;justify-content:center;margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: GeoButtonComponent, selector: "geo-button", inputs: ["appearance", "color", "icon", "iconTheme", "iconPlacement", "iconOnly", "type", "disabled", "tooltip", "tooltipPlacement", "active", "title"], outputs: ["clicked"] }, { kind: "component", type: GeoIconComponent, selector: "geo-icon", inputs: ["type", "theme", "spin", "size", "color"] }, { kind: "component", type: GeoInputComponent, selector: "geo-input", inputs: ["label", "placeholder", "type", "disabled", "readonly", "required", "error", "errorMessage", "maxlength", "prefixIcon", "suffixIcon", "allowClear", "block", "width"], outputs: ["valueChange", "enterPressed"] }, { kind: "component", type: GeoPaginationComponent, selector: "geo-pagination", inputs: ["pageIndex", "pageSize", "total", "size", "simple", "hideOnSinglePage", "showSizeChanger", "pageSizeOptions"], outputs: ["pageIndexChange", "pageSizeChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GeoMapSearchComponent, decorators: [{
170
+ type: Component,
171
+ args: [{ selector: 'geo-map-search', standalone: true, imports: [
172
+ FormsModule,
173
+ GeoButtonComponent,
174
+ GeoIconComponent,
175
+ GeoInputComponent,
176
+ GeoPaginationComponent,
177
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
178
+ class: 'geo-map-search-host',
179
+ '[class.geo-map-search-host--open]': 'open()',
180
+ }, template: "@if (open()) {\n <section class=\"geo-map-search\" aria-label=\"Tra c\u1EE9u th\u00F4ng tin quy ho\u1EA1ch\">\n <header class=\"geo-map-search__header\">\n <h3 class=\"geo-map-search__title\">{{ title() }}</h3>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn\"\n aria-label=\"\u0110\u00F3ng tra c\u1EE9u\"\n (click)=\"close()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </header>\n\n <div class=\"geo-map-search__body\">\n <div class=\"geo-map-search__modes\" role=\"listbox\" aria-label=\"H\u00ECnh th\u1EE9c tra c\u1EE9u\">\n @for (tile of modeTiles; track tile.id) {\n <button\n type=\"button\"\n class=\"geo-map-search__mode\"\n role=\"option\"\n [class.geo-map-search__mode--active]=\"formOpen() && mode() === tile.id\"\n [attr.aria-selected]=\"formOpen() && mode() === tile.id\"\n (click)=\"selectMode(tile.id)\"\n >\n <span class=\"geo-map-search__mode-icon\" aria-hidden=\"true\">\n <geo-icon [type]=\"tile.icon\" size=\"md\" />\n </span>\n <span class=\"geo-map-search__mode-label\">{{ tile.label }}</span>\n </button>\n }\n </div>\n\n @if (formOpen()) {\n <section class=\"geo-map-search__form\" [attr.aria-label]=\"modeHeading()\">\n <div class=\"geo-map-search__form-head\">\n <h4 class=\"geo-map-search__form-title\">{{ modeHeading() }}</h4>\n <button\n type=\"button\"\n class=\"geo-map-search__icon-btn geo-map-search__icon-btn--sm\"\n aria-label=\"Thu g\u1ECDn form t\u00ECm ki\u1EBFm\"\n (click)=\"collapseForm()\"\n >\n <geo-icon type=\"close\" size=\"sm\" />\n </button>\n </div>\n\n <div\n class=\"geo-map-search__fields\"\n [class.geo-map-search__fields--inline]=\"fieldsInline()\"\n >\n @for (field of fields(); track field.key) {\n <geo-input\n [label]=\"field.label\"\n [placeholder]=\"field.placeholder\"\n [type]=\"field.type ?? 'text'\"\n [ngModel]=\"fieldValue(field.key)\"\n (ngModelChange)=\"setField(field.key, $event)\"\n (enterPressed)=\"submit()\"\n [allowClear]=\"true\"\n [block]=\"true\"\n />\n }\n </div>\n\n <div class=\"geo-map-search__actions\">\n <geo-button\n appearance=\"primary\"\n icon=\"search\"\n [disabled]=\"loading()\"\n (clicked)=\"submit()\"\n >\n T\u00ECm ki\u1EBFm\n </geo-button>\n <geo-button\n appearance=\"secondary\"\n icon=\"reload\"\n (clicked)=\"onReset()\"\n >\n \u0110\u1EB7t l\u1EA1i\n </geo-button>\n </div>\n </section>\n }\n\n @if (formOpen() && (loading() || hasSearched())) {\n <div class=\"geo-map-search__results\" aria-live=\"polite\">\n @if (loading()) {\n <p class=\"geo-map-search__hint\">\u0110ang t\u00ECm ki\u1EBFm\u2026</p>\n } @else if (!results().length) {\n <p class=\"geo-map-search__hint\">{{ emptyText() }}</p>\n } @else {\n <ul class=\"geo-map-search__list\">\n @for (item of results(); track item.id) {\n <li class=\"geo-map-search__result\">\n <div class=\"geo-map-search__result-head\">\n <span class=\"geo-map-search__result-map\">{{ mapLabel(item) }}</span>\n <button\n type=\"button\"\n class=\"geo-map-search__detail-link\"\n (click)=\"selectResult(item)\"\n >\n Chi ti\u1EBFt\n </button>\n </div>\n @if (item.parcel; as parcel) {\n <dl class=\"geo-map-search__result-meta\">\n @if (parcel.ward) {\n <div class=\"geo-map-search__result-row\">\n <dt>X\u00E3:</dt>\n <dd>{{ parcel.ward }}</dd>\n </div>\n }\n @if (parcel.province) {\n <div class=\"geo-map-search__result-row\">\n <dt>T\u1EC9nh:</dt>\n <dd>{{ parcel.province }}</dd>\n </div>\n }\n @if (parcel.area) {\n <div class=\"geo-map-search__result-row\">\n <dt>Di\u1EC7n t\u00EDch:</dt>\n <dd>{{ parcel.area }}</dd>\n </div>\n }\n </dl>\n } @else if (item.subtitle) {\n <p class=\"geo-map-search__result-sub\">{{ item.subtitle }}</p>\n }\n </li>\n }\n </ul>\n\n @if (resolvedTotal() > pageSize()) {\n <geo-pagination\n class=\"geo-map-search__paging\"\n [(pageIndex)]=\"pageIndex\"\n [(pageSize)]=\"pageSize\"\n [total]=\"resolvedTotal()\"\n size=\"small\"\n [simple]=\"true\"\n />\n }\n }\n </div>\n }\n </div>\n </section>\n}\n", styles: ["@charset \"UTF-8\";.geo-map-search-host{display:none}.geo-map-search-host--open{display:block}.geo-map-search{border:1px solid var(--geo-color-border-default);border-radius:var(--geo-radius-lg);background:var(--geo-color-surface-elevated);box-shadow:var(--geo-shadow-sm);width:min(420px,100vw - 32px);max-height:min(640px,82vh);overflow:hidden;display:flex;flex-direction:column}.geo-map-search__header{position:relative;display:flex;align-items:center;justify-content:center;gap:8px;padding:14px 40px 12px;border-bottom:1px solid var(--geo-color-neutral-100)}.geo-map-search__title{margin:0;max-width:100%;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);letter-spacing:.02em;line-height:1.35;color:var(--geo-color-neutral-900)}.geo-map-search__header .geo-map-search__icon-btn{position:absolute;top:8px;right:8px}.geo-map-search__icon-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-width:40px;min-height:40px;border:0;border-radius:var(--geo-radius);background:transparent;color:var(--geo-color-neutral-700);font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);line-height:1;cursor:pointer;transition:background-color .15s ease,color .15s ease,transform .1s ease;width:32px;min-width:32px;min-height:32px;padding:0;color:var(--geo-color-neutral-500)}.geo-map-search__icon-btn:hover:not(:disabled){background:var(--geo-color-primary-soft-hover);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn:active:not(:disabled){transform:scale(.98)}.geo-map-search__icon-btn:disabled{opacity:.45;cursor:not-allowed}.geo-map-search__icon-btn--active,.geo-map-search__icon-btn--checked{background:var(--geo-color-primary-soft-active);color:var(--geo-color-primary-default)}.geo-map-search__icon-btn--icon-only{width:40px;padding:0}.geo-map-search__icon-btn--sm{width:28px;min-width:28px;min-height:28px}.geo-map-search__body{display:flex;flex-direction:column;gap:14px;padding:14px 16px 16px;overflow:auto}.geo-map-search__modes{display:flex;flex-wrap:wrap;justify-content:center;gap:14px 12px}.geo-map-search__mode{display:inline-flex;flex-direction:column;align-items:center;gap:6px;width:104px;padding:0;border:0;background:transparent;cursor:pointer;color:var(--geo-color-primary-default);font:inherit}.geo-map-search__mode:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:var(--geo-radius)}.geo-map-search__mode-icon{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;border:1.5px solid var(--geo-color-primary-default);background:var(--geo-color-primary-soft, var(--geo-color-primary-surface-light));color:var(--geo-color-primary-default);transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease}.geo-map-search__mode:hover .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-hover)}.geo-map-search__mode--active .geo-map-search__mode-icon{background:var(--geo-color-primary-soft-active);box-shadow:inset 0 0 0 1px var(--geo-color-primary-default)}.geo-map-search__mode-label{text-align:center;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-medium);line-height:1.3;color:var(--geo-color-primary-default)}.geo-map-search__form{display:flex;flex-direction:column;gap:12px;padding-top:4px;border-top:1px solid var(--geo-color-neutral-100)}.geo-map-search__form-head{position:relative;display:flex;align-items:center;justify-content:center;min-height:28px;padding:0 28px}.geo-map-search__form-title{margin:0;text-align:center;text-transform:uppercase;font-size:var(--geo-font-size-caption);font-weight:var(--geo-font-weight-semibold);letter-spacing:.03em;color:var(--geo-color-neutral-900)}.geo-map-search__form-head .geo-map-search__icon-btn{position:absolute;top:50%;right:0;transform:translateY(-50%)}.geo-map-search__fields{display:flex;flex-direction:column;gap:10px}.geo-map-search__fields--inline,.geo-map-search__actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.geo-map-search__actions>geo-button{display:block;min-width:0}.geo-map-search__actions .geo-button{width:100%}.geo-map-search__results{display:flex;flex-direction:column;gap:10px;padding-top:4px;border-top:1px solid var(--geo-color-primary-default)}.geo-map-search__hint{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:10px}.geo-map-search__result{display:flex;flex-direction:column;gap:8px;padding:0}.geo-map-search__result-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.geo-map-search__result-map{font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900);line-height:1.4}.geo-map-search__detail-link{flex-shrink:0;padding:0;border:0;background:transparent;cursor:pointer;font:inherit;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-medium);color:var(--geo-color-primary-default);text-decoration:none}.geo-map-search__detail-link:hover{text-decoration:underline}.geo-map-search__detail-link:focus-visible{outline:2px solid var(--geo-color-primary-default);outline-offset:2px;border-radius:2px}.geo-map-search__result-meta{margin:0;display:flex;flex-direction:column;gap:4px}.geo-map-search__result-row{display:grid;grid-template-columns:88px 1fr;gap:8px;align-items:baseline}.geo-map-search__result-row dt{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__result-row dd{margin:0;font-size:var(--geo-font-size-body-small);font-weight:var(--geo-font-weight-semibold);color:var(--geo-color-neutral-900)}.geo-map-search__result-sub{margin:0;font-size:var(--geo-font-size-caption);color:var(--geo-color-neutral-500)}.geo-map-search__paging{display:flex;justify-content:center;margin-top:2px}\n"] }]
181
+ }] });
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC1zZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1zZWFyY2gvZ2VvLW1hcC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2VvLXVpL3NyYy9saWIvZmlnbWEvZ2VvLW1hcC9jaHJvbWUvZ2VvLW1hcC1zZWFyY2gvZ2VvLW1hcC1zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7QUFvQjFGLE1BQU0sVUFBVSxHQUFxQjtJQUNuQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0lBQ25ELEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtJQUNsRSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUs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TUFBTSxFQUFFLFdBQVcsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQztRQUN6QyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNwQixPQUFPLGlCQUFpQixLQUFLLElBQUksR0FBRyxhQUFhLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO3dHQXRGVSxxQkFBcUI7NEZBQXJCLHFCQUFxQixvK0NDN0lsQyxtbUxBcUpBLDQ2TER2QkksV0FBVywrVkFDWCxrQkFBa0Isc09BQ2xCLGdCQUFnQix5R0FDaEIsaUJBQWlCLGdSQUNqQixzQkFBc0I7OzRGQVdiLHFCQUFxQjtrQkFuQmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQO3dCQUNQLFdBQVc7d0JBQ1gsa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsc0JBQXNCO3FCQUN2QixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDSixLQUFLLEVBQUUscUJBQXFCO3dCQUM1QixtQ0FBbUMsRUFBRSxRQUFRO3FCQUM5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbnB1dCxcbiAgbW9kZWwsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEdlb0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2dlby1idXR0b24vZ2VvLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2VvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2dlby1pY29uL2dlby1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW9JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2dlby1pbnB1dC9nZW8taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEdlb1BhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9nZW8tcGFnaW5hdGlvbi9nZW8tcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUge1xuICBHZW9NYXBTZWFyY2hNb2RlLFxuICBHZW9NYXBTZWFyY2hRdWVyeSxcbiAgR2VvTWFwU2VhcmNoUmVzdWx0SXRlbSxcbn0gZnJvbSAnLi4vLi4vZ2VvLW1hcC50eXBlcyc7XG5cbmludGVyZmFjZSBTZWFyY2hGaWVsZERlZiB7XG4gIGtleTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICB0eXBlPzogJ3RleHQnIHwgJ251bWJlcic7XG59XG5cbmludGVyZmFjZSBTZWFyY2hNb2RlVGlsZSB7XG4gIGlkOiBHZW9NYXBTZWFyY2hNb2RlO1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG59XG5cbmNvbnN0IE1PREVfVElMRVM6IFNlYXJjaE1vZGVUaWxlW10gPSBbXG4gIHsgaWQ6ICdvd25lcicsIGxhYmVsOiAnQ2jhu6cgc+G7rSBk4bulbmcnLCBpY29uOiAndXNlcicgfSxcbiAgeyBpZDogJ2NlcnRpZmljYXRlJywgbGFiZWw6ICdHaeG6pXkgY2jhu6luZyBuaOG6rW4nLCBpY29uOiAnZmlsZS10ZXh0JyB9LFxuICB7IGlkOiAnY29vcmRpbmF0ZXMnLCBsYWJlbDogJ1Thu41hIMSR4buZJywgaWNvbjogJ2FpbScgfSxcbiAgeyBpZDogJ3BhcmNlbCcsIGxhYmVsOiAnVGjhu61hIMSR4bqldCcsIGljb246ICdob21lJyB9LFxuICB7IGlkOiAnYWRkcmVzcycsIGxhYmVsOiAnxJDhu4thIGNo4buJJywgaWNvbjogJ2Vudmlyb25tZW50JyB9LFxuXTtcblxuY29uc3QgTU9ERV9IRUFESU5HUzogUmVjb3JkPEdlb01hcFNlYXJjaE1vZGUsIHN0cmluZz4gPSB7XG4gIG93bmVyOiAnVMOsbSB0aGVvIGNo4bunIHPhu60gZOG7pW5nJyxcbiAgY2VydGlmaWNhdGU6ICdUw6xtIHRoZW8gZ2nhuqV5IGNo4bupbmcgbmjhuq1uJyxcbiAgY29vcmRpbmF0ZXM6ICdUw6xtIHRoZW8gdOG7jWEgxJHhu5knLFxuICBhZGRyZXNzOiAnVMOsbSB0aGVvIMSR4buLYSBjaOG7iScsXG4gIHBhcmNlbDogJ1TDrG0gdGhlbyB0aOG7rWEgxJHhuqV0Jyxcbn07XG5cbmNvbnN0IE1PREVfRklFTERTOiBSZWNvcmQ8R2VvTWFwU2VhcmNoTW9kZSwgU2VhcmNoRmllbGREZWZbXT4gPSB7XG4gIG93bmVyOiBbXG4gICAge1xuICAgICAga2V5OiAnaWROdW1iZXInLFxuICAgICAgbGFiZWw6ICdDTU5EIC8gQ0NDRCcsXG4gICAgICBwbGFjZWhvbGRlcjogJ05o4bqtcCBz4buRIENNTkQvQ0NDRCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdvd25lck5hbWUnLFxuICAgICAgbGFiZWw6ICdUw6puIGNo4bunIHPhu60gZOG7pW5nJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTmjhuq1wIHTDqm4gY2jhu6cgc+G7rSBk4bulbmcnLFxuICAgIH0sXG4gIF0sXG4gIGNlcnRpZmljYXRlOiBbXG4gICAge1xuICAgICAga2V5OiAnc2VyaWFsJyxcbiAgICAgIGxhYmVsOiAnU+G7kSBzZXJpYWwgR0NOJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTmjhuq1wIHPhu5Egc2VyaWFsJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2Jvb2tOdW1iZXInLFxuICAgICAgbGFiZWw6ICdT4buRIHbDoG8gc+G7lScsXG4gICAgICBwbGFjZWhvbGRlcjogJ05o4bqtcCBz4buRIHbDoG8gc+G7lScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdkb3NzaWVyQ29kZScsXG4gICAgICBsYWJlbDogJ03DoyBo4buTIHPGoSBn4buRYycsXG4gICAgICBwbGFjZWhvbGRlcjogJ05o4bqtcCBtw6MgaOG7kyBzxqEgZ+G7kWMnLFxuICAgIH0sXG4gIF0sXG4gIGNvb3JkaW5hdGVzOiBbXG4gICAge1xuICAgICAga2V5OiAnbG9uZ2l0dWRlJyxcbiAgICAgIGxhYmVsOiAnS2luaCDEkeG7mScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1bDrSBk4bulOiAxMDguNDUnLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdsYXRpdHVkZScsXG4gICAgICBsYWJlbDogJ1bEqSDEkeG7mScsXG4gICAgICBwbGFjZWhvbGRlcjogJ1bDrSBk4bulOiAxMS45NCcsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICB9LFxuICBdLFxuICBhZGRyZXNzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWRkcmVzcycsXG4gICAgICBsYWJlbDogJ8SQ4buLYSBjaOG7iSAvIHTDqm4gxJHGsOG7nW5nJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTmjhuq1wIMSR4buLYSBjaOG7iSBob+G6t2MgdMOqbiDEkcaw4budbmcnLFxuICAgIH0sXG4gIF0sXG4gIHBhcmNlbDogW1xuICAgIHtcbiAgICAgIGtleTogJ3NoZWV0TnVtYmVyJyxcbiAgICAgIGxhYmVsOiAnU+G7kSB04budJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnTmjhuq1wIHPhu5EgdOG7nSAoVkQ6IDIwKScsXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdwYXJjZWxOdW1iZXInLFxuICAgICAgbGFiZWw6ICdT4buRIHRo4butYScsXG4gICAgICBwbGFjZWhvbGRlcjogJ05o4bqtcCBz4buRIHRo4butYSAoVkQ6IDE5KScsXG4gICAgfSxcbiAgXSxcbn07XG5cbi8qKlxuICogTWFwIHNlYXJjaCBwYW5lbCBmb3IgVENRSC434oCTMTEgKGhvc3Qgc3VwcGxpZXMgcmVzdWx0cyAvIEFQSSkuXG4gKlxuICogQHN1bW1hcnkgUGFuZWwgdHJhIGPhu6l1IHRo4butYSDEkeG6pXQgdGhlbyBuaGnhu4F1IHRpw6p1IGNow60uXG4gKiBAd2hlblRvVXNlIEPhu5VuZyAvIG3DoG4gdHJhIGPhu6l1IGLhuqNuIMSR4buTIHF1eSBob+G6oWNoLlxuICogQGRvTm90VXNlV2hlbiBHbG9iYWwgc2l0ZSBzZWFyY2ggb3V0c2lkZSB0aGUgbWFwIGNvbnRleHQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dlby1tYXAtc2VhcmNoJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIEdlb0J1dHRvbkNvbXBvbmVudCxcbiAgICBHZW9JY29uQ29tcG9uZW50LFxuICAgIEdlb0lucHV0Q29tcG9uZW50LFxuICAgIEdlb1BhZ2luYXRpb25Db21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9nZW8tbWFwLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9nZW8tbWFwLXNlYXJjaC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdnZW8tbWFwLXNlYXJjaC1ob3N0JyxcbiAgICAnW2NsYXNzLmdlby1tYXAtc2VhcmNoLWhvc3QtLW9wZW5dJzogJ29wZW4oKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEdlb01hcFNlYXJjaENvbXBvbmVudCB7XG4gIHJlYWRvbmx5IG9wZW4gPSBtb2RlbChmYWxzZSk7XG4gIHJlYWRvbmx5IHRpdGxlID0gaW5wdXQoJ1RyYSBj4bupdSB0aMO0bmcgdGluIHF1eSBob+G6oWNoIHRoZW8nKTtcbiAgcmVhZG9ubHkgbW9kZSA9IG1vZGVsPEdlb01hcFNlYXJjaE1vZGU+KCdwYXJjZWwnKTtcbiAgcmVhZG9ubHkgcmVzdWx0cyA9IGlucHV0PEdlb01hcFNlYXJjaFJlc3VsdEl0ZW1bXT4oW10pO1xuICByZWFkb25seSBsb2FkaW5nID0gaW5wdXQoZmFsc2UpO1xuICByZWFkb25seSBwYWdlSW5kZXggPSBtb2RlbCgxKTtcbiAgcmVhZG9ubHkgcGFnZVNpemUgPSBtb2RlbCg1KTtcbiAgcmVhZG9ubHkgdG90YWwgPSBpbnB1dCgwKTtcbiAgcmVhZG9ubHkgZW1wdHlUZXh0ID0gaW5wdXQoJ0NoxrBhIGPDsyBr4bq/dCBxdeG6oyB0cmEgY+G7qXUuJyk7XG5cbiAgcmVhZG9ubHkgc2VhcmNoID0gb3V0cHV0PEdlb01hcFNlYXJjaFF1ZXJ5PigpO1xuICByZWFkb25seSByZXNldCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSByZXN1bHRTZWxlY3QgPSBvdXRwdXQ8R2VvTWFwU2VhcmNoUmVzdWx0SXRlbT4oKTtcbiAgcmVhZG9ubHkgY2xvc2VkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgbW9kZVRpbGVzID0gTU9ERV9USUxFUztcbiAgcmVhZG9ubHkgdmFsdWVzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KTtcbiAgLyoqIEZvcm0gZMaw4bubaSBsxrDhu5tpIGljb24g4oCUIHRodSBn4buNbiBi4bqxbmcgWCBj4bqhbmggdGnDqnUgxJHhu4EgZm9ybS4gKi9cbiAgcmVhZG9ubHkgZm9ybU9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBoYXNTZWFyY2hlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgZmllbGRzID0gY29tcHV0ZWQoKCkgPT4gTU9ERV9GSUVMRFNbdGhpcy5tb2RlKCldID8/IFtdKTtcbiAgcmVhZG9ubHkgbW9kZUhlYWRpbmcgPSBjb21wdXRlZChcbiAgICAoKSA9PiBNT0RFX0hFQURJTkdTW3RoaXMubW9kZSgpXSA/PyAnVMOsbSBraeG6v20nLFxuICApO1xuICByZWFkb25seSBmaWVsZHNJbmxpbmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZpZWxkcygpLmxlbmd0aCA9PT0gMik7XG5cbiAgcmVhZG9ubHkgcmVzb2x2ZWRUb3RhbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWwoKTtcbiAgICByZXR1cm4gdG90YWwgPiAwID8gdG90YWwgOiB0aGlzLnJlc3VsdHMoKS5sZW5ndGg7XG4gIH0pO1xuXG4gIHNlbGVjdE1vZGUobW9kZTogR2VvTWFwU2VhcmNoTW9kZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUoKSAhPT0gbW9kZSkge1xuICAgICAgdGhpcy5tb2RlLnNldChtb2RlKTtcbiAgICAgIHRoaXMudmFsdWVzLnNldCh7fSk7XG4gICAgICB0aGlzLmhhc1NlYXJjaGVkLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuZm9ybU9wZW4uc2V0KHRydWUpO1xuICB9XG5cbiAgY29sbGFwc2VGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybU9wZW4uc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHNldEZpZWxkKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMudXBkYXRlKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBba2V5XTogdmFsdWUgfSkpO1xuICB9XG5cbiAgZmllbGRWYWx1ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzKClba2V5XSA/PyAnJztcbiAgfVxuXG4gIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhc1NlYXJjaGVkLnNldCh0cnVlKTtcbiAgICB0aGlzLnNlYXJjaC5lbWl0KHtcbiAgICAgIG1vZGU6IHRoaXMubW9kZSgpLFxuICAgICAgdmFsdWVzOiB7IC4uLnRoaXMudmFsdWVzKCkgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uUmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZXMuc2V0KHt9KTtcbiAgICB0aGlzLnBhZ2VJbmRleC5zZXQoMSk7XG4gICAgdGhpcy5oYXNTZWFyY2hlZC5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVzZXQuZW1pdCgpO1xuICB9XG5cbiAgc2VsZWN0UmVzdWx0KGl0ZW06IEdlb01hcFNlYXJjaFJlc3VsdEl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLnJlc3VsdFNlbGVjdC5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgbWFwTGFiZWwoaXRlbTogR2VvTWFwU2VhcmNoUmVzdWx0SXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2hlZXQgPSBpdGVtLnBhcmNlbD8uc2hlZXROdW1iZXI7XG4gICAgY29uc3QgcGFyY2VsID0gaXRlbS5wYXJjZWw/LnBhcmNlbE51bWJlcjtcbiAgICBpZiAoc2hlZXQgfHwgcGFyY2VsKSB7XG4gICAgICByZXR1cm4gYELhuqNuIMSR4buTOiBz4buRIHThu50gJHtzaGVldCA/PyAn4oCUJ30sIHPhu5EgdGjhu61hICR7cGFyY2VsID8/ICfigJQnfWA7XG4gICAgfVxuICAgIHJldHVybiBpdGVtLnRpdGxlO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5mb3JtT3Blbi5zZXQoZmFsc2UpO1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxufVxuIiwiQGlmIChvcGVuKCkpIHtcbiAgPHNlY3Rpb24gY2xhc3M9XCJnZW8tbWFwLXNlYXJjaFwiIGFyaWEtbGFiZWw9XCJUcmEgY+G7qXUgdGjDtG5nIHRpbiBxdXkgaG/huqFjaFwiPlxuICAgIDxoZWFkZXIgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9faGVhZGVyXCI+XG4gICAgICA8aDMgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fdGl0bGVcIj57eyB0aXRsZSgpIH19PC9oMz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiZ2VvLW1hcC1zZWFyY2hfX2ljb24tYnRuXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIsSQw7NuZyB0cmEgY+G7qXVcIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICA+XG4gICAgICAgIDxnZW8taWNvbiB0eXBlPVwiY2xvc2VcIiBzaXplPVwic21cIiAvPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9oZWFkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZ2VvLW1hcC1zZWFyY2hfX2JvZHlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fbW9kZXNcIiByb2xlPVwibGlzdGJveFwiIGFyaWEtbGFiZWw9XCJIw6xuaCB0aOG7qWMgdHJhIGPhu6l1XCI+XG4gICAgICAgIEBmb3IgKHRpbGUgb2YgbW9kZVRpbGVzOyB0cmFjayB0aWxlLmlkKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImdlby1tYXAtc2VhcmNoX19tb2RlXCJcbiAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgW2NsYXNzLmdlby1tYXAtc2VhcmNoX19tb2RlLS1hY3RpdmVdPVwiZm9ybU9wZW4oKSAmJiBtb2RlKCkgPT09IHRpbGUuaWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJmb3JtT3BlbigpICYmIG1vZGUoKSA9PT0gdGlsZS5pZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9kZSh0aWxlLmlkKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fbW9kZS1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxnZW8taWNvbiBbdHlwZV09XCJ0aWxlLmljb25cIiBzaXplPVwibWRcIiAvPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fbW9kZS1sYWJlbFwiPnt7IHRpbGUubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKGZvcm1PcGVuKCkpIHtcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fZm9ybVwiIFthdHRyLmFyaWEtbGFiZWxdPVwibW9kZUhlYWRpbmcoKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fZm9ybS1oZWFkXCI+XG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fZm9ybS10aXRsZVwiPnt7IG1vZGVIZWFkaW5nKCkgfX08L2g0PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9faWNvbi1idG4gZ2VvLW1hcC1zZWFyY2hfX2ljb24tYnRuLS1zbVwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUaHUgZ+G7jW4gZm9ybSB0w6xtIGtp4bq/bVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb2xsYXBzZUZvcm0oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxnZW8taWNvbiB0eXBlPVwiY2xvc2VcIiBzaXplPVwic21cIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImdlby1tYXAtc2VhcmNoX19maWVsZHNcIlxuICAgICAgICAgICAgW2NsYXNzLmdlby1tYXAtc2VhcmNoX19maWVsZHMtLWlubGluZV09XCJmaWVsZHNJbmxpbmUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgZmllbGRzKCk7IHRyYWNrIGZpZWxkLmtleSkge1xuICAgICAgICAgICAgICA8Z2VvLWlucHV0XG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImZpZWxkLnR5cGUgPz8gJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWVsZFZhbHVlKGZpZWxkLmtleSlcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldEZpZWxkKGZpZWxkLmtleSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGVudGVyUHJlc3NlZCk9XCJzdWJtaXQoKVwiXG4gICAgICAgICAgICAgICAgW2FsbG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Jsb2NrXT1cInRydWVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdlby1tYXAtc2VhcmNoX19hY3Rpb25zXCI+XG4gICAgICAgICAgICA8Z2VvLWJ1dHRvblxuICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIGljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZygpXCJcbiAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic3VibWl0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBUw6xtIGtp4bq/bVxuICAgICAgICAgICAgPC9nZW8tYnV0dG9uPlxuICAgICAgICAgICAgPGdlby1idXR0b25cbiAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIGljb249XCJyZWxvYWRcIlxuICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblJlc2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICDEkOG6t3QgbOG6oWlcbiAgICAgICAgICAgIDwvZ2VvLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGZvcm1PcGVuKCkgJiYgKGxvYWRpbmcoKSB8fCBoYXNTZWFyY2hlZCgpKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2VvLW1hcC1zZWFyY2hfX3Jlc3VsdHNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9faGludFwiPsSQYW5nIHTDrG0ga2nhur9t4oCmPC9wPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKCFyZXN1bHRzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImdlby1tYXAtc2VhcmNoX19oaW50XCI+e3sgZW1wdHlUZXh0KCkgfX08L3A+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fbGlzdFwiPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHJlc3VsdHMoKTsgdHJhY2sgaXRlbS5pZCkge1xuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdlby1tYXAtc2VhcmNoX19yZXN1bHRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fcmVzdWx0LWhlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fcmVzdWx0LW1hcFwiPnt7IG1hcExhYmVsKGl0ZW0pIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fZGV0YWlsLWxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSZXN1bHQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgQ2hpIHRp4bq/dFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLnBhcmNlbDsgYXMgcGFyY2VsKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkbCBjbGFzcz1cImdlby1tYXAtc2VhcmNoX19yZXN1bHQtbWV0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocGFyY2VsLndhcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fcmVzdWx0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+WMOjOjwvZHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57eyBwYXJjZWwud2FyZCB9fTwvZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChwYXJjZWwucHJvdmluY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fcmVzdWx0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+VOG7iW5oOjwvZHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57eyBwYXJjZWwucHJvdmluY2UgfX08L2RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAocGFyY2VsLmFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnZW8tbWFwLXNlYXJjaF9fcmVzdWx0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHQ+RGnhu4duIHTDrWNoOjwvZHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkZD57eyBwYXJjZWwuYXJlYSB9fTwvZGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGw+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChpdGVtLnN1YnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZ2VvLW1hcC1zZWFyY2hfX3Jlc3VsdC1zdWJcIj57eyBpdGVtLnN1YnRpdGxlIH19PC9wPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG5cbiAgICAgICAgICAgIEBpZiAocmVzb2x2ZWRUb3RhbCgpID4gcGFnZVNpemUoKSkge1xuICAgICAgICAgICAgICA8Z2VvLXBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImdlby1tYXAtc2VhcmNoX19wYWdpbmdcIlxuICAgICAgICAgICAgICAgIFsocGFnZUluZGV4KV09XCJwYWdlSW5kZXhcIlxuICAgICAgICAgICAgICAgIFsocGFnZVNpemUpXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICBbdG90YWxdPVwicmVzb2x2ZWRUb3RhbCgpXCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgIFtzaW1wbGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9zZWN0aW9uPlxufVxuIl19