@igo2/geo 1.11.1 → 1.13.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (989) hide show
  1. package/assets/icons/cross_black_18px.svg +88 -88
  2. package/assets/icons/place_blue_36px.svg +55 -55
  3. package/assets/icons/place_green_36px.svg +55 -55
  4. package/assets/icons/place_red_36px.svg +55 -55
  5. package/assets/icons/place_yellow_36px.svg +55 -55
  6. package/{esm2015/igo2-geo.js → esm2020/igo2-geo.mjs} +0 -0
  7. package/esm2020/lib/catalog/catalog-browser/catalog-browser-group.component.mjs +299 -0
  8. package/esm2020/lib/catalog/catalog-browser/catalog-browser-layer.component.mjs +268 -0
  9. package/esm2020/lib/catalog/catalog-browser/catalog-browser.component.mjs +244 -0
  10. package/esm2020/lib/catalog/catalog-browser/catalog-browser.module.mjs +80 -0
  11. package/esm2020/lib/catalog/catalog-library/add-catalog-dialog.component.mjs +209 -0
  12. package/esm2020/lib/catalog/catalog-library/catalog-library-item.component.mjs +79 -0
  13. package/esm2020/lib/catalog/catalog-library/catalog-library.component.mjs +217 -0
  14. package/esm2020/lib/catalog/catalog-library/catalog-library.module.mjs +95 -0
  15. package/esm2020/lib/catalog/catalog.module.mjs +53 -0
  16. package/esm2020/lib/catalog/index.mjs +5 -0
  17. package/esm2020/lib/catalog/shared/catalog.abstract.mjs +95 -0
  18. package/esm2020/lib/catalog/shared/catalog.enum.mjs +16 -0
  19. package/esm2020/lib/catalog/shared/catalog.interface.mjs +2 -0
  20. package/esm2020/lib/catalog/shared/catalog.service.mjs +606 -0
  21. package/esm2020/lib/catalog/shared/index.mjs +5 -0
  22. package/esm2020/lib/datasource/datasource.module.mjs +22 -0
  23. package/esm2020/lib/datasource/index.mjs +3 -0
  24. package/esm2020/lib/datasource/shared/capabilities.service.mjs +426 -0
  25. package/esm2020/lib/datasource/shared/datasource.service.mjs +236 -0
  26. package/esm2020/lib/datasource/shared/datasources/any-datasource.interface.mjs +2 -0
  27. package/esm2020/lib/datasource/shared/datasources/any-datasource.mjs +2 -0
  28. package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.interface.mjs +2 -0
  29. package/esm2020/lib/datasource/shared/datasources/arcgisrest-datasource.mjs +145 -0
  30. package/esm2020/lib/datasource/shared/datasources/carto-datasource.interface.mjs +2 -0
  31. package/esm2020/lib/datasource/shared/datasources/carto-datasource.mjs +109 -0
  32. package/esm2020/lib/datasource/shared/datasources/cluster-datasource.interface.mjs +2 -0
  33. package/esm2020/lib/datasource/shared/datasources/cluster-datasource.mjs +15 -0
  34. package/esm2020/lib/datasource/shared/datasources/data.service.mjs +3 -0
  35. package/esm2020/lib/datasource/shared/datasources/datasource.interface.mjs +2 -0
  36. package/esm2020/lib/datasource/shared/datasources/datasource.mjs +29 -0
  37. package/esm2020/lib/datasource/shared/datasources/feature-datasource.interface.mjs +2 -0
  38. package/esm2020/lib/datasource/shared/datasources/feature-datasource.mjs +43 -0
  39. package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.mjs +2 -0
  40. package/esm2020/lib/datasource/shared/datasources/imagearcgisrest-datasource.mjs +57 -0
  41. package/esm2020/lib/datasource/shared/datasources/index.mjs +36 -0
  42. package/esm2020/lib/datasource/shared/datasources/mvt-datasource.interface.mjs +2 -0
  43. package/esm2020/lib/datasource/shared/datasources/mvt-datasource.mjs +28 -0
  44. package/esm2020/lib/datasource/shared/datasources/osm-datasource.interface.mjs +2 -0
  45. package/esm2020/lib/datasource/shared/datasources/osm-datasource.mjs +12 -0
  46. package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.mjs +2 -0
  47. package/esm2020/lib/datasource/shared/datasources/tilearcgisrest-datasource.mjs +49 -0
  48. package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.interface.mjs +2 -0
  49. package/esm2020/lib/datasource/shared/datasources/tiledebug-datasource.mjs +15 -0
  50. package/esm2020/lib/datasource/shared/datasources/websocket-datasource.interface.mjs +2 -0
  51. package/esm2020/lib/datasource/shared/datasources/websocket-datasource.mjs +54 -0
  52. package/esm2020/lib/datasource/shared/datasources/wfs-datasource.interface.mjs +2 -0
  53. package/esm2020/lib/datasource/shared/datasources/wfs-datasource.mjs +74 -0
  54. package/esm2020/lib/datasource/shared/datasources/wfs.service.mjs +152 -0
  55. package/esm2020/lib/datasource/shared/datasources/wms-datasource.interface.mjs +2 -0
  56. package/esm2020/lib/datasource/shared/datasources/wms-datasource.mjs +205 -0
  57. package/esm2020/lib/datasource/shared/datasources/wms-wfs.utils.mjs +207 -0
  58. package/esm2020/lib/datasource/shared/datasources/wmts-datasource.interface.mjs +2 -0
  59. package/esm2020/lib/datasource/shared/datasources/wmts-datasource.mjs +16 -0
  60. package/esm2020/lib/datasource/shared/datasources/xyz-datasource.interface.mjs +2 -0
  61. package/esm2020/lib/datasource/shared/datasources/xyz-datasource.mjs +9 -0
  62. package/esm2020/lib/datasource/shared/index.mjs +5 -0
  63. package/esm2020/lib/datasource/shared/options/index.mjs +5 -0
  64. package/esm2020/lib/datasource/shared/options/options-api.interface.mjs +2 -0
  65. package/esm2020/lib/datasource/shared/options/options-api.providers.mjs +15 -0
  66. package/esm2020/lib/datasource/shared/options/options-api.service.mjs +81 -0
  67. package/esm2020/lib/datasource/shared/options/options.service.mjs +3 -0
  68. package/esm2020/lib/datasource/utils/esri-style-generator.mjs +357 -0
  69. package/esm2020/lib/datasource/utils/index.mjs +3 -0
  70. package/esm2020/lib/datasource/utils/tilegrid.mjs +20 -0
  71. package/esm2020/lib/directions/directions-buttons/directions-buttons.component.mjs +224 -0
  72. package/esm2020/lib/directions/directions-buttons/index.mjs +2 -0
  73. package/esm2020/lib/directions/directions-inputs/directions-inputs.component.mjs +290 -0
  74. package/esm2020/lib/directions/directions-inputs/index.mjs +2 -0
  75. package/esm2020/lib/directions/directions-results/directions-results.component.mjs +196 -0
  76. package/esm2020/lib/directions/directions-results/index.mjs +2 -0
  77. package/esm2020/lib/directions/directions-sources/directions-source.interface.mjs +2 -0
  78. package/esm2020/lib/directions/directions-sources/directions-source.mjs +3 -0
  79. package/esm2020/lib/directions/directions-sources/directions-source.provider.mjs +16 -0
  80. package/esm2020/lib/directions/directions-sources/index.mjs +5 -0
  81. package/esm2020/lib/directions/directions-sources/osrm-directions-source.mjs +99 -0
  82. package/esm2020/lib/directions/directions.component.mjs +311 -0
  83. package/esm2020/lib/directions/directions.module.mjs +102 -0
  84. package/esm2020/lib/directions/index.mjs +7 -0
  85. package/esm2020/lib/directions/shared/directions-source.service.mjs +17 -0
  86. package/esm2020/lib/directions/shared/directions.enum.mjs +28 -0
  87. package/esm2020/lib/directions/shared/directions.interface.mjs +2 -0
  88. package/esm2020/lib/directions/shared/directions.service.mjs +29 -0
  89. package/esm2020/lib/directions/shared/directions.utils.mjs +510 -0
  90. package/esm2020/lib/directions/shared/index.mjs +6 -0
  91. package/esm2020/lib/directions/shared/store.mjs +24 -0
  92. package/esm2020/lib/download/download-button/download-button.component.mjs +61 -0
  93. package/esm2020/lib/download/download-button/index.mjs +2 -0
  94. package/esm2020/lib/download/download.module.mjs +42 -0
  95. package/esm2020/lib/download/index.mjs +3 -0
  96. package/esm2020/lib/download/shared/download.interface.mjs +2 -0
  97. package/esm2020/lib/download/shared/download.service.mjs +65 -0
  98. package/esm2020/lib/download/shared/index.mjs +3 -0
  99. package/esm2020/lib/draw/draw/draw-popup.component.mjs +61 -0
  100. package/esm2020/lib/draw/draw/draw-shorcuts.component.mjs +48 -0
  101. package/esm2020/lib/draw/draw/draw.component.mjs +714 -0
  102. package/esm2020/lib/draw/draw/draw.module.mjs +100 -0
  103. package/esm2020/lib/draw/drawingTool.module.mjs +20 -0
  104. package/esm2020/lib/draw/index.mjs +3 -0
  105. package/esm2020/lib/draw/shared/draw-icon.service.mjs +27 -0
  106. package/esm2020/lib/draw/shared/draw-style.service.mjs +173 -0
  107. package/esm2020/lib/draw/shared/draw.enum.mjs +24 -0
  108. package/esm2020/lib/draw/shared/draw.interface.mjs +2 -0
  109. package/esm2020/lib/draw/shared/draw.utils.mjs +104 -0
  110. package/esm2020/lib/draw/shared/index.mjs +6 -0
  111. package/esm2020/lib/feature/feature-details/feature-details.component.mjs +377 -0
  112. package/esm2020/lib/feature/feature-details/feature-details.directive.mjs +54 -0
  113. package/esm2020/lib/feature/feature-details/feature-details.module.mjs +48 -0
  114. package/esm2020/lib/feature/feature-form/feature-form.component.mjs +112 -0
  115. package/esm2020/lib/feature/feature-form/feature-form.module.mjs +34 -0
  116. package/esm2020/lib/feature/feature.module.mjs +28 -0
  117. package/esm2020/lib/feature/index.mjs +4 -0
  118. package/esm2020/lib/feature/shared/feature.enums.mjs +9 -0
  119. package/esm2020/lib/feature/shared/feature.interfaces.mjs +2 -0
  120. package/esm2020/lib/feature/shared/feature.utils.mjs +348 -0
  121. package/esm2020/lib/feature/shared/index.mjs +7 -0
  122. package/esm2020/lib/feature/shared/store.mjs +112 -0
  123. package/esm2020/lib/feature/shared/strategies/in-map-extent.mjs +113 -0
  124. package/esm2020/lib/feature/shared/strategies/in-map-resolution.mjs +94 -0
  125. package/esm2020/lib/feature/shared/strategies/index.mjs +6 -0
  126. package/esm2020/lib/feature/shared/strategies/loading-layer.mjs +104 -0
  127. package/esm2020/lib/feature/shared/strategies/loading.mjs +133 -0
  128. package/esm2020/lib/feature/shared/strategies/selection.mjs +370 -0
  129. package/esm2020/lib/feature/shared/strategies.utils.mjs +37 -0
  130. package/esm2020/lib/filter/filter.module.mjs +289 -0
  131. package/esm2020/lib/filter/index.mjs +16 -0
  132. package/esm2020/lib/filter/ogc-filter-button/index.mjs +2 -0
  133. package/esm2020/lib/filter/ogc-filter-button/ogc-filter-button.component.mjs +140 -0
  134. package/esm2020/lib/filter/ogc-filter-form/index.mjs +2 -0
  135. package/esm2020/lib/filter/ogc-filter-form/ogc-filter-form.component.mjs +645 -0
  136. package/esm2020/lib/filter/ogc-filter-selection/index.mjs +2 -0
  137. package/esm2020/lib/filter/ogc-filter-selection/ogc-filter-selection.component.mjs +1302 -0
  138. package/esm2020/lib/filter/ogc-filter-time/index.mjs +3 -0
  139. package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.mjs +177 -0
  140. package/esm2020/lib/filter/ogc-filter-time/ogc-filter-time.component.mjs +871 -0
  141. package/esm2020/lib/filter/ogc-filterable-form/index.mjs +2 -0
  142. package/esm2020/lib/filter/ogc-filterable-form/ogc-filterable-form.component.mjs +59 -0
  143. package/esm2020/lib/filter/ogc-filterable-item/index.mjs +2 -0
  144. package/esm2020/lib/filter/ogc-filterable-item/ogc-filterable-item.component.mjs +302 -0
  145. package/esm2020/lib/filter/ogc-filterable-list/index.mjs +3 -0
  146. package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.mjs +31 -0
  147. package/esm2020/lib/filter/ogc-filterable-list/ogc-filterable-list.component.mjs +31 -0
  148. package/esm2020/lib/filter/shared/filterable-datasource.pipe.mjs +55 -0
  149. package/esm2020/lib/filter/shared/index.mjs +12 -0
  150. package/esm2020/lib/filter/shared/ogc-filter-time.service.mjs +72 -0
  151. package/esm2020/lib/filter/shared/ogc-filter.enum.mjs +30 -0
  152. package/esm2020/lib/filter/shared/ogc-filter.interface.mjs +2 -0
  153. package/esm2020/lib/filter/shared/ogc-filter.mjs +692 -0
  154. package/esm2020/lib/filter/shared/ogc-filter.service.mjs +46 -0
  155. package/esm2020/lib/filter/shared/spatial-filter.enum.mjs +23 -0
  156. package/esm2020/lib/filter/shared/spatial-filter.interface.mjs +2 -0
  157. package/esm2020/lib/filter/shared/spatial-filter.service.mjs +269 -0
  158. package/esm2020/lib/filter/shared/time-filter.enum.mjs +13 -0
  159. package/esm2020/lib/filter/shared/time-filter.interface.mjs +2 -0
  160. package/esm2020/lib/filter/shared/time-filter.service.mjs +107 -0
  161. package/esm2020/lib/filter/spatial-filter/spatial-filter-item/index.mjs +2 -0
  162. package/esm2020/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.mjs +1076 -0
  163. package/esm2020/lib/filter/spatial-filter/spatial-filter-list/index.mjs +2 -0
  164. package/esm2020/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.mjs +208 -0
  165. package/esm2020/lib/filter/spatial-filter/spatial-filter-type/index.mjs +2 -0
  166. package/esm2020/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.mjs +144 -0
  167. package/esm2020/lib/filter/time-filter-button/index.mjs +2 -0
  168. package/esm2020/lib/filter/time-filter-button/time-filter-button.component.mjs +78 -0
  169. package/esm2020/lib/filter/time-filter-form/index.mjs +2 -0
  170. package/esm2020/lib/filter/time-filter-form/time-filter-form.component.mjs +734 -0
  171. package/esm2020/lib/filter/time-filter-item/index.mjs +2 -0
  172. package/esm2020/lib/filter/time-filter-item/time-filter-item.component.mjs +119 -0
  173. package/esm2020/lib/filter/time-filter-list/index.mjs +3 -0
  174. package/esm2020/lib/filter/time-filter-list/time-filter-list-binding.directive.mjs +31 -0
  175. package/esm2020/lib/filter/time-filter-list/time-filter-list.component.mjs +39 -0
  176. package/esm2020/lib/geo.module.mjs +102 -0
  177. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field-input.component.mjs +511 -0
  178. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.component.mjs +189 -0
  179. package/esm2020/lib/geometry/geometry-form-field/geometry-form-field.module.mjs +64 -0
  180. package/esm2020/lib/geometry/geometry.module.mjs +27 -0
  181. package/esm2020/lib/geometry/index.mjs +4 -0
  182. package/esm2020/lib/geometry/shared/controls/draw.mjs +271 -0
  183. package/esm2020/lib/geometry/shared/controls/index.mjs +4 -0
  184. package/esm2020/lib/geometry/shared/controls/modify.mjs +521 -0
  185. package/esm2020/lib/geometry/shared/controls/slice.mjs +177 -0
  186. package/esm2020/lib/geometry/shared/geometry.errors.mjs +26 -0
  187. package/esm2020/lib/geometry/shared/geometry.interfaces.mjs +2 -0
  188. package/esm2020/lib/geometry/shared/geometry.utils.mjs +122 -0
  189. package/esm2020/lib/geometry/shared/index.mjs +5 -0
  190. package/esm2020/lib/import-export/export-button/export-button.component.mjs +64 -0
  191. package/esm2020/lib/import-export/export-button/index.mjs +2 -0
  192. package/esm2020/lib/import-export/import-export/import-export.component.mjs +1190 -0
  193. package/esm2020/lib/import-export/import-export/index.mjs +2 -0
  194. package/esm2020/lib/import-export/import-export.module.mjs +93 -0
  195. package/esm2020/lib/import-export/index.mjs +5 -0
  196. package/esm2020/lib/import-export/shared/drop-geo-file.directive.mjs +135 -0
  197. package/esm2020/lib/import-export/shared/export.errors.mjs +15 -0
  198. package/esm2020/lib/import-export/shared/export.interface.mjs +2 -0
  199. package/esm2020/lib/import-export/shared/export.service.mjs +195 -0
  200. package/esm2020/lib/import-export/shared/export.type.mjs +4 -0
  201. package/esm2020/lib/import-export/shared/export.utils.mjs +55 -0
  202. package/esm2020/lib/import-export/shared/import.errors.mjs +39 -0
  203. package/esm2020/lib/import-export/shared/import.interface.mjs +2 -0
  204. package/esm2020/lib/import-export/shared/import.service.mjs +195 -0
  205. package/esm2020/lib/import-export/shared/import.utils.mjs +234 -0
  206. package/esm2020/lib/import-export/shared/index.mjs +11 -0
  207. package/esm2020/lib/import-export/style-list/index.mjs +5 -0
  208. package/esm2020/lib/import-export/style-list/style-list.interface.mjs +2 -0
  209. package/esm2020/lib/import-export/style-list/style-list.module.mjs +23 -0
  210. package/esm2020/lib/import-export/style-list/style-list.provider.mjs +21 -0
  211. package/esm2020/lib/import-export/style-list/style-list.service.mjs +51 -0
  212. package/esm2020/lib/layer/index.mjs +10 -0
  213. package/esm2020/lib/layer/layer-item/index.mjs +2 -0
  214. package/esm2020/lib/layer/layer-item/layer-item.component.mjs +300 -0
  215. package/esm2020/lib/layer/layer-legend/index.mjs +2 -0
  216. package/esm2020/lib/layer/layer-legend/layer-legend.component.mjs +382 -0
  217. package/esm2020/lib/layer/layer-legend-item/index.mjs +2 -0
  218. package/esm2020/lib/layer/layer-legend-item/layer-legend-item.component.mjs +84 -0
  219. package/esm2020/lib/layer/layer-legend-list/index.mjs +3 -0
  220. package/esm2020/lib/layer/layer-legend-list/layer-legend-list-binding.directive.mjs +48 -0
  221. package/esm2020/lib/layer/layer-legend-list/layer-legend-list.component.mjs +195 -0
  222. package/esm2020/lib/layer/layer-list/index.mjs +4 -0
  223. package/esm2020/lib/layer/layer-list/layer-list-binding.directive.mjs +59 -0
  224. package/esm2020/lib/layer/layer-list/layer-list.component.mjs +1024 -0
  225. package/esm2020/lib/layer/layer-list/layer-list.enum.mjs +19 -0
  226. package/esm2020/lib/layer/layer-list-tool/index.mjs +5 -0
  227. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.component.mjs +165 -0
  228. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.enum.mjs +7 -0
  229. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.interface.mjs +2 -0
  230. package/esm2020/lib/layer/layer-list-tool/layer-list-tool.service.mjs +22 -0
  231. package/esm2020/lib/layer/layer.module.mjs +173 -0
  232. package/esm2020/lib/layer/shared/clusterParam.mjs +2 -0
  233. package/esm2020/lib/layer/shared/index.mjs +7 -0
  234. package/esm2020/lib/layer/shared/layer.enums.mjs +2 -0
  235. package/esm2020/lib/layer/shared/layer.service.mjs +186 -0
  236. package/esm2020/lib/layer/shared/layers/any-layer.interface.mjs +2 -0
  237. package/esm2020/lib/layer/shared/layers/any-layer.mjs +2 -0
  238. package/esm2020/lib/layer/shared/layers/image-layer.interface.mjs +2 -0
  239. package/esm2020/lib/layer/shared/layers/image-layer.mjs +68 -0
  240. package/esm2020/lib/layer/shared/layers/index.mjs +13 -0
  241. package/esm2020/lib/layer/shared/layers/layer.interface.mjs +17 -0
  242. package/esm2020/lib/layer/shared/layers/layer.mjs +170 -0
  243. package/esm2020/lib/layer/shared/layers/tile-layer.interface.mjs +2 -0
  244. package/esm2020/lib/layer/shared/layers/tile-layer.mjs +47 -0
  245. package/esm2020/lib/layer/shared/layers/vector-layer.interface.mjs +2 -0
  246. package/esm2020/lib/layer/shared/layers/vector-layer.mjs +376 -0
  247. package/esm2020/lib/layer/shared/layers/vectortile-layer.interface.mjs +2 -0
  248. package/esm2020/lib/layer/shared/layers/vectortile-layer.mjs +104 -0
  249. package/esm2020/lib/layer/shared/style.service.mjs +356 -0
  250. package/esm2020/lib/layer/shared/vector-style.interface.mjs +2 -0
  251. package/esm2020/lib/layer/track-feature-button/index.mjs +2 -0
  252. package/esm2020/lib/layer/track-feature-button/track-feature-button.component.mjs +59 -0
  253. package/esm2020/lib/layer/utils/image-watcher.mjs +62 -0
  254. package/esm2020/lib/layer/utils/index.mjs +7 -0
  255. package/esm2020/lib/layer/utils/layer.utils.mjs +10 -0
  256. package/esm2020/lib/layer/utils/layerSync-watcher.mjs +242 -0
  257. package/esm2020/lib/layer/utils/outputLegend.mjs +27 -0
  258. package/esm2020/lib/layer/utils/tile-watcher.mjs +50 -0
  259. package/esm2020/lib/layer/utils/vector-watcher.mjs +48 -0
  260. package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.animation.mjs +20 -0
  261. package/esm2020/lib/map/baselayers-switcher/baselayers-switcher.component.mjs +97 -0
  262. package/esm2020/lib/map/baselayers-switcher/index.mjs +3 -0
  263. package/esm2020/lib/map/baselayers-switcher/mini-basemap.component.mjs +133 -0
  264. package/esm2020/lib/map/geolocate-button/geolocate-button.component.mjs +76 -0
  265. package/esm2020/lib/map/geolocate-button/index.mjs +2 -0
  266. package/esm2020/lib/map/home-extent-button/home-extent-button.component.mjs +63 -0
  267. package/{esm2015/lib/map/home-extent-button/index.js → esm2020/lib/map/home-extent-button/index.mjs} +0 -0
  268. package/esm2020/lib/map/index.mjs +14 -0
  269. package/esm2020/lib/map/info-section/index.mjs +2 -0
  270. package/esm2020/lib/map/info-section/info-section.component.mjs +30 -0
  271. package/esm2020/lib/map/map-browser/index.mjs +2 -0
  272. package/esm2020/lib/map/map-browser/map-browser.component.mjs +66 -0
  273. package/esm2020/lib/map/map-center/index.mjs +2 -0
  274. package/esm2020/lib/map/map-center/map-center.component.mjs +50 -0
  275. package/esm2020/lib/map/map.module.mjs +127 -0
  276. package/esm2020/lib/map/menu-button/index.mjs +2 -0
  277. package/esm2020/lib/map/menu-button/menu-button.component.mjs +62 -0
  278. package/esm2020/lib/map/offline-button/index.mjs +2 -0
  279. package/esm2020/lib/map/offline-button/offline-button.component.mjs +76 -0
  280. package/esm2020/lib/map/rotation-button/index.mjs +2 -0
  281. package/esm2020/lib/map/rotation-button/rotation-button.component.mjs +91 -0
  282. package/esm2020/lib/map/shared/controllers/controller.mjs +42 -0
  283. package/esm2020/lib/map/shared/controllers/geolocation.mjs +308 -0
  284. package/esm2020/lib/map/shared/controllers/index.mjs +4 -0
  285. package/esm2020/lib/map/shared/controllers/view.mjs +342 -0
  286. package/esm2020/lib/map/shared/hover-feature.directive.mjs +506 -0
  287. package/esm2020/lib/map/shared/index.mjs +13 -0
  288. package/esm2020/lib/map/shared/map-pointer-position.directive.mjs +107 -0
  289. package/esm2020/lib/map/shared/map.enums.mjs +6 -0
  290. package/esm2020/lib/map/shared/map.interface.mjs +2 -0
  291. package/esm2020/lib/map/shared/map.mjs +417 -0
  292. package/esm2020/lib/map/shared/map.service.mjs +29 -0
  293. package/esm2020/lib/map/shared/map.utils.mjs +459 -0
  294. package/esm2020/lib/map/shared/mapOffline.directive.mjs +163 -0
  295. package/esm2020/lib/map/shared/projection.interfaces.mjs +2 -0
  296. package/esm2020/lib/map/shared/projection.service.mjs +65 -0
  297. package/esm2020/lib/map/shared/projection.utils.mjs +64 -0
  298. package/esm2020/lib/map/swipe-control/index.mjs +2 -0
  299. package/esm2020/lib/map/swipe-control/swipe-control.component.mjs +193 -0
  300. package/esm2020/lib/map/utils/layer-watcher.mjs +58 -0
  301. package/esm2020/lib/map/wake-lock-button/index.mjs +2 -0
  302. package/esm2020/lib/map/wake-lock-button/wake-lock-button.component.mjs +114 -0
  303. package/esm2020/lib/map/zoom-button/index.mjs +2 -0
  304. package/esm2020/lib/map/zoom-button/zoom-button.component.mjs +40 -0
  305. package/esm2020/lib/measure/index.mjs +4 -0
  306. package/esm2020/lib/measure/measure.module.mjs +20 -0
  307. package/esm2020/lib/measure/measurer/measure-format.pipe.mjs +37 -0
  308. package/esm2020/lib/measure/measurer/measurer-dialog.component.mjs +180 -0
  309. package/esm2020/lib/measure/measurer/measurer-item.component.mjs +140 -0
  310. package/esm2020/lib/measure/measurer/measurer.component.mjs +1042 -0
  311. package/esm2020/lib/measure/measurer/measurer.module.mjs +94 -0
  312. package/esm2020/lib/measure/shared/index.mjs +4 -0
  313. package/esm2020/lib/measure/shared/measure.enum.mjs +37 -0
  314. package/esm2020/lib/measure/shared/measure.interfaces.mjs +2 -0
  315. package/esm2020/lib/measure/shared/measure.utils.mjs +489 -0
  316. package/esm2020/lib/metadata/index.mjs +3 -0
  317. package/esm2020/lib/metadata/metadata-button/index.mjs +2 -0
  318. package/esm2020/lib/metadata/metadata-button/metadata-button.component.mjs +134 -0
  319. package/esm2020/lib/metadata/metadata.module.mjs +55 -0
  320. package/esm2020/lib/metadata/shared/index.mjs +3 -0
  321. package/esm2020/lib/metadata/shared/metadata.interface.mjs +2 -0
  322. package/esm2020/lib/metadata/shared/metadata.service.mjs +19 -0
  323. package/esm2020/lib/offline/geoDB/geoDB.enums.mjs +6 -0
  324. package/esm2020/lib/offline/geoDB/geoDB.interface.mjs +2 -0
  325. package/esm2020/lib/offline/geoDB/geoDB.service.mjs +161 -0
  326. package/esm2020/lib/offline/geoDB/index.mjs +4 -0
  327. package/esm2020/lib/offline/index.mjs +3 -0
  328. package/esm2020/lib/offline/shared/geo-network.service.mjs +66 -0
  329. package/esm2020/lib/offline/shared/index.mjs +2 -0
  330. package/esm2020/lib/overlay/index.mjs +2 -0
  331. package/esm2020/lib/overlay/overlay.module.mjs +23 -0
  332. package/esm2020/lib/overlay/shared/index.mjs +7 -0
  333. package/esm2020/lib/overlay/shared/overlay-marker-style.utils.mjs +69 -0
  334. package/esm2020/lib/overlay/shared/overlay.directive.mjs +33 -0
  335. package/esm2020/lib/overlay/shared/overlay.enum.mjs +8 -0
  336. package/esm2020/lib/overlay/shared/overlay.mjs +130 -0
  337. package/esm2020/lib/overlay/shared/overlay.service.mjs +27 -0
  338. package/esm2020/lib/overlay/shared/overlay.utils.mjs +103 -0
  339. package/esm2020/lib/print/index.mjs +4 -0
  340. package/esm2020/lib/print/print/print.component.mjs +123 -0
  341. package/esm2020/lib/print/print-form/index.mjs +2 -0
  342. package/esm2020/lib/print/print-form/print-form.component.mjs +405 -0
  343. package/esm2020/lib/print/print.module.mjs +65 -0
  344. package/esm2020/lib/print/shared/index.mjs +4 -0
  345. package/esm2020/lib/print/shared/print.interface.mjs +2 -0
  346. package/esm2020/lib/print/shared/print.service.mjs +807 -0
  347. package/esm2020/lib/print/shared/print.type.mjs +30 -0
  348. package/esm2020/lib/query/index.mjs +2 -0
  349. package/esm2020/lib/query/query.module.mjs +29 -0
  350. package/esm2020/lib/query/shared/index.mjs +7 -0
  351. package/esm2020/lib/query/shared/query-search-source.mjs +35 -0
  352. package/esm2020/lib/query/shared/query-search-source.providers.mjs +22 -0
  353. package/esm2020/lib/query/shared/query.directive.mjs +261 -0
  354. package/esm2020/lib/query/shared/query.enums.mjs +30 -0
  355. package/esm2020/lib/query/shared/query.interfaces.mjs +2 -0
  356. package/esm2020/lib/query/shared/query.service.mjs +613 -0
  357. package/esm2020/lib/query/shared/query.utils.mjs +37 -0
  358. package/esm2020/lib/search/index.mjs +12 -0
  359. package/esm2020/lib/search/search-bar/search-bar.component.mjs +489 -0
  360. package/esm2020/lib/search/search-bar/search-bar.module.mjs +75 -0
  361. package/esm2020/lib/search/search-bar/search-url-param.directive.mjs +35 -0
  362. package/esm2020/lib/search/search-results/search-results-add-button.component.mjs +193 -0
  363. package/esm2020/lib/search/search-results/search-results-item.component.mjs +124 -0
  364. package/esm2020/lib/search/search-results/search-results.component.mjs +331 -0
  365. package/esm2020/lib/search/search-results/search-results.module.mjs +77 -0
  366. package/esm2020/lib/search/search-selector/search-selector.component.mjs +123 -0
  367. package/esm2020/lib/search/search-selector/search-selector.module.mjs +56 -0
  368. package/esm2020/lib/search/search-settings/search-settings.component.mjs +418 -0
  369. package/esm2020/lib/search/search-settings/search-settings.module.mjs +60 -0
  370. package/esm2020/lib/search/search.module.mjs +67 -0
  371. package/esm2020/lib/search/shared/index.mjs +9 -0
  372. package/esm2020/lib/search/shared/search-pointer-summary.directive.mjs +322 -0
  373. package/esm2020/lib/search/shared/search-source-service.providers.mjs +20 -0
  374. package/esm2020/lib/search/shared/search-source.service.mjs +47 -0
  375. package/esm2020/lib/search/shared/search.enums.mjs +4 -0
  376. package/esm2020/lib/search/shared/search.interfaces.mjs +2 -0
  377. package/esm2020/lib/search/shared/search.service.mjs +118 -0
  378. package/esm2020/lib/search/shared/search.utils.mjs +78 -0
  379. package/esm2020/lib/search/shared/sources/cadastre.mjs +126 -0
  380. package/esm2020/lib/search/shared/sources/cadastre.providers.mjs +23 -0
  381. package/esm2020/lib/search/shared/sources/coordinates.interfaces.mjs +2 -0
  382. package/esm2020/lib/search/shared/sources/coordinates.mjs +147 -0
  383. package/esm2020/lib/search/shared/sources/coordinates.providers.mjs +40 -0
  384. package/esm2020/lib/search/shared/sources/icherche.interfaces.mjs +2 -0
  385. package/esm2020/lib/search/shared/sources/icherche.mjs +755 -0
  386. package/esm2020/lib/search/shared/sources/icherche.providers.mjs +66 -0
  387. package/esm2020/lib/search/shared/sources/ilayer.interfaces.mjs +2 -0
  388. package/esm2020/lib/search/shared/sources/ilayer.mjs +320 -0
  389. package/esm2020/lib/search/shared/sources/ilayer.providers.mjs +40 -0
  390. package/esm2020/lib/search/shared/sources/index.mjs +20 -0
  391. package/esm2020/lib/search/shared/sources/nominatim.interfaces.mjs +2 -0
  392. package/esm2020/lib/search/shared/sources/nominatim.mjs +253 -0
  393. package/esm2020/lib/search/shared/sources/nominatim.providers.mjs +23 -0
  394. package/esm2020/lib/search/shared/sources/source.interfaces.mjs +2 -0
  395. package/esm2020/lib/search/shared/sources/source.mjs +179 -0
  396. package/esm2020/lib/search/shared/sources/storedqueries.interfaces.mjs +2 -0
  397. package/esm2020/lib/search/shared/sources/storedqueries.mjs +425 -0
  398. package/esm2020/lib/search/shared/sources/storedqueries.providers.mjs +41 -0
  399. package/esm2020/lib/toast/index.mjs +2 -0
  400. package/esm2020/lib/toast/toast.component.mjs +113 -0
  401. package/esm2020/lib/toast/toast.module.mjs +45 -0
  402. package/esm2020/lib/utils/commonVectorStyle.interface.mjs +2 -0
  403. package/esm2020/lib/utils/commonVectorStyle.mjs +75 -0
  404. package/esm2020/lib/utils/googleLinks.mjs +13 -0
  405. package/esm2020/lib/utils/id-generator.mjs +110 -0
  406. package/esm2020/lib/utils/index.mjs +6 -0
  407. package/esm2020/lib/utils/osmLinks.mjs +10 -0
  408. package/esm2020/lib/wkt/index.mjs +2 -0
  409. package/esm2020/lib/wkt/shared/index.mjs +2 -0
  410. package/esm2020/lib/wkt/shared/wkt.service.mjs +239 -0
  411. package/esm2020/lib/wkt/wkt.module.mjs +22 -0
  412. package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.component.mjs +48 -0
  413. package/esm2020/lib/workspace/confirmation-popup/confirmation-popup.module.mjs +36 -0
  414. package/esm2020/lib/workspace/confirmation-popup/index.mjs +3 -0
  415. package/esm2020/lib/workspace/index.mjs +8 -0
  416. package/esm2020/lib/workspace/shared/edition-workspace.mjs +278 -0
  417. package/esm2020/lib/workspace/shared/edition-workspace.service.mjs +642 -0
  418. package/esm2020/lib/workspace/shared/feature-workspace.mjs +35 -0
  419. package/esm2020/lib/workspace/shared/feature-workspace.service.mjs +150 -0
  420. package/esm2020/lib/workspace/shared/index.mjs +8 -0
  421. package/esm2020/lib/workspace/shared/wfs-workspace.mjs +35 -0
  422. package/esm2020/lib/workspace/shared/wfs-workspace.service.mjs +150 -0
  423. package/esm2020/lib/workspace/shared/wms-workspace.service.mjs +261 -0
  424. package/esm2020/lib/workspace/shared/workspace.utils.mjs +24 -0
  425. package/esm2020/lib/workspace/widgets/index.mjs +4 -0
  426. package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.component.mjs +47 -0
  427. package/esm2020/lib/workspace/widgets/ogc-filter/ogc-filter.module.mjs +36 -0
  428. package/esm2020/lib/workspace/widgets/widgets.mjs +15 -0
  429. package/esm2020/lib/workspace/workspace-selector/workspace-selector.directive.mjs +133 -0
  430. package/esm2020/lib/workspace/workspace-selector/workspace-selector.module.mjs +28 -0
  431. package/esm2020/lib/workspace/workspace-updator/workspace-updator.directive.mjs +113 -0
  432. package/esm2020/lib/workspace/workspace-updator/workspace-updator.module.mjs +28 -0
  433. package/esm2020/lib/workspace/workspace.module.mjs +62 -0
  434. package/esm2020/public_api.mjs +55 -0
  435. package/fesm2015/igo2-geo.mjs +42904 -0
  436. package/fesm2015/igo2-geo.mjs.map +1 -0
  437. package/fesm2020/igo2-geo.mjs +41183 -0
  438. package/fesm2020/igo2-geo.mjs.map +1 -0
  439. package/{igo2-geo.d.ts → index.d.ts} +0 -0
  440. package/lib/catalog/catalog-browser/catalog-browser-group.component.d.ts +1 -1
  441. package/lib/catalog/catalog-browser/catalog-browser-layer.component.d.ts +1 -1
  442. package/lib/catalog/catalog-browser/catalog-browser.component.d.ts +1 -1
  443. package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +4 -4
  444. package/lib/catalog/catalog-library/catalog-library-item.component.d.ts +1 -1
  445. package/lib/catalog/catalog-library/catalog-library.component.d.ts +1 -1
  446. package/lib/catalog/shared/catalog.interface.d.ts +9 -1
  447. package/lib/catalog/shared/catalog.service.d.ts +1 -0
  448. package/lib/datasource/shared/datasources/datasource.interface.d.ts +7 -1
  449. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +1 -1
  450. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +1 -1
  451. package/lib/directions/directions-results/directions-results.component.d.ts +1 -1
  452. package/lib/directions/directions.component.d.ts +1 -1
  453. package/lib/download/download-button/download-button.component.d.ts +1 -1
  454. package/lib/draw/draw/draw-popup.component.d.ts +4 -2
  455. package/lib/draw/draw/draw-shorcuts.component.d.ts +1 -1
  456. package/lib/draw/draw/draw.component.d.ts +22 -5
  457. package/lib/draw/shared/draw-style.service.d.ts +6 -0
  458. package/lib/draw/shared/draw.enum.d.ts +15 -0
  459. package/lib/feature/feature-details/feature-details.component.d.ts +13 -3
  460. package/lib/feature/feature-details/feature-details.directive.d.ts +3 -14
  461. package/lib/feature/feature-form/feature-form.component.d.ts +1 -1
  462. package/lib/feature/shared/feature.interfaces.d.ts +2 -2
  463. package/lib/filter/filter.module.d.ts +1 -1
  464. package/lib/filter/ogc-filter-button/ogc-filter-button.component.d.ts +1 -1
  465. package/lib/filter/ogc-filter-form/ogc-filter-form.component.d.ts +1 -1
  466. package/lib/filter/ogc-filter-selection/ogc-filter-selection.component.d.ts +33 -15
  467. package/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.d.ts +1 -1
  468. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +6 -6
  469. package/lib/filter/ogc-filterable-form/ogc-filterable-form.component.d.ts +1 -1
  470. package/lib/filter/ogc-filterable-item/ogc-filterable-item.component.d.ts +1 -1
  471. package/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.d.ts +1 -1
  472. package/lib/filter/ogc-filterable-list/ogc-filterable-list.component.d.ts +1 -1
  473. package/lib/filter/shared/filterable-datasource.pipe.d.ts +1 -1
  474. package/lib/filter/shared/ogc-filter.interface.d.ts +19 -2
  475. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +5 -5
  476. package/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.d.ts +4 -4
  477. package/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.d.ts +3 -3
  478. package/lib/filter/time-filter-button/time-filter-button.component.d.ts +1 -1
  479. package/lib/filter/time-filter-form/time-filter-form.component.d.ts +1 -1
  480. package/lib/filter/time-filter-item/time-filter-item.component.d.ts +1 -1
  481. package/lib/filter/time-filter-list/time-filter-list-binding.directive.d.ts +1 -1
  482. package/lib/filter/time-filter-list/time-filter-list.component.d.ts +1 -1
  483. package/lib/geometry/geometry-form-field/geometry-form-field-input.component.d.ts +1 -1
  484. package/lib/geometry/geometry-form-field/geometry-form-field.component.d.ts +3 -3
  485. package/lib/import-export/export-button/export-button.component.d.ts +1 -1
  486. package/lib/import-export/import-export/import-export.component.d.ts +5 -5
  487. package/lib/import-export/shared/drop-geo-file.directive.d.ts +1 -1
  488. package/lib/import-export/shared/import.utils.d.ts +1 -1
  489. package/lib/layer/layer-item/layer-item.component.d.ts +2 -1
  490. package/lib/layer/layer-legend/layer-legend.component.d.ts +4 -3
  491. package/lib/layer/layer-legend-item/layer-legend-item.component.d.ts +1 -1
  492. package/lib/layer/layer-legend-list/layer-legend-list-binding.directive.d.ts +1 -1
  493. package/lib/layer/layer-legend-list/layer-legend-list.component.d.ts +1 -1
  494. package/lib/layer/layer-list/layer-list-binding.directive.d.ts +1 -1
  495. package/lib/layer/layer-list/layer-list.component.d.ts +1 -1
  496. package/lib/layer/layer-list-tool/layer-list-tool.component.d.ts +1 -1
  497. package/lib/layer/shared/layer.service.d.ts +6 -3
  498. package/lib/layer/shared/layers/layer.interface.d.ts +1 -0
  499. package/lib/layer/shared/layers/vector-layer.d.ts +5 -1
  500. package/lib/layer/shared/style.service.d.ts +38 -3
  501. package/lib/layer/shared/vector-style.interface.d.ts +11 -0
  502. package/lib/layer/track-feature-button/track-feature-button.component.d.ts +1 -1
  503. package/lib/map/baselayers-switcher/baselayers-switcher.component.d.ts +1 -1
  504. package/lib/map/baselayers-switcher/mini-basemap.component.d.ts +1 -1
  505. package/lib/map/geolocate-button/geolocate-button.component.d.ts +9 -2
  506. package/lib/map/home-extent-button/home-extent-button.component.d.ts +1 -1
  507. package/lib/map/index.d.ts +1 -0
  508. package/lib/map/info-section/info-section.component.d.ts +1 -1
  509. package/lib/map/map-browser/map-browser.component.d.ts +1 -1
  510. package/lib/map/map-center/map-center.component.d.ts +1 -1
  511. package/lib/map/map.module.d.ts +13 -12
  512. package/lib/map/menu-button/menu-button.component.d.ts +1 -1
  513. package/lib/map/offline-button/offline-button.component.d.ts +1 -1
  514. package/lib/map/rotation-button/rotation-button.component.d.ts +1 -1
  515. package/lib/map/shared/controllers/geolocation.d.ts +112 -0
  516. package/lib/map/shared/controllers/index.d.ts +1 -0
  517. package/lib/map/shared/controllers/view.d.ts +7 -0
  518. package/lib/map/shared/hover-feature.directive.d.ts +2 -2
  519. package/lib/map/shared/map-pointer-position.directive.d.ts +1 -1
  520. package/lib/map/shared/map.d.ts +7 -19
  521. package/lib/map/shared/map.interface.d.ts +0 -1
  522. package/lib/map/shared/mapOffline.directive.d.ts +1 -1
  523. package/lib/map/swipe-control/swipe-control.component.d.ts +1 -1
  524. package/lib/map/wake-lock-button/index.d.ts +1 -0
  525. package/lib/map/wake-lock-button/wake-lock-button.component.d.ts +30 -0
  526. package/lib/map/zoom-button/zoom-button.component.d.ts +1 -1
  527. package/lib/measure/measurer/measure-format.pipe.d.ts +1 -1
  528. package/lib/measure/measurer/measurer-dialog.component.d.ts +1 -1
  529. package/lib/measure/measurer/measurer-item.component.d.ts +1 -1
  530. package/lib/measure/measurer/measurer.component.d.ts +1 -1
  531. package/lib/metadata/metadata-button/metadata-button.component.d.ts +2 -2
  532. package/lib/offline/geoDB/geoDB.enums.d.ts +4 -0
  533. package/lib/offline/geoDB/geoDB.interface.d.ts +9 -0
  534. package/lib/offline/geoDB/geoDB.service.d.ts +35 -0
  535. package/lib/offline/geoDB/index.d.ts +3 -0
  536. package/lib/offline/index.d.ts +2 -0
  537. package/lib/offline/shared/geo-network.service.d.ts +28 -0
  538. package/lib/offline/shared/index.d.ts +1 -0
  539. package/lib/overlay/shared/overlay.directive.d.ts +1 -1
  540. package/lib/print/print/print.component.d.ts +1 -1
  541. package/lib/print/print-form/print-form.component.d.ts +17 -17
  542. package/lib/print/shared/print.service.d.ts +9 -3
  543. package/lib/query/query.module.d.ts +2 -1
  544. package/lib/query/shared/query.directive.d.ts +1 -1
  545. package/lib/query/shared/query.service.d.ts +7 -1
  546. package/lib/search/search-bar/search-bar.component.d.ts +1 -1
  547. package/lib/search/search-bar/search-url-param.directive.d.ts +1 -1
  548. package/lib/search/search-results/search-results-add-button.component.d.ts +1 -1
  549. package/lib/search/search-results/search-results-item.component.d.ts +1 -1
  550. package/lib/search/search-results/search-results.component.d.ts +1 -1
  551. package/lib/search/search-selector/search-selector.component.d.ts +1 -1
  552. package/lib/search/search-settings/search-settings.component.d.ts +1 -1
  553. package/lib/search/shared/search-pointer-summary.directive.d.ts +1 -1
  554. package/lib/toast/toast.component.d.ts +1 -1
  555. package/lib/wkt/shared/wkt.service.d.ts +1 -1
  556. package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +1 -1
  557. package/lib/workspace/shared/edition-workspace.d.ts +2 -1
  558. package/lib/workspace/shared/edition-workspace.service.d.ts +5 -2
  559. package/lib/workspace/shared/feature-workspace.service.d.ts +3 -2
  560. package/lib/workspace/shared/wfs-workspace.service.d.ts +3 -2
  561. package/lib/workspace/shared/wms-workspace.service.d.ts +5 -2
  562. package/lib/workspace/widgets/ogc-filter/ogc-filter.component.d.ts +1 -1
  563. package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +1 -1
  564. package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +1 -1
  565. package/ngcc.config.js +3 -3
  566. package/package.json +35 -20
  567. package/public_api.d.ts +1 -0
  568. package/style/geo.theming.scss +12 -12
  569. package/bundles/igo2-geo.umd.js +0 -45805
  570. package/bundles/igo2-geo.umd.js.map +0 -1
  571. package/esm2015/lib/catalog/catalog-browser/catalog-browser-group.component.js +0 -305
  572. package/esm2015/lib/catalog/catalog-browser/catalog-browser-layer.component.js +0 -274
  573. package/esm2015/lib/catalog/catalog-browser/catalog-browser.component.js +0 -248
  574. package/esm2015/lib/catalog/catalog-browser/catalog-browser.module.js +0 -82
  575. package/esm2015/lib/catalog/catalog-library/add-catalog-dialog.component.js +0 -235
  576. package/esm2015/lib/catalog/catalog-library/catalog-library-item.component.js +0 -85
  577. package/esm2015/lib/catalog/catalog-library/catalog-library.component.js +0 -224
  578. package/esm2015/lib/catalog/catalog-library/catalog-library.module.js +0 -97
  579. package/esm2015/lib/catalog/catalog.module.js +0 -55
  580. package/esm2015/lib/catalog/index.js +0 -5
  581. package/esm2015/lib/catalog/shared/catalog.abstract.js +0 -95
  582. package/esm2015/lib/catalog/shared/catalog.enum.js +0 -16
  583. package/esm2015/lib/catalog/shared/catalog.interface.js +0 -2
  584. package/esm2015/lib/catalog/shared/catalog.service.js +0 -535
  585. package/esm2015/lib/catalog/shared/index.js +0 -5
  586. package/esm2015/lib/datasource/datasource.module.js +0 -22
  587. package/esm2015/lib/datasource/index.js +0 -3
  588. package/esm2015/lib/datasource/shared/capabilities.service.js +0 -427
  589. package/esm2015/lib/datasource/shared/datasource.service.js +0 -236
  590. package/esm2015/lib/datasource/shared/datasources/any-datasource.interface.js +0 -2
  591. package/esm2015/lib/datasource/shared/datasources/any-datasource.js +0 -2
  592. package/esm2015/lib/datasource/shared/datasources/arcgisrest-datasource.interface.js +0 -2
  593. package/esm2015/lib/datasource/shared/datasources/arcgisrest-datasource.js +0 -145
  594. package/esm2015/lib/datasource/shared/datasources/carto-datasource.interface.js +0 -2
  595. package/esm2015/lib/datasource/shared/datasources/carto-datasource.js +0 -109
  596. package/esm2015/lib/datasource/shared/datasources/cluster-datasource.interface.js +0 -2
  597. package/esm2015/lib/datasource/shared/datasources/cluster-datasource.js +0 -15
  598. package/esm2015/lib/datasource/shared/datasources/data.service.js +0 -3
  599. package/esm2015/lib/datasource/shared/datasources/datasource.interface.js +0 -2
  600. package/esm2015/lib/datasource/shared/datasources/datasource.js +0 -29
  601. package/esm2015/lib/datasource/shared/datasources/feature-datasource.interface.js +0 -2
  602. package/esm2015/lib/datasource/shared/datasources/feature-datasource.js +0 -43
  603. package/esm2015/lib/datasource/shared/datasources/imagearcgisrest-datasource.interface.js +0 -2
  604. package/esm2015/lib/datasource/shared/datasources/imagearcgisrest-datasource.js +0 -57
  605. package/esm2015/lib/datasource/shared/datasources/index.js +0 -36
  606. package/esm2015/lib/datasource/shared/datasources/mvt-datasource.interface.js +0 -2
  607. package/esm2015/lib/datasource/shared/datasources/mvt-datasource.js +0 -28
  608. package/esm2015/lib/datasource/shared/datasources/osm-datasource.interface.js +0 -2
  609. package/esm2015/lib/datasource/shared/datasources/osm-datasource.js +0 -12
  610. package/esm2015/lib/datasource/shared/datasources/tilearcgisrest-datasource.interface.js +0 -2
  611. package/esm2015/lib/datasource/shared/datasources/tilearcgisrest-datasource.js +0 -49
  612. package/esm2015/lib/datasource/shared/datasources/tiledebug-datasource.interface.js +0 -2
  613. package/esm2015/lib/datasource/shared/datasources/tiledebug-datasource.js +0 -15
  614. package/esm2015/lib/datasource/shared/datasources/websocket-datasource.interface.js +0 -2
  615. package/esm2015/lib/datasource/shared/datasources/websocket-datasource.js +0 -54
  616. package/esm2015/lib/datasource/shared/datasources/wfs-datasource.interface.js +0 -2
  617. package/esm2015/lib/datasource/shared/datasources/wfs-datasource.js +0 -71
  618. package/esm2015/lib/datasource/shared/datasources/wfs.service.js +0 -153
  619. package/esm2015/lib/datasource/shared/datasources/wms-datasource.interface.js +0 -2
  620. package/esm2015/lib/datasource/shared/datasources/wms-datasource.js +0 -202
  621. package/esm2015/lib/datasource/shared/datasources/wms-wfs.utils.js +0 -207
  622. package/esm2015/lib/datasource/shared/datasources/wmts-datasource.interface.js +0 -2
  623. package/esm2015/lib/datasource/shared/datasources/wmts-datasource.js +0 -16
  624. package/esm2015/lib/datasource/shared/datasources/xyz-datasource.interface.js +0 -2
  625. package/esm2015/lib/datasource/shared/datasources/xyz-datasource.js +0 -9
  626. package/esm2015/lib/datasource/shared/index.js +0 -5
  627. package/esm2015/lib/datasource/shared/options/index.js +0 -5
  628. package/esm2015/lib/datasource/shared/options/options-api.interface.js +0 -2
  629. package/esm2015/lib/datasource/shared/options/options-api.providers.js +0 -15
  630. package/esm2015/lib/datasource/shared/options/options-api.service.js +0 -81
  631. package/esm2015/lib/datasource/shared/options/options.service.js +0 -3
  632. package/esm2015/lib/datasource/utils/esri-style-generator.js +0 -357
  633. package/esm2015/lib/datasource/utils/index.js +0 -3
  634. package/esm2015/lib/datasource/utils/tilegrid.js +0 -20
  635. package/esm2015/lib/directions/directions-buttons/directions-buttons.component.js +0 -229
  636. package/esm2015/lib/directions/directions-buttons/index.js +0 -2
  637. package/esm2015/lib/directions/directions-inputs/directions-inputs.component.js +0 -300
  638. package/esm2015/lib/directions/directions-inputs/index.js +0 -2
  639. package/esm2015/lib/directions/directions-results/directions-results.component.js +0 -204
  640. package/esm2015/lib/directions/directions-results/index.js +0 -2
  641. package/esm2015/lib/directions/directions-sources/directions-source.interface.js +0 -2
  642. package/esm2015/lib/directions/directions-sources/directions-source.js +0 -3
  643. package/esm2015/lib/directions/directions-sources/directions-source.provider.js +0 -16
  644. package/esm2015/lib/directions/directions-sources/index.js +0 -5
  645. package/esm2015/lib/directions/directions-sources/osrm-directions-source.js +0 -99
  646. package/esm2015/lib/directions/directions.component.js +0 -316
  647. package/esm2015/lib/directions/directions.module.js +0 -104
  648. package/esm2015/lib/directions/index.js +0 -7
  649. package/esm2015/lib/directions/shared/directions-source.service.js +0 -17
  650. package/esm2015/lib/directions/shared/directions.enum.js +0 -28
  651. package/esm2015/lib/directions/shared/directions.interface.js +0 -2
  652. package/esm2015/lib/directions/shared/directions.service.js +0 -29
  653. package/esm2015/lib/directions/shared/directions.utils.js +0 -510
  654. package/esm2015/lib/directions/shared/index.js +0 -6
  655. package/esm2015/lib/directions/shared/store.js +0 -24
  656. package/esm2015/lib/download/download-button/download-button.component.js +0 -66
  657. package/esm2015/lib/download/download-button/index.js +0 -2
  658. package/esm2015/lib/download/download.module.js +0 -44
  659. package/esm2015/lib/download/index.js +0 -3
  660. package/esm2015/lib/download/shared/download.interface.js +0 -2
  661. package/esm2015/lib/download/shared/download.service.js +0 -65
  662. package/esm2015/lib/download/shared/index.js +0 -3
  663. package/esm2015/lib/draw/draw/draw-popup.component.js +0 -63
  664. package/esm2015/lib/draw/draw/draw-shorcuts.component.js +0 -64
  665. package/esm2015/lib/draw/draw/draw.component.js +0 -637
  666. package/esm2015/lib/draw/draw/draw.module.js +0 -102
  667. package/esm2015/lib/draw/drawingTool.module.js +0 -20
  668. package/esm2015/lib/draw/index.js +0 -3
  669. package/esm2015/lib/draw/shared/draw-icon.service.js +0 -27
  670. package/esm2015/lib/draw/shared/draw-style.service.js +0 -154
  671. package/esm2015/lib/draw/shared/draw.enum.js +0 -8
  672. package/esm2015/lib/draw/shared/draw.interface.js +0 -2
  673. package/esm2015/lib/draw/shared/draw.utils.js +0 -104
  674. package/esm2015/lib/draw/shared/index.js +0 -6
  675. package/esm2015/lib/feature/feature-details/feature-details.component.js +0 -317
  676. package/esm2015/lib/feature/feature-details/feature-details.directive.js +0 -109
  677. package/esm2015/lib/feature/feature-details/feature-details.module.js +0 -50
  678. package/esm2015/lib/feature/feature-form/feature-form.component.js +0 -117
  679. package/esm2015/lib/feature/feature-form/feature-form.module.js +0 -36
  680. package/esm2015/lib/feature/feature.module.js +0 -30
  681. package/esm2015/lib/feature/index.js +0 -4
  682. package/esm2015/lib/feature/shared/feature.enums.js +0 -9
  683. package/esm2015/lib/feature/shared/feature.interfaces.js +0 -2
  684. package/esm2015/lib/feature/shared/feature.utils.js +0 -348
  685. package/esm2015/lib/feature/shared/index.js +0 -7
  686. package/esm2015/lib/feature/shared/store.js +0 -112
  687. package/esm2015/lib/feature/shared/strategies/in-map-extent.js +0 -114
  688. package/esm2015/lib/feature/shared/strategies/in-map-resolution.js +0 -94
  689. package/esm2015/lib/feature/shared/strategies/index.js +0 -6
  690. package/esm2015/lib/feature/shared/strategies/loading-layer.js +0 -104
  691. package/esm2015/lib/feature/shared/strategies/loading.js +0 -133
  692. package/esm2015/lib/feature/shared/strategies/selection.js +0 -370
  693. package/esm2015/lib/feature/shared/strategies.utils.js +0 -37
  694. package/esm2015/lib/filter/filter.module.js +0 -287
  695. package/esm2015/lib/filter/index.js +0 -16
  696. package/esm2015/lib/filter/ogc-filter-button/index.js +0 -2
  697. package/esm2015/lib/filter/ogc-filter-button/ogc-filter-button.component.js +0 -136
  698. package/esm2015/lib/filter/ogc-filter-form/index.js +0 -2
  699. package/esm2015/lib/filter/ogc-filter-form/ogc-filter-form.component.js +0 -657
  700. package/esm2015/lib/filter/ogc-filter-selection/index.js +0 -2
  701. package/esm2015/lib/filter/ogc-filter-selection/ogc-filter-selection.component.js +0 -993
  702. package/esm2015/lib/filter/ogc-filter-time/index.js +0 -3
  703. package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time-slider.component.js +0 -185
  704. package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time.component.js +0 -898
  705. package/esm2015/lib/filter/ogc-filterable-form/index.js +0 -2
  706. package/esm2015/lib/filter/ogc-filterable-form/ogc-filterable-form.component.js +0 -62
  707. package/esm2015/lib/filter/ogc-filterable-item/index.js +0 -2
  708. package/esm2015/lib/filter/ogc-filterable-item/ogc-filterable-item.component.js +0 -306
  709. package/esm2015/lib/filter/ogc-filterable-list/index.js +0 -3
  710. package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list-binding.directive.js +0 -31
  711. package/esm2015/lib/filter/ogc-filterable-list/ogc-filterable-list.component.js +0 -35
  712. package/esm2015/lib/filter/shared/filterable-datasource.pipe.js +0 -54
  713. package/esm2015/lib/filter/shared/index.js +0 -12
  714. package/esm2015/lib/filter/shared/ogc-filter-time.service.js +0 -73
  715. package/esm2015/lib/filter/shared/ogc-filter.enum.js +0 -30
  716. package/esm2015/lib/filter/shared/ogc-filter.interface.js +0 -2
  717. package/esm2015/lib/filter/shared/ogc-filter.js +0 -682
  718. package/esm2015/lib/filter/shared/ogc-filter.service.js +0 -46
  719. package/esm2015/lib/filter/shared/spatial-filter.enum.js +0 -23
  720. package/esm2015/lib/filter/shared/spatial-filter.interface.js +0 -2
  721. package/esm2015/lib/filter/shared/spatial-filter.service.js +0 -269
  722. package/esm2015/lib/filter/shared/time-filter.enum.js +0 -13
  723. package/esm2015/lib/filter/shared/time-filter.interface.js +0 -2
  724. package/esm2015/lib/filter/shared/time-filter.service.js +0 -107
  725. package/esm2015/lib/filter/spatial-filter/spatial-filter-item/index.js +0 -2
  726. package/esm2015/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.js +0 -1108
  727. package/esm2015/lib/filter/spatial-filter/spatial-filter-list/index.js +0 -2
  728. package/esm2015/lib/filter/spatial-filter/spatial-filter-list/spatial-filter-list.component.js +0 -224
  729. package/esm2015/lib/filter/spatial-filter/spatial-filter-type/index.js +0 -2
  730. package/esm2015/lib/filter/spatial-filter/spatial-filter-type/spatial-filter-type.component.js +0 -157
  731. package/esm2015/lib/filter/time-filter-button/index.js +0 -2
  732. package/esm2015/lib/filter/time-filter-button/time-filter-button.component.js +0 -83
  733. package/esm2015/lib/filter/time-filter-form/index.js +0 -2
  734. package/esm2015/lib/filter/time-filter-form/time-filter-form.component.js +0 -772
  735. package/esm2015/lib/filter/time-filter-item/index.js +0 -2
  736. package/esm2015/lib/filter/time-filter-item/time-filter-item.component.js +0 -126
  737. package/esm2015/lib/filter/time-filter-list/index.js +0 -3
  738. package/esm2015/lib/filter/time-filter-list/time-filter-list-binding.directive.js +0 -31
  739. package/esm2015/lib/filter/time-filter-list/time-filter-list.component.js +0 -43
  740. package/esm2015/lib/geo.module.js +0 -102
  741. package/esm2015/lib/geometry/geometry-form-field/geometry-form-field-input.component.js +0 -515
  742. package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.component.js +0 -199
  743. package/esm2015/lib/geometry/geometry-form-field/geometry-form-field.module.js +0 -66
  744. package/esm2015/lib/geometry/geometry.module.js +0 -29
  745. package/esm2015/lib/geometry/index.js +0 -4
  746. package/esm2015/lib/geometry/shared/controls/draw.js +0 -271
  747. package/esm2015/lib/geometry/shared/controls/index.js +0 -4
  748. package/esm2015/lib/geometry/shared/controls/modify.js +0 -521
  749. package/esm2015/lib/geometry/shared/controls/slice.js +0 -177
  750. package/esm2015/lib/geometry/shared/geometry.errors.js +0 -26
  751. package/esm2015/lib/geometry/shared/geometry.interfaces.js +0 -2
  752. package/esm2015/lib/geometry/shared/geometry.utils.js +0 -122
  753. package/esm2015/lib/geometry/shared/index.js +0 -5
  754. package/esm2015/lib/import-export/export-button/export-button.component.js +0 -70
  755. package/esm2015/lib/import-export/export-button/index.js +0 -2
  756. package/esm2015/lib/import-export/import-export/import-export.component.js +0 -1238
  757. package/esm2015/lib/import-export/import-export/index.js +0 -2
  758. package/esm2015/lib/import-export/import-export.module.js +0 -95
  759. package/esm2015/lib/import-export/index.js +0 -5
  760. package/esm2015/lib/import-export/shared/drop-geo-file.directive.js +0 -136
  761. package/esm2015/lib/import-export/shared/export.errors.js +0 -15
  762. package/esm2015/lib/import-export/shared/export.interface.js +0 -2
  763. package/esm2015/lib/import-export/shared/export.service.js +0 -187
  764. package/esm2015/lib/import-export/shared/export.type.js +0 -4
  765. package/esm2015/lib/import-export/shared/export.utils.js +0 -55
  766. package/esm2015/lib/import-export/shared/import.errors.js +0 -39
  767. package/esm2015/lib/import-export/shared/import.interface.js +0 -2
  768. package/esm2015/lib/import-export/shared/import.service.js +0 -195
  769. package/esm2015/lib/import-export/shared/import.utils.js +0 -207
  770. package/esm2015/lib/import-export/shared/index.js +0 -11
  771. package/esm2015/lib/import-export/style-list/index.js +0 -5
  772. package/esm2015/lib/import-export/style-list/style-list.interface.js +0 -2
  773. package/esm2015/lib/import-export/style-list/style-list.module.js +0 -23
  774. package/esm2015/lib/import-export/style-list/style-list.provider.js +0 -21
  775. package/esm2015/lib/import-export/style-list/style-list.service.js +0 -51
  776. package/esm2015/lib/layer/index.js +0 -10
  777. package/esm2015/lib/layer/layer-item/index.js +0 -2
  778. package/esm2015/lib/layer/layer-item/layer-item.component.js +0 -298
  779. package/esm2015/lib/layer/layer-legend/index.js +0 -2
  780. package/esm2015/lib/layer/layer-legend/layer-legend.component.js +0 -394
  781. package/esm2015/lib/layer/layer-legend-item/index.js +0 -2
  782. package/esm2015/lib/layer/layer-legend-item/layer-legend-item.component.js +0 -91
  783. package/esm2015/lib/layer/layer-legend-list/index.js +0 -3
  784. package/esm2015/lib/layer/layer-legend-list/layer-legend-list-binding.directive.js +0 -48
  785. package/esm2015/lib/layer/layer-legend-list/layer-legend-list.component.js +0 -200
  786. package/esm2015/lib/layer/layer-list/index.js +0 -4
  787. package/esm2015/lib/layer/layer-list/layer-list-binding.directive.js +0 -59
  788. package/esm2015/lib/layer/layer-list/layer-list.component.js +0 -1043
  789. package/esm2015/lib/layer/layer-list/layer-list.enum.js +0 -19
  790. package/esm2015/lib/layer/layer-list-tool/index.js +0 -5
  791. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.component.js +0 -176
  792. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.enum.js +0 -7
  793. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.interface.js +0 -2
  794. package/esm2015/lib/layer/layer-list-tool/layer-list-tool.service.js +0 -22
  795. package/esm2015/lib/layer/layer.module.js +0 -174
  796. package/esm2015/lib/layer/shared/clusterParam.js +0 -2
  797. package/esm2015/lib/layer/shared/index.js +0 -7
  798. package/esm2015/lib/layer/shared/layer.enums.js +0 -2
  799. package/esm2015/lib/layer/shared/layer.service.js +0 -162
  800. package/esm2015/lib/layer/shared/layers/any-layer.interface.js +0 -2
  801. package/esm2015/lib/layer/shared/layers/any-layer.js +0 -2
  802. package/esm2015/lib/layer/shared/layers/image-layer.interface.js +0 -2
  803. package/esm2015/lib/layer/shared/layers/image-layer.js +0 -68
  804. package/esm2015/lib/layer/shared/layers/index.js +0 -13
  805. package/esm2015/lib/layer/shared/layers/layer.interface.js +0 -17
  806. package/esm2015/lib/layer/shared/layers/layer.js +0 -169
  807. package/esm2015/lib/layer/shared/layers/tile-layer.interface.js +0 -2
  808. package/esm2015/lib/layer/shared/layers/tile-layer.js +0 -47
  809. package/esm2015/lib/layer/shared/layers/vector-layer.interface.js +0 -2
  810. package/esm2015/lib/layer/shared/layers/vector-layer.js +0 -325
  811. package/esm2015/lib/layer/shared/layers/vectortile-layer.interface.js +0 -2
  812. package/esm2015/lib/layer/shared/layers/vectortile-layer.js +0 -104
  813. package/esm2015/lib/layer/shared/style.service.js +0 -289
  814. package/esm2015/lib/layer/shared/vector-style.interface.js +0 -2
  815. package/esm2015/lib/layer/track-feature-button/index.js +0 -2
  816. package/esm2015/lib/layer/track-feature-button/track-feature-button.component.js +0 -64
  817. package/esm2015/lib/layer/utils/image-watcher.js +0 -62
  818. package/esm2015/lib/layer/utils/index.js +0 -7
  819. package/esm2015/lib/layer/utils/layer.utils.js +0 -11
  820. package/esm2015/lib/layer/utils/layerSync-watcher.js +0 -249
  821. package/esm2015/lib/layer/utils/outputLegend.js +0 -25
  822. package/esm2015/lib/layer/utils/tile-watcher.js +0 -50
  823. package/esm2015/lib/layer/utils/vector-watcher.js +0 -48
  824. package/esm2015/lib/map/baselayers-switcher/baselayers-switcher.animation.js +0 -20
  825. package/esm2015/lib/map/baselayers-switcher/baselayers-switcher.component.js +0 -105
  826. package/esm2015/lib/map/baselayers-switcher/index.js +0 -3
  827. package/esm2015/lib/map/baselayers-switcher/mini-basemap.component.js +0 -137
  828. package/esm2015/lib/map/geolocate-button/geolocate-button.component.js +0 -47
  829. package/esm2015/lib/map/geolocate-button/index.js +0 -2
  830. package/esm2015/lib/map/home-extent-button/home-extent-button.component.js +0 -69
  831. package/esm2015/lib/map/index.js +0 -13
  832. package/esm2015/lib/map/info-section/index.js +0 -2
  833. package/esm2015/lib/map/info-section/info-section.component.js +0 -36
  834. package/esm2015/lib/map/map-browser/index.js +0 -2
  835. package/esm2015/lib/map/map-browser/map-browser.component.js +0 -70
  836. package/esm2015/lib/map/map-center/index.js +0 -2
  837. package/esm2015/lib/map/map-center/map-center.component.js +0 -55
  838. package/esm2015/lib/map/map.module.js +0 -124
  839. package/esm2015/lib/map/menu-button/index.js +0 -2
  840. package/esm2015/lib/map/menu-button/menu-button.component.js +0 -66
  841. package/esm2015/lib/map/offline-button/index.js +0 -2
  842. package/esm2015/lib/map/offline-button/offline-button.component.js +0 -84
  843. package/esm2015/lib/map/rotation-button/index.js +0 -2
  844. package/esm2015/lib/map/rotation-button/rotation-button.component.js +0 -97
  845. package/esm2015/lib/map/shared/controllers/controller.js +0 -42
  846. package/esm2015/lib/map/shared/controllers/index.js +0 -3
  847. package/esm2015/lib/map/shared/controllers/view.js +0 -326
  848. package/esm2015/lib/map/shared/hover-feature.directive.js +0 -508
  849. package/esm2015/lib/map/shared/index.js +0 -13
  850. package/esm2015/lib/map/shared/map-pointer-position.directive.js +0 -107
  851. package/esm2015/lib/map/shared/map.enums.js +0 -6
  852. package/esm2015/lib/map/shared/map.interface.js +0 -2
  853. package/esm2015/lib/map/shared/map.js +0 -538
  854. package/esm2015/lib/map/shared/map.service.js +0 -29
  855. package/esm2015/lib/map/shared/map.utils.js +0 -459
  856. package/esm2015/lib/map/shared/mapOffline.directive.js +0 -163
  857. package/esm2015/lib/map/shared/projection.interfaces.js +0 -2
  858. package/esm2015/lib/map/shared/projection.service.js +0 -65
  859. package/esm2015/lib/map/shared/projection.utils.js +0 -64
  860. package/esm2015/lib/map/swipe-control/index.js +0 -2
  861. package/esm2015/lib/map/swipe-control/swipe-control.component.js +0 -199
  862. package/esm2015/lib/map/utils/layer-watcher.js +0 -58
  863. package/esm2015/lib/map/zoom-button/index.js +0 -2
  864. package/esm2015/lib/map/zoom-button/zoom-button.component.js +0 -46
  865. package/esm2015/lib/measure/index.js +0 -4
  866. package/esm2015/lib/measure/measure.module.js +0 -20
  867. package/esm2015/lib/measure/measurer/measure-format.pipe.js +0 -37
  868. package/esm2015/lib/measure/measurer/measurer-dialog.component.js +0 -220
  869. package/esm2015/lib/measure/measurer/measurer-item.component.js +0 -148
  870. package/esm2015/lib/measure/measurer/measurer.component.js +0 -1053
  871. package/esm2015/lib/measure/measurer/measurer.module.js +0 -96
  872. package/esm2015/lib/measure/shared/index.js +0 -4
  873. package/esm2015/lib/measure/shared/measure.enum.js +0 -37
  874. package/esm2015/lib/measure/shared/measure.interfaces.js +0 -2
  875. package/esm2015/lib/measure/shared/measure.utils.js +0 -489
  876. package/esm2015/lib/metadata/index.js +0 -3
  877. package/esm2015/lib/metadata/metadata-button/index.js +0 -2
  878. package/esm2015/lib/metadata/metadata-button/metadata-button.component.js +0 -135
  879. package/esm2015/lib/metadata/metadata.module.js +0 -57
  880. package/esm2015/lib/metadata/shared/index.js +0 -3
  881. package/esm2015/lib/metadata/shared/metadata.interface.js +0 -2
  882. package/esm2015/lib/metadata/shared/metadata.service.js +0 -19
  883. package/esm2015/lib/overlay/index.js +0 -2
  884. package/esm2015/lib/overlay/overlay.module.js +0 -23
  885. package/esm2015/lib/overlay/shared/index.js +0 -7
  886. package/esm2015/lib/overlay/shared/overlay-marker-style.utils.js +0 -69
  887. package/esm2015/lib/overlay/shared/overlay.directive.js +0 -33
  888. package/esm2015/lib/overlay/shared/overlay.enum.js +0 -8
  889. package/esm2015/lib/overlay/shared/overlay.js +0 -130
  890. package/esm2015/lib/overlay/shared/overlay.service.js +0 -27
  891. package/esm2015/lib/overlay/shared/overlay.utils.js +0 -103
  892. package/esm2015/lib/print/index.js +0 -4
  893. package/esm2015/lib/print/print/print.component.js +0 -126
  894. package/esm2015/lib/print/print-form/index.js +0 -2
  895. package/esm2015/lib/print/print-form/print-form.component.js +0 -447
  896. package/esm2015/lib/print/print.module.js +0 -67
  897. package/esm2015/lib/print/shared/index.js +0 -4
  898. package/esm2015/lib/print/shared/print.interface.js +0 -2
  899. package/esm2015/lib/print/shared/print.service.js +0 -814
  900. package/esm2015/lib/print/shared/print.type.js +0 -30
  901. package/esm2015/lib/query/index.js +0 -2
  902. package/esm2015/lib/query/query.module.js +0 -28
  903. package/esm2015/lib/query/shared/index.js +0 -7
  904. package/esm2015/lib/query/shared/query-search-source.js +0 -35
  905. package/esm2015/lib/query/shared/query-search-source.providers.js +0 -22
  906. package/esm2015/lib/query/shared/query.directive.js +0 -261
  907. package/esm2015/lib/query/shared/query.enums.js +0 -30
  908. package/esm2015/lib/query/shared/query.interfaces.js +0 -2
  909. package/esm2015/lib/query/shared/query.service.js +0 -592
  910. package/esm2015/lib/query/shared/query.utils.js +0 -37
  911. package/esm2015/lib/search/index.js +0 -12
  912. package/esm2015/lib/search/search-bar/search-bar.component.js +0 -496
  913. package/esm2015/lib/search/search-bar/search-bar.module.js +0 -77
  914. package/esm2015/lib/search/search-bar/search-url-param.directive.js +0 -35
  915. package/esm2015/lib/search/search-results/search-results-add-button.component.js +0 -198
  916. package/esm2015/lib/search/search-results/search-results-item.component.js +0 -129
  917. package/esm2015/lib/search/search-results/search-results.component.js +0 -337
  918. package/esm2015/lib/search/search-results/search-results.module.js +0 -79
  919. package/esm2015/lib/search/search-selector/search-selector.component.js +0 -132
  920. package/esm2015/lib/search/search-selector/search-selector.module.js +0 -58
  921. package/esm2015/lib/search/search-settings/search-settings.component.js +0 -435
  922. package/esm2015/lib/search/search-settings/search-settings.module.js +0 -62
  923. package/esm2015/lib/search/search.module.js +0 -69
  924. package/esm2015/lib/search/shared/index.js +0 -9
  925. package/esm2015/lib/search/shared/search-pointer-summary.directive.js +0 -322
  926. package/esm2015/lib/search/shared/search-source-service.providers.js +0 -20
  927. package/esm2015/lib/search/shared/search-source.service.js +0 -47
  928. package/esm2015/lib/search/shared/search.enums.js +0 -4
  929. package/esm2015/lib/search/shared/search.interfaces.js +0 -2
  930. package/esm2015/lib/search/shared/search.service.js +0 -118
  931. package/esm2015/lib/search/shared/search.utils.js +0 -78
  932. package/esm2015/lib/search/shared/sources/cadastre.js +0 -126
  933. package/esm2015/lib/search/shared/sources/cadastre.providers.js +0 -23
  934. package/esm2015/lib/search/shared/sources/coordinates.interfaces.js +0 -2
  935. package/esm2015/lib/search/shared/sources/coordinates.js +0 -147
  936. package/esm2015/lib/search/shared/sources/coordinates.providers.js +0 -40
  937. package/esm2015/lib/search/shared/sources/icherche.interfaces.js +0 -2
  938. package/esm2015/lib/search/shared/sources/icherche.js +0 -756
  939. package/esm2015/lib/search/shared/sources/icherche.providers.js +0 -66
  940. package/esm2015/lib/search/shared/sources/ilayer.interfaces.js +0 -2
  941. package/esm2015/lib/search/shared/sources/ilayer.js +0 -320
  942. package/esm2015/lib/search/shared/sources/ilayer.providers.js +0 -40
  943. package/esm2015/lib/search/shared/sources/index.js +0 -20
  944. package/esm2015/lib/search/shared/sources/nominatim.interfaces.js +0 -2
  945. package/esm2015/lib/search/shared/sources/nominatim.js +0 -253
  946. package/esm2015/lib/search/shared/sources/nominatim.providers.js +0 -23
  947. package/esm2015/lib/search/shared/sources/source.interfaces.js +0 -2
  948. package/esm2015/lib/search/shared/sources/source.js +0 -179
  949. package/esm2015/lib/search/shared/sources/storedqueries.interfaces.js +0 -2
  950. package/esm2015/lib/search/shared/sources/storedqueries.js +0 -425
  951. package/esm2015/lib/search/shared/sources/storedqueries.providers.js +0 -41
  952. package/esm2015/lib/toast/index.js +0 -2
  953. package/esm2015/lib/toast/toast.component.js +0 -119
  954. package/esm2015/lib/toast/toast.module.js +0 -47
  955. package/esm2015/lib/utils/commonVectorStyle.interface.js +0 -2
  956. package/esm2015/lib/utils/commonVectorStyle.js +0 -75
  957. package/esm2015/lib/utils/googleLinks.js +0 -13
  958. package/esm2015/lib/utils/id-generator.js +0 -110
  959. package/esm2015/lib/utils/index.js +0 -6
  960. package/esm2015/lib/utils/osmLinks.js +0 -10
  961. package/esm2015/lib/wkt/index.js +0 -2
  962. package/esm2015/lib/wkt/shared/index.js +0 -2
  963. package/esm2015/lib/wkt/shared/wkt.service.js +0 -239
  964. package/esm2015/lib/wkt/wkt.module.js +0 -22
  965. package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.component.js +0 -56
  966. package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.module.js +0 -38
  967. package/esm2015/lib/workspace/confirmation-popup/index.js +0 -3
  968. package/esm2015/lib/workspace/index.js +0 -8
  969. package/esm2015/lib/workspace/shared/edition-workspace.js +0 -271
  970. package/esm2015/lib/workspace/shared/edition-workspace.service.js +0 -619
  971. package/esm2015/lib/workspace/shared/feature-workspace.js +0 -37
  972. package/esm2015/lib/workspace/shared/feature-workspace.service.js +0 -146
  973. package/esm2015/lib/workspace/shared/index.js +0 -8
  974. package/esm2015/lib/workspace/shared/wfs-workspace.js +0 -37
  975. package/esm2015/lib/workspace/shared/wfs-workspace.service.js +0 -146
  976. package/esm2015/lib/workspace/shared/wms-workspace.service.js +0 -239
  977. package/esm2015/lib/workspace/shared/workspace.utils.js +0 -24
  978. package/esm2015/lib/workspace/widgets/index.js +0 -4
  979. package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.component.js +0 -52
  980. package/esm2015/lib/workspace/widgets/ogc-filter/ogc-filter.module.js +0 -38
  981. package/esm2015/lib/workspace/widgets/widgets.js +0 -15
  982. package/esm2015/lib/workspace/workspace-selector/workspace-selector.directive.js +0 -135
  983. package/esm2015/lib/workspace/workspace-selector/workspace-selector.module.js +0 -30
  984. package/esm2015/lib/workspace/workspace-updator/workspace-updator.directive.js +0 -116
  985. package/esm2015/lib/workspace/workspace-updator/workspace-updator.module.js +0 -30
  986. package/esm2015/lib/workspace/workspace.module.js +0 -64
  987. package/esm2015/public_api.js +0 -54
  988. package/fesm2015/igo2-geo.js +0 -40591
  989. package/fesm2015/igo2-geo.js.map +0 -1
