geonetwork-ui 2.3.0-dev.f736344f → 2.3.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 (593) hide show
  1. package/esm2022/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/index.mjs +5 -5
  3. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +14 -0
  4. package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +15 -0
  5. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +3 -3
  6. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +52 -0
  7. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +8 -4
  8. package/esm2022/libs/api/metadata-converter/src/lib/gn4/index.mjs +4 -0
  9. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/index.mjs +2 -0
  10. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +123 -0
  11. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +116 -0
  12. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +138 -0
  13. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/index.mjs +2 -0
  14. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +244 -0
  15. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +76 -65
  16. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.mjs +18 -0
  17. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +14 -0
  18. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +48 -0
  19. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +18 -0
  20. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +64 -0
  21. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +89 -61
  22. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +76 -14
  23. package/esm2022/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.mjs +1 -1
  24. package/esm2022/libs/api/repository/src/lib/gn4/auth/gravatar.service.mjs +12 -1
  25. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +4 -4
  26. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +36 -3
  27. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +21 -7
  28. package/esm2022/libs/common/domain/src/lib/model/record/index.mjs +2 -1
  29. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  30. package/esm2022/libs/common/domain/src/lib/model/record/user-feedbacks.model.mjs +2 -0
  31. package/esm2022/libs/common/domain/src/lib/model/user/index.mjs +2 -0
  32. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  33. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +35 -7
  34. package/esm2022/libs/data-access/gn4/src/openapi/model/models.mjs +1 -2
  35. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +1 -1
  36. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +48 -3
  37. package/esm2022/libs/feature/editor/src/index.mjs +2 -2
  38. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +6 -2
  39. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.mjs +11 -0
  40. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.mjs +28 -0
  41. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  42. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.mjs +11 -0
  43. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  44. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.mjs +45 -0
  45. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.mjs +50 -0
  46. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +11 -0
  47. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +11 -0
  48. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +104 -0
  49. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +126 -0
  50. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.mjs +2 -0
  51. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +10 -0
  52. package/esm2022/libs/feature/editor/src/lib/components/record-form/record-form.component.mjs +29 -0
  53. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  54. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +10 -10
  55. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +23 -1
  56. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +1 -1
  57. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +8 -8
  58. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +6 -2
  59. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +3 -3
  60. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +125 -0
  61. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  62. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  63. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +7 -3
  64. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +12 -7
  65. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +2 -1
  66. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +100 -32
  67. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +18 -51
  68. package/esm2022/libs/feature/notifications/src/index.mjs +4 -0
  69. package/esm2022/libs/feature/notifications/src/lib/feature-notifications.module.mjs +18 -0
  70. package/esm2022/libs/feature/notifications/src/lib/notification.model.mjs +2 -0
  71. package/esm2022/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.mjs +49 -0
  72. package/esm2022/libs/feature/notifications/src/lib/notifications.service.mjs +29 -0
  73. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
  74. package/esm2022/libs/feature/record/src/lib/feature-record.module.mjs +4 -4
  75. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +22 -10
  76. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +22 -4
  77. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +37 -10
  78. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +52 -8
  79. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +50 -17
  80. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +18 -3
  81. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +2 -2
  82. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  83. package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +1 -1
  84. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +4 -4
  85. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +3 -3
  86. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +1 -1
  87. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  88. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +1 -1
  89. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +3 -3
  90. package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +1 -1
  91. package/esm2022/libs/ui/elements/src/index.mjs +16 -16
  92. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  93. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  94. package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +30 -0
  95. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +5 -5
  96. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  97. package/esm2022/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.mjs +45 -0
  98. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  99. package/esm2022/libs/ui/elements/src/lib/notification/notification.component.mjs +34 -0
  100. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +98 -36
  101. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +4 -3
  102. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +19 -15
  103. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +59 -0
  104. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +60 -0
  105. package/esm2022/libs/ui/inputs/src/index.mjs +16 -16
  106. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -1
  107. package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +4 -3
  108. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  109. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  110. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +19 -8
  111. package/esm2022/libs/ui/inputs/src/lib/files-drop/files-drop.directive.mjs +59 -0
  112. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +183 -0
  113. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  114. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +27 -4
  115. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +21 -3
  116. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +21 -31
  117. package/esm2022/libs/ui/layout/src/index.mjs +7 -5
  118. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  119. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  120. package/esm2022/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.mjs +18 -0
  121. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  122. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +3 -1
  123. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  124. package/esm2022/libs/util/app-config/src/lib/model.mjs +1 -1
  125. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  126. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  127. package/esm2022/libs/util/shared/src/lib/utils/bytes-convert.mjs +4 -0
  128. package/esm2022/libs/util/shared/src/lib/utils/image-resize.mjs +60 -0
  129. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +8 -6
  130. package/esm2022/translations/de.json +44 -0
  131. package/esm2022/translations/en.json +44 -0
  132. package/esm2022/translations/es.json +44 -0
  133. package/esm2022/translations/fr.json +44 -0
  134. package/esm2022/translations/it.json +44 -0
  135. package/esm2022/translations/nl.json +44 -0
  136. package/esm2022/translations/pt.json +44 -0
  137. package/fesm2022/geonetwork-ui.mjs +6088 -3676
  138. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  139. package/index.d.ts +1 -0
  140. package/index.d.ts.map +1 -1
  141. package/index.ts +1 -0
  142. package/libs/api/metadata-converter/src/index.d.ts +4 -4
  143. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  144. package/libs/api/metadata-converter/src/lib/{metadata-base.mapper.d.ts → base.converter.d.ts} +3 -3
  145. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -0
  146. package/libs/api/metadata-converter/src/lib/find-converter.d.ts +3 -0
  147. package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +1 -0
  148. package/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.d.ts → gn4.converter.d.ts} +5 -5
  149. package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +1 -0
  150. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  151. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +4 -0
  152. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +1 -0
  153. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +2 -0
  154. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +1 -0
  155. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +9 -0
  156. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -0
  157. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +20 -0
  158. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -0
  159. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +21 -0
  160. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -0
  161. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +2 -0
  162. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +1 -0
  163. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +11 -0
  164. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -0
  165. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +38 -7
  166. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  167. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +8 -0
  168. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +1 -0
  169. package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +1 -0
  170. package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +1 -0
  171. package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -0
  172. package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +1 -0
  173. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +40 -3
  174. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  175. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +14 -1
  176. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  177. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts +1 -0
  178. package/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.d.ts.map +1 -1
  179. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts +1 -0
  180. package/libs/api/repository/src/lib/gn4/auth/gravatar.service.d.ts.map +1 -1
  181. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
  182. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  183. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +6 -2
  184. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  185. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -6
  186. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  187. package/libs/common/domain/src/lib/model/record/index.d.ts +1 -0
  188. package/libs/common/domain/src/lib/model/record/index.d.ts.map +1 -1
  189. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +9 -7
  190. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  191. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts +15 -0
  192. package/libs/common/domain/src/lib/model/record/user-feedbacks.model.d.ts.map +1 -0
  193. package/libs/common/domain/src/lib/model/user/index.d.ts +2 -0
  194. package/libs/common/domain/src/lib/model/user/index.d.ts.map +1 -0
  195. package/libs/common/domain/src/lib/platform.service.interface.d.ts +3 -0
  196. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  197. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts +9 -5
  198. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  199. package/libs/data-access/gn4/src/openapi/model/models.d.ts +0 -1
  200. package/libs/data-access/gn4/src/openapi/model/models.d.ts.map +1 -1
  201. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +4 -1
  202. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  203. package/libs/feature/editor/src/index.d.ts +1 -1
  204. package/libs/feature/editor/src/index.d.ts.map +1 -1
  205. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +8 -5
  206. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -1
  207. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.d.ts +1 -1
  208. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-array/form-field-array.component.d.ts.map +1 -0
  209. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.d.ts +1 -1
  210. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-file/form-field-file.component.d.ts.map +1 -0
  211. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  212. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  213. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.d.ts +1 -1
  214. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.d.ts.map +1 -0
  215. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  216. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
  217. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts +16 -0
  218. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.d.ts.map +1 -0
  219. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.d.ts +2 -2
  220. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.d.ts.map +1 -0
  221. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts +1 -1
  222. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -0
  223. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts +1 -1
  224. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +1 -0
  225. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +21 -0
  226. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts.map +1 -0
  227. package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.component.d.ts +13 -4
  228. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -0
  229. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.model.d.ts.map +1 -0
  230. package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -0
  231. package/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.d.ts +3 -3
  232. package/libs/feature/editor/src/lib/components/record-form/record-form.component.d.ts.map +1 -0
  233. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +1 -1
  234. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  235. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  236. package/libs/feature/editor/src/lib/models/fields.model.d.ts +1 -1
  237. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  238. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
  239. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +28 -0
  240. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -0
  241. package/libs/feature/map/src/lib/feature-map.module.d.ts +2 -1
  242. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  243. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +2 -0
  244. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
  245. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +17 -5
  246. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  247. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -1
  248. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  249. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +2 -3
  250. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  251. package/libs/feature/notifications/src/index.d.ts +4 -0
  252. package/libs/feature/notifications/src/index.d.ts.map +1 -0
  253. package/libs/feature/notifications/src/lib/feature-notifications.module.d.ts +7 -0
  254. package/libs/feature/notifications/src/lib/feature-notifications.module.d.ts.map +1 -0
  255. package/libs/feature/notifications/src/lib/notification.model.d.ts +7 -0
  256. package/libs/feature/notifications/src/lib/notification.model.d.ts.map +1 -0
  257. package/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.d.ts +12 -0
  258. package/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.d.ts.map +1 -0
  259. package/libs/feature/notifications/src/lib/notifications.service.d.ts +15 -0
  260. package/libs/feature/notifications/src/lib/notifications.service.d.ts.map +1 -0
  261. package/libs/feature/record/src/lib/feature-record.module.d.ts.map +1 -1
  262. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +2 -2
  263. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  264. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +40 -6
  265. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  266. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +24 -4
  267. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  268. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +18 -5
  269. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  270. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +8 -5
  271. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  272. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +12 -9
  273. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  274. package/libs/feature/search/src/index.d.ts +1 -0
  275. package/libs/feature/search/src/index.d.ts.map +1 -1
  276. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  277. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  278. package/libs/ui/elements/src/index.d.ts +15 -15
  279. package/libs/ui/elements/src/index.d.ts.map +1 -1
  280. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  281. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  282. package/libs/ui/elements/src/lib/error/error.component.d.ts +16 -0
  283. package/libs/ui/elements/src/lib/error/error.component.d.ts.map +1 -0
  284. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  285. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  286. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts +13 -0
  287. package/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.d.ts.map +1 -0
  288. package/libs/ui/elements/src/lib/notification/notification.component.d.ts +13 -0
  289. package/libs/ui/elements/src/lib/notification/notification.component.d.ts.map +1 -0
  290. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +24 -4
  291. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  292. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +1 -1
  293. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  294. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -28
  295. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  296. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +11 -0
  297. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +1 -0
  298. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +21 -0
  299. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -0
  300. package/libs/ui/inputs/src/index.d.ts +15 -15
  301. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  302. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  303. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +1 -1
  304. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
  305. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  306. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  307. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  308. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  309. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +2 -1
  310. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  311. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts +14 -0
  312. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts.map +1 -0
  313. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +44 -0
  314. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -0
  315. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  316. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  317. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +7 -1
  318. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  319. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +5 -1
  320. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  321. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -42
  322. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  323. package/libs/ui/layout/src/index.d.ts +6 -4
  324. package/libs/ui/layout/src/index.d.ts.map +1 -1
  325. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  326. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  327. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  328. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  329. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts +8 -0
  330. package/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.d.ts.map +1 -0
  331. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  332. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  333. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  334. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  335. package/libs/util/app-config/src/lib/model.d.ts +1 -0
  336. package/libs/util/app-config/src/lib/model.d.ts.map +1 -1
  337. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  338. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  339. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts +2 -0
  340. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts.map +1 -0
  341. package/libs/util/shared/src/lib/utils/image-resize.d.ts +3 -0
  342. package/libs/util/shared/src/lib/utils/image-resize.d.ts.map +1 -0
  343. package/libs/util/shared/src/lib/utils/index.d.ts +7 -5
  344. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  345. package/package.json +2 -2
  346. package/src/libs/api/metadata-converter/src/index.ts +4 -4
  347. package/src/libs/api/metadata-converter/src/lib/{metadata-base.mapper.ts → base.converter.ts} +2 -2
  348. package/src/libs/api/metadata-converter/src/lib/find-converter.ts +16 -0
  349. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +41 -6
  350. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +11 -4
  351. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +33 -7
  352. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +580 -0
  353. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
  354. package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.ts → gn4.converter.ts} +2 -2
  355. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +9 -3
  356. package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +3 -0
  357. package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +1 -0
  358. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +176 -0
  359. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +329 -0
  360. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +513 -0
  361. package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +1 -0
  362. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +331 -0
  363. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +185 -94
  364. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +20 -0
  365. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +246 -111
  366. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +84 -16
  367. package/src/libs/api/repository/src/lib/gn4/auth/avatar.service.interface.ts +1 -0
  368. package/src/libs/api/repository/src/lib/gn4/auth/gravatar.service.ts +12 -1
  369. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
  370. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +51 -1
  371. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +40 -7
  372. package/src/libs/common/domain/src/lib/model/record/index.ts +1 -0
  373. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +12 -7
  374. package/src/libs/common/domain/src/lib/model/record/user-feedbacks.model.ts +15 -0
  375. package/src/libs/common/domain/src/lib/platform.service.interface.ts +3 -0
  376. package/src/libs/common/fixtures/src/index.ts +8 -6
  377. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  378. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +11 -3
  379. package/src/libs/common/fixtures/src/lib/user-feedbacks.fixtures.ts +83 -0
  380. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +43 -12
  381. package/src/libs/data-access/gn4/src/openapi/model/models.ts +0 -1
  382. package/src/libs/data-access/gn4/src/spec.yaml +1 -1
  383. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +66 -2
  384. package/src/libs/feature/editor/src/index.ts +1 -1
  385. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +8 -1
  386. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +8 -0
  387. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +70 -0
  388. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.ts +1 -0
  389. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.ts +4 -1
  390. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  391. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  392. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.ts +1 -0
  393. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  394. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  395. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.html +20 -0
  396. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.ts +44 -0
  397. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.ts +4 -1
  398. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +1 -0
  399. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-temporal-extent/form-field-temporal-extent.component.css +0 -0
  400. package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.ts +1 -0
  401. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +0 -0
  402. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +14 -0
  403. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +143 -0
  404. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.css +0 -0
  405. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +97 -0
  406. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +142 -0
  407. package/src/libs/feature/editor/src/lib/components/record-form/record-form.component.css +0 -0
  408. package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.html +1 -0
  409. package/src/libs/feature/editor/src/lib/{record-form → components/record-form}/record-form.component.ts +4 -4
  410. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +9 -9
  411. package/src/libs/feature/editor/src/lib/fields.config.ts +22 -0
  412. package/src/libs/feature/editor/src/lib/models/fields.model.ts +1 -1
  413. package/src/libs/feature/editor/src/lib/services/editor.service.ts +27 -16
  414. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +5 -1
  415. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +1 -1
  416. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  417. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +50 -0
  418. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +135 -0
  419. package/src/libs/feature/map/src/lib/feature-map.module.ts +2 -0
  420. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +8 -0
  421. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +5 -0
  422. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +17 -3
  423. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +108 -40
  424. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +23 -63
  425. package/src/libs/feature/notifications/src/index.ts +3 -0
  426. package/src/libs/feature/notifications/src/lib/feature-notifications.module.ts +10 -0
  427. package/src/libs/feature/notifications/src/lib/notification.model.ts +6 -0
  428. package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.css +0 -0
  429. package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.html +17 -0
  430. package/src/libs/feature/notifications/src/lib/notifications-container/notifications-container.component.ts +44 -0
  431. package/src/libs/feature/notifications/src/lib/notifications.service.ts +27 -0
  432. package/src/libs/feature/record/src/lib/feature-record.module.ts +5 -2
  433. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +22 -10
  434. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +51 -6
  435. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +82 -7
  436. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +86 -9
  437. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +79 -24
  438. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +40 -10
  439. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +2 -2
  440. package/src/libs/feature/search/src/index.ts +1 -0
  441. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +4 -4
  442. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +3 -3
  443. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  444. package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.html +5 -5
  445. package/src/libs/ui/elements/src/index.ts +15 -15
  446. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  447. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  448. package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.html → error/error.component.html} +18 -3
  449. package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.ts → error/error.component.ts} +5 -4
  450. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +1 -1
  451. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  452. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  453. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +0 -5
  454. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +0 -21
  455. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +1 -14
  456. package/src/libs/ui/elements/src/lib/notification/notification.component.css +0 -0
  457. package/src/libs/ui/elements/src/lib/notification/notification.component.html +52 -0
  458. package/src/libs/ui/elements/src/lib/notification/notification.component.ts +31 -0
  459. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +27 -11
  460. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +125 -30
  461. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +5 -3
  462. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +9 -7
  463. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +54 -0
  464. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.css +0 -0
  465. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +75 -0
  466. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +62 -0
  467. package/src/libs/ui/inputs/src/index.ts +15 -15
  468. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -1
  469. package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -0
  470. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  471. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  472. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  473. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  474. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -0
  475. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +14 -0
  476. package/src/libs/ui/inputs/src/lib/files-drop/files-drop.directive.ts +45 -0
  477. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.css +0 -0
  478. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +146 -0
  479. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +193 -0
  480. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  481. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  482. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  483. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.html +2 -1
  484. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +29 -0
  485. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +2 -1
  486. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +17 -1
  487. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +6 -22
  488. package/src/libs/ui/layout/src/index.ts +6 -4
  489. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  490. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  491. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  492. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  493. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  494. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  495. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.css +0 -0
  496. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.html +18 -0
  497. package/src/libs/ui/layout/src/lib/form-field-wrapper/form-field-wrapper.component.ts +16 -0
  498. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  499. package/src/libs/util/app-config/src/lib/app-config.ts +2 -0
  500. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  501. package/src/libs/util/app-config/src/lib/model.ts +1 -0
  502. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  503. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  504. package/src/libs/util/shared/src/lib/utils/bytes-convert.ts +3 -0
  505. package/src/libs/util/shared/src/lib/utils/image-resize.ts +72 -0
  506. package/src/libs/util/shared/src/lib/utils/index.ts +7 -5
  507. package/tailwind.base.css +36 -0
  508. package/translations/de.json +44 -0
  509. package/translations/en.json +44 -0
  510. package/translations/es.json +44 -0
  511. package/translations/fr.json +44 -0
  512. package/translations/it.json +44 -0
  513. package/translations/nl.json +44 -0
  514. package/translations/pt.json +44 -0
  515. package/translations/sk.json +44 -0
  516. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +0 -52
  517. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +0 -14
  518. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +0 -48
  519. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +0 -18
  520. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +0 -64
  521. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +0 -130
  522. package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +0 -14
  523. package/esm2022/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.mjs +0 -13
  524. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +0 -30
  525. package/esm2022/libs/ui/elements/src/lib/search-results-error/search-results-error.component.mjs +0 -29
  526. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.mjs +0 -11
  527. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.mjs +0 -27
  528. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.mjs +0 -11
  529. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.mjs +0 -27
  530. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.mjs +0 -49
  531. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +0 -11
  532. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.mjs +0 -11
  533. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.component.mjs +0 -76
  534. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.model.mjs +0 -2
  535. package/esm2022/libs/ui/inputs/src/lib/form-field/index.mjs +0 -10
  536. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +0 -1
  537. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +0 -1
  538. package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +0 -1
  539. package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +0 -1
  540. package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +0 -1
  541. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +0 -4
  542. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +0 -1
  543. package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +0 -1
  544. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts +0 -18
  545. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts.map +0 -1
  546. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +0 -1
  547. package/libs/ui/elements/src/lib/search-results-error/search-results-error.component.d.ts +0 -15
  548. package/libs/ui/elements/src/lib/search-results-error/search-results-error.component.d.ts.map +0 -1
  549. package/libs/ui/inputs/src/lib/form-field/form-field-array/form-field-array.component.d.ts.map +0 -1
  550. package/libs/ui/inputs/src/lib/form-field/form-field-file/form-field-file.component.d.ts.map +0 -1
  551. package/libs/ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.d.ts.map +0 -1
  552. package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts +0 -11
  553. package/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.d.ts.map +0 -1
  554. package/libs/ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.d.ts.map +0 -1
  555. package/libs/ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +0 -1
  556. package/libs/ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.d.ts.map +0 -1
  557. package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +0 -1
  558. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +0 -1
  559. package/libs/ui/inputs/src/lib/form-field/index.d.ts.map +0 -1
  560. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +0 -196
  561. package/src/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.ts +0 -18
  562. package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.html +0 -11
  563. package/src/libs/ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.ts +0 -15
  564. package/src/libs/ui/inputs/src/lib/form-field/form-field.component.html +0 -68
  565. package/src/libs/ui/inputs/src/lib/form-field/form-field.component.ts +0 -80
  566. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.d.ts +0 -0
  567. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.d.ts +0 -0
  568. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.d.ts +0 -0
  569. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.d.ts +0 -0
  570. /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.d.ts +0 -0
  571. /package/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.d.ts +0 -0
  572. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.ts +0 -0
  573. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.ts +0 -0
  574. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.ts +0 -0
  575. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.ts +0 -0
  576. /package/src/libs/feature/editor/src/lib/{record-form/record-form.component.css → components/overview-upload/overview-upload.component.css} +0 -0
  577. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.css +0 -0
  578. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-array/form-field-array.component.html +0 -0
  579. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.css +0 -0
  580. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-file/form-field-file.component.html +0 -0
  581. /package/src/libs/{ui/inputs/src/lib/form-field/form-field-object/form-field-object.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css} +0 -0
  582. /package/src/libs/{ui/inputs/src/lib/form-field/form-field-rich/form-field-rich.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-object/form-field-object.component.css} +0 -0
  583. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-object/form-field-object.component.html +0 -0
  584. /package/src/libs/{ui/inputs/src/lib/form-field/form-field-simple/form-field-simple.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css} +0 -0
  585. /package/src/libs/{ui/inputs/src/lib/form-field/form-field-spatial-extent/form-field-spatial-extent.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-rich/form-field-rich.component.css} +0 -0
  586. /package/src/libs/{ui/inputs/src/lib/form-field/form-field-temporal-extent/form-field-temporal-extent.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-simple/form-field-simple.component.css} +0 -0
  587. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-simple/form-field-simple.component.html +0 -0
  588. /package/src/libs/{ui/inputs/src/lib/form-field/form-field.component.css → feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.css} +0 -0
  589. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +0 -0
  590. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field-temporal-extent/form-field-temporal-extent.component.html +0 -0
  591. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/form-field.model.ts +0 -0
  592. /package/src/libs/{ui/inputs/src/lib → feature/editor/src/lib/components/record-form}/form-field/index.ts +0 -0
  593. /package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.css → error/error.component.css} +0 -0
