@igo2/geo 18.0.1-next.2 → 18.0.2

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 (512) hide show
  1. package/esm2022/igo2-geo.mjs +5 -0
  2. package/esm2022/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +234 -0
  3. package/esm2022/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +272 -0
  4. package/esm2022/lib/catalog/catalog-browser/catalog-browser.component.mjs +246 -0
  5. package/esm2022/lib/catalog/catalog-browser/catalog-browser.module.mjs +19 -0
  6. package/esm2022/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +136 -0
  7. package/esm2022/lib/catalog/catalog-library/catalog-library-item.component.mjs +60 -0
  8. package/esm2022/lib/catalog/catalog-library/catalog-library.component.mjs +232 -0
  9. package/esm2022/lib/catalog/catalog-library/catalog-library.module.mjs +24 -0
  10. package/esm2022/lib/catalog/catalog-library/index.mjs +4 -0
  11. package/esm2022/lib/catalog/catalog.module.mjs +26 -0
  12. package/esm2022/lib/catalog/index.mjs +6 -0
  13. package/esm2022/lib/catalog/shared/catalog.abstract.mjs +32 -0
  14. package/esm2022/lib/catalog/shared/catalog.enum.mjs +16 -0
  15. package/esm2022/lib/catalog/shared/catalog.interface.mjs +2 -0
  16. package/esm2022/lib/catalog/shared/catalog.service.mjs +706 -0
  17. package/esm2022/lib/catalog/shared/catalogs.mjs +75 -0
  18. package/esm2022/lib/catalog/shared/index.mjs +5 -0
  19. package/esm2022/lib/datasource/index.mjs +3 -0
  20. package/esm2022/lib/datasource/shared/capabilities.interface.mjs +17 -0
  21. package/esm2022/lib/datasource/shared/capabilities.service.mjs +441 -0
  22. package/esm2022/lib/datasource/shared/datasource.service.mjs +258 -0
  23. package/esm2022/lib/datasource/shared/datasources/any-datasource.interface.mjs +2 -0
  24. package/esm2022/lib/datasource/shared/datasources/any-datasource.mjs +2 -0
  25. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +2 -0
  26. package/esm2022/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +222 -0
  27. package/esm2022/lib/datasource/shared/datasources/carto-datasource.interface.mjs +2 -0
  28. package/esm2022/lib/datasource/shared/datasources/carto-datasource.mjs +118 -0
  29. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +2 -0
  30. package/esm2022/lib/datasource/shared/datasources/cluster-datasource.mjs +24 -0
  31. package/esm2022/lib/datasource/shared/datasources/data.service.mjs +3 -0
  32. package/esm2022/lib/datasource/shared/datasources/datasource.interface.mjs +2 -0
  33. package/esm2022/lib/datasource/shared/datasources/datasource.mjs +42 -0
  34. package/esm2022/lib/datasource/shared/datasources/feature-datasource.interface.mjs +2 -0
  35. package/esm2022/lib/datasource/shared/datasources/feature-datasource.mjs +52 -0
  36. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +2 -0
  37. package/esm2022/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +70 -0
  38. package/esm2022/lib/datasource/shared/datasources/index.mjs +36 -0
  39. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +2 -0
  40. package/esm2022/lib/datasource/shared/datasources/mvt-datasource.mjs +33 -0
  41. package/esm2022/lib/datasource/shared/datasources/osm-datasource.interface.mjs +2 -0
  42. package/esm2022/lib/datasource/shared/datasources/osm-datasource.mjs +14 -0
  43. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +2 -0
  44. package/esm2022/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +60 -0
  45. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +2 -0
  46. package/esm2022/lib/datasource/shared/datasources/tiledebug-datasource.mjs +17 -0
  47. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +2 -0
  48. package/esm2022/lib/datasource/shared/datasources/websocket-datasource.mjs +56 -0
  49. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +2 -0
  50. package/esm2022/lib/datasource/shared/datasources/wfs-datasource.mjs +137 -0
  51. package/esm2022/lib/datasource/shared/datasources/wfs.service.mjs +170 -0
  52. package/esm2022/lib/datasource/shared/datasources/wms-datasource.interface.mjs +2 -0
  53. package/esm2022/lib/datasource/shared/datasources/wms-datasource.mjs +227 -0
  54. package/esm2022/lib/datasource/shared/datasources/wms-wfs.utils.mjs +224 -0
  55. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +2 -0
  56. package/esm2022/lib/datasource/shared/datasources/wmts-datasource.mjs +18 -0
  57. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +2 -0
  58. package/esm2022/lib/datasource/shared/datasources/xyz-datasource.mjs +11 -0
  59. package/esm2022/lib/datasource/shared/index.mjs +6 -0
  60. package/esm2022/lib/datasource/shared/options/index.mjs +5 -0
  61. package/esm2022/lib/datasource/shared/options/options-api.interface.mjs +2 -0
  62. package/esm2022/lib/datasource/shared/options/options-api.providers.mjs +15 -0
  63. package/esm2022/lib/datasource/shared/options/options-api.service.mjs +85 -0
  64. package/esm2022/lib/datasource/shared/options/options.service.mjs +3 -0
  65. package/esm2022/lib/datasource/utils/index.mjs +2 -0
  66. package/esm2022/lib/datasource/utils/tilegrid.mjs +20 -0
  67. package/esm2022/lib/directions/directions-buttons/directions-buttons.component.mjs +246 -0
  68. package/esm2022/lib/directions/directions-buttons/index.mjs +2 -0
  69. package/esm2022/lib/directions/directions-inputs/directions-inputs.component.mjs +312 -0
  70. package/esm2022/lib/directions/directions-inputs/index.mjs +2 -0
  71. package/esm2022/lib/directions/directions-results/directions-results.component.mjs +192 -0
  72. package/esm2022/lib/directions/directions-results/index.mjs +2 -0
  73. package/esm2022/lib/directions/directions-sources/directions-source.interface.mjs +5 -0
  74. package/esm2022/lib/directions/directions-sources/directions-source.mjs +3 -0
  75. package/esm2022/lib/directions/directions-sources/directions-source.provider.mjs +23 -0
  76. package/esm2022/lib/directions/directions-sources/index.mjs +5 -0
  77. package/esm2022/lib/directions/directions-sources/osrm-directions-source.mjs +159 -0
  78. package/esm2022/lib/directions/directions.component.mjs +437 -0
  79. package/esm2022/lib/directions/directions.module.mjs +46 -0
  80. package/esm2022/lib/directions/directions.provider.mjs +16 -0
  81. package/esm2022/lib/directions/index.mjs +8 -0
  82. package/esm2022/lib/directions/shared/directions-source.service.mjs +18 -0
  83. package/esm2022/lib/directions/shared/directions.enum.mjs +72 -0
  84. package/esm2022/lib/directions/shared/directions.interface.mjs +2 -0
  85. package/esm2022/lib/directions/shared/directions.service.mjs +239 -0
  86. package/esm2022/lib/directions/shared/directions.utils.mjs +522 -0
  87. package/esm2022/lib/directions/shared/index.mjs +6 -0
  88. package/esm2022/lib/directions/shared/store.mjs +21 -0
  89. package/esm2022/lib/download/download-button/download-button.component.mjs +48 -0
  90. package/esm2022/lib/download/download-button/index.mjs +2 -0
  91. package/esm2022/lib/download/download.module.mjs +24 -0
  92. package/esm2022/lib/download/index.mjs +3 -0
  93. package/esm2022/lib/download/shared/download.interface.mjs +2 -0
  94. package/esm2022/lib/download/shared/download.service.mjs +67 -0
  95. package/esm2022/lib/download/shared/index.mjs +3 -0
  96. package/esm2022/lib/draw/draw/draw-layer-popup.component.mjs +42 -0
  97. package/esm2022/lib/draw/draw/draw-popup.component.mjs +421 -0
  98. package/esm2022/lib/draw/draw/draw-shorcuts.component.mjs +28 -0
  99. package/esm2022/lib/draw/draw/draw.component.mjs +1136 -0
  100. package/esm2022/lib/draw/draw/draw.module.mjs +19 -0
  101. package/esm2022/lib/draw/drawingTool.module.mjs +18 -0
  102. package/esm2022/lib/draw/index.mjs +3 -0
  103. package/esm2022/lib/draw/shared/draw-icon.service.mjs +30 -0
  104. package/esm2022/lib/draw/shared/draw.enum.mjs +21 -0
  105. package/esm2022/lib/draw/shared/draw.interface.mjs +2 -0
  106. package/esm2022/lib/draw/shared/draw.utils.mjs +125 -0
  107. package/esm2022/lib/draw/shared/index.mjs +5 -0
  108. package/esm2022/lib/environment/environment.interface.mjs +2 -0
  109. package/esm2022/lib/environment/index.mjs +2 -0
  110. package/esm2022/lib/feature/feature-details/feature-details.component.mjs +306 -0
  111. package/esm2022/lib/feature/feature-details/feature-details.directive.mjs +56 -0
  112. package/esm2022/lib/feature/feature-details/feature-details.module.mjs +26 -0
  113. package/esm2022/lib/feature/feature-details/index.mjs +4 -0
  114. package/esm2022/lib/feature/feature-form/feature-form.component.mjs +101 -0
  115. package/esm2022/lib/feature/feature-form/feature-form.module.mjs +19 -0
  116. package/esm2022/lib/feature/feature.module.mjs +26 -0
  117. package/esm2022/lib/feature/index.mjs +5 -0
  118. package/esm2022/lib/feature/shared/feature-store.utils.mjs +28 -0
  119. package/esm2022/lib/feature/shared/feature.enums.mjs +9 -0
  120. package/esm2022/lib/feature/shared/feature.interfaces.mjs +2 -0
  121. package/esm2022/lib/feature/shared/feature.utils.mjs +332 -0
  122. package/esm2022/lib/feature/shared/index.mjs +8 -0
  123. package/esm2022/lib/feature/shared/store.mjs +143 -0
  124. package/esm2022/lib/feature/shared/strategies/geo-properties.mjs +216 -0
  125. package/esm2022/lib/feature/shared/strategies/in-map-extent.mjs +119 -0
  126. package/esm2022/lib/feature/shared/strategies/in-map-resolution.mjs +99 -0
  127. package/esm2022/lib/feature/shared/strategies/index.mjs +8 -0
  128. package/esm2022/lib/feature/shared/strategies/loading-layer.mjs +103 -0
  129. package/esm2022/lib/feature/shared/strategies/loading.mjs +136 -0
  130. package/esm2022/lib/feature/shared/strategies/search.mjs +158 -0
  131. package/esm2022/lib/feature/shared/strategies/selection.mjs +385 -0
  132. package/esm2022/lib/feature/shared/strategies.utils.mjs +37 -0
  133. package/esm2022/lib/filter/filter.module.mjs +131 -0
  134. package/esm2022/lib/filter/index.mjs +17 -0
  135. package/esm2022/lib/filter/ogc-filter-button/index.mjs +2 -0
  136. package/esm2022/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +141 -0
  137. package/esm2022/lib/filter/ogc-filter-form/index.mjs +2 -0
  138. package/esm2022/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +325 -0
  139. package/esm2022/lib/filter/ogc-filter-selection/index.mjs +2 -0
  140. package/esm2022/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +787 -0
  141. package/esm2022/lib/filter/ogc-filter-time/index.mjs +3 -0
  142. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +201 -0
  143. package/esm2022/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +665 -0
  144. package/esm2022/lib/filter/ogc-filterable-form/index.mjs +2 -0
  145. package/esm2022/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +66 -0
  146. package/esm2022/lib/filter/ogc-filterable-item/index.mjs +2 -0
  147. package/esm2022/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +244 -0
  148. package/esm2022/lib/filter/ogc-filterable-list/index.mjs +3 -0
  149. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +39 -0
  150. package/esm2022/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +32 -0
  151. package/esm2022/lib/filter/shared/filterable-datasource.pipe.mjs +63 -0
  152. package/esm2022/lib/filter/shared/index.mjs +12 -0
  153. package/esm2022/lib/filter/shared/ogc-filter-time.service.mjs +72 -0
  154. package/esm2022/lib/filter/shared/ogc-filter.enum.mjs +30 -0
  155. package/esm2022/lib/filter/shared/ogc-filter.interface.mjs +2 -0
  156. package/esm2022/lib/filter/shared/ogc-filter.mjs +756 -0
  157. package/esm2022/lib/filter/shared/ogc-filter.service.mjs +47 -0
  158. package/esm2022/lib/filter/shared/spatial-filter.enum.mjs +23 -0
  159. package/esm2022/lib/filter/shared/spatial-filter.interface.mjs +2 -0
  160. package/esm2022/lib/filter/shared/spatial-filter.service.mjs +282 -0
  161. package/esm2022/lib/filter/shared/time-filter.enum.mjs +13 -0
  162. package/esm2022/lib/filter/shared/time-filter.interface.mjs +2 -0
  163. package/esm2022/lib/filter/shared/time-filter.service.mjs +107 -0
  164. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/index.mjs +2 -0
  165. package/esm2022/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +875 -0
  166. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/index.mjs +2 -0
  167. package/esm2022/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +191 -0
  168. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/index.mjs +2 -0
  169. package/esm2022/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +120 -0
  170. package/esm2022/lib/filter/time-filter-button/index.mjs +2 -0
  171. package/esm2022/lib/filter/time-filter-button/time-filter-button.component.mjs +70 -0
  172. package/esm2022/lib/filter/time-filter-form/index.mjs +2 -0
  173. package/esm2022/lib/filter/time-filter-form/time-filter-form.component.mjs +537 -0
  174. package/esm2022/lib/filter/time-filter-item/index.mjs +2 -0
  175. package/esm2022/lib/filter/time-filter-item/time-filter-item.component.mjs +90 -0
  176. package/esm2022/lib/filter/time-filter-list/index.mjs +3 -0
  177. package/esm2022/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +39 -0
  178. package/esm2022/lib/filter/time-filter-list/time-filter-list.component.mjs +24 -0
  179. package/esm2022/lib/geo.module.mjs +63 -0
  180. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +559 -0
  181. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +170 -0
  182. package/esm2022/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +24 -0
  183. package/esm2022/lib/geometry/geometry-form-field/index.mjs +4 -0
  184. package/esm2022/lib/geometry/geometry.module.mjs +18 -0
  185. package/esm2022/lib/geometry/index.mjs +3 -0
  186. package/esm2022/lib/geometry/shared/controls/draw.mjs +340 -0
  187. package/esm2022/lib/geometry/shared/controls/index.mjs +4 -0
  188. package/esm2022/lib/geometry/shared/controls/modify.mjs +538 -0
  189. package/esm2022/lib/geometry/shared/controls/slice.mjs +190 -0
  190. package/esm2022/lib/geometry/shared/geometry.errors.mjs +24 -0
  191. package/esm2022/lib/geometry/shared/geometry.interfaces.mjs +2 -0
  192. package/esm2022/lib/geometry/shared/geometry.utils.mjs +113 -0
  193. package/esm2022/lib/geometry/shared/index.mjs +5 -0
  194. package/esm2022/lib/import-export/export-button/export-button.component.mjs +49 -0
  195. package/esm2022/lib/import-export/export-button/index.mjs +2 -0
  196. package/esm2022/lib/import-export/import-export/import-export.component.mjs +876 -0
  197. package/esm2022/lib/import-export/import-export/index.mjs +2 -0
  198. package/esm2022/lib/import-export/import-export.module.mjs +31 -0
  199. package/esm2022/lib/import-export/index.mjs +5 -0
  200. package/esm2022/lib/import-export/shared/drop-geo-file.directive.mjs +114 -0
  201. package/esm2022/lib/import-export/shared/export.errors.mjs +15 -0
  202. package/esm2022/lib/import-export/shared/export.interface.mjs +2 -0
  203. package/esm2022/lib/import-export/shared/export.service.mjs +378 -0
  204. package/esm2022/lib/import-export/shared/export.type.mjs +13 -0
  205. package/esm2022/lib/import-export/shared/export.utils.mjs +51 -0
  206. package/esm2022/lib/import-export/shared/import.errors.mjs +39 -0
  207. package/esm2022/lib/import-export/shared/import.interface.mjs +2 -0
  208. package/esm2022/lib/import-export/shared/import.service.mjs +221 -0
  209. package/esm2022/lib/import-export/shared/import.utils.mjs +203 -0
  210. package/esm2022/lib/import-export/shared/index.mjs +11 -0
  211. package/esm2022/lib/layer/index.mjs +16 -0
  212. package/esm2022/lib/layer/layer-group/index.mjs +2 -0
  213. package/esm2022/lib/layer/layer-group/layer-group.component.mjs +103 -0
  214. package/esm2022/lib/layer/layer-item/index.mjs +2 -0
  215. package/esm2022/lib/layer/layer-item/layer-item.component.mjs +196 -0
  216. package/esm2022/lib/layer/layer-legend/index.mjs +2 -0
  217. package/esm2022/lib/layer/layer-legend/layer-legend.component.mjs +287 -0
  218. package/esm2022/lib/layer/layer-legend-item/index.mjs +2 -0
  219. package/esm2022/lib/layer/layer-legend-item/layer-legend-item.component.mjs +85 -0
  220. package/esm2022/lib/layer/layer-legend-list/index.mjs +3 -0
  221. package/esm2022/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +54 -0
  222. package/esm2022/lib/layer/layer-legend-list/layer-legend-list.component.mjs +104 -0
  223. package/esm2022/lib/layer/layer-list/index.mjs +2 -0
  224. package/esm2022/lib/layer/layer-list/layer-list.component.mjs +232 -0
  225. package/esm2022/lib/layer/layer-list-tool/index.mjs +4 -0
  226. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.component.mjs +92 -0
  227. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +7 -0
  228. package/esm2022/lib/layer/layer-list-tool/layer-list-tool.service.mjs +61 -0
  229. package/esm2022/lib/layer/layer-search/index.mjs +2 -0
  230. package/esm2022/lib/layer/layer-search/layer-search.component.mjs +65 -0
  231. package/esm2022/lib/layer/layer-unavailable/index.mjs +3 -0
  232. package/esm2022/lib/layer/layer-unavailable/layer-unavailable-list/layer-unavailable-list.component.mjs +26 -0
  233. package/esm2022/lib/layer/layer-unavailable/layer-unavailable.component.mjs +35 -0
  234. package/esm2022/lib/layer/layer-viewer/index.mjs +3 -0
  235. package/esm2022/lib/layer/layer-viewer/layer-viewer.component.mjs +226 -0
  236. package/esm2022/lib/layer/layer-viewer/layer-viewer.interface.mjs +2 -0
  237. package/esm2022/lib/layer/layer-viewer-bottom-actions/index.mjs +2 -0
  238. package/esm2022/lib/layer/layer-viewer-bottom-actions/layer-viewer-bottom-actions.component.mjs +207 -0
  239. package/esm2022/lib/layer/layer-visibility-button/index.mjs +2 -0
  240. package/esm2022/lib/layer/layer-visibility-button/layer-visibility-button.component.mjs +83 -0
  241. package/esm2022/lib/layer/layer.module.mjs +107 -0
  242. package/esm2022/lib/layer/shared/clusterParam.mjs +2 -0
  243. package/esm2022/lib/layer/shared/index.mjs +6 -0
  244. package/esm2022/lib/layer/shared/layer-controller.mjs +316 -0
  245. package/esm2022/lib/layer/shared/layer-selection.mjs +38 -0
  246. package/esm2022/lib/layer/shared/layer.enums.mjs +2 -0
  247. package/esm2022/lib/layer/shared/layer.service.mjs +315 -0
  248. package/esm2022/lib/layer/shared/layers/any-layer.interface.mjs +2 -0
  249. package/esm2022/lib/layer/shared/layers/any-layer.mjs +2 -0
  250. package/esm2022/lib/layer/shared/layers/image-layer.interface.mjs +2 -0
  251. package/esm2022/lib/layer/shared/layers/image-layer.mjs +75 -0
  252. package/esm2022/lib/layer/shared/layers/index.mjs +18 -0
  253. package/esm2022/lib/layer/shared/layers/layer-base.mjs +199 -0
  254. package/esm2022/lib/layer/shared/layers/layer-group.interface.mjs +2 -0
  255. package/esm2022/lib/layer/shared/layers/layer-group.mjs +120 -0
  256. package/esm2022/lib/layer/shared/layers/layer.interface.mjs +7 -0
  257. package/esm2022/lib/layer/shared/layers/layer.mjs +178 -0
  258. package/esm2022/lib/layer/shared/layers/legend.interface.mjs +2 -0
  259. package/esm2022/lib/layer/shared/layers/linked/index.mjs +4 -0
  260. package/esm2022/lib/layer/shared/layers/linked/linked-layer.interface.mjs +12 -0
  261. package/esm2022/lib/layer/shared/layers/linked/linked-layer.mjs +242 -0
  262. package/esm2022/lib/layer/shared/layers/linked/linked-layer.utils.mjs +70 -0
  263. package/esm2022/lib/layer/shared/layers/tile-layer.interface.mjs +2 -0
  264. package/esm2022/lib/layer/shared/layers/tile-layer.mjs +55 -0
  265. package/esm2022/lib/layer/shared/layers/vector-layer.interface.mjs +2 -0
  266. package/esm2022/lib/layer/shared/layers/vector-layer.mjs +576 -0
  267. package/esm2022/lib/layer/shared/layers/vectortile-layer.interface.mjs +2 -0
  268. package/esm2022/lib/layer/shared/layers/vectortile-layer.mjs +112 -0
  269. package/esm2022/lib/layer/track-feature-button/index.mjs +2 -0
  270. package/esm2022/lib/layer/track-feature-button/track-feature-button.component.mjs +54 -0
  271. package/esm2022/lib/layer/utils/image-watcher.mjs +62 -0
  272. package/esm2022/lib/layer/utils/index.mjs +6 -0
  273. package/esm2022/lib/layer/utils/layer.utils.mjs +57 -0
  274. package/esm2022/lib/layer/utils/outputLegend.mjs +32 -0
  275. package/esm2022/lib/layer/utils/tile-watcher.mjs +52 -0
  276. package/esm2022/lib/layer/utils/vector-watcher.mjs +50 -0
  277. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +20 -0
  278. package/esm2022/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +87 -0
  279. package/esm2022/lib/map/baselayers-switcher/index.mjs +3 -0
  280. package/esm2022/lib/map/baselayers-switcher/mini-basemap.component.mjs +122 -0
  281. package/esm2022/lib/map/geolocate-button/geolocate-button.component.mjs +78 -0
  282. package/esm2022/lib/map/geolocate-button/index.mjs +2 -0
  283. package/esm2022/lib/map/home-extent-button/home-extent-button.component.mjs +73 -0
  284. package/esm2022/lib/map/home-extent-button/home-extent-button.interface.mjs +2 -0
  285. package/esm2022/lib/map/home-extent-button/index.mjs +3 -0
  286. package/esm2022/lib/map/index.mjs +14 -0
  287. package/esm2022/lib/map/info-section/index.mjs +2 -0
  288. package/esm2022/lib/map/info-section/info-section.component.mjs +15 -0
  289. package/esm2022/lib/map/map-browser/index.mjs +2 -0
  290. package/esm2022/lib/map/map-browser/map-browser.component.mjs +67 -0
  291. package/esm2022/lib/map/map-center/index.mjs +2 -0
  292. package/esm2022/lib/map/map-center/map-center.component.mjs +56 -0
  293. package/esm2022/lib/map/map.module.mjs +89 -0
  294. package/esm2022/lib/map/menu-button/index.mjs +2 -0
  295. package/esm2022/lib/map/menu-button/menu-button.component.mjs +57 -0
  296. package/esm2022/lib/map/offline-button/index.mjs +2 -0
  297. package/esm2022/lib/map/offline-button/offline-button.component.mjs +53 -0
  298. package/esm2022/lib/map/rotation-button/index.mjs +2 -0
  299. package/esm2022/lib/map/rotation-button/rotation-button.component.mjs +58 -0
  300. package/esm2022/lib/map/shared/controllers/controller.mjs +44 -0
  301. package/esm2022/lib/map/shared/controllers/geolocation.interface.mjs +8 -0
  302. package/esm2022/lib/map/shared/controllers/geolocation.mjs +431 -0
  303. package/esm2022/lib/map/shared/controllers/index.mjs +5 -0
  304. package/esm2022/lib/map/shared/controllers/view.mjs +361 -0
  305. package/esm2022/lib/map/shared/hover-feature.directive.mjs +481 -0
  306. package/esm2022/lib/map/shared/index.mjs +15 -0
  307. package/esm2022/lib/map/shared/linkedLayers.utils.mjs +238 -0
  308. package/esm2022/lib/map/shared/map-pointer-position.directive.mjs +122 -0
  309. package/esm2022/lib/map/shared/map.abstract.mjs +24 -0
  310. package/esm2022/lib/map/shared/map.enums.mjs +6 -0
  311. package/esm2022/lib/map/shared/map.interface.mjs +2 -0
  312. package/esm2022/lib/map/shared/map.mjs +201 -0
  313. package/esm2022/lib/map/shared/map.service.mjs +29 -0
  314. package/esm2022/lib/map/shared/map.utils.mjs +455 -0
  315. package/esm2022/lib/map/shared/mapOffline.directive.mjs +114 -0
  316. package/esm2022/lib/map/shared/projection.interfaces.mjs +2 -0
  317. package/esm2022/lib/map/shared/projection.service.mjs +67 -0
  318. package/esm2022/lib/map/shared/projection.utils.mjs +122 -0
  319. package/esm2022/lib/map/swipe-control/index.mjs +2 -0
  320. package/esm2022/lib/map/swipe-control/swipe-control.component.mjs +211 -0
  321. package/esm2022/lib/map/utils/index.mjs +2 -0
  322. package/esm2022/lib/map/utils/layer-watcher.mjs +112 -0
  323. package/esm2022/lib/map/wake-lock-button/index.mjs +2 -0
  324. package/esm2022/lib/map/wake-lock-button/wake-lock-button.component.mjs +103 -0
  325. package/esm2022/lib/map/zoom-button/index.mjs +2 -0
  326. package/esm2022/lib/map/zoom-button/zoom-button.component.mjs +35 -0
  327. package/esm2022/lib/measure/index.mjs +3 -0
  328. package/esm2022/lib/measure/measure.module.mjs +20 -0
  329. package/esm2022/lib/measure/measurer/index.mjs +6 -0
  330. package/esm2022/lib/measure/measurer/measure-format.pipe.mjs +40 -0
  331. package/esm2022/lib/measure/measurer/measurer-dialog.component.mjs +38 -0
  332. package/esm2022/lib/measure/measurer/measurer-item.component.mjs +143 -0
  333. package/esm2022/lib/measure/measurer/measurer.component.mjs +948 -0
  334. package/esm2022/lib/measure/measurer/measurer.module.mjs +20 -0
  335. package/esm2022/lib/measure/shared/index.mjs +4 -0
  336. package/esm2022/lib/measure/shared/measure.enum.mjs +37 -0
  337. package/esm2022/lib/measure/shared/measure.interfaces.mjs +2 -0
  338. package/esm2022/lib/measure/shared/measure.utils.mjs +497 -0
  339. package/esm2022/lib/metadata/index.mjs +4 -0
  340. package/esm2022/lib/metadata/metadata-button/index.mjs +2 -0
  341. package/esm2022/lib/metadata/metadata-button/metadata-button.component.mjs +96 -0
  342. package/esm2022/lib/metadata/metadata.module.mjs +29 -0
  343. package/esm2022/lib/metadata/shared/index.mjs +3 -0
  344. package/esm2022/lib/metadata/shared/metadata.interface.mjs +2 -0
  345. package/esm2022/lib/metadata/shared/metadata.service.mjs +18 -0
  346. package/esm2022/lib/offline/geoDB/configFileToGeoDB.service.mjs +130 -0
  347. package/esm2022/lib/offline/geoDB/geoDB.enums.mjs +6 -0
  348. package/esm2022/lib/offline/geoDB/geoDB.interface.mjs +2 -0
  349. package/esm2022/lib/offline/geoDB/geoDB.service.mjs +172 -0
  350. package/esm2022/lib/offline/geoDB/index.mjs +5 -0
  351. package/esm2022/lib/offline/index.mjs +6 -0
  352. package/esm2022/lib/offline/layerDB/index.mjs +3 -0
  353. package/esm2022/lib/offline/layerDB/layerDB.interface.mjs +2 -0
  354. package/esm2022/lib/offline/layerDB/layerDB.service.mjs +83 -0
  355. package/esm2022/lib/offline/offline.interface.mjs +2 -0
  356. package/esm2022/lib/offline/offline.provider.mjs +50 -0
  357. package/esm2022/lib/offline/shared/geo-network.service.mjs +79 -0
  358. package/esm2022/lib/offline/shared/index.mjs +2 -0
  359. package/esm2022/lib/overlay/index.mjs +2 -0
  360. package/esm2022/lib/overlay/shared/index.mjs +4 -0
  361. package/esm2022/lib/overlay/shared/overlay.enum.mjs +8 -0
  362. package/esm2022/lib/overlay/shared/overlay.mjs +139 -0
  363. package/esm2022/lib/overlay/shared/overlay.utils.mjs +17 -0
  364. package/esm2022/lib/print/index.mjs +4 -0
  365. package/esm2022/lib/print/print/print.component.mjs +116 -0
  366. package/esm2022/lib/print/print-form/index.mjs +2 -0
  367. package/esm2022/lib/print/print-form/print-form.component.mjs +320 -0
  368. package/esm2022/lib/print/print.module.mjs +20 -0
  369. package/esm2022/lib/print/shared/geopdf.mjs +68 -0
  370. package/esm2022/lib/print/shared/index.mjs +5 -0
  371. package/esm2022/lib/print/shared/print.interface.mjs +2 -0
  372. package/esm2022/lib/print/shared/print.service.mjs +1136 -0
  373. package/esm2022/lib/print/shared/print.type.mjs +30 -0
  374. package/esm2022/lib/query/index.mjs +2 -0
  375. package/esm2022/lib/query/query.module.mjs +27 -0
  376. package/esm2022/lib/query/shared/index.mjs +8 -0
  377. package/esm2022/lib/query/shared/query-search-source.mjs +35 -0
  378. package/esm2022/lib/query/shared/query-search-source.providers.mjs +22 -0
  379. package/esm2022/lib/query/shared/query.directive.mjs +290 -0
  380. package/esm2022/lib/query/shared/query.enums.mjs +32 -0
  381. package/esm2022/lib/query/shared/query.interfaces.mjs +2 -0
  382. package/esm2022/lib/query/shared/query.service.mjs +753 -0
  383. package/esm2022/lib/query/shared/query.utils.mjs +45 -0
  384. package/esm2022/lib/search/index.mjs +10 -0
  385. package/esm2022/lib/search/search-bar/search-bar.component.mjs +483 -0
  386. package/esm2022/lib/search/search-bar/search-bar.module.mjs +19 -0
  387. package/esm2022/lib/search/search-results/index.mjs +5 -0
  388. package/esm2022/lib/search/search-results/save-feature-dialog.component.mjs +101 -0
  389. package/esm2022/lib/search/search-results/search-results-add-button.component.mjs +433 -0
  390. package/esm2022/lib/search/search-results/search-results-item.component.mjs +119 -0
  391. package/esm2022/lib/search/search-results/search-results.component.mjs +297 -0
  392. package/esm2022/lib/search/search-results/search-results.directive.mjs +7 -0
  393. package/esm2022/lib/search/search-results/search-results.module.mjs +20 -0
  394. package/esm2022/lib/search/search-selector/search-selector.component.mjs +118 -0
  395. package/esm2022/lib/search/search-selector/search-selector.module.mjs +19 -0
  396. package/esm2022/lib/search/search-settings/search-settings.component.mjs +264 -0
  397. package/esm2022/lib/search/search-settings/search-settings.module.mjs +19 -0
  398. package/esm2022/lib/search/search.module.mjs +77 -0
  399. package/esm2022/lib/search/shared/index.mjs +10 -0
  400. package/esm2022/lib/search/shared/search-pointer-summary.directive.mjs +328 -0
  401. package/esm2022/lib/search/shared/search-source-service.providers.mjs +20 -0
  402. package/esm2022/lib/search/shared/search-source.service.mjs +56 -0
  403. package/esm2022/lib/search/shared/search.enums.mjs +4 -0
  404. package/esm2022/lib/search/shared/search.interfaces.mjs +2 -0
  405. package/esm2022/lib/search/shared/search.provider.mjs +20 -0
  406. package/esm2022/lib/search/shared/search.service.mjs +149 -0
  407. package/esm2022/lib/search/shared/search.utils.mjs +92 -0
  408. package/esm2022/lib/search/shared/sources/cadastre.mjs +142 -0
  409. package/esm2022/lib/search/shared/sources/cadastre.providers.mjs +32 -0
  410. package/esm2022/lib/search/shared/sources/coordinates.interfaces.mjs +2 -0
  411. package/esm2022/lib/search/shared/sources/coordinates.mjs +168 -0
  412. package/esm2022/lib/search/shared/sources/coordinates.providers.mjs +52 -0
  413. package/esm2022/lib/search/shared/sources/icherche-icons.mjs +32 -0
  414. package/esm2022/lib/search/shared/sources/icherche.interfaces.mjs +2 -0
  415. package/esm2022/lib/search/shared/sources/icherche.mjs +816 -0
  416. package/esm2022/lib/search/shared/sources/icherche.providers.mjs +87 -0
  417. package/esm2022/lib/search/shared/sources/ilayer.interfaces.mjs +2 -0
  418. package/esm2022/lib/search/shared/sources/ilayer.mjs +339 -0
  419. package/esm2022/lib/search/shared/sources/ilayer.providers.mjs +58 -0
  420. package/esm2022/lib/search/shared/sources/index.mjs +23 -0
  421. package/esm2022/lib/search/shared/sources/nominatim.interfaces.mjs +2 -0
  422. package/esm2022/lib/search/shared/sources/nominatim.mjs +263 -0
  423. package/esm2022/lib/search/shared/sources/nominatim.providers.mjs +31 -0
  424. package/esm2022/lib/search/shared/sources/source.interfaces.mjs +13 -0
  425. package/esm2022/lib/search/shared/sources/source.mjs +221 -0
  426. package/esm2022/lib/search/shared/sources/storedqueries.interfaces.mjs +2 -0
  427. package/esm2022/lib/search/shared/sources/storedqueries.mjs +454 -0
  428. package/esm2022/lib/search/shared/sources/storedqueries.providers.mjs +56 -0
  429. package/esm2022/lib/search/shared/sources/workspace.interfaces.mjs +2 -0
  430. package/esm2022/lib/search/shared/sources/workspace.mjs +192 -0
  431. package/esm2022/lib/search/shared/sources/workspace.providers.mjs +31 -0
  432. package/esm2022/lib/style/index.mjs +5 -0
  433. package/esm2022/lib/style/shared/datasource/esri-style-generator.mjs +360 -0
  434. package/esm2022/lib/style/shared/datasource/index.mjs +2 -0
  435. package/esm2022/lib/style/shared/feature/feature-style.mjs +162 -0
  436. package/esm2022/lib/style/shared/feature/index.mjs +2 -0
  437. package/esm2022/lib/style/shared/font.enum.mjs +17 -0
  438. package/esm2022/lib/style/shared/index.mjs +5 -0
  439. package/esm2022/lib/style/shared/overlay/index.mjs +3 -0
  440. package/esm2022/lib/style/shared/overlay/overlay-marker-style.utils.mjs +39 -0
  441. package/esm2022/lib/style/shared/overlay/overlay-style.utils.mjs +88 -0
  442. package/esm2022/lib/style/shared/vector/commonVectorStyle.mjs +78 -0
  443. package/esm2022/lib/style/shared/vector/conversion.utils.mjs +27 -0
  444. package/esm2022/lib/style/shared/vector/index.mjs +4 -0
  445. package/esm2022/lib/style/shared/vector/vector-style.interface.mjs +2 -0
  446. package/esm2022/lib/style/style-list/index.mjs +5 -0
  447. package/esm2022/lib/style/style-list/style-list.interface.mjs +2 -0
  448. package/esm2022/lib/style/style-list/style-list.module.mjs +23 -0
  449. package/esm2022/lib/style/style-list/style-list.provider.mjs +21 -0
  450. package/esm2022/lib/style/style-list/style-list.service.mjs +52 -0
  451. package/esm2022/lib/style/style-modal/drawing/index.mjs +2 -0
  452. package/esm2022/lib/style/style-modal/drawing/style-modal-drawing.component.mjs +193 -0
  453. package/esm2022/lib/style/style-modal/index.mjs +5 -0
  454. package/esm2022/lib/style/style-modal/layer/index.mjs +2 -0
  455. package/esm2022/lib/style/style-modal/layer/style-modal-layer.component.mjs +142 -0
  456. package/esm2022/lib/style/style-modal/layer-button/index.mjs +2 -0
  457. package/esm2022/lib/style/style-modal/layer-button/style-modal-layer-button.component.mjs +44 -0
  458. package/esm2022/lib/style/style-modal/shared/index.mjs +2 -0
  459. package/esm2022/lib/style/style-modal/shared/style-modal.interface.mjs +2 -0
  460. package/esm2022/lib/style/style-service/draw-style.service.mjs +255 -0
  461. package/esm2022/lib/style/style-service/index.mjs +3 -0
  462. package/esm2022/lib/style/style-service/style.service.mjs +393 -0
  463. package/esm2022/lib/style/style.module.mjs +46 -0
  464. package/esm2022/lib/toast/index.mjs +2 -0
  465. package/esm2022/lib/toast/toast.component.mjs +99 -0
  466. package/esm2022/lib/toast/toast.module.mjs +24 -0
  467. package/esm2022/lib/utils/googleLinks.mjs +13 -0
  468. package/esm2022/lib/utils/id-generator.mjs +112 -0
  469. package/esm2022/lib/utils/index.mjs +5 -0
  470. package/esm2022/lib/utils/osmLinks.mjs +9 -0
  471. package/esm2022/lib/utils/propertyTypeDetector/index.mjs +3 -0
  472. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.interface.mjs +2 -0
  473. package/esm2022/lib/utils/propertyTypeDetector/propertyTypeDetector.service.mjs +64 -0
  474. package/esm2022/lib/wkt/index.mjs +2 -0
  475. package/esm2022/lib/wkt/shared/index.mjs +2 -0
  476. package/esm2022/lib/wkt/shared/wkt.service.mjs +235 -0
  477. package/esm2022/lib/wkt/wkt.module.mjs +25 -0
  478. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +36 -0
  479. package/esm2022/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +19 -0
  480. package/esm2022/lib/workspace/confirmation-popup/index.mjs +3 -0
  481. package/esm2022/lib/workspace/index.mjs +8 -0
  482. package/esm2022/lib/workspace/shared/edition-workspace.mjs +301 -0
  483. package/esm2022/lib/workspace/shared/edition-workspace.service.mjs +720 -0
  484. package/esm2022/lib/workspace/shared/feature-workspace.mjs +41 -0
  485. package/esm2022/lib/workspace/shared/feature-workspace.service.mjs +113 -0
  486. package/esm2022/lib/workspace/shared/index.mjs +8 -0
  487. package/esm2022/lib/workspace/shared/wfs-workspace.mjs +41 -0
  488. package/esm2022/lib/workspace/shared/wfs-workspace.service.mjs +121 -0
  489. package/esm2022/lib/workspace/shared/wms-workspace.service.mjs +248 -0
  490. package/esm2022/lib/workspace/shared/workspace.utils.mjs +188 -0
  491. package/esm2022/lib/workspace/widgets/index.mjs +4 -0
  492. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +48 -0
  493. package/esm2022/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +19 -0
  494. package/esm2022/lib/workspace/widgets/widgets.mjs +15 -0
  495. package/esm2022/lib/workspace/workspace-selector/workspace-selector.directive.mjs +172 -0
  496. package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
  497. package/esm2022/lib/workspace/workspace-updator/workspace-updator.directive.mjs +137 -0
  498. package/esm2022/lib/workspace/workspace-updator/workspace-updator.module.mjs +19 -0
  499. package/esm2022/lib/workspace/workspace.module.mjs +32 -0
  500. package/esm2022/public_api.mjs +56 -0
  501. package/fesm2022/igo2-geo.mjs +717 -691
  502. package/fesm2022/igo2-geo.mjs.map +1 -1
  503. package/lib/datasource/shared/datasources/datasource.d.ts +2 -2
  504. package/lib/directions/shared/directions.service.d.ts +0 -1
  505. package/lib/offline/geoDB/geoDB.service.d.ts +1 -1
  506. package/lib/offline/layerDB/layerDB.service.d.ts +1 -1
  507. package/lib/style/style-list/style-list.provider.d.ts +8 -1
  508. package/lib/style/style-list/style-list.service.d.ts +1 -1
  509. package/package.json +16 -14
  510. package/src/lib/layer/layer-list/layer-list.theme.scss +1 -2
  511. package/src/lib/map/menu-button/menu-button.theming.scss +3 -3
  512. package/src/style/style.scss +1 -1