@@ -1,814 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { Observable, Subject, forkJoin } from 'rxjs';
4
- import { map as rxMap } from 'rxjs/operators';
5
- import { saveAs } from 'file-saver';
6
- import jspdf from 'jspdf';
7
- import html2canvas from 'html2canvas';
8
- import * as JSZip from 'jszip';
9
- import { SubjectStatus } from '@igo2/utils';
10
- import { SecureImagePipe } from '@igo2/common';
11
- import { formatScale } from '../../map/shared/map.utils';
12
- import { getLayersLegends } from '../../layer/utils/outputLegend';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/common/http";
15
- import * as i2 from "@igo2/core";
16
- export class PrintService {
17
- constructor(http, messageService, activityService, languageService) {
18
- this.http = http;
19
- this.messageService = messageService;
20
- this.activityService = activityService;
21
- this.languageService = languageService;
22
- }
23
- print(map, options) {
24
- const status$ = new Subject();
25
- const paperFormat = options.paperFormat;
26
- const resolution = +options.resolution; // Default is 96
27
- const orientation = options.orientation;
28
- const legendPostion = options.legendPosition;
29
- this.activityId = this.activityService.register();
30
- const doc = new jspdf({
31
- orientation,
32
- format: paperFormat.toLowerCase()
33
- });
34
- const dimensions = [
35
- doc.internal.pageSize.width,
36
- doc.internal.pageSize.height
37
- ];
38
- const margins = [10, 10, 10, 10];
39
- const width = dimensions[0] - margins[3] - margins[1];
40
- const height = dimensions[1] - margins[0] - margins[2];
41
- const size = [width, height];
42
- let titleSizeResults = [0, 0];
43
- if (options.title !== undefined) {
44
- titleSizeResults = this.getTitleSize(options.title, width, height, doc); // return : size(pt) and left margin (mm)
45
- this.addTitle(doc, options.title, titleSizeResults[0], margins[3] + titleSizeResults[1], titleSizeResults[0] * (25.4 / 72));
46
- }
47
- if (options.subtitle !== undefined) {
48
- let subtitleSizeResult = 0;
49
- const titleH = titleSizeResults[0];
50
- subtitleSizeResult = this.getSubTitleSize(options.subtitle, width, height, doc); // return : size(pt) and left margin (mm)
51
- this.addSubTitle(doc, options.subtitle, titleH * 0.7, margins[3] + subtitleSizeResult, titleH * 1.7 * (25.4 / 72));
52
- margins[0] = margins[0] + titleSizeResults[0] * 0.7 * (25.4 / 72);
53
- }
54
- if (options.showProjection === true || options.showScale === true) {
55
- this.addProjScale(doc, map, resolution, options.showProjection, options.showScale);
56
- }
57
- if (options.comment !== '') {
58
- this.addComment(doc, options.comment);
59
- }
60
- this.addMap(doc, map, resolution, size, margins).subscribe((status) => __awaiter(this, void 0, void 0, function* () {
61
- if (status === SubjectStatus.Done) {
62
- yield this.addScale(doc, map, margins);
63
- yield this.handleMeasureLayer(doc, map, margins);
64
- if (options.legendPosition !== 'none') {
65
- if (['topleft', 'topright', 'bottomleft', 'bottomright'].indexOf(options.legendPosition) > -1) {
66
- yield this.addLegendSamePage(doc, map, margins, resolution, options.legendPosition);
67
- }
68
- else if (options.legendPosition === 'newpage') {
69
- yield this.addLegend(doc, map, margins, resolution);
70
- }
71
- }
72
- else {
73
- yield this.saveDoc(doc);
74
- }
75
- }
76
- if (status === SubjectStatus.Done || status === SubjectStatus.Error) {
77
- this.activityService.unregister(this.activityId);
78
- status$.next(SubjectStatus.Done);
79
- }
80
- }));
81
- return status$;
82
- }
83
- /**
84
- * Add measure overlay on the map on the document when the measure layer is present
85
- * @param doc - Pdf document where measure tooltip will be added
86
- * @param map - Map of the app
87
- * @param margins - Page margins
88
- */
89
- handleMeasureLayer(doc, map, margins) {
90
- return __awaiter(this, void 0, void 0, function* () {
91
- if (map.layers.find(layer => layer.visible && layer.id.startsWith('igo-measures-'))) {
92
- let canvasOverlayHTMLMeasures;
93
- const mapOverlayMeasuresHTML = map.ol.getOverlayContainer();
94
- yield html2canvas(mapOverlayMeasuresHTML, {
95
- scale: 1,
96
- backgroundColor: null
97
- }).then(e => {
98
- canvasOverlayHTMLMeasures = e;
99
- });
100
- this.addCanvas(doc, canvasOverlayHTMLMeasures, margins); // this adds measure overlays
101
- }
102
- });
103
- }
104
- /**
105
- * Get html code for all layers legend
106
- * @param map IgoMap
107
- * @param width The width that the legend need to be
108
- * @return Html code for the legend
109
- */
110
- getLayersLegendHtml(map, width, resolution) {
111
- return new Observable((observer) => {
112
- let html = '';
113
- const legends = getLayersLegends(map.layers, {
114
- resolution: map.viewController.getResolution(),
115
- extent: map.viewController.getExtent(),
116
- projection: map.viewController.getOlProjection().getCode(),
117
- scale: map.viewController.getScale(resolution),
118
- size: map.ol.getSize()
119
- });
120
- if (legends.length === 0) {
121
- observer.next(html);
122
- observer.complete();
123
- return;
124
- }
125
- // Define important style to be sure that all container is convert
126
- // to image not just visible part
127
- html += '<style media="screen" type="text/css">';
128
- html += '.html2canvas-container { width: ' + width + 'mm !important; height: 2000px !important; }';
129
- html += 'table.tableLegend {table-layout: auto;}';
130
- html += 'div.styleLegend {padding-top: 5px; padding-right:5px;padding-left:5px;padding-bottom:5px;}';
131
- html += '</style>';
132
- // The font size will also be lowered afterwards (globally along the legend size)
133
- // this allows having a good relative font size here and to keep ajusting the legend size
134
- // while keeping good relative font size
135
- html += '<font size="3" face="Times" >';
136
- html += '<div class="styleLegend">';
137
- html += '<table class="tableLegend" >';
138
- // For each legend, define an html table cell
139
- const images$ = legends.map((legend) => this.getDataImage(legend.url).pipe(rxMap((dataImage) => {
140
- let htmlImg = '<tr><td>' + legend.title.toUpperCase() + '</td></tr>';
141
- htmlImg += '<tr><td><img src="' + dataImage + '"></td></tr>';
142
- return htmlImg;
143
- })));
144
- forkJoin(images$).subscribe((dataImages) => {
145
- html = dataImages.reduce((acc, current) => (acc += current), html);
146
- html += '</table>';
147
- html += '</div>';
148
- observer.next(html);
149
- observer.complete();
150
- });
151
- });
152
- }
153
- getDataImage(url) {
154
- const secureIMG = new SecureImagePipe(this.http);
155
- return secureIMG.transform(url);
156
- }
157
- /**
158
- * Get all the legend in a single image
159
- * * @param format - Image format. default value to "png"
160
- * @return The image of the legend
161
- */
162
- getLayersLegendImage(map, format = 'png', doZipFile, resolution) {
163
- return __awaiter(this, void 0, void 0, function* () {
164
- const status$ = new Subject();
165
- // Get html code for the legend
166
- const width = 200; // milimeters unit, originally define for document pdf
167
- let html = yield this.getLayersLegendHtml(map, width, resolution).toPromise();
168
- format = format.toLowerCase();
169
- // If no legend show No LEGEND in an image
170
- if (html.length === 0) {
171
- html = '<font size="12" face="Courier New" >';
172
- html += '<div align="center"><b>NO LEGEND</b></div>';
173
- }
174
- // Create div to contain html code for legend
175
- const div = window.document.createElement('div');
176
- div.style.position = 'absolute';
177
- div.style.top = '0';
178
- // Add html code to convert in the new window
179
- window.document.body.appendChild(div);
180
- div.innerHTML = html;
181
- yield this.timeout(1);
182
- const canvas = yield html2canvas(div, { useCORS: true }).catch((e) => {
183
- console.log(e);
184
- });
185
- if (canvas) {
186
- let status = SubjectStatus.Done;
187
- try {
188
- if (!doZipFile) {
189
- // Save the canvas as file
190
- this.saveCanvasImageAsFile(canvas, 'legendImage', format);
191
- }
192
- else {
193
- // Add the canvas to zip
194
- this.generateCanvaFileToZip(canvas, 'legendImage' + '.' + format);
195
- }
196
- div.parentNode.removeChild(div); // remove temp div (IE)
197
- }
198
- catch (err) {
199
- status = SubjectStatus.Error;
200
- }
201
- status$.next(status);
202
- }
203
- return status$;
204
- });
205
- }
206
- getTitleSize(title, pageWidth, pageHeight, doc) {
207
- const pdfResolution = 96;
208
- const titleSize = Math.round(2 * (pageHeight + 145) * 0.05) / 2;
209
- doc.setFont('Times', 'bold');
210
- const width = doc.getTextWidth(title);
211
- const titleWidth = doc.getStringUnitWidth(title) * titleSize / doc.internal.scaleFactor;
212
- const titleTailleMinimale = Math.round(2 * (pageHeight + 150) * 0.037) / 2;
213
- let titleFontSize = 0;
214
- let titleMarginLeft;
215
- if (titleWidth >= (pageWidth)) {
216
- titleMarginLeft = 0;
217
- titleFontSize = Math.round(((pageWidth / title.length) * pdfResolution) / 25.4);
218
- // If the formula to find the font size gives below the defined minimum size
219
- if (titleFontSize < titleTailleMinimale) {
220
- titleFontSize = titleTailleMinimale;
221
- }
222
- }
223
- else {
224
- titleMarginLeft = (pageWidth - titleWidth) / 2;
225
- titleFontSize = titleSize;
226
- }
227
- return [titleFontSize, titleMarginLeft];
228
- }
229
- getSubTitleSize(subtitle, pageWidth, pageHeight, doc) {
230
- const subtitleSize = 0.7 * Math.round(2 * (pageHeight + 145) * 0.05) / 2; // 70% of the title's font size
231
- doc.setFont('Times', 'bold');
232
- const subtitleWidth = doc.getStringUnitWidth(subtitle) * subtitleSize / doc.internal.scaleFactor;
233
- let subtitleMarginLeft;
234
- if (subtitleWidth >= (pageWidth)) {
235
- subtitleMarginLeft = 0;
236
- }
237
- else {
238
- subtitleMarginLeft = (pageWidth - subtitleWidth) / 2;
239
- }
240
- return subtitleMarginLeft;
241
- }
242
- addTitle(doc, title, titleFontSize, titleMarginLeft, titleMarginTop) {
243
- doc.setFont('Times', 'bold');
244
- doc.setFontSize(titleFontSize);
245
- doc.text(title, titleMarginLeft, titleMarginTop);
246
- }
247
- addSubTitle(doc, subtitle, subtitleFontSize, subtitleMarginLeft, subtitleMarginTop) {
248
- doc.setFont('Times', 'bold');
249
- doc.setFontSize(subtitleFontSize);
250
- doc.text(subtitle, subtitleMarginLeft, subtitleMarginTop);
251
- }
252
- /**
253
- * Add comment to the document
254
- * * @param doc - pdf document
255
- * * @param comment - Comment to add in the document
256
- * * @param size - Size of the document
257
- */
258
- addComment(doc, comment) {
259
- const commentSize = 16;
260
- const commentMarginLeft = 20;
261
- const marginBottom = 5;
262
- const heightPixels = doc.internal.pageSize.height - marginBottom;
263
- doc.setFont('courier');
264
- doc.setFontSize(commentSize);
265
- doc.text(comment, commentMarginLeft, heightPixels);
266
- }
267
- /**
268
- * Add projection and/or scale to the document
269
- * @param doc - pdf document
270
- * @param map - Map of the app
271
- * @param dpi - DPI resolution of the document
272
- * @param projection - Bool to indicate if projection need to be added
273
- * @param scale - Bool to indicate if scale need to be added
274
- */
275
- addProjScale(doc, map, dpi, projection, scale) {
276
- const translate = this.languageService.translate;
277
- const projScaleSize = 16;
278
- const projScaleMarginLeft = 20;
279
- const marginBottom = 15;
280
- const heightPixels = doc.internal.pageSize.height - marginBottom;
281
- let textProjScale = '';
282
- if (projection === true) {
283
- const projText = translate.instant('igo.geo.printForm.projection');
284
- textProjScale += projText + ': ' + map.projection;
285
- }
286
- if (scale === true) {
287
- if (projection === true) {
288
- textProjScale += ' ';
289
- }
290
- const scaleText = translate.instant('igo.geo.printForm.scale');
291
- const mapScale = map.viewController.getScale(dpi);
292
- textProjScale += scaleText + ': ~ 1 / ' + formatScale(mapScale);
293
- }
294
- doc.setFont('courier');
295
- doc.setFontSize(projScaleSize);
296
- doc.text(textProjScale, projScaleMarginLeft, heightPixels);
297
- }
298
- /**
299
- * Add the legend to the document
300
- * @param doc - Pdf document where legend will be added
301
- * @param map - Map of the app
302
- * @param margins - Page margins
303
- */
304
- addLegend(doc, map, margins, resolution) {
305
- return __awaiter(this, void 0, void 0, function* () {
306
- // Get html code for the legend
307
- const width = doc.internal.pageSize.width;
308
- const html = yield this.getLayersLegendHtml(map, width, resolution).toPromise();
309
- // If no legend, save the map directly
310
- if (html === '') {
311
- yield this.saveDoc(doc);
312
- return true;
313
- }
314
- // Create div to contain html code for legend
315
- const div = window.document.createElement('div');
316
- div.style.position = 'absolute';
317
- div.style.top = '0';
318
- // Add html code to convert in the new window
319
- window.document.body.appendChild(div);
320
- div.innerHTML = html;
321
- yield this.timeout(1);
322
- const canvas = yield html2canvas(div, { useCORS: true }).catch((e) => {
323
- console.log(e);
324
- });
325
- if (canvas) {
326
- const pourcentageReduction = 0.85;
327
- const imageSize = [pourcentageReduction * (25.4 * canvas.width) / resolution, pourcentageReduction
328
- * (25.4 * canvas.height) / resolution];
329
- let imgData;
330
- doc.addPage();
331
- imgData = canvas.toDataURL('image/png');
332
- doc.addImage(imgData, 'PNG', 10, 10, imageSize[0], imageSize[1]);
333
- div.parentNode.removeChild(div); // remove temp div (IE style)
334
- }
335
- yield this.saveDoc(doc);
336
- });
337
- }
338
- /**
339
- * Add the legend to the document
340
- * @param doc - Pdf document where legend will be added
341
- * @param map - Map of the app
342
- * @param margins - Page margins
343
- */
344
- addLegendSamePage(doc, map, margins, resolution, legendPosition) {
345
- return __awaiter(this, void 0, void 0, function* () {
346
- // Get html code for the legend
347
- const width = doc.internal.pageSize.width;
348
- const html = yield this.getLayersLegendHtml(map, width, resolution).toPromise();
349
- // If no legend, save the map directly
350
- if (html === '') {
351
- yield this.saveDoc(doc);
352
- return true;
353
- }
354
- // Create div to contain html code for legend
355
- const div = window.document.createElement('div');
356
- div.style.position = 'absolute';
357
- div.style.top = '0';
358
- // Add html code to convert in the new window
359
- window.document.body.appendChild(div);
360
- div.innerHTML = html;
361
- yield this.timeout(1);
362
- const canvas = yield html2canvas(div, { useCORS: true }).catch((e) => {
363
- console.log(e);
364
- });
365
- let marginsLegend;
366
- if (canvas) {
367
- const pourcentageReduction = 0.85;
368
- const imageSize = [pourcentageReduction * (25.4 * canvas.width) / resolution,
369
- pourcentageReduction * (25.4 * canvas.height) / resolution];
370
- // Move the legend to the correct position on the page
371
- if (legendPosition === 'bottomright') {
372
- marginsLegend = [doc.internal.pageSize.height - margins[2] - imageSize[1], margins[1],
373
- margins[2], doc.internal.pageSize.width - margins[1] - imageSize[0]];
374
- }
375
- else if (legendPosition === 'topright') {
376
- marginsLegend = [margins[0], margins[1], doc.internal.pageSize.height - margins[0] - imageSize[1],
377
- doc.internal.pageSize.width - margins[1] - imageSize[0]];
378
- }
379
- else if (legendPosition === 'bottomleft') {
380
- // When the legend is in the bottom left, raise the legend slightly upward so that attributions are visible
381
- marginsLegend = [doc.internal.pageSize.height - margins[2] - imageSize[1] - 15,
382
- doc.internal.pageSize.width - margins[3] - imageSize[0], margins[2] + 15, margins[3]];
383
- }
384
- else if (legendPosition === 'topleft') {
385
- marginsLegend = [margins[0], doc.internal.pageSize.width - margins[3] - imageSize[0],
386
- doc.internal.pageSize.height - margins[0] - imageSize[1], margins[3]];
387
- }
388
- this.addCanvas(doc, canvas, marginsLegend); // this adds the legend
389
- div.parentNode.removeChild(div); // remove temp div (IE style)
390
- yield this.saveDoc(doc);
391
- }
392
- });
393
- }
394
- /**
395
- * Add scale and attributions on the map on the document
396
- * @param doc - Pdf document where legend will be added
397
- * @param map - Map of the app
398
- * @param margins - Page margins
399
- */
400
- addScale(doc, map, margins) {
401
- return __awaiter(this, void 0, void 0, function* () {
402
- const mapSize = map.ol.getSize();
403
- const extent = map.ol.getView().calculateExtent(mapSize);
404
- // Get the scale and attribution
405
- // we use cloneNode to modify the nodes to print without modifying it on the page, using deep:true to get children
406
- let canvasOverlayHTML;
407
- const mapOverlayHTML = map.ol.getOverlayContainerStopEvent();
408
- // Remove the UI buttons from the nodes
409
- const OverlayHTMLButtons = mapOverlayHTML.getElementsByTagName('button');
410
- const OverlayHTMLButtonsarr = Array.from(OverlayHTMLButtons);
411
- for (const OverlayHTMLButton of OverlayHTMLButtonsarr) {
412
- OverlayHTMLButton.setAttribute('data-html2canvas-ignore', 'true');
413
- }
414
- // Change the styles of hyperlink in the printed version
415
- // Transform the Overlay into a canvas
416
- // scale is necessary to make it in google chrome
417
- // background as null because otherwise it is white and cover the map
418
- // allowtaint is to allow rendering images in the attributions
419
- // useCORS: true pour permettre de renderer les images (ne marche pas en local)
420
- const canvas = yield html2canvas(mapOverlayHTML, {
421
- scale: 1,
422
- backgroundColor: null,
423
- allowTaint: true,
424
- useCORS: true,
425
- }).then(e => {
426
- canvasOverlayHTML = e;
427
- });
428
- this.addCanvas(doc, canvasOverlayHTML, margins); // this adds scales and attributions
429
- });
430
- }
431
- defineNbFileToProcess(nbFileToProcess) {
432
- this.nbFileToProcess = nbFileToProcess;
433
- }
434
- timeout(ms) {
435
- return new Promise((resolve) => setTimeout(resolve, ms));
436
- }
437
- addCanvas(doc, canvas, margins) {
438
- let image;
439
- if (canvas) {
440
- image = canvas.toDataURL('image/png');
441
- }
442
- if (image !== undefined) {
443
- const imageSize = this.getImageSizeToFitPdf(doc, canvas, margins);
444
- doc.addImage(image, 'PNG', margins[3], margins[0], imageSize[0], imageSize[1]);
445
- doc.rect(margins[3], margins[0], imageSize[0], imageSize[1]);
446
- }
447
- }
448
- // TODO fix printing with image resolution
449
- addMap(doc, map, resolution, size, margins) {
450
- const status$ = new Subject();
451
- const mapSize = map.ol.getSize();
452
- const extent = map.ol.getView().calculateExtent(mapSize);
453
- const widthPixels = Math.round((size[0] * resolution) / 25.4);
454
- const heightPixels = Math.round((size[1] * resolution) / 25.4);
455
- let timeout;
456
- map.ol.once('rendercomplete', (event) => {
457
- const canvases = event.target.getViewport().getElementsByTagName('canvas');
458
- const mapStatus$$ = map.status$.subscribe((mapStatus) => {
459
- clearTimeout(timeout);
460
- if (mapStatus !== SubjectStatus.Done) {
461
- return;
462
- }
463
- mapStatus$$.unsubscribe();
464
- let status = SubjectStatus.Done;
465
- try {
466
- for (const canvas of canvases) {
467
- if (canvas.width !== 0) {
468
- this.addCanvas(doc, canvas, margins);
469
- }
470
- }
471
- }
472
- catch (err) {
473
- status = SubjectStatus.Error;
474
- this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
475
- }
476
- this.renderMap(map, mapSize, extent);
477
- status$.next(status);
478
- });
479
- // If no loading as started after 200ms, then probably no loading
480
- // is required.
481
- timeout = window.setTimeout(() => {
482
- mapStatus$$.unsubscribe();
483
- let status = SubjectStatus.Done;
484
- try {
485
- for (const canvas of canvases) {
486
- if (canvas.width !== 0) {
487
- this.addCanvas(doc, canvas, margins);
488
- }
489
- }
490
- }
491
- catch (err) {
492
- status = SubjectStatus.Error;
493
- this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
494
- }
495
- this.renderMap(map, mapSize, extent);
496
- status$.next(status);
497
- }, 200);
498
- });
499
- this.renderMap(map, [widthPixels, heightPixels], extent);
500
- return status$;
501
- }
502
- /**
503
- * Download an image of the map with addition of informations
504
- * @param map - Map of the app
505
- * @param format - Image format. default value to "png"
506
- * @param projection - Indicate if projection need to be add. Default to false
507
- * @param scale - Indicate if scale need to be add. Default to false
508
- * @param legend - Indicate if the legend of layers need to be download. Default to false
509
- * @param title - Title to add for the map - Default to blank
510
- * @param subtitle - Subtitle to add for the map - Default to blank
511
- * @param comment - Comment to add for the map - Default to blank
512
- * @param doZipFile - Indicate if we do a zip with the file
513
- * @return Image file of the map with extension format given as parameter
514
- */
515
- downloadMapImage(map, resolution, format = 'png', projection = false, scale = false, legend = false, title = '', subtitle = '', comment = '', doZipFile = true) {
516
- const status$ = new Subject();
517
- // const resolution = map.ol.getView().getResolution();
518
- this.activityId = this.activityService.register();
519
- const translate = this.languageService.translate;
520
- map.ol.once('rendercomplete', (event) => {
521
- format = format.toLowerCase();
522
- const oldCanvas = event.target
523
- .getViewport()
524
- .getElementsByTagName('canvas')[0];
525
- const newCanvas = document.createElement('canvas');
526
- const newContext = newCanvas.getContext('2d');
527
- // Postion in height to set the canvas in new canvas
528
- let positionHCanvas = 0;
529
- // Position in width to set the Proj/Scale in new canvas
530
- let positionWProjScale = 10;
531
- // Get height/width of map canvas
532
- const width = oldCanvas.width;
533
- let height = oldCanvas.height;
534
- // Set Font to calculate comment width
535
- newContext.font = '20px Calibri';
536
- const commentWidth = newContext.measureText(comment).width;
537
- // Add height for title if defined
538
- height = title !== '' ? height + 30 : height;
539
- // Add height for title if defined
540
- height = subtitle !== '' ? height + 30 : height;
541
- // Add height for projection or scale (same line) if defined
542
- height = projection !== false || scale !== false ? height + 30 : height;
543
- const positionHProjScale = height - 10;
544
- // Define number of line depending of the comment length
545
- const commentNbLine = Math.ceil(commentWidth / width);
546
- // Add height for multiline comment if defined
547
- height = comment !== '' ? height + commentNbLine * 30 : height;
548
- let positionHComment = height - commentNbLine * 20 + 5;
549
- // Set the new canvas with the new calculated size
550
- newCanvas.width = width;
551
- newCanvas.height = height;
552
- // Patch Jpeg default black background to white
553
- if (format === 'jpeg') {
554
- newContext.fillStyle = '#ffffff';
555
- newContext.fillRect(0, 0, width, height);
556
- newContext.fillStyle = '#000000';
557
- }
558
- // If a title need to be added to canvas
559
- if (title !== '') {
560
- // Set font for title
561
- // Adjust according to title length
562
- newContext.font = '26px Calibri';
563
- positionHCanvas = 30;
564
- newContext.textAlign = 'center';
565
- newContext.fillText(title, width / 2, 20, width * 0.9);
566
- }
567
- if (subtitle !== '') {
568
- // Set font for subtitle
569
- // Adjust according to title length
570
- newContext.font = '26px Calibri';
571
- positionHCanvas = 60;
572
- newContext.textAlign = 'center';
573
- newContext.fillText(subtitle, width / 2, 50, width * 0.9);
574
- }
575
- // Set font for next section
576
- newContext.font = '20px Calibri';
577
- // If projection need to be added to canvas
578
- if (projection !== false) {
579
- const projText = translate.instant('igo.geo.printForm.projection');
580
- newContext.textAlign = 'start';
581
- newContext.fillText(projText + ': ' + map.projection, positionWProjScale, positionHProjScale);
582
- positionWProjScale += 200; // Width position change for scale position
583
- }
584
- // If scale need to be added to canvas
585
- if (scale !== false) {
586
- const scaleText = translate.instant('igo.geo.printForm.scale');
587
- const mapScale = map.viewController.getScale(resolution);
588
- newContext.textAlign = 'start';
589
- newContext.fillText(scaleText + ': ~ 1 / ' + formatScale(mapScale), positionWProjScale, positionHProjScale);
590
- }
591
- // If a comment need to be added to canvas
592
- if (comment !== '') {
593
- newContext.textAlign = 'center';
594
- // If only one line, no need to multiline the comment
595
- if (commentNbLine === 1) {
596
- newContext.fillText(comment, width / 2, positionHComment);
597
- }
598
- else {
599
- // Separate the setenses to be approx. the same length
600
- const nbCommentChar = comment.length;
601
- const CommentLengthToCut = Math.floor(nbCommentChar / commentNbLine);
602
- let commentCurrentLine = '';
603
- let positionFirstCutChar = 0;
604
- let positionLastBlank;
605
- // Loop for the number of line calculated
606
- for (let i = 0; i < commentNbLine; i++) {
607
- // For all line except last
608
- if (commentNbLine - 1 > i) {
609
- // Get comment current line to find the right place tu cut comment
610
- commentCurrentLine = comment.substr(positionFirstCutChar, CommentLengthToCut);
611
- // Cut the setence at blank
612
- positionLastBlank = commentCurrentLine.lastIndexOf(' ');
613
- newContext.fillText(commentCurrentLine.substr(0, positionLastBlank), width / 2, positionHComment);
614
- positionFirstCutChar += positionLastBlank;
615
- // Go to next line for insertion
616
- positionHComment += 20;
617
- }
618
- else {
619
- // Don't cut last part
620
- newContext.fillText(comment.substr(positionFirstCutChar), width / 2, positionHComment);
621
- }
622
- }
623
- }
624
- }
625
- // Add map to new canvas
626
- newContext.drawImage(oldCanvas, 0, positionHCanvas);
627
- let status = SubjectStatus.Done;
628
- try {
629
- // Save the canvas as file
630
- if (!doZipFile) {
631
- this.saveCanvasImageAsFile(newCanvas, 'map', format);
632
- }
633
- else if (format.toLowerCase() === 'tiff') {
634
- // Add the canvas to zip
635
- this.generateCanvaFileToZip(newCanvas, 'map' + map.projection.replace(':', '_') + '.' + format);
636
- }
637
- else {
638
- // Add the canvas to zip
639
- this.generateCanvaFileToZip(newCanvas, 'map' + '.' + format);
640
- }
641
- }
642
- catch (err) {
643
- status = SubjectStatus.Error;
644
- }
645
- status$.next(status);
646
- if (format.toLowerCase() === 'tiff') {
647
- const tiwContent = this.getWorldFileInformation(map);
648
- const blob = new Blob([tiwContent], {
649
- type: 'text/plain;charset=utf-8'
650
- });
651
- if (!doZipFile) {
652
- // saveAs automaticly replace ':' for '_'
653
- saveAs(blob, 'map' + map.projection + '.tfw');
654
- this.saveFileProcessing();
655
- }
656
- else {
657
- // Add the canvas to zip
658
- this.addFileToZip('map' + map.projection.replace(':', '_') + '.tfw', blob);
659
- }
660
- }
661
- });
662
- map.ol.renderSync();
663
- return status$;
664
- }
665
- renderMap(map, size, extent) {
666
- map.ol.updateSize();
667
- map.ol.renderSync();
668
- }
669
- /**
670
- * Save document
671
- * @param doc - Document to save
672
- */
673
- saveDoc(doc) {
674
- return __awaiter(this, void 0, void 0, function* () {
675
- yield doc.save('map.pdf', { returnPromise: true });
676
- });
677
- }
678
- /**
679
- * Calculate the best Image size to fit in pdf
680
- * @param doc - Pdf Document
681
- * @param canvas - Canvas of image
682
- * @param margins - Page margins
683
- */
684
- getImageSizeToFitPdf(doc, canvas, margins) {
685
- // Define variable to calculate best size to fit in one page
686
- const pageHeight = doc.internal.pageSize.getHeight() - (margins[0] + margins[2]);
687
- const pageWidth = doc.internal.pageSize.getWidth() - (margins[1] + margins[3]);
688
- const canHeight = canvas.height;
689
- const canWidth = canvas.width;
690
- const heightRatio = canHeight / pageHeight;
691
- const widthRatio = canWidth / pageWidth;
692
- const maxRatio = heightRatio > widthRatio ? heightRatio : widthRatio;
693
- const imgHeigh = maxRatio > 1 ? canHeight / maxRatio : canHeight;
694
- const imgWidth = maxRatio > 1 ? canWidth / maxRatio : canWidth;
695
- return [imgWidth, imgHeigh];
696
- }
697
- /**
698
- * Get a world file information for tiff
699
- * @param map - Map of the app
700
- */
701
- getWorldFileInformation(map) {
702
- const currentResolution = map.viewController.getResolution();
703
- const currentExtent = map.viewController.getExtent(); // Return [minx, miny, maxx, maxy]
704
- return [
705
- currentResolution,
706
- 0,
707
- 0,
708
- -currentResolution,
709
- currentExtent[0] + currentResolution / 0.5,
710
- currentExtent[3] - currentResolution / 0.5
711
- ].join('\n');
712
- }
713
- /**
714
- * Save canvas image as file
715
- * @param canvas - Canvas to save
716
- * @param name - Name of the file
717
- * @param format - file format
718
- */
719
- saveCanvasImageAsFile(canvas, name, format) {
720
- const blobFormat = 'image/' + format;
721
- const that = this;
722
- try {
723
- canvas.toDataURL(); // Just to make the catch trigger wihtout toBlob Error throw not catched
724
- // If navigator is Internet Explorer
725
- if (navigator.msSaveBlob) {
726
- navigator.msSaveBlob(canvas.msToBlob(), name + '.' + format);
727
- this.saveFileProcessing();
728
- }
729
- else {
730
- canvas.toBlob((blob) => {
731
- // download image
732
- saveAs(blob, name + '.' + format);
733
- that.saveFileProcessing();
734
- }, blobFormat);
735
- }
736
- }
737
- catch (err) {
738
- this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
739
- }
740
- }
741
- /**
742
- * Add file to a zip
743
- * @param canvas - File to add to the zip
744
- * @param name -Name of the fileoverview
745
- */
746
- generateCanvaFileToZip(canvas, name) {
747
- const blobFormat = 'image/' + 'jpeg';
748
- const that = this;
749
- if (!this.hasOwnProperty('zipFile') ||
750
- typeof this.zipFile === 'undefined') {
751
- this.zipFile = new JSZip();
752
- }
753
- try {
754
- canvas.toDataURL(); // Just to make the catch trigger wihtout toBlob Error throw not catched
755
- if (navigator.msSaveBlob) {
756
- this.addFileToZip(name, canvas.msToBlob());
757
- }
758
- else {
759
- canvas.toBlob((blob) => {
760
- that.addFileToZip(name, blob);
761
- }, blobFormat);
762
- }
763
- }
764
- catch (err) {
765
- this.messageService.error(this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageBody'), this.languageService.translate.instant('igo.geo.printForm.corsErrorMessageHeader'));
766
- }
767
- }
768
- /**
769
- * Add file to zip, if all file are zipped, download
770
- * @param name - Name of the files
771
- * @param blob - Contain of file
772
- */
773
- addFileToZip(name, blob) {
774
- // add file to zip
775
- this.zipFile.file(name, blob);
776
- this.nbFileToProcess--;
777
- // If all files are proccessed
778
- if (this.nbFileToProcess === 0) {
779
- // Download zip file
780
- this.getZipFile();
781
- // Stop loading
782
- this.activityService.unregister(this.activityId);
783
- }
784
- }
785
- saveFileProcessing() {
786
- this.nbFileToProcess--;
787
- // If all files are proccessed
788
- if (this.nbFileToProcess === 0) {
789
- // Stop loading
790
- this.activityService.unregister(this.activityId);
791
- }
792
- }
793
- /**
794
- * Get the zipped file
795
- * @return Retun a zip file
796
- */
797
- getZipFile() {
798
- const that = this;
799
- this.zipFile.generateAsync({ type: 'blob' }).then((blob) => {
800
- // 1) generate the zip file
801
- saveAs(blob, 'map.zip');
802
- delete that.zipFile;
803
- });
804
- }
805
- }
806
- PrintService.ɵfac = function PrintService_Factory(t) { return new (t || PrintService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.MessageService), i0.ɵɵinject(i2.ActivityService), i0.ɵɵinject(i2.LanguageService)); };
807
- PrintService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PrintService, factory: PrintService.ɵfac, providedIn: 'root' });
808
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrintService, [{
809
- type: Injectable,
810
- args: [{
811
- providedIn: 'root'
812
- }]
813
- }], function () { return [{ type: i1.HttpClient }, { type: i2.MessageService }, { type: i2.ActivityService }, { type: i2.LanguageService }]; }, null); })();
814
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3ByaW50L3NoYXJlZC9wcmludC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sV0FBVyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBT2xFLE1BQU0sT0FBTyxZQUFZO0lBSXZCLFlBQ1UsSUFBZ0IsRUFDaEIsY0FBOEIsRUFDOUIsZUFBZ0MsRUFDaEMsZUFBZ0M7UUFIaEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtJQUN2QyxDQUFDO0lBRUosS0FBSyxDQUFDLEdBQVcsRUFBRSxPQUFxQjtRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTlC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LE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2Qiw4QkFBOEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUM5QixvQkFBb0I7WUFDcEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLGVBQWU7WUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2Qiw4QkFBOEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsRUFBRTtZQUM5QixlQUFlO1lBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFVBQVU7UUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekQsMkJBQTJCO1lBQzNCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7d0VBbDlCVSxZQUFZO2tFQUFaLFlBQVksV0FBWixZQUFZLG1CQUZYLE1BQU07dUZBRVAsWUFBWTtjQUh4QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIGFzIHJ4TWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCBqc3BkZiBmcm9tICdqc3BkZic7XG5pbXBvcnQgaHRtbDJjYW52YXMgZnJvbSAnaHRtbDJjYW52YXMnO1xuaW1wb3J0ICogYXMgSlNaaXAgZnJvbSAnanN6aXAnO1xuXG5pbXBvcnQgeyBTdWJqZWN0U3RhdHVzIH0gZnJvbSAnQGlnbzIvdXRpbHMnO1xuaW1wb3J0IHsgU2VjdXJlSW1hZ2VQaXBlIH0gZnJvbSAnQGlnbzIvY29tbW9uJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlLCBBY3Rpdml0eVNlcnZpY2UsIExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xuXG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAvc2hhcmVkL21hcCc7XG5pbXBvcnQgeyBmb3JtYXRTY2FsZSB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwLnV0aWxzJztcbmltcG9ydCB7IExlZ2VuZE1hcFZpZXdPcHRpb25zIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy9sYXllci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0TGF5ZXJzTGVnZW5kcyB9IGZyb20gJy4uLy4uL2xheWVyL3V0aWxzL291dHB1dExlZ2VuZCc7XG5cbmltcG9ydCB7IFByaW50T3B0aW9ucyB9IGZyb20gJy4vcHJpbnQuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUHJpbnRTZXJ2aWNlIHtcbiAgemlwRmlsZTogSlNaaXA7XG4gIG5iRmlsZVRvUHJvY2VzczogbnVtYmVyO1xuICBhY3Rpdml0eUlkOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2aXR5U2VydmljZTogQWN0aXZpdHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaW50KG1hcDogSWdvTWFwLCBvcHRpb25zOiBQcmludE9wdGlvbnMpOiBTdWJqZWN0PGFueT4ge1xuICAgIGNvbnN0IHN0YXR1cyQgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgY29uc3QgcGFwZXJGb3JtYXQ6IHN0cmluZyA9IG9wdGlvbnMucGFwZXJGb3JtYXQ7XG4gICAgY29uc3QgcmVzb2x1dGlvbiA9ICtvcHRpb25zLnJlc29sdXRpb247IC8vIERlZmF1bHQgaXMgOTZcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgY29uc3QgbGVnZW5kUG9zdGlvbiA9IG9wdGlvbnMubGVnZW5kUG9zaXRpb247XG5cbiAgICB0aGlzLmFjdGl2aXR5SWQgPSB0aGlzLmFjdGl2aXR5U2VydmljZS5yZWdpc3RlcigpO1xuICAgIGNvbnN0IGRvYyA9IG5ldyBqc3BkZih7XG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIGZvcm1hdDogcGFwZXJGb3JtYXQudG9Mb3dlckNhc2UoKVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGltZW5zaW9ucyA9IFtcbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCxcbiAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHRcbiAgICBdO1xuXG4gICAgY29uc3QgbWFyZ2lucyA9IFsxMCwgMTAsIDEwLCAxMF07XG4gICAgY29uc3Qgd2lkdGggPSBkaW1lbnNpb25zWzBdIC0gbWFyZ2luc1szXSAtIG1hcmdpbnNbMV07XG4gICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9uc1sxXSAtIG1hcmdpbnNbMF0gLSBtYXJnaW5zWzJdO1xuICAgIGNvbnN0IHNpemUgPSBbd2lkdGgsIGhlaWdodF07XG4gICAgbGV0IHRpdGxlU2l6ZVJlc3VsdHMgPSBbMCwgMF07XG5cbiAgICBpZiAob3B0aW9ucy50aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aXRsZVNpemVSZXN1bHRzID0gdGhpcy5nZXRUaXRsZVNpemUob3B0aW9ucy50aXRsZSwgd2lkdGgsIGhlaWdodCwgZG9jKTsgLy8gcmV0dXJuIDogc2l6ZShwdCkgYW5kIGxlZnQgbWFyZ2luIChtbSlcbiAgICAgIHRoaXMuYWRkVGl0bGUoZG9jLCBvcHRpb25zLnRpdGxlLCB0aXRsZVNpemVSZXN1bHRzWzBdLCBtYXJnaW5zWzNdICsgdGl0bGVTaXplUmVzdWx0c1sxXSwgdGl0bGVTaXplUmVzdWx0c1swXSAqICgyNS40IC8gNzIpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3VidGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHN1YnRpdGxlU2l6ZVJlc3VsdCA9IDA7XG4gICAgICBjb25zdCB0aXRsZUggPSB0aXRsZVNpemVSZXN1bHRzWzBdO1xuICAgICAgc3VidGl0bGVTaXplUmVzdWx0ID0gdGhpcy5nZXRTdWJUaXRsZVNpemUob3B0aW9ucy5zdWJ0aXRsZSwgd2lkdGgsIGhlaWdodCwgZG9jKTsgLy8gcmV0dXJuIDogc2l6ZShwdCkgYW5kIGxlZnQgbWFyZ2luIChtbSlcbiAgICAgIHRoaXMuYWRkU3ViVGl0bGUoZG9jLCBvcHRpb25zLnN1YnRpdGxlLCB0aXRsZUggKiAwLjcsIG1hcmdpbnNbM10gKyBzdWJ0aXRsZVNpemVSZXN1bHQsIHRpdGxlSCAqIDEuNyAqICgyNS40IC8gNzIpKTtcbiAgICAgIG1hcmdpbnNbMF0gPSBtYXJnaW5zWzBdICsgdGl0bGVTaXplUmVzdWx0c1swXSAqIDAuNyAqICgyNS40IC8gNzIpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zaG93UHJvamVjdGlvbiA9PT0gdHJ1ZSB8fCBvcHRpb25zLnNob3dTY2FsZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5hZGRQcm9qU2NhbGUoXG4gICAgICAgIGRvYyxcbiAgICAgICAgbWFwLFxuICAgICAgICByZXNvbHV0aW9uLFxuICAgICAgICBvcHRpb25zLnNob3dQcm9qZWN0aW9uLFxuICAgICAgICBvcHRpb25zLnNob3dTY2FsZVxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jb21tZW50ICE9PSAnJykge1xuICAgICAgdGhpcy5hZGRDb21tZW50KGRvYywgb3B0aW9ucy5jb21tZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZE1hcChkb2MsIG1hcCwgcmVzb2x1dGlvbiwgc2l6ZSwgbWFyZ2lucykuc3Vic2NyaWJlKFxuICAgICAgYXN5bmMgKHN0YXR1czogU3ViamVjdFN0YXR1cykgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBTdWJqZWN0U3RhdHVzLkRvbmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkZFNjYWxlKGRvYywgbWFwLCBtYXJnaW5zKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU1lYXN1cmVMYXllcihkb2MsIG1hcCwgbWFyZ2lucyk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubGVnZW5kUG9zaXRpb24gIT09ICdub25lJykge1xuICAgICAgICAgICAgaWYgKFsndG9wbGVmdCcsICd0b3ByaWdodCcsICdib3R0b21sZWZ0JywgJ2JvdHRvbXJpZ2h0J10uaW5kZXhPZihvcHRpb25zLmxlZ2VuZFBvc2l0aW9uKSA+IC0xICkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZExlZ2VuZFNhbWVQYWdlKGRvYywgbWFwLCBtYXJnaW5zLCByZXNvbHV0aW9uLCBvcHRpb25zLmxlZ2VuZFBvc2l0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5sZWdlbmRQb3NpdGlvbiA9PT0gJ25ld3BhZ2UnKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkTGVnZW5kKGRvYywgbWFwLCBtYXJnaW5zLCByZXNvbHV0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5Eb25lIHx8IHN0YXR1cyA9PT0gU3ViamVjdFN0YXR1cy5FcnJvcikge1xuICAgICAgICAgIHRoaXMuYWN0aXZpdHlTZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5hY3Rpdml0eUlkKTtcbiAgICAgICAgICBzdGF0dXMkLm5leHQoU3ViamVjdFN0YXR1cy5Eb25lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gc3RhdHVzJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbWVhc3VyZSBvdmVybGF5IG9uIHRoZSBtYXAgb24gdGhlIGRvY3VtZW50IHdoZW4gdGhlIG1lYXN1cmUgbGF5ZXIgaXMgcHJlc2VudFxuICAgKiBAcGFyYW0gIGRvYyAtIFBkZiBkb2N1bWVudCB3aGVyZSBtZWFzdXJlIHRvb2x0aXAgd2lsbCBiZSBhZGRlZFxuICAgKiBAcGFyYW0gIG1hcCAtIE1hcCBvZiB0aGUgYXBwXG4gICAqIEBwYXJhbSAgbWFyZ2lucyAtIFBhZ2UgbWFyZ2luc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVNZWFzdXJlTGF5ZXIoXG4gICAgZG9jOiBqc3BkZixcbiAgICBtYXA6IElnb01hcCxcbiAgICBtYXJnaW5zOiBBcnJheTxudW1iZXI+XG4gICkge1xuICAgIGlmIChtYXAubGF5ZXJzLmZpbmQobGF5ZXIgPT4gbGF5ZXIudmlzaWJsZSAmJiBsYXllci5pZC5zdGFydHNXaXRoKCdpZ28tbWVhc3VyZXMtJykpKSB7XG4gICAgICBsZXQgY2FudmFzT3ZlcmxheUhUTUxNZWFzdXJlcztcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlNZWFzdXJlc0hUTUwgPSBtYXAub2wuZ2V0T3ZlcmxheUNvbnRhaW5lcigpO1xuICAgICAgYXdhaXQgaHRtbDJjYW52YXMobWFwT3ZlcmxheU1lYXN1cmVzSFRNTCwge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsXG4gICAgICB9KS50aGVuKGUgPT4ge1xuICAgICAgICBjYW52YXNPdmVybGF5SFRNTE1lYXN1cmVzID0gZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hZGRDYW52YXMoZG9jLCBjYW52YXNPdmVybGF5SFRNTE1lYXN1cmVzLCBtYXJnaW5zKTsgLy8gdGhpcyBhZGRzIG1lYXN1cmUgb3ZlcmxheXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGh0bWwgY29kZSBmb3IgYWxsIGxheWVycyBsZWdlbmRcbiAgICogQHBhcmFtICBtYXAgSWdvTWFwXG4gICAqIEBwYXJhbSAgd2lkdGggVGhlIHdpZHRoIHRoYXQgdGhlIGxlZ2VuZCBuZWVkIHRvIGJlXG4gICAqIEByZXR1cm4gSHRtbCBjb2RlIGZvciB0aGUgbGVnZW5kXG4gICAqL1xuICBnZXRMYXllcnNMZWdlbmRIdG1sKFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGNvbnN0IGxlZ2VuZHMgPSBnZXRMYXllcnNMZWdlbmRzKFxuICAgICAgICBtYXAubGF5ZXJzLFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x1dGlvbjogbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKSxcbiAgICAgICAgICBleHRlbnQ6IG1hcC52aWV3Q29udHJvbGxlci5nZXRFeHRlbnQoKSxcbiAgICAgICAgICBwcm9qZWN0aW9uOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0T2xQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpLFxuICAgICAgICAgIHNjYWxlOiBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUocmVzb2x1dGlvbiksXG4gICAgICAgICAgc2l6ZTogbWFwLm9sLmdldFNpemUoKVxuICAgICAgICB9IGFzIExlZ2VuZE1hcFZpZXdPcHRpb25zXG4gICAgICApO1xuICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoaHRtbCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIERlZmluZSBpbXBvcnRhbnQgc3R5bGUgdG8gYmUgc3VyZSB0aGF0IGFsbCBjb250YWluZXIgaXMgY29udmVydFxuICAgICAgLy8gdG8gaW1hZ2Ugbm90IGp1c3QgdmlzaWJsZSBwYXJ0XG4gICAgICBodG1sICs9ICc8c3R5bGUgbWVkaWE9XCJzY3JlZW5cIiB0eXBlPVwidGV4dC9jc3NcIj4nO1xuICAgICAgaHRtbCArPSAnLmh0bWwyY2FudmFzLWNvbnRhaW5lciB7IHdpZHRoOiAnICsgd2lkdGggKyAnbW0gIWltcG9ydGFudDsgaGVpZ2h0OiAyMDAwcHggIWltcG9ydGFudDsgfSc7XG4gICAgICBodG1sICs9ICd0YWJsZS50YWJsZUxlZ2VuZCB7dGFibGUtbGF5b3V0OiBhdXRvO30nO1xuICAgICAgaHRtbCArPSAnZGl2LnN0eWxlTGVnZW5kIHtwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OjVweDtwYWRkaW5nLWxlZnQ6NXB4O3BhZGRpbmctYm90dG9tOjVweDt9JztcbiAgICAgIGh0bWwgKz0gJzwvc3R5bGU+JztcbiAgICAgIC8vIFRoZSBmb250IHNpemUgd2lsbCBhbHNvIGJlIGxvd2VyZWQgYWZ0ZXJ3YXJkcyAoZ2xvYmFsbHkgYWxvbmcgdGhlIGxlZ2VuZCBzaXplKVxuICAgICAgLy8gdGhpcyBhbGxvd3MgaGF2aW5nIGEgZ29vZCByZWxhdGl2ZSBmb250IHNpemUgaGVyZSBhbmQgdG8ga2VlcCBhanVzdGluZyB0aGUgbGVnZW5kIHNpemVcbiAgICAgIC8vIHdoaWxlIGtlZXBpbmcgZ29vZCByZWxhdGl2ZSBmb250IHNpemVcbiAgICAgIGh0bWwgKz0gJzxmb250IHNpemU9XCIzXCIgZmFjZT1cIlRpbWVzXCIgPic7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic3R5bGVMZWdlbmRcIj4nO1xuICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPVwidGFibGVMZWdlbmRcIiA+JztcblxuICAgICAgLy8gRm9yIGVhY2ggbGVnZW5kLCBkZWZpbmUgYW4gaHRtbCB0YWJsZSBjZWxsXG4gICAgICBjb25zdCBpbWFnZXMkID0gbGVnZW5kcy5tYXAoKGxlZ2VuZCkgPT5cbiAgICAgICAgdGhpcy5nZXREYXRhSW1hZ2UobGVnZW5kLnVybCkucGlwZShcbiAgICAgICAgICByeE1hcCgoZGF0YUltYWdlKSA9PiB7XG4gICAgICAgICAgICBsZXQgaHRtbEltZyA9ICc8dHI+PHRkPicgKyBsZWdlbmQudGl0bGUudG9VcHBlckNhc2UoKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgICAgIGh0bWxJbWcgKz0gJzx0cj48dGQ+PGltZyBzcmM9XCInICsgZGF0YUltYWdlICsgJ1wiPjwvdGQ+PC90cj4nO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxJbWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZvcmtKb2luKGltYWdlcyQpLnN1YnNjcmliZSgoZGF0YUltYWdlcykgPT4ge1xuICAgICAgICBodG1sID0gZGF0YUltYWdlcy5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4gKGFjYyArPSBjdXJyZW50KSwgaHRtbCk7XG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChodG1sKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGF0YUltYWdlKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCBzZWN1cmVJTUcgPSBuZXcgU2VjdXJlSW1hZ2VQaXBlKHRoaXMuaHR0cCk7XG4gICAgcmV0dXJuIHNlY3VyZUlNRy50cmFuc2Zvcm0odXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHRoZSBsZWdlbmQgaW4gYSBzaW5nbGUgaW1hZ2VcbiAgICogKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEByZXR1cm4gVGhlIGltYWdlIG9mIHRoZSBsZWdlbmRcbiAgICovXG4gIGFzeW5jIGdldExheWVyc0xlZ2VuZEltYWdlKFxuICAgIG1hcCxcbiAgICBmb3JtYXQ6IHN0cmluZyA9ICdwbmcnLFxuICAgIGRvWmlwRmlsZTogYm9vbGVhbixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qgc3RhdHVzJCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gMjAwOyAvLyBtaWxpbWV0ZXJzIHVuaXQsIG9yaWdpbmFsbHkgZGVmaW5lIGZvciBkb2N1bWVudCBwZGZcbiAgICBsZXQgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgIG1hcCxcbiAgICAgIHdpZHRoLFxuICAgICAgcmVzb2x1dGlvblxuICAgICkudG9Qcm9taXNlKCk7XG4gICAgZm9ybWF0ID0gZm9ybWF0LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBJZiBubyBsZWdlbmQgc2hvdyBObyBMRUdFTkQgaW4gYW4gaW1hZ2VcbiAgICBpZiAoaHRtbC5sZW5ndGggPT09IDApIHtcbiAgICAgIGh0bWwgPSAnPGZvbnQgc2l6ZT1cIjEyXCIgZmFjZT1cIkNvdXJpZXIgTmV3XCIgPic7XG4gICAgICBodG1sICs9ICc8ZGl2IGFsaWduPVwiY2VudGVyXCI+PGI+Tk8gTEVHRU5EPC9iPjwvZGl2Pic7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBkaXYgdG8gY29udGFpbiBodG1sIGNvZGUgZm9yIGxlZ2VuZFxuICAgIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS50b3AgPSAnMCc7XG5cbiAgICAvLyBBZGQgaHRtbCBjb2RlIHRvIGNvbnZlcnQgaW4gdGhlIG5ldyB3aW5kb3dcbiAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgYXdhaXQgdGhpcy50aW1lb3V0KDEpO1xuICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKGRpdiwgeyB1c2VDT1JTOiB0cnVlIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9KTtcblxuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGxldCBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkRvbmU7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xuICAgICAgICAgIC8vIFNhdmUgdGhlIGNhbnZhcyBhcyBmaWxlXG4gICAgICAgICAgdGhpcy5zYXZlQ2FudmFzSW1hZ2VBc0ZpbGUoY2FudmFzLCAnbGVnZW5kSW1hZ2UnLCBmb3JtYXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFkZCB0aGUgY2FudmFzIHRvIHppcFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDYW52YUZpbGVUb1ppcChjYW52YXMsICdsZWdlbmRJbWFnZScgKyAnLicgKyBmb3JtYXQpO1xuICAgICAgICB9XG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7IC8vIHJlbW92ZSB0ZW1wIGRpdiAoSUUpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5FcnJvcjtcbiAgICAgIH1cbiAgICAgIHN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgZ2V0VGl0bGVTaXplKHRpdGxlOiBzdHJpbmcsIHBhZ2VXaWR0aDogbnVtYmVyLCBwYWdlSGVpZ2h0OiBudW1iZXIsIGRvYzoganNwZGYpIHtcbiAgICBjb25zdCBwZGZSZXNvbHV0aW9uID0gOTY7XG4gICAgY29uc3QgdGl0bGVTaXplID0gTWF0aC5yb3VuZCgyICogKHBhZ2VIZWlnaHQgKyAxNDUpICogMC4wNSkgLyAyO1xuICAgIGRvYy5zZXRGb250KCdUaW1lcycsICdib2xkJyk7XG4gICAgY29uc3Qgd2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKHRpdGxlKTtcblxuICAgIGNvbnN0IHRpdGxlV2lkdGggPSBkb2MuZ2V0U3RyaW5nVW5pdFdpZHRoKHRpdGxlKSAqIHRpdGxlU2l6ZSAvIGRvYy5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICBjb25zdCB0aXRsZVRhaWxsZU1pbmltYWxlID0gTWF0aC5yb3VuZCggMiAqIChwYWdlSGVpZ2h0ICsgMTUwICkgKiAwLjAzNykgLyAyO1xuICAgIGxldCB0aXRsZUZvbnRTaXplID0gMDtcblxuICAgIGxldCB0aXRsZU1hcmdpbkxlZnQ7XG4gICAgaWYgKHRpdGxlV2lkdGggPj0gKHBhZ2VXaWR0aCkpIHtcbiAgICAgIHRpdGxlTWFyZ2luTGVmdCA9IDA7XG4gICAgICB0aXRsZUZvbnRTaXplID0gTWF0aC5yb3VuZCgoKHBhZ2VXaWR0aCAvIHRpdGxlLmxlbmd0aCkgKiBwZGZSZXNvbHV0aW9uKSAvIDI1LjQpO1xuICAgICAgLy8gSWYgdGhlIGZvcm11bGEgdG8gZmluZCB0aGUgZm9udCBzaXplIGdpdmVzIGJlbG93IHRoZSBkZWZpbmVkIG1pbmltdW0gc2l6ZVxuICAgICAgaWYgKHRpdGxlRm9udFNpemUgPCB0aXRsZVRhaWxsZU1pbmltYWxlKSB7XG4gICAgICAgIHRpdGxlRm9udFNpemUgPSB0aXRsZVRhaWxsZU1pbmltYWxlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aXRsZU1hcmdpbkxlZnQgPSAocGFnZVdpZHRoIC0gdGl0bGVXaWR0aCkgLyAyIDtcbiAgICAgIHRpdGxlRm9udFNpemUgPSB0aXRsZVNpemU7XG4gICAgfVxuICAgIHJldHVybiBbdGl0bGVGb250U2l6ZSwgdGl0bGVNYXJnaW5MZWZ0XTtcbiAgfVxuXG4gIGdldFN1YlRpdGxlU2l6ZShzdWJ0aXRsZTogc3RyaW5nLCBwYWdlV2lkdGg6IG51bWJlciwgcGFnZUhlaWdodDogbnVtYmVyLCBkb2M6IGpzcGRmKSB7XG4gICAgY29uc3Qgc3VidGl0bGVTaXplID0gMC43ICogTWF0aC5yb3VuZCgyICogKHBhZ2VIZWlnaHQgKyAxNDUpICogMC4wNSkgLyAyOyAvLyA3MCUgb2YgdGhlIHRpdGxlJ3MgZm9udCBzaXplXG5cbiAgICBkb2Muc2V0Rm9udCgnVGltZXMnLCAnYm9sZCcpO1xuXG4gICAgY29uc3Qgc3VidGl0bGVXaWR0aCA9IGRvYy5nZXRTdHJpbmdVbml0V2lkdGgoc3VidGl0bGUpICogc3VidGl0bGVTaXplIC8gZG9jLmludGVybmFsLnNjYWxlRmFjdG9yO1xuXG4gICAgbGV0IHN1YnRpdGxlTWFyZ2luTGVmdDtcbiAgICBpZiAoc3VidGl0bGVXaWR0aCA+PSAocGFnZVdpZHRoKSkge1xuICAgICAgc3VidGl0bGVNYXJnaW5MZWZ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VidGl0bGVNYXJnaW5MZWZ0ID0gKHBhZ2VXaWR0aCAtIHN1YnRpdGxlV2lkdGgpIC8gMiA7XG4gICAgfVxuICAgIHJldHVybiBzdWJ0aXRsZU1hcmdpbkxlZnQ7XG4gIH1cblxuICBwcml2YXRlIGFkZFRpdGxlKGRvYzoganNwZGYsIHRpdGxlOiBzdHJpbmcsIHRpdGxlRm9udFNpemU6IG51bWJlciwgdGl0bGVNYXJnaW5MZWZ0OiBudW1iZXIsIHRpdGxlTWFyZ2luVG9wOiBudW1iZXIpIHtcbiAgICBkb2Muc2V0Rm9udCgnVGltZXMnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSh0aXRsZUZvbnRTaXplKTtcbiAgICBkb2MudGV4dCh0aXRsZSwgdGl0bGVNYXJnaW5MZWZ0LCB0aXRsZU1hcmdpblRvcCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFN1YlRpdGxlKGRvYzoganNwZGYsIHN1YnRpdGxlOiBzdHJpbmcsIHN1YnRpdGxlRm9udFNpemU6IG51bWJlciwgc3VidGl0bGVNYXJnaW5MZWZ0OiBudW1iZXIsIHN1YnRpdGxlTWFyZ2luVG9wOiBudW1iZXIpIHtcbiAgICBkb2Muc2V0Rm9udCgnVGltZXMnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzdWJ0aXRsZUZvbnRTaXplKTtcbiAgICBkb2MudGV4dChzdWJ0aXRsZSwgc3VidGl0bGVNYXJnaW5MZWZ0LCBzdWJ0aXRsZU1hcmdpblRvcCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBjb21tZW50IHRvIHRoZSBkb2N1bWVudFxuICAgKiAqIEBwYXJhbSAgZG9jIC0gcGRmIGRvY3VtZW50XG4gICAqICogQHBhcmFtICBjb21tZW50IC0gQ29tbWVudCB0byBhZGQgaW4gdGhlIGRvY3VtZW50XG4gICAqICogQHBhcmFtICBzaXplIC0gU2l6ZSBvZiB0aGUgZG9jdW1lbnRcbiAgICovXG4gIHByaXZhdGUgYWRkQ29tbWVudChkb2M6IGpzcGRmLCBjb21tZW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjb21tZW50U2l6ZSA9IDE2O1xuICAgIGNvbnN0IGNvbW1lbnRNYXJnaW5MZWZ0ID0gMjA7XG4gICAgY29uc3QgbWFyZ2luQm90dG9tID0gNTtcbiAgICBjb25zdCBoZWlnaHRQaXhlbHMgPSBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luQm90dG9tO1xuXG4gICAgZG9jLnNldEZvbnQoJ2NvdXJpZXInKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoY29tbWVudFNpemUpO1xuICAgIGRvYy50ZXh0KGNvbW1lbnQsIGNvbW1lbnRNYXJnaW5MZWZ0LCBoZWlnaHRQaXhlbHMpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgcHJvamVjdGlvbiBhbmQvb3Igc2NhbGUgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gcGRmIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBkcGkgLSBEUEkgcmVzb2x1dGlvbiBvZiB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBwcm9qZWN0aW9uIC0gQm9vbCB0byBpbmRpY2F0ZSBpZiBwcm9qZWN0aW9uIG5lZWQgdG8gYmUgYWRkZWRcbiAgICogQHBhcmFtICBzY2FsZSAtIEJvb2wgdG8gaW5kaWNhdGUgaWYgc2NhbGUgbmVlZCB0byBiZSBhZGRlZFxuICAgKi9cbiAgcHJpdmF0ZSBhZGRQcm9qU2NhbGUoXG4gICAgZG9jOiBqc3BkZixcbiAgICBtYXA6IElnb01hcCxcbiAgICBkcGk6IG51bWJlcixcbiAgICBwcm9qZWN0aW9uOiBib29sZWFuLFxuICAgIHNjYWxlOiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZTtcbiAgICBjb25zdCBwcm9qU2NhbGVTaXplID0gMTY7XG4gICAgY29uc3QgcHJvalNjYWxlTWFyZ2luTGVmdCA9IDIwO1xuICAgIGNvbnN0IG1hcmdpbkJvdHRvbSA9IDE1O1xuICAgIGNvbnN0IGhlaWdodFBpeGVscyA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5Cb3R0b207XG5cbiAgICBsZXQgdGV4dFByb2pTY2FsZTogc3RyaW5nID0gJyc7XG4gICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHByb2pUZXh0ID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8ucHJpbnRGb3JtLnByb2plY3Rpb24nKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb247XG4gICAgfVxuICAgIGlmIChzY2FsZSA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHByb2plY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgdGV4dFByb2pTY2FsZSArPSAnICAgJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjYWxlVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5zY2FsZScpO1xuICAgICAgY29uc3QgbWFwU2NhbGUgPSBtYXAudmlld0NvbnRyb2xsZXIuZ2V0U2NhbGUoZHBpKTtcbiAgICAgIHRleHRQcm9qU2NhbGUgKz0gc2NhbGVUZXh0ICsgJzogfiAxIC8gJyArIGZvcm1hdFNjYWxlKG1hcFNjYWxlKTtcbiAgICB9XG4gICAgZG9jLnNldEZvbnQoJ2NvdXJpZXInKTtcbiAgICBkb2Muc2V0Rm9udFNpemUocHJvalNjYWxlU2l6ZSk7XG4gICAgZG9jLnRleHQodGV4dFByb2pTY2FsZSwgcHJvalNjYWxlTWFyZ2luTGVmdCwgaGVpZ2h0UGl4ZWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGxlZ2VuZCB0byB0aGUgZG9jdW1lbnRcbiAgICogQHBhcmFtICBkb2MgLSBQZGYgZG9jdW1lbnQgd2hlcmUgbGVnZW5kIHdpbGwgYmUgYWRkZWRcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIG1hcmdpbnMgLSBQYWdlIG1hcmdpbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkTGVnZW5kKFxuICAgIGRvYzoganNwZGYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICByZXNvbHV0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgLy8gR2V0IGh0bWwgY29kZSBmb3IgdGhlIGxlZ2VuZFxuICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLmdldExheWVyc0xlZ2VuZEh0bWwoXG4gICAgICBtYXAsXG4gICAgICB3aWR0aCxcbiAgICAgIHJlc29sdXRpb25cbiAgICApLnRvUHJvbWlzZSgpO1xuICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgaWYgKGh0bWwgPT09ICcnKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgZGl2IHRvIGNvbnRhaW4gaHRtbCBjb2RlIGZvciBsZWdlbmRcbiAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBkaXYuc3R5bGUudG9wID0gJzAnO1xuXG4gICAgLy8gQWRkIGh0bWwgY29kZSB0byBjb252ZXJ0IGluIHRoZSBuZXcgd2luZG93XG4gICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGF3YWl0IHRoaXMudGltZW91dCgxKTtcbiAgICBjb25zdCBjYW52YXMgPSBhd2FpdCBodG1sMmNhbnZhcyhkaXYsIHsgdXNlQ09SUzogdHJ1ZSB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG5cbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICBjb25zdCBpbWFnZVNpemUgPSBbcG91cmNlbnRhZ2VSZWR1Y3Rpb24gKiAoMjUuNCAqIGNhbnZhcy53aWR0aCkgLyByZXNvbHV0aW9uLCBwb3VyY2VudGFnZVJlZHVjdGlvblxuICAgICAgICAqICgyNS40ICogY2FudmFzLmhlaWdodCkgLyByZXNvbHV0aW9uXTtcbiAgICAgIGxldCBpbWdEYXRhO1xuICAgICAgZG9jLmFkZFBhZ2UoKTtcbiAgICAgIGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgIGRvYy5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMTAsIDEwLCBpbWFnZVNpemVbMF0sIGltYWdlU2l6ZVsxXSk7XG4gICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpOyAvLyByZW1vdmUgdGVtcCBkaXYgKElFIHN0eWxlKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZURvYyhkb2MpO1xuXG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBsZWdlbmQgdG8gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICAgICBwcml2YXRlIGFzeW5jIGFkZExlZ2VuZFNhbWVQYWdlKFxuICAgICAgZG9jOiBqc3BkZixcbiAgICAgIG1hcDogSWdvTWFwLFxuICAgICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPixcbiAgICAgIHJlc29sdXRpb246IG51bWJlcixcbiAgICAgIGxlZ2VuZFBvc2l0aW9uOiBzdHJpbmdcbiAgICApIHtcbiAgICAgIC8vIEdldCBodG1sIGNvZGUgZm9yIHRoZSBsZWdlbmRcbiAgICAgIGNvbnN0IHdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJzTGVnZW5kSHRtbChcbiAgICAgICAgbWFwLFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgcmVzb2x1dGlvblxuICAgICAgKS50b1Byb21pc2UoKTtcbiAgICAgIC8vIElmIG5vIGxlZ2VuZCwgc2F2ZSB0aGUgbWFwIGRpcmVjdGx5XG4gICAgICBpZiAoaHRtbCA9PT0gJycpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRG9jKGRvYyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQ3JlYXRlIGRpdiB0byBjb250YWluIGh0bWwgY29kZSBmb3IgbGVnZW5kXG4gICAgICBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgZGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgIC8vIEFkZCBodG1sIGNvZGUgdG8gY29udmVydCBpbiB0aGUgbmV3IHdpbmRvd1xuICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgYXdhaXQgdGhpcy50aW1lb3V0KDEpO1xuICAgICAgY29uc3QgY2FudmFzID0gYXdhaXQgaHRtbDJjYW52YXMoZGl2LCB7IHVzZUNPUlM6IHRydWUgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9KTtcbiAgICAgIGxldCBtYXJnaW5zTGVnZW5kO1xuICAgICAgaWYgKGNhbnZhcykge1xuICAgICAgICBjb25zdCBwb3VyY2VudGFnZVJlZHVjdGlvbiA9IDAuODU7XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IFtwb3VyY2VudGFnZVJlZHVjdGlvbiAqICgyNS40ICogY2FudmFzLndpZHRoKSAvIHJlc29sdXRpb24sXG4gICAgICAgICAgIHBvdXJjZW50YWdlUmVkdWN0aW9uICogKDI1LjQgKiBjYW52YXMuaGVpZ2h0KSAvIHJlc29sdXRpb25dO1xuICAgICAgICAvLyBNb3ZlIHRoZSBsZWdlbmQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gb24gdGhlIHBhZ2VcbiAgICAgICAgaWYgKCBsZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbXJpZ2h0Jykge1xuICAgICAgICAgIG1hcmdpbnNMZWdlbmQgPSBbZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIG1hcmdpbnNbMl0gLSBpbWFnZVNpemVbMV0sIG1hcmdpbnNbMV0sXG4gICAgICAgICAgIG1hcmdpbnNbMl0sIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbMV0gLSBpbWFnZVNpemVbMF1dO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wcmlnaHQnKSB7XG4gICAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFttYXJnaW5zWzBdLCBtYXJnaW5zWzFdLCBkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luc1swXSAtIGltYWdlU2l6ZVsxXSxcbiAgICAgICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUud2lkdGggLSBtYXJnaW5zWzFdIC0gaW1hZ2VTaXplWzBdIF07XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kUG9zaXRpb24gPT09ICdib3R0b21sZWZ0Jykge1xuICAgICAgICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBpbiB0aGUgYm90dG9tIGxlZnQsIHJhaXNlIHRoZSBsZWdlbmQgc2xpZ2h0bHkgdXB3YXJkIHNvIHRoYXQgYXR0cmlidXRpb25zIGFyZSB2aXNpYmxlXG4gICAgICAgICAgbWFyZ2luc0xlZ2VuZCA9IFtkb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0IC0gbWFyZ2luc1syXSAtIGltYWdlU2l6ZVsxXSAtIDE1LFxuICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbM10gLSBpbWFnZVNpemVbMF0sIG1hcmdpbnNbMl0gKyAxNSwgbWFyZ2luc1szXSBdO1xuICAgICAgICB9IGVsc2UgaWYgKGxlZ2VuZFBvc2l0aW9uID09PSAndG9wbGVmdCcpIHtcbiAgICAgICAgICBtYXJnaW5zTGVnZW5kID0gW21hcmdpbnNbMF0sIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIG1hcmdpbnNbM10gLSBpbWFnZVNpemVbMF0sXG4gICAgICAgICAgIGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQgLSBtYXJnaW5zWzBdIC0gaW1hZ2VTaXplWzFdLCBtYXJnaW5zWzNdIF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRDYW52YXMoZG9jLCBjYW52YXMsIG1hcmdpbnNMZWdlbmQpOyAvLyB0aGlzIGFkZHMgdGhlIGxlZ2VuZFxuICAgICAgICBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpOyAvLyByZW1vdmUgdGVtcCBkaXYgKElFIHN0eWxlKVxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEb2MoZG9jKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzY2FsZSBhbmQgYXR0cmlidXRpb25zIG9uIHRoZSBtYXAgb24gdGhlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gUGRmIGRvY3VtZW50IHdoZXJlIGxlZ2VuZCB3aWxsIGJlIGFkZGVkXG4gICAqIEBwYXJhbSAgbWFwIC0gTWFwIG9mIHRoZSBhcHBcbiAgICogQHBhcmFtICBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFNjYWxlKFxuICAgIGRvYzoganNwZGYsXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgbWFyZ2luczogQXJyYXk8bnVtYmVyPlxuICAgICkge1xuICAgICAgY29uc3QgbWFwU2l6ZSA9IG1hcC5vbC5nZXRTaXplKCk7XG4gICAgICBjb25zdCBleHRlbnQgPSBtYXAub2wuZ2V0VmlldygpLmNhbGN1bGF0ZUV4dGVudChtYXBTaXplKTtcbiAgICAgIC8vIEdldCB0aGUgc2NhbGUgYW5kIGF0dHJpYnV0aW9uXG4gICAgICAvLyB3ZSB1c2UgY2xvbmVOb2RlIHRvIG1vZGlmeSB0aGUgbm9kZXMgdG8gcHJpbnQgd2l0aG91dCBtb2RpZnlpbmcgaXQgb24gdGhlIHBhZ2UsIHVzaW5nIGRlZXA6dHJ1ZSB0byBnZXQgY2hpbGRyZW5cbiAgICAgIGxldCBjYW52YXNPdmVybGF5SFRNTDtcbiAgICAgIGNvbnN0IG1hcE92ZXJsYXlIVE1MID0gbWFwLm9sLmdldE92ZXJsYXlDb250YWluZXJTdG9wRXZlbnQoKTtcbiAgICAgIC8vIFJlbW92ZSB0aGUgVUkgYnV0dG9ucyBmcm9tIHRoZSBub2Rlc1xuICAgICAgY29uc3QgT3ZlcmxheUhUTUxCdXR0b25zID0gbWFwT3ZlcmxheUhUTUwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xuICAgICAgY29uc3QgT3ZlcmxheUhUTUxCdXR0b25zYXJyID0gQXJyYXkuZnJvbShPdmVybGF5SFRNTEJ1dHRvbnMpO1xuICAgICAgZm9yIChjb25zdCBPdmVybGF5SFRNTEJ1dHRvbiBvZiBPdmVybGF5SFRNTEJ1dHRvbnNhcnIpIHtcbiAgICAgICAgT3ZlcmxheUhUTUxCdXR0b24uc2V0QXR0cmlidXRlKCdkYXRhLWh0bWwyY2FudmFzLWlnbm9yZScsICd0cnVlJyk7XG4gICAgICB9XG4gICAgICAvLyBDaGFuZ2UgdGhlIHN0eWxlcyBvZiBoeXBlcmxpbmsgaW4gdGhlIHByaW50ZWQgdmVyc2lvblxuICAgICAgLy8gVHJhbnNmb3JtIHRoZSBPdmVybGF5IGludG8gYSBjYW52YXNcbiAgICAgIC8vIHNjYWxlIGlzIG5lY2Vzc2FyeSB0byBtYWtlIGl0IGluIGdvb2dsZSBjaHJvbWVcbiAgICAgIC8vIGJhY2tncm91bmQgYXMgbnVsbCBiZWNhdXNlIG90aGVyd2lzZSBpdCBpcyB3aGl0ZSBhbmQgY292ZXIgdGhlIG1hcFxuICAgICAgLy8gYWxsb3d0YWludCBpcyB0byBhbGxvdyByZW5kZXJpbmcgaW1hZ2VzIGluIHRoZSBhdHRyaWJ1dGlvbnNcbiAgICAgIC8vIHVzZUNPUlM6IHRydWUgcG91ciBwZXJtZXR0cmUgZGUgcmVuZGVyZXIgbGVzIGltYWdlcyAobmUgbWFyY2hlIHBhcyBlbiBsb2NhbClcbiAgICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKG1hcE92ZXJsYXlIVE1MLCB7XG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG51bGwsXG4gICAgICAgIGFsbG93VGFpbnQ6IHRydWUsXG4gICAgICAgIHVzZUNPUlM6IHRydWUsXG4gICAgICB9KS50aGVuKCBlID0+IHtcbiAgICAgICAgY2FudmFzT3ZlcmxheUhUTUwgPSBlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhc092ZXJsYXlIVE1MLCBtYXJnaW5zKTsgLy8gdGhpcyBhZGRzIHNjYWxlcyBhbmQgYXR0cmlidXRpb25zXG4gfVxuXG4gIGRlZmluZU5iRmlsZVRvUHJvY2VzcyhuYkZpbGVUb1Byb2Nlc3MpIHtcbiAgICB0aGlzLm5iRmlsZVRvUHJvY2VzcyA9IG5iRmlsZVRvUHJvY2VzcztcbiAgfVxuXG4gIHByaXZhdGUgdGltZW91dChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDYW52YXMoXG4gICAgZG9jOiBqc3BkZixcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICAgIG1hcmdpbnM6IEFycmF5PG51bWJlcj5cbiAgKSB7XG4gICAgbGV0IGltYWdlO1xuICAgIGlmIChjYW52YXMpIHtcbiAgICAgIGltYWdlID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGltYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGltYWdlU2l6ZSA9IHRoaXMuZ2V0SW1hZ2VTaXplVG9GaXRQZGYoZG9jLCBjYW52YXMsIG1hcmdpbnMpO1xuICAgICAgZG9jLmFkZEltYWdlKFxuICAgICAgICBpbWFnZSxcbiAgICAgICAgJ1BORycsXG4gICAgICAgIG1hcmdpbnNbM10sXG4gICAgICAgIG1hcmdpbnNbMF0sXG4gICAgICAgIGltYWdlU2l6ZVswXSxcbiAgICAgICAgaW1hZ2VTaXplWzFdXG4gICAgICApO1xuICAgICAgZG9jLnJlY3QobWFyZ2luc1szXSwgbWFyZ2luc1swXSwgaW1hZ2VTaXplWzBdLCBpbWFnZVNpemVbMV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gZml4IHByaW50aW5nIHdpdGggaW1hZ2UgcmVzb2x1dGlvblxuICBwcml2YXRlIGFkZE1hcChcbiAgICBkb2M6IGpzcGRmLFxuICAgIG1hcDogSWdvTWFwLFxuICAgIHJlc29sdXRpb246IG51bWJlcixcbiAgICBzaXplOiBBcnJheTxudW1iZXI+LFxuICAgIG1hcmdpbnM6IEFycmF5PG51bWJlcj5cbiAgKSB7XG4gICAgY29uc3Qgc3RhdHVzJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBjb25zdCBtYXBTaXplID0gbWFwLm9sLmdldFNpemUoKTtcbiAgICBjb25zdCBleHRlbnQgPSBtYXAub2wuZ2V0VmlldygpLmNhbGN1bGF0ZUV4dGVudChtYXBTaXplKTtcblxuICAgIGNvbnN0IHdpZHRoUGl4ZWxzID0gTWF0aC5yb3VuZCgoc2l6ZVswXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG4gICAgY29uc3QgaGVpZ2h0UGl4ZWxzID0gTWF0aC5yb3VuZCgoc2l6ZVsxXSAqIHJlc29sdXRpb24pIC8gMjUuNCk7XG5cbiAgICBsZXQgdGltZW91dDtcblxuICAgIG1hcC5vbC5vbmNlKCdyZW5kZXJjb21wbGV0ZScsIChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCBjYW52YXNlcyA9IGV2ZW50LnRhcmdldC5nZXRWaWV3cG9ydCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IG1hcFN0YXR1cyQkID0gbWFwLnN0YXR1cyQuc3Vic2NyaWJlKChtYXBTdGF0dXM6IFN1YmplY3RTdGF0dXMpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgIGlmIChtYXBTdGF0dXMgIT09IFN1YmplY3RTdGF0dXMuRG9uZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcFN0YXR1cyQkLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgbGV0IHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRG9uZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNhbnZhcyBvZiBjYW52YXNlcykge1xuICAgICAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLmFkZENhbnZhcyhkb2MsIGNhbnZhcywgbWFyZ2lucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VCb2R5J1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUhlYWRlcidcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyTWFwKG1hcCwgbWFwU2l6ZSwgZXh0ZW50KTtcbiAgICAgICAgc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm8gbG9hZGluZyBhcyBzdGFydGVkIGFmdGVyIDIwMG1zLCB0aGVuIHByb2JhYmx5IG5vIGxvYWRpbmdcbiAgICAgIC8vIGlzIHJlcXVpcmVkLlxuICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbWFwU3RhdHVzJCQudW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgY2FudmFzIG9mIGNhbnZhc2VzKSB7XG4gICAgICAgICAgICBpZiAoY2FudmFzLndpZHRoICE9PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ2FudmFzKGRvYywgY2FudmFzLCBtYXJnaW5zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN0YXR1cyA9IFN1YmplY3RTdGF0dXMuRXJyb3I7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJNYXAobWFwLCBtYXBTaXplLCBleHRlbnQpO1xuICAgICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbmRlck1hcChtYXAsIFt3aWR0aFBpeGVscywgaGVpZ2h0UGl4ZWxzXSwgZXh0ZW50KTtcblxuICAgIHJldHVybiBzdGF0dXMkO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGFuIGltYWdlIG9mIHRoZSBtYXAgd2l0aCBhZGRpdGlvbiBvZiBpbmZvcm1hdGlvbnNcbiAgICogQHBhcmFtICBtYXAgLSBNYXAgb2YgdGhlIGFwcFxuICAgKiBAcGFyYW0gIGZvcm1hdCAtIEltYWdlIGZvcm1hdC4gZGVmYXVsdCB2YWx1ZSB0byBcInBuZ1wiXG4gICAqIEBwYXJhbSAgcHJvamVjdGlvbiAtIEluZGljYXRlIGlmIHByb2plY3Rpb24gbmVlZCB0byBiZSBhZGQuIERlZmF1bHQgdG8gZmFsc2VcbiAgICogQHBhcmFtICBzY2FsZSAtIEluZGljYXRlIGlmIHNjYWxlIG5lZWQgdG8gYmUgYWRkLiBEZWZhdWx0IHRvIGZhbHNlXG4gICAqIEBwYXJhbSAgbGVnZW5kIC0gSW5kaWNhdGUgaWYgdGhlIGxlZ2VuZCBvZiBsYXllcnMgbmVlZCB0byBiZSBkb3dubG9hZC4gRGVmYXVsdCB0byBmYWxzZVxuICAgKiBAcGFyYW0gIHRpdGxlIC0gVGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIHN1YnRpdGxlIC0gU3VidGl0bGUgdG8gYWRkIGZvciB0aGUgbWFwIC0gRGVmYXVsdCB0byBibGFua1xuICAgKiBAcGFyYW0gIGNvbW1lbnQgLSBDb21tZW50IHRvIGFkZCBmb3IgdGhlIG1hcCAtIERlZmF1bHQgdG8gYmxhbmtcbiAgICogQHBhcmFtICBkb1ppcEZpbGUgLSBJbmRpY2F0ZSBpZiB3ZSBkbyBhIHppcCB3aXRoIHRoZSBmaWxlXG4gICAqIEByZXR1cm4gSW1hZ2UgZmlsZSBvZiB0aGUgbWFwIHdpdGggZXh0ZW5zaW9uIGZvcm1hdCBnaXZlbiBhcyBwYXJhbWV0ZXJcbiAgICovXG4gIGRvd25sb2FkTWFwSW1hZ2UoXG4gICAgbWFwOiBJZ29NYXAsXG4gICAgcmVzb2x1dGlvbjogbnVtYmVyLFxuICAgIGZvcm1hdCA9ICdwbmcnLFxuICAgIHByb2plY3Rpb24gPSBmYWxzZSxcbiAgICBzY2FsZSA9IGZhbHNlLFxuICAgIGxlZ2VuZCA9IGZhbHNlLFxuICAgIHRpdGxlID0gJycsXG4gICAgc3VidGl0bGUgPSAnJyxcbiAgICBjb21tZW50ID0gJycsXG4gICAgZG9aaXBGaWxlID0gdHJ1ZVxuICApIHtcbiAgICBjb25zdCBzdGF0dXMkID0gbmV3IFN1YmplY3QoKTtcbiAgICAvLyBjb25zdCByZXNvbHV0aW9uID0gbWFwLm9sLmdldFZpZXcoKS5nZXRSZXNvbHV0aW9uKCk7XG4gICAgdGhpcy5hY3Rpdml0eUlkID0gdGhpcy5hY3Rpdml0eVNlcnZpY2UucmVnaXN0ZXIoKTtcbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XG4gICAgbWFwLm9sLm9uY2UoJ3JlbmRlcmNvbXBsZXRlJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qgb2xkQ2FudmFzID0gZXZlbnQudGFyZ2V0XG4gICAgICAgIC5nZXRWaWV3cG9ydCgpXG4gICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2FudmFzJylbMF07XG4gICAgICBjb25zdCBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRleHQgPSBuZXdDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIC8vIFBvc3Rpb24gaW4gaGVpZ2h0IHRvIHNldCB0aGUgY2FudmFzIGluIG5ldyBjYW52YXNcbiAgICAgIGxldCBwb3NpdGlvbkhDYW52YXMgPSAwO1xuICAgICAgLy8gUG9zaXRpb24gaW4gd2lkdGggdG8gc2V0IHRoZSBQcm9qL1NjYWxlIGluIG5ldyBjYW52YXNcbiAgICAgIGxldCBwb3NpdGlvbldQcm9qU2NhbGUgPSAxMDtcbiAgICAgIC8vIEdldCBoZWlnaHQvd2lkdGggb2YgbWFwIGNhbnZhc1xuICAgICAgY29uc3Qgd2lkdGggPSBvbGRDYW52YXMud2lkdGg7XG4gICAgICBsZXQgaGVpZ2h0ID0gb2xkQ2FudmFzLmhlaWdodDtcbiAgICAgIC8vIFNldCBGb250IHRvIGNhbGN1bGF0ZSBjb21tZW50IHdpZHRoXG4gICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjBweCBDYWxpYnJpJztcbiAgICAgIGNvbnN0IGNvbW1lbnRXaWR0aCA9IG5ld0NvbnRleHQubWVhc3VyZVRleHQoY29tbWVudCkud2lkdGg7XG4gICAgICAvLyBBZGQgaGVpZ2h0IGZvciB0aXRsZSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSB0aXRsZSAhPT0gJycgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIC8vIEFkZCBoZWlnaHQgZm9yIHRpdGxlIGlmIGRlZmluZWRcbiAgICAgIGhlaWdodCA9IHN1YnRpdGxlICE9PSAnJyA/IGhlaWdodCArIDMwIDogaGVpZ2h0O1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgcHJvamVjdGlvbiBvciBzY2FsZSAoc2FtZSBsaW5lKSBpZiBkZWZpbmVkXG4gICAgICBoZWlnaHQgPSBwcm9qZWN0aW9uICE9PSBmYWxzZSB8fCBzY2FsZSAhPT0gZmFsc2UgPyBoZWlnaHQgKyAzMCA6IGhlaWdodDtcbiAgICAgIGNvbnN0IHBvc2l0aW9uSFByb2pTY2FsZSA9IGhlaWdodCAtIDEwO1xuICAgICAgLy8gRGVmaW5lIG51bWJlciBvZiBsaW5lIGRlcGVuZGluZyBvZiB0aGUgY29tbWVudCBsZW5ndGhcbiAgICAgIGNvbnN0IGNvbW1lbnROYkxpbmUgPSBNYXRoLmNlaWwoY29tbWVudFdpZHRoIC8gd2lkdGgpO1xuICAgICAgLy8gQWRkIGhlaWdodCBmb3IgbXVsdGlsaW5lIGNvbW1lbnQgaWYgZGVmaW5lZFxuICAgICAgaGVpZ2h0ID0gY29tbWVudCAhPT0gJycgPyBoZWlnaHQgKyBjb21tZW50TmJMaW5lICogMzAgOiBoZWlnaHQ7XG4gICAgICBsZXQgcG9zaXRpb25IQ29tbWVudCA9IGhlaWdodCAtIGNvbW1lbnROYkxpbmUgKiAyMCArIDU7XG4gICAgICAvLyBTZXQgdGhlIG5ldyBjYW52YXMgd2l0aCB0aGUgbmV3IGNhbGN1bGF0ZWQgc2l6ZVxuICAgICAgbmV3Q2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBuZXdDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgLy8gUGF0Y2ggSnBlZyBkZWZhdWx0IGJsYWNrIGJhY2tncm91bmQgdG8gd2hpdGVcbiAgICAgIGlmIChmb3JtYXQgPT09ICdqcGVnJykge1xuICAgICAgICBuZXdDb250ZXh0LmZpbGxTdHlsZSA9ICcjZmZmZmZmJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAnIzAwMDAwMCc7XG4gICAgICB9XG4gICAgICAvLyBJZiBhIHRpdGxlIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAodGl0bGUgIT09ICcnKSB7XG4gICAgICAgIC8vIFNldCBmb250IGZvciB0aXRsZVxuICAgICAgICAvLyBBZGp1c3QgYWNjb3JkaW5nIHRvIHRpdGxlIGxlbmd0aFxuICAgICAgICBuZXdDb250ZXh0LmZvbnQgPSAnMjZweCBDYWxpYnJpJztcbiAgICAgICAgcG9zaXRpb25IQ2FudmFzID0gMzA7XG4gICAgICAgIG5ld0NvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQodGl0bGUsIHdpZHRoIC8gMiwgMjAsIHdpZHRoICogMC45KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJ0aXRsZSAhPT0gJycpIHtcbiAgICAgICAgLy8gU2V0IGZvbnQgZm9yIHN1YnRpdGxlXG4gICAgICAgIC8vIEFkanVzdCBhY2NvcmRpbmcgdG8gdGl0bGUgbGVuZ3RoXG4gICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICcyNnB4IENhbGlicmknO1xuICAgICAgICBwb3NpdGlvbkhDYW52YXMgPSA2MDtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChzdWJ0aXRsZSwgd2lkdGggLyAyLCA1MCwgd2lkdGggKiAwLjkpO1xuICAgICAgfVxuICAgICAgLy8gU2V0IGZvbnQgZm9yIG5leHQgc2VjdGlvblxuICAgICAgbmV3Q29udGV4dC5mb250ID0gJzIwcHggQ2FsaWJyaSc7XG4gICAgICAvLyBJZiBwcm9qZWN0aW9uIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAocHJvamVjdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgcHJvalRleHQgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5wcmludEZvcm0ucHJvamVjdGlvbicpO1xuICAgICAgICBuZXdDb250ZXh0LnRleHRBbGlnbiA9ICdzdGFydCc7XG4gICAgICAgIG5ld0NvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgcHJvalRleHQgKyAnOiAnICsgbWFwLnByb2plY3Rpb24sXG4gICAgICAgICAgcG9zaXRpb25XUHJvalNjYWxlLFxuICAgICAgICAgIHBvc2l0aW9uSFByb2pTY2FsZVxuICAgICAgICApO1xuICAgICAgICBwb3NpdGlvbldQcm9qU2NhbGUgKz0gMjAwOyAvLyBXaWR0aCBwb3NpdGlvbiBjaGFuZ2UgZm9yIHNjYWxlIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHNjYWxlIG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAoc2NhbGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlVGV4dCA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLnByaW50Rm9ybS5zY2FsZScpO1xuICAgICAgICBjb25zdCBtYXBTY2FsZSA9IG1hcC52aWV3Q29udHJvbGxlci5nZXRTY2FsZShyZXNvbHV0aW9uKTtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnc3RhcnQnO1xuICAgICAgICBuZXdDb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgIHNjYWxlVGV4dCArICc6IH4gMSAvICcgKyBmb3JtYXRTY2FsZShtYXBTY2FsZSksXG4gICAgICAgICAgcG9zaXRpb25XUHJvalNjYWxlLFxuICAgICAgICAgIHBvc2l0aW9uSFByb2pTY2FsZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gSWYgYSBjb21tZW50IG5lZWQgdG8gYmUgYWRkZWQgdG8gY2FudmFzXG4gICAgICBpZiAoY29tbWVudCAhPT0gJycpIHtcbiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgLy8gSWYgb25seSBvbmUgbGluZSwgbm8gbmVlZCB0byBtdWx0aWxpbmUgdGhlIGNvbW1lbnRcbiAgICAgICAgaWYgKGNvbW1lbnROYkxpbmUgPT09IDEpIHtcbiAgICAgICAgICBuZXdDb250ZXh0LmZpbGxUZXh0KGNvbW1lbnQsIHdpZHRoIC8gMiwgcG9zaXRpb25IQ29tbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VwYXJhdGUgdGhlIHNldGVuc2VzIHRvIGJlIGFwcHJveC4gdGhlIHNhbWUgbGVuZ3RoXG4gICAgICAgICAgY29uc3QgbmJDb21tZW50Q2hhciA9IGNvbW1lbnQubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IENvbW1lbnRMZW5ndGhUb0N1dCA9IE1hdGguZmxvb3IobmJDb21tZW50Q2hhciAvIGNvbW1lbnROYkxpbmUpO1xuICAgICAgICAgIGxldCBjb21tZW50Q3VycmVudExpbmUgPSAnJztcbiAgICAgICAgICBsZXQgcG9zaXRpb25GaXJzdEN1dENoYXIgPSAwO1xuICAgICAgICAgIGxldCBwb3NpdGlvbkxhc3RCbGFuaztcbiAgICAgICAgICAvLyBMb29wIGZvciB0aGUgbnVtYmVyIG9mIGxpbmUgY2FsY3VsYXRlZFxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWVudE5iTGluZTsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGb3IgYWxsIGxpbmUgZXhjZXB0IGxhc3RcbiAgICAgICAgICAgIGlmIChjb21tZW50TmJMaW5lIC0gMSA+IGkpIHtcbiAgICAgICAgICAgICAgLy8gR2V0IGNvbW1lbnQgY3VycmVudCBsaW5lIHRvIGZpbmQgdGhlIHJpZ2h0IHBsYWNlIHR1IGN1dCBjb21tZW50XG4gICAgICAgICAgICAgIGNvbW1lbnRDdXJyZW50TGluZSA9IGNvbW1lbnQuc3Vic3RyKFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uRmlyc3RDdXRDaGFyLFxuICAgICAgICAgICAgICAgIENvbW1lbnRMZW5ndGhUb0N1dFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBDdXQgdGhlIHNldGVuY2UgYXQgYmxhbmtcbiAgICAgICAgICAgICAgcG9zaXRpb25MYXN0QmxhbmsgPSBjb21tZW50Q3VycmVudExpbmUubGFzdEluZGV4T2YoJyAnKTtcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICAgICAgICBjb21tZW50Q3VycmVudExpbmUuc3Vic3RyKDAsIHBvc2l0aW9uTGFzdEJsYW5rKSxcbiAgICAgICAgICAgICAgICB3aWR0aCAvIDIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBwb3NpdGlvbkZpcnN0Q3V0Q2hhciArPSBwb3NpdGlvbkxhc3RCbGFuaztcbiAgICAgICAgICAgICAgLy8gR28gdG8gbmV4dCBsaW5lIGZvciBpbnNlcnRpb25cbiAgICAgICAgICAgICAgcG9zaXRpb25IQ29tbWVudCArPSAyMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIERvbid0IGN1dCBsYXN0IHBhcnRcbiAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICAgICAgICBjb21tZW50LnN1YnN0cihwb3NpdGlvbkZpcnN0Q3V0Q2hhciksXG4gICAgICAgICAgICAgICAgd2lkdGggLyAyLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSENvbW1lbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFkZCBtYXAgdG8gbmV3IGNhbnZhc1xuICAgICAgbmV3Q29udGV4dC5kcmF3SW1hZ2Uob2xkQ2FudmFzLCAwLCBwb3NpdGlvbkhDYW52YXMpO1xuXG4gICAgICBsZXQgc3RhdHVzID0gU3ViamVjdFN0YXR1cy5Eb25lO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gU2F2ZSB0aGUgY2FudmFzIGFzIGZpbGVcbiAgICAgICAgaWYgKCFkb1ppcEZpbGUpIHtcbiAgICAgICAgICB0aGlzLnNhdmVDYW52YXNJbWFnZUFzRmlsZShuZXdDYW52YXMsICdtYXAnLCBmb3JtYXQpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgICAvLyBBZGQgdGhlIGNhbnZhcyB0byB6aXBcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FudmFGaWxlVG9aaXAoXG4gICAgICAgICAgICBuZXdDYW52YXMsXG4gICAgICAgICAgICAnbWFwJyArIG1hcC5wcm9qZWN0aW9uLnJlcGxhY2UoJzonLCAnXycpICsgJy4nICsgZm9ybWF0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBZGQgdGhlIGNhbnZhcyB0byB6aXBcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlQ2FudmFGaWxlVG9aaXAobmV3Q2FudmFzLCAnbWFwJyArICcuJyArIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzdGF0dXMgPSBTdWJqZWN0U3RhdHVzLkVycm9yO1xuICAgICAgfVxuXG4gICAgICBzdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgaWYgKGZvcm1hdC50b0xvd2VyQ2FzZSgpID09PSAndGlmZicpIHtcbiAgICAgICAgY29uc3QgdGl3Q29udGVudCA9IHRoaXMuZ2V0V29ybGRGaWxlSW5mb3JtYXRpb24obWFwKTtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0aXdDb250ZW50XSwge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgnXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWRvWmlwRmlsZSkge1xuICAgICAgICAgIC8vIHNhdmVBcyBhdXRvbWF0aWNseSByZXBsYWNlICc6JyBmb3IgJ18nXG4gICAgICAgICAgc2F2ZUFzKGJsb2IsICdtYXAnICsgbWFwLnByb2plY3Rpb24gKyAnLnRmdycpO1xuICAgICAgICAgIHRoaXMuc2F2ZUZpbGVQcm9jZXNzaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWRkIHRoZSBjYW52YXMgdG8gemlwXG4gICAgICAgICAgdGhpcy5hZGRGaWxlVG9aaXAoXG4gICAgICAgICAgICAnbWFwJyArIG1hcC5wcm9qZWN0aW9uLnJlcGxhY2UoJzonLCAnXycpICsgJy50ZncnLFxuICAgICAgICAgICAgYmxvYlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBtYXAub2wucmVuZGVyU3luYygpO1xuXG4gICAgcmV0dXJuIHN0YXR1cyQ7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1hcChtYXAsIHNpemUsIGV4dGVudCkge1xuICAgIG1hcC5vbC51cGRhdGVTaXplKCk7XG4gICAgbWFwLm9sLnJlbmRlclN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGRvY3VtZW50XG4gICAqIEBwYXJhbSAgZG9jIC0gRG9jdW1lbnQgdG8gc2F2ZVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVEb2MoZG9jOiBqc3BkZikge1xuICAgIGF3YWl0IGRvYy5zYXZlKCdtYXAucGRmJywgeyByZXR1cm5Qcm9taXNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgYmVzdCBJbWFnZSBzaXplIHRvIGZpdCBpbiBwZGZcbiAgICogQHBhcmFtIGRvYyAtIFBkZiBEb2N1bWVudFxuICAgKiBAcGFyYW0gY2FudmFzIC0gQ2FudmFzIG9mIGltYWdlXG4gICAqIEBwYXJhbSBtYXJnaW5zIC0gUGFnZSBtYXJnaW5zXG4gICAqL1xuICBwcml2YXRlIGdldEltYWdlU2l6ZVRvRml0UGRmKGRvYywgY2FudmFzLCBtYXJnaW5zKSB7XG4gICAgLy8gRGVmaW5lIHZhcmlhYmxlIHRvIGNhbGN1bGF0ZSBiZXN0IHNpemUgdG8gZml0IGluIG9uZSBwYWdlXG4gICAgY29uc3QgcGFnZUhlaWdodCA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSAobWFyZ2luc1swXSArIG1hcmdpbnNbMl0pO1xuICAgIGNvbnN0IHBhZ2VXaWR0aCA9XG4gICAgICBkb2MuaW50ZXJuYWwucGFnZVNpemUuZ2V0V2lkdGgoKSAtIChtYXJnaW5zWzFdICsgbWFyZ2luc1szXSk7XG4gICAgY29uc3QgY2FuSGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBjYW5XaWR0aCA9IGNhbnZhcy53aWR0aDtcbiAgICBjb25zdCBoZWlnaHRSYXRpbyA9IGNhbkhlaWdodCAvIHBhZ2VIZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGhSYXRpbyA9IGNhbldpZHRoIC8gcGFnZVdpZHRoO1xuICAgIGNvbnN0IG1heFJhdGlvID0gaGVpZ2h0UmF0aW8gPiB3aWR0aFJhdGlvID8gaGVpZ2h0UmF0aW8gOiB3aWR0aFJhdGlvO1xuICAgIGNvbnN0IGltZ0hlaWdoID0gbWF4UmF0aW8gPiAxID8gY2FuSGVpZ2h0IC8gbWF4UmF0aW8gOiBjYW5IZWlnaHQ7XG4gICAgY29uc3QgaW1nV2lkdGggPSBtYXhSYXRpbyA+IDEgPyBjYW5XaWR0aCAvIG1heFJhdGlvIDogY2FuV2lkdGg7XG5cbiAgICByZXR1cm4gW2ltZ1dpZHRoLCBpbWdIZWlnaF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd29ybGQgZmlsZSBpbmZvcm1hdGlvbiBmb3IgdGlmZlxuICAgKiBAcGFyYW0gIG1hcCAtIE1hcCBvZiB0aGUgYXBwXG4gICAqL1xuICBwcml2YXRlIGdldFdvcmxkRmlsZUluZm9ybWF0aW9uKG1hcCkge1xuICAgIGNvbnN0IGN1cnJlbnRSZXNvbHV0aW9uID0gbWFwLnZpZXdDb250cm9sbGVyLmdldFJlc29sdXRpb24oKTtcbiAgICBjb25zdCBjdXJyZW50RXh0ZW50ID0gbWFwLnZpZXdDb250cm9sbGVyLmdldEV4dGVudCgpOyAvLyBSZXR1cm4gW21pbngsIG1pbnksIG1heHgsIG1heHldXG4gICAgcmV0dXJuIFtcbiAgICAgIGN1cnJlbnRSZXNvbHV0aW9uLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAtY3VycmVudFJlc29sdXRpb24sXG4gICAgICBjdXJyZW50RXh0ZW50WzBdICsgY3VycmVudFJlc29sdXRpb24gLyAwLjUsXG4gICAgICBjdXJyZW50RXh0ZW50WzNdIC0gY3VycmVudFJlc29sdXRpb24gLyAwLjVcbiAgICBdLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgY2FudmFzIGltYWdlIGFzIGZpbGVcbiAgICogQHBhcmFtIGNhbnZhcyAtIENhbnZhcyB0byBzYXZlXG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgZmlsZVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gZmlsZSBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgc2F2ZUNhbnZhc0ltYWdlQXNGaWxlKGNhbnZhcywgbmFtZSwgZm9ybWF0KSB7XG4gICAgY29uc3QgYmxvYkZvcm1hdCA9ICdpbWFnZS8nICsgZm9ybWF0O1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICAvLyBJZiBuYXZpZ2F0b3IgaXMgSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xuICAgICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihjYW52YXMubXNUb0Jsb2IoKSwgbmFtZSArICcuJyArIGZvcm1hdCk7XG4gICAgICAgIHRoaXMuc2F2ZUZpbGVQcm9jZXNzaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICAgICAgLy8gZG93bmxvYWQgaW1hZ2VcbiAgICAgICAgICBzYXZlQXMoYmxvYiwgbmFtZSArICcuJyArIGZvcm1hdCk7XG4gICAgICAgICAgdGhhdC5zYXZlRmlsZVByb2Nlc3NpbmcoKTtcbiAgICAgICAgfSwgYmxvYkZvcm1hdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKFxuICAgICAgICB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgICAnaWdvLmdlby5wcmludEZvcm0uY29yc0Vycm9yTWVzc2FnZUJvZHknXG4gICAgICAgICksXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlSGVhZGVyJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZmlsZSB0byBhIHppcFxuICAgKiBAcGFyYW0gY2FudmFzIC0gRmlsZSB0byBhZGQgdG8gdGhlIHppcFxuICAgKiBAcGFyYW0gIG5hbWUgLU5hbWUgb2YgdGhlIGZpbGVvdmVydmlld1xuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNhbnZhRmlsZVRvWmlwKGNhbnZhcywgbmFtZSkge1xuICAgIGNvbnN0IGJsb2JGb3JtYXQgPSAnaW1hZ2UvJyArICdqcGVnJztcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICBpZiAoXG4gICAgICAhdGhpcy5oYXNPd25Qcm9wZXJ0eSgnemlwRmlsZScpIHx8XG4gICAgICB0eXBlb2YgdGhpcy56aXBGaWxlID09PSAndW5kZWZpbmVkJ1xuICAgICkge1xuICAgICAgdGhpcy56aXBGaWxlID0gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0RhdGFVUkwoKTsgLy8gSnVzdCB0byBtYWtlIHRoZSBjYXRjaCB0cmlnZ2VyIHdpaHRvdXQgdG9CbG9iIEVycm9yIHRocm93IG5vdCBjYXRjaGVkXG4gICAgICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHtcbiAgICAgICAgdGhpcy5hZGRGaWxlVG9aaXAobmFtZSwgY2FudmFzLm1zVG9CbG9iKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgICAgIHRoYXQuYWRkRmlsZVRvWmlwKG5hbWUsIGJsb2IpO1xuICAgICAgICB9LCBibG9iRm9ybWF0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICAgICdpZ28uZ2VvLnByaW50Rm9ybS5jb3JzRXJyb3JNZXNzYWdlQm9keSdcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgICAgJ2lnby5nZW8ucHJpbnRGb3JtLmNvcnNFcnJvck1lc3NhZ2VIZWFkZXInXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBmaWxlIHRvIHppcCwgaWYgYWxsIGZpbGUgYXJlIHppcHBlZCwgZG93bmxvYWRcbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlc1xuICAgKiBAcGFyYW0gYmxvYiAtIENvbnRhaW4gb2YgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRGaWxlVG9aaXAobmFtZSwgYmxvYikge1xuICAgIC8vIGFkZCBmaWxlIHRvIHppcFxuICAgIHRoaXMuemlwRmlsZS5maWxlKG5hbWUsIGJsb2IpO1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIERvd25sb2FkIHppcCBmaWxlXG4gICAgICB0aGlzLmdldFppcEZpbGUoKTtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUZpbGVQcm9jZXNzaW5nKCkge1xuICAgIHRoaXMubmJGaWxlVG9Qcm9jZXNzLS07XG5cbiAgICAvLyBJZiBhbGwgZmlsZXMgYXJlIHByb2NjZXNzZWRcbiAgICBpZiAodGhpcy5uYkZpbGVUb1Byb2Nlc3MgPT09IDApIHtcbiAgICAgIC8vIFN0b3AgbG9hZGluZ1xuICAgICAgdGhpcy5hY3Rpdml0eVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmFjdGl2aXR5SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHppcHBlZCBmaWxlXG4gICAqIEByZXR1cm4gUmV0dW4gYSB6aXAgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRaaXBGaWxlKCkge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoaXMuemlwRmlsZS5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pLnRoZW4oKGJsb2IpID0+IHtcbiAgICAgIC8vIDEpIGdlbmVyYXRlIHRoZSB6aXAgZmlsZVxuICAgICAgc2F2ZUFzKGJsb2IsICdtYXAuemlwJyk7XG4gICAgICBkZWxldGUgdGhhdC56aXBGaWxlO1xuICAgIH0pO1xuICB9XG59XG4iXX0=