@@ -1,17 +1,18 @@
1
- import { getStatusFromStatusCode } from './codelists/status.mapper';
2
- import { getUpdateFrequencyFromFrequencyCode } from './codelists/update-frequency.mapper';
3
- import { findChildElement, findChildrenElement, findNestedElement, findNestedElements, findParent, readAttribute, readText, } from '../xml-utils';
4
- import { combine, fallback, filterArray, flattenArray, getAtIndex, map, mapArray, pipe, } from '../function-utils';
5
- import { getRoleFromRoleCode } from './codelists/role.mapper';
6
1
  import { matchMimeType, matchProtocol } from '../common/distribution.mapper';
7
- import { getKeywordTypeFromKeywordTypeCode } from './codelists/keyword.mapper';
8
- function extractCharacterString() {
2
+ import { combine, fallback, filterArray, flattenArray, getAtIndex, map, mapArray, pipe, } from '../function-utils';
3
+ import { findChildElement, findChildrenElement, findNestedElement, findNestedElements, findParent, readAttribute, readText, } from '../xml-utils';
4
+ import { fullNameToParts } from './utils/individual-name';
5
+ import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper';
6
+ import { getRoleFromRoleCode } from './utils/role.mapper';
7
+ import { getStatusFromStatusCode } from './utils/status.mapper';
8
+ import { getUpdateFrequencyFromFrequencyCode } from './utils/update-frequency.mapper';
9
+ export function extractCharacterString() {
9
10
  return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
10
11
  }
11
- function extractDateTime() {
12
+ export function extractDateTime() {
12
13
  return pipe(fallback(findChildElement('gco:DateTime', false), findChildElement('gco:Date', false)), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)));
13
14
  }
14
- function extractUrl() {
15
+ export function extractUrl() {
15
16
  const getUrl = pipe(findChildElement('gmd:URL', false), readText());
16
17
  const getCharacterString = pipe(findChildElement('gco:CharacterString', false), readText());
17
18
  const getAnchor = pipe(findChildElement('gmx:Anchor', false), readAttribute('xlink:href'));
@@ -24,15 +25,15 @@ function extractUrl() {
24
25
  }
25
26
  }));
26
27
  }
27
- function extractMandatoryUrl() {
28
+ export function extractMandatoryUrl() {
28
29
  return fallback(extractUrl(), () => new URL('http://missing'));
29
30
  }
30
31
  // from gmd:role
31
- function extractRole() {
32
+ export function extractRole() {
32
33
  return pipe(findChildElement('gmd:CI_RoleCode'), readAttribute('codeListValue'), map(getRoleFromRoleCode));
33
34
  }
34
35
  // from gmd:CI_ResponsibleParty
35
- function extractOrganization() {
36
+ export function extractOrganization() {
36
37
  const getUrl = pipe(findNestedElements('gmd:contactInfo', 'gmd:CI_Contact', 'gmd:onlineResource', 'gmd:CI_OnlineResource', 'gmd:linkage'), getAtIndex(0), extractUrl());
37
38
  return pipe(combine(pipe(findChildElement('gmd:organisationName', false), extractCharacterString()), getUrl), map(([name, website]) => ({
38
39
  name,
@@ -40,63 +41,67 @@ function extractOrganization() {
40
41
  })));
41
42
  }
42
43
  // from gmd:CI_ResponsibleParty
43
- function extractIndividuals() {
44
+ export function extractIndividual() {
44
45
  const getRole = pipe(findChildElement('gmd:role'), extractRole());
45
46
  const getPosition = pipe(findChildElement('gmd:positionName'), extractCharacterString());
46
47
  const getNameParts = pipe(findChildElement('gmd:individualName'), extractCharacterString(), map((fullName) => {
47
48
  if (!fullName)
48
49
  return [];
49
- const parts = fullName.split(/\s+/);
50
- if (!parts.length)
51
- return [fullName, null];
52
- const first = parts.shift();
53
- return [first, parts.join(' ')];
50
+ return fullNameToParts(fullName);
54
51
  }));
55
52
  const getOrganization = extractOrganization();
56
- const getEmail = pipe(findChildElement('gmd:electronicMailAddress'), extractCharacterString(), map((email) => (email === null ? 'missing@missing.com' : email)));
57
- return pipe(combine(getRole, getPosition, getNameParts, getOrganization, pipe(findChildrenElement('gmd:contactInfo'), mapArray(getEmail))), map(([role, position, [firstName, lastName], organization, emails]) => emails.map((email) => ({
53
+ const getContactRoot = findNestedElement('gmd:contactInfo', 'gmd:CI_Contact');
54
+ const getEmail = pipe(getContactRoot, findChildElement('gmd:electronicMailAddress'), extractCharacterString(), map((email) => (email === null ? 'missing@missing.com' : email)));
55
+ const getAddress = pipe(getContactRoot, findNestedElement('gmd:address', 'gmd:CI_Address'), combine(pipe(findChildElement('gmd:deliveryPoint', false), extractCharacterString()), pipe(findChildElement('gmd:city', false), extractCharacterString()), pipe(findChildElement('gmd:postalCode', false), extractCharacterString()), pipe(findChildElement('gmd:country', false), extractCharacterString())), map((parts) => parts.filter((p) => !!p).join(', ')));
56
+ const getPhone = pipe(getContactRoot, findNestedElement('gmd:phone', 'gmd:CI_Telephone', 'gmd:voice'), extractCharacterString());
57
+ return pipe(combine(getRole, getPosition, getNameParts, getOrganization, getEmail, getAddress, getPhone), map(([role, position, [firstName, lastName], organization, email, address, phone,]) => ({
58
58
  email,
59
59
  role,
60
60
  organization,
61
61
  ...(position && { position }),
62
62
  ...(firstName && { firstName }),
63
63
  ...(lastName && { lastName }),
64
- }))));
64
+ ...(address && { address }),
65
+ ...(phone && { phone }),
66
+ })));
65
67
  }
66
- function extractStatus() {
68
+ export function extractStatus() {
67
69
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
68
70
  }
69
71
  // from gmd:resourceConstraints
70
- function extractLegalConstraints() {
72
+ export function extractLegalConstraints() {
71
73
  return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
72
74
  ...(url && { url }),
73
75
  text,
74
76
  })));
75
77
  }
76
78
  // from gmd:resourceConstraints
77
- function extractSecurityConstraints() {
79
+ export function extractSecurityConstraints() {
78
80
  return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
79
81
  ...(url && { url }),
80
82
  text,
81
83
  })));
82
84
  }
83
85
  // from gmd:resourceConstraints
84
- function extractOtherConstraints() {
86
+ export function extractOtherConstraints() {
85
87
  return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
86
88
  ...(url && { url }),
87
89
  text,
88
90
  })));
89
91
  }
90
92
  // from gmd:resourceConstraints
91
- function extractLicenses() {
93
+ export function extractLicenses() {
92
94
  return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
93
95
  ...(url && { url }),
94
96
  text,
95
97
  })));
96
98
  }
