@stemy/ngx-utils 11.0.8 → 11.1.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 (94) hide show
  1. package/README.md +27 -27
  2. package/bundles/stemy-ngx-utils.umd.js +22 -7
  3. package/bundles/stemy-ngx-utils.umd.js.map +1 -1
  4. package/bundles/stemy-ngx-utils.umd.min.js +1 -1
  5. package/bundles/stemy-ngx-utils.umd.min.js.map +1 -1
  6. package/esm2015/ngx-utils/common-types.js +2 -1
  7. package/esm2015/ngx-utils/ngx-utils.module.js +6 -2
  8. package/esm2015/ngx-utils/services/config.service.js +8 -4
  9. package/esm2015/ngx-utils/services/promise.service.js +4 -1
  10. package/esm2015/ngx-utils/services/static-language.service.js +9 -7
  11. package/esm2015/ngx-utils/utils/unique.utils.js +1 -1
  12. package/esm2015/public_api.js +2 -2
  13. package/fesm2015/stemy-ngx-utils.js +22 -8
  14. package/fesm2015/stemy-ngx-utils.js.map +1 -1
  15. package/ngx-utils/common-types.d.ts +2 -0
  16. package/ngx-utils/services/config.service.d.ts +3 -1
  17. package/ngx-utils/services/promise.service.d.ts +5 -4
  18. package/ngx-utils/services/static-language.service.d.ts +3 -2
  19. package/package.json +1 -1
  20. package/public_api.d.ts +1 -1
  21. package/stemy-ngx-utils.metadata.json +1 -1
  22. package/esm5/ngx-utils/common-types.js +0 -553
  23. package/esm5/ngx-utils/components/dynamic-table/dynamic-table.component.js +0 -285
  24. package/esm5/ngx-utils/components/pagination-menu/pagination-menu.component.js +0 -198
  25. package/esm5/ngx-utils/components/unordered-list/unordered-list.component.js +0 -110
  26. package/esm5/ngx-utils/directives/async-method.directive.js +0 -105
  27. package/esm5/ngx-utils/directives/background.directive.js +0 -91
  28. package/esm5/ngx-utils/directives/dynamic-table-template.directive.js +0 -34
  29. package/esm5/ngx-utils/directives/icon.directive.js +0 -101
  30. package/esm5/ngx-utils/directives/ngx-template-outlet.directive.js +0 -182
  31. package/esm5/ngx-utils/directives/pagination-item.directive.js +0 -70
  32. package/esm5/ngx-utils/directives/pagination.directive.js +0 -148
  33. package/esm5/ngx-utils/directives/resource-if.directive.js +0 -97
  34. package/esm5/ngx-utils/directives/sticky.directive.js +0 -93
  35. package/esm5/ngx-utils/directives/unordered-list-item.directive.js +0 -143
  36. package/esm5/ngx-utils/directives/unordered-list-template.directive.js +0 -54
  37. package/esm5/ngx-utils/ngx-utils.module.js +0 -205
  38. package/esm5/ngx-utils/pipes/chunk.pipe.js +0 -41
  39. package/esm5/ngx-utils/pipes/entries.pipe.js +0 -54
  40. package/esm5/ngx-utils/pipes/extra-item-properties.pipe.js +0 -51
  41. package/esm5/ngx-utils/pipes/filter.pipe.js +0 -65
  42. package/esm5/ngx-utils/pipes/find.pipe.js +0 -51
  43. package/esm5/ngx-utils/pipes/format-number.pipe.js +0 -44
  44. package/esm5/ngx-utils/pipes/get-offset.pipe.js +0 -31
  45. package/esm5/ngx-utils/pipes/get-type.pipe.js +0 -28
  46. package/esm5/ngx-utils/pipes/group-by.pipe.js +0 -48
  47. package/esm5/ngx-utils/pipes/is-type.pipe.js +0 -30
  48. package/esm5/ngx-utils/pipes/join.pipe.js +0 -34
  49. package/esm5/ngx-utils/pipes/keys.pipe.js +0 -35
  50. package/esm5/ngx-utils/pipes/map.pipe.js +0 -52
  51. package/esm5/ngx-utils/pipes/max.pipe.js +0 -45
  52. package/esm5/ngx-utils/pipes/min.pipe.js +0 -45
  53. package/esm5/ngx-utils/pipes/reduce.pipe.js +0 -55
  54. package/esm5/ngx-utils/pipes/remap.pipe.js +0 -51
  55. package/esm5/ngx-utils/pipes/replace.pipe.js +0 -32
  56. package/esm5/ngx-utils/pipes/reverse.pipe.js +0 -38
  57. package/esm5/ngx-utils/pipes/round.pipe.js +0 -44
  58. package/esm5/ngx-utils/pipes/safe-html.pipe.js +0 -54
  59. package/esm5/ngx-utils/pipes/translate.pipe.js +0 -111
  60. package/esm5/ngx-utils/pipes/values.pipe.js +0 -35
  61. package/esm5/ngx-utils/plugins/resize-event.plugin.js +0 -122
  62. package/esm5/ngx-utils/plugins/scroll-event.plugin.js +0 -110
  63. package/esm5/ngx-utils/services/acl.service.js +0 -119
  64. package/esm5/ngx-utils/services/auth.service.js +0 -40
  65. package/esm5/ngx-utils/services/events.service.js +0 -33
  66. package/esm5/ngx-utils/services/formatter.service.js +0 -124
  67. package/esm5/ngx-utils/services/icon.service.js +0 -32
  68. package/esm5/ngx-utils/services/language.service.js +0 -199
  69. package/esm5/ngx-utils/services/promise.service.js +0 -123
  70. package/esm5/ngx-utils/services/state.service.js +0 -271
  71. package/esm5/ngx-utils/services/storage.service.js +0 -100
  72. package/esm5/ngx-utils/services/toaster.service.js +0 -100
  73. package/esm5/ngx-utils/services/universal.service.js +0 -153
  74. package/esm5/ngx-utils/utils/ajax-request-handler.js +0 -73
  75. package/esm5/ngx-utils/utils/array.utils.js +0 -182
  76. package/esm5/ngx-utils/utils/auth.guard.js +0 -205
  77. package/esm5/ngx-utils/utils/canvas.utils.js +0 -668
  78. package/esm5/ngx-utils/utils/date.utils.js +0 -91
  79. package/esm5/ngx-utils/utils/file.utils.js +0 -201
  80. package/esm5/ngx-utils/utils/loader.utils.js +0 -90
  81. package/esm5/ngx-utils/utils/math.utils.js +0 -62
  82. package/esm5/ngx-utils/utils/object.utils.js +0 -513
  83. package/esm5/ngx-utils/utils/observable.utils.js +0 -30
  84. package/esm5/ngx-utils/utils/reflect.utils.js +0 -95
  85. package/esm5/ngx-utils/utils/set.utils.js +0 -48
  86. package/esm5/ngx-utils/utils/string.utils.js +0 -94
  87. package/esm5/ngx-utils/utils/timer.utils.js +0 -100
  88. package/esm5/ngx-utils/utils/unique.utils.js +0 -54
  89. package/esm5/ngx-utils/utils/vector.js +0 -223
  90. package/esm5/public_api.js +0 -73
  91. package/esm5/stemy-ngx-utils.js +0 -11
  92. package/fesm5/stemy-ngx-utils.js +0 -6709
  93. package/fesm5/stemy-ngx-utils.js.map +0 -1
  94. package/typings.d.ts +0 -5
