client-core-services 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +24 -0
  2. package/esm2020/client-core-services.mjs +5 -0
  3. package/esm2020/lib/my-lib.module.mjs +98 -0
  4. package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
  5. package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
  6. package/esm2020/lib/services/api/api.service.mjs +611 -0
  7. package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
  8. package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
  9. package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
  10. package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
  11. package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
  12. package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
  13. package/esm2020/lib/services/chart/chart.service.mjs +166 -0
  14. package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
  15. package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
  16. package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
  17. package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
  18. package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
  19. package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
  20. package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
  21. package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
  22. package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
  23. package/esm2020/lib/services/download/download.service.mjs +151 -0
  24. package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
  25. package/esm2020/lib/services/env/env.service.mjs +232 -0
  26. package/esm2020/lib/services/env/serverHostList.mjs +56 -0
  27. package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
  28. package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
  29. package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
  30. package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
  31. package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
  32. package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
  33. package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
  34. package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
  35. package/esm2020/lib/services/loader/loader.service.mjs +17 -0
  36. package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
  37. package/esm2020/lib/services/model/model.service.mjs +30 -0
  38. package/esm2020/lib/services/notify/notification.service.mjs +84 -0
  39. package/esm2020/lib/services/operator/operator.service.mjs +58 -0
  40. package/esm2020/lib/services/permission/permission.service.mjs +88 -0
  41. package/esm2020/lib/services/router/router.service.mjs +78 -0
  42. package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
  43. package/esm2020/lib/services/storage/storage.service.mjs +749 -0
  44. package/esm2020/lib/services/tree-component/interface.mjs +6 -0
  45. package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
  46. package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
  47. package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
  48. package/esm2020/lib/shared/configuration/config.mjs +76 -0
  49. package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
  50. package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
  51. package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
  52. package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
  53. package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
  54. package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
  55. package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
  56. package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
  57. package/esm2020/lib/shared/platform.mjs +2 -0
  58. package/esm2020/public-api.mjs +53 -0
  59. package/fesm2015/client-core-services.mjs +15487 -0
  60. package/fesm2015/client-core-services.mjs.map +1 -0
  61. package/fesm2020/client-core-services.mjs +15482 -0
  62. package/fesm2020/client-core-services.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/my-lib.module.d.ts +18 -0
  65. package/lib/services/api/api-call/api-call.service.d.ts +60 -0
  66. package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
  67. package/lib/services/api/api.service.d.ts +88 -0
  68. package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
  69. package/lib/services/api/auth/auth.service.d.ts +50 -0
  70. package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
  71. package/lib/services/api/common-api/common-api.service.d.ts +22 -0
  72. package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
  73. package/lib/services/api/public-api/public-api.service.d.ts +14 -0
  74. package/lib/services/chart/chart.service.d.ts +21 -0
  75. package/lib/services/check-if/check-if.service.d.ts +50 -0
  76. package/lib/services/common-utils/common-function.service.d.ts +84 -0
  77. package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
  78. package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
  79. package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
  80. package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
  81. package/lib/services/data-share/data-share.service.d.ts +174 -0
  82. package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
  83. package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
  84. package/lib/services/download/download.service.d.ts +35 -0
  85. package/lib/services/encryption/encryption.service.d.ts +8 -0
  86. package/lib/services/env/env.service.d.ts +44 -0
  87. package/lib/services/env/serverHostList.d.ts +9 -0
  88. package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
  89. package/lib/services/form/form-control/form-control.service.d.ts +44 -0
  90. package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
  91. package/lib/services/form/form-value/form-value.service.d.ts +32 -0
  92. package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
  93. package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
  94. package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
  95. package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
  96. package/lib/services/loader/loader.service.d.ts +8 -0
  97. package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
  98. package/lib/services/model/model.service.d.ts +11 -0
  99. package/lib/services/notify/notification.service.d.ts +22 -0
  100. package/lib/services/operator/operator.service.d.ts +27 -0
  101. package/lib/services/permission/permission.service.d.ts +18 -0
  102. package/lib/services/router/router.service.d.ts +14 -0
  103. package/lib/services/storage/cookies.service.d.ts +11 -0
  104. package/lib/services/storage/storage.service.d.ts +132 -0
  105. package/lib/services/tree-component/interface.d.ts +13 -0
  106. package/lib/services/tree-component/tree-component.service.d.ts +38 -0
  107. package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
  108. package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
  109. package/lib/shared/configuration/config.d.ts +144 -0
  110. package/lib/shared/configuration/editor-config.d.ts +72 -0
  111. package/lib/shared/enums/common.enum.d.ts +16 -0
  112. package/lib/shared/enums/config.enum.d.ts +54 -0
  113. package/lib/shared/enums/end-point.enum.d.ts +66 -0
  114. package/lib/shared/enums/flags.enum.d.ts +18 -0
  115. package/lib/shared/enums/keycodes.enum.d.ts +120 -0
  116. package/lib/shared/enums/operator_type.enum.d.ts +9 -0
  117. package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
  118. package/lib/shared/platform.d.ts +1 -0
  119. package/package.json +40 -0
  120. package/public-api.d.ts +49 -0
