tnx-shared 5.2.28 → 5.2.29

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 (85) hide show
  1. package/assets/docker/docker-entrypoint.sh +1 -1
  2. package/classes/base/list-component-base.d.ts +19 -5
  3. package/classes/base/list-component-base.d.ts.map +1 -1
  4. package/classes/environment-schema.d.ts +23 -20
  5. package/classes/environment-schema.d.ts.map +1 -1
  6. package/classes/public-function.d.ts +1 -0
  7. package/classes/public-function.d.ts.map +1 -1
  8. package/components/chat/chat-box/chat-box.component.d.ts.map +1 -1
  9. package/components/common-app-component/common-app-component.d.ts +1 -3
  10. package/components/common-app-component/common-app-component.d.ts.map +1 -1
  11. package/components/crud/advance-search/advance-search.component.d.ts +6 -6
  12. package/components/crud/advance-search/advance-search.component.d.ts.map +1 -1
  13. package/components/crud/crud-form/crud-form.component.d.ts +6 -0
  14. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  15. package/components/dropdown/dropdown.component.d.ts +5 -3
  16. package/components/dropdown/dropdown.component.d.ts.map +1 -1
  17. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  18. package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts +3 -0
  19. package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts.map +1 -1
  20. package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
  21. package/components/tn-tinymce/tn-tinymce.component.d.ts +2 -0
  22. package/components/tn-tinymce/tn-tinymce.component.d.ts.map +1 -1
  23. package/congviec/congviec/congviec-form/congviec-form.component.d.ts +1 -0
  24. package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
  25. package/directives/primeng/tn-table.directive.d.ts +7 -6
  26. package/directives/primeng/tn-table.directive.d.ts.map +1 -1
  27. package/esm2020/classes/base/list-component-base.mjs +56 -32
  28. package/esm2020/classes/environment-schema.mjs +10 -1
  29. package/esm2020/classes/public-function.mjs +3 -1
  30. package/esm2020/components/add-news/add-news.component.mjs +3 -3
  31. package/esm2020/components/autocomplete-picker/autocomplete-picker.component.mjs +2 -2
  32. package/esm2020/components/chat/chat-box/chat-box.component.mjs +3 -4
  33. package/esm2020/components/chat/chat-send-message-box/chat-send-message-box.component.mjs +2 -2
  34. package/esm2020/components/common-app-component/common-app-component.mjs +57 -57
  35. package/esm2020/components/common-dashboard/common-dashboard.component.mjs +3 -3
  36. package/esm2020/components/crud/advance-search/advance-search.component.mjs +28 -19
  37. package/esm2020/components/crud/crud-form/crud-form.component.mjs +12 -4
  38. package/esm2020/components/crud/crud-list/crud-list.component.mjs +3 -3
  39. package/esm2020/components/crud/tree-table/tree-table.component.mjs +3 -3
  40. package/esm2020/components/dropdown/dropdown.component.mjs +29 -24
  41. package/esm2020/components/entity-permission/entity-permission.component.mjs +3 -3
  42. package/esm2020/components/entity-picker/entity-picker-box/entity-picker-box.component.mjs +3 -3
  43. package/esm2020/components/entity-picker/entity-picker-dialog/entity-picker-dialog.component.mjs +3 -3
  44. package/esm2020/components/file-explorer/file-manager/file-manager.component.mjs +3 -3
  45. package/esm2020/components/main-list/main-list.component.mjs +3 -3
  46. package/esm2020/components/query-builders/query-builder-rule/query-builder-rule.component.mjs +8 -3
  47. package/esm2020/components/radio-button-list/radio-button-list.component.mjs +3 -3
  48. package/esm2020/components/report-queue/report-queue.component.mjs +2 -2
  49. package/esm2020/components/settings/settings.component.mjs +3 -3
  50. package/esm2020/components/tn-app-help/tn-app-help.component.mjs +3 -3
  51. package/esm2020/components/tn-app-notification/tn-app-notification.component.mjs +3 -3
  52. package/esm2020/components/tn-custom-scrollbar/tn-custom-scrollbar.component.mjs +5 -4
  53. package/esm2020/components/tn-tinymce/tn-tinymce.component.mjs +7 -3
  54. package/esm2020/components/user-picker/user-picker-box/user-picker-box.component.mjs +3 -3
  55. package/esm2020/components/user-picker/user-picker.component.mjs +2 -2
  56. package/esm2020/components/workflow/workflow-picker/workflow-picker.component.mjs +3 -3
  57. package/esm2020/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.mjs +3 -3
  58. package/esm2020/congviec/congviec/congviec-form/congviec-form.component.mjs +6 -3
  59. package/esm2020/congviec/congviec/congviec.component.mjs +3 -3
  60. package/esm2020/directives/primeng/tn-table.directive.mjs +28 -13
  61. package/esm2020/services/common.service.mjs +11 -3
  62. package/esm2020/services/environment.service.mjs +48 -7
  63. package/esm2020/services/permission.service.mjs +12 -15
  64. package/esm2020/services/position.service.mjs +2 -2
  65. package/esm2020/services/signalr.service.mjs +3 -3
  66. package/esm2020/services/tn-client.service.mjs +30 -25
  67. package/esm2020/tnx-shared.module.mjs +14 -8
  68. package/fesm2015/tnx-shared.mjs +587 -445
  69. package/fesm2015/tnx-shared.mjs.map +1 -1
  70. package/fesm2020/tnx-shared.mjs +587 -445
  71. package/fesm2020/tnx-shared.mjs.map +1 -1
  72. package/package.json +2 -2
  73. package/services/common.service.d.ts +6 -0
  74. package/services/common.service.d.ts.map +1 -1
  75. package/services/environment.service.d.ts +32 -23
  76. package/services/environment.service.d.ts.map +1 -1
  77. package/services/permission.service.d.ts +5 -0
  78. package/services/permission.service.d.ts.map +1 -1
  79. package/services/position.service.d.ts.map +1 -1
  80. package/services/signalr.service.d.ts +1 -1
  81. package/services/signalr.service.d.ts.map +1 -1
  82. package/services/tn-client.service.d.ts +3 -1
  83. package/services/tn-client.service.d.ts.map +1 -1
  84. package/tnx-shared.module.d.ts +12 -11
  85. package/tnx-shared.module.d.ts.map +1 -1
@@ -16,13 +16,13 @@ export class CommonDashboardComponent extends ComponentBase {
16
16
  }
17
17
  }
18
18
  CommonDashboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CommonDashboardComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
19
- CommonDashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CommonDashboardComponent, selector: "app-common-dashboard", inputs: { appSwitcher: "appSwitcher", greeting: "greeting" }, providers: [ComponentContextService], usesInheritance: true, ngImport: i0, template: "<div class=\"common-dashboard\">\r\n <div class=\"icon\">\r\n <i class=\"{{appSwitcher.icon}}\" [style.color]=\"appSwitcher.colorIcon\"\r\n [style.background-color]=\"appSwitcher.background\"></i>\r\n </div>\r\n <div class=\"greeting\" [style.color]=\"appSwitcher.background\">\r\n <div class=\"greeting-title\">{{greeting}}</div>\r\n <div class=\"long-title\">{{appSwitcher.longTitle}}</div>\r\n </div>\r\n <div class=\"back\" (click)=\"goHome()\">\r\n <i class=\"fas fa-undo\"></i> Quay l\u1EA1i trang ch\u1EE7\r\n </div>\r\n</div>\r\n", styles: ["::ng-deep .common-dashboard{width:100%;height:66.7ch;display:flex;flex-direction:column;justify-content:center;align-items:center}::ng-deep .common-dashboard .icon>i{font-size:40px;padding:10px;border-radius:5px}::ng-deep .common-dashboard .greeting{display:flex;flex-direction:column;padding:20px 0;border-radius:5px}::ng-deep .common-dashboard .greeting>div{display:flex;justify-content:center;align-items:center;text-align:center}::ng-deep .common-dashboard .greeting .greeting-title{font-size:25px;padding-bottom:10px}::ng-deep .common-dashboard .greeting .long-title{font-size:30px;padding-left:5px;font-weight:700;text-transform:uppercase}::ng-deep .common-dashboard .back{font-size:14px;color:#397ac3;opacity:.85;cursor:pointer}::ng-deep .common-dashboard .back:hover{opacity:1}@media (max-width: 640px){.common-dashboard .greeting{padding:15px 0}.common-dashboard .greeting .greeting-title{font-size:16px}.common-dashboard .greeting .long-title{font-size:20px;padding:0}}\n"] });
19
+ CommonDashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CommonDashboardComponent, selector: "app-common-dashboard", inputs: { appSwitcher: "appSwitcher", greeting: "greeting" }, providers: [ComponentContextService], usesInheritance: true, ngImport: i0, template: "<div class=\"common-dashboard\">\r\n <div class=\"icon\">\r\n <i class=\"{{appSwitcher.icon}}\" [style.color]=\"appSwitcher.colorIcon\"\r\n [style.background-color]=\"appSwitcher.background\"></i>\r\n </div>\r\n <div class=\"greeting\" [style.color]=\"appSwitcher.background\">\r\n <div class=\"greeting-title\">{{greeting}}</div>\r\n <div class=\"long-title\">{{appSwitcher.longTitle}}</div>\r\n </div>\r\n <div class=\"back\" (click)=\"goHome()\">\r\n <i class=\"fas fa-undo\"></i> Quay l\u1EA1i trang ch\u1EE7\r\n </div>\r\n</div>", styles: ["::ng-deep .common-dashboard{width:100%;height:66.7ch;display:flex;flex-direction:column;justify-content:center;align-items:center}::ng-deep .common-dashboard .icon>i{font-size:40px;padding:10px;border-radius:5px}::ng-deep .common-dashboard .greeting{display:flex;flex-direction:column;padding:20px 0;border-radius:5px}::ng-deep .common-dashboard .greeting>div{display:flex;justify-content:center;align-items:center;text-align:center}::ng-deep .common-dashboard .greeting .greeting-title{font-size:25px;padding-bottom:10px}::ng-deep .common-dashboard .greeting .long-title{font-size:30px;padding-left:5px;font-weight:700;text-transform:uppercase}::ng-deep .common-dashboard .back{font-size:14px;color:#397ac3;opacity:.85;cursor:pointer}::ng-deep .common-dashboard .back:hover{opacity:1}@media (max-width: 640px){.common-dashboard .greeting{padding:15px 0}.common-dashboard .greeting .greeting-title{font-size:16px}.common-dashboard .greeting .long-title{font-size:20px;padding:0}}\n"] });
20
20
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CommonDashboardComponent, decorators: [{
21
21
  type: Component,
22
- args: [{ selector: 'app-common-dashboard', providers: [ComponentContextService], template: "<div class=\"common-dashboard\">\r\n <div class=\"icon\">\r\n <i class=\"{{appSwitcher.icon}}\" [style.color]=\"appSwitcher.colorIcon\"\r\n [style.background-color]=\"appSwitcher.background\"></i>\r\n </div>\r\n <div class=\"greeting\" [style.color]=\"appSwitcher.background\">\r\n <div class=\"greeting-title\">{{greeting}}</div>\r\n <div class=\"long-title\">{{appSwitcher.longTitle}}</div>\r\n </div>\r\n <div class=\"back\" (click)=\"goHome()\">\r\n <i class=\"fas fa-undo\"></i> Quay l\u1EA1i trang ch\u1EE7\r\n </div>\r\n</div>\r\n", styles: ["::ng-deep .common-dashboard{width:100%;height:66.7ch;display:flex;flex-direction:column;justify-content:center;align-items:center}::ng-deep .common-dashboard .icon>i{font-size:40px;padding:10px;border-radius:5px}::ng-deep .common-dashboard .greeting{display:flex;flex-direction:column;padding:20px 0;border-radius:5px}::ng-deep .common-dashboard .greeting>div{display:flex;justify-content:center;align-items:center;text-align:center}::ng-deep .common-dashboard .greeting .greeting-title{font-size:25px;padding-bottom:10px}::ng-deep .common-dashboard .greeting .long-title{font-size:30px;padding-left:5px;font-weight:700;text-transform:uppercase}::ng-deep .common-dashboard .back{font-size:14px;color:#397ac3;opacity:.85;cursor:pointer}::ng-deep .common-dashboard .back:hover{opacity:1}@media (max-width: 640px){.common-dashboard .greeting{padding:15px 0}.common-dashboard .greeting .greeting-title{font-size:16px}.common-dashboard .greeting .long-title{font-size:20px;padding:0}}\n"] }]
22
+ args: [{ selector: 'app-common-dashboard', providers: [ComponentContextService], template: "<div class=\"common-dashboard\">\r\n <div class=\"icon\">\r\n <i class=\"{{appSwitcher.icon}}\" [style.color]=\"appSwitcher.colorIcon\"\r\n [style.background-color]=\"appSwitcher.background\"></i>\r\n </div>\r\n <div class=\"greeting\" [style.color]=\"appSwitcher.background\">\r\n <div class=\"greeting-title\">{{greeting}}</div>\r\n <div class=\"long-title\">{{appSwitcher.longTitle}}</div>\r\n </div>\r\n <div class=\"back\" (click)=\"goHome()\">\r\n <i class=\"fas fa-undo\"></i> Quay l\u1EA1i trang ch\u1EE7\r\n </div>\r\n</div>", styles: ["::ng-deep .common-dashboard{width:100%;height:66.7ch;display:flex;flex-direction:column;justify-content:center;align-items:center}::ng-deep .common-dashboard .icon>i{font-size:40px;padding:10px;border-radius:5px}::ng-deep .common-dashboard .greeting{display:flex;flex-direction:column;padding:20px 0;border-radius:5px}::ng-deep .common-dashboard .greeting>div{display:flex;justify-content:center;align-items:center;text-align:center}::ng-deep .common-dashboard .greeting .greeting-title{font-size:25px;padding-bottom:10px}::ng-deep .common-dashboard .greeting .long-title{font-size:30px;padding-left:5px;font-weight:700;text-transform:uppercase}::ng-deep .common-dashboard .back{font-size:14px;color:#397ac3;opacity:.85;cursor:pointer}::ng-deep .common-dashboard .back:hover{opacity:1}@media (max-width: 640px){.common-dashboard .greeting{padding:15px 0}.common-dashboard .greeting .greeting-title{font-size:16px}.common-dashboard .greeting .long-title{font-size:20px;padding:0}}\n"] }]
23
23
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { appSwitcher: [{
24
24
  type: Input
25
25
  }], greeting: [{
26
26
  type: Input
27
27
  }] } });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWRhc2hib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1vbi1kYXNoYm9hcmQvY29tbW9uLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1vbi1kYXNoYm9hcmQvY29tbW9uLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFZLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBU2xFLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxhQUFhO0lBUXZELFlBQ0ksU0FBbUI7UUFFbkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBVFosZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFFdEIsYUFBUSxHQUFXLHVCQUF1QixDQUFDO0lBU3BELENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNoRSxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7O3FIQXJCUSx3QkFBd0I7eUdBQXhCLHdCQUF3Qiw2R0FGdEIsQ0FBQyx1QkFBdUIsQ0FBQyxpRENUeEMsb2xCQWFBOzJGREZhLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDSSxzQkFBc0IsYUFHckIsQ0FBQyx1QkFBdUIsQ0FBQzsrRkFJM0IsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1jb21tb24tZGFzaGJvYXJkJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tb24tZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NvbW1vbi1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbW9uRGFzaGJvYXJkQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgQElucHV0KCkgYXBwU3dpdGNoZXI6IGFueSA9IHt9O1xyXG5cclxuICAgIEBJbnB1dCgpIGdyZWV0aW5nOiBzdHJpbmcgPSAnQ2jDoG8gbeG7q25nIGLhuqFuIMSR4bq/biB24bubaSc7XHJcbiAgICBfbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlO1xyXG4gICAgZW52aXJvbm1lbnQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBfaW5qZWN0b3I6IEluamVjdG9yXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmFwcFN3aXRjaGVyID0gdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnb0hvbWUoKSB7XHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoJ0dPX0hPTUUnKTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbW1vbi1kYXNoYm9hcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJ7e2FwcFN3aXRjaGVyLmljb259fVwiIFtzdHlsZS5jb2xvcl09XCJhcHBTd2l0Y2hlci5jb2xvckljb25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJhcHBTd2l0Y2hlci5iYWNrZ3JvdW5kXCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ3JlZXRpbmdcIiBbc3R5bGUuY29sb3JdPVwiYXBwU3dpdGNoZXIuYmFja2dyb3VuZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmVldGluZy10aXRsZVwiPnt7Z3JlZXRpbmd9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb25nLXRpdGxlXCI+e3thcHBTd2l0Y2hlci5sb25nVGl0bGV9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFja1wiIChjbGljayk9XCJnb0hvbWUoKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXVuZG9cIj48L2k+IFF1YXkgbOG6oWkgdHJhbmcgY2jhu6dcclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWRhc2hib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1vbi1kYXNoYm9hcmQvY29tbW9uLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1vbi1kYXNoYm9hcmQvY29tbW9uLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFZLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBU2xFLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxhQUFhO0lBUXZELFlBQ0ksU0FBbUI7UUFHbkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBVlosZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFFdEIsYUFBUSxHQUFXLHVCQUF1QixDQUFDO0lBU3BELENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNoRSxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7O3FIQXJCUSx3QkFBd0I7eUdBQXhCLHdCQUF3Qiw2R0FGdEIsQ0FBQyx1QkFBdUIsQ0FBQyxpRENUeEMsZ2xCQVlNOzJGRERPLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDSSxzQkFBc0IsYUFHckIsQ0FBQyx1QkFBdUIsQ0FBQzsrRkFJM0IsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1jb21tb24tZGFzaGJvYXJkJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tb24tZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NvbW1vbi1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbW9uRGFzaGJvYXJkQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgQElucHV0KCkgYXBwU3dpdGNoZXI6IGFueSA9IHt9O1xyXG5cclxuICAgIEBJbnB1dCgpIGdyZWV0aW5nOiBzdHJpbmcgPSAnQ2jDoG8gbeG7q25nIGLhuqFuIMSR4bq/biB24bubaSc7XHJcbiAgICBfbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlO1xyXG4gICAgZW52aXJvbm1lbnQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIC8vIHByaXZhdGUgX2Vudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmFwcFN3aXRjaGVyID0gdGhpcy5yb290Q29udGV4dC5kYXRhLmN1cnJlbnRBcHBNZXRhZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnb0hvbWUoKSB7XHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoJ0dPX0hPTUUnKTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbW1vbi1kYXNoYm9hcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpY29uXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJ7e2FwcFN3aXRjaGVyLmljb259fVwiIFtzdHlsZS5jb2xvcl09XCJhcHBTd2l0Y2hlci5jb2xvckljb25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJhcHBTd2l0Y2hlci5iYWNrZ3JvdW5kXCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ3JlZXRpbmdcIiBbc3R5bGUuY29sb3JdPVwiYXBwU3dpdGNoZXIuYmFja2dyb3VuZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmVldGluZy10aXRsZVwiPnt7Z3JlZXRpbmd9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb25nLXRpdGxlXCI+e3thcHBTd2l0Y2hlci5sb25nVGl0bGV9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFja1wiIChjbGljayk9XCJnb0hvbWUoKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXVuZG9cIj48L2k+IFF1YXkgbOG6oWkgdHJhbmcgY2jhu6dcclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=
