@lowcodeunit/applications-flow-common 1.33.318-integration → 1.33.321-lets-get-social-ish

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 (42) hide show
  1. package/esm2020/lcu.api.mjs +3 -3
  2. package/esm2020/lib/applications-flow.module.mjs +22 -11
  3. package/esm2020/lib/controls/devops-source-control-form/devops-source-control-form.component.mjs +3 -3
  4. package/esm2020/lib/dialogs/feed-header-dialog/feed-header-dialog.component.mjs +287 -0
  5. package/esm2020/lib/elements/dynamic-tabs/dynamic-tabs.component.mjs +2 -2
  6. package/esm2020/lib/elements/feed-header/feed-header.component.mjs +128 -0
  7. package/esm2020/lib/elements/form-card/form-card.component.mjs +2 -2
  8. package/esm2020/lib/elements/projects/controls/builds/builds.component.mjs +2 -2
  9. package/esm2020/lib/elements/projects/controls/create-project-wizard/create-project-wizard.component.mjs +2 -2
  10. package/esm2020/lib/elements/projects/controls/forms/source-control/source-control.component.mjs +2 -2
  11. package/esm2020/lib/elements/projects/controls/git-auth/git-auth.component.mjs +6 -4
  12. package/esm2020/lib/elements/projects/controls/header/header.component.mjs +2 -2
  13. package/esm2020/lib/elements/projects/controls/hosting-details-form-group/hosting-details-form-group.component.mjs +2 -2
  14. package/esm2020/lib/elements/projects/controls/project-items/project-items.component.mjs +2 -2
  15. package/esm2020/lib/elements/projects/controls/project-tabs/project-tabs.component.mjs +2 -2
  16. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/apps-flow.component.mjs +2 -2
  17. package/esm2020/lib/elements/projects/controls/tabs/apps-flow/npm-package-select/npm-package-select.component.mjs +2 -2
  18. package/esm2020/lib/elements/projects/controls/tabs/devops/devops.component.mjs +2 -2
  19. package/esm2020/lib/elements/projects/controls/tabs/dfs-modifiers/dfs-modifiers.component.mjs +2 -2
  20. package/esm2020/lib/elements/projects/controls/tabs/domains/domains.component.mjs +2 -2
  21. package/esm2020/lib/elements/projects/controls/tabs/general/forms/project-details/project-details.component.mjs +2 -2
  22. package/esm2020/lib/elements/projects/controls/tabs/general/forms/root-directory/root-directory.component.mjs +2 -2
  23. package/esm2020/lib/elements/projects/controls/tabs/general/general.component.mjs +2 -2
  24. package/esm2020/lib/elements/projects/projects.component.mjs +2 -2
  25. package/esm2020/lib/models/user-feed.model.mjs +3 -1
  26. package/esm2020/lib/services/applications-flow.service.mjs +8 -1
  27. package/esm2020/lib/services/eac.service.mjs +4 -1
  28. package/esm2020/lib/services/project.service.mjs +24 -1
  29. package/fesm2015/lowcodeunit-applications-flow-common.mjs +1771 -1411
  30. package/fesm2015/lowcodeunit-applications-flow-common.mjs.map +1 -1
  31. package/fesm2020/lowcodeunit-applications-flow-common.mjs +1652 -1311
  32. package/fesm2020/lowcodeunit-applications-flow-common.mjs.map +1 -1
  33. package/lcu.api.d.ts +2 -2
  34. package/lib/applications-flow.module.d.ts +12 -10
  35. package/lib/dialogs/feed-header-dialog/feed-header-dialog.component.d.ts +71 -0
  36. package/lib/elements/{gh-control/gh-control.component.d.ts → feed-header/feed-header.component.d.ts} +7 -4
  37. package/lib/models/user-feed.model.d.ts +16 -0
  38. package/lib/services/applications-flow.service.d.ts +2 -0
  39. package/lib/services/eac.service.d.ts +2 -1
  40. package/lib/services/project.service.d.ts +2 -1
  41. package/package.json +1 -1
  42. package/esm2020/lib/elements/gh-control/gh-control.component.mjs +0 -107