@@ -0,0 +1,749 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { of } from 'rxjs';
3
+ import { map } from 'rxjs/operators';
4
+ import { StorageTokenStatus } from '../../shared/enums/storage-token-status.enum';
5
+ import { PLATFORM_NAME } from '../../shared/platform';
6
+ import { Common } from '../../shared/enums/common.enum';
7
+ import { DOCUMENT } from '@angular/common';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common/http";
10
+ import * as i2 from "./../encryption/encryption.service";
11
+ import * as i3 from "./../common-utils/core-function/core-function.service";
12
+ import * as i4 from "./cookies.service";
13
+ export class StorageService {
14
+ constructor(http, env, document, encryptionService, coreFunctionService, cookiesService) {
15
+ this.http = http;
16
+ this.env = env;
17
+ this.document = document;
18
+ this.encryptionService = encryptionService;
19
+ this.coreFunctionService = coreFunctionService;
20
+ this.cookiesService = cookiesService;
21
+ this.ID_TOKEN = 'ID_TOKEN';
22
+ this.ACCESS_TOKEN = 'ACCESS_TOKEN';
23
+ this.REFRESH_TOKEN = 'REFRESH_TOKEN';
24
+ this.RESET_PASS_SESSION = 'RESET_PASS_SESSION';
25
+ this.EXPIRY_IN = 'EXPIRY_IN';
26
+ this.USER_KEY = 'USER';
27
+ this.ROLE = "ROLE";
28
+ this.ACTIVE_MENU = 'MENU';
29
+ this.MENU_TYPE = 'MENU_TYPE';
30
+ this.ID_TOKEN_EXPIRY_TIME = 'ID_TOKEN_EXPIRY_TIME';
31
+ this.REFRESH_TOKEN_EXPIRY_TIME = 'REFRESH_TOKEN_EXPIRY_TIME';
32
+ this.age = 3540000; //59 minuts
33
+ this.refreshTokenAge = 2505600000; //refresh token age 29 days
34
+ this.packDetails = {};
35
+ this.HOST_NAME = 'HOST_NAME';
36
+ this.PROJECT_FOLDER_NAME = 'PROJECT_FOLDER_NAME';
37
+ this.TEMP_NAME = "TEMP_NAME";
38
+ this.TEMP_THEME = "TEMP_THEME";
39
+ this.PAGE_TITLE = "PAGE_TITLE";
40
+ this.VERIFY_TYPE = "VERIFY_TYPE";
41
+ this.MODULE = "MODULE";
42
+ this.TEAM_NAME = "TEAM_NAME";
43
+ this.REDIRECT_URL = "REDIRECT_URL";
44
+ this.CHILD_WINDOW_URL = "CHILD_WINDOW_URL";
45
+ this.MODIFY_MODULES = 'MODIFY_MODULES';
46
+ this.CLIENT_NAME = 'CLIENT_NAME';
47
+ this.ALL_TEMPLATE = 'ALL_TEMPLATE';
48
+ this.TEMPLATE_INDEX = "TEMPLATE_INDEX";
49
+ this.TAB_COUNTS = "TAB_COUNTS";
50
+ }
51
+ load() {
52
+ return this.env;
53
+ }
54
+ setAppName(appname) {
55
+ this.appName = appname;
56
+ localStorage.setItem("AppName", JSON.stringify(appname));
57
+ }
58
+ setModule(module) {
59
+ sessionStorage.setItem("MODULE", module);
60
+ }
61
+ getModule() {
62
+ return sessionStorage.getItem('MODULE');
63
+ }
64
+ setChildWindowUrl(url) {
65
+ localStorage.setItem("CHILD_WINDOW_URL", url);
66
+ }
67
+ getChildWindowUrl() {
68
+ return localStorage.getItem('CHILD_WINDOW_URL');
69
+ }
70
+ setRedirectUrl(url) {
71
+ sessionStorage.setItem("REDIRECT_URL", url);
72
+ }
73
+ getRedirectUrl() {
74
+ return sessionStorage.getItem('REDIRECT_URL');
75
+ }
76
+ setUserPreference(user_preference) {
77
+ localStorage.setItem("USER_PREFERENCE", JSON.stringify(user_preference));
78
+ }
79
+ getUserPreference() {
80
+ return JSON.parse(localStorage.getItem('USER_PREFERENCE'));
81
+ }
82
+ setThemeSetting(settingObj) {
83
+ localStorage.setItem("THEME_SETTING", JSON.stringify(settingObj));
84
+ }
85
+ getThemeSetting() {
86
+ return JSON.parse(localStorage.getItem('THEME_SETTING'));
87
+ }
88
+ setApplicationSetting(applicationSetting) {
89
+ localStorage.setItem("APPLICATION_SETTING", JSON.stringify(applicationSetting));
90
+ }
91
+ getApplicationSetting() {
92
+ return JSON.parse(localStorage.getItem('APPLICATION_SETTING'));
93
+ }
94
+ setAppId(appId) {
95
+ localStorage.setItem('appId', appId);
96
+ }
97
+ getAppId() {
98
+ const user = this.GetUserInfo();
99
+ if (user && user.appId && user.appId != null) {
100
+ return user.appId;
101
+ }
102
+ else {
103
+ return localStorage.getItem('appId');
104
+ }
105
+ }
106
+ setExpiresIn(expiry) {
107
+ let expiryTime = (expiry - 300) * 1000;
108
+ localStorage.setItem(this.EXPIRY_IN, JSON.stringify(expiryTime));
109
+ this.setIdTokenExpiry();
110
+ }
111
+ getExpiresIn() {
112
+ return localStorage.getItem(this.EXPIRY_IN);
113
+ }
114
+ SetIdToken(token) {
115
+ localStorage.setItem(this.ID_TOKEN, JSON.stringify(token));
116
+ }
117
+ GetIdToken() {
118
+ let obj = JSON.parse(localStorage.getItem(this.ID_TOKEN));
119
+ if (obj && obj != null) {
120
+ return obj;
121
+ }
122
+ else {
123
+ return null;
124
+ }
125
+ }
126
+ IsJsonString(str) {
127
+ try {
128
+ JSON.parse(str);
129
+ }
130
+ catch (e) {
131
+ return false;
132
+ }
133
+ return true;
134
+ }
135
+ SetAccessToken(token) {
136
+ localStorage.setItem(this.ACCESS_TOKEN, JSON.stringify(token));
137
+ }
138
+ GetAccessToken() {
139
+ let obj = JSON.parse(localStorage.getItem(this.ACCESS_TOKEN));
140
+ if (obj && obj != null) {
141
+ return obj;
142
+ }
143
+ }
144
+ SetRefreshToken(token) {
145
+ localStorage.setItem(this.REFRESH_TOKEN, token);
146
+ this.setRefreshTokenExpiry();
147
+ }
148
+ GetRefreshToken() {
149
+ return localStorage.getItem(this.REFRESH_TOKEN);
150
+ }
151
+ GetIdTokenStatus() {
152
+ let expired = 0;
153
+ let expireTime = Number(localStorage.getItem(this.ID_TOKEN_EXPIRY_TIME));
154
+ let currentTime = Date.now();
155
+ let expiresIn24Hours = 0;
156
+ if (expireTime > currentTime)
157
+ expiresIn24Hours = (((expireTime - currentTime) / 1000) / 3600);
158
+ if (currentTime > expireTime) {
159
+ if (expireTime > 0) {
160
+ return StorageTokenStatus.ID_TOKEN_EXPIRED; // appConstant.TOKEN_STATUS.ID_TOKEN_EXPIRED; // notify, due to expired
161
+ }
162
+ return StorageTokenStatus.ID_TOKEN_NOT_CREATED; //appConstant.TOKEN_STATUS.ID_TOKEN_NOT_CREATED; // first time loading so no notify
163
+ }
164
+ else if (expiresIn24Hours > 24) {
165
+ return StorageTokenStatus.ID_TOKEN_EXPIRED; //appConstant.TOKEN_STATUS.ID_TOKEN_EXPIRED; // notify, due to expired
166
+ }
167
+ return StorageTokenStatus.ID_TOKEN_ACTIVE; //appConstant.TOKEN_STATUS.ID_TOKEN_ACTIVE; // not expired
168
+ }
169
+ GetRefreshTokenStatus() {
170
+ let expired = 0;
171
+ let expireTime = Number(localStorage.getItem(this.REFRESH_TOKEN_EXPIRY_TIME));
172
+ let currentTime = Date.now();
173
+ if (currentTime > expireTime) {
174
+ if (expireTime > 0) {
175
+ return StorageTokenStatus.REFRESH_TOKEN_EXPIRED; // appConstant.TOKEN_STATUS.REFRESH_TOKEN_EXPIRED; // notify, due to expired
176
+ }
177
+ return StorageTokenStatus.REFRESH_TOKEN_NOT_CREATED; // appConstant.TOKEN_STATUS.REFRESH_TOKEN_NOT_CREATED; // first time loading so no notify
178
+ }
179
+ return StorageTokenStatus.REFRESH_TOKEN_ACTIVE; // appConstant.TOKEN_STATUS.REFRESH_TOKEN_ACTIVE; // not expired
180
+ }
181
+ SetUserInfo(user) {
182
+ localStorage.setItem(this.USER_KEY, JSON.stringify(user));
183
+ }
184
+ GetUserInfo() {
185
+ const obj = JSON.parse(localStorage.getItem(this.USER_KEY));
186
+ if (obj && obj.user) {
187
+ return obj.user;
188
+ }
189
+ else {
190
+ return {};
191
+ }
192
+ }
193
+ GetRoleList() {
194
+ const obj = JSON.parse(localStorage.getItem(this.USER_KEY));
195
+ if (obj && obj.rollList) {
196
+ return obj.rollList;
197
+ }
198
+ else {
199
+ return [];
200
+ }
201
+ }
202
+ setActiveRole(role) {
203
+ localStorage.setItem(this.ROLE, JSON.stringify(role));
204
+ }
205
+ getActiveRole() {
206
+ const obj = JSON.parse(localStorage.getItem(this.ROLE));
207
+ return obj;
208
+ }
209
+ GetUserReference() {
210
+ let user = this.GetUserInfo();
211
+ let userRef = {};
212
+ userRef['_id'] = user['_id'];
213
+ userRef['name'] = user['name'];
214
+ return userRef;
215
+ }
216
+ GetPermission() {
217
+ const obj = JSON.parse(localStorage.getItem(this.USER_KEY));
218
+ if (obj && obj.permission) {
219
+ return obj.permission;
220
+ }
221
+ else {
222
+ return [];
223
+ }
224
+ }
225
+ GetModules() {
226
+ const obj = JSON.parse(localStorage.getItem(this.USER_KEY));
227
+ if (obj && obj.modules) {
228
+ return obj.modules;
229
+ }
230
+ else {
231
+ return [];
232
+ }
233
+ }
234
+ // SetModifyModules(modules:any){
235
+ // localStorage.setItem(this.MODIFY_MODULES,JSON.stringify(modules));
236
+ // }
237
+ // GetModifyModules(){
238
+ // return JSON.parse(<any>localStorage.getItem(this.MODIFY_MODULES));
239
+ // }
240
+ GetMenuType() {
241
+ const menu_Type = this.getApplicationValueByKey('menu_type');
242
+ if (menu_Type) {
243
+ return menu_Type;
244
+ }
245
+ else {
246
+ return null;
247
+ }
248
+ }
249
+ getUserLog() {
250
+ const user = JSON.parse(localStorage.getItem(this.USER_KEY));
251
+ if (user && user != null && user != undefined && user.user) {
252
+ this.userInfo = user.user;
253
+ this.log = { userId: this.userInfo.email, appId: this.getAppId(), refCode: this.userInfo.refCode };
254
+ return this.log;
255
+ }
256
+ else {
257
+ return null;
258
+ }
259
+ }
260
+ SetActiveMenu(menu) {
261
+ sessionStorage.setItem(this.ACTIVE_MENU, JSON.stringify(menu));
262
+ }
263
+ GetActiveMenu() {
264
+ return JSON.parse(sessionStorage.getItem(this.ACTIVE_MENU));
265
+ }
266
+ getRefCode() {
267
+ const userinfo = this.GetUserInfo();
268
+ if (userinfo && userinfo.refCode) {
269
+ return userinfo.refCode;
270
+ }
271
+ return null;
272
+ }
273
+ getUserAppId() {
274
+ return this.userInfo.appId;
275
+ }
276
+ removeDataFormStorage(all) {
277
+ let doNotClearCache = [];
278
+ if (all != "all") {
279
+ if (this.checkPlatForm() == 'mobile') {
280
+ let clientCode = this.getClientName();
281
+ if (clientCode && clientCode != '') {
282
+ let object = {};
283
+ object['key'] = this.CLIENT_NAME;
284
+ object["value"] = clientCode;
285
+ object['type'] = 'localstorage';
286
+ doNotClearCache.push(object);
287
+ }
288
+ }
289
+ }
290
+ localStorage.clear();
291
+ sessionStorage.clear();
292
+ if (doNotClearCache && doNotClearCache.length > 0) {
293
+ doNotClearCache.forEach((obj) => {
294
+ if (obj && obj.type == 'localstorage') {
295
+ let key = obj['key'];
296
+ let value = obj['value'];
297
+ localStorage.setItem(key, value);
298
+ }
299
+ });
300
+ }
301
+ }
302
+ setIdTokenExpiry() {
303
+ const startTime = Date.now();
304
+ const expiry = Number(this.getExpiresIn());
305
+ //const expiry = this.getExpiresIn();
306
+ localStorage.setItem(this.ID_TOKEN_EXPIRY_TIME, "" + (startTime + expiry));
307
+ }
308
+ setRefreshTokenExpiry() {
309
+ const startTime = Date.now();
310
+ localStorage.setItem(this.REFRESH_TOKEN_EXPIRY_TIME, startTime + this.refreshTokenAge);
311
+ }
312
+ search(url, term) {
313
+ if (term === '') {
314
+ return of([]);
315
+ }
316
+ return this.http
317
+ .get(url + term).pipe(map((response) => {
318
+ return response;
319
+ //console.log(response);
320
+ }));
321
+ }
322
+ setResetNewPasswordSession(session) {
323
+ localStorage.setItem('RESET_PASS_SESSION', session);
324
+ }
325
+ getResetNewPasswordSession() {
326
+ const session = localStorage.getItem('RESET_PASS_SESSION');
327
+ return session;
328
+ }
329
+ searchPostMethod(url, payload) {
330
+ if (payload === '') {
331
+ return of([]);
332
+ }
333
+ return this.http
334
+ .post(url, payload).pipe(map((response) => {
335
+ return response;
336
+ //console.log(response);
337
+ }));
338
+ }
339
+ // setPackaging(cartData:any) {
340
+ // switch (cartData.type) {
341
+ // case 'TAB': this.packDetails.packing = 'Packing : 1 strip (' + cartData.packing + ' Tablets Each)';
342
+ // this.packDetails.unit = 'Strip(s)';
343
+ // break;
344
+ // case 'SYP': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Syrup Each)';
345
+ // this.packDetails.unit = 'Bottle(s)';
346
+ // break;
347
+ // case 'LOT': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Lotion Each)';
348
+ // this.packDetails.unit = 'Bottle(s)';
349
+ // break;
350
+ // case 'INJ': this.packDetails.packing = 'Packing : 1 Vial (' + cartData.packing + ' Injection Each)';
351
+ // this.packDetails.unit = 'Vial(s)';
352
+ // break;
353
+ // case 'POWD': this.packDetails.packing = 'Packing : 1 Box (' + cartData.packing + ' Powder Each)';
354
+ // this.packDetails.unit = 'Box(es)';
355
+ // break;
356
+ // case 'CAP': this.packDetails.packing = 'Packing : 1 strip (' + cartData.packing + ' Capsule Each)';
357
+ // this.packDetails.unit = 'Strip(s)';
358
+ // break;
359
+ // case 'SACH': this.packDetails.packing = 'Packing : 1 Packet (' + cartData.packing + ' Sachet Each)';
360
+ // this.packDetails.unit = 'Packet(s)';
361
+ // break;
362
+ // case 'INH': this.packDetails.packing = 'Packing : 1 Box (' + cartData.packing + ' Inhaler Each)';
363
+ // this.packDetails.unit = 'Box(es)';
364
+ // break;
365
+ // case 'ROTO': this.packDetails.packing = 'Packing : 1 Box (' + cartData.packing + ' Redicaps Each)';
366
+ // this.packDetails.unit = 'Box(es)';
367
+ // break;
368
+ // case 'E/DR': this.packDetails.packing = 'Packing : 1 Packet (' + cartData.packing + ' Eye Drop Each)';
369
+ // this.packDetails.unit = 'Packet(s)';
370
+ // break;
371
+ // case 'EDRP': this.packDetails.packing = 'Packing : 1 Packet (' + cartData.packing + ' Eye Drop Each)';
372
+ // this.packDetails.unit = 'Packet(s)';
373
+ // break;
374
+ // case 'OINT': this.packDetails.packing = 'Packing : 1 Tube (' + cartData.packing + ' Ointment Each)';
375
+ // this.packDetails.unit = 'Tube(s)';
376
+ // break;
377
+ // case 'OIL': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
378
+ // this.packDetails.unit = 'Bottle(s)';
379
+ // break;
380
+ // case 'SOAP': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
381
+ // this.packDetails.unit = 'Pack(s)';
382
+ // break;
383
+ // case 'FWSH': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
384
+ // this.packDetails.unit = 'Pack(s)';
385
+ // break;
386
+ // case 'DRP': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
387
+ // this.packDetails.unit = 'Pack(s)';
388
+ // break;
389
+ // case 'JELY': this.packDetails.packing = 'Packing : 1 Packet (' + cartData.packing + ' Jelly Each)';
390
+ // this.packDetails.unit = 'Packet(s)';
391
+ // break;
392
+ // case 'CREM': this.packDetails.packing = 'Packing : 1 Tube (' + cartData.packing + ' Cream Each)';
393
+ // this.packDetails.unit = 'Packet(s)';
394
+ // break;
395
+ // case 'CRTG': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
396
+ // this.packDetails.unit = 'Packet(s)';
397
+ // break;
398
+ // case 'CONER': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
399
+ // this.packDetails.unit = 'Packet(s)';
400
+ // break;
401
+ // case 'CHRN': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
402
+ // this.packDetails.unit = 'Packet(s)';
403
+ // break;
404
+ // case 'FLOS': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
405
+ // this.packDetails.unit = 'Packet(s)';
406
+ // break;
407
+ // case 'DIAP': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
408
+ // this.packDetails.unit = 'Packet(s)';
409
+ // break;
410
+ // case 'DRES': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
411
+ // this.packDetails.unit = 'Packet(s)';
412
+ // break;
413
+ // case 'DRNK': this.packDetails.packing = 'Packing :1 Bottle (' + cartData.packing + ' Bottle each)';
414
+ // this.packDetails.unit = 'Bottle(s)';
415
+ // break;
416
+ // case 'DSYP': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
417
+ // this.packDetails.unit = 'Bottle(s)';
418
+ // break;
419
+ // case 'DPO': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
420
+ // this.packDetails.unit = 'Packet(s)';
421
+ // break;
422
+ // case 'ENM': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
423
+ // this.packDetails.unit = 'Packet(s)';
424
+ // break;
425
+ // case 'EXP': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
426
+ // this.packDetails.unit = 'Packet(s)';
427
+ // break;
428
+ // case 'EOINT': this.packDetails.packing = 'Packing : 1 Tube (' + cartData.packing + ' Ointment Each)';
429
+ // this.packDetails.unit = 'Tube(s)';
430
+ // break;
431
+ // case 'GEL': this.packDetails.packing = 'Packing : 1 Tube (' + cartData.packing + ' Gel Each)';
432
+ // this.packDetails.unit = 'Gel(s)';
433
+ // break;
434
+ // case 'GRGL': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
435
+ // this.packDetails.unit = 'Bottle(s)';
436
+ // break;
437
+ // case 'GMTR': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
438
+ // this.packDetails.unit = 'Packet(s)';
439
+ // break;
440
+ // case 'HAISER': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
441
+ // this.packDetails.unit = 'Bottle(s)';
442
+ // break;
443
+ // case 'HWSH': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
444
+ // this.packDetails.unit = 'Bottle(s)';
445
+ // break;
446
+ // case 'INFN': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
447
+ // this.packDetails.unit = 'Packet(s)';
448
+ // break;
449
+ // case 'VWASH': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
450
+ // this.packDetails.unit = 'Packet(s)';
451
+ // break;
452
+ // case 'JAR': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
453
+ // this.packDetails.unit = 'Packet(s)';
454
+ // break;
455
+ // case 'JUIC': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
456
+ // this.packDetails.unit = 'Packet(s)';
457
+ // break;
458
+ // case 'KIT': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Kit Each)';
459
+ // this.packDetails.unit = 'Packet(s)';
460
+ // break;
461
+ // case 'LBALM': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
462
+ // this.packDetails.unit = 'Packet(s)';
463
+ // break;
464
+ // case 'LQD': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
465
+ // this.packDetails.unit = 'Bottle(s)';
466
+ // break;
467
+ // case 'MPNT': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
468
+ // this.packDetails.unit = 'Packet(s)';
469
+ // break;
470
+ // case 'MWSH': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
471
+ // this.packDetails.unit = 'Bottle(s)';
472
+ // break;
473
+ // case 'NDRP': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
474
+ // this.packDetails.unit = 'Packet(s)';
475
+ // break;
476
+ // case 'NIPLE': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
477
+ // this.packDetails.unit = 'Packet(s)';
478
+ // break;
479
+ // case 'ODRPS': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
480
+ // this.packDetails.unit = 'Bottle(s)';
481
+ // break;
482
+ // case 'PKT': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
483
+ // this.packDetails.unit = 'Packet(s)';
484
+ // break;
485
+ // case 'PFS': this.packDetails.packing = 'Packing : 1 Syringe (' + cartData.packing + ' Syringe Each)';
486
+ // this.packDetails.unit = 'Syringe(s)';
487
+ // break;
488
+ // case 'RPSLS': this.packDetails.packing = 'Packing : 1 Respule (' + cartData.packing + ' Respule Each)';
489
+ // this.packDetails.unit = 'Respule(s)';
490
+ // break;
491
+ // case 'ROLL': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
492
+ // this.packDetails.unit = 'Packet(s)';
493
+ // break;
494
+ // case 'SACH': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
495
+ // this.packDetails.unit = 'Packet(s)';
496
+ // break;
497
+ // case 'SCRUB': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
498
+ // this.packDetails.unit = 'Packet(s)';
499
+ // break;
500
+ // case 'SHAMP': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
501
+ // this.packDetails.unit = 'Bottle(s)';
502
+ // break;
503
+ // case 'SLTN': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
504
+ // this.packDetails.unit = 'Bottle(s)';
505
+ // break;
506
+ // case 'SPRY': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
507
+ // this.packDetails.unit = 'Bottle(s)';
508
+ // break;
509
+ // case 'TPAST': this.packDetails.packing = 'Packing : 1 Paste (' + cartData.packing + ' Paste Each)';
510
+ // this.packDetails.unit = 'Paste(s)';
511
+ // break;
512
+ // case 'VACC': this.packDetails.packing = 'Packing : 1 Vaccine (' + cartData.packing + ' Pack Each)';
513
+ // this.packDetails.unit = 'Paste(s)';
514
+ // break;
515
+ // case 'VTAB': this.packDetails.packing = 'Packing : 1 Tablet (' + cartData.packing + ' Tablet Each)';
516
+ // this.packDetails.unit = 'Tablet(s)';
517
+ // break;
518
+ // case 'WIPS': this.packDetails.packing = 'Packing : 1 Wipes (' + cartData.packing + ' Wipes Each)';
519
+ // this.packDetails.unit = 'Wipe(s)';
520
+ // break;
521
+ // case 'TULL': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
522
+ // this.packDetails.unit = 'Packet(s)';
523
+ // break;
524
+ // case 'TBAG': this.packDetails.packing = 'Packing : 1 Pack (' + cartData.packing + ' Pack Each)';
525
+ // this.packDetails.unit = 'Packet(s)';
526
+ // break;
527
+ // case 'SYRNEE': this.packDetails.packing = 'Packing : 1 Pack Syringe (' + cartData.packing + ' Pack Syringe Each)';
528
+ // this.packDetails.unit = 'Packet(s)';
529
+ // break;
530
+ // case 'NSPRY': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
531
+ // this.packDetails.unit = 'Bottle(s)';
532
+ // break;
533
+ // case 'RMSRP': this.packDetails.packing = 'Packing : 1 Bottle (' + cartData.packing + ' Bottle Each)';
534
+ // this.packDetails.unit = 'Bottle(s)';
535
+ // break;
536
+ // default: this.packDetails.packing = 'Packing : 1 strip (' + cartData.packing + ' Tablets Each)';
537
+ // this.packDetails.unit = 'Strip(s)';
538
+ // }
539
+ // return this.packDetails;
540
+ // }
541
+ setHostNameDinamically(host) {
542
+ let domainName = this.document.location['hostname'];
543
+ localStorage.setItem(this.HOST_NAME, host);
544
+ if (domainName != "localhost" && this.cookiesService.isCookieExpired(domainName)) {
545
+ this.cookiesService.setCookieByName(domainName, host, 30);
546
+ }
547
+ }
548
+ getHostNameDinamically() {
549
+ let host = localStorage.getItem(this.HOST_NAME);
550
+ if (this.coreFunctionService.isNotBlank(host)) {
551
+ return host;
552
+ }
553
+ else {
554
+ let domainName = this.document.location['hostname'];
555
+ host = this.cookiesService.getCookieByName(domainName);
556
+ if (host && host != "")
557
+ this.setHostNameDinamically(host);
558
+ return host;
559
+ }
560
+ }
561
+ getLogoPath() {
562
+ let projectFolderName = this.getApplicationValueByKey('folder');
563
+ return 'assets/img/logo/' + projectFolderName + '/';
564
+ }
565
+ getPageTitle() {
566
+ return this.getApplicationValueByKey('title');
567
+ }
568
+ getVerifyType() {
569
+ return this.getApplicationValueByKey('varify_mode');
570
+ }
571
+ getPageThmem() {
572
+ return this.getApplicationValueByKey('theme');
573
+ }
574
+ getTemplateName() {
575
+ return this.getApplicationValueByKey('temp_name');
576
+ }
577
+ getTeamName() {
578
+ return this.getApplicationValueByKey('teamname');
579
+ }
580
+ getBucketName() {
581
+ return this.getApplicationValueByKey('bucket');
582
+ }
583
+ getAuthenticationSetting() {
584
+ return this.getApplicationValueByKey('authenticationSettings');
585
+ }
586
+ getAdminEmail() {
587
+ let authenticationSettings = this.getAuthenticationSetting();
588
+ let adminEmail = "";
589
+ if (authenticationSettings && authenticationSettings['adminEmailId'] && authenticationSettings['adminEmailId'] != "") {
590
+ adminEmail = authenticationSettings['adminEmailId'];
591
+ }
592
+ return adminEmail;
593
+ }
594
+ getApplicationValueByKey(key) {
595
+ let value = "";
596
+ let applicationSetting = this.getApplicationSetting();
597
+ if (applicationSetting && applicationSetting[key] != undefined && applicationSetting[key] != null && applicationSetting[key] != "") {
598
+ value = applicationSetting[key];
599
+ }
600
+ return value;
601
+ }
602
+ // for App
603
+ setClientNAme(name) {
604
+ localStorage.setItem(this.CLIENT_NAME, name);
605
+ }
606
+ getClientName() {
607
+ return localStorage.getItem(this.CLIENT_NAME);
608
+ }
609
+ removeKeyFromStorage(key) {
610
+ localStorage.removeItem(key);
611
+ }
612
+ getPlatform() {
613
+ return this.env.plateformName;
614
+ }
615
+ getClientCodeEnviorment() {
616
+ return this.env;
617
+ }
618
+ checkPlatForm() {
619
+ let platForm = 'web';
620
+ let platFormName = this.getPlatform();
621
+ if (platFormName && platFormName != "" && PLATFORM_NAME.includes(platFormName)) {
622
+ platForm = 'mobile';
623
+ }
624
+ return platForm;
625
+ }
626
+ getDefaultNumOfItem() {
627
+ let itemNumOfGrid = Common.ITEM_NUM_OF_GRID;
628
+ let defaultSettings = this.getApplicationDefaultSettings();
629
+ if (defaultSettings && defaultSettings.defaultItemNoOfGrid && defaultSettings.defaultItemNoOfGrid != "" && defaultSettings.defaultItemNoOfGrid > 0) {
630
+ itemNumOfGrid = defaultSettings.defaultItemNoOfGrid;
631
+ }
632
+ return itemNumOfGrid;
633
+ }
634
+ getApplicationDefaultSettings() {
635
+ let applicationSetting = this.getApplicationSetting();
636
+ return applicationSetting.defaultApplicationSettings;
637
+ }
638
+ getApplicationAuthenticationSettings() {
639
+ let applicationSetting = this.getApplicationSetting();
640
+ if (applicationSetting && applicationSetting.authenticationSettings) {
641
+ return applicationSetting.authenticationSettings;
642
+ }
643
+ else {
644
+ return null;
645
+ }
646
+ }
647
+ getTwoFactorAuthenticationType() {
648
+ let authenticationSetting = this.getApplicationAuthenticationSettings();
649
+ if (authenticationSetting && authenticationSetting.twoFactorAuthentication && authenticationSetting.twoFactorAuthenticationType) {
650
+ return authenticationSetting.twoFactorAuthenticationType;
651
+ }
652
+ else {
653
+ return null;
654
+ }
655
+ }
656
+ getDefaultSearchOperator() {
657
+ let defaultSearchOperator = Common.DEFAULT_OPERATOR;
658
+ let defaultSettings = this.getApplicationDefaultSettings();
659
+ if (defaultSettings && defaultSettings.defaultSearchOperatorInGrid && defaultSettings.defaultSearchOperatorInGrid != "") {
660
+ defaultSearchOperator = defaultSettings.defaultSearchOperatorInGrid;
661
+ }
662
+ return defaultSearchOperator;
663
+ }
664
+ storeAllTemplate(data) {
665
+ // let encryptData = this.encryptionService.encryptRequest(data);
666
+ // console.log(encryptData);
667
+ let modifiedList = this.modifyTemplateList(data);
668
+ if (modifiedList) {
669
+ localStorage.setItem(this.ALL_TEMPLATE, JSON.stringify(modifiedList.templatList));
670
+ localStorage.setItem(this.TEMPLATE_INDEX, JSON.stringify(modifiedList.templateIndexList));
671
+ }
672
+ }
673
+ modifyTemplateList(obj) {
674
+ let list = {};
675
+ let indexList = [];
676
+ let oldList = this.getAllTemplateList();
677
+ let allIndexList = JSON.parse(localStorage.getItem(this.TEMPLATE_INDEX));
678
+ if (allIndexList && allIndexList.length > 0) {
679
+ indexList = allIndexList;
680
+ }
681
+ if (oldList && Object.keys(oldList).length > 0) {
682
+ let size = this.coreFunctionService.getJsonSizeInKilobyte(oldList);
683
+ // console.log(size);
684
+ if (size >= 1024) {
685
+ let keyName = indexList[0];
686
+ delete (oldList[keyName]);
687
+ indexList.splice(0, 1);
688
+ }
689
+ list = oldList;
690
+ }
691
+ else {
692
+ list = {};
693
+ }
694
+ if (obj && obj) {
695
+ Object.keys(obj).forEach(key => {
696
+ list[key] = obj[key];
697
+ indexList.push(key);
698
+ });
699
+ }
700
+ let responce = {
701
+ templatList: list,
702
+ templateIndexList: indexList
703
+ };
704
+ return responce;
705
+ }
706
+ getAllTemplateList() {
707
+ //let allTemplate = localStorage.getItem(this.ALL_TEMPLATE);
708
+ const obj = JSON.parse(localStorage.getItem(this.ALL_TEMPLATE));
709
+ //return this.encryptionService.decryptRequest(allTemplate);
710
+ return obj;
711
+ }
712
+ getTemplate(tempName, moduleName) {
713
+ let templateList = this.getAllTemplateList();
714
+ let name = moduleName + "_" + tempName;
715
+ if (templateList && templateList[name]) {
716
+ return templateList[name];
717
+ }
718
+ else {
719
+ return null;
720
+ }
721
+ }
722
+ SetTabCounts(tabCounts) {
723
+ localStorage.setItem(this.TAB_COUNTS, JSON.stringify(tabCounts));
724
+ }
725
+ GetTabCounts() {
726
+ let counts = JSON.parse(localStorage.getItem(this.TAB_COUNTS));
727
+ if (counts) {
728
+ return counts;
729
+ }
730
+ else {
731
+ return {};
732
+ }
733
+ }
734
+ }
735
+ StorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: StorageService, deps: [{ token: i1.HttpClient }, { token: 'env' }, { token: DOCUMENT }, { token: i2.EncryptionService }, { token: i3.CoreFunctionService }, { token: i4.CookiesService }], target: i0.ɵɵFactoryTarget.Injectable });
736
+ StorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: StorageService, providedIn: 'root' });
737
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: StorageService, decorators: [{
738
+ type: Injectable,
739
+ args: [{
740
+ providedIn: 'root'
741
+ }]
742
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
743
+ type: Inject,
744
+ args: ['env']
745
+ }] }, { type: Document, decorators: [{
746
+ type: Inject,
747
+ args: [DOCUMENT]
748
+ }] }, { type: i2.EncryptionService }, { type: i3.CoreFunctionService }, { type: i4.CookiesService }]; } });
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBa0QsR0FBRyxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFPM0MsTUFBTSxPQUFPLGNBQWM7SUFxQ3pCLFlBQ1UsSUFBZ0IsRUFDRCxHQUFPLEVBQ0osUUFBa0IsRUFDcEMsaUJBQW1DLEVBQ25DLG1CQUF1QyxFQUN2QyxjQUE2QjtRQUw3QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ0QsUUFBRyxHQUFILEdBQUcsQ0FBSTtRQUNKLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNuQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3ZDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBMUN2QyxhQUFRLEdBQVcsVUFBVSxDQUFDO1FBQzlCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGtCQUFhLEdBQVcsZUFBZSxDQUFDO1FBQ3hDLHVCQUFrQixHQUFVLG9CQUFvQixDQUFDO1FBQ2pELGNBQVMsR0FBTSxXQUFXLENBQUM7UUFDM0Is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LDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsdUdBQXVHO0lBQ3ZHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsdUdBQXVHO0lBQ3ZHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsMEdBQTBHO0lBQzFHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsMkdBQTJHO0lBQzNHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2Ysc0dBQXNHO0lBQ3RHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2Ysc0dBQXNHO0lBQ3RHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsMEdBQTBHO0lBQzFHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsNEdBQTRHO0lBQzVHLDJDQUEyQztJQUMzQyxlQUFlO0lBQ2YscUdBQXFHO0lBQ3JHLDBDQUEwQztJQUMxQyxlQUFlO0lBQ2YsMkdBQTJHO0lBQzNHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsdUdBQXVHO0lBQ3ZHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsNkdBQTZHO0lBQzdHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsMkdBQTJHO0lBQzNHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsdUdBQXVHO0lBQ3ZHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2Ysd0dBQXdHO0lBQ3hHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2Ysc0dBQXNHO0lBQ3RHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsdUdBQXVHO0lBQ3ZHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YscUdBQXFHO0lBQ3JHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2Ysd0dBQXdHO0lBQ3hHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsMEdBQTBHO0lBQzFHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsdUdBQXVHO0lBQ3ZHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsMkdBQTJHO0lBQzNHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsdUdBQXVHO0lBQ3ZHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2Ysd0dBQXdHO0lBQ3hHLDZDQUE2QztJQUM3QyxlQUFlO0lBQ2YsNEdBQTRHO0lBQzVH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QztZQUNSLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7YUFBSTtZQUNILE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDOzs0R0F4dUJVLGNBQWMsNENBdUNmLEtBQUssYUFDTCxRQUFRO2dIQXhDUCxjQUFjLGNBRmIsTUFBTTs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBd0NJLE1BQU07MkJBQUMsS0FBSzs7MEJBQ1osTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29yZUZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4vLi4vY29tbW9uLXV0aWxzL2NvcmUtZnVuY3Rpb24vY29yZS1mdW5jdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLy4uL2VuY3J5cHRpb24vZW5jcnlwdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgdGFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFN0b3JhZ2VUb2tlblN0YXR1cyB9IGZyb20gJy4uLy4uL3NoYXJlZC9lbnVtcy9zdG9yYWdlLXRva2VuLXN0YXR1cy5lbnVtJztcclxuaW1wb3J0IHsgUExBVEZPUk1fTkFNRSB9IGZyb20gJy4uLy4uL3NoYXJlZC9wbGF0Zm9ybSc7XHJcbmltcG9ydCB7IENvbW1vbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9lbnVtcy9jb21tb24uZW51bSc7XHJcbmltcG9ydCB7IENvb2tpZXNTZXJ2aWNlIH0gZnJvbSAnLi9jb29raWVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTZXJ2aWNlIHtcclxuICBJRF9UT0tFTjogc3RyaW5nID0gJ0lEX1RPS0VOJztcclxuICBBQ0NFU1NfVE9LRU46IHN0cmluZyA9ICdBQ0NFU1NfVE9LRU4nO1xyXG4gIFJFRlJFU0hfVE9LRU46IHN0cmluZyA9ICdSRUZSRVNIX1RPS0VOJztcclxuICBSRVNFVF9QQVNTX1NFU1NJT046c3RyaW5nID0gJ1JFU0VUX1BBU1NfU0VTU0lPTic7XHJcbiAgRVhQSVJZX0lOOmFueT0gJ0VYUElSWV9JTic7XHJcbiAgVVNFUl9LRVk6IHN0cmluZyA9ICdVU0VSJztcclxuICBST0xFOnN0cmluZyA9IFwiUk9MRVwiO1xyXG4gIEFDVElWRV9NRU5VOiBzdHJpbmcgPSAnTUVOVSc7XHJcbiAgTUVOVV9UWVBFOiBzdHJpbmcgPSAnTUVOVV9UWVBFJztcclxuICBJRF9UT0tFTl9FWFBJUllfVElNRTogc3RyaW5nID0gJ0lEX1RPS0VOX0VYUElSWV9USU1FJztcclxuICBSRUZSRVNIX1RPS0VOX0VYUElSWV9USU1FOnN0cmluZz0nUkVGUkVTSF9UT0tFTl9FWFBJUllfVElNRSc7XHJcbiAgdXNlckluZm86IGFueTtcclxuICBsb2c6IGFueTtcclxuICBhZ2U6YW55PTM1NDAwMDA7IC8vNTkgbWludXRzXHJcbiAgcmVmcmVzaFRva2VuQWdlOmFueT0yNTA1NjAwMDAwIC8vcmVmcmVzaCB0b2tlbiBhZ2UgMjkgZGF5c1xyXG4gIHBhY2tEZXRhaWxzOiBhbnkgPSB7fTtcclxuXHJcbiAgSE9TVF9OQU1FIDogc3RyaW5nID0gJ0hPU1RfTkFNRSc7XHJcbiAgUFJPSkVDVF9GT0xERVJfTkFNRTogc3RyaW5nID0gJ1BST0pFQ1RfRk9MREVSX05BTUUnO1xyXG4gIFRFTVBfTkFNRTpzdHJpbmcgPSBcIlRFTVBfTkFNRVwiO1xyXG4gIFRFTVBfVEhFTUU6c3RyaW5nID0gXCJURU1QX1RIRU1FXCI7XHJcbiAgUEFHRV9USVRMRTpzdHJpbmcgPSBcIlBBR0VfVElUTEVcIjtcclxuICBWRVJJRllfVFlQRTpzdHJpbmcgPSBcIlZFUklGWV9UWVBFXCI7XHJcbiAgTU9EVUxFOnN0cmluZyA9IFwiTU9EVUxFXCI7XHJcbiAgVEVBTV9OQU1FOnN0cmluZyA9IFwiVEVBTV9OQU1FXCI7XHJcbiAgVVNFUl9QUkVGRVJFTkNFOmFueTtcclxuICBSRURJUkVDVF9VUkw6c3RyaW5nID0gXCJSRURJUkVDVF9VUkxcIjtcclxuICBDSElMRF9XSU5ET1dfVVJMOnN0cmluZyA9IFwiQ0hJTERfV0lORE9XX1VSTFwiO1xyXG4gIE1PRElGWV9NT0RVTEVTOmFueSA9ICdNT0RJRllfTU9EVUxFUyc7XHJcbiAgYXBwTmFtZTphbnk7XHJcbiAgQ0xJRU5UX05BTUU6YW55ID0gJ0NMSUVOVF9OQU1FJztcclxuICBBTExfVEVNUExBVEU6YW55ID0gJ0FMTF9URU1QTEFURSc7XHJcbiAgVEVNUExBVEVfSU5ERVg6YW55ID0gXCJURU1QTEFURV9JTkRFWFwiO1xyXG4gIFRBQl9DT1VOVFM6YW55PVwiVEFCX0NPVU5UU1wiO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBASW5qZWN0KCdlbnYnKSBwcml2YXRlIGVudjphbnksXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcclxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6RW5jcnlwdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6Q29yZUZ1bmN0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY29va2llc1NlcnZpY2U6Q29va2llc1NlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gIGxvYWQoKTogT2JzZXJ2YWJsZTxhbnk+e1xyXG4gICAgcmV0dXJuIHRoaXMuZW52O1xyXG4gIH1cclxuICBzZXRBcHBOYW1lKGFwcG5hbWU6c3RyaW5nKXtcclxuICAgIHRoaXMuYXBwTmFtZSA9IGFwcG5hbWU7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkFwcE5hbWVcIiwgSlNPTi5zdHJpbmdpZnkoYXBwbmFtZSkpO1xyXG59XHJcbiAgc2V0TW9kdWxlKG1vZHVsZTpzdHJpbmcpe1xyXG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcIk1PRFVMRVwiLG1vZHVsZSk7XHJcbiAgfVxyXG4gIGdldE1vZHVsZSgpe1xyXG4gICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ01PRFVMRScpO1xyXG4gIH1cclxuICBzZXRDaGlsZFdpbmRvd1VybCh1cmw6c3RyaW5nKXtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiQ0hJTERfV0lORE9XX1VSTFwiLHVybCk7XHJcbiAgfVxyXG4gIGdldENoaWxkV2luZG93VXJsKCl7XHJcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0NISUxEX1dJTkRPV19VUkwnKTtcclxuICB9XHJcbiAgc2V0UmVkaXJlY3RVcmwodXJsOnN0cmluZyl7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiUkVESVJFQ1RfVVJMXCIsdXJsKTtcclxuICB9XHJcbiAgZ2V0UmVkaXJlY3RVcmwoKXtcclxuICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdSRURJUkVDVF9VUkwnKTtcclxuICB9XHJcbiAgc2V0VXNlclByZWZlcmVuY2UodXNlcl9wcmVmZXJlbmNlOmFueSl7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlVTRVJfUFJFRkVSRU5DRVwiLEpTT04uc3RyaW5naWZ5KHVzZXJfcHJlZmVyZW5jZSkpO1xyXG4gIH1cclxuICBnZXRVc2VyUHJlZmVyZW5jZSgpe1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoPGFueT5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnVVNFUl9QUkVGRVJFTkNFJykpO1xyXG4gIH1cclxuXHJcbiAgc2V0VGhlbWVTZXR0aW5nKHNldHRpbmdPYmo6YW55KXtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiVEhFTUVfU0VUVElOR1wiLEpTT04uc3RyaW5naWZ5KHNldHRpbmdPYmopKTtcclxuICB9XHJcbiAgZ2V0VGhlbWVTZXR0aW5nKCl7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZSg8YW55PmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdUSEVNRV9TRVRUSU5HJykpO1xyXG4gIH1cclxuXHJcbiAgc2V0QXBwbGljYXRpb25TZXR0aW5nKGFwcGxpY2F0aW9uU2V0dGluZzphbnkpe1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJBUFBMSUNBVElPTl9TRVRUSU5HXCIsSlNPTi5zdHJpbmdpZnkoYXBwbGljYXRpb25TZXR0aW5nKSk7XHJcbiAgfVxyXG4gIGdldEFwcGxpY2F0aW9uU2V0dGluZygpe1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoPGFueT5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQVBQTElDQVRJT05fU0VUVElORycpKTtcclxuICB9XHJcblxyXG4gIHNldEFwcElkKGFwcElkOnN0cmluZyl7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwSWQnLCBhcHBJZCk7XHJcbiAgfVxyXG5cclxuICBnZXRBcHBJZCgpe1xyXG4gICAgY29uc3QgdXNlciA9IHRoaXMuR2V0VXNlckluZm8oKTtcclxuICAgIGlmKHVzZXIgJiYgdXNlci5hcHBJZCAmJiB1c2VyLmFwcElkICE9IG51bGwpe1xyXG4gICAgICByZXR1cm4gdXNlci5hcHBJZDtcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2FwcElkJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEV4cGlyZXNJbihleHBpcnk6IGFueSl7XHJcbiAgICBsZXQgZXhwaXJ5VGltZSA9IChleHBpcnkgLSAzMDApKjEwMDBcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuRVhQSVJZX0lOLCBKU09OLnN0cmluZ2lmeShleHBpcnlUaW1lKSk7XHJcbiAgICB0aGlzLnNldElkVG9rZW5FeHBpcnkoKTtcclxuICB9XHJcbiAgZ2V0RXhwaXJlc0luKCl7XHJcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5FWFBJUllfSU4pO1xyXG4gIH1cclxuICBTZXRJZFRva2VuKHRva2VuOiBhbnkpIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuSURfVE9LRU4sIEpTT04uc3RyaW5naWZ5KHRva2VuKSk7XHJcbiAgfVxyXG4gIEdldElkVG9rZW4oKSB7XHJcbiAgICBsZXQgb2JqID0gSlNPTi5wYXJzZSg8YW55PmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuSURfVE9LRU4pKTtcclxuICAgIGlmKG9iaiAmJiBvYmogIT0gbnVsbCApe1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICBJc0pzb25TdHJpbmcoc3RyOmFueSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgICAgSlNPTi5wYXJzZShzdHIpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIFNldEFjY2Vzc1Rva2VuKHRva2VuOiBhbnkpIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQUNDRVNTX1RPS0VOLCBKU09OLnN0cmluZ2lmeSh0b2tlbikpO1xyXG4gIH1cclxuICBHZXRBY2Nlc3NUb2tlbigpIHtcclxuICAgIGxldCBvYmogPSBKU09OLnBhcnNlKDxhbnk+bG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5BQ0NFU1NfVE9LRU4pKTtcclxuICAgIGlmKG9iaiAmJiBvYmogIT0gbnVsbCl7XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuICB9XHJcbiAgU2V0UmVmcmVzaFRva2VuKHRva2VuOiBzdHJpbmcpIHtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTiwgdG9rZW4pO1xyXG4gICAgdGhpcy5zZXRSZWZyZXNoVG9rZW5FeHBpcnkoKTtcclxuICB9XHJcbiAgR2V0UmVmcmVzaFRva2VuKCkge1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTik7XHJcbiAgfVxyXG4gIEdldElkVG9rZW5TdGF0dXMoKXtcclxuICAgIGxldCBleHBpcmVkID0gMDtcclxuICAgIGxldCBleHBpcmVUaW1lID0gTnVtYmVyKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuSURfVE9LRU5fRVhQSVJZX1RJTUUpKTtcclxuICAgIGxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XHJcbiAgICBsZXQgZXhwaXJlc0luMjRIb3VycyA9IDA7XHJcblxyXG5cdGlmKGV4cGlyZVRpbWUgPiBjdXJyZW50VGltZSlcclxuICAgICAgZXhwaXJlc0luMjRIb3VycyA9ICAoKChleHBpcmVUaW1lLWN1cnJlbnRUaW1lKS8xMDAwKS8zNjAwKSA7XHJcblxyXG5cdGlmKGN1cnJlbnRUaW1lID4gZXhwaXJlVGltZSl7XHJcbiAgICAgIGlmKGV4cGlyZVRpbWUgPiAwKXtcclxuICAgICAgICByZXR1cm4gU3RvcmFnZVRva2VuU3RhdHVzLklEX1RPS0VOX0VYUElSRUQ7ICAvLyBhcHBDb25zdGFudC5UT0tFTl9TVEFUVVMuSURfVE9LRU5fRVhQSVJFRDsgLy8gbm90aWZ5LCBkdWUgdG8gZXhwaXJlZFxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAgU3RvcmFnZVRva2VuU3RhdHVzLklEX1RPS0VOX05PVF9DUkVBVEVEOyAvL2FwcENvbnN0YW50LlRPS0VOX1NUQVRVUy5JRF9UT0tFTl9OT1RfQ1JFQVRFRDsgIC8vIGZpcnN0IHRpbWUgbG9hZGluZyBzbyBubyBub3RpZnlcclxuICAgIH0gZWxzZSBpZihleHBpcmVzSW4yNEhvdXJzID4gMjQpe1xyXG5cdFx0cmV0dXJuIFN0b3JhZ2VUb2tlblN0YXR1cy5JRF9UT0tFTl9FWFBJUkVEIC8vYXBwQ29uc3RhbnQuVE9LRU5fU1RBVFVTLklEX1RPS0VOX0VYUElSRUQ7IC8vIG5vdGlmeSwgZHVlIHRvIGV4cGlyZWRcclxuXHR9XHJcblxyXG4gICAgcmV0dXJuIFN0b3JhZ2VUb2tlblN0YXR1cy5JRF9UT0tFTl9BQ1RJVkU7IC8vYXBwQ29uc3RhbnQuVE9LRU5fU1RBVFVTLklEX1RPS0VOX0FDVElWRTsgLy8gbm90IGV4cGlyZWRcclxuICB9XHJcblxyXG5cclxuXHJcbiAgR2V0UmVmcmVzaFRva2VuU3RhdHVzKCl7XHJcbiAgICBsZXQgZXhwaXJlZCA9IDA7XHJcbiAgICBsZXQgZXhwaXJlVGltZSA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlJFRlJFU0hfVE9LRU5fRVhQSVJZX1RJTUUpKTtcclxuICAgIGxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XHJcbiAgICBpZihjdXJyZW50VGltZSA+IGV4cGlyZVRpbWUpe1xyXG4gICAgICBpZihleHBpcmVUaW1lID4gMCl7XHJcbiAgICAgICAgcmV0dXJuIFN0b3JhZ2VUb2tlblN0YXR1cy5SRUZSRVNIX1RPS0VOX0VYUElSRUQ7IC8vIGFwcENvbnN0YW50LlRPS0VOX1NUQVRVUy5SRUZSRVNIX1RPS0VOX0VYUElSRUQ7IC8vIG5vdGlmeSwgZHVlIHRvIGV4cGlyZWRcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gU3RvcmFnZVRva2VuU3RhdHVzLlJFRlJFU0hfVE9LRU5fTk9UX0NSRUFURUQ7IC8vIGFwcENvbnN0YW50LlRPS0VOX1NUQVRVUy5SRUZSRVNIX1RPS0VOX05PVF9DUkVBVEVEOyAgLy8gZmlyc3QgdGltZSBsb2FkaW5nIHNvIG5vIG5vdGlmeVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFN0b3JhZ2VUb2tlblN0YXR1cy5SRUZSRVNIX1RPS0VOX0FDVElWRTsgLy8gYXBwQ29uc3RhbnQuVE9LRU5fU1RBVFVTLlJFRlJFU0hfVE9LRU5fQUNUSVZFOyAvLyBub3QgZXhwaXJlZFxyXG4gIH1cclxuXHJcbiAgU2V0VXNlckluZm8odXNlcjogYW55KSB7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlVTRVJfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VyKSk7XHJcbiAgfVxyXG4gIEdldFVzZXJJbmZvKCkge1xyXG4gICAgY29uc3Qgb2JqOmFueSA9IEpTT04ucGFyc2UoPGFueT5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlVTRVJfS0VZKSk7XHJcbiAgICBpZihvYmogJiYgb2JqLnVzZXIpe1xyXG4gICAgICByZXR1cm4gb2JqLnVzZXJcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgfVxyXG4gIEdldFJvbGVMaXN0KCl7XHJcbiAgICBjb25zdCBvYmo6YW55ID0gSlNPTi5wYXJzZSg8YW55PmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVVNFUl9LRVkpKTtcclxuICAgIGlmKG9iaiAmJiBvYmoucm9sbExpc3Qpe1xyXG4gICAgICByZXR1cm4gb2JqLnJvbGxMaXN0XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXRBY3RpdmVSb2xlKHJvbGU6YW55KXtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUk9MRSwgSlNPTi5zdHJpbmdpZnkocm9sZSkpO1xyXG4gIH1cclxuICBnZXRBY3RpdmVSb2xlKCl7XHJcbiAgICBjb25zdCBvYmo6YW55ID0gSlNPTi5wYXJzZSg8YW55PmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuUk9MRSkpO1xyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcbiAgR2V0VXNlclJlZmVyZW5jZSgpIHtcclxuICAgIGxldCB1c2VyID0gdGhpcy5HZXRVc2VySW5mbygpO1xyXG4gICAgbGV0IHVzZXJSZWY6YW55ID0ge307XHJcbiAgICB1c2VyUmVmWydfaWQnXSA9IHVzZXJbJ19pZCddO1xyXG4gICAgdXNlclJlZlsnbmFtZSddID0gdXNlclsnbmFtZSddO1xyXG4gICAgcmV0dXJuIHVzZXJSZWY7XHJcbiAgfVxyXG4gIEdldFBlcm1pc3Npb24oKSB7XHJcbiAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKDxhbnk+bG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0tFWSkpO1xyXG4gICAgaWYob2JqICYmIG9iai5wZXJtaXNzaW9uKXtcclxuICAgICAgcmV0dXJuIG9iai5wZXJtaXNzaW9uXHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRNb2R1bGVzKCl7XHJcbiAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKDxhbnk+bG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0tFWSkpO1xyXG4gICAgaWYob2JqICYmIG9iai5tb2R1bGVzKXtcclxuICAgICAgcmV0dXJuIG9iai5tb2R1bGVzXHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIFNldE1vZGlmeU1vZHVsZXMobW9kdWxlczphbnkpe1xyXG4gIC8vICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5NT0RJRllfTU9EVUxFUyxKU09OLnN0cmluZ2lmeShtb2R1bGVzKSk7XHJcbiAgLy8gfVxyXG4gIC8vIEdldE1vZGlmeU1vZHVsZXMoKXtcclxuICAvLyAgIHJldHVybiBKU09OLnBhcnNlKDxhbnk+bG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5NT0RJRllfTU9EVUxFUykpO1xyXG4gIC8vIH1cclxuICBHZXRNZW51VHlwZSgpe1xyXG4gICAgY29uc3QgbWVudV9UeXBlID0gdGhpcy5nZXRBcHBsaWNhdGlvblZhbHVlQnlLZXkoJ21lbnVfdHlwZScpO1xyXG4gICAgaWYobWVudV9UeXBlKXtcclxuICAgICAgICByZXR1cm4gbWVudV9UeXBlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2V7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFVzZXJMb2coKSB7XHJcbiAgICBjb25zdCB1c2VyID0gSlNPTi5wYXJzZSg8YW55PmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVVNFUl9LRVkpKTtcclxuICAgIGlmKHVzZXIgJiYgdXNlciAhPSBudWxsICYmIHVzZXIgIT0gdW5kZWZpbmVkICYmIHVzZXIudXNlcil7XHJcbiAgICAgIHRoaXMudXNlckluZm8gPSB1c2VyLnVzZXI7XHJcbiAgICAgIHRoaXMubG9nID0geyB1c2VySWQ6IHRoaXMudXNlckluZm8uZW1haWwsIGFwcElkOiB0aGlzLmdldEFwcElkKCksIHJlZkNvZGU6IHRoaXMudXNlckluZm8ucmVmQ29kZSB9O1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2c7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFNldEFjdGl2ZU1lbnUobWVudTogYW55KSB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuQUNUSVZFX01FTlUsIEpTT04uc3RyaW5naWZ5KG1lbnUpKTtcclxuICB9XHJcbiAgR2V0QWN0aXZlTWVudSgpIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKDxhbnk+c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkFDVElWRV9NRU5VKSk7XHJcbiAgfVxyXG4gIGdldFJlZkNvZGUoKSB7XHJcbiAgICBjb25zdCB1c2VyaW5mbyA9IHRoaXMuR2V0VXNlckluZm8oKTtcclxuICAgIGlmKHVzZXJpbmZvICYmIHVzZXJpbmZvLnJlZkNvZGUpe1xyXG4gICAgICByZXR1cm4gdXNlcmluZm8ucmVmQ29kZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBnZXRVc2VyQXBwSWQoKXtcclxuICAgIHJldHVybiB0aGlzLnVzZXJJbmZvLmFwcElkO1xyXG4gIH1cclxuICByZW1vdmVEYXRhRm9ybVN0b3JhZ2UoYWxsPzpzdHJpbmcpIHtcclxuICAgIGxldCBkb05vdENsZWFyQ2FjaGU6YW55ID0gW107XHJcbiAgICBpZihhbGwgIT0gXCJhbGxcIil7XHJcbiAgICAgIGlmKHRoaXMuY2hlY2tQbGF0Rm9ybSgpID09ICdtb2JpbGUnKXtcclxuICAgICAgICBsZXQgY2xpZW50Q29kZSA9IHRoaXMuZ2V0Q2xpZW50TmFtZSgpO1xyXG4gICAgICAgIGlmKGNsaWVudENvZGUgJiYgY2xpZW50Q29kZSAhPSAnJyl7XHJcbiAgICAgICAgICBsZXQgb2JqZWN0OmFueSA9IHt9O1xyXG4gICAgICAgICAgb2JqZWN0WydrZXknXSA9IHRoaXMuQ0xJRU5UX05BTUU7XHJcbiAgICAgICAgICBvYmplY3RbXCJ2YWx1ZVwiXSA9IGNsaWVudENvZGU7XHJcbiAgICAgICAgICBvYmplY3RbJ3R5cGUnXSA9ICdsb2NhbHN0b3JhZ2UnXHJcbiAgICAgICAgICBkb05vdENsZWFyQ2FjaGUucHVzaChvYmplY3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgaWYoZG9Ob3RDbGVhckNhY2hlICYmIGRvTm90Q2xlYXJDYWNoZS5sZW5ndGggPiAwKXtcclxuICAgICAgZG9Ob3RDbGVhckNhY2hlLmZvckVhY2goKG9iajphbnkpID0+IHtcclxuICAgICAgICBpZihvYmogJiYgb2JqLnR5cGUgPT0gJ2xvY2Fsc3RvcmFnZScpe1xyXG4gICAgICAgICAgbGV0IGtleSA9IG9ialsna2V5J107XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpbJ3ZhbHVlJ107XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldElkVG9rZW5FeHBpcnkoKXtcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCBleHBpcnkgPSBOdW1iZXIodGhpcy5nZXRFeHBpcmVzSW4oKSk7XHJcbiAgICAvL2NvbnN0IGV4cGlyeSA9IHRoaXMuZ2V0RXhwaXJlc0luKCk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLklEX1RPS0VOX0VYUElSWV9USU1FLCBcIlwiKyhzdGFydFRpbWUgKyBleHBpcnkpKTtcclxuICB9XHJcblxyXG4gIHNldFJlZnJlc2hUb2tlbkV4cGlyeSgpe1xyXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTl9FWFBJUllfVElNRSwgc3RhcnRUaW1lICsgdGhpcy5yZWZyZXNoVG9rZW5BZ2UpO1xyXG4gIH1cclxuICBzZWFyY2godXJsOiBzdHJpbmcsIHRlcm06IHN0cmluZykge1xyXG4gICAgaWYgKHRlcm0gPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5nZXQodXJsICsgdGVybSkucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICBzZXRSZXNldE5ld1Bhc3N3b3JkU2Vzc2lvbihzZXNzaW9uOmFueSl7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnUkVTRVRfUEFTU19TRVNTSU9OJyxzZXNzaW9uKTtcclxuICB9XHJcbiAgZ2V0UmVzZXROZXdQYXNzd29yZFNlc3Npb24oKXtcclxuICAgIGNvbnN0IHNlc3Npb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnUkVTRVRfUEFTU19TRVNTSU9OJyk7XHJcbiAgICByZXR1cm4gc2Vzc2lvbjtcclxuICB9XHJcbiAgc2VhcmNoUG9zdE1ldGhvZCh1cmw6IHN0cmluZywgcGF5bG9hZDogYW55KSB7XHJcbiAgICBpZiAocGF5bG9hZCA9PT0gJycpIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3QodXJsLCBwYXlsb2FkKS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8vIHNldFBhY2thZ2luZyhjYXJ0RGF0YTphbnkpIHtcclxuICAvLyAgIHN3aXRjaCAoY2FydERhdGEudHlwZSkge1xyXG4gIC8vICAgICBjYXNlICdUQUInOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgc3RyaXAgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBUYWJsZXRzIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnU3RyaXAocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdTWVAnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgU3lydXAgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdCb3R0bGUocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdMT1QnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgTG90aW9uIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnSU5KJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFZpYWwgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBJbmplY3Rpb24gRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdWaWFsKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnUE9XRCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBCb3ggKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQb3dkZXIgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdCb3goZXMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnQ0FQJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIHN0cmlwICgnICsgY2FydERhdGEucGFja2luZyArICcgQ2Fwc3VsZSBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1N0cmlwKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnU0FDSCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrZXQgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBTYWNoZXQgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdJTkgnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm94ICgnICsgY2FydERhdGEucGFja2luZyArICcgSW5oYWxlciBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ0JveChlcyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdST1RPJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIEJveCAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFJlZGljYXBzIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm94KGVzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ0UvRFInOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFja2V0ICgnICsgY2FydERhdGEucGFja2luZyArICcgRXllIERyb3AgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdFRFJQJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2tldCAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIEV5ZSBEcm9wIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnT0lOVCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBUdWJlICgnICsgY2FydERhdGEucGFja2luZyArICcgT2ludG1lbnQgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdUdWJlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnT0lMJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIEJvdHRsZSAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIEJvdHRsZSBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ0JvdHRsZShzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ1NPQVAnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnRldTSCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2socyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdEUlAnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnSkVMWSc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrZXQgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBKZWxseSBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ0NSRU0nOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgVHViZSAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIENyZWFtIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnQ1JURyc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBCb3R0bGUgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBCb3R0bGUgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdDT05FUic6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ0NIUk4nOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdGTE9TJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2sgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYWNrIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnRElBUCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ0RSRVMnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdEUk5LJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOjEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIGVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnRFNZUCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBCb3R0bGUgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBCb3R0bGUgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdCb3R0bGUocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdEUE8nOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdFTk0nOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdFWFAnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnRU9JTlQnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgVHViZSAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIE9pbnRtZW50IEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnVHViZShzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ0dFTCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBUdWJlICgnICsgY2FydERhdGEucGFja2luZyArICcgR2VsIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnR2VsKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnR1JHTCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBCb3R0bGUgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBCb3R0bGUgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdCb3R0bGUocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdHTVRSJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2sgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYWNrIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnSEFJU0VSJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIEJvdHRsZSAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIEJvdHRsZSBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ0JvdHRsZShzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ0hXU0gnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnSU5GTic6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ1ZXQVNIJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2sgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYWNrIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnSkFSJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2sgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYWNrIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnSlVJQyc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ0tJVCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgS2l0IEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnTEJBTE0nOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdMUUQnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnTVBOVCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ01XU0gnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnTkRSUCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ05JUExFJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2sgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYWNrIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnT0RSUFMnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnUEtUJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2sgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYWNrIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnUEZTJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFN5cmluZ2UgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBTeXJpbmdlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnU3lyaW5nZShzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ1JQU0xTJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFJlc3B1bGUgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBSZXNwdWxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUmVzcHVsZShzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ1JPTEwnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdTQUNIJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFBhY2sgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYWNrIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnU0NSVUInOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdTSEFNUCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBCb3R0bGUgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBCb3R0bGUgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdCb3R0bGUocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdTTFROJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIEJvdHRsZSAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIEJvdHRsZSBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ0JvdHRsZShzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ1NQUlknOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnVFBBU1QnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFzdGUgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBQYXN0ZSBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1Bhc3RlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnVkFDQyc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBWYWNjaW5lICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1Bhc3RlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnVlRBQic6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBUYWJsZXQgKCcgKyBjYXJ0RGF0YS5wYWNraW5nICsgJyBUYWJsZXQgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdUYWJsZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdXSVBTJzogdGhpcy5wYWNrRGV0YWlscy5wYWNraW5nID0gJ1BhY2tpbmcgOiAxIFdpcGVzICgnICsgY2FydERhdGEucGFja2luZyArICcgV2lwZXMgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdXaXBlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnVFVMTCc6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBQYWNrICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBFYWNoKSc7XHJcbiAgLy8gICAgICAgdGhpcy5wYWNrRGV0YWlscy51bml0ID0gJ1BhY2tldChzKSc7XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgJ1RCQUcnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFBhY2sgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdQYWNrZXQocyknO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlICdTWVJORUUnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgUGFjayBTeXJpbmdlICgnICsgY2FydERhdGEucGFja2luZyArICcgUGFjayBTeXJpbmdlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnUGFja2V0KHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnTlNQUlknOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSAnUk1TUlAnOiB0aGlzLnBhY2tEZXRhaWxzLnBhY2tpbmcgPSAnUGFja2luZyA6IDEgQm90dGxlICgnICsgY2FydERhdGEucGFja2luZyArICcgQm90dGxlIEVhY2gpJztcclxuICAvLyAgICAgICB0aGlzLnBhY2tEZXRhaWxzLnVuaXQgPSAnQm90dGxlKHMpJztcclxuICAvLyAgICAgICBicmVhaztcclxuXHJcbiAgLy8gICAgIGRlZmF1bHQ6IHRoaXMucGFja0RldGFpbHMucGFja2luZyA9ICdQYWNraW5nIDogMSBzdHJpcCAoJyArIGNhcnREYXRhLnBhY2tpbmcgKyAnIFRhYmxldHMgRWFjaCknO1xyXG4gIC8vICAgICAgIHRoaXMucGFja0RldGFpbHMudW5pdCA9ICdTdHJpcChzKSc7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdGhpcy5wYWNrRGV0YWlscztcclxuICAvLyB9XHJcblxyXG4gIHNldEhvc3ROYW1lRGluYW1pY2FsbHkoaG9zdDpzdHJpbmcpe1xyXG4gICAgbGV0IGRvbWFpbk5hbWUgPSB0aGlzLmRvY3VtZW50LmxvY2F0aW9uWydob3N0bmFtZSddO1xyXG5cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuSE9TVF9OQU1FLCBob3N0KTtcclxuICAgIGlmKGRvbWFpbk5hbWUhPVwibG9jYWxob3N0XCIgJiYgdGhpcy5jb29raWVzU2VydmljZS5pc0Nvb2tpZUV4cGlyZWQoZG9tYWluTmFtZSkpe1xyXG4gICAgICB0aGlzLmNvb2tpZXNTZXJ2aWNlLnNldENvb2tpZUJ5TmFtZShkb21haW5OYW1lLGhvc3QsMzApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SG9zdE5hbWVEaW5hbWljYWxseSgpe1xyXG4gICAgbGV0IGhvc3QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkhPU1RfTkFNRSk7XHJcbiAgICBpZih0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhob3N0KSl7XHJcbiAgICAgIHJldHVybiBob3N0O1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGxldCBkb21haW5OYW1lID0gdGhpcy5kb2N1bWVudC5sb2NhdGlvblsnaG9zdG5hbWUnXTtcclxuXHJcbiAgICAgIGhvc3QgPSB0aGlzLmNvb2tpZXNTZXJ2aWNlLmdldENvb2tpZUJ5TmFtZShkb21haW5OYW1lKTtcclxuICAgICAgaWYgKGhvc3QgJiYgaG9zdCAhPVwiXCIpIHRoaXMuc2V0SG9zdE5hbWVEaW5hbWljYWxseShob3N0KTtcclxuICAgICAgcmV0dXJuIGhvc3Q7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldExvZ29QYXRoKCl7XHJcbiAgICBsZXQgcHJvamVjdEZvbGRlck5hbWUgPSB0aGlzLmdldEFwcGxpY2F0aW9uVmFsdWVCeUtleSgnZm9sZGVyJylcclxuICAgIHJldHVybiAnYXNzZXRzL2ltZy9sb2dvLycgKyBwcm9qZWN0Rm9sZGVyTmFtZSArICcvJztcclxuICB9XHJcbiAgZ2V0UGFnZVRpdGxlKCl7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBcHBsaWNhdGlvblZhbHVlQnlLZXkoJ3RpdGxlJyk7XHJcbiAgfVxyXG4gIGdldFZlcmlmeVR5cGUoKXtcclxuICAgIHJldHVybiB0aGlzLmdldEFwcGxpY2F0aW9uVmFsdWVCeUtleSgndmFyaWZ5X21vZGUnKTtcclxuICB9XHJcbiAgZ2V0UGFnZVRobWVtKCl7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBcHBsaWNhdGlvblZhbHVlQnlLZXkoJ3RoZW1lJyk7XHJcbiAgfVxyXG4gIGdldFRlbXBsYXRlTmFtZSgpe1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QXBwbGljYXRpb25WYWx1ZUJ5S2V5KCd0ZW1wX25hbWUnKTtcclxuICB9XHJcbiAgZ2V0VGVhbU5hbWUoKXtcclxuICAgIHJldHVybiB0aGlzLmdldEFwcGxpY2F0aW9uVmFsdWVCeUtleSgndGVhbW5hbWUnKTtcclxuICB9XHJcblxyXG4gIGdldEJ1Y2tldE5hbWUoKXtcclxuICAgIHJldHVybiB0aGlzLmdldEFwcGxpY2F0aW9uVmFsdWVCeUtleSgnYnVja2V0Jyk7XHJcbiAgfVxyXG4gIGdldEF1dGhlbnRpY2F0aW9uU2V0dGluZygpe1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QXBwbGljYXRpb25WYWx1ZUJ5S2V5KCdhdXRoZW50aWNhdGlvblNldHRpbmdzJyk7XHJcbiAgfVxyXG4gIGdldEFkbWluRW1haWwoKXtcclxuICAgIGxldCBhdXRoZW50aWNhdGlvblNldHRpbmdzOmFueSA9IHRoaXMuZ2V0QXV0aGVudGljYXRpb25TZXR0aW5nKCk7XHJcbiAgICBsZXQgYWRtaW5FbWFpbCA9IFwiXCI7XHJcbiAgICBpZihhdXRoZW50aWNhdGlvblNldHRpbmdzICYmIGF1dGhlbnRpY2F0aW9uU2V0dGluZ3NbJ2FkbWluRW1haWxJZCddICYmIGF1dGhlbnRpY2F0aW9uU2V0dGluZ3NbJ2FkbWluRW1haWxJZCddICE9IFwiXCIpe1xyXG4gICAgICBhZG1pbkVtYWlsID0gYXV0aGVudGljYXRpb25TZXR0aW5nc1snYWRtaW5FbWFpbElkJ107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWRtaW5FbWFpbDtcclxuICB9XHJcbiAgZ2V0QXBwbGljYXRpb25WYWx1ZUJ5S2V5KGtleTphbnkpe1xyXG4gICAgbGV0IHZhbHVlOmFueSA9IFwiXCI7XHJcbiAgICBsZXQgYXBwbGljYXRpb25TZXR0aW5nID0gdGhpcy5nZXRBcHBsaWNhdGlvblNldHRpbmcoKTtcclxuICAgIGlmKGFwcGxpY2F0aW9uU2V0dGluZyAmJiBhcHBsaWNhdGlvblNldHRpbmdba2V5XSAhPSB1bmRlZmluZWQgJiYgYXBwbGljYXRpb25TZXR0aW5nW2tleV0gIT0gbnVsbCAmJiBhcHBsaWNhdGlvblNldHRpbmdba2V5XSAhPSBcIlwiKXtcclxuICAgICAgdmFsdWUgPSBhcHBsaWNhdGlvblNldHRpbmdba2V5XTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcbiAgLy8gZm9yIEFwcFxyXG4gIHNldENsaWVudE5BbWUobmFtZTpzdHJpbmcpe1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DTElFTlRfTkFNRSxuYW1lKTtcclxuICB9XHJcbiAgZ2V0Q2xpZW50TmFtZSgpe1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0xJRU5UX05BTUUpO1xyXG4gIH1cclxuICByZW1vdmVLZXlGcm9tU3RvcmFnZShrZXk6c3RyaW5nKXtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgfVxyXG4gIGdldFBsYXRmb3JtKCl7XHJcbiAgICByZXR1cm4gdGhpcy5lbnYucGxhdGVmb3JtTmFtZTtcclxuICB9XHJcbiAgZ2V0Q2xpZW50Q29kZUVudmlvcm1lbnQoKXtcclxuICAgIHJldHVybiB0aGlzLmVudjtcclxuICB9XHJcbiAgY2hlY2tQbGF0Rm9ybSgpe1xyXG4gICAgbGV0IHBsYXRGb3JtID0gJ3dlYic7XHJcbiAgICBsZXQgcGxhdEZvcm1OYW1lID0gdGhpcy5nZXRQbGF0Zm9ybSgpO1xyXG4gICAgaWYocGxhdEZvcm1OYW1lICYmIHBsYXRGb3JtTmFtZSAhPSBcIlwiICYmIFBMQVRGT1JNX05BTUUuaW5jbHVkZXMocGxhdEZvcm1OYW1lKSl7XHJcbiAgICAgIHBsYXRGb3JtID0gJ21vYmlsZSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGxhdEZvcm07XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0TnVtT2ZJdGVtKCkge1xyXG4gICAgbGV0IGl0ZW1OdW1PZkdyaWQgPSBDb21tb24uSVRFTV9OVU1fT0ZfR1JJRDtcclxuICAgIGxldCBkZWZhdWx0U2V0dGluZ3MgPSB0aGlzLmdldEFwcGxpY2F0aW9uRGVmYXVsdFNldHRpbmdzKCk7XHJcbiAgICBpZihkZWZhdWx0U2V0dGluZ3MgJiYgZGVmYXVsdFNldHRpbmdzLmRlZmF1bHRJdGVtTm9PZkdyaWQgJiYgZGVmYXVsdFNldHRpbmdzLmRlZmF1bHRJdGVtTm9PZkdyaWQgIT0gXCJcIiAmJiBkZWZhdWx0U2V0dGluZ3MuZGVmYXVsdEl0ZW1Ob09mR3JpZCA+IDApIHtcclxuICAgICAgaXRlbU51bU9mR3JpZCA9IGRlZmF1bHRTZXR0aW5ncy5kZWZhdWx0SXRlbU5vT2ZHcmlkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW1OdW1PZkdyaWRcclxuICB9XHJcblxyXG4gIGdldEFwcGxpY2F0aW9uRGVmYXVsdFNldHRpbmdzKCl7XHJcbiAgICBsZXQgYXBwbGljYXRpb25TZXR0aW5nID0gdGhpcy5nZXRBcHBsaWNhdGlvblNldHRpbmcoKTtcclxuICAgIHJldHVybiBhcHBsaWNhdGlvblNldHRpbmcuZGVmYXVsdEFwcGxpY2F0aW9uU2V0dGluZ3M7XHJcbiAgfVxyXG4gIGdldEFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25TZXR0aW5ncygpe1xyXG4gICAgbGV0IGFwcGxpY2F0aW9uU2V0dGluZyA9IHRoaXMuZ2V0QXBwbGljYXRpb25TZXR0aW5nKCk7XHJcbiAgICBpZihhcHBsaWNhdGlvblNldHRpbmcgJiYgYXBwbGljYXRpb25TZXR0aW5nLmF1dGhlbnRpY2F0aW9uU2V0dGluZ3Mpe1xyXG4gICAgICByZXR1cm4gYXBwbGljYXRpb25TZXR0aW5nLmF1dGhlbnRpY2F0aW9uU2V0dGluZ3M7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBnZXRUd29GYWN0b3JBdXRoZW50aWNhdGlvblR5cGUoKXtcclxuICAgIGxldCBhdXRoZW50aWNhdGlvblNldHRpbmcgPSB0aGlzLmdldEFwcGxpY2F0aW9uQXV0aGVudGljYXRpb25TZXR0aW5ncygpO1xyXG4gICAgaWYoYXV0aGVudGljYXRpb25TZXR0aW5nICYmIGF1dGhlbnRpY2F0aW9uU2V0dGluZy50d29GYWN0b3JBdXRoZW50aWNhdGlvbiAmJiBhdXRoZW50aWNhdGlvblNldHRpbmcudHdvRmFjdG9yQXV0aGVudGljYXRpb25UeXBlKXtcclxuICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uU2V0dGluZy50d29GYWN0b3JBdXRoZW50aWNhdGlvblR5cGU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0RGVmYXVsdFNlYXJjaE9wZXJhdG9yKCkge1xyXG4gICAgbGV0IGRlZmF1bHRTZWFyY2hPcGVyYXRvciA9IENvbW1vbi5ERUZBVUxUX09QRVJBVE9SO1xyXG4gICAgbGV0IGRlZmF1bHRTZXR0aW5ncyA9IHRoaXMuZ2V0QXBwbGljYXRpb25EZWZhdWx0U2V0dGluZ3MoKTtcclxuICAgIGlmKGRlZmF1bHRTZXR0aW5ncyAmJiBkZWZhdWx0U2V0dGluZ3MuZGVmYXVsdFNlYXJjaE9wZXJhdG9ySW5HcmlkICYmIGRlZmF1bHRTZXR0aW5ncy5kZWZhdWx0U2VhcmNoT3BlcmF0b3JJbkdyaWQgIT0gXCJcIikge1xyXG4gICAgICBkZWZhdWx0U2VhcmNoT3BlcmF0b3IgPSBkZWZhdWx0U2V0dGluZ3MuZGVmYXVsdFNlYXJjaE9wZXJhdG9ySW5HcmlkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRlZmF1bHRTZWFyY2hPcGVyYXRvcjtcclxuICB9XHJcbiAgc3RvcmVBbGxUZW1wbGF0ZShkYXRhOmFueSl7XHJcbiAgICAvLyBsZXQgZW5jcnlwdERhdGEgPSB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRSZXF1ZXN0KGRhdGEpO1xyXG4gICAgLy8gY29uc29sZS5sb2coZW5jcnlwdERhdGEpO1xyXG4gICAgbGV0IG1vZGlmaWVkTGlzdCA9IHRoaXMubW9kaWZ5VGVtcGxhdGVMaXN0KGRhdGEpO1xyXG4gICAgaWYobW9kaWZpZWRMaXN0KXtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5BTExfVEVNUExBVEUsSlNPTi5zdHJpbmdpZnkobW9kaWZpZWRMaXN0LnRlbXBsYXRMaXN0KSk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVEVNUExBVEVfSU5ERVgsSlNPTi5zdHJpbmdpZnkobW9kaWZpZWRMaXN0LnRlbXBsYXRlSW5kZXhMaXN0KSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG1vZGlmeVRlbXBsYXRlTGlzdChvYmo6YW55KXtcclxuICAgIGxldCBsaXN0OmFueSA9IHt9O1xyXG4gICAgbGV0IGluZGV4TGlzdDphbnkgPSBbXTtcclxuICAgIGxldCBvbGRMaXN0ID0gdGhpcy5nZXRBbGxUZW1wbGF0ZUxpc3QoKTtcclxuICAgIGxldCBhbGxJbmRleExpc3QgPSBKU09OLnBhcnNlKDxhbnk+bG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5URU1QTEFURV9JTkRFWCkpO1xyXG4gICAgaWYoYWxsSW5kZXhMaXN0ICYmIGFsbEluZGV4TGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgaW5kZXhMaXN0ID0gYWxsSW5kZXhMaXN0O1xyXG4gICAgfVxyXG4gICAgaWYob2xkTGlzdCAmJiBPYmplY3Qua2V5cyhvbGRMaXN0KS5sZW5ndGggPiAwKXtcclxuICAgICAgbGV0IHNpemU6bnVtYmVyID0gdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmdldEpzb25TaXplSW5LaWxvYnl0ZShvbGRMaXN0KTtcclxuICAgICAgLy8gY29uc29sZS5sb2coc2l6ZSk7XHJcbiAgICAgIGlmKHNpemUgPj0gMTAyNCl7XHJcbiAgICAgICAgbGV0IGtleU5hbWUgPSBpbmRleExpc3RbMF07XHJcbiAgICAgICAgZGVsZXRlIChvbGRMaXN0W2tleU5hbWVdKTtcclxuICAgICAgICBpbmRleExpc3Quc3BsaWNlKDAsMSk7XHJcbiAgICAgIH1cclxuICAgICAgbGlzdCA9IG9sZExpc3Q7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgbGlzdCA9IHt9O1xyXG4gICAgfVxyXG4gICAgaWYob2JqICYmIG9iail7XHJcbiAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIGxpc3Rba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIGluZGV4TGlzdC5wdXNoKGtleSk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBsZXQgcmVzcG9uY2UgPSB7XHJcbiAgICAgIHRlbXBsYXRMaXN0IDogbGlzdCxcclxuICAgICAgdGVtcGxhdGVJbmRleExpc3Q6aW5kZXhMaXN0XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uY2U7XHJcbiAgfVxyXG4gIGdldEFsbFRlbXBsYXRlTGlzdCgpe1xyXG4gICAgLy9sZXQgYWxsVGVtcGxhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkFMTF9URU1QTEFURSk7XHJcbiAgICBjb25zdCBvYmo6YW55ID0gSlNPTi5wYXJzZSg8YW55PmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQUxMX1RFTVBMQVRFKSk7XHJcbiAgICAvL3JldHVybiB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHRSZXF1ZXN0KGFsbFRlbXBsYXRlKTtcclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG4gIGdldFRlbXBsYXRlKHRlbXBOYW1lOnN0cmluZyxtb2R1bGVOYW1lOnN0cmluZyl7XHJcbiAgICBsZXQgdGVtcGxhdGVMaXN0OmFueSA9IHRoaXMuZ2V0QWxsVGVtcGxhdGVMaXN0KCk7XHJcbiAgICBsZXQgbmFtZSA9IG1vZHVsZU5hbWUrXCJfXCIrdGVtcE5hbWU7XHJcbiAgICBpZih0ZW1wbGF0ZUxpc3QgJiYgdGVtcGxhdGVMaXN0W25hbWVdKXtcclxuICAgICAgcmV0dXJuIHRlbXBsYXRlTGlzdFtuYW1lXTtcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbiAgU2V0VGFiQ291bnRzKHRhYkNvdW50czogYW55KSB7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlRBQl9DT1VOVFMsIEpTT04uc3RyaW5naWZ5KHRhYkNvdW50cykpO1xyXG4gIH1cclxuICBHZXRUYWJDb3VudHMoKSB7XHJcbiAgICBsZXQgY291bnRzID0gSlNPTi5wYXJzZSg8YW55PmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVEFCX0NPVU5UUykpO1xyXG4gICAgaWYoY291bnRzKXtcclxuICAgICAgcmV0dXJuIGNvdW50cztcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=