97
- // from gmd:MD_Distribution
98
- function extractDatasetDistributions() {
99
- const getFormat = pipe(findParent('gmd:MD_Distribution'), findNestedElement('gmd:distributionFormat', 'gmd:MD_Format', 'gmd:name'), extractCharacterString(), map(matchMimeType));
99
+ const getMimeType = pipe(findParent('gmd:MD_Distribution'), findNestedElement('gmd:distributionFormat', 'gmd:MD_Format', 'gmd:name'), extractCharacterString(), map(matchMimeType));
100
+ /**
101
+ * Extract distributions from a MD_Distribution element
102
+ * @param getMimeTypeFn This function starts from a gmd:transferOptions element
103
+ */
104
+ export function extractDatasetDistributions(getMimeTypeFn) {
100
105
  const getUrl = pipe(findChildElement('gmd:linkage'), extractMandatoryUrl());
101
106
  const getProtocolStr = pipe(findChildElement('gmd:protocol'), extractCharacterString());
102
107
  const getProtocol = pipe(getProtocolStr, map(matchProtocol));
@@ -106,7 +111,7 @@ function extractDatasetDistributions() {
106
111
  /download/i.test(protocolStr)));
107
112
  const getName = pipe(findChildElement('gmd:name'), extractCharacterString());
108
113
  const getDescription = pipe(findChildElement('gmd:description'), extractCharacterString());
109
- return pipe(findNestedElements('gmd:transferOptions', 'gmd:MD_DigitalTransferOptions', 'gmd:onLine', 'gmd:CI_OnlineResource'), mapArray(combine(getIsService, getIsDownload, getProtocol, getUrl, getName, getDescription, getFormat)), mapArray(([isService, isDownload, protocol, url, name, description, format]) => {
114
+ return pipe(findNestedElements('gmd:transferOptions', 'gmd:MD_DigitalTransferOptions', 'gmd:onLine', 'gmd:CI_OnlineResource'), mapArray(combine(getIsService, getIsDownload, getProtocol, getUrl, getName, getDescription, getMimeTypeFn)), mapArray(([isService, isDownload, protocol, url, name, description, mimeType]) => {
110
115
  if (isService) {
111
116
  const hasIdentifier = protocol === 'wms' || protocol === 'wfs';
112
117
  return {
@@ -119,7 +124,6 @@ function extractDatasetDistributions() {
119
124
  };
120
125
  }
121
126
  else if (isDownload) {
122
- const mimeType = format;
123
127
  return {
124
128
  type: 'download',
125
129
  url: url,
@@ -138,7 +142,7 @@ function extractDatasetDistributions() {
138
142
  }
139
143
  }));
140
144
  }
141
- function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
145
+ export function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
142
146
  if (!isoPeriod)
143
147
  return null;
144
148
  const matches = isoPeriod.match(/^-?P(?:([0-9]+)Y)?(?:([0-9]+)M)?(?:([0-9]+)D)?T?(?:([0-9]+)H)?/);
@@ -175,7 +179,7 @@ function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
175
179
  else if (days <= 7) {
176
180
  return {
177
181
  per: 'week',
178
- updatedTimes: Math.round(7 / days),
182
+ updatedTimes: Math.round(7 / days - 0.0001), // this is to make sure that 'every 2 days' = '3 times per week'
179
183
  };
180
184
  }
181
185
  else if (days) {
@@ -193,26 +197,21 @@ function getUpdateFrequencyFromCustomPeriod(isoPeriod) {
193
197
  return null;
194
198
  }
195
199
  // from gmd:MD_MaintenanceInformation
196
- function extractUpdateFrequency() {
200
+ export function extractUpdateFrequency() {
197
201
  return fallback(pipe(findChildElement('gmd:MD_MaintenanceFrequencyCode'), readAttribute('codeListValue'), map(getUpdateFrequencyFromFrequencyCode)), pipe(findNestedElement('gmd:userDefinedMaintenanceFrequency', 'gts:TM_PeriodDuration'), readText(), map(getUpdateFrequencyFromCustomPeriod)), map(() => 'unknown'));
198
202
  }
199
203
  /**
200
204
  * Looks for srv:SV_ServiceIdentification or gmd:MD_DataIdentification element
201
- * depending on record type
205
+ * Will find the first one that exists, not reading the type of the record
206
+ * (this allows using this function in other similar schemas)
202
207
  */
203
- function findIdentification() {
204
- return (rootEl) => {
205
- const kind = readKind(rootEl);
206
- let eltName = 'gmd:MD_DataIdentification';
207
- if (kind === 'service')
208
- eltName = 'srv:SV_ServiceIdentification';
209
- return findNestedElement('gmd:identificationInfo', eltName)(rootEl);
210
- };
208
+ export function findIdentification() {
209
+ return pipe(findChildElement('gmd:identificationInfo', false), combine(findChildElement('gmd:MD_DataIdentification', false), findChildElement('srv:SV_ServiceIdentification', false)), filterArray((el) => el !== null), getAtIndex(0));
211
210
  }
212
- function extractCitationDate(type) {
211
+ export function extractIdentificationDate(type) {
213
212
  return pipe(findIdentification(), findNestedElements('gmd:citation', 'gmd:CI_Citation', 'gmd:date'), filterArray(pipe(findNestedElements('gmd:CI_Date', 'gmd:dateType', 'gmd:CI_DateTypeCode'), getAtIndex(0), readAttribute('codeListValue'), map((value) => value === type))), getAtIndex(0), findNestedElements('gmd:CI_Date', 'gmd:date'), getAtIndex(0), extractDateTime());
214
213
  }
215
- function getSpatialRepresentationFromCode(spatialRepresentationCode) {
214
+ export function getSpatialRepresentationFromCode(spatialRepresentationCode) {
216
215
  switch (spatialRepresentationCode) {
217
216
  case 'grid':
218
217
  case 'vector':
@@ -233,10 +232,16 @@ export function readKind(rootEl) {
233
232
  export function readOwnerOrganization(rootEl) {
234
233
  return pipe(findNestedElement('gmd:contact', 'gmd:CI_ResponsibleParty'), extractOrganization())(rootEl);
235
234
  }
236
- export function readRecordUpdated(rootEl) {
237
- return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
235
+ export function readResourceUpdated(rootEl) {
236
+ return extractIdentificationDate('revision')(rootEl);
238
237
  }
239
- export function readRecordPublished(rootEl) {
238
+ export function readResourceCreated(rootEl) {
239
+ return extractIdentificationDate('creation')(rootEl);
240
+ }
241
+ export function readResourcePublished(rootEl) {
242
+ return extractIdentificationDate('publication')(rootEl);
243
+ }
244
+ export function readRecordUpdated(rootEl) {
240
245
  return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl);
241
246
  }
242
247
  export function readTitle(rootEl) {
@@ -245,17 +250,14 @@ export function readTitle(rootEl) {
245
250
  export function readAbstract(rootEl) {
246
251
  return pipe(findIdentification(), findChildElement('gmd:abstract', false), extractCharacterString())(rootEl);
247
252
  }
248
- export function readDatasetCreated(rootEl) {
249
- return extractCitationDate('creation')(rootEl);
250
- }
251
- export function readDatasetUpdated(rootEl) {
252
- return extractCitationDate('revision')(rootEl);
253
- }
254
253
  export function readContacts(rootEl) {
255
- return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
254
+ return pipe(findChildrenElement('gmd:contact', false), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividual()))(rootEl);
255
+ }
256
+ export function readContactsForResource(rootEl) {
257
+ return pipe(findIdentification(), combine(findChildrenElement('gmd:contact', false), findChildrenElement('gmd:pointOfContact', false)), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividual()))(rootEl);
256
258
  }
257
259
  // from gmd:thesaurusName
258
- function readThesaurus(rootEl) {
260
+ export function readThesaurus(rootEl) {
259
261
  if (!rootEl)
260
262
  return null;
261
263
  const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
@@ -269,7 +271,7 @@ function readThesaurus(rootEl) {
269
271
  };
270
272
  }
271
273
  // from gmd:MD_Keywords
272
- function readKeywordGroup(rootEl) {
274
+ export function readKeywordGroup(rootEl) {
273
275
  const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
274
276
  const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
275
277
  return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
@@ -313,17 +315,11 @@ export function readOverviews(rootEl) {
313
315
  ...(description && { description }),
314
316
  })))(rootEl);
315
317
  }
316
- export function readSpatialExtents(rootEl) {
317
- return []; // TODO
318
- }
319
- export function readTemporalExtents(rootEl) {
320
- return []; // TODO
321
- }
322
318
  export function readLineage(rootEl) {
323
319
  return pipe(findNestedElement('gmd:dataQualityInfo', 'gmd:DQ_DataQuality', 'gmd:lineage', 'gmd:LI_Lineage', 'gmd:statement'), extractCharacterString())(rootEl);
324
320
  }
325
321
  export function readDistributions(rootEl) {
326
- return pipe(findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'), mapArray(extractDatasetDistributions()), flattenArray())(rootEl);
322
+ return pipe(findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'), mapArray(extractDatasetDistributions(getMimeType)), flattenArray())(rootEl);
327
323
  }
328
324
  export function readUpdateFrequency(rootEl) {
329
325
  return pipe(findIdentification(), findNestedElement('gmd:resourceMaintenance', 'gmd:MD_MaintenanceInformation'), extractUpdateFrequency(), map((updateFrequency) => updateFrequency || 'unknown'))(rootEl);
@@ -358,4 +354,19 @@ export function extractServiceOnlineResources() {
358
354
  export function readOnlineResources(rootEl) {
359
355
  return pipe(findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'), mapArray(extractServiceOnlineResources()), flattenArray())(rootEl);
360
356
  }
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1wYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL21ldGFkYXRhLWNvbnZlcnRlci9zcmMvbGliL2lzbzE5MTM5L3JlYWQtcGFydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ25FLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFBO0FBQ3pGLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLGFBQWEsRUFDYixRQUFRLEdBRVQsTUFBTSxjQUFjLENBQUE7QUFDckIsT0FBTyxFQUVMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEdBQ0wsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQzVFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRTlFLFNBQVMsc0JBQXNCO0lBQzdCLE9BQU8sSUFBSSxDQUNULFFBQVEsQ0FDTixnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsRUFDOUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUN0QyxFQUNELFFBQVEsRUFBRSxDQUNYLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3RCLE9BQU8sSUFBSSxDQUNULFFBQVEsQ0FDTixnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLEVBQ3ZDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxL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c0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uc3RyYWludCxcbiAgRGF0YXNldERpc3RyaWJ1dGlvbixcbiAgRGF0YXNldFNwYXRpYWxFeHRlbnQsXG4gIERhdGFzZXRUZW1wb3JhbEV4dGVudCxcbiAgR3JhcGhpY092ZXJ2aWV3LFxuICBJbmRpdmlkdWFsLFxuICBLZXl3b3JkLFxuICBLZXl3b3JkVGhlc2F1cnVzLFxuICBPcmdhbml6YXRpb24sXG4gIFJlY29yZEtpbmQsXG4gIFJlY29yZFN0YXR1cyxcbiAgUm9sZSxcbiAgU2VydmljZU9ubGluZVJlc291cmNlLFxuICBTcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlLFxuICBVcGRhdGVGcmVxdWVuY3ksXG4gIFVwZGF0ZUZyZXF1ZW5jeUN1c3RvbSxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vZG9tYWluL3NyYy9saWIvbW9kZWwvcmVjb3JkJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzRnJvbVN0YXR1c0NvZGUgfSBmcm9tICcuL2NvZGVsaXN0cy9zdGF0dXMubWFwcGVyJ1xuaW1wb3J0IHsgZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUZyZXF1ZW5jeUNvZGUgfSBmcm9tICcuL2NvZGVsaXN0cy91cGRhdGUtZnJlcXVlbmN5Lm1hcHBlcidcbmltcG9ydCB7XG4gIGZpbmRDaGlsZEVsZW1lbnQsXG4gIGZpbmRDaGlsZHJlbkVsZW1lbnQsXG4gIGZpbmROZXN0ZWRFbGVtZW50LFxuICBmaW5kTmVzdGVkRWxlbWVudHMsXG4gIGZpbmRQYXJlbnQsXG4gIHJlYWRBdHRyaWJ1dGUsXG4gIHJlYWRUZXh0LFxuICBYbWxFbGVtZW50LFxufSBmcm9tICcuLi94bWwtdXRpbHMnXG5pbXBvcnQge1xuICBDaGFpbmFibGVGdW5jdGlvbixcbiAgY29tYmluZSxcbiAgZmFsbGJhY2ssXG4gIGZpbHRlckFycmF5LFxuICBmbGF0dGVuQXJyYXksXG4gIGdldEF0SW5kZXgsXG4gIG1hcCxcbiAgbWFwQXJyYXksXG4gIHBpcGUsXG59IGZyb20gJy4uL2Z1bmN0aW9uLXV0aWxzJ1xuaW1wb3J0IHsgZ2V0Um9sZUZyb21Sb2xlQ29kZSB9IGZyb20gJy4vY29kZWxpc3RzL3JvbGUubWFwcGVyJ1xuaW1wb3J0IHsgbWF0Y2hNaW1lVHlwZSwgbWF0Y2hQcm90b2NvbCB9IGZyb20gJy4uL2NvbW1vbi9kaXN0cmlidXRpb24ubWFwcGVyJ1xuaW1wb3J0IHsgZ2V0S2V5d29yZFR5cGVGcm9tS2V5d29yZFR5cGVDb2RlIH0gZnJvbSAnLi9jb2RlbGlzdHMva2V5d29yZC5tYXBwZXInXG5cbmZ1bmN0aW9uIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgc3RyaW5nPiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZhbGxiYWNrKFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ2NvOkNoYXJhY3RlclN0cmluZycsIGZhbHNlKSxcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dteDpBbmNob3InLCBmYWxzZSlcbiAgICApLFxuICAgIHJlYWRUZXh0KClcbiAgKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RGF0ZVRpbWUoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgRGF0ZT4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmYWxsYmFjayhcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2djbzpEYXRlVGltZScsIGZhbHNlKSxcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2djbzpEYXRlJywgZmFsc2UpXG4gICAgKSxcbiAgICByZWFkVGV4dCgpLFxuICAgIG1hcCgoZGF0ZVN0cikgPT4gKGRhdGVTdHIgPyBuZXcgRGF0ZShkYXRlU3RyKSA6IG51bGwpKVxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RVcmwoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgVVJMPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOlVSTCcsIGZhbHNlKSwgcmVhZFRleHQoKSlcbiAgY29uc3QgZ2V0Q2hhcmFjdGVyU3RyaW5nID0gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnY286Q2hhcmFjdGVyU3RyaW5nJywgZmFsc2UpLFxuICAgIHJlYWRUZXh0KClcbiAgKVxuICBjb25zdCBnZXRBbmNob3IgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dteDpBbmNob3InLCBmYWxzZSksXG4gICAgcmVhZEF0dHJpYnV0ZSgneGxpbms6aHJlZicpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmFsbGJhY2soZ2V0VXJsLCBnZXRBbmNob3IsIGdldENoYXJhY3RlclN0cmluZyksXG4gICAgbWFwKCh1cmxTdHIpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHVybFN0cilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9KVxuICApXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSB7XG4gIHJldHVybiBmYWxsYmFjayhleHRyYWN0VXJsKCksICgpID0+IG5ldyBVUkwoJ2h0dHA6Ly9taXNzaW5nJykpXG59XG5cbi8vIGZyb20gZ21kOnJvbGVcbmZ1bmN0aW9uIGV4dHJhY3RSb2xlKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFJvbGU+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOkNJX1JvbGVDb2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChnZXRSb2xlRnJvbVJvbGVDb2RlKVxuICApXG59XG5cbi8vIGZyb20gZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHlcbmZ1bmN0aW9uIGV4dHJhY3RPcmdhbml6YXRpb24oKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgT3JnYW5pemF0aW9uPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgJ2dtZDpjb250YWN0SW5mbycsXG4gICAgICAnZ21kOkNJX0NvbnRhY3QnLFxuICAgICAgJ2dtZDpvbmxpbmVSZXNvdXJjZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJyxcbiAgICAgICdnbWQ6bGlua2FnZSdcbiAgICApLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZXh0cmFjdFVybCgpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgY29tYmluZShcbiAgICAgIHBpcGUoXG4gICAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpvcmdhbmlzYXRpb25OYW1lJywgZmFsc2UpLFxuICAgICAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgICAgICksXG4gICAgICBnZXRVcmxcbiAgICApLFxuICAgIG1hcCgoW25hbWUsIHdlYnNpdGVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIC4uLih3ZWJzaXRlICYmIHsgd2Vic2l0ZSB9KSxcbiAgICB9KSlcbiAgKVxufVxuXG4vLyBmcm9tIGdtZDpDSV9SZXNwb25zaWJsZVBhcnR5XG5mdW5jdGlvbiBleHRyYWN0SW5kaXZpZHVhbHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PEluZGl2aWR1YWw+XG4+IHtcbiAgY29uc3QgZ2V0Um9sZSA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOnJvbGUnKSwgZXh0cmFjdFJvbGUoKSlcbiAgY29uc3QgZ2V0UG9zaXRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpwb3NpdGlvbk5hbWUnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKVxuICBjb25zdCBnZXROYW1lUGFydHMgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDppbmRpdmlkdWFsTmFtZScpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSxcbiAgICBtYXAoKGZ1bGxOYW1lKSA9PiB7XG4gICAgICBpZiAoIWZ1bGxOYW1lKSByZXR1cm4gW11cbiAgICAgIGNvbnN0IHBhcnRzID0gZnVsbE5hbWUuc3BsaXQoL1xccysvKVxuICAgICAgaWYgKCFwYXJ0cy5sZW5ndGgpIHJldHVybiBbZnVsbE5hbWUsIG51bGxdXG4gICAgICBjb25zdCBmaXJzdCA9IHBhcnRzLnNoaWZ0KClcbiAgICAgIHJldHVybiBbZmlyc3QsIHBhcnRzLmpvaW4oJyAnKV1cbiAgICB9KVxuICApXG4gIGNvbnN0IGdldE9yZ2FuaXphdGlvbiA9IGV4dHJhY3RPcmdhbml6YXRpb24oKVxuICBjb25zdCBnZXRFbWFpbCA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmVsZWN0cm9uaWNNYWlsQWRkcmVzcycpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSxcbiAgICBtYXAoKGVtYWlsKSA9PiAoZW1haWwgPT09IG51bGwgPyAnbWlzc2luZ0BtaXNzaW5nLmNvbScgOiBlbWFpbCkpXG4gIClcbiAgcmV0dXJuIHBpcGUoXG4gICAgY29tYmluZShcbiAgICAgIGdldFJvbGUsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldE5hbWVQYXJ0cyxcbiAgICAgIGdldE9yZ2FuaXphdGlvbixcbiAgICAgIHBpcGUoZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOmNvbnRhY3RJbmZvJyksIG1hcEFycmF5KGdldEVtYWlsKSlcbiAgICApLFxuICAgIG1hcCgoW3JvbGUsIHBvc2l0aW9uLCBbZmlyc3ROYW1lLCBsYXN0TmFtZV0sIG9yZ2FuaXphdGlvbiwgZW1haWxzXSkgPT5cbiAgICAgIGVtYWlscy5tYXAoKGVtYWlsKSA9PiAoe1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgb3JnYW5pemF0aW9uLFxuICAgICAgICAuLi4ocG9zaXRpb24gJiYgeyBwb3NpdGlvbiB9KSxcbiAgICAgICAgLi4uKGZpcnN0TmFtZSAmJiB7IGZpcnN0TmFtZSB9KSxcbiAgICAgICAgLi4uKGxhc3ROYW1lICYmIHsgbGFzdE5hbWUgfSksXG4gICAgICB9KSlcbiAgICApXG4gIClcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0YXR1cygpOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBSZWNvcmRTdGF0dXM+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOk1EX1Byb2dyZXNzQ29kZScpLFxuICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSxcbiAgICBtYXAoZ2V0U3RhdHVzRnJvbVN0YXR1c0NvZGUpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZnVuY3Rpb24gZXh0cmFjdExlZ2FsQ29uc3RyYWludHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PENvbnN0cmFpbnQ+XG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX0xlZ2FsQ29uc3RyYWludHMnLCBmYWxzZSksXG4gICAgZmlsdGVyQXJyYXkoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfUmVzdHJpY3Rpb25Db2RlJyksXG4gICAgICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgICAgIG1hcCgodmFsdWVzKSA9PiB2YWx1ZXMuaW5kZXhPZignbGljZW5zZScpID09PSAtMSlcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KFxuICAgICAgY29tYmluZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnVzZUxpbWl0YXRpb24nKVxuICAgICAgKVxuICAgICksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgbWFwQXJyYXkoY29tYmluZShleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksIGV4dHJhY3RVcmwoKSkpLFxuICAgIG1hcEFycmF5KChbdGV4dCwgdXJsXSkgPT4gKHtcbiAgICAgIC4uLih1cmwgJiYgeyB1cmwgfSksXG4gICAgICB0ZXh0LFxuICAgIH0pKVxuICApXG59XG5cbi8vIGZyb20gZ21kOnJlc291cmNlQ29uc3RyYWludHNcbmZ1bmN0aW9uIGV4dHJhY3RTZWN1cml0eUNvbnN0cmFpbnRzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBBcnJheTxDb25zdHJhaW50PlxuPiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOk1EX1NlY3VyaXR5Q29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZnVuY3Rpb24gZXh0cmFjdE90aGVyQ29uc3RyYWludHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PENvbnN0cmFpbnQ+XG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6TURfQ29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZnVuY3Rpb24gZXh0cmFjdExpY2Vuc2VzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIEFycmF5PENvbnN0cmFpbnQ+PiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJywgZmFsc2UpLFxuICAgIGZpbHRlckFycmF5KFxuICAgICAgcGlwZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZScpLFxuICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICBtYXAoKHZhbHVlcykgPT4gdmFsdWVzLmluZGV4T2YoJ2xpY2Vuc2UnKSA+IC0xKVxuICAgICAgKVxuICAgICksXG4gICAgbWFwQXJyYXkoXG4gICAgICBjb21iaW5lKFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6b3RoZXJDb25zdHJhaW50cycpLFxuICAgICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6dXNlTGltaXRhdGlvbicpXG4gICAgICApXG4gICAgKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6TURfRGlzdHJpYnV0aW9uXG5mdW5jdGlvbiBleHRyYWN0RGF0YXNldERpc3RyaWJ1dGlvbnMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIERhdGFzZXREaXN0cmlidXRpb25bXVxuPiB7XG4gIGNvbnN0IGdldEZvcm1hdCA9IHBpcGUoXG4gICAgZmluZFBhcmVudCgnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6ZGlzdHJpYnV0aW9uRm9ybWF0JywgJ2dtZDpNRF9Gb3JtYXQnLCAnZ21kOm5hbWUnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksXG4gICAgbWFwKG1hdGNoTWltZVR5cGUpXG4gIClcblxuICBjb25zdCBnZXRVcmwgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpsaW5rYWdlJyksIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSlcbiAgY29uc3QgZ2V0UHJvdG9jb2xTdHIgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpwcm90b2NvbCcpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIGNvbnN0IGdldFByb3RvY29sID0gcGlwZShnZXRQcm90b2NvbFN0ciwgbWFwKG1hdGNoUHJvdG9jb2wpKVxuICBjb25zdCBnZXRPbmxpbmVGdW5jdGlvbiA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpmdW5jdGlvbicsICdnbWQ6Q0lfT25MaW5lRnVuY3Rpb25Db2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpXG4gIClcbiAgY29uc3QgZ2V0SXNTZXJ2aWNlID0gcGlwZShcbiAgICBnZXRQcm90b2NvbCxcbiAgICBtYXAoKHByb3RvY29sKSA9PiBwcm90b2NvbCAhPT0gJ290aGVyJylcbiAgKVxuICBjb25zdCBnZXRJc0Rvd25sb2FkID0gcGlwZShcbiAgICBjb21iaW5lKGdldElzU2VydmljZSwgZ2V0T25saW5lRnVuY3Rpb24sIGdldFByb3RvY29sU3RyKSxcbiAgICBtYXAoXG4gICAgICAoW2lzU2VydmljZSwgb25saW5lRnVuY3Rpb24sIHByb3RvY29sU3RyXSkgPT5cbiAgICAgICAgKCFpc1NlcnZpY2UgJiYgb25saW5lRnVuY3Rpb24gPT09ICdkb3dubG9hZCcpIHx8XG4gICAgICAgIC9kb3dubG9hZC9pLnRlc3QocHJvdG9jb2xTdHIpXG4gICAgKVxuICApXG4gIGNvbnN0IGdldE5hbWUgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpuYW1lJyksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgY29uc3QgZ2V0RGVzY3JpcHRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cyhcbiAgICAgICdnbWQ6dHJhbnNmZXJPcHRpb25zJyxcbiAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAnZ21kOm9uTGluZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJ1xuICAgICksXG4gICAgbWFwQXJyYXkoXG4gICAgICBjb21iaW5lKFxuICAgICAgICBnZXRJc1NlcnZpY2UsXG4gICAgICAgIGdldElzRG93bmxvYWQsXG4gICAgICAgIGdldFByb3RvY29sLFxuICAgICAgICBnZXRVcmwsXG4gICAgICAgIGdldE5hbWUsXG4gICAgICAgIGdldERlc2NyaXB0aW9uLFxuICAgICAgICBnZXRGb3JtYXRcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KFxuICAgICAgKFtpc1NlcnZpY2UsIGlzRG93bmxvYWQsIHByb3RvY29sLCB1cmwsIG5hbWUsIGRlc2NyaXB0aW9uLCBmb3JtYXRdKSA9PiB7XG4gICAgICAgIGlmIChpc1NlcnZpY2UpIHtcbiAgICAgICAgICBjb25zdCBoYXNJZGVudGlmaWVyID0gcHJvdG9jb2wgPT09ICd3bXMnIHx8IHByb3RvY29sID09PSAnd2ZzJ1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnc2VydmljZScsXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIGFjY2Vzc1NlcnZpY2VQcm90b2NvbDogcHJvdG9jb2wsXG4gICAgICAgICAgICAuLi4obmFtZSAmJiBoYXNJZGVudGlmaWVyICYmIHsgaWRlbnRpZmllckluU2VydmljZTogbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihuYW1lICYmIHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0Rvd25sb2FkKSB7XG4gICAgICAgICAgY29uc3QgbWltZVR5cGUgPSBmb3JtYXRcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2Rvd25sb2FkJyxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgLi4uKG5hbWUgJiYgeyBuYW1lIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICAuLi4obWltZVR5cGUgJiYgeyBtaW1lVHlwZSB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgLi4uKG5hbWUgJiYgeyBuYW1lIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICApXG59XG5cbmZ1bmN0aW9uIGdldFVwZGF0ZUZyZXF1ZW5jeUZyb21DdXN0b21QZXJpb2QoXG4gIGlzb1BlcmlvZDogc3RyaW5nXG4pOiBVcGRhdGVGcmVxdWVuY3lDdXN0b20ge1xuICBpZiAoIWlzb1BlcmlvZCkgcmV0dXJuIG51bGxcbiAgY29uc3QgbWF0Y2hlcyA9IGlzb1BlcmlvZC5tYXRjaChcbiAgICAvXi0/UCg/OihbMC05XSspWSk/KD86KFswLTldKylNKT8oPzooWzAtOV0rKUQpP1Q/KD86KFswLTldKylIKT8vXG4gIClcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gbnVsbFxuICBjb25zdCB5ZWFycyA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSB8fCAwXG4gIGNvbnN0IG1vbnRocyA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDEwKSB8fCAwXG4gIGNvbnN0IGRheXMgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxMCkgfHwgMFxuICBjb25zdCBob3VycyA9IHBhcnNlSW50KG1hdGNoZXNbNF0sIDEwKSB8fCAwXG4gIGlmICh5ZWFycykge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICd5ZWFyJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogMSxcbiAgICB9XG4gIH0gZWxzZSBpZiAobW9udGhzID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ21vbnRoJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogMSxcbiAgICB9XG4gIH0gZWxzZSBpZiAobW9udGhzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ3llYXInLFxuICAgICAgdXBkYXRlZFRpbWVzOiBNYXRoLnJvdW5kKDEyIC8gbW9udGhzKSxcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGF5cyA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICdkYXknLFxuICAgICAgdXBkYXRlZFRpbWVzOiAxLFxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXlzIDw9IDcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyOiAnd2VlaycsXG4gICAgICB1cGRhdGVkVGltZXM6IE1hdGgucm91bmQoNyAvIGRheXMpLFxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXlzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ21vbnRoJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogTWF0aC5yb3VuZCgzMCAvIGRheXMpLFxuICAgIH1cbiAgfSBlbHNlIGlmIChob3Vycykge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICdkYXknLFxuICAgICAgdXBkYXRlZFRpbWVzOiBNYXRoLnJvdW5kKDI0IC8gZGF5cyksXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8vIGZyb20gZ21kOk1EX01haW50ZW5hbmNlSW5mb3JtYXRpb25cbmZ1bmN0aW9uIGV4dHJhY3RVcGRhdGVGcmVxdWVuY3koKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIFVwZGF0ZUZyZXF1ZW5jeVxuPiB7XG4gIHJldHVybiBmYWxsYmFjayhcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ21kOk1EX01haW50ZW5hbmNlRnJlcXVlbmN5Q29kZScpLFxuICAgICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgICAgbWFwKGdldFVwZGF0ZUZyZXF1ZW5jeUZyb21GcmVxdWVuY3lDb2RlKVxuICAgICksXG4gICAgcGlwZShcbiAgICAgIGZpbmROZXN0ZWRFbGVtZW50KFxuICAgICAgICAnZ21kOnVzZXJEZWZpbmVkTWFpbnRlbmFuY2VGcmVxdWVuY3knLFxuICAgICAgICAnZ3RzOlRNX1BlcmlvZER1cmF0aW9uJ1xuICAgICAgKSxcbiAgICAgIHJlYWRUZXh0KCksXG4gICAgICBtYXAoZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUN1c3RvbVBlcmlvZClcbiAgICApLFxuICAgIG1hcCgoKSA9PiAndW5rbm93bicpXG4gIClcbn1cblxuLyoqXG4gKiBMb29rcyBmb3Igc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbiBvciBnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uIGVsZW1lbnRcbiAqIGRlcGVuZGluZyBvbiByZWNvcmQgdHlwZVxuICovXG5mdW5jdGlvbiBmaW5kSWRlbnRpZmljYXRpb24oKSB7XG4gIHJldHVybiAocm9vdEVsOiBYbWxFbGVtZW50KSA9PiB7XG4gICAgY29uc3Qga2luZCA9IHJlYWRLaW5kKHJvb3RFbClcbiAgICBsZXQgZWx0TmFtZSA9ICdnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uJ1xuICAgIGlmIChraW5kID09PSAnc2VydmljZScpIGVsdE5hbWUgPSAnc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbidcbiAgICByZXR1cm4gZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDppZGVudGlmaWNhdGlvbkluZm8nLCBlbHROYW1lKShyb290RWwpXG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdENpdGF0aW9uRGF0ZSh0eXBlOiAnY3JlYXRpb24nIHwgJ3JldmlzaW9uJyB8ICdwdWJsaWNhdGlvbicpIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6Y2l0YXRpb24nLCAnZ21kOkNJX0NpdGF0aW9uJywgJ2dtZDpkYXRlJyksXG4gICAgZmlsdGVyQXJyYXkoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kTmVzdGVkRWxlbWVudHMoXG4gICAgICAgICAgJ2dtZDpDSV9EYXRlJyxcbiAgICAgICAgICAnZ21kOmRhdGVUeXBlJyxcbiAgICAgICAgICAnZ21kOkNJX0RhdGVUeXBlQ29kZSdcbiAgICAgICAgKSxcbiAgICAgICAgZ2V0QXRJbmRleCgwKSxcbiAgICAgICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgICAgICBtYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdHlwZSlcbiAgICAgIClcbiAgICApLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6Q0lfRGF0ZScsICdnbWQ6ZGF0ZScpLFxuICAgIGdldEF0SW5kZXgoMCksXG4gICAgZXh0cmFjdERhdGVUaW1lKClcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRTcGF0aWFsUmVwcmVzZW50YXRpb25Gcm9tQ29kZShcbiAgc3BhdGlhbFJlcHJlc2VudGF0aW9uQ29kZTogc3RyaW5nXG4pOiBTcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlIHwgbnVsbCB7XG4gIHN3aXRjaCAoc3BhdGlhbFJlcHJlc2VudGF0aW9uQ29kZSkge1xuICAgIGNhc2UgJ2dyaWQnOlxuICAgIGNhc2UgJ3ZlY3Rvcic6XG4gICAgY2FzZSAndGluJzpcbiAgICBjYXNlICd0YWJsZSc6XG4gICAgY2FzZSAncG9pbnQnOlxuICAgICAgcmV0dXJuIHNwYXRpYWxSZXByZXNlbnRhdGlvbkNvZGVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFVuaXF1ZUlkZW50aWZpZXIocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVJZGVudGlmaWVyJywgZmFsc2UpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRLaW5kKHJvb3RFbDogWG1sRWxlbWVudCk6IFJlY29yZEtpbmQge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmhpZXJhcmNoeUxldmVsJywgJ2dtZDpNRF9TY29wZUNvZGUnKSxcbiAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJyksXG4gICAgbWFwKFxuICAgICAgKHNjb3BlQ29kZSk6IFJlY29yZEtpbmQgPT5cbiAgICAgICAgc2NvcGVDb2RlID09PSAnc2VydmljZScgPyAnc2VydmljZScgOiAnZGF0YXNldCdcbiAgICApXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE93bmVyT3JnYW5pemF0aW9uKHJvb3RFbDogWG1sRWxlbWVudCk6IE9yZ2FuaXphdGlvbiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6Y29udGFjdCcsICdnbWQ6Q0lfUmVzcG9uc2libGVQYXJ0eScpLFxuICAgIGV4dHJhY3RPcmdhbml6YXRpb24oKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZWNvcmRVcGRhdGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZGF0ZVN0YW1wJyksIGV4dHJhY3REYXRlVGltZSgpKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVjb3JkUHVibGlzaGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZGF0ZVN0YW1wJyksIGV4dHJhY3REYXRlVGltZSgpKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVGl0bGUocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpjaXRhdGlvbicsICdnbWQ6Q0lfQ2l0YXRpb24nLCAnZ21kOnRpdGxlJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFic3RyYWN0KHJvb3RFbDogWG1sRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDphYnN0cmFjdCcsIGZhbHNlKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0YXNldENyZWF0ZWQocm9vdEVsOiBYbWxFbGVtZW50KTogRGF0ZSB7XG4gIHJldHVybiBleHRyYWN0Q2l0YXRpb25EYXRlKCdjcmVhdGlvbicpKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREYXRhc2V0VXBkYXRlZChyb290RWw6IFhtbEVsZW1lbnQpOiBEYXRlIHtcbiAgcmV0dXJuIGV4dHJhY3RDaXRhdGlvbkRhdGUoJ3JldmlzaW9uJykocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRhY3RzKHJvb3RFbDogWG1sRWxlbWVudCk6IEluZGl2aWR1YWxbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGNvbWJpbmUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6Y29udGFjdCcpLFxuICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnBvaW50T2ZDb250YWN0JylcbiAgICApLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIG1hcEFycmF5KGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpDSV9SZXNwb25zaWJsZVBhcnR5JywgZmFsc2UpKSxcbiAgICBtYXBBcnJheShleHRyYWN0SW5kaXZpZHVhbHMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbi8vIGZyb20gZ21kOnRoZXNhdXJ1c05hbWVcbmZ1bmN0aW9uIHJlYWRUaGVzYXVydXMocm9vdEVsOiBYbWxFbGVtZW50KTogS2V5d29yZFRoZXNhdXJ1cyB7XG4gIGlmICghcm9vdEVsKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGZpbmRJZGVudGlmaWVyID0gZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgJ2dtZDpDSV9DaXRhdGlvbicsXG4gICAgJ2dtZDppZGVudGlmaWVyJyxcbiAgICAnZ21kOk1EX0lkZW50aWZpZXInLFxuICAgICdnbWQ6Y29kZSdcbiAgKVxuICBjb25zdCBpZCA9IHBpcGUoZmluZElkZW50aWZpZXIsIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSkocm9vdEVsKVxuICBjb25zdCB1cmwgPSBwaXBlKGZpbmRJZGVudGlmaWVyLCBleHRyYWN0VXJsKCkpKHJvb3RFbClcbiAgY29uc3QgbmFtZSA9IHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpDSV9DaXRhdGlvbicsICdnbWQ6dGl0bGUnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKShyb290RWwpXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgLi4uKG5hbWUgJiYgeyBuYW1lIH0pLFxuICAgIC4uLih1cmwgJiYgeyB1cmwgfSksXG4gIH1cbn1cblxuLy8gZnJvbSBnbWQ6TURfS2V5d29yZHNcbmZ1bmN0aW9uIHJlYWRLZXl3b3JkR3JvdXAocm9vdEVsOiBYbWxFbGVtZW50KTogS2V5d29yZFtdIHtcbiAgY29uc3QgdHlwZSA9IHBpcGUoXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX0tleXdvcmRUeXBlQ29kZScpLFxuICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgbWFwKCh2YWx1ZXMpID0+IGdldEtleXdvcmRUeXBlRnJvbUtleXdvcmRUeXBlQ29kZSh2YWx1ZXNbMF0pKVxuICApKHJvb3RFbClcbiAgY29uc3QgdGhlc2F1cnVzID0gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOnRoZXNhdXJ1c05hbWUnKSxcbiAgICByZWFkVGhlc2F1cnVzXG4gICkocm9vdEVsKVxuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6a2V5d29yZCcpLFxuICAgIG1hcEFycmF5KChlbCkgPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkoZWwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4odGhlc2F1cnVzID8geyB0aGVzYXVydXMgfSA6IHt9KSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHR5cGUsXG4gICAgICB9IGFzIEtleXdvcmRcbiAgICB9KVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRLZXl3b3Jkcyhyb290RWw6IFhtbEVsZW1lbnQpOiBLZXl3b3JkW10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpkZXNjcmlwdGl2ZUtleXdvcmRzJywgJ2dtZDpNRF9LZXl3b3JkcycpLFxuICAgIG1hcEFycmF5KHJlYWRLZXl3b3JkR3JvdXApLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFN0YXR1cyhyb290RWw6IFhtbEVsZW1lbnQpOiBSZWNvcmRTdGF0dXMge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6c3RhdHVzJywgZmFsc2UpLFxuICAgIGV4dHJhY3RTdGF0dXMoKVxuICApKHJvb3RFbClcbn1cblxuY29uc3QgZ2V0Q29uc3RyYWludHMgPSBwaXBlKFxuICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnLCBmYWxzZSlcbilcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRMZWdhbENvbnN0cmFpbnRzKHJvb3RFbDogWG1sRWxlbWVudCk6IENvbnN0cmFpbnRbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGdldENvbnN0cmFpbnRzLFxuICAgIG1hcEFycmF5KGV4dHJhY3RMZWdhbENvbnN0cmFpbnRzKCkpLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNlY3VyaXR5Q29uc3RyYWludHMocm9vdEVsOiBYbWxFbGVtZW50KTogQ29uc3RyYWludFtdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZ2V0Q29uc3RyYWludHMsXG4gICAgbWFwQXJyYXkoZXh0cmFjdFNlY3VyaXR5Q29uc3RyYWludHMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3RoZXJDb25zdHJhaW50cyhyb290RWw6IFhtbEVsZW1lbnQpOiBDb25zdHJhaW50W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBnZXRDb25zdHJhaW50cyxcbiAgICBtYXBBcnJheShleHRyYWN0T3RoZXJDb25zdHJhaW50cygpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRMaWNlbnNlcyhyb290RWw6IFhtbEVsZW1lbnQpOiBDb25zdHJhaW50W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBnZXRDb25zdHJhaW50cyxcbiAgICBtYXBBcnJheShleHRyYWN0TGljZW5zZXMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbi8vIG5vdCB1c2VkIHlldFxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRJc29Ub3BpY3Mocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nW10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfVG9waWNDYXRlZ29yeUNvZGUnLCB0cnVlKSxcbiAgICBtYXBBcnJheShyZWFkVGV4dCgpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTcGF0aWFsUmVwcmVzZW50YXRpb24oXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKTogU3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZSB8IG51bGwge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAgICdnbWQ6c3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZScsXG4gICAgICAnZ21kOk1EX1NwYXRpYWxSZXByZXNlbnRhdGlvblR5cGVDb2RlJ1xuICAgICksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChnZXRTcGF0aWFsUmVwcmVzZW50YXRpb25Gcm9tQ29kZSlcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3ZlcnZpZXdzKHJvb3RFbDogWG1sRWxlbWVudCk6IEdyYXBoaWNPdmVydmlld1tdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOmdyYXBoaWNPdmVydmlldycsIGZhbHNlKSxcbiAgICBtYXBBcnJheShcbiAgICAgIGNvbWJpbmUoXG4gICAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVOYW1lJyksIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSksXG4gICAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVEZXNjcmlwdGlvbicpLCBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkpXG4gICAgICApXG4gICAgKSxcbiAgICBtYXBBcnJheSgoW3VybCwgZGVzY3JpcHRpb25dKSA9PiAoe1xuICAgICAgdXJsLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgfSkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNwYXRpYWxFeHRlbnRzKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGFzZXRTcGF0aWFsRXh0ZW50W10ge1xuICByZXR1cm4gW10gLy8gVE9ET1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFRlbXBvcmFsRXh0ZW50cyhcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pOiBEYXRhc2V0VGVtcG9yYWxFeHRlbnRbXSB7XG4gIHJldHVybiBbXSAvLyBUT0RPXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkTGluZWFnZShyb290RWw6IFhtbEVsZW1lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAgICdnbWQ6ZGF0YVF1YWxpdHlJbmZvJyxcbiAgICAgICdnbWQ6RFFfRGF0YVF1YWxpdHknLFxuICAgICAgJ2dtZDpsaW5lYWdlJyxcbiAgICAgICdnbWQ6TElfTGluZWFnZScsXG4gICAgICAnZ21kOnN0YXRlbWVudCdcbiAgICApLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREaXN0cmlidXRpb25zKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGFzZXREaXN0cmlidXRpb25bXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLCAnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIG1hcEFycmF5KGV4dHJhY3REYXRhc2V0RGlzdHJpYnV0aW9ucygpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVcGRhdGVGcmVxdWVuY3kocm9vdEVsOiBYbWxFbGVtZW50KTogVXBkYXRlRnJlcXVlbmN5IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAnZ21kOnJlc291cmNlTWFpbnRlbmFuY2UnLFxuICAgICAgJ2dtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uJ1xuICAgICksXG4gICAgZXh0cmFjdFVwZGF0ZUZyZXF1ZW5jeSgpLFxuICAgIG1hcCgodXBkYXRlRnJlcXVlbmN5KSA9PiB1cGRhdGVGcmVxdWVuY3kgfHwgJ3Vua25vd24nKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTZXJ2aWNlT25saW5lUmVzb3VyY2VzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBTZXJ2aWNlT25saW5lUmVzb3VyY2VbXVxuPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmxpbmthZ2UnKSwgZXh0cmFjdE1hbmRhdG9yeVVybCgpKVxuICBjb25zdCBnZXRQcm90b2NvbFN0ciA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOnByb3RvY29sJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gIClcbiAgY29uc3QgZ2V0UHJvdG9jb2wgPSBwaXBlKGdldFByb3RvY29sU3RyLCBtYXAobWF0Y2hQcm90b2NvbCkpXG4gIGNvbnN0IGdldE9ubGluZUZ1bmN0aW9uID0gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmZ1bmN0aW9uJywgJ2dtZDpDSV9PbkxpbmVGdW5jdGlvbkNvZGUnKSxcbiAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJylcbiAgKVxuICBjb25zdCBnZXRJc0xpbmsgPSBwaXBlKFxuICAgIGdldE9ubGluZUZ1bmN0aW9uLFxuICAgIG1hcCgob25saW5lRnVuY3Rpb24pID0+IG9ubGluZUZ1bmN0aW9uID09PSAnaW5mb3JtYXRpb24nKVxuICApXG4gIGNvbnN0IGdldE5hbWUgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpuYW1lJyksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgY29uc3QgZ2V0RGVzY3JpcHRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cyhcbiAgICAgICdnbWQ6dHJhbnNmZXJPcHRpb25zJyxcbiAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAnZ21kOm9uTGluZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJ1xuICAgICksXG4gICAgbWFwQXJyYXkoY29tYmluZShnZXRJc0xpbmssIGdldFByb3RvY29sLCBnZXRVcmwsIGdldE5hbWUsIGdldERlc2NyaXB0aW9uKSksXG4gICAgbWFwQXJyYXkoKFtpc0xpbmssIHByb3RvY29sLCB1cmwsIG5hbWUsIGRlc2NyaXB0aW9uXSkgPT4ge1xuICAgICAgaWYgKGlzTGluaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXG4gICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ2VuZHBvaW50JyxcbiAgICAgICAgICBlbmRwb2ludFVybDogdXJsLFxuICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE9ubGluZVJlc291cmNlcyhcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pOiBTZXJ2aWNlT25saW5lUmVzb3VyY2VbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLCAnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIG1hcEFycmF5KGV4dHJhY3RTZXJ2aWNlT25saW5lUmVzb3VyY2VzKCkpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuIl19
357
+ export function readTemporalExtents(rootEl) {
358
+ return pipe(findIdentification(), findNestedElements('gmd:extent', 'gmd:EX_Extent', 'gmd:temporalElement'), mapArray(combine(findNestedElement('gmd:EX_TemporalExtent', 'gmd:extent', 'gml:TimePeriod'), findNestedElement('gmd:EX_TemporalExtent', 'gmd:extent', 'gml:TimeInstant'))), mapArray(([periodEl, instantEl]) => {
359
+ if (periodEl) {
360
+ return pipe(combine(pipe(findChildElement('gml:beginPosition', false), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null))), pipe(findChildElement('gml:endPosition', false), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)))), map(([start, end]) => ({
361
+ start,
362
+ end,
363
+ })))(periodEl);
364
+ }
365
+ else {
366
+ return pipe(findChildElement('gml:timePosition', false), readText(), map((dateStr) => (dateStr ? new Date(dateStr) : null)), map((date) => ({
367
+ start: date,
368
+ })))(instantEl);
369
+ }
370
+ }))(rootEl);
371
+ }
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1wYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL21ldGFkYXRhLWNvbnZlcnRlci9zcmMvbGliL2lzbzE5MTM5L3JlYWQtcGFydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFDNUUsT0FBTyxFQUVMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFlBQVksRUFDWixVQUFVLEVBQ1YsR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEdBQ0wsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLFVBQVUsRUFDVixhQUFhLEVBQ2IsUUFBUSxHQUNULE1BQU0sY0FBYyxDQUFBO0FBQ3JCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUVyRixNQUFNLFVBQVUsc0JBQXNCO0lBSXBDLE9BQU8sSUFBSSxDQUNULFFBQVEsQ0FDTixnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsRUFDOUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUN0QyxFQUNELFFBQVEsRUFBRSxDQUNYLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxJQUFJLENBQ1QsUUFBUSxDQUNOLGdCQUFnQixD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LElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDYixLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQyxDQUNKLENBQUMsU0FBUyxDQUFDLENBQUE7U0FDYjtJQUNILENBQUMsQ0FBQyxDQUNILENBQUMsTUFBTSxDQUFDLENBQUE7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uc3RyYWludCxcbiAgRGF0YXNldERpc3RyaWJ1dGlvbixcbiAgR3JhcGhpY092ZXJ2aWV3LFxuICBJbmRpdmlkdWFsLFxuICBLZXl3b3JkLFxuICBLZXl3b3JkVGhlc2F1cnVzLFxuICBPcmdhbml6YXRpb24sXG4gIFJlY29yZEtpbmQsXG4gIFJlY29yZFN0YXR1cyxcbiAgUm9sZSxcbiAgU2VydmljZU9ubGluZVJlc291cmNlLFxuICBTcGF0aWFsUmVwcmVzZW50YXRpb25UeXBlLFxuICBVcGRhdGVGcmVxdWVuY3ksXG4gIFVwZGF0ZUZyZXF1ZW5jeUN1c3RvbSxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vZG9tYWluL3NyYy9saWIvbW9kZWwvcmVjb3JkJ1xuaW1wb3J0IHsgbWF0Y2hNaW1lVHlwZSwgbWF0Y2hQcm90b2NvbCB9IGZyb20gJy4uL2NvbW1vbi9kaXN0cmlidXRpb24ubWFwcGVyJ1xuaW1wb3J0IHtcbiAgQ2hhaW5hYmxlRnVuY3Rpb24sXG4gIGNvbWJpbmUsXG4gIGZhbGxiYWNrLFxuICBmaWx0ZXJBcnJheSxcbiAgZmxhdHRlbkFycmF5LFxuICBnZXRBdEluZGV4LFxuICBtYXAsXG4gIG1hcEFycmF5LFxuICBwaXBlLFxufSBmcm9tICcuLi9mdW5jdGlvbi11dGlscydcbmltcG9ydCB7XG4gIFhtbEVsZW1lbnQsXG4gIGZpbmRDaGlsZEVsZW1lbnQsXG4gIGZpbmRDaGlsZHJlbkVsZW1lbnQsXG4gIGZpbmROZXN0ZWRFbGVtZW50LFxuICBmaW5kTmVzdGVkRWxlbWVudHMsXG4gIGZpbmRQYXJlbnQsXG4gIHJlYWRBdHRyaWJ1dGUsXG4gIHJlYWRUZXh0LFxufSBmcm9tICcuLi94bWwtdXRpbHMnXG5pbXBvcnQgeyBmdWxsTmFtZVRvUGFydHMgfSBmcm9tICcuL3V0aWxzL2luZGl2aWR1YWwtbmFtZSdcbmltcG9ydCB7IGdldEtleXdvcmRUeXBlRnJvbUtleXdvcmRUeXBlQ29kZSB9IGZyb20gJy4vdXRpbHMva2V5d29yZC5tYXBwZXInXG5pbXBvcnQgeyBnZXRSb2xlRnJvbVJvbGVDb2RlIH0gZnJvbSAnLi91dGlscy9yb2xlLm1hcHBlcidcbmltcG9ydCB7IGdldFN0YXR1c0Zyb21TdGF0dXNDb2RlIH0gZnJvbSAnLi91dGlscy9zdGF0dXMubWFwcGVyJ1xuaW1wb3J0IHsgZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUZyZXF1ZW5jeUNvZGUgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZS1mcmVxdWVuY3kubWFwcGVyJ1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENoYXJhY3RlclN0cmluZygpOiBDaGFpbmFibGVGdW5jdGlvbjxcbiAgWG1sRWxlbWVudCxcbiAgc3RyaW5nXG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmFsbGJhY2soXG4gICAgICBmaW5kQ2hpbGRFbGVtZW50KCdnY286Q2hhcmFjdGVyU3RyaW5nJywgZmFsc2UpLFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ214OkFuY2hvcicsIGZhbHNlKVxuICAgICksXG4gICAgcmVhZFRleHQoKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RGF0ZVRpbWUoKTogQ2hhaW5hYmxlRnVuY3Rpb248WG1sRWxlbWVudCwgRGF0ZT4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmYWxsYmFjayhcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2djbzpEYXRlVGltZScsIGZhbHNlKSxcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2djbzpEYXRlJywgZmFsc2UpXG4gICAgKSxcbiAgICByZWFkVGV4dCgpLFxuICAgIG1hcCgoZGF0ZVN0cikgPT4gKGRhdGVTdHIgPyBuZXcgRGF0ZShkYXRlU3RyKSA6IG51bGwpKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VXJsKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFVSTD4ge1xuICBjb25zdCBnZXRVcmwgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpVUkwnLCBmYWxzZSksIHJlYWRUZXh0KCkpXG4gIGNvbnN0IGdldENoYXJhY3RlclN0cmluZyA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ2NvOkNoYXJhY3RlclN0cmluZycsIGZhbHNlKSxcbiAgICByZWFkVGV4dCgpXG4gIClcbiAgY29uc3QgZ2V0QW5jaG9yID0gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbXg6QW5jaG9yJywgZmFsc2UpLFxuICAgIHJlYWRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGZhbGxiYWNrKGdldFVybCwgZ2V0QW5jaG9yLCBnZXRDaGFyYWN0ZXJTdHJpbmcpLFxuICAgIG1hcCgodXJsU3RyKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxTdHIpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hbmRhdG9yeVVybCgpIHtcbiAgcmV0dXJuIGZhbGxiYWNrKGV4dHJhY3RVcmwoKSwgKCkgPT4gbmV3IFVSTCgnaHR0cDovL21pc3NpbmcnKSlcbn1cblxuLy8gZnJvbSBnbWQ6cm9sZVxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSb2xlKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIFJvbGU+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOkNJX1JvbGVDb2RlJyksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChnZXRSb2xlRnJvbVJvbGVDb2RlKVxuICApXG59XG5cbi8vIGZyb20gZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0T3JnYW5pemF0aW9uKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBPcmdhbml6YXRpb25cbj4ge1xuICBjb25zdCBnZXRVcmwgPSBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cyhcbiAgICAgICdnbWQ6Y29udGFjdEluZm8nLFxuICAgICAgJ2dtZDpDSV9Db250YWN0JyxcbiAgICAgICdnbWQ6b25saW5lUmVzb3VyY2UnLFxuICAgICAgJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZScsXG4gICAgICAnZ21kOmxpbmthZ2UnXG4gICAgKSxcbiAgICBnZXRBdEluZGV4KDApLFxuICAgIGV4dHJhY3RVcmwoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGNvbWJpbmUoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6b3JnYW5pc2F0aW9uTmFtZScsIGZhbHNlKSxcbiAgICAgICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICAgICApLFxuICAgICAgZ2V0VXJsXG4gICAgKSxcbiAgICBtYXAoKFtuYW1lLCB3ZWJzaXRlXSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICAuLi4od2Vic2l0ZSAmJiB7IHdlYnNpdGUgfSksXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6Q0lfUmVzcG9uc2libGVQYXJ0eVxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbmRpdmlkdWFsKCk6IENoYWluYWJsZUZ1bmN0aW9uPFhtbEVsZW1lbnQsIEluZGl2aWR1YWw+IHtcbiAgY29uc3QgZ2V0Um9sZSA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOnJvbGUnKSwgZXh0cmFjdFJvbGUoKSlcbiAgY29uc3QgZ2V0UG9zaXRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpwb3NpdGlvbk5hbWUnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKVxuICBjb25zdCBnZXROYW1lUGFydHMgPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDppbmRpdmlkdWFsTmFtZScpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSxcbiAgICBtYXAoKGZ1bGxOYW1lKSA9PiB7XG4gICAgICBpZiAoIWZ1bGxOYW1lKSByZXR1cm4gW11cbiAgICAgIHJldHVybiBmdWxsTmFtZVRvUGFydHMoZnVsbE5hbWUpXG4gICAgfSlcbiAgKVxuICBjb25zdCBnZXRPcmdhbml6YXRpb24gPSBleHRyYWN0T3JnYW5pemF0aW9uKClcbiAgY29uc3QgZ2V0Q29udGFjdFJvb3QgPSBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmNvbnRhY3RJbmZvJywgJ2dtZDpDSV9Db250YWN0JylcbiAgY29uc3QgZ2V0RW1haWwgPSBwaXBlKFxuICAgIGdldENvbnRhY3RSb290LFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDplbGVjdHJvbmljTWFpbEFkZHJlc3MnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksXG4gICAgbWFwKChlbWFpbCkgPT4gKGVtYWlsID09PSBudWxsID8gJ21pc3NpbmdAbWlzc2luZy5jb20nIDogZW1haWwpKVxuICApXG4gIGNvbnN0IGdldEFkZHJlc3MgPSBwaXBlKFxuICAgIGdldENvbnRhY3RSb290LFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6YWRkcmVzcycsICdnbWQ6Q0lfQWRkcmVzcycpLFxuICAgIGNvbWJpbmUoXG4gICAgICBwaXBlKFxuICAgICAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZGVsaXZlcnlQb2ludCcsIGZhbHNlKSxcbiAgICAgICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICAgICApLFxuICAgICAgcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6Y2l0eScsIGZhbHNlKSwgZXh0cmFjdENoYXJhY3RlclN0cmluZygpKSxcbiAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOnBvc3RhbENvZGUnLCBmYWxzZSksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSksXG4gICAgICBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpjb3VudHJ5JywgZmFsc2UpLCBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkpXG4gICAgKSxcbiAgICBtYXAoKHBhcnRzKSA9PiBwYXJ0cy5maWx0ZXIoKHApID0+ICEhcCkuam9pbignLCAnKSlcbiAgKVxuICBjb25zdCBnZXRQaG9uZSA9IHBpcGUoXG4gICAgZ2V0Q29udGFjdFJvb3QsXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpwaG9uZScsICdnbWQ6Q0lfVGVsZXBob25lJywgJ2dtZDp2b2ljZScpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGNvbWJpbmUoXG4gICAgICBnZXRSb2xlLFxuICAgICAgZ2V0UG9zaXRpb24sXG4gICAgICBnZXROYW1lUGFydHMsXG4gICAgICBnZXRPcmdhbml6YXRpb24sXG4gICAgICBnZXRFbWFpbCxcbiAgICAgIGdldEFkZHJlc3MsXG4gICAgICBnZXRQaG9uZVxuICAgICksXG4gICAgbWFwKFxuICAgICAgKFtcbiAgICAgICAgcm9sZSxcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICAgIFtmaXJzdE5hbWUsIGxhc3ROYW1lXSxcbiAgICAgICAgb3JnYW5pemF0aW9uLFxuICAgICAgICBlbWFpbCxcbiAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgcGhvbmUsXG4gICAgICBdKSA9PiAoe1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgcm9sZSxcbiAgICAgICAgb3JnYW5pemF0aW9uLFxuICAgICAgICAuLi4ocG9zaXRpb24gJiYgeyBwb3NpdGlvbiB9KSxcbiAgICAgICAgLi4uKGZpcnN0TmFtZSAmJiB7IGZpcnN0TmFtZSB9KSxcbiAgICAgICAgLi4uKGxhc3ROYW1lICYmIHsgbGFzdE5hbWUgfSksXG4gICAgICAgIC4uLihhZGRyZXNzICYmIHsgYWRkcmVzcyB9KSxcbiAgICAgICAgLi4uKHBob25lICYmIHsgcGhvbmUgfSksXG4gICAgICB9KVxuICAgIClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFN0YXR1cygpOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBSZWNvcmRTdGF0dXM+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOk1EX1Byb2dyZXNzQ29kZScpLFxuICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSxcbiAgICBtYXAoZ2V0U3RhdHVzRnJvbVN0YXR1c0NvZGUpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMZWdhbENvbnN0cmFpbnRzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBBcnJheTxDb25zdHJhaW50PlxuPiB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpNRF9MZWdhbENvbnN0cmFpbnRzJywgZmFsc2UpLFxuICAgIGZpbHRlckFycmF5KFxuICAgICAgcGlwZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX1Jlc3RyaWN0aW9uQ29kZScpLFxuICAgICAgICBtYXBBcnJheShyZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJykpLFxuICAgICAgICBtYXAoKHZhbHVlcykgPT4gdmFsdWVzLmluZGV4T2YoJ2xpY2Vuc2UnKSA9PT0gLTEpXG4gICAgICApXG4gICAgKSxcbiAgICBtYXBBcnJheShcbiAgICAgIGNvbWJpbmUoXG4gICAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpvdGhlckNvbnN0cmFpbnRzJyksXG4gICAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDp1c2VMaW1pdGF0aW9uJylcbiAgICAgIClcbiAgICApLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIG1hcEFycmF5KGNvbWJpbmUoZXh0cmFjdENoYXJhY3RlclN0cmluZygpLCBleHRyYWN0VXJsKCkpKSxcbiAgICBtYXBBcnJheSgoW3RleHQsIHVybF0pID0+ICh7XG4gICAgICAuLi4odXJsICYmIHsgdXJsIH0pLFxuICAgICAgdGV4dCxcbiAgICB9KSlcbiAgKVxufVxuXG4vLyBmcm9tIGdtZDpyZXNvdXJjZUNvbnN0cmFpbnRzXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlY3VyaXR5Q29uc3RyYWludHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PENvbnN0cmFpbnQ+XG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6TURfU2VjdXJpdHlDb25zdHJhaW50cycsICdnbWQ6dXNlTGltaXRhdGlvbicpLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIG1hcEFycmF5KGNvbWJpbmUoZXh0cmFjdENoYXJhY3RlclN0cmluZygpLCBleHRyYWN0VXJsKCkpKSxcbiAgICBtYXBBcnJheSgoW3RleHQsIHVybF0pID0+ICh7XG4gICAgICAuLi4odXJsICYmIHsgdXJsIH0pLFxuICAgICAgdGV4dCxcbiAgICB9KSlcbiAgKVxufVxuXG4vLyBmcm9tIGdtZDpyZXNvdXJjZUNvbnN0cmFpbnRzXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE90aGVyQ29uc3RyYWludHMoKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIEFycmF5PENvbnN0cmFpbnQ+XG4+IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6TURfQ29uc3RyYWludHMnLCAnZ21kOnVzZUxpbWl0YXRpb24nKSxcbiAgICBmbGF0dGVuQXJyYXkoKSxcbiAgICBtYXBBcnJheShjb21iaW5lKGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSwgZXh0cmFjdFVybCgpKSksXG4gICAgbWFwQXJyYXkoKFt0ZXh0LCB1cmxdKSA9PiAoe1xuICAgICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgICAgIHRleHQsXG4gICAgfSkpXG4gIClcbn1cblxuLy8gZnJvbSBnbWQ6cmVzb3VyY2VDb25zdHJhaW50c1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaWNlbnNlcygpOiBDaGFpbmFibGVGdW5jdGlvbjxcbiAgWG1sRWxlbWVudCxcbiAgQXJyYXk8Q29uc3RyYWludD5cbj4ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfTGVnYWxDb25zdHJhaW50cycsIGZhbHNlKSxcbiAgICBmaWx0ZXJBcnJheShcbiAgICAgIHBpcGUoXG4gICAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpNRF9SZXN0cmljdGlvbkNvZGUnKSxcbiAgICAgICAgbWFwQXJyYXkocmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpKSxcbiAgICAgICAgbWFwKCh2YWx1ZXMpID0+IHZhbHVlcy5pbmRleE9mKCdsaWNlbnNlJykgPiAtMSlcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KFxuICAgICAgY29tYmluZShcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOm90aGVyQ29uc3RyYWludHMnKSxcbiAgICAgICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnVzZUxpbWl0YXRpb24nKVxuICAgICAgKVxuICAgICksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgbWFwQXJyYXkoY29tYmluZShleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCksIGV4dHJhY3RVcmwoKSkpLFxuICAgIG1hcEFycmF5KChbdGV4dCwgdXJsXSkgPT4gKHtcbiAgICAgIC4uLih1cmwgJiYgeyB1cmwgfSksXG4gICAgICB0ZXh0LFxuICAgIH0pKVxuICApXG59XG5cbmNvbnN0IGdldE1pbWVUeXBlID0gcGlwZShcbiAgZmluZFBhcmVudCgnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmRpc3RyaWJ1dGlvbkZvcm1hdCcsICdnbWQ6TURfRm9ybWF0JywgJ2dtZDpuYW1lJyksXG4gIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSxcbiAgbWFwKG1hdGNoTWltZVR5cGUpXG4pXG5cbi8qKlxuICogRXh0cmFjdCBkaXN0cmlidXRpb25zIGZyb20gYSBNRF9EaXN0cmlidXRpb24gZWxlbWVudFxuICogQHBhcmFtIGdldE1pbWVUeXBlRm4gVGhpcyBmdW5jdGlvbiBzdGFydHMgZnJvbSBhIGdtZDp0cmFuc2Zlck9wdGlvbnMgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdERhdGFzZXREaXN0cmlidXRpb25zKFxuICBnZXRNaW1lVHlwZUZuOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBzdHJpbmc+XG4pOiBDaGFpbmFibGVGdW5jdGlvbjxYbWxFbGVtZW50LCBEYXRhc2V0RGlzdHJpYnV0aW9uW10+IHtcbiAgY29uc3QgZ2V0VXJsID0gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6bGlua2FnZScpLCBleHRyYWN0TWFuZGF0b3J5VXJsKCkpXG4gIGNvbnN0IGdldFByb3RvY29sU3RyID0gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6cHJvdG9jb2wnKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKVxuICBjb25zdCBnZXRQcm90b2NvbCA9IHBpcGUoZ2V0UHJvdG9jb2xTdHIsIG1hcChtYXRjaFByb3RvY29sKSlcbiAgY29uc3QgZ2V0T25saW5lRnVuY3Rpb24gPSBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6ZnVuY3Rpb24nLCAnZ21kOkNJX09uTGluZUZ1bmN0aW9uQ29kZScpLFxuICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKVxuICApXG4gIGNvbnN0IGdldElzU2VydmljZSA9IHBpcGUoXG4gICAgZ2V0UHJvdG9jb2wsXG4gICAgbWFwKChwcm90b2NvbCkgPT4gcHJvdG9jb2wgIT09ICdvdGhlcicpXG4gIClcbiAgY29uc3QgZ2V0SXNEb3dubG9hZCA9IHBpcGUoXG4gICAgY29tYmluZShnZXRJc1NlcnZpY2UsIGdldE9ubGluZUZ1bmN0aW9uLCBnZXRQcm90b2NvbFN0ciksXG4gICAgbWFwKFxuICAgICAgKFtpc1NlcnZpY2UsIG9ubGluZUZ1bmN0aW9uLCBwcm90b2NvbFN0cl0pID0+XG4gICAgICAgICghaXNTZXJ2aWNlICYmIG9ubGluZUZ1bmN0aW9uID09PSAnZG93bmxvYWQnKSB8fFxuICAgICAgICAvZG93bmxvYWQvaS50ZXN0KHByb3RvY29sU3RyKVxuICAgIClcbiAgKVxuICBjb25zdCBnZXROYW1lID0gcGlwZShmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6bmFtZScpLCBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkpXG4gIGNvbnN0IGdldERlc2NyaXB0aW9uID0gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZGVzY3JpcHRpb24nKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKVxuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoXG4gICAgICAnZ21kOnRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAnZ21kOk1EX0RpZ2l0YWxUcmFuc2Zlck9wdGlvbnMnLFxuICAgICAgJ2dtZDpvbkxpbmUnLFxuICAgICAgJ2dtZDpDSV9PbmxpbmVSZXNvdXJjZSdcbiAgICApLFxuICAgIG1hcEFycmF5KFxuICAgICAgY29tYmluZShcbiAgICAgICAgZ2V0SXNTZXJ2aWNlLFxuICAgICAgICBnZXRJc0Rvd25sb2FkLFxuICAgICAgICBnZXRQcm90b2NvbCxcbiAgICAgICAgZ2V0VXJsLFxuICAgICAgICBnZXROYW1lLFxuICAgICAgICBnZXREZXNjcmlwdGlvbixcbiAgICAgICAgZ2V0TWltZVR5cGVGblxuICAgICAgKVxuICAgICksXG4gICAgbWFwQXJyYXkoXG4gICAgICAoW2lzU2VydmljZSwgaXNEb3dubG9hZCwgcHJvdG9jb2wsIHVybCwgbmFtZSwgZGVzY3JpcHRpb24sIG1pbWVUeXBlXSkgPT4ge1xuICAgICAgICBpZiAoaXNTZXJ2aWNlKSB7XG4gICAgICAgICAgY29uc3QgaGFzSWRlbnRpZmllciA9IHByb3RvY29sID09PSAnd21zJyB8fCBwcm90b2NvbCA9PT0gJ3dmcydcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3NlcnZpY2UnLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBhY2Nlc3NTZXJ2aWNlUHJvdG9jb2w6IHByb3RvY29sLFxuICAgICAgICAgICAgLi4uKG5hbWUgJiYgaGFzSWRlbnRpZmllciAmJiB7IGlkZW50aWZpZXJJblNlcnZpY2U6IG5hbWUgfSksXG4gICAgICAgICAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEb3dubG9hZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZG93bmxvYWQnLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgIC4uLihtaW1lVHlwZSAmJiB7IG1pbWVUeXBlIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2xpbmsnLFxuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXG4gICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZUZyZXF1ZW5jeUZyb21DdXN0b21QZXJpb2QoXG4gIGlzb1BlcmlvZDogc3RyaW5nXG4pOiBVcGRhdGVGcmVxdWVuY3lDdXN0b20ge1xuICBpZiAoIWlzb1BlcmlvZCkgcmV0dXJuIG51bGxcbiAgY29uc3QgbWF0Y2hlcyA9IGlzb1BlcmlvZC5tYXRjaChcbiAgICAvXi0/UCg/OihbMC05XSspWSk/KD86KFswLTldKylNKT8oPzooWzAtOV0rKUQpP1Q/KD86KFswLTldKylIKT8vXG4gIClcbiAgaWYgKCFtYXRjaGVzKSByZXR1cm4gbnVsbFxuICBjb25zdCB5ZWFycyA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKSB8fCAwXG4gIGNvbnN0IG1vbnRocyA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDEwKSB8fCAwXG4gIGNvbnN0IGRheXMgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxMCkgfHwgMFxuICBjb25zdCBob3VycyA9IHBhcnNlSW50KG1hdGNoZXNbNF0sIDEwKSB8fCAwXG4gIGlmICh5ZWFycykge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICd5ZWFyJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogMSxcbiAgICB9XG4gIH0gZWxzZSBpZiAobW9udGhzID09PSAxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ21vbnRoJyxcbiAgICAgIHVwZGF0ZWRUaW1lczogMSxcbiAgICB9XG4gIH0gZWxzZSBpZiAobW9udGhzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ3llYXInLFxuICAgICAgdXBkYXRlZFRpbWVzOiBNYXRoLnJvdW5kKDEyIC8gbW9udGhzKSxcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGF5cyA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICBwZXI6ICdkYXknLFxuICAgICAgdXBkYXRlZFRpbWVzOiAxLFxuICAgIH1cbiAgfSBlbHNlIGlmIChkYXlzIDw9IDcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyOiAnd2VlaycsXG4gICAgICB1cGRhdGVkVGltZXM6IE1hdGgucm91bmQoNyAvIGRheXMgLSAwLjAwMDEpLCAvLyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGF0ICdldmVyeSAyIGRheXMnID0gJzMgdGltZXMgcGVyIHdlZWsnXG4gICAgfVxuICB9IGVsc2UgaWYgKGRheXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyOiAnbW9udGgnLFxuICAgICAgdXBkYXRlZFRpbWVzOiBNYXRoLnJvdW5kKDMwIC8gZGF5cyksXG4gICAgfVxuICB9IGVsc2UgaWYgKGhvdXJzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlcjogJ2RheScsXG4gICAgICB1cGRhdGVkVGltZXM6IE1hdGgucm91bmQoMjQgLyBkYXlzKSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuLy8gZnJvbSBnbWQ6TURfTWFpbnRlbmFuY2VJbmZvcm1hdGlvblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVcGRhdGVGcmVxdWVuY3koKTogQ2hhaW5hYmxlRnVuY3Rpb248XG4gIFhtbEVsZW1lbnQsXG4gIFVwZGF0ZUZyZXF1ZW5jeVxuPiB7XG4gIHJldHVybiBmYWxsYmFjayhcbiAgICBwaXBlKFxuICAgICAgZmluZENoaWxkRWxlbWVudCgnZ21kOk1EX01haW50ZW5hbmNlRnJlcXVlbmN5Q29kZScpLFxuICAgICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgICAgbWFwKGdldFVwZGF0ZUZyZXF1ZW5jeUZyb21GcmVxdWVuY3lDb2RlKVxuICAgICksXG4gICAgcGlwZShcbiAgICAgIGZpbmROZXN0ZWRFbGVtZW50KFxuICAgICAgICAnZ21kOnVzZXJEZWZpbmVkTWFpbnRlbmFuY2VGcmVxdWVuY3knLFxuICAgICAgICAnZ3RzOlRNX1BlcmlvZER1cmF0aW9uJ1xuICAgICAgKSxcbiAgICAgIHJlYWRUZXh0KCksXG4gICAgICBtYXAoZ2V0VXBkYXRlRnJlcXVlbmN5RnJvbUN1c3RvbVBlcmlvZClcbiAgICApLFxuICAgIG1hcCgoKSA9PiAndW5rbm93bicpXG4gIClcbn1cblxuLyoqXG4gKiBMb29rcyBmb3Igc3J2OlNWX1NlcnZpY2VJZGVudGlmaWNhdGlvbiBvciBnbWQ6TURfRGF0YUlkZW50aWZpY2F0aW9uIGVsZW1lbnRcbiAqIFdpbGwgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgZXhpc3RzLCBub3QgcmVhZGluZyB0aGUgdHlwZSBvZiB0aGUgcmVjb3JkXG4gKiAodGhpcyBhbGxvd3MgdXNpbmcgdGhpcyBmdW5jdGlvbiBpbiBvdGhlciBzaW1pbGFyIHNjaGVtYXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSWRlbnRpZmljYXRpb24oKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDppZGVudGlmaWNhdGlvbkluZm8nLCBmYWxzZSksXG4gICAgY29tYmluZShcbiAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpNRF9EYXRhSWRlbnRpZmljYXRpb24nLCBmYWxzZSksXG4gICAgICBmaW5kQ2hpbGRFbGVtZW50KCdzcnY6U1ZfU2VydmljZUlkZW50aWZpY2F0aW9uJywgZmFsc2UpXG4gICAgKSxcbiAgICBmaWx0ZXJBcnJheSgoZWwpID0+IGVsICE9PSBudWxsKSxcbiAgICBnZXRBdEluZGV4KDApXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJZGVudGlmaWNhdGlvbkRhdGUoXG4gIHR5cGU6ICdjcmVhdGlvbicgfCAncmV2aXNpb24nIHwgJ3B1YmxpY2F0aW9uJ1xuKSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmNpdGF0aW9uJywgJ2dtZDpDSV9DaXRhdGlvbicsICdnbWQ6ZGF0ZScpLFxuICAgIGZpbHRlckFycmF5KFxuICAgICAgcGlwZShcbiAgICAgICAgZmluZE5lc3RlZEVsZW1lbnRzKFxuICAgICAgICAgICdnbWQ6Q0lfRGF0ZScsXG4gICAgICAgICAgJ2dtZDpkYXRlVHlwZScsXG4gICAgICAgICAgJ2dtZDpDSV9EYXRlVHlwZUNvZGUnXG4gICAgICAgICksXG4gICAgICAgIGdldEF0SW5kZXgoMCksXG4gICAgICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSxcbiAgICAgICAgbWFwKCh2YWx1ZSkgPT4gdmFsdWUgPT09IHR5cGUpXG4gICAgICApXG4gICAgKSxcbiAgICBnZXRBdEluZGV4KDApLFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOkNJX0RhdGUnLCAnZ21kOmRhdGUnKSxcbiAgICBnZXRBdEluZGV4KDApLFxuICAgIGV4dHJhY3REYXRlVGltZSgpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXRpYWxSZXByZXNlbnRhdGlvbkZyb21Db2RlKFxuICBzcGF0aWFsUmVwcmVzZW50YXRpb25Db2RlOiBzdHJpbmdcbik6IFNwYXRpYWxSZXByZXNlbnRhdGlvblR5cGUgfCBudWxsIHtcbiAgc3dpdGNoIChzcGF0aWFsUmVwcmVzZW50YXRpb25Db2RlKSB7XG4gICAgY2FzZSAnZ3JpZCc6XG4gICAgY2FzZSAndmVjdG9yJzpcbiAgICBjYXNlICd0aW4nOlxuICAgIGNhc2UgJ3RhYmxlJzpcbiAgICBjYXNlICdwb2ludCc6XG4gICAgICByZXR1cm4gc3BhdGlhbFJlcHJlc2VudGF0aW9uQ29kZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkVW5pcXVlSWRlbnRpZmllcihyb290RWw6IFhtbEVsZW1lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6ZmlsZUlkZW50aWZpZXInLCBmYWxzZSksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEtpbmQocm9vdEVsOiBYbWxFbGVtZW50KTogUmVjb3JkS2luZCB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6aGllcmFyY2h5TGV2ZWwnLCAnZ21kOk1EX1Njb3BlQ29kZScpLFxuICAgIHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSxcbiAgICBtYXAoXG4gICAgICAoc2NvcGVDb2RlKTogUmVjb3JkS2luZCA9PlxuICAgICAgICBzY29wZUNvZGUgPT09ICdzZXJ2aWNlJyA/ICdzZXJ2aWNlJyA6ICdkYXRhc2V0J1xuICAgIClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3duZXJPcmdhbml6YXRpb24ocm9vdEVsOiBYbWxFbGVtZW50KTogT3JnYW5pemF0aW9uIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoJ2dtZDpjb250YWN0JywgJ2dtZDpDSV9SZXNwb25zaWJsZVBhcnR5JyksXG4gICAgZXh0cmFjdE9yZ2FuaXphdGlvbigpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlc291cmNlVXBkYXRlZChyb290RWw6IFhtbEVsZW1lbnQpOiBEYXRlIHtcbiAgcmV0dXJuIGV4dHJhY3RJZGVudGlmaWNhdGlvbkRhdGUoJ3JldmlzaW9uJykocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlc291cmNlQ3JlYXRlZChyb290RWw6IFhtbEVsZW1lbnQpOiBEYXRlIHtcbiAgcmV0dXJuIGV4dHJhY3RJZGVudGlmaWNhdGlvbkRhdGUoJ2NyZWF0aW9uJykocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlc291cmNlUHVibGlzaGVkKHJvb3RFbDogWG1sRWxlbWVudCk6IERhdGUge1xuICByZXR1cm4gZXh0cmFjdElkZW50aWZpY2F0aW9uRGF0ZSgncHVibGljYXRpb24nKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVjb3JkVXBkYXRlZChyb290RWw6IFhtbEVsZW1lbnQpOiBEYXRlIHtcbiAgcmV0dXJuIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmRhdGVTdGFtcCcpLCBleHRyYWN0RGF0ZVRpbWUoKSkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFRpdGxlKHJvb3RFbDogWG1sRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGZpbmROZXN0ZWRFbGVtZW50KCdnbWQ6Y2l0YXRpb24nLCAnZ21kOkNJX0NpdGF0aW9uJywgJ2dtZDp0aXRsZScpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBYnN0cmFjdChyb290RWw6IFhtbEVsZW1lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6YWJzdHJhY3QnLCBmYWxzZSksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRhY3RzKHJvb3RFbDogWG1sRWxlbWVudCk6IEluZGl2aWR1YWxbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpjb250YWN0JywgZmFsc2UpLFxuICAgIG1hcEFycmF5KGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpDSV9SZXNwb25zaWJsZVBhcnR5JywgZmFsc2UpKSxcbiAgICBtYXBBcnJheShleHRyYWN0SW5kaXZpZHVhbCgpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDb250YWN0c0ZvclJlc291cmNlKHJvb3RFbDogWG1sRWxlbWVudCk6IEluZGl2aWR1YWxbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmRJZGVudGlmaWNhdGlvbigpLFxuICAgIGNvbWJpbmUoXG4gICAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6Y29udGFjdCcsIGZhbHNlKSxcbiAgICAgIGZpbmRDaGlsZHJlbkVsZW1lbnQoJ2dtZDpwb2ludE9mQ29udGFjdCcsIGZhbHNlKVxuICAgICksXG4gICAgZmxhdHRlbkFycmF5KCksXG4gICAgbWFwQXJyYXkoZmluZENoaWxkRWxlbWVudCgnZ21kOkNJX1Jlc3BvbnNpYmxlUGFydHknLCBmYWxzZSkpLFxuICAgIG1hcEFycmF5KGV4dHJhY3RJbmRpdmlkdWFsKCkpXG4gICkocm9vdEVsKVxufVxuXG4vLyBmcm9tIGdtZDp0aGVzYXVydXNOYW1lXG5leHBvcnQgZnVuY3Rpb24gcmVhZFRoZXNhdXJ1cyhyb290RWw6IFhtbEVsZW1lbnQpOiBLZXl3b3JkVGhlc2F1cnVzIHtcbiAgaWYgKCFyb290RWwpIHJldHVybiBudWxsXG5cbiAgY29uc3QgZmluZElkZW50aWZpZXIgPSBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAnZ21kOkNJX0NpdGF0aW9uJyxcbiAgICAnZ21kOmlkZW50aWZpZXInLFxuICAgICdnbWQ6TURfSWRlbnRpZmllcicsXG4gICAgJ2dtZDpjb2RlJ1xuICApXG4gIGNvbnN0IGlkID0gcGlwZShmaW5kSWRlbnRpZmllciwgZXh0cmFjdENoYXJhY3RlclN0cmluZygpKShyb290RWwpXG4gIGNvbnN0IHVybCA9IHBpcGUoZmluZElkZW50aWZpZXIsIGV4dHJhY3RVcmwoKSkocm9vdEVsKVxuICBjb25zdCBuYW1lID0gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOkNJX0NpdGF0aW9uJywgJ2dtZDp0aXRsZScpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApKHJvb3RFbClcbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXG4gICAgLi4uKHVybCAmJiB7IHVybCB9KSxcbiAgfVxufVxuXG4vLyBmcm9tIGdtZDpNRF9LZXl3b3Jkc1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRLZXl3b3JkR3JvdXAocm9vdEVsOiBYbWxFbGVtZW50KTogS2V5d29yZFtdIHtcbiAgY29uc3QgdHlwZSA9IHBpcGUoXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOk1EX0tleXdvcmRUeXBlQ29kZScpLFxuICAgIG1hcEFycmF5KHJlYWRBdHRyaWJ1dGUoJ2NvZGVMaXN0VmFsdWUnKSksXG4gICAgbWFwKCh2YWx1ZXMpID0+IGdldEtleXdvcmRUeXBlRnJvbUtleXdvcmRUeXBlQ29kZSh2YWx1ZXNbMF0pKVxuICApKHJvb3RFbClcbiAgY29uc3QgdGhlc2F1cnVzID0gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOnRoZXNhdXJ1c05hbWUnKSxcbiAgICByZWFkVGhlc2F1cnVzXG4gICkocm9vdEVsKVxuICByZXR1cm4gcGlwZShcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6a2V5d29yZCcpLFxuICAgIG1hcEFycmF5KChlbCkgPT4ge1xuICAgICAgY29uc3QgbGFiZWwgPSBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkoZWwpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4odGhlc2F1cnVzID8geyB0aGVzYXVydXMgfSA6IHt9KSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHR5cGUsXG4gICAgICB9IGFzIEtleXdvcmRcbiAgICB9KVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRLZXl3b3Jkcyhyb290RWw6IFhtbEVsZW1lbnQpOiBLZXl3b3JkW10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpkZXNjcmlwdGl2ZUtleXdvcmRzJywgJ2dtZDpNRF9LZXl3b3JkcycpLFxuICAgIG1hcEFycmF5KHJlYWRLZXl3b3JkR3JvdXApLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFN0YXR1cyhyb290RWw6IFhtbEVsZW1lbnQpOiBSZWNvcmRTdGF0dXMge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRFbGVtZW50KCdnbWQ6c3RhdHVzJywgZmFsc2UpLFxuICAgIGV4dHJhY3RTdGF0dXMoKVxuICApKHJvb3RFbClcbn1cblxuY29uc3QgZ2V0Q29uc3RyYWludHMgPSBwaXBlKFxuICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOnJlc291cmNlQ29uc3RyYWludHMnLCBmYWxzZSlcbilcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRMZWdhbENvbnN0cmFpbnRzKHJvb3RFbDogWG1sRWxlbWVudCk6IENvbnN0cmFpbnRbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGdldENvbnN0cmFpbnRzLFxuICAgIG1hcEFycmF5KGV4dHJhY3RMZWdhbENvbnN0cmFpbnRzKCkpLFxuICAgIGZsYXR0ZW5BcnJheSgpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFNlY3VyaXR5Q29uc3RyYWludHMocm9vdEVsOiBYbWxFbGVtZW50KTogQ29uc3RyYWludFtdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZ2V0Q29uc3RyYWludHMsXG4gICAgbWFwQXJyYXkoZXh0cmFjdFNlY3VyaXR5Q29uc3RyYWludHMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3RoZXJDb25zdHJhaW50cyhyb290RWw6IFhtbEVsZW1lbnQpOiBDb25zdHJhaW50W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBnZXRDb25zdHJhaW50cyxcbiAgICBtYXBBcnJheShleHRyYWN0T3RoZXJDb25zdHJhaW50cygpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRMaWNlbnNlcyhyb290RWw6IFhtbEVsZW1lbnQpOiBDb25zdHJhaW50W10ge1xuICByZXR1cm4gcGlwZShcbiAgICBnZXRDb25zdHJhaW50cyxcbiAgICBtYXBBcnJheShleHRyYWN0TGljZW5zZXMoKSksXG4gICAgZmxhdHRlbkFycmF5KClcbiAgKShyb290RWwpXG59XG5cbi8vIG5vdCB1c2VkIHlldFxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRJc29Ub3BpY3Mocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nW10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kQ2hpbGRyZW5FbGVtZW50KCdnbWQ6TURfVG9waWNDYXRlZ29yeUNvZGUnLCB0cnVlKSxcbiAgICBtYXBBcnJheShyZWFkVGV4dCgpKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTcGF0aWFsUmVwcmVzZW50YXRpb24oXG4gIHJvb3RFbDogWG1sRWxlbWVudFxuKTogU3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZSB8IG51bGwge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kSWRlbnRpZmljYXRpb24oKSxcbiAgICBmaW5kTmVzdGVkRWxlbWVudChcbiAgICAgICdnbWQ6c3BhdGlhbFJlcHJlc2VudGF0aW9uVHlwZScsXG4gICAgICAnZ21kOk1EX1NwYXRpYWxSZXByZXNlbnRhdGlvblR5cGVDb2RlJ1xuICAgICksXG4gICAgcmVhZEF0dHJpYnV0ZSgnY29kZUxpc3RWYWx1ZScpLFxuICAgIG1hcChnZXRTcGF0aWFsUmVwcmVzZW50YXRpb25Gcm9tQ29kZSlcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3ZlcnZpZXdzKHJvb3RFbDogWG1sRWxlbWVudCk6IEdyYXBoaWNPdmVydmlld1tdIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZENoaWxkcmVuRWxlbWVudCgnZ21kOmdyYXBoaWNPdmVydmlldycsIGZhbHNlKSxcbiAgICBtYXBBcnJheShcbiAgICAgIGNvbWJpbmUoXG4gICAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVOYW1lJyksIGV4dHJhY3RNYW5kYXRvcnlVcmwoKSksXG4gICAgICAgIHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmZpbGVEZXNjcmlwdGlvbicpLCBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKCkpXG4gICAgICApXG4gICAgKSxcbiAgICBtYXBBcnJheSgoW3VybCwgZGVzY3JpcHRpb25dKSA9PiAoe1xuICAgICAgdXJsLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgfSkpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZExpbmVhZ2Uocm9vdEVsOiBYbWxFbGVtZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAnZ21kOmRhdGFRdWFsaXR5SW5mbycsXG4gICAgICAnZ21kOkRRX0RhdGFRdWFsaXR5JyxcbiAgICAgICdnbWQ6bGluZWFnZScsXG4gICAgICAnZ21kOkxJX0xpbmVhZ2UnLFxuICAgICAgJ2dtZDpzdGF0ZW1lbnQnXG4gICAgKSxcbiAgICBleHRyYWN0Q2hhcmFjdGVyU3RyaW5nKClcbiAgKShyb290RWwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGlzdHJpYnV0aW9ucyhyb290RWw6IFhtbEVsZW1lbnQpOiBEYXRhc2V0RGlzdHJpYnV0aW9uW10ge1xuICByZXR1cm4gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudHMoJ2dtZDpkaXN0cmlidXRpb25JbmZvJywgJ2dtZDpNRF9EaXN0cmlidXRpb24nKSxcbiAgICBtYXBBcnJheShleHRyYWN0RGF0YXNldERpc3RyaWJ1dGlvbnMoZ2V0TWltZVR5cGUpKSxcbiAgICBmbGF0dGVuQXJyYXkoKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVcGRhdGVGcmVxdWVuY3kocm9vdEVsOiBYbWxFbGVtZW50KTogVXBkYXRlRnJlcXVlbmN5IHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAnZ21kOnJlc291cmNlTWFpbnRlbmFuY2UnLFxuICAgICAgJ2dtZDpNRF9NYWludGVuYW5jZUluZm9ybWF0aW9uJ1xuICAgICksXG4gICAgZXh0cmFjdFVwZGF0ZUZyZXF1ZW5jeSgpLFxuICAgIG1hcCgodXBkYXRlRnJlcXVlbmN5KSA9PiB1cGRhdGVGcmVxdWVuY3kgfHwgJ3Vua25vd24nKVxuICApKHJvb3RFbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTZXJ2aWNlT25saW5lUmVzb3VyY2VzKCk6IENoYWluYWJsZUZ1bmN0aW9uPFxuICBYbWxFbGVtZW50LFxuICBTZXJ2aWNlT25saW5lUmVzb3VyY2VbXVxuPiB7XG4gIGNvbnN0IGdldFVybCA9IHBpcGUoZmluZENoaWxkRWxlbWVudCgnZ21kOmxpbmthZ2UnKSwgZXh0cmFjdE1hbmRhdG9yeVVybCgpKVxuICBjb25zdCBnZXRQcm90b2NvbFN0ciA9IHBpcGUoXG4gICAgZmluZENoaWxkRWxlbWVudCgnZ21kOnByb3RvY29sJyksXG4gICAgZXh0cmFjdENoYXJhY3RlclN0cmluZygpXG4gIClcbiAgY29uc3QgZ2V0UHJvdG9jb2wgPSBwaXBlKGdldFByb3RvY29sU3RyLCBtYXAobWF0Y2hQcm90b2NvbCkpXG4gIGNvbnN0IGdldE9ubGluZUZ1bmN0aW9uID0gcGlwZShcbiAgICBmaW5kTmVzdGVkRWxlbWVudCgnZ21kOmZ1bmN0aW9uJywgJ2dtZDpDSV9PbkxpbmVGdW5jdGlvbkNvZGUnKSxcbiAgICByZWFkQXR0cmlidXRlKCdjb2RlTGlzdFZhbHVlJylcbiAgKVxuICBjb25zdCBnZXRJc0xpbmsgPSBwaXBlKFxuICAgIGdldE9ubGluZUZ1bmN0aW9uLFxuICAgIG1hcCgob25saW5lRnVuY3Rpb24pID0+IG9ubGluZUZ1bmN0aW9uID09PSAnaW5mb3JtYXRpb24nKVxuICApXG4gIGNvbnN0IGdldE5hbWUgPSBwaXBlKGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpuYW1lJyksIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKSlcbiAgY29uc3QgZ2V0RGVzY3JpcHRpb24gPSBwaXBlKFxuICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtZDpkZXNjcmlwdGlvbicpLFxuICAgIGV4dHJhY3RDaGFyYWN0ZXJTdHJpbmcoKVxuICApXG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cyhcbiAgICAgICdnbWQ6dHJhbnNmZXJPcHRpb25zJyxcbiAgICAgICdnbWQ6TURfRGlnaXRhbFRyYW5zZmVyT3B0aW9ucycsXG4gICAgICAnZ21kOm9uTGluZScsXG4gICAgICAnZ21kOkNJX09ubGluZVJlc291cmNlJ1xuICAgICksXG4gICAgbWFwQXJyYXkoY29tYmluZShnZXRJc0xpbmssIGdldFByb3RvY29sLCBnZXRVcmwsIGdldE5hbWUsIGdldERlc2NyaXB0aW9uKSksXG4gICAgbWFwQXJyYXkoKFtpc0xpbmssIHByb3RvY29sLCB1cmwsIG5hbWUsIGRlc2NyaXB0aW9uXSkgPT4ge1xuICAgICAgaWYgKGlzTGluaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXG4gICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ2VuZHBvaW50JyxcbiAgICAgICAgICBlbmRwb2ludFVybDogdXJsLFxuICAgICAgICAgIHByb3RvY29sLFxuICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE9ubGluZVJlc291cmNlcyhcbiAgcm9vdEVsOiBYbWxFbGVtZW50XG4pOiBTZXJ2aWNlT25saW5lUmVzb3VyY2VbXSB7XG4gIHJldHVybiBwaXBlKFxuICAgIGZpbmROZXN0ZWRFbGVtZW50cygnZ21kOmRpc3RyaWJ1dGlvbkluZm8nLCAnZ21kOk1EX0Rpc3RyaWJ1dGlvbicpLFxuICAgIG1hcEFycmF5KGV4dHJhY3RTZXJ2aWNlT25saW5lUmVzb3VyY2VzKCkpLFxuICAgIGZsYXR0ZW5BcnJheSgpXG4gICkocm9vdEVsKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFRlbXBvcmFsRXh0ZW50cyhyb290RWw6IFhtbEVsZW1lbnQpIHtcbiAgcmV0dXJuIHBpcGUoXG4gICAgZmluZElkZW50aWZpY2F0aW9uKCksXG4gICAgZmluZE5lc3RlZEVsZW1lbnRzKCdnbWQ6ZXh0ZW50JywgJ2dtZDpFWF9FeHRlbnQnLCAnZ21kOnRlbXBvcmFsRWxlbWVudCcpLFxuICAgIG1hcEFycmF5KFxuICAgICAgY29tYmluZShcbiAgICAgICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAgICAgJ2dtZDpFWF9UZW1wb3JhbEV4dGVudCcsXG4gICAgICAgICAgJ2dtZDpleHRlbnQnLFxuICAgICAgICAgICdnbWw6VGltZVBlcmlvZCdcbiAgICAgICAgKSxcbiAgICAgICAgZmluZE5lc3RlZEVsZW1lbnQoXG4gICAgICAgICAgJ2dtZDpFWF9UZW1wb3JhbEV4dGVudCcsXG4gICAgICAgICAgJ2dtZDpleHRlbnQnLFxuICAgICAgICAgICdnbWw6VGltZUluc3RhbnQnXG4gICAgICAgIClcbiAgICAgIClcbiAgICApLFxuICAgIG1hcEFycmF5KChbcGVyaW9kRWwsIGluc3RhbnRFbF0pID0+IHtcbiAgICAgIGlmIChwZXJpb2RFbCkge1xuICAgICAgICByZXR1cm4gcGlwZShcbiAgICAgICAgICBjb21iaW5lKFxuICAgICAgICAgICAgcGlwZShcbiAgICAgICAgICAgICAgZmluZENoaWxkRWxlbWVudCgnZ21sOmJlZ2luUG9zaXRpb24nLCBmYWxzZSksXG4gICAgICAgICAgICAgIHJlYWRUZXh0KCksXG4gICAgICAgICAgICAgIG1hcCgoZGF0ZVN0cikgPT4gKGRhdGVTdHIgPyBuZXcgRGF0ZShkYXRlU3RyKSA6IG51bGwpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBpcGUoXG4gICAgICAgICAgICAgIGZpbmRDaGlsZEVsZW1lbnQoJ2dtbDplbmRQb3NpdGlvbicsIGZhbHNlKSxcbiAgICAgICAgICAgICAgcmVhZFRleHQoKSxcbiAgICAgICAgICAgICAgbWFwKChkYXRlU3RyKSA9PiAoZGF0ZVN0ciA/IG5ldyBEYXRlKGRhdGVTdHIpIDogbnVsbCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtYXAoKFtzdGFydCwgZW5kXSkgPT4gKHtcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgIH0pKVxuICAgICAgICApKHBlcmlvZEVsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBpcGUoXG4gICAgICAgICAgZmluZENoaWxkRWxlbWVudCgnZ21sOnRpbWVQb3NpdGlvbicsIGZhbHNlKSxcbiAgICAgICAgICByZWFkVGV4dCgpLFxuICAgICAgICAgIG1hcCgoZGF0ZVN0cikgPT4gKGRhdGVTdHIgPyBuZXcgRGF0ZShkYXRlU3RyKSA6IG51bGwpKSxcbiAgICAgICAgICBtYXAoKGRhdGUpID0+ICh7XG4gICAgICAgICAgICBzdGFydDogZGF0ZSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKShpbnN0YW50RWwpXG4gICAgICB9XG4gICAgfSlcbiAgKShyb290RWwpXG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Parts are [firstName, lastName]
3
+ * Second part will be null if no separation could be done
4
+ * @param fullName
5
+ */
6
+ export function fullNameToParts(fullName) {
7
+ const parts = fullName.trim().split(/\s+/);
8
+ const first = parts.shift();
9
+ return [first, parts.join(' ').trim() || null];
10
+ }
11
+ export function namePartsToFull(firstName, lastName) {
12
+ const first = firstName?.trim();
13
+ const last = lastName?.trim();
14
+ if (!first && !last)
15
+ return null;
16
+ return last && first ? `${first} ${last}` : last || first;
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kaXZpZHVhbC1uYW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvbWV0YWRhdGEtY29udmVydGVyL3NyYy9saWIvaXNvMTkxMzkvdXRpbHMvaW5kaXZpZHVhbC1uYW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzNCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsU0FBd0IsRUFDeEIsUUFBdUI7SUFFdkIsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQy9CLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQTtJQUM3QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2hDLE9BQU8sSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUE7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFydHMgYXJlIFtmaXJzdE5hbWUsIGxhc3ROYW1lXVxuICogU2Vjb25kIHBhcnQgd2lsbCBiZSBudWxsIGlmIG5vIHNlcGFyYXRpb24gY291bGQgYmUgZG9uZVxuICogQHBhcmFtIGZ1bGxOYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmdWxsTmFtZVRvUGFydHMoZnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZyB8IG51bGxdIHtcbiAgY29uc3QgcGFydHMgPSBmdWxsTmFtZS50cmltKCkuc3BsaXQoL1xccysvKVxuICBjb25zdCBmaXJzdCA9IHBhcnRzLnNoaWZ0KClcbiAgcmV0dXJuIFtmaXJzdCwgcGFydHMuam9pbignICcpLnRyaW0oKSB8fCBudWxsXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmFtZVBhcnRzVG9GdWxsKFxuICBmaXJzdE5hbWU6IHN0cmluZyB8IG51bGwsXG4gIGxhc3ROYW1lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZmlyc3QgPSBmaXJzdE5hbWU/LnRyaW0oKVxuICBjb25zdCBsYXN0ID0gbGFzdE5hbWU/LnRyaW0oKVxuICBpZiAoIWZpcnN0ICYmICFsYXN0KSByZXR1cm4gbnVsbFxuICByZXR1cm4gbGFzdCAmJiBmaXJzdCA/IGAke2ZpcnN0fSAke2xhc3R9YCA6IGxhc3QgfHwgZmlyc3Rcbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ export function getKeywordTypeFromKeywordTypeCode(typeCode) {
2
+ if (!typeCode)
3
+ return 'other';
4
+ switch (typeCode) {
5
+ case 'theme':
6
+ case 'place':
7
+ case 'temporal':
8
+ case 'other':
9
+ return typeCode;
10
+ default:
11
+ return 'other';
12
+ }
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5d29yZC5tYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9tZXRhZGF0YS1jb252ZXJ0ZXIvc3JjL2xpYi9pc28xOTEzOS91dGlscy9rZXl3b3JkLm1hcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsaUNBQWlDLENBQy9DLFFBQWdCO0lBRWhCLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxPQUFPLENBQUE7SUFDN0IsUUFBUSxRQUFRLEVBQUU7UUFDaEIsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssT0FBTztZQUNWLE9BQU8sUUFBUSxDQUFBO1FBQ2pCO1lBQ0UsT0FBTyxPQUFPLENBQUE7S0FDakI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5d29yZFR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9kb21haW4vc3JjL2xpYi9tb2RlbC9yZWNvcmQnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXl3b3JkVHlwZUZyb21LZXl3b3JkVHlwZUNvZGUoXG4gIHR5cGVDb2RlOiBzdHJpbmdcbik6IEtleXdvcmRUeXBlIHtcbiAgaWYgKCF0eXBlQ29kZSkgcmV0dXJuICdvdGhlcidcbiAgc3dpdGNoICh0eXBlQ29kZSkge1xuICAgIGNhc2UgJ3RoZW1lJzpcbiAgICBjYXNlICdwbGFjZSc6XG4gICAgY2FzZSAndGVtcG9yYWwnOlxuICAgIGNhc2UgJ290aGVyJzpcbiAgICAgIHJldHVybiB0eXBlQ29kZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ290aGVyJ1xuICB9XG59XG4iXX0=