@eui/core 13.0.0-beta.14 → 13.0.0-beta.18

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 (210) hide show
  1. package/docs/classes/ActivatedRouteAction.html +43 -43
  2. package/docs/classes/AddApiQueueItemAction.html +43 -43
  3. package/docs/classes/AddAppLoadedConfigModulesAction.html +43 -43
  4. package/docs/classes/ApiQueueServiceMock.html +26 -526
  5. package/docs/classes/AsyncStorageService.html +43 -469
  6. package/docs/classes/AsyncStorageServiceMock.html +40 -1225
  7. package/docs/classes/EmptyApiQueueAction.html +43 -43
  8. package/docs/classes/EuiCoreRootGuardClass.html +8 -6
  9. package/docs/classes/EuiError.html +8 -6
  10. package/docs/classes/I18nResourceImpl.html +25 -26
  11. package/docs/classes/InitStoreAction.html +43 -43
  12. package/docs/classes/LogServiceMock.html +10 -10
  13. package/docs/classes/OpenIdConnectServiceMock.html +10 -46
  14. package/docs/classes/RemoveApiQueueItemAction.html +43 -43
  15. package/docs/classes/RouterMock.html +77 -84
  16. package/docs/classes/StorageService.html +31 -36
  17. package/docs/classes/StorageServiceMock.html +16 -479
  18. package/docs/classes/StoreMock.html +41 -47
  19. package/docs/classes/TranslateServiceMock.html +251 -270
  20. package/docs/classes/UpdateAppConnectionAction.html +43 -43
  21. package/docs/classes/UpdateAppStatusAction.html +43 -43
  22. package/docs/classes/UpdateAppVersionAction.html +43 -43
  23. package/docs/classes/UpdateCurrentModuleAction.html +43 -43
  24. package/docs/classes/UpdateI18nStateAction.html +43 -43
  25. package/docs/classes/UpdateLocaleStateAction.html +43 -43
  26. package/docs/classes/UpdateNotificationsListAction.html +43 -43
  27. package/docs/classes/UpdateUserDashboardAction.html +43 -43
  28. package/docs/classes/UpdateUserDetailsAction.html +43 -43
  29. package/docs/classes/UpdateUserPreferencesAction.html +43 -43
  30. package/docs/classes/UpdateUserRightsAction.html +43 -43
  31. package/docs/classes/UpdateUserStateAction.html +43 -43
  32. package/docs/classes/UxErrorManager.html +39 -43
  33. package/docs/dependencies.html +44 -41
  34. package/docs/directives/TranslateMockDirective.html +9 -7
  35. package/docs/index.html +7 -6
  36. package/docs/injectables/ApiQueueService.html +33 -40
  37. package/docs/injectables/CoreAppEffects.html +98 -99
  38. package/docs/injectables/EuiPermissionService.html +26 -31
  39. package/docs/injectables/GlobalErrorHandler.html +12 -11
  40. package/docs/injectables/I18nLoader.html +28 -30
  41. package/docs/injectables/I18nService.html +42 -48
  42. package/docs/injectables/I18nServiceMock.html +32 -569
  43. package/docs/injectables/LocalForageService.html +75 -1549
  44. package/docs/injectables/LocalStorageService.html +38 -499
  45. package/docs/injectables/LocaleService.html +23 -28
  46. package/docs/injectables/LocaleServiceMock.html +21 -198
  47. package/docs/injectables/LogService.html +11 -10
  48. package/docs/injectables/OpenIdConnectService.html +10 -10
  49. package/docs/injectables/SessionStorageService.html +38 -499
  50. package/docs/injectables/StoreService.html +24 -28
  51. package/docs/injectables/StoreServiceMock.html +18 -360
  52. package/docs/injectables/UserService.html +24 -27
  53. package/docs/injectables/UserServiceMock.html +31 -196
  54. package/docs/injectables/UxAppShellService.html +299 -355
  55. package/docs/injectables/UxDynamicComponentService.html +16 -16
  56. package/docs/injectables/UxDynamicMenuService.html +38 -40
  57. package/docs/injectables/UxErrorFeedbackService.html +42 -48
  58. package/docs/injectables/UxTimezoneService.html +18 -22
  59. package/docs/interceptors/AddLangParamInterceptor.html +11 -10
  60. package/docs/interceptors/CachePreventionInterceptor.html +11 -10
  61. package/docs/interceptors/CorsSecurityInterceptor.html +11 -10
  62. package/docs/interceptors/CsrfPreventionInterceptor.html +11 -10
  63. package/docs/interceptors/EuLoginSessionTimeoutHandlingInterceptor.html +11 -10
  64. package/docs/interceptors/HttpErrorHandlerInterceptor.html +11 -10
  65. package/docs/interceptors/OpenIdConnectInterceptor.html +35 -35
  66. package/docs/interceptors/UxRequestErrorModelInterceptor.html +11 -10
  67. package/docs/interfaces/LoadedResources.html +37 -12
  68. package/docs/interfaces/LoadedResourcesError.html +28 -10
  69. package/docs/interfaces/ModuleLoadEvent.html +37 -12
  70. package/docs/interfaces/OpenIdConnectUserDetails.html +64 -18
  71. package/docs/interfaces/ResourceError.html +37 -12
  72. package/docs/interfaces/TimeZone.html +28 -10
  73. package/docs/interfaces/UIState.html +325 -76
  74. package/docs/js/libs/prism.js +46 -14
  75. package/docs/js/menu-wc.js +76 -79
  76. package/docs/js/menu-wc_es5.js +60 -0
  77. package/docs/js/menu.js +15 -11
  78. package/docs/js/search/lunr.min.js +3 -3
  79. package/docs/js/search/search_index.js +2 -2
  80. package/docs/license.html +6 -5
  81. package/docs/miscellaneous/enumerations.html +18 -17
  82. package/docs/miscellaneous/functions.html +261 -140
  83. package/docs/miscellaneous/typealiases.html +18 -17
  84. package/docs/miscellaneous/variables.html +1719 -1811
  85. package/docs/modules/CoreModule.html +13 -14
  86. package/docs/modules/I18nModule.html +11 -11
  87. package/docs/modules/LogModule.html +16 -16
  88. package/docs/modules/TranslateMockModule.html +8 -6
  89. package/docs/modules.html +6 -5
  90. package/docs/pipes/TranslateMockPipe.html +10 -9
  91. package/docs/styles/bootstrap.min.css +4 -3
  92. package/docs/styles/compodoc.css +41 -33
  93. package/docs/styles/dark.css +113 -0
  94. package/docs/styles/laravel.css +52 -6
  95. package/docs/styles/material.css +31 -7
  96. package/docs/styles/original.css +12 -6
  97. package/docs/styles/postmark.css +23 -7
  98. package/docs/styles/prism.css +169 -135
  99. package/docs/styles/readthedocs.css +22 -11
  100. package/docs/styles/stripe.css +48 -5
  101. package/docs/styles/vagrant.css +42 -6
  102. package/{esm2015/eui-core.js → esm2020/eui-core.mjs} +0 -0
  103. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  104. package/{esm2015/lib/eui-core.module.js → esm2020/lib/eui-core.module.mjs} +5 -5
  105. package/{esm2015/lib/helpers/date-helpers.js → esm2020/lib/helpers/date-helpers.mjs} +0 -0
  106. package/{esm2015/lib/helpers/dom-helpers.js → esm2020/lib/helpers/dom-helpers.mjs} +0 -0
  107. package/{esm2015/lib/helpers/event-helpers.js → esm2020/lib/helpers/event-helpers.mjs} +0 -0
  108. package/{esm2015/lib/helpers/form-helpers.js → esm2020/lib/helpers/form-helpers.mjs} +0 -0
  109. package/{esm2015/lib/helpers/format-helpers.js → esm2020/lib/helpers/format-helpers.mjs} +0 -0
  110. package/{esm2015/lib/helpers/http-helpers.js → esm2020/lib/helpers/http-helpers.mjs} +0 -0
  111. package/{esm2015/lib/helpers/index.js → esm2020/lib/helpers/index.mjs} +0 -0
  112. package/{esm2015/lib/helpers/utils.js → esm2020/lib/helpers/utils.mjs} +0 -0
  113. package/{esm2015/lib/interceptors/add-lang-param.interceptor.js → esm2020/lib/interceptors/add-lang-param.interceptor.mjs} +4 -4
  114. package/{esm2015/lib/interceptors/cache-prevention.interceptor.js → esm2020/lib/interceptors/cache-prevention.interceptor.mjs} +4 -4
  115. package/{esm2015/lib/interceptors/cors-security.interceptor.js → esm2020/lib/interceptors/cors-security.interceptor.mjs} +4 -4
  116. package/{esm2015/lib/interceptors/csrf-prevention.interceptor.js → esm2020/lib/interceptors/csrf-prevention.interceptor.mjs} +4 -4
  117. package/esm2020/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +61 -0
  118. package/{esm2015/lib/interceptors/index.js → esm2020/lib/interceptors/index.mjs} +0 -0
  119. package/{esm2015/lib/interceptors/openid/index.js → esm2020/lib/interceptors/openid/index.mjs} +0 -0
  120. package/esm2020/lib/interceptors/openid/openid-connect.interceptor.mjs +146 -0
  121. package/{esm2015/lib/interceptors/openid/openid-connect.service.js → esm2020/lib/interceptors/openid/openid-connect.service.mjs} +4 -4
  122. package/{esm2015/lib/interceptors/openid/openid-connect.service.mock.js → esm2020/lib/interceptors/openid/openid-connect.service.mock.mjs} +0 -0
  123. package/{esm2015/lib/interceptors/ux-request-error-model.interceptor.js → esm2020/lib/interceptors/ux-request-error-model.interceptor.mjs} +4 -4
  124. package/{esm2015/lib/services/app/eui-init-app.js → esm2020/lib/services/app/eui-init-app.mjs} +0 -0
  125. package/esm2020/lib/services/app/eui-pre-init-app.mjs +42 -0
  126. package/{esm2015/lib/services/app/eui-startup.js → esm2020/lib/services/app/eui-startup.mjs} +0 -0
  127. package/{esm2015/lib/services/app/factories/log.js → esm2020/lib/services/app/factories/log.mjs} +0 -0
  128. package/{esm2015/lib/services/app/index.js → esm2020/lib/services/app/index.mjs} +0 -0
  129. package/esm2020/lib/services/config/defaults.mjs +63 -0
  130. package/{esm2015/lib/services/config/tokens.js → esm2020/lib/services/config/tokens.mjs} +5 -2
  131. package/{esm2015/lib/services/errors/eui.error.js → esm2020/lib/services/errors/eui.error.mjs} +0 -0
  132. package/{esm2015/lib/services/errors/global-error-handler.js → esm2020/lib/services/errors/global-error-handler.mjs} +4 -4
  133. package/{esm2015/lib/services/errors/http-error-handler-callback-functions.js → esm2020/lib/services/errors/http-error-handler-callback-functions.mjs} +0 -0
  134. package/{esm2015/lib/services/errors/http-error-handler.interceptor.js → esm2020/lib/services/errors/http-error-handler.interceptor.mjs} +4 -4
  135. package/{esm2015/lib/services/errors/index.js → esm2020/lib/services/errors/index.mjs} +0 -0
  136. package/{esm2015/lib/services/i18n/i18n.loader.js → esm2020/lib/services/i18n/i18n.loader.mjs} +4 -4
  137. package/{esm2015/lib/services/i18n/i18n.resource.js → esm2020/lib/services/i18n/i18n.resource.mjs} +0 -0
  138. package/esm2020/lib/services/i18n/i18n.service.mjs +222 -0
  139. package/{esm2015/lib/services/i18n/i18n.service.mock.js → esm2020/lib/services/i18n/i18n.service.mock.mjs} +4 -4
  140. package/{esm2015/lib/services/i18n/index.js → esm2020/lib/services/i18n/index.mjs} +0 -0
  141. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  142. package/{esm2015/lib/services/locale/index.js → esm2020/lib/services/locale/index.mjs} +0 -0
  143. package/esm2020/lib/services/locale/locale.service.mjs +250 -0
  144. package/{esm2015/lib/services/log/index.js → esm2020/lib/services/log/index.mjs} +0 -0
  145. package/{esm2015/lib/services/log/log.module.js → esm2020/lib/services/log/log.module.mjs} +5 -5
  146. package/{esm2015/lib/services/log/log.service.js → esm2020/lib/services/log/log.service.mjs} +4 -4
  147. package/{esm2015/lib/services/log/log.service.mock.js → esm2020/lib/services/log/log.service.mock.mjs} +0 -0
  148. package/{esm2015/lib/services/permission/permission.service.js → esm2020/lib/services/permission/permission.service.mjs} +5 -5
  149. package/{esm2015/lib/services/queue/api-queue.service.js → esm2020/lib/services/queue/api-queue.service.mjs} +4 -4
  150. package/{esm2015/lib/services/queue/api-queue.service.mock.js → esm2020/lib/services/queue/api-queue.service.mock.mjs} +0 -0
  151. package/{esm2015/lib/services/queue/index.js → esm2020/lib/services/queue/index.mjs} +0 -0
  152. package/{esm2015/lib/services/storage/async-storage.service.js → esm2020/lib/services/storage/async-storage.service.mjs} +0 -0
  153. package/{esm2015/lib/services/storage/async-storage.service.mock.js → esm2020/lib/services/storage/async-storage.service.mock.mjs} +0 -0
  154. package/{esm2015/lib/services/storage/index.js → esm2020/lib/services/storage/index.mjs} +0 -0
  155. package/{esm2015/lib/services/storage/local-forage.service.js → esm2020/lib/services/storage/local-forage.service.mjs} +4 -4
  156. package/{esm2015/lib/services/storage/local-storage.service.js → esm2020/lib/services/storage/local-storage.service.mjs} +4 -4
  157. package/{esm2015/lib/services/storage/session-storage.service.js → esm2020/lib/services/storage/session-storage.service.mjs} +4 -4
  158. package/{esm2015/lib/services/storage/storage.service.js → esm2020/lib/services/storage/storage.service.mjs} +0 -0
  159. package/{esm2015/lib/services/storage/storage.service.mock.js → esm2020/lib/services/storage/storage.service.mock.mjs} +0 -0
  160. package/{esm2015/lib/services/store/actions/app.actions.js → esm2020/lib/services/store/actions/app.actions.mjs} +0 -0
  161. package/{esm2015/lib/services/store/actions/i18n.actions.js → esm2020/lib/services/store/actions/i18n.actions.mjs} +0 -0
  162. package/{esm2015/lib/services/store/actions/index.js → esm2020/lib/services/store/actions/index.mjs} +0 -0
  163. package/{esm2015/lib/services/store/actions/locale.actions.js → esm2020/lib/services/store/actions/locale.actions.mjs} +0 -0
  164. package/{esm2015/lib/services/store/actions/notifications.actions.js → esm2020/lib/services/store/actions/notifications.actions.mjs} +0 -0
  165. package/{esm2015/lib/services/store/actions/user.actions.js → esm2020/lib/services/store/actions/user.actions.mjs} +0 -0
  166. package/{esm2015/lib/services/store/effects/app.effects.js → esm2020/lib/services/store/effects/app.effects.mjs} +5 -5
  167. package/{esm2015/lib/services/store/effects/index.js → esm2020/lib/services/store/effects/index.mjs} +0 -0
  168. package/{esm2015/lib/services/store/index.js → esm2020/lib/services/store/index.mjs} +0 -0
  169. package/esm2020/lib/services/store/reducers/app.reducers.mjs +57 -0
  170. package/{esm2015/lib/services/store/reducers/core.reducers.js → esm2020/lib/services/store/reducers/core.reducers.mjs} +0 -0
  171. package/esm2020/lib/services/store/reducers/i18n.reducers.mjs +18 -0
  172. package/{esm2015/lib/services/store/reducers/index.js → esm2020/lib/services/store/reducers/index.mjs} +0 -0
  173. package/esm2020/lib/services/store/reducers/locale.reducers.mjs +18 -0
  174. package/esm2020/lib/services/store/reducers/meta.reducers.mjs +91 -0
  175. package/{esm2015/lib/services/store/reducers/notifications.reducers.js → esm2020/lib/services/store/reducers/notifications.reducers.mjs} +0 -0
  176. package/esm2020/lib/services/store/reducers/user.reducers.mjs +43 -0
  177. package/{esm2015/lib/services/store/store.service.js → esm2020/lib/services/store/store.service.mjs} +4 -4
  178. package/{esm2015/lib/services/store/store.service.mock.js → esm2020/lib/services/store/store.service.mock.mjs} +4 -4
  179. package/{esm2015/lib/services/user/index.js → esm2020/lib/services/user/index.mjs} +0 -0
  180. package/{esm2015/lib/services/user/user.service.js → esm2020/lib/services/user/user.service.mjs} +4 -4
  181. package/{esm2015/lib/services/user/user.service.mock.js → esm2020/lib/services/user/user.service.mock.mjs} +4 -4
  182. package/esm2020/lib/services/ux-app-shell.service.mjs +633 -0
  183. package/{esm2015/lib/services/ux-dynamic-component/ux-dynamic-component.service.js → esm2020/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs} +4 -4
  184. package/{esm2015/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.js → esm2020/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.mjs} +4 -4
  185. package/{esm2015/lib/services/ux-error-feedback/ux-error-feedback.service.js → esm2020/lib/services/ux-error-feedback/ux-error-feedback.service.mjs} +4 -4
  186. package/{esm2015/lib/services/ux-error-feedback/ux-error-handler.operator.js → esm2020/lib/services/ux-error-feedback/ux-error-handler.operator.mjs} +0 -0
  187. package/{esm2015/lib/services/ux-timezone.service.js → esm2020/lib/services/ux-timezone.service.mjs} +4 -4
  188. package/fesm2015/{eui-core.js → eui-core.mjs} +270 -247
  189. package/fesm2015/eui-core.mjs.map +1 -0
  190. package/fesm2020/eui-core.mjs +4592 -0
  191. package/fesm2020/eui-core.mjs.map +1 -0
  192. package/lib/services/locale/locale.service.d.ts.map +1 -1
  193. package/lib/services/permission/permission.service.d.ts +1 -1
  194. package/lib/services/permission/permission.service.d.ts.map +1 -1
  195. package/package.json +19 -6
  196. package/bundles/eui-core.umd.js +0 -5323
  197. package/bundles/eui-core.umd.js.map +0 -1
  198. package/esm2015/lib/interceptors/eu-login-session-timeout-handling.interceptor.js +0 -61
  199. package/esm2015/lib/interceptors/openid/openid-connect.interceptor.js +0 -146
  200. package/esm2015/lib/services/app/eui-pre-init-app.js +0 -47
  201. package/esm2015/lib/services/config/defaults.js +0 -49
  202. package/esm2015/lib/services/i18n/i18n.service.js +0 -219
  203. package/esm2015/lib/services/locale/locale.service.js +0 -255
  204. package/esm2015/lib/services/store/reducers/app.reducers.js +0 -49
  205. package/esm2015/lib/services/store/reducers/i18n.reducers.js +0 -15
  206. package/esm2015/lib/services/store/reducers/locale.reducers.js +0 -15
  207. package/esm2015/lib/services/store/reducers/meta.reducers.js +0 -92
  208. package/esm2015/lib/services/store/reducers/user.reducers.js +0 -43
  209. package/esm2015/lib/services/ux-app-shell.service.js +0 -584
  210. package/fesm2015/eui-core.js.map +0 -1