@@ -0,0 +1,128 @@
1
+ import { Input } from '@angular/core';
2
+ import { Component } from '@angular/core';
3
+ import { FeedHeaderDialogComponent } from '../../dialogs/feed-header-dialog/feed-header-dialog.component';
4
+ import { NewApplicationDialogComponent } from '../../dialogs/new-application-dialog/new-application-dialog.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/eac.service";
7
+ import * as i2 from "@angular/material/dialog";
8
+ import * as i3 from "@angular/material/card";
9
+ import * as i4 from "@angular/material/icon";
10
+ import * as i5 from "@angular/material/button";
11
+ import * as i6 from "skeleton-elements/angular";
12
+ import * as i7 from "@angular/common";
13
+ import * as i8 from "@angular/flex-layout/flex";
14
+ export class FeedHeaderComponent {
15
+ constructor(eacSvc, dialog) {
16
+ this.eacSvc = eacSvc;
17
+ this.dialog = dialog;
18
+ this.SkeletonEffect = "wave";
19
+ // this.selectedBtn = "pr-btn";
20
+ }
21
+ get ActiveEnvironmentLookup() {
22
+ // TODO: Eventually support multiple environments
23
+ const envLookups = Object.keys(this.State?.EaC?.Environments || {});
24
+ return envLookups[0];
25
+ }
26
+ get State() {
27
+ return this.eacSvc.State;
28
+ }
29
+ ngOnInit() {
30
+ }
31
+ ngAfterViewInit() {
32
+ this.addSelectBtn();
33
+ }
34
+ CreateAnnouncement() {
35
+ this.ModalHeader = "Create Team Announcement";
36
+ this.OpenFHDialog('announcement');
37
+ }
38
+ CreateFeatureBranch() {
39
+ this.removeSelectedBtn();
40
+ this.ModalHeader = "Create Feature Branch";
41
+ this.selectedBtn = "fb-btn";
42
+ this.addSelectBtn();
43
+ console.log("create feature branch selected");
44
+ this.OpenFHDialog('branch');
45
+ }
46
+ OpenIssue() {
47
+ this.removeSelectedBtn();
48
+ this.ModalHeader = "Open Issue";
49
+ this.selectedBtn = "oi-btn";
50
+ this.addSelectBtn();
51
+ console.log("open issue selected");
52
+ this.OpenFHDialog('issue');
53
+ }
54
+ CreatePullRequest() {
55
+ this.removeSelectedBtn();
56
+ this.ModalHeader = "Create Pull Request";
57
+ this.selectedBtn = "pr-btn";
58
+ this.addSelectBtn();
59
+ console.log("create pull request selected");
60
+ this.OpenFHDialog('pull-request');
61
+ }
62
+ CreateNewApp() {
63
+ const dialogRef = this.dialog.open(NewApplicationDialogComponent, {
64
+ width: '600px',
65
+ data: {
66
+ environmentLookup: this.ActiveEnvironmentLookup,
67
+ },
68
+ });
69
+ dialogRef.afterClosed().subscribe((result) => {
70
+ // console.log('The dialog was closed');
71
+ // console.log("result:", result)
72
+ });
73
+ }
74
+ OpenFHDialog(modalType) {
75
+ const dialogRef = this.dialog.open(FeedHeaderDialogComponent, {
76
+ width: '600px',
77
+ data: {
78
+ dialogTitle: this.ModalHeader,
79
+ type: modalType,
80
+ sourceControlLookup: this.SourceControlLookup ? this.SourceControlLookup : null
81
+ },
82
+ });
83
+ dialogRef.afterClosed().subscribe((result) => {
84
+ // console.log('The dialog was closed');
85
+ // console.log("result:", result)
86
+ });
87
+ }
88
+ RouteToPath(path) {
89
+ window.location.href = path;
90
+ }
91
+ Submit() {
92
+ console.log("submitting: ", this.value);
93
+ switch (this.selectedBtn) {
94
+ case "pr-btn":
95
+ //Pull request
96
+ console.log("creating pull request: ", this.value);
97
+ break;
98
+ case "oi-btn":
99
+ //Open Issue
100
+ console.log("Open issue: ", this.value);
101
+ break;
102
+ case "fb-btn":
103
+ //Feature Branch
104
+ console.log("creating feature branch: ", this.value);
105
+ break;
106
+ default:
107
+ console.log("hmm");
108
+ break;
109
+ }
110
+ }
111
+ //HELPERS
112
+ addSelectBtn() {
113
+ document.getElementById(this.selectedBtn)?.classList.add('selected');
114
+ }
115
+ removeSelectedBtn() {
116
+ document.getElementById(this.selectedBtn)?.classList.remove('selected');
117
+ }
118
+ }
119
+ FeedHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: FeedHeaderComponent, deps: [{ token: i1.EaCService }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
120
+ FeedHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: FeedHeaderComponent, selector: "lcu-feed-header", inputs: { SourceControlLookup: ["source-control-lookup", "SourceControlLookup"] }, ngImport: i0, template: "<mat-card class=\"social-card\">\n <ng-container *ngIf=\"!State?.Loading\">\n <div class=\"gh-card-container\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <mat-icon fxFlex=\"15%\" class=\"gh-icon\" color=\"primary\">error_outline</mat-icon>\n <div fxFlex=\"85%\" class=\"gh-card-main-content\">\n <button \n mat-button \n class=\"main-btn\"\n (click)=\"CreateAnnouncement()\" \n color=\"primary\"\n >Create Team Announcement</button>\n\n <!-- <mat-form-field appearance=\"fill\" class=\"gh-input\">\n <mat-label>{{ InputLabel }}</mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"value\" (click)=\"OpenFHDialog('announcement')\"/>\n </mat-form-field> -->\n </div>\n\n <!-- <button\n fxFlex=\"15%\"\n mat-button\n (click)=\"Submit()\"\n id=\"submit-btn\"\n color=\"primary\"\n >\n Submit\n </button> -->\n </div>\n\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <button \n mat-button \n (click)=\"CreatePullRequest()\" \n id=\"pr-btn\" \n color=\"primary\"\n >\n Pull Request\n </button>\n\n <button \n mat-button \n (click)=\"OpenIssue()\" \n id=\"oi-btn\" \n color=\"primary\"\n >\n Open Issue\n </button>\n\n <button \n mat-button \n (click)=\"CreateFeatureBranch()\" \n id=\"fb-btn\" \n color=\"primary\"\n >\n Feature Branch\n </button>\n\n <!-- <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"menu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button class=\"gh-menu-action\" mat-menu-item (click)=\"CreateNewApp()\">\n Create New App\n </button>\n\n <button\n class=\"gh-menu-action\"\n mat-menu-item\n (click)=\"RouteToPath('/dashboard/create-project')\"\n >\n Create Project\n </button>\n </mat-menu> -->\n </mat-card-actions>\n </ng-container>\n\n <!-- SKELETON -->\n <ng-container *ngIf=\"State?.Loading\">\n <div id=\"gh-card-skeleton\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <skeleton-avatar\n class=\"gh-icon\"\n [showIcon]=\"false\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-avatar>\n\n <div fxFlex=\"85%\" class=\"gh-card-main-content\">\n <skeleton-block\n height=\"60px\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-block>\n </div>\n\n <!-- <div\n skeleton-text\n fxFlex=\"15%\"\n [effect]=\"SkeletonEffect\"\n style=\"margin: 0px 10px\"\n >\n Submit\n </div> -->\n </div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <div skeleton-text [effect]=\"SkeletonEffect\">Pull Request</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Open Issue</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Feature Branch</div>\n <!-- <div skeleton-text [effect]=\"SkeletonEffect\">\n <mat-icon>more_horiz</mat-icon>\n </div> -->\n </div>\n </ng-container>\n</mat-card>\n", styles: [":host ::ng-deep .social-card{margin:20px;padding:15px 5px}:host ::ng-deep mat-card-actions{margin-bottom:-1px!important;margin-left:0!important;margin-right:-.5px!important}:host ::ng-deep .main-slot-container{padding:10px}:host ::ng-deep .slot-header{align-items:center}:host ::ng-deep .slot-content{width:100%}:host ::ng-deep .slot-name{font-size:13px;font-weight:600}:host ::ng-deep .slot-description{font-size:12px;margin-right:10px}:host ::ng-deep .slot-action-anchor{font-size:10px;text-decoration:none;color:#000}:host ::ng-deep .action-icon{height:25px;width:25px;font-size:25px;cursor:pointer}.gh-icon{width:60px;height:60px;font-size:60px;text-align:center}.gh-input{width:90%}.main-btn{width:90%;height:50px;border-radius:30px;border:1px solid}.selected{border:1px solid green}.gh-input ::ng-deep .mat-form-field-flex{border:1px solid;border-radius:30px!important}.gh-input ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.gh-input ::ng-deep .mat-form-field-underline{display:none}\n"], components: [{ type: i3.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.SkeletonAvatarComponent, selector: "skeleton-avatar", inputs: ["size", "color", "showIcon", "iconColor", "borderRadius", "effect"] }, { type: i6.SkeletonBlockComponent, selector: "skeleton-block", inputs: ["width", "height", "effect", "borderRadius"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i8.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i8.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i6.SkeletonTextDirective, selector: "[skeleton-text]", inputs: ["effect"] }] });
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: FeedHeaderComponent, decorators: [{
122
+ type: Component,
123
+ args: [{ selector: 'lcu-feed-header', template: "<mat-card class=\"social-card\">\n <ng-container *ngIf=\"!State?.Loading\">\n <div class=\"gh-card-container\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <mat-icon fxFlex=\"15%\" class=\"gh-icon\" color=\"primary\">error_outline</mat-icon>\n <div fxFlex=\"85%\" class=\"gh-card-main-content\">\n <button \n mat-button \n class=\"main-btn\"\n (click)=\"CreateAnnouncement()\" \n color=\"primary\"\n >Create Team Announcement</button>\n\n <!-- <mat-form-field appearance=\"fill\" class=\"gh-input\">\n <mat-label>{{ InputLabel }}</mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"value\" (click)=\"OpenFHDialog('announcement')\"/>\n </mat-form-field> -->\n </div>\n\n <!-- <button\n fxFlex=\"15%\"\n mat-button\n (click)=\"Submit()\"\n id=\"submit-btn\"\n color=\"primary\"\n >\n Submit\n </button> -->\n </div>\n\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <button \n mat-button \n (click)=\"CreatePullRequest()\" \n id=\"pr-btn\" \n color=\"primary\"\n >\n Pull Request\n </button>\n\n <button \n mat-button \n (click)=\"OpenIssue()\" \n id=\"oi-btn\" \n color=\"primary\"\n >\n Open Issue\n </button>\n\n <button \n mat-button \n (click)=\"CreateFeatureBranch()\" \n id=\"fb-btn\" \n color=\"primary\"\n >\n Feature Branch\n </button>\n\n <!-- <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"menu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button class=\"gh-menu-action\" mat-menu-item (click)=\"CreateNewApp()\">\n Create New App\n </button>\n\n <button\n class=\"gh-menu-action\"\n mat-menu-item\n (click)=\"RouteToPath('/dashboard/create-project')\"\n >\n Create Project\n </button>\n </mat-menu> -->\n </mat-card-actions>\n </ng-container>\n\n <!-- SKELETON -->\n <ng-container *ngIf=\"State?.Loading\">\n <div id=\"gh-card-skeleton\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <skeleton-avatar\n class=\"gh-icon\"\n [showIcon]=\"false\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-avatar>\n\n <div fxFlex=\"85%\" class=\"gh-card-main-content\">\n <skeleton-block\n height=\"60px\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-block>\n </div>\n\n <!-- <div\n skeleton-text\n fxFlex=\"15%\"\n [effect]=\"SkeletonEffect\"\n style=\"margin: 0px 10px\"\n >\n Submit\n </div> -->\n </div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <div skeleton-text [effect]=\"SkeletonEffect\">Pull Request</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Open Issue</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Feature Branch</div>\n <!-- <div skeleton-text [effect]=\"SkeletonEffect\">\n <mat-icon>more_horiz</mat-icon>\n </div> -->\n </div>\n </ng-container>\n</mat-card>\n", styles: [":host ::ng-deep .social-card{margin:20px;padding:15px 5px}:host ::ng-deep mat-card-actions{margin-bottom:-1px!important;margin-left:0!important;margin-right:-.5px!important}:host ::ng-deep .main-slot-container{padding:10px}:host ::ng-deep .slot-header{align-items:center}:host ::ng-deep .slot-content{width:100%}:host ::ng-deep .slot-name{font-size:13px;font-weight:600}:host ::ng-deep .slot-description{font-size:12px;margin-right:10px}:host ::ng-deep .slot-action-anchor{font-size:10px;text-decoration:none;color:#000}:host ::ng-deep .action-icon{height:25px;width:25px;font-size:25px;cursor:pointer}.gh-icon{width:60px;height:60px;font-size:60px;text-align:center}.gh-input{width:90%}.main-btn{width:90%;height:50px;border-radius:30px;border:1px solid}.selected{border:1px solid green}.gh-input ::ng-deep .mat-form-field-flex{border:1px solid;border-radius:30px!important}.gh-input ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.gh-input ::ng-deep .mat-form-field-underline{display:none}\n"] }]
124
+ }], ctorParameters: function () { return [{ type: i1.EaCService }, { type: i2.MatDialog }]; }, propDecorators: { SourceControlLookup: [{
125
+ type: Input,
126
+ args: ['source-control-lookup']
127
+ }] } });
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVlZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvZWxlbWVudHMvZmVlZC1oZWFkZXIvZmVlZC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvZWxlbWVudHMvZmVlZC1oZWFkZXIvZmVlZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQzFHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVFQUF1RSxDQUFDOzs7Ozs7Ozs7O0FBU3RILE1BQU0sT0FBTyxtQkFBbUI7SUF3QjlCLFlBQ2MsTUFBa0IsRUFDbEIsTUFBaUI7UUFEakIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBRTdCLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1FBQzdCLCtCQUErQjtJQUVqQyxDQUFDO0lBMUJELElBQVcsdUJBQXVCO1FBQ2hDLG1EQUFtRDtRQUNuRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVwRSxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBbUJNLFFBQVE7SUFFZixDQUFDO0lBRU0sZUFBZTtRQUNw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QUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsWUFBWTtnQkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsZ0JBQWdCO2dCQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNSO2dCQUNFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBRWxCLE1BQU07U0FDVDtJQUNILENBQUM7SUFFRCxTQUFTO0lBRUMsWUFBWTtRQUNOLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBRSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVTLGlCQUFpQjtRQUNYLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBRSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekYsQ0FBQzs7Z0hBOUlVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDBJQ2JoQyxtdkdBZ0hBOzJGRG5HYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsaUJBQWlCO3lIQU9wQixtQkFBbUI7c0JBRHpCLEtBQUs7dUJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRmVlZEhlYWRlckRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvZmVlZC1oZWFkZXItZGlhbG9nL2ZlZWQtaGVhZGVyLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmV3QXBwbGljYXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL25ldy1hcHBsaWNhdGlvbi1kaWFsb2cvbmV3LWFwcGxpY2F0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWFDU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VhYy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uc0Zsb3dTdGF0ZSB9IGZyb20gJy4uLy4uL3N0YXRlL2FwcGxpY2F0aW9ucy1mbG93LnN0YXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGN1LWZlZWQtaGVhZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZlZWQtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmVlZC1oZWFkZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGZWVkSGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoJ3NvdXJjZS1jb250cm9sLWxvb2t1cCcpXG4gIHB1YmxpYyBTb3VyY2VDb250cm9sTG9va3VwOiBzdHJpbmc7XG5cbiAgcHVibGljIGdldCBBY3RpdmVFbnZpcm9ubWVudExvb2t1cCgpOiBzdHJpbmcge1xuICAgIC8vICBUT0RPOiAgRXZlbnR1YWxseSBzdXBwb3J0IG11bHRpcGxlIGVudmlyb25tZW50c1xuICAgIGNvbnN0IGVudkxvb2t1cHMgPSBPYmplY3Qua2V5cyh0aGlzLlN0YXRlPy5FYUM/LkVudmlyb25tZW50cyB8fCB7fSk7XG5cbiAgICByZXR1cm4gZW52TG9va3Vwc1swXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgU3RhdGUoKTogQXBwbGljYXRpb25zRmxvd1N0YXRle1xuICAgIHJldHVybiB0aGlzLmVhY1N2Yy5TdGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBNb2RhbEhlYWRlcjogc3RyaW5nO1xuXG4gIHB1YmxpYyBTa2VsZXRvbkVmZmVjdDogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBzZWxlY3RlZEJ0bjogc3RyaW5nO1xuXG4gIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCBcbiAgICAgIHByb3RlY3RlZCBlYWNTdmM6IEVhQ1NlcnZpY2UsXG4gICAgICBwcm90ZWN0ZWQgZGlhbG9nOiBNYXREaWFsb2cpIHsgXG5cbiAgICB0aGlzLlNrZWxldG9uRWZmZWN0ID0gXCJ3YXZlXCI7XG4gICAgLy8gdGhpcy5zZWxlY3RlZEJ0biA9IFwicHItYnRuXCI7XG5cbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICB0aGlzLmFkZFNlbGVjdEJ0bigpO1xuICB9XG5cbiAgcHVibGljIENyZWF0ZUFubm91bmNlbWVudCgpe1xuICAgIHRoaXMuTW9kYWxIZWFkZXIgPSBcIkNyZWF0ZSBUZWFtIEFubm91bmNlbWVudFwiO1xuICAgIHRoaXMuT3BlbkZIRGlhbG9nKCdhbm5vdW5jZW1lbnQnKTtcblxuICB9XG5cbiAgcHVibGljIENyZWF0ZUZlYXR1cmVCcmFuY2goKXtcbiAgICB0aGlzLnJlbW92ZVNlbGVjdGVkQnRuKCk7XG4gICAgdGhpcy5Nb2RhbEhlYWRlciA9IFwiQ3JlYXRlIEZlYXR1cmUgQnJhbmNoXCI7XG4gICAgdGhpcy5zZWxlY3RlZEJ0biA9IFwiZmItYnRuXCI7XG4gICAgdGhpcy5hZGRTZWxlY3RCdG4oKTtcbiAgICBjb25zb2xlLmxvZyhcImNyZWF0ZSBmZWF0dXJlIGJyYW5jaCBzZWxlY3RlZFwiKTtcbiAgICB0aGlzLk9wZW5GSERpYWxvZygnYnJhbmNoJyk7XG5cbiAgfVxuXG4gIHB1YmxpYyBPcGVuSXNzdWUoKXtcbiAgICB0aGlzLnJlbW92ZVNlbGVjdGVkQnRuKCk7XG4gICAgdGhpcy5Nb2RhbEhlYWRlciA9IFwiT3BlbiBJc3N1ZVwiO1xuICAgIHRoaXMuc2VsZWN0ZWRCdG4gPSBcIm9pLWJ0blwiO1xuICAgIHRoaXMuYWRkU2VsZWN0QnRuKCk7XG4gICAgY29uc29sZS5sb2coXCJvcGVuIGlzc3VlIHNlbGVjdGVkXCIpO1xuICAgIHRoaXMuT3BlbkZIRGlhbG9nKCdpc3N1ZScpO1xuXG4gIH1cblxuICBwdWJsaWMgQ3JlYXRlUHVsbFJlcXVlc3QoKXtcbiAgICB0aGlzLnJlbW92ZVNlbGVjdGVkQnRuKCk7XG4gICAgdGhpcy5Nb2RhbEhlYWRlciA9IFwiQ3JlYXRlIFB1bGwgUmVxdWVzdFwiO1xuICAgIHRoaXMuc2VsZWN0ZWRCdG4gPSBcInByLWJ0blwiO1xuICAgIHRoaXMuYWRkU2VsZWN0QnRuKCk7XG4gICAgY29uc29sZS5sb2coXCJjcmVhdGUgcHVsbCByZXF1ZXN0IHNlbGVjdGVkXCIpO1xuICAgIHRoaXMuT3BlbkZIRGlhbG9nKCdwdWxsLXJlcXVlc3QnKTtcblxuICB9XG5cbiAgcHVibGljIENyZWF0ZU5ld0FwcCgpe1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTmV3QXBwbGljYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBlbnZpcm9ubWVudExvb2t1cDogdGhpcy5BY3RpdmVFbnZpcm9ubWVudExvb2t1cCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnVGhlIGRpYWxvZyB3YXMgY2xvc2VkJyk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcInJlc3VsdDpcIiwgcmVzdWx0KVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIE9wZW5GSERpYWxvZyhtb2RhbFR5cGU6IHN0cmluZyl7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihGZWVkSGVhZGVyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZGlhbG9nVGl0bGU6IHRoaXMuTW9kYWxIZWFkZXIsXG4gICAgICAgIHR5cGU6IG1vZGFsVHlwZSxcbiAgICAgICAgc291cmNlQ29udHJvbExvb2t1cDogdGhpcy5Tb3VyY2VDb250cm9sTG9va3VwID8gdGhpcy5Tb3VyY2VDb250cm9sTG9va3VwIDogbnVsbFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdUaGUgZGlhbG9nIHdhcyBjbG9zZWQnKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCByZXN1bHQpXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgUm91dGVUb1BhdGgocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBwYXRoO1xuICB9XG5cblxuICBwdWJsaWMgU3VibWl0KCl7XG4gICAgY29uc29sZS5sb2coXCJzdWJtaXR0aW5nOiBcIiwgdGhpcy52YWx1ZSk7XG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkQnRuKXtcbiAgICAgIGNhc2UgXCJwci1idG5cIjpcbiAgICAgICAgLy9QdWxsIHJlcXVlc3RcbiAgICAgICAgY29uc29sZS5sb2coXCJjcmVhdGluZyBwdWxsIHJlcXVlc3Q6IFwiLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwib2ktYnRuXCI6XG4gICAgICAgIC8vT3BlbiBJc3N1ZVxuICAgICAgICBjb25zb2xlLmxvZyhcIk9wZW4gaXNzdWU6IFwiLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZmItYnRuXCI6XG4gICAgICAgIC8vRmVhdHVyZSBCcmFuY2hcbiAgICAgICAgY29uc29sZS5sb2coXCJjcmVhdGluZyBmZWF0dXJlIGJyYW5jaDogXCIsIHRoaXMudmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUubG9nKFwiaG1tXCIpXG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy9IRUxQRVJTXG5cbiAgcHJvdGVjdGVkIGFkZFNlbGVjdEJ0bigpeyAgICBcbiAgICAoPEhUTUxFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VsZWN0ZWRCdG4pKT8uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVTZWxlY3RlZEJ0bigpe1xuICAgICg8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWxlY3RlZEJ0bikpPy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpO1xuICB9XG5cbn1cbiIsIjxtYXQtY2FyZCBjbGFzcz1cInNvY2lhbC1jYXJkXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhU3RhdGU/LkxvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2gtY2FyZC1jb250YWluZXJcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCI+XG4gICAgICA8bWF0LWljb24gZnhGbGV4PVwiMTUlXCIgY2xhc3M9XCJnaC1pY29uXCIgY29sb3I9XCJwcmltYXJ5XCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICA8ZGl2IGZ4RmxleD1cIjg1JVwiIGNsYXNzPVwiZ2gtY2FyZC1tYWluLWNvbnRlbnRcIj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICBtYXQtYnV0dG9uIFxuICAgICAgICAgIGNsYXNzPVwibWFpbi1idG5cIlxuICAgICAgICAgIChjbGljayk9XCJDcmVhdGVBbm5vdW5jZW1lbnQoKVwiIFxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgID5DcmVhdGUgVGVhbSBBbm5vdW5jZW1lbnQ8L2J1dHRvbj5cblxuICAgICAgICA8IS0tIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwiZ2gtaW5wdXRcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPnt7IElucHV0TGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGNsaWNrKT1cIk9wZW5GSERpYWxvZygnYW5ub3VuY2VtZW50JylcIi8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gPGJ1dHRvblxuICAgICAgICBmeEZsZXg9XCIxNSVcIlxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJTdWJtaXQoKVwiXG4gICAgICAgIGlkPVwic3VibWl0LWJ0blwiXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICA+XG4gICAgICAgIFN1Ym1pdFxuICAgICAgPC9idXR0b24+IC0tPlxuICAgIDwvZGl2PlxuXG4gICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3BhY2UtYXJvdW5kIGNlbnRlclwiPlxuICAgICAgPGJ1dHRvbiBcbiAgICAgICAgbWF0LWJ1dHRvbiBcbiAgICAgICAgKGNsaWNrKT1cIkNyZWF0ZVB1bGxSZXF1ZXN0KClcIiBcbiAgICAgICAgaWQ9XCJwci1idG5cIiBcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgID5cbiAgICAgICAgUHVsbCBSZXF1ZXN0XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPGJ1dHRvbiBcbiAgICAgICAgbWF0LWJ1dHRvbiBcbiAgICAgICAgKGNsaWNrKT1cIk9wZW5Jc3N1ZSgpXCIgXG4gICAgICAgIGlkPVwib2ktYnRuXCIgXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICA+XG4gICAgICAgIE9wZW4gSXNzdWVcbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8YnV0dG9uIFxuICAgICAgICBtYXQtYnV0dG9uIFxuICAgICAgICAoY2xpY2spPVwiQ3JlYXRlRmVhdHVyZUJyYW5jaCgpXCIgXG4gICAgICAgIGlkPVwiZmItYnRuXCIgXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICA+XG4gICAgICAgIEZlYXR1cmUgQnJhbmNoXG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIGFyaWEtbGFiZWw9XCJtZW51XCI+XG4gICAgICAgIDxtYXQtaWNvbj5tb3JlX2hvcml6PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZ2gtbWVudS1hY3Rpb25cIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJDcmVhdGVOZXdBcHAoKVwiPlxuICAgICAgICAgIENyZWF0ZSBOZXcgQXBwXG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImdoLW1lbnUtYWN0aW9uXCJcbiAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgKGNsaWNrKT1cIlJvdXRlVG9QYXRoKCcvZGFzaGJvYXJkL2NyZWF0ZS1wcm9qZWN0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgQ3JlYXRlIFByb2plY3RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L21hdC1tZW51PiAtLT5cbiAgICA8L21hdC1jYXJkLWFjdGlvbnM+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gU0tFTEVUT04gLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJTdGF0ZT8uTG9hZGluZ1wiPlxuICAgIDxkaXYgaWQ9XCJnaC1jYXJkLXNrZWxldG9uXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICAgICAgPHNrZWxldG9uLWF2YXRhclxuICAgICAgICBjbGFzcz1cImdoLWljb25cIlxuICAgICAgICBbc2hvd0ljb25dPVwiZmFsc2VcIlxuICAgICAgICBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCJcbiAgICAgID48L3NrZWxldG9uLWF2YXRhcj5cblxuICAgICAgPGRpdiBmeEZsZXg9XCI4NSVcIiBjbGFzcz1cImdoLWNhcmQtbWFpbi1jb250ZW50XCI+XG4gICAgICAgIDxza2VsZXRvbi1ibG9ja1xuICAgICAgICAgIGhlaWdodD1cIjYwcHhcIlxuICAgICAgICAgIFtlZmZlY3RdPVwiU2tlbGV0b25FZmZlY3RcIlxuICAgICAgICA+PC9za2VsZXRvbi1ibG9jaz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIDxkaXZcbiAgICAgICAgc2tlbGV0b24tdGV4dFxuICAgICAgICBmeEZsZXg9XCIxNSVcIlxuICAgICAgICBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCJcbiAgICAgICAgc3R5bGU9XCJtYXJnaW46IDBweCAxMHB4XCJcbiAgICAgID5cbiAgICAgICAgU3VibWl0XG4gICAgICA8L2Rpdj4gLS0+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWFyb3VuZCBjZW50ZXJcIj5cbiAgICAgIDxkaXYgc2tlbGV0b24tdGV4dCBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCI+UHVsbCBSZXF1ZXN0PC9kaXY+XG4gICAgICA8ZGl2IHNrZWxldG9uLXRleHQgW2VmZmVjdF09XCJTa2VsZXRvbkVmZmVjdFwiPk9wZW4gSXNzdWU8L2Rpdj5cbiAgICAgIDxkaXYgc2tlbGV0b24tdGV4dCBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCI+RmVhdHVyZSBCcmFuY2g8L2Rpdj5cbiAgICAgIDwhLS0gPGRpdiBza2VsZXRvbi10ZXh0IFtlZmZlY3RdPVwiU2tlbGV0b25FZmZlY3RcIj5cbiAgICAgICAgPG1hdC1pY29uPm1vcmVfaG9yaXo8L21hdC1pY29uPlxuICAgICAgPC9kaXY+IC0tPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbWF0LWNhcmQ+XG4iXX0=