@tilde-nlp/ngx-common 4.0.7 → 4.0.9

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 (224) hide show
  1. package/esm2022/lib/close-button/close-button.component.mjs +4 -4
  2. package/esm2022/lib/close-button/close-button.module.mjs +5 -5
  3. package/esm2022/lib/company-product/company-product.component.mjs +4 -4
  4. package/esm2022/lib/company-product/company-product.module.mjs +5 -5
  5. package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +4 -4
  6. package/esm2022/lib/confirmation-modal/confirmation-modal.module.mjs +5 -5
  7. package/esm2022/lib/confirmation-modal/services/confirmation.service.mjs +4 -4
  8. package/esm2022/lib/constants/index.mjs +2 -0
  9. package/esm2022/lib/constants/screen-size.const.mjs +11 -0
  10. package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +4 -4
  11. package/esm2022/lib/directives/click-outside/click-outside.module.mjs +5 -5
  12. package/esm2022/lib/directives/drag-and-drop/drag-and-drop.directive.mjs +4 -4
  13. package/esm2022/lib/directives/drag-and-drop/drag-and-drop.module.mjs +5 -5
  14. package/esm2022/lib/directives/mat-button-loading/mat-button-loading.directive.mjs +4 -4
  15. package/esm2022/lib/directives/mat-button-loading/mat-button-loading.module.mjs +5 -5
  16. package/esm2022/lib/file-upload/file-upload.component.mjs +5 -5
  17. package/esm2022/lib/file-upload/file-upload.module.mjs +5 -5
  18. package/esm2022/lib/filter-bar/filter-bar.component.mjs +4 -4
  19. package/esm2022/lib/filter-bar/filter-bar.module.mjs +5 -5
  20. package/esm2022/lib/footer/footer.component.mjs +4 -4
  21. package/esm2022/lib/footer/footer.module.mjs +5 -5
  22. package/esm2022/lib/helpers/auth-headers.helper.mjs +21 -0
  23. package/esm2022/lib/helpers/conversion.helper.mjs +11 -0
  24. package/esm2022/lib/helpers/file-extension.helper.mjs +6 -0
  25. package/esm2022/lib/helpers/html.helper.mjs +54 -0
  26. package/esm2022/lib/helpers/index.mjs +7 -1
  27. package/esm2022/lib/helpers/resolution.helper.mjs +7 -0
  28. package/esm2022/lib/helpers/sort.helper.mjs +10 -0
  29. package/esm2022/lib/inline-message/inline-message.component.mjs +4 -4
  30. package/esm2022/lib/inline-message/inline-message.module.mjs +5 -5
  31. package/esm2022/lib/multi-functional-table/multi-functional-table.component.mjs +4 -4
  32. package/esm2022/lib/multi-functional-table/multi-functional-table.module.mjs +5 -5
  33. package/esm2022/lib/notification-message/notification-message.component.mjs +4 -4
  34. package/esm2022/lib/notification-message/notification-message.module.mjs +5 -5
  35. package/esm2022/lib/open-close-button/index.mjs +5 -0
  36. package/esm2022/lib/open-close-button/injection-tokens/index.mjs +2 -0
  37. package/esm2022/lib/open-close-button/injection-tokens/open-close-btn-icons.token.mjs +2 -0
  38. package/esm2022/lib/open-close-button/models/index.mjs +2 -0
  39. package/esm2022/lib/open-close-button/models/open-close-btn-icons.model.mjs +2 -0
  40. package/esm2022/lib/open-close-button/open-close-button.component.mjs +53 -0
  41. package/esm2022/lib/open-close-button/open-close-button.module.mjs +21 -0
  42. package/esm2022/lib/pipes/date-ago/date-ago.module.mjs +5 -5
  43. package/esm2022/lib/pipes/date-ago/date-ago.pipe.mjs +4 -4
  44. package/esm2022/lib/pipes/filter-with-highlight/filter-with-highlight.module.mjs +5 -5
  45. package/esm2022/lib/pipes/filter-with-highlight/filter-with-highlight.pipe.mjs +4 -4
  46. package/esm2022/lib/pipes/sort-translations/sort-translations.module.mjs +5 -5
  47. package/esm2022/lib/pipes/sort-translations/sort-translations.pipe.mjs +4 -4
  48. package/esm2022/lib/pipes/sort-translations-by-property/sort-translations-by-property.module.mjs +5 -5
  49. package/esm2022/lib/pipes/sort-translations-by-property/sort-translations-by-property.pipe.mjs +4 -4
  50. package/esm2022/lib/plausible/plausible-event.directive.mjs +4 -4
  51. package/esm2022/lib/plausible/plausible.module.mjs +5 -5
  52. package/esm2022/lib/services/alert/alert.service.mjs +153 -0
  53. package/esm2022/lib/services/alert/index.mjs +4 -0
  54. package/esm2022/lib/services/alert/injection-tokens/alert-configuration.token.mjs +2 -0
  55. package/esm2022/lib/services/alert/injection-tokens/index.mjs +2 -0
  56. package/esm2022/lib/services/alert/models/alert-configuration.model.mjs +2 -0
  57. package/esm2022/lib/services/alert/models/index.mjs +2 -0
  58. package/esm2022/lib/services/dom/dom.service.mjs +21 -0
  59. package/esm2022/lib/services/dom/index.mjs +2 -0
  60. package/esm2022/lib/services/icon/icon.service.mjs +35 -0
  61. package/esm2022/lib/services/icon/index.mjs +2 -0
  62. package/esm2022/lib/services/index.mjs +5 -3
  63. package/esm2022/lib/services/system/index.mjs +2 -0
  64. package/esm2022/lib/services/system/system.service.mjs +23 -0
  65. package/esm2022/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-card/terminology-collection-card.component.mjs +59 -0
  66. package/esm2022/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-list.component.mjs +59 -0
  67. package/esm2022/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection-dialog/terminology-create-collection-dialog.component.mjs +58 -0
  68. package/esm2022/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection.component.mjs +50 -0
  69. package/esm2022/lib/terminology/components/terminology-panel/terminology-panel.component.mjs +49 -0
  70. package/esm2022/lib/terminology/config/models/index.mjs +2 -0
  71. package/esm2022/lib/terminology/config/models/terminology-config.model.mjs +2 -0
  72. package/esm2022/lib/terminology/config/services/index.mjs +2 -0
  73. package/esm2022/lib/terminology/config/services/terminology-config/terminology-config.service.mjs +45 -0
  74. package/esm2022/lib/terminology/enums/combined-collection-tooltip-key.enum.mjs +6 -0
  75. package/esm2022/lib/terminology/enums/engine-term-collection-scope.enum.mjs +7 -0
  76. package/esm2022/lib/terminology/enums/engine-term-collection-source.enum.mjs +6 -0
  77. package/esm2022/lib/terminology/enums/engine-term-collection-status.enum.mjs +8 -0
  78. package/esm2022/lib/terminology/enums/engine-term-collection-sub-status.enum.mjs +14 -0
  79. package/esm2022/lib/terminology/enums/index.mjs +7 -0
  80. package/esm2022/lib/terminology/enums/mt-collection-status.enum.mjs +11 -0
  81. package/esm2022/lib/terminology/enums/mt-term-collection-v1-status.enum.mjs +7 -0
  82. package/esm2022/lib/terminology/enums/system-metadata-key.enum.mjs +7 -0
  83. package/esm2022/lib/terminology/enums/translation-api-version.model.mjs +6 -0
  84. package/esm2022/lib/terminology/factories/terminology-api.factory.mjs +12 -0
  85. package/esm2022/lib/terminology/factories/terminology-system.factory.mjs +13 -0
  86. package/esm2022/lib/terminology/index.mjs +8 -0
  87. package/esm2022/lib/terminology/injection-tokens/terminology-api.token.mjs +2 -0
  88. package/esm2022/lib/terminology/injection-tokens/terminology-system.token.mjs +2 -0
  89. package/esm2022/lib/terminology/models/active-data.model.mjs +2 -0
  90. package/esm2022/lib/terminology/models/add-engine-terms-request-params.model.mjs +2 -0
  91. package/esm2022/lib/terminology/models/api-system.model.mjs +2 -0
  92. package/esm2022/lib/terminology/models/combined-collection.model.mjs +189 -0
  93. package/esm2022/lib/terminology/models/default-term-collection-order-update.model.mjs +2 -0
  94. package/esm2022/lib/terminology/models/domain.model.mjs +2 -0
  95. package/esm2022/lib/terminology/models/engine-term-collection-access-scope-update.model.mjs +2 -0
  96. package/esm2022/lib/terminology/models/engine-term-collection-access-scope.model.mjs +2 -0
  97. package/esm2022/lib/terminology/models/engine-term-collection-access-update.model.mjs +2 -0
  98. package/esm2022/lib/terminology/models/engine-term-collection-access.model.mjs +2 -0
  99. package/esm2022/lib/terminology/models/engine-term-collection-list.model.mjs +2 -0
  100. package/esm2022/lib/terminology/models/engine-term-collection.model.mjs +2 -0
  101. package/esm2022/lib/terminology/models/get-langauge-direction.mjs +2 -0
  102. package/esm2022/lib/terminology/models/index.mjs +20 -0
  103. package/esm2022/lib/terminology/models/lang-list-item.model.mjs +2 -0
  104. package/esm2022/lib/terminology/models/mt-collection.model.mjs +2 -0
  105. package/esm2022/lib/terminology/models/mt-term-collection-v1.model.mjs +2 -0
  106. package/esm2022/lib/terminology/models/mt-term-service.model.mjs +2 -0
  107. package/esm2022/lib/terminology/models/system-api-service.model.mjs +2 -0
  108. package/esm2022/lib/terminology/models/system.model.mjs +2 -0
  109. package/esm2022/lib/terminology/models/terminology-engine.model.mjs +2 -0
  110. package/esm2022/lib/terminology/models/tld-term-collection-languages.model.mjs +2 -0
  111. package/esm2022/lib/terminology/models/tld-term-collection.model.mjs +2 -0
  112. package/esm2022/lib/terminology/models/update-engine-terms-request-params.model.mjs +2 -0
  113. package/esm2022/lib/terminology/models/vendor.model.mjs +2 -0
  114. package/esm2022/lib/terminology/services/engine-term-api/engine-term-api.service.mjs +51 -0
  115. package/esm2022/lib/terminology/services/engine-term-api/index.mjs +2 -0
  116. package/esm2022/lib/terminology/services/index.mjs +6 -0
  117. package/esm2022/lib/terminology/services/system-api-v1/system-api-v1.service.mjs +57 -0
  118. package/esm2022/lib/terminology/services/system-api-v2/system-api-v2.service.mjs +63 -0
  119. package/esm2022/lib/terminology/services/terminology/terminology.service.mjs +309 -0
  120. package/esm2022/lib/terminology/services/terminology-api-v1/terminology-api-v1.service.mjs +58 -0
  121. package/esm2022/lib/terminology/services/terminology-api-v2/terminology-api-v2.service.mjs +84 -0
  122. package/esm2022/lib/terminology/services/terminology-collection/index.mjs +2 -0
  123. package/esm2022/lib/terminology/services/terminology-collection/terminology-collection.service.mjs +54 -0
  124. package/esm2022/lib/terminology/terminology.component.mjs +121 -0
  125. package/esm2022/lib/terminology/terminology.module.mjs +129 -0
  126. package/esm2022/lib/tld-loader/tld-loader.component.mjs +4 -4
  127. package/esm2022/lib/tld-loader/tld-loader.module.mjs +5 -5
  128. package/esm2022/public-api.mjs +4 -1
  129. package/fesm2022/tilde-nlp-ngx-common.mjs +2020 -297
  130. package/fesm2022/tilde-nlp-ngx-common.mjs.map +1 -1
  131. package/lib/constants/index.d.ts +1 -0
  132. package/lib/constants/screen-size.const.d.ts +10 -0
  133. package/lib/helpers/auth-headers.helper.d.ts +4 -0
  134. package/lib/helpers/conversion.helper.d.ts +4 -0
  135. package/lib/helpers/file-extension.helper.d.ts +3 -0
  136. package/lib/helpers/html.helper.d.ts +17 -0
  137. package/lib/helpers/index.d.ts +6 -0
  138. package/lib/helpers/resolution.helper.d.ts +3 -0
  139. package/lib/helpers/sort.helper.d.ts +3 -0
  140. package/lib/open-close-button/index.d.ts +4 -0
  141. package/lib/open-close-button/injection-tokens/index.d.ts +1 -0
  142. package/lib/open-close-button/injection-tokens/open-close-btn-icons.token.d.ts +1 -0
  143. package/lib/open-close-button/models/index.d.ts +1 -0
  144. package/lib/open-close-button/models/open-close-btn-icons.model.d.ts +4 -0
  145. package/lib/open-close-button/open-close-button.component.d.ts +22 -0
  146. package/lib/open-close-button/open-close-button.module.d.ts +11 -0
  147. package/lib/services/alert/alert.service.d.ts +34 -0
  148. package/lib/services/alert/index.d.ts +3 -0
  149. package/lib/services/alert/injection-tokens/alert-configuration.token.d.ts +1 -0
  150. package/lib/services/alert/injection-tokens/index.d.ts +1 -0
  151. package/lib/services/alert/models/alert-configuration.model.d.ts +7 -0
  152. package/lib/services/alert/models/index.d.ts +1 -0
  153. package/lib/services/dom/index.d.ts +1 -0
  154. package/lib/services/icon/index.d.ts +1 -0
  155. package/lib/services/index.d.ts +4 -2
  156. package/lib/services/system/index.d.ts +1 -0
  157. package/lib/services/system/system.service.d.ts +11 -0
  158. package/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-card/terminology-collection-card.component.d.ts +26 -0
  159. package/lib/terminology/components/terminology-panel/terminology-collection-list/terminology-collection-list.component.d.ts +30 -0
  160. package/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection-dialog/terminology-create-collection-dialog.component.d.ts +32 -0
  161. package/lib/terminology/components/terminology-panel/terminology-create-collection/terminology-create-collection.component.d.ts +17 -0
  162. package/lib/terminology/components/terminology-panel/terminology-panel.component.d.ts +30 -0
  163. package/lib/terminology/config/models/index.d.ts +1 -0
  164. package/lib/terminology/config/models/terminology-config.model.d.ts +39 -0
  165. package/lib/terminology/config/services/index.d.ts +1 -0
  166. package/lib/terminology/config/services/terminology-config/terminology-config.service.d.ts +9 -0
  167. package/lib/terminology/enums/combined-collection-tooltip-key.enum.d.ts +4 -0
  168. package/lib/terminology/enums/engine-term-collection-scope.enum.d.ts +5 -0
  169. package/lib/terminology/enums/engine-term-collection-source.enum.d.ts +4 -0
  170. package/lib/terminology/enums/engine-term-collection-status.enum.d.ts +6 -0
  171. package/lib/terminology/enums/engine-term-collection-sub-status.enum.d.ts +12 -0
  172. package/lib/terminology/enums/index.d.ts +6 -0
  173. package/lib/terminology/enums/mt-collection-status.enum.d.ts +8 -0
  174. package/lib/terminology/enums/mt-term-collection-v1-status.enum.d.ts +5 -0
  175. package/lib/terminology/enums/system-metadata-key.enum.d.ts +5 -0
  176. package/lib/terminology/enums/translation-api-version.model.d.ts +4 -0
  177. package/lib/terminology/factories/terminology-api.factory.d.ts +5 -0
  178. package/lib/terminology/factories/terminology-system.factory.d.ts +5 -0
  179. package/lib/terminology/index.d.ts +7 -0
  180. package/lib/terminology/injection-tokens/terminology-api.token.d.ts +1 -0
  181. package/lib/terminology/injection-tokens/terminology-system.token.d.ts +1 -0
  182. package/lib/terminology/models/active-data.model.d.ts +21 -0
  183. package/lib/terminology/models/add-engine-terms-request-params.model.d.ts +7 -0
  184. package/lib/terminology/models/api-system.model.d.ts +27 -0
  185. package/lib/terminology/models/combined-collection.model.d.ts +92 -0
  186. package/lib/terminology/models/default-term-collection-order-update.model.d.ts +5 -0
  187. package/lib/terminology/models/domain.model.d.ts +8 -0
  188. package/lib/terminology/models/engine-term-collection-access-scope-update.model.d.ts +3 -0
  189. package/lib/terminology/models/engine-term-collection-access-scope.model.d.ts +4 -0
  190. package/lib/terminology/models/engine-term-collection-access-update.model.d.ts +6 -0
  191. package/lib/terminology/models/engine-term-collection-access.model.d.ts +6 -0
  192. package/lib/terminology/models/engine-term-collection-list.model.d.ts +4 -0
  193. package/lib/terminology/models/engine-term-collection.model.d.ts +24 -0
  194. package/lib/terminology/models/get-langauge-direction.d.ts +17 -0
  195. package/lib/terminology/models/index.d.ts +19 -0
  196. package/lib/terminology/models/lang-list-item.model.d.ts +6 -0
  197. package/lib/terminology/models/mt-collection.model.d.ts +17 -0
  198. package/lib/terminology/models/mt-term-collection-v1.model.d.ts +12 -0
  199. package/lib/terminology/models/mt-term-service.model.d.ts +8 -0
  200. package/lib/terminology/models/system-api-service.model.d.ts +5 -0
  201. package/lib/terminology/models/system.model.d.ts +17 -0
  202. package/lib/terminology/models/terminology-engine.model.d.ts +15 -0
  203. package/lib/terminology/models/tld-term-collection-languages.model.d.ts +11 -0
  204. package/lib/terminology/models/tld-term-collection.model.d.ts +46 -0
  205. package/lib/terminology/models/update-engine-terms-request-params.model.d.ts +4 -0
  206. package/lib/terminology/models/vendor.model.d.ts +4 -0
  207. package/lib/terminology/services/engine-term-api/engine-term-api.service.d.ts +19 -0
  208. package/lib/terminology/services/engine-term-api/index.d.ts +1 -0
  209. package/lib/terminology/services/index.d.ts +5 -0
  210. package/lib/terminology/services/system-api-v1/system-api-v1.service.d.ts +15 -0
  211. package/lib/terminology/services/system-api-v2/system-api-v2.service.d.ts +14 -0
  212. package/lib/terminology/services/terminology/terminology.service.d.ts +58 -0
  213. package/lib/terminology/services/terminology-api-v1/terminology-api-v1.service.d.ts +17 -0
  214. package/lib/terminology/services/terminology-api-v2/terminology-api-v2.service.d.ts +18 -0
  215. package/lib/terminology/services/terminology-collection/index.d.ts +1 -0
  216. package/lib/terminology/services/terminology-collection/terminology-collection.service.d.ts +17 -0
  217. package/lib/terminology/terminology.component.d.ts +32 -0
  218. package/lib/terminology/terminology.module.d.ts +28 -0
  219. package/package.json +1 -1
  220. package/public-api.d.ts +3 -0
  221. package/esm2022/lib/services/dom.service.mjs +0 -21
  222. package/esm2022/lib/services/icon.service.mjs +0 -35
  223. /package/lib/services/{dom.service.d.ts → dom/dom.service.d.ts} +0 -0
  224. /package/lib/services/{icon.service.d.ts → icon/icon.service.d.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVuZG9yLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3Rlcm1pbm9sb2d5L21vZGVscy92ZW5kb3IubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgVmVuZG9yIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHN5c3RlbUlkOiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -0,0 +1,51 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { AuthHeadersHelper } from '../../../helpers';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common/http";
5
+ import * as i2 from "../../config/services";
6
+ export class EngineTermApiService {
7
+ constructor(http, config) {
8
+ this.http = http;
9
+ this.config = config;
10
+ this.baseUrl = this.config?.termConfig?.engineTermUrl;
11
+ }
12
+ add(engineId, params) {
13
+ const data = new FormData();
14
+ data.append("collectionId", params.collectionId);
15
+ data.append("collectionSource", params.collectionSource);
16
+ if (params.access.global?.default !== undefined) {
17
+ data.append("access.Global.Default", params.access.global?.default.toString());
18
+ }
19
+ if (params.access.group?.default !== undefined) {
20
+ data.append("access.Group.Default", params.access.group?.default.toString());
21
+ }
22
+ if (params.access.user?.default !== undefined) {
23
+ data.append("access.User.Default", params.access.user?.default.toString());
24
+ }
25
+ return this.http.post(`${this.baseUrl}/${engineId}/terms`, data);
26
+ }
27
+ update(engineId, collectionId, params) {
28
+ return this.http.put(`${this.baseUrl}/${engineId}/terms/${collectionId}`, params);
29
+ }
30
+ getList(engineId) {
31
+ return this.http.get(`${this.baseUrl}/${engineId}/terms`, { params: { engineId }, headers: AuthHeadersHelper.getApiV2AuthHeaders(this.config.termConfig.xApiKey ?? '', this.config.termConfig.appId ?? '') });
32
+ }
33
+ remove(engineId, collectionId) {
34
+ return this.http.delete(`${this.baseUrl}/${engineId}/terms/${collectionId}`);
35
+ }
36
+ order(engineId, orderUpdate) {
37
+ return this.http.post(`${this.baseUrl}/${engineId}/terms/order`, orderUpdate);
38
+ }
39
+ sync(engineId, collectionId) {
40
+ return this.http.post(`${this.baseUrl}/${engineId}/terms/${collectionId}/sync`, {});
41
+ }
42
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EngineTermApiService, deps: [{ token: i1.HttpClient }, { token: i2.TerminologyConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
43
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EngineTermApiService, providedIn: 'root' }); }
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EngineTermApiService, decorators: [{
46
+ type: Injectable,
47
+ args: [{
48
+ providedIn: 'root'
49
+ }]
50
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.TerminologyConfigService }]; } });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLXRlcm0tYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvdGVybWlub2xvZ3kvc2VydmljZXMvZW5naW5lLXRlcm0tYXBpL2VuZ2luZS10ZXJtLWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFLckQsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUNtQixJQUFnQixFQUNoQixNQUFnQztRQURoQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQTBCO1FBRWpELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBdUIsQ0FBQztJQUNsRSxDQUFDO0lBRUQsR0FBRyxDQUFDLFFBQWdCLEVBQUUsTUFBbUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN6RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNoRjtRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzlFO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUU7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksUUFBUSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQW9CLEVBQUUsTUFBc0M7UUFDbkYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBdUIsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLFFBQVEsVUFBVSxZQUFZLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQWdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTJCLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxRQUFRLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMU8sQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFnQixFQUFFLFlBQW9CO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQXVCLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxRQUFRLFVBQVUsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQWdCLEVBQUUsV0FBeUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBMkIsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLFFBQVEsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBZ0IsRUFBRSxZQUFvQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksUUFBUSxVQUFVLFlBQVksT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7K0dBNUNVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRlcm1pbm9sb2d5Q29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbmZpZy9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IEFkZEVuZ2luZVRlcm1zUmVxdWVzdFBhcmFtcywgRGVmYXVsdENvbGxlY3Rpb25PcmRlclVwZGF0ZSwgRW5naW5lVGVybUNvbGxlY3Rpb24sIEVuZ2luZVRlcm1Db2xsZWN0aW9uTGlzdCwgVXBkYXRlRW5naW5lVGVybXNSZXF1ZXN0UGFyYW1zIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBdXRoSGVhZGVyc0hlbHBlciB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRW5naW5lVGVybUFwaVNlcnZpY2Uge1xyXG4gIGJhc2VVcmwhOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFRlcm1pbm9sb2d5Q29uZmlnU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5iYXNlVXJsID0gdGhpcy5jb25maWc/LnRlcm1Db25maWc/LmVuZ2luZVRlcm1VcmwgYXMgc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgYWRkKGVuZ2luZUlkOiBzdHJpbmcsIHBhcmFtczogQWRkRW5naW5lVGVybXNSZXF1ZXN0UGFyYW1zKSB7XHJcbiAgICBjb25zdCBkYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICBkYXRhLmFwcGVuZChcImNvbGxlY3Rpb25JZFwiLCBwYXJhbXMuY29sbGVjdGlvbklkKTtcclxuICAgIGRhdGEuYXBwZW5kKFwiY29sbGVjdGlvblNvdXJjZVwiLCBwYXJhbXMuY29sbGVjdGlvblNvdXJjZSk7XHJcbiAgICBpZiAocGFyYW1zLmFjY2Vzcy5nbG9iYWw/LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBkYXRhLmFwcGVuZChcImFjY2Vzcy5HbG9iYWwuRGVmYXVsdFwiLCBwYXJhbXMuYWNjZXNzLmdsb2JhbD8uZGVmYXVsdC50b1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIGlmIChwYXJhbXMuYWNjZXNzLmdyb3VwPy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZGF0YS5hcHBlbmQoXCJhY2Nlc3MuR3JvdXAuRGVmYXVsdFwiLCBwYXJhbXMuYWNjZXNzLmdyb3VwPy5kZWZhdWx0LnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcmFtcy5hY2Nlc3MudXNlcj8uZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRhdGEuYXBwZW5kKFwiYWNjZXNzLlVzZXIuRGVmYXVsdFwiLCBwYXJhbXMuYWNjZXNzLnVzZXI/LmRlZmF1bHQudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8RW5naW5lVGVybUNvbGxlY3Rpb24+KGAke3RoaXMuYmFzZVVybH0vJHtlbmdpbmVJZH0vdGVybXNgLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShlbmdpbmVJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywgcGFyYW1zOiBVcGRhdGVFbmdpbmVUZXJtc1JlcXVlc3RQYXJhbXMpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PEVuZ2luZVRlcm1Db2xsZWN0aW9uPihgJHt0aGlzLmJhc2VVcmx9LyR7ZW5naW5lSWR9L3Rlcm1zLyR7Y29sbGVjdGlvbklkfWAsIHBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBnZXRMaXN0KGVuZ2luZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEVuZ2luZVRlcm1Db2xsZWN0aW9uTGlzdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8RW5naW5lVGVybUNvbGxlY3Rpb25MaXN0PihgJHt0aGlzLmJhc2VVcmx9LyR7ZW5naW5lSWR9L3Rlcm1zYCwgeyBwYXJhbXM6IHsgZW5naW5lSWQgfSwgaGVhZGVyczogQXV0aEhlYWRlcnNIZWxwZXIuZ2V0QXBpVjJBdXRoSGVhZGVycyh0aGlzLmNvbmZpZy50ZXJtQ29uZmlnLnhBcGlLZXkgPz8gJycsIHRoaXMuY29uZmlnLnRlcm1Db25maWcuYXBwSWQgPz8gJycpIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKGVuZ2luZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTxFbmdpbmVUZXJtQ29sbGVjdGlvbj4oYCR7dGhpcy5iYXNlVXJsfS8ke2VuZ2luZUlkfS90ZXJtcy8ke2NvbGxlY3Rpb25JZH1gKTtcclxuICB9XHJcblxyXG4gIG9yZGVyKGVuZ2luZUlkOiBzdHJpbmcsIG9yZGVyVXBkYXRlOiBEZWZhdWx0Q29sbGVjdGlvbk9yZGVyVXBkYXRlKTogT2JzZXJ2YWJsZTxFbmdpbmVUZXJtQ29sbGVjdGlvbkxpc3Q+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxFbmdpbmVUZXJtQ29sbGVjdGlvbkxpc3Q+KGAke3RoaXMuYmFzZVVybH0vJHtlbmdpbmVJZH0vdGVybXMvb3JkZXJgLCBvcmRlclVwZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBzeW5jKGVuZ2luZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxFbmdpbmVUZXJtQ29sbGVjdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PEVuZ2luZVRlcm1Db2xsZWN0aW9uPihgJHt0aGlzLmJhc2VVcmx9LyR7ZW5naW5lSWR9L3Rlcm1zLyR7Y29sbGVjdGlvbklkfS9zeW5jYCwge30pO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './engine-term-api.service';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvdGVybWlub2xvZ3kvc2VydmljZXMvZW5naW5lLXRlcm0tYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VuZ2luZS10ZXJtLWFwaS5zZXJ2aWNlJzsiXX0=
@@ -0,0 +1,6 @@
1
+ export * from './terminology/terminology.service';
2
+ export * from './engine-term-api/';
3
+ export * from './terminology-collection/';
4
+ export * from './terminology-api-v1/terminology-api-v1.service';
5
+ export * from './terminology-api-v2/terminology-api-v2.service';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvdGVybWlub2xvZ3kvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxpREFBaUQsQ0FBQztBQUNoRSxjQUFjLGlEQUFpRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi90ZXJtaW5vbG9neS90ZXJtaW5vbG9neS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9lbmdpbmUtdGVybS1hcGkvJztcclxuZXhwb3J0ICogZnJvbSAnLi90ZXJtaW5vbG9neS1jb2xsZWN0aW9uLyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdGVybWlub2xvZ3ktYXBpLXYxL3Rlcm1pbm9sb2d5LWFwaS12MS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi90ZXJtaW5vbG9neS1hcGktdjIvdGVybWlub2xvZ3ktYXBpLXYyLnNlcnZpY2UnOyJdfQ==
@@ -0,0 +1,57 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { map } from "rxjs";
3
+ import { TranslationApiVersion } from "../../enums/translation-api-version.model";
4
+ import { SystemMetadataKey } from "../../enums/system-metadata-key.enum";
5
+ import { AuthHeadersHelper } from "../../../helpers";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common/http";
8
+ import * as i2 from "../../config/services";
9
+ export class SystemApiV1Service {
10
+ constructor(http, config) {
11
+ this.http = http;
12
+ this.config = config;
13
+ }
14
+ getSystemList() {
15
+ const headers = AuthHeadersHelper.getAuthHeaders(this.config.termConfig.clientId);
16
+ const params = {
17
+ appID: this.config.termConfig.appId,
18
+ };
19
+ return this.http.get(this.config?.termConfig?.systemListUrl, { headers, params }).pipe(map((response) => {
20
+ const systems = [];
21
+ response.System.forEach((element) => {
22
+ const system = {
23
+ sourceLanguage: element.SourceLanguage.Code,
24
+ targetLanguage: element.TargetLanguage.Code,
25
+ id: element.ID,
26
+ domain: element.Domain,
27
+ vendor: this.findMetaDataValue(element, SystemMetadataKey.VENDOR) ?? this.config.termConfig.defaultVendor,
28
+ includesTerminology: this.findMetaDataValue(element, SystemMetadataKey.INCLUDE_TERMINOLOGY_WORKFLOW),
29
+ status: this.findMetaDataValue(element, SystemMetadataKey.STATUS),
30
+ translationApiVersion: TranslationApiVersion.V1,
31
+ title: element.Title.Text,
32
+ };
33
+ if (this.config.termConfig.allowedSystemStatuses && this.config.termConfig.allowedSystemStatuses.indexOf(system.status) !== -1) {
34
+ systems.push(system);
35
+ }
36
+ });
37
+ return systems;
38
+ }));
39
+ }
40
+ findMetaDataValue(system, metadataKey) {
41
+ for (const metadata of system.Metadata) {
42
+ if (metadata.Key === metadataKey) {
43
+ return metadata.Value;
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SystemApiV1Service, deps: [{ token: i1.HttpClient }, { token: i2.TerminologyConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
49
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SystemApiV1Service, providedIn: "root" }); }
50
+ }
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SystemApiV1Service, decorators: [{
52
+ type: Injectable,
53
+ args: [{
54
+ providedIn: "root",
55
+ }]
56
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.TerminologyConfigService }]; } });
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLWFwaS12MS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3Rlcm1pbm9sb2d5L3NlcnZpY2VzL3N5c3RlbS1hcGktdjEvc3lzdGVtLWFwaS12MS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0MsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQUtyRCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQTZCLElBQWdCLEVBQW1CLE1BQWdDO1FBQW5FLFNBQUksR0FBSixJQUFJLENBQVk7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBMEI7SUFBRyxDQUFDO0lBRXBHLGFBQWE7UUFDWCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBa0IsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sTUFBTSxHQUFHO1lBQ2IsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWU7U0FDOUMsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTJCLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3hILEdBQUcsQ0FBQyxDQUFDLFFBQWtDLEVBQUUsRUFBRTtZQUN6QyxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7WUFDN0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDbEMsTUFBTSxNQUFNLEdBQVc7b0JBQ3JCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLElBQWM7b0JBQ3JELGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLElBQWM7b0JBQ3JELEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDZCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWE7b0JBQ3pHLG1CQUFtQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsNEJBQTRCLENBQUM7b0JBQ3BHLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztvQkFDakUscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsRUFBRTtvQkFDL0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSTtpQkFDMUIsQ0FBQztnQkFDRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUN4SSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN0QjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFrQixFQUFFLFdBQThCO1FBQzFFLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN0QyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUFFO2dCQUNoQyxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDdkI7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzsrR0F4Q1Usa0JBQWtCO21IQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBJU3lzdGVtQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc3lzdGVtLWFwaS1zZXJ2aWNlLm1vZGVsXCI7XHJcbmltcG9ydCB7IFRlcm1pbm9sb2d5Q29uZmlnU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb25maWcvc2VydmljZXNcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBTeXN0ZW0gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3N5c3RlbS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGlvbkFwaVZlcnNpb24gfSBmcm9tIFwiLi4vLi4vZW51bXMvdHJhbnNsYXRpb24tYXBpLXZlcnNpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgSUFwaVN5c3RlbSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvYXBpLXN5c3RlbS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTeXN0ZW1NZXRhZGF0YUtleSB9IGZyb20gXCIuLi8uLi9lbnVtcy9zeXN0ZW0tbWV0YWRhdGEta2V5LmVudW1cIjtcclxuaW1wb3J0IHsgQXV0aEhlYWRlcnNIZWxwZXIgfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVyc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3lzdGVtQXBpVjFTZXJ2aWNlIGltcGxlbWVudHMgSVN5c3RlbUFwaVNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFRlcm1pbm9sb2d5Q29uZmlnU2VydmljZSkge31cclxuXHJcbiAgZ2V0U3lzdGVtTGlzdCgpOiBPYnNlcnZhYmxlPFN5c3RlbVtdPiB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gQXV0aEhlYWRlcnNIZWxwZXIuZ2V0QXV0aEhlYWRlcnModGhpcy5jb25maWcudGVybUNvbmZpZy5jbGllbnRJZCBhcyBzdHJpbmcpO1xyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICBhcHBJRDogdGhpcy5jb25maWcudGVybUNvbmZpZy5hcHBJZCBhcyBzdHJpbmcsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgU3lzdGVtOiBJQXBpU3lzdGVtW10gfT4odGhpcy5jb25maWc/LnRlcm1Db25maWc/LnN5c3RlbUxpc3RVcmwgYXMgc3RyaW5nLCB7IGhlYWRlcnMsIHBhcmFtcyB9KS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiB7IFN5c3RlbTogSUFwaVN5c3RlbVtdIH0pID0+IHtcclxuICAgICAgICBjb25zdCBzeXN0ZW1zOiBTeXN0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHJlc3BvbnNlLlN5c3RlbS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzeXN0ZW06IFN5c3RlbSA9IHtcclxuICAgICAgICAgICAgc291cmNlTGFuZ3VhZ2U6IGVsZW1lbnQuU291cmNlTGFuZ3VhZ2UuQ29kZSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICAgIHRhcmdldExhbmd1YWdlOiBlbGVtZW50LlRhcmdldExhbmd1YWdlLkNvZGUgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgICBpZDogZWxlbWVudC5JRCxcclxuICAgICAgICAgICAgZG9tYWluOiBlbGVtZW50LkRvbWFpbixcclxuICAgICAgICAgICAgdmVuZG9yOiB0aGlzLmZpbmRNZXRhRGF0YVZhbHVlKGVsZW1lbnQsIFN5c3RlbU1ldGFkYXRhS2V5LlZFTkRPUikgPz8gdGhpcy5jb25maWcudGVybUNvbmZpZy5kZWZhdWx0VmVuZG9yLFxyXG4gICAgICAgICAgICBpbmNsdWRlc1Rlcm1pbm9sb2d5OiB0aGlzLmZpbmRNZXRhRGF0YVZhbHVlKGVsZW1lbnQsIFN5c3RlbU1ldGFkYXRhS2V5LklOQ0xVREVfVEVSTUlOT0xPR1lfV09SS0ZMT1cpLFxyXG4gICAgICAgICAgICBzdGF0dXM6IHRoaXMuZmluZE1ldGFEYXRhVmFsdWUoZWxlbWVudCwgU3lzdGVtTWV0YWRhdGFLZXkuU1RBVFVTKSxcclxuICAgICAgICAgICAgdHJhbnNsYXRpb25BcGlWZXJzaW9uOiBUcmFuc2xhdGlvbkFwaVZlcnNpb24uVjEsXHJcbiAgICAgICAgICAgIHRpdGxlOiBlbGVtZW50LlRpdGxlLlRleHQsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRlcm1Db25maWcuYWxsb3dlZFN5c3RlbVN0YXR1c2VzICYmIHRoaXMuY29uZmlnLnRlcm1Db25maWcuYWxsb3dlZFN5c3RlbVN0YXR1c2VzLmluZGV4T2Yoc3lzdGVtLnN0YXR1cyBhcyBzdHJpbmcpICE9PSAtMSkge1xyXG4gICAgICAgICAgICBzeXN0ZW1zLnB1c2goc3lzdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc3lzdGVtcztcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmRNZXRhRGF0YVZhbHVlKHN5c3RlbTogSUFwaVN5c3RlbSwgbWV0YWRhdGFLZXk6IFN5c3RlbU1ldGFkYXRhS2V5KTogYW55IHtcclxuICAgIGZvciAoY29uc3QgbWV0YWRhdGEgb2Ygc3lzdGVtLk1ldGFkYXRhKSB7XHJcbiAgICAgIGlmIChtZXRhZGF0YS5LZXkgPT09IG1ldGFkYXRhS2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLlZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,63 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { map } from "rxjs";
3
+ import { TranslationApiVersion } from "../../enums/translation-api-version.model";
4
+ import { AuthHeadersHelper } from "../../../helpers";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ import * as i2 from "../../config/services";
8
+ export class SystemApiV2Service {
9
+ constructor(http, config) {
10
+ this.http = http;
11
+ this.config = config;
12
+ }
13
+ getSystemList() {
14
+ const headers = AuthHeadersHelper.getApiV2AuthHeaders(this.config.termConfig.xApiKey ?? '', this.config.termConfig.appId ?? '');
15
+ return this.http.get(this.config.termConfig.systemListUrl, { headers }).pipe(map((response) => {
16
+ const systems = [];
17
+ const uniqueDirections = [];
18
+ const autoDomainSystems = [];
19
+ response.languageDirections.forEach((system) => {
20
+ const languageDirections = `${system.srcLang}-${system.trgLang}`;
21
+ const newSystem = {
22
+ domain: system.domain,
23
+ id: system.id,
24
+ sourceLanguage: system.srcLang,
25
+ targetLanguage: system.trgLang,
26
+ translationApiVersion: TranslationApiVersion.V2,
27
+ vendor: system.vendor,
28
+ // hardcoded since there is no param yet for determinig which systems support terms.
29
+ includesTerminology: system.supportsTermCollections,
30
+ };
31
+ systems.push(newSystem);
32
+ if (this.config.termConfig?.autoDomainDetection && !uniqueDirections.includes(languageDirections)) {
33
+ uniqueDirections.push(languageDirections);
34
+ const autoDomainSystem = this.createSystemFromLanguageDirection(system);
35
+ autoDomainSystem.domain = null;
36
+ autoDomainSystem.id = languageDirections;
37
+ autoDomainSystems.push(autoDomainSystem);
38
+ }
39
+ });
40
+ return autoDomainSystems.concat(systems);
41
+ }));
42
+ }
43
+ createSystemFromLanguageDirection(direction) {
44
+ const systemBase = {
45
+ sourceLanguage: direction.srcLang,
46
+ targetLanguage: direction.trgLang,
47
+ domain: direction.domain,
48
+ translationApiVersion: TranslationApiVersion.V2,
49
+ id: `${direction.srcLang}-${direction.trgLang}-${direction.domain}`,
50
+ vendor: direction.vendor,
51
+ };
52
+ return systemBase;
53
+ }
54
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SystemApiV2Service, deps: [{ token: i1.HttpClient }, { token: i2.TerminologyConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
55
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SystemApiV2Service, providedIn: "root" }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SystemApiV2Service, decorators: [{
58
+ type: Injectable,
59
+ args: [{
60
+ providedIn: "root",
61
+ }]
62
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.TerminologyConfigService }]; } });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLWFwaS12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbW1vbi9zcmMvbGliL3Rlcm1pbm9sb2d5L3NlcnZpY2VzL3N5c3RlbS1hcGktdjIvc3lzdGVtLWFwaS12Mi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQUtyRCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQTZCLElBQWdCLEVBQW1CLE1BQWdDO1FBQW5FLFNBQUksR0FBSixJQUFJLENBQVk7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBMEI7SUFDaEcsQ0FBQztJQUVELGFBQWE7UUFDWCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVoSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUE0QixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9HLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2YsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1lBQzdCLE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO1lBQ3RDLE1BQU0saUJBQWlCLEdBQWEsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDN0MsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqRSxNQUFNLFNBQVMsR0FBVztvQkFDeEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUNyQixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ2IsY0FBYyxFQUFFLE1BQU0sQ0FBQyxPQUFPO29CQUM5QixjQUFjLEVBQUUsTUFBTSxDQUFDLE9BQU87b0JBQzlCLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDLEVBQUU7b0JBQy9DLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtvQkFDckIsb0ZBQW9GO29CQUNwRixtQkFBbUIsRUFBRSxNQUFNLENBQUMsdUJBQXVCO2lCQUNwRCxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRXhCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRTtvQkFDakcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQzFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN4RSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUMvQixnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsa0JBQWtCLENBQUM7b0JBQ3pDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUMxQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxpQ0FBaUMsQ0FBQyxTQUE0QjtRQUNwRSxNQUFNLFVBQVUsR0FBVztZQUN6QixjQUFjLEVBQUUsU0FBUyxDQUFDLE9BQU87WUFDakMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQ2pDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFO1lBQy9DLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ25FLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtTQUN6QixDQUFDO1FBRUYsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQzsrR0FsRFUsa0JBQWtCO21IQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFRlcm1pbm9sb2d5Q29uZmlnU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb25maWcvc2VydmljZXNcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgU3lzdGVtIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zeXN0ZW0ubW9kZWxcIjtcclxuaW1wb3J0IHsgVHJhbnNsYXRpb25BcGlWZXJzaW9uIH0gZnJvbSBcIi4uLy4uL2VudW1zL3RyYW5zbGF0aW9uLWFwaS12ZXJzaW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7IExhbmd1YWdlRGlyZWN0aW9uLCBMYW5ndWFnZURpcmVjdGlvblJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9nZXQtbGFuZ2F1Z2UtZGlyZWN0aW9uXCI7XHJcbmltcG9ydCB7IEF1dGhIZWFkZXJzSGVscGVyIH0gZnJvbSBcIi4uLy4uLy4uL2hlbHBlcnNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFN5c3RlbUFwaVYyU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogVGVybWlub2xvZ3lDb25maWdTZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBnZXRTeXN0ZW1MaXN0KCk6IE9ic2VydmFibGU8U3lzdGVtW10+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBBdXRoSGVhZGVyc0hlbHBlci5nZXRBcGlWMkF1dGhIZWFkZXJzKHRoaXMuY29uZmlnLnRlcm1Db25maWcueEFwaUtleSA/PyAnJywgdGhpcy5jb25maWcudGVybUNvbmZpZy5hcHBJZCA/PyAnJyk7XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PExhbmd1YWdlRGlyZWN0aW9uUmVzcG9uc2U+KHRoaXMuY29uZmlnLnRlcm1Db25maWcuc3lzdGVtTGlzdFVybCBhcyBzdHJpbmcsIHsgaGVhZGVycyB9KS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3lzdGVtczogU3lzdGVtW10gPSBbXTtcclxuICAgICAgICBjb25zdCB1bmlxdWVEaXJlY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGF1dG9Eb21haW5TeXN0ZW1zOiBTeXN0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHJlc3BvbnNlLmxhbmd1YWdlRGlyZWN0aW9ucy5mb3JFYWNoKChzeXN0ZW0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRGlyZWN0aW9ucyA9IGAke3N5c3RlbS5zcmNMYW5nfS0ke3N5c3RlbS50cmdMYW5nfWA7XHJcbiAgICAgICAgICBjb25zdCBuZXdTeXN0ZW06IFN5c3RlbSA9IHtcclxuICAgICAgICAgICAgZG9tYWluOiBzeXN0ZW0uZG9tYWluLFxyXG4gICAgICAgICAgICBpZDogc3lzdGVtLmlkLFxyXG4gICAgICAgICAgICBzb3VyY2VMYW5ndWFnZTogc3lzdGVtLnNyY0xhbmcsXHJcbiAgICAgICAgICAgIHRhcmdldExhbmd1YWdlOiBzeXN0ZW0udHJnTGFuZyxcclxuICAgICAgICAgICAgdHJhbnNsYXRpb25BcGlWZXJzaW9uOiBUcmFuc2xhdGlvbkFwaVZlcnNpb24uVjIsXHJcbiAgICAgICAgICAgIHZlbmRvcjogc3lzdGVtLnZlbmRvcixcclxuICAgICAgICAgICAgLy8gaGFyZGNvZGVkIHNpbmNlIHRoZXJlIGlzIG5vIHBhcmFtIHlldCBmb3IgZGV0ZXJtaW5pZyB3aGljaCBzeXN0ZW1zIHN1cHBvcnQgdGVybXMuXHJcbiAgICAgICAgICAgIGluY2x1ZGVzVGVybWlub2xvZ3k6IHN5c3RlbS5zdXBwb3J0c1Rlcm1Db2xsZWN0aW9ucyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBzeXN0ZW1zLnB1c2gobmV3U3lzdGVtKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcudGVybUNvbmZpZz8uYXV0b0RvbWFpbkRldGVjdGlvbiAmJiAhdW5pcXVlRGlyZWN0aW9ucy5pbmNsdWRlcyhsYW5ndWFnZURpcmVjdGlvbnMpKSB7XHJcbiAgICAgICAgICAgIHVuaXF1ZURpcmVjdGlvbnMucHVzaChsYW5ndWFnZURpcmVjdGlvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCBhdXRvRG9tYWluU3lzdGVtID0gdGhpcy5jcmVhdGVTeXN0ZW1Gcm9tTGFuZ3VhZ2VEaXJlY3Rpb24oc3lzdGVtKTtcclxuICAgICAgICAgICAgYXV0b0RvbWFpblN5c3RlbS5kb21haW4gPSBudWxsO1xyXG4gICAgICAgICAgICBhdXRvRG9tYWluU3lzdGVtLmlkID0gbGFuZ3VhZ2VEaXJlY3Rpb25zO1xyXG4gICAgICAgICAgICBhdXRvRG9tYWluU3lzdGVtcy5wdXNoKGF1dG9Eb21haW5TeXN0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBhdXRvRG9tYWluU3lzdGVtcy5jb25jYXQoc3lzdGVtcyk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTeXN0ZW1Gcm9tTGFuZ3VhZ2VEaXJlY3Rpb24oZGlyZWN0aW9uOiBMYW5ndWFnZURpcmVjdGlvbikge1xyXG4gICAgY29uc3Qgc3lzdGVtQmFzZTogU3lzdGVtID0ge1xyXG4gICAgICBzb3VyY2VMYW5ndWFnZTogZGlyZWN0aW9uLnNyY0xhbmcsXHJcbiAgICAgIHRhcmdldExhbmd1YWdlOiBkaXJlY3Rpb24udHJnTGFuZyxcclxuICAgICAgZG9tYWluOiBkaXJlY3Rpb24uZG9tYWluLFxyXG4gICAgICB0cmFuc2xhdGlvbkFwaVZlcnNpb246IFRyYW5zbGF0aW9uQXBpVmVyc2lvbi5WMixcclxuICAgICAgaWQ6IGAke2RpcmVjdGlvbi5zcmNMYW5nfS0ke2RpcmVjdGlvbi50cmdMYW5nfS0ke2RpcmVjdGlvbi5kb21haW59YCxcclxuICAgICAgdmVuZG9yOiBkaXJlY3Rpb24udmVuZG9yLFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gc3lzdGVtQmFzZTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,309 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { BehaviorSubject, Subject, forkJoin, of, tap } from 'rxjs';
3
+ import { CombinedCollection } from '../../models';
4
+ import { TERMINOLOGY_API_TOKEN } from '../../injection-tokens/terminology-api.token';
5
+ import { EngineTermCollectionSource, MtCollectionStatus } from '../../enums';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../config/services";
8
+ import * as i2 from "../../../services";
9
+ import * as i3 from "../terminology-collection/terminology-collection.service";
10
+ export class TerminologyService {
11
+ get isAuthenticated() { return this.config.termConfig.isAuth; }
12
+ get canCreateCollections() { return this.config.termConfig.canCreateCollection; }
13
+ get hasEditPermissions() {
14
+ return (this.config?.termConfig.isAuth &&
15
+ this.canCreateCollections &&
16
+ this.config.termConfig.isTermPortalSupported);
17
+ }
18
+ constructor(config, alert, termCollectionApi, mtApi) {
19
+ this.config = config;
20
+ this.alert = alert;
21
+ this.termCollectionApi = termCollectionApi;
22
+ this.mtApi = mtApi;
23
+ this.engines = {};
24
+ this.engineSubject = new BehaviorSubject(this.engines);
25
+ this.updatedEnginesSubject = new Subject();
26
+ this.LOCAL_STORAGE_KEY = 'systemLastCollections';
27
+ }
28
+ hasAnyCollections(systemId) { return this.engines[systemId]?.collections.size > 0; }
29
+ getEnginesWithSelectedCollectionChange() {
30
+ return this.updatedEnginesSubject.asObservable();
31
+ }
32
+ setEngine(engineId, languages = null, setSelectedFromLocalStorage = false, termCollections = true, mtCollections = true, selectedCollection) {
33
+ const engineExists = this.engines[engineId] ?? null;
34
+ if (!engineExists) {
35
+ const newEngine = {
36
+ selected: selectedCollection || null,
37
+ isImporting: false,
38
+ isAnyImporting: false,
39
+ hasAnyCollections: false,
40
+ isRefreshingCollections: false,
41
+ collections: new Set,
42
+ refreshMtCollections: mtCollections,
43
+ refreshTermCollections: termCollections,
44
+ engineLanguages: languages || [],
45
+ isSoftAutoRefreshOn: false,
46
+ hardAutoRefresh: false,
47
+ refreshTimeout: 0
48
+ };
49
+ this.engines[engineId] = newEngine;
50
+ }
51
+ return this.loadCollections(engineId, setSelectedFromLocalStorage);
52
+ }
53
+ setSelectedCollection(engineId, collection) {
54
+ this.engines[engineId].selected = collection;
55
+ this.storeSelectedInLocalStorage(engineId);
56
+ }
57
+ loadCollections(engineId, setSelectedFromLocalStorage) {
58
+ // clear timeout since this refresh replaces scheduled
59
+ this.clearTimeout(engineId);
60
+ this.engines[engineId] = { ...this.engines[engineId], isRefreshingCollections: true };
61
+ let termResponse;
62
+ let mtApiResponse;
63
+ const observables = [];
64
+ if (this.engines[engineId].refreshTermCollections) {
65
+ observables.push(this.termCollectionApi
66
+ .getCollectionList()
67
+ .pipe(tap((response) => (termResponse = response))));
68
+ }
69
+ if (this.engines[engineId].refreshMtCollections) {
70
+ observables.push(this.mtApi
71
+ .getList(engineId)
72
+ .pipe(tap((response) => (mtApiResponse = response))));
73
+ }
74
+ forkJoin(observables).subscribe({
75
+ // do not need response becaue responses are saved in pipe methods
76
+ next: () => {
77
+ this.engines[engineId].isAnyImporting = false;
78
+ // note that termResponse and mtapiresponse gets changed during remove method
79
+ this.removeDeleted(termResponse, mtApiResponse, engineId);
80
+ const joined = [];
81
+ if (mtApiResponse) {
82
+ joined.push(...mtApiResponse);
83
+ }
84
+ if (termResponse) {
85
+ joined.push(...termResponse);
86
+ }
87
+ this.addCollections(joined, engineId);
88
+ if (setSelectedFromLocalStorage) {
89
+ this.setSelectedFromLocalStorage(engineId);
90
+ }
91
+ this.engines[engineId].isRefreshingCollections = false;
92
+ this.scheduleRefresh(engineId, null);
93
+ },
94
+ error: (error) => {
95
+ this.engines[engineId].isRefreshingCollections = false;
96
+ // it is enough to show error only in console. No special thing is necessary.
97
+ console.error(error);
98
+ },
99
+ });
100
+ return this.engineSubject.asObservable();
101
+ }
102
+ getCollections() {
103
+ return this.engineSubject.asObservable();
104
+ }
105
+ startAutoRefresh(engineId, languages = null, setSelectedFromLocalStorage = false, termCollections = true, mtCollections = true) {
106
+ const engine = this.engines[engineId] ?? {};
107
+ engine.hardAutoRefresh = true;
108
+ return this.setEngine(engineId, languages ?? this.engines[engineId]?.engineLanguages, setSelectedFromLocalStorage, termCollections, mtCollections);
109
+ }
110
+ stopAutoRefresh(engineId) {
111
+ this.clearTimeout(engineId);
112
+ this.engines[engineId].isSoftAutoRefreshOn = false;
113
+ this.engines[engineId].hardAutoRefresh = false;
114
+ }
115
+ create(sourceLanguage, targetLanguage, collectionName, engineId, redirectToEdit = true) {
116
+ return this.termCollectionApi
117
+ .createCollection([sourceLanguage, targetLanguage], collectionName)
118
+ .pipe(tap((collection) => {
119
+ if (redirectToEdit) {
120
+ window.open(this.termCollectionApi.getEditLink(collection.termCollection?.id ?? '', sourceLanguage, targetLanguage), '_blank');
121
+ }
122
+ this.engines[engineId]?.collections?.add(collection);
123
+ this.loadCollections(engineId);
124
+ }));
125
+ }
126
+ selectedIdForTranslation(engineId) {
127
+ const selected = this.engines[engineId]?.selected;
128
+ if (selected?.mtCollection &&
129
+ (selected.mtCollection.lastUpdated ||
130
+ selected.mtCollection.status === MtCollectionStatus.READY)) {
131
+ return selected.mtCollection.id;
132
+ }
133
+ return null;
134
+ }
135
+ updateIfNecessary(collection, engineId, isEdited = false) {
136
+ // collection is not imported and should be attached to engine
137
+ if (collection.isEdited() || isEdited) {
138
+ return this.mtApi.add(engineId, collection).pipe(tap((updatedCollection) => {
139
+ collection.update(updatedCollection);
140
+ }));
141
+ }
142
+ else {
143
+ return of(collection);
144
+ }
145
+ }
146
+ handleAddToEngineError(error, engineId) {
147
+ this.alert.unhandeledError(error);
148
+ this.engines[engineId].selected = null;
149
+ }
150
+ sync(collection, engineId) {
151
+ return this.mtApi.sync(engineId, collection).pipe(tap((updatedCollection) => {
152
+ collection.update(updatedCollection);
153
+ }));
154
+ }
155
+ removeMtCollection(collection, engineId) {
156
+ return this.mtApi.remove(engineId, collection).pipe(tap((response) => {
157
+ collection.update(response);
158
+ }));
159
+ }
160
+ addToEngineValidation(collection) {
161
+ if (!collection || !collection.termCollection) {
162
+ console.error("Trying to attach collection that has no tilde term id.");
163
+ return false;
164
+ }
165
+ return true;
166
+ }
167
+ clearTimeout(engineId) {
168
+ if (this.engines[engineId]?.refreshTimeout) {
169
+ clearTimeout(this.engines[engineId].refreshTimeout);
170
+ this.engines[engineId].refreshTimeout = null;
171
+ }
172
+ }
173
+ setSelectedFromLocalStorage(engineId) {
174
+ // If no collections or selected is already set, it should not be changed from localstorage value. (Usually, localstorage should have the same value).
175
+ if (this.engines[engineId].collections?.size === 0 || this.engines[engineId].selected) {
176
+ this.updateSelectedCollectionOutsideService();
177
+ return;
178
+ }
179
+ const storedId = this.readLocalStorage()?.[engineId];
180
+ if (!storedId) {
181
+ this.engines[engineId].selected = null;
182
+ this.updateSelectedCollectionOutsideService();
183
+ return;
184
+ }
185
+ const existing = Array.from(this.engines[engineId].collections).find((item) => item.mtCollection?.id === storedId || item.termCollection?.id === storedId);
186
+ this.engines[engineId].selected = existing;
187
+ this.updateSelectedCollectionOutsideService();
188
+ }
189
+ removeDeleted(termResponse, mtResponse, engineId) {
190
+ for (const collection of this.engines[engineId].collections) {
191
+ const termExistingIx = CombinedCollection.findExistingIndexFromList(termResponse, collection);
192
+ const mtExistingIx = CombinedCollection.findExistingIndexFromList(mtResponse, collection);
193
+ if (termExistingIx === null && mtExistingIx === null) {
194
+ this.engines[engineId]?.collections.delete(collection);
195
+ if (this.engines[engineId]?.selected === collection) {
196
+ this.engines[engineId].selected = null;
197
+ this.updateSelectedCollectionOutsideService();
198
+ }
199
+ }
200
+ else {
201
+ if (termExistingIx !== null) {
202
+ const existingTerm = termResponse[termExistingIx];
203
+ collection.update(existingTerm);
204
+ termResponse.splice(termExistingIx, 1);
205
+ }
206
+ else {
207
+ collection.deleteTerms();
208
+ }
209
+ if (mtExistingIx !== null) {
210
+ const existingMt = mtResponse[mtExistingIx];
211
+ collection.update(existingMt);
212
+ mtResponse.splice(mtExistingIx, 1);
213
+ }
214
+ else {
215
+ collection.deleteMT();
216
+ }
217
+ }
218
+ }
219
+ }
220
+ addCollections(newCollections, engineId) {
221
+ // sets collection list to this value at the end, so deleted collections are not in the list.
222
+ for (const collection of newCollections) {
223
+ // User shouldn't see failed collections if he can't retry to import them.
224
+ if (!this.hasEditPermissions && collection.mtStatus === MtCollectionStatus.ERROR || collection.mtStatus === MtCollectionStatus.DELETING) {
225
+ continue;
226
+ }
227
+ if (collection.isImporting) {
228
+ this.engines[engineId].isAnyImporting = true;
229
+ }
230
+ const existing = CombinedCollection.findExistingCollectionFromList(this.engines[engineId].collections, collection);
231
+ // If term api doesn't have engine languages, collection should not be shown (if it is not already imported somehow);
232
+ if (!existing && collection.source === EngineTermCollectionSource.TILDE_TERM) {
233
+ let hasLanguages = true;
234
+ for (let i = 0; i < this.engines[engineId].engineLanguages.length; i++) {
235
+ if (!collection.termCollection?.languages?.find((lang) => lang.id === this.engines[engineId].engineLanguages[i])) {
236
+ hasLanguages = false;
237
+ break;
238
+ }
239
+ }
240
+ if (!hasLanguages) {
241
+ continue;
242
+ }
243
+ }
244
+ if (!existing) {
245
+ this.engines[engineId].collections.add(collection);
246
+ }
247
+ else {
248
+ existing.update(collection);
249
+ }
250
+ }
251
+ this.engines[engineId].hasAnyCollections = this.engines[engineId].collections.size > 0;
252
+ this.engineSubject.next(this.engines);
253
+ }
254
+ scheduleRefresh(engineId, timeout) {
255
+ // if menu is closed and selected collection is not importing anymore - auto refreshing should be cancelled.
256
+ if (!this.engines[engineId].hardAutoRefresh &&
257
+ !this.engines[engineId]?.isImporting &&
258
+ this.engines[engineId].isSoftAutoRefreshOn) {
259
+ this.stopAutoRefresh(engineId);
260
+ return;
261
+ }
262
+ // if hard auto refresho on, auto refresh should be on. If hard autoreferesh is off , refresh needs to be done only if selected is importing.
263
+ if (this.engines[engineId].hardAutoRefresh ||
264
+ (!this.engines[engineId] &&
265
+ (this.engines[engineId].isSoftAutoRefreshOn || this.engines[engineId].selected?.isImporting))) {
266
+ const timeoutMs = timeout ??
267
+ (this.engines[engineId].isAnyImporting
268
+ ? this.config.termConfig.refreshTimeoutMsWhenImporting
269
+ : this.config.termConfig.refreshTimeoutMs);
270
+ this.engines[engineId].refreshTimeout = setTimeout(() => {
271
+ this.engines[engineId].refreshTimeout = null;
272
+ this.loadCollections(engineId);
273
+ }, timeoutMs);
274
+ }
275
+ }
276
+ storeSelectedInLocalStorage(engineId) {
277
+ let localStorageObject = this.readLocalStorage();
278
+ if (!localStorageObject) {
279
+ localStorageObject = {};
280
+ }
281
+ localStorageObject[engineId] = this.engines[engineId].selected ? (this.engines[engineId]?.selected?.mtCollection?.id ?? this.engines[engineId]?.selected?.termCollection?.id) : null;
282
+ // store term id if it exists
283
+ localStorage.setItem(this.LOCAL_STORAGE_KEY, JSON.stringify(localStorageObject));
284
+ }
285
+ readLocalStorage() {
286
+ const data = localStorage.getItem(this.LOCAL_STORAGE_KEY);
287
+ try {
288
+ return JSON.parse(data);
289
+ }
290
+ catch {
291
+ return null;
292
+ }
293
+ }
294
+ updateSelectedCollectionOutsideService() {
295
+ this.updatedEnginesSubject.next(this.engines);
296
+ }
297
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminologyService, deps: [{ token: i1.TerminologyConfigService }, { token: i2.AlertService }, { token: i3.TerminologyCollectionService }, { token: TERMINOLOGY_API_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
298
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminologyService, providedIn: 'root' }); }
299
+ }
300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminologyService, decorators: [{
301
+ type: Injectable,
302
+ args: [{
303
+ providedIn: 'root',
304
+ }]
305
+ }], ctorParameters: function () { return [{ type: i1.TerminologyConfigService }, { type: i2.AlertService }, { type: i3.TerminologyCollectionService }, { type: undefined, decorators: [{
306
+ type: Inject,
307
+ args: [TERMINOLOGY_API_TOKEN]
308
+ }] }]; } });
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWlub2xvZ3kuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi90ZXJtaW5vbG9neS9zZXJ2aWNlcy90ZXJtaW5vbG9neS90ZXJtaW5vbG9neS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBa0IsTUFBTSxjQUFjLENBQUM7QUFFbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7OztBQU83RSxNQUFNLE9BQU8sa0JBQWtCO0lBTzdCLElBQUksZUFBZSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQztJQUM5RCxJQUFJLG9CQUFvQixLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUEsQ0FBQyxDQUFDO0lBSWhGLElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sQ0FDTCxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1lBQzlCLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQsWUFDbUIsTUFBZ0MsRUFDaEMsS0FBbUIsRUFDbkIsaUJBQStDLEVBQ2hCLEtBQXFCO1FBSHBELFdBQU0sR0FBTixNQUFNLENBQTBCO1FB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Q0FBQyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyTCw2QkFBNkI7UUFDN0IsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBVyxDQUFDO1FBQ3BFLElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFBQyxNQUFNO1lBQ04sT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTyxzQ0FBc0M7UUFDNUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQzsrR0E1WVUsa0JBQWtCLGtJQXdCbkIscUJBQXFCO21IQXhCcEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXlCSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIGZvcmtKb2luLCBvZiwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbWJpbmVkQ29sbGVjdGlvbiwgSU10VGVybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBUZXJtaW5vbG9neUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb25maWcvc2VydmljZXMnO1xyXG5pbXBvcnQgeyBURVJNSU5PTE9HWV9BUElfVE9LRU4gfSBmcm9tICcuLi8uLi9pbmplY3Rpb24tdG9rZW5zL3Rlcm1pbm9sb2d5LWFwaS50b2tlbic7XHJcbmltcG9ydCB7IFRlcm1pbm9sb2d5Q29sbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi90ZXJtaW5vbG9neS1jb2xsZWN0aW9uL3Rlcm1pbm9sb2d5LWNvbGxlY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEVuZ2luZVRlcm1Db2xsZWN0aW9uU291cmNlLCBNdENvbGxlY3Rpb25TdGF0dXMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgVGVybWlub2xvZ3lFbmdpbmUgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGVybWlub2xvZ3ktZW5naW5lLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZXJtaW5vbG9neVNlcnZpY2Uge1xyXG4gIHB1YmxpYyBlbmdpbmVzOiB7IFtlbmdpbmVJZDogc3RyaW5nXTogVGVybWlub2xvZ3lFbmdpbmUgfSA9IHt9O1xyXG5cclxuICBwcml2YXRlIGVuZ2luZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuZW5naW5lcyk7XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlZEVuZ2luZXNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8e1tlbmdpbmVJZDogc3RyaW5nXTogVGVybWlub2xvZ3lFbmdpbmV9PigpO1xyXG5cclxuICBnZXQgaXNBdXRoZW50aWNhdGVkKCkgeyByZXR1cm4gdGhpcy5jb25maWcudGVybUNvbmZpZy5pc0F1dGggfVxyXG4gIGdldCBjYW5DcmVhdGVDb2xsZWN0aW9ucygpIHsgcmV0dXJuIHRoaXMuY29uZmlnLnRlcm1Db25maWcuY2FuQ3JlYXRlQ29sbGVjdGlvbiB9XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgTE9DQUxfU1RPUkFHRV9LRVkgPSAnc3lzdGVtTGFzdENvbGxlY3Rpb25zJztcclxuXHJcbiAgZ2V0IGhhc0VkaXRQZXJtaXNzaW9ucygpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuY29uZmlnPy50ZXJtQ29uZmlnLmlzQXV0aCAmJlxyXG4gICAgICB0aGlzLmNhbkNyZWF0ZUNvbGxlY3Rpb25zICYmXHJcbiAgICAgIHRoaXMuY29uZmlnLnRlcm1Db25maWcuaXNUZXJtUG9ydGFsU3VwcG9ydGVkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogVGVybWlub2xvZ3lDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGVydDogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXJtQ29sbGVjdGlvbkFwaTogVGVybWlub2xvZ3lDb2xsZWN0aW9uU2VydmljZSxcclxuICAgIEBJbmplY3QoVEVSTUlOT0xPR1lfQVBJX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IG10QXBpOiBJTXRUZXJtU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgaGFzQW55Q29sbGVjdGlvbnMoc3lzdGVtSWQ6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5lbmdpbmVzW3N5c3RlbUlkXT8uY29sbGVjdGlvbnMuc2l6ZSA+IDAgfVxyXG5cclxuICBnZXRFbmdpbmVzV2l0aFNlbGVjdGVkQ29sbGVjdGlvbkNoYW5nZSgpOiBPYnNlcnZhYmxlPHtbZW5naW5lSWQ6IHN0cmluZ106IFRlcm1pbm9sb2d5RW5naW5lfT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlZEVuZ2luZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RW5naW5lKFxyXG4gICAgZW5naW5lSWQ6IHN0cmluZyxcclxuICAgIGxhbmd1YWdlczogc3RyaW5nW10gfCBudWxsID0gbnVsbCxcclxuICAgIHNldFNlbGVjdGVkRnJvbUxvY2FsU3RvcmFnZSA9IGZhbHNlLFxyXG4gICAgdGVybUNvbGxlY3Rpb25zID0gdHJ1ZSxcclxuICAgIG10Q29sbGVjdGlvbnMgPSB0cnVlLFxyXG4gICAgc2VsZWN0ZWRDb2xsZWN0aW9uPzogQ29tYmluZWRDb2xsZWN0aW9uXHJcbiAgKSB7XHJcbiAgICBjb25zdCBlbmdpbmVFeGlzdHMgPSB0aGlzLmVuZ2luZXNbZW5naW5lSWRdID8/IG51bGw7XHJcblxyXG4gICAgaWYgKCFlbmdpbmVFeGlzdHMpIHtcclxuICAgICAgY29uc3QgbmV3RW5naW5lOiBUZXJtaW5vbG9neUVuZ2luZSA9IHtcclxuICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRDb2xsZWN0aW9uIHx8IG51bGwsXHJcbiAgICAgICAgaXNJbXBvcnRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGlzQW55SW1wb3J0aW5nOiBmYWxzZSxcclxuICAgICAgICBoYXNBbnlDb2xsZWN0aW9uczogZmFsc2UsXHJcbiAgICAgICAgaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgIGNvbGxlY3Rpb25zOiBuZXcgU2V0PENvbWJpbmVkQ29sbGVjdGlvbj4sXHJcbiAgICAgICAgcmVmcmVzaE10Q29sbGVjdGlvbnM6IG10Q29sbGVjdGlvbnMsXHJcbiAgICAgICAgcmVmcmVzaFRlcm1Db2xsZWN0aW9uczogdGVybUNvbGxlY3Rpb25zLFxyXG4gICAgICAgIGVuZ2luZUxhbmd1YWdlczogbGFuZ3VhZ2VzIHx8IFtdLFxyXG4gICAgICAgIGlzU29mdEF1dG9SZWZyZXNoT246IGZhbHNlLFxyXG4gICAgICAgIGhhcmRBdXRvUmVmcmVzaDogZmFsc2UsXHJcbiAgICAgICAgcmVmcmVzaFRpbWVvdXQ6IDBcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0gPSBuZXdFbmdpbmU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubG9hZENvbGxlY3Rpb25zKGVuZ2luZUlkLCBzZXRTZWxlY3RlZEZyb21Mb2NhbFN0b3JhZ2UpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VsZWN0ZWRDb2xsZWN0aW9uKGVuZ2luZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb246IENvbWJpbmVkQ29sbGVjdGlvbiB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uc2VsZWN0ZWQgPSBjb2xsZWN0aW9uO1xyXG5cclxuICAgIHRoaXMuc3RvcmVTZWxlY3RlZEluTG9jYWxTdG9yYWdlKGVuZ2luZUlkKTtcclxuICB9XHJcblxyXG4gIGxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZDogc3RyaW5nLCBzZXRTZWxlY3RlZEZyb21Mb2NhbFN0b3JhZ2U/OiBib29sZWFuKTogT2JzZXJ2YWJsZTx7W2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZTt9PiB7XHJcbiAgICAgIC8vIGNsZWFyIHRpbWVvdXQgc2luY2UgdGhpcyByZWZyZXNoIHJlcGxhY2VzIHNjaGVkdWxlZFxyXG4gICAgICB0aGlzLmNsZWFyVGltZW91dChlbmdpbmVJZCk7XHJcblxyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdID0gey4uLnRoaXMuZW5naW5lc1tlbmdpbmVJZF0sIGlzUmVmcmVzaGluZ0NvbGxlY3Rpb25zOiB0cnVlfVxyXG4gIFxyXG4gICAgICBsZXQgdGVybVJlc3BvbnNlOiBDb21iaW5lZENvbGxlY3Rpb25bXTtcclxuICAgICAgbGV0IG10QXBpUmVzcG9uc2U6IENvbWJpbmVkQ29sbGVjdGlvbltdO1xyXG4gIFxyXG4gICAgICBjb25zdCBvYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxDb21iaW5lZENvbGxlY3Rpb25bXT5bXSA9IFtdO1xyXG4gIFxyXG4gICAgICBpZiAodGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoVGVybUNvbGxlY3Rpb25zKSB7XHJcbiAgICAgICAgb2JzZXJ2YWJsZXMucHVzaChcclxuICAgICAgICAgIHRoaXMudGVybUNvbGxlY3Rpb25BcGlcclxuICAgICAgICAgICAgLmdldENvbGxlY3Rpb25MaXN0KClcclxuICAgICAgICAgICAgLnBpcGUodGFwKChyZXNwb25zZSkgPT4gKHRlcm1SZXNwb25zZSA9IHJlc3BvbnNlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoTXRDb2xsZWN0aW9ucykge1xyXG4gICAgICAgIG9ic2VydmFibGVzLnB1c2goXHJcbiAgICAgICAgICB0aGlzLm10QXBpXHJcbiAgICAgICAgICAgIC5nZXRMaXN0KGVuZ2luZUlkKVxyXG4gICAgICAgICAgICAucGlwZSh0YXAoKHJlc3BvbnNlKSA9PiAobXRBcGlSZXNwb25zZSA9IHJlc3BvbnNlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBmb3JrSm9pbihvYnNlcnZhYmxlcykuc3Vic2NyaWJlKHtcclxuICAgICAgICAvLyBkbyBub3QgbmVlZCByZXNwb25zZSBiZWNhdWUgcmVzcG9uc2VzIGFyZSBzYXZlZCBpbiBwaXBlIG1ldGhvZHNcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzQW55SW1wb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyBub3RlIHRoYXQgdGVybVJlc3BvbnNlIGFuZCBtdGFwaXJlc3BvbnNlIGdldHMgY2hhbmdlZCBkdXJpbmcgcmVtb3ZlIG1ldGhvZFxyXG4gICAgICAgICAgdGhpcy5yZW1vdmVEZWxldGVkKHRlcm1SZXNwb25zZSwgbXRBcGlSZXNwb25zZSwgZW5naW5lSWQpO1xyXG4gIFxyXG4gICAgICAgICAgY29uc3Qgam9pbmVkID0gW107XHJcbiAgICAgICAgICBpZiAobXRBcGlSZXNwb25zZSkge1xyXG4gICAgICAgICAgICBqb2luZWQucHVzaCguLi5tdEFwaVJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0ZXJtUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgam9pbmVkLnB1c2goLi4udGVybVJlc3BvbnNlKTtcclxuICAgICAgICAgIH1cclxuICBcclxuICAgICAgICAgIHRoaXMuYWRkQ29sbGVjdGlvbnMoam9pbmVkLCBlbmdpbmVJZCk7XHJcbiAgICAgICAgICBpZiAoc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlKGVuZ2luZUlkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnMgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKGVuZ2luZUlkLCBudWxsKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNSZWZyZXNoaW5nQ29sbGVjdGlvbnMgPSBmYWxzZTtcclxuICAgICAgICAgIC8vIGl0IGlzIGVub3VnaCB0byBzaG93IGVycm9yIG9ubHkgaW4gY29uc29sZS4gTm8gc3BlY2lhbCB0aGluZyBpcyBuZWNlc3NhcnkuXHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmVuZ2luZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb2xsZWN0aW9ucygpOiBPYnNlcnZhYmxlPHsgW2VuZ2luZUlkOiBzdHJpbmddOiBUZXJtaW5vbG9neUVuZ2luZSB9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmdpbmVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRBdXRvUmVmcmVzaChlbmdpbmVJZDogc3RyaW5nLCBsYW5ndWFnZXM6IHN0cmluZ1tdIHwgbnVsbCA9IG51bGwsIHNldFNlbGVjdGVkRnJvbUxvY2FsU3RvcmFnZSA9IGZhbHNlLCB0ZXJtQ29sbGVjdGlvbnMgPSB0cnVlLCBtdENvbGxlY3Rpb25zID0gdHJ1ZSkge1xyXG4gICAgY29uc3QgZW5naW5lID0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXSA/PyB7fTtcclxuICAgIGVuZ2luZS5oYXJkQXV0b1JlZnJlc2ggPSB0cnVlO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnNldEVuZ2luZShlbmdpbmVJZCwgbGFuZ3VhZ2VzID8/IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LmVuZ2luZUxhbmd1YWdlcywgc2V0U2VsZWN0ZWRGcm9tTG9jYWxTdG9yYWdlLCB0ZXJtQ29sbGVjdGlvbnMsIG10Q29sbGVjdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgc3RvcEF1dG9SZWZyZXNoKGVuZ2luZUlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY2xlYXJUaW1lb3V0KGVuZ2luZUlkKTtcclxuXHJcbiAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzU29mdEF1dG9SZWZyZXNoT24gPSBmYWxzZTtcclxuICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaGFyZEF1dG9SZWZyZXNoID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjcmVhdGUoXHJcbiAgICBzb3VyY2VMYW5ndWFnZTogc3RyaW5nLFxyXG4gICAgdGFyZ2V0TGFuZ3VhZ2U6IHN0cmluZyxcclxuICAgIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXHJcbiAgICBlbmdpbmVJZDogc3RyaW5nLFxyXG4gICAgcmVkaXJlY3RUb0VkaXQgPSB0cnVlXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZXJtQ29sbGVjdGlvbkFwaVxyXG4gICAgICAuY3JlYXRlQ29sbGVjdGlvbihbc291cmNlTGFuZ3VhZ2UsIHRhcmdldExhbmd1YWdlXSwgY29sbGVjdGlvbk5hbWUpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoY29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlZGlyZWN0VG9FZGl0KSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKFxyXG4gICAgICAgICAgICAgIHRoaXMudGVybUNvbGxlY3Rpb25BcGkuZ2V0RWRpdExpbmsoXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnRlcm1Db2xsZWN0aW9uPy5pZCA/PyAnJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZUxhbmd1YWdlLFxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TGFuZ3VhZ2VcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICdfYmxhbmsnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXT8uY29sbGVjdGlvbnM/LmFkZChjb2xsZWN0aW9uKTtcclxuXHJcbiAgICAgICAgICB0aGlzLmxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkSWRGb3JUcmFuc2xhdGlvbihlbmdpbmVJZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnNlbGVjdGVkO1xyXG4gICAgaWYgKFxyXG4gICAgICBzZWxlY3RlZD8ubXRDb2xsZWN0aW9uICYmXHJcbiAgICAgIChzZWxlY3RlZC5tdENvbGxlY3Rpb24ubGFzdFVwZGF0ZWQgfHxcclxuICAgICAgICBzZWxlY3RlZC5tdENvbGxlY3Rpb24uc3RhdHVzID09PSBNdENvbGxlY3Rpb25TdGF0dXMuUkVBRFkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkLm10Q29sbGVjdGlvbi5pZDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlSWZOZWNlc3NhcnkoXHJcbiAgICBjb2xsZWN0aW9uOiBDb21iaW5lZENvbGxlY3Rpb24sXHJcbiAgICBlbmdpbmVJZDogc3RyaW5nLFxyXG4gICAgaXNFZGl0ZWQgPSBmYWxzZVxyXG4gICk6IE9ic2VydmFibGU8Q29tYmluZWRDb2xsZWN0aW9uPiB7XHJcbiAgICAvLyBjb2xsZWN0aW9uIGlzIG5vdCBpbXBvcnRlZCBhbmQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGVuZ2luZVxyXG4gICAgaWYgKGNvbGxlY3Rpb24uaXNFZGl0ZWQoKSB8fCBpc0VkaXRlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5tdEFwaS5hZGQoZW5naW5lSWQsIGNvbGxlY3Rpb24pLnBpcGUoXHJcbiAgICAgICAgdGFwKCh1cGRhdGVkQ29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgY29sbGVjdGlvbi51cGRhdGUodXBkYXRlZENvbGxlY3Rpb24pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoY29sbGVjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVBZGRUb0VuZ2luZUVycm9yKGVycm9yOiBhbnksIGVuZ2luZUlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWxlcnQudW5oYW5kZWxlZEVycm9yKGVycm9yKTtcclxuICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uc2VsZWN0ZWQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc3luYyhcclxuICAgIGNvbGxlY3Rpb246IENvbWJpbmVkQ29sbGVjdGlvbixcclxuICAgIGVuZ2luZUlkOiBzdHJpbmdcclxuICApOiBPYnNlcnZhYmxlPENvbWJpbmVkQ29sbGVjdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMubXRBcGkuc3luYyhlbmdpbmVJZCwgY29sbGVjdGlvbikucGlwZShcclxuICAgICAgdGFwKCh1cGRhdGVkQ29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbGxlY3Rpb24udXBkYXRlKHVwZGF0ZWRDb2xsZWN0aW9uKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVNdENvbGxlY3Rpb24oY29sbGVjdGlvbjogQ29tYmluZWRDb2xsZWN0aW9uLCBlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tdEFwaS5yZW1vdmUoZW5naW5lSWQsIGNvbGxlY3Rpb24pLnBpcGUoXHJcbiAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjb2xsZWN0aW9uLnVwZGF0ZShyZXNwb25zZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWRkVG9FbmdpbmVWYWxpZGF0aW9uKGNvbGxlY3Rpb246IENvbWJpbmVkQ29sbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFjb2xsZWN0aW9uIHx8ICFjb2xsZWN0aW9uLnRlcm1Db2xsZWN0aW9uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUcnlpbmcgdG8gYXR0YWNoIGNvbGxlY3Rpb24gdGhhdCBoYXMgbm8gdGlsZGUgdGVybSBpZC5cIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclRpbWVvdXQoZW5naW5lSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnJlZnJlc2hUaW1lb3V0KSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnJlZnJlc2hUaW1lb3V0KTtcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoVGltZW91dCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGVkRnJvbUxvY2FsU3RvcmFnZShlbmdpbmVJZDogc3RyaW5nKSB7XHJcbiAgICAvLyBJZiBubyBjb2xsZWN0aW9ucyBvciBzZWxlY3RlZCBpcyBhbHJlYWR5IHNldCwgaXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZyb20gbG9jYWxzdG9yYWdlIHZhbHVlLiAoVXN1YWxseSwgbG9jYWxzdG9yYWdlIHNob3VsZCBoYXZlIHRoZSBzYW1lIHZhbHVlKS5cclxuICAgIGlmICh0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmNvbGxlY3Rpb25zPy5zaXplID09PSAwIHx8IHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uc2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZENvbGxlY3Rpb25PdXRzaWRlU2VydmljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RvcmVkSWQgPSB0aGlzLnJlYWRMb2NhbFN0b3JhZ2UoKT8uW2VuZ2luZUlkXTtcclxuICAgIFxyXG4gICAgaWYgKCFzdG9yZWRJZCkge1xyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZENvbGxlY3Rpb25PdXRzaWRlU2VydmljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXhpc3RpbmcgPSBBcnJheS5mcm9tKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uY29sbGVjdGlvbnMpLmZpbmQoXHJcbiAgICAgIChpdGVtKSA9PiBpdGVtLm10Q29sbGVjdGlvbj8uaWQgPT09IHN0b3JlZElkIHx8IGl0ZW0udGVybUNvbGxlY3Rpb24/LmlkID09PSBzdG9yZWRJZCk7XHJcbiAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkID0gZXhpc3RpbmcgYXMgQ29tYmluZWRDb2xsZWN0aW9uO1xyXG5cclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTtcclxuICB9XHJcbiAgXHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRGVsZXRlZCh0ZXJtUmVzcG9uc2U6IENvbWJpbmVkQ29sbGVjdGlvbltdLCBtdFJlc3BvbnNlOiBDb21iaW5lZENvbGxlY3Rpb25bXSwgZW5naW5lSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uY29sbGVjdGlvbnMpIHtcclxuICAgICAgY29uc3QgdGVybUV4aXN0aW5nSXggPSBDb21iaW5lZENvbGxlY3Rpb24uZmluZEV4aXN0aW5nSW5kZXhGcm9tTGlzdCh0ZXJtUmVzcG9uc2UsIGNvbGxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBtdEV4aXN0aW5nSXggPSBDb21iaW5lZENvbGxlY3Rpb24uZmluZEV4aXN0aW5nSW5kZXhGcm9tTGlzdChtdFJlc3BvbnNlLCBjb2xsZWN0aW9uKTtcclxuXHJcbiAgICAgIGlmICh0ZXJtRXhpc3RpbmdJeCA9PT0gbnVsbCAmJiBtdEV4aXN0aW5nSXggPT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5jb2xsZWN0aW9ucy5kZWxldGUoY29sbGVjdGlvbik7XHJcbiAgXHJcbiAgICAgICAgaWYgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0/LnNlbGVjdGVkID09PSBjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRlcm1FeGlzdGluZ0l4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1Rlcm0gPSB0ZXJtUmVzcG9uc2VbdGVybUV4aXN0aW5nSXhdO1xyXG4gICAgICAgICAgY29sbGVjdGlvbi51cGRhdGUoZXhpc3RpbmdUZXJtKTtcclxuICAgICAgICAgIHRlcm1SZXNwb25zZS5zcGxpY2UodGVybUV4aXN0aW5nSXgsIDEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2xsZWN0aW9uLmRlbGV0ZVRlcm1zKCk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGlmIChtdEV4aXN0aW5nSXggIT09IG51bGwpIHtcclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTXQgPSBtdFJlc3BvbnNlW210RXhpc3RpbmdJeF07XHJcbiAgICAgICAgICBjb2xsZWN0aW9uLnVwZGF0ZShleGlzdGluZ010KTtcclxuICAgICAgICAgIG10UmVzcG9uc2Uuc3BsaWNlKG10RXhpc3RpbmdJeCwgMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbGxlY3Rpb24uZGVsZXRlTVQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkQ29sbGVjdGlvbnMobmV3Q29sbGVjdGlvbnM6IEl0ZXJhYmxlPENvbWJpbmVkQ29sbGVjdGlvbj4sIGVuZ2luZUlkOiBzdHJpbmcpIHtcclxuICAgIC8vIHNldHMgY29sbGVjdGlvbiBsaXN0IHRvIHRoaXMgdmFsdWUgYXQgdGhlIGVuZCwgc28gZGVsZXRlZCBjb2xsZWN0aW9ucyBhcmUgbm90IGluIHRoZSBsaXN0LlxyXG4gICAgZm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIG5ld0NvbGxlY3Rpb25zKSB7XHJcbiAgICAgIC8vIFVzZXIgc2hvdWxkbid0IHNlZSBmYWlsZWQgY29sbGVjdGlvbnMgaWYgaGUgY2FuJ3QgcmV0cnkgdG8gaW1wb3J0IHRoZW0uXHJcbiAgICAgIGlmICghdGhpcy5oYXNFZGl0UGVybWlzc2lvbnMgJiYgY29sbGVjdGlvbi5tdFN0YXR1cyA9PT0gTXRDb2xsZWN0aW9uU3RhdHVzLkVSUk9SIHx8IGNvbGxlY3Rpb24ubXRTdGF0dXMgPT09IE10Q29sbGVjdGlvblN0YXR1cy5ERUxFVElORykge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sbGVjdGlvbi5pc0ltcG9ydGluZykge1xyXG4gICAgICAgIHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNBbnlJbXBvcnRpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBleGlzdGluZzogQ29tYmluZWRDb2xsZWN0aW9uIHwgbnVsbCA9IENvbWJpbmVkQ29sbGVjdGlvbi5maW5kRXhpc3RpbmdDb2xsZWN0aW9uRnJvbUxpc3QodGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5jb2xsZWN0aW9ucywgY29sbGVjdGlvbik7XHJcblxyXG4gICAgICAvLyBJZiB0ZXJtIGFwaSBkb2Vzbid0IGhhdmUgZW5naW5lIGxhbmd1YWdlcywgY29sbGVjdGlvbiBzaG91bGQgbm90IGJlIHNob3duIChpZiBpdCBpcyBub3QgYWxyZWFkeSBpbXBvcnRlZCBzb21laG93KTtcclxuICAgICAgaWYgKCFleGlzdGluZyAmJiBjb2xsZWN0aW9uLnNvdXJjZSA9PT0gRW5naW5lVGVybUNvbGxlY3Rpb25Tb3VyY2UuVElMREVfVEVSTSkge1xyXG4gICAgICAgIGxldCBoYXNMYW5ndWFnZXMgPSB0cnVlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5lbmdpbmVMYW5ndWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgIWNvbGxlY3Rpb24udGVybUNvbGxlY3Rpb24/Lmxhbmd1YWdlcz8uZmluZChcclxuICAgICAgICAgICAgICAobGFuZykgPT4gbGFuZy5pZCA9PT0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5lbmdpbmVMYW5ndWFnZXNbaV1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGhhc0xhbmd1YWdlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaGFzTGFuZ3VhZ2VzKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcclxuICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmNvbGxlY3Rpb25zLmFkZChjb2xsZWN0aW9uKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBleGlzdGluZy51cGRhdGUoY29sbGVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmhhc0FueUNvbGxlY3Rpb25zID0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5jb2xsZWN0aW9ucy5zaXplID4gMDtcclxuXHJcbiAgICB0aGlzLmVuZ2luZVN1YmplY3QubmV4dCh0aGlzLmVuZ2luZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goZW5naW5lSWQ6IHN0cmluZywgdGltZW91dD86IG51bWJlciB8IG51bGwsKSB7XHJcbiAgICAvLyBpZiBtZW51IGlzIGNsb3NlZCBhbmQgc2VsZWN0ZWQgY29sbGVjdGlvbiBpcyBub3QgaW1wb3J0aW5nIGFueW1vcmUgLSBhdXRvIHJlZnJlc2hpbmcgc2hvdWxkIGJlIGNhbmNlbGxlZC5cclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaGFyZEF1dG9SZWZyZXNoICYmXHJcbiAgICAgICF0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5pc0ltcG9ydGluZyAmJlxyXG4gICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLmlzU29mdEF1dG9SZWZyZXNoT25cclxuICAgICkge1xyXG4gICAgICB0aGlzLnN0b3BBdXRvUmVmcmVzaChlbmdpbmVJZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBoYXJkIGF1dG8gcmVmcmVzaG8gb24sIGF1dG8gcmVmcmVzaCBzaG91bGQgYmUgb24uIElmIGhhcmQgYXV0b3JlZmVyZXNoIGlzIG9mZiAsIHJlZnJlc2ggbmVlZHMgdG8gYmUgZG9uZSBvbmx5IGlmIHNlbGVjdGVkIGlzIGltcG9ydGluZy5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5oYXJkQXV0b1JlZnJlc2ggfHxcclxuICAgICAgKCF0aGlzLmVuZ2luZXNbZW5naW5lSWRdICYmXHJcbiAgICAgICAgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNTb2Z0QXV0b1JlZnJlc2hPbiB8fCB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnNlbGVjdGVkPy5pc0ltcG9ydGluZykpXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgdGltZW91dE1zID1cclxuICAgICAgICB0aW1lb3V0ID8/XHJcbiAgICAgICAgKHRoaXMuZW5naW5lc1tlbmdpbmVJZF0uaXNBbnlJbXBvcnRpbmdcclxuICAgICAgICAgID8gdGhpcy5jb25maWcudGVybUNvbmZpZy5yZWZyZXNoVGltZW91dE1zV2hlbkltcG9ydGluZ1xyXG4gICAgICAgICAgOiB0aGlzLmNvbmZpZy50ZXJtQ29uZmlnLnJlZnJlc2hUaW1lb3V0TXMpO1xyXG4gICAgICAgICAgdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5yZWZyZXNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVuZ2luZXNbZW5naW5lSWRdLnJlZnJlc2hUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxvYWRDb2xsZWN0aW9ucyhlbmdpbmVJZCk7XHJcbiAgICAgIH0sIHRpbWVvdXRNcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3JlU2VsZWN0ZWRJbkxvY2FsU3RvcmFnZShlbmdpbmVJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbG9jYWxTdG9yYWdlT2JqZWN0ID0gdGhpcy5yZWFkTG9jYWxTdG9yYWdlKCk7XHJcbiAgICBcclxuICAgIGlmICghbG9jYWxTdG9yYWdlT2JqZWN0KSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZU9iamVjdCA9IHt9IGFzIGFueTtcclxuICAgIH1cclxuXHJcbiAgICBsb2NhbFN0b3JhZ2VPYmplY3RbZW5naW5lSWRdID0gdGhpcy5lbmdpbmVzW2VuZ2luZUlkXS5zZWxlY3RlZCA/ICh0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5zZWxlY3RlZD8ubXRDb2xsZWN0aW9uPy5pZCA/PyB0aGlzLmVuZ2luZXNbZW5naW5lSWRdPy5zZWxlY3RlZD8udGVybUNvbGxlY3Rpb24/LmlkKSA6IG51bGw7XHJcbiAgICAvLyBzdG9yZSB0ZXJtIGlkIGlmIGl0IGV4aXN0c1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5MT0NBTF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobG9jYWxTdG9yYWdlT2JqZWN0KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRMb2NhbFN0b3JhZ2UoKTogYW55IHtcclxuICAgIGNvbnN0IGRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkxPQ0FMX1NUT1JBR0VfS0VZKSBhcyBzdHJpbmc7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWRDb2xsZWN0aW9uT3V0c2lkZVNlcnZpY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZWRFbmdpbmVzU3ViamVjdC5uZXh0KHRoaXMuZW5naW5lcyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==