@@ -1,584 +0,0 @@
1
- import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
2
- import { HttpClient } from '@angular/common/http';
3
- import { isPlatformBrowser } from '@angular/common';
4
- import { BehaviorSubject, defer } from 'rxjs';
5
- import { UxEuLanguages, getActiveLang } from '@eui/base';
6
- import { GLOBAL_CONFIG_TOKEN } from './config/tokens';
7
- import { I18nService } from './i18n';
8
- import { Router, NavigationEnd } from '@angular/router';
9
- import { StoreService } from './store/store.service';
10
- import { distinctUntilChanged, map, filter } from 'rxjs/operators';
11
- import isEqual from 'lodash/isEqual';
12
- import get from 'lodash/get';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/common/http";
15
- import * as i2 from "@angular/router";
16
- import * as i3 from "./store/store.service";
17
- import * as i4 from "./i18n";
18
- const initialState = {
19
- appName: '',
20
- appShortName: '',
21
- appSubTitle: '',
22
- userInfos: null,
23
- userSubInfos: null,
24
- impersonatedUserInfos: null,
25
- isSidebarOpen: false,
26
- isSidebarHover: false,
27
- isSidebarActive: false,
28
- isSidebarInnerActive: false,
29
- isSidebarStateCloseWithIcons: false,
30
- hasSidebar: false,
31
- hasHeader: false,
32
- hasHeaderLogo: false,
33
- hasHeaderEnvironment: false,
34
- environmentValue: '',
35
- isSidebarHidden: false,
36
- hasToolbar: false,
37
- windowWidth: 0,
38
- windowHeight: 0,
39
- mainContentHeight: 0,
40
- pageHeaderHeight: 0,
41
- wrapperClasses: '',
42
- breakpoint: '',
43
- breakpoints: {
44
- isMobile: false,
45
- isTablet: false,
46
- isLtDesktop: false,
47
- isDesktop: false,
48
- isXL: false,
49
- isXXL: false,
50
- },
51
- menuLinks: [],
52
- sidebarLinks: [],
53
- combinedLinks: [],
54
- isBlockDocumentActive: false,
55
- deviceInfo: null,
56
- activeLanguage: 'en',
57
- languages: UxEuLanguages.getLanguages(),
58
- appMetadata: null,
59
- hasModalActive: false,
60
- isDimmerActive: false,
61
- };
62
- // TODO: this service needs to be transferred in the respective component
63
- export class UxAppShellService {
64
- constructor(config, http, platformId, router, storeService, i18nService) {
65
- var _a, _b, _c, _d;
66
- this.config = config;
67
- this.http = http;
68
- this.platformId = platformId;
69
- this.router = router;
70
- this.storeService = storeService;
71
- this.i18nService = i18nService;
72
- this.growlMessages = [];
73
- this.isGrowlSticky = false;
74
- this.growlLife = 3000;
75
- this.growlPosition = 'bottom-right';
76
- this.growlCallback = null;
77
- this.activeModals = [];
78
- this.openModalId = new BehaviorSubject('');
79
- this.cssVars = [];
80
- let stateWithConfig = initialState;
81
- const languages = ((_b = (_a = config === null || config === void 0 ? void 0 : config.i18n) === null || _a === void 0 ? void 0 : _a.i18nService) === null || _b === void 0 ? void 0 : _b.languages) || initialState.languages;
82
- const defaultLanguage = ((_d = (_c = config === null || config === void 0 ? void 0 : config.i18n) === null || _c === void 0 ? void 0 : _c.i18nService) === null || _d === void 0 ? void 0 : _d.defaultLanguage) || initialState.activeLanguage;
83
- stateWithConfig = Object.assign(Object.assign({}, stateWithConfig), {
84
- languages: languages,
85
- activeLanguage: defaultLanguage,
86
- });
87
- this._state$ = new BehaviorSubject(stateWithConfig);
88
- this._breakpoint$ = new BehaviorSubject('');
89
- this._breakpoints$ = new BehaviorSubject({});
90
- this.bindActiveLanguageToAppShellState();
91
- if (isPlatformBrowser(this.platformId)) {
92
- router.events
93
- .subscribe((event) => {
94
- if (event instanceof NavigationEnd) {
95
- window.scrollTo(0, 0);
96
- }
97
- });
98
- }
99
- }
100
- // -------------------
101
- get state$() {
102
- return this._state$.asObservable();
103
- }
104
- // -------------------
105
- // exposed observables
106
- get breakpoint$() {
107
- return this._breakpoint$.asObservable();
108
- }
109
- get breakpoints$() {
110
- return this._breakpoints$.asObservable();
111
- }
112
- // ----------------
113
- // state operations
114
- // ----------------
115
- get state() {
116
- return this._state$.getValue();
117
- }
118
- get isSidebarOpen() {
119
- return this.state.isSidebarOpen;
120
- }
121
- // Edit mode
122
- get isDimmerActive() {
123
- return this.state.isDimmerActive;
124
- }
125
- // ----------------------------
126
- // public setters and functions
127
- // ----------------------------
128
- set isSidebarOpen(isOpen) {
129
- this.setState(Object.assign(Object.assign({}, this.state), { isSidebarOpen: isOpen }));
130
- }
131
- set isSidebarHover(isHover) {
132
- this.setState(Object.assign(Object.assign({}, this.state), { isSidebarHover: isHover }));
133
- }
134
- get isSidebarHover() {
135
- return this.state.isSidebarHover;
136
- }
137
- set isSidebarActive(isActive) {
138
- this.setState(Object.assign(Object.assign({}, this.state), { isSidebarActive: isActive }));
139
- }
140
- set isSidebarInnerActive(isOpen) {
141
- this.setState(Object.assign(Object.assign({}, this.state), { isSidebarInnerActive: isOpen }));
142
- }
143
- set sidebarLinks(links) {
144
- this.setState(Object.assign(Object.assign({}, this.state), { sidebarLinks: links }));
145
- }
146
- set menuLinks(links) {
147
- this.setState(Object.assign(Object.assign({}, this.state), { menuLinks: links }));
148
- }
149
- set isBlockDocumentActive(isActive) {
150
- this.setState(Object.assign(Object.assign({}, this.state), { isBlockDocumentActive: isActive }));
151
- }
152
- // Edit mode
153
- set isDimmerActive(isActive) {
154
- this.setState(Object.assign(Object.assign({}, this.state), { isDimmerActive: isActive }));
155
- }
156
- setState(nextState, updateI18 = true) {
157
- let breakpoint, breakpoints, wrapperClasses;
158
- let combinedLinks;
159
- const state = this.state;
160
- // check if window width has been updated from previous state
161
- if (this.state.windowWidth !== nextState.windowWidth) {
162
- breakpoint = this.getBreakpoint(nextState.windowWidth);
163
- breakpoints = this.getBreakpoints(breakpoint);
164
- this._breakpoint$.next(breakpoint);
165
- this._breakpoints$.next(breakpoints);
166
- // if not propagate the old ones without doing any calculations
167
- }
168
- else {
169
- breakpoint = state.breakpoint;
170
- breakpoints = state.breakpoints;
171
- }
172
- // finally get the wrapper classes when both the state and breakpoint are known
173
- wrapperClasses = this.getWrapperClasses(nextState, breakpoint);
174
- // check if the menuLinks or sidebarLinks have changed from previous state
175
- if (this.state.menuLinks !== nextState.menuLinks || this.state.sidebarLinks !== nextState.sidebarLinks) {
176
- combinedLinks = [...nextState.menuLinks, ...nextState.sidebarLinks];
177
- }
178
- else {
179
- combinedLinks = this.state.combinedLinks;
180
- }
181
- const stateBeforeUpdate = Object.assign({}, this.state);
182
- // we put it all together with the calculated properties
183
- this._state$.next(Object.assign(Object.assign({}, nextState), { wrapperClasses,
184
- breakpoint,
185
- breakpoints,
186
- combinedLinks }));
187
- // update the Store Language
188
- if (updateI18 && nextState.activeLanguage !== stateBeforeUpdate.activeLanguage) {
189
- this.i18nService.updateState({ activeLang: nextState.activeLanguage });
190
- }
191
- }
192
- /**
193
- * Emits a slice from the state whether that changes
194
- * @param key can be 'key' or 'key.sub.sub'
195
- */
196
- getState(key) {
197
- return defer(() => {
198
- // check if key exists
199
- return key ? this.state$.pipe(map((state) => get(state, key)), filter((state) => state), distinctUntilChanged((x, y) => isEqual(x, y))) : this.state$;
200
- });
201
- }
202
- sidebarToggle() {
203
- this.isSidebarOpen = !this.state.isSidebarOpen;
204
- }
205
- // Edit mode
206
- dimmerActiveToggle() {
207
- const isActive = this.isDimmerActive;
208
- this.setState(Object.assign(Object.assign({}, this.state), { isDimmerActive: !isActive }));
209
- this.activateEditModeCssVars(!isActive);
210
- }
211
- setDimmerActiveState(activeState) {
212
- this.setState(Object.assign(Object.assign({}, this.state), { isDimmerActive: activeState }));
213
- this.activateEditModeCssVars(activeState);
214
- }
215
- activateEditModeCssVars(isActive) {
216
- if (isActive) {
217
- this._setCssVarValue('--eui-docpage-navigation-z-index', 'inherit'); // Reset doc-page-navigation-column z-index
218
- this._setCssVarValue('--eui-z-index-sidebar', 'inherit'); // Reset eui-app-sidebar z-index
219
- this._setCssVarValue('--eui-z-index-root', 'inherit'); // Reset eui-app-main-content z-index
220
- }
221
- else {
222
- this._setCssVarValue('--eui-docpage-navigation-z-index', '2'); // Restore doc-page-navigation-column z-index
223
- this._setCssVarValue('--eui-z-index-sidebar', '1044'); // Restore eui-app-sidebar z-index
224
- this._setCssVarValue('--eui-z-index-root', '1'); // Restore eui-app-main-content z-index
225
- }
226
- }
227
- // --------------
228
- // public methods
229
- // --------------
230
- fetchAppMetadata(metadataFilePath = 'assets/app-metadata.json') {
231
- this.getJson(metadataFilePath)
232
- .then((data) => {
233
- this.setState(Object.assign(Object.assign({}, this.state), { appMetadata: data }));
234
- });
235
- }
236
- activateSidebar() {
237
- this.setState(Object.assign(Object.assign({}, this.state), { hasSidebar: true }));
238
- if (!this.state.isSidebarHidden) {
239
- this.activateSidebarCssVars();
240
- }
241
- }
242
- activateSidebarHeader() {
243
- this.activateSidebarHeaderCssVars();
244
- }
245
- activateSidebarFooter() {
246
- this.activateSidebarFooterCssVars();
247
- }
248
- activateHeader() {
249
- this.setState(Object.assign(Object.assign({}, this.state), { hasHeader: true }));
250
- this.activateHeaderCssVars();
251
- }
252
- activateToolbar() {
253
- this.setState(Object.assign(Object.assign({}, this.state), { hasToolbar: true }));
254
- this.activateToolbarCssVars();
255
- }
256
- fetchCssVars() {
257
- const cssVarNames = [
258
- '--eui-app-header-height-default',
259
- '--eui-app-header-height-active',
260
- '--eui-app-header-height-shrink',
261
- '--eui-app-toolbar-height-default',
262
- '--eui-app-toolbar-height-active',
263
- '--eui-app-sidebar-width-default',
264
- '--eui-app-sidebar-width-active',
265
- '--eui-app-sidebar-width-close-default',
266
- '--eui-app-sidebar-width-close-active',
267
- '--eui-app-sidebar-header-height-default',
268
- '--eui-app-sidebar-header-height-active',
269
- '--eui-app-sidebar-footer-height-default',
270
- '--eui-app-sidebar-footer-height-active',
271
- ];
272
- this.cssVars = cssVarNames.map((v) => {
273
- return { key: v, value: this.getCssVarValue(v) };
274
- });
275
- }
276
- initCssVars() {
277
- this.setCssVar('--eui-app-header-height-default', '--eui-app-header-height');
278
- this.setCssVar('--eui-app-toolbar-height-default', '--eui-app-toolbar-height');
279
- this.setCssVar('--eui-app-sidebar-width-default', '--eui-app-sidebar-width');
280
- this.setCssVar('--eui-app-sidebar-width-close-default', '--eui-app-sidebar-width-close');
281
- this.setCssVar('--eui-app-sidebar-header-height-default', '--eui-app-sidebar-header-height');
282
- this.setCssVar('--eui-app-sidebar-footer-height-default', '--eui-app-sidebar-footer-height');
283
- }
284
- activateHeaderCssVars() {
285
- this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
286
- }
287
- activateToolbarCssVars() {
288
- this.setCssVar('--eui-app-toolbar-height-active', '--eui-app-toolbar-height');
289
- }
290
- activateFooterCssVars() {
291
- this.setCssVar('--eui-app-footer-height-active', '--eui-app-footer-height');
292
- }
293
- setHeaderShrinkCssVar(active) {
294
- if (active) {
295
- this.setCssVar('--eui-app-header-height-shrink', '--eui-app-header-height');
296
- }
297
- else {
298
- this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
299
- }
300
- }
301
- activateSidebarCssVars() {
302
- this.setCssVar('--eui-app-sidebar-width-active', '--eui-app-sidebar-width');
303
- this.setCssVar('--eui-app-sidebar-width-close-active', '--eui-app-sidebar-width-close');
304
- }
305
- activateSidebarHeaderCssVars() {
306
- this.setCssVar('--eui-app-sidebar-header-height-active', '--eui-app-sidebar-header-height');
307
- }
308
- activateSidebarFooterCssVars() {
309
- this.setCssVar('--eui-app-sidebar-footer-height-active', '--eui-app-sidebar-footer-height');
310
- }
311
- /**
312
- * displays a growl UxMessage item, isSticky
313
- */
314
- growl(msg, isSticky, isMultiple, life, position, callback) {
315
- if (msg.severity !== 'info' && msg.severity !== 'warning' && msg.severity !== 'success' && msg.severity !== 'danger') {
316
- throw new Error('UxAppShellService.growl() ERROR : message severity must be either : success, warning, info, danger');
317
- }
318
- else {
319
- if (isMultiple === undefined || !isMultiple) {
320
- this.growlMessages = [];
321
- }
322
- this.growlMessages = this.growlMessages.concat(msg);
323
- msg.life = life;
324
- msg.sticky = isSticky;
325
- if (life === undefined || isNaN(life)) {
326
- if (msg.severity === 'danger') {
327
- isSticky = true;
328
- }
329
- else {
330
- this.growlLife = 3000;
331
- }
332
- }
333
- else {
334
- this.growlLife = life;
335
- }
336
- if (isSticky) {
337
- this.isGrowlSticky = isSticky;
338
- }
339
- else {
340
- this.isGrowlSticky = false;
341
- }
342
- if (position) {
343
- this.growlPosition = position;
344
- }
345
- if (callback) {
346
- this.growlCallback = callback;
347
- }
348
- else {
349
- this.growlCallback = () => {
350
- };
351
- }
352
- }
353
- }
354
- clearGrowl() {
355
- this.growlMessages = [];
356
- }
357
- growlSuccess(msg, position) {
358
- this.growl({ severity: 'success', summary: 'SUCCESS', detail: msg }, false, false, undefined, position);
359
- }
360
- growlError(msg, position) {
361
- this.growl({ severity: 'danger', summary: 'ERROR', detail: msg }, false, false, undefined, position);
362
- }
363
- // date helpers
364
- growlWarning(msg, position) {
365
- this.growl({ severity: 'warning', summary: 'WARNING', detail: msg }, false, false, undefined, position);
366
- }
367
- growlInfo(msg, position) {
368
- this.growl({ severity: 'info', summary: 'INFO', detail: msg }, false, false, undefined, position);
369
- }
370
- openModal(modalId) {
371
- document.body.classList.add('modal-open');
372
- if (!modalId) {
373
- modalId = 'single_modal';
374
- }
375
- this.activeModals.push({
376
- id: modalId,
377
- isOpen: true,
378
- });
379
- setTimeout(() => {
380
- const el = document.getElementById(modalId + '-close-button');
381
- if (el) {
382
- el.focus();
383
- }
384
- }, 100);
385
- }
386
- openMessageBox(messageBoxId) {
387
- if (!messageBoxId) {
388
- messageBoxId = 'messagebox_modal';
389
- }
390
- this.openModal(messageBoxId);
391
- }
392
- closeMessageBox(messageBoxId) {
393
- if (!messageBoxId) {
394
- messageBoxId = 'messagebox_modal';
395
- }
396
- this.closeModal(messageBoxId);
397
- }
398
- isModalOpen(modalId) {
399
- if (!modalId) {
400
- modalId = 'single_modal';
401
- }
402
- if (this.activeModals.length) {
403
- let modalIndex = this.findModalIndex(modalId);
404
- if (modalIndex !== -1) {
405
- return this.activeModals[modalIndex].isOpen;
406
- }
407
- }
408
- return false;
409
- }
410
- // Positions helpers
411
- closeModal(modalId) {
412
- if (!modalId) {
413
- modalId = 'single_modal';
414
- }
415
- /**
416
- * Make sure we find the modal before splicing the activeModals array
417
- */
418
- const index = this.findModalIndex(modalId);
419
- if (index >= 0) {
420
- this.activeModals.splice(index, 1);
421
- }
422
- if (this.activeModals && this.activeModals.length <= 0) {
423
- document.body.classList.remove('modal-open');
424
- }
425
- else {
426
- // If there is still another (parent) modal dialog open, ensure it is focused upon to be able to close is with the ESC key:
427
- const lastModalId = this.activeModals[this.activeModals.length - 1].id;
428
- if (lastModalId) {
429
- setTimeout(() => {
430
- const el = document.getElementById(lastModalId + '-close-button');
431
- if (el) {
432
- el.focus();
433
- }
434
- }, 100);
435
- }
436
- }
437
- }
438
- findModalIndex(modalId) {
439
- let index = -1;
440
- if (this.activeModals.length) {
441
- for (let i = 0; i < this.activeModals.length; i++) {
442
- if (this.activeModals[i].id === modalId) {
443
- index = i;
444
- break;
445
- }
446
- }
447
- }
448
- return index;
449
- }
450
- // ---------------
451
- // private getters
452
- // ---------------
453
- getCssVarValue(inputProperty) {
454
- return getComputedStyle(document.documentElement).getPropertyValue(inputProperty);
455
- }
456
- setCssVar(inputProperty, outputProperty) {
457
- const cssVarValue = this.cssVars.filter(v => v.key === inputProperty)[0].value;
458
- this._setCssVarValue(outputProperty, cssVarValue);
459
- // console.log(inputProperty, outputProperty, cssVarValue);
460
- }
461
- _setCssVarValue(varName, varValue) {
462
- document.documentElement.style.setProperty(varName, varValue);
463
- }
464
- getWrapperClasses(state, breakpoint) {
465
- let classes = [];
466
- classes.push(breakpoint);
467
- if (state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
468
- classes.push('sidebar-state-open');
469
- }
470
- if (!state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
471
- classes.push('sidebar-state-close');
472
- }
473
- if (state.isSidebarActive) {
474
- classes.push('sidebar-active');
475
- }
476
- if (state.isSidebarInnerActive) {
477
- classes.push('sidebar-inner-active');
478
- }
479
- if (state.isSidebarStateCloseWithIcons) {
480
- classes.push('sidebar-state-close-with-icons');
481
- }
482
- // NEW APP-SHELL props
483
- if (state.isSidebarHidden) {
484
- classes.push('sidebar--hidden');
485
- }
486
- if (state.isSidebarOpen) {
487
- classes.push('sidebar--open');
488
- }
489
- else {
490
- classes.push('sidebar--close');
491
- }
492
- if (state.isSidebarHover) {
493
- classes.push('sidebar--hover');
494
- }
495
- if (state.deviceInfo && state.deviceInfo.isFF) {
496
- classes.push('ff');
497
- }
498
- if (state.deviceInfo && state.deviceInfo.isIE) {
499
- classes.push('ie');
500
- }
501
- if (state.deviceInfo && state.deviceInfo.isIE11) {
502
- classes.push('ie11');
503
- }
504
- if (state.deviceInfo && state.deviceInfo.isChrome) {
505
- classes.push('chrome');
506
- }
507
- return classes.join(' ');
508
- }
509
- getBreakpoint(windowWidth) {
510
- let bkp = '';
511
- switch (true) {
512
- case (windowWidth >= 0 && windowWidth < 576):
513
- bkp = 'xs';
514
- break;
515
- case (windowWidth >= 576 && windowWidth < 768):
516
- bkp = 'sm';
517
- break;
518
- case (windowWidth >= 768 && windowWidth < 992):
519
- bkp = 'md';
520
- break;
521
- case (windowWidth >= 992 && windowWidth < 1200):
522
- bkp = 'lg';
523
- break;
524
- case (windowWidth >= 1200 && windowWidth < 1400):
525
- bkp = 'xl';
526
- break;
527
- case (windowWidth >= 1400):
528
- bkp = 'xxl';
529
- break;
530
- }
531
- return bkp;
532
- }
533
- getBreakpoints(bkp) {
534
- return {
535
- isMobile: (bkp === 'xs' || bkp === 'sm'),
536
- isTablet: bkp === 'md',
537
- isLtDesktop: (bkp === 'xs' || bkp === 'sm' || bkp === 'md'),
538
- isDesktop: bkp === 'lg',
539
- isXL: bkp === 'xl',
540
- isXXL: bkp === 'xxl',
541
- };
542
- }
543
- getJson(url) {
544
- return this.http
545
- .get(url)
546
- .toPromise()
547
- .then(this.extractData)
548
- .catch(this.handleError);
549
- }
550
- extractData(res) {
551
- const body = res;
552
- return body || {};
553
- }
554
- handleError(error) {
555
- console.error('An error occurred', error);
556
- return Promise.reject(error.message || error);
557
- }
558
- bindActiveLanguageToAppShellState() {
559
- this.storeService.select(getActiveLang).subscribe((activeLang) => {
560
- if (activeLang !== this.state.activeLanguage) {
561
- this.setState(Object.assign(Object.assign({}, this.state), { activeLanguage: activeLang }), false);
562
- }
563
- });
564
- }
565
- }
566
- /** @nocollapse */ UxAppShellService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: UxAppShellService, deps: [{ token: GLOBAL_CONFIG_TOKEN, optional: true }, { token: i1.HttpClient }, { token: PLATFORM_ID }, { token: i2.Router }, { token: i3.StoreService }, { token: i4.I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
567
- /** @nocollapse */ UxAppShellService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: UxAppShellService, providedIn: 'root' });
568
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: UxAppShellService, decorators: [{
569
- type: Injectable,
570
- args: [{
571
- providedIn: 'root',
572
- }]
573
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
574
- type: Optional
575
- }, {
576
- type: Inject,
577
- args: [GLOBAL_CONFIG_TOKEN]
578
- }] }, { type: i1.HttpClient }, { type: Object, decorators: [{
579
- type: Inject,
580
- args: [PLATFORM_ID]
581
- }] }, { type: i2.Router }, { type: i3.StoreService }, { type: i4.I18nService, decorators: [{
582
- type: Optional
583
- }] }]; } });
584
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXgtYXBwLXNoZWxsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3V4LWFwcC1zaGVsbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQWlDLGFBQWEsRUFBeUIsTUFBTSxXQUFXLENBQUM7QUFDL0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQzs7Ozs7O0FBMkQ3QixNQUFNLFlBQVksR0FBWTtJQUMxQixPQUFPLEVBQUUsRUFBRTtJQUNYLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixZQUFZLEVBQUUsSUFBSTtJQUNsQixxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLGFBQWEsRUFBRSxLQUFLO0lB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S0FBVTtRQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxpQ0FBaUM7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDN0QsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLGlDQUNOLElBQUksQ0FBQyxLQUFLLEtBQ2IsY0FBYyxFQUFFLFVBQVUsS0FDM0IsS0FBSyxDQUFDLENBQUM7YUFDYjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7d0lBL25CUSxpQkFBaUIsa0JBa0hGLG1CQUFtQix1REFFL0IsV0FBVzs0SUFwSGQsaUJBQWlCLGNBRmQsTUFBTTtrR0FFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFtSFEsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7dURBRUUsTUFBTTswQkFBOUMsTUFBTTsyQkFBQyxXQUFXOzswQkFHbEIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWZlciwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVXhFdUxhbmd1YWdlcywgR2xvYmFsQ29uZmlnLCBVeExpbmssIFV4TW9kYWwsIGdldEFjdGl2ZUxhbmcsIFV4TWVzc2FnZSwgVXhMYW5ndWFnZSB9IGZyb20gJ0BldWkvYmFzZSc7XG5pbXBvcnQgeyBHTE9CQUxfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi9jb25maWcvdG9rZW5zJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JlL3N0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBVSVN0YXRlIHtcbiAgICAvLyBhcHAgc3RhdGVcbiAgICBhcHBOYW1lPzogc3RyaW5nO1xuICAgIGFwcFNob3J0TmFtZT86IHN0cmluZztcbiAgICBhcHBTdWJUaXRsZT86IHN0cmluZztcblxuICAgIC8vIHVzZXIgc3RhdGVcbiAgICB1c2VySW5mb3M/OiBzdHJpbmc7XG4gICAgdXNlclN1YkluZm9zPzogc3RyaW5nO1xuICAgIGltcGVyc29uYXRlZFVzZXJJbmZvcz86IHN0cmluZztcblxuICAgIC8vIFNpZGViYXIgc3RhdGVcbiAgICBpc1NpZGViYXJPcGVuPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJIb3Zlcj86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFyQWN0aXZlPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJJbm5lckFjdGl2ZT86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFyU3RhdGVDbG9zZVdpdGhJY29ucz86IGJvb2xlYW47XG4gICAgaGFzU2lkZWJhcj86IGJvb2xlYW47XG4gICAgaGFzSGVhZGVyPzogYm9vbGVhbjtcbiAgICBoYXNIZWFkZXJMb2dvPzogYm9vbGVhbjtcbiAgICBoYXNIZWFkZXJFbnZpcm9ubWVudD86IGJvb2xlYW47XG4gICAgZW52aXJvbm1lbnRWYWx1ZT86IHN0cmluZztcbiAgICBpc1NpZGViYXJIaWRkZW4/OiBib29sZWFuO1xuICAgIGhhc1Rvb2xiYXI/OiBib29sZWFuO1xuXG4gICAgLy8gd2luZG93IHN0YXRlXG4gICAgd2luZG93V2lkdGg/OiBudW1iZXI7XG4gICAgd2luZG93SGVpZ2h0PzogbnVtYmVyO1xuICAgIG1haW5Db250ZW50SGVpZ2h0PzogbnVtYmVyO1xuICAgIHBhZ2VIZWFkZXJIZWlnaHQ/OiBudW1iZXI7XG4gICAgYnJlYWtwb2ludD86IHN0cmluZztcbiAgICB3cmFwcGVyQ2xhc3Nlcz86IHN0cmluZztcbiAgICBicmVha3BvaW50cz86IGFueTtcblxuICAgIC8vIG5hdmlnYXRpb24gc3RhdGVcbiAgICBtZW51TGlua3M/OiBVeExpbmtbXTtcbiAgICBzaWRlYmFyTGlua3M/OiBVeExpbmtbXTtcbiAgICBjb21iaW5lZExpbmtzPzogVXhMaW5rW107XG5cbiAgICAvLyBvdGhlciBzdGF0ZXNcbiAgICBpc0Jsb2NrRG9jdW1lbnRBY3RpdmU/OiBib29sZWFuO1xuXG4gICAgLy8gZGV2aWNlIGluZm9cbiAgICBkZXZpY2VJbmZvOiBhbnk7XG5cbiAgICAvLyBsYW5ndWFnZSBpbmZvc1xuICAgIGFjdGl2ZUxhbmd1YWdlOiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VzOiAoc3RyaW5nIHwgVXhMYW5ndWFnZSlbXTtcblxuICAgIC8vIGFwcCBtZXRhZGF0YVxuICAgIGFwcE1ldGFkYXRhOiBhbnk7XG5cbiAgICAvLyB2YXJpb3VzIGR5bmFtaWMgc3RhdGVcbiAgICBoYXNNb2RhbEFjdGl2ZT86IGJvb2xlYW47XG4gICAgaXNEaW1tZXJBY3RpdmUgPzogYm9vbGVhbjsgICAgIC8vIFVzYWdlOiBtYXAgdG8gZXVpIGJhc2UgZGlyZWN0aXZlIGlucHV0IGNvZXJjZSBldWlIaWdobGlnaHRlZFxufVxuXG5jb25zdCBpbml0aWFsU3RhdGU6IFVJU3RhdGUgPSB7XG4gICAgYXBwTmFtZTogJycsXG4gICAgYXBwU2hvcnROYW1lOiAnJyxcbiAgICBhcHBTdWJUaXRsZTogJycsXG4gICAgdXNlckluZm9zOiBudWxsLFxuICAgIHVzZXJTdWJJbmZvczogbnVsbCxcbiAgICBpbXBlcnNvbmF0ZWRVc2VySW5mb3M6IG51bGwsXG4gICAgaXNTaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgaXNTaWRlYmFySG92ZXI6IGZhbHNlLFxuICAgIGlzU2lkZWJhckFjdGl2ZTogZmFsc2UsXG4gICAgaXNTaWRlYmFySW5uZXJBY3RpdmU6IGZhbHNlLFxuICAgIGlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnM6IGZhbHNlLFxuICAgIGhhc1NpZGViYXI6IGZhbHNlLFxuICAgIGhhc0hlYWRlcjogZmFsc2UsXG4gICAgaGFzSGVhZGVyTG9nbzogZmFsc2UsXG4gICAgaGFzSGVhZGVyRW52aXJvbm1lbnQ6IGZhbHNlLFxuICAgIGVudmlyb25tZW50VmFsdWU6ICcnLFxuICAgIGlzU2lkZWJhckhpZGRlbjogZmFsc2UsXG4gICAgaGFzVG9vbGJhcjogZmFsc2UsXG4gICAgd2luZG93V2lkdGg6IDAsXG4gICAgd2luZG93SGVpZ2h0OiAwLFxuICAgIG1haW5Db250ZW50SGVpZ2h0OiAwLFxuICAgIHBhZ2VIZWFkZXJIZWlnaHQ6IDAsXG4gICAgd3JhcHBlckNsYXNzZXM6ICcnLFxuICAgIGJyZWFrcG9pbnQ6ICcnLFxuICAgIGJyZWFrcG9pbnRzOiB7XG4gICAgICAgIGlzTW9iaWxlOiBmYWxzZSxcbiAgICAgICAgaXNUYWJsZXQ6IGZhbHNlLFxuICAgICAgICBpc0x0RGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzRGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzWEw6IGZhbHNlLFxuICAgICAgICBpc1hYTDogZmFsc2UsXG4gICAgfSxcbiAgICBtZW51TGlua3M6IFtdLFxuICAgIHNpZGViYXJMaW5rczogW10sXG4gICAgY29tYmluZWRMaW5rczogW10sXG4gICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBmYWxzZSxcbiAgICBkZXZpY2VJbmZvOiBudWxsLFxuICAgIGFjdGl2ZUxhbmd1YWdlOiAnZW4nLFxuICAgIGxhbmd1YWdlczogVXhFdUxhbmd1YWdlcy5nZXRMYW5ndWFnZXMoKSxcbiAgICBhcHBNZXRhZGF0YTogbnVsbCxcbiAgICBoYXNNb2RhbEFjdGl2ZTogZmFsc2UsXG4gICAgaXNEaW1tZXJBY3RpdmUgOiBmYWxzZSxcbn07XG5cbi8vIFRPRE86IHRoaXMgc2VydmljZSBuZWVkcyB0byBiZSB0cmFuc2ZlcnJlZCBpbiB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnRcbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFV4QXBwU2hlbGxTZXJ2aWNlIHtcbiAgICBncm93bE1lc3NhZ2VzID0gW107XG4gICAgaXNHcm93bFN0aWNreTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGdyb3dsTGlmZTogbnVtYmVyID0gMzAwMDtcbiAgICBncm93bFBvc2l0aW9uOiBzdHJpbmcgPSAnYm90dG9tLXJpZ2h0JztcbiAgICBncm93bENhbGxiYWNrOiBhbnkgPSBudWxsO1xuICAgIGFjdGl2ZU1vZGFsczogVXhNb2RhbFtdID0gW107XG4gICAgb3Blbk1vZGFsSWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gICAgbmF2aWdhdGlvblN0YXJ0Q3VzdG9tSGFuZGxlcjogKCkgPT4gdm9pZDtcbiAgICBuYXZpZ2F0aW9uRW5kQ3VzdG9tSGFuZGxlcjogKCkgPT4gdm9pZDtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBnZXQgc3RhdGUkKCk6IE9ic2VydmFibGU8VUlTdGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBleHBvc2VkIG9ic2VydmFibGVzXG5cbiAgICBnZXQgYnJlYWtwb2ludCQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JyZWFrcG9pbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGdldCBicmVha3BvaW50cyQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JyZWFrcG9pbnRzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gc3RhdGUgb3BlcmF0aW9uc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS1cbiAgICBnZXQgc3RhdGUoKTogVUlTdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBnZXQgaXNTaWRlYmFyT3BlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNTaWRlYmFyT3BlbjtcbiAgICB9XG5cbiAgICAvLyBFZGl0IG1vZGVcbiAgICBnZXQgaXNEaW1tZXJBY3RpdmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pc0RpbW1lckFjdGl2ZSA7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHB1YmxpYyBzZXR0ZXJzIGFuZCBmdW5jdGlvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgc2V0IGlzU2lkZWJhck9wZW4oaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhck9wZW46IGlzT3BlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckhvdmVyKGlzSG92ZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNTaWRlYmFySG92ZXI6IGlzSG92ZXIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpc1NpZGViYXJIb3ZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNTaWRlYmFySG92ZXI7XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc1NpZGViYXJBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgaXNTaWRlYmFySW5uZXJBY3RpdmUoaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhcklubmVyQWN0aXZlOiBpc09wZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBzaWRlYmFyTGlua3MobGlua3M6IFV4TGlua1tdKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNpZGViYXJMaW5rczogbGlua3MsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBtZW51TGlua3MobGlua3M6IFV4TGlua1tdKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIG1lbnVMaW5rczogbGlua3MsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBpc0Jsb2NrRG9jdW1lbnRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRWRpdCBtb2RlXG4gICAgc2V0IGlzRGltbWVyQWN0aXZlIChpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc0RpbW1lckFjdGl2ZSA6IGlzQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNzc1ZhcnMgPSBbXTtcbiAgICBwcml2YXRlIF9zdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxVSVN0YXRlPjtcbiAgICBwcml2YXRlIF9icmVha3BvaW50JDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG4gICAgcHJpdmF0ZSBfYnJlYWtwb2ludHMkOiBCZWhhdmlvclN1YmplY3Q8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEdMT0JBTF9DT05GSUdfVE9LRU4pIHByb3RlY3RlZCBjb25maWc6IEdsb2JhbENvbmZpZyxcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBzdG9yZVNlcnZpY2U6IFN0b3JlU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIGxldCBzdGF0ZVdpdGhDb25maWcgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlcyA9IGNvbmZpZz8uaTE4bj8uaTE4blNlcnZpY2U/Lmxhbmd1YWdlcyB8fCBpbml0aWFsU3RhdGUubGFuZ3VhZ2VzO1xuICAgICAgICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2UgPSBjb25maWc/LmkxOG4/LmkxOG5TZXJ2aWNlPy5kZWZhdWx0TGFuZ3VhZ2UgfHwgaW5pdGlhbFN0YXRlLmFjdGl2ZUxhbmd1YWdlO1xuICAgICAgICBzdGF0ZVdpdGhDb25maWcgPSB7XG4gICAgICAgICAgICAuLi5zdGF0ZVdpdGhDb25maWcsIC4uLntcbiAgICAgICAgICAgICAgICBsYW5ndWFnZXM6IGxhbmd1YWdlcyxcbiAgICAgICAgICAgICAgICBhY3RpdmVMYW5ndWFnZTogZGVmYXVsdExhbmd1YWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChzdGF0ZVdpdGhDb25maWcpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgICAgICAgdGhpcy5iaW5kQWN0aXZlTGFuZ3VhZ2VUb0FwcFNoZWxsU3RhdGUoKTtcblxuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgcm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3RhdGUobmV4dFN0YXRlOiBVSVN0YXRlLCB1cGRhdGVJMTggPSB0cnVlKSB7XG4gICAgICAgIGxldCBicmVha3BvaW50LCBicmVha3BvaW50cywgd3JhcHBlckNsYXNzZXM7XG4gICAgICAgIGxldCBjb21iaW5lZExpbmtzO1xuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICAvLyBjaGVjayBpZiB3aW5kb3cgd2lkdGggaGFzIGJlZW4gdXBkYXRlZCBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLndpbmRvd1dpZHRoICE9PSBuZXh0U3RhdGUud2luZG93V2lkdGgpIHtcbiAgICAgICAgICAgIGJyZWFrcG9pbnQgPSB0aGlzLmdldEJyZWFrcG9pbnQobmV4dFN0YXRlLndpbmRvd1dpZHRoKTtcbiAgICAgICAgICAgIGJyZWFrcG9pbnRzID0gdGhpcy5nZXRCcmVha3BvaW50cyhicmVha3BvaW50KTtcblxuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludCQubmV4dChicmVha3BvaW50KTtcbiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzJC5uZXh0KGJyZWFrcG9pbnRzKTtcblxuICAgICAgICAgICAgLy8gaWYgbm90IHByb3BhZ2F0ZSB0aGUgb2xkIG9uZXMgd2l0aG91dCBkb2luZyBhbnkgY2FsY3VsYXRpb25zXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVha3BvaW50ID0gc3RhdGUuYnJlYWtwb2ludDtcbiAgICAgICAgICAgIGJyZWFrcG9pbnRzID0gc3RhdGUuYnJlYWtwb2ludHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaW5hbGx5IGdldCB0aGUgd3JhcHBlciBjbGFzc2VzIHdoZW4gYm90aCB0aGUgc3RhdGUgYW5kIGJyZWFrcG9pbnQgYXJlIGtub3duXG4gICAgICAgIHdyYXBwZXJDbGFzc2VzID0gdGhpcy5nZXRXcmFwcGVyQ2xhc3NlcyhuZXh0U3RhdGUsIGJyZWFrcG9pbnQpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBtZW51TGlua3Mgb3Igc2lkZWJhckxpbmtzIGhhdmUgY2hhbmdlZCBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLm1lbnVMaW5rcyAhPT0gbmV4dFN0YXRlLm1lbnVMaW5rcyB8fCB0aGlzLnN0YXRlLnNpZGViYXJMaW5rcyAhPT0gbmV4dFN0YXRlLnNpZGViYXJMaW5rcykge1xuICAgICAgICAgICAgY29tYmluZWRMaW5rcyA9IFsuLi5uZXh0U3RhdGUubWVudUxpbmtzLCAuLi5uZXh0U3RhdGUuc2lkZWJhckxpbmtzXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MgPSB0aGlzLnN0YXRlLmNvbWJpbmVkTGlua3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZUJlZm9yZVVwZGF0ZSA9IHsgLi4udGhpcy5zdGF0ZSB9IDtcblxuICAgICAgICAvLyB3ZSBwdXQgaXQgYWxsIHRvZ2V0aGVyIHdpdGggdGhlIGNhbGN1bGF0ZWQgcHJvcGVydGllc1xuICAgICAgICB0aGlzLl9zdGF0ZSQubmV4dCh7XG4gICAgICAgICAgICAuLi5uZXh0U3RhdGUsXG4gICAgICAgICAgICB3cmFwcGVyQ2xhc3NlcyxcbiAgICAgICAgICAgIGJyZWFrcG9pbnQsXG4gICAgICAgICAgICBicmVha3BvaW50cyxcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgU3RvcmUgTGFuZ3VhZ2VcbiAgICAgICAgaWYgKHVwZGF0ZUkxOCAmJiBuZXh0U3RhdGUuYWN0aXZlTGFuZ3VhZ2UgIT09IHN0YXRlQmVmb3JlVXBkYXRlLmFjdGl2ZUxhbmd1YWdlKSB7XG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnVwZGF0ZVN0YXRlKHsgYWN0aXZlTGFuZzogbmV4dFN0YXRlLmFjdGl2ZUxhbmd1YWdlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBzbGljZSBmcm9tIHRoZSBzdGF0ZSB3aGV0aGVyIHRoYXQgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBrZXkgY2FuIGJlICdrZXknIG9yICdrZXkuc3ViLnN1YidcbiAgICAgKi9cbiAgICBnZXRTdGF0ZShrZXk/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYga2V5IGV4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIGtleSA/IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChzdGF0ZSkgPT4gZ2V0KHN0YXRlLCBrZXkpKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZSksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHgsIHkpID0+IGlzRXF1YWwoeCwgeSkpXG4gICAgICAgICAgICApIDogdGhpcy5zdGF0ZSQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaWRlYmFyVG9nZ2xlKCkge1xuICAgICAgICB0aGlzLmlzU2lkZWJhck9wZW4gPSAhdGhpcy5zdGF0ZS5pc1NpZGViYXJPcGVuO1xuICAgIH1cblxuICAgIC8vIEVkaXQgbW9kZVxuICAgIHB1YmxpYyBkaW1tZXJBY3RpdmVUb2dnbGUoKSB7XG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5pc0RpbW1lckFjdGl2ZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNEaW1tZXJBY3RpdmUgOiAhaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKCFpc0FjdGl2ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpbW1lckFjdGl2ZVN0YXRlKGFjdGl2ZVN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlIDogYWN0aXZlU3RhdGUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKGFjdGl2ZVN0YXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVFZGl0TW9kZUNzc1ZhcnMoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktZG9jcGFnZS1uYXZpZ2F0aW9uLXotaW5kZXgnLCAnaW5oZXJpdCcpOyAgICAvLyBSZXNldCBkb2MtcGFnZS1uYXZpZ2F0aW9uLWNvbHVtbiB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1zaWRlYmFyJywgJ2luaGVyaXQnKTsgICAgICAgICAgICAgICAvLyBSZXNldCBldWktYXBwLXNpZGViYXIgei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtcm9vdCcsICdpbmhlcml0Jyk7ICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgZXVpLWFwcC1tYWluLWNvbnRlbnQgei1pbmRleFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWRvY3BhZ2UtbmF2aWdhdGlvbi16LWluZGV4JywgJzInKTsgICAgICAgICAgLy8gUmVzdG9yZSBkb2MtcGFnZS1uYXZpZ2F0aW9uLWNvbHVtbiB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1zaWRlYmFyJywgJzEwNDQnKTsgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGV1aS1hcHAtc2lkZWJhciB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1yb290JywgJzEnKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGV1aS1hcHAtbWFpbi1jb250ZW50IHotaW5kZXhcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHVibGljIG1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyBmZXRjaEFwcE1ldGFkYXRhKG1ldGFkYXRhRmlsZVBhdGggPSAnYXNzZXRzL2FwcC1tZXRhZGF0YS5qc29uJykge1xuICAgICAgICB0aGlzLmdldEpzb24obWV0YWRhdGFGaWxlUGF0aClcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFwcE1ldGFkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzU2lkZWJhcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzU2lkZWJhckhpZGRlbikge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVNpZGViYXJDc3NWYXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckhlYWRlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyRm9vdGVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckZvb3RlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVIZWFkZXIoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVIZWFkZXJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9vbGJhcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmZXRjaENzc1ZhcnMoKSB7XG4gICAgICAgIGNvbnN0IGNzc1Zhck5hbWVzID0gW1xuICAgICAgICAgICAgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtc2hyaW5rJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY3NzVmFycyA9IGNzc1Zhck5hbWVzLm1hcCgodikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsga2V5OiB2LCB2YWx1ZTogdGhpcy5nZXRDc3NWYXJWYWx1ZSh2KSB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdENzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlLWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUhlYWRlckNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlRm9vdGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1mb290ZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRIZWFkZXJTaHJpbmtDc3NWYXIoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1zaHJpbmsnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJDc3NWYXJzKCkge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoJyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1hY3RpdmUnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFySGVhZGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyRm9vdGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkaXNwbGF5cyBhIGdyb3dsIFV4TWVzc2FnZSBpdGVtLCBpc1N0aWNreVxuICAgICAqL1xuICAgIGdyb3dsKG1zZzogVXhNZXNzYWdlLCBpc1N0aWNreT86IGJvb2xlYW4sIGlzTXVsdGlwbGU/OiBib29sZWFuLCBsaWZlPzogbnVtYmVyLCBwb3NpdGlvbj86IHN0cmluZywgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGlmIChtc2cuc2V2ZXJpdHkgIT09ICdpbmZvJyAmJiBtc2cuc2V2ZXJpdHkgIT09ICd3YXJuaW5nJyAmJiBtc2cuc2V2ZXJpdHkgIT09ICdzdWNjZXNzJyAmJiBtc2cuc2V2ZXJpdHkgIT09ICdkYW5nZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1V4QXBwU2hlbGxTZXJ2aWNlLmdyb3dsKCkgRVJST1IgOiBtZXNzYWdlIHNldmVyaXR5IG11c3QgYmUgZWl0aGVyIDogc3VjY2Vzcywgd2FybmluZywgaW5mbywgZGFuZ2VyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNNdWx0aXBsZSA9PT0gdW5kZWZpbmVkIHx8ICFpc011bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm93bE1lc3NhZ2VzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyb3dsTWVzc2FnZXMgPSB0aGlzLmdyb3dsTWVzc2FnZXMuY29uY2F0KG1zZyk7XG4gICAgICAgICAgICBtc2cubGlmZSA9IGxpZmU7XG4gICAgICAgICAgICBtc2cuc3RpY2t5ID0gaXNTdGlja3k7XG5cbiAgICAgICAgICAgIGlmIChsaWZlID09PSB1bmRlZmluZWQgfHwgaXNOYU4obGlmZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobXNnLnNldmVyaXR5ID09PSAnZGFuZ2VyJykge1xuICAgICAgICAgICAgICAgICAgICBpc1N0aWNreSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm93bExpZmUgPSAzMDAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm93bExpZmUgPSBsaWZlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTdGlja3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzR3Jvd2xTdGlja3kgPSBpc1N0aWNreTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0dyb3dsU3RpY2t5ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3Jvd2xQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3dsQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm93bENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckdyb3dsKCkge1xuICAgICAgICB0aGlzLmdyb3dsTWVzc2FnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBncm93bFN1Y2Nlc3MobXNnOiBzdHJpbmcsIHBvc2l0aW9uPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZ3Jvd2woeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU1VDQ0VTUycsIGRldGFpbDogbXNnIH0sIGZhbHNlLCBmYWxzZSwgdW5kZWZpbmVkLCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZ3Jvd2xFcnJvcihtc2c6IHN0cmluZywgcG9zaXRpb24/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5ncm93bCh7IHNldmVyaXR5OiAnZGFuZ2VyJywgc3VtbWFyeTogJ0VSUk9SJywgZGV0YWlsOiBtc2cgfSwgZmFsc2UsIGZhbHNlLCB1bmRlZmluZWQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBkYXRlIGhlbHBlcnNcblxuICAgIGdyb3dsV2FybmluZyhtc2c6IHN0cmluZywgcG9zaXRpb24/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5ncm93bCh7IHNldmVyaXR5OiAnd2FybmluZycsIHN1bW1hcnk6ICdXQVJOSU5HJywgZGV0YWlsOiBtc2cgfSwgZmFsc2UsIGZhbHNlLCB1bmRlZmluZWQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBncm93bEluZm8obXNnOiBzdHJpbmcsIHBvc2l0aW9uPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZ3Jvd2woeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSU5GTycsIGRldGFpbDogbXNnIH0sIGZhbHNlLCBmYWxzZSwgdW5kZWZpbmVkLCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKG1vZGFsSWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG4gICAgICAgIGlmICghbW9kYWxJZCkge1xuICAgICAgICAgICAgbW9kYWxJZCA9ICdzaW5nbGVfbW9kYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbHMucHVzaCh7XG4gICAgICAgICAgICBpZDogbW9kYWxJZCxcbiAgICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQgKyAnLWNsb3NlLWJ1dHRvbicpO1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBvcGVuTWVzc2FnZUJveChtZXNzYWdlQm94SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlQm94SWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VCb3hJZCA9ICdtZXNzYWdlYm94X21vZGFsJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5Nb2RhbChtZXNzYWdlQm94SWQpO1xuICAgIH1cblxuICAgIGNsb3NlTWVzc2FnZUJveChtZXNzYWdlQm94SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlQm94SWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VCb3hJZCA9ICdtZXNzYWdlYm94X21vZGFsJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlTW9kYWwobWVzc2FnZUJveElkKTtcbiAgICB9XG5cbiAgICBpc01vZGFsT3Blbihtb2RhbElkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbW9kYWxJZCkge1xuICAgICAgICAgICAgbW9kYWxJZCA9ICdzaW5nbGVfbW9kYWwnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBtb2RhbEluZGV4OiBudW1iZXIgPSB0aGlzLmZpbmRNb2RhbEluZGV4KG1vZGFsSWQpO1xuICAgICAgICAgICAgaWYgKG1vZGFsSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlTW9kYWxzW21vZGFsSW5kZXhdLmlzT3BlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb25zIGhlbHBlcnNcblxuICAgIGNsb3NlTW9kYWwobW9kYWxJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoIW1vZGFsSWQpIHtcbiAgICAgICAgICAgIG1vZGFsSWQgPSAnc2luZ2xlX21vZGFsJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYWtlIHN1cmUgd2UgZmluZCB0aGUgbW9kYWwgYmVmb3JlIHNwbGljaW5nIHRoZSBhY3RpdmVNb2RhbHMgYXJyYXlcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maW5kTW9kYWxJbmRleChtb2RhbElkKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWxzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVNb2RhbHMgJiYgdGhpcy5hY3RpdmVNb2RhbHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYW5vdGhlciAocGFyZW50KSBtb2RhbCBkaWFsb2cgb3BlbiwgZW5zdXJlIGl0IGlzIGZvY3VzZWQgdXBvbiB0byBiZSBhYmxlIHRvIGNsb3NlIGlzIHdpdGggdGhlIEVTQyBrZXk6XG4gICAgICAgICAgICBjb25zdCBsYXN0TW9kYWxJZCA9IHRoaXMuYWN0aXZlTW9kYWxzIFt0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGggLSAxXS5pZDtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kYWxJZCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhc3RNb2RhbElkICsgJy1jbG9zZS1idXR0b24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZpbmRNb2RhbEluZGV4KG1vZGFsSWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hY3RpdmVNb2RhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVNb2RhbHNbaV0uaWQgPT09IG1vZGFsSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHJpdmF0ZSBnZXR0ZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgcHJpdmF0ZSBnZXRDc3NWYXJWYWx1ZShpbnB1dFByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShpbnB1dFByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENzc1ZhcihpbnB1dFByb3BlcnR5LCBvdXRwdXRQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBjc3NWYXJWYWx1ZSA9IHRoaXMuY3NzVmFycy5maWx0ZXIodiA9PiB2LmtleSA9PT0gaW5wdXRQcm9wZXJ0eSlbMF0udmFsdWU7XG4gICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKG91dHB1dFByb3BlcnR5LCBjc3NWYXJWYWx1ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGlucHV0UHJvcGVydHksIG91dHB1dFByb3BlcnR5LCBjc3NWYXJWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Q3NzVmFyVmFsdWUodmFyTmFtZSwgdmFyVmFsdWUpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHZhck5hbWUsIHZhclZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyYXBwZXJDbGFzc2VzKHN0YXRlOiBVSVN0YXRlLCBicmVha3BvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjbGFzc2VzLnB1c2goYnJlYWtwb2ludCk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4gJiYgKHN0YXRlLmlzU2lkZWJhckFjdGl2ZSB8fCBzdGF0ZS5pc1NpZGViYXJJbm5lckFjdGl2ZSkpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci1zdGF0ZS1vcGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0ZS5pc1NpZGViYXJPcGVuICYmIChzdGF0ZS5pc1NpZGViYXJBY3RpdmUgfHwgc3RhdGUuaXNTaWRlYmFySW5uZXJBY3RpdmUpKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtY2xvc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFyQWN0aXZlKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhcklubmVyQWN0aXZlKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItaW5uZXItYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnMpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci1zdGF0ZS1jbG9zZS13aXRoLWljb25zJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBORVcgQVBQLVNIRUxMIHByb3BzXG4gICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIaWRkZW4pIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0taGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4pIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0tb3BlbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1jbG9zZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIb3Zlcikge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1ob3ZlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNGRikge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdmZicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNJRSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNJRTExKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2llMTEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzQ2hyb21lKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2Nocm9tZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJyZWFrcG9pbnQod2luZG93V2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBia3A6IHN0cmluZyA9ICcnO1xuXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICBjYXNlICh3aW5kb3dXaWR0aCA+PSAwICYmIHdpbmRvd1dpZHRoIDwgNTc2KTpcbiAgICAgICAgICAgIGJrcCA9ICd4cyc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gNTc2ICYmIHdpbmRvd1dpZHRoIDwgNzY4KTpcbiAgICAgICAgICAgIGJrcCA9ICdzbSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gNzY4ICYmIHdpbmRvd1dpZHRoIDwgOTkyKTpcbiAgICAgICAgICAgIGJrcCA9ICdtZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gOTkyICYmIHdpbmRvd1dpZHRoIDwgMTIwMCk6XG4gICAgICAgICAgICBia3AgPSAnbGcnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgKHdpbmRvd1dpZHRoID49IDEyMDAgJiYgd2luZG93V2lkdGggPCAxNDAwKTpcbiAgICAgICAgICAgIGJrcCA9ICd4bCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gMTQwMCk6XG4gICAgICAgICAgICBia3AgPSAneHhsJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBia3A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50cyhia3A6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc01vYmlsZTogKGJrcCA9PT0gJ3hzJyB8fCBia3AgPT09ICdzbScpLFxuICAgICAgICAgICAgaXNUYWJsZXQ6IGJrcCA9PT0gJ21kJyxcbiAgICAgICAgICAgIGlzTHREZXNrdG9wOiAoYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyB8fCBia3AgPT09ICdtZCcpLFxuICAgICAgICAgICAgaXNEZXNrdG9wOiBia3AgPT09ICdsZycsXG4gICAgICAgICAgICBpc1hMOiBia3AgPT09ICd4bCcsXG4gICAgICAgICAgICBpc1hYTDogYmtwID09PSAneHhsJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEpzb24odXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAuZ2V0KHVybClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4odGhpcy5leHRyYWN0RGF0YSlcbiAgICAgICAgICAgIC5jYXRjaCh0aGlzLmhhbmRsZUVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3REYXRhKHJlczogUmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IHJlcztcbiAgICAgICAgcmV0dXJuIGJvZHkgfHwge307XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQnLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRBY3RpdmVMYW5ndWFnZVRvQXBwU2hlbGxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdG9yZVNlcnZpY2Uuc2VsZWN0KGdldEFjdGl2ZUxhbmcpLnN1YnNjcmliZSgoYWN0aXZlTGFuZykgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUxhbmcgIT09IHRoaXMuc3RhdGUuYWN0aXZlTGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGFuZ3VhZ2U6IGFjdGl2ZUxhbmcsXG4gICAgICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=