@@ -23,7 +23,7 @@ import * as i13 from "../crud-form/crud-form.component";
23
23
  import * as i14 from "../../tn-custom-scrollbar/tn-custom-scrollbar.component";
24
24
  import * as i15 from "../../query-builders/query-builder/query-builder.component";
25
25
  export class AdvanceSearchComponent extends ComponentBase {
26
- constructor(_customRouterService, _injector, _notifierService, _translateService, _deviceDetectorService, _localCacheService, _renderer, _environmentService) {
26
+ constructor(_injector, _customRouterService, _notifierService, _translateService, _deviceDetectorService, _localCacheService, _renderer, _environmentService, _changeDetector) {
27
27
  super(_injector);
28
28
  this._customRouterService = _customRouterService;
29
29
  this._notifierService = _notifierService;
@@ -32,6 +32,7 @@ export class AdvanceSearchComponent extends ComponentBase {
32
32
  this._localCacheService = _localCacheService;
33
33
  this._renderer = _renderer;
34
34
  this._environmentService = _environmentService;
35
+ this._changeDetector = _changeDetector;
35
36
  this.allowLoadDataWhenParentNull = true;
36
37
  this.onSearch = new EventEmitter();
37
38
  this.onFormEvent = new EventEmitter();
@@ -314,6 +315,13 @@ export class AdvanceSearchComponent extends ComponentBase {
314
315
  }
315
316
  showFormSearch() {
316
317
  this.showForm = !this.showForm;
318
+ this._changeDetector.detectChanges();
319
+ if (this.showForm === true) {
320
+ this.onOverlayShow();
321
+ }
322
+ else {
323
+ this.onOverlayHide();
324
+ }
317
325
  }
318
326
  handleSaveSetting(filters) {
319
327
  let pathName = location.pathname;
@@ -392,34 +400,35 @@ export class AdvanceSearchComponent extends ComponentBase {
392
400
  }
393
401
  }
394
402
  appendOverlay() {
395
- if (this._overlayPanel) {
396
- document.body.appendChild(this._overlayPanel);
397
- this._overlayPanel.style.zIndex = String(++DomHandler.zindex);
403
+ if (this._overlayPanel && this._overlayPanel.nativeElement) {
404
+ document.body.appendChild(this._overlayPanel.nativeElement);
405
+ this._overlayPanel.nativeElement.style.zIndex = String(++DomHandler.zindex);
398
406
  }
399
407
  }
400
408
  alignOverlay() {
401
409
  this.appendMask();
402
- DomHandler.absolutePosition(this._overlayPanel, this.el.nativeElement);
410
+ DomHandler.absolutePosition(this._overlayPanel.nativeElement, this.el.nativeElement);
403
411
  }
404
412
  restoreOverlayAppend() {
405
- this._overlayPanel && this.el.nativeElement.appendChild(this._overlayPanel);
413
+ this._overlayPanel && this.el.nativeElement.appendChild(this._overlayPanel.nativeElement);
406
414
  }
407
415
  onOverlayHide() {
408
416
  this.unbindDocumentResizeListener();
409
417
  this.unbindMaskClickListener();
410
- this._overlayPanel = null;
411
418
  this.removeMask();
412
419
  }
413
420
  handleAdvanceSearchPanelRendered() {
414
421
  this._searchBoxMaxHeight = `calc(100vh - ${this.el.nativeElement.getBoundingClientRect().top + 150}px)`;
415
422
  }
423
+ onOverlayShow() {
424
+ this.appendOverlay();
425
+ this.alignOverlay();
426
+ this.bindDocumentResizeListener();
427
+ }
416
428
  onOverlayAnimationStart(event) {
417
429
  switch (event.toState) {
418
430
  case 'visible':
419
- this._overlayPanel = event.element;
420
- this.appendOverlay();
421
- this.alignOverlay();
422
- this.bindDocumentResizeListener();
431
+ this.onOverlayShow();
423
432
  break;
424
433
  case 'void':
425
434
  this.onOverlayHide();
@@ -435,7 +444,7 @@ export class AdvanceSearchComponent extends ComponentBase {
435
444
  appendMask() {
436
445
  if (!this.maskOverlay) {
437
446
  this.maskOverlay = document.createElement('div');
438
- this.maskOverlay.style.zIndex = String(parseInt(this._overlayPanel.style.zIndex) - 1);
447
+ this.maskOverlay.style.zIndex = String(parseInt(this._overlayPanel.nativeElement.style.zIndex) - 1);
439
448
  DomHandler.addClass(this.maskOverlay, 'advance-search-mask-overlay');
440
449
  this.maskClickListener = this._renderer.listen(this.maskOverlay, 'click', (event) => {
441
450
  this.hideFormSearch();
@@ -457,20 +466,20 @@ export class AdvanceSearchComponent extends ComponentBase {
457
466
  this.onOverlayHide();
458
467
  }
459
468
  }
460
- AdvanceSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AdvanceSearchComponent, deps: [{ token: i1.CustomRouterService }, { token: i0.Injector }, { token: i2.NotifierService }, { token: i3.TranslateService }, { token: i4.DeviceDetectorService }, { token: i5.LocalCacheService }, { token: i0.Renderer2 }, { token: i6.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
461
- AdvanceSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: AdvanceSearchComponent, selector: "advance-search", inputs: { parentSetting: "parentSetting", searchInfo: "searchInfo", allowLoadDataWhenParentNull: "allowLoadDataWhenParentNull", loading: "loading" }, outputs: { onSearch: "onSearch", onFormEvent: "onFormEvent", onInit: "onInit" }, providers: [ComponentContextService], viewQueries: [{ propertyName: "el", first: true, predicate: ["el"], descendants: true }, { propertyName: "crudForm", first: true, predicate: ["crudForm"], descendants: true }, { propertyName: "overlayPanel", first: true, predicate: ["overlayPanel"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #el class=\"box-advance-search-inline p-inputgroup\">\r\n <input type=\"text\" pInputText placeholder=\"Nh\u1EADp t\u1EEB kh\u00F3a t\u00ECm ki\u1EBFm\" [pTooltip]=\"searchBoxTooltip\"\r\n tooltipStyleClass=\"wrap max-width-300\" tooltipPosition=\"top\"\r\n [disabled]=\"!parentSetting.fieldSearchText || !parentSetting.fieldSearchText.length\" [(ngModel)]=\"keyword\"\r\n (change)=\"onChanged($event)\" (keyup.esc)=\"onEsc($event)\" />\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [class.dirty]=\"!!keyword\"\r\n [pTooltip]=\"'X\u00F3a t\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\" (click)=\"clearKeyword()\">\r\n <i class=\"pi pi-filter-slash\"></i>\r\n </span>\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [pTooltip]=\"'T\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\"\r\n (click)=\"onDoSearching()\">\r\n <i class=\"pi pi-search\"></i>\r\n </span>\r\n <span class=\"container-search-dialog p-inputgroup-addon action action-trigger\" tabindex=\"0\" [class.show]=\"showForm\"\r\n [pTooltip]=\"'T\u00ECm ki\u1EBFm n\u00E2ng cao'\" tooltipPosition=\"top\">\r\n <span (click)=\"showFormSearch()\">\r\n <i class=\"pi pi-caret-down\"></i>\r\n </span>\r\n </span>\r\n <ng-container *ngIf=\"showForm\">\r\n <div #overlayPanel\r\n class=\"advance-search-overlay-panel filter-content p-overlaypanel p-widget-content fadeInDown advance-search-box\"\r\n [@overlayAnimation]=\"{value: 'visible', params: {showTransitionParams: overlayShowTransitionOptions, hideTransitionParams: overlayHideTransitionOptions}}\"\r\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\" (keyup.enter)=\"onDoSearching()\"\r\n (keyup.esc)=\"hideFormSearch()\" (mousedown)=\"onClick($event)\">\r\n <!-- <a class=\"advance-filter-close ng-star-inserted\" href=\"javascript:void(0);\" (click)=\"hideFormSearch()\"><i\r\n class=\"pi pi-times\"></i></a> -->\r\n <ng-container *ngIf=\"parentSetting.filterTemplateAdvs\">\r\n <tn-custom-scrollbar #scrollbar\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline' }\">\r\n <crud-form *ngIf=\"ready\" #crudForm [data]=\"modelCrudForm\" [setting]=\"setting\" [context]=\"context\"\r\n [disableKeypressControl]=\"true\" [disableCaching]=\"true\" (onFormShow)=\"onFormShow($event)\"\r\n (onFormHide)=\"onFormHide($event)\">\r\n </crud-form>\r\n </tn-custom-scrollbar>\r\n <div class=\"footer-search\">\r\n <button type=\"button\" pButton icon=\"pi pi-search\" class=\"p-button-text p-button-info\"\r\n [label]=\"'T\u00ECm ki\u1EBFm' | translate\" (click)=\"onDoSearching()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'X\u00F3a t\u00ECm ki\u1EBFm' | translate\" (click)=\"clearSearch($event)\" preventTab></button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!parentSetting.filterTemplateAdvs\">\r\n <query-builder [searchSchema]=\"setting.schema\" [filters]=\"filter_query\"\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline'}\"\r\n (onSave)=\"handleSaveSetting($event)\" (onDeleteSave)=\"handleDeleteSaveSetting()\"\r\n (onSearch)=\"handleSearchBuilder($event)\"></query-builder>\r\n </ng-container>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"handleAdvanceSearchPanelRendered()\">\r\n </after-view-checked>\r\n </div>\r\n </ng-container>\r\n</div>", styles: [".advance-search-box{border:1px solid #eee;border-radius:0;overflow:hidden}.advance-filter-close{position:absolute;z-index:1;right:3px;top:3px;font-size:.9em;color:#666;background:#fff}.action-trigger{padding:0;outline:none}.action-trigger>span:first-child{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.footer-search{background:#f7f7f7;border-top:1px solid #dee2e6;padding:10px;padding-right:1rem;position:sticky;bottom:0}.box-advance-search-inline{justify-content:flex-end}.box-advance-search-inline input{padding:5px 12px}.box-advance-search-inline .action{cursor:pointer}.box-advance-search-inline .action.dirty{color:#008eff;pointer-events:unset}.box-advance-search-inline .action.disabled{background:#e9ecef;color:#d6d6d6;pointer-events:none;cursor:unset}.box-advance-search-inline .action:hover{background:#f5f6f8}::ng-deep .advance-search-mask-overlay{position:fixed;inset:0;background:rgba(0,0,0,.1450980392);z-index:999}::ng-deep .advance-search-overlay-panel{width:800px;position:fixed;max-width:calc(100vw - 2rem);padding:0;z-index:1000;margin-top:0;animation-duration:.5s;border:0px;box-shadow:0 6px 12px #00000042}::ng-deep .advance-search-overlay-panel perfect-scrollbar{display:flex;flex-direction:column}::ng-deep .advance-search-overlay-panel:not(.hide){display:block!important}@media (min-width: 768px){.box-advance-search-inline input{max-width:300px}}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.InputText, selector: "[pInputText]" }, { kind: "component", type: i12.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i13.CrudFormComponent, selector: "crud-form", inputs: ["setting", "context", "filesUploaded", "isViewMode", "disableKeypressControl", "disableCaching", "styleClass", "useGridTemplate", "formId", "formClass", "autoFocus", "trapFocus", "data", "formState"], outputs: ["onFormReady", "onControlReady", "onAllControlReady", "onModelChanged", "dataChange", "onChange", "onAfterTrinhKy"] }, { kind: "component", type: i14.TnCustomScrollbarComponent, selector: "tn-custom-scrollbar", inputs: ["style", "useDefaultScrollBar", "autoMode", "class", "config", "whiteBackGround", "showScrollHorizontal"], outputs: ["scrollY", "scrollUp", "scrollDown", "scrollLeft", "scrollRight", "scrollYReachEnd", "scrollYReachStart", "scrollXReachEnd", "scrollXReachStart"] }, { kind: "component", type: i15.QueryBuilderComponent, selector: "query-builder", inputs: ["searchSchema", "filters", "style", "styleClass", "useScrollBar", "hiddenButtons"], outputs: ["onSearch", "onSave", "onDeleteSave"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
469
+ AdvanceSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AdvanceSearchComponent, deps: [{ token: i0.Injector }, { token: i1.CustomRouterService }, { token: i2.NotifierService }, { token: i3.TranslateService }, { token: i4.DeviceDetectorService }, { token: i5.LocalCacheService }, { token: i0.Renderer2 }, { token: i6.EnvironmentService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
470
+ AdvanceSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: AdvanceSearchComponent, selector: "advance-search", inputs: { parentSetting: "parentSetting", searchInfo: "searchInfo", allowLoadDataWhenParentNull: "allowLoadDataWhenParentNull", loading: "loading" }, outputs: { onSearch: "onSearch", onFormEvent: "onFormEvent", onInit: "onInit" }, providers: [ComponentContextService], viewQueries: [{ propertyName: "el", first: true, predicate: ["el"], descendants: true }, { propertyName: "crudForm", first: true, predicate: ["crudForm"], descendants: true }, { propertyName: "_overlayPanel", first: true, predicate: ["overlayPanel"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div #el class=\"box-advance-search-inline p-inputgroup\">\r\n <input type=\"text\" pInputText placeholder=\"Nh\u1EADp t\u1EEB kh\u00F3a t\u00ECm ki\u1EBFm\" [pTooltip]=\"searchBoxTooltip\"\r\n tooltipStyleClass=\"wrap max-width-300\" tooltipPosition=\"top\"\r\n [disabled]=\"!parentSetting.fieldSearchText || !parentSetting.fieldSearchText.length\" [(ngModel)]=\"keyword\"\r\n (change)=\"onChanged($event)\" (keyup.esc)=\"onEsc($event)\" />\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [class.dirty]=\"!!keyword\"\r\n [pTooltip]=\"'X\u00F3a t\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\" (click)=\"clearKeyword()\">\r\n <i class=\"pi pi-filter-slash\"></i>\r\n </span>\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [pTooltip]=\"'T\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\"\r\n (click)=\"onDoSearching()\">\r\n <i class=\"pi pi-search\"></i>\r\n </span>\r\n <span class=\"container-search-dialog p-inputgroup-addon action action-trigger\" tabindex=\"0\" [class.show]=\"showForm\"\r\n [pTooltip]=\"'T\u00ECm ki\u1EBFm n\u00E2ng cao'\" tooltipPosition=\"top\">\r\n <span (click)=\"showFormSearch()\">\r\n <i class=\"pi pi-caret-down\"></i>\r\n </span>\r\n </span>\r\n</div>\r\n\r\n<div *ngIf=\"showForm\" #overlayPanel\r\n class=\"advance-search-overlay-panel filter-content p-overlaypanel p-widget-content fadeInDown advance-search-box\"\r\n (keyup.enter)=\"onDoSearching()\" (keyup.esc)=\"hideFormSearch()\" (mousedown)=\"onClick($event)\">\r\n <!-- [@overlayAnimation]=\"{value: 'visible', params: {showTransitionParams: overlayShowTransitionOptions, hideTransitionParams: overlayHideTransitionOptions}}\" -->\r\n <!-- (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\" -->\r\n\r\n <!-- <a class=\"advance-filter-close ng-star-inserted\" href=\"javascript:void(0);\" (click)=\"hideFormSearch()\"><i\r\n class=\"pi pi-times\"></i></a> -->\r\n <ng-container *ngIf=\"parentSetting.filterTemplateAdvs\">\r\n <tn-custom-scrollbar #scrollbar\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline' }\">\r\n <crud-form *ngIf=\"ready\" #crudForm [data]=\"modelCrudForm\" [setting]=\"setting\" [context]=\"context\"\r\n [disableKeypressControl]=\"true\" [disableCaching]=\"true\" (onFormShow)=\"onFormShow($event)\"\r\n (onFormHide)=\"onFormHide($event)\">\r\n </crud-form>\r\n </tn-custom-scrollbar>\r\n <div class=\"footer-search\">\r\n <button type=\"button\" pButton icon=\"pi pi-search\" class=\"p-button-text p-button-info\"\r\n [label]=\"'T\u00ECm ki\u1EBFm' | translate\" (click)=\"onDoSearching()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'X\u00F3a t\u00ECm ki\u1EBFm' | translate\" (click)=\"clearSearch($event)\" preventTab></button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!parentSetting.filterTemplateAdvs\">\r\n <query-builder [searchSchema]=\"setting.schema\" [filters]=\"filter_query\"\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline'}\"\r\n (onSave)=\"handleSaveSetting($event)\" (onDeleteSave)=\"handleDeleteSaveSetting()\"\r\n (onSearch)=\"handleSearchBuilder($event)\">\r\n </query-builder>\r\n </ng-container>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"handleAdvanceSearchPanelRendered()\">\r\n </after-view-checked>\r\n</div>", styles: [".advance-search-box{border:1px solid #eee;border-radius:0;overflow:hidden}.advance-filter-close{position:absolute;z-index:1;right:3px;top:3px;font-size:.9em;color:#666;background:#fff}.action-trigger{padding:0;outline:none}.action-trigger>span:first-child{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.footer-search{background:#f7f7f7;border-top:1px solid #dee2e6;padding:10px;padding-right:1rem;position:sticky;bottom:0}.box-advance-search-inline{justify-content:flex-end}.box-advance-search-inline input{padding:5px 12px}.box-advance-search-inline .action{cursor:pointer}.box-advance-search-inline .action.dirty{color:#008eff;pointer-events:unset}.box-advance-search-inline .action.disabled{background:#e9ecef;color:#d6d6d6;pointer-events:none;cursor:unset}.box-advance-search-inline .action:hover{background:#f5f6f8}::ng-deep .advance-search-mask-overlay{position:fixed;inset:0;background:rgba(0,0,0,.1450980392);z-index:999}::ng-deep .advance-search-overlay-panel{width:800px;position:fixed;max-width:calc(100vw - 2rem);padding:0;z-index:1000;margin-top:0;animation-duration:.5s;border:0px;box-shadow:0 6px 12px #00000042}::ng-deep .advance-search-overlay-panel perfect-scrollbar{display:flex;flex-direction:column}::ng-deep .advance-search-overlay-panel:not(.hide){display:block!important}@media (min-width: 768px){.box-advance-search-inline input{max-width:300px}}\n"], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.InputText, selector: "[pInputText]" }, { kind: "component", type: i12.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i13.CrudFormComponent, selector: "crud-form", inputs: ["setting", "context", "filesUploaded", "isViewMode", "disableKeypressControl", "disableCaching", "styleClass", "useGridTemplate", "formId", "formClass", "autoFocus", "trapFocus", "data", "formState"], outputs: ["onFormReady", "onControlReady", "onAllControlReady", "onModelChanged", "dataChange", "onChange", "onAfterTrinhKy"] }, { kind: "component", type: i14.TnCustomScrollbarComponent, selector: "tn-custom-scrollbar", inputs: ["style", "useDefaultScrollBar", "autoMode", "class", "config", "whiteBackGround", "showScrollHorizontal"], outputs: ["scrollY", "scrollUp", "scrollDown", "scrollLeft", "scrollRight", "scrollYReachEnd", "scrollYReachStart", "scrollXReachEnd", "scrollXReachStart"] }, { kind: "component", type: i15.QueryBuilderComponent, selector: "query-builder", inputs: ["searchSchema", "filters", "style", "styleClass", "useScrollBar", "hiddenButtons"], outputs: ["onSearch", "onSave", "onDeleteSave"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
462
471
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: AdvanceSearchComponent, decorators: [{
463
472
  type: Component,
464
- args: [{ selector: 'advance-search', providers: [ComponentContextService], template: "<div #el class=\"box-advance-search-inline p-inputgroup\">\r\n <input type=\"text\" pInputText placeholder=\"Nh\u1EADp t\u1EEB kh\u00F3a t\u00ECm ki\u1EBFm\" [pTooltip]=\"searchBoxTooltip\"\r\n tooltipStyleClass=\"wrap max-width-300\" tooltipPosition=\"top\"\r\n [disabled]=\"!parentSetting.fieldSearchText || !parentSetting.fieldSearchText.length\" [(ngModel)]=\"keyword\"\r\n (change)=\"onChanged($event)\" (keyup.esc)=\"onEsc($event)\" />\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [class.dirty]=\"!!keyword\"\r\n [pTooltip]=\"'X\u00F3a t\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\" (click)=\"clearKeyword()\">\r\n <i class=\"pi pi-filter-slash\"></i>\r\n </span>\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [pTooltip]=\"'T\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\"\r\n (click)=\"onDoSearching()\">\r\n <i class=\"pi pi-search\"></i>\r\n </span>\r\n <span class=\"container-search-dialog p-inputgroup-addon action action-trigger\" tabindex=\"0\" [class.show]=\"showForm\"\r\n [pTooltip]=\"'T\u00ECm ki\u1EBFm n\u00E2ng cao'\" tooltipPosition=\"top\">\r\n <span (click)=\"showFormSearch()\">\r\n <i class=\"pi pi-caret-down\"></i>\r\n </span>\r\n </span>\r\n <ng-container *ngIf=\"showForm\">\r\n <div #overlayPanel\r\n class=\"advance-search-overlay-panel filter-content p-overlaypanel p-widget-content fadeInDown advance-search-box\"\r\n [@overlayAnimation]=\"{value: 'visible', params: {showTransitionParams: overlayShowTransitionOptions, hideTransitionParams: overlayHideTransitionOptions}}\"\r\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\" (keyup.enter)=\"onDoSearching()\"\r\n (keyup.esc)=\"hideFormSearch()\" (mousedown)=\"onClick($event)\">\r\n <!-- <a class=\"advance-filter-close ng-star-inserted\" href=\"javascript:void(0);\" (click)=\"hideFormSearch()\"><i\r\n class=\"pi pi-times\"></i></a> -->\r\n <ng-container *ngIf=\"parentSetting.filterTemplateAdvs\">\r\n <tn-custom-scrollbar #scrollbar\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline' }\">\r\n <crud-form *ngIf=\"ready\" #crudForm [data]=\"modelCrudForm\" [setting]=\"setting\" [context]=\"context\"\r\n [disableKeypressControl]=\"true\" [disableCaching]=\"true\" (onFormShow)=\"onFormShow($event)\"\r\n (onFormHide)=\"onFormHide($event)\">\r\n </crud-form>\r\n </tn-custom-scrollbar>\r\n <div class=\"footer-search\">\r\n <button type=\"button\" pButton icon=\"pi pi-search\" class=\"p-button-text p-button-info\"\r\n [label]=\"'T\u00ECm ki\u1EBFm' | translate\" (click)=\"onDoSearching()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'X\u00F3a t\u00ECm ki\u1EBFm' | translate\" (click)=\"clearSearch($event)\" preventTab></button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!parentSetting.filterTemplateAdvs\">\r\n <query-builder [searchSchema]=\"setting.schema\" [filters]=\"filter_query\"\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline'}\"\r\n (onSave)=\"handleSaveSetting($event)\" (onDeleteSave)=\"handleDeleteSaveSetting()\"\r\n (onSearch)=\"handleSearchBuilder($event)\"></query-builder>\r\n </ng-container>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"handleAdvanceSearchPanelRendered()\">\r\n </after-view-checked>\r\n </div>\r\n </ng-container>\r\n</div>", styles: [".advance-search-box{border:1px solid #eee;border-radius:0;overflow:hidden}.advance-filter-close{position:absolute;z-index:1;right:3px;top:3px;font-size:.9em;color:#666;background:#fff}.action-trigger{padding:0;outline:none}.action-trigger>span:first-child{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.footer-search{background:#f7f7f7;border-top:1px solid #dee2e6;padding:10px;padding-right:1rem;position:sticky;bottom:0}.box-advance-search-inline{justify-content:flex-end}.box-advance-search-inline input{padding:5px 12px}.box-advance-search-inline .action{cursor:pointer}.box-advance-search-inline .action.dirty{color:#008eff;pointer-events:unset}.box-advance-search-inline .action.disabled{background:#e9ecef;color:#d6d6d6;pointer-events:none;cursor:unset}.box-advance-search-inline .action:hover{background:#f5f6f8}::ng-deep .advance-search-mask-overlay{position:fixed;inset:0;background:rgba(0,0,0,.1450980392);z-index:999}::ng-deep .advance-search-overlay-panel{width:800px;position:fixed;max-width:calc(100vw - 2rem);padding:0;z-index:1000;margin-top:0;animation-duration:.5s;border:0px;box-shadow:0 6px 12px #00000042}::ng-deep .advance-search-overlay-panel perfect-scrollbar{display:flex;flex-direction:column}::ng-deep .advance-search-overlay-panel:not(.hide){display:block!important}@media (min-width: 768px){.box-advance-search-inline input{max-width:300px}}\n"] }]
465
- }], ctorParameters: function () { return [{ type: i1.CustomRouterService }, { type: i0.Injector }, { type: i2.NotifierService }, { type: i3.TranslateService }, { type: i4.DeviceDetectorService }, { type: i5.LocalCacheService }, { type: i0.Renderer2 }, { type: i6.EnvironmentService }]; }, propDecorators: { el: [{
473
+ args: [{ selector: 'advance-search', providers: [ComponentContextService], template: "<div #el class=\"box-advance-search-inline p-inputgroup\">\r\n <input type=\"text\" pInputText placeholder=\"Nh\u1EADp t\u1EEB kh\u00F3a t\u00ECm ki\u1EBFm\" [pTooltip]=\"searchBoxTooltip\"\r\n tooltipStyleClass=\"wrap max-width-300\" tooltipPosition=\"top\"\r\n [disabled]=\"!parentSetting.fieldSearchText || !parentSetting.fieldSearchText.length\" [(ngModel)]=\"keyword\"\r\n (change)=\"onChanged($event)\" (keyup.esc)=\"onEsc($event)\" />\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [class.dirty]=\"!!keyword\"\r\n [pTooltip]=\"'X\u00F3a t\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\" (click)=\"clearKeyword()\">\r\n <i class=\"pi pi-filter-slash\"></i>\r\n </span>\r\n <span class=\"p-inputgroup-addon action\" [class.disabled]=\"loading\" [pTooltip]=\"'T\u00ECm ki\u1EBFm'\" tooltipPosition=\"top\"\r\n (click)=\"onDoSearching()\">\r\n <i class=\"pi pi-search\"></i>\r\n </span>\r\n <span class=\"container-search-dialog p-inputgroup-addon action action-trigger\" tabindex=\"0\" [class.show]=\"showForm\"\r\n [pTooltip]=\"'T\u00ECm ki\u1EBFm n\u00E2ng cao'\" tooltipPosition=\"top\">\r\n <span (click)=\"showFormSearch()\">\r\n <i class=\"pi pi-caret-down\"></i>\r\n </span>\r\n </span>\r\n</div>\r\n\r\n<div *ngIf=\"showForm\" #overlayPanel\r\n class=\"advance-search-overlay-panel filter-content p-overlaypanel p-widget-content fadeInDown advance-search-box\"\r\n (keyup.enter)=\"onDoSearching()\" (keyup.esc)=\"hideFormSearch()\" (mousedown)=\"onClick($event)\">\r\n <!-- [@overlayAnimation]=\"{value: 'visible', params: {showTransitionParams: overlayShowTransitionOptions, hideTransitionParams: overlayHideTransitionOptions}}\" -->\r\n <!-- (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\" -->\r\n\r\n <!-- <a class=\"advance-filter-close ng-star-inserted\" href=\"javascript:void(0);\" (click)=\"hideFormSearch()\"><i\r\n class=\"pi pi-times\"></i></a> -->\r\n <ng-container *ngIf=\"parentSetting.filterTemplateAdvs\">\r\n <tn-custom-scrollbar #scrollbar\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline' }\">\r\n <crud-form *ngIf=\"ready\" #crudForm [data]=\"modelCrudForm\" [setting]=\"setting\" [context]=\"context\"\r\n [disableKeypressControl]=\"true\" [disableCaching]=\"true\" (onFormShow)=\"onFormShow($event)\"\r\n (onFormHide)=\"onFormHide($event)\">\r\n </crud-form>\r\n </tn-custom-scrollbar>\r\n <div class=\"footer-search\">\r\n <button type=\"button\" pButton icon=\"pi pi-search\" class=\"p-button-text p-button-info\"\r\n [label]=\"'T\u00ECm ki\u1EBFm' | translate\" (click)=\"onDoSearching()\"></button>\r\n <button type=\"button\" pButton icon=\"pi pi-replay\" class=\"p-button-text p-button-secondary\"\r\n [label]=\"'X\u00F3a t\u00ECm ki\u1EBFm' | translate\" (click)=\"clearSearch($event)\" preventTab></button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!parentSetting.filterTemplateAdvs\">\r\n <query-builder [searchSchema]=\"setting.schema\" [filters]=\"filter_query\"\r\n [style]=\"{ maxHeight: _searchBoxMaxHeight, minHeight: '300px', height: 'auto', parentClass: 'box-advance-search-inline'}\"\r\n (onSave)=\"handleSaveSetting($event)\" (onDeleteSave)=\"handleDeleteSaveSetting()\"\r\n (onSearch)=\"handleSearchBuilder($event)\">\r\n </query-builder>\r\n </ng-container>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"handleAdvanceSearchPanelRendered()\">\r\n </after-view-checked>\r\n</div>", styles: [".advance-search-box{border:1px solid #eee;border-radius:0;overflow:hidden}.advance-filter-close{position:absolute;z-index:1;right:3px;top:3px;font-size:.9em;color:#666;background:#fff}.action-trigger{padding:0;outline:none}.action-trigger>span:first-child{display:flex;width:100%;height:100%;align-items:center;justify-content:center}.footer-search{background:#f7f7f7;border-top:1px solid #dee2e6;padding:10px;padding-right:1rem;position:sticky;bottom:0}.box-advance-search-inline{justify-content:flex-end}.box-advance-search-inline input{padding:5px 12px}.box-advance-search-inline .action{cursor:pointer}.box-advance-search-inline .action.dirty{color:#008eff;pointer-events:unset}.box-advance-search-inline .action.disabled{background:#e9ecef;color:#d6d6d6;pointer-events:none;cursor:unset}.box-advance-search-inline .action:hover{background:#f5f6f8}::ng-deep .advance-search-mask-overlay{position:fixed;inset:0;background:rgba(0,0,0,.1450980392);z-index:999}::ng-deep .advance-search-overlay-panel{width:800px;position:fixed;max-width:calc(100vw - 2rem);padding:0;z-index:1000;margin-top:0;animation-duration:.5s;border:0px;box-shadow:0 6px 12px #00000042}::ng-deep .advance-search-overlay-panel perfect-scrollbar{display:flex;flex-direction:column}::ng-deep .advance-search-overlay-panel:not(.hide){display:block!important}@media (min-width: 768px){.box-advance-search-inline input{max-width:300px}}\n"] }]
474
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.CustomRouterService }, { type: i2.NotifierService }, { type: i3.TranslateService }, { type: i4.DeviceDetectorService }, { type: i5.LocalCacheService }, { type: i0.Renderer2 }, { type: i6.EnvironmentService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { el: [{
466
475
  type: ViewChild,
467
476
  args: ['el']
468
477
  }], crudForm: [{
469
478
  type: ViewChild,
470
479
  args: ['crudForm']
471
- }], overlayPanel: [{
480
+ }], _overlayPanel: [{
472
481
  type: ViewChild,
473
- args: ['overlayPanel']
482
+ args: ['overlayPanel', { static: false }]
474
483
  }], parentSetting: [{
475
484
  type: Input
476
485
  }], searchInfo: [{
@@ -486,4 +495,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
486
495
  }], onInit: [{
487
496
  type: Output
488
497
  }] } });
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZS1zZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9jcnVkL2FkdmFuY2Utc2VhcmNoL2FkdmFuY2Utc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC9hZHZhbmNlLXNlYXJjaC9hZHZhbmNlLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFFWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXJFLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsb0JBQW9CLEVBQUUsWUFBWSxFQUVsQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFDNUMsaUJBQWlCLEVBQ3BCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU9uRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0NBQStDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU2hGLE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxhQUFhO0lBdURyRCxZQUNZLG9CQUF5QyxFQUNqRCxTQUFtQixFQUNYLGdCQUFpQyxFQUNqQyxpQkFBbUMsRUFDcEMsc0JBQTZDLEVBQzVDLGtCQUFxQyxFQUNyQyxTQUFvQixF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QUF1QixDQUFDLGlVQ3pDeEMsbStIQW9ETTsyRkRUTyxzQkFBc0I7a0JBUGxDLFNBQVM7K0JBRUksZ0JBQWdCLGFBR2YsQ0FBQyx1QkFBdUIsQ0FBQzsyVEFJbkIsRUFBRTtzQkFBbEIsU0FBUzt1QkFBQyxJQUFJO2dCQUNRLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDTSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBRWhCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRU8sVUFBVTtzQkFBdEIsS0FBSztnQkFTRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbmltYXRpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgUmVuZGVyZXIyLFxyXG4gICAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LWRldmljZS1kZXRlY3Rvcic7XHJcbmltcG9ydCB7IERvbUhhbmRsZXIgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9kb20nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgSUNvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICAgIEFkdmFuY2VTZWFyY2hEYXRhLFxyXG4gICAgQWR2YW5jZVNlYXJjaFNldHRpbmcsIENydWRGb3JtRGF0YSxcclxuICAgIENydWRMaXN0U2V0dGluZyxcclxuICAgIERhdGVUaW1lQ29udHJvbFNjaGVtYSwgRHJvcGRvd25Db250cm9sU2NoZW1hLCBGb3JtU2NoZW1hQmFzZSxcclxuICAgIFRleHRDb250cm9sU2NoZW1hXHJcbn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMvY29tbW9uJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IEN1c3RvbVJvdXRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jdXN0b20tcm91dGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9jYWxDYWNoZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9sb2NhbENhY2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VhcmNoSW5mbyB9IGZyb20gJy4uLy4uL21vZGVscy9zZWFyY2gnO1xyXG5pbXBvcnQgeyBDcnVkRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2NydWQtZm9ybS9jcnVkLWZvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi8uLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcclxuICAgIHNlbGVjdG9yOiAnYWR2YW5jZS1zZWFyY2gnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkdmFuY2Utc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2FkdmFuY2Utc2VhcmNoLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtDb21wb25lbnRDb250ZXh0U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFkdmFuY2VTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBJQ29tcG9uZW50QmFzZSB7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZWwnKSBlbDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2NydWRGb3JtJykgY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZCgnb3ZlcmxheVBhbmVsJykgb3ZlcmxheVBhbmVsOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBJbnB1dCgpIHBhcmVudFNldHRpbmc6IENydWRMaXN0U2V0dGluZztcclxuICAgIF9zZWFyY2hJbmZvOiBTZWFyY2hJbmZvO1xyXG4gICAgQElucHV0KCkgc2V0IHNlYXJjaEluZm8odmFsdWU6IFNlYXJjaEluZm8pIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hJbmZvID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NlYXJjaEluZm8gJiYgdGhpcy5fc2VhcmNoSW5mby5zY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBnZXQgc2VhcmNoSW5mbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VhcmNoSW5mbztcclxuICAgIH1cclxuICAgIEBJbnB1dCgpIGFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbCA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBsb2FkaW5nOiBmYWxzZTtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25TZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkZvcm1FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIF9vdmVybGF5UGFuZWw6IEhUTUxEaXZFbGVtZW50O1xyXG4gICAgb3ZlcmxheVNob3dUcmFuc2l0aW9uT3B0aW9uczogc3RyaW5nID0gJy4xMnMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSknO1xyXG4gICAgb3ZlcmxheUhpZGVUcmFuc2l0aW9uT3B0aW9uczogc3RyaW5nID0gJy4xcyBsaW5lYXInO1xyXG4gICAgYWxpZ25PdmVybGF5VGltZW91dCA9IG51bGw7XHJcblxyXG4gICAgbWFza092ZXJsYXk6IEhUTUxEaXZFbGVtZW50O1xyXG4gICAgbWFza0NsaWNrTGlzdGVuZXI6IEZ1bmN0aW9uO1xyXG5cclxuICAgIGRvY3VtZW50UmVzaXplTGlzdGVuZXI6IGFueTtcclxuXHJcbiAgICBrZXl3b3JkID0gJyc7XHJcbiAgICBtb2RlbDogQWR2YW5jZVNlYXJjaERhdGEgPSBuZXcgQWR2YW5jZVNlYXJjaERhdGEoKTtcclxuICAgIG1vZGVsQ3J1ZEZvcm06IENydWRGb3JtRGF0YSA9IG5ldyBDcnVkRm9ybURhdGEoKTtcclxuICAgIHNldHRpbmc6IEFkdmFuY2VTZWFyY2hTZXR0aW5nID0gbmV3IEFkdmFuY2VTZWFyY2hTZXR0aW5nKCk7XHJcbiAgICByZWFkeSA9IGZhbHNlO1xyXG4gICAgbmVlZENsZWFyVHlwZWRWYWx1ZXMgPSB0cnVlO1xyXG4gICAgc25hcFNob3QgPSAnJztcclxuXHJcbiAgICBmaWVsZFBhcmVudE1hcDogYW55ID0ge307XHJcblxyXG4gICAgdGFyZ2V0OiBhbnk7XHJcblxyXG4gICAgc2hvd0Zvcm0gPSBmYWxzZTtcclxuICAgIHNlYXJjaEJveFRvb2x0aXA7XHJcblxyXG4gICAgZmlsdGVyX2Zvcm06IEZpbHRlcltdID0gW107IC8vIFNlYXJjaCBu4bq/dSBz4butIGThu6VuZyBjcnVkIChLaGFpIGLDoW8gdGVtcGxhdGUgZmlsdGVyKVxyXG4gICAgZmlsdGVyX2tleXdvcmQ6IEZpbHRlcltdID0gW107IC8vIFNlYXJjaCB04burIGtow7NhXHJcbiAgICBmaWx0ZXJfcXVlcnk6IEZpbHRlcltdID0gW107IC8vIFNlYXJjaCBu4bq/dSBz4butIGThu6VuZyBxdWVyeSBidWlsZGVyXHJcblxyXG4gICAgX3NlYXJjaEJveE1heEhlaWdodDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9jdXN0b21Sb3V0ZXJTZXJ2aWNlOiBDdXN0b21Sb3V0ZXJTZXJ2aWNlLFxyXG4gICAgICAgIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2RldmljZURldGVjdG9yU2VydmljZTogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2xvY2FsQ2FjaGVTZXJ2aWNlOiBMb2NhbENhY2hlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHByaXZhdGUgX2Vudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMubW9kZWwuZGF0YSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICB0aGlzLmdldFNhdmVkRmlsdGVycygpO1xyXG4gICAgICAgIHRoaXMub25Jbml0LmVtaXQodGhpcy5nZXRGaWx0ZXJzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXREYXRhKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hJbmZvIHx8IHRoaXMuc2VhcmNoSW5mby5zY2hlbWEgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhcmNoQm94VG9vbHRpcCA9IHRoaXMuc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dDtcclxuICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hID0gPEZvcm1TY2hlbWFCYXNlW10+KHRoaXMuc2VhcmNoSW5mby5zY2hlbWEpO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5maWVsZERyb3Bkb3duID0gdGhpcy5zZWFyY2hJbmZvLmZpZWxkRHJvcGRvd247XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmtlZXBJbml0U2VhcmNoRGF0YU5vdE51bGwgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50U2V0dGluZy5mdW5jdGlvbi5tb2RpZnlBZHZhbmNlU2VhY2hNb2RlbCh0aGlzLm1vZGVsLCB0aGlzLnNldHRpbmcpO1xyXG5cclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm1vZGVsLmluaXREYXRhKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5tb2RlbC5pbml0RGF0YVtrZXldID09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVtrZXldID0gdGhpcy5tb2RlbC5pbml0RGF0YVtrZXldKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFba2V5XSA9IHRoaXMubW9kZWwuaW5pdERhdGFba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuc2NoZW1hLmZvckVhY2goc2NoZW1hID0+IHtcclxuICAgICAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgX3NjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xyXG4gICAgICAgICAgICAgICAgX3NjaGVtYS5hZnRlckdldERhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfc2NoZW1hLmlzU2VydmVyTG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtU2VsZWN0ZWQgPSBfc2NoZW1hLmRhdGFTb3VyY2UuZmluZChpdGVtID0+IGl0ZW0udmFsdWUgPT0gdGhpcy5tb2RlbC5kYXRhW3NjaGVtYS5maWVsZF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbc2NoZW1hLmZpZWxkXSA9IGl0ZW1TZWxlY3RlZC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBfc2NoZW1hLmFwcGVuZFRvID0gJ2JvZHknO1xyXG4gICAgICAgICAgICAgICAgX3NjaGVtYS5wYW5lbENsYXNzID0gJ2Ryb3Bkb3duLWFkdnMnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmRpc2FibGVEZWZhdWx0U2V0dGluZ0NhY2hlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YURlZmF1bHQodGhpcy5zZXR0aW5nLnNjaGVtYSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vZGVsQ3J1ZEZvcm0uZGF0YSA9IHRoaXMubW9kZWwuZGF0YTtcclxuICAgICAgICB0aGlzLm1vZGVsQ3J1ZEZvcm0uZGF0YS5rZXkgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGF0YURlZmF1bHQoZm9ybVNjaGVtYTogRm9ybVNjaGVtYUJhc2VbXSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFDYWNoZSA9IHRoaXMuX2xvY2FsQ2FjaGVTZXJ2aWNlLmdldERhdGFEZWZhdWx0KCk7XHJcbiAgICAgICAgbGV0IGFkdmFuY2VTZWFyY2hGaWVsZENhY2hlID0gdGhpcy5wYXJlbnRTZXR0aW5nLmFkdmFuY2VTZWFyY2hGaWVsZENhY2hlO1xyXG4gICAgICAgIGlmICghYWR2YW5jZVNlYXJjaEZpZWxkQ2FjaGUgfHwgIU9iamVjdC5rZXlzKGFkdmFuY2VTZWFyY2hGaWVsZENhY2hlKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgYWR2YW5jZVNlYXJjaEZpZWxkQ2FjaGUgPSB7fTtcclxuICAgICAgICAgICAgY29uc3QgbHN0RmllbGRJbmZvID0gdGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpZWxkc0luRGVmYXVsdFNldHRpbmcoKTtcclxuICAgICAgICAgICAgaWYgKGxzdEZpZWxkSW5mbykge1xyXG4gICAgICAgICAgICAgICAgbHN0RmllbGRJbmZvLmZvckVhY2goZmllbGRJbmZvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlU2VhcmNoRmllbGRDYWNoZVtmaWVsZEluZm8uZmllbGRdID0gZmllbGRJbmZvLmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhZHZhbmNlU2VhcmNoRmllbGRDYWNoZSB8fCAhT2JqZWN0LmtleXMoYWR2YW5jZVNlYXJjaEZpZWxkQ2FjaGUpLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGFkdmFuY2VTZWFyY2hGaWVsZENhY2hlKS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1TY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gZmllbGQpO1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGNvbnRyb2wuZmllbGQgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFDYWNoZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhW2NvbnRyb2wuZmllbGRdID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFDYWNoZVtjb250cm9sLmZpZWxkXTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZWQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfa2V5d29yZCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmtleXdvcmQgIT0gbnVsbCAmJiB0aGlzLmtleXdvcmQgIT0gJycgJiYgdGhpcy5wYXJlbnRTZXR0aW5nLmZpZWxkU2VhcmNoVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcktleVdvcmsgPSBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgIGxvZ2ljOiAnb3InLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyczogW11cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5V29yayA9IEpTT04uc3RyaW5naWZ5KHRoaXMua2V5d29yZCk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50U2V0dGluZy5maWVsZFNlYXJjaFRleHQuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJLZXlXb3JrLmZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZCxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuY29udGFpbixcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVLZXlXb3JrXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyS2V5V29yay5maWx0ZXJzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcl9rZXl3b3JkLnB1c2goZmlsdGVyS2V5V29yay5maWx0ZXJzWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2tleXdvcmQucHVzaChmaWx0ZXJLZXlXb3JrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lcmdlRmlsdGVyQW5kRW1pdCgpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRXNjKGV2dCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJLZXl3b3JkKCk7XHJcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJLZXl3b3JkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmtleXdvcmQgIT0gbnVsbCAmJiB0aGlzLmtleXdvcmQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMua2V5d29yZCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcl9rZXl3b3JkID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubWVyZ2VGaWx0ZXJBbmRFbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRG9TZWFyY2hpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNlYXJjaEJ1aWxkZXIoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfcXVlcnkgPSBldnQ7XHJcbiAgICAgICAgdGhpcy5tZXJnZUZpbHRlckFuZEVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU2VhcmNoaW5nKCkge1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsRm9ybVNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWE7XHJcbiAgICAgICAgY29uc3QgbW9kZWxGaWx0ZXIgPSB0aGlzLm1vZGVsQ3J1ZEZvcm0uZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5rZWVwSW5pdFNlYXJjaERhdGFOb3ROdWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFJlcGxhY2Ugbmjhu69uZyBmaWVsZCBi4buLIG51bGwgYuG6sW5nIHZhbHVlIGZpbHRlciBt4bq3YyDEkeG7i25oXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMubW9kZWwuaW5pdERhdGEpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChtb2RlbEZpbHRlcltrZXldID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB8fCBtb2RlbEZpbHRlcltrZXldID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsLmluaXREYXRhW2tleV0gPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEZpbHRlcltrZXldID0gdGhpcy5tb2RlbC5pbml0RGF0YVtrZXldKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEZpbHRlcltrZXldID0gdGhpcy5tb2RlbC5pbml0RGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gaW50ZXJuYWxGb3JtU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbEZvcm1TY2hlbWFbaW5kZXhdIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGludGVybmFsRm9ybVNjaGVtYVtpbmRleF0uZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxGaWx0ZXJbZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsRmlsdGVyW2ZpZWxkXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nLmZpbHRlclRlbXBsYXRlQWR2cyA9PSBudWxsKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIHRoaXMuZGVRdXlBbmRFbWl0U2VhcmNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTZWFyY2goZXZ0KSB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxGb3JtU2NoZW1hID0gdGhpcy5zZXR0aW5nLnNjaGVtYTtcclxuICAgICAgICBjb25zdCBtb2RlbEZpbHRlciA9IHRoaXMubW9kZWxDcnVkRm9ybS5kYXRhO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGludGVybmFsRm9ybVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxGb3JtU2NoZW1hW2tleV0gaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIG1vZGVsRmlsdGVyW2ludGVybmFsRm9ybVNjaGVtYVtrZXldLmZpZWxkXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG1vZGVsRmlsdGVyW2ludGVybmFsRm9ybVNjaGVtYVtrZXldLmZpZWxkXSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kZVF1eUFuZEVtaXRTZWFyY2goKTtcclxuICAgIH1cclxuXHJcbiAgICBkZVF1eUFuZEVtaXRTZWFyY2goKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWx0ZXIgPSB0aGlzLnBhcmVudFNldHRpbmcuZmlsdGVyVGVtcGxhdGVBZHZzO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0ZW1wbGF0ZUZpbHRlciwgdGhpcy5tb2RlbENydWRGb3JtLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuaGlkZUZvcm1TZWFyY2goKTtcclxuICAgICAgICB0aGlzLmZpbHRlcl9mb3JtID0gcmVzdWx0O1xyXG4gICAgICAgIHRoaXMubWVyZ2VGaWx0ZXJBbmRFbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVycygpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IEZpbHRlcltdID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2tleXdvcmQpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfa2V5d29yZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcl9mb3JtKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmlsdGVyX2Zvcm0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJfcXVlcnkpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfcXVlcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIG1lcmdlRmlsdGVyQW5kRW1pdCgpIHtcclxuICAgICAgICB0aGlzLm9uU2VhcmNoLm5leHQodGhpcy5nZXRGaWx0ZXJzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybVNob3coZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNuYXBTaG90ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbC5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0ZpeGVkUG9zaXRpb24oZWxlbSkge1xyXG4gICAgICAgIHdoaWxlIChlbGVtICYmIGVsZW0udGFnTmFtZSAhPT0gJ0JPRFknKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5wb3NpdGlvbiAmJiBzdHlsZS5wb3NpdGlvbi50b0xvd2VyQ2FzZSgpID09PSAnZml4ZWQnKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvb3JkcyhlbGVtKSB7XHJcbiAgICAgICAgY29uc3QgaXNGaXhlZCA9IHRoaXMuY2hlY2tGaXhlZFBvc2l0aW9uKGVsZW0pO1xyXG4gICAgICAgIGNvbnN0IGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIGNvbnN0IGRvY0VsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBpc0ZpeGVkID8gMCA6IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2NFbC5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGlzRml4ZWQgPyAwIDogd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY0VsLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICBjb25zdCBjbGllbnRUb3AgPSBkb2NFbC5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMDtcclxuICAgICAgICBjb25zdCBjbGllbnRMZWZ0ID0gZG9jRWwuY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcclxuXHJcbiAgICAgICAgY29uc3QgdG9wID0gYm94LnRvcCArIHNjcm9sbFRvcCAtIGNsaWVudFRvcDtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgdG9wOiBNYXRoLnJvdW5kKHRvcCksIGxlZnQ6IE1hdGgucm91bmQobGVmdCkgfTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZvcm1IaWRlKGV2dCkge1xyXG4gICAgICAgIGlmICh0aGlzLm5lZWRDbGVhclR5cGVkVmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBKU09OLnBhcnNlKHRoaXMuc25hcFNob3QpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gdGhpcy5tb2RlbC5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbcF0gPSB0ZW1wW3BdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubmVlZENsZWFyVHlwZWRWYWx1ZXMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybUV2ZW50SGFuZGxlcihldnQsIHNlYXJjaE1vZGVsKSB7XHJcbiAgICAgICAgZXZ0LmRhdGFTZWFyY2hNb2RlbCA9IHNlYXJjaE1vZGVsO1xyXG4gICAgICAgIC8vIGlmIChldnQuZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICBpZiAoZXZ0LmZpZWxkLmVuZHNXaXRoKCdfZScpKSB7XHJcbiAgICAgICAgICAgIGlmIChldnQuY29udHJvbCBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgZXZ0LmZvcm1Db250cm9sc1tldnQuZmllbGQucmVwbGFjZSgnX2UnLCAnX3MnKV0ubWF4RGF0ZSA9IGV2dC5ldmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChldnQuY29udHJvbCBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hICYmIGV2dC5jb250cm9sLmRhdGFGb3JtYXQgPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgIGV2dC5mb3JtQ29udHJvbHNbZXZ0LmZpZWxkLnJlcGxhY2UoJ19lJywgJ19zJyldLm1heCA9IHBhcnNlSW50KGV2dC5ldmVudC50YXJnZXQudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV2dC5maWVsZC5lbmRzV2l0aCgnX3MnKSkge1xyXG4gICAgICAgICAgICBpZiAoZXZ0LmNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGV2dC5mb3JtQ29udHJvbHNbZXZ0LmZpZWxkLnJlcGxhY2UoJ19zJywgJ19lJyldLm1pbkRhdGUgPSBldnQuZXZlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LmNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYSAmJiBldnQuY29udHJvbC5kYXRhRm9ybWF0ID09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICBldnQuZm9ybUNvbnRyb2xzW2V2dC5maWVsZC5yZXBsYWNlKCdfcycsICdfZScpXS5taW4gPSBwYXJzZUludChldnQuZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uRm9ybUV2ZW50Lm5leHQoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGV2dCkge1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlRm9ybVNlYXJjaCgpIHtcclxuICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Zvcm1TZWFyY2goKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Rm9ybSA9ICF0aGlzLnNob3dGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNhdmVTZXR0aW5nKGZpbHRlcnMpIHtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nLnNldHRpbmdLZXkpIHBhdGhOYW1lICs9ICcvJyArIHRoaXMucGFyZW50U2V0dGluZy5zZXR0aW5nS2V5O1xyXG5cclxuICAgICAgICBsZXQgZmlsdGVyc0FsbCA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZGF0YUZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5BRFZBTkNFX0ZJTFRFUik7XHJcbiAgICAgICAgaWYgKGRhdGFGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcnNBbGwgPSBKU09OLnBhcnNlKGRhdGFGaWx0ZXJzKTtcclxuICAgICAgICAgICAgZmlsdGVyc0FsbC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5maWx0ZXJzID0gZmlsdGVycztcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcclxuICAgICAgICAgICAgZmlsdGVyc0FsbC5wdXNoKHsgcGF0aG5hbWU6IHBhdGhOYW1lLCBmaWx0ZXJzIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQURWQU5DRV9GSUxURVIsIEpTT04uc3RyaW5naWZ5KGZpbHRlcnNBbGwpKTtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ0zGsHUgYuG7mSBs4buNYyB0aMOgbmggY8O0bmcnKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVEZWxldGVTYXZlU2V0dGluZygpIHtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5wYXJlbnRTZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZmlsdGVyc0FsbCA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGRhdGFGaWx0ZXJzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQURWQU5DRV9GSUxURVIpO1xyXG4gICAgICAgIGlmIChkYXRhRmlsdGVycykge1xyXG4gICAgICAgICAgICBmaWx0ZXJzQWxsID0gSlNPTi5wYXJzZShkYXRhRmlsdGVycyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmlsdGVyc0FsbC5maW5kSW5kZXgocCA9PiBwLnBhdGhuYW1lID09IHBhdGhOYW1lKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIGZpbHRlcnNBbGwuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQURWQU5DRV9GSUxURVIsIEpTT04uc3RyaW5naWZ5KGZpbHRlcnNBbGwpKTtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdYw7NhIGLhu5kgbOG7jWMgxJHDoyBsxrB1IHRow6BuaCBjw7RuZycpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTYXZlZEZpbHRlcnMoKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YUZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5BRFZBTkNFX0ZJTFRFUik7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfcXVlcnkgPSBbXTtcclxuICAgICAgICBpZiAoZGF0YUZpbHRlcnMpIHtcclxuICAgICAgICAgICAgbGV0IGZpbHRlcnM6IEZpbHRlcltdO1xyXG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50U2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnBhcmVudFNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZmlsdGVyc0FsbCA9IEpTT04ucGFyc2UoZGF0YUZpbHRlcnMpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcnNBbGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWx0ZXJzQWxsW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVycyA9IGVsZW1lbnQuZmlsdGVycztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX3F1ZXJ5ID0gZmlsdGVycztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbldpbmRvd1Jlc2l6ZSgpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5hbGlnbk92ZXJsYXlUaW1lb3V0KTtcclxuICAgICAgICB0aGlzLmFsaWduT3ZlcmxheVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hbGlnbk92ZXJsYXkoKTtcclxuICAgICAgICB9LCA0MDApO1xyXG4gICAgfVxyXG5cclxuICAgIGJpbmREb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lciA9IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKTtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5kb2N1bWVudFJlc2l6ZUxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmREb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lciA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZE92ZXJsYXkoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlQYW5lbCkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX292ZXJsYXlQYW5lbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UGFuZWwuc3R5bGUuekluZGV4ID0gU3RyaW5nKCsrRG9tSGFuZGxlci56aW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbGlnbk92ZXJsYXkoKSB7XHJcbiAgICAgICAgdGhpcy5hcHBlbmRNYXNrKCk7XHJcbiAgICAgICAgRG9tSGFuZGxlci5hYnNvbHV0ZVBvc2l0aW9uKHRoaXMuX292ZXJsYXlQYW5lbCwgdGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlT3ZlcmxheUFwcGVuZCgpIHtcclxuICAgICAgICB0aGlzLl9vdmVybGF5UGFuZWwgJiYgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX292ZXJsYXlQYW5lbCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25PdmVybGF5SGlkZSgpIHtcclxuICAgICAgICB0aGlzLnVuYmluZERvY3VtZW50UmVzaXplTGlzdGVuZXIoKTtcclxuICAgICAgICB0aGlzLnVuYmluZE1hc2tDbGlja0xpc3RlbmVyKCk7XHJcbiAgICAgICAgdGhpcy5fb3ZlcmxheVBhbmVsID0gbnVsbDtcclxuICAgICAgICB0aGlzLnJlbW92ZU1hc2soKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVBZHZhbmNlU2VhcmNoUGFuZWxSZW5kZXJlZCgpIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hCb3hNYXhIZWlnaHQgPSBgY2FsYygxMDB2aCAtICR7dGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIDE1MH1weClgO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT3ZlcmxheUFuaW1hdGlvblN0YXJ0KGV2ZW50OiBBbmltYXRpb25FdmVudCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQudG9TdGF0ZSkge1xyXG4gICAgICAgICAgICBjYXNlICd2aXNpYmxlJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlQYW5lbCA9IGV2ZW50LmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZE92ZXJsYXkoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWxpZ25PdmVybGF5KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmREb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ3ZvaWQnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5vbk92ZXJsYXlIaWRlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5iaW5kTWFza0NsaWNrTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFza0NsaWNrTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXNrQ2xpY2tMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB0aGlzLm1hc2tDbGlja0xpc3RlbmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kTWFzaygpIHtcclxuICAgICAgICBpZiAoIXRoaXMubWFza092ZXJsYXkpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXNrT3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICB0aGlzLm1hc2tPdmVybGF5LnN0eWxlLnpJbmRleCA9IFN0cmluZyhwYXJzZUludCh0aGlzLl9vdmVybGF5UGFuZWwuc3R5bGUuekluZGV4KSAtIDEpO1xyXG4gICAgICAgICAgICBEb21IYW5kbGVyLmFkZENsYXNzKHRoaXMubWFza092ZXJsYXksICdhZHZhbmNlLXNlYXJjaC1tYXNrLW92ZXJsYXknKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWFza0NsaWNrTGlzdGVuZXIgPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5tYXNrT3ZlcmxheSwgJ2NsaWNrJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZUZvcm1TZWFyY2goKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTWFzaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1hc2tPdmVybGF5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlTWFzaygpIHtcclxuICAgICAgICBpZiAodGhpcy5tYXNrT3ZlcmxheSkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMubWFza092ZXJsYXkpO1xyXG4gICAgICAgICAgICB0aGlzLnVuYmluZE1hc2tDbGlja0xpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWFza092ZXJsYXkgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmVPdmVybGF5QXBwZW5kKCk7XHJcbiAgICAgICAgdGhpcy5vbk92ZXJsYXlIaWRlKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjZWwgY2xhc3M9XCJib3gtYWR2YW5jZS1zZWFyY2gtaW5saW5lIHAtaW5wdXRncm91cFwiPlxyXG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcElucHV0VGV4dCBwbGFjZWhvbGRlcj1cIk5o4bqtcCB04burIGtow7NhIHTDrG0ga2nhur9tXCIgW3BUb29sdGlwXT1cInNlYXJjaEJveFRvb2x0aXBcIlxyXG4gICAgICAgIHRvb2x0aXBTdHlsZUNsYXNzPVwid3JhcCBtYXgtd2lkdGgtMzAwXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIXBhcmVudFNldHRpbmcuZmllbGRTZWFyY2hUZXh0IHx8ICFwYXJlbnRTZXR0aW5nLmZpZWxkU2VhcmNoVGV4dC5sZW5ndGhcIiBbKG5nTW9kZWwpXT1cImtleXdvcmRcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2VkKCRldmVudClcIiAoa2V5dXAuZXNjKT1cIm9uRXNjKCRldmVudClcIiAvPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb24gYWN0aW9uXCIgW2NsYXNzLmRpc2FibGVkXT1cImxvYWRpbmdcIiBbY2xhc3MuZGlydHldPVwiISFrZXl3b3JkXCJcclxuICAgICAgICBbcFRvb2x0aXBdPVwiJ1jDs2EgdMOsbSBraeG6v20nXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKGNsaWNrKT1cImNsZWFyS2V5d29yZCgpXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1maWx0ZXItc2xhc2hcIj48L2k+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8c3BhbiBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvbiBhY3Rpb25cIiBbY2xhc3MuZGlzYWJsZWRdPVwibG9hZGluZ1wiIFtwVG9vbHRpcF09XCInVMOsbSBraeG6v20nXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAoY2xpY2spPVwib25Eb1NlYXJjaGluZygpXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zZWFyY2hcIj48L2k+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8c3BhbiBjbGFzcz1cImNvbnRhaW5lci1zZWFyY2gtZGlhbG9nIHAtaW5wdXRncm91cC1hZGRvbiBhY3Rpb24gYWN0aW9uLXRyaWdnZXJcIiB0YWJpbmRleD1cIjBcIiBbY2xhc3Muc2hvd109XCJzaG93Rm9ybVwiXHJcbiAgICAgICAgW3BUb29sdGlwXT1cIidUw6xtIGtp4bq/bSBuw6JuZyBjYW8nXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XHJcbiAgICAgICAgPHNwYW4gKGNsaWNrKT1cInNob3dGb3JtU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jYXJldC1kb3duXCI+PC9pPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Rm9ybVwiPlxyXG4gICAgICAgIDxkaXYgI292ZXJsYXlQYW5lbFxyXG4gICAgICAgICAgICBjbGFzcz1cImFkdmFuY2Utc2VhcmNoLW92ZXJsYXktcGFuZWwgZmlsdGVyLWNvbnRlbnQgcC1vdmVybGF5cGFuZWwgcC13aWRnZXQtY29udGVudCBmYWRlSW5Eb3duIGFkdmFuY2Utc2VhcmNoLWJveFwiXHJcbiAgICAgICAgICAgIFtAb3ZlcmxheUFuaW1hdGlvbl09XCJ7dmFsdWU6ICd2aXNpYmxlJywgcGFyYW1zOiB7c2hvd1RyYW5zaXRpb25QYXJhbXM6IG92ZXJsYXlTaG93VHJhbnNpdGlvbk9wdGlvbnMsIGhpZGVUcmFuc2l0aW9uUGFyYW1zOiBvdmVybGF5SGlkZVRyYW5zaXRpb25PcHRpb25zfX1cIlxyXG4gICAgICAgICAgICAoQG92ZXJsYXlBbmltYXRpb24uc3RhcnQpPVwib25PdmVybGF5QW5pbWF0aW9uU3RhcnQoJGV2ZW50KVwiIChrZXl1cC5lbnRlcik9XCJvbkRvU2VhcmNoaW5nKClcIlxyXG4gICAgICAgICAgICAoa2V5dXAuZXNjKT1cImhpZGVGb3JtU2VhcmNoKClcIiAobW91c2Vkb3duKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8IS0tIDxhIGNsYXNzPVwiYWR2YW5jZS1maWx0ZXItY2xvc2Ugbmctc3Rhci1pbnNlcnRlZFwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgKGNsaWNrKT1cImhpZGVGb3JtU2VhcmNoKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgcGktdGltZXNcIj48L2k+PC9hPiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcmVudFNldHRpbmcuZmlsdGVyVGVtcGxhdGVBZHZzXCI+XHJcbiAgICAgICAgICAgICAgICA8dG4tY3VzdG9tLXNjcm9sbGJhciAjc2Nyb2xsYmFyXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgbWF4SGVpZ2h0OiBfc2VhcmNoQm94TWF4SGVpZ2h0LCBtaW5IZWlnaHQ6ICczMDBweCcsIGhlaWdodDogJ2F1dG8nLCBwYXJlbnRDbGFzczogJ2JveC1hZHZhbmNlLXNlYXJjaC1pbmxpbmUnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y3J1ZC1mb3JtICpuZ0lmPVwicmVhZHlcIiAjY3J1ZEZvcm0gW2RhdGFdPVwibW9kZWxDcnVkRm9ybVwiIFtzZXR0aW5nXT1cInNldHRpbmdcIiBbY29udGV4dF09XCJjb250ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVLZXlwcmVzc0NvbnRyb2xdPVwidHJ1ZVwiIFtkaXNhYmxlQ2FjaGluZ109XCJ0cnVlXCIgKG9uRm9ybVNob3cpPVwib25Gb3JtU2hvdygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uRm9ybUhpZGUpPVwib25Gb3JtSGlkZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jcnVkLWZvcm0+XHJcbiAgICAgICAgICAgICAgICA8L3RuLWN1c3RvbS1zY3JvbGxiYXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLXNlYXJjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gaWNvbj1cInBpIHBpLXNlYXJjaFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1pbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidUw6xtIGtp4bq/bScgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwib25Eb1NlYXJjaGluZygpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktcmVwbGF5XCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInWMOzYSB0w6xtIGtp4bq/bScgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KVwiIHByZXZlbnRUYWI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcGFyZW50U2V0dGluZy5maWx0ZXJUZW1wbGF0ZUFkdnNcIj5cclxuICAgICAgICAgICAgICAgIDxxdWVyeS1idWlsZGVyIFtzZWFyY2hTY2hlbWFdPVwic2V0dGluZy5zY2hlbWFcIiBbZmlsdGVyc109XCJmaWx0ZXJfcXVlcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7IG1heEhlaWdodDogX3NlYXJjaEJveE1heEhlaWdodCwgbWluSGVpZ2h0OiAnMzAwcHgnLCBoZWlnaHQ6ICdhdXRvJywgcGFyZW50Q2xhc3M6ICdib3gtYWR2YW5jZS1zZWFyY2gtaW5saW5lJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgIChvblNhdmUpPVwiaGFuZGxlU2F2ZVNldHRpbmcoJGV2ZW50KVwiIChvbkRlbGV0ZVNhdmUpPVwiaGFuZGxlRGVsZXRlU2F2ZVNldHRpbmcoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uU2VhcmNoKT1cImhhbmRsZVNlYXJjaEJ1aWxkZXIoJGV2ZW50KVwiPjwvcXVlcnktYnVpbGRlcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxhZnRlci12aWV3LWNoZWNrZWQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChsb2FkZWQpPVwiaGFuZGxlQWR2YW5jZVNlYXJjaFBhbmVsUmVuZGVyZWQoKVwiPlxyXG4gICAgICAgICAgICA8L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj4iXX0=
498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZS1zZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkL3NyYy9saWIvY29tcG9uZW50cy9jcnVkL2FkdmFuY2Utc2VhcmNoL2FkdmFuY2Utc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC9hZHZhbmNlLXNlYXJjaC9hZHZhbmNlLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsU0FBUyxFQUNULFlBQVksRUFFWixLQUFLLEVBRUwsTUFBTSxFQUNLLFNBQVMsRUFDdkIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVyRSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUFFLFlBQVksRUFFbEMscUJBQXFCLEVBQUUscUJBQXFCLEVBQzVDLGlCQUFpQixFQUNwQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFPbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVVoRixNQUFNLE9BQU8sc0JBQXVCLFNBQVEsYUFBYTtJQXVEckQsWUFDSSxTQUFtQixFQUNYLG9CQUF5QyxFQUN6QyxnQkFBaUMsRUFDakMsaUJBQW1DLEVBQ3BDLHNCQUE2QyxFQUM1QyxrQkFBcUMsRUFDckMsU0FBb0Is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QztZQUM1QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDOzttSEExZ0JRLHNCQUFzQjt1R0FBdEIsc0JBQXNCLGdSQUZwQixDQUFDLHVCQUF1QixDQUFDLGtVQ3hDeEMscXVIQXFETTsyRkRYTyxzQkFBc0I7a0JBUGxDLFNBQVM7K0JBRUksZ0JBQWdCLGFBR2YsQ0FBQyx1QkFBdUIsQ0FBQzsyVkFJbkIsRUFBRTtzQkFBbEIsU0FBUzt1QkFBQyxJQUFJO2dCQUNRLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDeUIsYUFBYTtzQkFBMUQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUduQyxhQUFhO3NCQUFyQixLQUFLO2dCQUVPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBU0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCwgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBSZW5kZXJlcjIsIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IERldmljZURldGVjdG9yU2VydmljZSB9IGZyb20gJ25neC1kZXZpY2UtZGV0ZWN0b3InO1xyXG5pbXBvcnQgeyBEb21IYW5kbGVyIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvZG9tJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hcHAtY29udGV4dC9jb21wb25lbnQtY29udGV4dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XHJcbmltcG9ydCB7IElDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7XHJcbiAgICBBZHZhbmNlU2VhcmNoRGF0YSxcclxuICAgIEFkdmFuY2VTZWFyY2hTZXR0aW5nLCBDcnVkRm9ybURhdGEsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsXHJcbiAgICBEYXRlVGltZUNvbnRyb2xTY2hlbWEsIERyb3Bkb3duQ29udHJvbFNjaGVtYSwgRm9ybVNjaGVtYUJhc2UsXHJcbiAgICBUZXh0Q29udHJvbFNjaGVtYVxyXG59IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZm9ybS1zY2hlbWEnO1xyXG5pbXBvcnQgeyBPcGVyYXRvciB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbW1vbic7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xyXG5pbXBvcnQgeyBDdXN0b21Sb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3VzdG9tLXJvdXRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW52aXJvbm1lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IExvY2FsQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbG9jYWxDYWNoZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlYXJjaEluZm8gfSBmcm9tICcuLi8uLi9tb2RlbHMvc2VhcmNoJztcclxuaW1wb3J0IHsgQ3J1ZEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICdhZHZhbmNlLXNlYXJjaCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZS1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vYWR2YW5jZS1zZWFyY2guY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkdmFuY2VTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBJQ29tcG9uZW50QmFzZSB7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZWwnKSBlbDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ2NydWRGb3JtJykgY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZCgnb3ZlcmxheVBhbmVsJywgeyBzdGF0aWM6IGZhbHNlIH0pIF9vdmVybGF5UGFuZWw6IEVsZW1lbnRSZWY8YW55PjtcclxuICAgIC8vIEBWaWV3Q2hpbGQoJ292ZXJsYXlQYW5lbCcpIG92ZXJsYXlQYW5lbDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBASW5wdXQoKSBwYXJlbnRTZXR0aW5nOiBDcnVkTGlzdFNldHRpbmc7XHJcbiAgICBfc2VhcmNoSW5mbzogU2VhcmNoSW5mbztcclxuICAgIEBJbnB1dCgpIHNldCBzZWFyY2hJbmZvKHZhbHVlOiBTZWFyY2hJbmZvKSB7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoSW5mbyA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9zZWFyY2hJbmZvICYmIHRoaXMuX3NlYXJjaEluZm8uc2NoZW1hKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgZ2V0IHNlYXJjaEluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaEluZm87XHJcbiAgICB9XHJcbiAgICBASW5wdXQoKSBhbGxvd0xvYWREYXRhV2hlblBhcmVudE51bGwgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgbG9hZGluZzogZmFsc2U7XHJcblxyXG4gICAgQE91dHB1dCgpIG9uU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Gb3JtRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBvdmVybGF5U2hvd1RyYW5zaXRpb25PcHRpb25zOiBzdHJpbmcgPSAnLjEycyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSc7XHJcbiAgICBvdmVybGF5SGlkZVRyYW5zaXRpb25PcHRpb25zOiBzdHJpbmcgPSAnLjFzIGxpbmVhcic7XHJcbiAgICBhbGlnbk92ZXJsYXlUaW1lb3V0ID0gbnVsbDtcclxuXHJcbiAgICBtYXNrT3ZlcmxheTogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICBtYXNrQ2xpY2tMaXN0ZW5lcjogRnVuY3Rpb247XHJcblxyXG4gICAgZG9jdW1lbnRSZXNpemVMaXN0ZW5lcjogYW55O1xyXG5cclxuICAgIGtleXdvcmQgPSAnJztcclxuICAgIG1vZGVsOiBBZHZhbmNlU2VhcmNoRGF0YSA9IG5ldyBBZHZhbmNlU2VhcmNoRGF0YSgpO1xyXG4gICAgbW9kZWxDcnVkRm9ybTogQ3J1ZEZvcm1EYXRhID0gbmV3IENydWRGb3JtRGF0YSgpO1xyXG4gICAgc2V0dGluZzogQWR2YW5jZVNlYXJjaFNldHRpbmcgPSBuZXcgQWR2YW5jZVNlYXJjaFNldHRpbmcoKTtcclxuICAgIHJlYWR5ID0gZmFsc2U7XHJcbiAgICBuZWVkQ2xlYXJUeXBlZFZhbHVlcyA9IHRydWU7XHJcbiAgICBzbmFwU2hvdCA9ICcnO1xyXG5cclxuICAgIGZpZWxkUGFyZW50TWFwOiBhbnkgPSB7fTtcclxuXHJcbiAgICB0YXJnZXQ6IGFueTtcclxuXHJcbiAgICBzaG93Rm9ybSA9IGZhbHNlO1xyXG4gICAgc2VhcmNoQm94VG9vbHRpcDtcclxuXHJcbiAgICBmaWx0ZXJfZm9ybTogRmlsdGVyW10gPSBbXTsgLy8gU2VhcmNoIG7hur91IHPhu60gZOG7pW5nIGNydWQgKEtoYWkgYsOhbyB0ZW1wbGF0ZSBmaWx0ZXIpXHJcbiAgICBmaWx0ZXJfa2V5d29yZDogRmlsdGVyW10gPSBbXTsgLy8gU2VhcmNoIHThu6sga2jDs2FcclxuICAgIGZpbHRlcl9xdWVyeTogRmlsdGVyW10gPSBbXTsgLy8gU2VhcmNoIG7hur91IHPhu60gZOG7pW5nIHF1ZXJ5IGJ1aWxkZXJcclxuXHJcbiAgICBfc2VhcmNoQm94TWF4SGVpZ2h0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIF9pbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSBfY3VzdG9tUm91dGVyU2VydmljZTogQ3VzdG9tUm91dGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlOiBEZXZpY2VEZXRlY3RvclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbG9jYWxDYWNoZVNlcnZpY2U6IExvY2FsQ2FjaGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBfZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGEgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5nZXRTYXZlZEZpbHRlcnMoKTtcclxuICAgICAgICB0aGlzLm9uSW5pdC5lbWl0KHRoaXMuZ2V0RmlsdGVycygpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0RGF0YSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoSW5mbyB8fCB0aGlzLnNlYXJjaEluZm8uc2NoZW1hID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaEJveFRvb2x0aXAgPSB0aGlzLnNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQ7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYSA9IDxGb3JtU2NoZW1hQmFzZVtdPih0aGlzLnNlYXJjaEluZm8uc2NoZW1hKTtcclxuICAgICAgICB0aGlzLnNldHRpbmcuZmllbGREcm9wZG93biA9IHRoaXMuc2VhcmNoSW5mby5maWVsZERyb3Bkb3duO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5rZWVwSW5pdFNlYXJjaERhdGFOb3ROdWxsID0gdHJ1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudFNldHRpbmcuZnVuY3Rpb24ubW9kaWZ5QWR2YW5jZVNlYWNoTW9kZWwodGhpcy5tb2RlbCwgdGhpcy5zZXR0aW5nKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5tb2RlbC5pbml0RGF0YSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaW5pdERhdGFba2V5XSA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFba2V5XSA9IHRoaXMubW9kZWwuaW5pdERhdGFba2V5XSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhW2tleV0gPSB0aGlzLm1vZGVsLmluaXREYXRhW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnNjaGVtYS5mb3JFYWNoKHNjaGVtYSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IF9zY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcclxuICAgICAgICAgICAgICAgIF9zY2hlbWEuYWZ0ZXJHZXREYXRhID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghX3NjaGVtYS5pc1NlcnZlckxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVNlbGVjdGVkID0gX3NjaGVtYS5kYXRhU291cmNlLmZpbmQoaXRlbSA9PiBpdGVtLnZhbHVlID09IHRoaXMubW9kZWwuZGF0YVtzY2hlbWEuZmllbGRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1TZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhW3NjaGVtYS5maWVsZF0gPSBpdGVtU2VsZWN0ZWQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgX3NjaGVtYS5hcHBlbmRUbyA9ICdib2R5JztcclxuICAgICAgICAgICAgICAgIF9zY2hlbWEucGFuZWxDbGFzcyA9ICdkcm9wZG93bi1hZHZzJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5kaXNhYmxlRGVmYXVsdFNldHRpbmdDYWNoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldERhdGFEZWZhdWx0KHRoaXMuc2V0dGluZy5zY2hlbWEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbENydWRGb3JtLmRhdGEgPSB0aGlzLm1vZGVsLmRhdGE7XHJcbiAgICAgICAgdGhpcy5tb2RlbENydWRGb3JtLmRhdGEua2V5ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgIHRoaXMucmVhZHkgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERhdGFEZWZhdWx0KGZvcm1TY2hlbWE6IEZvcm1TY2hlbWFCYXNlW10pIHtcclxuICAgICAgICBjb25zdCBkYXRhQ2FjaGUgPSB0aGlzLl9sb2NhbENhY2hlU2VydmljZS5nZXREYXRhRGVmYXVsdCgpO1xyXG4gICAgICAgIGxldCBhZHZhbmNlU2VhcmNoRmllbGRDYWNoZSA9IHRoaXMucGFyZW50U2V0dGluZy5hZHZhbmNlU2VhcmNoRmllbGRDYWNoZTtcclxuICAgICAgICBpZiAoIWFkdmFuY2VTZWFyY2hGaWVsZENhY2hlIHx8ICFPYmplY3Qua2V5cyhhZHZhbmNlU2VhcmNoRmllbGRDYWNoZSkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGFkdmFuY2VTZWFyY2hGaWVsZENhY2hlID0ge307XHJcbiAgICAgICAgICAgIGNvbnN0IGxzdEZpZWxkSW5mbyA9IHRoaXMuX2Vudmlyb25tZW50U2VydmljZS5nZXRGaWVsZHNJbkRlZmF1bHRTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIGlmIChsc3RGaWVsZEluZm8pIHtcclxuICAgICAgICAgICAgICAgIGxzdEZpZWxkSW5mby5mb3JFYWNoKGZpZWxkSW5mbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZVNlYXJjaEZpZWxkQ2FjaGVbZmllbGRJbmZvLmZpZWxkXSA9IGZpZWxkSW5mby5maWVsZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYWR2YW5jZVNlYXJjaEZpZWxkQ2FjaGUgfHwgIU9iamVjdC5rZXlzKGFkdmFuY2VTZWFyY2hGaWVsZENhY2hlKS5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICBPYmplY3Qua2V5cyhhZHZhbmNlU2VhcmNoRmllbGRDYWNoZSkuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtU2NoZW1hLmZpbmQocSA9PiBxLmZpZWxkID09IGZpZWxkKTtcclxuICAgICAgICAgICAgaWYgKCFjb250cm9sKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBjb250cm9sLmZpZWxkICsgKGNvbnRyb2wudmFsdWVGaWVsZCA9PSAnaWQnID8gJycgOiBjb250cm9sLnZhbHVlRmllbGQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbY29udHJvbC5maWVsZF07XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZWQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfa2V5d29yZCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmtleXdvcmQgIT0gbnVsbCAmJiB0aGlzLmtleXdvcmQgIT0gJycgJiYgdGhpcy5wYXJlbnRTZXR0aW5nLmZpZWxkU2VhcmNoVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcktleVdvcmsgPSBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgIGxvZ2ljOiAnb3InLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyczogW11cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5V29yayA9IEpTT04uc3RyaW5naWZ5KHRoaXMua2V5d29yZCk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50U2V0dGluZy5maWVsZFNlYXJjaFRleHQuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJLZXlXb3JrLmZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZCxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuY29udGFpbixcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVLZXlXb3JrXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyS2V5V29yay5maWx0ZXJzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcl9rZXl3b3JkLnB1c2goZmlsdGVyS2V5V29yay5maWx0ZXJzWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyX2tleXdvcmQucHVzaChmaWx0ZXJLZXlXb3JrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lcmdlRmlsdGVyQW5kRW1pdCgpO1xyXG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRXNjKGV2dCkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJLZXl3b3JkKCk7XHJcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJLZXl3b3JkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmtleXdvcmQgIT0gbnVsbCAmJiB0aGlzLmtleXdvcmQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMua2V5d29yZCA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcl9rZXl3b3JkID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubWVyZ2VGaWx0ZXJBbmRFbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uRG9TZWFyY2hpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNlYXJjaEJ1aWxkZXIoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfcXVlcnkgPSBldnQ7XHJcbiAgICAgICAgdGhpcy5tZXJnZUZpbHRlckFuZEVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU2VhcmNoaW5nKCkge1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsRm9ybVNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWE7XHJcbiAgICAgICAgY29uc3QgbW9kZWxGaWx0ZXIgPSB0aGlzLm1vZGVsQ3J1ZEZvcm0uZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5rZWVwSW5pdFNlYXJjaERhdGFOb3ROdWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFJlcGxhY2Ugbmjhu69uZyBmaWVsZCBi4buLIG51bGwgYuG6sW5nIHZhbHVlIGZpbHRlciBt4bq3YyDEkeG7i25oXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMubW9kZWwuaW5pdERhdGEpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChtb2RlbEZpbHRlcltrZXldID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB8fCBtb2RlbEZpbHRlcltrZXldID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1vZGVsLmluaXREYXRhW2tleV0gPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEZpbHRlcltrZXldID0gdGhpcy5tb2RlbC5pbml0RGF0YVtrZXldKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEZpbHRlcltrZXldID0gdGhpcy5tb2RlbC5pbml0RGF0YVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggaW4gaW50ZXJuYWxGb3JtU2NoZW1hKSB7XHJcbiAgICAgICAgICAgIGlmIChpbnRlcm5hbEZvcm1TY2hlbWFbaW5kZXhdIGluc3RhbmNlb2YgRGF0ZVRpbWVDb250cm9sU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGludGVybmFsRm9ybVNjaGVtYVtpbmRleF0uZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobW9kZWxGaWx0ZXJbZmllbGRdID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsRmlsdGVyW2ZpZWxkXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnRTZXR0aW5nLmZpbHRlclRlbXBsYXRlQWR2cyA9PSBudWxsKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIHRoaXMuZGVRdXlBbmRFbWl0U2VhcmNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJTZWFyY2goZXZ0KSB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJuYWxGb3JtU2NoZW1hID0gdGhpcy5zZXR0aW5nLnNjaGVtYTtcclxuICAgICAgICBjb25zdCBtb2RlbEZpbHRlciA9IHRoaXMubW9kZWxDcnVkRm9ybS5kYXRhO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGludGVybmFsRm9ybVNjaGVtYSkge1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxGb3JtU2NoZW1hW2tleV0gaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIG1vZGVsRmlsdGVyW2ludGVybmFsRm9ybVNjaGVtYVtrZXldLmZpZWxkXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG1vZGVsRmlsdGVyW2ludGVybmFsRm9ybVNjaGVtYVtrZXldLmZpZWxkXSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kZVF1eUFuZEVtaXRTZWFyY2goKTtcclxuICAgIH1cclxuXHJcbiAgICBkZVF1eUFuZEVtaXRTZWFyY2goKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWx0ZXIgPSB0aGlzLnBhcmVudFNldHRpbmcuZmlsdGVyVGVtcGxhdGVBZHZzO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0ZW1wbGF0ZUZpbHRlciwgdGhpcy5tb2RlbENydWRGb3JtLmRhdGEpO1xyXG4gICAgICAgIHRoaXMuaGlkZUZvcm1TZWFyY2goKTtcclxuICAgICAgICB0aGlzLmZpbHRlcl9mb3JtID0gcmVzdWx0O1xyXG4gICAgICAgIHRoaXMubWVyZ2VGaWx0ZXJBbmRFbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVycygpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IEZpbHRlcltdID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2tleXdvcmQpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfa2V5d29yZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcl9mb3JtKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmlsdGVyX2Zvcm0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJfcXVlcnkpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfcXVlcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIG1lcmdlRmlsdGVyQW5kRW1pdCgpIHtcclxuICAgICAgICB0aGlzLm9uU2VhcmNoLm5leHQodGhpcy5nZXRGaWx0ZXJzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybVNob3coZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNuYXBTaG90ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbC5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0ZpeGVkUG9zaXRpb24oZWxlbSkge1xyXG4gICAgICAgIHdoaWxlIChlbGVtICYmIGVsZW0udGFnTmFtZSAhPT0gJ0JPRFknKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5wb3NpdGlvbiAmJiBzdHlsZS5wb3NpdGlvbi50b0xvd2VyQ2FzZSgpID09PSAnZml4ZWQnKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvb3JkcyhlbGVtKSB7XHJcbiAgICAgICAgY29uc3QgaXNGaXhlZCA9IHRoaXMuY2hlY2tGaXhlZFBvc2l0aW9uKGVsZW0pO1xyXG4gICAgICAgIGNvbnN0IGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIGNvbnN0IGRvY0VsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBpc0ZpeGVkID8gMCA6IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2NFbC5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGVmdCA9IGlzRml4ZWQgPyAwIDogd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvY0VsLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICBjb25zdCBjbGllbnRUb3AgPSBkb2NFbC5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMDtcclxuICAgICAgICBjb25zdCBjbGllbnRMZWZ0ID0gZG9jRWwuY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcclxuXHJcbiAgICAgICAgY29uc3QgdG9wID0gYm94LnRvcCArIHNjcm9sbFRvcCAtIGNsaWVudFRvcDtcclxuICAgICAgICBjb25zdCBsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgdG9wOiBNYXRoLnJvdW5kKHRvcCksIGxlZnQ6IE1hdGgucm91bmQobGVmdCkgfTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZvcm1IaWRlKGV2dCkge1xyXG4gICAgICAgIGlmICh0aGlzLm5lZWRDbGVhclR5cGVkVmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBKU09OLnBhcnNlKHRoaXMuc25hcFNob3QpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gdGhpcy5tb2RlbC5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFbcF0gPSB0ZW1wW3BdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubmVlZENsZWFyVHlwZWRWYWx1ZXMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybUV2ZW50SGFuZGxlcihldnQsIHNlYXJjaE1vZGVsKSB7XHJcbiAgICAgICAgZXZ0LmRhdGFTZWFyY2hNb2RlbCA9IHNlYXJjaE1vZGVsO1xyXG4gICAgICAgIC8vIGlmIChldnQuZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICBpZiAoZXZ0LmZpZWxkLmVuZHNXaXRoKCdfZScpKSB7XHJcbiAgICAgICAgICAgIGlmIChldnQuY29udHJvbCBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xyXG4gICAgICAgICAgICAgICAgZXZ0LmZvcm1Db250cm9sc1tldnQuZmllbGQucmVwbGFjZSgnX2UnLCAnX3MnKV0ubWF4RGF0ZSA9IGV2dC5ldmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChldnQuY29udHJvbCBpbnN0YW5jZW9mIFRleHRDb250cm9sU2NoZW1hICYmIGV2dC5jb250cm9sLmRhdGFGb3JtYXQgPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgICAgIGV2dC5mb3JtQ29udHJvbHNbZXZ0LmZpZWxkLnJlcGxhY2UoJ19lJywgJ19zJyldLm1heCA9IHBhcnNlSW50KGV2dC5ldmVudC50YXJnZXQudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGV2dC5maWVsZC5lbmRzV2l0aCgnX3MnKSkge1xyXG4gICAgICAgICAgICBpZiAoZXZ0LmNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcclxuICAgICAgICAgICAgICAgIGV2dC5mb3JtQ29udHJvbHNbZXZ0LmZpZWxkLnJlcGxhY2UoJ19zJywgJ19lJyldLm1pbkRhdGUgPSBldnQuZXZlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LmNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYSAmJiBldnQuY29udHJvbC5kYXRhRm9ybWF0ID09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgICAgICBldnQuZm9ybUNvbnRyb2xzW2V2dC5maWVsZC5yZXBsYWNlKCdfcycsICdfZScpXS5taW4gPSBwYXJzZUludChldnQuZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uRm9ybUV2ZW50Lm5leHQoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGV2dCkge1xyXG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBldnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlRm9ybVNlYXJjaCgpIHtcclxuICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Zvcm1TZWFyY2goKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Rm9ybSA9ICF0aGlzLnNob3dGb3JtO1xyXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5zaG93Rm9ybSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uT3ZlcmxheVNob3coKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMub25PdmVybGF5SGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTYXZlU2V0dGluZyhmaWx0ZXJzKSB7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50U2V0dGluZy5zZXR0aW5nS2V5KSBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnBhcmVudFNldHRpbmcuc2V0dGluZ0tleTtcclxuXHJcbiAgICAgICAgbGV0IGZpbHRlcnNBbGwgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFGaWx0ZXJzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQURWQU5DRV9GSUxURVIpO1xyXG4gICAgICAgIGlmIChkYXRhRmlsdGVycykge1xyXG4gICAgICAgICAgICBmaWx0ZXJzQWxsID0gSlNPTi5wYXJzZShkYXRhRmlsdGVycyk7XHJcbiAgICAgICAgICAgIGZpbHRlcnNBbGwuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZmlsdGVycyA9IGZpbHRlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGZpbHRlcnNBbGwucHVzaCh7IHBhdGhuYW1lOiBwYXRoTmFtZSwgZmlsdGVycyB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkFEVkFOQ0VfRklMVEVSLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJzQWxsKSk7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCdMxrB1IGLhu5kgbOG7jWMgdGjDoG5oIGPDtG5nJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRGVsZXRlU2F2ZVNldHRpbmcoKSB7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50U2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMucGFyZW50U2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGZpbHRlcnNBbGwgPSBbXTtcclxuICAgICAgICBjb25zdCBkYXRhRmlsdGVycyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkFEVkFOQ0VfRklMVEVSKTtcclxuICAgICAgICBpZiAoZGF0YUZpbHRlcnMpIHtcclxuICAgICAgICAgICAgZmlsdGVyc0FsbCA9IEpTT04ucGFyc2UoZGF0YUZpbHRlcnMpO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGZpbHRlcnNBbGwuZmluZEluZGV4KHAgPT4gcC5wYXRobmFtZSA9PSBwYXRoTmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSBmaWx0ZXJzQWxsLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkFEVkFOQ0VfRklMVEVSLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJzQWxsKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnWMOzYSBi4buZIGzhu41jIMSRw6MgbMawdSB0aMOgbmggY8O0bmcnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2F2ZWRGaWx0ZXJzKCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFGaWx0ZXJzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQURWQU5DRV9GSUxURVIpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyX3F1ZXJ5ID0gW107XHJcbiAgICAgICAgaWYgKGRhdGFGaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJzOiBGaWx0ZXJbXTtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5wYXJlbnRTZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnNBbGwgPSBKU09OLnBhcnNlKGRhdGFGaWx0ZXJzKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJzQWxsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZmlsdGVyc0FsbFtpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBlbGVtZW50LmZpbHRlcnM7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcl9xdWVyeSA9IGZpbHRlcnM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYWxpZ25PdmVybGF5VGltZW91dCk7XHJcbiAgICAgICAgdGhpcy5hbGlnbk92ZXJsYXlUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxpZ25PdmVybGF5KCk7XHJcbiAgICAgICAgfSwgNDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBiaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIgPSB0aGlzLm9uV2luZG93UmVzaXplLmJpbmQodGhpcyk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgdW5iaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFJlc2l6ZUxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRPdmVybGF5KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9vdmVybGF5UGFuZWwgJiYgdGhpcy5fb3ZlcmxheVBhbmVsLm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9vdmVybGF5UGFuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlQYW5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnpJbmRleCA9IFN0cmluZygrK0RvbUhhbmRsZXIuemluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWxpZ25PdmVybGF5KCkge1xyXG4gICAgICAgIHRoaXMuYXBwZW5kTWFzaygpO1xyXG4gICAgICAgIERvbUhhbmRsZXIuYWJzb2x1dGVQb3NpdGlvbih0aGlzLl9vdmVybGF5UGFuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlT3ZlcmxheUFwcGVuZCgpIHtcclxuICAgICAgICB0aGlzLl9vdmVybGF5UGFuZWwgJiYgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX292ZXJsYXlQYW5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBvbk92ZXJsYXlIaWRlKCkge1xyXG4gICAgICAgIHRoaXMudW5iaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMudW5iaW5kTWFza0NsaWNrTGlzdGVuZXIoKTtcclxuICAgICAgICB0aGlzLnJlbW92ZU1hc2soKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVBZHZhbmNlU2VhcmNoUGFuZWxSZW5kZXJlZCgpIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hCb3hNYXhIZWlnaHQgPSBgY2FsYygxMDB2aCAtICR7dGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIDE1MH1weClgO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT3ZlcmxheVNob3coKSB7XHJcbiAgICAgICAgdGhpcy5hcHBlbmRPdmVybGF5KCk7XHJcbiAgICAgICAgdGhpcy5hbGlnbk92ZXJsYXkoKTtcclxuICAgICAgICB0aGlzLmJpbmREb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25PdmVybGF5QW5pbWF0aW9uU3RhcnQoZXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LnRvU3RhdGUpIHtcclxuICAgICAgICAgICAgY2FzZSAndmlzaWJsZSc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheVNob3coKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAndm9pZCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUhpZGUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bmJpbmRNYXNrQ2xpY2tMaXN0ZW5lcigpIHtcclxuICAgICAgICBpZiAodGhpcy5tYXNrQ2xpY2tMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLm1hc2tDbGlja0xpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWFza0NsaWNrTGlzdGVuZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRNYXNrKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tYXNrT3ZlcmxheSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hc2tPdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHRoaXMubWFza092ZXJsYXkuc3R5bGUuekluZGV4ID0gU3RyaW5nKHBhcnNlSW50KHRoaXMuX292ZXJsYXlQYW5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnpJbmRleCkgLSAxKTtcclxuICAgICAgICAgICAgRG9tSGFuZGxlci5hZGRDbGFzcyh0aGlzLm1hc2tPdmVybGF5LCAnYWR2YW5jZS1zZWFyY2gtbWFzay1vdmVybGF5Jyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1hc2tDbGlja0xpc3RlbmVyID0gdGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMubWFza092ZXJsYXksICdjbGljaycsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVGb3JtU2VhcmNoKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1hc2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5tYXNrT3ZlcmxheSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZU1hc2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFza092ZXJsYXkpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLm1hc2tPdmVybGF5KTtcclxuICAgICAgICAgICAgdGhpcy51bmJpbmRNYXNrQ2xpY2tMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB0aGlzLm1hc2tPdmVybGF5ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXN0b3JlT3ZlcmxheUFwcGVuZCgpO1xyXG4gICAgICAgIHRoaXMub25PdmVybGF5SGlkZSgpO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgI2VsIGNsYXNzPVwiYm94LWFkdmFuY2Utc2VhcmNoLWlubGluZSBwLWlucHV0Z3JvdXBcIj5cclxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBJbnB1dFRleHQgcGxhY2Vob2xkZXI9XCJOaOG6rXAgdOG7qyBraMOzYSB0w6xtIGtp4bq/bVwiIFtwVG9vbHRpcF09XCJzZWFyY2hCb3hUb29sdGlwXCJcclxuICAgICAgICB0b29sdGlwU3R5bGVDbGFzcz1cIndyYXAgbWF4LXdpZHRoLTMwMFwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFwYXJlbnRTZXR0aW5nLmZpZWxkU2VhcmNoVGV4dCB8fCAhcGFyZW50U2V0dGluZy5maWVsZFNlYXJjaFRleHQubGVuZ3RoXCIgWyhuZ01vZGVsKV09XCJrZXl3b3JkXCJcclxuICAgICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlZCgkZXZlbnQpXCIgKGtleXVwLmVzYyk9XCJvbkVzYygkZXZlbnQpXCIgLz5cclxuICAgIDxzcGFuIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uIGFjdGlvblwiIFtjbGFzcy5kaXNhYmxlZF09XCJsb2FkaW5nXCIgW2NsYXNzLmRpcnR5XT1cIiEha2V5d29yZFwiXHJcbiAgICAgICAgW3BUb29sdGlwXT1cIidYw7NhIHTDrG0ga2nhur9tJ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIChjbGljayk9XCJjbGVhcktleXdvcmQoKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGkgcGktZmlsdGVyLXNsYXNoXCI+PC9pPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb24gYWN0aW9uXCIgW2NsYXNzLmRpc2FibGVkXT1cImxvYWRpbmdcIiBbcFRvb2x0aXBdPVwiJ1TDrG0ga2nhur9tJ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uRG9TZWFyY2hpbmcoKVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoXCI+PC9pPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJjb250YWluZXItc2VhcmNoLWRpYWxvZyBwLWlucHV0Z3JvdXAtYWRkb24gYWN0aW9uIGFjdGlvbi10cmlnZ2VyXCIgdGFiaW5kZXg9XCIwXCIgW2NsYXNzLnNob3ddPVwic2hvd0Zvcm1cIlxyXG4gICAgICAgIFtwVG9vbHRpcF09XCInVMOsbSBraeG6v20gbsOibmcgY2FvJ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxyXG4gICAgICAgIDxzcGFuIChjbGljayk9XCJzaG93Rm9ybVNlYXJjaCgpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2FyZXQtZG93blwiPjwvaT5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cInNob3dGb3JtXCIgI292ZXJsYXlQYW5lbFxyXG4gICAgY2xhc3M9XCJhZHZhbmNlLXNlYXJjaC1vdmVybGF5LXBhbmVsIGZpbHRlci1jb250ZW50IHAtb3ZlcmxheXBhbmVsIHAtd2lkZ2V0LWNvbnRlbnQgZmFkZUluRG93biBhZHZhbmNlLXNlYXJjaC1ib3hcIlxyXG4gICAgKGtleXVwLmVudGVyKT1cIm9uRG9TZWFyY2hpbmcoKVwiIChrZXl1cC5lc2MpPVwiaGlkZUZvcm1TZWFyY2goKVwiIChtb3VzZWRvd24pPVwib25DbGljaygkZXZlbnQpXCI+XHJcbiAgICA8IS0tIFtAb3ZlcmxheUFuaW1hdGlvbl09XCJ7dmFsdWU6ICd2aXNpYmxlJywgcGFyYW1zOiB7c2hvd1RyYW5zaXRpb25QYXJhbXM6IG92ZXJsYXlTaG93VHJhbnNpdGlvbk9wdGlvbnMsIGhpZGVUcmFuc2l0aW9uUGFyYW1zOiBvdmVybGF5SGlkZVRyYW5zaXRpb25PcHRpb25zfX1cIiAtLT5cclxuICAgIDwhLS0gKEBvdmVybGF5QW5pbWF0aW9uLnN0YXJ0KT1cIm9uT3ZlcmxheUFuaW1hdGlvblN0YXJ0KCRldmVudClcIiAgLS0+XHJcblxyXG4gICAgPCEtLSA8YSBjbGFzcz1cImFkdmFuY2UtZmlsdGVyLWNsb3NlIG5nLXN0YXItaW5zZXJ0ZWRcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIChjbGljayk9XCJoaWRlRm9ybVNlYXJjaCgpXCI+PGlcclxuICAgICAgICAgICAgY2xhc3M9XCJwaSBwaS10aW1lc1wiPjwvaT48L2E+IC0tPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcmVudFNldHRpbmcuZmlsdGVyVGVtcGxhdGVBZHZzXCI+XHJcbiAgICAgICAgPHRuLWN1c3RvbS1zY3JvbGxiYXIgI3Njcm9sbGJhclxyXG4gICAgICAgICAgICBbc3R5bGVdPVwieyBtYXhIZWlnaHQ6IF9zZWFyY2hCb3hNYXhIZWlnaHQsIG1pbkhlaWdodDogJzMwMHB4JywgaGVpZ2h0OiAnYXV0bycsIHBhcmVudENsYXNzOiAnYm94LWFkdmFuY2Utc2VhcmNoLWlubGluZScgfVwiPlxyXG4gICAgICAgICAgICA8Y3J1ZC1mb3JtICpuZ0lmPVwicmVhZHlcIiAjY3J1ZEZvcm0gW2RhdGFdPVwibW9kZWxDcnVkRm9ybVwiIFtzZXR0aW5nXT1cInNldHRpbmdcIiBbY29udGV4dF09XCJjb250ZXh0XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlS2V5cHJlc3NDb250cm9sXT1cInRydWVcIiBbZGlzYWJsZUNhY2hpbmddPVwidHJ1ZVwiIChvbkZvcm1TaG93KT1cIm9uRm9ybVNob3coJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAob25Gb3JtSGlkZSk9XCJvbkZvcm1IaWRlKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9jcnVkLWZvcm0+XHJcbiAgICAgICAgPC90bi1jdXN0b20tc2Nyb2xsYmFyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItc2VhcmNoXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gaWNvbj1cInBpIHBpLXNlYXJjaFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1pbmZvXCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInVMOsbSBraeG6v20nIHwgdHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uRG9TZWFyY2hpbmcoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1yZXBsYXlcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCInWMOzYSB0w6xtIGtp4bq/bScgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KVwiIHByZXZlbnRUYWI+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcGFyZW50U2V0dGluZy5maWx0ZXJUZW1wbGF0ZUFkdnNcIj5cclxuICAgICAgICA8cXVlcnktYnVpbGRlciBbc2VhcmNoU2NoZW1hXT1cInNldHRpbmcuc2NoZW1hXCIgW2ZpbHRlcnNdPVwiZmlsdGVyX3F1ZXJ5XCJcclxuICAgICAgICAgICAgW3N0eWxlXT1cInsgbWF4SGVpZ2h0OiBfc2VhcmNoQm94TWF4SGVpZ2h0LCBtaW5IZWlnaHQ6ICczMDBweCcsIGhlaWdodDogJ2F1dG8nLCBwYXJlbnRDbGFzczogJ2JveC1hZHZhbmNlLXNlYXJjaC1pbmxpbmUnfVwiXHJcbiAgICAgICAgICAgIChvblNhdmUpPVwiaGFuZGxlU2F2ZVNldHRpbmcoJGV2ZW50KVwiIChvbkRlbGV0ZVNhdmUpPVwiaGFuZGxlRGVsZXRlU2F2ZVNldHRpbmcoKVwiXHJcbiAgICAgICAgICAgIChvblNlYXJjaCk9XCJoYW5kbGVTZWFyY2hCdWlsZGVyKCRldmVudClcIj5cclxuICAgICAgICA8L3F1ZXJ5LWJ1aWxkZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxhZnRlci12aWV3LWNoZWNrZWQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChsb2FkZWQpPVwiaGFuZGxlQWR2YW5jZVNlYXJjaFBhbmVsUmVuZGVyZWQoKVwiPlxyXG4gICAgPC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbjwvZGl2PiJdfQ==