@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/core/constants/autocomplete.const.d.ts +4 -0
  2. package/core/constants/context-selector.const.d.ts +1 -0
  3. package/core/constants/gantt.const.d.ts +7 -0
  4. package/core/constants/hyperlink.const.d.ts +1 -0
  5. package/core/constants/inline-edit.const.d.ts +4 -0
  6. package/core/constants/kanban.const.d.ts +2 -0
  7. package/core/constants/pin-code-field.const.d.ts +5 -0
  8. package/core/constants/rating-scale.const.d.ts +1 -0
  9. package/core/constants/spotlight.const.d.ts +8 -0
  10. package/core/constants/star-rating.const.d.ts +4 -0
  11. package/core/constants/stepper.const.d.ts +1 -0
  12. package/core/constants/tiered-menu.const.d.ts +3 -0
  13. package/core/types/autocomplete.type.d.ts +9 -0
  14. package/core/types/chat.type.d.ts +12 -0
  15. package/core/types/checkbox-list.type.d.ts +12 -0
  16. package/core/types/gantt.type.d.ts +22 -0
  17. package/core/types/grid-menu.type.d.ts +13 -0
  18. package/core/types/hyperlink.type.d.ts +1 -0
  19. package/core/types/image-cropper.type.d.ts +20 -0
  20. package/core/types/inline-edit.type.d.ts +26 -0
  21. package/core/types/kanban.type.d.ts +36 -0
  22. package/core/types/panel.type.d.ts +16 -0
  23. package/core/types/profile-picture-picker.type.d.ts +9 -0
  24. package/core/types/rating-scale.type.d.ts +5 -0
  25. package/core/types/select-button.type.d.ts +1 -0
  26. package/core/types/spotlight.type.d.ts +34 -0
  27. package/core/types/star-rating.type.d.ts +1 -0
  28. package/core/types/stepper.type.d.ts +20 -0
  29. package/core/types/table-column.type.d.ts +3 -1
  30. package/core/types/table-options.type.d.ts +8 -2
  31. package/core/types/table.type.d.ts +1 -1
  32. package/core/types/tiered-menu.type.d.ts +16 -0
  33. package/core/types/tree.type.d.ts +25 -0
  34. package/core/types/workspace-switch.type.d.ts +6 -0
  35. package/core/utils/body-scroll.util.d.ts +2 -0
  36. package/core/utils/roving-focus.util.d.ts +2 -0
  37. package/core/utils/selection.util.d.ts +3 -0
  38. package/core/utils/tree.util.d.ts +4 -0
  39. package/esm2022/core/constants/autocomplete.const.mjs +5 -0
  40. package/esm2022/core/constants/context-selector.const.mjs +2 -0
  41. package/esm2022/core/constants/gantt.const.mjs +7 -0
  42. package/esm2022/core/constants/hyperlink.const.mjs +2 -1
  43. package/esm2022/core/constants/inline-edit.const.mjs +5 -0
  44. package/esm2022/core/constants/kanban.const.mjs +3 -0
  45. package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
  46. package/esm2022/core/constants/rating-scale.const.mjs +2 -0
  47. package/esm2022/core/constants/spotlight.const.mjs +9 -0
  48. package/esm2022/core/constants/star-rating.const.mjs +5 -0
  49. package/esm2022/core/constants/stepper.const.mjs +2 -0
  50. package/esm2022/core/constants/table.const.mjs +2 -2
  51. package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
  52. package/esm2022/core/types/autocomplete.type.mjs +2 -0
  53. package/esm2022/core/types/chat.type.mjs +2 -0
  54. package/esm2022/core/types/checkbox-list.type.mjs +2 -0
  55. package/esm2022/core/types/gantt.type.mjs +2 -0
  56. package/esm2022/core/types/grid-menu.type.mjs +2 -0
  57. package/esm2022/core/types/hyperlink.type.mjs +1 -1
  58. package/esm2022/core/types/image-cropper.type.mjs +2 -0
  59. package/esm2022/core/types/inline-edit.type.mjs +2 -0
  60. package/esm2022/core/types/kanban.type.mjs +2 -0
  61. package/esm2022/core/types/panel.type.mjs +9 -0
  62. package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
  63. package/esm2022/core/types/rating-scale.type.mjs +2 -0
  64. package/esm2022/core/types/select-button.type.mjs +1 -1
  65. package/esm2022/core/types/spotlight.type.mjs +2 -0
  66. package/esm2022/core/types/star-rating.type.mjs +2 -0
  67. package/esm2022/core/types/stepper.type.mjs +7 -0
  68. package/esm2022/core/types/table-column.type.mjs +1 -1
  69. package/esm2022/core/types/table-options.type.mjs +1 -1
  70. package/esm2022/core/types/table.type.mjs +1 -1
  71. package/esm2022/core/types/tiered-menu.type.mjs +2 -0
  72. package/esm2022/core/types/tree.type.mjs +2 -0
  73. package/esm2022/core/types/workspace-switch.type.mjs +2 -0
  74. package/esm2022/core/utils/body-scroll.util.mjs +19 -0
  75. package/esm2022/core/utils/combobox.util.mjs +3 -2
  76. package/esm2022/core/utils/roving-focus.util.mjs +20 -0
  77. package/esm2022/core/utils/selection.util.mjs +13 -0
  78. package/esm2022/core/utils/string.util.mjs +8 -3
  79. package/esm2022/core/utils/tree.util.mjs +23 -0
  80. package/esm2022/features/accordion/accordion.component.mjs +2 -2
  81. package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
  82. package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
  83. package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
  84. package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
  85. package/esm2022/features/card-list/card/card.component.mjs +63 -99
  86. package/esm2022/features/chat/chat.component.mjs +126 -0
  87. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
  88. package/esm2022/features/combobox/combobox.component.mjs +20 -8
  89. package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
  90. package/esm2022/features/filters/filters.component.mjs +1 -1
  91. package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
  92. package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
  93. package/esm2022/features/gantt/gantt.component.mjs +89 -0
  94. package/esm2022/features/gantt/gantt.engine.mjs +662 -0
  95. package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
  96. package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
  97. package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
  98. package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
  99. package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
  100. package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
  101. package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
  102. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
  103. package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
  104. package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
  105. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
  106. package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
  107. package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
  108. package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
  109. package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
  110. package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
  111. package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
  112. package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
  113. package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
  114. package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
  115. package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
  116. package/esm2022/features/kanban/kanban.component.mjs +198 -0
  117. package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
  118. package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
  119. package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
  120. package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
  121. package/esm2022/features/paginator/paginator.component.mjs +8 -3
  122. package/esm2022/features/panel/panel.component.mjs +43 -11
  123. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
  124. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
  125. package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
  126. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
  127. package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
  128. package/esm2022/features/select-button/select-button.component.mjs +7 -4
  129. package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
  130. package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
  131. package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
  132. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
  133. package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
  134. package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
  135. package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
  136. package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
  137. package/esm2022/features/stepper/stepper.component.mjs +86 -0
  138. package/esm2022/features/switch/switch.component.mjs +12 -8
  139. package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
  140. package/esm2022/features/tab/tab.component.mjs +4 -4
  141. package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
  142. package/esm2022/features/table/table.component.mjs +220 -29
  143. package/esm2022/features/table/utils/table-data.util.mjs +71 -8
  144. package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
  145. package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
  146. package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
  147. package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
  148. package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
  149. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
  150. package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
  151. package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
  152. package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
  153. package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
  154. package/esm2022/features/tree/tree.component.mjs +211 -0
  155. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
  156. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
  157. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
  158. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
  159. package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
  160. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
  161. package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
  162. package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
  163. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
  164. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
  165. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
  166. package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
  167. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
  168. package/esm2022/locales/en.json +351 -3
  169. package/esm2022/locales/es-CO.json +351 -3
  170. package/esm2022/locales/pt.json +351 -3
  171. package/esm2022/providers/features.provider.mjs +40 -4
  172. package/esm2022/public-api.mjs +56 -3
  173. package/features/accordion/accordion.component.d.ts +1 -1
  174. package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
  175. package/features/autocomplete/autocomplete.component.d.ts +102 -0
  176. package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
  177. package/features/card-list/card/card.component.d.ts +14 -34
  178. package/features/chat/chat.component.d.ts +31 -0
  179. package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
  180. package/features/combobox/combobox.component.d.ts +2 -1
  181. package/features/context-selector/context-selector.component.d.ts +37 -0
  182. package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
  183. package/features/gantt/gantt-date.utils.d.ts +36 -0
  184. package/features/gantt/gantt.component.d.ts +24 -0
  185. package/features/gantt/gantt.engine.d.ts +52 -0
  186. package/features/grid-menu/grid-menu.component.d.ts +29 -0
  187. package/features/hyperlink/hyperlink.component.d.ts +2 -1
  188. package/features/image-cropper/image-cropper.component.d.ts +43 -0
  189. package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
  190. package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
  191. package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
  192. package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
  193. package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
  194. package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
  195. package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
  196. package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
  197. package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
  198. package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
  199. package/features/inline-edit/inline-edit.component.d.ts +13 -0
  200. package/features/interactive-content/interactive-content.directive.d.ts +31 -0
  201. package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
  202. package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
  203. package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
  204. package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
  205. package/features/kanban/kanban.component.d.ts +32 -0
  206. package/features/kanban/services/kanban-event.service.d.ts +15 -0
  207. package/features/loading-state/loading-state.component.d.ts +0 -2
  208. package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
  209. package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
  210. package/features/panel/panel.component.d.ts +12 -3
  211. package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
  212. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
  213. package/features/rating-scale/rating-scale.component.d.ts +24 -0
  214. package/features/select-button/select-button.component.d.ts +2 -1
  215. package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
  216. package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
  217. package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
  218. package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
  219. package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
  220. package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
  221. package/features/spotlight/spotlight.component.d.ts +59 -0
  222. package/features/star-rating/star-rating.component.d.ts +26 -0
  223. package/features/stepper/stepper.component.d.ts +23 -0
  224. package/features/switch/switch.component.d.ts +2 -1
  225. package/features/tab/tab.component.d.ts +1 -1
  226. package/features/table/components/table-cell-content.component.d.ts +4 -3
  227. package/features/table/table.component.d.ts +40 -5
  228. package/features/table/utils/table-data.util.d.ts +1 -0
  229. package/features/table/utils/table-layout.util.d.ts +1 -0
  230. package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
  231. package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
  232. package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
  233. package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
  234. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
  235. package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
  236. package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
  237. package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
  238. package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
  239. package/features/tree/tree.component.d.ts +37 -0
  240. package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
  241. package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
  242. package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
  243. package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
  244. package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
  245. package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
  246. package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
  247. package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
  248. package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
  249. package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
  250. package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
  251. package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
  252. package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
  253. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
  254. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  255. package/package.json +8 -8
  256. package/public-api.d.ts +72 -2
  257. package/src/locales/en.json +353 -15
  258. package/src/locales/es-CO.json +352 -14
  259. package/src/locales/pt.json +352 -14
  260. package/styles/sdc-global-variables.scss +1 -1
  261. package/styles.css +1 -1
  262. /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
