@mediusinc/mng-commons-audit 4.2.0 → 5.0.0-rc.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 (56) hide show
  1. package/README.md +12 -26
  2. package/esm2022/lib/api/models/entityChange.mjs +10 -10
  3. package/esm2022/lib/api/models/guiEntityModel.mjs +10 -10
  4. package/esm2022/lib/api/models/guiPropertyModel.mjs +10 -10
  5. package/esm2022/lib/api/models/guiPropertyType.mjs +13 -13
  6. package/esm2022/lib/api/models/guiRelationModel.mjs +10 -10
  7. package/esm2022/lib/api/models/revEntityWithChangesDto.mjs +10 -10
  8. package/esm2022/lib/api/models/revEntityWithStateDto.mjs +10 -10
  9. package/esm2022/lib/api/models/revisionType.mjs +11 -9
  10. package/esm2022/lib/api/services/audit-revisions-api.service.mjs +29 -20
  11. package/esm2022/lib/api/services/audit.service.mjs +12 -11
  12. package/esm2022/lib/audit.routes.mjs +17 -19
  13. package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +17 -14
  14. package/esm2022/lib/components/pages/audit/audit.page.component.mjs +7 -7
  15. package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions.page.component.mjs +114 -99
  16. package/esm2022/lib/components/pages/revisions/audit-revisions.page.component.mjs +61 -70
  17. package/esm2022/lib/models/config.model.mjs +1 -1
  18. package/esm2022/lib/models/entity-revision-change-state.model.mjs +6 -6
  19. package/esm2022/lib/models/entity-revision-changes.model.mjs +6 -6
  20. package/esm2022/lib/models/guiEntityModelWithI18n.model.mjs +7 -7
  21. package/esm2022/lib/models/rev-entity-detailed.model.mjs +7 -7
  22. package/esm2022/lib/models/rev-entity.model.mjs +6 -6
  23. package/esm2022/lib/models/revEntityWithId.model.mjs +8 -8
  24. package/esm2022/lib/service/module-config.token.mjs +2 -2
  25. package/esm2022/lib/utils/audit.util.mjs +66 -117
  26. package/fesm2022/mediusinc-mng-commons-audit.mjs +386 -442
  27. package/fesm2022/mediusinc-mng-commons-audit.mjs.map +1 -1
  28. package/lib/api/models/entityChange.d.ts +4 -4
  29. package/lib/api/models/guiEntityModel.d.ts +4 -4
  30. package/lib/api/models/guiPropertyModel.d.ts +6 -6
  31. package/lib/api/models/guiPropertyType.d.ts +1 -1
  32. package/lib/api/models/guiRelationModel.d.ts +2 -2
  33. package/lib/api/models/revEntityWithChangesDto.d.ts +4 -4
  34. package/lib/api/models/revEntityWithStateDto.d.ts +4 -4
  35. package/lib/api/models/revisionType.d.ts +2 -1
  36. package/lib/api/services/audit-revisions-api.service.d.ts +14 -13
  37. package/lib/api/services/audit.service.d.ts +7 -7
  38. package/lib/audit.routes.d.ts +5 -5
  39. package/lib/components/entity-changes-field/entity-changes-field.component.d.ts +6 -6
  40. package/lib/components/pages/audit/audit.page.component.d.ts +3 -3
  41. package/lib/components/pages/entity-revisions/audit-entity-revisions.page.component.d.ts +24 -23
  42. package/lib/components/pages/revisions/audit-revisions.page.component.d.ts +11 -14
  43. package/lib/models/config.model.d.ts +1 -1
  44. package/lib/models/entity-revision-change-state.model.d.ts +3 -3
  45. package/lib/models/entity-revision-changes.model.d.ts +3 -3
  46. package/lib/models/guiEntityModelWithI18n.model.d.ts +2 -2
  47. package/lib/models/rev-entity-detailed.model.d.ts +4 -4
  48. package/lib/models/rev-entity.model.d.ts +2 -2
  49. package/lib/models/revEntityWithId.model.d.ts +2 -2
  50. package/lib/service/module-config.token.d.ts +2 -2
  51. package/lib/utils/audit.util.d.ts +17 -14
  52. package/package.json +3 -2
  53. package/esm2022/lib/models/new-filter-match-type.model.mjs +0 -19
  54. package/lib/models/new-filter-match-type.model.d.ts +0 -17
  55. /package/{assets/i18n → i18n}/en.json +0 -0
  56. /package/{assets/i18n → i18n}/sl.json +0 -0
@@ -1,10 +1,10 @@
1
1
  import { __decorate } from "tslib";
