@myrmidon/auth-jwt-admin 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/auth-jwt-admin.module.mjs +5 -5
- package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +6 -6
- package/esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs +3 -3
- package/esm2020/lib/components/password-strength-bar/password-strength-bar.component.mjs +3 -3
- package/esm2020/lib/components/state/user-list.repository.mjs +147 -0
- package/esm2020/lib/components/user-editor/user-editor.component.mjs +7 -7
- package/esm2020/lib/components/user-filter/user-filter.component.mjs +15 -18
- package/esm2020/lib/components/user-list/user-list.component.mjs +34 -102
- package/esm2020/lib/services/auth-jwt-account.service.mjs +7 -7
- package/esm2020/lib/services/dialog.service.mjs +3 -3
- package/fesm2015/myrmidon-auth-jwt-admin.mjs +188 -221
- package/fesm2015/myrmidon-auth-jwt-admin.mjs.map +1 -1
- package/fesm2020/myrmidon-auth-jwt-admin.mjs +187 -219
- package/fesm2020/myrmidon-auth-jwt-admin.mjs.map +1 -1
- package/lib/components/auth-jwt-registration/auth-jwt-registration.component.d.ts +1 -1
- package/lib/components/confirm-dialog/confirm-dialog.component.d.ts +1 -1
- package/lib/components/password-strength-bar/password-strength-bar.component.d.ts +1 -1
- package/lib/components/state/user-list.repository.d.ts +36 -0
- package/lib/components/user-editor/user-editor.component.d.ts +1 -1
- package/lib/components/user-filter/user-filter.component.d.ts +7 -8
- package/lib/components/user-list/user-list.component.d.ts +11 -20
- package/lib/services/auth-jwt-account.service.d.ts +1 -3
- package/package.json +6 -6
- package/esm2020/lib/components/state/users.paginator.mjs +0 -12
- package/esm2020/lib/components/state/users.query.mjs +0 -20
- package/esm2020/lib/components/state/users.service.mjs +0 -65
- package/esm2020/lib/components/state/users.store.mjs +0 -27
- package/lib/components/state/users.paginator.d.ts +0 -3
- package/lib/components/state/users.query.d.ts +0 -12
- package/lib/components/state/users.service.d.ts +0 -19
- package/lib/components/state/users.store.d.ts +0 -13
|
@@ -25,8 +25,8 @@ import { MatPaginatorModule } from '@angular/material/paginator';
|
|
|
25
25
|
import * as i0 from "@angular/core";
|
|
26
26
|
export class AuthJwtAdminModule {
|
|
27
27
|
}
|
|
28
|
-
AuthJwtAdminModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
29
|
-
AuthJwtAdminModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
28
|
+
AuthJwtAdminModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: AuthJwtAdminModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
29
|
+
AuthJwtAdminModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.0", ngImport: i0, type: AuthJwtAdminModule, declarations: [AuthJwtRegistrationComponent,
|
|
30
30
|
PasswordStrengthBarComponent,
|
|
31
31
|
UserFilterComponent,
|
|
32
32
|
UserListComponent,
|
|
@@ -53,7 +53,7 @@ AuthJwtAdminModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", vers
|
|
|
53
53
|
PasswordStrengthBarComponent,
|
|
54
54
|
UserFilterComponent,
|
|
55
55
|
UserListComponent] });
|
|
56
|
-
AuthJwtAdminModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
56
|
+
AuthJwtAdminModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: AuthJwtAdminModule, imports: [CommonModule,
|
|
57
57
|
HttpClientModule,
|
|
58
58
|
FormsModule,
|
|
59
59
|
RouterModule,
|
|
@@ -72,7 +72,7 @@ AuthJwtAdminModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", vers
|
|
|
72
72
|
MatTooltipModule,
|
|
73
73
|
AuthJwtLoginModule,
|
|
74
74
|
NgToolsModule] });
|
|
75
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
75
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: AuthJwtAdminModule, decorators: [{
|
|
76
76
|
type: NgModule,
|
|
77
77
|
args: [{
|
|
78
78
|
declarations: [
|
|
@@ -112,4 +112,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImpor
|
|
|
112
112
|
],
|
|
113
113
|
}]
|
|
114
114
|
}] });
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtYWRtaW4ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9hdXRoLWp3dC1hZG1pbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDbEgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDbEgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDOUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUF1Q2pFLE1BQU0sT0FBTyxrQkFBa0I7OytHQUFsQixrQkFBa0I7Z0hBQWxCLGtCQUFrQixpQkFuQzNCLDRCQUE0QjtRQUM1Qiw0QkFBNEI7UUFDNUIsbUJBQW1CO1FBQ25CLGlCQUFpQjtRQUNqQixzQkFBc0I7UUFDdEIsbUJBQW1CLGFBR25CLFlBQVk7UUFDWixnQkFBZ0I7UUFDaEIsV0FBVztRQUNYLFlBQVk7UUFDWixtQkFBbUI7UUFDbkIsV0FBVztRQUNYLGVBQWU7UUFDZixhQUFhO1FBQ2IsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixhQUFhO1FBQ2IsY0FBYztRQUNkLGtCQUFrQjtRQUNsQixvQkFBb0I7UUFDcEIsd0JBQXdCO1FBQ3hCLGlCQUFpQjtRQUNqQixnQkFBZ0I7UUFDaEIsa0JBQWtCO1FBQ2xCLGFBQWEsYUFHYiw0QkFBNEI7UUFDNUIsNEJBQTRCO1FBQzVCLG1CQUFtQjtRQUNuQixpQkFBaUI7Z0hBR1Isa0JBQWtCLFlBM0IzQixZQUFZO1FBQ1osZ0JBQWdCO1FBQ2hCLFdBQVc7UUFDWCxZQUFZO1FBQ1osbUJBQW1CO1FBQ25CLFdBQVc7UUFDWCxlQUFlO1FBQ2YsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQixlQUFlO1FBQ2YsYUFBYTtRQUNiLGNBQWM7UUFDZCxrQkFBa0I7UUFDbEIsb0JBQW9CO1FBQ3BCLHdCQUF3QjtRQUN4QixpQkFBaUI7UUFDakIsZ0JBQWdCO1FBQ2hCLGtCQUFrQjtRQUNsQixhQUFhOzJGQVNKLGtCQUFrQjtrQkFyQzlCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLDRCQUE0Qjt3QkFDNUIsNEJBQTRCO3dCQUM1QixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsc0JBQXNCO3dCQUN0QixtQkFBbUI7cUJBQ3BCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsd0JBQXdCO3dCQUN4QixpQkFBaUI7d0JBQ2pCLGdCQUFnQjt3QkFDaEIsa0JBQWtCO3dCQUNsQixhQUFhO3FCQUNkO29CQUNELE9BQU8sRUFBRTt3QkFDUCw0QkFBNEI7d0JBQzVCLDRCQUE0Qjt3QkFDNUIsbUJBQW1CO3dCQUNuQixpQkFBaUI7cUJBQ2xCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdENhcmRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jYXJkJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBBdXRoSnd0TG9naW5Nb2R1bGUgfSBmcm9tICdAbXlybWlkb24vYXV0aC1qd3QtbG9naW4nO1xyXG5pbXBvcnQgeyBOZ1Rvb2xzTW9kdWxlIH0gZnJvbSAnQG15cm1pZG9uL25nLXRvb2xzJztcclxuXHJcbmltcG9ydCB7IEF1dGhKd3RSZWdpc3RyYXRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYXV0aC1qd3QtcmVnaXN0cmF0aW9uL2F1dGgtand0LXJlZ2lzdHJhdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYXNzd29yZFN0cmVuZ3RoQmFyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3Bhc3N3b3JkLXN0cmVuZ3RoLWJhci9wYXNzd29yZC1zdHJlbmd0aC1iYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVXNlckZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy91c2VyLWZpbHRlci91c2VyLWZpbHRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVc2VyTGlzdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgVXNlckVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy91c2VyLWVkaXRvci91c2VyLWVkaXRvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIEF1dGhKd3RSZWdpc3RyYXRpb25Db21wb25lbnQsXHJcbiAgICBQYXNzd29yZFN0cmVuZ3RoQmFyQ29tcG9uZW50LFxyXG4gICAgVXNlckZpbHRlckNvbXBvbmVudCxcclxuICAgIFVzZXJMaXN0Q29tcG9uZW50LFxyXG4gICAgQ29uZmlybURpYWxvZ0NvbXBvbmVudCxcclxuICAgIFVzZXJFZGl0b3JDb21wb25lbnQsXHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBIdHRwQ2xpZW50TW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSb3V0ZXJNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgLy8gbWF0ZXJpYWxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENhcmRNb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdERpYWxvZ01vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxyXG4gICAgTWF0U25hY2tCYXJNb2R1bGUsXHJcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxyXG4gICAgQXV0aEp3dExvZ2luTW9kdWxlLFxyXG4gICAgTmdUb29sc01vZHVsZVxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgQXV0aEp3dFJlZ2lzdHJhdGlvbkNvbXBvbmVudCxcclxuICAgIFBhc3N3b3JkU3RyZW5ndGhCYXJDb21wb25lbnQsXHJcbiAgICBVc2VyRmlsdGVyQ29tcG9uZW50LFxyXG4gICAgVXNlckxpc3RDb21wb25lbnRcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aEp3dEFkbWluTW9kdWxlIHt9XHJcbiJdfQ==
|
|
@@ -9,8 +9,8 @@ import * as i3 from "../../services/auth-jwt-account.service";
|
|
|
9
9
|
import * as i4 from "@angular/common";
|
|
10
10
|
import * as i5 from "@angular/material/button";
|
|
11
11
|
import * as i6 from "@angular/material/icon";
|
|
12
|
-
import * as i7 from "@angular/material/
|
|
13
|
-
import * as i8 from "@angular/material/
|
|
12
|
+
import * as i7 from "@angular/material/input";
|
|
13
|
+
import * as i8 from "@angular/material/form-field";
|
|
14
14
|
import * as i9 from "@angular/material/progress-spinner";
|
|
15
15
|
import * as i10 from "../password-strength-bar/password-strength-bar.component";
|
|
16
16
|
export class AuthJwtRegistrationComponent {
|
|
@@ -192,12 +192,12 @@ export class AuthJwtRegistrationComponent {
|
|
|
192
192
|
});
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
AuthJwtRegistrationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
196
|
-
AuthJwtRegistrationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
197
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
195
|
+
AuthJwtRegistrationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: AuthJwtRegistrationComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.MatSnackBar }, { token: i3.AuthJwtAccountService }], target: i0.ɵɵFactoryTarget.Component });
|
|
196
|
+
AuthJwtRegistrationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: AuthJwtRegistrationComponent, selector: "auth-jwt-registration", outputs: { registered: "registered" }, ngImport: i0, template: "<div>\n <div>\n <p>\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than 3\n characters, nor longer than 50.\n </p>\n <p>\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation (like\n dashes, stops, parentheses, etc.).\n </p>\n <p>\n Once registered, the user will receive an email message to the email\n address you specified; he will have to click on the provided link to\n complete the registration process.\n </p>\n </div>\n\n <form role=\"form\" [formGroup]=\"registration\" (submit)=\"onSubmit()\">\n <fieldset>\n <label>register user</label>\n <!-- email -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n placeholder=\"email\"\n formControlName=\"email\"\n />\n <mat-error>{{ getEmailErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n placeholder=\"username\"\n formControlName=\"name\"\n />\n <mat-error>{{ getNameErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"first name\"\n formControlName=\"firstName\"\n />\n <mat-error\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n class=\"text-danger small\"\n >\n first name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"last name\"\n formControlName=\"lastName\"\n />\n <mat-error\n *ngIf=\"\n lastName.hasError('required') &&\n (lastName.dirty || lastName.touched)\n \"\n class=\"text-danger small\"\n >\n last name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <div [formGroup]=\"passwords\">\n <!-- password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"password\"\n formControlName=\"password\"\n />\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n <mat-error>{{ getPasswordErrorLabel() }}</mat-error>\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"confirm password\"\n formControlName=\"confirmPassword\"\n />\n <mat-error\n *ngIf=\"\n passwords.hasError('areEqual') &&\n (confirmPassword.dirty || confirmPassword.touched)\n \"\n >\n password differs from confirmation password\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <button\n mat-raised-button\n type=\"submit\"\n color=\"primary\"\n [disabled]=\"\n !registration.valid || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n <mat-progress-spinner\n diameter=\"20\"\n *ngIf=\"busy\"\n aria-label=\"Busy\"\n ></mat-progress-spinner>\n </fieldset>\n </form>\n</div>\n", styles: ["mat-form-field{width:400px}fieldset{border:1px solid silver;border-radius:8px;padding:16px}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i10.PasswordStrengthBarComponent, selector: "auth-jwt-password-strength-bar", inputs: ["passwordToCheck"], outputs: ["strengthChange"] }] });
|
|
197
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: AuthJwtRegistrationComponent, decorators: [{
|
|
198
198
|
type: Component,
|
|
199
199
|
args: [{ selector: 'auth-jwt-registration', template: "<div>\n <div>\n <p>\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than 3\n characters, nor longer than 50.\n </p>\n <p>\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation (like\n dashes, stops, parentheses, etc.).\n </p>\n <p>\n Once registered, the user will receive an email message to the email\n address you specified; he will have to click on the provided link to\n complete the registration process.\n </p>\n </div>\n\n <form role=\"form\" [formGroup]=\"registration\" (submit)=\"onSubmit()\">\n <fieldset>\n <label>register user</label>\n <!-- email -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n placeholder=\"email\"\n formControlName=\"email\"\n />\n <mat-error>{{ getEmailErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n placeholder=\"username\"\n formControlName=\"name\"\n />\n <mat-error>{{ getNameErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"first name\"\n formControlName=\"firstName\"\n />\n <mat-error\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n class=\"text-danger small\"\n >\n first name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"last name\"\n formControlName=\"lastName\"\n />\n <mat-error\n *ngIf=\"\n lastName.hasError('required') &&\n (lastName.dirty || lastName.touched)\n \"\n class=\"text-danger small\"\n >\n last name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <div [formGroup]=\"passwords\">\n <!-- password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"password\"\n formControlName=\"password\"\n />\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n <mat-error>{{ getPasswordErrorLabel() }}</mat-error>\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"confirm password\"\n formControlName=\"confirmPassword\"\n />\n <mat-error\n *ngIf=\"\n passwords.hasError('areEqual') &&\n (confirmPassword.dirty || confirmPassword.touched)\n \"\n >\n password differs from confirmation password\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <button\n mat-raised-button\n type=\"submit\"\n color=\"primary\"\n [disabled]=\"\n !registration.valid || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n <mat-progress-spinner\n diameter=\"20\"\n *ngIf=\"busy\"\n aria-label=\"Busy\"\n ></mat-progress-spinner>\n </fieldset>\n </form>\n</div>\n", styles: ["mat-form-field{width:400px}fieldset{border:1px solid silver;border-radius:8px;padding:16px}\n"] }]
|
|
200
200
|
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.MatSnackBar }, { type: i3.AuthJwtAccountService }]; }, propDecorators: { registered: [{
|
|
201
201
|
type: Output
|
|
202
202
|
}] } });
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBSUwsVUFBVSxHQUdYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFPMUUsTUFBTSxPQUFPLDRCQUE0QjtJQW9CdkMsWUFDRSxXQUErQixFQUN2QixTQUFzQixFQUN0QixlQUFzQztRQUR0QyxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUU5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsT0FBTztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FDOUIsRUFBRSxFQUNGLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5RCxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUM3QixFQUFFLEVBQ0YsVUFBVSxDQUFDLFFBQVEsRUFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzdELENBQUM7UUFFRixJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLFVBQVUsQ0FBQyxRQUFRO1lBQ25CLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1NBQ3pCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7WUFDdEMsVUFBVSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDekIsQ0FBQyxDQUFDO1FBRUgsNEZBQTRGO1FBQzVGLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FDakMsRUFBRSxFQUNGLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3ZFLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQ2hDO1lBQ0UsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtTQUN0QyxFQUNELEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3hDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBdUI7UUFDdEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssc0JBQXNCLENBQUMsT0FBOEI7UUFDM0QsT0FBTyxDQUNMLE9BQXdCLEVBR2MsRUFBRTtZQUN4QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQywwQkFBMEI7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFO29CQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2Y7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQy9DLENBQUMsSUFBaUIsRUFBRSxFQUFFO3dCQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTs0QkFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNmOzZCQUFNOzRCQUNMLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3lCQUMvQjtvQkFDSCxDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3QkFDTixPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDaEMsQ0FBQyxDQUNGLENBQUM7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxPQUE4QjtRQUM1RCxPQUFPLENBQ0wsT0FBd0IsRUFHYyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JDLDBCQUEwQjtnQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDZjtxQkFBTTtvQkFDTCxPQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FDaEQsQ0FBQyxJQUFpQixFQUFFLEVBQUU7d0JBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFOzRCQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQ2Y7NkJBQU07NEJBQ0wsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQ2hDO29CQUNILENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNOLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNqQyxDQUFDLENBQ0YsQ0FBQztpQkFDSDtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsS0FBVSxDQUFDO0lBRVosa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNuQyxPQUFPLHdCQUF3QixDQUFDO1NBQ2pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoQyxPQUFPLHVCQUF1QixDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQzdELE9BQU8sa0NBQWtDLENBQUM7U0FDM0M7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sbUJBQW1CLENBQUM7U0FDNUI7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sa0JBQWtCLENBQUM7U0FDM0I7UUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDMUQsT0FBTyx3QkFBd0IsQ0FBQztTQUNqQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsT0FBTyxtQkFBbUIsQ0FBQztTQUM1QjtRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO2dCQUN2QixDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzthQUM3QztZQUNELE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDL0MsT0FBTyw2QkFBNkIsQ0FBQztTQUN0QztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUMvQyxPQUFPLDZCQUE2QixDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ2hELE9BQU8sa0NBQWtDLENBQUM7U0FDM0M7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFDRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztZQUN4QixJQUFJLENBQUMsSUFBSTtZQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFDbEI7WUFDQSxPQUFPO1NBQ1I7UUFFRCxNQUFNLEtBQUssR0FBc0I7WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUN2QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDL0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztZQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLO1NBQzlCLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsZUFBZTthQUNqQixRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNiLFNBQVMsQ0FDUixHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCw2QkFBNkI7WUFDN0IsdUNBQXVDO1lBQ3ZDLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7O3lIQXhQVSw0QkFBNEI7NkdBQTVCLDRCQUE0QixvR0N6QnpDLHNtS0FnTEE7MkZEdkphLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSx1QkFBdUI7dUtBc0IxQixVQUFVO3NCQURoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVmFsaWRhdG9ycyxcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQXV0aEp3dEFjY291bnRTZXJ2aWNlLFxuICBFeGlzdFJlc3VsdCxcbiAgUmVnaXN0cmF0aW9uTW9kZWwsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGgtand0LWFjY291bnQuc2VydmljZSc7XG5cbmltcG9ydCB7IFBhc3N3b3JkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvcGFzc3dvcmQudmFsaWRhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F1dGgtand0LXJlZ2lzdHJhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRoLWp3dC1yZWdpc3RyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdXRoLWp3dC1yZWdpc3RyYXRpb24uY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRoSnd0UmVnaXN0cmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIGJ1c3k6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIC8vIGZvcm1cbiAgcHVibGljIHJlZ2lzdHJhdGlvbjogVW50eXBlZEZvcm1Hcm91cDtcbiAgcHVibGljIGVtYWlsOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBuYW1lOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBmaXJzdE5hbWU6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHVibGljIGxhc3ROYW1lOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBwYXNzd29yZHM6IFVudHlwZWRGb3JtR3JvdXA7XG4gIHB1YmxpYyBwYXNzd29yZDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgY29uZmlybVBhc3N3b3JkOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHVzZXIgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLiBVc3VhbGx5XG4gICAqIHlvdSBzaG91bGQgaGFuZGxlIHRoaXMgdG8gbW92ZSBhd2F5IGZyb20gdGhlIHJlZ2lzdHJhdGlvblxuICAgKiBwYWdlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWdpc3RlcmVkOiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgX3NuYWNrYmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIF9hY2NvdW50U2VydmljZTogQXV0aEp3dEFjY291bnRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucmVnaXN0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIC8vIGZvcm1cbiAgICB0aGlzLmVtYWlsID0gZm9ybUJ1aWxkZXIuY29udHJvbChcbiAgICAgICcnLFxuICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdLFxuICAgICAgdGhpcy5nZXRVbmlxdWVFbWFpbFZhbGlkYXRvcih0aGlzLl9hY2NvdW50U2VydmljZSkuYmluZCh0aGlzKVxuICAgICk7XG5cbiAgICB0aGlzLm5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKFxuICAgICAgJycsXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgdGhpcy5nZXRVbmlxdWVOYW1lVmFsaWRhdG9yKHRoaXMuX2FjY291bnRTZXJ2aWNlKS5iaW5kKHRoaXMpXG4gICAgKTtcblxuICAgIHRoaXMuZmlyc3ROYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgW1xuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcbiAgICBdKTtcbiAgICB0aGlzLmxhc3ROYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgW1xuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcbiAgICBdKTtcblxuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU0NzQ5OTEvYW5ndWxhci0yLWZvcm0tdmFsaWRhdGluZy1mb3ItcmVwZWF0LXBhc3N3b3JkXG4gICAgdGhpcy5wYXNzd29yZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woXG4gICAgICAnJyxcbiAgICAgIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgUGFzc3dvcmRWYWxpZGF0b3JzLnN0YW5kYXJkXSlcbiAgICApO1xuICAgIHRoaXMuY29uZmlybVBhc3N3b3JkID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgdGhpcy5wYXNzd29yZHMgPSBmb3JtQnVpbGRlci5ncm91cChcbiAgICAgIHtcbiAgICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXG4gICAgICAgIGNvbmZpcm1QYXNzd29yZDogdGhpcy5jb25maXJtUGFzc3dvcmQsXG4gICAgICB9LFxuICAgICAgeyB2YWxpZGF0b3I6IHRoaXMuYXJlRXF1YWwuYmluZCh0aGlzKSB9XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0cmF0aW9uID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZW1haWw6IHRoaXMuZW1haWwsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBmaXJzdE5hbWU6IHRoaXMuZmlyc3ROYW1lLFxuICAgICAgbGFzdE5hbWU6IHRoaXMubGFzdE5hbWUsXG4gICAgICBwYXNzd29yZHM6IHRoaXMucGFzc3dvcmRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcmVFcXVhbChncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucGFzc3dvcmQudmFsdWUgPT09IHRoaXMuY29uZmlybVBhc3N3b3JkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZUVxdWFsOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVuaXF1ZSBuYW1lIHZhbGlkYXRvci4gVGhlcmUgaXMgbm8gZGVwZW5kZW5jeSBpbmplY3Rpb24gYXQgdGhpcyBsZXZlbCxcbiAgICogYnV0IHdlIGNhbiB1c2UgY2xvc3VyZXMuIEFzIGEgbWF0dGVyIG9mIGZhY3QsIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIGluc3RhbmNlXG4gICAqIGZyb20gdGhlIGNvbXBvbmVudCB3aGVyZSB3ZSByZWdpc3RlciB2YWxpZGF0b3JzLiBTbyB3ZSB3aWxsIGltcGxlbWVudCBhIGZ1bmN0aW9uXG4gICAqIHRoYXQgd2lsbCBhY2NlcHQgdGhlIHNlcnZpY2UgYXMgcGFyYW1ldGVyLCBhbmQgY3JlYXRlIHRoZSBhY3R1YWwgdmFsaWRhdGlvbiBmdW5jdGlvbi5cbiAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGhhdmUgYWNjZXNzIHRvIHRoZSBzZXJ2aWNlIHdoZW4gY2FsbGVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzLlxuICAgKiBTZWUgaHR0cDovL3Jlc3RsZXQuY29tL2Jsb2cvMjAxNi8wMi8xNy9pbXBsZW1lbnRpbmctYW5ndWxhcjItZm9ybXMtYmV5b25kLWJhc2ljcy1wYXJ0LTIvLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRVbmlxdWVOYW1lVmFsaWRhdG9yKHNlcnZpY2U6IEF1dGhKd3RBY2NvdW50U2VydmljZSkge1xuICAgIHJldHVybiAoXG4gICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2xcbiAgICApOlxuICAgICAgfCBQcm9taXNlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPlxuICAgICAgfCBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvLyBhdm9pZCBjaGVja2luZyBpZiBlbXB0eVxuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcnZpY2UuaXNOYW1lUmVnaXN0ZXJlZChjb250cm9sLnZhbHVlKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoZGF0YTogRXhpc3RSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmlzRXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1bmlxdWVOYW1lOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgdW5pcXVlTmFtZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbmlxdWVFbWFpbFZhbGlkYXRvcihzZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXG4gICAgKTpcbiAgICAgIHwgUHJvbWlzZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD5cbiAgICAgIHwgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gYXZvaWQgY2hlY2tpbmcgaWYgZW1wdHlcbiAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXJ2aWNlLmlzRW1haWxSZWdpc3RlcmVkKGNvbnRyb2wudmFsdWUpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChkYXRhOiBFeGlzdFJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWRhdGEuaXNFeGlzdGluZykge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVuaXF1ZUVtYWlsOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgdW5pcXVlRW1haWw6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cblxuICBwdWJsaWMgZ2V0RW1haWxFcnJvckxhYmVsKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5lbWFpbC5kaXJ0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW1haWwuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgIHJldHVybiAnZW1haWwgYWRkcmVzcyByZXF1aXJlZCc7XG4gICAgfVxuICAgIGlmICh0aGlzLmVtYWlsLmhhc0Vycm9yKCdlbWFpbCcpKSB7XG4gICAgICByZXR1cm4gJ2ludmFsaWQgZW1haWwgYWRkcmVzcyc7XG4gICAgfVxuICAgIGlmICh0aGlzLmVtYWlsLmhhc0Vycm9yKCd1bmlxdWVFbWFpbCcpICYmICF0aGlzLmVtYWlsLnBlbmRpbmcpIHtcbiAgICAgIHJldHVybiAnZW1haWwgYWRkcmVzcyBhbHJlYWR5IHJlZ2lzdGVyZWQnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXROYW1lRXJyb3JMYWJlbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubmFtZS5kaXJ0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgcmV0dXJuICd1c2VybmFtZSByZXF1aXJlZCc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmFtZS5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICByZXR1cm4gJ2ludmFsaWQgdXNlcm5hbWUnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm5hbWUuaGFzRXJyb3IoJ3VuaXF1ZU5hbWUnKSAmJiAhdGhpcy5uYW1lLnBlbmRpbmcpIHtcbiAgICAgIHJldHVybiAndXNlcm5hbWUgYWxyZWFkeSB0YWtlbic7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFzc3dvcmRFcnJvckxhYmVsKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5wYXNzd29yZC5kaXJ0eSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFzc3dvcmQuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcbiAgICAgIHJldHVybiAncGFzc3dvcmQgcmVxdWlyZWQnO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXNzd29yZC5oYXNFcnJvcigncGFzc3dvcmRUb29TaG9ydCcpKSB7XG4gICAgICBsZXQgcyA9ICdhdCBsZWFzdCA4IGNoYXJhY3RlcnMnO1xuICAgICAgaWYgKHRoaXMucGFzc3dvcmQudmFsdWUpIHtcbiAgICAgICAgcyArPSBgIChub3cgJHt0aGlzLnBhc3N3b3JkLnZhbHVlLmxlbmd0aH0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXNzd29yZC5oYXNFcnJvcignbm9VcHBlckluUGFzc3dvcmQnKSkge1xuICAgICAgcmV0dXJuICdhdCBsZWFzdCAxIHVwcGVyY2FzZSBsZXR0ZXInO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXNzd29yZC5oYXNFcnJvcignbm9Mb3dlckluUGFzc3dvcmQnKSkge1xuICAgICAgcmV0dXJuICdhdCBsZWFzdCAxIGxvd2VyY2FzZSBsZXR0ZXInO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXNzd29yZC5oYXNFcnJvcignbm9TeW1ib2xJblBhc3N3b3JkJykpIHtcbiAgICAgIHJldHVybiAnYXQgbGVhc3QgMSBwdW5jdHVhdGlvbiBvciBzeW1ib2wnO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIG9uU3VibWl0KCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnJlZ2lzdHJhdGlvbi52YWxpZCB8fFxuICAgICAgdGhpcy5idXN5IHx8XG4gICAgICB0aGlzLm5hbWUucGVuZGluZyB8fFxuICAgICAgdGhpcy5lbWFpbC5wZW5kaW5nXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWw6IFJlZ2lzdHJhdGlvbk1vZGVsID0ge1xuICAgICAgZW1haWw6IHRoaXMuZW1haWwudmFsdWUsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUudmFsdWUsXG4gICAgICBmaXJzdE5hbWU6IHRoaXMuZmlyc3ROYW1lLnZhbHVlLFxuICAgICAgbGFzdE5hbWU6IHRoaXMubGFzdE5hbWUudmFsdWUsXG4gICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZC52YWx1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICB0aGlzLl9hY2NvdW50U2VydmljZVxuICAgICAgLnJlZ2lzdGVyKG1vZGVsKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuKCdSZWdpc3RyYXRpb24gc3VjY2VlZGVkJywgJ09LJyk7XG4gICAgICAgICAgLy8gdGhpcy5yZWdpc3RyYXRpb24ucmVzZXQoKTtcbiAgICAgICAgICAvLyB0aGlzLnJlZ2lzdHJhdGlvbi5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAvLyB0aGlzLnJlZ2lzdHJhdGlvbi5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZC5lbWl0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oJ1JlZ2lzdHJhdGlvbiBlcnJvcicsICdPSycpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8ZGl2PlxuICAgIDxwPlxuICAgICAgVG8gcmVnaXN0ZXIgYSBuZXcgdXNlciwgeW91IG11c3QgcHJvdmlkZSBoaXMgZW1haWwgYWRkcmVzcywgY2hvb3NlIGFcbiAgICAgIHBhc3N3b3JkLCBhbmQgY2hvb3NlIGEgdXNlcm5hbWUsIHdoaWNoIG11c3QgYmUgdW5pcXVlICh5b3Ugd2lsbCBiZVxuICAgICAgbm90aWZpZWQgaWYgYW5vdGhlciB1c2VyIGhhcyBhbHJlYWR5IHRha2VuIHRoYXQgbmFtZSkuIFRoZSB1c2VybmFtZSBtdXN0XG4gICAgICBpbmNsdWRlIG9ubHkgbGV0dGVycy9kaWdpdHMsIHN0YXJ0IHdpdGggYSBsZXR0ZXIsIGFuZCBiZSBubyBzaG9ydGVyIHRoYW4gM1xuICAgICAgY2hhcmFjdGVycywgbm9yIGxvbmdlciB0aGFuIDUwLlxuICAgIDwvcD5cbiAgICA8cD5cbiAgICAgIFRvIHByb21vdGUgYSBkZWNlbnQgc2VjdXJpdHkgbGV2ZWwsIHRoZSBwYXNzd29yZCBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgOFxuICAgICAgY2hhcmFjdGVycywgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzLCBhbmQgcHVuY3R1YXRpb24gKGxpa2VcbiAgICAgIGRhc2hlcywgc3RvcHMsIHBhcmVudGhlc2VzLCBldGMuKS5cbiAgICA8L3A+XG4gICAgPHA+XG4gICAgICBPbmNlIHJlZ2lzdGVyZWQsIHRoZSB1c2VyIHdpbGwgcmVjZWl2ZSBhbiBlbWFpbCBtZXNzYWdlIHRvIHRoZSBlbWFpbFxuICAgICAgYWRkcmVzcyB5b3Ugc3BlY2lmaWVkOyBoZSB3aWxsIGhhdmUgdG8gY2xpY2sgb24gdGhlIHByb3ZpZGVkIGxpbmsgdG9cbiAgICAgIGNvbXBsZXRlIHRoZSByZWdpc3RyYXRpb24gcHJvY2Vzcy5cbiAgICA8L3A+XG4gIDwvZGl2PlxuXG4gIDxmb3JtIHJvbGU9XCJmb3JtXCIgW2Zvcm1Hcm91cF09XCJyZWdpc3RyYXRpb25cIiAoc3VibWl0KT1cIm9uU3VibWl0KClcIj5cbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8bGFiZWw+cmVnaXN0ZXIgdXNlcjwvbGFiZWw+XG4gICAgICA8IS0tIGVtYWlsIC0tPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJlbWFpbFwiXG4gICAgICAgICAgICBpZD1cImVtYWlsXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjI1NlwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgYXV0b2ZvY3VzXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlbWFpbFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWVycm9yPnt7IGdldEVtYWlsRXJyb3JMYWJlbCgpIH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZW1haWwucGVuZGluZ1wiPmhvdXJnbGFzczwvbWF0LWljb24+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBuYW1lIC0tPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwibmFtZVwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCI1MFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgcGF0dGVybj1cIl5bYS16QS1aXVthLXpBLVowLTldezIsNDl9JFwiXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ1c2VybmFtZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxtYXQtZXJyb3I+e3sgZ2V0TmFtZUVycm9yTGFiZWwoKSB9fTwvbWF0LWVycm9yPlxuICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm5hbWUucGVuZGluZ1wiPmhvdXJnbGFzczwvbWF0LWljb24+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBmaXJzdCBuYW1lIC0tPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwiZmlyc3ROYW1lXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJmaXJzdCBuYW1lXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBmaXJzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiZcbiAgICAgICAgICAgICAgKGZpcnN0TmFtZS5kaXJ0eSB8fCBmaXJzdE5hbWUudG91Y2hlZClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyIHNtYWxsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBmaXJzdCBuYW1lIHJlcXVpcmVkXG4gICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBsYXN0IG5hbWUgLS0+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJsYXN0TmFtZVwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCI1MFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwibGFzdCBuYW1lXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxhc3ROYW1lXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGxhc3ROYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmXG4gICAgICAgICAgICAgIChsYXN0TmFtZS5kaXJ0eSB8fCBsYXN0TmFtZS50b3VjaGVkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXIgc21hbGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIGxhc3QgbmFtZSByZXF1aXJlZFxuICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJwYXNzd29yZHNcIj5cbiAgICAgICAgPCEtLSBwYXNzd29yZCAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbmFtZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxhdXRoLWp3dC1wYXNzd29yZC1zdHJlbmd0aC1iYXIgW3Bhc3N3b3JkVG9DaGVja109XCJwYXNzd29yZC52YWx1ZVwiPlxuICAgICAgICAgICAgPC9hdXRoLWp3dC1wYXNzd29yZC1zdHJlbmd0aC1iYXI+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7IGdldFBhc3N3b3JkRXJyb3JMYWJlbCgpIH19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBjb25maXJtIHBhc3N3b3JkIC0tPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwicGFzc3dvcmRcIlxuICAgICAgICAgICAgICBuYW1lPVwiY29uZmlybVBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImNvbmZpcm0gcGFzc3dvcmRcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb25maXJtUGFzc3dvcmRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBwYXNzd29yZHMuaGFzRXJyb3IoJ2FyZUVxdWFsJykgJiZcbiAgICAgICAgICAgICAgICAoY29uZmlybVBhc3N3b3JkLmRpcnR5IHx8IGNvbmZpcm1QYXNzd29yZC50b3VjaGVkKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBwYXNzd29yZCBkaWZmZXJzIGZyb20gY29uZmlybWF0aW9uIHBhc3N3b3JkXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgIXJlZ2lzdHJhdGlvbi52YWxpZCB8fCBidXN5IHx8IG5hbWUucGVuZGluZyB8fCBlbWFpbC5wZW5kaW5nXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHJlZ2lzdGVyXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICBkaWFtZXRlcj1cIjIwXCJcbiAgICAgICAgKm5nSWY9XCJidXN5XCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkJ1c3lcIlxuICAgICAgPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgPC9maWVsZHNldD5cbiAgPC9mb3JtPlxuPC9kaXY+XG4iXX0=
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9hdXRoLWp3dC1yZWdpc3RyYXRpb24vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBSUwsVUFBVSxHQUdYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7Ozs7QUFPMUUsTUFBTSxPQUFPLDRCQUE0QjtJQW9CdkMsWUFDRSxXQUErQixFQUN2QixTQUFzQixFQUN0QixlQUFzQztRQUR0QyxjQUFTLEdBQVQsU0FBUyxDQUFhO1FBQ3RCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUU5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsT0FBTztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FDOUIsRUFBRSxFQUNGLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFD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QUU7WUFDSCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCw2QkFBNkI7WUFDN0IsdUNBQXVDO1lBQ3ZDLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7WUFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7O3lIQXhQVSw0QkFBNEI7NkdBQTVCLDRCQUE0QixvR0N6QnpDLHNtS0FnTEE7MkZEdkphLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSx1QkFBdUI7dUtBc0IxQixVQUFVO3NCQURoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgVW50eXBlZEZvcm1Hcm91cCxcclxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXHJcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gIFZhbGlkYXRvcnMsXHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIFZhbGlkYXRpb25FcnJvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBBdXRoSnd0QWNjb3VudFNlcnZpY2UsXHJcbiAgRXhpc3RSZXN1bHQsXHJcbiAgUmVnaXN0cmF0aW9uTW9kZWwsXHJcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7IFBhc3N3b3JkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvcnMvcGFzc3dvcmQudmFsaWRhdG9ycyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2F1dGgtand0LXJlZ2lzdHJhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dGgtand0LXJlZ2lzdHJhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXV0aC1qd3QtcmVnaXN0cmF0aW9uLmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1dGhKd3RSZWdpc3RyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHB1YmxpYyBidXN5OiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIC8vIGZvcm1cclxuICBwdWJsaWMgcmVnaXN0cmF0aW9uOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBlbWFpbDogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBuYW1lOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGZpcnN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBsYXN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBwYXNzd29yZHM6IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgcHVibGljIHBhc3N3b3JkOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGNvbmZpcm1QYXNzd29yZDogVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW4gYSB1c2VyIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4gVXN1YWxseVxyXG4gICAqIHlvdSBzaG91bGQgaGFuZGxlIHRoaXMgdG8gbW92ZSBhd2F5IGZyb20gdGhlIHJlZ2lzdHJhdGlvblxyXG4gICAqIHBhZ2UuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlZ2lzdGVyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIF9zbmFja2JhcjogTWF0U25hY2tCYXIsXHJcbiAgICBwcml2YXRlIF9hY2NvdW50U2VydmljZTogQXV0aEp3dEFjY291bnRTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIC8vIGZvcm1cclxuICAgIHRoaXMuZW1haWwgPSBmb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAnJyxcclxuICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdLFxyXG4gICAgICB0aGlzLmdldFVuaXF1ZUVtYWlsVmFsaWRhdG9yKHRoaXMuX2FjY291bnRTZXJ2aWNlKS5iaW5kKHRoaXMpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMubmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2woXHJcbiAgICAgICcnLFxyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICB0aGlzLmdldFVuaXF1ZU5hbWVWYWxpZGF0b3IodGhpcy5fYWNjb3VudFNlcnZpY2UpLmJpbmQodGhpcylcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5maXJzdE5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5sYXN0TmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFtcclxuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApLFxyXG4gICAgXSk7XHJcblxyXG4gICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTQ3NDk5MS9hbmd1bGFyLTItZm9ybS12YWxpZGF0aW5nLWZvci1yZXBlYXQtcGFzc3dvcmRcclxuICAgIHRoaXMucGFzc3dvcmQgPSBmb3JtQnVpbGRlci5jb250cm9sKFxyXG4gICAgICAnJyxcclxuICAgICAgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBQYXNzd29yZFZhbGlkYXRvcnMuc3RhbmRhcmRdKVxyXG4gICAgKTtcclxuICAgIHRoaXMuY29uZmlybVBhc3N3b3JkID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB0aGlzLnBhc3N3b3JkcyA9IGZvcm1CdWlsZGVyLmdyb3VwKFxyXG4gICAgICB7XHJcbiAgICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXHJcbiAgICAgICAgY29uZmlybVBhc3N3b3JkOiB0aGlzLmNvbmZpcm1QYXNzd29yZCxcclxuICAgICAgfSxcclxuICAgICAgeyB2YWxpZGF0b3I6IHRoaXMuYXJlRXF1YWwuYmluZCh0aGlzKSB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMucmVnaXN0cmF0aW9uID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbCxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxyXG4gICAgICBmaXJzdE5hbWU6IHRoaXMuZmlyc3ROYW1lLFxyXG4gICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZSxcclxuICAgICAgcGFzc3dvcmRzOiB0aGlzLnBhc3N3b3JkcyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcmVFcXVhbChncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5wYXNzd29yZC52YWx1ZSA9PT0gdGhpcy5jb25maXJtUGFzc3dvcmQudmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhcmVFcXVhbDogdHJ1ZSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgdW5pcXVlIG5hbWUgdmFsaWRhdG9yLiBUaGVyZSBpcyBubyBkZXBlbmRlbmN5IGluamVjdGlvbiBhdCB0aGlzIGxldmVsLFxyXG4gICAqIGJ1dCB3ZSBjYW4gdXNlIGNsb3N1cmVzLiBBcyBhIG1hdHRlciBvZiBmYWN0LCB3ZSBoYXZlIGFjY2VzcyB0byB0aGUgc2VydmljZSBpbnN0YW5jZVxyXG4gICAqIGZyb20gdGhlIGNvbXBvbmVudCB3aGVyZSB3ZSByZWdpc3RlciB2YWxpZGF0b3JzLiBTbyB3ZSB3aWxsIGltcGxlbWVudCBhIGZ1bmN0aW9uXHJcbiAgICogdGhhdCB3aWxsIGFjY2VwdCB0aGUgc2VydmljZSBhcyBwYXJhbWV0ZXIsIGFuZCBjcmVhdGUgdGhlIGFjdHVhbCB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgc2VydmljZSB3aGVuIGNhbGxlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24gcHJvY2Vzcy5cclxuICAgKiBTZWUgaHR0cDovL3Jlc3RsZXQuY29tL2Jsb2cvMjAxNi8wMi8xNy9pbXBsZW1lbnRpbmctYW5ndWxhcjItZm9ybXMtYmV5b25kLWJhc2ljcy1wYXJ0LTIvLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0VW5pcXVlTmFtZVZhbGlkYXRvcihzZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxyXG4gICAgKTpcclxuICAgICAgfCBQcm9taXNlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPlxyXG4gICAgICB8IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+ID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAvLyBhdm9pZCBjaGVja2luZyBpZiBlbXB0eVxyXG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VydmljZS5pc05hbWVSZWdpc3RlcmVkKGNvbnRyb2wudmFsdWUpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgKGRhdGE6IEV4aXN0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKCFkYXRhLmlzRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1bmlxdWVOYW1lOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoeyB1bmlxdWVOYW1lOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRVbmlxdWVFbWFpbFZhbGlkYXRvcihzZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbFxyXG4gICAgKTpcclxuICAgICAgfCBQcm9taXNlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPlxyXG4gICAgICB8IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+ID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAvLyBhdm9pZCBjaGVja2luZyBpZiBlbXB0eVxyXG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VydmljZS5pc0VtYWlsUmVnaXN0ZXJlZChjb250cm9sLnZhbHVlKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIChkYXRhOiBFeGlzdFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghZGF0YS5pc0V4aXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdW5pcXVlRW1haWw6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHVuaXF1ZUVtYWlsOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7fVxyXG5cclxuICBwdWJsaWMgZ2V0RW1haWxFcnJvckxhYmVsKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLmVtYWlsLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmVtYWlsLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XHJcbiAgICAgIHJldHVybiAnZW1haWwgYWRkcmVzcyByZXF1aXJlZCc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5lbWFpbC5oYXNFcnJvcignZW1haWwnKSkge1xyXG4gICAgICByZXR1cm4gJ2ludmFsaWQgZW1haWwgYWRkcmVzcyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5lbWFpbC5oYXNFcnJvcigndW5pcXVlRW1haWwnKSAmJiAhdGhpcy5lbWFpbC5wZW5kaW5nKSB7XHJcbiAgICAgIHJldHVybiAnZW1haWwgYWRkcmVzcyBhbHJlYWR5IHJlZ2lzdGVyZWQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmFtZUVycm9yTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubmFtZS5kaXJ0eSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5uYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XHJcbiAgICAgIHJldHVybiAndXNlcm5hbWUgcmVxdWlyZWQnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm5hbWUuaGFzRXJyb3IoJ3BhdHRlcm4nKSkge1xyXG4gICAgICByZXR1cm4gJ2ludmFsaWQgdXNlcm5hbWUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm5hbWUuaGFzRXJyb3IoJ3VuaXF1ZU5hbWUnKSAmJiAhdGhpcy5uYW1lLnBlbmRpbmcpIHtcclxuICAgICAgcmV0dXJuICd1c2VybmFtZSBhbHJlYWR5IHRha2VuJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRQYXNzd29yZEVycm9yTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMucGFzc3dvcmQuZGlydHkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGFzc3dvcmQuaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHtcclxuICAgICAgcmV0dXJuICdwYXNzd29yZCByZXF1aXJlZCc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wYXNzd29yZC5oYXNFcnJvcigncGFzc3dvcmRUb29TaG9ydCcpKSB7XHJcbiAgICAgIGxldCBzID0gJ2F0IGxlYXN0IDggY2hhcmFjdGVycyc7XHJcbiAgICAgIGlmICh0aGlzLnBhc3N3b3JkLnZhbHVlKSB7XHJcbiAgICAgICAgcyArPSBgIChub3cgJHt0aGlzLnBhc3N3b3JkLnZhbHVlLmxlbmd0aH0pYDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBhc3N3b3JkLmhhc0Vycm9yKCdub1VwcGVySW5QYXNzd29yZCcpKSB7XHJcbiAgICAgIHJldHVybiAnYXQgbGVhc3QgMSB1cHBlcmNhc2UgbGV0dGVyJztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBhc3N3b3JkLmhhc0Vycm9yKCdub0xvd2VySW5QYXNzd29yZCcpKSB7XHJcbiAgICAgIHJldHVybiAnYXQgbGVhc3QgMSBsb3dlcmNhc2UgbGV0dGVyJztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBhc3N3b3JkLmhhc0Vycm9yKCdub1N5bWJvbEluUGFzc3dvcmQnKSkge1xyXG4gICAgICByZXR1cm4gJ2F0IGxlYXN0IDEgcHVuY3R1YXRpb24gb3Igc3ltYm9sJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblN1Ym1pdCgpOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMucmVnaXN0cmF0aW9uLnZhbGlkIHx8XHJcbiAgICAgIHRoaXMuYnVzeSB8fFxyXG4gICAgICB0aGlzLm5hbWUucGVuZGluZyB8fFxyXG4gICAgICB0aGlzLmVtYWlsLnBlbmRpbmdcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbW9kZWw6IFJlZ2lzdHJhdGlvbk1vZGVsID0ge1xyXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbC52YWx1ZSxcclxuICAgICAgbmFtZTogdGhpcy5uYW1lLnZhbHVlLFxyXG4gICAgICBmaXJzdE5hbWU6IHRoaXMuZmlyc3ROYW1lLnZhbHVlLFxyXG4gICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZS52YWx1ZSxcclxuICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQudmFsdWUsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuYnVzeSA9IHRydWU7XHJcbiAgICB0aGlzLl9hY2NvdW50U2VydmljZVxyXG4gICAgICAucmVnaXN0ZXIobW9kZWwpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuKCdSZWdpc3RyYXRpb24gc3VjY2VlZGVkJywgJ09LJyk7XHJcbiAgICAgICAgICAvLyB0aGlzLnJlZ2lzdHJhdGlvbi5yZXNldCgpO1xyXG4gICAgICAgICAgLy8gdGhpcy5yZWdpc3RyYXRpb24uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAvLyB0aGlzLnJlZ2lzdHJhdGlvbi5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkLmVtaXQoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5idXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oJ1JlZ2lzdHJhdGlvbiBlcnJvcicsICdPSycpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdj5cbiAgPGRpdj5cbiAgICA8cD5cbiAgICAgIFRvIHJlZ2lzdGVyIGEgbmV3IHVzZXIsIHlvdSBtdXN0IHByb3ZpZGUgaGlzIGVtYWlsIGFkZHJlc3MsIGNob29zZSBhXG4gICAgICBwYXNzd29yZCwgYW5kIGNob29zZSBhIHVzZXJuYW1lLCB3aGljaCBtdXN0IGJlIHVuaXF1ZSAoeW91IHdpbGwgYmVcbiAgICAgIG5vdGlmaWVkIGlmIGFub3RoZXIgdXNlciBoYXMgYWxyZWFkeSB0YWtlbiB0aGF0IG5hbWUpLiBUaGUgdXNlcm5hbWUgbXVzdFxuICAgICAgaW5jbHVkZSBvbmx5IGxldHRlcnMvZGlnaXRzLCBzdGFydCB3aXRoIGEgbGV0dGVyLCBhbmQgYmUgbm8gc2hvcnRlciB0aGFuIDNcbiAgICAgIGNoYXJhY3RlcnMsIG5vciBsb25nZXIgdGhhbiA1MC5cbiAgICA8L3A+XG4gICAgPHA+XG4gICAgICBUbyBwcm9tb3RlIGEgZGVjZW50IHNlY3VyaXR5IGxldmVsLCB0aGUgcGFzc3dvcmQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IDhcbiAgICAgIGNoYXJhY3RlcnMsIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGxldHRlcnMsIGRpZ2l0cywgYW5kIHB1bmN0dWF0aW9uIChsaWtlXG4gICAgICBkYXNoZXMsIHN0b3BzLCBwYXJlbnRoZXNlcywgZXRjLikuXG4gICAgPC9wPlxuICAgIDxwPlxuICAgICAgT25jZSByZWdpc3RlcmVkLCB0aGUgdXNlciB3aWxsIHJlY2VpdmUgYW4gZW1haWwgbWVzc2FnZSB0byB0aGUgZW1haWxcbiAgICAgIGFkZHJlc3MgeW91IHNwZWNpZmllZDsgaGUgd2lsbCBoYXZlIHRvIGNsaWNrIG9uIHRoZSBwcm92aWRlZCBsaW5rIHRvXG4gICAgICBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MuXG4gICAgPC9wPlxuICA8L2Rpdj5cblxuICA8Zm9ybSByb2xlPVwiZm9ybVwiIFtmb3JtR3JvdXBdPVwicmVnaXN0cmF0aW9uXCIgKHN1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+XG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxhYmVsPnJlZ2lzdGVyIHVzZXI8L2xhYmVsPlxuICAgICAgPCEtLSBlbWFpbCAtLT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwiZW1haWxcIlxuICAgICAgICAgICAgaWQ9XCJlbWFpbFwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCIyNTZcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZW1haWxcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPG1hdC1lcnJvcj57eyBnZXRFbWFpbEVycm9yTGFiZWwoKSB9fTwvbWF0LWVycm9yPlxuICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVtYWlsLnBlbmRpbmdcIj5ob3VyZ2xhc3M8L21hdC1pY29uPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gbmFtZSAtLT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cIm5hbWVcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIHBhdHRlcm49XCJeW2EtekEtWl1bYS16QS1aMC05XXsyLDQ5fSRcIlxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWVycm9yPnt7IGdldE5hbWVFcnJvckxhYmVsKCkgfX08L21hdC1lcnJvcj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJuYW1lLnBlbmRpbmdcIj5ob3VyZ2xhc3M8L21hdC1pY29uPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gZmlyc3QgbmFtZSAtLT5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cImZpcnN0TmFtZVwiXG4gICAgICAgICAgICBtYXhsZW5ndGg9XCI1MFwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXJzdE5hbWVcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgZmlyc3ROYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmXG4gICAgICAgICAgICAgIChmaXJzdE5hbWUuZGlydHkgfHwgZmlyc3ROYW1lLnRvdWNoZWQpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlciBzbWFsbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgZmlyc3QgbmFtZSByZXF1aXJlZFxuICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gbGFzdCBuYW1lIC0tPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwibGFzdE5hbWVcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwiNTBcIlxuICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cImxhc3QgbmFtZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBsYXN0TmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJlxuICAgICAgICAgICAgICAobGFzdE5hbWUuZGlydHkgfHwgbGFzdE5hbWUudG91Y2hlZClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyIHNtYWxsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBsYXN0IG5hbWUgcmVxdWlyZWRcbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IFtmb3JtR3JvdXBdPVwicGFzc3dvcmRzXCI+XG4gICAgICAgIDwhLS0gcGFzc3dvcmQgLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiXG4gICAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8YXV0aC1qd3QtcGFzc3dvcmQtc3RyZW5ndGgtYmFyIFtwYXNzd29yZFRvQ2hlY2tdPVwicGFzc3dvcmQudmFsdWVcIj5cbiAgICAgICAgICAgIDwvYXV0aC1qd3QtcGFzc3dvcmQtc3RyZW5ndGgtYmFyPlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57eyBnZXRQYXNzd29yZEVycm9yTGFiZWwoKSB9fTwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gY29uZmlybSBwYXNzd29yZCAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gICAgICAgICAgICAgIG1heGxlbmd0aD1cIjUwXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJjb25maXJtIHBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29uZmlybVBhc3N3b3JkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgcGFzc3dvcmRzLmhhc0Vycm9yKCdhcmVFcXVhbCcpICYmXG4gICAgICAgICAgICAgICAgKGNvbmZpcm1QYXNzd29yZC5kaXJ0eSB8fCBjb25maXJtUGFzc3dvcmQudG91Y2hlZClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgcGFzc3dvcmQgZGlmZmVycyBmcm9tIGNvbmZpcm1hdGlvbiBwYXNzd29yZFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICFyZWdpc3RyYXRpb24udmFsaWQgfHwgYnVzeSB8fCBuYW1lLnBlbmRpbmcgfHwgZW1haWwucGVuZGluZ1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICByZWdpc3RlclxuICAgICAgPC9idXR0b24+XG4gICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgZGlhbWV0ZXI9XCIyMFwiXG4gICAgICAgICpuZ0lmPVwiYnVzeVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJCdXN5XCJcbiAgICAgID48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgIDwvZmllbGRzZXQ+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
|
|
@@ -15,9 +15,9 @@ export class ConfirmDialogComponent {
|
|
|
15
15
|
}
|
|
16
16
|
ngOnInit() { }
|
|
17
17
|
}
|
|
18
|
-
ConfirmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
19
|
-
ConfirmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
20
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
18
|
+
ConfirmDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ConfirmDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
19
|
+
ConfirmDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: ConfirmDialogComponent, selector: "ng-component", ngImport: i0, template: "<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: ConfirmDialogComponent, decorators: [{
|
|
21
21
|
type: Component,
|
|
22
22
|
args: [{ template: "<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n" }]
|
|
23
23
|
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
@@ -67,9 +67,9 @@ export class PasswordStrengthBarComponent {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
PasswordStrengthBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
71
|
-
PasswordStrengthBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
72
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
70
|
+
PasswordStrengthBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: PasswordStrengthBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
71
|
+
PasswordStrengthBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.0", type: PasswordStrengthBarComponent, selector: "auth-jwt-password-strength-bar", inputs: { passwordToCheck: "passwordToCheck" }, outputs: { strengthChange: "strengthChange" }, usesOnChanges: true, ngImport: i0, template: "<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n", styles: ["ul#strengthBar{display:inline;list-style:none;margin:0 0 0 15px;padding:0;vertical-align:2px}li.point:last{margin:0!important}li.point{background:#ddd;border-radius:2px;display:inline-block;height:5px;margin-right:1px;width:20px}\n"] });
|
|
72
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: PasswordStrengthBarComponent, decorators: [{
|
|
73
73
|
type: Component,
|
|
74
74
|
args: [{ selector: 'auth-jwt-password-strength-bar', template: "<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n", styles: ["ul#strengthBar{display:inline;list-style:none;margin:0 0 0 15px;padding:0;vertical-align:2px}li.point:last{margin:0!important}li.point{background:#ddd;border-radius:2px;display:inline-block;height:5px;margin-right:1px;width:20px}\n"] }]
|
|
75
75
|
}], ctorParameters: function () { return []; }, propDecorators: { passwordToCheck: [{
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, combineLatest, debounceTime, map, take, } from 'rxjs';
|
|
3
|
+
import { createStore, select, withProps } from '@ngneat/elf';
|
|
4
|
+
import { deleteAllEntities, selectActiveEntity, setActiveId, updateEntities, upsertEntities, withActiveId, withEntities, } from '@ngneat/elf-entities';
|
|
5
|
+
import { deleteAllPages, hasPage, selectCurrentPageEntities, selectPaginationData, setCurrentPage, setPage, updatePaginationData, withPagination, } from '@ngneat/elf-pagination';
|
|
6
|
+
import { selectRequestStatus, updateRequestStatus, withRequestsCache, withRequestsStatus, } from '@ngneat/elf-requests';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../services/auth-jwt-account.service";
|
|
9
|
+
const PAGE_SIZE = 20;
|
|
10
|
+
export class UserListRepository {
|
|
11
|
+
constructor(_accService) {
|
|
12
|
+
this._accService = _accService;
|
|
13
|
+
// create store
|
|
14
|
+
this._store = this.createStore();
|
|
15
|
+
this._lastPageSize = PAGE_SIZE;
|
|
16
|
+
this._loading$ = new BehaviorSubject(false);
|
|
17
|
+
this._saving$ = new BehaviorSubject(false);
|
|
18
|
+
this.loading$ = this._loading$.asObservable();
|
|
19
|
+
this.saving$ = this._saving$.asObservable();
|
|
20
|
+
// combine pagination parameters with page data for our consumers
|
|
21
|
+
this.pagination$ = combineLatest([
|
|
22
|
+
this._store.pipe(selectPaginationData()),
|
|
23
|
+
this._store.pipe(selectCurrentPageEntities()),
|
|
24
|
+
]).pipe(map(([pagination, data]) => ({ ...pagination, data })), debounceTime(0));
|
|
25
|
+
// the active document, if required
|
|
26
|
+
this.activeUser$ = this._store.pipe(selectActiveEntity());
|
|
27
|
+
// the filter, if required
|
|
28
|
+
this.filter$ = this._store.pipe(select((state) => state.filter));
|
|
29
|
+
this.filter$.subscribe((filter) => {
|
|
30
|
+
// when filter changed, reset any existing page and move to page 1
|
|
31
|
+
const paginationData = this._store.getValue().pagination;
|
|
32
|
+
console.log('Deleting all pages');
|
|
33
|
+
this._store.update(deleteAllPages());
|
|
34
|
+
// load page 1
|
|
35
|
+
this.loadPage(1, paginationData.perPage);
|
|
36
|
+
});
|
|
37
|
+
// the request status
|
|
38
|
+
this.status$ = this._store.pipe(selectRequestStatus('document'));
|
|
39
|
+
// load page 1 and subscribe to pagination
|
|
40
|
+
this.loadPage(1, PAGE_SIZE);
|
|
41
|
+
this.pagination$.subscribe(console.log);
|
|
42
|
+
}
|
|
43
|
+
createStore() {
|
|
44
|
+
const store = createStore({ name: 'user-list' }, withProps({
|
|
45
|
+
filter: {},
|
|
46
|
+
}), withEntities({ idKey: 'userName' }), withActiveId(), withRequestsCache(), withRequestsStatus(), withPagination());
|
|
47
|
+
return store;
|
|
48
|
+
}
|
|
49
|
+
adaptPage(page) {
|
|
50
|
+
// adapt the server page DataPage<T> to Elf pagination
|
|
51
|
+
return {
|
|
52
|
+
currentPage: page.pageNumber,
|
|
53
|
+
perPage: page.pageSize,
|
|
54
|
+
lastPage: page.pageCount,
|
|
55
|
+
total: page.total,
|
|
56
|
+
data: page.items,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
addPage(response) {
|
|
60
|
+
const { data, ...paginationData } = response;
|
|
61
|
+
this._store.update(upsertEntities(data),
|
|
62
|
+
// addEntities(data),
|
|
63
|
+
updatePaginationData(paginationData), setPage(paginationData.currentPage, data.map((c) => c.userName)));
|
|
64
|
+
}
|
|
65
|
+
loadPage(pageNumber, pageSize) {
|
|
66
|
+
if (!pageSize) {
|
|
67
|
+
pageSize = PAGE_SIZE;
|
|
68
|
+
}
|
|
69
|
+
// if the page exists and page size is the same, just move to it
|
|
70
|
+
if (this._store.query(hasPage(pageNumber)) &&
|
|
71
|
+
pageSize === this._lastPageSize) {
|
|
72
|
+
console.log('Page exists: ' + pageNumber);
|
|
73
|
+
this._store.update(setCurrentPage(pageNumber));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// reset cached pages if page size changed
|
|
77
|
+
if (this._lastPageSize !== pageSize) {
|
|
78
|
+
this._store.update(deleteAllPages());
|
|
79
|
+
this._lastPageSize = pageSize;
|
|
80
|
+
}
|
|
81
|
+
// load page from server
|
|
82
|
+
this._store.update(updateRequestStatus('document', 'pending'));
|
|
83
|
+
this._loading$.next(true);
|
|
84
|
+
this._accService
|
|
85
|
+
.getUsers(this._store.getValue().filter, pageNumber, pageSize)
|
|
86
|
+
.pipe(take(1))
|
|
87
|
+
.subscribe((page) => {
|
|
88
|
+
this._loading$.next(false);
|
|
89
|
+
this.addPage({ ...this.adaptPage(page), data: page.items });
|
|
90
|
+
this._store.update(updateRequestStatus('document', 'success'));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
setFilter(filter) {
|
|
94
|
+
this._store.update((state) => ({ ...state, filter: filter }));
|
|
95
|
+
}
|
|
96
|
+
clearCache() {
|
|
97
|
+
this._store.update(deleteAllEntities(), deleteAllPages());
|
|
98
|
+
}
|
|
99
|
+
setActive(name) {
|
|
100
|
+
this._store.update(setActiveId(name));
|
|
101
|
+
}
|
|
102
|
+
updateActive(user) {
|
|
103
|
+
const promise = new Promise((resolve, reject) => {
|
|
104
|
+
this._saving$.next(true);
|
|
105
|
+
this._accService.updateUser(user).subscribe({
|
|
106
|
+
next: (_) => {
|
|
107
|
+
this._saving$.next(false);
|
|
108
|
+
this._store.update(updateEntities(user.userName, user));
|
|
109
|
+
resolve(true);
|
|
110
|
+
},
|
|
111
|
+
error: (error) => {
|
|
112
|
+
this._saving$.next(false);
|
|
113
|
+
console.error(`Error updating user ${user.userName}: ` +
|
|
114
|
+
JSON.stringify(error || {}));
|
|
115
|
+
resolve(false);
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
return promise;
|
|
120
|
+
}
|
|
121
|
+
deleteUser(name) {
|
|
122
|
+
const promise = new Promise((resolve, reject) => {
|
|
123
|
+
this._saving$.next(true);
|
|
124
|
+
this._accService.deleteUser(name).subscribe({
|
|
125
|
+
next: (_) => {
|
|
126
|
+
this._saving$.next(false);
|
|
127
|
+
this.clearCache();
|
|
128
|
+
this.loadPage(1);
|
|
129
|
+
resolve(true);
|
|
130
|
+
},
|
|
131
|
+
error: (error) => {
|
|
132
|
+
this._saving$.next(false);
|
|
133
|
+
console.error(`Error deleting user ${name}: ` + JSON.stringify(error || {}));
|
|
134
|
+
reject(error);
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
return promise;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
UserListRepository.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: UserListRepository, deps: [{ token: i1.AuthJwtAccountService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
142
|
+
UserListRepository.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: UserListRepository, providedIn: 'root' });
|
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.0", ngImport: i0, type: UserListRepository, decorators: [{
|
|
144
|
+
type: Injectable,
|
|
145
|
+
args: [{ providedIn: 'root' }]
|
|
146
|
+
}], ctorParameters: function () { return [{ type: i1.AuthJwtAccountService }]; } });
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1saXN0LnJlcG9zaXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9hdXRoLWp3dC1hZG1pbi9zcmMvbGliL2NvbXBvbmVudHMvc3RhdGUvdXNlci1saXN0LnJlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBQ1osR0FBRyxFQUVILElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsY0FBYyxFQUNkLGNBQWMsRUFDZCxZQUFZLEVBQ1osWUFBWSxHQUNiLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxPQUFPLEVBRVAseUJBQXlCLEVBQ3pCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsT0FBTyxFQUNQLG9CQUFvQixFQUNwQixjQUFjLEdBQ2YsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsa0JBQWtCLEdBQ25CLE1BQU0sc0JBQXNCLENBQUM7OztBQVU5QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFPckIsTUFBTSxPQUFPLGtCQUFrQjtJQWE3QixZQUFvQixXQUFrQztRQUFsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFDcEQsZUFBZTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FB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RUFBRSxFQUFFO29CQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FDWCx1QkFBdUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQzlELENBQUM7b0JBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoQixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzsrR0FuTFUsa0JBQWtCO21IQUFsQixrQkFBa0IsY0FETCxNQUFNOzJGQUNuQixrQkFBa0I7a0JBRDlCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBjb21iaW5lTGF0ZXN0LFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBtYXAsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICB0YWtlLFxyXG59IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgY3JlYXRlU3RvcmUsIHNlbGVjdCwgd2l0aFByb3BzIH0gZnJvbSAnQG5nbmVhdC9lbGYnO1xyXG5pbXBvcnQge1xyXG4gIGRlbGV0ZUFsbEVudGl0aWVzLFxyXG4gIHJlc2V0QWN0aXZlSWRzLFxyXG4gIHNlbGVjdEFjdGl2ZUVudGl0eSxcclxuICBzZXRBY3RpdmVJZCxcclxuICB1cGRhdGVFbnRpdGllcyxcclxuICB1cHNlcnRFbnRpdGllcyxcclxuICB3aXRoQWN0aXZlSWQsXHJcbiAgd2l0aEVudGl0aWVzLFxyXG59IGZyb20gJ0BuZ25lYXQvZWxmLWVudGl0aWVzJztcclxuaW1wb3J0IHtcclxuICBkZWxldGVBbGxQYWdlcyxcclxuICBoYXNQYWdlLFxyXG4gIFBhZ2luYXRpb25EYXRhLFxyXG4gIHNlbGVjdEN1cnJlbnRQYWdlRW50aXRpZXMsXHJcbiAgc2VsZWN0UGFnaW5hdGlvbkRhdGEsXHJcbiAgc2V0Q3VycmVudFBhZ2UsXHJcbiAgc2V0UGFnZSxcclxuICB1cGRhdGVQYWdpbmF0aW9uRGF0YSxcclxuICB3aXRoUGFnaW5hdGlvbixcclxufSBmcm9tICdAbmduZWF0L2VsZi1wYWdpbmF0aW9uJztcclxuaW1wb3J0IHtcclxuICBzZWxlY3RSZXF1ZXN0U3RhdHVzLFxyXG4gIFN0YXR1c1N0YXRlLFxyXG4gIHVwZGF0ZVJlcXVlc3RTdGF0dXMsXHJcbiAgd2l0aFJlcXVlc3RzQ2FjaGUsXHJcbiAgd2l0aFJlcXVlc3RzU3RhdHVzLFxyXG59IGZyb20gJ0BuZ25lYXQvZWxmLXJlcXVlc3RzJztcclxuXHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdAbXlybWlkb24vYXV0aC1qd3QtbG9naW4nO1xyXG5cclxuaW1wb3J0IHtcclxuICBBdXRoSnd0QWNjb3VudFNlcnZpY2UsXHJcbiAgVXNlckZpbHRlcixcclxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLWp3dC1hY2NvdW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcblxyXG5jb25zdCBQQUdFX1NJWkUgPSAyMDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlckxpc3RQcm9wcyB7XHJcbiAgZmlsdGVyOiBVc2VyRmlsdGVyO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVXNlckxpc3RSZXBvc2l0b3J5IHtcclxuICBwcml2YXRlIF9zdG9yZTtcclxuICBwcml2YXRlIF9sb2FkaW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xyXG4gIHByaXZhdGUgX3NhdmluZyQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcclxuICBwcml2YXRlIF9sYXN0UGFnZVNpemU6IG51bWJlcjtcclxuXHJcbiAgcHVibGljIGFjdGl2ZVVzZXIkOiBPYnNlcnZhYmxlPFVzZXIgfCB1bmRlZmluZWQ+O1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFVzZXJGaWx0ZXI+O1xyXG4gIHB1YmxpYyBwYWdpbmF0aW9uJDogT2JzZXJ2YWJsZTxQYWdpbmF0aW9uRGF0YSAmIHsgZGF0YTogVXNlcltdIH0+O1xyXG4gIHB1YmxpYyBzdGF0dXMkOiBPYnNlcnZhYmxlPFN0YXR1c1N0YXRlPjtcclxuICBwdWJsaWMgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcbiAgcHVibGljIHNhdmluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FjY1NlcnZpY2U6IEF1dGhKd3RBY2NvdW50U2VydmljZSkge1xyXG4gICAgLy8gY3JlYXRlIHN0b3JlXHJcbiAgICB0aGlzLl9zdG9yZSA9IHRoaXMuY3JlYXRlU3RvcmUoKTtcclxuICAgIHRoaXMuX2xhc3RQYWdlU2l6ZSA9IFBBR0VfU0laRTtcclxuICAgIHRoaXMuX2xvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICB0aGlzLl9zYXZpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5fbG9hZGluZyQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB0aGlzLnNhdmluZyQgPSB0aGlzLl9zYXZpbmckLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgLy8gY29tYmluZSBwYWdpbmF0aW9uIHBhcmFtZXRlcnMgd2l0aCBwYWdlIGRhdGEgZm9yIG91ciBjb25zdW1lcnNcclxuICAgIHRoaXMucGFnaW5hdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy5fc3RvcmUucGlwZShzZWxlY3RQYWdpbmF0aW9uRGF0YSgpKSxcclxuICAgICAgdGhpcy5fc3RvcmUucGlwZShzZWxlY3RDdXJyZW50UGFnZUVudGl0aWVzKCkpLFxyXG4gICAgXSkucGlwZShcclxuICAgICAgbWFwKChbcGFnaW5hdGlvbiwgZGF0YV0pID0+ICh7IC4uLnBhZ2luYXRpb24sIGRhdGEgfSkpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMClcclxuICAgICk7XHJcbiAgICAvLyB0aGUgYWN0aXZlIGRvY3VtZW50LCBpZiByZXF1aXJlZFxyXG4gICAgdGhpcy5hY3RpdmVVc2VyJCA9IHRoaXMuX3N0b3JlLnBpcGUoc2VsZWN0QWN0aXZlRW50aXR5KCkpO1xyXG4gICAgLy8gdGhlIGZpbHRlciwgaWYgcmVxdWlyZWRcclxuICAgIHRoaXMuZmlsdGVyJCA9IHRoaXMuX3N0b3JlLnBpcGUoc2VsZWN0KChzdGF0ZSkgPT4gc3RhdGUuZmlsdGVyKSk7XHJcbiAgICB0aGlzLmZpbHRlciQuc3Vic2NyaWJlKChmaWx0ZXIpID0+IHtcclxuICAgICAgLy8gd2hlbiBmaWx0ZXIgY2hhbmdlZCwgcmVzZXQgYW55IGV4aXN0aW5nIHBhZ2UgYW5kIG1vdmUgdG8gcGFnZSAxXHJcbiAgICAgIGNvbnN0IHBhZ2luYXRpb25EYXRhID0gdGhpcy5fc3RvcmUuZ2V0VmFsdWUoKS5wYWdpbmF0aW9uO1xyXG4gICAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgYWxsIHBhZ2VzJyk7XHJcbiAgICAgIHRoaXMuX3N0b3JlLnVwZGF0ZShkZWxldGVBbGxQYWdlcygpKTtcclxuICAgICAgLy8gbG9hZCBwYWdlIDFcclxuICAgICAgdGhpcy5sb2FkUGFnZSgxLCBwYWdpbmF0aW9uRGF0YS5wZXJQYWdlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIHRoZSByZXF1ZXN0IHN0YXR1c1xyXG4gICAgdGhpcy5zdGF0dXMkID0gdGhpcy5fc3RvcmUucGlwZShzZWxlY3RSZXF1ZXN0U3RhdHVzKCdkb2N1bWVudCcpKTtcclxuXHJcbiAgICAvLyBsb2FkIHBhZ2UgMSBhbmQgc3Vic2NyaWJlIHRvIHBhZ2luYXRpb25cclxuICAgIHRoaXMubG9hZFBhZ2UoMSwgUEFHRV9TSVpFKTtcclxuICAgIHRoaXMucGFnaW5hdGlvbiQuc3Vic2NyaWJlKGNvbnNvbGUubG9nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlU3RvcmUoKTogdHlwZW9mIHN0b3JlIHtcclxuICAgIGNvbnN0IHN0b3JlID0gY3JlYXRlU3RvcmUoXHJcbiAgICAgIHsgbmFtZTogJ3VzZXItbGlzdCcgfSxcclxuICAgICAgd2l0aFByb3BzPFVzZXJMaXN0UHJvcHM+KHtcclxuICAgICAgICBmaWx0ZXI6IHt9LFxyXG4gICAgICB9KSxcclxuICAgICAgd2l0aEVudGl0aWVzPFVzZXIsICd1c2VyTmFtZSc+KHsgaWRLZXk6ICd1c2VyTmFtZScgfSksXHJcbiAgICAgIHdpdGhBY3RpdmVJZCgpLFxyXG4gICAgICB3aXRoUmVxdWVzdHNDYWNoZTwndXNlci1saXN0Jz4oKSxcclxuICAgICAgd2l0aFJlcXVlc3RzU3RhdHVzKCksXHJcbiAgICAgIHdpdGhQYWdpbmF0aW9uKClcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHN0b3JlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGFwdFBhZ2UocGFnZTogRGF0YVBhZ2U8VXNlcj4pOiBQYWdpbmF0aW9uRGF0YSAmIHsgZGF0YTogVXNlcltdIH0ge1xyXG4gICAgLy8gYWRhcHQgdGhlIHNlcnZlciBwYWdlIERhdGFQYWdlPFQ+IHRvIEVsZiBwYWdpbmF0aW9uXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjdXJyZW50UGFnZTogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICBwZXJQYWdlOiBwYWdlLnBhZ2VTaXplLFxyXG4gICAgICBsYXN0UGFnZTogcGFnZS5wYWdlQ291bnQsXHJcbiAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICBkYXRhOiBwYWdlLml0ZW1zLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkUGFnZShyZXNwb25zZTogUGFnaW5hdGlvbkRhdGEgJiB7IGRhdGE6IFVzZXJbXSB9KTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGRhdGEsIC4uLnBhZ2luYXRpb25EYXRhIH0gPSByZXNwb25zZTtcclxuICAgIHRoaXMuX3N0b3JlLnVwZGF0ZShcclxuICAgICAgdXBzZXJ0RW50aXRpZXMoZGF0YSksXHJcbiAgICAgIC8vIGFkZEVudGl0aWVzKGRhdGEpLFxyXG4gICAgICB1cGRhdGVQYWdpbmF0aW9uRGF0YShwYWdpbmF0aW9uRGF0YSksXHJcbiAgICAgIHNldFBhZ2UoXHJcbiAgICAgICAgcGFnaW5hdGlvbkRhdGEuY3VycmVudFBhZ2UsXHJcbiAgICAgICAgZGF0YS5tYXAoKGMpID0+IGMudXNlck5hbWUpXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZFBhZ2UocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZT86IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCFwYWdlU2l6ZSkge1xyXG4gICAgICBwYWdlU2l6ZSA9IFBBR0VfU0laRTtcclxuICAgIH1cclxuICAgIC8vIGlmIHRoZSBwYWdlIGV4aXN0cyBhbmQgcGFnZSBzaXplIGlzIHRoZSBzYW1lLCBqdXN0IG1vdmUgdG8gaXRcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fc3RvcmUucXVlcnkoaGFzUGFnZShwYWdlTnVtYmVyKSkgJiZcclxuICAgICAgcGFnZVNpemUgPT09IHRoaXMuX2xhc3RQYWdlU2l6ZVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdQYWdlIGV4aXN0czogJyArIHBhZ2VOdW1iZXIpO1xyXG4gICAgICB0aGlzLl9zdG9yZS51cGRhdGUoc2V0Q3VycmVudFBhZ2UocGFnZU51bWJlcikpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVzZXQgY2FjaGVkIHBhZ2VzIGlmIHBhZ2Ugc2l6ZSBjaGFuZ2VkXHJcbiAgICBpZiAodGhpcy5fbGFzdFBhZ2VTaXplICE9PSBwYWdlU2l6ZSkge1xyXG4gICAgICB0aGlzLl9zdG9yZS51cGRhdGUoZGVsZXRlQWxsUGFnZXMoKSk7XHJcbiAgICAgIHRoaXMuX2xhc3RQYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvYWQgcGFnZSBmcm9tIHNlcnZlclxyXG4gICAgdGhpcy5fc3RvcmUudXBkYXRlKHVwZGF0ZVJlcXVlc3RTdGF0dXMoJ2RvY3VtZW50JywgJ3BlbmRpbmcnKSk7XHJcbiAgICB0aGlzLl9sb2FkaW5nJC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5fYWNjU2VydmljZVxyXG4gICAgICAuZ2V0VXNlcnModGhpcy5fc3RvcmUuZ2V0VmFsdWUoKS5maWx0ZXIsIHBhZ2VOdW1iZXIsIHBhZ2VTaXplKVxyXG4gICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKChwYWdlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5hZGRQYWdlKHsgLi4udGhpcy5hZGFwdFBhZ2UocGFnZSksIGRhdGE6IHBhZ2UuaXRlbXMgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvcmUudXBkYXRlKHVwZGF0ZVJlcXVlc3RTdGF0dXMoJ2RvY3VtZW50JywgJ3N1Y2Nlc3MnKSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpbHRlcihmaWx0ZXI6IFVzZXJGaWx0ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N0b3JlLnVwZGF0ZSgoc3RhdGUpID0+ICh7IC4uLnN0YXRlLCBmaWx0ZXI6IGZpbHRlciB9KSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNhY2hlKCkge1xyXG4gICAgdGhpcy5fc3RvcmUudXBkYXRlKGRlbGV0ZUFsbEVudGl0aWVzKCksIGRlbGV0ZUFsbFBhZ2VzKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFjdGl2ZShuYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdG9yZS51cGRhdGUoc2V0QWN0aXZlSWQobmFtZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUFjdGl2ZSh1c2VyOiBVc2VyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBwcm9taXNlOiBQcm9taXNlPGJvb2xlYW4+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLl9zYXZpbmckLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgICB0aGlzLl9hY2NTZXJ2aWNlLnVwZGF0ZVVzZXIodXNlcikuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoXykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3N0b3JlLnVwZGF0ZSh1cGRhdGVFbnRpdGllcyh1c2VyLnVzZXJOYW1lLCB1c2VyKSk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgIGBFcnJvciB1cGRhdGluZyB1c2VyICR7dXNlci51c2VyTmFtZX06IGAgK1xyXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGVycm9yIHx8IHt9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVVc2VyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcHJvbWlzZTogUHJvbWlzZTxib29sZWFuPiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KHRydWUpO1xyXG5cclxuICAgICAgdGhpcy5fYWNjU2VydmljZS5kZWxldGVVc2VyKG5hbWUpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKF8pID0+IHtcclxuICAgICAgICAgIHRoaXMuX3NhdmluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgIHRoaXMubG9hZFBhZ2UoMSk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgIGBFcnJvciBkZWxldGluZyB1c2VyICR7bmFtZX06IGAgKyBKU09OLnN0cmluZ2lmeShlcnJvciB8fCB7fSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcbn1cclxuIl19
|