@@ -0,0 +1,756 @@
1
+ /* eslint-disable no-prototype-builtins */
2
+ import { ObjectUtils, uuid } from '@igo2/utils';
3
+ import olFormatWFS from 'ol/format/WFS';
4
+ import olFormatWKT from 'ol/format/WKT';
5
+ import * as olfilter from 'ol/format/filter';
6
+ import { default as moment } from 'moment';
7
+ import { OgcFilterOperator, OgcFilterOperatorType } from './ogc-filter.enum';
8
+ export class OgcFilterWriter {
9
+ filterSequence = [];
10
+ operators = {
11
+ [OgcFilterOperator.PropertyIsEqualTo]: {
12
+ spatial: false,
13
+ fieldRestrict: []
14
+ },
15
+ [OgcFilterOperator.PropertyIsNotEqualTo]: {
16
+ spatial: false,
17
+ fieldRestrict: []
18
+ },
19
+ [OgcFilterOperator.PropertyIsLike]: {
20
+ spatial: false,
21
+ fieldRestrict: ['string']
22
+ },
23
+ [OgcFilterOperator.PropertyIsGreaterThan]: {
24
+ spatial: false,
25
+ fieldRestrict: ['number']
26
+ },
27
+ [OgcFilterOperator.PropertyIsGreaterThanOrEqualTo]: {
28
+ spatial: false,
29
+ fieldRestrict: ['number']
30
+ },
31
+ [OgcFilterOperator.PropertyIsLessThan]: {
32
+ spatial: false,
33
+ fieldRestrict: ['number']
34
+ },
35
+ [OgcFilterOperator.PropertyIsLessThanOrEqualTo]: {
36
+ spatial: false,
37
+ fieldRestrict: ['number']
38
+ },
39
+ [OgcFilterOperator.PropertyIsBetween]: {
40
+ spatial: false,
41
+ fieldRestrict: ['number']
42
+ },
43
+ [OgcFilterOperator.During]: { spatial: false, fieldRestrict: [] },
44
+ [OgcFilterOperator.PropertyIsNull]: {
45
+ spatial: false,
46
+ fieldRestrict: []
47
+ },
48
+ [OgcFilterOperator.Intersects]: {
49
+ spatial: true,
50
+ fieldRestrict: []
51
+ },
52
+ [OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] },
53
+ [OgcFilterOperator.Contains]: { spatial: true, fieldRestrict: [] }
54
+ };
55
+ defineOgcFiltersDefaultOptions(ogcFiltersOptions, fieldNameGeometry, srcType) {
56
+ let ogcFiltersDefaultValue = true; // default values for wfs.
57
+ if (srcType && srcType === 'wms') {
58
+ ogcFiltersDefaultValue = false;
59
+ }
60
+ ogcFiltersOptions = ogcFiltersOptions || {};
61
+ ogcFiltersOptions.enabled =
62
+ ogcFiltersOptions.enabled === undefined
63
+ ? ogcFiltersDefaultValue
64
+ : ogcFiltersOptions.enabled;
65
+ ogcFiltersOptions.editable =
66
+ ogcFiltersOptions.editable === undefined
67
+ ? ogcFiltersDefaultValue
68
+ : ogcFiltersOptions.editable;
69
+ ogcFiltersOptions.geometryName = fieldNameGeometry;
70
+ ogcFiltersOptions.advancedOgcFilters = true;
71
+ if (ogcFiltersOptions.enabled &&
72
+ (ogcFiltersOptions.pushButtons ||
73
+ ogcFiltersOptions.checkboxes ||
74
+ ogcFiltersOptions.radioButtons ||
75
+ ogcFiltersOptions.select ||
76
+ ogcFiltersOptions.autocomplete)) {
77
+ ogcFiltersOptions.advancedOgcFilters = false;
78
+ }
79
+ return ogcFiltersOptions;
80
+ }
81
+ buildFilter(filters, extent, proj, fieldNameGeometry, options) {
82
+ let ourBboxFilter;
83
+ let enableBbox;
84
+ if (/intersects|contains|within/gi.test(JSON.stringify(filters))) {
85
+ enableBbox = false;
86
+ }
87
+ else {
88
+ enableBbox = true;
89
+ }
90
+ if (filters) {
91
+ fieldNameGeometry =
92
+ filters.geometryName !== undefined
93
+ ? filters.geometryName
94
+ : fieldNameGeometry;
95
+ }
96
+ if (extent && filters) {
97
+ ourBboxFilter = olfilter.bbox(fieldNameGeometry, extent, proj.getCode());
98
+ }
99
+ let filterAssembly;
100
+ if (filters) {
101
+ filters = this.checkIgoFiltersProperties(filters, fieldNameGeometry, proj);
102
+ if (extent && enableBbox) {
103
+ filterAssembly = olfilter.and(ourBboxFilter, this.bundleFilter(filters, options));
104
+ }
105
+ else {
106
+ filterAssembly = this.bundleFilter(filters, options);
107
+ }
108
+ }
109
+ else {
110
+ if (extent && proj) {
111
+ return 'bbox=' + extent.join(',') + ',' + proj.getCode();
112
+ }
113
+ else {
114
+ return undefined;
115
+ }
116
+ }
117
+ const wfsOptions = {
118
+ srsName: '',
119
+ featureNS: '',
120
+ featurePrefix: '',
121
+ featureTypes: ['featureTypes'],
122
+ filter: filterAssembly,
123
+ outputFormat: '',
124
+ geometryName: fieldNameGeometry
125
+ };
126
+ const query = new olFormatWFS().writeGetFeature(wfsOptions);
127
+ const str = new XMLSerializer().serializeToString(query);
128
+ const regexp1 = /typenames *=|typename *=\"featureTypes\" *>/gi;
129
+ const regexp2 = /<\/Query><\/GetFeature>/gi;
130
+ return 'filter=' + str.split(regexp1)[1].split(regexp2)[0];
131
+ }
132
+ bundleFilter(filterObject, options) {
133
+ if (filterObject instanceof Array) {
134
+ const logicalArray = [];
135
+ filterObject.forEach((element) => {
136
+ logicalArray.push(this.bundleFilter(element, options));
137
+ });
138
+ return logicalArray;
139
+ }
140
+ else {
141
+ if (filterObject.hasOwnProperty('logical')) {
142
+ return this.createFilter({
143
+ operator: filterObject.logical,
144
+ logicalArray: this.bundleFilter(filterObject.filters, options)
145
+ }, options);
146
+ }
147
+ else if (filterObject.hasOwnProperty('operator')) {
148
+ return this.createFilter(filterObject, options);
149
+ }
150
+ }
151
+ }
152
+ createFilter(filterOptions, options) {
153
+ const operator = filterOptions.operator;
154
+ const logicalArray = filterOptions.logicalArray;
155
+ const wfsPropertyName = filterOptions.propertyName;
156
+ const wfsPattern = filterOptions.pattern;
157
+ const wfsMatchCase = filterOptions.matchCase
158
+ ? filterOptions.matchCase
159
+ : true;
160
+ const wfsWildCard = filterOptions.wildCard ? filterOptions.wildCard : '*';
161
+ const wfsSingleChar = filterOptions.singleChar
162
+ ? filterOptions.singleChar
163
+ : '.';
164
+ const wfsEscapeChar = filterOptions.escapeChar
165
+ ? filterOptions.escapeChar
166
+ : '!';
167
+ const wfsLowerBoundary = filterOptions.lowerBoundary;
168
+ const wfsUpperBoundary = filterOptions.upperBoundary;
169
+ const wfsGeometryName = filterOptions.geometryName;
170
+ const wfsExtent = filterOptions.extent;
171
+ const wfsWktGeometry = filterOptions.wkt_geometry;
172
+ const wfsSrsName = filterOptions.srsName
173
+ ? filterOptions.srsName
174
+ : 'EPSG:3857';
175
+ const wfsBegin = this.parseFilterOptionDate(filterOptions.begin, options ? options.minDate : undefined);
176
+ const wfsEnd = this.parseFilterOptionDate(filterOptions.end, options ? options.maxDate : undefined);
177
+ const wfsExpression = filterOptions.expression;
178
+ let geometry;
179
+ if (wfsWktGeometry) {
180
+ const wkt = new olFormatWKT();
181
+ geometry = wkt.readGeometry(wfsWktGeometry, {
182
+ dataProjection: wfsSrsName,
183
+ featureProjection: wfsSrsName || 'EPSG:3857'
184
+ });
185
+ }
186
+ switch (operator.toLowerCase()) {
187
+ case OgcFilterOperator.BBOX.toLowerCase():
188
+ return olfilter.bbox(wfsGeometryName, wfsExtent, wfsSrsName);
189
+ case OgcFilterOperator.PropertyIsBetween.toLowerCase():
190
+ return olfilter.between(wfsPropertyName, wfsLowerBoundary || 1e40 * -1, wfsUpperBoundary || 1e40);
191
+ case OgcFilterOperator.Contains.toLowerCase():
192
+ return olfilter.contains(wfsGeometryName, geometry, wfsSrsName);
193
+ case OgcFilterOperator.During.toLowerCase():
194
+ return olfilter.during(wfsPropertyName, wfsBegin, wfsEnd);
195
+ case OgcFilterOperator.PropertyIsEqualTo.toLowerCase():
196
+ return olfilter.equalTo(wfsPropertyName, wfsExpression, wfsMatchCase);
197
+ case OgcFilterOperator.PropertyIsGreaterThan.toLowerCase():
198
+ return olfilter.greaterThan(wfsPropertyName, wfsExpression);
199
+ case OgcFilterOperator.PropertyIsGreaterThanOrEqualTo.toLowerCase():
200
+ return olfilter.greaterThanOrEqualTo(wfsPropertyName, wfsExpression);
201
+ case OgcFilterOperator.Intersects.toLowerCase():
202
+ return olfilter.intersects(wfsGeometryName, geometry, wfsSrsName);
203
+ case OgcFilterOperator.PropertyIsNull.toLowerCase():
204
+ return olfilter.isNull(wfsPropertyName);
205
+ case OgcFilterOperator.PropertyIsLessThan.toLowerCase():
206
+ return olfilter.lessThan(wfsPropertyName, wfsExpression);
207
+ case OgcFilterOperator.PropertyIsLessThanOrEqualTo.toLowerCase():
208
+ return olfilter.lessThanOrEqualTo(wfsPropertyName, wfsExpression);
209
+ case OgcFilterOperator.PropertyIsLike.toLowerCase():
210
+ return olfilter.like(wfsPropertyName, wfsPattern
211
+ ? wfsPattern.replace(/[()_]/gi, wfsSingleChar)
212
+ : wfsWildCard, wfsWildCard, wfsSingleChar, wfsEscapeChar, wfsMatchCase);
213
+ case OgcFilterOperator.PropertyIsNotEqualTo.toLowerCase():
214
+ return olfilter.notEqualTo(wfsPropertyName, wfsExpression, wfsMatchCase);
215
+ case OgcFilterOperator.Within.toLowerCase():
216
+ return olfilter.within(wfsGeometryName, geometry, wfsSrsName);
217
+ // LOGICAL
218
+ case OgcFilterOperator.And.toLowerCase():
219
+ return olfilter.and.apply(null, logicalArray);
220
+ case OgcFilterOperator.Or.toLowerCase():
221
+ return olfilter.or.apply(null, logicalArray);
222
+ case OgcFilterOperator.Not.toLowerCase():
223
+ return olfilter.not.apply(null, logicalArray);
224
+ default:
225
+ return undefined;
226
+ }
227
+ }
228
+ defineInterfaceFilterSequence(filterObject, geometryName, logical = '', level = -1) {
229
+ if (filterObject instanceof Array) {
230
+ filterObject.forEach((element) => {
231
+ this.filterSequence.concat(this.defineInterfaceFilterSequence(element, geometryName, logical, level));
232
+ });
233
+ }
234
+ else {
235
+ if (filterObject.hasOwnProperty('logical')) {
236
+ level = level + 1;
237
+ this.filterSequence.concat(this.defineInterfaceFilterSequence(filterObject.filters, geometryName, filterObject.logical, level));
238
+ }
239
+ else if (filterObject.hasOwnProperty('operator')) {
240
+ this.filterSequence.push(this.addInterfaceFilter(filterObject, geometryName, level, logical));
241
+ }
242
+ }
243
+ return this.filterSequence;
244
+ }
245
+ computeAllowedOperators(fields, propertyName, defaultOperatorsType) {
246
+ let effectiveOperators = {};
247
+ let allowedOperators;
248
+ let fieldsHasSpatialOperator;
249
+ let includeContains;
250
+ if (fields && propertyName) {
251
+ const srcField = fields.find((field) => field.name === propertyName);
252
+ allowedOperators =
253
+ srcField && srcField.allowedOperatorsType
254
+ ? srcField.allowedOperatorsType
255
+ : defaultOperatorsType;
256
+ }
257
+ if (fields) {
258
+ fields.map((field) => {
259
+ if (!field.allowedOperatorsType) {
260
+ return;
261
+ }
262
+ const allowedOperatorsType = field.allowedOperatorsType.toLowerCase();
263
+ if (allowedOperatorsType === OgcFilterOperatorType.All.toLowerCase() ||
264
+ allowedOperatorsType ===
265
+ OgcFilterOperatorType.Spatial.toLowerCase() ||
266
+ allowedOperatorsType ===
267
+ OgcFilterOperatorType.BasicAndSpatial.toLowerCase()) {
268
+ fieldsHasSpatialOperator = true;
269
+ if (allowedOperatorsType === OgcFilterOperatorType.All.toLowerCase()) {
270
+ includeContains = true;
271
+ }
272
+ }
273
+ });
274
+ }
275
+ allowedOperators = allowedOperators
276
+ ? allowedOperators
277
+ : OgcFilterOperatorType.BasicAndSpatial;
278
+ switch (allowedOperators.toLowerCase()) {
279
+ case OgcFilterOperatorType.All:
280
+ effectiveOperators = this.operators;
281
+ break;
282
+ case OgcFilterOperatorType.Spatial:
283
+ effectiveOperators = {
284
+ [OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
285
+ [OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
286
+ };
287
+ break;
288
+ case OgcFilterOperatorType.BasicAndSpatial:
289
+ effectiveOperators = {
290
+ [OgcFilterOperator.PropertyIsEqualTo]: {
291
+ spatial: false,
292
+ fieldRestrict: []
293
+ },
294
+ [OgcFilterOperator.PropertyIsNotEqualTo]: {
295
+ spatial: false,
296
+ fieldRestrict: []
297
+ },
298
+ [OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
299
+ [OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
300
+ };
301
+ break;
302
+ case OgcFilterOperatorType.Basic:
303
+ effectiveOperators = {
304
+ [OgcFilterOperator.PropertyIsEqualTo]: {
305
+ spatial: false,
306
+ fieldRestrict: []
307
+ },
308
+ [OgcFilterOperator.PropertyIsNotEqualTo]: {
309
+ spatial: false,
310
+ fieldRestrict: []
311
+ }
312
+ };
313
+ break;
314
+ case OgcFilterOperatorType.Time:
315
+ effectiveOperators = {
316
+ [OgcFilterOperator.During]: { spatial: false, fieldRestrict: [] }
317
+ };
318
+ break;
319
+ case OgcFilterOperatorType.BasicNumericOperator:
320
+ effectiveOperators = {
321
+ [OgcFilterOperator.PropertyIsEqualTo]: {
322
+ spatial: false,
323
+ fieldRestrict: []
324
+ },
325
+ [OgcFilterOperator.PropertyIsNotEqualTo]: {
326
+ spatial: false,
327
+ fieldRestrict: []
328
+ },
329
+ [OgcFilterOperator.PropertyIsGreaterThan]: {
330
+ spatial: false,
331
+ fieldRestrict: ['number']
332
+ },
333
+ [OgcFilterOperator.PropertyIsGreaterThanOrEqualTo]: {
334
+ spatial: false,
335
+ fieldRestrict: ['number']
336
+ },
337
+ [OgcFilterOperator.PropertyIsLessThan]: {
338
+ spatial: false,
339
+ fieldRestrict: ['number']
340
+ },
341
+ [OgcFilterOperator.PropertyIsLessThanOrEqualTo]: {
342
+ spatial: false,
343
+ fieldRestrict: ['number']
344
+ }
345
+ };
346
+ break;
347
+ default:
348
+ effectiveOperators = {
349
+ [OgcFilterOperator.PropertyIsEqualTo]: {
350
+ spatial: false,
351
+ fieldRestrict: []
352
+ },
353
+ [OgcFilterOperator.PropertyIsNotEqualTo]: {
354
+ spatial: false,
355
+ fieldRestrict: []
356
+ },
357
+ [OgcFilterOperator.Intersects]: { spatial: true, fieldRestrict: [] },
358
+ [OgcFilterOperator.Within]: { spatial: true, fieldRestrict: [] }
359
+ };
360
+ }
361
+ if (fieldsHasSpatialOperator) {
362
+ effectiveOperators.Intersects = {
363
+ spatial: true,
364
+ fieldRestrict: []
365
+ };
366
+ effectiveOperators.Within = { spatial: true, fieldRestrict: [] };
367
+ if (includeContains) {
368
+ effectiveOperators.Contains = {
369
+ spatial: true,
370
+ fieldRestrict: []
371
+ };
372
+ }
373
+ }
374
+ return effectiveOperators;
375
+ }
376
+ addInterfaceFilter(igoOgcFilterObject, geometryName, level = 0, parentLogical = 'Or') {
377
+ if (!igoOgcFilterObject) {
378
+ igoOgcFilterObject = { operator: 'PropertyIsEqualTo' };
379
+ }
380
+ const f = {
381
+ propertyName: '',
382
+ operator: '',
383
+ active: '',
384
+ filterid: uuid(),
385
+ step: '',
386
+ begin: '',
387
+ end: '',
388
+ sliderOptions: {},
389
+ lowerBoundary: '',
390
+ upperBoundary: '',
391
+ expression: '',
392
+ pattern: '',
393
+ wildCard: '*',
394
+ singleChar: '.',
395
+ escapeChar: '!',
396
+ matchCase: true,
397
+ igoSpatialSelector: '',
398
+ igoSNRC: '',
399
+ geometryName: '',
400
+ geometry: '',
401
+ wkt_geometry: '',
402
+ extent: '',
403
+ srsName: '',
404
+ parentLogical: '',
405
+ level: 0
406
+ };
407
+ return Object.assign(f, {
408
+ parentLogical,
409
+ level,
410
+ geometryName
411
+ }, igoOgcFilterObject);
412
+ }
413
+ checkIgoFiltersProperties(filterObject, fieldNameGeometry, proj, active = false) {
414
+ const filterArray = [];
415
+ if (filterObject instanceof Array) {
416
+ filterObject.forEach((element) => {
417
+ filterArray.push(this.checkIgoFiltersProperties(element, fieldNameGeometry, proj, active));
418
+ });
419
+ return filterArray;
420
+ }
421
+ else {
422
+ if (filterObject.hasOwnProperty('logical')) {
423
+ return Object.assign({}, {
424
+ logical: filterObject.logical,
425
+ filters: this.checkIgoFiltersProperties(filterObject.filters, fieldNameGeometry, proj, active)
426
+ });
427
+ }
428
+ else if (filterObject.hasOwnProperty('operator')) {
429
+ return this.addFilterProperties(filterObject, fieldNameGeometry, proj, active);
430
+ }
431
+ }
432
+ }
433
+ addFilterProperties(igoOgcFilterObject, fieldNameGeometry, proj, active = false) {
434
+ const filterid = igoOgcFilterObject.hasOwnProperty('filterid')
435
+ ? igoOgcFilterObject.filterid
436
+ : uuid();
437
+ const status = igoOgcFilterObject.hasOwnProperty('active')
438
+ ? igoOgcFilterObject.active
439
+ : active;
440
+ const srsName = igoOgcFilterObject.hasOwnProperty('srsName')
441
+ ? igoOgcFilterObject.srsName
442
+ : proj
443
+ ? proj.getCode()
444
+ : 'EPSG:3857';
445
+ return Object.assign({}, {
446
+ filterid,
447
+ active: status,
448
+ igoSpatialSelector: 'fixedExtent',
449
+ srsName
450
+ }, igoOgcFilterObject, { geometryName: fieldNameGeometry });
451
+ }
452
+ rebuiltIgoOgcFilterObjectFromSequence(sequence) {
453
+ if (sequence instanceof Array) {
454
+ if (sequence.length >= 1) {
455
+ let lastParentLogical = sequence[0].parentLogical;
456
+ let nextElement;
457
+ let logicalArray = [];
458
+ let lastProcessedFilter;
459
+ sequence.forEach((uiFilter) => {
460
+ const element = Object.assign({}, uiFilter);
461
+ const index = sequence.indexOf(uiFilter);
462
+ if (index >= 0 && index < sequence.length - 1) {
463
+ nextElement = sequence[index + 1];
464
+ }
465
+ else {
466
+ nextElement = element;
467
+ }
468
+ delete element.active;
469
+ delete element.filterid;
470
+ delete element.parentLogical;
471
+ logicalArray.push(element);
472
+ if (sequence.length === 1) {
473
+ lastProcessedFilter = element;
474
+ }
475
+ else if (lastParentLogical !== nextElement.parentLogical) {
476
+ if (logicalArray.length === 1) {
477
+ console.log('You must set at ' +
478
+ 'least two operator in a logical (' +
479
+ lastParentLogical +
480
+ ')');
481
+ }
482
+ else {
483
+ lastProcessedFilter = Object.assign({}, { logical: lastParentLogical, filters: logicalArray });
484
+ logicalArray = [lastProcessedFilter];
485
+ lastParentLogical = nextElement.parentLogical;
486
+ }
487
+ }
488
+ });
489
+ return lastProcessedFilter;
490
+ }
491
+ else {
492
+ return undefined;
493
+ }
494
+ }
495
+ else {
496
+ return undefined;
497
+ }
498
+ }
499
+ computeIgoSelector(selectors) {
500
+ if (selectors.groups.every((group) => group.computedSelectors !== undefined)) {
501
+ return selectors;
502
+ }
503
+ let selector;
504
+ if (selectors.groups && selectors.bundles) {
505
+ if (!selectors.bundles.every((bundle) => bundle.id !== undefined)) {
506
+ throw new Error('You must set an id for each of your bundles');
507
+ }
508
+ selector = ObjectUtils.copyDeep(selectors);
509
+ selector.groups.forEach((group) => {
510
+ group.title = group.title ? group.title : group.name;
511
+ group.enabled = group.enabled ? group.enabled : false;
512
+ group.computedSelectors = ObjectUtils.copyDeep(selector.bundles.filter((b) => group.ids.includes(b.id)));
513
+ });
514
+ }
515
+ else if (!selectors.groups && selectors.bundles) {
516
+ selector = ObjectUtils.copyDeep(selectors);
517
+ selector.groups = [
518
+ {
519
+ title: 'group1',
520
+ name: 'group1',
521
+ computedSelectors: ObjectUtils.copyDeep(selector.bundles)
522
+ }
523
+ ];
524
+ }
525
+ else {
526
+ selector = {
527
+ bundles: selectors,
528
+ groups: [
529
+ {
530
+ title: 'group1',
531
+ name: 'group1',
532
+ computedSelectors: ObjectUtils.copyDeep(selectors)
533
+ }
534
+ ],
535
+ selectorType: selector.selectorType
536
+ };
537
+ }
538
+ if (!selector.groups.find((selectorGroup) => selectorGroup.enabled)) {
539
+ selector.groups[0].enabled = true;
540
+ }
541
+ return selector;
542
+ }
543
+ handleOgcFiltersAppliedValue(options, fieldNameGeometry, extent, proj) {
544
+ const ogcFilters = options.ogcFilters;
545
+ if (!ogcFilters) {
546
+ return;
547
+ }
548
+ const conditions = [];
549
+ let filterQueryStringSelector = '';
550
+ let filterQueryStringAdvancedFilters = '';
551
+ if (ogcFilters.enabled &&
552
+ (ogcFilters.pushButtons ||
553
+ ogcFilters.checkboxes ||
554
+ ogcFilters.radioButtons ||
555
+ ogcFilters.select ||
556
+ ogcFilters.autocomplete)) {
557
+ let selectors;
558
+ if (ogcFilters.pushButtons) {
559
+ selectors = ogcFilters.pushButtons;
560
+ const pushConditions = this.formatGroupAndFilter(ogcFilters, selectors);
561
+ for (const condition of pushConditions) {
562
+ conditions.push(condition);
563
+ }
564
+ }
565
+ if (ogcFilters.checkboxes) {
566
+ selectors = ogcFilters.checkboxes;
567
+ const checkboxConditions = this.formatGroupAndFilter(ogcFilters, selectors);
568
+ for (const condition of checkboxConditions) {
569
+ conditions.push(condition);
570
+ }
571
+ }
572
+ if (ogcFilters.radioButtons) {
573
+ selectors = ogcFilters.radioButtons;
574
+ const selectorsCorr = this.verifyMultipleEnableds(selectors);
575
+ const radioConditions = this.formatGroupAndFilter(ogcFilters, selectorsCorr);
576
+ for (const condition of radioConditions) {
577
+ conditions.push(condition);
578
+ }
579
+ }
580
+ if (ogcFilters.select) {
581
+ selectors = ogcFilters.select;
582
+ const selectorsCorr = this.verifyMultipleEnableds(selectors);
583
+ const selectConditions = this.formatGroupAndFilter(ogcFilters, selectorsCorr);
584
+ for (const condition of selectConditions) {
585
+ conditions.push(condition);
586
+ }
587
+ }
588
+ if (ogcFilters.autocomplete) {
589
+ selectors = ogcFilters.autocomplete;
590
+ const selectConditions = this.formatGroupAndFilter(ogcFilters, selectors);
591
+ for (const condition of selectConditions) {
592
+ conditions.push(condition);
593
+ }
594
+ }
595
+ if (ogcFilters.filters &&
596
+ 'operator' in ogcFilters.filters &&
597
+ ogcFilters.filters.operator.toLowerCase() ===
598
+ OgcFilterOperator.During.toLowerCase() &&
599
+ ogcFilters.filters.active &&
600
+ ogcFilters.interfaceOgcFilters?.length > 0) {
601
+ conditions.push(ogcFilters.interfaceOgcFilters[0]);
602
+ }
603
+ if (conditions.length >= 1) {
604
+ filterQueryStringSelector = this.buildFilter(conditions.length === 1
605
+ ? conditions[0]
606
+ : { logical: 'And', filters: conditions }, extent, proj, ogcFilters.geometryName);
607
+ }
608
+ }
609
+ if (ogcFilters.enabled && ogcFilters.filters) {
610
+ ogcFilters.geometryName = ogcFilters.geometryName || fieldNameGeometry;
611
+ const igoFilters = ogcFilters.filters;
612
+ filterQueryStringAdvancedFilters = this.buildFilter(igoFilters, extent, proj, ogcFilters.geometryName, options);
613
+ }
614
+ let filterQueryString = ogcFilters.advancedOgcFilters
615
+ ? filterQueryStringAdvancedFilters
616
+ : filterQueryStringSelector;
617
+ if (options.type === 'wms') {
618
+ filterQueryString = this.formatProcessedOgcFilter(filterQueryString, options.params.LAYERS);
619
+ }
620
+ if (options.type === 'wfs') {
621
+ filterQueryString = this.formatProcessedOgcFilter(filterQueryString, options.params.featureTypes);
622
+ }
623
+ return filterQueryString;
624
+ }
625
+ verifyMultipleEnableds(selectors) {
626
+ selectors.bundles.forEach((bundle) => {
627
+ if (!bundle.multiple && bundle.selectors) {
628
+ const enableds = bundle.selectors.reduce((list, filter, index) => filter.enabled === true ? list.concat(index) : list, []);
629
+ if (enableds.length > 1) {
630
+ enableds.splice(0, 1);
631
+ enableds.forEach((index) => {
632
+ bundle.selectors[index].enabled = false;
633
+ });
634
+ }
635
+ }
636
+ });
637
+ return selectors;
638
+ }
639
+ formatGroupAndFilter(ogcFilters, selectors) {
640
+ selectors = this.computeIgoSelector(selectors);
641
+ const selectorBundle = selectors.groups.find((g) => g.enabled).computedSelectors;
642
+ const conditions = [];
643
+ selectorBundle.map((bundle) => {
644
+ const bundleCondition = [];
645
+ const selectorsType = bundle.selectors;
646
+ if (!selectorsType) {
647
+ return;
648
+ }
649
+ selectorsType
650
+ .filter((ogcselector) => ogcselector.enabled === true)
651
+ .forEach((enabledSelector) => bundleCondition.push(enabledSelector.filters));
652
+ if (bundleCondition.length === 1) {
653
+ conditions.push(bundleCondition[0]);
654
+ }
655
+ else if (bundleCondition.length > 1) {
656
+ conditions.push({
657
+ logical: bundle.logical,
658
+ filters: bundleCondition
659
+ });
660
+ }
661
+ });
662
+ if (selectors.selectorType === 'pushButton') {
663
+ ogcFilters.pushButtons = selectors;
664
+ }
665
+ else if (selectors.selectorType === 'checkbox') {
666
+ ogcFilters.checkboxes = selectors;
667
+ }
668
+ else if (selectors.selectorType === 'radioButton') {
669
+ ogcFilters.radioButtons = selectors;
670
+ }
671
+ else if (selectors.selectorType === 'select') {
672
+ ogcFilters.select = selectors;
673
+ }
674
+ else if (selectors.selectorType === 'autocomplete') {
675
+ ogcFilters.autocomplete = selectors;
676
+ }
677
+ return conditions;
678
+ }
679
+ formatProcessedOgcFilter(processedFilter, layersOrTypenames) {
680
+ if (!processedFilter) {
681
+ return undefined;
682
+ }
683
+ let appliedFilter = '';
684
+ if (processedFilter.length === 0 && layersOrTypenames.indexOf(',') === -1) {
685
+ appliedFilter = processedFilter;
686
+ }
687
+ else {
688
+ layersOrTypenames.split(',').forEach(() => {
689
+ appliedFilter = `${appliedFilter}(${processedFilter.replace('filter=', '')})`;
690
+ });
691
+ }
692
+ appliedFilter = appliedFilter.replace(/\(\)/g, '');
693
+ const filterValue = appliedFilter.length > 0
694
+ ? appliedFilter.replace('filter=', '')
695
+ : undefined;
696
+ return filterValue;
697
+ }
698
+ parseFilterOptionDate(value, defaultValue) {
699
+ if (!value) {
700
+ return defaultValue;
701
+ }
702
+ else if (value.toLowerCase().includes('now') ||
703
+ value.toLowerCase().includes('today')) {
704
+ return this.parseDateOperation(value);
705
+ }
706
+ else if (moment(value).isValid()) {
707
+ return value;
708
+ }
709
+ else {
710
+ return undefined;
711
+ }
712
+ }
713
+ /**
714
+ * this function to parse date with specific format
715
+ * exemple 'today + 1 days' or 'now + 1 years'
716
+ * @param value string date
717
+ * @returns date
718
+ */
719
+ parseDateOperation(value) {
720
+ const operationSplitted = value.toLowerCase().split(' ');
721
+ const leftOperand = operationSplitted[0];
722
+ const operator = ['+', '-'].includes(operationSplitted[1])
723
+ ? operationSplitted[1]
724
+ : undefined;
725
+ const rightOperand = /^[0-9]*$/.test(operationSplitted[2])
726
+ ? operationSplitted[2]
727
+ : undefined;
728
+ const rightUnitOperand = (['years', 'months', 'weeks', 'days', 'hours', 'seconds'].includes(operationSplitted[3])
729
+ ? operationSplitted[3]
730
+ : undefined);
731
+ if (!operator || !rightUnitOperand || !rightOperand) {
732
+ return leftOperand === 'now'
733
+ ? moment().format()
734
+ : moment().endOf('day').format();
735
+ }
736
+ if (operator === '+') {
737
+ return leftOperand === 'now'
738
+ ? moment().add(parseInt(rightOperand, 10), rightUnitOperand).format()
739
+ : moment()
740
+ .endOf('day')
741
+ .add(parseInt(rightOperand, 10), rightUnitOperand)
742
+ .format();
743
+ }
744
+ else {
745
+ return leftOperand === 'now'
746
+ ? moment()
747
+ .subtract(parseInt(rightOperand, 10), rightUnitOperand)
748
+ .format()
749
+ : moment()
750
+ .endOf('day')
751
+ .subtract(parseInt(rightOperand, 10), rightUnitOperand)
752
+ .format();
753
+ }
754
+ }
755
+ }
756
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2djLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL2ZpbHRlci9zaGFyZWQvb2djLWZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwQ0FBMEM7QUFDMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHaEQsT0FBTyxXQUF1QyxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLFdBQVcsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxLQUFLLFFBQVEsTUFBTSxrQkFBa0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsT0FBTyxJQUFJLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUczQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWE3RSxNQUFNLE9BQU8sZUFBZTtJQUNsQixjQUFjLEdBQWdDLEVBQUUsQ0FBQztJQUNsRCxTQUFTLEdBQUc7UUFDakIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBMkIsQ0FBQyxFQUFFO1lBQy9DLE9BQU8sRUFBRSxLQUFLO1lBQ2QsYUFBYSxFQUFFLEVBQUU7U0FDbEI7UUFDRCxDQUFDLGlCQUFpQixDQUFDLG9CQUE4QixDQUFDLEVBQUU7WUFDbEQsT0FBTyxFQUFFLEtBQUs7WUFDZCxhQUFhLEVBQUUsRUFBRTtTQUNsQjtRQUNELENBQUMsaUJBQWlCLENBQUMsY0FBd0IsQ0FBQyxFQUFFO1lBQzVDLE9BQU8sRUFBRSxLQUFLO1lBQ2QsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQzFCO1FBQ0QsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBK0IsQ0FBQyxFQUFFO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQzFCO1FBQ0QsQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBd0MsQ0FBQyxFQUFFO1lBQzVE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WSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO3FCQUN0RCxNQUFNLEVBQUU7Z0JBQ2IsQ0FBQyxDQUFDLE1BQU0sRUFBRTtxQkFDTCxLQUFLLENBQUMsS0FBSyxDQUFDO3FCQUNaLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO3FCQUN0RCxNQUFNLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXG5pbXBvcnQgeyBPYmplY3RVdGlscywgdXVpZCB9IGZyb20gJ0BpZ28yL3V0aWxzJztcblxuaW1wb3J0IHsgRXh0ZW50IH0gZnJvbSAnb2wvZXh0ZW50JztcbmltcG9ydCBvbEZvcm1hdFdGUywgeyBXcml0ZUdldEZlYXR1cmVPcHRpb25zIH0gZnJvbSAnb2wvZm9ybWF0L1dGUyc7XG5pbXBvcnQgb2xGb3JtYXRXS1QgZnJvbSAnb2wvZm9ybWF0L1dLVCc7XG5pbXBvcnQgKiBhcyBvbGZpbHRlciBmcm9tICdvbC9mb3JtYXQvZmlsdGVyJztcbmltcG9ydCBvbEdlb21ldHJ5IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xuaW1wb3J0IG9sUHJvamVjdGlvbiBmcm9tICdvbC9wcm9qL1Byb2plY3Rpb24nO1xuXG5pbXBvcnQgeyBkZWZhdWx0IGFzIG1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IFNvdXJjZUZpZWxkc09wdGlvbnNQYXJhbXMgfSBmcm9tICcuLi8uLi9kYXRhc291cmNlL3NoYXJlZC9kYXRhc291cmNlcy9kYXRhc291cmNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPZ2NGaWx0ZXJPcGVyYXRvciwgT2djRmlsdGVyT3BlcmF0b3JUeXBlIH0gZnJvbSAnLi9vZ2MtZmlsdGVyLmVudW0nO1xuaW1wb3J0IHtcbiAgQW55QmFzZU9nY0ZpbHRlck9wdGlvbnMsXG4gIElnb09nY0ZpbHRlck9iamVjdCxcbiAgSWdvT2djU2VsZWN0b3IsXG4gIE9nY0ZpbHRlcixcbiAgT2djRmlsdGVyYWJsZURhdGFTb3VyY2VPcHRpb25zLFxuICBPZ2NGaWx0ZXJzT3B0aW9ucyxcbiAgT2djSW50ZXJmYWNlRmlsdGVyT3B0aW9ucyxcbiAgT2djU2VsZWN0b3JCdW5kbGUsXG4gIFNlbGVjdG9yR3JvdXBcbn0gZnJvbSAnLi9vZ2MtZmlsdGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPZ2NGaWx0ZXJXcml0ZXIge1xuICBwcml2YXRlIGZpbHRlclNlcXVlbmNlOiBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zW10gPSBbXTtcbiAgcHVibGljIG9wZXJhdG9ycyA9IHtcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0VxdWFsVG8gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOb3RFcXVhbFRvIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgZmllbGRSZXN0cmljdDogW11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTGlrZSBhcyBzdHJpbmddOiB7XG4gICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgIGZpZWxkUmVzdHJpY3Q6IFsnc3RyaW5nJ11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzR3JlYXRlclRoYW4gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbJ251bWJlciddXG4gICAgfSxcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMZXNzVGhhbiBhcyBzdHJpbmddOiB7XG4gICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgIGZpZWxkUmVzdHJpY3Q6IFsnbnVtYmVyJ11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTGVzc1RoYW5PckVxdWFsVG8gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbJ251bWJlciddXG4gICAgfSxcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0JldHdlZW4gYXMgc3RyaW5nXToge1xuICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbJ251bWJlciddXG4gICAgfSxcbiAgICBbT2djRmlsdGVyT3BlcmF0b3IuRHVyaW5nIGFzIHN0cmluZ106IHsgc3BhdGlhbDogZmFsc2UsIGZpZWxkUmVzdHJpY3Q6IFtdIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOdWxsIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgZmllbGRSZXN0cmljdDogW11cbiAgICB9LFxuICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5JbnRlcnNlY3RzIGFzIHN0cmluZ106IHtcbiAgICAgIHNwYXRpYWw6IHRydWUsXG4gICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLldpdGhpbiBhcyBzdHJpbmddOiB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH0sXG4gICAgW09nY0ZpbHRlck9wZXJhdG9yLkNvbnRhaW5zIGFzIHN0cmluZ106IHsgc3BhdGlhbDogdHJ1ZSwgZmllbGRSZXN0cmljdDogW10gfVxuICB9O1xuXG4gIGRlZmluZU9nY0ZpbHRlcnNEZWZhdWx0T3B0aW9ucyhcbiAgICBvZ2NGaWx0ZXJzT3B0aW9uczogT2djRmlsdGVyc09wdGlvbnMsXG4gICAgZmllbGROYW1lR2VvbWV0cnk6IHN0cmluZyxcbiAgICBzcmNUeXBlPzogc3RyaW5nXG4gICk6IE9nY0ZpbHRlcnNPcHRpb25zIHtcbiAgICBsZXQgb2djRmlsdGVyc0RlZmF1bHRWYWx1ZSA9IHRydWU7IC8vIGRlZmF1bHQgdmFsdWVzIGZvciB3ZnMuXG4gICAgaWYgKHNyY1R5cGUgJiYgc3JjVHlwZSA9PT0gJ3dtcycpIHtcbiAgICAgIG9nY0ZpbHRlcnNEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvZ2NGaWx0ZXJzT3B0aW9ucyA9IG9nY0ZpbHRlcnNPcHRpb25zIHx8IHt9O1xuICAgIG9nY0ZpbHRlcnNPcHRpb25zLmVuYWJsZWQgPVxuICAgICAgb2djRmlsdGVyc09wdGlvbnMuZW5hYmxlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gb2djRmlsdGVyc0RlZmF1bHRWYWx1ZVxuICAgICAgICA6IG9nY0ZpbHRlcnNPcHRpb25zLmVuYWJsZWQ7XG4gICAgb2djRmlsdGVyc09wdGlvbnMuZWRpdGFibGUgPVxuICAgICAgb2djRmlsdGVyc09wdGlvbnMuZWRpdGFibGUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9nY0ZpbHRlcnNEZWZhdWx0VmFsdWVcbiAgICAgICAgOiBvZ2NGaWx0ZXJzT3B0aW9ucy5lZGl0YWJsZTtcbiAgICBvZ2NGaWx0ZXJzT3B0aW9ucy5nZW9tZXRyeU5hbWUgPSBmaWVsZE5hbWVHZW9tZXRyeTtcblxuICAgIG9nY0ZpbHRlcnNPcHRpb25zLmFkdmFuY2VkT2djRmlsdGVycyA9IHRydWU7XG4gICAgaWYgKFxuICAgICAgb2djRmlsdGVyc09wdGlvbnMuZW5hYmxlZCAmJlxuICAgICAgKG9nY0ZpbHRlcnNPcHRpb25zLnB1c2hCdXR0b25zIHx8XG4gICAgICAgIG9nY0ZpbHRlcnNPcHRpb25zLmNoZWNrYm94ZXMgfHxcbiAgICAgICAgb2djRmlsdGVyc09wdGlvbnMucmFkaW9CdXR0b25zIHx8XG4gICAgICAgIG9nY0ZpbHRlcnNPcHRpb25zLnNlbGVjdCB8fFxuICAgICAgICBvZ2NGaWx0ZXJzT3B0aW9ucy5hdXRvY29tcGxldGUpXG4gICAgKSB7XG4gICAgICBvZ2NGaWx0ZXJzT3B0aW9ucy5hZHZhbmNlZE9nY0ZpbHRlcnMgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG9nY0ZpbHRlcnNPcHRpb25zO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkRmlsdGVyKFxuICAgIGZpbHRlcnM/OiBJZ29PZ2NGaWx0ZXJPYmplY3QsXG4gICAgZXh0ZW50PzogRXh0ZW50LFxuICAgIHByb2o/OiBvbFByb2plY3Rpb24sXG4gICAgZmllbGROYW1lR2VvbWV0cnk/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9uc1xuICApOiBzdHJpbmcge1xuICAgIGxldCBvdXJCYm94RmlsdGVyO1xuICAgIGxldCBlbmFibGVCYm94OiBib29sZWFuO1xuICAgIGlmICgvaW50ZXJzZWN0c3xjb250YWluc3x3aXRoaW4vZ2kudGVzdChKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSkpIHtcbiAgICAgIGVuYWJsZUJib3ggPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlQmJveCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWVsZE5hbWVHZW9tZXRyeSA9XG4gICAgICAgIChmaWx0ZXJzIGFzIGFueSkuZ2VvbWV0cnlOYW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IChmaWx0ZXJzIGFzIGFueSkuZ2VvbWV0cnlOYW1lXG4gICAgICAgICAgOiBmaWVsZE5hbWVHZW9tZXRyeTtcbiAgICB9XG4gICAgaWYgKGV4dGVudCAmJiBmaWx0ZXJzKSB7XG4gICAgICBvdXJCYm94RmlsdGVyID0gb2xmaWx0ZXIuYmJveChmaWVsZE5hbWVHZW9tZXRyeSwgZXh0ZW50LCBwcm9qLmdldENvZGUoKSk7XG4gICAgfVxuICAgIGxldCBmaWx0ZXJBc3NlbWJseTogT2djRmlsdGVyO1xuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICBmaWx0ZXJzID0gdGhpcy5jaGVja0lnb0ZpbHRlcnNQcm9wZXJ0aWVzKFxuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBmaWVsZE5hbWVHZW9tZXRyeSxcbiAgICAgICAgcHJvalxuICAgICAgKTtcbiAgICAgIGlmIChleHRlbnQgJiYgZW5hYmxlQmJveCkge1xuICAgICAgICBmaWx0ZXJBc3NlbWJseSA9IG9sZmlsdGVyLmFuZChcbiAgICAgICAgICBvdXJCYm94RmlsdGVyLFxuICAgICAgICAgIHRoaXMuYnVuZGxlRmlsdGVyKGZpbHRlcnMsIG9wdGlvbnMpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWx0ZXJBc3NlbWJseSA9IHRoaXMuYnVuZGxlRmlsdGVyKGZpbHRlcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXh0ZW50ICYmIHByb2opIHtcbiAgICAgICAgcmV0dXJuICdiYm94PScgKyBleHRlbnQuam9pbignLCcpICsgJywnICsgcHJvai5nZXRDb2RlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdmc09wdGlvbnM6IFdyaXRlR2V0RmVhdHVyZU9wdGlvbnMgPSB7XG4gICAgICBzcnNOYW1lOiAnJyxcbiAgICAgIGZlYXR1cmVOUzogJycsXG4gICAgICBmZWF0dXJlUHJlZml4OiAnJyxcbiAgICAgIGZlYXR1cmVUeXBlczogWydmZWF0dXJlVHlwZXMnXSxcbiAgICAgIGZpbHRlcjogZmlsdGVyQXNzZW1ibHksXG4gICAgICBvdXRwdXRGb3JtYXQ6ICcnLFxuICAgICAgZ2VvbWV0cnlOYW1lOiBmaWVsZE5hbWVHZW9tZXRyeVxuICAgIH07XG5cbiAgICBjb25zdCBxdWVyeSA9IG5ldyBvbEZvcm1hdFdGUygpLndyaXRlR2V0RmVhdHVyZSh3ZnNPcHRpb25zKTtcbiAgICBjb25zdCBzdHIgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHF1ZXJ5KTtcbiAgICBjb25zdCByZWdleHAxID0gL3R5cGVuYW1lcyAqPXx0eXBlbmFtZSAqPVxcXCJmZWF0dXJlVHlwZXNcXFwiICo+L2dpO1xuICAgIGNvbnN0IHJlZ2V4cDIgPSAvPFxcL1F1ZXJ5PjxcXC9HZXRGZWF0dXJlPi9naTtcblxuICAgIHJldHVybiAnZmlsdGVyPScgKyBzdHIuc3BsaXQocmVnZXhwMSlbMV0uc3BsaXQocmVnZXhwMilbMF07XG4gIH1cblxuICBwcml2YXRlIGJ1bmRsZUZpbHRlcihcbiAgICBmaWx0ZXJPYmplY3Q6IGFueSxcbiAgICBvcHRpb25zPzogT2djRmlsdGVyYWJsZURhdGFTb3VyY2VPcHRpb25zXG4gICkge1xuICAgIGlmIChmaWx0ZXJPYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgbG9naWNhbEFycmF5ID0gW107XG4gICAgICBmaWx0ZXJPYmplY3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBsb2dpY2FsQXJyYXkucHVzaCh0aGlzLmJ1bmRsZUZpbHRlcihlbGVtZW50LCBvcHRpb25zKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBsb2dpY2FsQXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ2xvZ2ljYWwnKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGaWx0ZXIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3BlcmF0b3I6IGZpbHRlck9iamVjdC5sb2dpY2FsLFxuICAgICAgICAgICAgbG9naWNhbEFycmF5OiB0aGlzLmJ1bmRsZUZpbHRlcihmaWx0ZXJPYmplY3QuZmlsdGVycywgb3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyT2JqZWN0Lmhhc093blByb3BlcnR5KCdvcGVyYXRvcicpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUZpbHRlcihcbiAgICAgICAgICBmaWx0ZXJPYmplY3QgYXMgQW55QmFzZU9nY0ZpbHRlck9wdGlvbnMsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVyKFxuICAgIGZpbHRlck9wdGlvbnMsXG4gICAgb3B0aW9ucz86IE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9uc1xuICApOiBPZ2NGaWx0ZXIge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gZmlsdGVyT3B0aW9ucy5vcGVyYXRvcjtcbiAgICBjb25zdCBsb2dpY2FsQXJyYXkgPSBmaWx0ZXJPcHRpb25zLmxvZ2ljYWxBcnJheTtcblxuICAgIGNvbnN0IHdmc1Byb3BlcnR5TmFtZSA9IGZpbHRlck9wdGlvbnMucHJvcGVydHlOYW1lO1xuICAgIGNvbnN0IHdmc1BhdHRlcm4gPSBmaWx0ZXJPcHRpb25zLnBhdHRlcm47XG4gICAgY29uc3Qgd2ZzTWF0Y2hDYXNlID0gZmlsdGVyT3B0aW9ucy5tYXRjaENhc2VcbiAgICAgID8gZmlsdGVyT3B0aW9ucy5tYXRjaENhc2VcbiAgICAgIDogdHJ1ZTtcbiAgICBjb25zdCB3ZnNXaWxkQ2FyZCA9IGZpbHRlck9wdGlvbnMud2lsZENhcmQgPyBmaWx0ZXJPcHRpb25zLndpbGRDYXJkIDogJyonO1xuICAgIGNvbnN0IHdmc1NpbmdsZUNoYXIgPSBmaWx0ZXJPcHRpb25zLnNpbmdsZUNoYXJcbiAgICAgID8gZmlsdGVyT3B0aW9ucy5zaW5nbGVDaGFyXG4gICAgICA6ICcuJztcbiAgICBjb25zdCB3ZnNFc2NhcGVDaGFyID0gZmlsdGVyT3B0aW9ucy5lc2NhcGVDaGFyXG4gICAgICA/IGZpbHRlck9wdGlvbnMuZXNjYXBlQ2hhclxuICAgICAgOiAnISc7XG5cbiAgICBjb25zdCB3ZnNMb3dlckJvdW5kYXJ5ID0gZmlsdGVyT3B0aW9ucy5sb3dlckJvdW5kYXJ5O1xuICAgIGNvbnN0IHdmc1VwcGVyQm91bmRhcnkgPSBmaWx0ZXJPcHRpb25zLnVwcGVyQm91bmRhcnk7XG5cbiAgICBjb25zdCB3ZnNHZW9tZXRyeU5hbWUgPSBmaWx0ZXJPcHRpb25zLmdlb21ldHJ5TmFtZTtcbiAgICBjb25zdCB3ZnNFeHRlbnQgPSBmaWx0ZXJPcHRpb25zLmV4dGVudDtcbiAgICBjb25zdCB3ZnNXa3RHZW9tZXRyeSA9IGZpbHRlck9wdGlvbnMud2t0X2dlb21ldHJ5O1xuICAgIGNvbnN0IHdmc1Nyc05hbWUgPSBmaWx0ZXJPcHRpb25zLnNyc05hbWVcbiAgICAgID8gZmlsdGVyT3B0aW9ucy5zcnNOYW1lXG4gICAgICA6ICdFUFNHOjM4NTcnO1xuXG4gICAgY29uc3Qgd2ZzQmVnaW4gPSB0aGlzLnBhcnNlRmlsdGVyT3B0aW9uRGF0ZShcbiAgICAgIGZpbHRlck9wdGlvbnMuYmVnaW4sXG4gICAgICBvcHRpb25zID8gb3B0aW9ucy5taW5EYXRlIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBjb25zdCB3ZnNFbmQgPSB0aGlzLnBhcnNlRmlsdGVyT3B0aW9uRGF0ZShcbiAgICAgIGZpbHRlck9wdGlvbnMuZW5kLFxuICAgICAgb3B0aW9ucyA/IG9wdGlvbnMubWF4RGF0ZSA6IHVuZGVmaW5lZFxuICAgICk7XG5cbiAgICBjb25zdCB3ZnNFeHByZXNzaW9uID0gZmlsdGVyT3B0aW9ucy5leHByZXNzaW9uO1xuXG4gICAgbGV0IGdlb21ldHJ5OiBvbEdlb21ldHJ5O1xuICAgIGlmICh3ZnNXa3RHZW9tZXRyeSkge1xuICAgICAgY29uc3Qgd2t0ID0gbmV3IG9sRm9ybWF0V0tUKCk7XG4gICAgICBnZW9tZXRyeSA9IHdrdC5yZWFkR2VvbWV0cnkod2ZzV2t0R2VvbWV0cnksIHtcbiAgICAgICAgZGF0YVByb2plY3Rpb246IHdmc1Nyc05hbWUsXG4gICAgICAgIGZlYXR1cmVQcm9qZWN0aW9uOiB3ZnNTcnNOYW1lIHx8ICdFUFNHOjM4NTcnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG9wZXJhdG9yLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuQkJPWC50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIuYmJveCh3ZnNHZW9tZXRyeU5hbWUsIHdmc0V4dGVudCwgd2ZzU3JzTmFtZSk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNCZXR3ZWVuLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5iZXR3ZWVuKFxuICAgICAgICAgIHdmc1Byb3BlcnR5TmFtZSxcbiAgICAgICAgICB3ZnNMb3dlckJvdW5kYXJ5IHx8IDFlNDAgKiAtMSxcbiAgICAgICAgICB3ZnNVcHBlckJvdW5kYXJ5IHx8IDFlNDBcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuQ29udGFpbnMudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLmNvbnRhaW5zKHdmc0dlb21ldHJ5TmFtZSwgZ2VvbWV0cnksIHdmc1Nyc05hbWUpO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5EdXJpbmcudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLmR1cmluZyh3ZnNQcm9wZXJ0eU5hbWUsIHdmc0JlZ2luLCB3ZnNFbmQpO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzRXF1YWxUby50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIuZXF1YWxUbyh3ZnNQcm9wZXJ0eU5hbWUsIHdmc0V4cHJlc3Npb24sIHdmc01hdGNoQ2FzZSk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNHcmVhdGVyVGhhbi50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIuZ3JlYXRlclRoYW4od2ZzUHJvcGVydHlOYW1lLCB3ZnNFeHByZXNzaW9uKTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5ncmVhdGVyVGhhbk9yRXF1YWxUbyh3ZnNQcm9wZXJ0eU5hbWUsIHdmc0V4cHJlc3Npb24pO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5JbnRlcnNlY3RzLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5pbnRlcnNlY3RzKHdmc0dlb21ldHJ5TmFtZSwgZ2VvbWV0cnksIHdmc1Nyc05hbWUpO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTnVsbC50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIuaXNOdWxsKHdmc1Byb3BlcnR5TmFtZSk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMZXNzVGhhbi50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIubGVzc1RoYW4od2ZzUHJvcGVydHlOYW1lLCB3ZnNFeHByZXNzaW9uKTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0xlc3NUaGFuT3JFcXVhbFRvLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5sZXNzVGhhbk9yRXF1YWxUbyh3ZnNQcm9wZXJ0eU5hbWUsIHdmc0V4cHJlc3Npb24pO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5Qcm9wZXJ0eUlzTGlrZS50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIubGlrZShcbiAgICAgICAgICB3ZnNQcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgd2ZzUGF0dGVyblxuICAgICAgICAgICAgPyB3ZnNQYXR0ZXJuLnJlcGxhY2UoL1soKV9dL2dpLCB3ZnNTaW5nbGVDaGFyKVxuICAgICAgICAgICAgOiB3ZnNXaWxkQ2FyZCxcbiAgICAgICAgICB3ZnNXaWxkQ2FyZCxcbiAgICAgICAgICB3ZnNTaW5nbGVDaGFyLFxuICAgICAgICAgIHdmc0VzY2FwZUNoYXIsXG4gICAgICAgICAgd2ZzTWF0Y2hDYXNlXG4gICAgICAgICk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOb3RFcXVhbFRvLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5ub3RFcXVhbFRvKFxuICAgICAgICAgIHdmc1Byb3BlcnR5TmFtZSxcbiAgICAgICAgICB3ZnNFeHByZXNzaW9uLFxuICAgICAgICAgIHdmc01hdGNoQ2FzZVxuICAgICAgICApO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvci5XaXRoaW4udG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLndpdGhpbih3ZnNHZW9tZXRyeU5hbWUsIGdlb21ldHJ5LCB3ZnNTcnNOYW1lKTtcbiAgICAgIC8vIExPR0lDQUxcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuQW5kLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgIHJldHVybiBvbGZpbHRlci5hbmQuYXBwbHkobnVsbCwgbG9naWNhbEFycmF5KTtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3IuT3IudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgcmV0dXJuIG9sZmlsdGVyLm9yLmFwcGx5KG51bGwsIGxvZ2ljYWxBcnJheSk7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yLk5vdC50b0xvd2VyQ2FzZSgpOlxuICAgICAgICByZXR1cm4gb2xmaWx0ZXIubm90LmFwcGx5KG51bGwsIGxvZ2ljYWxBcnJheSk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlZmluZUludGVyZmFjZUZpbHRlclNlcXVlbmNlKFxuICAgIGZpbHRlck9iamVjdDogYW55LFxuICAgIGdlb21ldHJ5TmFtZSxcbiAgICBsb2dpY2FsID0gJycsXG4gICAgbGV2ZWwgPSAtMVxuICApOiBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zW10ge1xuICAgIGlmIChmaWx0ZXJPYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZmlsdGVyT2JqZWN0LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXF1ZW5jZS5jb25jYXQoXG4gICAgICAgICAgdGhpcy5kZWZpbmVJbnRlcmZhY2VGaWx0ZXJTZXF1ZW5jZShcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBnZW9tZXRyeU5hbWUsXG4gICAgICAgICAgICBsb2dpY2FsLFxuICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZpbHRlck9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnbG9naWNhbCcpKSB7XG4gICAgICAgIGxldmVsID0gbGV2ZWwgKyAxO1xuICAgICAgICB0aGlzLmZpbHRlclNlcXVlbmNlLmNvbmNhdChcbiAgICAgICAgICB0aGlzLmRlZmluZUludGVyZmFjZUZpbHRlclNlcXVlbmNlKFxuICAgICAgICAgICAgZmlsdGVyT2JqZWN0LmZpbHRlcnMsXG4gICAgICAgICAgICBnZW9tZXRyeU5hbWUsXG4gICAgICAgICAgICBmaWx0ZXJPYmplY3QubG9naWNhbCxcbiAgICAgICAgICAgIGxldmVsXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChmaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ29wZXJhdG9yJykpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXF1ZW5jZS5wdXNoKFxuICAgICAgICAgIHRoaXMuYWRkSW50ZXJmYWNlRmlsdGVyKGZpbHRlck9iamVjdCwgZ2VvbWV0cnlOYW1lLCBsZXZlbCwgbG9naWNhbClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VxdWVuY2U7XG4gIH1cblxuICBwdWJsaWMgY29tcHV0ZUFsbG93ZWRPcGVyYXRvcnMoXG4gICAgZmllbGRzPzogU291cmNlRmllbGRzT3B0aW9uc1BhcmFtc1tdLFxuICAgIHByb3BlcnR5TmFtZT86IHN0cmluZyxcbiAgICBkZWZhdWx0T3BlcmF0b3JzVHlwZT86IE9nY0ZpbHRlck9wZXJhdG9yVHlwZVxuICApIHtcbiAgICBsZXQgZWZmZWN0aXZlT3BlcmF0b3JzID0ge307XG4gICAgbGV0IGFsbG93ZWRPcGVyYXRvcnM7XG4gICAgbGV0IGZpZWxkc0hhc1NwYXRpYWxPcGVyYXRvcjogYm9vbGVhbjtcbiAgICBsZXQgaW5jbHVkZUNvbnRhaW5zOiBib29sZWFuO1xuXG4gICAgaWYgKGZpZWxkcyAmJiBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgIGNvbnN0IHNyY0ZpZWxkID0gZmllbGRzLmZpbmQoKGZpZWxkKSA9PiBmaWVsZC5uYW1lID09PSBwcm9wZXJ0eU5hbWUpO1xuICAgICAgYWxsb3dlZE9wZXJhdG9ycyA9XG4gICAgICAgIHNyY0ZpZWxkICYmIHNyY0ZpZWxkLmFsbG93ZWRPcGVyYXRvcnNUeXBlXG4gICAgICAgICAgPyBzcmNGaWVsZC5hbGxvd2VkT3BlcmF0b3JzVHlwZVxuICAgICAgICAgIDogZGVmYXVsdE9wZXJhdG9yc1R5cGU7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkcykge1xuICAgICAgZmllbGRzLm1hcCgoZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5hbGxvd2VkT3BlcmF0b3JzVHlwZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxvd2VkT3BlcmF0b3JzVHlwZSA9IGZpZWxkLmFsbG93ZWRPcGVyYXRvcnNUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBhbGxvd2VkT3BlcmF0b3JzVHlwZSA9PT0gT2djRmlsdGVyT3BlcmF0b3JUeXBlLkFsbC50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgYWxsb3dlZE9wZXJhdG9yc1R5cGUgPT09XG4gICAgICAgICAgICBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuU3BhdGlhbC50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgYWxsb3dlZE9wZXJhdG9yc1R5cGUgPT09XG4gICAgICAgICAgICBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuQmFzaWNBbmRTcGF0aWFsLnRvTG93ZXJDYXNlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmllbGRzSGFzU3BhdGlhbE9wZXJhdG9yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhbGxvd2VkT3BlcmF0b3JzVHlwZSA9PT0gT2djRmlsdGVyT3BlcmF0b3JUeXBlLkFsbC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpbmNsdWRlQ29udGFpbnMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWxsb3dlZE9wZXJhdG9ycyA9IGFsbG93ZWRPcGVyYXRvcnNcbiAgICAgID8gYWxsb3dlZE9wZXJhdG9yc1xuICAgICAgOiBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuQmFzaWNBbmRTcGF0aWFsO1xuXG4gICAgc3dpdGNoIChhbGxvd2VkT3BlcmF0b3JzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3JUeXBlLkFsbDpcbiAgICAgICAgZWZmZWN0aXZlT3BlcmF0b3JzID0gdGhpcy5vcGVyYXRvcnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuU3BhdGlhbDpcbiAgICAgICAgZWZmZWN0aXZlT3BlcmF0b3JzID0ge1xuICAgICAgICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5JbnRlcnNlY3RzXTogeyBzcGF0aWFsOiB0cnVlLCBmaWVsZFJlc3RyaWN0OiBbXSB9LFxuICAgICAgICAgIFtPZ2NGaWx0ZXJPcGVyYXRvci5XaXRoaW5dOiB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9nY0ZpbHRlck9wZXJhdG9yVHlwZS5CYXNpY0FuZFNwYXRpYWw6XG4gICAgICAgIGVmZmVjdGl2ZU9wZXJhdG9ycyA9IHtcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0VxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc05vdEVxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuSW50ZXJzZWN0c106IHsgc3BhdGlhbDogdHJ1ZSwgZmllbGRSZXN0cmljdDogW10gfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuV2l0aGluXTogeyBzcGF0aWFsOiB0cnVlLCBmaWVsZFJlc3RyaWN0OiBbXSB9XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPZ2NGaWx0ZXJPcGVyYXRvclR5cGUuQmFzaWM6XG4gICAgICAgIGVmZmVjdGl2ZU9wZXJhdG9ycyA9IHtcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc0VxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuUHJvcGVydHlJc05vdEVxdWFsVG9dOiB7XG4gICAgICAgICAgICBzcGF0aWFsOiBmYWxzZSxcbiAgICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3JUeXBlLlRpbWU6XG4gICAgICAgIGVmZmVjdGl2ZU9wZXJhdG9ycyA9IHtcbiAgICAgICAgICBbT2djRmlsdGVyT3BlcmF0b3IuRHVyaW5nXTogeyBzcGF0aWFsOiBmYWxzZSwgZmllbGRSZXN0cmljdDogW10gfVxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT2djRmlsdGVyT3BlcmF0b3JUeXBlLkJhc2ljTnVtZXJpY09wZXJhdG9yOlxuICAgICAgICBlZmZlY3RpdmVPcGVyYXRvcnMgPSB7XG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOb3RFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNHcmVhdGVyVGhhbl06IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNHcmVhdGVyVGhhbk9yRXF1YWxUb106IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMZXNzVGhhbl06IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNMZXNzVGhhbk9yRXF1YWxUb106IHtcbiAgICAgICAgICAgIHNwYXRpYWw6IGZhbHNlLFxuICAgICAgICAgICAgZmllbGRSZXN0cmljdDogWydudW1iZXInXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlZmZlY3RpdmVPcGVyYXRvcnMgPSB7XG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLlByb3BlcnR5SXNOb3RFcXVhbFRvXToge1xuICAgICAgICAgICAgc3BhdGlhbDogZmFsc2UsXG4gICAgICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLkludGVyc2VjdHNdOiB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH0sXG4gICAgICAgICAgW09nY0ZpbHRlck9wZXJhdG9yLldpdGhpbl06IHsgc3BhdGlhbDogdHJ1ZSwgZmllbGRSZXN0cmljdDogW10gfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmIChmaWVsZHNIYXNTcGF0aWFsT3BlcmF0b3IpIHtcbiAgICAgIChlZmZlY3RpdmVPcGVyYXRvcnMgYXMgYW55KS5JbnRlcnNlY3RzID0ge1xuICAgICAgICBzcGF0aWFsOiB0cnVlLFxuICAgICAgICBmaWVsZFJlc3RyaWN0OiBbXVxuICAgICAgfTtcbiAgICAgIChlZmZlY3RpdmVPcGVyYXRvcnMgYXMgYW55KS5XaXRoaW4gPSB7IHNwYXRpYWw6IHRydWUsIGZpZWxkUmVzdHJpY3Q6IFtdIH07XG4gICAgICBpZiAoaW5jbHVkZUNvbnRhaW5zKSB7XG4gICAgICAgIChlZmZlY3RpdmVPcGVyYXRvcnMgYXMgYW55KS5Db250YWlucyA9IHtcbiAgICAgICAgICBzcGF0aWFsOiB0cnVlLFxuICAgICAgICAgIGZpZWxkUmVzdHJpY3Q6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVmZmVjdGl2ZU9wZXJhdG9ycztcbiAgfVxuXG4gIHB1YmxpYyBhZGRJbnRlcmZhY2VGaWx0ZXIoXG4gICAgaWdvT2djRmlsdGVyT2JqZWN0PyxcbiAgICBnZW9tZXRyeU5hbWU/LFxuICAgIGxldmVsID0gMCxcbiAgICBwYXJlbnRMb2dpY2FsID0gJ09yJ1xuICApOiBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zIHtcbiAgICBpZiAoIWlnb09nY0ZpbHRlck9iamVjdCkge1xuICAgICAgaWdvT2djRmlsdGVyT2JqZWN0ID0geyBvcGVyYXRvcjogJ1Byb3BlcnR5SXNFcXVhbFRvJyB9O1xuICAgIH1cbiAgICBjb25zdCBmID0ge1xuICAgICAgcHJvcGVydHlOYW1lOiAnJyxcbiAgICAgIG9wZXJhdG9yOiAnJyxcbiAgICAgIGFjdGl2ZTogJycsXG4gICAgICBmaWx0ZXJpZDogdXVpZCgpLFxuICAgICAgc3RlcDogJycsXG4gICAgICBiZWdpbjogJycsXG4gICAgICBlbmQ6ICcnLFxuICAgICAgc2xpZGVyT3B0aW9uczoge30sXG4gICAgICBsb3dlckJvdW5kYXJ5OiAnJyxcbiAgICAgIHVwcGVyQm91bmRhcnk6ICcnLFxuICAgICAgZXhwcmVzc2lvbjogJycsXG4gICAgICBwYXR0ZXJuOiAnJyxcbiAgICAgIHdpbGRDYXJkOiAnKicsXG4gICAgICBzaW5nbGVDaGFyOiAnLicsXG4gICAgICBlc2NhcGVDaGFyOiAnIScsXG4gICAgICBtYXRjaENhc2U6IHRydWUsXG4gICAgICBpZ29TcGF0aWFsU2VsZWN0b3I6ICcnLFxuICAgICAgaWdvU05SQzogJycsXG4gICAgICBnZW9tZXRyeU5hbWU6ICcnLFxuICAgICAgZ2VvbWV0cnk6ICcnLFxuICAgICAgd2t0X2dlb21ldHJ5OiAnJyxcbiAgICAgIGV4dGVudDogJycsXG4gICAgICBzcnNOYW1lOiAnJyxcbiAgICAgIHBhcmVudExvZ2ljYWw6ICcnLFxuICAgICAgbGV2ZWw6IDBcbiAgICB9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICBmLFxuICAgICAge1xuICAgICAgICBwYXJlbnRMb2dpY2FsLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgZ2VvbWV0cnlOYW1lXG4gICAgICB9LFxuICAgICAgaWdvT2djRmlsdGVyT2JqZWN0XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0lnb0ZpbHRlcnNQcm9wZXJ0aWVzKFxuICAgIGZpbHRlck9iamVjdDogYW55LFxuICAgIGZpZWxkTmFtZUdlb21ldHJ5LFxuICAgIHByb2o6IG9sUHJvamVjdGlvbixcbiAgICBhY3RpdmUgPSBmYWxzZVxuICApIHtcbiAgICBjb25zdCBmaWx0ZXJBcnJheSA9IFtdO1xuICAgIGlmIChmaWx0ZXJPYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZmlsdGVyT2JqZWN0LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgZmlsdGVyQXJyYXkucHVzaChcbiAgICAgICAgICB0aGlzLmNoZWNrSWdvRmlsdGVyc1Byb3BlcnRpZXMoXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgZmllbGROYW1lR2VvbWV0cnksXG4gICAgICAgICAgICBwcm9qLFxuICAgICAgICAgICAgYWN0aXZlXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmlsdGVyQXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ2xvZ2ljYWwnKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsb2dpY2FsOiBmaWx0ZXJPYmplY3QubG9naWNhbCxcbiAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuY2hlY2tJZ29GaWx0ZXJzUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgZmlsdGVyT2JqZWN0LmZpbHRlcnMsXG4gICAgICAgICAgICAgIGZpZWxkTmFtZUdlb21ldHJ5LFxuICAgICAgICAgICAgICBwcm9qLFxuICAgICAgICAgICAgICBhY3RpdmVcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlck9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb3BlcmF0b3InKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXJQcm9wZXJ0aWVzKFxuICAgICAgICAgIGZpbHRlck9iamVjdCBhcyBPZ2NJbnRlcmZhY2VGaWx0ZXJPcHRpb25zLFxuICAgICAgICAgIGZpZWxkTmFtZUdlb21ldHJ5LFxuICAgICAgICAgIHByb2osXG4gICAgICAgICAgYWN0aXZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRGaWx0ZXJQcm9wZXJ0aWVzKFxuICAgIGlnb09nY0ZpbHRlck9iamVjdDogT2djSW50ZXJmYWNlRmlsdGVyT3B0aW9ucyxcbiAgICBmaWVsZE5hbWVHZW9tZXRyeSxcbiAgICBwcm9qOiBvbFByb2plY3Rpb24sXG4gICAgYWN0aXZlID0gZmFsc2VcbiAgKSB7XG4gICAgY29uc3QgZmlsdGVyaWQgPSBpZ29PZ2NGaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ2ZpbHRlcmlkJylcbiAgICAgID8gaWdvT2djRmlsdGVyT2JqZWN0LmZpbHRlcmlkXG4gICAgICA6IHV1aWQoKTtcbiAgICBjb25zdCBzdGF0dXMgPSBpZ29PZ2NGaWx0ZXJPYmplY3QuaGFzT3duUHJvcGVydHkoJ2FjdGl2ZScpXG4gICAgICA/IGlnb09nY0ZpbHRlck9iamVjdC5hY3RpdmVcbiAgICAgIDogYWN0aXZlO1xuXG4gICAgY29uc3Qgc3JzTmFtZSA9IGlnb09nY0ZpbHRlck9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnc3JzTmFtZScpXG4gICAgICA/IGlnb09nY0ZpbHRlck9iamVjdC5zcnNOYW1lXG4gICAgICA6IHByb2pcbiAgICAgICAgPyBwcm9qLmdldENvZGUoKVxuICAgICAgICA6ICdFUFNHOjM4NTcnO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZmlsdGVyaWQsXG4gICAgICAgIGFjdGl2ZTogc3RhdHVzLFxuICAgICAgICBpZ29TcGF0aWFsU2VsZWN0b3I6ICdmaXhlZEV4dGVudCcsXG4gICAgICAgIHNyc05hbWVcbiAgICAgIH0sXG4gICAgICBpZ29PZ2NGaWx0ZXJPYmplY3QsXG4gICAgICB7IGdlb21ldHJ5TmFtZTogZmllbGROYW1lR2VvbWV0cnkgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVidWlsdElnb09nY0ZpbHRlck9iamVjdEZyb21TZXF1ZW5jZShcbiAgICBzZXF1ZW5jZTogT2djSW50ZXJmYWNlRmlsdGVyT3B0aW9uc1tdXG4gICk6IElnb09nY0ZpbHRlck9iamVjdCB7XG4gICAgaWYgKHNlcXVlbmNlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGlmIChzZXF1ZW5jZS5sZW5ndGggPj0gMSkge1xuICAgICAgICBsZXQgbGFzdFBhcmVudExvZ2ljYWwgPSBzZXF1ZW5jZVswXS5wYXJlbnRMb2dpY2FsO1xuICAgICAgICBsZXQgbmV4dEVsZW1lbnQ6IGFueTtcbiAgICAgICAgbGV0IGxvZ2ljYWxBcnJheSA9IFtdO1xuICAgICAgICBsZXQgbGFzdFByb2Nlc3NlZEZpbHRlcjtcbiAgICAgICAgc2VxdWVuY2UuZm9yRWFjaCgodWlGaWx0ZXIpID0+IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gT2JqZWN0LmFzc2lnbih7fSwgdWlGaWx0ZXIpO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VxdWVuY2UuaW5kZXhPZih1aUZpbHRlcik7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBzZXF1ZW5jZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBuZXh0RWxlbWVudCA9IHNlcXVlbmNlW2luZGV4ICsgMV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGVsZW1lbnQuYWN0aXZlO1xuICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LmZpbHRlcmlkO1xuICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnBhcmVudExvZ2ljYWw7XG4gICAgICAgICAgbG9naWNhbEFycmF5LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgICBpZiAoc2VxdWVuY2UubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBsYXN0UHJvY2Vzc2VkRmlsdGVyID0gZWxlbWVudDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RQYXJlbnRMb2dpY2FsICE9PSBuZXh0RWxlbWVudC5wYXJlbnRMb2dpY2FsKSB7XG4gICAgICAgICAgICBpZiAobG9naWNhbEFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAnWW91IG11c3Qgc2V0IGF0ICcgK1xuICAgICAgICAgICAgICAgICAgJ2xlYXN0IHR3byBvcGVyYXRvciBpbiBhIGxvZ2ljYWwgKCcgK1xuICAgICAgICAgICAgICAgICAgbGFzdFBhcmVudExvZ2ljYWwgK1xuICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsYXN0UHJvY2Vzc2VkRmlsdGVyID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICB7IGxvZ2ljYWw6IGxhc3RQYXJlbnRMb2dpY2FsLCBmaWx0ZXJzOiBsb2dpY2FsQXJyYXkgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBsb2dpY2FsQXJyYXkgPSBbbGFzdFByb2Nlc3NlZEZpbHRlcl07XG4gICAgICAgICAgICAgIGxhc3RQYXJlbnRMb2dpY2FsID0gbmV4dEVsZW1lbnQucGFyZW50TG9naWNhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGFzdFByb2Nlc3NlZEZpbHRlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlSWdvU2VsZWN0b3Ioc2VsZWN0b3JzOiBJZ29PZ2NTZWxlY3Rvcik6IElnb09nY1NlbGVjdG9yIHtcbiAgICBpZiAoXG4gICAgICBzZWxlY3RvcnMuZ3JvdXBzLmV2ZXJ5KChncm91cCkgPT4gZ3JvdXAuY29tcHV0ZWRTZWxlY3RvcnMgIT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIHJldHVybiBzZWxlY3RvcnM7XG4gICAgfVxuICAgIGxldCBzZWxlY3RvcjogSWdvT2djU2VsZWN0b3I7XG4gICAgaWYgKHNlbGVjdG9ycy5ncm91cHMgJiYgc2VsZWN0b3JzLmJ1bmRsZXMpIHtcbiAgICAgIGlmICghc2VsZWN0b3JzLmJ1bmRsZXMuZXZlcnkoKGJ1bmRsZSkgPT4gYnVuZGxlLmlkICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3Qgc2V0IGFuIGlkIGZvciBlYWNoIG9mIHlvdXIgYnVuZGxlcycpO1xuICAgICAgfVxuICAgICAgc2VsZWN0b3IgPSBPYmplY3RVdGlscy5jb3B5RGVlcChzZWxlY3RvcnMpO1xuICAgICAgc2VsZWN0b3IuZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICAgIGdyb3VwLnRpdGxlID0gZ3JvdXAudGl0bGUgPyBncm91cC50aXRsZSA6IGdyb3VwLm5hbWU7XG4gICAgICAgIGdyb3VwLmVuYWJsZWQgPSBncm91cC5lbmFibGVkID8gZ3JvdXAuZW5hYmxlZCA6IGZhbHNlO1xuICAgICAgICBncm91cC5jb21wdXRlZFNlbGVjdG9ycyA9IE9iamVjdFV0aWxzLmNvcHlEZWVwKFxuICAgICAgICAgIHNlbGVjdG9yLmJ1bmRsZXMuZmlsdGVyKChiKSA9PiBncm91cC5pZHMuaW5jbHVkZXMoYi5pZCkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFzZWxlY3RvcnMuZ3JvdXBzICYmIHNlbGVjdG9ycy5idW5kbGVzKSB7XG4gICAgICBzZWxlY3RvciA9IE9iamVjdFV0aWxzLmNvcHlEZWVwKHNlbGVjdG9ycyk7XG4gICAgICBzZWxlY3Rvci5ncm91cHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0aXRsZTogJ2dyb3VwMScsXG4gICAgICAgICAgbmFtZTogJ2dyb3VwMScsXG4gICAgICAgICAgY29tcHV0ZWRTZWxlY3RvcnM6IE9iamVjdFV0aWxzLmNvcHlEZWVwKHNlbGVjdG9yLmJ1bmRsZXMpXG4gICAgICAgIH0gYXMgU2VsZWN0b3JHcm91cFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0b3IgPSB7XG4gICAgICAgIGJ1bmRsZXM6IHNlbGVjdG9ycyBhcyBhbnksXG4gICAgICAgIGdyb3VwczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRpdGxlOiAnZ3JvdXAxJyxcbiAgICAgICAgICAgIG5hbWU6ICdncm91cDEnLFxuICAgICAgICAgICAgY29tcHV0ZWRTZWxlY3RvcnM6IE9iamVjdFV0aWxzLmNvcHlEZWVwKFxuICAgICAgICAgICAgICBzZWxlY3RvcnNcbiAgICAgICAgICAgICkgYXMgT2djU2VsZWN0b3JCdW5kbGVbXVxuICAgICAgICAgIH0gYXMgU2VsZWN0b3JHcm91cFxuICAgICAgICBdLFxuICAgICAgICBzZWxlY3RvclR5cGU6IHNlbGVjdG9yLnNlbGVjdG9yVHlwZVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFzZWxlY3Rvci5ncm91cHMuZmluZCgoc2VsZWN0b3JHcm91cCkgPT4gc2VsZWN0b3JHcm91cC5lbmFibGVkKSkge1xuICAgICAgc2VsZWN0b3IuZ3JvdXBzWzBdLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlT2djRmlsdGVyc0FwcGxpZWRWYWx1ZShcbiAgICBvcHRpb25zOiBPZ2NGaWx0ZXJhYmxlRGF0YVNvdXJjZU9wdGlvbnMsXG4gICAgZmllbGROYW1lR2VvbWV0cnk6IHN0cmluZyxcbiAgICBleHRlbnQ/OiBFeHRlbnQsXG4gICAgcHJvaj86IG9sUHJvamVjdGlvblxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IG9nY0ZpbHRlcnMgPSBvcHRpb25zLm9nY0ZpbHRlcnM7XG4gICAgaWYgKCFvZ2NGaWx0ZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXTtcbiAgICBsZXQgZmlsdGVyUXVlcnlTdHJpbmdTZWxlY3RvciA9ICcnO1xuICAgIGxldCBmaWx0ZXJRdWVyeVN0cmluZ0FkdmFuY2VkRmlsdGVycyA9ICcnO1xuICAgIGlmIChcbiAgICAgIG9nY0ZpbHRlcnMuZW5hYmxlZCAmJlxuICAgICAgKG9nY0ZpbHRlcnMucHVzaEJ1dHRvbnMgfHxcbiAgICAgICAgb2djRmlsdGVycy5jaGVja2JveGVzIHx8XG4gICAgICAgIG9nY0ZpbHRlcnMucmFkaW9CdXR0b25zIHx8XG4gICAgICAgIG9nY0ZpbHRlcnMuc2VsZWN0IHx8XG4gICAgICAgIG9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlKVxuICAgICkge1xuICAgICAgbGV0IHNlbGVjdG9ycztcbiAgICAgIGlmIChvZ2NGaWx0ZXJzLnB1c2hCdXR0b25zKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMucHVzaEJ1dHRvbnM7XG4gICAgICAgIGNvbnN0IHB1c2hDb25kaXRpb25zID0gdGhpcy5mb3JtYXRHcm91cEFuZEZpbHRlcihvZ2NGaWx0ZXJzLCBzZWxlY3RvcnMpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBwdXNoQ29uZGl0aW9ucykge1xuICAgICAgICAgIGNvbmRpdGlvbnMucHVzaChjb25kaXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2djRmlsdGVycy5jaGVja2JveGVzKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMuY2hlY2tib3hlcztcbiAgICAgICAgY29uc3QgY2hlY2tib3hDb25kaXRpb25zID0gdGhpcy5mb3JtYXRHcm91cEFuZEZpbHRlcihcbiAgICAgICAgICBvZ2NGaWx0ZXJzLFxuICAgICAgICAgIHNlbGVjdG9yc1xuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjaGVja2JveENvbmRpdGlvbnMpIHtcbiAgICAgICAgICBjb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9nY0ZpbHRlcnMucmFkaW9CdXR0b25zKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMucmFkaW9CdXR0b25zO1xuICAgICAgICBjb25zdCBzZWxlY3RvcnNDb3JyID0gdGhpcy52ZXJpZnlNdWx0aXBsZUVuYWJsZWRzKHNlbGVjdG9ycyk7XG4gICAgICAgIGNvbnN0IHJhZGlvQ29uZGl0aW9ucyA9IHRoaXMuZm9ybWF0R3JvdXBBbmRGaWx0ZXIoXG4gICAgICAgICAgb2djRmlsdGVycyxcbiAgICAgICAgICBzZWxlY3RvcnNDb3JyXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIHJhZGlvQ29uZGl0aW9ucykge1xuICAgICAgICAgIGNvbmRpdGlvbnMucHVzaChjb25kaXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob2djRmlsdGVycy5zZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0b3JzID0gb2djRmlsdGVycy5zZWxlY3Q7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yc0NvcnIgPSB0aGlzLnZlcmlmeU11bHRpcGxlRW5hYmxlZHMoc2VsZWN0b3JzKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0Q29uZGl0aW9ucyA9IHRoaXMuZm9ybWF0R3JvdXBBbmRGaWx0ZXIoXG4gICAgICAgICAgb2djRmlsdGVycyxcbiAgICAgICAgICBzZWxlY3RvcnNDb3JyXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIHNlbGVjdENvbmRpdGlvbnMpIHtcbiAgICAgICAgICBjb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgIHNlbGVjdG9ycyA9IG9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlO1xuICAgICAgICBjb25zdCBzZWxlY3RDb25kaXRpb25zID0gdGhpcy5mb3JtYXRHcm91cEFuZEZpbHRlcihcbiAgICAgICAgICBvZ2NGaWx0ZXJzLFxuICAgICAgICAgIHNlbGVjdG9yc1xuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBzZWxlY3RDb25kaXRpb25zKSB7XG4gICAgICAgICAgY29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBvZ2NGaWx0ZXJzLmZpbHRlcnMgJiZcbiAgICAgICAgJ29wZXJhdG9yJyBpbiBvZ2NGaWx0ZXJzLmZpbHRlcnMgJiZcbiAgICAgICAgb2djRmlsdGVycy5maWx0ZXJzLm9wZXJhdG9yLnRvTG93ZXJDYXNlKCkgPT09XG4gICAgICAgICAgT2djRmlsdGVyT3BlcmF0b3IuRHVyaW5nLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgb2djRmlsdGVycy5maWx0ZXJzLmFjdGl2ZSAmJlxuICAgICAgICBvZ2NGaWx0ZXJzLmludGVyZmFjZU9nY0ZpbHRlcnM/Lmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25kaXRpb25zLnB1c2gob2djRmlsdGVycy5pbnRlcmZhY2VPZ2NGaWx0ZXJzWzBdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgZmlsdGVyUXVlcnlTdHJpbmdTZWxlY3RvciA9IHRoaXMuYnVpbGRGaWx0ZXIoXG4gICAgICAgICAgY29uZGl0aW9ucy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gY29uZGl0aW9uc1swXVxuICAgICAgICAgICAgOiB7IGxvZ2ljYWw6ICdBbmQnLCBmaWx0ZXJzOiBjb25kaXRpb25zIH0sXG4gICAgICAgICAgZXh0ZW50LFxuICAgICAgICAgIHByb2osXG4gICAgICAgICAgb2djRmlsdGVycy5nZW9tZXRyeU5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9nY0ZpbHRlcnMuZW5hYmxlZCAmJiBvZ2NGaWx0ZXJzLmZpbHRlcnMpIHtcbiAgICAgIG9nY0ZpbHRlcnMuZ2VvbWV0cnlOYW1lID0gb2djRmlsdGVycy5nZW9tZXRyeU5hbWUgfHwgZmllbGROYW1lR2VvbWV0cnk7XG4gICAgICBjb25zdCBpZ29GaWx0ZXJzID0gb2djRmlsdGVycy5maWx0ZXJzO1xuICAgICAgZmlsdGVyUXVlcnlTdHJpbmdBZHZhbmNlZEZpbHRlcnMgPSB0aGlzLmJ1aWxkRmlsdGVyKFxuICAgICAgICBpZ29GaWx0ZXJzLFxuICAgICAgICBleHRlbnQsXG4gICAgICAgIHByb2osXG4gICAgICAgIG9nY0ZpbHRlcnMuZ2VvbWV0cnlOYW1lLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBmaWx0ZXJRdWVyeVN0cmluZyA9IG9nY0ZpbHRlcnMuYWR2YW5jZWRPZ2NGaWx0ZXJzXG4gICAgICA/IGZpbHRlclF1ZXJ5U3RyaW5nQWR2YW5jZWRGaWx0ZXJzXG4gICAgICA6IGZpbHRlclF1ZXJ5U3RyaW5nU2VsZWN0b3I7XG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gJ3dtcycpIHtcbiAgICAgIGZpbHRlclF1ZXJ5U3RyaW5nID0gdGhpcy5mb3JtYXRQcm9jZXNzZWRPZ2NGaWx0ZXIoXG4gICAgICAgIGZpbHRlclF1ZXJ5U3RyaW5nLFxuICAgICAgICAob3B0aW9ucyBhcyBhbnkpLnBhcmFtcy5MQVlFUlNcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnR5cGUgPT09ICd3ZnMnKSB7XG4gICAgICBmaWx0ZXJRdWVyeVN0cmluZyA9IHRoaXMuZm9ybWF0UHJvY2Vzc2VkT2djRmlsdGVyKFxuICAgICAgICBmaWx0ZXJRdWVyeVN0cmluZyxcbiAgICAgICAgKG9wdGlvbnMgYXMgYW55KS5wYXJhbXMuZmVhdHVyZVR5cGVzXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJRdWVyeVN0cmluZztcbiAgfVxuXG4gIHB1YmxpYyB2ZXJpZnlNdWx0aXBsZUVuYWJsZWRzKHNlbGVjdG9ycykge1xuICAgIHNlbGVjdG9ycy5idW5kbGVzLmZvckVhY2goKGJ1bmRsZSkgPT4ge1xuICAgICAgaWYgKCFidW5kbGUubXVsdGlwbGUgJiYgYnVuZGxlLnNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbmFibGVkcyA9IGJ1bmRsZS5zZWxlY3RvcnMucmVkdWNlKFxuICAgICAgICAgIChsaXN0LCBmaWx0ZXIsIGluZGV4KSA9PlxuICAgICAgICAgICAgZmlsdGVyLmVuYWJsZWQgPT09IHRydWUgPyBsaXN0LmNvbmNhdChpbmRleCkgOiBsaXN0LFxuICAgICAgICAgIFtdXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbmFibGVkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgZW5hYmxlZHMuc3BsaWNlKDAsIDEpO1xuICAgICAgICAgIGVuYWJsZWRzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgICBidW5kbGUuc2VsZWN0b3JzW2luZGV4XS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0b3JzO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdEdyb3VwQW5kRmlsdGVyKG9nY0ZpbHRlcnM6IE9nY0ZpbHRlcnNPcHRpb25zLCBzZWxlY3RvcnMpIHtcbiAgICBzZWxlY3RvcnMgPSB0aGlzLmNvbXB1dGVJZ29TZWxlY3RvcihzZWxlY3RvcnMpO1xuICAgIGNvbnN0IHNlbGVjdG9yQnVuZGxlID0gc2VsZWN0b3JzLmdyb3Vwcy5maW5kKFxuICAgICAgKGcpID0+IGcuZW5hYmxlZFxuICAgICkuY29tcHV0ZWRTZWxlY3RvcnM7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtdO1xuICAgIHNlbGVjdG9yQnVuZGxlLm1hcCgoYnVuZGxlKSA9PiB7XG4gICAgICBjb25zdCBidW5kbGVDb25kaXRpb24gPSBbXTtcbiAgICAgIGNvbnN0IHNlbGVjdG9yc1R5cGUgPSBidW5kbGUuc2VsZWN0b3JzIGFzIGFueTtcbiAgICAgIGlmICghc2VsZWN0b3JzVHlwZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWxlY3RvcnNUeXBlXG4gICAgICAgIC5maWx0ZXIoKG9nY3NlbGVjdG9yKSA9PiBvZ2NzZWxlY3Rvci5lbmFibGVkID09PSB0cnVlKVxuICAgICAgICAuZm9yRWFjaCgoZW5hYmxlZFNlbGVjdG9yKSA9PlxuICAgICAgICAgIGJ1bmRsZUNvbmRpdGlvbi5wdXNoKGVuYWJsZWRTZWxlY3Rvci5maWx0ZXJzKVxuICAgICAgICApO1xuICAgICAgaWYgKGJ1bmRsZUNvbmRpdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uZGl0aW9ucy5wdXNoKGJ1bmRsZUNvbmRpdGlvblswXSk7XG4gICAgICB9IGVsc2UgaWYgKGJ1bmRsZUNvbmRpdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaCh7XG4gICAgICAgICAgbG9naWNhbDogYnVuZGxlLmxvZ2ljYWwsXG4gICAgICAgICAgZmlsdGVyczogYnVuZGxlQ29uZGl0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHNlbGVjdG9ycy5zZWxlY3RvclR5cGUgPT09ICdwdXNoQnV0dG9uJykge1xuICAgICAgb2djRmlsdGVycy5wdXNoQnV0dG9ucyA9IHNlbGVjdG9ycztcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9ycy5zZWxlY3RvclR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgIG9nY0ZpbHRlcnMuY2hlY2tib3hlcyA9IHNlbGVjdG9ycztcbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9ycy5zZWxlY3RvclR5cGUgPT09ICdyYWRpb0J1dHRvbicpIHtcbiAgICAgIG9nY0ZpbHRlcnMucmFkaW9CdXR0b25zID0gc2VsZWN0b3JzO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3JzLnNlbGVjdG9yVHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIG9nY0ZpbHRlcnMuc2VsZWN0ID0gc2VsZWN0b3JzO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3JzLnNlbGVjdG9yVHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScpIHtcbiAgICAgIG9nY0ZpbHRlcnMuYXV0b2NvbXBsZXRlID0gc2VsZWN0b3JzO1xuICAgIH1cbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRQcm9jZXNzZWRPZ2NGaWx0ZXIoXG4gICAgcHJvY2Vzc2VkRmlsdGVyOiBzdHJpbmcsXG4gICAgbGF5ZXJzT3JUeXBlbmFtZXM6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGlmICghcHJvY2Vzc2VkRmlsdGVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgYXBwbGllZEZpbHRlciA9ICcnO1xuICAgIGlmIChwcm9jZXNzZWRGaWx0ZXIubGVuZ3RoID09PSAwICYmIGxheWVyc09yVHlwZW5hbWVzLmluZGV4T2YoJywnKSA9PT0gLTEpIHtcbiAgICAgIGFwcGxpZWRGaWx0ZXIgPSBwcm9jZXNzZWRGaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyc09yVHlwZW5hbWVzLnNwbGl0KCcsJykuZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgIGFwcGxpZWRGaWx0ZXIgPSBgJHthcHBsaWVkRmlsdGVyfSgke3Byb2Nlc3NlZEZpbHRlci5yZXBsYWNlKFxuICAgICAgICAgICdmaWx0ZXI9JyxcbiAgICAgICAgICAnJ1xuICAgICAgICApfSlgO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGFwcGxpZWRGaWx0ZXIgPSBhcHBsaWVkRmlsdGVyLnJlcGxhY2UoL1xcKFxcKS9nLCAnJyk7XG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPVxuICAgICAgYXBwbGllZEZpbHRlci5sZW5ndGggPiAwXG4gICAgICAgID8gYXBwbGllZEZpbHRlci5yZXBsYWNlKCdmaWx0ZXI9JywgJycpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBmaWx0ZXJWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUZpbHRlck9wdGlvbkRhdGUodmFsdWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdub3cnKSB8fFxuICAgICAgdmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndG9kYXknKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlT3BlcmF0aW9uKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG1vbWVudCh2YWx1ZSkuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIGRhdGUgd2l0aCBzcGVjaWZpYyBmb3JtYXRcbiAgICogZXhlbXBsZSAndG9kYXkgKyAxIGRheXMnIG9yICdub3cgKyAxIHllYXJzJ1xuICAgKiBAcGFyYW0gdmFsdWUgc3RyaW5nIGRhdGVcbiAgICogQHJldHVybnMgZGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZURhdGVPcGVyYXRpb24odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3BlcmF0aW9uU3BsaXR0ZWQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCcgJyk7XG4gICAgY29uc3QgbGVmdE9wZXJhbmQgPSBvcGVyYXRpb25TcGxpdHRlZFswXTtcbiAgICBjb25zdCBvcGVyYXRvciA9IFsnKycsICctJ10uaW5jbHVkZXMob3BlcmF0aW9uU3BsaXR0ZWRbMV0pXG4gICAgICA/IG9wZXJhdGlvblNwbGl0dGVkWzFdXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByaWdodE9wZXJhbmQgPSAvXlswLTldKiQvLnRlc3Qob3BlcmF0aW9uU3BsaXR0ZWRbMl0pXG4gICAgICA/IG9wZXJhdGlvblNwbGl0dGVkWzJdXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByaWdodFVuaXRPcGVyYW5kID0gKFxuICAgICAgWyd5ZWFycycsICdtb250aHMnLCAnd2Vla3MnLCAnZGF5cycsICdob3VycycsICdzZWNvbmRzJ10uaW5jbHVkZXMoXG4gICAgICAgIG9wZXJhdGlvblNwbGl0dGVkWzNdXG4gICAgICApXG4gICAgICAgID8gb3BlcmF0aW9uU3BsaXR0ZWRbM11cbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICApIGFzIG1vbWVudC5EdXJhdGlvbklucHV0QXJnMjtcblxuICAgIGlmICghb3BlcmF0b3IgfHwgIXJpZ2h0VW5pdE9wZXJhbmQgfHwgIXJpZ2h0T3BlcmFuZCkge1xuICAgICAgcmV0dXJuIGxlZnRPcGVyYW5kID09PSAnbm93J1xuICAgICAgICA/IG1vbWVudCgpLmZvcm1hdCgpXG4gICAgICAgIDogbW9tZW50KCkuZW5kT2YoJ2RheScpLmZvcm1hdCgpO1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRvciA9PT0gJysnKSB7XG4gICAgICByZXR1cm4gbGVmdE9wZXJhbmQgPT09ICdub3cnXG4gICAgICAgID8gbW9tZW50KCkuYWRkKHBhcnNlSW50KHJpZ2h0T3BlcmFuZCwgMTApLCByaWdodFVuaXRPcGVyYW5kKS5mb3JtYXQoKVxuICAgICAgICA6IG1vbWVudCgpXG4gICAgICAgICAgICAuZW5kT2YoJ2RheScpXG4gICAgICAgICAgICAuYWRkKHBhcnNlSW50KHJpZ2h0T3BlcmFuZCwgMTApLCByaWdodFVuaXRPcGVyYW5kKVxuICAgICAgICAgICAgLmZvcm1hdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdE9wZXJhbmQgPT09ICdub3cnXG4gICAgICAgID8gbW9tZW50KClcbiAgICAgICAgICAgIC5zdWJ0cmFjdChwYXJzZUludChyaWdodE9wZXJhbmQsIDEwKSwgcmlnaHRVbml0T3BlcmFuZClcbiAgICAgICAgICAgIC5mb3JtYXQoKVxuICAgICAgICA6IG1vbWVudCgpXG4gICAgICAgICAgICAuZW5kT2YoJ2RheScpXG4gICAgICAgICAgICAuc3VidHJhY3QocGFyc2VJbnQocmlnaHRPcGVyYW5kLCAxMCksIHJpZ2h0VW5pdE9wZXJhbmQpXG4gICAgICAgICAgICAuZm9ybWF0KCk7XG4gICAgfVxuICB9XG59XG4iXX0=