@@ -0,0 +1,281 @@
1
+ import { EMPTY_VALUE, FILTER_MODE_DOMAIN } from "./visual-sql-editor.constants";
2
+ import { isNumericType } from "./visual-sql-editor-sanitize.util";
3
+ // ---------------------------------------------------------------------------
4
+ // Helper: normalize a field entry (mirrors component's normalizeGeneratedField)
5
+ // ---------------------------------------------------------------------------
6
+ function normalizeGeneratedField(value) {
7
+ if (typeof value === "string") {
8
+ return { column: value };
9
+ }
10
+ return {
11
+ column: value.column,
12
+ alias: value.alias?.trim() ?? EMPTY_VALUE,
13
+ width: value.width?.trim() ?? EMPTY_VALUE,
14
+ function: value.function
15
+ ? {
16
+ functionName: value.function.functionName?.trim() ?? EMPTY_VALUE,
17
+ alias: value.function.alias?.trim() ?? EMPTY_VALUE,
18
+ }
19
+ : null,
20
+ };
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // Leaf helpers (no context dependency)
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * Wraps a SQL string value in single quotes, escaping internal single quotes.
27
+ */
28
+ export function quoteSqlValue(value) {
29
+ return `'${value.replace(/'/g, "''")}'`;
30
+ }
31
+ /**
32
+ * Decorates a string value with % wildcards according to the LIKE operator variant.
33
+ */
34
+ export function decorateLikeValue(operator, value) {
35
+ if (operator === "STARTS_WITH") {
36
+ return `${value}%`;
37
+ }
38
+ if (operator === "ENDS_WITH") {
39
+ return `%${value}`;
40
+ }
41
+ if (operator === "CONTAINS" || operator === "DOES_NOT_CONTAIN") {
42
+ return `%${value}%`;
43
+ }
44
+ return value;
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Context-aware helpers
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Resolves a column option from the context by its value identifier.
51
+ */
52
+ function resolveColumnOption(ctx, value) {
53
+ return ctx.columns.find((item) => item.value === value);
54
+ }
55
+ /**
56
+ * Resolves a table option from the context by its value identifier.
57
+ */
58
+ function resolveTableOption(ctx, value) {
59
+ return ctx.tables.find((item) => item.value === value);
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Exported SQL resolution functions
63
+ // ---------------------------------------------------------------------------
64
+ /**
65
+ * Resolves the SQL fragment for a source table including its alias.
66
+ */
67
+ export function resolveSourceSql(ctx, source) {
68
+ const table = "table" in source ? resolveTableOption(ctx, source.table) : source;
69
+ if (!table) {
70
+ return EMPTY_VALUE;
71
+ }
72
+ const sourceAlias = "table" in source ? source.alias : EMPTY_VALUE;
73
+ const fullName = table.schema ? `${table.schema}.${table.value}` : table.value;
74
+ return sourceAlias ? `${fullName} ${sourceAlias}` : fullName;
75
+ }
76
+ /**
77
+ * Resolves the SQL fragment for a column reference using the source alias.
78
+ */
79
+ export function resolveColumnSql(ctx, value) {
80
+ const column = resolveColumnOption(ctx, value);
81
+ if (!column) {
82
+ return value;
83
+ }
84
+ const alias = ctx.sources.find((item) => item.table === column.table)?.alias;
85
+ const fieldName = column.fullName.split(".").pop() ?? column.value;
86
+ return alias ? `${alias}.${fieldName}` : column.fullName;
87
+ }
88
+ /**
89
+ * Resolves the SQL fragment for an aggregate function call.
90
+ */
91
+ export function resolveFunctionSql(ctx, item) {
92
+ const normalizedFunction = item.functionName.toUpperCase();
93
+ const argument = resolveColumnSql(ctx, item.column);
94
+ const alias = item.alias?.trim();
95
+ return alias
96
+ ? `${normalizedFunction}(${argument}) AS ${alias}`
97
+ : `${normalizedFunction}(${argument})`;
98
+ }
99
+ /**
100
+ * Resolves the SQL fragment for a field (column or function expression) in the SELECT list.
101
+ */
102
+ export function resolveFieldSql(ctx, field) {
103
+ const normalizedField = normalizeGeneratedField(field);
104
+ const fieldSql = resolveColumnSql(ctx, normalizedField.column);
105
+ if (normalizedField.function?.functionName) {
106
+ return resolveFunctionSql(ctx, {
107
+ functionName: normalizedField.function.functionName,
108
+ column: normalizedField.column,
109
+ alias: normalizedField.function.alias?.trim() || // NOSONAR
110
+ normalizedField.alias?.trim() || // NOSONAR
111
+ EMPTY_VALUE,
112
+ });
113
+ }
114
+ const alias = normalizedField.alias?.trim();
115
+ return alias ? `${fieldSql} AS ${alias}` : fieldSql;
116
+ }
117
+ /**
118
+ * Resolves the SQL fragment for a sort item (column or function expression).
119
+ */
120
+ export function resolveSortSql(ctx, item) {
121
+ if (!item.functionName?.trim()) {
122
+ return resolveColumnSql(ctx, item.column);
123
+ }
124
+ return `${item.functionName.trim().toUpperCase()}(${resolveColumnSql(ctx, item.column)})`;
125
+ }
126
+ /**
127
+ * Resolves the SQL comparison operator string for a filter operator key.
128
+ */
129
+ export function resolveFilterOperatorSql(value) {
130
+ return ({
131
+ EQUAL: "=",
132
+ NOT_EQUAL: "<>",
133
+ GREATER: ">",
134
+ GREATER_THAN: ">",
135
+ GREATER_OR_EQUAL: ">=",
136
+ GREATER_THAN_OR_EQUAL: ">=",
137
+ LESS: "<",
138
+ LESS_THAN: "<",
139
+ LESS_OR_EQUAL: "<=",
140
+ LESS_THAN_OR_EQUAL: "<=",
141
+ CONTAINS: "LIKE",
142
+ DOES_NOT_CONTAIN: "NOT LIKE",
143
+ STARTS_WITH: "LIKE",
144
+ ENDS_WITH: "LIKE",
145
+ }[value] ?? value);
146
+ }
147
+ /**
148
+ * Resolves the SQL value fragment for a filter, applying quoting and LIKE decoration.
149
+ */
150
+ export function resolveFilterValueSql(ctx, columnValue, operator, value) {
151
+ const stringValue = String(value ?? EMPTY_VALUE);
152
+ const column = resolveColumnOption(ctx, columnValue);
153
+ if (column?.dataType === "boolean") {
154
+ return stringValue.toLowerCase() === "true" ? "TRUE" : "FALSE";
155
+ }
156
+ if (isNumericType(column?.dataType) && stringValue) {
157
+ return stringValue;
158
+ }
159
+ if (["CONTAINS", "DOES_NOT_CONTAIN", "STARTS_WITH", "ENDS_WITH"].includes(operator)) {
160
+ return quoteSqlValue(decorateLikeValue(operator, stringValue));
161
+ }
162
+ return quoteSqlValue(stringValue);
163
+ }
164
+ /**
165
+ * Resolves the full SQL fragment for a single filter condition.
166
+ */
167
+ export function resolveFilterSql(// NOSONAR - complexity: extraction would risk behavior change
168
+ ctx, filter) {
169
+ if (filter.valueType === FILTER_MODE_DOMAIN) {
170
+ return `(${filter.domainExpression ?? EMPTY_VALUE})`;
171
+ }
172
+ const field = resolveColumnSql(ctx, filter.column);
173
+ if (!field) {
174
+ return EMPTY_VALUE;
175
+ }
176
+ if (filter.operator === "EMPTY") {
177
+ return `${field} IS NULL`;
178
+ }
179
+ if (filter.operator === "NOT_EMPTY") {
180
+ return `${field} IS NOT NULL`;
181
+ }
182
+ if (filter.operator === "IN") {
183
+ const values = (filter.values ?? []).map((item) => resolveFilterValueSql(ctx, filter.column, filter.operator, item));
184
+ return `${field} IN (${values.join(", ")})`;
185
+ }
186
+ if (filter.operator === "BETWEEN") {
187
+ return `${field} BETWEEN ${resolveFilterValueSql(ctx, filter.column, filter.operator, filter.values?.[0])} AND ${resolveFilterValueSql(ctx, filter.column, filter.operator, filter.values?.[1])}`;
188
+ }
189
+ if (filter.valueType === "parameter") {
190
+ return `${field} ${resolveFilterOperatorSql(filter.operator)} :${filter.parameterName ?? EMPTY_VALUE}`;
191
+ }
192
+ return `${field} ${resolveFilterOperatorSql(filter.operator)} ${resolveFilterValueSql(ctx, filter.column, filter.operator, filter.value)}`;
193
+ }
194
+ function resolveJoinOperatorSql(value) {
195
+ return ({
196
+ EQUALS: "=",
197
+ NOT_EQUALS: "<>",
198
+ }[value] ?? value);
199
+ }
200
+ function resolveJoinedTableSql(ctx, item) {
201
+ const targetColumn = resolveColumnOption(ctx, item.targetColumn);
202
+ if (!targetColumn) {
203
+ return EMPTY_VALUE;
204
+ }
205
+ const source = ctx.sources.find((entry) => entry.table === targetColumn.table);
206
+ if (!source) {
207
+ return EMPTY_VALUE;
208
+ }
209
+ return resolveSourceSql(ctx, source);
210
+ }
211
+ /**
212
+ * Resolves the full SQL fragment for a JOIN clause.
213
+ */
214
+ export function resolveJoinSql(ctx, item) {
215
+ return `JOIN ${resolveJoinedTableSql(ctx, item)} ON ${resolveColumnSql(ctx, item.sourceColumn)} ${resolveJoinOperatorSql(item.operator)} ${resolveColumnSql(ctx, item.targetColumn)}`;
216
+ }
217
+ /**
218
+ * Builds the WHERE clause lines for a list of filters.
219
+ * Returns an empty array when no filters are provided.
220
+ */
221
+ export function buildWhereSql(ctx, filters) {
222
+ const expressions = filters
223
+ .map((filter, index) => {
224
+ const connector = index === 0 ? "WHERE" : filter.connector;
225
+ const conditionSql = resolveFilterSql(ctx, filter);
226
+ return conditionSql !== EMPTY_VALUE ? ` ${connector} ${conditionSql}` : EMPTY_VALUE;
227
+ })
228
+ .filter((item) => item !== EMPTY_VALUE);
229
+ return expressions.length ? expressions : [];
230
+ }
231
+ /**
232
+ * Builds the GROUP BY clause lines for a list of column identifiers.
233
+ * Returns an empty array when groupBy is empty.
234
+ */
235
+ export function buildGroupBySql(ctx, groupBy) {
236
+ if (!groupBy.length) {
237
+ return [];
238
+ }
239
+ return [
240
+ "GROUP BY",
241
+ ` ${groupBy.map((item) => resolveColumnSql(ctx, item)).join(",\n ")}`,
242
+ ];
243
+ }
244
+ /**
245
+ * Builds the ORDER BY clause lines for a list of sort items.
246
+ * Returns an empty array when sorting is empty.
247
+ */
248
+ export function buildOrderBySql(ctx, sorting) {
249
+ if (!sorting.length) {
250
+ return [];
251
+ }
252
+ return [
253
+ "ORDER BY",
254
+ ` ${sorting
255
+ .map((item) => `${resolveSortSql(ctx, item)} ${item.direction}`)
256
+ .join(",\n ")}`,
257
+ ];
258
+ }
259
+ /**
260
+ * Builds the complete generated SQL string from the provided config data.
261
+ * Returns an empty string when sources is empty.
262
+ */
263
+ export function buildGeneratedSql(sources, normalizedFields, joins, filters, groupBy, sorting, ctx) {
264
+ if (!sources.length) {
265
+ return EMPTY_VALUE;
266
+ }
267
+ const selectParts = normalizedFields
268
+ .map((field) => resolveFieldSql(ctx, field))
269
+ .filter(Boolean);
270
+ const sql = [
271
+ "SELECT",
272
+ ` ${(selectParts.length ? selectParts : ["*"]).join(",\n ")}`,
273
+ `FROM ${resolveSourceSql(ctx, sources[0])}`,
274
+ ...joins.map((item) => resolveJoinSql(ctx, item)),
275
+ ...buildWhereSql(ctx, filters),
276
+ ...buildGroupBySql(ctx, groupBy),
277
+ ...buildOrderBySql(ctx, sorting),
278
+ ];
279
+ return sql.join("\n");
280
+ }
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3Itc3FsLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Zpc3VhbC1zcWwtZWRpdG9yL3V0aWxzL3Zpc3VhbC1zcWwtZWRpdG9yLXNxbC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFlbEUsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsU0FBUyx1QkFBdUIsQ0FDNUIsS0FBdUM7SUFFdkMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPO1FBQ0gsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7UUFDekMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztRQUN6QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDcEIsQ0FBQyxDQUFDO2dCQUNFLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2dCQUNoRSxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVzthQUNyRDtZQUNELENBQUMsQ0FBQyxJQUFJO0tBQ2IsQ0FBQztBQUNOLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsdUNBQXVDO0FBQ3ZDLDhFQUE4RTtBQUU5RTs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBYTtJQUN2QyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxLQUFhO0lBQzdELElBQUksUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQzdCLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDM0IsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLFFBQVEsS0FBSyxVQUFVLElBQUksUUFBUSxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDN0QsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLHdCQUF3QjtBQUN4Qiw4RUFBOEU7QUFFOUU7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUN4QixHQUFlLEVBQ2YsS0FBYTtJQUViLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDdkIsR0FBZSxFQUNmLEtBQWE7SUFFYixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsb0NBQW9DO0FBQ3BDLDhFQUE4RTtBQUU5RTs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsR0FBZSxFQUNmLE1BQXdFO0lBRXhFLE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDL0UsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQWUsRUFBRSxLQUFhO0lBQzNELE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDVixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzFCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQ3hDLEVBQUUsS0FBSyxDQUFDO0lBQ1QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNuRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDN0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUM5QixHQUFlLEVBQ2YsSUFBZ0M7SUFFaEMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxPQUFPLEtBQUs7UUFDUixDQUFDLENBQUMsR0FBRyxrQkFBa0IsSUFBSSxRQUFRLFFBQVEsS0FBSyxFQUFFO1FBQ2xELENBQUMsQ0FBQyxHQUFHLGtCQUFrQixJQUFJLFFBQVEsR0FBRyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzNCLEdBQWUsRUFDZixLQUF1QztJQUV2QyxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGtCQUFrQixDQUFDLEdBQUcsRUFBRTtZQUMzQixZQUFZLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxZQUFZO1lBQ25ELE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTTtZQUM5QixLQUFLLEVBQ0QsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVTtnQkFDcEQsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVO2dCQUMzQyxXQUFXO1NBQ2xCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzVDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3hELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBZSxFQUFFLElBQTRCO0lBQ3hFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDN0IsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDOUYsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEtBQWE7SUFDbEQsT0FBTyxDQUNGO1FBQ0csS0FBSyxFQUFFLEdBQUc7UUFDVixTQUFTLEVBQUUsSUFBSTtRQUNmLE9BQU8sRUFBRSxHQUFHO1FBQ1osWUFBWSxFQUFFLEdBQUc7UUFDakIsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixxQkFBcUIsRUFBRSxJQUFJO1FBQzNCLElBQUksRUFBRSxHQUFHO1FBQ1QsU0FBUyxFQUFFLEdBQUc7UUFDZCxhQUFhLEVBQUUsSUFBSTtRQUNuQixrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLGdCQUFnQixFQUFFLFVBQVU7UUFDNUIsV0FBVyxFQUFFLE1BQU07UUFDbkIsU0FBUyxFQUFFLE1BQU07S0FDTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FDL0MsQ0FBQztBQUNOLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDakMsR0FBZSxFQUNmLFdBQW1CLEVBQ25CLFFBQWdCLEVBQ2hCLEtBQWM7SUFFZCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRCxJQUFJLE1BQU0sRUFBRSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2pELE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUNJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQ2pGLENBQUM7UUFDQyxPQUFPLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFFLDhEQUE4RDtBQUM1RixHQUFlLEVBQ2YsTUFBZ0M7SUFFaEMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDMUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxXQUFXLEdBQUcsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE9BQU8sR0FBRyxLQUFLLFVBQVUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sR0FBRyxLQUFLLGNBQWMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzNCLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM5QyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUNuRSxDQUFDO1FBQ0YsT0FBTyxHQUFHLEtBQUssUUFBUSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEdBQUcsS0FBSyxZQUFZLHFCQUFxQixDQUM1QyxHQUFHLEVBQ0gsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsUUFBUSxFQUNmLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDckIsUUFBUSxxQkFBcUIsQ0FDMUIsR0FBRyxFQUNILE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLFFBQVEsRUFDZixNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3JCLEVBQUUsQ0FBQztJQUNSLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDbkMsT0FBTyxHQUFHLEtBQUssSUFBSSx3QkFBd0IsQ0FDdkMsTUFBTSxDQUFDLFFBQVEsQ0FDbEIsS0FBSyxNQUFNLENBQUMsYUFBYSxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFDRCxPQUFPLEdBQUcsS0FBSyxJQUFJLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsQ0FDakYsR0FBRyxFQUNILE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLFFBQVEsRUFDZixNQUFNLENBQUMsS0FBSyxDQUNmLEVBQUUsQ0FBQztBQUNSLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWE7SUFDekMsT0FBTyxDQUNGO1FBQ0csTUFBTSxFQUFFLEdBQUc7UUFDWCxVQUFVLEVBQUUsSUFBSTtLQUNRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUMvQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsR0FBZSxFQUFFLElBQTRCO0lBQ3hFLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hCLE9BQU8sV0FBVyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBZSxFQUFFLElBQTRCO0lBQ3hFLE9BQU8sUUFBUSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sZ0JBQWdCLENBQ2xFLEdBQUcsRUFDSCxJQUFJLENBQUMsWUFBWSxDQUNwQixJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7QUFDN0YsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQ3pCLEdBQWUsRUFDZixPQUFtQztJQUVuQyxNQUFNLFdBQVcsR0FBRyxPQUFPO1NBQ3RCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNuQixNQUFNLFNBQVMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE9BQU8sWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztJQUN6RixDQUFDLENBQUM7U0FDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQztJQUM1QyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEdBQWUsRUFBRSxPQUFpQjtJQUM5RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU87UUFDSCxVQUFVO1FBQ1YsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7S0FDMUUsQ0FBQztBQUNOLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUMzQixHQUFlLEVBQ2YsT0FBaUM7SUFFakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPO1FBQ0gsVUFBVTtRQUNWLEtBQUssT0FBTzthQUNQLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUMvRCxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7S0FDdkIsQ0FBQztBQUNOLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLE9BQW1DLEVBQ25DLGdCQUEyQyxFQUMzQyxLQUErQixFQUMvQixPQUFtQyxFQUNuQyxPQUFpQixFQUNqQixPQUFpQyxFQUNqQyxHQUFlO0lBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCO1NBQy9CLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsTUFBTSxHQUFHLEdBQUc7UUFDUixRQUFRO1FBQ1IsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMvRCxRQUFRLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMzQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztRQUM5QixHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO1FBQ2hDLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7S0FDbkMsQ0FBQztJQUNGLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICAgIER5bmFtaWNWaWV3QnVpbGRlckNvbHVtbk9wdGlvbixcbiAgICBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCxcbiAgICBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIsXG4gICAgRHluYW1pY1ZpZXdCdWlsZGVyRnVuY3Rpb24sXG4gICAgRHluYW1pY1ZpZXdCdWlsZGVySm9pbixcbiAgICBEeW5hbWljVmlld0J1aWxkZXJTb3J0LFxuICAgIER5bmFtaWNWaWV3QnVpbGRlclNvdXJjZSxcbiAgICBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbixcbn0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvdHlwZXMvZHluYW1pYy12aWV3LWJ1aWxkZXIudHlwZVwiO1xuaW1wb3J0IHsgRU1QVFlfVkFMVUUsIEZJTFRFUl9NT0RFX0RPTUFJTiB9IGZyb20gXCIuL3Zpc3VhbC1zcWwtZWRpdG9yLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNOdW1lcmljVHlwZSB9IGZyb20gXCIuL3Zpc3VhbC1zcWwtZWRpdG9yLXNhbml0aXplLnV0aWxcIjtcblxuLyoqXG4gKiBDb250ZXh0IG9iamVjdCBjYXJyeWluZyB0aGUgcmVzb2x2ZWQgY29uZmlnIGRhdGEgbmVlZGVkIGJ5IFNRTCBnZW5lcmF0aW9uIGZ1bmN0aW9ucy5cbiAqIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyB1dGlsIGFyZSBwdXJlIHdpdGggcmVzcGVjdCB0byB0aGlzIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3FsQ29udGV4dCB7XG4gICAgLyoqIEF2YWlsYWJsZSBjb2x1bW4gb3B0aW9ucyBmcm9tIGNvbmZpZy5hdmFpbGFibGVEYXRhLmNvbHVtbnMgKi9cbiAgICBjb2x1bW5zOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXTtcbiAgICAvKiogQXZhaWxhYmxlIHRhYmxlIG9wdGlvbnMgZnJvbSBjb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgKi9cbiAgICB0YWJsZXM6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uW107XG4gICAgLyoqIFNlbGVjdGVkIHNvdXJjZXMgZnJvbSBjb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMgKi9cbiAgICBzb3VyY2VzOiBEeW5hbWljVmlld0J1aWxkZXJTb3VyY2VbXTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXI6IG5vcm1hbGl6ZSBhIGZpZWxkIGVudHJ5IChtaXJyb3JzIGNvbXBvbmVudCdzIG5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBub3JtYWxpemVHZW5lcmF0ZWRGaWVsZChcbiAgICB2YWx1ZTogc3RyaW5nIHwgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRcbik6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB7IGNvbHVtbjogdmFsdWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uOiB2YWx1ZS5jb2x1bW4sXG4gICAgICAgIGFsaWFzOiB2YWx1ZS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB3aWR0aDogdmFsdWUud2lkdGg/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgZnVuY3Rpb246IHZhbHVlLmZ1bmN0aW9uXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IHZhbHVlLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgICAgICAgIGFsaWFzOiB2YWx1ZS5mdW5jdGlvbi5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTGVhZiBoZWxwZXJzIChubyBjb250ZXh0IGRlcGVuZGVuY3kpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBXcmFwcyBhIFNRTCBzdHJpbmcgdmFsdWUgaW4gc2luZ2xlIHF1b3RlcywgZXNjYXBpbmcgaW50ZXJuYWwgc2luZ2xlIHF1b3Rlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlU3FsVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAnJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG59XG5cbi8qKlxuICogRGVjb3JhdGVzIGEgc3RyaW5nIHZhbHVlIHdpdGggJSB3aWxkY2FyZHMgYWNjb3JkaW5nIHRvIHRoZSBMSUtFIG9wZXJhdG9yIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvcmF0ZUxpa2VWYWx1ZShvcGVyYXRvcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiU1RBUlRTX1dJVEhcIikge1xuICAgICAgICByZXR1cm4gYCR7dmFsdWV9JWA7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJFTkRTX1dJVEhcIikge1xuICAgICAgICByZXR1cm4gYCUke3ZhbHVlfWA7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJDT05UQUlOU1wiIHx8IG9wZXJhdG9yID09PSBcIkRPRVNfTk9UX0NPTlRBSU5cIikge1xuICAgICAgICByZXR1cm4gYCUke3ZhbHVlfSVgO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29udGV4dC1hd2FyZSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGNvbHVtbiBvcHRpb24gZnJvbSB0aGUgY29udGV4dCBieSBpdHMgdmFsdWUgaWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNvbHVtbk9wdGlvbihcbiAgICBjdHg6IFNxbENvbnRleHQsXG4gICAgdmFsdWU6IHN0cmluZ1xuKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY3R4LmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdmFsdWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdGFibGUgb3B0aW9uIGZyb20gdGhlIGNvbnRleHQgYnkgaXRzIHZhbHVlIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUYWJsZU9wdGlvbihcbiAgICBjdHg6IFNxbENvbnRleHQsXG4gICAgdmFsdWU6IHN0cmluZ1xuKTogRHluYW1pY1ZpZXdCdWlsZGVyVGFibGVPcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjdHgudGFibGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBvcnRlZCBTUUwgcmVzb2x1dGlvbiBmdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBTUUwgZnJhZ21lbnQgZm9yIGEgc291cmNlIHRhYmxlIGluY2x1ZGluZyBpdHMgYWxpYXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU291cmNlU3FsKFxuICAgIGN0eDogU3FsQ29udGV4dCxcbiAgICBzb3VyY2U6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uIHwgeyB0YWJsZTogc3RyaW5nOyBhbGlhczogc3RyaW5nIH1cbik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFibGUgPSBcInRhYmxlXCIgaW4gc291cmNlID8gcmVzb2x2ZVRhYmxlT3B0aW9uKGN0eCwgc291cmNlLnRhYmxlKSA6IHNvdXJjZTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlQWxpYXMgPSBcInRhYmxlXCIgaW4gc291cmNlID8gc291cmNlLmFsaWFzIDogRU1QVFlfVkFMVUU7XG4gICAgY29uc3QgZnVsbE5hbWUgPSB0YWJsZS5zY2hlbWEgPyBgJHt0YWJsZS5zY2hlbWF9LiR7dGFibGUudmFsdWV9YCA6IHRhYmxlLnZhbHVlO1xuICAgIHJldHVybiBzb3VyY2VBbGlhcyA/IGAke2Z1bGxOYW1lfSAke3NvdXJjZUFsaWFzfWAgOiBmdWxsTmFtZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgU1FMIGZyYWdtZW50IGZvciBhIGNvbHVtbiByZWZlcmVuY2UgdXNpbmcgdGhlIHNvdXJjZSBhbGlhcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb2x1bW5TcWwoY3R4OiBTcWxDb250ZXh0LCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW4gPSByZXNvbHZlQ29sdW1uT3B0aW9uKGN0eCwgdmFsdWUpO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgYWxpYXMgPSBjdHguc291cmNlcy5maW5kKFxuICAgICAgICAoaXRlbSkgPT4gaXRlbS50YWJsZSA9PT0gY29sdW1uLnRhYmxlXG4gICAgKT8uYWxpYXM7XG4gICAgY29uc3QgZmllbGROYW1lID0gY29sdW1uLmZ1bGxOYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyBjb2x1bW4udmFsdWU7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7YWxpYXN9LiR7ZmllbGROYW1lfWAgOiBjb2x1bW4uZnVsbE5hbWU7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFNRTCBmcmFnbWVudCBmb3IgYW4gYWdncmVnYXRlIGZ1bmN0aW9uIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRnVuY3Rpb25TcWwoXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uXG4pOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGdW5jdGlvbiA9IGl0ZW0uZnVuY3Rpb25OYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgYXJndW1lbnQgPSByZXNvbHZlQ29sdW1uU3FsKGN0eCwgaXRlbS5jb2x1bW4pO1xuICAgIGNvbnN0IGFsaWFzID0gaXRlbS5hbGlhcz8udHJpbSgpO1xuICAgIHJldHVybiBhbGlhc1xuICAgICAgICA/IGAke25vcm1hbGl6ZWRGdW5jdGlvbn0oJHthcmd1bWVudH0pIEFTICR7YWxpYXN9YFxuICAgICAgICA6IGAke25vcm1hbGl6ZWRGdW5jdGlvbn0oJHthcmd1bWVudH0pYDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgU1FMIGZyYWdtZW50IGZvciBhIGZpZWxkIChjb2x1bW4gb3IgZnVuY3Rpb24gZXhwcmVzc2lvbikgaW4gdGhlIFNFTEVDVCBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZpZWxkU3FsKFxuICAgIGN0eDogU3FsQ29udGV4dCxcbiAgICBmaWVsZDogc3RyaW5nIHwgRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRcbik6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gbm9ybWFsaXplR2VuZXJhdGVkRmllbGQoZmllbGQpO1xuICAgIGNvbnN0IGZpZWxkU3FsID0gcmVzb2x2ZUNvbHVtblNxbChjdHgsIG5vcm1hbGl6ZWRGaWVsZC5jb2x1bW4pO1xuICAgIGlmIChub3JtYWxpemVkRmllbGQuZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uU3FsKGN0eCwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBub3JtYWxpemVkRmllbGQuZnVuY3Rpb24uZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgY29sdW1uOiBub3JtYWxpemVkRmllbGQuY29sdW1uLFxuICAgICAgICAgICAgYWxpYXM6XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEZpZWxkLmZ1bmN0aW9uLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRGaWVsZC5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVJcbiAgICAgICAgICAgICAgICBFTVBUWV9WQUxVRSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFsaWFzID0gbm9ybWFsaXplZEZpZWxkLmFsaWFzPy50cmltKCk7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7ZmllbGRTcWx9IEFTICR7YWxpYXN9YCA6IGZpZWxkU3FsO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBTUUwgZnJhZ21lbnQgZm9yIGEgc29ydCBpdGVtIChjb2x1bW4gb3IgZnVuY3Rpb24gZXhwcmVzc2lvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU29ydFNxbChjdHg6IFNxbENvbnRleHQsIGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlclNvcnQpOiBzdHJpbmcge1xuICAgIGlmICghaXRlbS5mdW5jdGlvbk5hbWU/LnRyaW0oKSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUNvbHVtblNxbChjdHgsIGl0ZW0uY29sdW1uKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2l0ZW0uZnVuY3Rpb25OYW1lLnRyaW0oKS50b1VwcGVyQ2FzZSgpfSgke3Jlc29sdmVDb2x1bW5TcWwoY3R4LCBpdGVtLmNvbHVtbil9KWA7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFNRTCBjb21wYXJpc29uIG9wZXJhdG9yIHN0cmluZyBmb3IgYSBmaWx0ZXIgb3BlcmF0b3Iga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlck9wZXJhdG9yU3FsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICAgICh7XG4gICAgICAgICAgICBFUVVBTDogXCI9XCIsXG4gICAgICAgICAgICBOT1RfRVFVQUw6IFwiPD5cIixcbiAgICAgICAgICAgIEdSRUFURVI6IFwiPlwiLFxuICAgICAgICAgICAgR1JFQVRFUl9USEFOOiBcIj5cIixcbiAgICAgICAgICAgIEdSRUFURVJfT1JfRVFVQUw6IFwiPj1cIixcbiAgICAgICAgICAgIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogXCI+PVwiLFxuICAgICAgICAgICAgTEVTUzogXCI8XCIsXG4gICAgICAgICAgICBMRVNTX1RIQU46IFwiPFwiLFxuICAgICAgICAgICAgTEVTU19PUl9FUVVBTDogXCI8PVwiLFxuICAgICAgICAgICAgTEVTU19USEFOX09SX0VRVUFMOiBcIjw9XCIsXG4gICAgICAgICAgICBDT05UQUlOUzogXCJMSUtFXCIsXG4gICAgICAgICAgICBET0VTX05PVF9DT05UQUlOOiBcIk5PVCBMSUtFXCIsXG4gICAgICAgICAgICBTVEFSVFNfV0lUSDogXCJMSUtFXCIsXG4gICAgICAgICAgICBFTkRTX1dJVEg6IFwiTElLRVwiLFxuICAgICAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW3ZhbHVlXSA/PyB2YWx1ZVxuICAgICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFNRTCB2YWx1ZSBmcmFnbWVudCBmb3IgYSBmaWx0ZXIsIGFwcGx5aW5nIHF1b3RpbmcgYW5kIExJS0UgZGVjb3JhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICBjdHg6IFNxbENvbnRleHQsXG4gICAgY29sdW1uVmFsdWU6IHN0cmluZyxcbiAgICBvcGVyYXRvcjogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duXG4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKHZhbHVlID8/IEVNUFRZX1ZBTFVFKTtcbiAgICBjb25zdCBjb2x1bW4gPSByZXNvbHZlQ29sdW1uT3B0aW9uKGN0eCwgY29sdW1uVmFsdWUpO1xuICAgIGlmIChjb2x1bW4/LmRhdGFUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIgPyBcIlRSVUVcIiA6IFwiRkFMU0VcIjtcbiAgICB9XG4gICAgaWYgKGlzTnVtZXJpY1R5cGUoY29sdW1uPy5kYXRhVHlwZSkgJiYgc3RyaW5nVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAgIFtcIkNPTlRBSU5TXCIsIFwiRE9FU19OT1RfQ09OVEFJTlwiLCBcIlNUQVJUU19XSVRIXCIsIFwiRU5EU19XSVRIXCJdLmluY2x1ZGVzKG9wZXJhdG9yKVxuICAgICkge1xuICAgICAgICByZXR1cm4gcXVvdGVTcWxWYWx1ZShkZWNvcmF0ZUxpa2VWYWx1ZShvcGVyYXRvciwgc3RyaW5nVmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1b3RlU3FsVmFsdWUoc3RyaW5nVmFsdWUpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBmdWxsIFNRTCBmcmFnbWVudCBmb3IgYSBzaW5nbGUgZmlsdGVyIGNvbmRpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGaWx0ZXJTcWwoIC8vIE5PU09OQVIgLSBjb21wbGV4aXR5OiBleHRyYWN0aW9uIHdvdWxkIHJpc2sgYmVoYXZpb3IgY2hhbmdlXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIGZpbHRlcjogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyXG4pOiBzdHJpbmcge1xuICAgIGlmIChmaWx0ZXIudmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgICAgcmV0dXJuIGAoJHtmaWx0ZXIuZG9tYWluRXhwcmVzc2lvbiA/PyBFTVBUWV9WQUxVRX0pYDtcbiAgICB9XG4gICAgY29uc3QgZmllbGQgPSByZXNvbHZlQ29sdW1uU3FsKGN0eCwgZmlsdGVyLmNvbHVtbik7XG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIub3BlcmF0b3IgPT09IFwiRU1QVFlcIikge1xuICAgICAgICByZXR1cm4gYCR7ZmllbGR9IElTIE5VTExgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIk5PVF9FTVBUWVwiKSB7XG4gICAgICAgIHJldHVybiBgJHtmaWVsZH0gSVMgTk9UIE5VTExgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIklOXCIpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gKGZpbHRlci52YWx1ZXMgPz8gW10pLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICAgIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbChjdHgsIGZpbHRlci5jb2x1bW4sIGZpbHRlci5vcGVyYXRvciwgaXRlbSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGAke2ZpZWxkfSBJTiAoJHt2YWx1ZXMuam9pbihcIiwgXCIpfSlgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIikge1xuICAgICAgICByZXR1cm4gYCR7ZmllbGR9IEJFVFdFRU4gJHtyZXNvbHZlRmlsdGVyVmFsdWVTcWwoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBmaWx0ZXIuY29sdW1uLFxuICAgICAgICAgICAgZmlsdGVyLm9wZXJhdG9yLFxuICAgICAgICAgICAgZmlsdGVyLnZhbHVlcz8uWzBdXG4gICAgICAgICl9IEFORCAke3Jlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIGZpbHRlci5jb2x1bW4sXG4gICAgICAgICAgICBmaWx0ZXIub3BlcmF0b3IsXG4gICAgICAgICAgICBmaWx0ZXIudmFsdWVzPy5bMV1cbiAgICAgICAgKX1gO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnZhbHVlVHlwZSA9PT0gXCJwYXJhbWV0ZXJcIikge1xuICAgICAgICByZXR1cm4gYCR7ZmllbGR9ICR7cmVzb2x2ZUZpbHRlck9wZXJhdG9yU3FsKFxuICAgICAgICAgICAgZmlsdGVyLm9wZXJhdG9yXG4gICAgICAgICl9IDoke2ZpbHRlci5wYXJhbWV0ZXJOYW1lID8/IEVNUFRZX1ZBTFVFfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtmaWVsZH0gJHtyZXNvbHZlRmlsdGVyT3BlcmF0b3JTcWwoZmlsdGVyLm9wZXJhdG9yKX0gJHtyZXNvbHZlRmlsdGVyVmFsdWVTcWwoXG4gICAgICAgIGN0eCxcbiAgICAgICAgZmlsdGVyLmNvbHVtbixcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yLFxuICAgICAgICBmaWx0ZXIudmFsdWVcbiAgICApfWA7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVKb2luT3BlcmF0b3JTcWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKHtcbiAgICAgICAgICAgIEVRVUFMUzogXCI9XCIsXG4gICAgICAgICAgICBOT1RfRVFVQUxTOiBcIjw+XCIsXG4gICAgICAgIH0gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbdmFsdWVdID8/IHZhbHVlXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUpvaW5lZFRhYmxlU3FsKGN0eDogU3FsQ29udGV4dCwgaXRlbTogRHluYW1pY1ZpZXdCdWlsZGVySm9pbik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gcmVzb2x2ZUNvbHVtbk9wdGlvbihjdHgsIGl0ZW0udGFyZ2V0Q29sdW1uKTtcbiAgICBpZiAoIXRhcmdldENvbHVtbikge1xuICAgICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IGN0eC5zb3VyY2VzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS50YWJsZSA9PT0gdGFyZ2V0Q29sdW1uLnRhYmxlKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlU291cmNlU3FsKGN0eCwgc291cmNlKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZnVsbCBTUUwgZnJhZ21lbnQgZm9yIGEgSk9JTiBjbGF1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSm9pblNxbChjdHg6IFNxbENvbnRleHQsIGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlckpvaW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBgSk9JTiAke3Jlc29sdmVKb2luZWRUYWJsZVNxbChjdHgsIGl0ZW0pfSBPTiAke3Jlc29sdmVDb2x1bW5TcWwoXG4gICAgICAgIGN0eCxcbiAgICAgICAgaXRlbS5zb3VyY2VDb2x1bW5cbiAgICApfSAke3Jlc29sdmVKb2luT3BlcmF0b3JTcWwoaXRlbS5vcGVyYXRvcil9ICR7cmVzb2x2ZUNvbHVtblNxbChjdHgsIGl0ZW0udGFyZ2V0Q29sdW1uKX1gO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgV0hFUkUgY2xhdXNlIGxpbmVzIGZvciBhIGxpc3Qgb2YgZmlsdGVycy5cbiAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgd2hlbiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV2hlcmVTcWwoXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIGZpbHRlcnM6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlcltdXG4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSBmaWx0ZXJzXG4gICAgICAgIC5tYXAoKGZpbHRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3RvciA9IGluZGV4ID09PSAwID8gXCJXSEVSRVwiIDogZmlsdGVyLmNvbm5lY3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblNxbCA9IHJlc29sdmVGaWx0ZXJTcWwoY3R4LCBmaWx0ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvblNxbCAhPT0gRU1QVFlfVkFMVUUgPyBgICAke2Nvbm5lY3Rvcn0gJHtjb25kaXRpb25TcWx9YCA6IEVNUFRZX1ZBTFVFO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBFTVBUWV9WQUxVRSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25zLmxlbmd0aCA/IGV4cHJlc3Npb25zIDogW107XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBHUk9VUCBCWSBjbGF1c2UgbGluZXMgZm9yIGEgbGlzdCBvZiBjb2x1bW4gaWRlbnRpZmllcnMuXG4gKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IHdoZW4gZ3JvdXBCeSBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR3JvdXBCeVNxbChjdHg6IFNxbENvbnRleHQsIGdyb3VwQnk6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGlmICghZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBcIkdST1VQIEJZXCIsXG4gICAgICAgIGAgICR7Z3JvdXBCeS5tYXAoKGl0ZW0pID0+IHJlc29sdmVDb2x1bW5TcWwoY3R4LCBpdGVtKSkuam9pbihcIixcXG4gIFwiKX1gLFxuICAgIF07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBPUkRFUiBCWSBjbGF1c2UgbGluZXMgZm9yIGEgbGlzdCBvZiBzb3J0IGl0ZW1zLlxuICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSB3aGVuIHNvcnRpbmcgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE9yZGVyQnlTcWwoXG4gICAgY3R4OiBTcWxDb250ZXh0LFxuICAgIHNvcnRpbmc6IER5bmFtaWNWaWV3QnVpbGRlclNvcnRbXVxuKTogc3RyaW5nW10ge1xuICAgIGlmICghc29ydGluZy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgICBcIk9SREVSIEJZXCIsXG4gICAgICAgIGAgICR7c29ydGluZ1xuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gYCR7cmVzb2x2ZVNvcnRTcWwoY3R4LCBpdGVtKX0gJHtpdGVtLmRpcmVjdGlvbn1gKVxuICAgICAgICAgICAgLmpvaW4oXCIsXFxuICBcIil9YCxcbiAgICBdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tcGxldGUgZ2VuZXJhdGVkIFNRTCBzdHJpbmcgZnJvbSB0aGUgcHJvdmlkZWQgY29uZmlnIGRhdGEuXG4gKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIHNvdXJjZXMgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbmVyYXRlZFNxbChcbiAgICBzb3VyY2VzOiBEeW5hbWljVmlld0J1aWxkZXJTb3VyY2VbXSxcbiAgICBub3JtYWxpemVkRmllbGRzOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFtdLFxuICAgIGpvaW5zOiBEeW5hbWljVmlld0J1aWxkZXJKb2luW10sXG4gICAgZmlsdGVyczogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyW10sXG4gICAgZ3JvdXBCeTogc3RyaW5nW10sXG4gICAgc29ydGluZzogRHluYW1pY1ZpZXdCdWlsZGVyU29ydFtdLFxuICAgIGN0eDogU3FsQ29udGV4dFxuKTogc3RyaW5nIHtcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0UGFydHMgPSBub3JtYWxpemVkRmllbGRzXG4gICAgICAgIC5tYXAoKGZpZWxkKSA9PiByZXNvbHZlRmllbGRTcWwoY3R4LCBmaWVsZCkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3Qgc3FsID0gW1xuICAgICAgICBcIlNFTEVDVFwiLFxuICAgICAgICBgICAkeyhzZWxlY3RQYXJ0cy5sZW5ndGggPyBzZWxlY3RQYXJ0cyA6IFtcIipcIl0pLmpvaW4oXCIsXFxuICBcIil9YCxcbiAgICAgICAgYEZST00gJHtyZXNvbHZlU291cmNlU3FsKGN0eCwgc291cmNlc1swXSl9YCxcbiAgICAgICAgLi4uam9pbnMubWFwKChpdGVtKSA9PiByZXNvbHZlSm9pblNxbChjdHgsIGl0ZW0pKSxcbiAgICAgICAgLi4uYnVpbGRXaGVyZVNxbChjdHgsIGZpbHRlcnMpLFxuICAgICAgICAuLi5idWlsZEdyb3VwQnlTcWwoY3R4LCBncm91cEJ5KSxcbiAgICAgICAgLi4uYnVpbGRPcmRlckJ5U3FsKGN0eCwgc29ydGluZyksXG4gICAgXTtcbiAgICByZXR1cm4gc3FsLmpvaW4oXCJcXG5cIik7XG59XG4iXX0=
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Normalizes a string for search comparison by removing diacritics,
3
+ * converting to lowercase and trimming whitespace.
4
+ */
5
+ export function normalize(value) {
6
+ return (value ?? "")
7
+ .normalize("NFD")
8
+ .replace(/[\u0300-\u036f]/g, "")
9
+ .toLowerCase()
10
+ .trim();
11
+ }
12
+ /**
13
+ * Converts a string to a slug by normalizing and replacing non-alphanumeric
14
+ * characters with underscores, then trimming leading/trailing underscores.
15
+ */
16
+ export function slugify(value) {
17
+ const normalized = normalize(value).replace(/[^a-z0-9]+/g, "_");
18
+ let start = 0;
19
+ let end = normalized.length;
20
+ while (start < end && normalized.charAt(start) === "_") {
21
+ start += 1;
22
+ }
23
+ while (end > start && normalized.charAt(end - 1) === "_") {
24
+ end -= 1;
25
+ }
26
+ return normalized.slice(start, end);
27
+ }
28
+ /**
29
+ * Deduplicates an array of items by a key resolved from each item.
30
+ * Preserves the last occurrence of each key.
31
+ */
32
+ export function deduplicateByKey(items, keyResolver) {
33
+ const map = new Map();
34
+ items.forEach((item) => map.set(keyResolver(item), item));
35
+ return Array.from(map.values());
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3ItdGV4dC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci91dGlscy92aXN1YWwtc3FsLWVkaXRvci10ZXh0LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ25DLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1NBQ2YsU0FBUyxDQUFDLEtBQUssQ0FBQztTQUNoQixPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1NBQy9CLFdBQVcsRUFBRTtTQUNiLElBQUksRUFBRSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLEtBQWE7SUFDakMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUU1QixPQUFPLEtBQUssR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNyRCxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sR0FBRyxHQUFHLEtBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsS0FBVSxFQUNWLFdBQWdDO0lBRWhDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7SUFDakMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm9ybWFsaXplcyBhIHN0cmluZyBmb3Igc2VhcmNoIGNvbXBhcmlzb24gYnkgcmVtb3ZpbmcgZGlhY3JpdGljcyxcbiAqIGNvbnZlcnRpbmcgdG8gbG93ZXJjYXNlIGFuZCB0cmltbWluZyB3aGl0ZXNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAodmFsdWUgPz8gXCJcIilcbiAgICAgICAgLm5vcm1hbGl6ZShcIk5GRFwiKVxuICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgXCJcIilcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHNsdWcgYnkgbm9ybWFsaXppbmcgYW5kIHJlcGxhY2luZyBub24tYWxwaGFudW1lcmljXG4gKiBjaGFyYWN0ZXJzIHdpdGggdW5kZXJzY29yZXMsIHRoZW4gdHJpbW1pbmcgbGVhZGluZy90cmFpbGluZyB1bmRlcnNjb3Jlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZSh2YWx1ZSkucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIl9cIik7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgZW5kID0gbm9ybWFsaXplZC5sZW5ndGg7XG5cbiAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgbm9ybWFsaXplZC5jaGFyQXQoc3RhcnQpID09PSBcIl9cIikge1xuICAgICAgICBzdGFydCArPSAxO1xuICAgIH1cblxuICAgIHdoaWxlIChlbmQgPiBzdGFydCAmJiBub3JtYWxpemVkLmNoYXJBdChlbmQgLSAxKSA9PT0gXCJfXCIpIHtcbiAgICAgICAgZW5kIC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQuc2xpY2Uoc3RhcnQsIGVuZCk7XG59XG5cbi8qKlxuICogRGVkdXBsaWNhdGVzIGFuIGFycmF5IG9mIGl0ZW1zIGJ5IGEga2V5IHJlc29sdmVkIGZyb20gZWFjaCBpdGVtLlxuICogUHJlc2VydmVzIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgZWFjaCBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWR1cGxpY2F0ZUJ5S2V5PFQ+KFxuICAgIGl0ZW1zOiBUW10sXG4gICAga2V5UmVzb2x2ZXI6IChpdGVtOiBUKSA9PiBzdHJpbmdcbik6IFRbXSB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gbWFwLnNldChrZXlSZXNvbHZlcihpdGVtKSwgaXRlbSkpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKG1hcC52YWx1ZXMoKSk7XG59XG4iXX0=
@@ -0,0 +1,89 @@
1
+ import { DEFAULT_MODAL_Z_INDEX } from "../../../core/constants/modal.const";
2
+ export const EMPTY_VALUE = "";
3
+ export const DEFAULT_JOIN_OPERATOR = "EQUALS";
4
+ export const DEFAULT_FUNCTION_NAME = "count";
5
+ export const DEFAULT_SORT_DIRECTION = "ASC";
6
+ export const EMPTY_SORT_FUNCTION = "__base__";
7
+ export const FLOW_ARROW_INSET = 3;
8
+ export const FLOW_ARROW_MIN_GAP = 12;
9
+ export const FLOW_ARROWS_REFRESH_DELAY_MS = 120;
10
+ export const DEFAULT_FILTER_OPERATOR = "EQUAL";
11
+ export const DEFAULT_FILTER_CONNECTOR = "AND";
12
+ export const DEFAULT_FILTER_VALUE_TYPE = "value";
13
+ export const FILTER_MODE_DOMAIN = "domain";
14
+ export const OVERLAY_APPEND_TARGET = "body";
15
+ export const MODAL_Z_INDEX_OFFSET = 20;
16
+ export const MODAL_OVERLAY_Z_INDEX = DEFAULT_MODAL_Z_INDEX + MODAL_Z_INDEX_OFFSET;
17
+ export const FIELD_PICKLIST_ROWS = 8;
18
+ export const FILTER_PICKLIST_ROWS = 9;
19
+ export const VISUAL_SQL_TABLE_COLOR = "#425466";
20
+ export const VISUAL_SQL_FIELD_COLOR = "#1f8a52";
21
+ export const PICKLIST_DATA_TYPE_BADGE_COLOR = "gray";
22
+ export const PICKLIST_FUNCTION_BADGE_COLOR = "blue";
23
+ export const FALLBACK_SELECT_TABLES = "Selecionar tabelas";
24
+ export const FALLBACK_EMPTY_SELECTION = "Nenhum selecionado";
25
+ const PREVIEW_ROWS_PER_PAGE_SMALL = 5;
26
+ const PREVIEW_ROWS_PER_PAGE_MEDIUM = 10;
27
+ const PREVIEW_ROWS_PER_PAGE_LARGE = 20;
28
+ export const PREVIEW_ROWS_PER_PAGE_OPTIONS = [
29
+ PREVIEW_ROWS_PER_PAGE_SMALL,
30
+ PREVIEW_ROWS_PER_PAGE_MEDIUM,
31
+ PREVIEW_ROWS_PER_PAGE_LARGE,
32
+ ];
33
+ export const ALIAS_MAX_LENGTH = 12;
34
+ export const MIN_PARTS_FOR_DB = 3;
35
+ export const DB_PARTS_OFFSET = -2;
36
+ export const MIN_PARTS_FOR_TABLE = 2;
37
+ export const JOIN_OPERATOR_LABELS = {
38
+ EQUALS: {
39
+ key: "joinOperators.equals",
40
+ fallback: "Igual a (=)",
41
+ },
42
+ NOT_EQUALS: {
43
+ key: "joinOperators.notEquals",
44
+ fallback: "Diferente de (<>)",
45
+ },
46
+ GREATER_THAN: {
47
+ key: "joinOperators.greaterThan",
48
+ fallback: "Maior que (>)",
49
+ },
50
+ GREATER_THAN_OR_EQUAL: {
51
+ key: "joinOperators.greaterThanOrEqual",
52
+ fallback: "Maior ou igual a (>=)",
53
+ },
54
+ LESS_THAN: {
55
+ key: "joinOperators.lessThan",
56
+ fallback: "Menor que (<)",
57
+ },
58
+ LESS_THAN_OR_EQUAL: {
59
+ key: "joinOperators.lessThanOrEqual",
60
+ fallback: "Menor ou igual a (<=)",
61
+ },
62
+ };
63
+ export const DYNAMIC_MODAL_DIMENSIONS = {
64
+ source: {
65
+ width: "64rem",
66
+ height: "40rem",
67
+ },
68
+ selection: {
69
+ width: "64rem",
70
+ height: "40rem",
71
+ },
72
+ join: {
73
+ width: "70rem",
74
+ height: "40rem",
75
+ },
76
+ sort: {
77
+ width: "56rem",
78
+ height: "34rem",
79
+ },
80
+ filter: {
81
+ width: "68rem",
82
+ height: "55rem",
83
+ },
84
+ field: {
85
+ width: "68rem",
86
+ height: "42rem",
87
+ },
88
+ };
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3IuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci91dGlscy92aXN1YWwtc3FsLWVkaXRvci5jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFPNUUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUM7QUFDOUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUM1QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUNyQyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFzQyxLQUFLLENBQUM7QUFDakYsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQXNDLE9BQU8sQ0FBQztBQUNwRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUNsRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztBQUNoRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQWUsTUFBTSxDQUFDO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFlLE1BQU0sQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQztBQUM3RCxNQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQztBQUN0QyxNQUFNLDRCQUE0QixHQUFHLEVBQUUsQ0FBQztBQUN4QyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRztJQUN6QywyQkFBMkI7SUFDM0IsNEJBQTRCO0lBQzVCLDJCQUEyQjtDQUM5QixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFzRDtJQUNuRixNQUFNLEVBQUU7UUFDSixHQUFHLEVBQUUsc0JBQXNCO1FBQzNCLFFBQVEsRUFBRSxhQUFhO0tBQzFCO0lBQ0QsVUFBVSxFQUFFO1FBQ1IsR0FBRyxFQUFFLHlCQUF5QjtRQUM5QixRQUFRLEVBQUUsbUJBQW1CO0tBQ2hDO0lBQ0QsWUFBWSxFQUFFO1FBQ1YsR0FBRyxFQUFFLDJCQUEyQjtRQUNoQyxRQUFRLEVBQUUsZUFBZTtLQUM1QjtJQUNELHFCQUFxQixFQUFFO1FBQ25CLEdBQUcsRUFBRSxrQ0FBa0M7UUFDdkMsUUFBUSxFQUFFLHVCQUF1QjtLQUNwQztJQUNELFNBQVMsRUFBRTtRQUNQLEdBQUcsRUFBRSx3QkFBd0I7UUFDN0IsUUFBUSxFQUFFLGVBQWU7S0FDNUI7SUFDRCxrQkFBa0IsRUFBRTtRQUNoQixHQUFHLEVBQUUsK0JBQStCO1FBQ3BDLFFBQVEsRUFBRSx1QkFBdUI7S0FDcEM7Q0FDSixDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQThCO0lBQy9ELE1BQU0sRUFBRTtRQUNKLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDbEI7SUFDRCxTQUFTLEVBQUU7UUFDUCxLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2xCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNsQjtJQUNELElBQUksRUFBRTtRQUNGLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDbEI7SUFDRCxNQUFNLEVBQUU7UUFDSixLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2xCO0lBQ0QsS0FBSyxFQUFFO1FBQ0gsS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNsQjtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJhZGdlQ29sb3IgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS90eXBlcy9iYWRnZS50eXBlXCI7XG5pbXBvcnQgeyBERUZBVUxUX01PREFMX1pfSU5ERVggfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9jb25zdGFudHMvbW9kYWwuY29uc3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgICBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXJDb25uZWN0b3IsXG4gICAgRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyVmFsdWVUeXBlLFxufSBmcm9tIFwiLi4vLi4vLi4vY29yZS90eXBlcy9keW5hbWljLXZpZXctYnVpbGRlci50eXBlXCI7XG5pbXBvcnQgdHlwZSB7IER5bmFtaWNNb2RhbERpbWVuc2lvbnNNYXAgfSBmcm9tIFwiLi4vdHlwZXMvdmlzdWFsLXNxbC1lZGl0b3IudHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IEVNUFRZX1ZBTFVFID0gXCJcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0pPSU5fT1BFUkFUT1IgPSBcIkVRVUFMU1wiO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRlVOQ1RJT05fTkFNRSA9IFwiY291bnRcIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NPUlRfRElSRUNUSU9OID0gXCJBU0NcIjtcbmV4cG9ydCBjb25zdCBFTVBUWV9TT1JUX0ZVTkNUSU9OID0gXCJfX2Jhc2VfX1wiO1xuZXhwb3J0IGNvbnN0IEZMT1dfQVJST1dfSU5TRVQgPSAzO1xuZXhwb3J0IGNvbnN0IEZMT1dfQVJST1dfTUlOX0dBUCA9IDEyO1xuZXhwb3J0IGNvbnN0IEZMT1dfQVJST1dTX1JFRlJFU0hfREVMQVlfTVMgPSAxMjA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxURVJfT1BFUkFUT1IgPSBcIkVRVUFMXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxURVJfQ09OTkVDVE9SOiBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXJDb25uZWN0b3IgPSBcIkFORFwiO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEU6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlclZhbHVlVHlwZSA9IFwidmFsdWVcIjtcbmV4cG9ydCBjb25zdCBGSUxURVJfTU9ERV9ET01BSU4gPSBcImRvbWFpblwiO1xuZXhwb3J0IGNvbnN0IE9WRVJMQVlfQVBQRU5EX1RBUkdFVCA9IFwiYm9keVwiO1xuZXhwb3J0IGNvbnN0IE1PREFMX1pfSU5ERVhfT0ZGU0VUID0gMjA7XG5leHBvcnQgY29uc3QgTU9EQUxfT1ZFUkxBWV9aX0lOREVYID0gREVGQVVMVF9NT0RBTF9aX0lOREVYICsgTU9EQUxfWl9JTkRFWF9PRkZTRVQ7XG5leHBvcnQgY29uc3QgRklFTERfUElDS0xJU1RfUk9XUyA9IDg7XG5leHBvcnQgY29uc3QgRklMVEVSX1BJQ0tMSVNUX1JPV1MgPSA5O1xuZXhwb3J0IGNvbnN0IFZJU1VBTF9TUUxfVEFCTEVfQ09MT1IgPSBcIiM0MjU0NjZcIjtcbmV4cG9ydCBjb25zdCBWSVNVQUxfU1FMX0ZJRUxEX0NPTE9SID0gXCIjMWY4YTUyXCI7XG5leHBvcnQgY29uc3QgUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SOiBCYWRnZUNvbG9yID0gXCJncmF5XCI7XG5leHBvcnQgY29uc3QgUElDS0xJU1RfRlVOQ1RJT05fQkFER0VfQ09MT1I6IEJhZGdlQ29sb3IgPSBcImJsdWVcIjtcbmV4cG9ydCBjb25zdCBGQUxMQkFDS19TRUxFQ1RfVEFCTEVTID0gXCJTZWxlY2lvbmFyIHRhYmVsYXNcIjtcbmV4cG9ydCBjb25zdCBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT04gPSBcIk5lbmh1bSBzZWxlY2lvbmFkb1wiO1xuY29uc3QgUFJFVklFV19ST1dTX1BFUl9QQUdFX1NNQUxMID0gNTtcbmNvbnN0IFBSRVZJRVdfUk9XU19QRVJfUEFHRV9NRURJVU0gPSAxMDtcbmNvbnN0IFBSRVZJRVdfUk9XU19QRVJfUEFHRV9MQVJHRSA9IDIwO1xuZXhwb3J0IGNvbnN0IFBSRVZJRVdfUk9XU19QRVJfUEFHRV9PUFRJT05TID0gW1xuICAgIFBSRVZJRVdfUk9XU19QRVJfUEFHRV9TTUFMTCxcbiAgICBQUkVWSUVXX1JPV1NfUEVSX1BBR0VfTUVESVVNLFxuICAgIFBSRVZJRVdfUk9XU19QRVJfUEFHRV9MQVJHRSxcbl07XG5leHBvcnQgY29uc3QgQUxJQVNfTUFYX0xFTkdUSCA9IDEyO1xuZXhwb3J0IGNvbnN0IE1JTl9QQVJUU19GT1JfREIgPSAzO1xuZXhwb3J0IGNvbnN0IERCX1BBUlRTX09GRlNFVCA9IC0yO1xuZXhwb3J0IGNvbnN0IE1JTl9QQVJUU19GT1JfVEFCTEUgPSAyO1xuZXhwb3J0IGNvbnN0IEpPSU5fT1BFUkFUT1JfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCB7IGtleTogc3RyaW5nOyBmYWxsYmFjazogc3RyaW5nIH0+ID0ge1xuICAgIEVRVUFMUzoge1xuICAgICAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5lcXVhbHNcIixcbiAgICAgICAgZmFsbGJhY2s6IFwiSWd1YWwgYSAoPSlcIixcbiAgICB9LFxuICAgIE5PVF9FUVVBTFM6IHtcbiAgICAgICAga2V5OiBcImpvaW5PcGVyYXRvcnMubm90RXF1YWxzXCIsXG4gICAgICAgIGZhbGxiYWNrOiBcIkRpZmVyZW50ZSBkZSAoPD4pXCIsXG4gICAgfSxcbiAgICBHUkVBVEVSX1RIQU46IHtcbiAgICAgICAga2V5OiBcImpvaW5PcGVyYXRvcnMuZ3JlYXRlclRoYW5cIixcbiAgICAgICAgZmFsbGJhY2s6IFwiTWFpb3IgcXVlICg+KVwiLFxuICAgIH0sXG4gICAgR1JFQVRFUl9USEFOX09SX0VRVUFMOiB7XG4gICAgICAgIGtleTogXCJqb2luT3BlcmF0b3JzLmdyZWF0ZXJUaGFuT3JFcXVhbFwiLFxuICAgICAgICBmYWxsYmFjazogXCJNYWlvciBvdSBpZ3VhbCBhICg+PSlcIixcbiAgICB9LFxuICAgIExFU1NfVEhBTjoge1xuICAgICAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5sZXNzVGhhblwiLFxuICAgICAgICBmYWxsYmFjazogXCJNZW5vciBxdWUgKDwpXCIsXG4gICAgfSxcbiAgICBMRVNTX1RIQU5fT1JfRVFVQUw6IHtcbiAgICAgICAga2V5OiBcImpvaW5PcGVyYXRvcnMubGVzc1RoYW5PckVxdWFsXCIsXG4gICAgICAgIGZhbGxiYWNrOiBcIk1lbm9yIG91IGlndWFsIGEgKDw9KVwiLFxuICAgIH0sXG59O1xuZXhwb3J0IGNvbnN0IERZTkFNSUNfTU9EQUxfRElNRU5TSU9OUzogRHluYW1pY01vZGFsRGltZW5zaW9uc01hcCA9IHtcbiAgICBzb3VyY2U6IHtcbiAgICAgICAgd2lkdGg6IFwiNjRyZW1cIixcbiAgICAgICAgaGVpZ2h0OiBcIjQwcmVtXCIsXG4gICAgfSxcbiAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgd2lkdGg6IFwiNjRyZW1cIixcbiAgICAgICAgaGVpZ2h0OiBcIjQwcmVtXCIsXG4gICAgfSxcbiAgICBqb2luOiB7XG4gICAgICAgIHdpZHRoOiBcIjcwcmVtXCIsXG4gICAgICAgIGhlaWdodDogXCI0MHJlbVwiLFxuICAgIH0sXG4gICAgc29ydDoge1xuICAgICAgICB3aWR0aDogXCI1NnJlbVwiLFxuICAgICAgICBoZWlnaHQ6IFwiMzRyZW1cIixcbiAgICB9LFxuICAgIGZpbHRlcjoge1xuICAgICAgICB3aWR0aDogXCI2OHJlbVwiLFxuICAgICAgICBoZWlnaHQ6IFwiNTVyZW1cIixcbiAgICB9LFxuICAgIGZpZWxkOiB7XG4gICAgICAgIHdpZHRoOiBcIjY4cmVtXCIsXG4gICAgICAgIGhlaWdodDogXCI0MnJlbVwiLFxuICAgIH0sXG59O1xuIl19