@@ -1,553 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { InjectionToken, TemplateRef } from "@angular/core";
7
- import { ReflectUtils } from "./utils/reflect.utils";
8
- import { ObjectUtils } from "./utils/object.utils";
9
- /**
10
- * @record
11
- */
12
- export function IResolveFactory() { }
13
- if (false) {
14
- /** @type {?} */
15
- IResolveFactory.prototype.func;
16
- /** @type {?|undefined} */
17
- IResolveFactory.prototype.type;
18
- /** @type {?|undefined} */
19
- IResolveFactory.prototype.params;
20
- }
21
- var CanvasColor = /** @class */ (function () {
22
- function CanvasColor(r, g, b, a) {
23
- if (a === void 0) { a = 255; }
24
- this.r = r;
25
- this.g = g;
26
- this.b = b;
27
- this.a = a;
28
- }
29
- return CanvasColor;
30
- }());
31
- export { CanvasColor };
32
- if (false) {
33
- /** @type {?} */
34
- CanvasColor.prototype.r;
35
- /** @type {?} */
36
- CanvasColor.prototype.g;
37
- /** @type {?} */
38
- CanvasColor.prototype.b;
39
- /** @type {?} */
40
- CanvasColor.prototype.a;
41
- }
42
- /**
43
- * @record
44
- */
45
- export function IIconService() { }
46
- if (false) {
47
- /**
48
- * @param {?} icon
49
- * @param {?} activeIcon
50
- * @param {?} active
51
- * @return {?}
52
- */
53
- IIconService.prototype.getIcon = function (icon, activeIcon, active) { };
54
- }
55
- /** @type {?} */
56
- export var ICON_SERVICE = new InjectionToken("icon-service");
57
- /**
58
- * @record
59
- */
60
- export function ITranslation() { }
61
- if (false) {
62
- /** @type {?} */
63
- ITranslation.prototype.lang;
64
- /** @type {?} */
65
- ITranslation.prototype.translation;
66
- }
67
- /**
68
- * @record
69
- */
70
- export function ITranslations() { }
71
- /**
72
- * @record
73
- */
74
- export function ILanguageService() { }
75
- if (false) {
76
- /** @type {?} */
77
- ILanguageService.prototype.currentLanguage;
78
- /** @type {?} */
79
- ILanguageService.prototype.editLanguage;
80
- /** @type {?} */
81
- ILanguageService.prototype.defaultLanguage;
82
- /** @type {?} */
83
- ILanguageService.prototype.dictionary;
84
- /**
85
- * @param {?} languages
86
- * @return {?}
87
- */
88
- ILanguageService.prototype.addLanguages = function (languages) { };
89
- /**
90
- * @param {?} key
91
- * @param {?=} params
92
- * @return {?}
93
- */
94
- ILanguageService.prototype.getTranslation = function (key, params) { };
95
- /**
96
- * @param {...?} keys
97
- * @return {?}
98
- */
99
- ILanguageService.prototype.getTranslations = function (keys) { };
100
- /**
101
- * @param {?} translations
102
- * @param {?=} params
103
- * @param {?=} lang
104
- * @return {?}
105
- */
106
- ILanguageService.prototype.getTranslationFromObject = function (translations, params, lang) { };
107
- /**
108
- * @param {?} translations
109
- * @param {?=} params
110
- * @param {?=} lang
111
- * @return {?}
112
- */
113
- ILanguageService.prototype.getTranslationFromArray = function (translations, params, lang) { };
114
- }
115
- /** @type {?} */
116
- export var LANGUAGE_SERVICE = new InjectionToken("language-service");
117
- /**
118
- * @record
119
- */
120
- export function IAuthService() { }
121
- if (false) {
122
- /** @type {?} */
123
- IAuthService.prototype.isAuthenticated;
124
- /** @type {?} */
125
- IAuthService.prototype.userChanged;
126
- /**
127
- * @return {?}
128
- */
129
- IAuthService.prototype.checkAuthenticated = function () { };
130
- }
131
- /**
132
- * @record
133
- */
134
- export function IRouteData() { }
135
- if (false) {
136
- /** @type {?|undefined} */
137
- IRouteData.prototype.returnState;
138
- /** @type {?|undefined} */
139
- IRouteData.prototype.guards;
140
- }
141
- /**
142
- * @record
143
- */
144
- export function IRoute() { }
145
- if (false) {
146
- /** @type {?|undefined} */
147
- IRoute.prototype.data;
148
- }
149
- /** @type {?} */
150
- export var AUTH_SERVICE = new InjectionToken("auth-service");
151
- /**
152
- * @record
153
- */
154
- export function IAclComponent() { }
155
- if (false) {
156
- /**
157
- * @return {?}
158
- */
159
- IAclComponent.prototype.onUserInitialized = function () { };
160
- /**
161
- * @return {?}
162
- */
163
- IAclComponent.prototype.onUserChanged = function () { };
164
- }
165
- /**
166
- * @record
167
- */
168
- export function IRouteStateInfo() { }
169
- if (false) {
170
- /** @type {?} */
171
- IRouteStateInfo.prototype.route;
172
- /** @type {?} */
173
- IRouteStateInfo.prototype.component;
174
- /** @type {?} */
175
- IRouteStateInfo.prototype.guard;
176
- /** @type {?} */
177
- IRouteStateInfo.prototype.dirty;
178
- /** @type {?} */
179
- IRouteStateInfo.prototype.first;
180
- }
181
- /** @enum {number} */
182
- var StorageMode = {
183
- Local: 0,
184
- Session: 1,
185
- };
186
- export { StorageMode };
187
- StorageMode[StorageMode.Local] = 'Local';
188
- StorageMode[StorageMode.Session] = 'Session';
189
- /**
190
- * @record
191
- */
192
- export function IToasterService() { }
193
- if (false) {
194
- /**
195
- * @param {?} message
196
- * @param {?=} params
197
- * @param {?=} title
198
- * @return {?}
199
- */
200
- IToasterService.prototype.error = function (message, params, title) { };
201
- /**
202
- * @param {?} message
203
- * @param {?=} params
204
- * @param {?=} title
205
- * @return {?}
206
- */
207
- IToasterService.prototype.info = function (message, params, title) { };
208
- /**
209
- * @param {?} message
210
- * @param {?=} params
211
- * @param {?=} title
212
- * @return {?}
213
- */
214
- IToasterService.prototype.success = function (message, params, title) { };
215
- /**
216
- * @param {?} message
217
- * @param {?=} params
218
- * @param {?=} title
219
- * @return {?}
220
- */
221
- IToasterService.prototype.warning = function (message, params, title) { };
222
- }
223
- /** @type {?} */
224
- export var TOASTER_SERVICE = new InjectionToken("toaster-service");
225
- /**
226
- * @record
227
- */
228
- export function IPromiseService() { }
229
- if (false) {
230
- /** @type {?} */
231
- IPromiseService.prototype.zone;
232
- /** @type {?} */
233
- IPromiseService.prototype.count;
234
- /** @type {?} */
235
- IPromiseService.prototype.onChanged;
236
- /**
237
- * @template T
238
- * @param {?} executor
239
- * @return {?}
240
- */
241
- IPromiseService.prototype.create = function (executor) { };
242
- /**
243
- * @param {?} promises
244
- * @return {?}
245
- */
246
- IPromiseService.prototype.all = function (promises) { };
247
- /**
248
- * @template T
249
- * @param {?} value
250
- * @return {?}
251
- */
252
- IPromiseService.prototype.resolve = function (value) { };
253
- }
254
- /** @type {?} */
255
- export var PROMISE_SERVICE = new InjectionToken("promise-service");
256
- /**
257
- * @record
258
- */
259
- export function IAsyncMessage() { }
260
- if (false) {
261
- /** @type {?} */
262
- IAsyncMessage.prototype.message;
263
- /** @type {?|undefined} */
264
- IAsyncMessage.prototype.context;
265
- }
266
- // --- Unordered list ---
267
- /**
268
- * @abstract
269
- */
270
- var
271
- // --- Unordered list ---
272
- /**
273
- * @abstract
274
- */
275
- UnorederedListTemplate = /** @class */ (function (_super) {
276
- tslib_1.__extends(UnorederedListTemplate, _super);
277
- function UnorederedListTemplate() {
278
- return _super !== null && _super.apply(this, arguments) || this;
279
- }
280
- return UnorederedListTemplate;
281
- }(TemplateRef));
282
- // --- Unordered list ---
283
- /**
284
- * @abstract
285
- */
286
- export { UnorederedListTemplate };
287
- if (false) {
288
- /** @type {?} */
289
- UnorederedListTemplate.prototype.type;
290
- /** @type {?} */
291
- UnorederedListTemplate.prototype.selector;
292
- }
293
- /**
294
- * @record
295
- */
296
- export function UnorderedListTemplates() { }
297
- /**
298
- * @record
299
- */
300
- export function IAjaxRequestDetails() { }
301
- if (false) {
302
- /** @type {?} */
303
- IAjaxRequestDetails.prototype.request;
304
- /** @type {?} */
305
- IAjaxRequestDetails.prototype.method;
306
- /** @type {?} */
307
- IAjaxRequestDetails.prototype.url;
308
- }
309
- /**
310
- * @record
311
- */
312
- export function IScriptPromises() { }
313
- /**
314
- * @record
315
- */
316
- export function IStylePromises() { }
317
- /**
318
- * @record
319
- */
320
- export function ISearchObservable() { }
321
- if (false) {
322
- /** @type {?} */
323
- ISearchObservable.prototype.search;
324
- /**
325
- * @param {?} token
326
- * @return {?}
327
- */
328
- ISearchObservable.prototype.getSearchResults = function (token) { };
329
- }
330
- // --- Reflect utils ---
331
- /**
332
- * @param {...?} dependencies
333
- * @return {?}
334
- */
335
- export function FactoryDependencies() {
336
- var dependencies = [];
337
- for (var _i = 0; _i < arguments.length; _i++) {
338
- dependencies[_i] = arguments[_i];
339
- }
340
- return function (target, method) {
341
- ReflectUtils.defineMetadata("factoryDependencies", dependencies, target, method);
342
- };
343
- }
344
- /**
345
- * @record
346
- */
347
- export function ITimer() { }
348
- if (false) {
349
- /** @type {?|undefined} */
350
- ITimer.prototype.id;
351
- /** @type {?|undefined} */
352
- ITimer.prototype.func;
353
- /** @type {?|undefined} */
354
- ITimer.prototype.time;
355
- /** @type {?|undefined} */
356
- ITimer.prototype.run;
357
- /** @type {?|undefined} */
358
- ITimer.prototype.set;
359
- /** @type {?|undefined} */
360
- ITimer.prototype.clear;
361
- }
362
- /**
363
- * @record
364
- */
365
- export function IExtraProperties() { }
366
- /**
367
- * @record
368
- */
369
- export function IGroupMap() { }
370
- /**
371
- * @record
372
- */
373
- export function IPageInfo() { }
374
- if (false) {
375
- /** @type {?} */
376
- IPageInfo.prototype.text;
377
- /** @type {?} */
378
- IPageInfo.prototype.number;
379
- /** @type {?} */
380
- IPageInfo.prototype.active;
381
- }
382
- /**
383
- * @record
384
- */
385
- export function IPaginationData() { }
386
- if (false) {
387
- /** @type {?} */
388
- IPaginationData.prototype.total;
389
- /** @type {?} */
390
- IPaginationData.prototype.items;
391
- }
392
- var PaginationItemContext = /** @class */ (function () {
393
- function PaginationItemContext(item, parallelItem, count, index, dataIndex) {
394
- this.item = item;
395
- this.parallelItem = parallelItem;
396
- this.count = count;
397
- this.index = index;
398
- this.dataIndex = dataIndex;
399
- }
400
- Object.defineProperty(PaginationItemContext.prototype, "first", {
401
- get: /**
402
- * @return {?}
403
- */
404
- function () {
405
- return this.index === 0;
406
- },
407
- enumerable: true,
408
- configurable: true
409
- });
410
- Object.defineProperty(PaginationItemContext.prototype, "last", {
411
- get: /**
412
- * @return {?}
413
- */
414
- function () {
415
- return this.index === this.count - 1;
416
- },
417
- enumerable: true,
418
- configurable: true
419
- });
420
- Object.defineProperty(PaginationItemContext.prototype, "even", {
421
- get: /**
422
- * @return {?}
423
- */
424
- function () {
425
- return this.index % 2 === 0;
426
- },
427
- enumerable: true,
428
- configurable: true
429
- });
430
- Object.defineProperty(PaginationItemContext.prototype, "odd", {
431
- get: /**
432
- * @return {?}
433
- */
434
- function () {
435
- return !this.even;
436
- },
437
- enumerable: true,
438
- configurable: true
439
- });
440
- Object.defineProperty(PaginationItemContext.prototype, "row", {
441
- // Support for old dynamic table implementation
442
- get:
443
- // Support for old dynamic table implementation
444
- /**
445
- * @return {?}
446
- */
447
- function () {
448
- console.log("DynamicTable row is deprecated use item instead");
449
- return this.item;
450
- },
451
- enumerable: true,
452
- configurable: true
453
- });
454
- Object.defineProperty(PaginationItemContext.prototype, "parallelRow", {
455
- // Support for old dynamic table implementation
456
- get:
457
- // Support for old dynamic table implementation
458
- /**
459
- * @return {?}
460
- */
461
- function () {
462
- console.log("DynamicTable parallelRow is deprecated use parallelItem instead");
463
- return this.parallelItem;
464
- },
465
- enumerable: true,
466
- configurable: true
467
- });
468
- /**
469
- * @param {?} filterRx
470
- * @return {?}
471
- */
472
- PaginationItemContext.prototype.filter = /**
473
- * @param {?} filterRx
474
- * @return {?}
475
- */
476
- function (filterRx) {
477
- var e_1, _a;
478
- /** @type {?} */
479
- var keys = Object.keys(this.item);
480
- try {
481
- for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
482
- var key = keys_1_1.value;
483
- /** @type {?} */
484
- var value = this.item[key];
485
- if (ObjectUtils.isNullOrUndefined(value) || ObjectUtils.isObject(value))
486
- continue;
487
- /** @type {?} */
488
- var testValue = ObjectUtils.isString(value) ? value : value.toString();
489
- if (testValue.match(filterRx))
490
- return true;
491
- }
492
- }
493
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
494
- finally {
495
- try {
496
- if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
497
- }
498
- finally { if (e_1) throw e_1.error; }
499
- }
500
- return false;
501
- };
502
- return PaginationItemContext;
503
- }());
504
- export { PaginationItemContext };
505
- if (false) {
506
- /** @type {?} */
507
- PaginationItemContext.prototype.item;
508
- /** @type {?} */
509
- PaginationItemContext.prototype.parallelItem;
510
- /** @type {?} */
511
- PaginationItemContext.prototype.count;
512
- /** @type {?} */
513
- PaginationItemContext.prototype.index;
514
- /** @type {?} */
515
- PaginationItemContext.prototype.dataIndex;
516
- }
517
- /**
518
- * @record
519
- */
520
- export function ITableColumns() { }
521
- /**
522
- * @record
523
- */
524
- export function ITableTemplate() { }
525
- if (false) {
526
- /** @type {?} */
527
- ITableTemplate.prototype.column;
528
- /** @type {?} */
529
- ITableTemplate.prototype.pure;
530
- /** @type {?} */
531
- ITableTemplate.prototype.ref;
532
- }
533
- /**
534
- * @record
535
- */
536
- export function ITableTemplates() { }
537
- // --- Resource if ---
538
- var
539
- // --- Resource if ---
540
- ResourceIfContext = /** @class */ (function () {
541
- function ResourceIfContext() {
542
- }
543
- return ResourceIfContext;
544
- }());
545
- // --- Resource if ---
546
- export { ResourceIfContext };
547
- if (false) {
548
- /** @type {?} */
549
- ResourceIfContext.prototype.resource;
550
- /** @type {?} */
551
- ResourceIfContext.prototype.url;
552
- }
553
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0ZW15L25neC11dGlscy8iLCJzb3VyY2VzIjpbIm5neC11dGlscy9jb21tb24tdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQWdDLGNBQWMsRUFBVSxXQUFXLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFFL0csT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUdqRCxxQ0FJQzs7O0lBSEcsK0JBQWU7O0lBQ2YsK0JBQVc7O0lBQ1gsaUNBQWU7O0FBR25CO0lBQ0kscUJBQW1CLENBQVMsRUFBUyxDQUFTLEVBQVMsQ0FBUyxFQUFTLENBQWU7UUFBZixrQkFBQSxFQUFBLE9BQWU7UUFBckUsTUFBQyxHQUFELENBQUMsQ0FBUTtRQUFTLE1BQUMsR0FBRCxDQUFDLENBQVE7UUFBUyxNQUFDLEdBQUQsQ0FBQyxDQUFRO1FBQVMsTUFBQyxHQUFELENBQUMsQ0FBYztJQUV4RixDQUFDO0lBQ0wsa0JBQUM7QUFBRCxDQUFDLEFBSkQsSUFJQzs7OztJQUhlLHdCQUFnQjs7SUFBRSx3QkFBZ0I7O0lBQUUsd0JBQWdCOztJQUFFLHdCQUFzQjs7Ozs7QUFNNUYsa0NBRUM7Ozs7Ozs7O0lBREcseUVBQTRFOzs7QUFHaEYsTUFBTSxLQUFPLFlBQVksR0FBaUMsSUFBSSxjQUFjLENBQWUsY0FBYyxDQUFDOzs7O0FBRzFHLGtDQUdDOzs7SUFGRyw0QkFBYTs7SUFDYixtQ0FBb0I7Ozs7O0FBR3hCLG1DQUVDOzs7O0FBRUQsc0NBVUM7OztJQVRHLDJDQUF3Qjs7SUFDeEIsd0NBQXFCOztJQUNyQiwyQ0FBd0I7O0lBQ3hCLHNDQUFnQjs7Ozs7SUFDaEIsbUVBQXdDOzs7Ozs7SUFDeEMsdUVBQTJEOzs7OztJQUMzRCxpRUFBMkQ7Ozs7Ozs7SUFDM0QsZ0dBQTJGOzs7Ozs7O0lB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SSxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztvQkFBRSxPQUFPLElBQUksQ0FBQzthQUM5Qzs7Ozs7Ozs7O1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNMLDRCQUFDO0FBQUQsQ0FBQyxBQTNDRCxJQTJDQzs7OztJQXpDZSxxQ0FBZ0I7O0lBQUUsNkNBQXdCOztJQUFFLHNDQUFvQjs7SUFBRSxzQ0FBb0I7O0lBQUUsMENBQXdCOzs7OztBQTRDaEksbUNBRUM7Ozs7QUFFRCxvQ0FJQzs7O0lBSEcsZ0NBQTBCOztJQUMxQiw4QkFBYzs7SUFDZCw2QkFBc0I7Ozs7O0FBRzFCLHFDQUVDOztBQUtEOzs7SUFBQTtJQUdBLENBQUM7SUFBRCx3QkFBQztBQUFELENBQUMsQUFIRCxJQUdDOzs7OztJQUZHLHFDQUFpQjs7SUFDakIsZ0NBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0VtYmVkZGVkVmlld1JlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3Rpb25Ub2tlbiwgTmdab25lLCBUZW1wbGF0ZVJlZiwgVHlwZVByb3ZpZGVyfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIERhdGEsIFJvdXRlfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7UmVmbGVjdFV0aWxzfSBmcm9tIFwiLi91dGlscy9yZWZsZWN0LnV0aWxzXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuL3V0aWxzL29iamVjdC51dGlsc1wiO1xyXG5cclxuLy8gLS0tIFV0aWxzXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlc29sdmVGYWN0b3J5IHtcclxuICAgIGZ1bmM6IEZ1bmN0aW9uO1xyXG4gICAgdHlwZT86IGFueTtcclxuICAgIHBhcmFtcz86IGFueVtdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2FudmFzQ29sb3Ige1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHI6IG51bWJlciwgcHVibGljIGc6IG51bWJlciwgcHVibGljIGI6IG51bWJlciwgcHVibGljIGE6IG51bWJlciA9IDI1NSkge1xyXG5cclxuICAgIH1cclxufVxyXG5cclxuLy8gLS0tIEljb24gc2VydmljZSAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJSWNvblNlcnZpY2Uge1xyXG4gICAgZ2V0SWNvbihpY29uOiBzdHJpbmcsIGFjdGl2ZUljb246IHN0cmluZywgYWN0aXZlOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgSUNPTl9TRVJWSUNFOiBJbmplY3Rpb25Ub2tlbjxJSWNvblNlcnZpY2U+ID0gbmV3IEluamVjdGlvblRva2VuPElJY29uU2VydmljZT4oXCJpY29uLXNlcnZpY2VcIik7XHJcblxyXG4vLyAtLS0gTGFuZ3VhZ2Ugc2VydmljZSAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJVHJhbnNsYXRpb24ge1xyXG4gICAgbGFuZzogc3RyaW5nO1xyXG4gICAgdHJhbnNsYXRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVHJhbnNsYXRpb25zIHtcclxuICAgIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTGFuZ3VhZ2VTZXJ2aWNlIHtcclxuICAgIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nO1xyXG4gICAgZWRpdExhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBkZWZhdWx0TGFuZ3VhZ2U6IHN0cmluZztcclxuICAgIGRpY3Rpb25hcnk6IGFueTtcclxuICAgIGFkZExhbmd1YWdlcyhsYW5ndWFnZXM6IHN0cmluZ1tdKTogdm9pZDtcclxuICAgIGdldFRyYW5zbGF0aW9uKGtleTogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPHN0cmluZz47XHJcbiAgICBnZXRUcmFuc2xhdGlvbnMoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPElUcmFuc2xhdGlvbnM+O1xyXG4gICAgZ2V0VHJhbnNsYXRpb25Gcm9tT2JqZWN0KHRyYW5zbGF0aW9uczogSVRyYW5zbGF0aW9ucywgcGFyYW1zPzogYW55LCBsYW5nPzogc3RyaW5nKTogc3RyaW5nO1xyXG4gICAgZ2V0VHJhbnNsYXRpb25Gcm9tQXJyYXkodHJhbnNsYXRpb25zOiBJVHJhbnNsYXRpb25bXSwgcGFyYW1zPzogYW55LCBsYW5nPzogc3RyaW5nKTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTEFOR1VBR0VfU0VSVklDRTogSW5qZWN0aW9uVG9rZW48SUxhbmd1YWdlU2VydmljZT4gPSBuZXcgSW5qZWN0aW9uVG9rZW48SUxhbmd1YWdlU2VydmljZT4oXCJsYW5ndWFnZS1zZXJ2aWNlXCIpO1xyXG5cclxuLy8gLS0tIEF1dGggU2VydmljZSAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJQXV0aFNlcnZpY2Uge1xyXG4gICAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG4gICAgdXNlckNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gICAgY2hlY2tBdXRoZW50aWNhdGVkKCk6IFByb21pc2U8Ym9vbGVhbj47XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJvdXRlVmFsaWRhdG9yID0gKGF1dGg6IElBdXRoU2VydmljZSwgcm91dGU/OiBJUm91dGUsIG5leHQ/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUm91dGVEYXRhIGV4dGVuZHMgRGF0YSB7XHJcbiAgICByZXR1cm5TdGF0ZT86IHN0cmluZ1tdO1xyXG4gICAgZ3VhcmRzPzogQXJyYXk8SVJlc29sdmVGYWN0b3J5IHwgUm91dGVWYWxpZGF0b3I+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZSBleHRlbmRzIFJvdXRlIHtcclxuICAgIGRhdGE/OiBJUm91dGVEYXRhO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQVVUSF9TRVJWSUNFOiBJbmplY3Rpb25Ub2tlbjxJQXV0aFNlcnZpY2U+ID0gbmV3IEluamVjdGlvblRva2VuPElBdXRoU2VydmljZT4oXCJhdXRoLXNlcnZpY2VcIik7XHJcblxyXG4vLyAtLS0gQWNsIFNlcnZpY2UgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUFjbENvbXBvbmVudCB7XHJcbiAgICBvblVzZXJJbml0aWFsaXplZCgpOiB2b2lkO1xyXG4gICAgb25Vc2VyQ2hhbmdlZCgpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSb3V0ZVN0YXRlSW5mbyB7XHJcbiAgICByb3V0ZTogSVJvdXRlO1xyXG4gICAgY29tcG9uZW50OiBhbnk7XHJcbiAgICBndWFyZDogYW55O1xyXG4gICAgZGlydHk6IGJvb2xlYW47XHJcbiAgICBmaXJzdDogYm9vbGVhbjtcclxufVxyXG5cclxuLy8gLS0tIFN0b3JhZ2UgU2VydmljZSAtLS1cclxuZXhwb3J0IGVudW0gU3RvcmFnZU1vZGUge1xyXG4gICAgTG9jYWwsXHJcbiAgICBTZXNzaW9uXHJcbn1cclxuXHJcbi8vIC0tLSBUb2FzdGVyIFNlcnZpY2UgLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRvYXN0ZXJTZXJ2aWNlIHtcclxuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQ7XHJcbiAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQ7XHJcbiAgICBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQ7XHJcbiAgICB3YXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBUT0FTVEVSX1NFUlZJQ0U6IEluamVjdGlvblRva2VuPElUb2FzdGVyU2VydmljZT4gPSBuZXcgSW5qZWN0aW9uVG9rZW48SVRvYXN0ZXJTZXJ2aWNlPihcInRvYXN0ZXItc2VydmljZVwiKTtcclxuXHJcbi8vIC0tLSBQcm9taXNlIFNlcnZpY2UgLS0tXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQcm9taXNlU2VydmljZSB7XHJcbiAgICB6b25lOiBOZ1pvbmU7XHJcbiAgICBjb3VudDogbnVtYmVyO1xyXG4gICAgb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8bnVtYmVyPjtcclxuICAgIGNyZWF0ZTxUPihleGVjdXRvcjogKHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSA9PiB2b2lkKTogUHJvbWlzZTxUPjtcclxuICAgIGFsbChwcm9taXNlczogUHJvbWlzZTxhbnk+W10pOiBQcm9taXNlPGFueT47XHJcbiAgICByZXNvbHZlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBQcm9taXNlPFQ+O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUFJPTUlTRV9TRVJWSUNFID0gbmV3IEluamVjdGlvblRva2VuPElQcm9taXNlU2VydmljZT4oXCJwcm9taXNlLXNlcnZpY2VcIik7XHJcblxyXG4vLyAtLS0gQXN5bmMgbWV0aG9kIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElBc3luY01lc3NhZ2Uge1xyXG4gICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgY29udGV4dD86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQXN5bmNNZXRob2QgPSAoKSA9PiBQcm9taXNlPElBc3luY01lc3NhZ2U+O1xyXG5cclxuLy8gLS0tIFVub3JkZXJlZCBsaXN0IC0tLVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVW5vcmVkZXJlZExpc3RUZW1wbGF0ZSBleHRlbmRzIFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgYWJzdHJhY3QgdHlwZTogc3RyaW5nO1xyXG4gICAgYWJzdHJhY3Qgc2VsZWN0b3I6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVbm9yZGVyZWRMaXN0VGVtcGxhdGVzIHtcclxuICAgIFt0eXBlOiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBVbm9yZGVyZWRMaXN0U3R5bGUgPSBcInRhYmxlXCIgfCBcImxpc3RcIjtcclxuXHJcbi8vIC0tLSBBamF4IHJlcXVlc3QgIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElBamF4UmVxdWVzdERldGFpbHMge1xyXG4gICAgcmVxdWVzdDogWE1MSHR0cFJlcXVlc3QsXHJcbiAgICBtZXRob2Q6IHN0cmluZztcclxuICAgIHVybDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBBamF4UmVxdWVzdENhbGxiYWNrID0gKGRldGFpbHM6IElBamF4UmVxdWVzdERldGFpbHMsIHBhcmFtczogYW55KSA9PiB2b2lkO1xyXG5cclxuLy8gLS0tIExvYWRlciB1dGlscyAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJU2NyaXB0UHJvbWlzZXMge1xyXG4gICAgW3NyYzogc3RyaW5nXTogUHJvbWlzZTxIVE1MU2NyaXB0RWxlbWVudD47XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJU3R5bGVQcm9taXNlcyB7XHJcbiAgICBbc3JjOiBzdHJpbmddOiBQcm9taXNlPEhUTUxMaW5rRWxlbWVudD47XHJcbn1cclxuXHJcbi8vIC0tLSBPYnNlcnZhYmxlIHV0aWxzIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElTZWFyY2hPYnNlcnZhYmxlIHtcclxuICAgIHNlYXJjaDogc3RyaW5nO1xyXG4gICAgZ2V0U2VhcmNoUmVzdWx0cyh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxhbnlbXT47XHJcbn1cclxuXHJcbi8vIC0tLSBSZWZsZWN0IHV0aWxzIC0tLVxyXG5leHBvcnQgZnVuY3Rpb24gRmFjdG9yeURlcGVuZGVuY2llcyguLi5kZXBlbmRlbmNpZXM6IFR5cGVQcm92aWRlcltdKTogTWV0aG9kRGVjb3JhdG9yIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBhbnksIG1ldGhvZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgUmVmbGVjdFV0aWxzLmRlZmluZU1ldGFkYXRhKFwiZmFjdG9yeURlcGVuZGVuY2llc1wiLCBkZXBlbmRlbmNpZXMsIHRhcmdldCwgbWV0aG9kKTtcclxuICAgIH07XHJcbn1cclxuXHJcbi8vIC0tLSBUaW1lciB1dGlscyAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJVGltZXIge1xyXG4gICAgaWQ/OiBhbnk7XHJcbiAgICBmdW5jPzogRnVuY3Rpb247XHJcbiAgICB0aW1lPzogbnVtYmVyO1xyXG4gICAgcnVuPzogKCkgPT4gdm9pZDtcclxuICAgIHNldD86IChmdW5jOiBGdW5jdGlvbiwgdGltZTogbnVtYmVyKSA9PiB2b2lkO1xyXG4gICAgY2xlYXI/OiAoKSA9PiB2b2lkO1xyXG59XHJcblxyXG4vLyAtLS0gRXh0cmFJdGVtUHJvcGVydGllcyAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJRXh0cmFQcm9wZXJ0aWVzIHtcclxuICAgIFtwcm9wOiBzdHJpbmddOiBhbnk7XHJcbn1cclxuXHJcbi8vIC0tLSBHcm91cCBieSAtLS1cclxuZXhwb3J0IGludGVyZmFjZSBJR3JvdXBNYXAge1xyXG4gICAgW2NvbHVtbjogc3RyaW5nXTogYW55O1xyXG59XHJcblxyXG4vLyAtLS0gVHJhbnNsYXRlIC0tLVxyXG5leHBvcnQgdHlwZSBUcmFuc2xhdGlvblF1ZXJ5ID0gc3RyaW5nIHwgSVRyYW5zbGF0aW9ucyB8IElUcmFuc2xhdGlvbltdO1xyXG5cclxuLy8gLS0tIFBhZ2luYXRpb24gLS0tXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBhZ2VJbmZvIHtcclxuICAgIHRleHQ6IHN0cmluZztcclxuICAgIG51bWJlcjogbnVtYmVyO1xyXG4gICAgYWN0aXZlOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQYWdpbmF0aW9uRGF0YSB7XHJcbiAgICB0b3RhbDogbnVtYmVyO1xyXG4gICAgaXRlbXM6IGFueVtdO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBQYWdpbmF0aW9uRGF0YUxvYWRlciA9IChwYWdlOiBudW1iZXIsIGl0ZW1zUGVyUGFnZTogbnVtYmVyKSA9PiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT47XHJcblxyXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkl0ZW1Db250ZXh0IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaXRlbTogYW55LCBwdWJsaWMgcGFyYWxsZWxJdGVtOiBhbnksIHB1YmxpYyBjb3VudDogbnVtYmVyLCBwdWJsaWMgaW5kZXg6IG51bWJlciwgcHVibGljIGRhdGFJbmRleDogbnVtYmVyKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZpcnN0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsYXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSB0aGlzLmNvdW50IC0gMTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZXZlbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCAlIDIgPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9kZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuZXZlbjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdXBwb3J0IGZvciBvbGQgZHluYW1pYyB0YWJsZSBpbXBsZW1lbnRhdGlvblxyXG4gICAgZ2V0IHJvdygpOiBhbnkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRHluYW1pY1RhYmxlIHJvdyBpcyBkZXByZWNhdGVkIHVzZSBpdGVtIGluc3RlYWRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdXBwb3J0IGZvciBvbGQgZHluYW1pYyB0YWJsZSBpbXBsZW1lbnRhdGlvblxyXG4gICAgZ2V0IHBhcmFsbGVsUm93KCk6IGFueSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEeW5hbWljVGFibGUgcGFyYWxsZWxSb3cgaXMgZGVwcmVjYXRlZCB1c2UgcGFyYWxsZWxJdGVtIGluc3RlYWRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYWxsZWxJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlcihmaWx0ZXJSeDogUmVnRXhwKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuaXRlbSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbVtrZXldO1xyXG4gICAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpIHx8IE9iamVjdFV0aWxzLmlzT2JqZWN0KHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlc3RWYWx1ZSA9IE9iamVjdFV0aWxzLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgaWYgKHRlc3RWYWx1ZS5tYXRjaChmaWx0ZXJSeCkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIC0tLSBEeW5hbWljIHRhYmxlIC0tLVxyXG5leHBvcnQgaW50ZXJmYWNlIElUYWJsZUNvbHVtbnMge1xyXG4gICAgW2NvbHVtbjogc3RyaW5nXTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUYWJsZVRlbXBsYXRlIHtcclxuICAgIGNvbHVtbjogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICBwdXJlOiBib29sZWFuO1xyXG4gICAgcmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElUYWJsZVRlbXBsYXRlcyB7XHJcbiAgICBbY29sdW1uOiBzdHJpbmddOiBJVGFibGVUZW1wbGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgVGFibGVEYXRhTG9hZGVyID0gKHBhZ2U6IG51bWJlciwgcm93c1BlclBhZ2U6IG51bWJlciwgb3JkZXJCeTogc3RyaW5nLCBvcmRlckRlc2NlbmRpbmc6IGJvb2xlYW4sIGZpbHRlcjogc3RyaW5nKSA9PiBQcm9taXNlPElQYWdpbmF0aW9uRGF0YT47XHJcblxyXG4vLyAtLS0gUmVzb3VyY2UgaWYgLS0tXHJcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUlmQ29udGV4dCB7XHJcbiAgICByZXNvdXJjZTogc3RyaW5nO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbn1cclxuIl19