2
- import { TypeName } from '@mediusinc/mng-commons';
3
- import { MngGuiEntityModelDto } from '../api/models/guiEntityModel';
4
- let MngGuiEntityModelWithI18n = class MngGuiEntityModelWithI18n extends MngGuiEntityModelDto {
2
+ import { TypeName } from '@mediusinc/mng-commons/core';
3
+ import { GuiEntityModelDto } from '../api/models/guiEntityModel';
4
+ let GuiEntityModelWithI18n = class GuiEntityModelWithI18n extends GuiEntityModelDto {
5
5
  };
6
- MngGuiEntityModelWithI18n = __decorate([
6
+ GuiEntityModelWithI18n = __decorate([
7
7
  TypeName('MngGuiEntityModelWithI18n')
8
- ], MngGuiEntityModelWithI18n);
9
- export { MngGuiEntityModelWithI18n };
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpRW50aXR5TW9kZWxXaXRoSTE4bi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWxzL2d1aUVudGl0eU1vZGVsV2l0aEkxOG4ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUczRCxJQUFNLHlCQUF5QixHQUEvQixNQUFNLHlCQUEwQixTQUFRLG9CQUFvQjtDQUVsRSxDQUFBO0FBRlkseUJBQXlCO0lBRHJDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQztHQUN6Qix5QkFBeUIsQ0FFckMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGVOYW1lfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zJztcblxuaW1wb3J0IHtNbmdHdWlFbnRpdHlNb2RlbER0b30gZnJvbSAnLi4vYXBpL21vZGVscy9ndWlFbnRpdHlNb2RlbCc7XG5cbkBUeXBlTmFtZSgnTW5nR3VpRW50aXR5TW9kZWxXaXRoSTE4bicpXG5leHBvcnQgY2xhc3MgTW5nR3VpRW50aXR5TW9kZWxXaXRoSTE4biBleHRlbmRzIE1uZ0d1aUVudGl0eU1vZGVsRHRvIHtcbiAgICBlbnRpdHlOYW1lSTE4bj86IHN0cmluZztcbn1cbiJdfQ==
8
+ ], GuiEntityModelWithI18n);
9
+ export { GuiEntityModelWithI18n };
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpRW50aXR5TW9kZWxXaXRoSTE4bi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWxzL2d1aUVudGl0eU1vZGVsV2l0aEkxOG4ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUd4RCxJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUF1QixTQUFRLGlCQUFpQjtDQUU1RCxDQUFBO0FBRlksc0JBQXNCO0lBRGxDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQztHQUN6QixzQkFBc0IsQ0FFbEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGVOYW1lfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuXG5pbXBvcnQge0d1aUVudGl0eU1vZGVsRHRvfSBmcm9tICcuLi9hcGkvbW9kZWxzL2d1aUVudGl0eU1vZGVsJztcblxuQFR5cGVOYW1lKCdNbmdHdWlFbnRpdHlNb2RlbFdpdGhJMThuJylcbmV4cG9ydCBjbGFzcyBHdWlFbnRpdHlNb2RlbFdpdGhJMThuIGV4dGVuZHMgR3VpRW50aXR5TW9kZWxEdG8ge1xuICAgIGVudGl0eU5hbWVJMThuPzogc3RyaW5nO1xufVxuIl19
@@ -1,10 +1,10 @@
1
1
  import { __decorate } from "tslib";
2
- import { TypeName } from '@mediusinc/mng-commons';
3
- import { MngRevEntity } from './rev-entity.model';
4
- let MngRevEntityDetailed = class MngRevEntityDetailed extends MngRevEntity {
2
+ import { TypeName } from '@mediusinc/mng-commons/core';
3
+ import { RevEntity } from './rev-entity.model';
4
+ let RevEntityDetailed = class RevEntityDetailed extends RevEntity {
5
5
  };
6
- MngRevEntityDetailed = __decorate([
6
+ RevEntityDetailed = __decorate([
7
7
  TypeName('MngRevEntityDetailed')
8
- ], MngRevEntityDetailed);
9
- export { MngRevEntityDetailed };
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2LWVudGl0eS1kZXRhaWxlZC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWxzL3Jldi1lbnRpdHktZGV0YWlsZWQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUdoRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHekMsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBcUIsU0FBUSxZQUFZO0NBR3JELENBQUE7QUFIWSxvQkFBb0I7SUFEaEMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO0dBQ3BCLG9CQUFvQixDQUdoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZU5hbWV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMnO1xuXG5pbXBvcnQge01uZ0VudGl0eUNoYW5nZUR0b30gZnJvbSAnLi4vYXBpL21vZGVscy9lbnRpdHlDaGFuZ2UnO1xuaW1wb3J0IHtNbmdSZXZFbnRpdHl9IGZyb20gJy4vcmV2LWVudGl0eS5tb2RlbCc7XG5cbkBUeXBlTmFtZSgnTW5nUmV2RW50aXR5RGV0YWlsZWQnKVxuZXhwb3J0IGNsYXNzIE1uZ1JldkVudGl0eURldGFpbGVkIGV4dGVuZHMgTW5nUmV2RW50aXR5IHtcbiAgICByZXZFbnRpdHk/OiB7W2tleTogc3RyaW5nXTogdW5rbm93bn07XG4gICAgZW50aXR5TmFtZUNoYW5nZXNNYXA/OiB7W2tleTogc3RyaW5nXTogQXJyYXk8TW5nRW50aXR5Q2hhbmdlRHRvPn07XG59XG4iXX0=
8
+ ], RevEntityDetailed);
9
+ export { RevEntityDetailed };
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2LWVudGl0eS1kZXRhaWxlZC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWxzL3Jldi1lbnRpdHktZGV0YWlsZWQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUdyRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHdEMsSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBa0IsU0FBUSxTQUFTO0NBRy9DLENBQUE7QUFIWSxpQkFBaUI7SUFEN0IsUUFBUSxDQUFDLHNCQUFzQixDQUFDO0dBQ3BCLGlCQUFpQixDQUc3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHlwZU5hbWV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5cbmltcG9ydCB7RW50aXR5Q2hhbmdlRHRvfSBmcm9tICcuLi9hcGkvbW9kZWxzL2VudGl0eUNoYW5nZSc7XG5pbXBvcnQge1JldkVudGl0eX0gZnJvbSAnLi9yZXYtZW50aXR5Lm1vZGVsJztcblxuQFR5cGVOYW1lKCdNbmdSZXZFbnRpdHlEZXRhaWxlZCcpXG5leHBvcnQgY2xhc3MgUmV2RW50aXR5RGV0YWlsZWQgZXh0ZW5kcyBSZXZFbnRpdHkge1xuICAgIHJldkVudGl0eT86IHtba2V5OiBzdHJpbmddOiB1bmtub3dufTtcbiAgICBlbnRpdHlOYW1lQ2hhbmdlc01hcD86IHtba2V5OiBzdHJpbmddOiBBcnJheTxFbnRpdHlDaGFuZ2VEdG8+fTtcbn1cbiJdfQ==
@@ -1,9 +1,9 @@
1
1
  import { __decorate } from "tslib";
2
- import { TypeName } from '@mediusinc/mng-commons';
3
- let MngRevEntity = class MngRevEntity {
2
+ import { TypeName } from '@mediusinc/mng-commons/core';
3
+ let RevEntity = class RevEntity {
4
4
  };
5
- MngRevEntity = __decorate([
5
+ RevEntity = __decorate([
6
6
  TypeName('MngRevEntity')
7
- ], MngRevEntity);
8
- export { MngRevEntity };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2LWVudGl0eS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWxzL3Jldi1lbnRpdHkubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBUyxRQUFRLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRCxJQUFNLFlBQVksR0FBbEIsTUFBTSxZQUFZO0NBSXhCLENBQUE7QUFKWSxZQUFZO0lBRHhCLFFBQVEsQ0FBQyxjQUFjLENBQUM7R0FDWixZQUFZLENBSXhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJZFR5cGUsIFR5cGVOYW1lfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zJztcblxuQFR5cGVOYW1lKCdNbmdSZXZFbnRpdHknKVxuZXhwb3J0IGNsYXNzIE1uZ1JldkVudGl0eSB7XG4gICAgcmV2PzogSWRUeXBlOyAvLyB1c3VhbGx5IGEgbnVtYmVyXG4gICAgcmV2VXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgdGltZXN0YW1wPzogRGF0ZTtcbn1cbiJdfQ==
7
+ ], RevEntity);
8
+ export { RevEntity };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2LWVudGl0eS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbW9kZWxzL3Jldi1lbnRpdHkubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBUyxRQUFRLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUd0RCxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7Q0FJckIsQ0FBQTtBQUpZLFNBQVM7SUFEckIsUUFBUSxDQUFDLGNBQWMsQ0FBQztHQUNaLFNBQVMsQ0FJckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lkVHlwZSwgVHlwZU5hbWV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5cbkBUeXBlTmFtZSgnTW5nUmV2RW50aXR5JylcbmV4cG9ydCBjbGFzcyBSZXZFbnRpdHkge1xuICAgIHJldj86IElkVHlwZTsgLy8gdXN1YWxseSBhIG51bWJlclxuICAgIHJldlVzZXJuYW1lPzogc3RyaW5nO1xuICAgIHRpbWVzdGFtcD86IERhdGU7XG59XG4iXX0=
@@ -1,11 +1,11 @@
1
1
  import { __decorate } from "tslib";
2
- import { TypeName, TypeRegistry } from '@mediusinc/mng-commons';
3
- import { MngRevEntityWithStateDto } from '../api/models/revEntityWithStateDto';
4
- let MngRevEntityWithId = class MngRevEntityWithId extends MngRevEntityWithStateDto {
2
+ import { TypeName, TypeRegistry } from '@mediusinc/mng-commons/core';
3
+ import { RevEntityWithStateDto } from '../api/models/revEntityWithStateDto';
4
+ let RevEntityWithId = class RevEntityWithId extends RevEntityWithStateDto {
5
5
  };
6
- MngRevEntityWithId = __decorate([
6
+ RevEntityWithId = __decorate([
7
7
  TypeName('MngRevEntityWithId')
8
- ], MngRevEntityWithId);
9
- export { MngRevEntityWithId };
10
- TypeRegistry.get().registerType(MngRevEntityWithId);
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2RW50aXR5V2l0aElkLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmV2RW50aXR5V2l0aElkLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBR3RFLElBQU0sa0JBQWtCLEdBQXhCLE1BQU0sa0JBQW1CLFNBQVEsd0JBQXdCO0NBRS9ELENBQUE7QUFGWSxrQkFBa0I7SUFEOUIsUUFBUSxDQUFDLG9CQUFvQixDQUFDO0dBQ2xCLGtCQUFrQixDQUU5Qjs7QUFFRCxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGVOYW1lLCBUeXBlUmVnaXN0cnl9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMnO1xuXG5pbXBvcnQge01uZ1JldkVudGl0eVdpdGhTdGF0ZUR0b30gZnJvbSAnLi4vYXBpL21vZGVscy9yZXZFbnRpdHlXaXRoU3RhdGVEdG8nO1xuXG5AVHlwZU5hbWUoJ01uZ1JldkVudGl0eVdpdGhJZCcpXG5leHBvcnQgY2xhc3MgTW5nUmV2RW50aXR5V2l0aElkIGV4dGVuZHMgTW5nUmV2RW50aXR5V2l0aFN0YXRlRHRvIHtcbiAgICBtZXJnZWRJZD86IHN0cmluZztcbn1cblxuVHlwZVJlZ2lzdHJ5LmdldCgpLnJlZ2lzdGVyVHlwZShNbmdSZXZFbnRpdHlXaXRoSWQpO1xuIl19
8
+ ], RevEntityWithId);
9
+ export { RevEntityWithId };
10
+ TypeRegistry.get().registerType(RevEntityWithId);
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2RW50aXR5V2l0aElkLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmV2RW50aXR5V2l0aElkLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRW5FLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBR25FLElBQU0sZUFBZSxHQUFyQixNQUFNLGVBQWdCLFNBQVEscUJBQXFCO0NBRXpELENBQUE7QUFGWSxlQUFlO0lBRDNCLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztHQUNsQixlQUFlLENBRTNCOztBQUVELFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGVOYW1lLCBUeXBlUmVnaXN0cnl9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5cbmltcG9ydCB7UmV2RW50aXR5V2l0aFN0YXRlRHRvfSBmcm9tICcuLi9hcGkvbW9kZWxzL3JldkVudGl0eVdpdGhTdGF0ZUR0byc7XG5cbkBUeXBlTmFtZSgnTW5nUmV2RW50aXR5V2l0aElkJylcbmV4cG9ydCBjbGFzcyBSZXZFbnRpdHlXaXRoSWQgZXh0ZW5kcyBSZXZFbnRpdHlXaXRoU3RhdGVEdG8ge1xuICAgIG1lcmdlZElkPzogc3RyaW5nO1xufVxuXG5UeXBlUmVnaXN0cnkuZ2V0KCkucmVnaXN0ZXJUeXBlKFJldkVudGl0eVdpdGhJZCk7XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  import { InjectionToken } from '@angular/core';
2
- export const MNG_AUDIT_MODULE_CONFIG_IT = new InjectionToken('MngAuditModuleConfig');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLWNvbmZpZy50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZS9tb2R1bGUtY29uZmlnLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJN0MsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxjQUFjLENBQXVCLHNCQUFzQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtNbmdBdWRpdE1vZHVsZUNvbmZpZ30gZnJvbSAnLi4vbW9kZWxzL2NvbmZpZy5tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBNTkdfQVVESVRfTU9EVUxFX0NPTkZJR19JVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNbmdBdWRpdE1vZHVsZUNvbmZpZz4oJ01uZ0F1ZGl0TW9kdWxlQ29uZmlnJyk7XG4iXX0=
2
+ export const COMMONS_AUDIT_MODULE_CONFIG_IT = new InjectionToken('CommonsAuditModuleConfig');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLWNvbmZpZy50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZS9tb2R1bGUtY29uZmlnLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJN0MsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxjQUFjLENBQTJCLDBCQUEwQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtDb21tb25zQXVkaXRNb2R1bGVDb25maWd9IGZyb20gJy4uL21vZGVscy9jb25maWcubW9kZWwnO1xuXG5leHBvcnQgY29uc3QgQ09NTU9OU19BVURJVF9NT0RVTEVfQ09ORklHX0lUID0gbmV3IEluamVjdGlvblRva2VuPENvbW1vbnNBdWRpdE1vZHVsZUNvbmZpZz4oJ0NvbW1vbnNBdWRpdE1vZHVsZUNvbmZpZycpO1xuIl19
@@ -1,10 +1,11 @@
1
- import { of } from 'rxjs';
2
- import { MediusFilterMatchType, TypeRegistry } from '@mediusinc/mng-commons';
3
- import { MngGuiPropertyTypeDto } from '../api/models/guiPropertyType';
4
- import { MngRevisionTypeDto } from '../api/models/revisionType';
5
- import { MngEntityRevisionChangeState } from '../models/entity-revision-change-state.model';
6
- import { MngEntityRevisionChanges } from '../models/entity-revision-changes.model';
7
- import { NewMediusFilterMatchType } from '../models/new-filter-match-type.model';
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { DataListParamsUtil, TypeRegistry } from '@mediusinc/mng-commons/core';
3
+ import { LookupDataProvider } from '@mediusinc/mng-commons/form/api';
4
+ import { enumModelGeneric } from '@mediusinc/mng-commons/model';
5
+ import { GuiPropertyTypeDto } from '../api/models/guiPropertyType';
6
+ import { RevisionTypeDto, revisionTypeEnum } from '../api/models/revisionType';
7
+ import { EntityRevisionChangeState } from '../models/entity-revision-change-state.model';
8
+ import { EntityRevisionChanges } from '../models/entity-revision-changes.model';
8
9
  export class AuditUtil {
9
10
  static { this._dateRegex = /\d{4}-[01]\d-[0-3]\d/; }
10
11
  static addColumnsFromModel(descriptor, properties, modelType = undefined, addFilters = true, addSorts = true) {
@@ -12,37 +13,37 @@ export class AuditUtil {
12
13
  if (!property.resolvedPropertyName) {
13
14
  continue;
14
15
  }
15
- const isEnum = property.propertyType === MngGuiPropertyTypeDto.Enum;
16
+ const isEnum = property.propertyType === GuiPropertyTypeDto.Enum;
16
17
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
18
  let column = null;
18
19
  if (isEnum) {
19
20
  if (!property.possibleEnumValues) {
20
21
  continue;
21
22
  }
22
- const enumType = AuditUtil.findEnumType(property);
23
- if (enumType) {
24
- column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asEnum(enumType);
23
+ const enumModel = AuditUtil.findEnum(property);
24
+ if (enumModel) {
25
+ column = descriptor.addColumnEnum(property.resolvedPropertyName, enumModel);
25
26
  if (addFilters) {
26
- column.withFilterLookupEnum(property.possibleEnumValues);
27
+ descriptor.addFilterLookupEnum(column.property, enumModel, property.possibleEnumValues);
27
28
  }
28
29
  }
29
30
  else {
30
31
  column = descriptor.addColumnUnsafe(property.resolvedPropertyName);
31
32
  if (addFilters) {
32
- (column?.withFilterLookup()).withLookup(() => of(property.possibleEnumValues ?? []));
33
+ descriptor.addFilterLookupUnsafe(column.property, LookupDataProvider.create().withLookup(() => property.possibleEnumValues ?? []));
33
34
  }
34
35
  }
35
36
  }
36
- else if (property.propertyType === MngGuiPropertyTypeDto.Number) {
37
+ else if (property.propertyType === GuiPropertyTypeDto.Number) {
37
38
  column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asNumber();
38
39
  }
39
- else if (property.propertyType === MngGuiPropertyTypeDto.Boolean) {
40
+ else if (property.propertyType === GuiPropertyTypeDto.Boolean) {
40
41
  column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asBoolean();
41
42
  }
42
- else if (property.propertyType === MngGuiPropertyTypeDto.LocalDate) {
43
+ else if (property.propertyType === GuiPropertyTypeDto.LocalDate) {
43
44
  column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asDate('dd. MM yyyy');
44
45
  }
45
- else if (property.propertyType === MngGuiPropertyTypeDto.OffsetDateTime) {
46
+ else if (property.propertyType === GuiPropertyTypeDto.OffsetDateTime) {
46
47
  column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asDate('dd. MM yyyy HH:mm');
47
48
  }
48
49
  else {
@@ -54,10 +55,10 @@ export class AuditUtil {
54
55
  }
55
56
  column.withTitle(AuditUtil.getPropertyTitleKey(property, modelType));
56
57
  if (!isEnum && addFilters) {
57
- column?.withFilter();
58
+ column?.withFilterUnsafe();
58
59
  }
59
60
  if (addSorts) {
60
- column?.withSort();
61
+ column?.withSortUnsafe();
61
62
  }
62
63
  }
63
64
  return descriptor;
@@ -74,39 +75,39 @@ export class AuditUtil {
74
75
  continue;
75
76
  }
76
77
  const fieldPrepend = `${modelType}.`;
77
- if (property.propertyType === MngGuiPropertyTypeDto.Enum) {
78
- const enumType = AuditUtil.findEnumType(property);
79
- if (enumType) {
78
+ if (property.propertyType === GuiPropertyTypeDto.Enum) {
79
+ const enumModel = AuditUtil.findEnum(property);
80
+ if (enumModel) {
80
81
  if (!property.possibleEnumValues) {
81
82
  continue;
82
83
  }
83
- descriptor.addFieldLookupEnumUnsafe(fieldPrepend + property.resolvedPropertyName, enumType, property.possibleEnumValues).withDisabled();
84
+ descriptor.addFieldLookupEnum((fieldPrepend + property.resolvedPropertyName), enumModel, property.possibleEnumValues).withDisabled();
84
85
  }
85
86
  else {
86
87
  descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName).withLabel(AuditUtil.getPropertyTitleKey(property, modelType));
87
88
  }
88
89
  }
89
- else if (property.propertyType === MngGuiPropertyTypeDto.Number) {
90
+ else if (property.propertyType === GuiPropertyTypeDto.Number) {
90
91
  descriptor
91
92
  .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
92
93
  .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
93
94
  .asNumber()
94
95
  .withDisabled();
95
96
  }
96
- else if (property.propertyType === MngGuiPropertyTypeDto.Boolean) {
97
+ else if (property.propertyType === GuiPropertyTypeDto.Boolean) {
97
98
  descriptor
98
99
  .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
99
100
  .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
100
101
  .withDisabled();
101
102
  }
102
- else if (property.propertyType === MngGuiPropertyTypeDto.LocalDate) {
103
+ else if (property.propertyType === GuiPropertyTypeDto.LocalDate) {
103
104
  descriptor
104
105
  .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
105
106
  .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
106
107
  .asDatePicker({ format: 'dd. MMM yyyy' })
107
108
  .withDisabled();
108
109
  }
109
- else if (property.propertyType === MngGuiPropertyTypeDto.OffsetDateTime) {
110
+ else if (property.propertyType === GuiPropertyTypeDto.OffsetDateTime) {
110
111
  descriptor
111
112
  .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
112
113
  .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
@@ -128,8 +129,8 @@ export class AuditUtil {
128
129
  return descriptor;
129
130
  }
130
131
  static buildDescriptorForEntityRevision(descriptor, revModel, entityModel) {
131
- descriptor.addColumn('revType').withTitle('MngEntityRevisionChangeState.properties.revType').asEnum(MngRevisionTypeDto).withFilter();
132
- descriptor.addFieldLookupEnum('revType', MngRevisionTypeDto).withLabel('MngEntityRevisionChangeState.properties.revType');
132
+ descriptor.addColumnEnum('revType', revisionTypeEnum).withTitle('MngEntityRevisionChangeState.properties.revType').withFilterUnsafe();
133
+ descriptor.addFieldLookupEnum('revType', revisionTypeEnum).withLabel('MngEntityRevisionChangeState.properties.revType');
133
134
  if (revModel.properties) {
134
135
  AuditUtil.addColumnsFromModel(descriptor.table, revModel.properties, 'revEntity');
135
136
  AuditUtil.addFieldsFromModel(descriptor.detailsEditor, revModel.properties, 'revEntity');
@@ -140,15 +141,31 @@ export class AuditUtil {
140
141
  }
141
142
  return descriptor;
142
143
  }
143
- static findEnumType(property) {
144
+ static findEnum(property) {
144
145
  if (!property.enumClassSimpleName) {
145
146
  return undefined;
146
147
  }
147
- let enumType = TypeRegistry.get().findEnum(property.enumClassSimpleName);
148
+ let i18n = property.enumClassSimpleName;
149
+ let enumType = TypeRegistry.get().findEnum(i18n);
148
150
  if (!enumType) {
149
- enumType = TypeRegistry.get().findEnum(property.enumClassSimpleName + 'Dto');
151
+ i18n = property.enumClassSimpleName + 'Dto';
152
+ enumType = TypeRegistry.get().findEnum(i18n);
150
153
  }
151
- return enumType;
154
+ if (!enumType && Array.isArray(property.possibleEnumValues)) {
155
+ i18n = null;
156
+ enumType = property.possibleEnumValues?.reduce((acc, v) => {
157
+ const constName = v
158
+ .split('_')
159
+ .map(s => (s.length > 1 ? s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase() : s))
160
+ .join('');
161
+ if (constName !== v) {
162
+ acc[constName] = v;
163
+ }
164
+ acc[v] = constName;
165
+ return acc;
166
+ }, {});
167
+ }
168
+ return enumModelGeneric(enumType, i18n);
152
169
  }
153
170
  static extractPropertyName(fullPropertyName) {
154
171
  if (fullPropertyName?.includes('entityState.')) {
@@ -159,109 +176,41 @@ export class AuditUtil {
159
176
  }
160
177
  return fullPropertyName;
161
178
  }
162
- static appendMediusQueryParamsToUrl(queryParams) {
163
- let url = `?offset=${queryParams.itemsOffset}&limit=${queryParams.itemsPerPage}`;
164
- if (queryParams.sortProperty && queryParams.sortProperty.length > 0) {
165
- url += '&sort=';
166
- const sortingQPs = [];
167
- for (let i = 0; i < queryParams.sortProperty.length; i++) {
168
- sortingQPs.push(`${queryParams.sortAsc?.[i] ?? true ? 'asc' : 'desc'}:${this.extractPropertyName(queryParams.sortProperty[i])}`);
169
- }
170
- url += sortingQPs.join(',');
171
- }
172
- if (queryParams.filterParams && queryParams.filterParams.length > 0) {
173
- const filterQPs = [];
174
- for (const mfp of queryParams.filterParams) {
175
- switch (mfp.filterMatchType) {
176
- case MediusFilterMatchType.Equals: {
177
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Equals}:${mfp.filterValue}`);
178
- break;
179
- }
180
- case MediusFilterMatchType.NotEquals: {
181
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.NotEquals}:${mfp.filterValue}`);
182
- break;
183
- }
184
- case MediusFilterMatchType.FromTo: {
185
- if (this._dateRegex.test(mfp.filterValue)) {
186
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Between}:${new Date(mfp.filterValue).toISOString()},${new Date(mfp.filterValueTo).toISOString()}`);
187
- }
188
- else {
189
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Between}:${mfp.filterValue},${mfp.filterValueTo}`);
190
- }
191
- break;
192
- }
193
- case MediusFilterMatchType.Contains: {
194
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Contains}:${mfp.filterValue}`);
195
- break;
196
- }
197
- case MediusFilterMatchType.StartsWith: {
198
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.StartsWith}:${mfp.filterValue}`);
199
- break;
200
- }
201
- case MediusFilterMatchType.EndsWith: {
202
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.EndsWith}:${mfp.filterValue}`);
203
- break;
204
- }
205
- case MediusFilterMatchType.In: {
206
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.In}:${mfp.filterValue}`);
207
- break;
208
- }
209
- case MediusFilterMatchType.NotIn: {
210
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.NotIn}:${mfp.filterValue}`);
211
- break;
212
- }
213
- case MediusFilterMatchType.SmallerThan: {
214
- if (this._dateRegex.test(mfp.filterValue)) {
215
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.LessThan}:${new Date(mfp.filterValue).toISOString()}`);
216
- }
217
- else {
218
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.LessThan}:${mfp.filterValue}`);
219
- }
220
- break;
221
- }
222
- case MediusFilterMatchType.GreaterThan: {
223
- if (this._dateRegex.test(mfp.filterValue)) {
224
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.GreaterThan}:${new Date(mfp.filterValue).toISOString()}`);
225
- }
226
- else {
227
- filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.GreaterThan}:${mfp.filterValue}`);
228
- }
229
- break;
230
- }
231
- }
232
- }
233
- url += '&';
234
- url += filterQPs.join('&');
235
- }
236
- return url;
179
+ static paramsToHttpParams(params) {
180
+ const routeParams = DataListParamsUtil.toUrlQueryParams(params, null);
181
+ let httpParams = new HttpParams();
182
+ Object.entries(routeParams).forEach(([key, value]) => {
183
+ httpParams = httpParams.append(key, value);
184
+ });
185
+ return httpParams;
237
186
  }
238
187
  static mapItemsToEntityChangesArray(fieldValue) {
239
188
  const entityChanges = [];
240
189
  for (const key of Object.keys(fieldValue)) {
241
- const ec = new MngEntityRevisionChanges();
190
+ const ec = new EntityRevisionChanges();
242
191
  ec.entityType = key;
243
192
  ec.items = [];
244
193
  for (const change of fieldValue[key]) {
245
- if (change.revType === MngRevisionTypeDto.Add && change.entityNewState) {
246
- const item = new MngEntityRevisionChangeState();
194
+ if (change.revType === RevisionTypeDto.Add && change.entityNewState) {
195
+ const item = new EntityRevisionChangeState();
247
196
  item.revType = change.revType;
248
197
  item.color = 'green';
249
198
  Object.entries(change.entityNewState).forEach(([key, value]) => (item[key] = value));
250
199
  ec.items.push(item);
251
200
  }
252
- else if (change.revType === MngRevisionTypeDto.Del && change.entityOldState) {
253
- const item = new MngEntityRevisionChangeState();
201
+ else if (change.revType === RevisionTypeDto.Del && change.entityOldState) {
202
+ const item = new EntityRevisionChangeState();
254
203
  item.revType = change.revType;
255
204
  item.color = 'red';
256
205
  Object.entries(change.entityOldState).forEach(([key, value]) => (item[key] = value));
257
206
  ec.items.push(item);
258
207
  }
259
- else if (change.revType === MngRevisionTypeDto.Mod && change.entityOldState && change.entityNewState) {
260
- const itemOld = new MngEntityRevisionChangeState();
208
+ else if (change.revType === RevisionTypeDto.Mod && change.entityOldState && change.entityNewState) {
209
+ const itemOld = new EntityRevisionChangeState();
261
210
  itemOld.revType = change.revType;
262
211
  itemOld.color = 'red';
263
212
  Object.entries(change.entityOldState).forEach(([key, value]) => (itemOld[key] = value));
264
- const itemNew = new MngEntityRevisionChangeState();
213
+ const itemNew = new EntityRevisionChangeState();
265
214
  itemNew.revType = change.revType;
266
215
  itemNew.color = 'green';
267
216
  Object.entries(change.entityNewState).forEach(([key, value]) => (itemNew[key] = value));
@@ -274,4 +223,4 @@ export class AuditUtil {
274
223
  return entityChanges;
275
224
  }
276
225
  }
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYXVkaXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sRUFJSCxxQkFBcUIsRUFJckIsWUFBWSxFQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFLaEMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFFcEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDMUYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsTUFBTSxPQUFPLFNBQVM7YUFDSCxlQUFVLEdBQUcsc0JBQXNCLENBQUM7SUFFNUMsTUFBTSxDQUFDLG1CQUFtQixDQUM3QixVQUFrQyxFQUNsQyxVQUFvQyxFQUNwQyxZQUFxRCxTQUFTLEVBQzlELFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFFBQVEsR0FBRyxJQUFJO1FBRWYsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtnQkFDaEMsU0FBUzthQUNaO1lBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7WUFDcEUsOERBQThEO1lBQzlELElBQUksTUFBTSxHQUFvQyxJQUFJLENBQUM7WUFDbkQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtvQkFDOUIsU0FBUztpQkFDWjtnQkFFRCxNQUFNLFFBQVEsR0FBRyxT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QyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBRXhGLE1BQU0sT0FBTyxHQUFHLElBQUksNEJBQTRCLEVBQUUsQ0FBQztvQkFDbkQsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUNqQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztvQkFDeEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBRXhGLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN2QixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDMUI7YUFDSjtZQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtvZn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgQ29sdW1uRGVzY3JpcHRvcixcbiAgICBFZGl0b3JEZXNjcmlwdG9ySW5zdCxcbiAgICBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLFxuICAgIE1lZGl1c0ZpbHRlck1hdGNoVHlwZSxcbiAgICBNZWRpdXNRdWVyeVBhcmFtLFxuICAgIFRhYmxlRGVzY3JpcHRvckluc3QsXG4gICAgVGFibGV2aWV3RGVzY3JpcHRvckluc3QsXG4gICAgVHlwZVJlZ2lzdHJ5XG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMnO1xuXG5pbXBvcnQge01uZ0VudGl0eUNoYW5nZUR0b30gZnJvbSAnLi4vYXBpL21vZGVscy9lbnRpdHlDaGFuZ2UnO1xuaW1wb3J0IHtNbmdHdWlFbnRpdHlNb2RlbER0b30gZnJvbSAnLi4vYXBpL21vZGVscy9ndWlFbnRpdHlNb2RlbCc7XG5pbXBvcnQge01uZ0d1aVByb3BlcnR5TW9kZWxEdG99IGZyb20gJy4uL2FwaS9tb2RlbHMvZ3VpUHJvcGVydHlNb2RlbCc7XG5pbXBvcnQge01uZ0d1aVByb3BlcnR5VHlwZUR0b30gZnJvbSAnLi4vYXBpL21vZGVscy9ndWlQcm9wZXJ0eVR5cGUnO1xuaW1wb3J0IHtNbmdSZXZFbnRpdHlXaXRoU3RhdGVEdG99IGZyb20gJy4uL2FwaS9tb2RlbHMvcmV2RW50aXR5V2l0aFN0YXRlRHRvJztcbmltcG9ydCB7TW5nUmV2aXNpb25UeXBlRHRvfSBmcm9tICcuLi9hcGkvbW9kZWxzL3JldmlzaW9uVHlwZSc7XG5pbXBvcnQge01uZ0VudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGV9IGZyb20gJy4uL21vZGVscy9lbnRpdHktcmV2aXNpb24tY2hhbmdlLXN0YXRlLm1vZGVsJztcbmltcG9ydCB7TW5nRW50aXR5UmV2aXNpb25DaGFuZ2VzfSBmcm9tICcuLi9tb2RlbHMvZW50aXR5LXJldmlzaW9uLWNoYW5nZXMubW9kZWwnO1xuaW1wb3J0IHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGV9IGZyb20gJy4uL21vZGVscy9uZXctZmlsdGVyLW1hdGNoLXR5cGUubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgQXVkaXRVdGlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfZGF0ZVJlZ2V4ID0gL1xcZHs0fS1bMDFdXFxkLVswLTNdXFxkLztcblxuICAgIHB1YmxpYyBzdGF0aWMgYWRkQ29sdW1uc0Zyb21Nb2RlbDxUPihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxUPixcbiAgICAgICAgcHJvcGVydGllczogTW5nR3VpUHJvcGVydHlNb2RlbER0b1tdLFxuICAgICAgICBtb2RlbFR5cGU6ICdyZXZFbnRpdHknIHwgJ2VudGl0eVN0YXRlJyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkRmlsdGVycyA9IHRydWUsXG4gICAgICAgIGFkZFNvcnRzID0gdHJ1ZVxuICAgICk6IFRhYmxlRGVzY3JpcHRvckluc3Q8VD4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXNFbnVtID0gcHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uRW51bTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBsZXQgY29sdW1uOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc0VudW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtVHlwZSA9IEF1ZGl0VXRpbC5maW5kRW51bVR5cGUocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChlbnVtVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSBkZXNjcmlwdG9yLmFkZENvbHVtblVuc2FmZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNFbnVtKGVudW1UeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi53aXRoRmlsdGVyTG9va3VwRW51bShwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gZGVzY3JpcHRvci5hZGRDb2x1bW5VbnNhZmUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkRmlsdGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbj8ud2l0aEZpbHRlckxvb2t1cCgpIGFzIEZpbHRlckxvb2t1cERlc2NyaXB0b3I8c3RyaW5nPikud2l0aExvb2t1cCgoKSA9PiBvZihwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXMgPz8gW10pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gZGVzY3JpcHRvci5hZGRDb2x1bW5VbnNhZmUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBkZXNjcmlwdG9yLmFkZENvbHVtblVuc2FmZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNCb29sZWFuKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uVW5zYWZlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKS5hc0RhdGUoJ2RkLiBNTSB5eXl5Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLk9mZnNldERhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gZGVzY3JpcHRvci5hZGRDb2x1bW5VbnNhZmUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpLmFzRGF0ZSgnZGQuIE1NIHl5eXkgSEg6bW0nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIC8gd2lsZGNhcmRcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBkZXNjcmlwdG9yLmFkZENvbHVtblVuc2FmZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkud2l0aFRpdGxlKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1vZGVsVHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbi53aXRoR2V0dGVyKCh2YWx1ZSwgaXRlbSkgPT4gaXRlbT8uW21vZGVsVHlwZSBhcyBrZXlvZiBvYmplY3RdPy5bcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUgYXMga2V5b2Ygb2JqZWN0XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbHVtbi53aXRoVGl0bGUoQXVkaXRVdGlsLmdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHksIG1vZGVsVHlwZSkpO1xuXG4gICAgICAgICAgICBpZiAoIWlzRW51bSAmJiBhZGRGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uPy53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRkU29ydHMpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4/LndpdGhTb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5OiBNbmdHdWlQcm9wZXJ0eU1vZGVsRHRvLCBtb2RlbFR5cGU6ICdyZXZFbnRpdHknIHwgJ2VudGl0eVN0YXRlJyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobW9kZWxUeXBlID09PSAncmV2RW50aXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuICdNbmdSZXZFbnRpdHkucHJvcGVydGllcy4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lID8/ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWRkRmllbGRzRnJvbU1vZGVsPFQ+KFxuICAgICAgICBkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9ySW5zdDxUPixcbiAgICAgICAgcHJvcGVydGllczogTW5nR3VpUHJvcGVydHlNb2RlbER0b1tdLFxuICAgICAgICBtb2RlbFR5cGU6ICdyZXZFbnRpdHknIHwgJ2VudGl0eVN0YXRlJyA9ICdyZXZFbnRpdHknXG4gICAgKTogRWRpdG9yRGVzY3JpcHRvckluc3Q8VD4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmllbGRQcmVwZW5kID0gYCR7bW9kZWxUeXBlfS5gO1xuXG4gICAgICAgICAgICBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uRW51bSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudW1UeXBlID0gQXVkaXRVdGlsLmZpbmRFbnVtVHlwZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGVudW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lLCBlbnVtVHlwZSwgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKS53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkVW5zYWZlKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKS53aXRoTGFiZWwoQXVkaXRVdGlsLmdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHksIG1vZGVsVHlwZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRVbnNhZmUoZmllbGRQcmVwZW5kICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwoQXVkaXRVdGlsLmdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHksIG1vZGVsVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIC5hc051bWJlcigpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBNbmdHdWlQcm9wZXJ0eVR5cGVEdG8uQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVW5zYWZlKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gTW5nR3VpUHJvcGVydHlUeXBlRHRvLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVW5zYWZlKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKHtmb3JtYXQ6ICdkZC4gTU1NIHl5eXknfSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IE1uZ0d1aVByb3BlcnR5VHlwZUR0by5PZmZzZXREYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVW5zYWZlKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ2RkLiBNTSB5eScsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93VGltZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dTZWNvbmRzOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZyAvIHdpbGRjYXJkXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRVbnNhZmUoZmllbGRQcmVwZW5kICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwoQXVkaXRVdGlsLmdldFByb3BlcnR5VGl0bGVLZXkocHJvcGVydHksIG1vZGVsVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGJ1aWxkRGVzY3JpcHRvckZvckVudGl0eVJldmlzaW9uKFxuICAgICAgICBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNbmdSZXZFbnRpdHlXaXRoU3RhdGVEdG8+LFxuICAgICAgICByZXZNb2RlbDogTW5nR3VpRW50aXR5TW9kZWxEdG8sXG4gICAgICAgIGVudGl0eU1vZGVsOiBNbmdHdWlFbnRpdHlNb2RlbER0b1xuICAgICk6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1uZ1JldkVudGl0eVdpdGhTdGF0ZUR0bz4ge1xuICAgICAgICBkZXNjcmlwdG9yLmFkZENvbHVtbigncmV2VHlwZScpLndpdGhUaXRsZSgnTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VTdGF0ZS5wcm9wZXJ0aWVzLnJldlR5cGUnKS5hc0VudW0oTW5nUmV2aXNpb25UeXBlRHRvKS53aXRoRmlsdGVyKCk7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtKCdyZXZUeXBlJywgTW5nUmV2aXNpb25UeXBlRHRvKS53aXRoTGFiZWwoJ01uZ0VudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGUucHJvcGVydGllcy5yZXZUeXBlJyk7XG5cbiAgICAgICAgaWYgKHJldk1vZGVsLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIEF1ZGl0VXRpbC5hZGRDb2x1bW5zRnJvbU1vZGVsKGRlc2NyaXB0b3IudGFibGUsIHJldk1vZGVsLnByb3BlcnRpZXMsICdyZXZFbnRpdHknKTtcbiAgICAgICAgICAgIEF1ZGl0VXRpbC5hZGRGaWVsZHNGcm9tTW9kZWwoZGVzY3JpcHRvci5kZXRhaWxzRWRpdG9yLCByZXZNb2RlbC5wcm9wZXJ0aWVzLCAncmV2RW50aXR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudGl0eU1vZGVsLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIEF1ZGl0VXRpbC5hZGRDb2x1bW5zRnJvbU1vZGVsKGRlc2NyaXB0b3IudGFibGUsIGVudGl0eU1vZGVsLnByb3BlcnRpZXMsICdlbnRpdHlTdGF0ZScpO1xuICAgICAgICAgICAgQXVkaXRVdGlsLmFkZEZpZWxkc0Zyb21Nb2RlbChkZXNjcmlwdG9yLmRldGFpbHNFZGl0b3IsIGVudGl0eU1vZGVsLnByb3BlcnRpZXMsICdlbnRpdHlTdGF0ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaW5kRW51bVR5cGUocHJvcGVydHk6IE1uZ0d1aVByb3BlcnR5TW9kZWxEdG8pIHtcbiAgICAgICAgaWYgKCFwcm9wZXJ0eS5lbnVtQ2xhc3NTaW1wbGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVudW1UeXBlID0gVHlwZVJlZ2lzdHJ5LmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUpO1xuICAgICAgICBpZiAoIWVudW1UeXBlKSB7XG4gICAgICAgICAgICBlbnVtVHlwZSA9IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kRW51bShwcm9wZXJ0eS5lbnVtQ2xhc3NTaW1wbGVOYW1lICsgJ0R0bycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGV4dHJhY3RQcm9wZXJ0eU5hbWUoZnVsbFByb3BlcnR5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGZ1bGxQcm9wZXJ0eU5hbWU/LmluY2x1ZGVzKCdlbnRpdHlTdGF0ZS4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWUucmVwbGFjZSgnZW50aXR5U3RhdGUuJywgJycpO1xuICAgICAgICB9IGVsc2UgaWYgKGZ1bGxQcm9wZXJ0eU5hbWU/LmluY2x1ZGVzKCdyZXZFbnRpdHkuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmdWxsUHJvcGVydHlOYW1lPy5yZXBsYWNlKCdyZXZFbnRpdHkuJywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsUHJvcGVydHlOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXBwZW5kTWVkaXVzUXVlcnlQYXJhbXNUb1VybChxdWVyeVBhcmFtczogTWVkaXVzUXVlcnlQYXJhbSk6IHN0cmluZyB7XG4gICAgICAgIGxldCB1cmwgPSBgP29mZnNldD0ke3F1ZXJ5UGFyYW1zLml0ZW1zT2Zmc2V0fSZsaW1pdD0ke3F1ZXJ5UGFyYW1zLml0ZW1zUGVyUGFnZX1gO1xuICAgICAgICBpZiAocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5ICYmIHF1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gJyZzb3J0PSc7XG4gICAgICAgICAgICBjb25zdCBzb3J0aW5nUVBzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHNvcnRpbmdRUHMucHVzaChgJHtxdWVyeVBhcmFtcy5zb3J0QXNjPy5baV0gPz8gdHJ1ZSA/ICdhc2MnIDogJ2Rlc2MnfToke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShxdWVyeVBhcmFtcy5zb3J0UHJvcGVydHlbaV0pfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsICs9IHNvcnRpbmdRUHMuam9pbignLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmZpbHRlclBhcmFtcyAmJiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUVBzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1mcCBvZiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1mcC5maWx0ZXJNYXRjaFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzfToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsc306JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Gcm9tVG86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlUmVnZXgudGVzdChtZnAuZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5CZXR3ZWVufToke25ldyBEYXRlKG1mcC5maWx0ZXJWYWx1ZSkudG9JU09TdHJpbmcoKX0sJHtuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1mcC5maWx0ZXJWYWx1ZVRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkJldHdlZW59OiR7bWZwLmZpbHRlclZhbHVlfSwke21mcC5maWx0ZXJWYWx1ZVRvfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuQ29udGFpbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5Db250YWluc306JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5TdGFydHNXaXRoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU3RhcnRzV2l0aH06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FbmRzV2l0aDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVuZHNXaXRofToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuSW59OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTm90SW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5Ob3RJbn06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5TbWFsbGVyVGhhbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVSZWdleC50ZXN0KG1mcC5maWx0ZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTGVzc1RoYW59OiR7bmV3IERhdGUobWZwLmZpbHRlclZhbHVlKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTGVzc1RoYW59OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuR3JlYXRlclRoYW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlUmVnZXgudGVzdChtZnAuZmlsdGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFufToke25ldyBEYXRlKG1mcC5maWx0ZXJWYWx1ZSkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsICs9ICcmJztcbiAgICAgICAgICAgIHVybCArPSBmaWx0ZXJRUHMuam9pbignJicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtYXBJdGVtc1RvRW50aXR5Q2hhbmdlc0FycmF5KGZpZWxkVmFsdWU6IHtba2V5OiBzdHJpbmddOiBBcnJheTxNbmdFbnRpdHlDaGFuZ2VEdG8+fSk6IEFycmF5PE1uZ0VudGl0eVJldmlzaW9uQ2hhbmdlcz4ge1xuICAgICAgICBjb25zdCBlbnRpdHlDaGFuZ2VzOiBNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZXNbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZFZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgZWMgPSBuZXcgTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VzKCk7XG4gICAgICAgICAgICBlYy5lbnRpdHlUeXBlID0ga2V5O1xuICAgICAgICAgICAgZWMuaXRlbXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIGZpZWxkVmFsdWVba2V5XSkge1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UucmV2VHlwZSA9PT0gTW5nUmV2aXNpb25UeXBlRHRvLkFkZCAmJiBjaGFuZ2UuZW50aXR5TmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucmV2VHlwZSA9IGNoYW5nZS5yZXZUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbG9yID0gJ2dyZWVuJztcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlLmVudGl0eU5ld1N0YXRlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IChpdGVtW2tleV0gPSB2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBlYy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLnJldlR5cGUgPT09IE1uZ1JldmlzaW9uVHlwZUR0by5EZWwgJiYgY2hhbmdlLmVudGl0eU9sZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnJldlR5cGUgPSBjaGFuZ2UucmV2VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jb2xvciA9ICdyZWQnO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2UuZW50aXR5T2xkU3RhdGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKGl0ZW1ba2V5XSA9IHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UucmV2VHlwZSA9PT0gTW5nUmV2aXNpb25UeXBlRHRvLk1vZCAmJiBjaGFuZ2UuZW50aXR5T2xkU3RhdGUgJiYgY2hhbmdlLmVudGl0eU5ld1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1PbGQgPSBuZXcgTW5nRW50aXR5UmV2aXNpb25DaGFuZ2VTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBpdGVtT2xkLnJldlR5cGUgPSBjaGFuZ2UucmV2VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbU9sZC5jb2xvciA9ICdyZWQnO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2UuZW50aXR5T2xkU3RhdGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKGl0ZW1PbGRba2V5XSA9IHZhbHVlKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU5ldyA9IG5ldyBNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OZXcucmV2VHlwZSA9IGNoYW5nZS5yZXZUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtTmV3LmNvbG9yID0gJ2dyZWVuJztcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlLmVudGl0eU5ld1N0YXRlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IChpdGVtTmV3W2tleV0gPSB2YWx1ZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zLnB1c2goaXRlbU9sZCk7XG4gICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zLnB1c2goaXRlbU5ldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50aXR5Q2hhbmdlcy5wdXNoKGVjKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50aXR5Q2hhbmdlcztcbiAgICB9XG59XG4iXX0=
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYXVkaXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFaEQsT0FBTyxFQUFpQixrQkFBa0IsRUFBWSxZQUFZLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQU85RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUVqRSxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFFOUUsTUFBTSxPQUFPLFNBQVM7YUFDSCxlQUFVLEdBQUcsc0JBQXNCLENBQUM7SUFFNUMsTUFBTSxDQUFDLG1CQUFtQixDQUM3QixVQUFrQyxFQUNsQyxVQUFpQyxFQUNqQyxZQUFxRCxTQUFTLEVBQzlELFVBQVUsR0FBRyxJQUFJLEVBQ2pCLFFBQVEsR0FBRyxJQUFJO1FBRWYsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtnQkFDaEMsU0FBUzthQUNaO1lBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDakUsOERBQThEO1lBQzlELElBQUksTUFBTSxHQUFvQyxJQUFJLENBQUM7WUFDbkQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtvQkFDOUIsU0FBUztpQkFDWjtnQkFFRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLFNBQVMsRUFBRTtvQkFDWCxNQUFNLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsb0JBQStCLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ3ZGLElBQUksVUFBVSxFQUFFO3dCQUNaLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsUUFBbUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7cUJBQ3RHO2lCQUNKO3FCQUFNO29CQUNILE1BQU0sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUNuRSxJQUFJLFVBQVUsRUFBRTt3QkFDWixVQUFVLENBQUMscUJBQXFCLENBQzVCLE1BQU0sQ0FBQyxRQUFRLEVBQ2Ysa0JBQWtCLENBQUMsTUFBTSxFQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsQ0FDMUYsQ0FBQztxQkFDTDtpQkFDSjthQUNKO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQzVELE1BQU0sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ2pGO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQzdELE1BQU0sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ2xGO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7Z0JBQy9ELE1BQU0sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUM1RjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsY0FBYyxFQUFFO2dCQUNwRSxNQUFNLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUNsRztpQkFBTTtnQkFDSCxvQkFBb0I7Z0JBQ3BCLE1BQU0sR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDcEk7WUFFRCxJQUFJLFNBQVMsRUFBRTtnQkFDWCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBeUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLG9CQUFvQyxDQUFDLENBQUMsQ0FBQzthQUMxSDtZQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBRXJFLElBQUksQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFO2dCQUN2QixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQzthQUM5QjtZQUNELElBQUksUUFBUSxFQUFFO2dCQUNWLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQzthQUM1QjtTQUNKO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUE2QixFQUFFLFlBQXFELFNBQVM7UUFDM0gsSUFBSSxTQUFTLEtBQUssV0FBVyxFQUFFO1lBQzNCLE9BQU8sMEJBQTBCLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1NBQ3JFO1FBQ0QsT0FBTyxRQUFRLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFTSxNQUFNLENBQUMsa0JBQWtCLENBQzVCLFVBQW1DLEVBQ25DLFVBQWlDLEVBQ2pDLFlBQXlDLFdBQVc7UUFFcEQsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtnQkFDaEMsU0FBUzthQUNaO1lBRUQsTUFBTSxZQUFZLEdBQUcsR0FBRyxTQUFTLEdBQUcsQ0FBQztZQUVyQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsSUFBSSxFQUFFO2dCQUNuRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLFNBQVMsRUFBRTtvQkFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFO3dCQUM5QixTQUFTO3FCQUNaO29CQUVELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7aUJBQ25KO3FCQUFNO29CQUNILFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQ3pJO2FBQ0o7aUJBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtnQkFDNUQsVUFBVTtxQkFDTCxjQUFjLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztxQkFDNUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7cUJBQzdELFFBQVEsRUFBRTtxQkFDVixZQUFZLEVBQUUsQ0FBQzthQUN2QjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsT0FBTyxFQUFFO2dCQUM3RCxVQUFVO3FCQUNMLGNBQWMsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO3FCQUM1RCxTQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDN0QsWUFBWSxFQUFFLENBQUM7YUFDdkI7aUJBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLGtCQUFrQixDQUFDLFNBQVMsRUFBRTtnQkFDL0QsVUFBVTtxQkFDTCxjQUFjLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztxQkFDNUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7cUJBQzdELFlBQVksQ0FBQyxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUMsQ0FBQztxQkFDdEMsWUFBWSxFQUFFLENBQUM7YUFDdkI7aUJBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLGtCQUFrQixDQUFDLGNBQWMsRUFBRTtnQkFDcEUsVUFBVTtxQkFDTCxjQUFjLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztxQkFDNUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7cUJBQzdELFlBQVksQ0FBQztvQkFDVixNQUFNLEVBQUUsV0FBVztvQkFDbkIsUUFBUSxFQUFFLElBQUk7b0JBQ2QsV0FBVyxFQUFFLEtBQUs7aUJBQ3JCLENBQUM7cUJBQ0QsWUFBWSxFQUFFLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0gsb0JBQW9CO2dCQUNwQixVQUFVO3FCQUNMLGNBQWMsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO3FCQUM1RCxTQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDN0QsWUFBWSxFQUFFLENBQUM7YUFDdkI7U0FDSjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxNQUFNLENBQUMsZ0NBQWdDLENBQzFDLFVBQTBELEVBQzFELFFBQTJCLEVBQzNCLFdBQThCO1FBRTlCLFVBQVUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLGlEQUFpRCxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0SSxVQUFVLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUMsU0FBUyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFFeEgsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3JCLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbEYsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztTQUM1RjtRQUNELElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRTtZQUN4QixTQUFTLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZGLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDakc7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUE2QjtRQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1lBQy9CLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxJQUFJLEdBQWtCLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RCxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxJQUFJLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUM1QyxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoRDtRQUNELElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUN6RCxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ1osUUFBUSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQzFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNQLE1BQU0sU0FBUyxHQUFHLENBQUM7cUJBQ2QsS0FBSyxDQUFDLEdBQUcsQ0FBQztxQkFDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDN0YsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNkLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtvQkFDakIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDdEI7Z0JBQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDbkIsT0FBTyxHQUFHLENBQUM7WUFDZixDQUFDLEVBQ1MsRUFBRSxDQUNmLENBQUM7U0FDTDtRQUNELE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxNQUFNLENBQUMsbUJBQW1CLENBQUMsZ0JBQW9DO1FBQ2xFLElBQUksZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzVDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN2RDthQUFNLElBQUksZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2pELE9BQU8sZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFzQjtRQUNuRCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUVsQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDakQsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxVQUFtRDtRQUMxRixNQUFNLGFBQWEsR0FBNEIsRUFBRSxDQUFDO1FBQ2xELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QyxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDdkMsRUFBRSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDcEIsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDZCxLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLGVBQWUsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRTtvQkFDakUsTUFBTSxJQUFJLEdBQUcsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7b0JBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO29CQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDckYsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3ZCO3FCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxlQUFlLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUU7b0JBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUkseUJBQXlCLEVBQUUsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3JGLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN2QjtxQkFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssZUFBZSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUU7b0JBQ2pHLE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQXlCLEVBQUUsQ0FBQztvQkFDaEQsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUNqQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBRXhGLE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQXlCLEVBQUUsQ0FBQztvQkFDaEQsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUNqQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztvQkFDeEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBRXhGLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN2QixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDMUI7YUFDSjtZQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUI7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCB7RGF0YUxpc3RQYXJhbXMsIERhdGFMaXN0UGFyYW1zVXRpbCwgRW51bVR5cGUsIFR5cGVSZWdpc3RyeX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7TG9va3VwRGF0YVByb3ZpZGVyfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2Zvcm0vYXBpJztcbmltcG9ydCB7ZW51bU1vZGVsR2VuZXJpY30gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5pbXBvcnQge0NvbHVtbkRlc2NyaXB0b3IsIFRhYmxlRGVzY3JpcHRvckluc3R9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGUvYXBpJztcbmltcG9ydCB7RWRpdG9yRGVzY3JpcHRvckluc3QsIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxldmlldy9hcGknO1xuXG5pbXBvcnQge0VudGl0eUNoYW5nZUR0b30gZnJvbSAnLi4vYXBpL21vZGVscy9lbnRpdHlDaGFuZ2UnO1xuaW1wb3J0IHtHdWlFbnRpdHlNb2RlbER0b30gZnJvbSAnLi4vYXBpL21vZGVscy9ndWlFbnRpdHlNb2RlbCc7XG5pbXBvcnQge0d1aVByb3BlcnR5TW9kZWxEdG99IGZyb20gJy4uL2FwaS9tb2RlbHMvZ3VpUHJvcGVydHlNb2RlbCc7XG5pbXBvcnQge0d1aVByb3BlcnR5VHlwZUR0b30gZnJvbSAnLi4vYXBpL21vZGVscy9ndWlQcm9wZXJ0eVR5cGUnO1xuaW1wb3J0IHtSZXZFbnRpdHlXaXRoU3RhdGVEdG99IGZyb20gJy4uL2FwaS9tb2RlbHMvcmV2RW50aXR5V2l0aFN0YXRlRHRvJztcbmltcG9ydCB7UmV2aXNpb25UeXBlRHRvLCByZXZpc2lvblR5cGVFbnVtfSBmcm9tICcuLi9hcGkvbW9kZWxzL3JldmlzaW9uVHlwZSc7XG5pbXBvcnQge0VudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGV9IGZyb20gJy4uL21vZGVscy9lbnRpdHktcmV2aXNpb24tY2hhbmdlLXN0YXRlLm1vZGVsJztcbmltcG9ydCB7RW50aXR5UmV2aXNpb25DaGFuZ2VzfSBmcm9tICcuLi9tb2RlbHMvZW50aXR5LXJldmlzaW9uLWNoYW5nZXMubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgQXVkaXRVdGlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfZGF0ZVJlZ2V4ID0gL1xcZHs0fS1bMDFdXFxkLVswLTNdXFxkLztcblxuICAgIHB1YmxpYyBzdGF0aWMgYWRkQ29sdW1uc0Zyb21Nb2RlbDxUPihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxUPixcbiAgICAgICAgcHJvcGVydGllczogR3VpUHJvcGVydHlNb2RlbER0b1tdLFxuICAgICAgICBtb2RlbFR5cGU6ICdyZXZFbnRpdHknIHwgJ2VudGl0eVN0YXRlJyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkRmlsdGVycyA9IHRydWUsXG4gICAgICAgIGFkZFNvcnRzID0gdHJ1ZVxuICAgICk6IFRhYmxlRGVzY3JpcHRvckluc3Q8VD4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXNFbnVtID0gcHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGVEdG8uRW51bTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBsZXQgY29sdW1uOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc0VudW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtTW9kZWwgPSBBdWRpdFV0aWwuZmluZEVudW0ocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChlbnVtTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gZGVzY3JpcHRvci5hZGRDb2x1bW5FbnVtKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lIGFzIGtleW9mIFQsIGVudW1Nb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpbHRlckxvb2t1cEVudW0oY29sdW1uLnByb3BlcnR5IGFzIGtleW9mIFQsIGVudW1Nb2RlbCwgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uVW5zYWZlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkRmlsdGVyTG9va3VwVW5zYWZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29rdXBEYXRhUHJvdmlkZXIuY3JlYXRlPHN0cmluZz4oKS53aXRoTG9va3VwKCgpID0+IHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcyA/PyBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlRHRvLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uVW5zYWZlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKS5hc051bWJlcigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZUR0by5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uID0gZGVzY3JpcHRvci5hZGRDb2x1bW5VbnNhZmUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpLmFzQm9vbGVhbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZUR0by5Mb2NhbERhdGUpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4gPSBkZXNjcmlwdG9yLmFkZENvbHVtblVuc2FmZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkuYXNEYXRlKCdkZC4gTU0geXl5eScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZUR0by5PZmZzZXREYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGNvbHVtbiA9IGRlc2NyaXB0b3IuYWRkQ29sdW1uVW5zYWZlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKS5hc0RhdGUoJ2RkLiBNTSB5eXl5IEhIOm1tJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZyAvIHdpbGRjYXJkXG4gICAgICAgICAgICAgICAgY29sdW1uID0gZGVzY3JpcHRvci5hZGRDb2x1bW5VbnNhZmUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUpLndpdGhUaXRsZShBdWRpdFV0aWwuZ2V0UHJvcGVydHlUaXRsZUtleShwcm9wZXJ0eSwgbW9kZWxUeXBlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb2RlbFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4ud2l0aEdldHRlcigodmFsdWUsIGl0ZW0pID0+IGl0ZW0/Llttb2RlbFR5cGUgYXMga2V5b2Ygb2JqZWN0XT8uW3Byb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lIGFzIGtleW9mIG9iamVjdF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb2x1bW4ud2l0aFRpdGxlKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKTtcblxuICAgICAgICAgICAgaWYgKCFpc0VudW0gJiYgYWRkRmlsdGVycykge1xuICAgICAgICAgICAgICAgIGNvbHVtbj8ud2l0aEZpbHRlclVuc2FmZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFkZFNvcnRzKSB7XG4gICAgICAgICAgICAgICAgY29sdW1uPy53aXRoU29ydFVuc2FmZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UHJvcGVydHlUaXRsZUtleShwcm9wZXJ0eTogR3VpUHJvcGVydHlNb2RlbER0bywgbW9kZWxUeXBlOiAncmV2RW50aXR5JyB8ICdlbnRpdHlTdGF0ZScgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1vZGVsVHlwZSA9PT0gJ3JldkVudGl0eScpIHtcbiAgICAgICAgICAgIHJldHVybiAnTW5nUmV2RW50aXR5LnByb3BlcnRpZXMuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSA/PyAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZEZpZWxkc0Zyb21Nb2RlbDxUPihcbiAgICAgICAgZGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvckluc3Q8VD4sXG4gICAgICAgIHByb3BlcnRpZXM6IEd1aVByb3BlcnR5TW9kZWxEdG9bXSxcbiAgICAgICAgbW9kZWxUeXBlOiAncmV2RW50aXR5JyB8ICdlbnRpdHlTdGF0ZScgPSAncmV2RW50aXR5J1xuICAgICk6IEVkaXRvckRlc2NyaXB0b3JJbnN0PFQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUHJlcGVuZCA9IGAke21vZGVsVHlwZX0uYDtcblxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlRHRvLkVudW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtTW9kZWwgPSBBdWRpdFV0aWwuZmluZEVudW0ocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIGlmIChlbnVtTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cEVudW0oKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKSBhcyBrZXlvZiBULCBlbnVtTW9kZWwsIHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcykud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZFVuc2FmZShmaWVsZFByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSkud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlRHRvLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVW5zYWZlKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlRHRvLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZFVuc2FmZShmaWVsZFByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChBdWRpdFV0aWwuZ2V0UHJvcGVydHlUaXRsZUtleShwcm9wZXJ0eSwgbW9kZWxUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZUR0by5Mb2NhbERhdGUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZFVuc2FmZShmaWVsZFByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChBdWRpdFV0aWwuZ2V0UHJvcGVydHlUaXRsZUtleShwcm9wZXJ0eSwgbW9kZWxUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcih7Zm9ybWF0OiAnZGQuIE1NTSB5eXl5J30pXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGVEdG8uT2Zmc2V0RGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZFVuc2FmZShmaWVsZFByZXBlbmQgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChBdWRpdFV0aWwuZ2V0UHJvcGVydHlUaXRsZUtleShwcm9wZXJ0eSwgbW9kZWxUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdkZC4gTU0geXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93U2Vjb25kczogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJpbmcgLyB3aWxkY2FyZFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkVW5zYWZlKGZpZWxkUHJlcGVuZCArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKEF1ZGl0VXRpbC5nZXRQcm9wZXJ0eVRpdGxlS2V5KHByb3BlcnR5LCBtb2RlbFR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBidWlsZERlc2NyaXB0b3JGb3JFbnRpdHlSZXZpc2lvbihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8UmV2RW50aXR5V2l0aFN0YXRlRHRvPixcbiAgICAgICAgcmV2TW9kZWw6IEd1aUVudGl0eU1vZGVsRHRvLFxuICAgICAgICBlbnRpdHlNb2RlbDogR3VpRW50aXR5TW9kZWxEdG9cbiAgICApOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxSZXZFbnRpdHlXaXRoU3RhdGVEdG8+IHtcbiAgICAgICAgZGVzY3JpcHRvci5hZGRDb2x1bW5FbnVtKCdyZXZUeXBlJywgcmV2aXNpb25UeXBlRW51bSkud2l0aFRpdGxlKCdNbmdFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlLnByb3BlcnRpZXMucmV2VHlwZScpLndpdGhGaWx0ZXJVbnNhZmUoKTtcbiAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cEVudW0oJ3JldlR5cGUnLCByZXZpc2lvblR5cGVFbnVtKS53aXRoTGFiZWwoJ01uZ0VudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGUucHJvcGVydGllcy5yZXZUeXBlJyk7XG5cbiAgICAgICAgaWYgKHJldk1vZGVsLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIEF1ZGl0VXRpbC5hZGRDb2x1bW5zRnJvbU1vZGVsKGRlc2NyaXB0b3IudGFibGUsIHJldk1vZGVsLnByb3BlcnRpZXMsICdyZXZFbnRpdHknKTtcbiAgICAgICAgICAgIEF1ZGl0VXRpbC5hZGRGaWVsZHNGcm9tTW9kZWwoZGVzY3JpcHRvci5kZXRhaWxzRWRpdG9yLCByZXZNb2RlbC5wcm9wZXJ0aWVzLCAncmV2RW50aXR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudGl0eU1vZGVsLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIEF1ZGl0VXRpbC5hZGRDb2x1bW5zRnJvbU1vZGVsKGRlc2NyaXB0b3IudGFibGUsIGVudGl0eU1vZGVsLnByb3BlcnRpZXMsICdlbnRpdHlTdGF0ZScpO1xuICAgICAgICAgICAgQXVkaXRVdGlsLmFkZEZpZWxkc0Zyb21Nb2RlbChkZXNjcmlwdG9yLmRldGFpbHNFZGl0b3IsIGVudGl0eU1vZGVsLnByb3BlcnRpZXMsICdlbnRpdHlTdGF0ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaW5kRW51bShwcm9wZXJ0eTogR3VpUHJvcGVydHlNb2RlbER0bykge1xuICAgICAgICBpZiAoIXByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaTE4bjogc3RyaW5nIHwgbnVsbCA9IHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWU7XG4gICAgICAgIGxldCBlbnVtVHlwZSA9IFR5cGVSZWdpc3RyeS5nZXQoKS5maW5kRW51bShpMThuKTtcbiAgICAgICAgaWYgKCFlbnVtVHlwZSkge1xuICAgICAgICAgICAgaTE4biA9IHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUgKyAnRHRvJztcbiAgICAgICAgICAgIGVudW1UeXBlID0gVHlwZVJlZ2lzdHJ5LmdldCgpLmZpbmRFbnVtKGkxOG4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW51bVR5cGUgJiYgQXJyYXkuaXNBcnJheShwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXMpKSB7XG4gICAgICAgICAgICBpMThuID0gbnVsbDtcbiAgICAgICAgICAgIGVudW1UeXBlID0gcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzPy5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKGFjYywgdikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdE5hbWUgPSB2XG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ18nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChzID0+IChzLmxlbmd0aCA+IDEgPyBzLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgcy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKSA6IHMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3ROYW1lICE9PSB2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NbY29uc3ROYW1lXSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWNjW3ZdID0gY29uc3ROYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgPEVudW1UeXBlPnt9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtTW9kZWxHZW5lcmljKGVudW1UeXBlLCBpMThuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGV4dHJhY3RQcm9wZXJ0eU5hbWUoZnVsbFByb3BlcnR5TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGZ1bGxQcm9wZXJ0eU5hbWU/LmluY2x1ZGVzKCdlbnRpdHlTdGF0ZS4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWUucmVwbGFjZSgnZW50aXR5U3RhdGUuJywgJycpO1xuICAgICAgICB9IGVsc2UgaWYgKGZ1bGxQcm9wZXJ0eU5hbWU/LmluY2x1ZGVzKCdyZXZFbnRpdHkuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmdWxsUHJvcGVydHlOYW1lPy5yZXBsYWNlKCdyZXZFbnRpdHkuJywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsUHJvcGVydHlOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGFyYW1zVG9IdHRwUGFyYW1zKHBhcmFtczogRGF0YUxpc3RQYXJhbXMpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPSBEYXRhTGlzdFBhcmFtc1V0aWwudG9VcmxRdWVyeVBhcmFtcyhwYXJhbXMsIG51bGwpO1xuICAgICAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm91dGVQYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1hcEl0ZW1zVG9FbnRpdHlDaGFuZ2VzQXJyYXkoZmllbGRWYWx1ZToge1trZXk6IHN0cmluZ106IEFycmF5PEVudGl0eUNoYW5nZUR0bz59KTogQXJyYXk8RW50aXR5UmV2aXNpb25DaGFuZ2VzPiB7XG4gICAgICAgIGNvbnN0IGVudGl0eUNoYW5nZXM6IEVudGl0eVJldmlzaW9uQ2hhbmdlc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkVmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBlYyA9IG5ldyBFbnRpdHlSZXZpc2lvbkNoYW5nZXMoKTtcbiAgICAgICAgICAgIGVjLmVudGl0eVR5cGUgPSBrZXk7XG4gICAgICAgICAgICBlYy5pdGVtcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgZmllbGRWYWx1ZVtrZXldKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5yZXZUeXBlID09PSBSZXZpc2lvblR5cGVEdG8uQWRkICYmIGNoYW5nZS5lbnRpdHlOZXdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbmV3IEVudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5yZXZUeXBlID0gY2hhbmdlLnJldlR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY29sb3IgPSAnZ3JlZW4nO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2UuZW50aXR5TmV3U3RhdGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKGl0ZW1ba2V5XSA9IHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIGVjLml0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UucmV2VHlwZSA9PT0gUmV2aXNpb25UeXBlRHRvLkRlbCAmJiBjaGFuZ2UuZW50aXR5T2xkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IG5ldyBFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucmV2VHlwZSA9IGNoYW5nZS5yZXZUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbG9yID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZS5lbnRpdHlPbGRTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiAoaXRlbVtrZXldID0gdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgZWMuaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZXZUeXBlID09PSBSZXZpc2lvblR5cGVEdG8uTW9kICYmIGNoYW5nZS5lbnRpdHlPbGRTdGF0ZSAmJiBjaGFuZ2UuZW50aXR5TmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU9sZCA9IG5ldyBFbnRpdHlSZXZpc2lvbkNoYW5nZVN0YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1PbGQucmV2VHlwZSA9IGNoYW5nZS5yZXZUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpdGVtT2xkLmNvbG9yID0gJ3JlZCc7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZS5lbnRpdHlPbGRTdGF0ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiAoaXRlbU9sZFtrZXldID0gdmFsdWUpKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtTmV3ID0gbmV3IEVudGl0eVJldmlzaW9uQ2hhbmdlU3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbU5ldy5yZXZUeXBlID0gY2hhbmdlLnJldlR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1OZXcuY29sb3IgPSAnZ3JlZW4nO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2UuZW50aXR5TmV3U3RhdGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKGl0ZW1OZXdba2V5XSA9IHZhbHVlKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZWMuaXRlbXMucHVzaChpdGVtT2xkKTtcbiAgICAgICAgICAgICAgICAgICAgZWMuaXRlbXMucHVzaChpdGVtTmV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRpdHlDaGFuZ2VzLnB1c2goZWMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRpdHlDaGFuZ2VzO1xuICAgIH1cbn1cbiJdfQ==